diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index df53a2cd310..067548b9768 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -146,7 +146,7 @@ jobs:
       apt-architecture: 'i386'
       # Some multilib libraries do not have proper inter-dependencies, so we have to
       # install their dependencies manually.
-      apt-extra-packages: 'libfreetype-dev:i386 libtiff-dev:i386 libcupsimage2-dev:i386 libc6-i386 libgcc-s1:i386 libstdc++6:i386 libffi-dev:i386'
+      apt-extra-packages: 'libfreetype-dev:i386 libtiff-dev:i386 libcupsimage2-dev:i386 libffi-dev:i386'
       extra-conf-options: '--with-target-bits=32 --enable-fallback-linker --enable-libffi-bundling'
       configure-arguments: ${{ github.event.inputs.configure-arguments }}
       make-arguments: ${{ github.event.inputs.make-arguments }}
diff --git a/.jcheck/conf b/.jcheck/conf
index cfdf787b854..11285d7fbab 100644
--- a/.jcheck/conf
+++ b/.jcheck/conf
@@ -5,7 +5,7 @@ version=repo-shenandoah
 
 [checks]
 error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists
-warning=issuestitle
+warning=issuestitle,binary
 
 [repository]
 tags=(?:jdk-(?:[1-9]([0-9]*)(?:\.(?:0|[1-9][0-9]*)){0,4})(?:\+(?:(?:[0-9]+))|(?:-ga)))|(?:jdk[4-9](?:u\d{1,3})?-(?:(?:b\d{2,3})|(?:ga)))|(?:hs\d\d(?:\.\d{1,2})?-b\d\d)
diff --git a/doc/ide.html b/doc/ide.html
index 0dd16b7b9e6..ef6f434013e 100644
--- a/doc/ide.html
+++ b/doc/ide.html
@@ -63,11 +63,12 @@ <h5 id="alternative-indexers">Alternative indexers</h5>
 <p>The main <code>vscode-project</code> target configures the default
 C++ support in Visual Studio Code. There are also other source indexers
 that can be installed, that may provide additional features. It's
-currently possible to generate configuration for two such indexers, <a
-href="https://clang.llvm.org/extra/clangd/">clangd</a> and <a
-href="https://github.com/Andersbakken/rtags">rtags</a>. These can be
-configured by appending the name of the indexer to the make target, such
-as:</p>
+currently possible to generate configuration for three such indexers, <a
+href="https://clang.llvm.org/extra/clangd/">clangd</a>, <a
+href="https://github.com/MaskRay/ccls/wiki/Visual-Studio-Code">ccls</a>
+and <a href="https://github.com/Andersbakken/rtags">rtags</a>. These can
+be configured by appending the name of the indexer to the make target,
+such as:</p>
 <pre class="shell"><code>make vscode-project-clangd</code></pre>
 <p>Additional instructions for configuring the given indexer will be
 displayed after the workspace has been generated.</p>
diff --git a/doc/ide.md b/doc/ide.md
index 40e3430a438..d6ebb7b742a 100644
--- a/doc/ide.md
+++ b/doc/ide.md
@@ -32,7 +32,8 @@ choose `File -> Open Workspace...` in Visual Studio Code.
 The main `vscode-project` target configures the default C++ support in Visual
 Studio Code. There are also other source indexers that can be installed, that
 may provide additional features. It's currently possible to generate
-configuration for two such indexers, [clangd](https://clang.llvm.org/extra/clangd/)
+configuration for three such indexers, [clangd](https://clang.llvm.org/extra/clangd/),
+[ccls](https://github.com/MaskRay/ccls/wiki/Visual-Studio-Code)
 and [rtags](https://github.com/Andersbakken/rtags). These can be configured by
 appending the name of the indexer to the make target, such as:
 
diff --git a/make/GenerateLinkOptData.gmk b/make/GenerateLinkOptData.gmk
index 576bc4190b9..b6989042d6a 100644
--- a/make/GenerateLinkOptData.gmk
+++ b/make/GenerateLinkOptData.gmk
@@ -62,6 +62,15 @@ ifeq ($(EXTERNAL_BUILDJDK), true)
   INTERIM_IMAGE_DIR := $(BUILD_JDK)
 endif
 
+# To make the classlist deterministic:
+# - The classlist can be influenced by locale. Always set it to en/US.
+# - Concurrency in the core libraries can cause constant pool resolution
+#   to be non-deterministic. Since the benefits of resolved CP references in the
+#   default classlist is minimal, let's filter out the '@cp' lines until we can
+#   find a proper solution.
+CLASSLIST_FILE_VM_OPTS = \
+    -Duser.language=en -Duser.country=US
+
 # Save the stderr output of the command and print it along with stdout in case
 # something goes wrong.
 $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXECUTABLE_SUFFIX) $(CLASSLIST_JAR)
@@ -69,7 +78,7 @@ $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXECUTABLE_SUFFIX) $(CLASSLIST
 	$(call LogInfo, Generating $(patsubst $(OUTPUTDIR)/%, %, $@))
 	$(call LogInfo, Generating $(patsubst $(OUTPUTDIR)/%, %, $(JLI_TRACE_FILE)))
 	$(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.raw \
-	    -Duser.language=en -Duser.country=US \
+	    $(CLASSLIST_FILE_VM_OPTS) \
 	    -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \
 	    build.tools.classlist.HelloClasslist $(LOG_DEBUG)
 	$(GREP) -v HelloClasslist $@.raw > $@.interim
@@ -79,7 +88,7 @@ $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXECUTABLE_SUFFIX) $(CLASSLIST
 	$(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.raw.2 \
 	    -XX:SharedClassListFile=$@.interim -XX:SharedArchiveFile=$@.jsa \
 	    -Djava.lang.invoke.MethodHandle.TRACE_RESOLVE=true \
-	    -Duser.language=en -Duser.country=US \
+	    $(CLASSLIST_FILE_VM_OPTS) \
 	    --module-path $(SUPPORT_OUTPUTDIR)/classlist.jar \
 	    -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \
 	    build.tools.classlist.HelloClasslist \
@@ -92,9 +101,10 @@ $(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXECUTABLE_SUFFIX) $(CLASSLIST
 	        exit $$exitcode \
 	    )
 	$(GREP) -v HelloClasslist $@.raw.2 > $@.raw.3
+	$(GREP) -v @cp $@.raw.3 > $@.raw.4
 	$(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java \
 	    -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \
-	    build.tools.classlist.SortClasslist $@.raw.3 > $@
+	    build.tools.classlist.SortClasslist $@.raw.4 > $@
 
 # The jli trace is created by the same recipe as classlist. By declaring these
 # dependencies, make will correctly rebuild both jli trace and classlist
diff --git a/make/autoconf/flags-cflags.m4 b/make/autoconf/flags-cflags.m4
index 09395202f22..da63a6dba06 100644
--- a/make/autoconf/flags-cflags.m4
+++ b/make/autoconf/flags-cflags.m4
@@ -502,12 +502,12 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
   elif test "x$TOOLCHAIN_TYPE" = xclang; then
     ALWAYS_DEFINES_JVM="-D_GNU_SOURCE"
   elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
-    # Access APIs for Windows 8 and above
-    # see https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170
-    ALWAYS_DEFINES_JDK="-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602 \
-        -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -DWIN32 -DIAL"
-    ALWAYS_DEFINES_JVM="-DNOMINMAX -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602 \
-        -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE"
+    # _WIN32_WINNT=0x0602 means access APIs for Windows 8 and above. See
+    # https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170
+    ALWAYS_DEFINES="-DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0602 \
+        -D_CRT_DECLARE_NONSTDC_NAMES -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS"
+    ALWAYS_DEFINES_JDK="$ALWAYS_DEFINES -DWIN32 -DIAL"
+    ALWAYS_DEFINES_JVM="$ALWAYS_DEFINES -DNOMINMAX"
   fi
 
   ###############################################################################
diff --git a/make/autoconf/jdk-options.m4 b/make/autoconf/jdk-options.m4
index b5c679d2a8e..76e95127f73 100644
--- a/make/autoconf/jdk-options.m4
+++ b/make/autoconf/jdk-options.m4
@@ -197,9 +197,8 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_OPTIONS],
   # three different page sizes: 4K, 64K, and if run on Mac m1 hardware, 16K.
   COMPATIBLE_CDS_ALIGNMENT_DEFAULT=false
   if test "x$OPENJDK_TARGET_OS" = "xlinux" && test "x$OPENJDK_TARGET_CPU" = "xaarch64"; then
-    COMPATIBLE_CDS_ALIGNMENT_DEFAULT=true
+    COMPATIBLE_CDS_ALIGNMENT_DEFAULT=auto
   fi
-  AC_SUBST(COMPATIBLE_CDS_ALIGNMENT_DEFAULT)
 
   # Compress jars
   COMPRESS_JARS=false
@@ -438,12 +437,23 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_ADDRESS_SANITIZER],
           # It's harmless to be suppressed in clang as well.
           ASAN_CFLAGS="-fsanitize=address -Wno-stringop-truncation -fno-omit-frame-pointer -fno-common -DADDRESS_SANITIZER"
           ASAN_LDFLAGS="-fsanitize=address"
+          # detect_stack_use_after_return causes ASAN to offload stack-local
+          # variables to c-heap and therefore breaks assumptions in hotspot
+          # that rely on data (e.g. Marks) living in thread stacks.
+          if test "x$TOOLCHAIN_TYPE" = "xgcc"; then
+            ASAN_CFLAGS="$ASAN_CFLAGS --param asan-use-after-return=0"
+          fi
+          if test "x$TOOLCHAIN_TYPE" = "xclang"; then
+            ASAN_CFLAGS="$ASAN_CFLAGS -fsanitize-address-use-after-return=never"
+          fi
         elif test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then
           # -Oy- is equivalent to -fno-omit-frame-pointer in GCC/Clang.
           ASAN_CFLAGS="-fsanitize=address -Oy- -DADDRESS_SANITIZER"
           # MSVC produces a warning if you pass -fsanitize=address to the linker. It also complains
           $ if -DEBUG is not passed to the linker when building with ASan.
           ASAN_LDFLAGS="-debug"
+          # -fsanitize-address-use-after-return is off by default in MS Visual Studio 22 (19.37.32824).
+          # cl : Command line warning D9002 : ignoring unknown option '-fno-sanitize-address-use-after-return'
         fi
         JVM_CFLAGS="$JVM_CFLAGS $ASAN_CFLAGS"
         JVM_LDFLAGS="$JVM_LDFLAGS $ASAN_LDFLAGS"
@@ -496,9 +506,15 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_LEAK_SANITIZER],
 #
 AC_DEFUN_ONCE([JDKOPT_SETUP_UNDEFINED_BEHAVIOR_SANITIZER],
 [
+  UTIL_ARG_WITH(NAME: additional-ubsan-checks, TYPE: string,
+      DEFAULT: [],
+      DESC: [Customizes the ubsan checks],
+      OPTIONAL: true)
+
   # GCC reports lots of likely false positives for stringop-truncation and format-overflow.
   # Silence them for now.
-  UBSAN_CHECKS="-fsanitize=undefined -fsanitize=float-divide-by-zero -fno-sanitize=shift-base -fno-sanitize=alignment"
+  UBSAN_CHECKS="-fsanitize=undefined -fsanitize=float-divide-by-zero -fno-sanitize=shift-base -fno-sanitize=alignment \
+      $ADDITIONAL_UBSAN_CHECKS"
   UBSAN_CFLAGS="$UBSAN_CHECKS -Wno-stringop-truncation -Wno-format-overflow -fno-omit-frame-pointer -DUNDEFINED_BEHAVIOR_SANITIZER"
   UBSAN_LDFLAGS="$UBSAN_CHECKS"
   UTIL_ARG_ENABLE(NAME: ubsan, DEFAULT: false, RESULT: UBSAN_ENABLED,
@@ -666,7 +682,7 @@ AC_DEFUN([JDKOPT_ENABLE_DISABLE_COMPATIBLE_CDS_ALIGNMENT],
   UTIL_ARG_ENABLE(NAME: compatible-cds-alignment, DEFAULT: $COMPATIBLE_CDS_ALIGNMENT_DEFAULT,
       RESULT: ENABLE_COMPATIBLE_CDS_ALIGNMENT,
       DESC: [enable use alternative compatible cds core region alignment],
-      DEFAULT_DESC: [disabled],
+      DEFAULT_DESC: [disabled except on linux-aarch64],
       CHECKING_MSG: [if compatible cds region alignment enabled],
       CHECK_AVAILABLE: [
         AC_MSG_CHECKING([if CDS archive is available])
diff --git a/make/autoconf/lib-tests.m4 b/make/autoconf/lib-tests.m4
index be099e50a04..955b8c9ba83 100644
--- a/make/autoconf/lib-tests.m4
+++ b/make/autoconf/lib-tests.m4
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,7 @@
 ################################################################################
 
 # Minimum supported versions
-JTREG_MINIMUM_VERSION=7.3.1
+JTREG_MINIMUM_VERSION=7.4
 GTEST_MINIMUM_VERSION=1.14.0
 
 ###############################################################################
diff --git a/make/conf/github-actions.conf b/make/conf/github-actions.conf
index f6b00bd2a13..deb5e36f605 100644
--- a/make/conf/github-actions.conf
+++ b/make/conf/github-actions.conf
@@ -26,7 +26,7 @@
 # Versions and download locations for dependencies used by GitHub Actions (GHA)
 
 GTEST_VERSION=1.14.0
-JTREG_VERSION=7.3.1+1
+JTREG_VERSION=7.4+1
 
 LINUX_X64_BOOT_JDK_EXT=tar.gz
 LINUX_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk22/830ec9fcccef480bb3e73fb7ecafe059/36/GPL/openjdk-22_linux-x64_bin.tar.gz
diff --git a/make/conf/jib-profiles.js b/make/conf/jib-profiles.js
index 44b5c5d6f4f..30c45d4cde1 100644
--- a/make/conf/jib-profiles.js
+++ b/make/conf/jib-profiles.js
@@ -1184,9 +1184,9 @@ var getJibProfilesDependencies = function (input, common) {
         jtreg: {
             server: "jpg",
             product: "jtreg",
-            version: "7.3.1",
+            version: "7.4",
             build_number: "1",
-            file: "bundles/jtreg-7.3.1+1.zip",
+            file: "bundles/jtreg-7.4+1.zip",
             environment_name: "JT_HOME",
             environment_path: input.get("jtreg", "home_path") + "/bin",
             configure_args: "--with-jtreg=" + input.get("jtreg", "home_path"),
@@ -1200,7 +1200,7 @@ var getJibProfilesDependencies = function (input, common) {
 
         jcov: {
             organization: common.organization,
-            revision: "3.0-16-jdk-asm+1.0",
+            revision: "3.0-17-jdk-asm+1.0",
             ext: "zip",
             environment_name: "JCOV_HOME",
         },
diff --git a/make/jdk/src/classes/build/tools/intpoly/FieldGen.java b/make/jdk/src/classes/build/tools/intpoly/FieldGen.java
index 234f5cfce0d..2bf8c5c0b20 100644
--- a/make/jdk/src/classes/build/tools/intpoly/FieldGen.java
+++ b/make/jdk/src/classes/build/tools/intpoly/FieldGen.java
@@ -778,7 +778,7 @@ private String generate(FieldParams params) throws IOException {
         result.appendLine("}");
 
         result.appendLine("@Override");
-        result.appendLine("protected int mult(long[] a, long[] b, long[] r) {");
+        result.appendLine("protected void mult(long[] a, long[] b, long[] r) {");
         result.incrIndent();
         for (int i = 0; i < 2 * params.getNumLimbs() - 1; i++) {
             result.appendIndent();
@@ -804,9 +804,6 @@ private String generate(FieldParams params) throws IOException {
             }
         }
         result.append(");\n");
-        result.appendIndent();
-        result.append("return 0;");
-        result.appendLine();
         result.decrIndent();
         result.appendLine("}");
 
@@ -836,7 +833,7 @@ private String generate(FieldParams params) throws IOException {
         //      }
         //  }
         result.appendLine("@Override");
-        result.appendLine("protected int square(long[] a, long[] r) {");
+        result.appendLine("protected void square(long[] a, long[] r) {");
         result.incrIndent();
         for (int i = 0; i < 2 * params.getNumLimbs() - 1; i++) {
             result.appendIndent();
@@ -877,9 +874,6 @@ private String generate(FieldParams params) throws IOException {
             }
         }
         result.append(");\n");
-        result.appendIndent();
-        result.append("return 0;");
-        result.appendLine();
         result.decrIndent();
         result.appendLine("}");
 
diff --git a/make/modules/java.desktop/lib/ClientLibraries.gmk b/make/modules/java.desktop/lib/ClientLibraries.gmk
index 6f3616608cc..f0239695369 100644
--- a/make/modules/java.desktop/lib/ClientLibraries.gmk
+++ b/make/modules/java.desktop/lib/ClientLibraries.gmk
@@ -281,6 +281,7 @@ endif
 ifeq ($(USE_EXTERNAL_HARFBUZZ), true)
    LIBFONTMANAGER_EXTRA_SRC =
    LIBFONTMANAGER_LIBS += $(HARFBUZZ_LIBS)
+   LIBFONTMANAGER_CFLAGS += $(HARFBUZZ_CFLAGS)
 else
    LIBFONTMANAGER_EXTRA_SRC = libharfbuzz
 
diff --git a/make/modules/jdk.jdeps/Launcher.gmk b/make/modules/jdk.jdeps/Launcher.gmk
index ceab7931245..1aa54e16f45 100644
--- a/make/modules/jdk.jdeps/Launcher.gmk
+++ b/make/modules/jdk.jdeps/Launcher.gmk
@@ -51,3 +51,12 @@ $(eval $(call SetupBuildLauncher, jdeprscan, \
     MAIN_CLASS := com.sun.tools.jdeprscan.Main, \
     CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
 ))
+
+################################################################################
+## Build jnativescan
+################################################################################
+
+$(eval $(call SetupBuildLauncher, jnativescan, \
+    MAIN_CLASS := com.sun.tools.jnativescan.Main, \
+    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
+))
diff --git a/make/modules/jdk.jpackage/Java.gmk b/make/modules/jdk.jpackage/Java.gmk
index 9d31e5417e9..d60e9ac2814 100644
--- a/make/modules/jdk.jpackage/Java.gmk
+++ b/make/modules/jdk.jpackage/Java.gmk
@@ -27,6 +27,6 @@ DISABLED_WARNINGS_java += dangling-doc-comments
 
 COPY += .gif .png .txt .spec .script .prerm .preinst \
     .postrm .postinst .list .sh .desktop .copyright .control .plist .template \
-    .icns .scpt .wxs .wxl .wxi .ico .bmp .tiff .service
+    .icns .scpt .wxs .wxl .wxi .ico .bmp .tiff .service .xsl
 
 CLEAN += .properties
diff --git a/make/scripts/update_copyright_year.sh b/make/scripts/update_copyright_year.sh
index a825486a941..bb61d48c91c 100644
--- a/make/scripts/update_copyright_year.sh
+++ b/make/scripts/update_copyright_year.sh
@@ -1,7 +1,7 @@
 #!/bin/bash -f
 
 #
-# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -27,8 +27,10 @@
 #  (Originally from xdono, Thanks!)
 
 #------------------------------------------------------------
-copyright="Copyright (c)"
+copyright="Copyright"
+copyright_symbol="(c)"
 company="Oracle"
+year=`date +%Y`
 #------------------------------------------------------------
 
 awk="awk"
@@ -49,66 +51,75 @@ rm -f -r ${tmp}
 mkdir -p ${tmp}
 total=0
 
-# Default or supplied company name
-if [ "$3" != "" ] ; then
-  company="$3"
-fi
-
-# This year or supplied year
-if [ "$2" != "" ] ; then
-  year="$2"
-else
-  year=`date +%Y`
-fi
-
-# VCS select
-vcs="$1"
+usage="Usage: `basename "$0"` [-c company] [-y year] [-h|f]"
+Help()
+{
+  # Display Help
+  echo "Updates the Copyright year range in Git sources."
+  echo
+  echo "By default, the tool limits the processed changesets "
+  echo "to those in the current branch and the current year."
+  echo
+  echo "Note, cancelling the script will skip cleanup in /tmp."
+  echo
+  echo $usage
+  echo "options:"
+  echo "-c     Specifies the company. Set to Oracle by default."
+  echo "-y     Specifies the copyright year. Set to current year by default."
+  echo "-f     Updates the copyright for all change sets in a given year,"
+  echo "       as specified by -y."
+  echo "-h     Print this help."
+  echo
+}
 
-if [ -z "$vcs" ] ; then
-  git_found=false
-  hg_found=false
+full_year=false
 
-  [ -d "${this_script_dir}/../../.git" ] && git_found=true
-  [ -d "${this_script_dir}/../../.hg" ] && hg_found=true
+# Process options
+while getopts "c:fhy:" option; do
+  case $option in
+    c) # supplied company year
+      company=${OPTARG}
+      ;;
+    f) # update all change sets in a full year
+      full_year=true
+      ;;
+    h) # display help
+      Help
+      exit 0
+      ;;
+    y) # supplied company year
+      year=${OPTARG}
+      ;;
+    \?) # illegal option
+      echo "$usage"
+      exit 1
+      ;;
+  esac
+done
 
-  if [ "$git_found" == "true" ] && [ "$hg_found" == "false" ] ; then
-    vcs="git"
-  elif [ "$hg_found" == "true" ] && [ "$git_found" == "false" ] ; then
-    vcs="hg"
+# VCS check
+git_found=false
+[ -d "${this_script_dir}/../../.git" ] && git_found=true
+if [ "$git_found" != "true" ]; then
+  echo "Error: Please execute script from within make/scripts."
+  exit 1
+else
+  echo "Using Git version control system"
+  vcs_status=(git ls-files -m)
+  if [ "$full_year" = "true" ]; then
+    vcs_list_changesets=(git log --no-merges --since="${year}-01-01T00:00:00Z" --until="${year}-12-31T23:59:59Z" --pretty=tformat:"%H")
   else
-    echo "Error: could not auto-detect version control system"
-    vcs=""
+    vcs_list_changesets=(git log --no-merges 'master..HEAD' --since="${year}-01-01T00:00:00Z" --until="${year}-12-31T23:59:59Z" --pretty=tformat:"%H")
   fi
+  vcs_changeset_message=(git log -1 --pretty=tformat:"%B") # followed by ${changeset}
+  vcs_changeset_files=(git diff-tree --no-commit-id --name-only -r) # followed by ${changeset}
 fi
 
-case "$vcs" in
-  "git")
-    echo "Using Git version control system"
-    vcs_status=(git ls-files -m)
-    vcs_list_changesets=(git log --no-merges --since="${year}-01-01T00:00:00Z" --until="${year}-12-31T23:59:59Z" --pretty=tformat:"%H")
-    vcs_changeset_message=(git log -1 --pretty=tformat:"%B") # followed by ${changeset}
-    vcs_changeset_files=(git diff-tree --no-commit-id --name-only -r) # followed by ${changeset}
-    ;;
-
-  "hg")
-    echo "Using Mercurial version control system"
-    vcs_status=(hg status)
-    vcs_list_changesets=(hg log --no-merges -v -d "${year}-01-01 to ${year}-12-31" --template '{node}\n')
-    vcs_changeset_message=(hg log -l1 --template '{desc}\n' --rev) # followed by ${changeset}
-    vcs_changeset_files=(hg log -l1 -v --template '{files}\n' --rev) # followed by ${changeset}
-    ;;
-
-  *)
-    echo "Usage: `basename "$0"` <git|hg> [year [company]]"
-    exit 1
-    ;;
-esac
-
 # Return true if it makes sense to edit this file
 saneFileToCheck()
 {
   if [ "$1" != "" -a -f $1 ] ; then
-    isText=`file "$1" | egrep -i '(text|source)' | cat`
+    isText=`file "$1" | grep -i -E '(text|source)' | cat`
     hasCopyright=`grep 'Copyright' "$1" | cat`
     lastLineCount=`tail -1 "$1" | wc -l`
     if [ "${isText}" != ""  \
@@ -131,9 +142,13 @@ updateFile() # file
     rm -f $1.OLD
     mv $1 $1.OLD
     cat $1.OLD | \
-      sed -e "s@\(${copyright} [12][0-9][0-9][0-9],\) [12][0-9][0-9][0-9], ${company}@\1 ${year}, ${company}@" | \
-      sed -e "s@\(${copyright} [12][0-9][0-9][0-9],\) ${company}@\1 ${year}, ${company}@" | \
-      sed -e "s@${copyright} ${year}, ${year}, ${company}@${copyright} ${year}, ${company}@"  \
+      sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) [12][0-9][0-9][0-9], ${company}@\1 ${year}, ${company}@" | \
+      sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) [12][0-9][0-9][0-9] ${company}@\1 ${year} ${company}@" | \
+      sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) ${company}@\1 ${year}, ${company}@" | \
+      sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) ${company}@\1, ${year}, ${company}@" | \
+      sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9]\) ${company}@\1, ${year} ${company}@" | \
+      sed -e "s@${copyright} ${year}, ${year}, ${company}@${copyright} ${year}, ${company}@" | \
+      sed -e "s@${copyright} ${copyright_symbol} ${year}, ${year}, ${company}@${copyright} ${copyright_symbol} ${year}, ${company}@"  \
       > $1
     if ! diff -b -w $1.OLD $1 > /dev/null ; then \
       changed="true"
@@ -205,19 +220,19 @@ if [ -s ${all_changesets} ] ; then
     "${vcs_changeset_message[@]}" "${changeset}" > ${desc}
     printf "%d: %s\n%s\n" ${index} "${changeset}" "`cat ${desc}|head -1`"
     if [ "${year}" = "2010" ] ; then
-      if cat ${desc} | fgrep -i "Added tag" > /dev/null ; then
+      if cat ${desc} | grep -i -F "Added tag" > /dev/null ; then
         printf "  EXCLUDED tag changeset.\n"
-      elif cat ${desc} | fgrep -i rebrand > /dev/null ; then
+      elif cat ${desc} | grep -i -F rebrand > /dev/null ; then
         printf "  EXCLUDED rebrand changeset.\n"
-      elif cat ${desc} | fgrep -i copyright > /dev/null ; then
+      elif cat ${desc} | grep -i -F copyright > /dev/null ; then
         printf "  EXCLUDED copyright changeset.\n"
       else
         updateChangesetFiles ${changeset}
       fi
     else
-      if cat ${desc} | fgrep -i "Added tag" > /dev/null ; then
+      if cat ${desc} | grep -i -F "Added tag" > /dev/null ; then
         printf "  EXCLUDED tag changeset.\n"
-      elif cat ${desc} | fgrep -i "copyright year" > /dev/null ; then
+      elif cat ${desc} | grep -i -F "copyright year" > /dev/null ; then
         printf "  EXCLUDED copyright year changeset.\n"
       else
         updateChangesetFiles ${changeset}
diff --git a/make/src/classes/build/tools/jfr/GenerateJfrFiles.java b/make/src/classes/build/tools/jfr/GenerateJfrFiles.java
index 3497d03292d..7532a446aa1 100644
--- a/make/src/classes/build/tools/jfr/GenerateJfrFiles.java
+++ b/make/src/classes/build/tools/jfr/GenerateJfrFiles.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, 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
@@ -663,12 +663,12 @@ private static void printJfrEventControlHpp(Metadata metadata, File outputFile)
             out.write("");
             out.write("union JfrNativeSettings {");
             out.write("  // Array version.");
-            out.write("  jfrNativeEventSetting bits[NUMBER_OF_EVENTS];");
+            out.write("  jfrNativeEventSetting bits[NUMBER_OF_EVENTS + NUMBER_OF_RESERVED_EVENTS];");
             out.write("  // Then, to make it easy to debug,");
             out.write("  // add named struct members also.");
             out.write("  struct {");
             out.write("    jfrNativeEventSetting pad[NUMBER_OF_RESERVED_EVENTS];");
-            for (TypeElement t : metadata.getEventsAndStructs()) {
+            for (TypeElement t : metadata.getEvents()) {
                 out.write("    jfrNativeEventSetting " + t.name + ";");
             }
             out.write("  } ev;");
diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad
index 1b8b9801f3c..2f2bee6e22f 100644
--- a/src/hotspot/cpu/aarch64/aarch64.ad
+++ b/src/hotspot/cpu/aarch64/aarch64.ad
@@ -5628,24 +5628,24 @@ operand cmpOpLtGe()
 // used for certain unsigned integral comparisons which can be
 // converted to cbxx or tbxx instructions
 
-operand cmpOpUEqNeLtGe()
+operand cmpOpUEqNeLeGt()
 %{
   match(Bool);
   op_cost(0);
 
-  predicate(n->as_Bool()->_test._test == BoolTest::eq
-            || n->as_Bool()->_test._test == BoolTest::ne
-            || n->as_Bool()->_test._test == BoolTest::lt
-            || n->as_Bool()->_test._test == BoolTest::ge);
+  predicate(n->as_Bool()->_test._test == BoolTest::eq ||
+            n->as_Bool()->_test._test == BoolTest::ne ||
+            n->as_Bool()->_test._test == BoolTest::le ||
+            n->as_Bool()->_test._test == BoolTest::gt);
 
   format %{ "" %}
   interface(COND_INTER) %{
     equal(0x0, "eq");
     not_equal(0x1, "ne");
-    less(0xb, "lt");
-    greater_equal(0xa, "ge");
-    less_equal(0xd, "le");
-    greater(0xc, "gt");
+    less(0x3, "lo");
+    greater_equal(0x2, "hs");
+    less_equal(0x9, "ls");
+    greater(0x8, "hi");
     overflow(0x6, "vs");
     no_overflow(0x7, "vc");
   %}
@@ -7780,7 +7780,7 @@ instruct membar_acquire() %{
   ins_cost(VOLATILE_REF_COST);
 
   format %{ "membar_acquire\n\t"
-            "dmb ish" %}
+            "dmb ishld" %}
 
   ins_encode %{
     __ block_comment("membar_acquire");
@@ -7834,11 +7834,13 @@ instruct membar_release() %{
   ins_cost(VOLATILE_REF_COST);
 
   format %{ "membar_release\n\t"
-            "dmb ish" %}
+            "dmb ishst\n\tdmb ishld" %}
 
   ins_encode %{
     __ block_comment("membar_release");
-    __ membar(Assembler::LoadStore|Assembler::StoreStore);
+    // These will be merged if AlwaysMergeDMB is enabled.
+    __ membar(Assembler::StoreStore);
+    __ membar(Assembler::LoadStore);
   %}
   ins_pipe(pipe_serial);
 %}
@@ -15685,7 +15687,7 @@ instruct cmpP_narrowOop_imm0_branch(cmpOpEqNe cmp, iRegN oop, immP0 zero, label
   ins_pipe(pipe_cmp_branch);
 %}
 
-instruct cmpUI_imm0_branch(cmpOpUEqNeLtGe cmp, iRegIorL2I op1, immI0 op2, label labl, rFlagsRegU cr) %{
+instruct cmpUI_imm0_branch(cmpOpUEqNeLeGt cmp, iRegIorL2I op1, immI0 op2, label labl) %{
   match(If cmp (CmpU op1 op2));
   effect(USE labl);
 
@@ -15694,15 +15696,17 @@ instruct cmpUI_imm0_branch(cmpOpUEqNeLtGe cmp, iRegIorL2I op1, immI0 op2, label
   ins_encode %{
     Label* L = $labl$$label;
     Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
-    if (cond == Assembler::EQ || cond == Assembler::LS)
+    if (cond == Assembler::EQ || cond == Assembler::LS) {
       __ cbzw($op1$$Register, *L);
-    else
+    } else {
+      assert(cond == Assembler::NE || cond == Assembler::HI, "unexpected condition");
       __ cbnzw($op1$$Register, *L);
+    }
   %}
   ins_pipe(pipe_cmp_branch);
 %}
 
-instruct cmpUL_imm0_branch(cmpOpUEqNeLtGe cmp, iRegL op1, immL0 op2, label labl, rFlagsRegU cr) %{
+instruct cmpUL_imm0_branch(cmpOpUEqNeLeGt cmp, iRegL op1, immL0 op2, label labl) %{
   match(If cmp (CmpUL op1 op2));
   effect(USE labl);
 
@@ -15711,10 +15715,12 @@ instruct cmpUL_imm0_branch(cmpOpUEqNeLtGe cmp, iRegL op1, immL0 op2, label labl,
   ins_encode %{
     Label* L = $labl$$label;
     Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
-    if (cond == Assembler::EQ || cond == Assembler::LS)
+    if (cond == Assembler::EQ || cond == Assembler::LS) {
       __ cbz($op1$$Register, *L);
-    else
+    } else {
+      assert(cond == Assembler::NE || cond == Assembler::HI, "unexpected condition");
       __ cbnz($op1$$Register, *L);
+    }
   %}
   ins_pipe(pipe_cmp_branch);
 %}
diff --git a/src/hotspot/cpu/aarch64/aarch64_vector.ad b/src/hotspot/cpu/aarch64/aarch64_vector.ad
index b14295ca15c..1ebc6408a60 100644
--- a/src/hotspot/cpu/aarch64/aarch64_vector.ad
+++ b/src/hotspot/cpu/aarch64/aarch64_vector.ad
@@ -135,9 +135,9 @@ source %{
           (opcode == Op_VectorCastL2X && bt == T_FLOAT) ||
           (opcode == Op_CountLeadingZerosV && bt == T_LONG) ||
           (opcode == Op_CountTrailingZerosV && bt == T_LONG) ||
-          // The vector implementation of Op_AddReductionVD/F is for the Vector API only.
-          // It is not suitable for auto-vectorization because it does not add the elements
-          // in the same order as sequential code, and FP addition is non-associative.
+          // The implementations of Op_AddReductionVD/F in Neon are for the Vector API only.
+          // They are not suitable for auto-vectorization because the result would not conform
+          // to the JLS, Section Evaluation Order.
           opcode == Op_AddReductionVD || opcode == Op_AddReductionVF ||
           opcode == Op_MulReductionVD || opcode == Op_MulReductionVF ||
           opcode == Op_MulVL) {
@@ -2858,14 +2858,14 @@ instruct reduce_addL_sve(iRegLNoSp dst, iRegL isrc, vReg vsrc, vRegD tmp) %{
 %}
 
 // reduction addF
-// Floating-point addition is not associative, so the rules for AddReductionVF
-// on NEON can't be used to auto-vectorize floating-point reduce-add.
-// Currently, on NEON, AddReductionVF is only generated by Vector API.
-instruct reduce_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{
-  predicate(UseSVE == 0 && Matcher::vector_length(n->in(2)) == 2);
+
+instruct reduce_non_strict_order_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{
+  // Non-strictly ordered floating-point add reduction for a 64-bits-long vector. This rule is
+  // intended for the VectorAPI (which allows for non-strictly ordered add reduction).
+  predicate(Matcher::vector_length(n->in(2)) == 2 && !n->as_Reduction()->requires_strict_order());
   match(Set dst (AddReductionVF fsrc vsrc));
   effect(TEMP_DEF dst);
-  format %{ "reduce_add2F_neon $dst, $fsrc, $vsrc" %}
+  format %{ "reduce_non_strict_order_add2F_neon $dst, $fsrc, $vsrc" %}
   ins_encode %{
     __ faddp($dst$$FloatRegister, $vsrc$$FloatRegister, __ S);
     __ fadds($dst$$FloatRegister, $dst$$FloatRegister, $fsrc$$FloatRegister);
@@ -2873,11 +2873,13 @@ instruct reduce_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{
   ins_pipe(pipe_slow);
 %}
 
-instruct reduce_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{
-  predicate(UseSVE == 0 && Matcher::vector_length(n->in(2)) == 4);
+instruct reduce_non_strict_order_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{
+  // Non-strictly ordered floating-point add reduction for 128-bits-long vector. This rule is
+  // intended for the VectorAPI (which allows for non-strictly ordered add reduction).
+  predicate(Matcher::vector_length(n->in(2)) == 4 && !n->as_Reduction()->requires_strict_order());
   match(Set dst (AddReductionVF fsrc vsrc));
   effect(TEMP_DEF dst, TEMP tmp);
-  format %{ "reduce_add4F_neon $dst, $fsrc, $vsrc\t# KILL $tmp" %}
+  format %{ "reduce_non_strict_order_add4F_neon $dst, $fsrc, $vsrc\t# KILL $tmp" %}
   ins_encode %{
     __ faddp($tmp$$FloatRegister, __ T4S, $vsrc$$FloatRegister, $vsrc$$FloatRegister);
     __ faddp($dst$$FloatRegister, $tmp$$FloatRegister, __ S);
@@ -2886,11 +2888,21 @@ instruct reduce_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{
   ins_pipe(pipe_slow);
 %}
 
+// This rule calculates the reduction result in strict order. Two cases will
+// reach here:
+// 1. Non strictly-ordered AddReductionVF when vector size > 128-bits. For example -
+//    AddReductionVF generated by Vector API. For vector size > 128-bits, it is more
+//    beneficial performance-wise to generate direct SVE instruction even if it is
+//    strictly ordered.
+// 2. Strictly-ordered AddReductionVF. For example - AddReductionVF generated by
+//    auto-vectorization on SVE machine.
 instruct reduce_addF_sve(vRegF dst_src1, vReg src2) %{
-  predicate(UseSVE > 0);
+  predicate(!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(2))) ||
+            n->as_Reduction()->requires_strict_order());
   match(Set dst_src1 (AddReductionVF dst_src1 src2));
   format %{ "reduce_addF_sve $dst_src1, $dst_src1, $src2" %}
   ins_encode %{
+    assert(UseSVE > 0, "must be sve");
     uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src2);
     assert(length_in_bytes == MaxVectorSize, "invalid vector length");
     __ sve_fadda($dst_src1$$FloatRegister, __ S, ptrue, $src2$$FloatRegister);
@@ -2899,14 +2911,14 @@ instruct reduce_addF_sve(vRegF dst_src1, vReg src2) %{
 %}
 
 // reduction addD
-// Floating-point addition is not associative, so the rule for AddReductionVD
-// on NEON can't be used to auto-vectorize floating-point reduce-add.
-// Currently, on NEON, AddReductionVD is only generated by Vector API.
-instruct reduce_addD_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{
-  predicate(UseSVE == 0);
+
+instruct reduce_non_strict_order_add2D_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{
+  // Non-strictly ordered floating-point add reduction for doubles. This rule is
+  // intended for the VectorAPI (which allows for non-strictly ordered add reduction).
+  predicate(!n->as_Reduction()->requires_strict_order());
   match(Set dst (AddReductionVD dsrc vsrc));
   effect(TEMP_DEF dst);
-  format %{ "reduce_addD_neon $dst, $dsrc, $vsrc\t# 2D" %}
+  format %{ "reduce_non_strict_order_add2D_neon $dst, $dsrc, $vsrc\t# 2D" %}
   ins_encode %{
     __ faddp($dst$$FloatRegister, $vsrc$$FloatRegister, __ D);
     __ faddd($dst$$FloatRegister, $dst$$FloatRegister, $dsrc$$FloatRegister);
@@ -2914,11 +2926,21 @@ instruct reduce_addD_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{
   ins_pipe(pipe_slow);
 %}
 
+// This rule calculates the reduction result in strict order. Two cases will
+// reach here:
+// 1. Non strictly-ordered AddReductionVD when vector size > 128-bits. For example -
+//    AddReductionVD generated by Vector API. For vector size > 128-bits, it is more
+//    beneficial performance-wise to generate direct SVE instruction even if it is
+//    strictly ordered.
+// 2. Strictly-ordered AddReductionVD. For example - AddReductionVD generated by
+//    auto-vectorization on SVE machine.
 instruct reduce_addD_sve(vRegD dst_src1, vReg src2) %{
-  predicate(UseSVE > 0);
+  predicate(!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(2))) ||
+            n->as_Reduction()->requires_strict_order());
   match(Set dst_src1 (AddReductionVD dst_src1 src2));
   format %{ "reduce_addD_sve $dst_src1, $dst_src1, $src2" %}
   ins_encode %{
+    assert(UseSVE > 0, "must be sve");
     uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src2);
     assert(length_in_bytes == MaxVectorSize, "invalid vector length");
     __ sve_fadda($dst_src1$$FloatRegister, __ D, ptrue, $src2$$FloatRegister);
diff --git a/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 b/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4
index 060bb4a11d4..29f92772368 100644
--- a/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4
+++ b/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4
@@ -125,9 +125,9 @@ source %{
           (opcode == Op_VectorCastL2X && bt == T_FLOAT) ||
           (opcode == Op_CountLeadingZerosV && bt == T_LONG) ||
           (opcode == Op_CountTrailingZerosV && bt == T_LONG) ||
-          // The vector implementation of Op_AddReductionVD/F is for the Vector API only.
-          // It is not suitable for auto-vectorization because it does not add the elements
-          // in the same order as sequential code, and FP addition is non-associative.
+          // The implementations of Op_AddReductionVD/F in Neon are for the Vector API only.
+          // They are not suitable for auto-vectorization because the result would not conform
+          // to the JLS, Section Evaluation Order.
           opcode == Op_AddReductionVD || opcode == Op_AddReductionVF ||
           opcode == Op_MulReductionVD || opcode == Op_MulReductionVF ||
           opcode == Op_MulVL) {
@@ -1752,14 +1752,14 @@ REDUCE_ADD_INT_NEON_SVE_PAIRWISE(I, iRegIorL2I)
 REDUCE_ADD_INT_NEON_SVE_PAIRWISE(L, iRegL)
 
 // reduction addF
-// Floating-point addition is not associative, so the rules for AddReductionVF
-// on NEON can't be used to auto-vectorize floating-point reduce-add.
-// Currently, on NEON, AddReductionVF is only generated by Vector API.
-instruct reduce_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{
-  predicate(UseSVE == 0 && Matcher::vector_length(n->in(2)) == 2);
+
+instruct reduce_non_strict_order_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{
+  // Non-strictly ordered floating-point add reduction for a 64-bits-long vector. This rule is
+  // intended for the VectorAPI (which allows for non-strictly ordered add reduction).
+  predicate(Matcher::vector_length(n->in(2)) == 2 && !n->as_Reduction()->requires_strict_order());
   match(Set dst (AddReductionVF fsrc vsrc));
   effect(TEMP_DEF dst);
-  format %{ "reduce_add2F_neon $dst, $fsrc, $vsrc" %}
+  format %{ "reduce_non_strict_order_add2F_neon $dst, $fsrc, $vsrc" %}
   ins_encode %{
     __ faddp($dst$$FloatRegister, $vsrc$$FloatRegister, __ S);
     __ fadds($dst$$FloatRegister, $dst$$FloatRegister, $fsrc$$FloatRegister);
@@ -1767,11 +1767,13 @@ instruct reduce_add2F_neon(vRegF dst, vRegF fsrc, vReg vsrc) %{
   ins_pipe(pipe_slow);
 %}
 
-instruct reduce_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{
-  predicate(UseSVE == 0 && Matcher::vector_length(n->in(2)) == 4);
+instruct reduce_non_strict_order_add4F_neon(vRegF dst, vRegF fsrc, vReg vsrc, vReg tmp) %{
+  // Non-strictly ordered floating-point add reduction for 128-bits-long vector. This rule is
+  // intended for the VectorAPI (which allows for non-strictly ordered add reduction).
+  predicate(Matcher::vector_length(n->in(2)) == 4 && !n->as_Reduction()->requires_strict_order());
   match(Set dst (AddReductionVF fsrc vsrc));
   effect(TEMP_DEF dst, TEMP tmp);
-  format %{ "reduce_add4F_neon $dst, $fsrc, $vsrc\t# KILL $tmp" %}
+  format %{ "reduce_non_strict_order_add4F_neon $dst, $fsrc, $vsrc\t# KILL $tmp" %}
   ins_encode %{
     __ faddp($tmp$$FloatRegister, __ T4S, $vsrc$$FloatRegister, $vsrc$$FloatRegister);
     __ faddp($dst$$FloatRegister, $tmp$$FloatRegister, __ S);
@@ -1783,11 +1785,21 @@ dnl
 dnl REDUCE_ADD_FP_SVE($1,   $2  )
 dnl REDUCE_ADD_FP_SVE(type, size)
 define(`REDUCE_ADD_FP_SVE', `
+// This rule calculates the reduction result in strict order. Two cases will
+// reach here:
+// 1. Non strictly-ordered AddReductionV$1 when vector size > 128-bits. For example -
+//    AddReductionV$1 generated by Vector API. For vector size > 128-bits, it is more
+//    beneficial performance-wise to generate direct SVE instruction even if it is
+//    strictly ordered.
+// 2. Strictly-ordered AddReductionV$1. For example - AddReductionV$1 generated by
+//    auto-vectorization on SVE machine.
 instruct reduce_add$1_sve(vReg$1 dst_src1, vReg src2) %{
-  predicate(UseSVE > 0);
+  predicate(!VM_Version::use_neon_for_vector(Matcher::vector_length_in_bytes(n->in(2))) ||
+            n->as_Reduction()->requires_strict_order());
   match(Set dst_src1 (AddReductionV$1 dst_src1 src2));
   format %{ "reduce_add$1_sve $dst_src1, $dst_src1, $src2" %}
   ins_encode %{
+    assert(UseSVE > 0, "must be sve");
     uint length_in_bytes = Matcher::vector_length_in_bytes(this, $src2);
     assert(length_in_bytes == MaxVectorSize, "invalid vector length");
     __ sve_fadda($dst_src1$$FloatRegister, __ $2, ptrue, $src2$$FloatRegister);
@@ -1798,14 +1810,14 @@ dnl
 REDUCE_ADD_FP_SVE(F, S)
 
 // reduction addD
-// Floating-point addition is not associative, so the rule for AddReductionVD
-// on NEON can't be used to auto-vectorize floating-point reduce-add.
-// Currently, on NEON, AddReductionVD is only generated by Vector API.
-instruct reduce_addD_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{
-  predicate(UseSVE == 0);
+
+instruct reduce_non_strict_order_add2D_neon(vRegD dst, vRegD dsrc, vReg vsrc) %{
+  // Non-strictly ordered floating-point add reduction for doubles. This rule is
+  // intended for the VectorAPI (which allows for non-strictly ordered add reduction).
+  predicate(!n->as_Reduction()->requires_strict_order());
   match(Set dst (AddReductionVD dsrc vsrc));
   effect(TEMP_DEF dst);
-  format %{ "reduce_addD_neon $dst, $dsrc, $vsrc\t# 2D" %}
+  format %{ "reduce_non_strict_order_add2D_neon $dst, $dsrc, $vsrc\t# 2D" %}
   ins_encode %{
     __ faddp($dst$$FloatRegister, $vsrc$$FloatRegister, __ D);
     __ faddd($dst$$FloatRegister, $dst$$FloatRegister, $dsrc$$FloatRegister);
diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp
index 7e3ceb1f020..251ea3813ff 100644
--- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp
@@ -1154,7 +1154,7 @@ void C2_MacroAssembler::string_compare(Register str1, Register str2,
 
   BLOCK_COMMENT("string_compare {");
 
-  // Bizzarely, the counts are passed in bytes, regardless of whether they
+  // Bizarrely, the counts are passed in bytes, regardless of whether they
   // are L or U strings, however the result is always in characters.
   if (!str1_isL) asrw(cnt1, cnt1, 1);
   if (!str2_isL) asrw(cnt2, cnt2, 1);
diff --git a/src/hotspot/cpu/aarch64/globals_aarch64.hpp b/src/hotspot/cpu/aarch64/globals_aarch64.hpp
index 2f83838fc0f..9c20e3737c8 100644
--- a/src/hotspot/cpu/aarch64/globals_aarch64.hpp
+++ b/src/hotspot/cpu/aarch64/globals_aarch64.hpp
@@ -124,6 +124,8 @@ define_pd_global(intx, InlineSmallCode,          1000);
           range(1, 99)                                                  \
   product(ccstr, UseBranchProtection, "none",                           \
           "Branch Protection to use: none, standard, pac-ret")          \
+  product(bool, AlwaysMergeDMB, true, DIAGNOSTIC,                       \
+          "Always merge DMB instructions in code emission")             \
 
 // end of ARCH_FLAGS
 
diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp
index 5fea0b8d925..ca359fea9da 100644
--- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp
@@ -1418,8 +1418,7 @@ void InterpreterMacroAssembler::notify_method_entry() {
     bind(L);
   }
 
-  {
-    SkipIfEqual skip(this, &DTraceMethodProbes, false);
+  if (DTraceMethodProbes) {
     get_method(c_rarg1);
     call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
                  rthread, c_rarg1);
@@ -1458,8 +1457,7 @@ void InterpreterMacroAssembler::notify_method_exit(
     pop(state);
   }
 
-  {
-    SkipIfEqual skip(this, &DTraceMethodProbes, false);
+  if (DTraceMethodProbes) {
     push(state);
     get_method(c_rarg1);
     call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit),
diff --git a/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp b/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp
index fdfab3ab562..18095632ac0 100644
--- a/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp
@@ -34,6 +34,9 @@
 #include "runtime/jniHandles.hpp"
 #include "runtime/sharedRuntime.hpp"
 #include "vmreg_aarch64.inline.hpp"
+#if INCLUDE_ZGC
+#include "gc/z/zBarrierSetAssembler.hpp"
+#endif
 
 jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMCI_TRAPS) {
   if (inst->is_call() || inst->is_jump() || inst->is_blr()) {
@@ -164,24 +167,35 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& metho
   }
 }
 
-void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
+bool CodeInstaller::pd_relocate(address pc, jint mark) {
   switch (mark) {
     case POLL_NEAR:
-      JVMCI_ERROR("unimplemented");
-      break;
+      // This is unhandled and will be reported by the caller
+      return false;
     case POLL_FAR:
       _instructions->relocate(pc, relocInfo::poll_type);
-      break;
+      return true;
     case POLL_RETURN_NEAR:
-      JVMCI_ERROR("unimplemented");
-      break;
+      // This is unhandled and will be reported by the caller
+      return false;
     case POLL_RETURN_FAR:
       _instructions->relocate(pc, relocInfo::poll_return_type);
-      break;
-    default:
-      JVMCI_ERROR("invalid mark value");
-      break;
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_TB_X:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadGoodBeforeTbX);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_BEFORE_MOV:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatMarkBadBeforeMov);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_BEFORE_MOV:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodBeforeMov);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_BEFORE_MOV:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreBadBeforeMov);
+      return true;
+
   }
+  return false;
 }
 
 // convert JVMCI register indices (as used in oop maps) to HotSpot registers
diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
index 1929077fa16..f90aefc8fd3 100644
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
@@ -2350,14 +2350,36 @@ void MacroAssembler::membar(Membar_mask_bits order_constraint) {
   address last = code()->last_insn();
   if (last != nullptr && nativeInstruction_at(last)->is_Membar() && prev == last) {
     NativeMembar *bar = NativeMembar_at(prev);
-    // We are merging two memory barrier instructions.  On AArch64 we
-    // can do this simply by ORing them together.
-    bar->set_kind(bar->get_kind() | order_constraint);
-    BLOCK_COMMENT("merged membar");
-  } else {
-    code()->set_last_insn(pc());
-    dmb(Assembler::barrier(order_constraint));
+    if (AlwaysMergeDMB) {
+      bar->set_kind(bar->get_kind() | order_constraint);
+      BLOCK_COMMENT("merged membar(always)");
+      return;
+    }
+    // Don't promote DMB ST|DMB LD to DMB (a full barrier) because
+    // doing so would introduce a StoreLoad which the caller did not
+    // intend
+    if (bar->get_kind() == order_constraint
+        || bar->get_kind() == AnyAny
+        || order_constraint == AnyAny) {
+      // We are merging two memory barrier instructions.  On AArch64 we
+      // can do this simply by ORing them together.
+      bar->set_kind(bar->get_kind() | order_constraint);
+      BLOCK_COMMENT("merged membar");
+      return;
+    } else {
+      // A special case like "DMB ST;DMB LD;DMB ST", the last DMB can be skipped
+      // We need check the last 2 instructions
+      address prev2 = prev - NativeMembar::instruction_size;
+      if (last != code()->last_label() && nativeInstruction_at(prev2)->is_Membar()) {
+        NativeMembar *bar2 = NativeMembar_at(prev2);
+        assert(bar2->get_kind() == order_constraint, "it should be merged before");
+        BLOCK_COMMENT("merged membar(elided)");
+        return;
+      }
+    }
   }
+  code()->set_last_insn(pc());
+  dmb(Assembler::barrier(order_constraint));
 }
 
 bool MacroAssembler::try_merge_ldst(Register rt, const Address &adr, size_t size_in_bytes, bool is_store) {
diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
index 7b7ecf49c8c..3bfd6e70872 100644
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp
@@ -150,6 +150,7 @@ class MacroAssembler: public Assembler {
   void bind(Label& L) {
     Assembler::bind(L);
     code()->clear_last_insn();
+    code()->set_last_label(pc());
   }
 
   void membar(Membar_mask_bits order_constraint);
diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp
index 84caef57f87..974214d985b 100644
--- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp
+++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp
@@ -168,6 +168,7 @@ class NativeCall: public NativeInstruction {
     return_address_offset       =    4
   };
 
+  static int byte_size() { return instruction_size; }
   address instruction_address() const { return addr_at(instruction_offset); }
   address next_instruction_address() const { return addr_at(return_address_offset); }
   int displacement() const { return (int_at(displacement_offset) << 6) >> 4; }
diff --git a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp
index a2600825622..bb2554e65ce 100644
--- a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp
@@ -1754,11 +1754,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   __ set_last_Java_frame(sp, noreg, native_return, rscratch1);
 
   Label dtrace_method_entry, dtrace_method_entry_done;
-  {
-    uint64_t offset;
-    __ adrp(rscratch1, ExternalAddress((address)&DTraceMethodProbes), offset);
-    __ ldrb(rscratch1, Address(rscratch1, offset));
-    __ cbnzw(rscratch1, dtrace_method_entry);
+  if (DTraceMethodProbes) {
+    __ b(dtrace_method_entry);
     __ bind(dtrace_method_entry_done);
   }
 
@@ -1990,11 +1987,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   }
 
   Label dtrace_method_exit, dtrace_method_exit_done;
-  {
-    uint64_t offset;
-    __ adrp(rscratch1, ExternalAddress((address)&DTraceMethodProbes), offset);
-    __ ldrb(rscratch1, Address(rscratch1, offset));
-    __ cbnzw(rscratch1, dtrace_method_exit);
+  if (DTraceMethodProbes) {
+    __ b(dtrace_method_exit);
     __ bind(dtrace_method_exit_done);
   }
 
@@ -2138,37 +2132,38 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   }
 
   // SLOW PATH dtrace support
-  {
-    __ block_comment("dtrace entry {");
-    __ bind(dtrace_method_entry);
-
-    // We have all of the arguments setup at this point. We must not touch any register
-    // argument registers at this point (what if we save/restore them there are no oop?
-
-    save_args(masm, total_c_args, c_arg, out_regs);
-    __ mov_metadata(c_rarg1, method());
-    __ call_VM_leaf(
-      CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
-      rthread, c_rarg1);
-    restore_args(masm, total_c_args, c_arg, out_regs);
-    __ b(dtrace_method_entry_done);
-    __ block_comment("} dtrace entry");
-  }
+  if (DTraceMethodProbes) {
+    {
+      __ block_comment("dtrace entry {");
+      __ bind(dtrace_method_entry);
+
+      // We have all of the arguments setup at this point. We must not touch any register
+      // argument registers at this point (what if we save/restore them there are no oop?
+
+      save_args(masm, total_c_args, c_arg, out_regs);
+      __ mov_metadata(c_rarg1, method());
+      __ call_VM_leaf(
+        CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
+        rthread, c_rarg1);
+      restore_args(masm, total_c_args, c_arg, out_regs);
+      __ b(dtrace_method_entry_done);
+      __ block_comment("} dtrace entry");
+    }
 
-  {
-    __ block_comment("dtrace exit {");
-    __ bind(dtrace_method_exit);
-    save_native_result(masm, ret_type, stack_slots);
-    __ mov_metadata(c_rarg1, method());
-    __ call_VM_leaf(
-         CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit),
-         rthread, c_rarg1);
-    restore_native_result(masm, ret_type, stack_slots);
-    __ b(dtrace_method_exit_done);
-    __ block_comment("} dtrace exit");
+    {
+      __ block_comment("dtrace exit {");
+      __ bind(dtrace_method_exit);
+      save_native_result(masm, ret_type, stack_slots);
+      __ mov_metadata(c_rarg1, method());
+      __ call_VM_leaf(
+        CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit),
+        rthread, c_rarg1);
+      restore_native_result(masm, ret_type, stack_slots);
+      __ b(dtrace_method_exit_done);
+      __ block_comment("} dtrace exit");
+    }
   }
 
-
   __ flush();
 
   nmethod *nm = nmethod::new_native_nmethod(method,
diff --git a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp
index f32a4ee7372..f7cf9938157 100644
--- a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp
@@ -3648,8 +3648,7 @@ void TemplateTable::_new() {
     __ store_klass_gap(r0, zr);  // zero klass gap for compressed oops
     __ store_klass(r0, r4);      // store klass last
 
-    {
-      SkipIfEqual skip(_masm, &DTraceAllocProbes, false);
+    if (DTraceAllocProbes) {
       // Trigger dtrace event for fastpath
       __ push(atos); // save the return value
       __ call_VM_leaf(
diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp
index 18f310c746c..aa64f411dbf 100644
--- a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2015, 2020, Red Hat Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -230,6 +230,9 @@ void VM_Version::initialize() {
     if (FLAG_IS_DEFAULT(OnSpinWaitInstCount)) {
       FLAG_SET_DEFAULT(OnSpinWaitInstCount, 1);
     }
+    if (FLAG_IS_DEFAULT(AlwaysMergeDMB)) {
+      FLAG_SET_DEFAULT(AlwaysMergeDMB, false);
+    }
   }
 
   if (_cpu == CPU_ARM) {
diff --git a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp
index 688790f07e5..999f8fe5904 100644
--- a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp
+++ b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp
@@ -152,8 +152,14 @@ void LIR_Assembler::osr_entry() {
   int monitor_offset = (method()->max_locals() + 2 * (number_of_locks - 1)) * BytesPerWord;
   for (int i = 0; i < number_of_locks; i++) {
     int slot_offset = monitor_offset - (i * 2 * BytesPerWord);
-    __ ldr(R1, Address(OSR_buf, slot_offset + 0*BytesPerWord));
-    __ ldr(R2, Address(OSR_buf, slot_offset + 1*BytesPerWord));
+    if (slot_offset >= 4096 - BytesPerWord) {
+      __ add_slow(R2, OSR_buf, slot_offset);
+      __ ldr(R1, Address(R2, 0*BytesPerWord));
+      __ ldr(R2, Address(R2, 1*BytesPerWord));
+    } else {
+      __ ldr(R1, Address(OSR_buf, slot_offset + 0*BytesPerWord));
+      __ ldr(R2, Address(OSR_buf, slot_offset + 1*BytesPerWord));
+    }
     __ str(R1, frame_map()->address_for_monitor_lock(i));
     __ str(R2, frame_map()->address_for_monitor_object(i));
   }
diff --git a/src/hotspot/cpu/arm/nativeInst_arm_32.hpp b/src/hotspot/cpu/arm/nativeInst_arm_32.hpp
index 15b57188730..e26c23cd983 100644
--- a/src/hotspot/cpu/arm/nativeInst_arm_32.hpp
+++ b/src/hotspot/cpu/arm/nativeInst_arm_32.hpp
@@ -415,6 +415,7 @@ inline NativeJump* nativeJump_at(address address) {
 
 class NativeCall: public RawNativeCall {
 public:
+  static int byte_size() { return instruction_size; }
   // NativeCall::next_instruction_address() is used only to define the
   // range where to look for the relocation information. We need not
   // walk over composed instructions (as long as the relocation information
diff --git a/src/hotspot/cpu/ppc/assembler_ppc.hpp b/src/hotspot/cpu/ppc/assembler_ppc.hpp
index 61a5d6425ee..d18574f50a9 100644
--- a/src/hotspot/cpu/ppc/assembler_ppc.hpp
+++ b/src/hotspot/cpu/ppc/assembler_ppc.hpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -350,6 +350,7 @@ class Assembler : public AbstractAssembler {
 
     SETBC_OPCODE  = (31u << OPCODE_SHIFT | 384u << 1),
     SETNBC_OPCODE = (31u << OPCODE_SHIFT | 448u << 1),
+    SETBCR_OPCODE = (31u << OPCODE_SHIFT | 416u << 1),
 
     // condition register logic instructions
     CRAND_OPCODE  = (19u << OPCODE_SHIFT | 257u << 1),
@@ -1780,6 +1781,8 @@ class Assembler : public AbstractAssembler {
   inline void setbc( Register d, ConditionRegister cr, Condition cc);
   inline void setnbc(Register d, int biint);
   inline void setnbc(Register d, ConditionRegister cr, Condition cc);
+  inline void setbcr(Register d, int biint);
+  inline void setbcr(Register d, ConditionRegister cr, Condition cc);
 
   // Special purpose registers
   // Exception Register
diff --git a/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp b/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp
index d78dec964cb..98c8b629844 100644
--- a/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp
+++ b/src/hotspot/cpu/ppc/assembler_ppc.inline.hpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2020 SAP SE. All rights reserved.
+ * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -419,6 +419,11 @@ inline void Assembler::setnbc(Register d, int biint)
 inline void Assembler::setnbc(Register d, ConditionRegister cr, Condition cc) {
   setnbc(d, bi0(cr, cc));
 }
+inline void Assembler::setbcr(Register d, int biint)
+                                                  { emit_int32(SETBCR_OPCODE | rt(d) | bi(biint)); }
+inline void Assembler::setbcr(Register d, ConditionRegister cr, Condition cc) {
+  setbcr(d, bi0(cr, cc));
+}
 
 // Special purpose registers
 // Exception Register
diff --git a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp
index 3ae35949b21..0c1e23c6353 100644
--- a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp
+++ b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -1827,18 +1827,17 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
 
   int flags = op->flags();
   ciArrayKlass* default_type = op->expected_type();
-  BasicType basic_type = default_type != nullptr ? default_type->element_type()->basic_type() : T_ILLEGAL;
+  BasicType basic_type = (default_type != nullptr) ? default_type->element_type()->basic_type() : T_ILLEGAL;
   if (basic_type == T_ARRAY) basic_type = T_OBJECT;
 
   // Set up the arraycopy stub information.
   ArrayCopyStub* stub = op->stub();
-  const int frame_resize = frame::native_abi_reg_args_size - sizeof(frame::java_abi); // C calls need larger frame.
 
   // Always do stub if no type information is available. It's ok if
   // the known type isn't loaded since the code sanity checks
   // in debug mode and the type isn't required when we know the exact type
   // also check that the type is an array type.
-  if (op->expected_type() == nullptr) {
+  if (default_type == nullptr) {
     assert(src->is_nonvolatile() && src_pos->is_nonvolatile() && dst->is_nonvolatile() && dst_pos->is_nonvolatile() &&
            length->is_nonvolatile(), "must preserve");
     address copyfunc_addr = StubRoutines::generic_arraycopy();
@@ -1873,7 +1872,7 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
     return;
   }
 
-  assert(default_type != nullptr && default_type->is_array_klass(), "must be true at this point");
+  assert(default_type != nullptr && default_type->is_array_klass() && default_type->is_loaded(), "must be true at this point");
   Label cont, slow, copyfunc;
 
   bool simple_check_flag_set = flags & (LIR_OpArrayCopy::src_null_check |
@@ -1968,7 +1967,11 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
   int shift = shift_amount(basic_type);
 
   if (!(flags & LIR_OpArrayCopy::type_check)) {
-    __ b(cont);
+    if (stub != nullptr) {
+      __ b(cont);
+      __ bind(slow);
+      __ b(*stub->entry());
+    }
   } else {
     // We don't know the array types are compatible.
     if (basic_type != T_OBJECT) {
@@ -2089,9 +2092,9 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
         __ add(dst_pos, tmp, dst_pos);
       }
     }
+    __ bind(slow);
+    __ b(*stub->entry());
   }
-  __ bind(slow);
-  __ b(*stub->entry());
   __ bind(cont);
 
 #ifdef ASSERT
@@ -2104,7 +2107,7 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
     // subtype which we can't check or src is the same array as dst
     // but not necessarily exactly of type default_type.
     Label known_ok, halt;
-    metadata2reg(op->expected_type()->constant_encoding(), tmp);
+    metadata2reg(default_type->constant_encoding(), tmp);
     if (UseCompressedClassPointers) {
       // Tmp holds the default type. It currently comes uncompressed after the
       // load of a constant, so encode it.
@@ -2180,7 +2183,9 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
   __ mr(len, length);
   __ call_c_with_frame_resize(entry, /*stub does not need resized frame*/ 0);
 
-  __ bind(*stub->continuation());
+  if (stub != nullptr) {
+    __ bind(*stub->continuation());
+  }
 }
 
 
@@ -2301,7 +2306,8 @@ void LIR_Assembler::emit_alloc_array(LIR_OpAllocArray* op) {
                       arrayOopDesc::base_offset_in_bytes(op->type()),
                       type2aelembytes(op->type()),
                       op->klass()->as_register(),
-                      *op->stub()->entry());
+                      *op->stub()->entry(),
+                      op->zero_array());
   }
   __ bind(*op->stub()->continuation());
 }
diff --git a/src/hotspot/cpu/ppc/c1_LIRGenerator_ppc.cpp b/src/hotspot/cpu/ppc/c1_LIRGenerator_ppc.cpp
index 2caca1dc556..04762a22c61 100644
--- a/src/hotspot/cpu/ppc/c1_LIRGenerator_ppc.cpp
+++ b/src/hotspot/cpu/ppc/c1_LIRGenerator_ppc.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -758,7 +758,13 @@ void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
   assert(x->number_of_arguments() == 5, "wrong type");
 
   // Make all state_for calls early since they can emit code.
-  CodeEmitInfo* info = state_for(x, x->state());
+  CodeEmitInfo* info = nullptr;
+  if (x->state_before() != nullptr && x->state_before()->force_reexecute()) {
+    info = state_for(x, x->state_before());
+    info->set_force_reexecute();
+  } else {
+    info = state_for(x, x->state());
+  }
 
   LIRItem src     (x->argument_at(0), this);
   LIRItem src_pos (x->argument_at(1), this);
@@ -778,7 +784,9 @@ void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
   int flags;
   ciArrayKlass* expected_type;
   arraycopy_helper(x, &flags, &expected_type);
-
+  if (x->check_flag(Instruction::OmitChecksFlag)) {
+    flags = 0;
+  }
   __ arraycopy(src.result(), src_pos.result(), dst.result(), dst_pos.result(),
                length.result(), tmp,
                expected_type, flags, info);
@@ -903,7 +911,13 @@ void LIRGenerator::do_NewInstance(NewInstance* x) {
 
 void LIRGenerator::do_NewTypeArray(NewTypeArray* x) {
   // Evaluate state_for early since it may emit code.
-  CodeEmitInfo* info = state_for(x, x->state());
+  CodeEmitInfo* info = nullptr;
+  if (x->state_before() != nullptr && x->state_before()->force_reexecute()) {
+    info = state_for(x, x->state_before());
+    info->set_force_reexecute();
+  } else {
+    info = state_for(x, x->state());
+  }
 
   LIRItem length(x->length(), this);
   length.load_item();
@@ -921,7 +935,7 @@ void LIRGenerator::do_NewTypeArray(NewTypeArray* x) {
   __ metadata2reg(ciTypeArrayKlass::make(elem_type)->constant_encoding(), klass_reg);
 
   CodeStub* slow_path = new NewTypeArrayStub(klass_reg, len, reg, info);
-  __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path);
+  __ allocate_array(reg, len, tmp1, tmp2, tmp3, tmp4, elem_type, klass_reg, slow_path, x->zero_array());
 
   // Must prevent reordering of stores for object initialization
   // with stores that publish the new object.
diff --git a/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp b/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp
index 9da5a2c6580..abc439df827 100644
--- a/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp
+++ b/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2018 SAP SE. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -310,7 +310,8 @@ void C1_MacroAssembler::allocate_array(
   int      base_offset_in_bytes,       // elements offset in bytes
   int      elt_size,                   // element size in bytes
   Register klass,                      // object klass
-  Label&   slow_case                   // continuation point if fast allocation fails
+  Label&   slow_case,                  // continuation point if fast allocation fails
+  bool     zero_array                  // zero the allocated array or not
 ) {
   assert_different_registers(obj, len, t1, t2, t3, klass);
 
@@ -346,22 +347,24 @@ void C1_MacroAssembler::allocate_array(
   try_allocate(obj, arr_size, 0, t2, t3, slow_case);
   initialize_header(obj, klass, len, t2, t3);
 
-  // Initialize body.
-  const Register base  = t2;
-  const Register index = t3;
-  addi(base, obj, base_offset_in_bytes);               // compute address of first element
-  addi(index, arr_size, -(base_offset_in_bytes));      // compute index = number of bytes to clear
-
-  // Zero first 4 bytes, if start offset is not word aligned.
-  if (!is_aligned(base_offset_in_bytes, BytesPerWord)) {
-    assert(is_aligned(base_offset_in_bytes, BytesPerInt), "must be 4-byte aligned");
-    li(t1, 0);
-    stw(t1, 0, base);
-    addi(base, base, BytesPerInt);
-    // Note: initialize_body will align index down, no need to correct it here.
-  }
+  if (zero_array) {
+    // Initialize body.
+    const Register base  = t2;
+    const Register index = t3;
+    addi(base, obj, base_offset_in_bytes);               // compute address of first element
+    addi(index, arr_size, -(base_offset_in_bytes));      // compute index = number of bytes to clear
+
+    // Zero first 4 bytes, if start offset is not word aligned.
+    if (!is_aligned(base_offset_in_bytes, BytesPerWord)) {
+      assert(is_aligned(base_offset_in_bytes, BytesPerInt), "must be 4-byte aligned");
+      li(t1, 0);
+      stw(t1, 0, base);
+      addi(base, base, BytesPerInt);
+      // Note: initialize_body will align index down, no need to correct it here.
+    }
 
-  initialize_body(base, index);
+    initialize_body(base, index);
+  }
 
   if (CURRENT_ENV->dtrace_alloc_probes()) {
     Unimplemented();
diff --git a/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.hpp b/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.hpp
index ab31431e67d..c0a3dd3b83c 100644
--- a/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.hpp
+++ b/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.hpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2015 SAP SE. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -83,7 +83,8 @@
     int      base_offset_in_bytes,     // elements offset in bytes
     int      elt_size,                 // element size in bytes
     Register klass,                    // object klass
-    Label&   slow_case                 // continuation point if fast allocation fails
+    Label&   slow_case,                // continuation point if fast allocation fails
+    bool     zero_array                // zero the allocated array or not
   );
 
   void null_check(Register r, Label *Lnull = nullptr);
diff --git a/src/hotspot/cpu/ppc/downcallLinker_ppc.cpp b/src/hotspot/cpu/ppc/downcallLinker_ppc.cpp
index 7175f727437..45859f33bfb 100644
--- a/src/hotspot/cpu/ppc/downcallLinker_ppc.cpp
+++ b/src/hotspot/cpu/ppc/downcallLinker_ppc.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024 SAP SE. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -187,7 +187,7 @@ void DowncallLinker::StubGenerator::generate() {
   _oop_maps  = _needs_transition ? new OopMapSet() : nullptr;
   address start = __ pc();
 
-  __ save_LR_CR(tmp); // Save in old frame.
+  __ save_LR(tmp); // Save in old frame.
   __ mr(callerSP, R1_SP); // preset (used to access caller frame argument slots)
   __ push_frame(allocated_frame_size, tmp);
 
@@ -302,7 +302,7 @@ void DowncallLinker::StubGenerator::generate() {
   }
 
   __ pop_frame();
-  __ restore_LR_CR(tmp);
+  __ restore_LR(tmp);
   __ blr();
 
   //////////////////////////////////////////////////////////////////////////////
diff --git a/src/hotspot/cpu/ppc/gc/g1/g1BarrierSetAssembler_ppc.cpp b/src/hotspot/cpu/ppc/gc/g1/g1BarrierSetAssembler_ppc.cpp
index 45438f81345..7d230d301c2 100644
--- a/src/hotspot/cpu/ppc/gc/g1/g1BarrierSetAssembler_ppc.cpp
+++ b/src/hotspot/cpu/ppc/gc/g1/g1BarrierSetAssembler_ppc.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024 SAP SE. 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 @@ void G1BarrierSetAssembler::gen_write_ref_array_pre_barrier(MacroAssembler* masm
     __ cmpdi(CCR0, R0, 0);
     __ beq(CCR0, filtered);
 
-    __ save_LR_CR(R0);
+    __ save_LR(R0);
     __ push_frame(frame_size, R0);
     int slot_nr = 0;
     __ std(from,  frame_size - (++slot_nr) * wordSize, R1_SP);
@@ -89,7 +89,7 @@ void G1BarrierSetAssembler::gen_write_ref_array_pre_barrier(MacroAssembler* masm
     if (preserve1 != noreg) { __ ld(preserve1, frame_size - (++slot_nr) * wordSize, R1_SP); }
     if (preserve2 != noreg) { __ ld(preserve2, frame_size - (++slot_nr) * wordSize, R1_SP); }
     __ addi(R1_SP, R1_SP, frame_size); // pop_frame()
-    __ restore_LR_CR(R0);
+    __ restore_LR(R0);
 
     __ bind(filtered);
   }
@@ -100,13 +100,13 @@ void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* mas
   int spill_slots = (preserve != noreg) ? 1 : 0;
   const int frame_size = align_up(frame::native_abi_reg_args_size + spill_slots * BytesPerWord, frame::alignment_in_bytes);
 
-  __ save_LR_CR(R0);
+  __ save_LR(R0);
   __ push_frame(frame_size, R0);
   if (preserve != noreg) { __ std(preserve, frame_size - 1 * wordSize, R1_SP); }
   __ call_VM_leaf(CAST_FROM_FN_PTR(address, G1BarrierSetRuntime::write_ref_array_post_entry), addr, count);
   if (preserve != noreg) { __ ld(preserve, frame_size - 1 * wordSize, R1_SP); }
   __ addi(R1_SP, R1_SP, frame_size); // pop_frame();
-  __ restore_LR_CR(R0);
+  __ restore_LR(R0);
 }
 
 void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm, DecoratorSet decorators,
@@ -206,7 +206,7 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm, Decorator
       __ save_volatile_gprs(R1_SP, -nbytes_save, preserve_fp_registers);
     }
 
-    __ save_LR_CR(tmp1);
+    __ save_LR(tmp1);
     __ push_frame_reg_args(nbytes_save, tmp2);
   }
 
@@ -220,7 +220,7 @@ void G1BarrierSetAssembler::g1_write_barrier_pre(MacroAssembler* masm, Decorator
 
   if (needs_frame) {
     __ pop_frame();
-    __ restore_LR_CR(tmp1);
+    __ restore_LR(tmp1);
 
     if (preserve_gp_registers) {
       __ restore_volatile_gprs(R1_SP, -nbytes_save, preserve_fp_registers);
diff --git a/src/hotspot/cpu/ppc/gc/shenandoah/shenandoahBarrierSetAssembler_ppc.cpp b/src/hotspot/cpu/ppc/gc/shenandoah/shenandoahBarrierSetAssembler_ppc.cpp
index 1121520b341..e571755defd 100644
--- a/src/hotspot/cpu/ppc/gc/shenandoah/shenandoahBarrierSetAssembler_ppc.cpp
+++ b/src/hotspot/cpu/ppc/gc/shenandoah/shenandoahBarrierSetAssembler_ppc.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2018, 2021, Red Hat, Inc. All rights reserved.
- * Copyright (c) 2012, 2022 SAP SE. All rights reserved.
+ * Copyright (c) 2018, 2024, Red Hat, Inc. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -150,7 +150,7 @@ void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler *masm, Dec
     __ std(dst, -BytesPerWord * ++highest_preserve_register_index, R1_SP);
     __ std(count, -BytesPerWord * ++highest_preserve_register_index, R1_SP);
 
-    __ save_LR_CR(R11_tmp);
+    __ save_LR(R11_tmp);
     __ push_frame_reg_args(-BytesPerWord * highest_preserve_register_index,
                            R11_tmp);
   }
@@ -169,7 +169,7 @@ void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler *masm, Dec
   // Restore to-be-preserved registers.
   {
     __ pop_frame();
-    __ restore_LR_CR(R11_tmp);
+    __ restore_LR(R11_tmp);
 
     __ ld(count, -BytesPerWord * highest_preserve_register_index--, R1_SP);
     __ ld(dst, -BytesPerWord * highest_preserve_register_index--, R1_SP);
@@ -314,7 +314,7 @@ void ShenandoahBarrierSetAssembler::satb_write_barrier_impl(MacroAssembler *masm
       __ save_volatile_gprs(R1_SP, -nbytes_save, preserve_fp_registers);
     }
 
-    __ save_LR_CR(tmp1);
+    __ save_LR(tmp1);
     __ push_frame_reg_args(nbytes_save, tmp2);
   }
 
@@ -335,7 +335,7 @@ void ShenandoahBarrierSetAssembler::satb_write_barrier_impl(MacroAssembler *masm
 
   if (needs_frame) {
     __ pop_frame();
-    __ restore_LR_CR(tmp1);
+    __ restore_LR(tmp1);
 
     if (preserve_gp_registers) {
       __ restore_volatile_gprs(R1_SP, -nbytes_save, preserve_fp_registers);
@@ -487,7 +487,7 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier_impl(
       __ save_volatile_gprs(R1_SP, -nbytes_save, preserve_fp_registers);
     }
 
-    __ save_LR_CR(tmp1);
+    __ save_LR(tmp1);
     __ push_frame_reg_args(nbytes_save, tmp1);
   }
 
@@ -527,7 +527,7 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier_impl(
 
   if (needs_frame) {
     __ pop_frame();
-    __ restore_LR_CR(tmp1);
+    __ restore_LR(tmp1);
 
     if (preserve_gp_registers) {
       __ restore_volatile_gprs(R1_SP, -nbytes_save, preserve_fp_registers);
@@ -984,7 +984,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
   // Save to-be-preserved registers.
   const int nbytes_save = (MacroAssembler::num_volatile_regs + caller_stack_slots) * BytesPerWord;
   __ save_volatile_gprs(R1_SP, -nbytes_save);
-  __ save_LR_CR(R11_tmp1);
+  __ save_LR(R11_tmp1);
   __ push_frame_reg_args(nbytes_save, R11_tmp1);
 
   // Invoke runtime.
@@ -992,7 +992,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
 
   // Restore to-be-preserved registers.
   __ pop_frame();
-  __ restore_LR_CR(R11_tmp1);
+  __ restore_LR(R11_tmp1);
   __ restore_volatile_gprs(R1_SP, -nbytes_save);
 
   __ bind(skip_barrier);
@@ -1057,7 +1057,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_s
   }
   assert(jrt_address != nullptr, "load reference barrier runtime routine cannot be found");
 
-  __ save_LR_CR(R11_tmp);
+  __ save_LR(R11_tmp);
   __ push_frame_reg_args(nbytes_save, R11_tmp);
 
   // Invoke runtime.  Arguments are already stored in the corresponding registers.
@@ -1065,7 +1065,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_s
 
   // Restore to-be-preserved registers.
   __ pop_frame();
-  __ restore_LR_CR(R11_tmp);
+  __ restore_LR(R11_tmp);
   __ restore_volatile_gprs(R1_SP, -nbytes_save, true, false); // Skip 'R3_RET' register.
 
   __ blr();
diff --git a/src/hotspot/cpu/ppc/gc/x/xBarrierSetAssembler_ppc.cpp b/src/hotspot/cpu/ppc/gc/x/xBarrierSetAssembler_ppc.cpp
index 7db34177d3a..ca826e47352 100644
--- a/src/hotspot/cpu/ppc/gc/x/xBarrierSetAssembler_ppc.cpp
+++ b/src/hotspot/cpu/ppc/gc/x/xBarrierSetAssembler_ppc.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2021, 2022 SAP SE. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 SAP SE. 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
@@ -116,7 +116,7 @@ void XBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators
       __ save_volatile_gprs(R1_SP, -nbytes_save, preserve_fp_registers, preserve_R3);
     }
 
-    __ save_LR_CR(tmp1);
+    __ save_LR(tmp1);
     __ push_frame_reg_args(nbytes_save, tmp1);
   }
 
@@ -138,7 +138,7 @@ void XBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators
   Register result = R3_RET;
   if (needs_frame) {
     __ pop_frame();
-    __ restore_LR_CR(tmp1);
+    __ restore_LR(tmp1);
 
     if (preserve_R3) {
       __ mr(R0, R3_RET);
@@ -220,7 +220,7 @@ void XBarrierSetAssembler::arraycopy_prologue(MacroAssembler *masm, DecoratorSet
     __ std(dst, -BytesPerWord * ++nbytes_save, R1_SP);
     __ std(count, -BytesPerWord * ++nbytes_save, R1_SP);
 
-    __ save_LR_CR(tmp_R11);
+    __ save_LR(tmp_R11);
     __ push_frame_reg_args(nbytes_save, tmp_R11);
   }
 
@@ -243,7 +243,7 @@ void XBarrierSetAssembler::arraycopy_prologue(MacroAssembler *masm, DecoratorSet
   __ call_VM_leaf(XBarrierSetRuntime::load_barrier_on_oop_array_addr());
 
   __ pop_frame();
-  __ restore_LR_CR(tmp_R11);
+  __ restore_LR(tmp_R11);
 
   {
     __ ld(count, -BytesPerWord * nbytes_save--, R1_SP);
@@ -357,7 +357,7 @@ void XBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler*
   const int nbytes_save = (MacroAssembler::num_volatile_regs + stack_parameters) * BytesPerWord;
 
   __ save_volatile_gprs(R1_SP, -nbytes_save);
-  __ save_LR_CR(R0);
+  __ save_LR(R0);
 
   // Load arguments back again from the stack.
   __ ld(R3_ARG1, (intptr_t) -1 * BytesPerWord, R1_SP); // ref
@@ -371,7 +371,7 @@ void XBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler*
   __ mr(R0, R3_RET);
 
   __ pop_frame();
-  __ restore_LR_CR(R3_RET);
+  __ restore_LR(R3_RET);
   __ restore_volatile_gprs(R1_SP, -nbytes_save);
 
   __ blr();
diff --git a/src/hotspot/cpu/ppc/gc/z/zBarrierSetAssembler_ppc.cpp b/src/hotspot/cpu/ppc/gc/z/zBarrierSetAssembler_ppc.cpp
index 5696b78eba8..9e606054fe9 100644
--- a/src/hotspot/cpu/ppc/gc/z/zBarrierSetAssembler_ppc.cpp
+++ b/src/hotspot/cpu/ppc/gc/z/zBarrierSetAssembler_ppc.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2021, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024 SAP SE. 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
@@ -73,7 +73,7 @@ class ZRuntimeCallSpill {
         __ save_volatile_gprs(R1_SP, -_nbytes_save, _preserve_fp_registers, preserve_R3);
       }
 
-      __ save_LR_CR(R0);
+      __ save_LR(R0);
       __ push_frame_reg_args(_nbytes_save, R0);
     }
   }
@@ -84,7 +84,7 @@ class ZRuntimeCallSpill {
     Register result = R3_RET;
     if (_needs_frame) {
       __ pop_frame();
-      __ restore_LR_CR(R0);
+      __ restore_LR(R0);
 
       if (_preserve_gp_registers) {
         bool restore_R3 = _result != R3_ARG1;
@@ -785,7 +785,7 @@ void ZBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler*
   const int nbytes_save = (MacroAssembler::num_volatile_regs + stack_parameters) * BytesPerWord;
 
   __ save_volatile_gprs(R1_SP, -nbytes_save);
-  __ save_LR_CR(R0);
+  __ save_LR(R0);
 
   // Load arguments back again from the stack.
   __ ld(R3_ARG1, -1 * BytesPerWord, R1_SP); // ref
@@ -799,7 +799,7 @@ void ZBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler*
   __ mr(R0, R3_RET);
 
   __ pop_frame();
-  __ restore_LR_CR(R3_RET);
+  __ restore_LR(R3_RET);
   __ restore_volatile_gprs(R1_SP, -nbytes_save);
 
   __ blr();
@@ -815,7 +815,7 @@ void ZBarrierSetAssembler::generate_c1_store_barrier_runtime_stub(StubAssembler*
   __ save_volatile_gprs(R1_SP, -nbytes_save);
   __ mr(R3_ARG1, R0); // store address
 
-  __ save_LR_CR(R0);
+  __ save_LR(R0);
   __ push_frame_reg_args(nbytes_save, R0);
 
   if (self_healing) {
@@ -825,7 +825,7 @@ void ZBarrierSetAssembler::generate_c1_store_barrier_runtime_stub(StubAssembler*
   }
 
   __ pop_frame();
-  __ restore_LR_CR(R3_RET);
+  __ restore_LR(R3_RET);
   __ restore_volatile_gprs(R1_SP, -nbytes_save);
 
   __ blr();
diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp
index 4b74b1ae941..f9e584a1e6b 100644
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp
+++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -895,18 +895,26 @@ void MacroAssembler::restore_volatile_gprs(Register src, int offset, bool includ
   }
 }
 
-void MacroAssembler::save_LR_CR(Register tmp) {
-  mfcr(tmp);
-  std(tmp, _abi0(cr), R1_SP);
+void MacroAssembler::save_LR(Register tmp) {
   mflr(tmp);
   std(tmp, _abi0(lr), R1_SP);
-  // Tmp must contain lr on exit! (see return_addr and prolog in ppc64.ad)
 }
 
-void MacroAssembler::restore_LR_CR(Register tmp) {
+void MacroAssembler::restore_LR(Register tmp) {
   assert(tmp != R1_SP, "must be distinct");
   ld(tmp, _abi0(lr), R1_SP);
   mtlr(tmp);
+}
+
+void MacroAssembler::save_LR_CR(Register tmp) {
+  mfcr(tmp);
+  std(tmp, _abi0(cr), R1_SP);
+  save_LR(tmp);
+  // Tmp must contain lr on exit! (see return_addr and prolog in ppc64.ad)
+}
+
+void MacroAssembler::restore_LR_CR(Register tmp) {
+  restore_LR(tmp);
   ld(tmp, _abi0(cr), R1_SP);
   mtcr(tmp);
 }
@@ -2122,6 +2130,290 @@ void MacroAssembler::check_klass_subtype(Register sub_klass,
   bind(L_failure); // Fallthru if not successful.
 }
 
+// scans count pointer sized words at [addr] for occurrence of value,
+// generic (count must be >0)
+// iff found: CR0 eq, scratch == 0
+void MacroAssembler::repne_scan(Register addr, Register value, Register count, Register scratch) {
+  Label Lloop, Lexit;
+
+#ifdef ASSERT
+  {
+    Label ok;
+    cmpdi(CCR0, count, 0);
+    bgt(CCR0, ok);
+    stop("count must be positive");
+    bind(ok);
+  }
+#endif
+
+  mtctr(count);
+
+  bind(Lloop);
+  ld(scratch, 0 , addr);
+  xor_(scratch, scratch, value);
+  beq(CCR0, Lexit);
+  addi(addr, addr, wordSize);
+  bdnz(Lloop);
+
+  bind(Lexit);
+}
+
+// Ensure that the inline code and the stub are using the same registers.
+#define LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS                       \
+do {                                                                  \
+  assert(r_super_klass  == R4_ARG2                                 && \
+         r_array_base   == R3_ARG1                                 && \
+         r_array_length == R7_ARG5                                 && \
+         (r_array_index == R6_ARG4      || r_array_index == noreg) && \
+         (r_sub_klass   == R5_ARG3      || r_sub_klass   == noreg) && \
+         (r_bitmap      == R11_scratch1 || r_bitmap      == noreg) && \
+         (result        == R8_ARG6      || result        == noreg), "registers must match ppc64.ad"); \
+} while(0)
+
+// Return true: we succeeded in generating this code
+void MacroAssembler::lookup_secondary_supers_table(Register r_sub_klass,
+                                                   Register r_super_klass,
+                                                   Register temp1,
+                                                   Register temp2,
+                                                   Register temp3,
+                                                   Register temp4,
+                                                   Register result,
+                                                   u1 super_klass_slot) {
+  assert_different_registers(r_sub_klass, r_super_klass, temp1, temp2, temp3, temp4, result);
+
+  Label L_done;
+
+  BLOCK_COMMENT("lookup_secondary_supers_table {");
+
+  const Register
+    r_array_base   = temp1,
+    r_array_length = temp2,
+    r_array_index  = temp3,
+    r_bitmap       = temp4;
+
+  LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS;
+
+  ld(r_bitmap, in_bytes(Klass::bitmap_offset()), r_sub_klass);
+
+  // First check the bitmap to see if super_klass might be present. If
+  // the bit is zero, we are certain that super_klass is not one of
+  // the secondary supers.
+  u1 bit = super_klass_slot;
+  int shift_count = Klass::SECONDARY_SUPERS_TABLE_MASK - bit;
+
+  // if (shift_count == 0) this is used for comparing with 0:
+  sldi_(r_array_index, r_bitmap, shift_count);
+
+  li(result, 1); // failure
+  // We test the MSB of r_array_index, i.e. its sign bit
+  bge(CCR0, L_done);
+
+  // We will consult the secondary-super array.
+  ld(r_array_base, in_bytes(Klass::secondary_supers_offset()), r_sub_klass);
+
+  // The value i in r_array_index is >= 1, so even though r_array_base
+  // points to the length, we don't need to adjust it to point to the
+  // data.
+  assert(Array<Klass*>::base_offset_in_bytes() == wordSize, "Adjust this code");
+
+  // Get the first array index that can contain super_klass.
+  if (bit != 0) {
+    popcntd(r_array_index, r_array_index);
+    // NB! r_array_index is off by 1. It is compensated by keeping r_array_base off by 1 word.
+    sldi(r_array_index, r_array_index, LogBytesPerWord); // scale
+    ldx(result, r_array_base, r_array_index);
+  } else {
+    // Actually use index 0, but r_array_base and r_array_index are off by 1 word
+    // such that the sum is precise.
+    ld(result, BytesPerWord, r_array_base);
+    li(r_array_index, BytesPerWord); // for slow path (scaled)
+  }
+
+  xor_(result, result, r_super_klass);
+  beq(CCR0, L_done); // Found a match (result == 0)
+
+  // Is there another entry to check? Consult the bitmap.
+  testbitdi(CCR0, /* temp */ r_array_length, r_bitmap, (bit + 1) & Klass::SECONDARY_SUPERS_TABLE_MASK);
+  beq(CCR0, L_done); // (result != 0)
+
+  // Linear probe. Rotate the bitmap so that the next bit to test is
+  // in Bit 2 for the look-ahead check in the slow path.
+  if (bit != 0) {
+    rldicl(r_bitmap, r_bitmap, 64 - bit, 0);
+  }
+
+  // Calls into the stub generated by lookup_secondary_supers_table_slow_path.
+  // Arguments: r_super_klass, r_array_base, r_array_index, r_bitmap.
+  // Kills: r_array_length.
+  // Returns: result.
+  address stub = StubRoutines::lookup_secondary_supers_table_slow_path_stub();
+  Register r_stub_addr = r_array_length;
+  add_const_optimized(r_stub_addr, R29_TOC, MacroAssembler::offset_to_global_toc(stub), R0);
+  mtctr(r_stub_addr);
+  bctrl();
+
+  bind(L_done);
+  BLOCK_COMMENT("} lookup_secondary_supers_table");
+
+  if (VerifySecondarySupers) {
+    verify_secondary_supers_table(r_sub_klass, r_super_klass, result,
+                                  temp1, temp2, temp3);
+  }
+}
+
+// Called by code generated by check_klass_subtype_slow_path
+// above. This is called when there is a collision in the hashed
+// lookup in the secondary supers array.
+void MacroAssembler::lookup_secondary_supers_table_slow_path(Register r_super_klass,
+                                                             Register r_array_base,
+                                                             Register r_array_index,
+                                                             Register r_bitmap,
+                                                             Register result,
+                                                             Register temp1) {
+  assert_different_registers(r_super_klass, r_array_base, r_array_index, r_bitmap, result, temp1);
+
+  const Register
+    r_array_length = temp1,
+    r_sub_klass    = noreg;
+
+  LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS;
+
+  Label L_done;
+
+  // Load the array length.
+  lwa(r_array_length, Array<Klass*>::length_offset_in_bytes(), r_array_base);
+  // And adjust the array base to point to the data.
+  // NB! Effectively increments current slot index by 1.
+  assert(Array<Klass*>::base_offset_in_bytes() == wordSize, "");
+  addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes());
+
+  // Linear probe
+  Label L_huge;
+
+  // The bitmap is full to bursting.
+  // Implicit invariant: BITMAP_FULL implies (length > 0)
+  assert(Klass::SECONDARY_SUPERS_BITMAP_FULL == ~uintx(0), "");
+  cmpdi(CCR0, r_bitmap, -1);
+  beq(CCR0, L_huge);
+
+  // NB! Our caller has checked bits 0 and 1 in the bitmap. The
+  // current slot (at secondary_supers[r_array_index]) has not yet
+  // been inspected, and r_array_index may be out of bounds if we
+  // wrapped around the end of the array.
+
+  { // This is conventional linear probing, but instead of terminating
+    // when a null entry is found in the table, we maintain a bitmap
+    // in which a 0 indicates missing entries.
+    // The check above guarantees there are 0s in the bitmap, so the loop
+    // eventually terminates.
+
+#ifdef ASSERT
+    {
+      // We should only reach here after having found a bit in the bitmap.
+      // Invariant: array_length == popcount(bitmap)
+      Label ok;
+      cmpdi(CCR0, r_array_length, 0);
+      bgt(CCR0, ok);
+      stop("array_length must be positive");
+      bind(ok);
+    }
+#endif
+
+    // Compute limit in r_array_length
+    addi(r_array_length, r_array_length, -1);
+    sldi(r_array_length, r_array_length, LogBytesPerWord);
+
+    Label L_loop;
+    bind(L_loop);
+
+    // Check for wraparound.
+    cmpd(CCR0, r_array_index, r_array_length);
+    isel_0(r_array_index, CCR0, Assembler::greater);
+
+    ldx(result, r_array_base, r_array_index);
+    xor_(result, result, r_super_klass);
+    beq(CCR0, L_done); // success (result == 0)
+
+    // look-ahead check (Bit 2); result is non-zero
+    testbitdi(CCR0, R0, r_bitmap, 2);
+    beq(CCR0, L_done); // fail (result != 0)
+
+    rldicl(r_bitmap, r_bitmap, 64 - 1, 0);
+    addi(r_array_index, r_array_index, BytesPerWord);
+    b(L_loop);
+  }
+
+  { // Degenerate case: more than 64 secondary supers.
+    // FIXME: We could do something smarter here, maybe a vectorized
+    // comparison or a binary search, but is that worth any added
+    // complexity?
+    bind(L_huge);
+    repne_scan(r_array_base, r_super_klass, r_array_length, result);
+  }
+
+  bind(L_done);
+}
+
+// Make sure that the hashed lookup and a linear scan agree.
+void MacroAssembler::verify_secondary_supers_table(Register r_sub_klass,
+                                                   Register r_super_klass,
+                                                   Register result,
+                                                   Register temp1,
+                                                   Register temp2,
+                                                   Register temp3) {
+  assert_different_registers(r_sub_klass, r_super_klass, result, temp1, temp2, temp3);
+
+  const Register
+    r_array_base   = temp1,
+    r_array_length = temp2,
+    r_array_index  = temp3,
+    r_bitmap       = noreg; // unused
+
+  LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS;
+
+  BLOCK_COMMENT("verify_secondary_supers_table {");
+
+  Label passed, failure;
+
+  // We will consult the secondary-super array.
+  ld(r_array_base, in_bytes(Klass::secondary_supers_offset()), r_sub_klass);
+  // Load the array length.
+  lwa(r_array_length, Array<Klass*>::length_offset_in_bytes(), r_array_base);
+  // And adjust the array base to point to the data.
+  addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes());
+
+  // convert !=0 to 1
+  normalize_bool(result, R0, true);
+  const Register linear_result = r_array_index; // reuse
+  li(linear_result, 1);
+  cmpdi(CCR0, r_array_length, 0);
+  ble(CCR0, failure);
+  repne_scan(r_array_base, r_super_klass, r_array_length, linear_result);
+  bind(failure);
+
+  // convert !=0 to 1
+  normalize_bool(linear_result, R0, true);
+
+  cmpd(CCR0, result, linear_result);
+  beq(CCR0, passed);
+
+  assert_different_registers(R3_ARG1, r_sub_klass, linear_result, result);
+  mr_if_needed(R3_ARG1, r_super_klass);
+  assert_different_registers(R4_ARG2, linear_result, result);
+  mr_if_needed(R4_ARG2, r_sub_klass);
+  assert_different_registers(R5_ARG3, result);
+  neg(R5_ARG3, linear_result);
+  neg(R6_ARG4, result);
+  const char* msg = "mismatch";
+  load_const_optimized(R7_ARG5, (intptr_t)msg, R0);
+  call_VM_leaf(CAST_FROM_FN_PTR(address, Klass::on_secondary_supers_verification_failure));
+  should_not_reach_here();
+
+  bind(passed);
+
+  BLOCK_COMMENT("} verify_secondary_supers_table");
+}
+
 void MacroAssembler::clinit_barrier(Register klass, Register thread, Label* L_fast_path, Label* L_slow_path) {
   assert(L_fast_path != nullptr || L_slow_path != nullptr, "at least one is required");
 
diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp
index c92f8564376..15b5e26f8f6 100644
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp
+++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -178,6 +178,8 @@ class MacroAssembler: public Assembler {
   void inline set_cmp3(Register dst);
   // set dst to (treat_unordered_like_less ? -1 : +1)
   void inline set_cmpu3(Register dst, bool treat_unordered_like_less);
+  // Branch-free implementation to convert !=0 to 1.
+  void inline normalize_bool(Register dst, Register temp = R0, bool is_64bit = false);
 
   inline void pd_patch_instruction(address branch, address target, const char* file, int line);
   NOT_PRODUCT(static void pd_print_patched_instruction(address branch);)
@@ -298,7 +300,9 @@ class MacroAssembler: public Assembler {
                              bool include_fp_regs = true, bool include_R3_RET_reg = true);
   void restore_volatile_gprs(Register src_base, int offset,
                              bool include_fp_regs = true, bool include_R3_RET_reg = true);
-  void save_LR_CR(   Register tmp);     // tmp contains LR on return.
+  void save_LR(Register tmp);
+  void restore_LR(Register tmp);
+  void save_LR_CR(Register tmp);     // tmp contains LR on return.
   void restore_LR_CR(Register tmp);
 
   // Get current PC using bl-next-instruction trick.
@@ -602,6 +606,33 @@ class MacroAssembler: public Assembler {
                            Register temp2_reg,
                            Label& L_success);
 
+  void repne_scan(Register addr, Register value, Register count, Register scratch);
+
+  // As above, but with a constant super_klass.
+  // The result is in Register result, not the condition codes.
+  void lookup_secondary_supers_table(Register r_sub_klass,
+                                     Register r_super_klass,
+                                     Register temp1,
+                                     Register temp2,
+                                     Register temp3,
+                                     Register temp4,
+                                     Register result,
+                                     u1 super_klass_slot);
+
+  void verify_secondary_supers_table(Register r_sub_klass,
+                                     Register r_super_klass,
+                                     Register result,
+                                     Register temp1,
+                                     Register temp2,
+                                     Register temp3);
+
+  void lookup_secondary_supers_table_slow_path(Register r_super_klass,
+                                               Register r_array_base,
+                                               Register r_array_index,
+                                               Register r_bitmap,
+                                               Register result,
+                                               Register temp1);
+
   void clinit_barrier(Register klass,
                       Register thread,
                       Label* L_fast_path = nullptr,
diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp
index f81d49684c9..e9c6fd38f45 100644
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp
+++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2021 SAP SE. All rights reserved.
+ * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -264,6 +264,29 @@ inline void MacroAssembler::set_cmpu3(Register dst, bool treat_unordered_like_le
   set_cmp3(dst);
 }
 
+// Branch-free implementation to convert !=0 to 1
+// Set register dst to 1 if dst is non-zero. Uses setbcr instruction on Power10.
+inline void MacroAssembler::normalize_bool(Register dst, Register temp, bool is_64bit) {
+
+  if (VM_Version::has_brw()) {
+    if (is_64bit) {
+      cmpdi(CCR0, dst, 0);
+    } else {
+      cmpwi(CCR0, dst, 0);
+    }
+    setbcr(dst, CCR0, Assembler::equal);
+  } else {
+    assert_different_registers(temp, dst);
+    neg(temp, dst);
+    orr(temp, dst, temp);
+    if (is_64bit) {
+      srdi(dst, temp, 63);
+    } else {
+      srwi(dst, temp, 31);
+    }
+  }
+}
+
 // Convenience bc_far versions
 inline void MacroAssembler::blt_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs1, bi0(crx, less), L, optimize); }
 inline void MacroAssembler::bgt_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs1, bi0(crx, greater), L, optimize); }
diff --git a/src/hotspot/cpu/ppc/methodHandles_ppc.cpp b/src/hotspot/cpu/ppc/methodHandles_ppc.cpp
index 1ac9a35b6ba..6e5ac325e50 100644
--- a/src/hotspot/cpu/ppc/methodHandles_ppc.cpp
+++ b/src/hotspot/cpu/ppc/methodHandles_ppc.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -581,7 +581,7 @@ void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adapt
   const Register tmp = R11; // Will be preserved.
   const int nbytes_save = MacroAssembler::num_volatile_regs * 8;
   __ save_volatile_gprs(R1_SP, -nbytes_save); // except R0
-  __ save_LR_CR(tmp); // save in old frame
+  __ save_LR(tmp); // save in old frame
 
   __ mr(R5_ARG3, R1_SP);     // saved_sp
   __ push_frame_reg_args(nbytes_save, tmp);
@@ -592,7 +592,7 @@ void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adapt
   __ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub));
 
   __ pop_frame();
-  __ restore_LR_CR(tmp);
+  __ restore_LR(tmp);
   __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
 
   BLOCK_COMMENT("} trace_method_handle");
diff --git a/src/hotspot/cpu/ppc/nativeInst_ppc.hpp b/src/hotspot/cpu/ppc/nativeInst_ppc.hpp
index 113cedfee7c..f21d76f8a67 100644
--- a/src/hotspot/cpu/ppc/nativeInst_ppc.hpp
+++ b/src/hotspot/cpu/ppc/nativeInst_ppc.hpp
@@ -137,6 +137,8 @@ class NativeCall: public NativeInstruction {
     instruction_size                            = 16 // Used in shared code for calls with reloc_info.
   };
 
+  static int byte_size() { return instruction_size; }
+
   static bool is_call_at(address a) {
     return Assembler::is_bl(*(int*)(a));
   }
diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad
index cbe28deb516..38485da9581 100644
--- a/src/hotspot/cpu/ppc/ppc.ad
+++ b/src/hotspot/cpu/ppc/ppc.ad
@@ -641,6 +641,8 @@ reg_class rarg1_bits64_reg(R3_H, R3);
 reg_class rarg2_bits64_reg(R4_H, R4);
 reg_class rarg3_bits64_reg(R5_H, R5);
 reg_class rarg4_bits64_reg(R6_H, R6);
+reg_class rarg5_bits64_reg(R7_H, R7);
+reg_class rarg6_bits64_reg(R8_H, R8);
 // Thread register, 'written' by tlsLoadP, see there.
 reg_class thread_bits64_reg(R16_H, R16);
 
@@ -3427,9 +3429,11 @@ encode %{
     call->_oop_map           = _oop_map;
     call->_jvms              = _jvms;
     call->_jvmadj            = _jvmadj;
+    call->_has_ea_local_in_scope = _has_ea_local_in_scope;
     call->_in_rms            = _in_rms;
     call->_nesting           = _nesting;
     call->_override_symbolic_info = _override_symbolic_info;
+    call->_arg_escape        = _arg_escape;
 
     // New call needs all inputs of old call.
     // Req...
@@ -4353,6 +4357,8 @@ operand iRegPsrc() %{
   match(rarg2RegP);
   match(rarg3RegP);
   match(rarg4RegP);
+  match(rarg5RegP);
+  match(rarg6RegP);
   match(threadRegP);
   format %{ %}
   interface(REG_INTER);
@@ -4408,6 +4414,20 @@ operand rarg4RegP() %{
   interface(REG_INTER);
 %}
 
+operand rarg5RegP() %{
+  constraint(ALLOC_IN_RC(rarg5_bits64_reg));
+  match(iRegPdst);
+  format %{ %}
+  interface(REG_INTER);
+%}
+
+operand rarg6RegP() %{
+  constraint(ALLOC_IN_RC(rarg6_bits64_reg));
+  match(iRegPdst);
+  format %{ %}
+  interface(REG_INTER);
+%}
+
 operand iRegNsrc() %{
   constraint(ALLOC_IN_RC(bits32_reg_ro));
   match(RegN);
@@ -12023,6 +12043,35 @@ instruct partialSubtypeCheck(iRegPdst result, iRegP_N2P subklass, iRegP_N2P supe
   ins_pipe(pipe_class_default);
 %}
 
+instruct partialSubtypeCheckConstSuper(rarg3RegP sub, rarg2RegP super_reg, immP super_con, rarg6RegP result,
+                                       rarg1RegP tempR1, rarg5RegP tempR2, rarg4RegP tempR3, rscratch1RegP tempR4,
+                                       flagsRegCR0 cr0, regCTR ctr)
+%{
+  match(Set result (PartialSubtypeCheck sub (Binary super_reg super_con)));
+  predicate(UseSecondarySupersTable);
+  effect(KILL cr0, KILL ctr, TEMP tempR1, TEMP tempR2, TEMP tempR3, TEMP tempR4);
+
+  ins_cost(DEFAULT_COST*8);  // smaller than the other version
+  format %{ "partialSubtypeCheck $result, $sub, $super_reg" %}
+
+  ins_encode %{
+    u1 super_klass_slot = ((Klass*)$super_con$$constant)->hash_slot();
+    if (InlineSecondarySupersTest) {
+      __ lookup_secondary_supers_table($sub$$Register, $super_reg$$Register,
+                                       $tempR1$$Register, $tempR2$$Register, $tempR3$$Register, $tempR4$$Register,
+                                       $result$$Register, super_klass_slot);
+    } else {
+      address stub = StubRoutines::lookup_secondary_supers_table_stub(super_klass_slot);
+      Register r_stub_addr = $tempR1$$Register;
+      __ add_const_optimized(r_stub_addr, R29_TOC, MacroAssembler::offset_to_global_toc(stub), R0);
+      __ mtctr(r_stub_addr);
+      __ bctrl();
+    }
+  %}
+
+  ins_pipe(pipe_class_memory);
+%}
+
 // inlined locking and unlocking
 
 instruct cmpFastLock(flagsRegCR0 crx, iRegPdst oop, iRegPdst box, iRegPdst tmp1, iRegPdst tmp2) %{
diff --git a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp
index 12afe49537d..9b5a86bc45b 100644
--- a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp
+++ b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp
@@ -290,9 +290,7 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
   __ std(R30, frame_size_in_bytes - 2*reg_size - vsregstosave_num * vs_reg_size, R1_SP);
 
   // save the flags
-  // Do the save_LR_CR by hand and adjust the return pc if requested.
-  __ mfcr(R30);
-  __ std(R30, frame_size_in_bytes + _abi0(cr), R1_SP);
+  // Do the save_LR by hand and adjust the return pc if requested.
   switch (return_pc_location) {
     case return_pc_is_lr: __ mflr(R31); break;
     case return_pc_is_pre_saved: assert(return_pc_adjustment == 0, "unsupported"); break;
@@ -436,9 +434,6 @@ void RegisterSaver::restore_live_registers_and_pop_frame(MacroAssembler* masm,
   __ ld(R31, frame_size_in_bytes + _abi0(lr), R1_SP);
   __ mtlr(R31);
 
-  __ ld(R31, frame_size_in_bytes + _abi0(cr), R1_SP);
-  __ mtcr(R31);
-
   // restore scratch register's value
   __ ld(R31, frame_size_in_bytes - reg_size - vsregstosave_num * vs_reg_size, R1_SP);
 
@@ -2241,7 +2236,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
     __ bind(L_skip_barrier);
   }
 
-  __ save_LR_CR(r_temp_1);
+  __ save_LR(r_temp_1);
   __ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating frame.
   __ mr(r_callers_sp, R1_SP);                            // Remember frame pointer.
   __ push_frame(frame_size_in_bytes, r_temp_1);          // Push the c2n adapter's frame.
@@ -2477,11 +2472,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
     case T_ARRAY:   break;
 
     case T_BOOLEAN: {             // 0 -> false(0); !0 -> true(1)
-      Label skip_modify;
-      __ cmpwi(CCR0, R3_RET, 0);
-      __ beq(CCR0, skip_modify);
-      __ li(R3_RET, 1);
-      __ bind(skip_modify);
+      __ normalize_bool(R3_RET);
       break;
       }
     case T_BYTE: {                // sign extension
@@ -2694,7 +2685,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
   // --------------------------------------------------------------------------
 
   __ pop_frame();
-  __ restore_LR_CR(R11);
+  __ restore_LR(R11);
   __ blr();
 
 
@@ -2706,7 +2697,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
   __ bind(handle_pending_exception);
 
   __ pop_frame();
-  __ restore_LR_CR(R11);
+  __ restore_LR(R11);
   __ b64_patchable((address)StubRoutines::forward_exception_entry(),
                        relocInfo::runtime_call_type);
 
@@ -3064,7 +3055,7 @@ void SharedRuntime::generate_deopt_blob() {
 
   // Pop the unpack frame.
   __ pop_frame();
-  __ restore_LR_CR(R0);
+  __ restore_LR(R0);
 
   // stack: (top interpreter frame, ..., optional interpreter frame,
   // optional c2i, caller of deoptee, ...).
@@ -3111,7 +3102,7 @@ void SharedRuntime::generate_uncommon_trap_blob() {
   // vframe array and return the `UnrollBlock' information.
 
   // Save LR to compiled frame.
-  __ save_LR_CR(R11_scratch1);
+  __ save_LR(R11_scratch1);
 
   // Push an "uncommon_trap" frame.
   __ push_frame_reg_args(0, R11_scratch1);
@@ -3201,7 +3192,7 @@ void SharedRuntime::generate_uncommon_trap_blob() {
   // Pop the `unpack frame'.
   __ pop_frame();
   // Restore LR from top interpreter frame.
-  __ restore_LR_CR(R11_scratch1);
+  __ restore_LR(R11_scratch1);
 
   // stack: (top interpreter frame, ..., optional interpreter frame,
   // optional c2i, caller of deoptee, ...).
diff --git a/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp b/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp
index ad8b76ba667..8da7cf7e791 100644
--- a/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp
+++ b/src/hotspot/cpu/ppc/stubGenerator_ppc.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2012, 2024 SAP SE. 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
@@ -469,7 +469,7 @@ class StubGenerator: public StubCodeGenerator {
     }
 
     // Save LR/CR and copy exception pc (LR) into R4_ARG2.
-    __ save_LR_CR(R4_ARG2);
+    __ save_LR(R4_ARG2);
     __ push_frame_reg_args(0, R0);
     // Find exception handler.
     __ call_VM_leaf(CAST_FROM_FN_PTR(address,
@@ -479,7 +479,7 @@ class StubGenerator: public StubCodeGenerator {
     // Copy handler's address.
     __ mtctr(R3_RET);
     __ pop_frame();
-    __ restore_LR_CR(R0);
+    __ restore_LR(R0);
 
     // Set up the arguments for the exception handler:
     //  - R3_ARG1: exception oop
@@ -550,7 +550,7 @@ class StubGenerator: public StubCodeGenerator {
 
     address start = __ pc();
 
-    __ save_LR_CR(R11_scratch1);
+    __ save_LR(R11_scratch1);
 
     // Push a frame.
     __ push_frame_reg_args(0, R11_scratch1);
@@ -604,7 +604,7 @@ class StubGenerator: public StubCodeGenerator {
     // Pop frame.
     __ pop_frame();
 
-    __ restore_LR_CR(R11_scratch1);
+    __ restore_LR(R11_scratch1);
 
     __ load_const(R11_scratch1, StubRoutines::forward_exception_entry());
     __ mtctr(R11_scratch1);
@@ -3571,14 +3571,14 @@ class StubGenerator: public StubCodeGenerator {
     // and pass that one instead.
     __ addi(R3_ARG1, R1_SP, _abi0(lr));
 
-    __ save_LR_CR(R0);
+    __ save_LR(R0);
     __ push_frame_reg_args(nbytes_save, R0);
 
     __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSetNMethod::nmethod_stub_entry_barrier));
     __ mr(R0, R3_RET);
 
     __ pop_frame();
-    __ restore_LR_CR(R3_RET /* used as tmp register */);
+    __ restore_LR(R3_RET /* used as tmp register */);
     __ restore_volatile_gprs(R1_SP, -nbytes_save, true);
 
     __ cmpdi(CCR0, R0, 0);
@@ -3597,7 +3597,7 @@ class StubGenerator: public StubCodeGenerator {
     // Restore link register.  Required as the 'wrong method stub' needs the caller's frame
     // to properly deoptimize this method (e.g. by re-resolving the call site for compiled methods).
     // This method's prologue is aborted.
-    __ restore_LR_CR(R0);
+    __ restore_LR(R0);
 
     __ bctr();
     return stub_address;
@@ -4531,6 +4531,46 @@ class StubGenerator: public StubCodeGenerator {
 
 #endif // VM_LITTLE_ENDIAN
 
+address generate_lookup_secondary_supers_table_stub(u1 super_klass_index) {
+    StubCodeMark mark(this, "StubRoutines", "lookup_secondary_supers_table");
+
+    address start = __ pc();
+    const Register
+      r_super_klass  = R4_ARG2,
+      r_array_base   = R3_ARG1,
+      r_array_length = R7_ARG5,
+      r_array_index  = R6_ARG4,
+      r_sub_klass    = R5_ARG3,
+      r_bitmap       = R11_scratch1,
+      result         = R8_ARG6;
+
+    __ lookup_secondary_supers_table(r_sub_klass, r_super_klass,
+                                     r_array_base, r_array_length, r_array_index,
+                                     r_bitmap, result, super_klass_index);
+    __ blr();
+
+    return start;
+  }
+
+  // Slow path implementation for UseSecondarySupersTable.
+  address generate_lookup_secondary_supers_table_slow_path_stub() {
+    StubCodeMark mark(this, "StubRoutines", "lookup_secondary_supers_table_slow_path");
+
+    address start = __ pc();
+    const Register
+      r_super_klass  = R4_ARG2,
+      r_array_base   = R3_ARG1,
+      temp1          = R7_ARG5,
+      r_array_index  = R6_ARG4,
+      r_bitmap       = R11_scratch1,
+      result         = R8_ARG6;
+
+    __ lookup_secondary_supers_table_slow_path(r_super_klass, r_array_base, r_array_index, r_bitmap, result, temp1);
+    __ blr();
+
+    return start;
+  }
+
   address generate_cont_thaw(const char* label, Continuation::thaw_kind kind) {
     if (!Continuations::enabled()) return nullptr;
 
@@ -4807,6 +4847,16 @@ class StubGenerator: public StubCodeGenerator {
     // arraycopy stubs used by compilers
     generate_arraycopy_stubs();
 
+    if (UseSecondarySupersTable) {
+      StubRoutines::_lookup_secondary_supers_table_slow_path_stub = generate_lookup_secondary_supers_table_slow_path_stub();
+      if (!InlineSecondarySupersTest) {
+        for (int slot = 0; slot < Klass::SECONDARY_SUPERS_TABLE_SIZE; slot++) {
+          StubRoutines::_lookup_secondary_supers_table_stubs[slot]
+            = generate_lookup_secondary_supers_table_stub(slot);
+        }
+      }
+    }
+
     StubRoutines::_upcall_stub_exception_handler = generate_upcall_stub_exception_handler();
   }
 
diff --git a/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp b/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp
index db49ca5cf22..4caae200253 100644
--- a/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp
+++ b/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2015, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024 SAP SE. 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
@@ -121,7 +121,7 @@ address TemplateInterpreterGenerator::generate_slow_signature_handler() {
 
   address entry = __ function_entry();
 
-  __ save_LR_CR(R0);
+  __ save_LR(R0);
   __ save_nonvolatile_gprs(R1_SP, _spill_nonvolatiles_neg(r14));
   // We use target_sp for storing arguments in the C frame.
   __ mr(target_sp, R1_SP);
@@ -311,7 +311,7 @@ address TemplateInterpreterGenerator::generate_slow_signature_handler() {
 
   __ pop_frame();
   __ restore_nonvolatile_gprs(R1_SP, _spill_nonvolatiles_neg(r14));
-  __ restore_LR_CR(R0);
+  __ restore_LR(R0);
 
   __ blr();
 
@@ -372,9 +372,7 @@ address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type
   switch (type) {
   case T_BOOLEAN:
     // convert !=0 to 1
-    __ neg(R0, R3_RET);
-    __ orr(R0, R3_RET, R0);
-    __ srwi(R3_RET, R0, 31);
+    __ normalize_bool(R3_RET);
     break;
   case T_BYTE:
      // sign extend 8 bits
@@ -441,7 +439,7 @@ address TemplateInterpreterGenerator::generate_abstract_entry(void) {
   __ set_top_ijava_frame_at_SP_as_last_Java_frame(R1_SP, R12_scratch2/*tmp*/);
 
   // Push a new C frame and save LR.
-  __ save_LR_CR(R0);
+  __ save_LR(R0);
   __ push_frame_reg_args(0, R11_scratch1);
 
   // This is not a leaf but we have a JavaFrameAnchor now and we will
@@ -451,7 +449,7 @@ address TemplateInterpreterGenerator::generate_abstract_entry(void) {
 
   // Pop the C frame and restore LR.
   __ pop_frame();
-  __ restore_LR_CR(R0);
+  __ restore_LR(R0);
 
   // Reset JavaFrameAnchor from call_VM_leaf above.
   __ reset_last_Java_frame();
@@ -1126,14 +1124,14 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M
     //__ call_c_and_return_to_caller(R12_scratch2);
 
     // Push a new C frame and save LR.
-    __ save_LR_CR(R0);
+    __ save_LR(R0);
     __ push_frame_reg_args(0, R11_scratch1);
 
     __ call_VM_leaf(runtime_entry);
 
     // Pop the C frame and restore LR.
     __ pop_frame();
-    __ restore_LR_CR(R0);
+    __ restore_LR(R0);
   }
 
   // Restore caller sp for c2i case (from compiled) and for resized sender frame (from interpreted).
diff --git a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp
index 770b2bfa68f..0ee9348dde8 100644
--- a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp
+++ b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp
@@ -3859,10 +3859,11 @@ void TemplateTable::_new() {
     __ store_klass(RallocatedObject, RinstanceKlass, Rscratch); // klass (last for cms)
 
     // Check and trigger dtrace event.
-    SkipIfEqualZero::skip_to_label_if_equal_zero(_masm, Rscratch, &DTraceAllocProbes, Ldone);
-    __ push(atos);
-    __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)));
-    __ pop(atos);
+    if (DTraceAllocProbes) {
+      __ push(atos);
+      __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)));
+      __ pop(atos);
+    }
 
     __ b(Ldone);
   }
diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.cpp b/src/hotspot/cpu/ppc/vm_version_ppc.cpp
index 5a9d035be60..20578ed3b8b 100644
--- a/src/hotspot/cpu/ppc/vm_version_ppc.cpp
+++ b/src/hotspot/cpu/ppc/vm_version_ppc.cpp
@@ -340,6 +340,13 @@ void VM_Version::initialize() {
     FLAG_SET_DEFAULT(UseSHA, false);
   }
 
+  if (UseSecondarySupersTable && PowerArchitecturePPC64 < 7) {
+    if (!FLAG_IS_DEFAULT(UseSecondarySupersTable)) {
+      warning("UseSecondarySupersTable requires Power7 or later.");
+    }
+    FLAG_SET_DEFAULT(UseSecondarySupersTable, false);
+  }
+
 #ifdef COMPILER2
   if (FLAG_IS_DEFAULT(UseSquareToLenIntrinsic)) {
     UseSquareToLenIntrinsic = true;
diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.hpp b/src/hotspot/cpu/ppc/vm_version_ppc.hpp
index 0efde131277..9d8e4b88ee2 100644
--- a/src/hotspot/cpu/ppc/vm_version_ppc.hpp
+++ b/src/hotspot/cpu/ppc/vm_version_ppc.hpp
@@ -95,6 +95,7 @@ class VM_Version: public Abstract_VM_Version {
   static bool supports_fast_class_init_checks() { return true; }
   constexpr static bool supports_stack_watermark_barrier() { return true; }
   constexpr static bool supports_recursive_lightweight_locking() { return true; }
+  constexpr static bool supports_secondary_supers_table() { return true; }
 
   static bool is_determine_features_test_running() { return _is_determine_features_test_running; }
   // CPU instruction support
diff --git a/src/hotspot/cpu/riscv/assembler_riscv.hpp b/src/hotspot/cpu/riscv/assembler_riscv.hpp
index 616aee82b99..fbb3200f40b 100644
--- a/src/hotspot/cpu/riscv/assembler_riscv.hpp
+++ b/src/hotspot/cpu/riscv/assembler_riscv.hpp
@@ -1828,10 +1828,12 @@ enum Nf {
   // Vector unordered indexed load instructions
   INSN( vluxei8_v, 0b0000111, 0b000, 0b01, 0b0);
   INSN(vluxei32_v, 0b0000111, 0b110, 0b01, 0b0);
+  INSN(vluxei64_v, 0b0000111, 0b111, 0b01, 0b0);
 
   // Vector unordered indexed store instructions
   INSN( vsuxei8_v, 0b0100111, 0b000, 0b01, 0b0);
   INSN(vsuxei32_v, 0b0100111, 0b110, 0b01, 0b0);
+  INSN(vsuxei64_v, 0b0100111, 0b111, 0b01, 0b0);
 
 #undef INSN
 
diff --git a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp
index 9804eee61ff..b2489268611 100644
--- a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp
+++ b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp
@@ -1607,7 +1607,22 @@ void LIR_Assembler::monitor_address(int monitor_no, LIR_Opr dst) {
   __ la(dst->as_register(), frame_map()->address_for_monitor_lock(monitor_no));
 }
 
-void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) { Unimplemented(); }
+void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) {
+  assert(op->crc()->is_single_cpu(),  "crc must be register");
+  assert(op->val()->is_single_cpu(),  "byte value must be register");
+  assert(op->result_opr()->is_single_cpu(), "result must be register");
+  Register crc = op->crc()->as_register();
+  Register val = op->val()->as_register();
+  Register res = op->result_opr()->as_register();
+
+  assert_different_registers(val, crc, res);
+  __ la(res, ExternalAddress(StubRoutines::crc_table_addr()));
+
+  __ notr(crc, crc); // ~crc
+  __ zero_extend(crc, crc, 32);
+  __ update_byte_crc32(crc, val, res);
+  __ notr(res, crc); // ~crc
+}
 
 void LIR_Assembler::check_conflict(ciKlass* exact_klass, intptr_t current_klass,
                                    Register tmp, Label &next, Label &none,
diff --git a/src/hotspot/cpu/riscv/c1_LIRGenerator_riscv.cpp b/src/hotspot/cpu/riscv/c1_LIRGenerator_riscv.cpp
index 8017c0fc802..409e8dc0a0d 100644
--- a/src/hotspot/cpu/riscv/c1_LIRGenerator_riscv.cpp
+++ b/src/hotspot/cpu/riscv/c1_LIRGenerator_riscv.cpp
@@ -781,7 +781,79 @@ void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
 }
 
 void LIRGenerator::do_update_CRC32(Intrinsic* x) {
-  ShouldNotReachHere();
+  assert(UseCRC32Intrinsics, "why are we here?");
+  // Make all state_for calls early since they can emit code
+  LIR_Opr result = rlock_result(x);
+  switch (x->id()) {
+    case vmIntrinsics::_updateCRC32: {
+      LIRItem crc(x->argument_at(0), this);
+      LIRItem val(x->argument_at(1), this);
+      // val is destroyed by update_crc32
+      val.set_destroys_register();
+      crc.load_item();
+      val.load_item();
+      __ update_crc32(crc.result(), val.result(), result);
+      break;
+    }
+    case vmIntrinsics::_updateBytesCRC32:
+    case vmIntrinsics::_updateByteBufferCRC32: {
+      bool is_updateBytes = (x->id() == vmIntrinsics::_updateBytesCRC32);
+
+      LIRItem crc(x->argument_at(0), this);
+      LIRItem buf(x->argument_at(1), this);
+      LIRItem off(x->argument_at(2), this);
+      LIRItem len(x->argument_at(3), this);
+      buf.load_item();
+      off.load_nonconstant();
+
+      LIR_Opr index = off.result();
+      int offset = is_updateBytes ? arrayOopDesc::base_offset_in_bytes(T_BYTE) : 0;
+      if (off.result()->is_constant()) {
+        index = LIR_OprFact::illegalOpr;
+        offset += off.result()->as_jint();
+      }
+      LIR_Opr base_op = buf.result();
+
+      if (index->is_valid()) {
+        LIR_Opr tmp = new_register(T_LONG);
+        __ convert(Bytecodes::_i2l, index, tmp);
+        index = tmp;
+      }
+
+      if (offset) {
+        LIR_Opr tmp = new_pointer_register();
+        __ add(base_op, LIR_OprFact::intConst(offset), tmp);
+        base_op = tmp;
+        offset = 0;
+      }
+
+      LIR_Address* a = new LIR_Address(base_op,
+                                       index,
+                                       offset,
+                                       T_BYTE);
+      BasicTypeList signature(3);
+      signature.append(T_INT);
+      signature.append(T_ADDRESS);
+      signature.append(T_INT);
+      CallingConvention* cc = frame_map()->c_calling_convention(&signature);
+      const LIR_Opr result_reg = result_register_for(x->type());
+
+      LIR_Opr addr = new_pointer_register();
+      __ leal(LIR_OprFact::address(a), addr);
+
+      crc.load_item_force(cc->at(0));
+      __ move(addr, cc->at(1));
+      len.load_item_force(cc->at(2));
+
+      __ call_runtime_leaf(StubRoutines::updateBytesCRC32(), getThreadTemp(), result_reg, cc->args());
+      __ move(result_reg, result);
+
+      break;
+    }
+    default: {
+      ShouldNotReachHere();
+    }
+  }
 }
 
 void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
index 9ce197a44bf..3cb2e52c8cb 100644
--- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
+++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
@@ -1322,7 +1322,7 @@ void C2_MacroAssembler::string_compare(Register str1, Register str2,
 
   BLOCK_COMMENT("string_compare {");
 
-  // Bizzarely, the counts are passed in bytes, regardless of whether they
+  // Bizarrely, the counts are passed in bytes, regardless of whether they
   // are L or U strings, however the result is always in characters.
   if (!str1_isL) {
     sraiw(cnt1, cnt1, 1);
@@ -2326,12 +2326,13 @@ void C2_MacroAssembler::expand_bits_l_v(Register dst, Register src, Register mas
 }
 
 void C2_MacroAssembler::element_compare(Register a1, Register a2, Register result, Register cnt, Register tmp1, Register tmp2,
-                                        VectorRegister vr1, VectorRegister vr2, VectorRegister vrs, bool islatin, Label &DONE) {
+                                        VectorRegister vr1, VectorRegister vr2, VectorRegister vrs, bool islatin, Label &DONE,
+                                        Assembler::LMUL lmul) {
   Label loop;
   Assembler::SEW sew = islatin ? Assembler::e8 : Assembler::e16;
 
   bind(loop);
-  vsetvli(tmp1, cnt, sew, Assembler::m2);
+  vsetvli(tmp1, cnt, sew, lmul);
   vlex_v(vr1, a1, sew);
   vlex_v(vr2, a2, sew);
   vmsne_vv(vrs, vr1, vr2);
@@ -2357,7 +2358,7 @@ void C2_MacroAssembler::string_equals_v(Register a1, Register a2, Register resul
 
   mv(result, false);
 
-  element_compare(a1, a2, result, cnt, tmp1, tmp2, v2, v4, v2, true, DONE);
+  element_compare(a1, a2, result, cnt, tmp1, tmp2, v2, v4, v2, true, DONE, Assembler::m2);
 
   bind(DONE);
   BLOCK_COMMENT("} string_equals_v");
@@ -2410,7 +2411,7 @@ void C2_MacroAssembler::arrays_equals_v(Register a1, Register a2, Register resul
   la(a1, Address(a1, base_offset));
   la(a2, Address(a2, base_offset));
 
-  element_compare(a1, a2, result, cnt1, tmp1, tmp2, v2, v4, v2, elem_size == 1, DONE);
+  element_compare(a1, a2, result, cnt1, tmp1, tmp2, v2, v4, v2, elem_size == 1, DONE, Assembler::m2);
 
   bind(DONE);
 
@@ -2445,8 +2446,18 @@ void C2_MacroAssembler::string_compare_v(Register str1, Register str2, Register
   mv(cnt2, cnt1);
   bind(L);
 
+  // We focus on the optimization of small sized string.
+  // Please check below document for string size distribution statistics.
+  // https://cr.openjdk.org/~shade/density/string-density-report.pdf
   if (str1_isL == str2_isL) { // LL or UU
-    element_compare(str1, str2, zr, cnt2, tmp1, tmp2, v2, v4, v2, encLL, DIFFERENCE);
+    // Below construction of v regs and lmul is based on test on 2 different boards,
+    // vlen == 128 and vlen == 256 respectively.
+    if (!encLL && MaxVectorSize == 16) { // UU
+      element_compare(str1, str2, zr, cnt2, tmp1, tmp2, v4, v8, v4, encLL, DIFFERENCE, Assembler::m4);
+    } else { // UU + MaxVectorSize or LL
+      element_compare(str1, str2, zr, cnt2, tmp1, tmp2, v2, v4, v2, encLL, DIFFERENCE, Assembler::m2);
+    }
+
     j(DONE);
   } else { // LU or UL
     Register strL = encLU ? str1 : str2;
diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp
index 9988b98fa2c..07041fe0850 100644
--- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp
+++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp
@@ -37,7 +37,7 @@
                        Register tmp1, Register tmp2,
                        VectorRegister vr1, VectorRegister vr2,
                        VectorRegister vrs,
-                       bool is_latin, Label& DONE);
+                       bool is_latin, Label& DONE, Assembler::LMUL lmul);
 
   void compress_bits_v(Register dst, Register src, Register mask, bool is_long);
   void expand_bits_v(Register dst, Register src, Register mask, bool is_long);
diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp
index c5f97b60c42..af6d043d1d6 100644
--- a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp
+++ b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp
@@ -1467,8 +1467,7 @@ void InterpreterMacroAssembler::notify_method_entry() {
     bind(L);
   }
 
-  {
-    SkipIfEqual skip(this, &DTraceMethodProbes, false);
+  if (DTraceMethodProbes) {
     get_method(c_rarg1);
     call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
                  xthread, c_rarg1);
@@ -1506,8 +1505,7 @@ void InterpreterMacroAssembler::notify_method_exit(
     pop(state);
   }
 
-  {
-    SkipIfEqual skip(this, &DTraceMethodProbes, false);
+  if (DTraceMethodProbes) {
     push(state);
     get_method(c_rarg1);
     call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit),
diff --git a/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp b/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp
index 35bfbb1df8e..ba3d9c99ace 100644
--- a/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp
+++ b/src/hotspot/cpu/riscv/jvmciCodeInstaller_riscv.cpp
@@ -105,8 +105,9 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& metho
   Unimplemented();
 }
 
-void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
+bool CodeInstaller::pd_relocate(address pc, jint mark) {
   Unimplemented();
+  return false;
 }
 
 // convert JVMCI register indices (as used in oop maps) to HotSpot registers
diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
index 9961ce8e6dd..b3ae5fbcdd0 100644
--- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
+++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
- * Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
+ * Copyright (c) 2020, 2024, Huawei Technologies Co., Ltd. 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
@@ -1428,6 +1428,174 @@ int MacroAssembler::pop_fp(unsigned int bitset, Register stack) {
   return count;
 }
 
+static const int64_t right_32_bits = right_n_bits(32);
+static const int64_t right_8_bits = right_n_bits(8);
+
+/**
+ * Emits code to update CRC-32 with a byte value according to constants in table
+ *
+ * @param [in,out]crc   Register containing the crc.
+ * @param [in]val       Register containing the byte to fold into the CRC.
+ * @param [in]table     Register containing the table of crc constants.
+ *
+ * uint32_t crc;
+ * val = crc_table[(val ^ crc) & 0xFF];
+ * crc = val ^ (crc >> 8);
+ *
+ */
+void MacroAssembler::update_byte_crc32(Register crc, Register val, Register table) {
+  assert_different_registers(crc, val, table);
+
+  xorr(val, val, crc);
+  andi(val, val, right_8_bits);
+  shadd(val, val, table, val, 2);
+  lwu(val, Address(val));
+  srli(crc, crc, 8);
+  xorr(crc, val, crc);
+}
+
+/**
+ * Emits code to update CRC-32 with a 32-bit value according to tables 0 to 3
+ *
+ * @param [in,out]crc   Register containing the crc.
+ * @param [in]v         Register containing the 32-bit to fold into the CRC.
+ * @param [in]table0    Register containing table 0 of crc constants.
+ * @param [in]table1    Register containing table 1 of crc constants.
+ * @param [in]table2    Register containing table 2 of crc constants.
+ * @param [in]table3    Register containing table 3 of crc constants.
+ *
+ * uint32_t crc;
+ *   v = crc ^ v
+ *   crc = table3[v&0xff]^table2[(v>>8)&0xff]^table1[(v>>16)&0xff]^table0[v>>24]
+ *
+ */
+void MacroAssembler::update_word_crc32(Register crc, Register v, Register tmp1, Register tmp2, Register tmp3,
+        Register table0, Register table1, Register table2, Register table3, bool upper) {
+  assert_different_registers(crc, v, tmp1, tmp2, tmp3, table0, table1, table2, table3);
+
+  if (upper)
+    srli(v, v, 32);
+  xorr(v, v, crc);
+
+  andi(tmp1, v, right_8_bits);
+  shadd(tmp1, tmp1, table3, tmp2, 2);
+  lwu(crc, Address(tmp1));
+
+  slli(tmp1, v, 16);
+  slli(tmp3, v, 8);
+
+  srliw(tmp1, tmp1, 24);
+  srliw(tmp3, tmp3, 24);
+
+  shadd(tmp1, tmp1, table2, tmp1, 2);
+  lwu(tmp2, Address(tmp1));
+
+  shadd(tmp3, tmp3, table1, tmp3, 2);
+  xorr(crc, crc, tmp2);
+
+  lwu(tmp2, Address(tmp3));
+  // It is more optimal to use 'srli' instead of 'srliw' for case when it is not necessary to clean upper bits
+  if (upper)
+    srli(tmp1, v, 24);
+  else
+    srliw(tmp1, v, 24);
+
+  // no need to clear bits other than lowest two
+  shadd(tmp1, tmp1, table0, tmp1, 2);
+  xorr(crc, crc, tmp2);
+  lwu(tmp2, Address(tmp1));
+  xorr(crc, crc, tmp2);
+}
+
+/**
+ * @param crc   register containing existing CRC (32-bit)
+ * @param buf   register pointing to input byte buffer (byte*)
+ * @param len   register containing number of bytes
+ * @param table register that will contain address of CRC table
+ * @param tmp   scratch registers
+ */
+void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len,
+        Register table0, Register table1, Register table2, Register table3,
+        Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register tmp6) {
+  assert_different_registers(crc, buf, len, table0, table1, table2, table3, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6);
+  Label L_by16_loop, L_unroll_loop, L_unroll_loop_entry, L_by4, L_by4_loop, L_by1, L_by1_loop, L_exit;
+
+  const int64_t unroll = 16;
+  const int64_t unroll_words = unroll*wordSize;
+  mv(tmp5, right_32_bits);
+  subw(len, len, unroll_words);
+  andn(crc, tmp5, crc);
+
+  const ExternalAddress table_addr = StubRoutines::crc_table_addr();
+  la(table0, table_addr);
+  add(table1, table0, 1*256*sizeof(juint), tmp1);
+  add(table2, table0, 2*256*sizeof(juint), tmp1);
+  add(table3, table2, 1*256*sizeof(juint), tmp1);
+
+  bge(len, zr, L_unroll_loop_entry);
+  addiw(len, len, unroll_words-4);
+  bge(len, zr, L_by4_loop);
+  addiw(len, len, 4);
+  bgt(len, zr, L_by1_loop);
+  j(L_exit);
+
+  align(CodeEntryAlignment);
+  bind(L_unroll_loop_entry);
+    const Register buf_end = tmp3;
+    add(buf_end, buf, len); // buf_end will be used as endpoint for loop below
+    andi(len, len, unroll_words-1); // len = (len % unroll_words)
+    sub(len, len, unroll_words); // Length after all iterations
+  bind(L_unroll_loop);
+    for (int i = 0; i < unroll; i++) {
+      ld(tmp1, Address(buf, i*wordSize));
+      update_word_crc32(crc, tmp1, tmp2, tmp4, tmp6, table0, table1, table2, table3, false);
+      update_word_crc32(crc, tmp1, tmp2, tmp4, tmp6, table0, table1, table2, table3, true);
+    }
+
+    addi(buf, buf, unroll_words);
+    ble(buf, buf_end, L_unroll_loop);
+    addiw(len, len, unroll_words-4);
+    bge(len, zr, L_by4_loop);
+    addiw(len, len, 4);
+    bgt(len, zr, L_by1_loop);
+    j(L_exit);
+
+  bind(L_by4_loop);
+    lwu(tmp1, Address(buf));
+    update_word_crc32(crc, tmp1, tmp2, tmp4, tmp6, table0, table1, table2, table3, false);
+    subw(len, len, 4);
+    addi(buf, buf, 4);
+    bge(len, zr, L_by4_loop);
+    addiw(len, len, 4);
+    ble(len, zr, L_exit);
+
+  bind(L_by1_loop);
+    subw(len, len, 1);
+    lwu(tmp1, Address(buf));
+    andi(tmp2, tmp1, right_8_bits);
+    update_byte_crc32(crc, tmp2, table0);
+    ble(len, zr, L_exit);
+
+    subw(len, len, 1);
+    srli(tmp2, tmp1, 8);
+    andi(tmp2, tmp2, right_8_bits);
+    update_byte_crc32(crc, tmp2, table0);
+    ble(len, zr, L_exit);
+
+    subw(len, len, 1);
+    srli(tmp2, tmp1, 16);
+    andi(tmp2, tmp2, right_8_bits);
+    update_byte_crc32(crc, tmp2, table0);
+    ble(len, zr, L_exit);
+
+    srli(tmp2, tmp1, 24);
+    andi(tmp2, tmp2, right_8_bits);
+    update_byte_crc32(crc, tmp2, table0);
+
+  bind(L_exit);
+    andn(crc, tmp5, crc);
+}
+
 #ifdef COMPILER2
 // Push vector registers in the bitset supplied.
 // Return the number of words pushed
@@ -2495,6 +2663,51 @@ void MacroAssembler::encode_heap_oop(Register d, Register s) {
   }
 }
 
+void MacroAssembler::encode_heap_oop_not_null(Register r) {
+#ifdef ASSERT
+  if (CheckCompressedOops) {
+    Label ok;
+    bnez(r, ok);
+    stop("null oop passed to encode_heap_oop_not_null");
+    bind(ok);
+  }
+#endif
+  verify_oop_msg(r, "broken oop in encode_heap_oop_not_null");
+  if (CompressedOops::base() != nullptr) {
+    sub(r, r, xheapbase);
+  }
+  if (CompressedOops::shift() != 0) {
+    assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
+    srli(r, r, LogMinObjAlignmentInBytes);
+  }
+}
+
+void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) {
+#ifdef ASSERT
+  if (CheckCompressedOops) {
+    Label ok;
+    bnez(src, ok);
+    stop("null oop passed to encode_heap_oop_not_null2");
+    bind(ok);
+  }
+#endif
+  verify_oop_msg(src, "broken oop in encode_heap_oop_not_null2");
+
+  Register data = src;
+  if (CompressedOops::base() != nullptr) {
+    sub(dst, src, xheapbase);
+    data = dst;
+  }
+  if (CompressedOops::shift() != 0) {
+    assert(LogMinObjAlignmentInBytes == CompressedOops::shift(), "decode alg wrong");
+    srli(dst, data, LogMinObjAlignmentInBytes);
+    data = dst;
+  }
+  if (data == src) {
+    mv(dst, src);
+  }
+}
+
 void MacroAssembler::load_klass(Register dst, Register src, Register tmp) {
   assert_different_registers(dst, tmp);
   assert_different_registers(src, tmp);
@@ -3611,6 +3824,278 @@ void MacroAssembler::check_klass_subtype_slow_path(Register sub_klass,
   bind(L_fallthrough);
 }
 
+// population_count variant for running without the CPOP
+// instruction, which was introduced with Zbb extension.
+void MacroAssembler::population_count(Register dst, Register src,
+                                      Register tmp1, Register tmp2) {
+  if (UsePopCountInstruction) {
+    cpop(dst, src);
+  } else {
+    assert_different_registers(src, tmp1, tmp2);
+    assert_different_registers(dst, tmp1, tmp2);
+    Label loop, done;
+
+    mv(tmp1, src);
+    // dst = 0;
+    // while(tmp1 != 0) {
+    //   dst++;
+    //   tmp1 &= (tmp1 - 1);
+    // }
+    mv(dst, zr);
+    beqz(tmp1, done);
+    {
+      bind(loop);
+      addi(dst, dst, 1);
+      addi(tmp2, tmp1, -1);
+      andr(tmp1, tmp1, tmp2);
+      bnez(tmp1, loop);
+    }
+    bind(done);
+  }
+}
+
+// Ensure that the inline code and the stub are using the same registers
+// as we need to call the stub from inline code when there is a collision
+// in the hashed lookup in the secondary supers array.
+#define LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS(r_super_klass, r_array_base, r_array_length,  \
+                                                r_array_index, r_sub_klass, result, r_bitmap) \
+do {                                                                                          \
+  assert(r_super_klass  == x10                             &&                                 \
+         r_array_base   == x11                             &&                                 \
+         r_array_length == x12                             &&                                 \
+         (r_array_index == x13  || r_array_index == noreg) &&                                 \
+         (r_sub_klass   == x14  || r_sub_klass   == noreg) &&                                 \
+         (result        == x15  || result        == noreg) &&                                 \
+         (r_bitmap      == x16  || r_bitmap      == noreg), "registers must match riscv.ad"); \
+} while(0)
+
+// Return true: we succeeded in generating this code
+bool MacroAssembler::lookup_secondary_supers_table(Register r_sub_klass,
+                                                   Register r_super_klass,
+                                                   Register result,
+                                                   Register tmp1,
+                                                   Register tmp2,
+                                                   Register tmp3,
+                                                   Register tmp4,
+                                                   u1 super_klass_slot,
+                                                   bool stub_is_near) {
+  assert_different_registers(r_sub_klass, r_super_klass, result, tmp1, tmp2, tmp3, tmp4, t0);
+
+  Label L_fallthrough;
+
+  BLOCK_COMMENT("lookup_secondary_supers_table {");
+
+  const Register
+    r_array_base   = tmp1, // x11
+    r_array_length = tmp2, // x12
+    r_array_index  = tmp3, // x13
+    r_bitmap       = tmp4; // x16
+
+  LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS(r_super_klass, r_array_base, r_array_length,
+                                          r_array_index, r_sub_klass, result, r_bitmap);
+
+  u1 bit = super_klass_slot;
+
+  // Initialize result value to 1 which means mismatch.
+  mv(result, 1);
+
+  ld(r_bitmap, Address(r_sub_klass, Klass::bitmap_offset()));
+
+  // First check the bitmap to see if super_klass might be present. If
+  // the bit is zero, we are certain that super_klass is not one of
+  // the secondary supers.
+  test_bit(t0, r_bitmap, bit);
+  beqz(t0, L_fallthrough);
+
+  // Get the first array index that can contain super_klass into r_array_index.
+  if (bit != 0) {
+    slli(r_array_index, r_bitmap, (Klass::SECONDARY_SUPERS_TABLE_MASK - bit));
+    population_count(r_array_index, r_array_index, tmp1, tmp2);
+  } else {
+    mv(r_array_index, (u1)1);
+  }
+
+  // We will consult the secondary-super array.
+  ld(r_array_base, Address(r_sub_klass, in_bytes(Klass::secondary_supers_offset())));
+
+  // The value i in r_array_index is >= 1, so even though r_array_base
+  // points to the length, we don't need to adjust it to point to the data.
+  assert(Array<Klass*>::base_offset_in_bytes() == wordSize, "Adjust this code");
+  assert(Array<Klass*>::length_offset_in_bytes() == 0, "Adjust this code");
+
+  shadd(result, r_array_index, r_array_base, result, LogBytesPerWord);
+  ld(result, Address(result));
+  xorr(result, result, r_super_klass);
+  beqz(result, L_fallthrough); // Found a match
+
+  // Is there another entry to check? Consult the bitmap.
+  test_bit(t0, r_bitmap, (bit + 1) & Klass::SECONDARY_SUPERS_TABLE_MASK);
+  beqz(t0, L_fallthrough);
+
+  // Linear probe.
+  if (bit != 0) {
+    ror_imm(r_bitmap, r_bitmap, bit);
+  }
+
+  // The slot we just inspected is at secondary_supers[r_array_index - 1].
+  // The next slot to be inspected, by the stub we're about to call,
+  // is secondary_supers[r_array_index]. Bits 0 and 1 in the bitmap
+  // have been checked.
+  Address stub = RuntimeAddress(StubRoutines::lookup_secondary_supers_table_slow_path_stub());
+  if (stub_is_near) {
+    jump_link(stub, t0);
+  } else {
+    address call = trampoline_call(stub);
+    if (call == nullptr) {
+      return false; // trampoline allocation failed
+    }
+  }
+
+  BLOCK_COMMENT("} lookup_secondary_supers_table");
+
+  bind(L_fallthrough);
+
+  if (VerifySecondarySupers) {
+    verify_secondary_supers_table(r_sub_klass, r_super_klass, // x14, x10
+                                  result, tmp1, tmp2, tmp3);  // x15, x11, x12, x13
+  }
+  return true;
+}
+
+// Called by code generated by check_klass_subtype_slow_path
+// above. This is called when there is a collision in the hashed
+// lookup in the secondary supers array.
+void MacroAssembler::lookup_secondary_supers_table_slow_path(Register r_super_klass,
+                                                             Register r_array_base,
+                                                             Register r_array_index,
+                                                             Register r_bitmap,
+                                                             Register result,
+                                                             Register tmp1) {
+  assert_different_registers(r_super_klass, r_array_base, r_array_index, r_bitmap, tmp1, result, t0);
+
+  const Register
+    r_array_length = tmp1,
+    r_sub_klass    = noreg; // unused
+
+  LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS(r_super_klass, r_array_base, r_array_length,
+                                          r_array_index, r_sub_klass, result, r_bitmap);
+
+  Label L_matched, L_fallthrough, L_bitmap_full;
+
+  // Initialize result value to 1 which means mismatch.
+  mv(result, 1);
+
+  // Load the array length.
+  lwu(r_array_length, Address(r_array_base, Array<Klass*>::length_offset_in_bytes()));
+  // And adjust the array base to point to the data.
+  // NB! Effectively increments current slot index by 1.
+  assert(Array<Klass*>::base_offset_in_bytes() == wordSize, "");
+  addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes());
+
+  // Check if bitmap is SECONDARY_SUPERS_BITMAP_FULL
+  assert(Klass::SECONDARY_SUPERS_BITMAP_FULL == ~uintx(0), "Adjust this code");
+  addi(t0, r_bitmap, (u1)1);
+  beqz(t0, L_bitmap_full);
+
+  // NB! Our caller has checked bits 0 and 1 in the bitmap. The
+  // current slot (at secondary_supers[r_array_index]) has not yet
+  // been inspected, and r_array_index may be out of bounds if we
+  // wrapped around the end of the array.
+
+  { // This is conventional linear probing, but instead of terminating
+    // when a null entry is found in the table, we maintain a bitmap
+    // in which a 0 indicates missing entries.
+    // The check above guarantees there are 0s in the bitmap, so the loop
+    // eventually terminates.
+    Label L_loop;
+    bind(L_loop);
+
+    // Check for wraparound.
+    Label skip;
+    blt(r_array_index, r_array_length, skip);
+    mv(r_array_index, zr);
+    bind(skip);
+
+    shadd(t0, r_array_index, r_array_base, t0, LogBytesPerWord);
+    ld(t0, Address(t0));
+    beq(t0, r_super_klass, L_matched);
+
+    test_bit(t0, r_bitmap, 2);  // look-ahead check (Bit 2); result is non-zero
+    beqz(t0, L_fallthrough);
+
+    ror_imm(r_bitmap, r_bitmap, 1);
+    addi(r_array_index, r_array_index, 1);
+    j(L_loop);
+  }
+
+  { // Degenerate case: more than 64 secondary supers.
+    // FIXME: We could do something smarter here, maybe a vectorized
+    // comparison or a binary search, but is that worth any added
+    // complexity?
+    bind(L_bitmap_full);
+    repne_scan(r_array_base, r_super_klass, r_array_length, t0);
+    bne(r_super_klass, t0, L_fallthrough);
+  }
+
+  bind(L_matched);
+  mv(result, zr);
+
+  bind(L_fallthrough);
+}
+
+// Make sure that the hashed lookup and a linear scan agree.
+void MacroAssembler::verify_secondary_supers_table(Register r_sub_klass,
+                                                   Register r_super_klass,
+                                                   Register result,
+                                                   Register tmp1,
+                                                   Register tmp2,
+                                                   Register tmp3) {
+  assert_different_registers(r_sub_klass, r_super_klass, tmp1, tmp2, tmp3, result, t0);
+
+  const Register
+    r_array_base   = tmp1,  // X11
+    r_array_length = tmp2,  // X12
+    r_array_index  = noreg, // unused
+    r_bitmap       = noreg; // unused
+
+  LOOKUP_SECONDARY_SUPERS_TABLE_REGISTERS(r_super_klass, r_array_base, r_array_length,
+                                          r_array_index, r_sub_klass, result, r_bitmap);
+
+  BLOCK_COMMENT("verify_secondary_supers_table {");
+
+  // We will consult the secondary-super array.
+  ld(r_array_base, Address(r_sub_klass, in_bytes(Klass::secondary_supers_offset())));
+
+  // Load the array length.
+  lwu(r_array_length, Address(r_array_base, Array<Klass*>::length_offset_in_bytes()));
+  // And adjust the array base to point to the data.
+  addi(r_array_base, r_array_base, Array<Klass*>::base_offset_in_bytes());
+
+  repne_scan(r_array_base, r_super_klass, r_array_length, t0);
+  Label failed;
+  mv(tmp3, 1);
+  bne(r_super_klass, t0, failed);
+  mv(tmp3, zr);
+  bind(failed);
+
+  snez(result, result); // normalize result to 0/1 for comparison
+
+  Label passed;
+  beq(tmp3, result, passed);
+  {
+    mv(x10, r_super_klass);
+    mv(x11, r_sub_klass);
+    mv(x12, tmp3);
+    mv(x13, result);
+    mv(x14, (address)("mismatch"));
+    rt_call(CAST_FROM_FN_PTR(address, Klass::on_secondary_supers_verification_failure));
+    should_not_reach_here();
+  }
+  bind(passed);
+
+  BLOCK_COMMENT("} verify_secondary_supers_table");
+}
+
 // Defines obj, preserves var_size_in_bytes, okay for tmp2 == var_size_in_bytes.
 void MacroAssembler::tlab_allocate(Register obj,
                                    Register var_size_in_bytes,
diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp
index 4e9a41625ad..ea2b9229eab 100644
--- a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp
+++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
- * Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
+ * Copyright (c) 2020, 2024, Huawei Technologies Co., Ltd. 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
@@ -206,6 +206,8 @@ class MacroAssembler: public Assembler {
   void decode_heap_oop_not_null(Register dst, Register src);
   void decode_heap_oop(Register d, Register s);
   void decode_heap_oop(Register r) { decode_heap_oop(r, r); }
+  void encode_heap_oop_not_null(Register r);
+  void encode_heap_oop_not_null(Register dst, Register src);
   void encode_heap_oop(Register d, Register s);
   void encode_heap_oop(Register r) { encode_heap_oop(r, r); };
   void load_heap_oop(Register dst, Address src, Register tmp1,
@@ -322,6 +324,34 @@ class MacroAssembler: public Assembler {
                                      Label* L_success,
                                      Label* L_failure);
 
+  void population_count(Register dst, Register src, Register tmp1, Register tmp2);
+
+  // As above, but with a constant super_klass.
+  // The result is in Register result, not the condition codes.
+  bool lookup_secondary_supers_table(Register r_sub_klass,
+                                     Register r_super_klass,
+                                     Register result,
+                                     Register tmp1,
+                                     Register tmp2,
+                                     Register tmp3,
+                                     Register tmp4,
+                                     u1 super_klass_slot,
+                                     bool stub_is_near = false);
+
+  void verify_secondary_supers_table(Register r_sub_klass,
+                                     Register r_super_klass,
+                                     Register result,
+                                     Register tmp1,
+                                     Register tmp2,
+                                     Register tmp3);
+
+  void lookup_secondary_supers_table_slow_path(Register r_super_klass,
+                                               Register r_array_base,
+                                               Register r_array_index,
+                                               Register r_bitmap,
+                                               Register result,
+                                               Register tmp1);
+
   void check_klass_subtype(Register sub_klass,
                            Register super_klass,
                            Register tmp_reg,
@@ -1260,6 +1290,15 @@ class MacroAssembler: public Assembler {
   void compute_match_mask(Register src, Register pattern, Register match_mask,
                           Register mask1, Register mask2);
 
+  // CRC32 code for java.util.zip.CRC32::updateBytes() intrinsic.
+  void kernel_crc32(Register crc, Register buf, Register len,
+        Register table0, Register table1, Register table2, Register table3,
+        Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register tmp6);
+  void update_word_crc32(Register crc, Register v, Register tmp1, Register tmp2, Register tmp3,
+        Register table0, Register table1, Register table2, Register table3,
+        bool upper);
+  void update_byte_crc32(Register crc, Register val, Register table);
+
 #ifdef COMPILER2
   void mul_add(Register out, Register in, Register offset,
                Register len, Register k, Register tmp);
@@ -1289,6 +1328,7 @@ class MacroAssembler: public Assembler {
                        Register z, Register tmp0,
                        Register tmp1, Register tmp2, Register tmp3, Register tmp4,
                        Register tmp5, Register tmp6, Register product_hi);
+
 #endif
 
   void inflate_lo32(Register Rd, Register Rs, Register tmp1 = t0, Register tmp2 = t1);
diff --git a/src/hotspot/cpu/riscv/nativeInst_riscv.hpp b/src/hotspot/cpu/riscv/nativeInst_riscv.hpp
index e9b3624d9d2..f925f8950aa 100644
--- a/src/hotspot/cpu/riscv/nativeInst_riscv.hpp
+++ b/src/hotspot/cpu/riscv/nativeInst_riscv.hpp
@@ -126,6 +126,7 @@ class NativeCall: public NativeInstruction {
     return_address_offset       =    4
   };
 
+  static int byte_size()                    { return instruction_size; }
   address instruction_address() const       { return addr_at(instruction_offset); }
   address next_instruction_address() const  { return addr_at(return_address_offset); }
   address return_address() const            { return addr_at(return_address_offset); }
diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad
index 54053148758..e2a1fcf621f 100644
--- a/src/hotspot/cpu/riscv/riscv.ad
+++ b/src/hotspot/cpu/riscv/riscv.ad
@@ -1,7 +1,7 @@
 //
 // Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
 // Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
-// Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
+// Copyright (c) 2020, 2024, Huawei Technologies Co., Ltd. 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
@@ -242,7 +242,7 @@ reg_def V0_H  ( SOC, SOC, Op_VecA, 0,  v0->as_VMReg()->next()   );
 reg_def V0_J  ( SOC, SOC, Op_VecA, 0,  v0->as_VMReg()->next(2)  );
 reg_def V0_K  ( SOC, SOC, Op_VecA, 0,  v0->as_VMReg()->next(3)  );
 
-reg_def V1    ( SOC, SOC, Op_VecA, 1,  v1->as_VMReg() 	        );
+reg_def V1    ( SOC, SOC, Op_VecA, 1,  v1->as_VMReg()           );
 reg_def V1_H  ( SOC, SOC, Op_VecA, 1,  v1->as_VMReg()->next()   );
 reg_def V1_J  ( SOC, SOC, Op_VecA, 1,  v1->as_VMReg()->next(2)  );
 reg_def V1_K  ( SOC, SOC, Op_VecA, 1,  v1->as_VMReg()->next(3)  );
@@ -262,7 +262,7 @@ reg_def V4_H  ( SOC, SOC, Op_VecA, 4,  v4->as_VMReg()->next()   );
 reg_def V4_J  ( SOC, SOC, Op_VecA, 4,  v4->as_VMReg()->next(2)  );
 reg_def V4_K  ( SOC, SOC, Op_VecA, 4,  v4->as_VMReg()->next(3)  );
 
-reg_def V5    ( SOC, SOC, Op_VecA, 5,  v5->as_VMReg() 	        );
+reg_def V5    ( SOC, SOC, Op_VecA, 5,  v5->as_VMReg()           );
 reg_def V5_H  ( SOC, SOC, Op_VecA, 5,  v5->as_VMReg()->next()   );
 reg_def V5_J  ( SOC, SOC, Op_VecA, 5,  v5->as_VMReg()->next(2)  );
 reg_def V5_K  ( SOC, SOC, Op_VecA, 5,  v5->as_VMReg()->next(3)  );
@@ -272,7 +272,7 @@ reg_def V6_H  ( SOC, SOC, Op_VecA, 6,  v6->as_VMReg()->next()   );
 reg_def V6_J  ( SOC, SOC, Op_VecA, 6,  v6->as_VMReg()->next(2)  );
 reg_def V6_K  ( SOC, SOC, Op_VecA, 6,  v6->as_VMReg()->next(3)  );
 
-reg_def V7    ( SOC, SOC, Op_VecA, 7,  v7->as_VMReg() 	        );
+reg_def V7    ( SOC, SOC, Op_VecA, 7,  v7->as_VMReg()           );
 reg_def V7_H  ( SOC, SOC, Op_VecA, 7,  v7->as_VMReg()->next()   );
 reg_def V7_J  ( SOC, SOC, Op_VecA, 7,  v7->as_VMReg()->next(2)  );
 reg_def V7_K  ( SOC, SOC, Op_VecA, 7,  v7->as_VMReg()->next(3)  );
@@ -1914,6 +1914,10 @@ bool Matcher::match_rule_supported(int opcode) {
     case Op_PopCountL:
       return UsePopCountInstruction;
 
+    case Op_ReverseBytesI:
+    case Op_ReverseBytesL:
+    case Op_ReverseBytesS:
+    case Op_ReverseBytesUS:
     case Op_RotateRight:
     case Op_RotateLeft:
     case Op_CountLeadingZerosI:
@@ -1921,6 +1925,7 @@ bool Matcher::match_rule_supported(int opcode) {
     case Op_CountTrailingZerosI:
     case Op_CountTrailingZerosL:
       return UseZbb;
+
     case Op_FmaF:
     case Op_FmaD:
     case Op_FmaVF:
@@ -3310,6 +3315,16 @@ operand iRegP_R15()
   interface(REG_INTER);
 %}
 
+operand iRegP_R16()
+%{
+  constraint(ALLOC_IN_RC(r16_reg));
+  match(RegP);
+  match(iRegPNoSp);
+  op_cost(0);
+  format %{ %}
+  interface(REG_INTER);
+%}
+
 // Pointer 64 bit Register R28 only
 operand iRegP_R28()
 %{
@@ -7853,63 +7868,6 @@ instruct xorL_reg_imm(iRegLNoSp dst, iRegL src1, immLAdd src2) %{
   ins_pipe(ialu_reg_imm);
 %}
 
-// ============================================================================
-// BSWAP Instructions
-
-instruct bytes_reverse_int(iRegINoSp dst, iRegIorL2I src, rFlagsReg cr) %{
-  match(Set dst (ReverseBytesI src));
-  effect(KILL cr);
-
-  ins_cost(ALU_COST * 13);
-  format %{ "revb_w_w  $dst, $src\t#@bytes_reverse_int" %}
-
-  ins_encode %{
-    __ revb_w_w(as_Register($dst$$reg), as_Register($src$$reg));
-  %}
-
-  ins_pipe(pipe_class_default);
-%}
-
-instruct bytes_reverse_long(iRegLNoSp dst, iRegL src, rFlagsReg cr) %{
-  match(Set dst (ReverseBytesL src));
-  effect(KILL cr);
-
-  ins_cost(ALU_COST * 29);
-  format %{ "revb  $dst, $src\t#@bytes_reverse_long" %}
-
-  ins_encode %{
-    __ revb(as_Register($dst$$reg), as_Register($src$$reg));
-  %}
-
-  ins_pipe(pipe_class_default);
-%}
-
-instruct bytes_reverse_unsigned_short(iRegINoSp dst, iRegIorL2I src) %{
-  match(Set dst (ReverseBytesUS src));
-
-  ins_cost(ALU_COST * 5);
-  format %{ "revb_h_h_u  $dst, $src\t#@bytes_reverse_unsigned_short" %}
-
-  ins_encode %{
-    __ revb_h_h_u(as_Register($dst$$reg), as_Register($src$$reg));
-  %}
-
-  ins_pipe(pipe_class_default);
-%}
-
-instruct bytes_reverse_short(iRegINoSp dst, iRegIorL2I src) %{
-  match(Set dst (ReverseBytesS src));
-
-  ins_cost(ALU_COST * 5);
-  format %{ "revb_h_h  $dst, $src\t#@bytes_reverse_short" %}
-
-  ins_encode %{
-    __ revb_h_h(as_Register($dst$$reg), as_Register($src$$reg));
-  %}
-
-  ins_pipe(pipe_class_default);
-%}
-
 // ============================================================================
 // MemBar Instruction
 
@@ -8446,6 +8404,7 @@ instruct round_float_reg(iRegINoSp dst, fRegF src, fRegF ftmp) %{
 
 // Convert oop pointer into compressed form
 instruct encodeHeapOop(iRegNNoSp dst, iRegP src) %{
+  predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
   match(Set dst (EncodeP src));
   ins_cost(ALU_COST);
   format %{ "encode_heap_oop  $dst, $src\t#@encodeHeapOop" %}
@@ -8457,6 +8416,17 @@ instruct encodeHeapOop(iRegNNoSp dst, iRegP src) %{
   ins_pipe(pipe_class_default);
 %}
 
+instruct encodeHeapOop_not_null(iRegNNoSp dst, iRegP src) %{
+  predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
+  match(Set dst (EncodeP src));
+  ins_cost(ALU_COST);
+  format %{ "encode_heap_oop_not_null $dst, $src\t#@encodeHeapOop_not_null" %}
+  ins_encode %{
+    __ encode_heap_oop_not_null($dst$$Register, $src$$Register);
+  %}
+  ins_pipe(pipe_class_default);
+%}
+
 instruct decodeHeapOop(iRegPNoSp dst, iRegN src) %{
   predicate(n->bottom_type()->is_ptr()->ptr() != TypePtr::NotNull &&
             n->bottom_type()->is_ptr()->ptr() != TypePtr::Constant);
@@ -10100,7 +10070,7 @@ instruct partialSubtypeCheck(iRegP_R15 result, iRegP_R14 sub, iRegP_R10 super, i
   match(Set result (PartialSubtypeCheck sub super));
   effect(KILL tmp, KILL cr);
 
-  ins_cost(2 * STORE_COST + 3 * LOAD_COST + 4 * ALU_COST + BRANCH_COST * 4);
+  ins_cost(11 * DEFAULT_COST);
   format %{ "partialSubtypeCheck $result, $sub, $super\t#@partialSubtypeCheck" %}
 
   ins_encode(riscv_enc_partial_subtype_check(sub, super, tmp, result));
@@ -10110,13 +10080,43 @@ instruct partialSubtypeCheck(iRegP_R15 result, iRegP_R14 sub, iRegP_R10 super, i
   ins_pipe(pipe_class_memory);
 %}
 
+instruct partialSubtypeCheckConstSuper(iRegP_R14 sub, iRegP_R10 super_reg, immP super_con, iRegP_R15 result,
+                                       iRegP_R11 tmpR11, iRegP_R12 tmpR12, iRegP_R13 tmpR13, iRegP_R16 tmpR16)
+%{
+  predicate(UseSecondarySupersTable);
+  match(Set result (PartialSubtypeCheck sub (Binary super_reg super_con)));
+  effect(TEMP tmpR11, TEMP tmpR12, TEMP tmpR13, TEMP tmpR16);
+
+  ins_cost(7 * DEFAULT_COST); // needs to be less than competing nodes
+  format %{ "partialSubtypeCheck $result, $sub, $super_reg, $super_con" %}
+
+  ins_encode %{
+    bool success = false;
+    u1 super_klass_slot = ((Klass*)$super_con$$constant)->hash_slot();
+    if (InlineSecondarySupersTest) {
+      success = __ lookup_secondary_supers_table($sub$$Register, $super_reg$$Register, $result$$Register,
+                                                 $tmpR11$$Register, $tmpR12$$Register, $tmpR13$$Register,
+                                                 $tmpR16$$Register, super_klass_slot);
+    } else {
+      address call = __ trampoline_call(RuntimeAddress(StubRoutines::lookup_secondary_supers_table_stub(super_klass_slot)));
+      success = (call != nullptr);
+    }
+    if (!success) {
+      ciEnv::current()->record_failure("CodeCache is full");
+      return;
+    }
+  %}
+
+  ins_pipe(pipe_class_memory);
+%}
+
 instruct partialSubtypeCheckVsZero(iRegP_R15 result, iRegP_R14 sub, iRegP_R10 super, iRegP_R12 tmp,
                                    immP0 zero, rFlagsReg cr)
 %{
   match(Set cr (CmpP (PartialSubtypeCheck sub super) zero));
   effect(KILL tmp, KILL result);
 
-  ins_cost(2 * STORE_COST + 3 * LOAD_COST + 4 * ALU_COST + BRANCH_COST * 4);
+  ins_cost(11 * DEFAULT_COST);
   format %{ "partialSubtypeCheck $result, $sub, $super == 0\t#@partialSubtypeCheckVsZero" %}
 
   ins_encode(riscv_enc_partial_subtype_check(sub, super, tmp, result));
diff --git a/src/hotspot/cpu/riscv/riscv_b.ad b/src/hotspot/cpu/riscv/riscv_b.ad
index b8960e5e9fd..92e616a3063 100644
--- a/src/hotspot/cpu/riscv/riscv_b.ad
+++ b/src/hotspot/cpu/riscv/riscv_b.ad
@@ -178,13 +178,13 @@ instruct convI2UL_reg_reg_b(iRegLNoSp dst, iRegIorL2I src, immL_32bits mask) %{
 
 // BSWAP instructions
 instruct bytes_reverse_int_b(iRegINoSp dst, iRegIorL2I src) %{
-  predicate(UseZbb);
   match(Set dst (ReverseBytesI src));
 
   ins_cost(ALU_COST * 2);
   format %{ "revb_w_w  $dst, $src\t#@bytes_reverse_int_b" %}
 
   ins_encode %{
+    assert(UseZbb, "must be");
     __ revb_w_w(as_Register($dst$$reg), as_Register($src$$reg));
   %}
 
@@ -192,13 +192,13 @@ instruct bytes_reverse_int_b(iRegINoSp dst, iRegIorL2I src) %{
 %}
 
 instruct bytes_reverse_long_b(iRegLNoSp dst, iRegL src) %{
-  predicate(UseZbb);
   match(Set dst (ReverseBytesL src));
 
   ins_cost(ALU_COST);
   format %{ "rev8  $dst, $src\t#@bytes_reverse_long_b" %}
 
   ins_encode %{
+    assert(UseZbb, "must be");
     __ rev8(as_Register($dst$$reg), as_Register($src$$reg));
   %}
 
@@ -206,13 +206,13 @@ instruct bytes_reverse_long_b(iRegLNoSp dst, iRegL src) %{
 %}
 
 instruct bytes_reverse_unsigned_short_b(iRegINoSp dst, iRegIorL2I src) %{
-  predicate(UseZbb);
   match(Set dst (ReverseBytesUS src));
 
   ins_cost(ALU_COST * 2);
   format %{ "revb_h_h_u  $dst, $src\t#@bytes_reverse_unsigned_short_b" %}
 
   ins_encode %{
+    assert(UseZbb, "must be");
     __ revb_h_h_u(as_Register($dst$$reg), as_Register($src$$reg));
   %}
 
@@ -220,13 +220,13 @@ instruct bytes_reverse_unsigned_short_b(iRegINoSp dst, iRegIorL2I src) %{
 %}
 
 instruct bytes_reverse_short_b(iRegINoSp dst, iRegIorL2I src) %{
-  predicate(UseZbb);
   match(Set dst (ReverseBytesS src));
 
   ins_cost(ALU_COST * 2);
   format %{ "revb_h_h  $dst, $src\t#@bytes_reverse_short_b" %}
 
   ins_encode %{
+    assert(UseZbb, "must be");
     __ revb_h_h(as_Register($dst$$reg), as_Register($src$$reg));
   %}
 
diff --git a/src/hotspot/cpu/riscv/riscv_v.ad b/src/hotspot/cpu/riscv/riscv_v.ad
index db2c2861949..1a51d7583c9 100644
--- a/src/hotspot/cpu/riscv/riscv_v.ad
+++ b/src/hotspot/cpu/riscv/riscv_v.ad
@@ -2007,11 +2007,20 @@ instruct reduce_addL(iRegLNoSp dst, iRegL src1, vReg src2, vReg tmp) %{
   ins_pipe(pipe_slow);
 %}
 
-instruct reduce_addF(fRegF dst, fRegF src1, vReg src2, vReg tmp) %{
+// Distinguish two cases based on requires_strict_order
+// 1. Non strictly-ordered AddReductionVF/D. For example, AddReductionVF/D
+//    generated by Vector API. It is more beneficial performance-wise to do
+//    an unordered FP reduction sum (vfredusum.vs).
+// 2. Strictly-ordered AddReductionVF/D. For example, AddReductionVF/D
+//    generated by auto-vectorization. Must do an ordered FP reduction sum
+//    (vfredosum.vs).
+
+instruct reduce_addF_ordered(fRegF dst, fRegF src1, vReg src2, vReg tmp) %{
+  predicate(n->as_Reduction()->requires_strict_order());
   match(Set dst (AddReductionVF src1 src2));
   effect(TEMP tmp);
   ins_cost(VEC_COST);
-  format %{ "reduce_addF $dst, $src1, $src2\t# KILL $tmp" %}
+  format %{ "reduce_addF_ordered $dst, $src1, $src2\t# KILL $tmp" %}
   ins_encode %{
     __ vsetvli_helper(T_FLOAT, Matcher::vector_length(this, $src2));
     __ vfmv_s_f(as_VectorRegister($tmp$$reg), $src1$$FloatRegister);
@@ -2022,11 +2031,28 @@ instruct reduce_addF(fRegF dst, fRegF src1, vReg src2, vReg tmp) %{
   ins_pipe(pipe_slow);
 %}
 
-instruct reduce_addD(fRegD dst, fRegD src1, vReg src2, vReg tmp) %{
+instruct reduce_addF_unordered(fRegF dst, fRegF src1, vReg src2, vReg tmp) %{
+  predicate(!n->as_Reduction()->requires_strict_order());
+  match(Set dst (AddReductionVF src1 src2));
+  effect(TEMP tmp);
+  ins_cost(VEC_COST);
+  format %{ "reduce_addF_unordered $dst, $src1, $src2\t# KILL $tmp" %}
+  ins_encode %{
+    __ vsetvli_helper(T_FLOAT, Matcher::vector_length(this, $src2));
+    __ vfmv_s_f(as_VectorRegister($tmp$$reg), $src1$$FloatRegister);
+    __ vfredusum_vs(as_VectorRegister($tmp$$reg), as_VectorRegister($src2$$reg),
+                    as_VectorRegister($tmp$$reg));
+    __ vfmv_f_s($dst$$FloatRegister, as_VectorRegister($tmp$$reg));
+  %}
+  ins_pipe(pipe_slow);
+%}
+
+instruct reduce_addD_ordered(fRegD dst, fRegD src1, vReg src2, vReg tmp) %{
+  predicate(n->as_Reduction()->requires_strict_order());
   match(Set dst (AddReductionVD src1 src2));
   effect(TEMP tmp);
   ins_cost(VEC_COST);
-  format %{ "reduce_addD $dst, $src1, $src2\t# KILL $tmp" %}
+  format %{ "reduce_addD_ordered $dst, $src1, $src2\t# KILL $tmp" %}
   ins_encode %{
     __ vsetvli_helper(T_DOUBLE, Matcher::vector_length(this, $src2));
     __ vfmv_s_f(as_VectorRegister($tmp$$reg), $src1$$FloatRegister);
@@ -2037,6 +2063,22 @@ instruct reduce_addD(fRegD dst, fRegD src1, vReg src2, vReg tmp) %{
   ins_pipe(pipe_slow);
 %}
 
+instruct reduce_addD_unordered(fRegD dst, fRegD src1, vReg src2, vReg tmp) %{
+  predicate(!n->as_Reduction()->requires_strict_order());
+  match(Set dst (AddReductionVD src1 src2));
+  effect(TEMP tmp);
+  ins_cost(VEC_COST);
+  format %{ "reduce_addD_unordered $dst, $src1, $src2\t# KILL $tmp" %}
+  ins_encode %{
+    __ vsetvli_helper(T_DOUBLE, Matcher::vector_length(this, $src2));
+    __ vfmv_s_f(as_VectorRegister($tmp$$reg), $src1$$FloatRegister);
+    __ vfredusum_vs(as_VectorRegister($tmp$$reg), as_VectorRegister($src2$$reg),
+                    as_VectorRegister($tmp$$reg));
+    __ vfmv_f_s($dst$$FloatRegister, as_VectorRegister($tmp$$reg));
+  %}
+  ins_pipe(pipe_slow);
+%}
+
 // vector add reduction - predicated
 
 instruct reduce_addI_masked(iRegINoSp dst, iRegIorL2I src1, vReg src2, vRegMask_V0 v0, vReg tmp) %{
@@ -3563,14 +3605,37 @@ instruct varray_equalsC(iRegP_R11 ary1, iRegP_R12 ary2, iRegI_R10 result,
   ins_pipe(pipe_class_memory);
 %}
 
+instruct vstring_compareU_128b(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_R14 cnt2,
+                          iRegI_R10 result, vReg_V4 v4, vReg_V5 v5, vReg_V6 v6, vReg_V7 v7,
+                          vReg_V8 v8, vReg_V9 v9, vReg_V10 v10, vReg_V11 v11,
+                          iRegP_R28 tmp1, iRegL_R29 tmp2)
+%{
+  predicate(UseRVV && ((StrCompNode *)n)->encoding() == StrIntrinsicNode::UU &&
+            MaxVectorSize == 16);
+  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
+  effect(KILL tmp1, KILL tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
+        TEMP v4, TEMP v5, TEMP v6, TEMP v7, TEMP v8, TEMP v9, TEMP v10, TEMP v11);
+
+  format %{ "String Compare $str1, $cnt1, $str2, $cnt2 -> $result\t#@string_compareU" %}
+  ins_encode %{
+    // Count is in 8-bit bytes; non-Compact chars are 16 bits.
+    __ string_compare_v($str1$$Register, $str2$$Register,
+                        $cnt1$$Register, $cnt2$$Register, $result$$Register,
+                        $tmp1$$Register, $tmp2$$Register,
+                        StrIntrinsicNode::UU);
+  %}
+  ins_pipe(pipe_class_memory);
+%}
+
 instruct vstring_compareU(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_R14 cnt2,
                           iRegI_R10 result, vReg_V2 v2, vReg_V3 v3, vReg_V4 v4, vReg_V5 v5,
                           iRegP_R28 tmp1, iRegL_R29 tmp2)
 %{
-  predicate(UseRVV && ((StrCompNode *)n)->encoding() == StrIntrinsicNode::UU);
+  predicate(UseRVV && ((StrCompNode *)n)->encoding() == StrIntrinsicNode::UU &&
+            MaxVectorSize > 16);
   match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
   effect(KILL tmp1, KILL tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
-         TEMP v2, TEMP v3, TEMP v4, TEMP v5);
+        TEMP v2, TEMP v3, TEMP v4, TEMP v5);
 
   format %{ "String Compare $str1, $cnt1, $str2, $cnt2 -> $result\t#@string_compareU" %}
   ins_encode %{
@@ -3582,6 +3647,7 @@ instruct vstring_compareU(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_
   %}
   ins_pipe(pipe_class_memory);
 %}
+
 instruct vstring_compareL(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_R14 cnt2,
                           iRegI_R10 result, vReg_V2 v2, vReg_V3 v3, vReg_V4 v4, vReg_V5 v5,
                           iRegP_R28 tmp1, iRegL_R29 tmp2)
@@ -3589,7 +3655,7 @@ instruct vstring_compareL(iRegP_R11 str1, iRegI_R12 cnt1, iRegP_R13 str2, iRegI_
   predicate(UseRVV && ((StrCompNode *)n)->encoding() == StrIntrinsicNode::LL);
   match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
   effect(KILL tmp1, KILL tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
-         TEMP v2, TEMP v3, TEMP v4, TEMP v5);
+        TEMP v2, TEMP v3, TEMP v4, TEMP v5);
 
   format %{ "String Compare $str1, $cnt1, $str2, $cnt2 -> $result\t#@string_compareL" %}
   ins_encode %{
@@ -4795,12 +4861,11 @@ instruct vcountTrailingZeros(vReg dst, vReg src) %{
 
 // ------------------------------ Vector Load Gather ---------------------------
 
-instruct gather_load(vReg dst, indirect mem, vReg idx) %{
-  predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4 ||
-            type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
+instruct gather_loadS(vReg dst, indirect mem, vReg idx) %{
+  predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4);
   match(Set dst (LoadVectorGather mem idx));
   effect(TEMP_DEF dst);
-  format %{ "gather_load $dst, $mem, $idx" %}
+  format %{ "gather_loadS $dst, $mem, $idx" %}
   ins_encode %{
     __ vmv1r_v(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
     BasicType bt = Matcher::vector_element_basic_type(this);
@@ -4813,12 +4878,28 @@ instruct gather_load(vReg dst, indirect mem, vReg idx) %{
   ins_pipe(pipe_slow);
 %}
 
-instruct gather_load_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
-  predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4 ||
-            type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
+instruct gather_loadD(vReg dst, indirect mem, vReg idx) %{
+  predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
+  match(Set dst (LoadVectorGather mem idx));
+  effect(TEMP_DEF dst);
+  format %{ "gather_loadD $dst, $mem, $idx" %}
+  ins_encode %{
+    BasicType bt = Matcher::vector_element_basic_type(this);
+    Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
+    __ vsetvli_helper(bt, Matcher::vector_length(this));
+    __ vzext_vf2(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
+    __ vsll_vi(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), (int)sew);
+    __ vluxei64_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
+                  as_VectorRegister($dst$$reg));
+ %}
+  ins_pipe(pipe_slow);
+%}
+
+instruct gather_loadS_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
+  predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4);
   match(Set dst (LoadVectorGatherMasked mem (Binary idx v0)));
   effect(TEMP_DEF dst, TEMP tmp);
-  format %{ "gather_load_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
+  format %{ "gather_loadS_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
   ins_encode %{
     __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
     BasicType bt = Matcher::vector_element_basic_type(this);
@@ -4833,14 +4914,32 @@ instruct gather_load_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vR
   ins_pipe(pipe_slow);
 %}
 
+instruct gather_loadD_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
+  predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
+  match(Set dst (LoadVectorGatherMasked mem (Binary idx v0)));
+  effect(TEMP_DEF dst, TEMP tmp);
+  format %{ "gather_loadD_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
+  ins_encode %{
+    BasicType bt = Matcher::vector_element_basic_type(this);
+    Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
+    __ vsetvli_helper(bt, Matcher::vector_length(this));
+    __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
+    __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
+    __ vxor_vv(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg),
+               as_VectorRegister($dst$$reg));
+    __ vluxei64_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
+                  as_VectorRegister($tmp$$reg), Assembler::v0_t);
+ %}
+  ins_pipe(pipe_slow);
+%}
+
 // ------------------------------ Vector Store Scatter -------------------------
 
-instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{
-  predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4 ||
-            type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
+instruct scatter_storeS(indirect mem, vReg src, vReg idx, vReg tmp) %{
+  predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4);
   match(Set mem (StoreVectorScatter mem (Binary src idx)));
   effect(TEMP tmp);
-  format %{ "scatter_store $mem, $idx, $src\t# KILL $tmp" %}
+  format %{ "scatter_storeS $mem, $idx, $src\t# KILL $tmp" %}
   ins_encode %{
     __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
     BasicType bt = Matcher::vector_element_basic_type(this, $src);
@@ -4853,12 +4952,28 @@ instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{
   ins_pipe(pipe_slow);
 %}
 
-instruct scatter_store_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
-  predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4 ||
-            type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
+instruct scatter_storeD(indirect mem, vReg src, vReg idx, vReg tmp) %{
+  predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
+  match(Set mem (StoreVectorScatter mem (Binary src idx)));
+  effect(TEMP tmp);
+  format %{ "scatter_storeD $mem, $idx, $src\t# KILL $tmp" %}
+  ins_encode %{
+    BasicType bt = Matcher::vector_element_basic_type(this, $src);
+    Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
+    __ vsetvli_helper(bt, Matcher::vector_length(this, $src));
+    __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
+    __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
+    __ vsuxei64_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
+                  as_VectorRegister($tmp$$reg));
+  %}
+  ins_pipe(pipe_slow);
+%}
+
+instruct scatter_storeS_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
+  predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4);
   match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0))));
   effect(TEMP tmp);
-  format %{ "scatter_store_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
+  format %{ "scatter_storeS_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
   ins_encode %{
     __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
     BasicType bt = Matcher::vector_element_basic_type(this, $src);
@@ -4871,6 +4986,23 @@ instruct scatter_store_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0,
   ins_pipe(pipe_slow);
 %}
 
+instruct scatter_storeD_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
+  predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
+  match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0))));
+  effect(TEMP tmp);
+  format %{ "scatter_storeD_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
+  ins_encode %{
+    BasicType bt = Matcher::vector_element_basic_type(this, $src);
+    Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
+    __ vsetvli_helper(bt, Matcher::vector_length(this, $src));
+    __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
+    __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
+    __ vsuxei64_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
+                  as_VectorRegister($tmp$$reg), Assembler::v0_t);
+  %}
+  ins_pipe(pipe_slow);
+%}
+
 // ------------------------------ Populate Index to a Vector -------------------
 
 instruct populateindex(vReg dst, iRegIorL2I src1, iRegIorL2I src2, vReg tmp) %{
diff --git a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp
index 9e6c8ce2e5e..3af203a95b0 100644
--- a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp
+++ b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp
@@ -1638,14 +1638,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   __ set_last_Java_frame(sp, noreg, native_return, t0);
 
   Label dtrace_method_entry, dtrace_method_entry_done;
-  {
-    ExternalAddress target((address)&DTraceMethodProbes);
-    __ relocate(target.rspec(), [&] {
-      int32_t offset;
-      __ la(t0, target.target(), offset);
-      __ lbu(t0, Address(t0, offset));
-    });
-    __ bnez(t0, dtrace_method_entry);
+  if (DTraceMethodProbes) {
+    __ j(dtrace_method_entry);
     __ bind(dtrace_method_entry_done);
   }
 
@@ -1861,14 +1855,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   }
 
   Label dtrace_method_exit, dtrace_method_exit_done;
-  {
-    ExternalAddress target((address)&DTraceMethodProbes);
-    __ relocate(target.rspec(), [&] {
-      int32_t offset;
-      __ la(t0, target.target(), offset);
-      __ lbu(t0, Address(t0, offset));
-    });
-    __ bnez(t0, dtrace_method_exit);
+  if (DTraceMethodProbes) {
+    __ j(dtrace_method_exit);
     __ bind(dtrace_method_exit_done);
   }
 
@@ -2009,34 +1997,36 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   }
 
   // SLOW PATH dtrace support
-  {
-    __ block_comment("dtrace entry {");
-    __ bind(dtrace_method_entry);
-
-    // We have all of the arguments setup at this point. We must not touch any register
-    // argument registers at this point (what if we save/restore them there are no oop?
-
-    save_args(masm, total_c_args, c_arg, out_regs);
-    __ mov_metadata(c_rarg1, method());
-    __ call_VM_leaf(
-      CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
-      xthread, c_rarg1);
-    restore_args(masm, total_c_args, c_arg, out_regs);
-    __ j(dtrace_method_entry_done);
-    __ block_comment("} dtrace entry");
-  }
+  if (DTraceMethodProbes) {
+    {
+      __ block_comment("dtrace entry {");
+      __ bind(dtrace_method_entry);
+
+      // We have all of the arguments setup at this point. We must not touch any register
+      // argument registers at this point (what if we save/restore them there are no oop?
+
+      save_args(masm, total_c_args, c_arg, out_regs);
+      __ mov_metadata(c_rarg1, method());
+      __ call_VM_leaf(
+        CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
+        xthread, c_rarg1);
+      restore_args(masm, total_c_args, c_arg, out_regs);
+      __ j(dtrace_method_entry_done);
+      __ block_comment("} dtrace entry");
+    }
 
-  {
-    __ block_comment("dtrace exit {");
-    __ bind(dtrace_method_exit);
-    save_native_result(masm, ret_type, stack_slots);
-    __ mov_metadata(c_rarg1, method());
-    __ call_VM_leaf(
-         CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit),
-         xthread, c_rarg1);
-    restore_native_result(masm, ret_type, stack_slots);
-    __ j(dtrace_method_exit_done);
-    __ block_comment("} dtrace exit");
+    {
+      __ block_comment("dtrace exit {");
+      __ bind(dtrace_method_exit);
+      save_native_result(masm, ret_type, stack_slots);
+      __ mov_metadata(c_rarg1, method());
+      __ call_VM_leaf(
+           CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit),
+           xthread, c_rarg1);
+      restore_native_result(masm, ret_type, stack_slots);
+      __ j(dtrace_method_exit_done);
+      __ block_comment("} dtrace exit");
+    }
   }
 
   __ flush();
diff --git a/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp b/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp
index c292f671325..61c7a8668f5 100644
--- a/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp
+++ b/src/hotspot/cpu/riscv/stubGenerator_riscv.cpp
@@ -2808,6 +2808,50 @@ class StubGenerator: public StubCodeGenerator {
   }
 
 #ifdef COMPILER2
+  address generate_lookup_secondary_supers_table_stub(u1 super_klass_index) {
+    StubCodeMark mark(this, "StubRoutines", "lookup_secondary_supers_table");
+
+    address start = __ pc();
+    const Register
+      r_super_klass  = x10,
+      r_array_base   = x11,
+      r_array_length = x12,
+      r_array_index  = x13,
+      r_sub_klass    = x14,
+      result         = x15,
+      r_bitmap       = x16;
+
+    Label L_success;
+    __ enter();
+    __ lookup_secondary_supers_table(r_sub_klass, r_super_klass, result,
+                                     r_array_base, r_array_length, r_array_index,
+                                     r_bitmap, super_klass_index, /*stub_is_near*/true);
+    __ leave();
+    __ ret();
+
+    return start;
+  }
+
+  // Slow path implementation for UseSecondarySupersTable.
+  address generate_lookup_secondary_supers_table_slow_path_stub() {
+    StubCodeMark mark(this, "StubRoutines", "lookup_secondary_supers_table_slow_path");
+
+    address start = __ pc();
+    const Register
+      r_super_klass  = x10,        // argument
+      r_array_base   = x11,        // argument
+      temp1          = x12,        // tmp
+      r_array_index  = x13,        // argument
+      result         = x15,        // argument
+      r_bitmap       = x16;        // argument
+
+
+    __ lookup_secondary_supers_table_slow_path(r_super_klass, r_array_base, r_array_index, r_bitmap, result, temp1);
+    __ ret();
+
+    return start;
+  }
+
   address generate_mulAdd()
   {
     __ align(CodeEntryAlignment);
@@ -5269,6 +5313,52 @@ static const int64_t right_3_bits = right_n_bits(3);
 
 #endif // COMPILER2
 
+  /**
+   *  Arguments:
+   *
+   * Inputs:
+   *   c_rarg0   - int crc
+   *   c_rarg1   - byte* buf
+   *   c_rarg2   - int length
+   *
+   * Output:
+   *   c_rarg0   - int crc result
+   */
+  address generate_updateBytesCRC32() {
+    assert(UseCRC32Intrinsics, "what are we doing here?");
+
+    __ align(CodeEntryAlignment);
+    StubCodeMark mark(this, "StubRoutines", "updateBytesCRC32");
+
+    address start = __ pc();
+
+    const Register crc    = c_rarg0;  // crc
+    const Register buf    = c_rarg1;  // source java byte array address
+    const Register len    = c_rarg2;  // length
+    const Register table0 = c_rarg3;  // crc_table address
+    const Register table1 = c_rarg4;
+    const Register table2 = c_rarg5;
+    const Register table3 = c_rarg6;
+
+    const Register tmp1 = c_rarg7;
+    const Register tmp2 = t2;
+    const Register tmp3 = x28; // t3
+    const Register tmp4 = x29; // t4
+    const Register tmp5 = x30; // t5
+    const Register tmp6 = x31; // t6
+
+    BLOCK_COMMENT("Entry:");
+    __ enter(); // required for proper stackwalking of RuntimeStub frame
+
+    __ kernel_crc32(crc, buf, len, table0, table1, table2,
+                    table3, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6);
+
+    __ leave(); // required for proper stackwalking of RuntimeStub frame
+    __ ret();
+
+    return start;
+  }
+
 #if INCLUDE_JFR
 
   static void jfr_prologue(address the_pc, MacroAssembler* _masm, Register thread) {
@@ -5515,6 +5605,12 @@ static const int64_t right_3_bits = right_n_bits(3);
       generate_throw_exception("delayed StackOverflowError throw_exception",
                                CAST_FROM_FN_PTR(address,
                                                 SharedRuntime::throw_delayed_StackOverflowError));
+
+    if (UseCRC32Intrinsics) {
+      // set table address before stub generation which use it
+      StubRoutines::_crc_table_adr = (address)StubRoutines::riscv::_crc_table;
+      StubRoutines::_updateBytesCRC32 = generate_updateBytesCRC32();
+    }
   }
 
   void generate_continuation_stubs() {
@@ -5566,6 +5662,18 @@ static const int64_t right_3_bits = right_n_bits(3);
       StubRoutines::_method_entry_barrier = generate_method_entry_barrier();
     }
 
+#ifdef COMPILER2
+    if (UseSecondarySupersTable) {
+      StubRoutines::_lookup_secondary_supers_table_slow_path_stub = generate_lookup_secondary_supers_table_slow_path_stub();
+      if (!InlineSecondarySupersTest) {
+        for (int slot = 0; slot < Klass::SECONDARY_SUPERS_TABLE_SIZE; slot++) {
+          StubRoutines::_lookup_secondary_supers_table_stubs[slot]
+            = generate_lookup_secondary_supers_table_stub(slot);
+        }
+      }
+    }
+#endif // COMPILER2
+
     StubRoutines::_upcall_stub_exception_handler = generate_upcall_stub_exception_handler();
 
     StubRoutines::riscv::set_completed();
diff --git a/src/hotspot/cpu/riscv/stubRoutines_riscv.cpp b/src/hotspot/cpu/riscv/stubRoutines_riscv.cpp
index 39068a9a026..05bdeaf7570 100644
--- a/src/hotspot/cpu/riscv/stubRoutines_riscv.cpp
+++ b/src/hotspot/cpu/riscv/stubRoutines_riscv.cpp
@@ -55,3 +55,225 @@ address StubRoutines::riscv::_string_indexof_linear_ul = nullptr;
 address StubRoutines::riscv::_large_byte_array_inflate = nullptr;
 
 bool StubRoutines::riscv::_completed = false;
+
+/**
+ *  crc_table[] from jdk/src/java.base/share/native/libzip/zlib/crc32.h
+ */
+ATTRIBUTE_ALIGNED(4096) juint StubRoutines::riscv::_crc_table[] =
+{
+    // Table 0
+    0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
+    0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
+    0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
+    0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
+    0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
+    0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
+    0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
+    0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
+    0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
+    0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
+    0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
+    0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
+    0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
+    0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
+    0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
+    0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
+    0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
+    0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
+    0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
+    0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
+    0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
+    0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
+    0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
+    0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
+    0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
+    0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
+    0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
+    0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
+    0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
+    0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
+    0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
+    0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
+    0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
+    0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
+    0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
+    0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
+    0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
+    0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
+    0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
+    0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
+    0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
+    0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
+    0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
+    0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
+    0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
+    0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
+    0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
+    0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
+    0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
+    0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
+    0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
+    0x2d02ef8dUL,
+
+    // Table 1
+    0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
+    0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
+    0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
+    0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
+    0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
+    0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
+    0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
+    0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
+    0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
+    0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
+    0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
+    0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
+    0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
+    0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
+    0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
+    0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
+    0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
+    0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
+    0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
+    0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
+    0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
+    0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
+    0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
+    0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
+    0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
+    0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
+    0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
+    0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
+    0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
+    0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
+    0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
+    0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
+    0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
+    0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
+    0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
+    0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
+    0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
+    0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
+    0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
+    0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
+    0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
+    0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
+    0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
+    0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
+    0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
+    0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
+    0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
+    0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
+    0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
+    0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
+    0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
+    0x9324fd72UL,
+
+    // Table 2
+    0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
+    0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
+    0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
+    0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
+    0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
+    0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
+    0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
+    0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
+    0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
+    0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
+    0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
+    0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
+    0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
+    0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
+    0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
+    0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
+    0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
+    0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
+    0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
+    0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
+    0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
+    0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
+    0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
+    0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
+    0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
+    0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
+    0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
+    0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
+    0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
+    0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
+    0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
+    0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
+    0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
+    0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
+    0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
+    0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
+    0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
+    0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
+    0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
+    0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
+    0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
+    0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
+    0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
+    0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
+    0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
+    0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
+    0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
+    0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
+    0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
+    0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
+    0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
+    0xbe9834edUL,
+
+    // Table 3
+    0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
+    0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
+    0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
+    0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
+    0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
+    0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
+    0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
+    0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
+    0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
+    0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
+    0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
+    0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
+    0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
+    0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
+    0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
+    0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
+    0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
+    0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
+    0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
+    0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
+    0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
+    0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
+    0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
+    0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
+    0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
+    0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
+    0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
+    0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
+    0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
+    0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
+    0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
+    0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
+    0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
+    0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
+    0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
+    0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
+    0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
+    0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
+    0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
+    0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
+    0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
+    0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
+    0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
+    0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
+    0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
+    0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
+    0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
+    0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
+    0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
+    0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
+    0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
+    0xde0506f1UL,
+};
diff --git a/src/hotspot/cpu/riscv/stubRoutines_riscv.hpp b/src/hotspot/cpu/riscv/stubRoutines_riscv.hpp
index 90a7e0967b2..46b5461d777 100644
--- a/src/hotspot/cpu/riscv/stubRoutines_riscv.hpp
+++ b/src/hotspot/cpu/riscv/stubRoutines_riscv.hpp
@@ -153,6 +153,9 @@ class riscv {
   static void set_completed() {
     _completed = true;
   }
+
+private:
+  static juint    _crc_table[];
 };
 
 #endif // CPU_RISCV_STUBROUTINES_RISCV_HPP
diff --git a/src/hotspot/cpu/riscv/templateTable_riscv.cpp b/src/hotspot/cpu/riscv/templateTable_riscv.cpp
index 5c72ddc9f81..fa542343949 100644
--- a/src/hotspot/cpu/riscv/templateTable_riscv.cpp
+++ b/src/hotspot/cpu/riscv/templateTable_riscv.cpp
@@ -3592,8 +3592,7 @@ void TemplateTable::_new() {
     __ store_klass_gap(x10, zr);   // zero klass gap for compressed oops
     __ store_klass(x10, x14);      // store klass last
 
-    {
-      SkipIfEqual skip(_masm, &DTraceAllocProbes, false);
+    if (DTraceAllocProbes) {
       // Trigger dtrace event for fastpath
       __ push(atos); // save the return value
       __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)), x10);
diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.cpp b/src/hotspot/cpu/riscv/vm_version_riscv.cpp
index 995e8b72248..b7517bc3f3f 100644
--- a/src/hotspot/cpu/riscv/vm_version_riscv.cpp
+++ b/src/hotspot/cpu/riscv/vm_version_riscv.cpp
@@ -131,8 +131,14 @@ void VM_Version::initialize() {
     FLAG_SET_DEFAULT(UseAESCTRIntrinsics, false);
   }
 
-  if (UseCRC32Intrinsics) {
-    warning("CRC32 intrinsics are not available on this CPU.");
+  if (UseZba) {
+    if (FLAG_IS_DEFAULT(UseCRC32Intrinsics)) {
+      FLAG_SET_DEFAULT(UseCRC32Intrinsics, true);
+    }
+  } else {
+    if (!FLAG_IS_DEFAULT(UseCRC32Intrinsics)) {
+      warning("CRC32 intrinsic requires Zba instructions (not available on this CPU)");
+    }
     FLAG_SET_DEFAULT(UseCRC32Intrinsics, false);
   }
 
@@ -327,15 +333,11 @@ void VM_Version::c2_initialize() {
     FLAG_SET_DEFAULT(MaxVectorSize, 0);
     FLAG_SET_DEFAULT(UseRVVForBigIntegerShiftIntrinsics, false);
   } else {
-    if (FLAG_IS_DEFAULT(MaxVectorSize)) {
-      MaxVectorSize = _initial_vector_length;
-    } else if (!is_power_of_2(MaxVectorSize)) {
-      vm_exit_during_initialization(err_msg("Unsupported MaxVectorSize: %d, must be a power of 2", (int)MaxVectorSize));
-    } else if (MaxVectorSize > _initial_vector_length) {
-      warning("Current system only supports max RVV vector length %d. Set MaxVectorSize to %d",
-              _initial_vector_length, _initial_vector_length);
-      MaxVectorSize = _initial_vector_length;
+    if (!FLAG_IS_DEFAULT(MaxVectorSize) && MaxVectorSize != _initial_vector_length) {
+      warning("Current system does not support RVV vector length for MaxVectorSize %d. Set MaxVectorSize to %d",
+               (int)MaxVectorSize, _initial_vector_length);
     }
+    MaxVectorSize = _initial_vector_length;
     if (MaxVectorSize < 16) {
       warning("RVV does not support vector length less than 16 bytes. Disabling RVV.");
       UseRVV = false;
diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.hpp b/src/hotspot/cpu/riscv/vm_version_riscv.hpp
index f3a834b7237..9556e2dc9ad 100644
--- a/src/hotspot/cpu/riscv/vm_version_riscv.hpp
+++ b/src/hotspot/cpu/riscv/vm_version_riscv.hpp
@@ -277,6 +277,8 @@ class VM_Version : public Abstract_VM_Version {
 
   constexpr static bool supports_recursive_lightweight_locking() { return true; }
 
+  constexpr static bool supports_secondary_supers_table() { return true; }
+
   static bool supports_on_spin_wait() { return UseZihintpause; }
 
   // RISCV64 supports fast class initialization checks
diff --git a/src/hotspot/cpu/s390/assembler_s390.hpp b/src/hotspot/cpu/s390/assembler_s390.hpp
index cf80d164faf..58200958289 100644
--- a/src/hotspot/cpu/s390/assembler_s390.hpp
+++ b/src/hotspot/cpu/s390/assembler_s390.hpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2016, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2016, 2024 SAP SE. 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
@@ -986,6 +986,9 @@ class Assembler : public AbstractAssembler {
 #define BCR_ZOPC    (unsigned  int)(7 << 8)
 #define BALR_ZOPC   (unsigned  int)(5 << 8)
 #define BASR_ZOPC   (unsigned  int)(13 << 8)
+#define BCT_ZOPC    (unsigned  int)(70 << 24)
+#define BCTR_ZOPC   (unsigned  int)(6 << 8)
+#define BCTG_ZOPC   (unsigned  int)(227L << 40 | 70)
 #define BCTGR_ZOPC  (unsigned long)(0xb946 << 16)
 // Absolute
 #define BC_ZOPC     (unsigned  int)(71 << 24)
@@ -1607,6 +1610,9 @@ class Assembler : public AbstractAssembler {
   static int inv_simm32(long x)    { return (inv_s_field(x, 31,  0)); }                         // 6-byte instructions only
   static int inv_uimm12(long x)    { return (inv_u_field(x, 11,  0)); }                         // 4-byte instructions only
 
+  // NOTE: PLEASE DON'T USE IT NAKED UNTIL WE DROP SUPPORT FOR MACHINES OLDER THAN Z15!!!!
+  inline void z_popcnt(Register r1, Register r2, int64_t m3);   // population count
+
  private:
 
   // Encode u_field from long value.
@@ -1887,7 +1893,14 @@ class Assembler : public AbstractAssembler {
   //inline void z_brcl(branch_condition i1, int64_t i2);                        // branch  i1 ? pc = pc + i2_imm32
   inline void z_brcl(branch_condition i1, address a);                           // branch  i1 ? pc = a
   inline void z_brcl(branch_condition i1, Label& L);                            // branch  i1 ? pc = Label
-  inline void z_bctgr(Register r1, Register r2);         // branch on count r1 -= 1; (r1!=0) ? pc = r2  ; r1 is int64
+
+  // branch on count Instructions
+  inline void z_bct(  Register r1, int64_t d2, Register x2, Register b2); // branch on count r1 -= 1; (r1!=0) ? pc = (d2_uimm12+x2+b2) ; r1 is int32
+  inline void z_bct(  Register r1, const Address &a);                     // branch on count r1 -= 1; (r1!=0) ? pc = *(a); r1 is int32
+  inline void z_bctr( Register r1, Register r2);                          // branch on count r1 -= 1; (r1!=0) ? pc = r2  ; r1 is int32
+  inline void z_bctgr(Register r1, Register r2);                          // branch on count r1 -= 1; (r1!=0) ? pc = r2  ; r1 is int64
+  inline void z_bctg( Register r1, const Address &a);                     // branch on count r1 -= 1; (r1!=0) ? pc = *(a); r1 is int64
+  inline void z_bctg( Register r1, int64_t d2, Register x2, Register b2); // branch on count r1 -= 1; (r1!=0) ? pc = (d2_imm20+x2+b2)  ; r1 is int64
 
   // branch unconditional / always
   inline void z_br(Register r2);                         // branch to r2, nop if r2 == Z_R0
@@ -3061,6 +3074,10 @@ class Assembler : public AbstractAssembler {
   inline void z_braz(Label& L);
   inline void z_brnp(Label& L);
 
+  // Branch on count;
+  inline void z_bct( Register r1, int64_t d2, Register b2);
+  inline void z_bctg(Register r1, int64_t d2, Register b2);
+
   inline void z_btrue( Label& L);
   inline void z_bfalse(Label& L);
 
@@ -3092,7 +3109,6 @@ class Assembler : public AbstractAssembler {
 
   // Ppopulation count intrinsics.
   inline void z_flogr(Register r1, Register r2);    // find leftmost one
-  inline void z_popcnt(Register r1, Register r2);   // population count
   inline void z_ahhhr(Register r1, Register r2, Register r3);   // ADD halfword high high
   inline void z_ahhlr(Register r1, Register r2, Register r3);   // ADD halfword high low
 
diff --git a/src/hotspot/cpu/s390/assembler_s390.inline.hpp b/src/hotspot/cpu/s390/assembler_s390.inline.hpp
index 126dd83ee22..2649d0f7a34 100644
--- a/src/hotspot/cpu/s390/assembler_s390.inline.hpp
+++ b/src/hotspot/cpu/s390/assembler_s390.inline.hpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2016, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024 SAP SE. 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
@@ -724,7 +724,14 @@ inline void Assembler::z_bcr( branch_condition m1, Register r2) { emit_16( BCR_Z
 inline void Assembler::z_brc( branch_condition i1, int64_t i2)  { emit_32( BRC_ZOPC   | uimm4(i1, 8, 32) | simm16(i2, 16, 32)); }
 inline void Assembler::z_brc( branch_condition i1, address a)   { emit_32( BRC_ZOPC   | uimm4(i1, 8, 32) | simm16(RelAddr::pcrel_off16(a, pc()), 16, 32)); }
 inline void Assembler::z_brcl(branch_condition i1, address a)   { emit_48( BRCL_ZOPC  | uimm4(i1, 8, 48) | simm32(RelAddr::pcrel_off32(a, pc()), 16, 48)); }
-inline void Assembler::z_bctgr(Register r1, Register r2)        { emit_32( BCTGR_ZOPC | reg( r1, 24, 32) | reg( r2, 28, 32)); };
+
+// branch on count
+inline void Assembler::z_bct(  Register r1, const Address &a)                     { z_bct(   r1, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+inline void Assembler::z_bct(  Register r1, int64_t d2, Register x2, Register b2) { emit_32( BCT_ZOPC  | reg(r1, 8, 32) | rxmask_32(d2, x2, b2)); }
+inline void Assembler::z_bctr (Register r1, Register r2)                          { emit_16( BCTR_ZOPC  | reg( r1,  8, 16) | reg( r2, 12, 16)); };
+inline void Assembler::z_bctgr(Register r1, Register r2)                          { emit_32( BCTGR_ZOPC | reg( r1, 24, 32) | reg( r2, 28, 32)); };
+inline void Assembler::z_bctg( Register r1, const Address &a)                     { z_bctg(  r1, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+inline void Assembler::z_bctg( Register r1, int64_t d2, Register x2, Register b2) { emit_48( BCTG_ZOPC | reg(r1, 8, 48) | rxymask_48(d2, x2, b2)); }
 
 inline void Assembler::z_basr( Register r1, Register r2) { emit_16( BASR_ZOPC  | regt(r1, 8, 16) | reg(r2, 12, 16)); }
 inline void Assembler::z_brasl(Register r1, address a)   { emit_48( BRASL_ZOPC | regt(r1, 8, 48) | simm32(RelAddr::pcrel_off32(a, pc()), 16, 48)); }
@@ -741,7 +748,7 @@ inline void Assembler::z_brxhg(Register r1, Register r3, Label& L) {z_brxhg(r1,
 inline void Assembler::z_brxlg(Register r1, Register r3, Label& L) {z_brxlg(r1, r3, target(L)); }
 
 inline void Assembler::z_flogr( Register r1, Register r2)              { emit_32( FLOGR_ZOPC  | reg(r1, 24, 32) | reg(r2, 28, 32)); }
-inline void Assembler::z_popcnt(Register r1, Register r2)              { emit_32( POPCNT_ZOPC | reg(r1, 24, 32) | reg(r2, 28, 32)); }
+inline void Assembler::z_popcnt(Register r1, Register r2, int64_t  m3) { emit_32( POPCNT_ZOPC | reg(r1, 24, 32) | reg(r2, 28, 32) | uimm4(m3, 16, 32)); }
 inline void Assembler::z_ahhhr( Register r1, Register r2, Register r3) { emit_32( AHHHR_ZOPC  | reg(r3, 16, 32) | reg(r1, 24, 32) | reg(r2, 28, 32)); }
 inline void Assembler::z_ahhlr( Register r1, Register r2, Register r3) { emit_32( AHHLR_ZOPC  | reg(r3, 16, 32) | reg(r1, 24, 32) | reg(r2, 28, 32)); }
 
@@ -1396,6 +1403,8 @@ inline void Assembler::z_brno(  Label& L) { z_brc(bcondNotOrdered, target(L)); }
 inline void Assembler::z_brc( branch_condition m, Label& L) { z_brc(m, target(L)); }
 inline void Assembler::z_brcl(branch_condition m, Label& L) { z_brcl(m, target(L)); }
 
+inline void Assembler::z_bct( Register r1, int64_t d2, Register b2) { z_bct( r1, d2, Z_R0, b2);}
+inline void Assembler::z_bctg(Register r1, int64_t d2, Register b2) { z_bctg(r1, d2, Z_R0, b2);}
 
 // Instruction len bits must be stored right-justified in argument.
 inline unsigned int Assembler::instr_len(unsigned char len_bits) {
diff --git a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp
index c35b0923297..13b08067821 100644
--- a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp
+++ b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp
@@ -67,9 +67,6 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox
 
   verify_oop(Roop, FILE_AND_LINE);
 
-  // Load object header.
-  z_lg(Rmark, Address(Roop, hdr_offset));
-
   // Save object being locked into the BasicObjectLock...
   z_stg(Roop, Address(Rbox, BasicObjectLock::obj_offset()));
 
@@ -85,6 +82,10 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox
     lightweight_lock(Roop, Rmark, tmp, slow_case);
   } else if (LockingMode == LM_LEGACY) {
     NearLabel done;
+
+    // Load object header.
+    z_lg(Rmark, Address(Roop, hdr_offset));
+
     // and mark it as unlocked.
     z_oill(Rmark, markWord::unlocked_value);
     // Save unlocked object header into the displaced header location on the stack.
@@ -141,12 +142,7 @@ void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rb
   verify_oop(Roop, FILE_AND_LINE);
 
   if (LockingMode == LM_LIGHTWEIGHT) {
-    const Register tmp = Z_R1_scratch;
-    z_lg(Rmark, Address(Roop, hdr_offset));
-    z_lgr(tmp, Rmark);
-    z_nill(tmp, markWord::monitor_value);
-    branch_optimized(Assembler::bcondNotZero, slow_case);
-    lightweight_unlock(Roop, Rmark, tmp, slow_case);
+    lightweight_unlock(Roop, Rmark, Z_R1_scratch, slow_case);
   } else if (LockingMode == LM_LEGACY) {
     // Test if object header is pointing to the displaced header, and if so, restore
     // the displaced header in the object. If the object header is not pointing to
diff --git a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp
index 62c1bd943b6..3641d82dabe 100644
--- a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp
+++ b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2017, 2022 SAP SE. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 SAP SE. 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
@@ -33,6 +33,15 @@
 #define BLOCK_COMMENT(str) block_comment(str)
 #define BIND(label)        bind(label); BLOCK_COMMENT(#label ":")
 
+void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Register temp1, Register temp2) {
+  compiler_fast_lock_lightweight_object(obj, temp1, temp2);
+}
+
+
+void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, Register temp1, Register temp2) {
+  compiler_fast_unlock_lightweight_object(obj, temp1, temp2);
+}
+
 //------------------------------------------------------
 //   Special String Intrinsics. Implementation
 //------------------------------------------------------
diff --git a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp
index a502e41ee08..aecb483f0a6 100644
--- a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp
+++ b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2017, 2022 SAP SE. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024 SAP SE. 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
@@ -29,6 +29,10 @@
 // C2_MacroAssembler contains high-level macros for C2
 
  public:
+  // Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in s390.ad file.
+  void fast_lock_lightweight(Register obj, Register box, Register temp1, Register temp2);
+  void fast_unlock_lightweight(Register obj, Register box, Register temp1, Register temp2);
+
   //-------------------------------------------
   // Special String Intrinsics Implementation.
   //-------------------------------------------
diff --git a/src/hotspot/cpu/s390/interp_masm_s390.cpp b/src/hotspot/cpu/s390/interp_masm_s390.cpp
index bc7996c270f..14bb98cea6a 100644
--- a/src/hotspot/cpu/s390/interp_masm_s390.cpp
+++ b/src/hotspot/cpu/s390/interp_masm_s390.cpp
@@ -1005,9 +1005,6 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) {
 
   // markWord header = obj->mark().set_unlocked();
 
-  // Load markWord from object into header.
-  z_lg(header, hdr_offset, object);
-
   if (DiagnoseSyncOnValueBasedClasses != 0) {
     load_klass(tmp, object);
     testbit(Address(tmp, Klass::access_flags_offset()), exact_log2(JVM_ACC_IS_VALUE_BASED_CLASS));
@@ -1015,9 +1012,12 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) {
   }
 
   if (LockingMode == LM_LIGHTWEIGHT) {
-    lightweight_lock(object, /* mark word */ header, tmp, slow_case);
+    lightweight_lock(object, header, tmp, slow_case);
   } else if (LockingMode == LM_LEGACY) {
 
+    // Load markWord from object into header.
+    z_lg(header, hdr_offset, object);
+
     // Set header to be (markWord of object | UNLOCK_VALUE).
     // This will not change anything if it was unlocked before.
     z_oill(header, markWord::unlocked_value);
@@ -1153,26 +1153,8 @@ void InterpreterMacroAssembler::unlock_object(Register monitor, Register object)
 
   // If we still have a lightweight lock, unlock the object and be done.
   if (LockingMode == LM_LIGHTWEIGHT) {
-    // Check for non-symmetric locking. This is allowed by the spec and the interpreter
-    // must handle it.
-
-    Register tmp = current_header;
-
-    // First check for lock-stack underflow.
-    z_lgf(tmp, Address(Z_thread, JavaThread::lock_stack_top_offset()));
-    compareU32_and_branch(tmp, (unsigned)LockStack::start_offset(), Assembler::bcondNotHigh, slow_case);
-
-    // Then check if the top of the lock-stack matches the unlocked object.
-    z_aghi(tmp, -oopSize);
-    z_lg(tmp, Address(Z_thread, tmp));
-    compare64_and_branch(tmp, object, Assembler::bcondNotEqual, slow_case);
-
-    z_lg(header, Address(object, hdr_offset));
-    z_lgr(tmp, header);
-    z_nill(tmp, markWord::monitor_value);
-    z_brne(slow_case);
 
-    lightweight_unlock(object, header, tmp, slow_case);
+    lightweight_unlock(object, header, current_header, slow_case);
 
     z_bru(done);
   } else {
diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.cpp b/src/hotspot/cpu/s390/macroAssembler_s390.cpp
index ef5216a12ba..66d6f25f0fd 100644
--- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp
+++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp
@@ -3190,16 +3190,20 @@ void MacroAssembler::increment_counter_eq(address counter_address, Register tmp1
   bind(l);
 }
 
+// "The box" is the space on the stack where we copy the object mark.
 void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Register temp1, Register temp2) {
+
+  assert(LockingMode != LM_LIGHTWEIGHT, "uses fast_lock_lightweight");
+  assert_different_registers(oop, box, temp1, temp2);
+
   Register displacedHeader = temp1;
-  Register currentHeader = temp1;
-  Register temp = temp2;
+  Register currentHeader   = temp1;
+  Register temp            = temp2;
+
   NearLabel done, object_has_monitor;
 
   const int hdr_offset = oopDesc::mark_offset_in_bytes();
 
-  assert_different_registers(temp1, temp2, oop, box);
-
   BLOCK_COMMENT("compiler_fast_lock_object {");
 
   // Load markWord from oop into mark.
@@ -3207,8 +3211,10 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis
 
   if (DiagnoseSyncOnValueBasedClasses != 0) {
     load_klass(temp, oop);
-    testbit(Address(temp, Klass::access_flags_offset()), exact_log2(JVM_ACC_IS_VALUE_BASED_CLASS));
-    z_btrue(done);
+    z_l(temp, Address(temp, Klass::access_flags_offset()));
+    assert((JVM_ACC_IS_VALUE_BASED_CLASS & 0xFFFF) == 0, "or change following instruction");
+    z_nilh(temp, JVM_ACC_IS_VALUE_BASED_CLASS >> 16);
+    z_brne(done);
   }
 
   // Handle existing monitor.
@@ -3222,7 +3228,8 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis
     // From loading the markWord, we know that oop != nullptr
     z_ltgr(oop, oop);
     z_bru(done);
-  } else if (LockingMode == LM_LEGACY) {
+  } else {
+    assert(LockingMode == LM_LEGACY, "must be");
     // Set mark to markWord | markWord::unlocked_value.
     z_oill(displacedHeader, markWord::unlocked_value);
 
@@ -3251,10 +3258,6 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis
 
     z_stg(currentHeader/*==0 or not 0*/, BasicLock::displaced_header_offset_in_bytes(), box);
 
-    z_bru(done);
-  } else {
-    assert(LockingMode == LM_LIGHTWEIGHT, "must be");
-    lightweight_lock(oop, displacedHeader, temp, done);
     z_bru(done);
   }
 
@@ -3270,10 +3273,9 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis
   // Otherwise, register zero is filled with the current owner.
   z_lghi(zero, 0);
   z_csg(zero, Z_thread, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner), monitor_tagged);
-  if (LockingMode != LM_LIGHTWEIGHT) {
-    // Store a non-null value into the box.
-    z_stg(box, BasicLock::displaced_header_offset_in_bytes(), box);
-  }
+
+  // Store a non-null value into the box.
+  z_stg(box, BasicLock::displaced_header_offset_in_bytes(), box);
 
   z_bre(done); // acquired the lock for the first time.
 
@@ -3295,14 +3297,16 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis
 }
 
 void MacroAssembler::compiler_fast_unlock_object(Register oop, Register box, Register temp1, Register temp2) {
+
+  assert(LockingMode != LM_LIGHTWEIGHT, "uses fast_unlock_lightweight");
+  assert_different_registers(oop, box, temp1, temp2);
+
   Register displacedHeader = temp1;
-  Register currentHeader = temp2;
-  Register temp = temp1;
+  Register currentHeader   = temp2;
+  Register temp            = temp1;
 
   const int hdr_offset = oopDesc::mark_offset_in_bytes();
 
-  assert_different_registers(temp1, temp2, oop, box);
-
   Label done, object_has_monitor, not_recursive;
 
   BLOCK_COMMENT("compiler_fast_unlock_object {");
@@ -3326,18 +3330,14 @@ void MacroAssembler::compiler_fast_unlock_object(Register oop, Register box, Reg
     // Set NE to indicate 'failure' -> take slow-path
     z_ltgr(oop, oop);
     z_bru(done);
-  } else if (LockingMode == LM_LEGACY) {
+  } else {
+    assert(LockingMode == LM_LEGACY, "must be");
     // Check if it is still a lightweight lock, this is true if we see
     // the stack address of the basicLock in the markWord of the object
     // copy box to currentHeader such that csg does not kill it.
     z_lgr(currentHeader, box);
     z_csg(currentHeader, displacedHeader, hdr_offset, oop);
     z_bru(done); // csg sets CR as desired.
-  } else {
-    assert(LockingMode == LM_LIGHTWEIGHT, "must be");
-
-    lightweight_unlock(oop, currentHeader, displacedHeader, done);
-    z_bru(done);
   }
 
   // In case of LM_LIGHTWEIGHT, we may reach here with (temp & ObjectMonitor::ANONYMOUS_OWNER) != 0.
@@ -5705,101 +5705,508 @@ SkipIfEqual::~SkipIfEqual() {
 }
 
 // Implements lightweight-locking.
-// Branches to slow upon failure to lock the object.
-// Falls through upon success.
-//
 //  - obj: the object to be locked, contents preserved.
-//  - hdr: the header, already loaded from obj, contents destroyed.
+//  - temp1, temp2: temporary registers, contents destroyed.
 //  Note: make sure Z_R1 is not manipulated here when C2 compiler is in play
-void MacroAssembler::lightweight_lock(Register obj, Register hdr, Register temp, Label& slow_case) {
+void MacroAssembler::lightweight_lock(Register obj, Register temp1, Register temp2, Label& slow) {
 
   assert(LockingMode == LM_LIGHTWEIGHT, "only used with new lightweight locking");
-  assert_different_registers(obj, hdr, temp);
+  assert_different_registers(obj, temp1, temp2);
+
+  Label push;
+  const Register top           = temp1;
+  const Register mark          = temp2;
+  const int mark_offset        = oopDesc::mark_offset_in_bytes();
+  const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset();
+
+  // Preload the markWord. It is important that this is the first
+  // instruction emitted as it is part of C1's null check semantics.
+  z_lg(mark, Address(obj, mark_offset));
+
 
   // First we need to check if the lock-stack has room for pushing the object reference.
-  z_lgf(temp, Address(Z_thread, JavaThread::lock_stack_top_offset()));
+  z_lgf(top, Address(Z_thread, ls_top_offset));
 
-  compareU32_and_branch(temp, (unsigned)LockStack::end_offset()-1, bcondHigh, slow_case);
+  compareU32_and_branch(top, (unsigned)LockStack::end_offset(), bcondNotLow, slow);
 
-  // attempting a lightweight_lock
-  // Load (object->mark() | 1) into hdr
-  z_oill(hdr, markWord::unlocked_value);
+  // The underflow check is elided. The recursive check will always fail
+  // when the lock stack is empty because of the _bad_oop_sentinel field.
 
-  z_lgr(temp, hdr);
+  // Check for recursion:
+  z_aghi(top, -oopSize);
+  z_cg(obj, Address(Z_thread, top));
+  z_bre(push);
 
-  // Clear lock-bits from hdr (locked state)
-  z_xilf(temp, markWord::unlocked_value);
+  // Check header for monitor (0b10).
+  z_tmll(mark, markWord::monitor_value);
+  branch_optimized(bcondNotAllZero, slow);
 
-  z_csg(hdr, temp, oopDesc::mark_offset_in_bytes(), obj);
-  branch_optimized(Assembler::bcondNotEqual, slow_case);
+  { // Try to lock. Transition lock bits 0b01 => 0b00
+    const Register locked_obj = top;
+    z_oill(mark, markWord::unlocked_value);
+    z_lgr(locked_obj, mark);
+    // Clear lock-bits from locked_obj (locked state)
+    z_xilf(locked_obj, markWord::unlocked_value);
+    z_csg(mark, locked_obj, mark_offset, obj);
+    branch_optimized(Assembler::bcondNotEqual, slow);
+  }
 
-  // After successful lock, push object on lock-stack
-  z_lgf(temp, Address(Z_thread, JavaThread::lock_stack_top_offset()));
-  z_stg(obj, Address(Z_thread, temp));
-  z_ahi(temp, oopSize);
-  z_st(temp, Address(Z_thread, JavaThread::lock_stack_top_offset()));
+  bind(push);
 
-  // as locking was successful, set CC to EQ
-  z_cr(temp, temp);
+  // After successful lock, push object on lock-stack
+  z_lgf(top, Address(Z_thread, ls_top_offset));
+  z_stg(obj, Address(Z_thread, top));
+  z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize);
 }
 
 // Implements lightweight-unlocking.
-// Branches to slow upon failure.
-// Falls through upon success.
-//
 // - obj: the object to be unlocked
-// - hdr: the (pre-loaded) header of the object, will be destroyed
+// - temp1, temp2: temporary registers, will be destroyed
 // - Z_R1_scratch: will be killed in case of Interpreter & C1 Compiler
-void MacroAssembler::lightweight_unlock(Register obj, Register hdr, Register tmp, Label& slow) {
+void MacroAssembler::lightweight_unlock(Register obj, Register temp1, Register temp2, Label& slow) {
 
   assert(LockingMode == LM_LIGHTWEIGHT, "only used with new lightweight locking");
-  assert_different_registers(obj, hdr, tmp);
+  assert_different_registers(obj, temp1, temp2);
+
+  Label unlocked, push_and_slow;
+  const Register mark          = temp1;
+  const Register top           = temp2;
+  const int mark_offset        = oopDesc::mark_offset_in_bytes();
+  const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset();
 
 #ifdef ASSERT
-  {
-    // Check that hdr is lightweight-locked.
-    Label hdr_ok;
-    z_lgr(tmp, hdr);
-    z_nill(tmp, markWord::lock_mask_in_place);
-    z_bre(hdr_ok);
-    stop("Header is not lightweight-locked");
-    bind(hdr_ok);
-  }
   {
     // The following checks rely on the fact that LockStack is only ever modified by
     // its owning thread, even if the lock got inflated concurrently; removal of LockStack
     // entries after inflation will happen delayed in that case.
 
     // Check for lock-stack underflow.
-    Label stack_ok;
-    z_lgf(tmp, Address(Z_thread, JavaThread::lock_stack_top_offset()));
-    compareU32_and_branch(tmp, (unsigned)LockStack::start_offset(), Assembler::bcondHigh, stack_ok);
+    NearLabel stack_ok;
+    z_lgf(top, Address(Z_thread, ls_top_offset));
+    compareU32_and_branch(top, (unsigned)LockStack::start_offset(), bcondNotLow, stack_ok);
     stop("Lock-stack underflow");
     bind(stack_ok);
   }
-  {
-    // Check if the top of the lock-stack matches the unlocked object.
-    Label tos_ok;
-    z_aghi(tmp, -oopSize);
-    z_lg(tmp, Address(Z_thread, tmp));
-    compare64_and_branch(tmp, obj, Assembler::bcondEqual, tos_ok);
-    stop("Top of lock-stack does not match the unlocked object");
-    bind(tos_ok);
+#endif // ASSERT
+
+  // Check if obj is top of lock-stack.
+  z_lgf(top, Address(Z_thread, ls_top_offset));
+  z_aghi(top, -oopSize);
+  z_cg(obj, Address(Z_thread, top));
+  branch_optimized(bcondNotEqual, slow);
+
+  // pop object from lock-stack
+#ifdef ASSERT
+  const Register temp_top = temp1; // mark is not yet loaded, but be careful
+  z_agrk(temp_top, top, Z_thread);
+  z_xc(0, oopSize-1, temp_top, 0, temp_top);  // wipe out lock-stack entry
+#endif // ASSERT
+  z_alsi(in_bytes(ls_top_offset), Z_thread, -oopSize);  // pop object
+
+  // The underflow check is elided. The recursive check will always fail
+  // when the lock stack is empty because of the _bad_oop_sentinel field.
+
+  // Check if recursive. (this is a check for the 2nd object on the stack)
+  z_aghi(top, -oopSize);
+  z_cg(obj, Address(Z_thread, top));
+  branch_optimized(bcondEqual, unlocked);
+
+  // Not recursive. Check header for monitor (0b10).
+  z_lg(mark, Address(obj, mark_offset));
+  z_tmll(mark, markWord::monitor_value);
+  z_brnaz(push_and_slow);
+
+#ifdef ASSERT
+  // Check header not unlocked (0b01).
+  NearLabel not_unlocked;
+  z_tmll(mark, markWord::unlocked_value);
+  z_braz(not_unlocked);
+  stop("lightweight_unlock already unlocked");
+  bind(not_unlocked);
+#endif // ASSERT
+
+  { // Try to unlock. Transition lock bits 0b00 => 0b01
+    Register unlocked_obj = top;
+    z_lgr(unlocked_obj, mark);
+    z_oill(unlocked_obj, markWord::unlocked_value);
+    z_csg(mark, unlocked_obj, mark_offset, obj);
+    branch_optimized(Assembler::bcondEqual, unlocked);
   }
+
+  bind(push_and_slow);
+
+  // Restore lock-stack and handle the unlock in runtime.
+  z_lgf(top, Address(Z_thread, ls_top_offset));
+  DEBUG_ONLY(z_stg(obj, Address(Z_thread, top));)
+  z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize);
+  // set CC to NE
+  z_ltgr(obj, obj); // object shouldn't be null at this point
+  branch_optimized(bcondAlways, slow);
+
+  bind(unlocked);
+}
+
+void MacroAssembler::compiler_fast_lock_lightweight_object(Register obj, Register tmp1, Register tmp2) {
+  assert_different_registers(obj, tmp1, tmp2);
+
+  // Handle inflated monitor.
+  NearLabel inflated;
+  // Finish fast lock successfully. MUST reach to with flag == NE
+  NearLabel locked;
+  // Finish fast lock unsuccessfully. MUST branch to with flag == EQ
+  NearLabel slow_path;
+
+  if (DiagnoseSyncOnValueBasedClasses != 0) {
+    load_klass(tmp1, obj);
+    z_l(tmp1, Address(tmp1, Klass::access_flags_offset()));
+    assert((JVM_ACC_IS_VALUE_BASED_CLASS & 0xFFFF) == 0, "or change following instruction");
+    z_nilh(tmp1, JVM_ACC_IS_VALUE_BASED_CLASS >> 16);
+    z_brne(slow_path);
+  }
+
+  const Register mark          = tmp1;
+  const int mark_offset        = oopDesc::mark_offset_in_bytes();
+  const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset();
+
+  BLOCK_COMMENT("compiler_fast_lightweight_locking {");
+  { // lightweight locking
+
+    // Push lock to the lock stack and finish successfully. MUST reach to with flag == EQ
+    NearLabel push;
+
+    const Register top = tmp2;
+
+    // Check if lock-stack is full.
+    z_lgf(top, Address(Z_thread, ls_top_offset));
+    compareU32_and_branch(top, (unsigned) LockStack::end_offset() - 1, bcondHigh, slow_path);
+
+    // The underflow check is elided. The recursive check will always fail
+    // when the lock stack is empty because of the _bad_oop_sentinel field.
+
+    // Check if recursive.
+    z_aghi(top, -oopSize);
+    z_cg(obj, Address(Z_thread, top));
+    z_bre(push);
+
+    // Check for monitor (0b10)
+    z_lg(mark, Address(obj, mark_offset));
+    z_tmll(mark, markWord::monitor_value);
+    z_brnaz(inflated);
+
+    // not inflated
+
+    { // Try to lock. Transition lock bits 0b01 => 0b00
+      assert(mark_offset == 0, "required to avoid a lea");
+      const Register locked_obj = top;
+      z_oill(mark, markWord::unlocked_value);
+      z_lgr(locked_obj, mark);
+      // Clear lock-bits from locked_obj (locked state)
+      z_xilf(locked_obj, markWord::unlocked_value);
+      z_csg(mark, locked_obj, mark_offset, obj);
+      branch_optimized(Assembler::bcondNotEqual, slow_path);
+    }
+
+    bind(push);
+
+    // After successful lock, push object on lock-stack.
+    z_lgf(top, Address(Z_thread, ls_top_offset));
+    z_stg(obj, Address(Z_thread, top));
+    z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize);
+
+    z_cgr(obj, obj); // set the CC to EQ, as it could be changed by alsi
+    z_bru(locked);
+  }
+  BLOCK_COMMENT("} compiler_fast_lightweight_locking");
+
+  BLOCK_COMMENT("handle_inflated_monitor_lightweight_locking {");
+  { // Handle inflated monitor.
+    bind(inflated);
+
+    // mark contains the tagged ObjectMonitor*.
+    const Register tagged_monitor = mark;
+    const Register zero           = tmp2;
+
+    // Try to CAS m->owner from null to current thread.
+    // If m->owner is null, then csg succeeds and sets m->owner=THREAD and CR=EQ.
+    // Otherwise, register zero is filled with the current owner.
+    z_lghi(zero, 0);
+    z_csg(zero, Z_thread, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner), tagged_monitor);
+    z_bre(locked);
+
+    // Check if recursive.
+    z_cgr(Z_thread, zero); // zero contains the owner from z_csg instruction
+    z_brne(slow_path);
+
+    // Recursive
+    z_agsi(Address(tagged_monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(recursions)), 1ll);
+    z_cgr(zero, zero);
+    // z_bru(locked);
+    // Uncomment above line in the future, for now jump address is right next to us.
+  }
+  BLOCK_COMMENT("} handle_inflated_monitor_lightweight_locking");
+
+  bind(locked);
+
+#ifdef ASSERT
+  // Check that locked label is reached with flag == EQ.
+  NearLabel flag_correct;
+  z_bre(flag_correct);
+  stop("CC is not set to EQ, it should be - lock");
 #endif // ASSERT
 
-  z_lgr(tmp, hdr);
-  z_oill(tmp, markWord::unlocked_value);
-  z_csg(hdr, tmp, oopDesc::mark_offset_in_bytes(), obj);
-  branch_optimized(Assembler::bcondNotEqual, slow);
+  bind(slow_path);
+
+#ifdef ASSERT
+  // Check that slow_path label is reached with flag == NE.
+  z_brne(flag_correct);
+  stop("CC is not set to NE, it should be - lock");
+  bind(flag_correct);
+#endif // ASSERT
+
+  // C2 uses the value of flag (NE vs EQ) to determine the continuation.
+}
+
+void MacroAssembler::compiler_fast_unlock_lightweight_object(Register obj, Register tmp1, Register tmp2) {
+  assert_different_registers(obj, tmp1, tmp2);
 
-  // After successful unlock, pop object from lock-stack
+  // Handle inflated monitor.
+  NearLabel inflated, inflated_load_monitor;
+  // Finish fast unlock successfully. MUST reach to with flag == EQ.
+  NearLabel unlocked;
+  // Finish fast unlock unsuccessfully. MUST branch to with flag == NE.
+  NearLabel slow_path;
+
+  const Register mark          = tmp1;
+  const Register top           = tmp2;
+  const int mark_offset        = oopDesc::mark_offset_in_bytes();
+  const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset();
+
+  BLOCK_COMMENT("compiler_fast_lightweight_unlock {");
+  { // Lightweight Unlock
+
+    // Check if obj is top of lock-stack.
+    z_lgf(top, Address(Z_thread, ls_top_offset));
+
+    z_aghi(top, -oopSize);
+    z_cg(obj, Address(Z_thread, top));
+    branch_optimized(bcondNotEqual, inflated_load_monitor);
+
+    // Pop lock-stack.
 #ifdef ASSERT
-  z_lgf(tmp, Address(Z_thread, JavaThread::lock_stack_top_offset()));
-  z_aghi(tmp, -oopSize);
-  z_agr(tmp, Z_thread);
-  z_xc(0, oopSize-1, tmp, 0, tmp);  // wipe out lock-stack entry
+    const Register temp_top = tmp1; // let's not kill top here, we can use for recursive check
+    z_agrk(temp_top, top, Z_thread);
+    z_xc(0, oopSize-1, temp_top, 0, temp_top);  // wipe out lock-stack entry
 #endif
-  z_alsi(in_bytes(JavaThread::lock_stack_top_offset()), Z_thread, -oopSize);  // pop object
-  z_cr(tmp, tmp); // set CC to EQ
+    z_alsi(in_bytes(ls_top_offset), Z_thread, -oopSize);  // pop object
+
+    // The underflow check is elided. The recursive check will always fail
+    // when the lock stack is empty because of the _bad_oop_sentinel field.
+
+    // Check if recursive.
+    z_aghi(top, -oopSize);
+    z_cg(obj, Address(Z_thread, top));
+    z_bre(unlocked);
+
+    // Not recursive
+
+    // Check for monitor (0b10).
+    z_lg(mark, Address(obj, mark_offset));
+    z_tmll(mark, markWord::monitor_value);
+    z_brnaz(inflated);
+
+#ifdef ASSERT
+    // Check header not unlocked (0b01).
+    NearLabel not_unlocked;
+    z_tmll(mark, markWord::unlocked_value);
+    z_braz(not_unlocked);
+    stop("lightweight_unlock already unlocked");
+    bind(not_unlocked);
+#endif // ASSERT
+
+    { // Try to unlock. Transition lock bits 0b00 => 0b01
+      Register unlocked_obj = top;
+      z_lgr(unlocked_obj, mark);
+      z_oill(unlocked_obj, markWord::unlocked_value);
+      z_csg(mark, unlocked_obj, mark_offset, obj);
+      branch_optimized(Assembler::bcondEqual, unlocked);
+    }
+
+    // Restore lock-stack and handle the unlock in runtime.
+    z_lgf(top, Address(Z_thread, ls_top_offset));
+    DEBUG_ONLY(z_stg(obj, Address(Z_thread, top));)
+    z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize);
+    // set CC to NE
+    z_ltgr(obj, obj); // object is not null here
+    z_bru(slow_path);
+  }
+  BLOCK_COMMENT("} compiler_fast_lightweight_unlock");
+
+  { // Handle inflated monitor.
+
+    bind(inflated_load_monitor);
+
+    z_lg(mark, Address(obj, mark_offset));
+
+#ifdef ASSERT
+    z_tmll(mark, markWord::monitor_value);
+    z_brnaz(inflated);
+    stop("Fast Unlock not monitor");
+#endif // ASSERT
+
+    bind(inflated);
+
+#ifdef ASSERT
+    NearLabel check_done, loop;
+    z_lgf(top, Address(Z_thread, ls_top_offset));
+    bind(loop);
+    z_aghi(top, -oopSize);
+    compareU32_and_branch(top, in_bytes(JavaThread::lock_stack_base_offset()),
+                          bcondLow, check_done);
+    z_cg(obj, Address(Z_thread, top));
+    z_brne(loop);
+    stop("Fast Unlock lock on stack");
+    bind(check_done);
+#endif // ASSERT
+
+    // mark contains the tagged ObjectMonitor*.
+    const Register monitor = mark;
+
+    NearLabel not_recursive;
+    const Register recursions = tmp2;
+
+    // Check if recursive.
+    load_and_test_long(recursions, Address(monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(recursions)));
+    z_bre(not_recursive); // if 0 then jump, it's not recursive locking
+
+    // Recursive unlock
+    z_agsi(Address(monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(recursions)), -1ll);
+    z_cgr(monitor, monitor); // set the CC to EQUAL
+    z_bru(unlocked);
+
+    bind(not_recursive);
+
+    NearLabel not_ok;
+    // Check if the entry lists are empty.
+    load_and_test_long(tmp2, Address(monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(EntryList)));
+    z_brne(not_ok);
+    load_and_test_long(tmp2, Address(monitor, OM_OFFSET_NO_MONITOR_VALUE_TAG(cxq)));
+    z_brne(not_ok);
+
+    z_release();
+    z_stg(tmp2 /*=0*/, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner), monitor);
+
+    z_bru(unlocked); // CC = EQ here
+
+    bind(not_ok);
+
+    // The owner may be anonymous, and we removed the last obj entry in
+    // the lock-stack. This loses the information about the owner.
+    // Write the thread to the owner field so the runtime knows the owner.
+    z_stg(Z_thread, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner), monitor);
+    z_bru(slow_path); // CC = NE here
+  }
+
+  bind(unlocked);
+
+#ifdef ASSERT
+  // Check that unlocked label is reached with flag == EQ.
+  NearLabel flag_correct;
+  z_bre(flag_correct);
+  stop("CC is not set to EQ, it should be - unlock");
+#endif // ASSERT
+
+  bind(slow_path);
+
+#ifdef ASSERT
+  // Check that slow_path label is reached with flag == NE.
+  z_brne(flag_correct);
+  stop("CC is not set to NE, it should be - unlock");
+  bind(flag_correct);
+#endif // ASSERT
+
+  // C2 uses the value of flag (NE vs EQ) to determine the continuation.
+}
+
+void MacroAssembler::pop_count_int(Register r_dst, Register r_src, Register r_tmp) {
+  BLOCK_COMMENT("pop_count_int {");
+
+  assert(r_tmp != noreg, "temp register required for pop_count_int, as code may run on machine older than z15");
+  assert_different_registers(r_dst, r_tmp); // if r_src is same as r_tmp, it should be fine
+
+  if (VM_Version::has_MiscInstrExt3()) {
+    pop_count_int_with_ext3(r_dst, r_src);
+  } else {
+    pop_count_int_without_ext3(r_dst, r_src, r_tmp);
+  }
+
+  BLOCK_COMMENT("} pop_count_int");
+}
+
+void MacroAssembler::pop_count_long(Register r_dst, Register r_src, Register r_tmp) {
+  BLOCK_COMMENT("pop_count_long {");
+
+  assert(r_tmp != noreg, "temp register required for pop_count_long, as code may run on machine older than z15");
+  assert_different_registers(r_dst, r_tmp); // if r_src is same as r_tmp, it should be fine
+
+  if (VM_Version::has_MiscInstrExt3()) {
+    pop_count_long_with_ext3(r_dst, r_src);
+  } else {
+    pop_count_long_without_ext3(r_dst, r_src, r_tmp);
+  }
+
+  BLOCK_COMMENT("} pop_count_long");
+}
+
+void MacroAssembler::pop_count_int_without_ext3(Register r_dst, Register r_src, Register r_tmp) {
+  BLOCK_COMMENT("pop_count_int_without_ext3 {");
+
+  assert(r_tmp != noreg, "temp register required for popcnt, for machines < z15");
+  assert_different_registers(r_dst, r_tmp); // if r_src is same as r_tmp, it should be fine
+
+  z_popcnt(r_dst, r_src, 0);
+  z_srlg(r_tmp, r_dst, 16);
+  z_alr(r_dst, r_tmp);
+  z_srlg(r_tmp, r_dst, 8);
+  z_alr(r_dst, r_tmp);
+  z_llgcr(r_dst, r_dst);
+
+  BLOCK_COMMENT("} pop_count_int_without_ext3");
+}
+
+void MacroAssembler::pop_count_long_without_ext3(Register r_dst, Register r_src, Register r_tmp) {
+  BLOCK_COMMENT("pop_count_long_without_ext3 {");
+
+  assert(r_tmp != noreg, "temp register required for popcnt, for machines < z15");
+  assert_different_registers(r_dst, r_tmp); // if r_src is same as r_tmp, it should be fine
+
+  z_popcnt(r_dst, r_src, 0);
+  z_ahhlr(r_dst, r_dst, r_dst);
+  z_sllg(r_tmp, r_dst, 16);
+  z_algr(r_dst, r_tmp);
+  z_sllg(r_tmp, r_dst, 8);
+  z_algr(r_dst, r_tmp);
+  z_srlg(r_dst, r_dst, 56);
+
+  BLOCK_COMMENT("} pop_count_long_without_ext3");
+}
+
+void MacroAssembler::pop_count_long_with_ext3(Register r_dst, Register r_src) {
+  BLOCK_COMMENT("pop_count_long_with_ext3 {");
+
+  guarantee(VM_Version::has_MiscInstrExt3(),
+      "this hardware doesn't support miscellaneous-instruction-extensions facility 3, still pop_count_long_with_ext3 is used");
+  z_popcnt(r_dst, r_src, 8);
+
+  BLOCK_COMMENT("} pop_count_long_with_ext3");
+}
+
+void MacroAssembler::pop_count_int_with_ext3(Register r_dst, Register r_src) {
+  BLOCK_COMMENT("pop_count_int_with_ext3 {");
+
+  guarantee(VM_Version::has_MiscInstrExt3(),
+      "this hardware doesn't support miscellaneous-instruction-extensions facility 3, still pop_count_long_with_ext3 is used");
+  z_llgfr(r_dst, r_src);
+  z_popcnt(r_dst, r_dst, 8);
+
+  BLOCK_COMMENT("} pop_count_int_with_ext3");
 }
diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.hpp b/src/hotspot/cpu/s390/macroAssembler_s390.hpp
index 924583abdf5..684741d79db 100644
--- a/src/hotspot/cpu/s390/macroAssembler_s390.hpp
+++ b/src/hotspot/cpu/s390/macroAssembler_s390.hpp
@@ -1,6 +1,7 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2016, 2023 SAP SE. All rights reserved.
+ * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024 SAP SE. All rights reserved.
+ * Copyright (c) 2024 IBM Corporation. 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
@@ -726,8 +727,10 @@ class MacroAssembler: public Assembler {
 
   void compiler_fast_lock_object(Register oop, Register box, Register temp1, Register temp2);
   void compiler_fast_unlock_object(Register oop, Register box, Register temp1, Register temp2);
-  void lightweight_lock(Register obj, Register hdr, Register tmp, Label& slow);
-  void lightweight_unlock(Register obj, Register hdr, Register tmp, Label& slow);
+  void lightweight_lock(Register obj, Register tmp1, Register tmp2, Label& slow);
+  void lightweight_unlock(Register obj, Register tmp1, Register tmp2, Label& slow);
+  void compiler_fast_lock_lightweight_object(Register obj, Register tmp1, Register tmp2);
+  void compiler_fast_unlock_lightweight_object(Register obj, Register tmp1, Register tmp2);
 
   void resolve_jobject(Register value, Register tmp1, Register tmp2);
 
@@ -1021,6 +1024,19 @@ class MacroAssembler: public Assembler {
                        Register z,
                        Register tmp1, Register tmp2,
                        Register tmp3, Register tmp4, Register tmp5);
+
+  // These generate optimized code for all supported s390 implementations, and are preferred for most uses.
+  void pop_count_int(Register dst, Register src, Register tmp);
+  void pop_count_long(Register dst, Register src, Register tmp);
+
+  // For legacy (pre-z15) use, but will work on all supported s390 implementations.
+  void pop_count_int_without_ext3(Register dst, Register src, Register tmp);
+  void pop_count_long_without_ext3(Register dst, Register src, Register tmp);
+
+  // Only for use on z15 or later s390 implementations.
+  void pop_count_int_with_ext3(Register dst, Register src);
+  void pop_count_long_with_ext3(Register dst, Register src);
+
 };
 
 /**
diff --git a/src/hotspot/cpu/s390/nativeInst_s390.hpp b/src/hotspot/cpu/s390/nativeInst_s390.hpp
index 13f15224f8b..8003e1d42f2 100644
--- a/src/hotspot/cpu/s390/nativeInst_s390.hpp
+++ b/src/hotspot/cpu/s390/nativeInst_s390.hpp
@@ -212,6 +212,7 @@ class NativeCall: public NativeInstruction {
     call_far_pcrelative_displacement_alignment =  4
   };
 
+  static int byte_size() { return instruction_size; }
 
   // Maximum size (in bytes) of a call to an absolute address.
   // Used when emitting call to deopt handler blob, which is a
diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad
index 28cac16864d..0fe3840b9b5 100644
--- a/src/hotspot/cpu/s390/s390.ad
+++ b/src/hotspot/cpu/s390/s390.ad
@@ -9579,6 +9579,7 @@ instruct partialSubtypeCheck_vs_zero(flagsReg pcc, rarg2RegP sub, rarg3RegP supe
 // inlined locking and unlocking
 
 instruct cmpFastLock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
+  predicate(LockingMode != LM_LIGHTWEIGHT);
   match(Set pcc (FastLock oop box));
   effect(TEMP tmp1, TEMP tmp2);
   ins_cost(100);
@@ -9589,6 +9590,7 @@ instruct cmpFastLock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRe
 %}
 
 instruct cmpFastUnlock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
+  predicate(LockingMode != LM_LIGHTWEIGHT);
   match(Set pcc (FastUnlock oop box));
   effect(TEMP tmp1, TEMP tmp2);
   ins_cost(100);
@@ -9598,6 +9600,38 @@ instruct cmpFastUnlock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, i
   ins_pipe(pipe_class_dummy);
 %}
 
+instruct cmpFastLockLightweight(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
+  predicate(LockingMode == LM_LIGHTWEIGHT);
+  match(Set pcc (FastLock oop box));
+  effect(TEMP tmp1, TEMP tmp2);
+  ins_cost(100);
+  // TODO: s390 port size(VARIABLE_SIZE);
+  format %{ "FASTLOCK  $oop, $box; KILL Z_ARG4, Z_ARG5" %}
+  ins_encode %{
+    __ fast_lock_lightweight($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register);
+    // If locking was successful, cc should indicate 'EQ'.
+    // The compiler generates a branch to the runtime call to
+    // _complete_monitor_locking_Java for the case where cc is 'NE'.
+  %}
+  ins_pipe(pipe_class_dummy);
+%}
+
+instruct cmpFastUnlockLightweight(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
+  predicate(LockingMode == LM_LIGHTWEIGHT);
+  match(Set pcc (FastUnlock oop box));
+  effect(TEMP tmp1, TEMP tmp2);
+  ins_cost(100);
+  // TODO: s390 port size(FIXED_SIZE);
+  format %{ "FASTUNLOCK  $oop, $box; KILL Z_ARG4, Z_ARG5" %}
+  ins_encode %{
+    __ fast_unlock_lightweight($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register);
+    // If unlocking was successful, cc should indicate 'EQ'.
+    // The compiler generates a branch to the runtime call to
+    // _complete_monitor_unlocking_Java for the case where cc is 'NE'.
+  %}
+  ins_pipe(pipe_class_dummy);
+%}
+
 instruct inlineCallClearArrayConst(SSlenDW cnt, iRegP_N2P base, Universe dummy, flagsReg cr) %{
   match(Set dummy (ClearArray cnt base));
   effect(KILL cr);
@@ -10675,10 +10709,49 @@ instruct countTrailingZerosL(revenRegI dst, iRegL src, roddRegL tmp, flagsReg cr
 
 // bit count
 
+instruct popCountI_Ext3(iRegI dst, iRegI src, flagsReg cr) %{
+  match(Set dst (PopCountI src));
+  effect(TEMP_DEF dst, KILL cr);
+  predicate(UsePopCountInstruction &&
+            VM_Version::has_PopCount() &&
+            VM_Version::has_MiscInstrExt3());
+  ins_cost(DEFAULT_COST);
+  size(8); // popcnt + llgfr
+  format %{ "POPCNT  $dst,$src\t # pop count int" %}
+  ins_encode %{
+    Register Rdst = $dst$$Register;
+    Register Rsrc = $src$$Register;
+
+    __ pop_count_int_with_ext3(Rdst, Rsrc);
+
+  %}
+  ins_pipe(pipe_class_dummy);
+%}
+
+instruct popCountL_Ext3(iRegI dst, iRegL src, flagsReg cr) %{
+  match(Set dst (PopCountL src));
+  effect(TEMP_DEF dst, KILL cr);
+  predicate(UsePopCountInstruction &&
+            VM_Version::has_PopCount() &&
+            VM_Version::has_MiscInstrExt3());
+  ins_cost(DEFAULT_COST);
+  size(4); // popcnt
+  format %{ "POPCNT  $dst,$src\t # pop count long" %}
+  ins_encode %{
+    Register Rdst = $dst$$Register;
+    Register Rsrc = $src$$Register;
+
+    __ pop_count_long_with_ext3(Rdst, Rsrc);
+  %}
+  ins_pipe(pipe_class_dummy);
+%}
+
 instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
   match(Set dst (PopCountI src));
   effect(TEMP_DEF dst, TEMP tmp, KILL cr);
-  predicate(UsePopCountInstruction && VM_Version::has_PopCount());
+  predicate(UsePopCountInstruction &&
+            VM_Version::has_PopCount() &&
+            (!VM_Version::has_MiscInstrExt3()));
   ins_cost(DEFAULT_COST);
   size(24);
   format %{ "POPCNT  $dst,$src\t # pop count int" %}
@@ -10687,17 +10760,8 @@ instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
     Register Rsrc = $src$$Register;
     Register Rtmp = $tmp$$Register;
 
-    // Prefer compile-time assertion over run-time SIGILL.
-    assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI");
-    assert_different_registers(Rdst, Rtmp);
+    __ pop_count_int_without_ext3(Rdst, Rsrc, Rtmp);
 
-    // Version 2: shows 10%(z196) improvement over original.
-    __ z_popcnt(Rdst, Rsrc);
-    __ z_srlg(Rtmp, Rdst, 16); // calc  byte4+byte6 and byte5+byte7
-    __ z_alr(Rdst, Rtmp);      //   into byte6 and byte7
-    __ z_srlg(Rtmp, Rdst,  8); // calc (byte4+byte6) + (byte5+byte7)
-    __ z_alr(Rdst, Rtmp);      //   into byte7
-    __ z_llgcr(Rdst, Rdst);    // zero-extend sum
   %}
   ins_pipe(pipe_class_dummy);
 %}
@@ -10705,27 +10769,18 @@ instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
 instruct popCountL(iRegI dst, iRegL src, iRegL tmp, flagsReg cr) %{
   match(Set dst (PopCountL src));
   effect(TEMP_DEF dst, TEMP tmp, KILL cr);
-  predicate(UsePopCountInstruction && VM_Version::has_PopCount());
+  predicate(UsePopCountInstruction &&
+            VM_Version::has_PopCount() &&
+            (!VM_Version::has_MiscInstrExt3()));
   ins_cost(DEFAULT_COST);
-  // TODO: s390 port size(FIXED_SIZE);
+  size(34);
   format %{ "POPCNT  $dst,$src\t # pop count long" %}
   ins_encode %{
     Register Rdst = $dst$$Register;
     Register Rsrc = $src$$Register;
     Register Rtmp = $tmp$$Register;
 
-    // Prefer compile-time assertion over run-time SIGILL.
-    assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI");
-    assert_different_registers(Rdst, Rtmp);
-
-    // Original version. Using LA instead of algr seems to be a really bad idea (-35%).
-    __ z_popcnt(Rdst, Rsrc);
-    __ z_ahhlr(Rdst, Rdst, Rdst);
-    __ z_sllg(Rtmp, Rdst, 16);
-    __ z_algr(Rdst, Rtmp);
-    __ z_sllg(Rtmp, Rdst,  8);
-    __ z_algr(Rdst, Rtmp);
-    __ z_srlg(Rdst, Rdst, 56);
+    __ pop_count_long_without_ext3(Rdst, Rsrc, Rtmp);
   %}
   ins_pipe(pipe_class_dummy);
 %}
diff --git a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp
index 87cf9cb600c..0ee88345282 100644
--- a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp
+++ b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp
@@ -1711,8 +1711,13 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
     __ add2reg(r_box, lock_offset, Z_SP);
 
     // Try fastpath for locking.
-    // Fast_lock kills r_temp_1, r_temp_2.
-    __ compiler_fast_lock_object(r_oop, r_box, r_tmp1, r_tmp2);
+    if (LockingMode == LM_LIGHTWEIGHT) {
+      // Fast_lock kills r_temp_1, r_temp_2.
+      __ compiler_fast_lock_lightweight_object(r_oop, r_tmp1, r_tmp2);
+    } else {
+      // Fast_lock kills r_temp_1, r_temp_2.
+      __ compiler_fast_lock_object(r_oop, r_box, r_tmp1, r_tmp2);
+    }
     __ z_bre(done);
 
     //-------------------------------------------------------------------------
@@ -1910,8 +1915,13 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
     __ add2reg(r_box, lock_offset, Z_SP);
 
     // Try fastpath for unlocking.
-    // Fast_unlock kills r_tmp1, r_tmp2.
-    __ compiler_fast_unlock_object(r_oop, r_box, r_tmp1, r_tmp2);
+    if (LockingMode == LM_LIGHTWEIGHT) {
+      // Fast_unlock kills r_tmp1, r_tmp2.
+      __ compiler_fast_unlock_lightweight_object(r_oop, r_tmp1, r_tmp2);
+    } else {
+      // Fast_unlock kills r_tmp1, r_tmp2.
+      __ compiler_fast_unlock_object(r_oop, r_box, r_tmp1, r_tmp2);
+    }
     __ z_bre(done);
 
     // Slow path for unlocking.
diff --git a/src/hotspot/cpu/s390/templateTable_s390.cpp b/src/hotspot/cpu/s390/templateTable_s390.cpp
index 02b9405ad31..ef68a5ac83a 100644
--- a/src/hotspot/cpu/s390/templateTable_s390.cpp
+++ b/src/hotspot/cpu/s390/templateTable_s390.cpp
@@ -3976,8 +3976,7 @@ void TemplateTable::_new() {
     __ store_klass_gap(Rzero, RallocatedObject);  // Zero klass gap for compressed oops.
     __ store_klass(iklass, RallocatedObject);     // Store klass last.
 
-    {
-      SkipIfEqual skip(_masm, &DTraceAllocProbes, false, Z_ARG5 /*scratch*/);
+    if (DTraceAllocProbes) {
       // Trigger dtrace event for fastpath.
       __ push(atos); // Save the return value.
       __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)), RallocatedObject);
diff --git a/src/hotspot/cpu/s390/vm_version_s390.hpp b/src/hotspot/cpu/s390/vm_version_s390.hpp
index 7ac60a10ae7..4f963c4e485 100644
--- a/src/hotspot/cpu/s390/vm_version_s390.hpp
+++ b/src/hotspot/cpu/s390/vm_version_s390.hpp
@@ -413,6 +413,8 @@ class VM_Version: public Abstract_VM_Version {
   // s390 supports fast class initialization checks
   static bool supports_fast_class_init_checks() { return true; }
 
+  constexpr static bool supports_recursive_lightweight_locking() { return true; }
+
   // CPU feature query functions
   static const char* get_model_string()       { return _model_string; }
   static bool has_StoreFacilityListExtended() { return  (_features[0] & StoreFacilityListExtendedMask) == StoreFacilityListExtendedMask; }
diff --git a/src/hotspot/cpu/x86/assembler_x86.cpp b/src/hotspot/cpu/x86/assembler_x86.cpp
index b02cca92cd4..001ff472f40 100644
--- a/src/hotspot/cpu/x86/assembler_x86.cpp
+++ b/src/hotspot/cpu/x86/assembler_x86.cpp
@@ -842,7 +842,7 @@ address Assembler::locate_operand(address inst, WhichOperand which) {
 
   case REX2:
     NOT_LP64(assert(false, "64bit prefixes"));
-    if ((0xFF & *ip++) & REXBIT_W) {
+    if ((0xFF & *ip++) & REX2BIT_W) {
       is_64bit = true;
     }
     goto again_after_prefix;
@@ -899,7 +899,7 @@ address Assembler::locate_operand(address inst, WhichOperand which) {
 
     case REX2:
       NOT_LP64(assert(false, "64bit prefix found"));
-      if ((0xFF & *ip++) & REXBIT_W) {
+      if ((0xFF & *ip++) & REX2BIT_W) {
         is_64bit = true;
       }
       goto again_after_size_prefix2;
@@ -4498,7 +4498,7 @@ void Assembler::ud2() {
 
 void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
   assert(VM_Version::supports_sse4_2(), "");
-  assert(!needs_eevex(src.base(), src.index()), "does not support extended gprs");
+  assert(!needs_eevex(src.base(), src.index()), "does not support extended gprs as BASE or INDEX of address operand");
   InstructionMark im(this);
   InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
   simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
@@ -5893,6 +5893,71 @@ void Assembler::evpunpckhqdq(XMMRegister dst, KRegister mask, XMMRegister src1,
   emit_int16(0x6D, (0xC0 | encode));
 }
 
+#ifdef _LP64
+void Assembler::push2(Register src1, Register src2, bool with_ppx) {
+  assert(VM_Version::supports_apx_f(), "requires APX");
+  InstructionAttr attributes(0, /* rex_w */ with_ppx, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+  /* EVEX.BASE */
+  int src_enc = src1->encoding();
+  /* EVEX.VVVV */
+  int nds_enc = src2->encoding();
+
+  bool vex_b = (src_enc & 8) == 8;
+  bool evex_v = (nds_enc >= 16);
+  bool evex_b = (src_enc >= 16);
+
+  // EVEX.ND = 1;
+  attributes.set_extended_context();
+  attributes.set_is_evex_instruction();
+  set_attributes(&attributes);
+
+  evex_prefix(0, vex_b, 0, 0, evex_b, evex_v, false /*eevex_x*/, nds_enc, VEX_SIMD_NONE, /* map4 */ VEX_OPCODE_0F_3C);
+  emit_int16(0xFF, (0xC0 | (0x6 << 3) | (src_enc & 7)));
+}
+
+void Assembler::pop2(Register src1, Register src2, bool with_ppx) {
+  assert(VM_Version::supports_apx_f(), "requires APX");
+  InstructionAttr attributes(0, /* rex_w */ with_ppx, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+  /* EVEX.BASE */
+  int src_enc = src1->encoding();
+  /* EVEX.VVVV */
+  int nds_enc = src2->encoding();
+
+  bool vex_b = (src_enc & 8) == 8;
+  bool evex_v = (nds_enc >= 16);
+  bool evex_b = (src_enc >= 16);
+
+  // EVEX.ND = 1;
+  attributes.set_extended_context();
+  attributes.set_is_evex_instruction();
+  set_attributes(&attributes);
+
+  evex_prefix(0, vex_b, 0, 0, evex_b, evex_v, false /*eevex_x*/, nds_enc, VEX_SIMD_NONE, /* map4 */ VEX_OPCODE_0F_3C);
+  emit_int16(0x8F, (0xC0 | (src_enc & 7)));
+}
+
+void Assembler::push2p(Register src1, Register src2) {
+  push2(src1, src2, true);
+}
+
+void Assembler::pop2p(Register src1, Register src2) {
+  pop2(src1, src2, true);
+}
+
+void Assembler::pushp(Register src) {
+  assert(VM_Version::supports_apx_f(), "requires APX");
+  int encode = prefixq_and_encode_rex2(src->encoding());
+  emit_int8(0x50 | encode);
+}
+
+void Assembler::popp(Register dst) {
+  assert(VM_Version::supports_apx_f(), "requires APX");
+  int encode = prefixq_and_encode_rex2(dst->encoding());
+  emit_int8((unsigned char)0x58 | encode);
+}
+#endif //_LP64
+
+
 void Assembler::push(int32_t imm32) {
   // in 64bits we push 64bits onto the stack but only
   // take a 32bit immediate
@@ -7207,6 +7272,7 @@ void Assembler::vroundpd(XMMRegister dst, XMMRegister src, int32_t rmode, int ve
 
 void Assembler::vroundpd(XMMRegister dst, Address src, int32_t rmode,  int vector_len) {
   assert(VM_Version::supports_avx(), "");
+  assert(!needs_eevex(src.base(), src.index()), "does not support extended gprs as BASE or INDEX of address operand");
   InstructionMark im(this);
   InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
   vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
@@ -11011,6 +11077,7 @@ void Assembler::evpbroadcastq(XMMRegister dst, Register src, int vector_len) {
 
 void Assembler::vpgatherdd(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {
   assert(VM_Version::supports_avx2(), "");
+  assert(!needs_eevex(src.base()), "does not support extended gprs as BASE of address operand");
   assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");
   assert(dst != xnoreg, "sanity");
   assert(src.isxmmindex(),"expected to be xmm index");
@@ -11024,6 +11091,7 @@ void Assembler::vpgatherdd(XMMRegister dst, Address src, XMMRegister mask, int v
 
 void Assembler::vpgatherdq(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {
   assert(VM_Version::supports_avx2(), "");
+  assert(!needs_eevex(src.base()), "does not support extended gprs as BASE of address operand");
   assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");
   assert(dst != xnoreg, "sanity");
   assert(src.isxmmindex(),"expected to be xmm index");
@@ -11037,6 +11105,7 @@ void Assembler::vpgatherdq(XMMRegister dst, Address src, XMMRegister mask, int v
 
 void Assembler::vgatherdpd(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {
   assert(VM_Version::supports_avx2(), "");
+  assert(!needs_eevex(src.base()), "does not support extended gprs as BASE of address operand");
   assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");
   assert(dst != xnoreg, "sanity");
   assert(src.isxmmindex(),"expected to be xmm index");
@@ -11050,6 +11119,7 @@ void Assembler::vgatherdpd(XMMRegister dst, Address src, XMMRegister mask, int v
 
 void Assembler::vgatherdps(XMMRegister dst, Address src, XMMRegister mask, int vector_len) {
   assert(VM_Version::supports_avx2(), "");
+  assert(!needs_eevex(src.base()), "does not support extended gprs as BASE of address operand");
   assert(vector_len == Assembler::AVX_128bit || vector_len == Assembler::AVX_256bit, "");
   assert(dst != xnoreg, "sanity");
   assert(src.isxmmindex(),"expected to be xmm index");
@@ -11808,7 +11878,6 @@ void Assembler::evex_prefix(bool vex_r, bool vex_b, bool vex_x, bool evex_r, boo
       _attributes->get_embedded_opmask_register_specifier() != 0) {
     byte4 |= (_attributes->is_clear_context() ? EVEX_Z : 0);
   }
-
   emit_int32(EVEX_4bytes, byte2, byte3, byte4);
 }
 
@@ -12921,14 +12990,14 @@ void Assembler::emit_data64(jlong data,
 int Assembler::get_base_prefix_bits(int enc) {
   int bits = 0;
   if (enc & 16) bits |= REX2BIT_B4;
-  if (enc & 8) bits |= REXBIT_B;
+  if (enc & 8) bits |= REX2BIT_B;
   return bits;
 }
 
 int Assembler::get_index_prefix_bits(int enc) {
   int bits = 0;
   if (enc & 16) bits |= REX2BIT_X4;
-  if (enc & 8) bits |= REXBIT_X;
+  if (enc & 8) bits |= REX2BIT_X;
   return bits;
 }
 
@@ -12943,7 +13012,7 @@ int Assembler::get_index_prefix_bits(Register index) {
 int Assembler::get_reg_prefix_bits(int enc) {
   int bits = 0;
   if (enc & 16) bits |= REX2BIT_R4;
-  if (enc & 8) bits |= REXBIT_R;
+  if (enc & 8) bits |= REX2BIT_R;
   return bits;
 }
 
@@ -13181,6 +13250,15 @@ bool Assembler::prefix_is_rex2(int prefix) {
   return (prefix & 0xFF00) == WREX2;
 }
 
+int Assembler::get_prefixq_rex2(Address adr, bool is_map1) {
+  assert(UseAPX, "APX features not enabled");
+  int bits = REX2BIT_W;
+  if (is_map1) bits |= REX2BIT_M0;
+  bits |= get_base_prefix_bits(adr.base());
+  bits |= get_index_prefix_bits(adr.index());
+  return WREX2 | bits;
+}
+
 int Assembler::get_prefixq(Address adr, bool is_map1) {
   if (adr.base_needs_rex2() || adr.index_needs_rex2()) {
     return get_prefixq_rex2(adr, is_map1);
@@ -13190,15 +13268,6 @@ int Assembler::get_prefixq(Address adr, bool is_map1) {
   return is_map1 ? (((int16_t)prfx) << 8) | 0x0F : (int16_t)prfx;
 }
 
-int Assembler::get_prefixq_rex2(Address adr, bool is_map1) {
-  assert(UseAPX, "APX features not enabled");
-  int bits = REXBIT_W;
-  if (is_map1) bits |= REX2BIT_M0;
-  bits |= get_base_prefix_bits(adr.base());
-  bits |= get_index_prefix_bits(adr.index());
-  return WREX2 | bits;
-}
-
 int Assembler::get_prefixq(Address adr, Register src, bool is_map1) {
   if (adr.base_needs_rex2() || adr.index_needs_rex2() || src->encoding() >= 16) {
     return get_prefixq_rex2(adr, src, is_map1);
@@ -13243,7 +13312,7 @@ int Assembler::get_prefixq(Address adr, Register src, bool is_map1) {
 
 int Assembler::get_prefixq_rex2(Address adr, Register src, bool is_map1) {
   assert(UseAPX, "APX features not enabled");
-  int bits = REXBIT_W;
+  int bits = REX2BIT_W;
   if (is_map1) bits |= REX2BIT_M0;
   bits |= get_base_prefix_bits(adr.base());
   bits |= get_index_prefix_bits(adr.index());
@@ -13306,7 +13375,7 @@ void Assembler::prefixq(Address adr, XMMRegister src) {
 }
 
 void Assembler::prefixq_rex2(Address adr, XMMRegister src) {
-  int bits = REXBIT_W;
+  int bits = REX2BIT_W;
   bits |= get_base_prefix_bits(adr.base());
   bits |= get_index_prefix_bits(adr.index());
   bits |= get_reg_prefix_bits(src->encoding());
@@ -13329,7 +13398,7 @@ int Assembler::prefixq_and_encode(int reg_enc, bool is_map1) {
 
 
 int Assembler::prefixq_and_encode_rex2(int reg_enc, bool is_map1) {
-  prefix16(WREX2 | REXBIT_W | (is_map1 ? REX2BIT_M0: 0) | get_base_prefix_bits(reg_enc));
+  prefix16(WREX2 | REX2BIT_W | (is_map1 ? REX2BIT_M0: 0) | get_base_prefix_bits(reg_enc));
   return reg_enc & 0x7;
 }
 
@@ -13358,7 +13427,7 @@ int Assembler::prefixq_and_encode(int dst_enc, int src_enc, bool is_map1) {
 }
 
 int Assembler::prefixq_and_encode_rex2(int dst_enc, int src_enc, bool is_map1) {
-  int init_bits = REXBIT_W | (is_map1 ? REX2BIT_M0 : 0);
+  int init_bits = REX2BIT_W | (is_map1 ? REX2BIT_M0 : 0);
   return prefix_and_encode_rex2(dst_enc, src_enc, init_bits);
 }
 
@@ -14168,7 +14237,7 @@ void Assembler::precompute_instructions() {
   ResourceMark rm;
 
   // Make a temporary buffer big enough for the routines we're capturing
-  int size = 256;
+  int size = UseAPX ? 512 : 256;
   char* tmp_code = NEW_RESOURCE_ARRAY(char, size);
   CodeBuffer buffer((address)tmp_code, size);
   MacroAssembler masm(&buffer);
@@ -14212,31 +14281,6 @@ static void emit_copy(CodeSection* code_section, u_char* src, int src_len) {
   code_section->set_end(end + src_len);
 }
 
-void Assembler::popa() { // 64bit
-  emit_copy(code_section(), popa_code, popa_len);
-}
-
-void Assembler::popa_uncached() { // 64bit
-  movq(r15, Address(rsp, 0));
-  movq(r14, Address(rsp, wordSize));
-  movq(r13, Address(rsp, 2 * wordSize));
-  movq(r12, Address(rsp, 3 * wordSize));
-  movq(r11, Address(rsp, 4 * wordSize));
-  movq(r10, Address(rsp, 5 * wordSize));
-  movq(r9,  Address(rsp, 6 * wordSize));
-  movq(r8,  Address(rsp, 7 * wordSize));
-  movq(rdi, Address(rsp, 8 * wordSize));
-  movq(rsi, Address(rsp, 9 * wordSize));
-  movq(rbp, Address(rsp, 10 * wordSize));
-  // Skip rsp as it is restored automatically to the value
-  // before the corresponding pusha when popa is done.
-  movq(rbx, Address(rsp, 12 * wordSize));
-  movq(rdx, Address(rsp, 13 * wordSize));
-  movq(rcx, Address(rsp, 14 * wordSize));
-  movq(rax, Address(rsp, 15 * wordSize));
-
-  addq(rsp, 16 * wordSize);
-}
 
 // Does not actually store the value of rsp on the stack.
 // The slot for rsp just contains an arbitrary value.
@@ -14247,26 +14291,107 @@ void Assembler::pusha() { // 64bit
 // Does not actually store the value of rsp on the stack.
 // The slot for rsp just contains an arbitrary value.
 void Assembler::pusha_uncached() { // 64bit
-  subq(rsp, 16 * wordSize);
-
-  movq(Address(rsp, 15 * wordSize), rax);
-  movq(Address(rsp, 14 * wordSize), rcx);
-  movq(Address(rsp, 13 * wordSize), rdx);
-  movq(Address(rsp, 12 * wordSize), rbx);
-  // Skip rsp as the value is normally not used. There are a few places where
-  // the original value of rsp needs to be known but that can be computed
-  // from the value of rsp immediately after pusha (rsp + 16 * wordSize).
-  movq(Address(rsp, 10 * wordSize), rbp);
-  movq(Address(rsp, 9 * wordSize), rsi);
-  movq(Address(rsp, 8 * wordSize), rdi);
-  movq(Address(rsp, 7 * wordSize), r8);
-  movq(Address(rsp, 6 * wordSize), r9);
-  movq(Address(rsp, 5 * wordSize), r10);
-  movq(Address(rsp, 4 * wordSize), r11);
-  movq(Address(rsp, 3 * wordSize), r12);
-  movq(Address(rsp, 2 * wordSize), r13);
-  movq(Address(rsp, wordSize), r14);
-  movq(Address(rsp, 0), r15);
+  if (UseAPX) {
+    // Data being pushed by PUSH2 must be 16B-aligned on the stack, for this push rax upfront
+    // and use it as a temporary register for stack alignment.
+    pushp(rax);
+    // Move original stack pointer to RAX and align stack pointer to 16B boundary.
+    movq(rax, rsp);
+    andq(rsp, -(StackAlignmentInBytes));
+    // Push pair of original stack pointer along with remaining registers
+    // at 16B aligned boundary.
+    push2p(rax, r31);
+    push2p(r30, r29);
+    push2p(r28, r27);
+    push2p(r26, r25);
+    push2p(r24, r23);
+    push2p(r22, r21);
+    push2p(r20, r19);
+    push2p(r18, r17);
+    push2p(r16, r15);
+    push2p(r14, r13);
+    push2p(r12, r11);
+    push2p(r10, r9);
+    push2p(r8, rdi);
+    push2p(rsi, rbp);
+    push2p(rbx, rdx);
+    // To maintain 16 byte alignment after rcx is pushed.
+    subq(rsp, 8);
+    pushp(rcx);
+  } else {
+    subq(rsp, 16 * wordSize);
+    movq(Address(rsp, 15 * wordSize), rax);
+    movq(Address(rsp, 14 * wordSize), rcx);
+    movq(Address(rsp, 13 * wordSize), rdx);
+    movq(Address(rsp, 12 * wordSize), rbx);
+    // Skip rsp as the value is normally not used. There are a few places where
+    // the original value of rsp needs to be known but that can be computed
+    // from the value of rsp immediately after pusha (rsp + 16 * wordSize).
+    // FIXME: For APX any such direct access should also consider EGPR size
+    // during address compution.
+    movq(Address(rsp, 10 * wordSize), rbp);
+    movq(Address(rsp, 9 * wordSize), rsi);
+    movq(Address(rsp, 8 * wordSize), rdi);
+    movq(Address(rsp, 7 * wordSize), r8);
+    movq(Address(rsp, 6 * wordSize), r9);
+    movq(Address(rsp, 5 * wordSize), r10);
+    movq(Address(rsp, 4 * wordSize), r11);
+    movq(Address(rsp, 3 * wordSize), r12);
+    movq(Address(rsp, 2 * wordSize), r13);
+    movq(Address(rsp, wordSize), r14);
+    movq(Address(rsp, 0), r15);
+  }
+}
+
+void Assembler::popa() { // 64bit
+  emit_copy(code_section(), popa_code, popa_len);
+}
+
+void Assembler::popa_uncached() { // 64bit
+  if (UseAPX) {
+    popp(rcx);
+    addq(rsp, 8);
+    // Data being popped by POP2 must be 16B-aligned on the stack.
+    pop2p(rdx, rbx);
+    pop2p(rbp, rsi);
+    pop2p(rdi, r8);
+    pop2p(r9, r10);
+    pop2p(r11, r12);
+    pop2p(r13, r14);
+    pop2p(r15, r16);
+    pop2p(r17, r18);
+    pop2p(r19, r20);
+    pop2p(r21, r22);
+    pop2p(r23, r24);
+    pop2p(r25, r26);
+    pop2p(r27, r28);
+    pop2p(r29, r30);
+    // Popped value in RAX holds original unaligned stack pointer.
+    pop2p(r31, rax);
+    // Reinstantiate original stack pointer.
+    movq(rsp, rax);
+    popp(rax);
+  } else {
+    movq(r15, Address(rsp, 0));
+    movq(r14, Address(rsp, wordSize));
+    movq(r13, Address(rsp, 2 * wordSize));
+    movq(r12, Address(rsp, 3 * wordSize));
+    movq(r11, Address(rsp, 4 * wordSize));
+    movq(r10, Address(rsp, 5 * wordSize));
+    movq(r9,  Address(rsp, 6 * wordSize));
+    movq(r8,  Address(rsp, 7 * wordSize));
+    movq(rdi, Address(rsp, 8 * wordSize));
+    movq(rsi, Address(rsp, 9 * wordSize));
+    movq(rbp, Address(rsp, 10 * wordSize));
+    // Skip rsp as it is restored automatically to the value
+    // before the corresponding pusha when popa is done.
+    movq(rbx, Address(rsp, 12 * wordSize));
+    movq(rdx, Address(rsp, 13 * wordSize));
+    movq(rcx, Address(rsp, 14 * wordSize));
+    movq(rax, Address(rsp, 15 * wordSize));
+
+    addq(rsp, 16 * wordSize);
+  }
 }
 
 void Assembler::vzeroupper() {
diff --git a/src/hotspot/cpu/x86/assembler_x86.hpp b/src/hotspot/cpu/x86/assembler_x86.hpp
index 41a63924828..28457b7005b 100644
--- a/src/hotspot/cpu/x86/assembler_x86.hpp
+++ b/src/hotspot/cpu/x86/assembler_x86.hpp
@@ -530,14 +530,16 @@ class Assembler : public AbstractAssembler  {
   };
 
   enum PrefixBits {
-    REXBIT_B  = 0x01,
-    REXBIT_X  = 0x02,
-    REXBIT_R  = 0x04,
-    REXBIT_W  = 0x08,
+    REX2BIT_B  = 0x01,
+    REX2BIT_X  = 0x02,
+    REX2BIT_R  = 0x04,
+    REX2BIT_W  = 0x08,
     REX2BIT_B4 = 0x10,
     REX2BIT_X4 = 0x20,
     REX2BIT_R4 = 0x40,
-    REX2BIT_M0 = 0x80
+    REX2BIT_M0 = 0x80,
+    REX2BIT_WB = 0x09,
+    REX2BIT_WB4 = 0x18,
   };
 
   enum VexPrefix {
@@ -1017,6 +1019,15 @@ class Assembler : public AbstractAssembler  {
 
   void pusha_uncached();
   void popa_uncached();
+
+  // APX ISA extensions for register save/restore optimizations.
+  void push2(Register src1, Register src2, bool with_ppx = false);
+  void pop2(Register src1, Register src2, bool with_ppx = false);
+  void push2p(Register src1, Register src2);
+  void pop2p(Register src1, Register src2);
+  void pushp(Register src);
+  void popp(Register src);
+
 #endif
   void vzeroupper_uncached();
   void decq(Register dst);
@@ -3070,7 +3081,6 @@ class InstructionAttr {
   }
 
   void set_extended_context(void) { _is_extended_context = true; }
-
 };
 
 #endif // CPU_X86_ASSEMBLER_X86_HPP
diff --git a/src/hotspot/cpu/x86/c1_Defs_x86.hpp b/src/hotspot/cpu/x86/c1_Defs_x86.hpp
index 28da99cdf27..e7ec63f83a7 100644
--- a/src/hotspot/cpu/x86/c1_Defs_x86.hpp
+++ b/src/hotspot/cpu/x86/c1_Defs_x86.hpp
@@ -39,7 +39,7 @@ enum {
 
 // registers
 enum {
-  pd_nof_cpu_regs_frame_map = Register::number_of_registers,       // number of registers used during code emission
+  pd_nof_cpu_regs_frame_map = NOT_LP64(8) LP64_ONLY(16),           // number of registers used during code emission
   pd_nof_fpu_regs_frame_map = FloatRegister::number_of_registers,  // number of registers used during code emission
   pd_nof_xmm_regs_frame_map = XMMRegister::number_of_registers,    // number of registers used during code emission
 
diff --git a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp
index 978708d03e6..e2fde10b98d 100644
--- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp
+++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp
@@ -2836,7 +2836,7 @@ void LIR_Assembler::align_call(LIR_Code code) {
     offset += NativeCall::displacement_offset;
     break;
   case lir_icvirtual_call:
-    offset += NativeCall::displacement_offset + NativeMovConstReg::instruction_size;
+    offset += NativeCall::displacement_offset + NativeMovConstReg::instruction_size_rex;
     break;
   default: ShouldNotReachHere();
   }
@@ -2873,7 +2873,7 @@ void LIR_Assembler::emit_static_call_stub() {
   int start = __ offset();
 
   // make sure that the displacement word of the call ends up word aligned
-  __ align(BytesPerWord, __ offset() + NativeMovConstReg::instruction_size + NativeCall::displacement_offset);
+  __ align(BytesPerWord, __ offset() + NativeMovConstReg::instruction_size_rex + NativeCall::displacement_offset);
   __ relocate(static_stub_Relocation::spec(call_pc));
   __ mov_metadata(rbx, (Metadata*)nullptr);
   // must be set to -1 at code generation time
diff --git a/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp b/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp
index 2c24c0c2cfb..dc051127fea 100644
--- a/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp
+++ b/src/hotspot/cpu/x86/c1_Runtime1_x86.cpp
@@ -420,7 +420,12 @@ static OopMap* generate_oop_map(StubAssembler* sasm, int num_rt_args,
 void C1_MacroAssembler::save_live_registers_no_oop_map(bool save_fpu_registers) {
   __ block_comment("save_live_registers");
 
-  __ pusha();         // integer registers
+  // Push CPU state in multiple of 16 bytes
+#ifdef _LP64
+  __ save_legacy_gprs();
+#else
+  __ pusha();
+#endif
 
   // assert(float_regs_as_doubles_off % 2 == 0, "misaligned offset");
   // assert(xmm_regs_as_doubles_off % 2 == 0, "misaligned offset");
@@ -560,7 +565,12 @@ void C1_MacroAssembler::restore_live_registers(bool restore_fpu_registers) {
   __ block_comment("restore_live_registers");
 
   restore_fpu(this, restore_fpu_registers);
+#ifdef _LP64
+  __ restore_legacy_gprs();
+#else
   __ popa();
+#endif
+
 }
 
 
diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp
index 50f957aef99..66a782ba9c6 100644
--- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp
+++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp
@@ -172,310 +172,6 @@ inline Assembler::AvxVectorLen C2_MacroAssembler::vector_length_encoding(int vle
   }
 }
 
-#if INCLUDE_RTM_OPT
-
-// Update rtm_counters based on abort status
-// input: abort_status
-//        rtm_counters (RTMLockingCounters*)
-// flags are killed
-void C2_MacroAssembler::rtm_counters_update(Register abort_status, Register rtm_counters) {
-
-  atomic_incptr(Address(rtm_counters, RTMLockingCounters::abort_count_offset()));
-  if (PrintPreciseRTMLockingStatistics) {
-    for (int i = 0; i < RTMLockingCounters::ABORT_STATUS_LIMIT; i++) {
-      Label check_abort;
-      testl(abort_status, (1<<i));
-      jccb(Assembler::equal, check_abort);
-      atomic_incptr(Address(rtm_counters, RTMLockingCounters::abortX_count_offset() + (i * sizeof(uintx))));
-      bind(check_abort);
-    }
-  }
-}
-
-// Branch if (random & (count-1) != 0), count is 2^n
-// tmp, scr and flags are killed
-void C2_MacroAssembler::branch_on_random_using_rdtsc(Register tmp, Register scr, int count, Label& brLabel) {
-  assert(tmp == rax, "");
-  assert(scr == rdx, "");
-  rdtsc(); // modifies EDX:EAX
-  andptr(tmp, count-1);
-  jccb(Assembler::notZero, brLabel);
-}
-
-// Perform abort ratio calculation, set no_rtm bit if high ratio
-// input:  rtm_counters_Reg (RTMLockingCounters* address)
-// tmpReg, rtm_counters_Reg and flags are killed
-void C2_MacroAssembler::rtm_abort_ratio_calculation(Register tmpReg,
-                                                    Register rtm_counters_Reg,
-                                                    RTMLockingCounters* rtm_counters,
-                                                    Metadata* method_data) {
-  Label L_done, L_check_always_rtm1, L_check_always_rtm2;
-
-  if (RTMLockingCalculationDelay > 0) {
-    // Delay calculation
-    movptr(tmpReg, ExternalAddress((address) RTMLockingCounters::rtm_calculation_flag_addr()));
-    testptr(tmpReg, tmpReg);
-    jccb(Assembler::equal, L_done);
-  }
-  // Abort ratio calculation only if abort_count > RTMAbortThreshold
-  //   Aborted transactions = abort_count * 100
-  //   All transactions = total_count *  RTMTotalCountIncrRate
-  //   Set no_rtm bit if (Aborted transactions >= All transactions * RTMAbortRatio)
-
-  movptr(tmpReg, Address(rtm_counters_Reg, RTMLockingCounters::abort_count_offset()));
-  cmpptr(tmpReg, RTMAbortThreshold);
-  jccb(Assembler::below, L_check_always_rtm2);
-  imulptr(tmpReg, tmpReg, 100);
-
-  Register scrReg = rtm_counters_Reg;
-  movptr(scrReg, Address(rtm_counters_Reg, RTMLockingCounters::total_count_offset()));
-  imulptr(scrReg, scrReg, RTMTotalCountIncrRate);
-  imulptr(scrReg, scrReg, RTMAbortRatio);
-  cmpptr(tmpReg, scrReg);
-  jccb(Assembler::below, L_check_always_rtm1);
-  if (method_data != nullptr) {
-    // set rtm_state to "no rtm" in MDO
-    mov_metadata(tmpReg, method_data);
-    lock();
-    orl(Address(tmpReg, MethodData::rtm_state_offset()), NoRTM);
-  }
-  jmpb(L_done);
-  bind(L_check_always_rtm1);
-  // Reload RTMLockingCounters* address
-  lea(rtm_counters_Reg, ExternalAddress((address)rtm_counters));
-  bind(L_check_always_rtm2);
-  movptr(tmpReg, Address(rtm_counters_Reg, RTMLockingCounters::total_count_offset()));
-  cmpptr(tmpReg, RTMLockingThreshold / RTMTotalCountIncrRate);
-  jccb(Assembler::below, L_done);
-  if (method_data != nullptr) {
-    // set rtm_state to "always rtm" in MDO
-    mov_metadata(tmpReg, method_data);
-    lock();
-    orl(Address(tmpReg, MethodData::rtm_state_offset()), UseRTM);
-  }
-  bind(L_done);
-}
-
-// Update counters and perform abort ratio calculation
-// input:  abort_status_Reg
-// rtm_counters_Reg, flags are killed
-void C2_MacroAssembler::rtm_profiling(Register abort_status_Reg,
-                                      Register rtm_counters_Reg,
-                                      RTMLockingCounters* rtm_counters,
-                                      Metadata* method_data,
-                                      bool profile_rtm) {
-
-  assert(rtm_counters != nullptr, "should not be null when profiling RTM");
-  // update rtm counters based on rax value at abort
-  // reads abort_status_Reg, updates flags
-  lea(rtm_counters_Reg, ExternalAddress((address)rtm_counters));
-  rtm_counters_update(abort_status_Reg, rtm_counters_Reg);
-  if (profile_rtm) {
-    // Save abort status because abort_status_Reg is used by following code.
-    if (RTMRetryCount > 0) {
-      push(abort_status_Reg);
-    }
-    assert(rtm_counters != nullptr, "should not be null when profiling RTM");
-    rtm_abort_ratio_calculation(abort_status_Reg, rtm_counters_Reg, rtm_counters, method_data);
-    // restore abort status
-    if (RTMRetryCount > 0) {
-      pop(abort_status_Reg);
-    }
-  }
-}
-
-// Retry on abort if abort's status is 0x6: can retry (0x2) | memory conflict (0x4)
-// inputs: retry_count_Reg
-//       : abort_status_Reg
-// output: retry_count_Reg decremented by 1
-// flags are killed
-void C2_MacroAssembler::rtm_retry_lock_on_abort(Register retry_count_Reg, Register abort_status_Reg, Label& retryLabel) {
-  Label doneRetry;
-  assert(abort_status_Reg == rax, "");
-  // The abort reason bits are in eax (see all states in rtmLocking.hpp)
-  // 0x6 = conflict on which we can retry (0x2) | memory conflict (0x4)
-  // if reason is in 0x6 and retry count != 0 then retry
-  andptr(abort_status_Reg, 0x6);
-  jccb(Assembler::zero, doneRetry);
-  testl(retry_count_Reg, retry_count_Reg);
-  jccb(Assembler::zero, doneRetry);
-  pause();
-  decrementl(retry_count_Reg);
-  jmp(retryLabel);
-  bind(doneRetry);
-}
-
-// Spin and retry if lock is busy,
-// inputs: box_Reg (monitor address)
-//       : retry_count_Reg
-// output: retry_count_Reg decremented by 1
-//       : clear z flag if retry count exceeded
-// tmp_Reg, scr_Reg, flags are killed
-void C2_MacroAssembler::rtm_retry_lock_on_busy(Register retry_count_Reg, Register box_Reg,
-                                               Register tmp_Reg, Register scr_Reg, Label& retryLabel) {
-  Label SpinLoop, SpinExit, doneRetry;
-  int owner_offset = OM_OFFSET_NO_MONITOR_VALUE_TAG(owner);
-
-  testl(retry_count_Reg, retry_count_Reg);
-  jccb(Assembler::zero, doneRetry);
-  decrementl(retry_count_Reg);
-  movptr(scr_Reg, RTMSpinLoopCount);
-
-  bind(SpinLoop);
-  pause();
-  decrementl(scr_Reg);
-  jccb(Assembler::lessEqual, SpinExit);
-  movptr(tmp_Reg, Address(box_Reg, owner_offset));
-  testptr(tmp_Reg, tmp_Reg);
-  jccb(Assembler::notZero, SpinLoop);
-
-  bind(SpinExit);
-  jmp(retryLabel);
-  bind(doneRetry);
-  incrementl(retry_count_Reg); // clear z flag
-}
-
-// Use RTM for normal stack locks
-// Input: objReg (object to lock)
-void C2_MacroAssembler::rtm_stack_locking(Register objReg, Register tmpReg, Register scrReg,
-                                         Register retry_on_abort_count_Reg,
-                                         RTMLockingCounters* stack_rtm_counters,
-                                         Metadata* method_data, bool profile_rtm,
-                                         Label& DONE_LABEL, Label& IsInflated) {
-  assert(UseRTMForStackLocks, "why call this otherwise?");
-  assert(tmpReg == rax, "");
-  assert(scrReg == rdx, "");
-  Label L_rtm_retry, L_decrement_retry, L_on_abort;
-
-  if (RTMRetryCount > 0) {
-    movl(retry_on_abort_count_Reg, RTMRetryCount); // Retry on abort
-    bind(L_rtm_retry);
-  }
-  movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes()));
-  testptr(tmpReg, markWord::monitor_value);  // inflated vs stack-locked|neutral
-  jcc(Assembler::notZero, IsInflated);
-
-  if (PrintPreciseRTMLockingStatistics || profile_rtm) {
-    Label L_noincrement;
-    if (RTMTotalCountIncrRate > 1) {
-      // tmpReg, scrReg and flags are killed
-      branch_on_random_using_rdtsc(tmpReg, scrReg, RTMTotalCountIncrRate, L_noincrement);
-    }
-    assert(stack_rtm_counters != nullptr, "should not be null when profiling RTM");
-    atomic_incptr(ExternalAddress((address)stack_rtm_counters->total_count_addr()), scrReg);
-    bind(L_noincrement);
-  }
-  xbegin(L_on_abort);
-  movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes()));       // fetch markword
-  andptr(tmpReg, markWord::lock_mask_in_place);     // look at 2 lock bits
-  cmpptr(tmpReg, markWord::unlocked_value);         // bits = 01 unlocked
-  jcc(Assembler::equal, DONE_LABEL);        // all done if unlocked
-
-  Register abort_status_Reg = tmpReg; // status of abort is stored in RAX
-  if (UseRTMXendForLockBusy) {
-    xend();
-    movptr(abort_status_Reg, 0x2);   // Set the abort status to 2 (so we can retry)
-    jmp(L_decrement_retry);
-  }
-  else {
-    xabort(0);
-  }
-  bind(L_on_abort);
-  if (PrintPreciseRTMLockingStatistics || profile_rtm) {
-    rtm_profiling(abort_status_Reg, scrReg, stack_rtm_counters, method_data, profile_rtm);
-  }
-  bind(L_decrement_retry);
-  if (RTMRetryCount > 0) {
-    // retry on lock abort if abort status is 'can retry' (0x2) or 'memory conflict' (0x4)
-    rtm_retry_lock_on_abort(retry_on_abort_count_Reg, abort_status_Reg, L_rtm_retry);
-  }
-}
-
-// Use RTM for inflating locks
-// inputs: objReg (object to lock)
-//         boxReg (on-stack box address (displaced header location) - KILLED)
-//         tmpReg (ObjectMonitor address + markWord::monitor_value)
-void C2_MacroAssembler::rtm_inflated_locking(Register objReg, Register boxReg, Register tmpReg,
-                                            Register scrReg, Register retry_on_busy_count_Reg,
-                                            Register retry_on_abort_count_Reg,
-                                            RTMLockingCounters* rtm_counters,
-                                            Metadata* method_data, bool profile_rtm,
-                                            Label& DONE_LABEL) {
-  assert(UseRTMLocking, "why call this otherwise?");
-  assert(tmpReg == rax, "");
-  assert(scrReg == rdx, "");
-  Label L_rtm_retry, L_decrement_retry, L_on_abort;
-  int owner_offset = OM_OFFSET_NO_MONITOR_VALUE_TAG(owner);
-
-  movptr(Address(boxReg, 0), checked_cast<int32_t>(markWord::unused_mark().value()));
-  movptr(boxReg, tmpReg); // Save ObjectMonitor address
-
-  if (RTMRetryCount > 0) {
-    movl(retry_on_busy_count_Reg, RTMRetryCount);  // Retry on lock busy
-    movl(retry_on_abort_count_Reg, RTMRetryCount); // Retry on abort
-    bind(L_rtm_retry);
-  }
-  if (PrintPreciseRTMLockingStatistics || profile_rtm) {
-    Label L_noincrement;
-    if (RTMTotalCountIncrRate > 1) {
-      // tmpReg, scrReg and flags are killed
-      branch_on_random_using_rdtsc(tmpReg, scrReg, RTMTotalCountIncrRate, L_noincrement);
-    }
-    assert(rtm_counters != nullptr, "should not be null when profiling RTM");
-    atomic_incptr(ExternalAddress((address)rtm_counters->total_count_addr()), scrReg);
-    bind(L_noincrement);
-  }
-  xbegin(L_on_abort);
-  movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes()));
-  movptr(tmpReg, Address(tmpReg, owner_offset));
-  testptr(tmpReg, tmpReg);
-  jcc(Assembler::zero, DONE_LABEL);
-  if (UseRTMXendForLockBusy) {
-    xend();
-    jmp(L_decrement_retry);
-  }
-  else {
-    xabort(0);
-  }
-  bind(L_on_abort);
-  Register abort_status_Reg = tmpReg; // status of abort is stored in RAX
-  if (PrintPreciseRTMLockingStatistics || profile_rtm) {
-    rtm_profiling(abort_status_Reg, scrReg, rtm_counters, method_data, profile_rtm);
-  }
-  if (RTMRetryCount > 0) {
-    // retry on lock abort if abort status is 'can retry' (0x2) or 'memory conflict' (0x4)
-    rtm_retry_lock_on_abort(retry_on_abort_count_Reg, abort_status_Reg, L_rtm_retry);
-  }
-
-  movptr(tmpReg, Address(boxReg, owner_offset)) ;
-  testptr(tmpReg, tmpReg) ;
-  jccb(Assembler::notZero, L_decrement_retry) ;
-
-  // Appears unlocked - try to swing _owner from null to non-null.
-  // Invariant: tmpReg == 0.  tmpReg is EAX which is the implicit cmpxchg comparand.
-#ifdef _LP64
-  Register threadReg = r15_thread;
-#else
-  get_thread(scrReg);
-  Register threadReg = scrReg;
-#endif
-  lock();
-  cmpxchgptr(threadReg, Address(boxReg, owner_offset)); // Updates tmpReg
-
-  if (RTMRetryCount > 0) {
-    // success done else retry
-    jccb(Assembler::equal, DONE_LABEL) ;
-    bind(L_decrement_retry);
-    // Spin and retry if lock is busy.
-    rtm_retry_lock_on_busy(retry_on_busy_count_Reg, boxReg, tmpReg, scrReg, L_rtm_retry);
-  }
-  else {
-    bind(L_decrement_retry);
-  }
-}
-
-#endif //  INCLUDE_RTM_OPT
-
 // fast_lock and fast_unlock used by C2
 
 // Because the transitions from emitted code to the runtime
@@ -554,21 +250,13 @@ void C2_MacroAssembler::rtm_inflated_locking(Register objReg, Register boxReg, R
 // scr: tmp -- KILLED
 void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmpReg,
                                  Register scrReg, Register cx1Reg, Register cx2Reg, Register thread,
-                                 RTMLockingCounters* rtm_counters,
-                                 RTMLockingCounters* stack_rtm_counters,
-                                 Metadata* method_data,
-                                 bool use_rtm, bool profile_rtm) {
+                                 Metadata* method_data) {
   assert(LockingMode != LM_LIGHTWEIGHT, "lightweight locking should use fast_lock_lightweight");
   // Ensure the register assignments are disjoint
   assert(tmpReg == rax, "");
-
-  if (use_rtm) {
-    assert_different_registers(objReg, boxReg, tmpReg, scrReg, cx1Reg, cx2Reg);
-  } else {
-    assert(cx1Reg == noreg, "");
-    assert(cx2Reg == noreg, "");
-    assert_different_registers(objReg, boxReg, tmpReg, scrReg);
-  }
+  assert(cx1Reg == noreg, "");
+  assert(cx2Reg == noreg, "");
+  assert_different_registers(objReg, boxReg, tmpReg, scrReg);
 
   // Possible cases that we'll encounter in fast_lock
   // ------------------------------------------------
@@ -594,15 +282,6 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp
     jcc(Assembler::notZero, DONE_LABEL);
   }
 
-#if INCLUDE_RTM_OPT
-  if (UseRTMForStackLocks && use_rtm) {
-    assert(LockingMode != LM_MONITOR, "LockingMode == 0 (LM_MONITOR) and +UseRTMForStackLocks are mutually exclusive");
-    rtm_stack_locking(objReg, tmpReg, scrReg, cx2Reg,
-                      stack_rtm_counters, method_data, profile_rtm,
-                      DONE_LABEL, IsInflated);
-  }
-#endif // INCLUDE_RTM_OPT
-
   movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes()));          // [FETCH]
   testptr(tmpReg, markWord::monitor_value); // inflated vs stack-locked|neutral
   jcc(Assembler::notZero, IsInflated);
@@ -632,14 +311,6 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp
   bind(IsInflated);
   // The object is inflated. tmpReg contains pointer to ObjectMonitor* + markWord::monitor_value
 
-#if INCLUDE_RTM_OPT
-  // Use the same RTM locking code in 32- and 64-bit VM.
-  if (use_rtm) {
-    rtm_inflated_locking(objReg, boxReg, tmpReg, scrReg, cx1Reg, cx2Reg,
-                         rtm_counters, method_data, profile_rtm, DONE_LABEL);
-  } else {
-#endif // INCLUDE_RTM_OPT
-
 #ifndef _LP64
   // The object is inflated.
 
@@ -700,9 +371,6 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp
   incq(Address(scrReg, OM_OFFSET_NO_MONITOR_VALUE_TAG(recursions)));
   xorq(rax, rax); // Set ZF = 1 (success) for recursive lock, denoting locking success
 #endif // _LP64
-#if INCLUDE_RTM_OPT
-  } // use_rtm()
-#endif
   bind(DONE_LABEL);
 
   // ZFlag == 1 count in fast path
@@ -755,27 +423,13 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp
 // A perfectly viable alternative is to elide the owner check except when
 // Xcheck:jni is enabled.
 
-void C2_MacroAssembler::fast_unlock(Register objReg, Register boxReg, Register tmpReg, bool use_rtm) {
+void C2_MacroAssembler::fast_unlock(Register objReg, Register boxReg, Register tmpReg) {
   assert(LockingMode != LM_LIGHTWEIGHT, "lightweight locking should use fast_unlock_lightweight");
   assert(boxReg == rax, "");
   assert_different_registers(objReg, boxReg, tmpReg);
 
   Label DONE_LABEL, Stacked, COUNT, NO_COUNT;
 
-#if INCLUDE_RTM_OPT
-  if (UseRTMForStackLocks && use_rtm) {
-    assert(LockingMode != LM_MONITOR, "LockingMode == 0 (LM_MONITOR) and +UseRTMForStackLocks are mutually exclusive");
-    Label L_regular_unlock;
-    movptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes())); // fetch markword
-    andptr(tmpReg, markWord::lock_mask_in_place);                     // look at 2 lock bits
-    cmpptr(tmpReg, markWord::unlocked_value);                         // bits = 01 unlocked
-    jccb(Assembler::notEqual, L_regular_unlock);                      // if !HLE RegularLock
-    xend();                                                           // otherwise end...
-    jmp(DONE_LABEL);                                                  // ... and we're done
-    bind(L_regular_unlock);
-  }
-#endif
-
   if (LockingMode == LM_LEGACY) {
     cmpptr(Address(boxReg, 0), NULL_WORD);                            // Examine the displaced header
     jcc   (Assembler::zero, COUNT);                                   // 0 indicates recursive stack-lock
@@ -788,19 +442,6 @@ void C2_MacroAssembler::fast_unlock(Register objReg, Register boxReg, Register t
 
   // It's inflated.
 
-#if INCLUDE_RTM_OPT
-  if (use_rtm) {
-    Label L_regular_inflated_unlock;
-    int owner_offset = OM_OFFSET_NO_MONITOR_VALUE_TAG(owner);
-    movptr(boxReg, Address(tmpReg, owner_offset));
-    testptr(boxReg, boxReg);
-    jccb(Assembler::notZero, L_regular_inflated_unlock);
-    xend();
-    jmp(DONE_LABEL);
-    bind(L_regular_inflated_unlock);
-  }
-#endif
-
   // Despite our balanced locking property we still check that m->_owner == Self
   // as java routines or native JNI code called by this thread might
   // have released the lock.
@@ -4491,13 +4132,21 @@ void C2_MacroAssembler::count_positives(Register ary1, Register len,
 // Compare char[] or byte[] arrays aligned to 4 bytes or substrings.
 void C2_MacroAssembler::arrays_equals(bool is_array_equ, Register ary1, Register ary2,
                                       Register limit, Register result, Register chr,
-                                      XMMRegister vec1, XMMRegister vec2, bool is_char, KRegister mask) {
+                                      XMMRegister vec1, XMMRegister vec2, bool is_char,
+                                      KRegister mask, bool expand_ary2) {
+  // for expand_ary2, limit is the (smaller) size of the second array.
   ShortBranchVerifier sbv(this);
   Label TRUE_LABEL, FALSE_LABEL, DONE, COMPARE_VECTORS, COMPARE_CHAR, COMPARE_BYTE;
 
+  assert((!expand_ary2) || ((expand_ary2) && (UseAVX == 2)),
+         "Expansion only implemented for AVX2");
+
   int length_offset  = arrayOopDesc::length_offset_in_bytes();
   int base_offset    = arrayOopDesc::base_offset_in_bytes(is_char ? T_CHAR : T_BYTE);
 
+  Address::ScaleFactor scaleFactor = expand_ary2 ? Address::times_2 : Address::times_1;
+  int scaleIncr = expand_ary2 ? 8 : 16;
+
   if (is_array_equ) {
     // Check the input args
     cmpoop(ary1, ary2);
@@ -4533,14 +4182,20 @@ void C2_MacroAssembler::arrays_equals(bool is_array_equ, Register ary1, Register
 
   if (UseAVX >= 2) {
     // With AVX2, use 32-byte vector compare
-    Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
+    Label COMPARE_WIDE_VECTORS, COMPARE_WIDE_VECTORS_16, COMPARE_TAIL, COMPARE_TAIL_16;
 
     // Compare 32-byte vectors
-    andl(result, 0x0000001f);  //   tail count (in bytes)
-    andl(limit, 0xffffffe0);   // vector count (in bytes)
-    jcc(Assembler::zero, COMPARE_TAIL);
+    if (expand_ary2) {
+      andl(result, 0x0000000f);  //   tail count (in bytes)
+      andl(limit, 0xfffffff0);   // vector count (in bytes)
+      jcc(Assembler::zero, COMPARE_TAIL);
+    } else {
+      andl(result, 0x0000001f);  //   tail count (in bytes)
+      andl(limit, 0xffffffe0);   // vector count (in bytes)
+      jcc(Assembler::zero, COMPARE_TAIL_16);
+    }
 
-    lea(ary1, Address(ary1, limit, Address::times_1));
+    lea(ary1, Address(ary1, limit, scaleFactor));
     lea(ary2, Address(ary2, limit, Address::times_1));
     negptr(limit);
 
@@ -4583,25 +4238,59 @@ void C2_MacroAssembler::arrays_equals(bool is_array_equ, Register ary1, Register
     }//if (VM_Version::supports_avx512vlbw())
 #endif //_LP64
     bind(COMPARE_WIDE_VECTORS);
-    vmovdqu(vec1, Address(ary1, limit, Address::times_1));
-    vmovdqu(vec2, Address(ary2, limit, Address::times_1));
+    vmovdqu(vec1, Address(ary1, limit, scaleFactor));
+    if (expand_ary2) {
+      vpmovzxbw(vec2, Address(ary2, limit, Address::times_1), Assembler::AVX_256bit);
+    } else {
+      vmovdqu(vec2, Address(ary2, limit, Address::times_1));
+    }
     vpxor(vec1, vec2);
 
     vptest(vec1, vec1);
     jcc(Assembler::notZero, FALSE_LABEL);
-    addptr(limit, 32);
+    addptr(limit, scaleIncr * 2);
     jcc(Assembler::notZero, COMPARE_WIDE_VECTORS);
 
     testl(result, result);
     jcc(Assembler::zero, TRUE_LABEL);
 
-    vmovdqu(vec1, Address(ary1, result, Address::times_1, -32));
-    vmovdqu(vec2, Address(ary2, result, Address::times_1, -32));
+    vmovdqu(vec1, Address(ary1, result, scaleFactor, -32));
+    if (expand_ary2) {
+      vpmovzxbw(vec2, Address(ary2, result, Address::times_1, -16), Assembler::AVX_256bit);
+    } else {
+      vmovdqu(vec2, Address(ary2, result, Address::times_1, -32));
+    }
     vpxor(vec1, vec2);
 
     vptest(vec1, vec1);
-    jccb(Assembler::notZero, FALSE_LABEL);
-    jmpb(TRUE_LABEL);
+    jcc(Assembler::notZero, FALSE_LABEL);
+    jmp(TRUE_LABEL);
+
+    bind(COMPARE_TAIL_16); // limit is zero
+    movl(limit, result);
+
+    // Compare 16-byte chunks
+    andl(result, 0x0000000f);  //   tail count (in bytes)
+    andl(limit, 0xfffffff0);   // vector count (in bytes)
+    jcc(Assembler::zero, COMPARE_TAIL);
+
+    lea(ary1, Address(ary1, limit, scaleFactor));
+    lea(ary2, Address(ary2, limit, Address::times_1));
+    negptr(limit);
+
+    bind(COMPARE_WIDE_VECTORS_16);
+    movdqu(vec1, Address(ary1, limit, scaleFactor));
+    if (expand_ary2) {
+      vpmovzxbw(vec2, Address(ary2, limit, Address::times_1), Assembler::AVX_128bit);
+    } else {
+      movdqu(vec2, Address(ary2, limit, Address::times_1));
+    }
+    pxor(vec1, vec2);
+
+    ptest(vec1, vec1);
+    jcc(Assembler::notZero, FALSE_LABEL);
+    addptr(limit, scaleIncr);
+    jcc(Assembler::notZero, COMPARE_WIDE_VECTORS_16);
 
     bind(COMPARE_TAIL); // limit is zero
     movl(limit, result);
@@ -4646,19 +4335,34 @@ void C2_MacroAssembler::arrays_equals(bool is_array_equ, Register ary1, Register
   }
 
   // Compare 4-byte vectors
-  andl(limit, 0xfffffffc); // vector count (in bytes)
-  jccb(Assembler::zero, COMPARE_CHAR);
+  if (expand_ary2) {
+    testl(result, result);
+    jccb(Assembler::zero, TRUE_LABEL);
+  } else {
+    andl(limit, 0xfffffffc); // vector count (in bytes)
+    jccb(Assembler::zero, COMPARE_CHAR);
+  }
 
-  lea(ary1, Address(ary1, limit, Address::times_1));
+  lea(ary1, Address(ary1, limit, scaleFactor));
   lea(ary2, Address(ary2, limit, Address::times_1));
   negptr(limit);
 
   bind(COMPARE_VECTORS);
-  movl(chr, Address(ary1, limit, Address::times_1));
-  cmpl(chr, Address(ary2, limit, Address::times_1));
-  jccb(Assembler::notEqual, FALSE_LABEL);
-  addptr(limit, 4);
-  jcc(Assembler::notZero, COMPARE_VECTORS);
+  if (expand_ary2) {
+    // There are no "vector" operations for bytes to shorts
+    movzbl(chr, Address(ary2, limit, Address::times_1));
+    cmpw(Address(ary1, limit, Address::times_2), chr);
+    jccb(Assembler::notEqual, FALSE_LABEL);
+    addptr(limit, 1);
+    jcc(Assembler::notZero, COMPARE_VECTORS);
+    jmp(TRUE_LABEL);
+  } else {
+    movl(chr, Address(ary1, limit, Address::times_1));
+    cmpl(chr, Address(ary2, limit, Address::times_1));
+    jccb(Assembler::notEqual, FALSE_LABEL);
+    addptr(limit, 4);
+    jcc(Assembler::notZero, COMPARE_VECTORS);
+  }
 
   // Compare trailing char (final 2 bytes), if any
   bind(COMPARE_CHAR);
diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp
index 8c22990892b..e268ed3dd7a 100644
--- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp
+++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp
@@ -37,39 +37,13 @@
   // See full description in macroAssembler_x86.cpp.
   void fast_lock(Register obj, Register box, Register tmp,
                  Register scr, Register cx1, Register cx2, Register thread,
-                 RTMLockingCounters* rtm_counters,
-                 RTMLockingCounters* stack_rtm_counters,
-                 Metadata* method_data,
-                 bool use_rtm, bool profile_rtm);
-  void fast_unlock(Register obj, Register box, Register tmp, bool use_rtm);
+                 Metadata* method_data);
+  void fast_unlock(Register obj, Register box, Register tmp);
 
   void fast_lock_lightweight(Register obj, Register box, Register rax_reg,
                              Register t, Register thread);
   void fast_unlock_lightweight(Register obj, Register reg_rax, Register t, Register thread);
 
-#if INCLUDE_RTM_OPT
-  void rtm_counters_update(Register abort_status, Register rtm_counters);
-  void branch_on_random_using_rdtsc(Register tmp, Register scr, int count, Label& brLabel);
-  void rtm_abort_ratio_calculation(Register tmp, Register rtm_counters_reg,
-                                   RTMLockingCounters* rtm_counters,
-                                   Metadata* method_data);
-  void rtm_profiling(Register abort_status_Reg, Register rtm_counters_Reg,
-                     RTMLockingCounters* rtm_counters, Metadata* method_data, bool profile_rtm);
-  void rtm_retry_lock_on_abort(Register retry_count, Register abort_status, Label& retryLabel);
-  void rtm_retry_lock_on_busy(Register retry_count, Register box, Register tmp, Register scr, Label& retryLabel);
-  void rtm_stack_locking(Register obj, Register tmp, Register scr,
-                         Register retry_on_abort_count,
-                         RTMLockingCounters* stack_rtm_counters,
-                         Metadata* method_data, bool profile_rtm,
-                         Label& DONE_LABEL, Label& IsInflated);
-  void rtm_inflated_locking(Register obj, Register box, Register tmp,
-                            Register scr, Register retry_on_busy_count,
-                            Register retry_on_abort_count,
-                            RTMLockingCounters* rtm_counters,
-                            Metadata* method_data, bool profile_rtm,
-                            Label& DONE_LABEL);
-#endif
-
   // Generic instructions support for use in .ad files C2 code generation
   void vabsnegd(int opcode, XMMRegister dst, XMMRegister src);
   void vabsnegd(int opcode, XMMRegister dst, XMMRegister src, int vector_len);
@@ -289,10 +263,11 @@
   void count_positives(Register ary1, Register len,
                        Register result, Register tmp1,
                        XMMRegister vec1, XMMRegister vec2, KRegister mask1 = knoreg, KRegister mask2 = knoreg);
+
   // Compare char[] or byte[] arrays.
-  void arrays_equals(bool is_array_equ, Register ary1, Register ary2,
-                     Register limit, Register result, Register chr,
-                     XMMRegister vec1, XMMRegister vec2, bool is_char, KRegister mask = knoreg);
+  void arrays_equals(bool is_array_equ, Register ary1, Register ary2, Register limit,
+                     Register result, Register chr, XMMRegister vec1, XMMRegister vec2,
+                     bool is_char, KRegister mask = knoreg, bool expand_ary2 = false);
 
   void arrays_hashcode(Register str1, Register cnt1, Register result,
                        Register tmp1, Register tmp2, Register tmp3, XMMRegister vnext,
diff --git a/src/hotspot/cpu/x86/c2_stubGenerator_x86_64_string.cpp b/src/hotspot/cpu/x86/c2_stubGenerator_x86_64_string.cpp
new file mode 100644
index 00000000000..34f8bec8d11
--- /dev/null
+++ b/src/hotspot/cpu/x86/c2_stubGenerator_x86_64_string.cpp
@@ -0,0 +1,1837 @@
+/*
+ * Copyright (c) 2024, Intel Corporation. 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "macroAssembler_x86.hpp"
+#include "stubGenerator_x86_64.hpp"
+#include "opto/c2_MacroAssembler.hpp"
+#include "opto/intrinsicnode.hpp"
+
+/******************************************************************************/
+//                     String handling intrinsics
+//                     --------------------------
+//
+// Currently implements scheme described in http://0x80.pl/articles/simd-strfind.html
+// Implementation can be found at https://github.com/WojciechMula/sse4-strstr
+//
+// The general idea is as follows:
+// 1. Broadcast the first byte of the needle to a ymm register (32 bytes)
+// 2. Broadcast the last byte of the needle to a different ymm register
+// 3. Compare the first-byte ymm register to the first 32 bytes of the haystack
+// 4. Compare the last-byte register to the 32 bytes of the haystack at the (k-1)st position
+//    where k is the length of the needle
+// 5. Logically AND the results of the comparison
+//
+// The result of the AND yields the position within the haystack where both the first
+// and last bytes of the needle exist in their correct relative positions.  Check the full
+// needle value against the haystack to confirm a match.
+//
+// This implementation uses memcmp to compare when the size of the needle is >= 32 bytes.
+// For other needle sizes, the comparison is done with register compares to eliminate the
+// overhead of the call (including range checks, etc.).  The size of the comparison is
+// known, and it is also known to be safe reading the haystack for the full width of the needle.
+//
+// The original algorithm as implemented will potentially read past the end of the haystack.
+// This implementation protects against that.  Instead of reading as many 32-byte chunks as
+// possible and then handling the tail, we calculate the last position of a vaild 32-byte
+// read and adjust the starting position of the second read such that the last read will not
+// go beyond the end of the haystack.  So the first comparison is to the first 32 bytes of the
+// haystack, and the second is offset by an amount to make the last read legal.  The remainder of
+// the comparisons are done incrementing by 32 bytes.
+//
+// This will cause 16 bytes on average to be examined twice, but that is cheaper than the
+// logic required for tail processing.
+//
+/******************************************************************************/
+
+#define __ _masm->
+#define __C2 ((C2_MacroAssembler *) _masm)->
+
+// Register definitions for consistency
+// These registers can be counted on to always contain
+// the correct values (once set up)
+#define XMM_BYTE_0 xmm0
+#define XMM_BYTE_K xmm1
+#define XMM_BYTE_1 xmm12
+#define save_r12 xmm4
+#define save_r13 xmm5
+#define save_r14 xmm6
+#define save_r15 xmm7
+#define save_rbx xmm8
+#define nMinusK r10
+
+// Global temporary xmm registers
+#define XMM_TMP1 xmm15
+#define XMM_TMP2 xmm14
+#define XMM_TMP3 xmm2
+#define XMM_TMP4 xmm3
+
+//  This macro handles clearing the bits of the mask register depending
+//  on whether we're comparing bytes or words.
+#define CLEAR_BIT(mask) \
+  if (isU) {                 \
+    __ blsrl(mask, mask);     \
+    __ blsrl(mask, mask);     \
+  } else {                   \
+    __ blsrl(mask, mask);    \
+  }
+
+#define NUMBER_OF_CASES 10
+
+#undef STACK_SPACE
+#undef MAX_NEEDLE_LEN_TO_EXPAND
+#define MAX_NEEDLE_LEN_TO_EXPAND 0x28
+
+// Stack layout:
+#  define COPIED_HAYSTACK_STACK_OFFSET (0x0)  // MUST BE ZERO!
+#  define COPIED_HAYSTACK_STACK_SIZE (64)     // MUST BE 64!
+
+#  define EXPANDED_NEEDLE_STACK_OFFSET (COPIED_HAYSTACK_STACK_OFFSET + COPIED_HAYSTACK_STACK_SIZE)
+#  define EXPANDED_NEEDLE_STACK_SIZE (MAX_NEEDLE_LEN_TO_EXPAND * 2 + 32)
+
+#  define SAVED_HAYSTACK_STACK_OFFSET (EXPANDED_NEEDLE_STACK_OFFSET + EXPANDED_NEEDLE_STACK_SIZE)
+#  define SAVED_HAYSTACK_STACK_SIZE (8)
+
+#  define SAVED_INCREMENT_STACK_OFFSET (SAVED_HAYSTACK_STACK_OFFSET + SAVED_HAYSTACK_STACK_SIZE)
+#  define SAVED_INCREMENT_STACK_SIZE (8)
+
+#  define SAVED_TERM_ADDR_STACK_OFFSET (SAVED_INCREMENT_STACK_OFFSET + SAVED_INCREMENT_STACK_SIZE)
+#  define SAVED_TERM_ADDR_STACK_SIZE (8)
+
+#  define STACK_SPACE                                                                                                  \
+    (COPIED_HAYSTACK_STACK_SIZE + EXPANDED_NEEDLE_STACK_SIZE + SAVED_HAYSTACK_STACK_SIZE + SAVED_INCREMENT_STACK_SIZE  \
+     + SAVED_TERM_ADDR_STACK_SIZE)
+
+// Forward declarations for helper functions
+static void broadcast_additional_needles(bool sizeKnown, int size, Register needle,
+                                         Register needleLen, Register rTmp,
+                                         StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm);
+
+static void broadcast_first_and_last_needle(Register needle, Register needle_len, Register rTmp,
+                                            StrIntrinsicNode::ArgEncoding ae,
+                                            MacroAssembler *_masm);
+
+static void compare_big_haystack_to_needle(bool sizeKnown, int size, Label &noMatch,
+                                           Register haystack, Register needleLen, Register eq_mask,
+                                           XMMRegister rxTmp1, XMMRegister rxTmp2,
+                                           XMMRegister rxTmp3, StrIntrinsicNode::ArgEncoding ae,
+                                           MacroAssembler *_masm);
+
+static void compare_haystack_to_needle(bool sizeKnown, int size, Label &noMatch, Register haystack,
+                                       Register eq_mask, Register needleLen, Register rTmp,
+                                       XMMRegister rxTmp1, XMMRegister rxTmp2,
+                                       StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm);
+
+static void big_case_loop_helper(bool sizeKnown, int size, Label &noMatch, Label &loop_top,
+                                 Register eq_mask, Register hsPtrRet, Register needleLen,
+                                 Register needle, Register haystack, Register hsLength,
+                                 Register rTmp1, Register rTmp2, Register rTmp3, Register rTmp4,
+                                 StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm);
+
+static void byte_compare_helper(int size, Label &L_noMatch, Label &L_matchFound, Register needle,
+                                Register needleVal, Register haystack, Register mask,
+                                Register foundIndex, Register tmp, StrIntrinsicNode::ArgEncoding ae,
+                                MacroAssembler *_masm);
+
+static void highly_optimized_short_cases(StrIntrinsicNode::ArgEncoding ae, Register haystack,
+                                         Register haystack_len, Register needle,
+                                         Register needle_len, XMMRegister XMM0, XMMRegister XMM1,
+                                         Register mask, Register tmp, MacroAssembler *_masm);
+
+static void setup_jump_tables(StrIntrinsicNode::ArgEncoding ae, Label &L_error, Label &L_checkRange,
+                              Label &L_fixup, address *big_jump_table, address *small_jump_table,
+                              MacroAssembler *_masm);
+
+static void vpcmpeq(XMMRegister dst, XMMRegister src, Address adr, int vector_len,
+                    StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm) {
+  if ((ae == StrIntrinsicNode::UL) || (ae == StrIntrinsicNode::UU)) {
+      __ vpcmpeqw(dst, src, adr, vector_len);
+  } else {
+      __ vpcmpeqb(dst, src, adr, vector_len);
+  }
+}
+
+static void generate_string_indexof_stubs(StubGenerator *stubgen, address *fnptrs,
+                                          StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm);
+
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+//                         Start of generator
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+
+void StubGenerator::generate_string_indexof(address *fnptrs) {
+  assert((int) StrIntrinsicNode::LL < 4, "Enum out of range");
+  assert((int) StrIntrinsicNode::UL < 4, "Enum out of range");
+  assert((int) StrIntrinsicNode::UU < 4, "Enum out of range");
+  generate_string_indexof_stubs(this, fnptrs, StrIntrinsicNode::LL, _masm);
+  generate_string_indexof_stubs(this, fnptrs, StrIntrinsicNode::UU, _masm);
+  generate_string_indexof_stubs(this, fnptrs, StrIntrinsicNode::UL, _masm);
+  assert(fnptrs[StrIntrinsicNode::LL] != nullptr, "LL not generated.");
+  assert(fnptrs[StrIntrinsicNode::UL] != nullptr, "UL not generated.");
+  assert(fnptrs[StrIntrinsicNode::UU] != nullptr, "UU not generated.");
+}
+
+static void generate_string_indexof_stubs(StubGenerator *stubgen, address *fnptrs,
+                                          StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm) {
+  StubCodeMark mark(stubgen, "StubRoutines", "stringIndexOf");
+  bool isLL = (ae == StrIntrinsicNode::LL);
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = isUL || isUU;  // At least one is UTF-16
+  assert(isLL || isUL || isUU, "Encoding not recognized");
+
+  // Keep track of isUL since we need to generate UU code in the main body
+  // for the case where we expand the needle from bytes to words on the stack.
+  // This is done at L_wcharBegin.  The algorithm used is:
+  //  If the encoding is UL and the needle size is <= MAX_NEEDLE_LEN_TO_EXPAND,
+  //  allocate space on the stack and expand the Latin-1 encoded needle.  Then
+  //  effectively "recurse" into the mainline using UU encoding (since both the
+  //  haystack and needle are now UTF-16 encoded).
+  bool isReallyUL = isUL;
+
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  //                         AVX2 code
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  assert(VM_Version::supports_avx2(), "Needs AVX2");
+
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  //                         Code generation explanation:
+  //
+  //  The generator will generate code for three cases:
+  //  1. Both needle and haystack are Latin-1 (single byte) encoded (LL)
+  //  2. Both the needle and haystack are UTF-16 encoded (two bytes per character) (UU)
+  //  3. The haystack is UTF-16 encoded and the needle is Latin-1 encoded (UL)
+  //
+  //  The case of the haystack being Latin-1 and the needle being UTF-16 is short-circuited
+  //  so that we never get called in this case.
+  //
+  //  For the UL case (haystack UTF-16 and needle Latin-1), the needle will be expanded
+  //  onto the stack (for size <= MAX_NEEDLE_LEN_TO_EXPAND) and the UU code will do the work.
+  //  For UL where the needle size is > MAX_NEEDLE_LEN_TO_EXPAND and the haystack size minus
+  //  the needle size is less than 32 bytes, we default to a
+  //  byte-by-byte comparison (this will be rare).
+  //
+  //  Note that the code assumes MAX_NEEDLE_LEN_TO_EXPAND is >= 32.
+  //
+  //  The UU and LL cases are identical except for the loop increments and loading
+  //  of the characters into registers.  UU loads and compares words, LL - bytes.
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+
+  const Register haystack_p     = c_rarg0;
+  const Register haystack_len_p = c_rarg1;
+  const Register needle_p       = c_rarg2;
+  const Register needle_len_p   = c_rarg3;
+
+  // Addresses of the two jump tables used for small needle processing
+  address big_jump_table;
+  address small_jump_table;
+
+  Label L_begin;
+
+  Label L_returnError, L_bigCaseFixupAndReturn;
+  Label L_bigSwitchTop, L_bigCaseDefault, L_smallCaseDefault;
+  Label L_nextCheck, L_checksPassed, L_return;
+  Label L_wcharBegin, L_continue, L_wideNoExpand, L_returnR11;
+
+  __ align(CodeEntryAlignment);
+  fnptrs[ae] = __ pc();
+  __ enter();  // required for proper stackwalking of RuntimeStub frame
+
+  // Check for trivial cases
+  // needle length == 0?
+  __ cmpq(needle_len_p, 0);
+  __ jg_b(L_nextCheck);
+  __ xorl(rax, rax);
+  __ leave();
+  __ ret(0);
+
+  __ bind(L_nextCheck);
+  // haystack length >= needle length?
+  __ movq(rax, haystack_len_p);
+  __ subq(rax, needle_len_p);
+  __ jge_b(L_checksPassed);
+
+  __ movq(rax, -1);
+  __ leave();
+  __ ret(0);
+
+  __ bind(L_checksPassed);
+
+  // Check for highly-optimized ability - haystack <= 32 bytes and needle <= 6 bytes
+  // haystack_len is in elements, not bytes, for UTF-16
+  __ cmpq(haystack_len_p, isU ? 16 : 32);
+  __ ja(L_begin);
+
+  // needle_len is in elements, not bytes, for UTF-16 <=> UTF-16
+  __ cmpq(needle_len_p, isUU ? 3 : 6);
+  __ ja(L_begin);
+
+  // Handle short haystack and needle specially
+  // Generated code does not return - either found or not
+  highly_optimized_short_cases(ae, haystack_p, haystack_len_p, needle_p, needle_len_p, xmm0, xmm1,
+                               r10, r11, _masm);
+
+  // If we're generating UL, we need to "pretend" we're generating UU code
+  // for the case where the needle can be expanded onto the stack
+  if (isReallyUL) {
+    ae = StrIntrinsicNode::UU;
+    isUL = false;
+    isUU = true;
+  }
+
+  // Set up jump tables.  Used when needle size <= NUMBER_OF_CASES
+  setup_jump_tables(ae, L_returnError, L_returnR11, L_bigCaseFixupAndReturn, &big_jump_table,
+                    &small_jump_table, _masm);
+
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // The above code handles all cases (LL, UL, UU) for haystack size <= 32 bytes
+  // and needle size <= 6 bytes.
+  //
+  // Main processing proceeds as follows:
+  //  Save state and setup stack, etc.
+  //  If UL, jump to code to handle special-case UL situations (see L_wcharBegin below)
+  //  Broadcast the first and last needle elements to XMM_BYTE_0 and XMM_BYTE_K, respectively
+  //  If the length in bytes of the haystack is > 32, dispatch to the big switch handling code
+  //  If the haystack length in bytes is <= 32:
+  //    Copy the haystack to the stack.  This is done to prevent possible page faults and
+  //      allows for reading full 32-byte chunks of the haystack.
+  //    Dispatch to the small switch handling code
+  //
+  // Here, "big switch" and "small switch" refers to the haystack size: > 32 bytes for big
+  // and <= 32 bytes for small.  The switches implement optimized code for handling 1 to
+  // NUMBER_OF_CASES (currently 10) needle sizes for both big and small.  There are special
+  // routines for handling needle sizes > NUMBER_OF_CASES (L_{big,small}CaseDefault).  These
+  // cases use C2's arrays_equals() to compare the needle to the haystack.  The small cases
+  // use specialized code for comparing the needle.
+  //
+  // The algorithm currently does vector comparisons for the first, last, and second bytes
+  // of the needle and, where each of these needle elements matches the correct position
+  // within the haystack, the "in-between" bytes are compared using the most efficient
+  // instructions possible for short needles, or C2's arrays_equals for longer needles.
+
+  __ align(CodeEntryAlignment);
+
+  __ bind(L_begin);
+  __ movdq(save_r12, r12);
+  __ movdq(save_r13, r13);
+  __ movdq(save_r14, r14);
+  __ movdq(save_r15, r15);
+  __ movdq(save_rbx, rbx);
+#ifdef _WIN64
+  __ push(rsi);
+  __ push(rdi);
+
+  // Move to Linux-style ABI
+  __ movq(rdi, rcx);
+  __ movq(rsi, rdx);
+  __ movq(rdx, r8);
+  __ movq(rcx, r9);
+#endif
+
+  const Register haystack     = rdi;
+  const Register haystack_len = rsi;
+  const Register needle       = rdx;
+  const Register needle_len   = rcx;
+  const Register save_ndl_len = r12;
+
+  __ push(rbp);
+  __ subptr(rsp, STACK_SPACE);
+
+  if (isReallyUL) {
+    // Branch out if doing UL
+    __ jmp(L_wcharBegin);
+  }
+
+  if (!isReallyUL && isUU) {  // Adjust sizes of hs and needle
+    // UU passes lengths in terms of chars - convert to bytes
+    __ shlq(needle_len, 1);
+    __ shlq(haystack_len, 1);
+  }
+
+  // UL processing comes here after expanding needle
+  __ bind(L_continue);
+  // nMinusK (haystack length in bytes minus needle length in bytes) is used several
+  // places to determine whether a compare will read past the end of the haystack.
+  __ movq(nMinusK, haystack_len);
+  __ subq(nMinusK, needle_len);
+
+  // Set up expected registers
+  __ movq(save_ndl_len, needle_len);
+  __ movq(r14, needle);
+  __ movq(rbx, haystack);
+
+  // Always need needle broadcast to ymm registers (XMM_BYTE_0 and XMM_BYTE_K)
+  broadcast_first_and_last_needle(needle, needle_len, rax, ae, _masm);
+
+  // Do "big switch" if haystack size > 32
+  __ cmpq(haystack_len, 0x20);
+  __ ja_b(L_bigSwitchTop);
+
+  // Copy the small (< 32 byte) haystack to the stack.  Allows for vector reads without page fault
+  // Only done for small haystacks
+  //
+  // NOTE: This code assumes that the haystack points to a java array type AND there are
+  //       at least 16 bytes of header preceeding the haystack pointer.
+  //
+  // This means that we're copying up to 15 bytes of the header onto the stack along
+  // with the haystack bytes.  After the copy completes, we adjust the haystack pointer
+  // to the valid haystack bytes on the stack.
+  {
+    Label L_moreThan16, L_adjustHaystack;
+
+    const Register index = rax;
+    const Register haystack = rbx;
+
+    // Only a single vector load/store of either 16 or 32 bytes
+    __ cmpq(haystack_len, 0x10);
+    __ ja_b(L_moreThan16);
+
+    __ movq(index, COPIED_HAYSTACK_STACK_OFFSET + 0x10);
+    __ movdqu(XMM_TMP1, Address(haystack, haystack_len, Address::times_1, -0x10));
+    __ movdqu(Address(rsp, COPIED_HAYSTACK_STACK_OFFSET), XMM_TMP1);
+    __ jmpb(L_adjustHaystack);
+
+    __ bind(L_moreThan16);
+    __ movq(index, COPIED_HAYSTACK_STACK_OFFSET + 0x20);
+    __ vmovdqu(XMM_TMP1, Address(haystack, haystack_len, Address::times_1, -0x20));
+    __ vmovdqu(Address(rsp, COPIED_HAYSTACK_STACK_OFFSET), XMM_TMP1);
+
+    // Point the haystack at the correct location of the first byte of the "real" haystack on the stack
+    __ bind(L_adjustHaystack);
+    __ subq(index, haystack_len);
+    __ leaq(haystack, Address(rsp, index, Address::times_1));
+  }
+
+  // Dispatch to handlers for small needle and small haystack
+  // Note that needle sizes of 1-6 have been handled in highly_optimized_short_cases,
+  // so the dispatch only has valid entries for 7-10.
+  __ leaq(r13, Address(save_ndl_len, -1));
+  __ cmpq(r13, NUMBER_OF_CASES - 1);
+  __ ja(L_smallCaseDefault);
+  __ lea(r15, InternalAddress(small_jump_table));
+  __ jmp(Address(r15, r13, Address::times_8));
+
+  // Dispatch to handlers for small needle and large haystack
+  // For large haystacks, the jump table is fully populated (1-10)
+  __ bind(L_bigSwitchTop);
+  __ leaq(rax, Address(save_ndl_len, -1));
+  __ cmpq(rax, NUMBER_OF_CASES - 1);
+  __ ja(L_bigCaseDefault);
+  __ lea(r15, InternalAddress(big_jump_table));
+  __ jmp(Address(r15, rax, Address::times_8));
+
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  // Fixup and return routines
+
+  // Return not found
+  __ bind(L_returnError);
+  __ movq(rax, -1);
+  __ jmpb(L_return);
+
+  // At this point, rcx has &haystack where match found, rbx has &haystack,
+  // and r8 has the index where a match was found
+  __ bind(L_bigCaseFixupAndReturn);
+  __ subq(rcx, rbx);
+  __ addq(rcx, r8);
+
+  __ movq(r11, rcx);
+
+  // r11 will contain the valid index.
+  __ bind(L_returnR11);
+  __ movq(rax, r11);
+
+  // Restore stack, vzeroupper and return
+  __ bind(L_return);
+  __ addptr(rsp, STACK_SPACE);
+  __ pop(rbp);
+#ifdef _WIN64
+  __ pop(rdi);
+  __ pop(rsi);
+#endif
+  __ movdq(r12, save_r12);
+  __ movdq(r13, save_r13);
+  __ movdq(r14, save_r14);
+  __ movdq(r15, save_r15);
+  __ movdq(rbx, save_rbx);
+
+  // Need to return elements for UTF-16 encodings
+  if (isU) {
+    // Return value for UTF-16 is elements, not bytes
+    // sar is used to preserve -1
+    __ sarq(rax, 1);
+  }
+  __ vzeroupper();
+
+  __ leave();  // required for proper stackwalking of RuntimeStub frame
+  __ ret(0);
+
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // Big case default:
+  //
+  // Handle needle sizes > 10 bytes.  Uses C2's arrays_equals to compare the contents
+  // of the needle to the haystack.
+
+  {
+    Label L_loopTop, L_innerLoop, L_found;
+
+    const Register hsPtrRet = rax;
+    const Register mask = r8;
+    const Register index = r9;
+    const Register compLen = rbp;
+    const Register haystackStart = rcx;
+    const Register rScratch = r13;
+    const Register needleLen = r12;
+    const Register needle = r14;
+    const Register haystack = rbx;
+    const Register hsLength = rsi;
+    const Register tmp1 = rdi;
+
+// #define used for registers that are re-used in the code
+#undef retval
+#undef firstNeedleCompare
+#undef tmp2
+#undef tmp3
+#define tmp2 r15
+#define tmp3 rdx
+    ////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////
+    //
+    // Big case default:  registers on entry
+    //
+    //  rbx: haystack
+    //  rcx: k
+    //  rdx: junk
+    //  rsi: n
+    //  rdi: haystack
+    //  r10: n - k
+    //  r12: k
+    //  r13: junk
+    //  r14: needle
+    //  rbp: junk
+    //  XMM_BYTE_0 - first element of needle broadcast
+    //  XMM_BYTE_K - last element of needle broadcast
+    //
+    // Set up in big_case_loop_helper
+    //  XMM_BYTE_1 - second element of needle broadcast
+
+    __ bind(L_bigCaseDefault);
+
+    // Loop construct handling for big haystacks
+    // The helper binds L_loopTop which should be jumped to if potential matches fail to compare
+    // equal (thus moving on to the next chunk of haystack).  If we run out of haystack, the
+    // helper jumps to L_returnError.
+    big_case_loop_helper(false, 0, L_returnError, L_loopTop, mask, hsPtrRet, needleLen, needle,
+                         haystack, hsLength, tmp1, tmp2, tmp3, rScratch, ae, _masm);
+
+    // big_case_loop_helper will fall through to this point if one or more potential matches are found
+    // The mask will have a bitmask indicating the position of the potential matches within the haystack
+    __ align(OptoLoopAlignment);
+    __ bind(L_innerLoop);
+    __ tzcntl(index, mask);
+
+// Re-use of r15 and rdx
+#undef tmp2
+#undef tmp3
+#define retval r15
+#define firstNeedleCompare rdx
+
+    // Need a lot of registers here to preserve state across arrays_equals call
+
+    // Starting address in the haystack
+    __ leaq(haystackStart, Address(hsPtrRet, index, Address::times_1, isU ? 4 : 2));
+        // Starting address of first byte of needle to compare
+    __ leaq(firstNeedleCompare, Address(needle, isU ? 4 : 2));
+        // Number of bytes to compare
+    __ leaq(compLen, Address(needleLen, isU ? -6 : -3));
+
+    // Call arrays_equals for both UU and LL cases as bytes should compare exact
+    __C2 arrays_equals(false, haystackStart, firstNeedleCompare, compLen, retval, rScratch,
+                        XMM_TMP3, XMM_TMP4, false /* char */, knoreg);
+    __ testl(retval, retval);
+    __ jne_b(L_found);
+
+    // If more potential matches, continue at inner loop, otherwise go get another vector
+    CLEAR_BIT(mask);
+    __ jne(L_innerLoop);
+    __ jmp(L_loopTop);
+
+    // Found exact match.  Compute offset from beginning of haystack
+    __ bind(L_found);
+    __ subq(hsPtrRet, haystack);
+    __ addq(hsPtrRet, index);
+    __ movq(r11, hsPtrRet);
+    __ jmp(L_returnR11);
+
+#undef retval
+#undef firstNeedleCompare
+  }
+
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // Small case default:
+  //
+  // Handle needle sizes > 10 bytes.  Uses C2's arrays_equals to compare the contents
+  // of the needle to the haystack.
+
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // Small case default: register on entry
+  //
+  //  rbx: haystack
+  //  r14: needle
+  //  r13: k - 1
+  //  r12: k
+  //  r10: n - k
+  //  rbp: junk
+  //  rdi: junk
+  //  rsi: n
+  //  rdx: junk
+  //  rcx: junk
+  //  XMM_BYTE_0 - first element of needle broadcast
+  //  XMM_BYTE_K - last element of needle broadcast
+  //
+  // Set up in broadcast_additional_needles
+  //  XMM_BYTE_1 - second element of needle broadcast
+  //
+  //  Haystack always copied to stack, so 32-byte reads OK
+  //  Haystack length <= 32
+  //  10 < needle length <= 32
+
+  {
+    __ bind(L_smallCaseDefault);
+
+    Label L_innerLoop;
+
+    const Register firstNeedleCompare = rdx;
+    const Register compLen = r9;
+    const Register haystack = rbx;
+    const Register mask = r8;
+    const Register rTmp = rdi;
+    const Register rTmp2 = r13;
+    const Register rTmp3 = rax;
+
+// r14 and r12 will be re-used later in this procedure
+#undef needle
+#define needle r14
+#undef needleLen
+#define needleLen r12
+
+    broadcast_additional_needles(false, 0 /* unknown */, needle, needleLen, rTmp3, ae, _masm);
+
+    // For small haystacks we already know that the 1st, 2nd, and last bytes of the needle
+    // compare equal, so we can reduce the byte count to arrays_equals
+    __ leaq(firstNeedleCompare, Address(needle, isU ? 4 : 2));
+    __ leaq(compLen, Address(needleLen, isU ? -6 : -3));
+
+    //  firstNeedleCompare has address of third element of needle
+    //  compLen has length of comparison to do (3 elements less than needle size)
+
+    // Helper to compare the 1st, 2nd, and last byte of the needle to the haystack
+    // in the correct position.  Since the haystack is < 32 bytes, not finding matching
+    // needle bytes can just return failure.  Otherwise, we loop through the found
+    // matches.
+    compare_haystack_to_needle(false, 0, L_returnError, haystack, mask, needleLen, rTmp3, XMM_TMP1,
+                               XMM_TMP2, ae, _masm);
+
+// NOTE: REGISTER RE-USE for r12 and r14
+#undef needle
+#undef saveCompLen
+#define saveCompLen r14
+#undef needleLen
+#undef saveNeedleAddress
+#define saveNeedleAddress r12
+
+    // Save registers stomped by arrays_equals
+    __ movq(saveCompLen, compLen);
+    __ movq(saveNeedleAddress, firstNeedleCompare);  // Save address of 2nd element of needle
+
+    // Find index of a potential match
+    __ align(OptoLoopAlignment);
+    __ bind(L_innerLoop);
+    __ tzcntl(r11, mask);
+
+    __ leaq(rTmp, Address(haystack, r11, Address::times_1, isU ? 4 : 2));
+
+    // Check for needle equality.  Handles UU and LL cases since byte comparison should be exact
+    __C2 arrays_equals(false, rTmp, firstNeedleCompare, compLen, rTmp3, rTmp2, XMM_TMP3, XMM_TMP4,
+                       false /* char */, knoreg);
+    __ testl(rTmp3, rTmp3);
+    __ jne(L_returnR11);
+
+    // Restore saved registers
+    __ movq(compLen, saveCompLen);
+    __ movq(firstNeedleCompare, saveNeedleAddress);
+
+    // Jump to inner loop if more matches to check, otherwise return not found
+    CLEAR_BIT(mask);
+    __ jne(L_innerLoop);
+    __ jmp(L_returnError);
+
+#undef saveCompLen
+#undef saveNeedleAddress
+  }
+
+  if (isReallyUL) {
+    ////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////
+    //                         Wide char code
+    ////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////
+    //
+    // Pseudo-code:
+    //
+    // If needle length less than MAX_NEEDLE_LEN_TO_EXPAND, read the needle
+    // bytes from r14 and write them as words onto the stack.  Then go to the
+    // "regular" UU code.  This is equavilent to doing a UU comparison, since the
+    // haystack will be in UTF-16.
+    //
+    // If the needle can't be expanded, process the same way as the default
+    // cases above.
+    __ bind(L_wcharBegin);
+
+    // Restore argument encoding from UU back to UL for helpers
+    ae = StrIntrinsicNode::UL;
+    isUL = true;
+    isUU = false;
+
+    Label L_top, L_finished;
+
+    const Register haystack = rdi;
+    const Register hsLen = rsi;
+    const Register needle = rdx;
+    const Register nLen = rcx;
+
+    const Register offset = rax;
+    const Register index = rbx;
+    const Register wr_index = r13;
+
+    assert(MAX_NEEDLE_LEN_TO_EXPAND >= 32, "Small UL needles not supported");
+
+    // haystack length to bytes
+    __ shlq(hsLen, 1);
+
+    // Ensure haystack >= needle
+    __ leaq(index, Address(nLen, nLen, Address::times_1));
+    __ cmpq(index, hsLen);
+    __ jg(L_returnError);
+
+    // Can't expand large-ish needles
+    __ cmpq(nLen, MAX_NEEDLE_LEN_TO_EXPAND);
+    __ ja(L_wideNoExpand);
+
+    //
+    // Reads of existing needle are 16-byte chunks
+    // Writes to copied needle are 32-byte chunks
+    // Don't read past the end of the existing needle
+    //
+    // Start first read at [((ndlLen % 16) - 16) & 0xf]
+    // outndx += 32
+    // inndx += 16
+    // cmp nndx, ndlLen
+    // jae done
+    //
+    // Final index of start of needle at ((16 - (ndlLen %16)) & 0xf) << 1
+    //
+    // Starting read for needle at -(16 - (nLen % 16))
+    // Offset of needle in stack should be (16 - (nLen % 16)) * 2
+
+    __ movq(index, needle_len);
+    __ andq(index, 0xf);  // nLen % 16
+    __ movq(offset, 0x10);
+    __ subq(offset, index);  // 16 - (nLen % 16)
+    __ movq(index, offset);
+    __ shlq(offset, 1);  // * 2
+    __ negq(index);      // -(16 - (nLen % 16))
+    __ xorq(wr_index, wr_index);
+
+    __ bind(L_top);
+    // load needle and expand
+    __ vpmovzxbw(xmm0, Address(needle, index, Address::times_1), Assembler::AVX_256bit);
+    // store expanded needle to stack
+    __ vmovdqu(Address(rsp, wr_index, Address::times_1, EXPANDED_NEEDLE_STACK_OFFSET), xmm0);
+    __ addq(index, 0x10);
+    __ cmpq(index, needle_len);
+    __ jae(L_finished);
+    __ addq(wr_index, 32);
+    __ jmpb(L_top);
+
+    // adjust pointer and length of needle
+    __ bind(L_finished);
+    __ leaq(needle, Address(rsp, offset, Address::times_1, EXPANDED_NEEDLE_STACK_OFFSET));
+    __ leaq(needle_len, Address(needle_len, needle_len));
+
+    // Go handle this the same as UU
+    __ jmp(L_continue);
+
+    ////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////////////////
+    //
+    // Compare Latin-1 encoded needle against UTF-16 encoded haystack.
+    //
+    // The needle is more than MAX_NEEDLE_LEN_TO_EXPAND bytes in length, and the haystack
+    // is at least as big.
+
+    // Prepare for wchar anysize
+    __ bind(L_wideNoExpand);
+
+    {
+      Label L_loopTop, L_temp, L_innerLoop, L_found, L_compareFull;
+      Label doCompare, topLoop;
+
+      ////////////////////////////////////////////////////////////////////////////////////////
+      ////////////////////////////////////////////////////////////////////////////////////////
+      ////////////////////////////////////////////////////////////////////////////////////////
+      // On entry:
+      //
+      //  rbx: haystack
+      //  rcx: k
+      //  rdx: junk
+      //  rsi: n
+      //  rdi: haystack
+      //  r10: n - k
+      //  r12: k
+      //  r13: junk
+      //  r14: needle
+      //  rbp: junk
+      //  XMM_BYTE_0 - first element of needle broadcast
+      //  XMM_BYTE_K - last element of needle broadcast
+
+      const Register hsPtrRet = rax;
+      const Register haystack = rbx;
+      const Register haystackStart = rcx;
+      const Register hsLength = rsi;
+      const Register tmp1 = rdi;
+      const Register compLen = rbp;
+      const Register mask = r8;
+      const Register index = r9;
+      const Register needleLen = r12;
+      const Register rScratch = r13;
+      const Register needle = r14;
+
+      // Move registers into expected registers for rest of this routine
+      __ movq(rbx, rdi);
+      __ movq(r12, rcx);
+      __ movq(r14, rdx);
+
+      // Set up nMinusK
+      __ movq(tmp1, needleLen);
+      __ shlq(tmp1, 1);
+      __ movq(rScratch, hsLength);
+      __ subq(rScratch, tmp1);
+      __ movq(nMinusK, rScratch);
+
+      // Check for room for a 32-byte read for the last iteration
+      __ cmpq(nMinusK, 0x1f);
+      __ jl(L_compareFull);
+
+      // Always need needle broadcast to ymm registers
+      broadcast_first_and_last_needle(needle, needleLen, tmp1, ae, _masm);
+
+// Register redefinition for rbx and r15
+#undef retval
+#undef firstNeedleCompare
+#undef tmp2
+#undef tmp3
+#define tmp2 r15
+#define tmp3 rdx
+
+      // Loop construct handling for big haystacks
+      // The helper binds L_loopTop which should be jumped to if potential matches fail to compare
+      // equal (thus moving on to the next chunk of haystack).  If we run out of haystack, the
+      // helper jumps to L_returnError.
+      big_case_loop_helper(false, 0, L_returnError, L_loopTop, mask, hsPtrRet, needleLen, needle,
+                           haystack, hsLength, tmp1, tmp2, tmp3, rScratch, ae, _masm);
+
+      // big_case_loop_helper will fall through to this point if one or more potential matches are
+      // found The mask will have a bitmask indicating the position of the potential matches within
+      // the haystack
+      __ align(OptoLoopAlignment);
+      __ bind(L_innerLoop);
+      __ tzcntl(index, mask);
+
+#undef tmp2
+#undef tmp3
+#define retval r15
+#define firstNeedleCompare rdx
+
+      // Note that we're comparing the full needle here even though in some paths
+      // the 1st, 2nd, and last bytes are already known to be equal.  This is necessary
+      // due to the handling of cases where nMinusK is < 32
+
+      // Need a lot of registers here to preserve state across arrays_equals call
+
+      // Starting address in the haystack
+      __ leaq(haystackStart, Address(hsPtrRet, index));
+      // Starting address of first byte of needle to compare
+      __ movq(firstNeedleCompare, needle);
+      // Number of bytes to compare
+      __ movq(compLen, needleLen);
+
+      // Passing true as last parameter causes arrays_equals to expand the second array (needle)
+      // as the comparison is done.
+      __C2 arrays_equals(false, haystackStart, firstNeedleCompare, compLen, retval, rScratch,
+                         XMM_TMP3, XMM_TMP4, false /* char */, knoreg, true /* expand_ary2 */);
+      __ testl(retval, retval);
+      __ jne_b(L_found);
+
+    // If more potential matches, continue at inner loop, otherwise go get another vector
+      CLEAR_BIT(mask);
+      __ jne(L_innerLoop);
+      __ jmp(L_loopTop);
+
+      // Found exact match.  Compute offset from beginning of haystack
+      __ bind(L_found);
+      __ subq(hsPtrRet, haystack);
+      __ addq(hsPtrRet, index);
+      __ movq(r11, hsPtrRet);
+      __ jmp(L_returnR11);
+
+#undef retval
+#undef firstNeedleCompare
+
+      __ bind(L_compareFull);
+
+      // rScratch has n - k.  Compare entire string word-by-word
+      // Index returned in r11
+      __ xorq(r11, r11);
+      __ movq(nMinusK, rScratch);
+      __ jmpb(doCompare);
+
+      __ bind(topLoop);
+      __ addq(r11, 2);
+      __ cmpq(r11, nMinusK);
+      __ jg(L_returnError);
+
+      __ bind(doCompare);
+      __ leaq(r9, Address(haystack, r11));
+      __ leaq(r8, Address(needle, 0));
+      __ movq(r13, needleLen);
+
+      __C2 arrays_equals(false, r9, r8, r13, rax, rdx, XMM_TMP3, XMM_TMP4, false /* char */, knoreg,
+                         true /* expand_ary2 */);
+      __ testq(rax, rax);
+      __ jz(topLoop);
+
+      // Match found
+      __ jmp(L_returnR11);
+    }
+  }
+
+  return;
+}
+
+// Helper for broadcasting needle elements to ymm registers for compares
+// Expands into XMM_BYTE_0 and XMM_BYTE_K
+//
+// For UTF-16 encoded needles, broadcast a word at the proper offset to the ymm
+// register (case UU)
+// For the UTF-16 encoded haystack with Latin1 encoded needle (case UL) we have
+// to read into a temp register to zero-extend the single byte needle value, then
+// broadcast words to the ymm register.
+//
+// Parameters:
+// needle - the address of the first byte of the needle
+// needle_len - length of needle if !sizeKnown
+// rTmp - temp register (for UL only)
+// ae - the argument encodings
+// _masm - Current MacroAssembler instance pointer
+//
+// Modifies XMM_BYTE_0 and XMM_BYTE_K
+static void broadcast_first_and_last_needle(Register needle, Register needle_len, Register rTmp,
+                                            StrIntrinsicNode::ArgEncoding ae,
+                                            MacroAssembler *_masm) {
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = (isUU || isUL);
+  Label L_short;
+
+  // Always need needle broadcast to ymm registers
+  // Broadcast the beginning of needle into a vector register.
+  if (isUU) {
+    __ vpbroadcastw(XMM_BYTE_0, Address(needle, 0), Assembler::AVX_256bit);
+  } else if (isUL) {
+
+    __ movzbl(rTmp, Address(needle));
+    __ movdl(XMM_BYTE_0, rTmp);
+    // 1st byte of needle in words
+    __ vpbroadcastw(XMM_BYTE_0, XMM_BYTE_0, Assembler::AVX_256bit);
+  } else {
+    __ vpbroadcastb(XMM_BYTE_0, Address(needle, 0), Assembler::AVX_256bit);
+  }
+
+  // Broadcast the end of needle into a vector register.
+  // For a single-element needle this is redundant but does no harm and
+  // reduces code size as opposed to broadcasting only if used.
+  if (isUU) {
+    __ vpbroadcastw(XMM_BYTE_K, Address(needle, needle_len, Address::times_1, -2),
+                    Assembler::AVX_256bit);
+  } else if (isUL) {
+    __ movzbl(rTmp, Address(needle, needle_len, Address::times_1, -1));
+    __ movdl(XMM_BYTE_K, rTmp);
+    // last byte of needle in words
+    __ vpbroadcastw(XMM_BYTE_K, XMM_BYTE_K, Assembler::AVX_256bit);
+  } else {
+    __ vpbroadcastb(XMM_BYTE_K, Address(needle, needle_len, Address::times_1, -1),
+                    Assembler::AVX_256bit);
+  }
+
+  __ bind(L_short);
+}
+
+// Helper for broadcasting the 2nd needle element to XMM_BYTE_1
+//
+// For UTF-16 encoded needles, broadcast a word at the proper offset to the ymm
+// register (case UU)
+// For the UTF-16 encoded haystack with Latin1 encoded needle (case UL) we have
+// to read into a temp register to zero-extend the single byte needle value, then
+// broadcast words to the ymm register.
+//
+// Parameters:
+// sizeKnown - True if needle size known at compile time
+// size - the size of the needle.  Pass 0 if unknown at compile time
+// needle - the address of the first byte of the needle
+// needleLen - length of needle if !sizeKnown
+// rTmp - temp register (for UL only)
+// ae - Argument encoding
+// _masm - Current MacroAssembler instance pointer
+//
+// Modifies XMM_BYTE_1
+static void broadcast_additional_needles(bool sizeKnown, int size, Register needle,
+                                         Register needleLen, Register rTmp,
+                                         StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm) {
+  Label L_done;
+
+  assert_different_registers(needle, needleLen, rTmp);
+
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = (isUU || isUL);
+
+  size = sizeKnown ? size : NUMBER_OF_CASES + 1;
+
+  // Need code to determine whether it's valid to use second byte of
+  // needle if the size isn't known at compile-time
+  if (!sizeKnown) {
+    __ cmpq(needleLen, (isU ? 4 : 2));
+    __ jl_b(L_done);
+  }
+
+  if (size > (isU ? 4 : 2)) {
+    // Add compare for second byte
+    if (isUU) {
+      __ vpbroadcastw(XMM_BYTE_1, Address(needle, 2), Assembler::AVX_256bit);
+    } else if (isUL) {
+      __ movzbl(rTmp, Address(needle, 1));
+      __ movdl(XMM_BYTE_1, rTmp);
+      // 1st byte of needle in words
+      __ vpbroadcastw(XMM_BYTE_1, XMM_BYTE_1, Assembler::AVX_256bit);
+    } else {
+      __ vpbroadcastb(XMM_BYTE_1, Address(needle, 1), Assembler::AVX_256bit);
+    }
+  }
+
+  __ bind(L_done);
+}
+
+// Helper for comparing needle elements to a big haystack
+//
+// This helper compares bytes or words in the ymm registers to
+// the proper positions within the haystack.  It will bail out early if
+// no match found, otherwise it will progressively and together
+// the comparison results, returning the answer at the end.
+//
+// On return, eq_mask will be set to the comparison mask value.  If no match
+// is found, this helper will jump to noMatch.
+//
+// Parameters:
+// sizeKnown - True if size known at compile time
+// size - the size of the needle in bytes.  Pass 0 if unknown at compile time
+// noMatch - label bound outside to jump to if there is no match
+// haystack - the address of the first byte of the haystack
+// hsLen - the sizeof the haystack in bytes
+// needleLen - size of the needle in bytes known at runtime
+// eq_mask - The bit mask returned that holds the result of the comparison
+// rxTmp1 - a temporary xmm register
+// rxTmp2 - a temporary xmm register
+// rxTmp3 - a temporary xmm register
+// ae - Argument encoding
+// _masm - Current MacroAssembler instance pointer
+//
+// (n - k) will always be >= 32 on entry
+static void compare_big_haystack_to_needle(bool sizeKnown, int size, Label &noMatch,
+                                           Register haystack, Register needleLen, Register eq_mask,
+                                           XMMRegister rxTmp1, XMMRegister rxTmp2,
+                                           XMMRegister rxTmp3, StrIntrinsicNode::ArgEncoding ae,
+                                           MacroAssembler *_masm) {
+
+  assert_different_registers(eq_mask, haystack, needleLen, nMinusK);
+
+  const XMMRegister result = rxTmp1;
+  const XMMRegister cmp_0 = rxTmp2;
+  const XMMRegister cmp_k = rxTmp3;
+
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = (isUU || isUL);
+
+  int sizeIncr = isU ? 2 : 1;
+
+  Label L_OKtoCompareFull, L_done, L_specialCase_gt2;
+
+  assert(!sizeKnown || (sizeKnown && ((size > 0) && (size <= NUMBER_OF_CASES))), "Incorrect size given");
+
+  // Address of the kth byte of the needle within the haystack
+  Address kThByte = sizeKnown ? Address(haystack, size - sizeIncr)
+                              : Address(haystack, needleLen,
+                                        isUL ? Address::times_2 : Address::times_1, -(sizeIncr));
+  size = sizeKnown ? size : NUMBER_OF_CASES + 1;
+
+  // Compare first byte of needle to haystack
+     vpcmpeq(cmp_0, XMM_BYTE_0, Address(haystack, 0), Assembler::AVX_256bit, ae, _masm);
+
+  __ vpmovmskb(eq_mask, cmp_0, Assembler::AVX_256bit);
+
+  // If the needle is a single element (at compile time) no need to compare more
+  if (size != sizeIncr) {
+    // Compare last byte of needle to haystack at proper position
+    vpcmpeq(cmp_k, XMM_BYTE_K, kThByte, Assembler::AVX_256bit, ae, _masm);
+
+    __ vpand(result, cmp_k, cmp_0, Assembler::AVX_256bit);
+
+    if (size > sizeIncr * 2) {
+      vpcmpeq(cmp_k, XMM_BYTE_1, Address(haystack, 1 * sizeIncr), Assembler::AVX_256bit, ae, _masm);
+      __ vpand(result, cmp_k, result, Assembler::AVX_256bit);
+    }
+
+    __ vpmovmskb(eq_mask, result, Assembler::AVX_256bit);
+  }
+
+  __ bind(L_done);
+  __ testl(eq_mask, eq_mask);
+  __ je(noMatch);
+  // At this point, we have at least one "match" where first and last bytes
+  // of the needle are found the correct distance apart.
+}
+
+// Helper for comparing needle elements to a small haystack
+//
+// This helper compares bytes or words in the ymm registers to
+// the proper positions within the haystack.  It will bail out early if
+// a match is not found, otherwise it will progressively and together
+// the comparison results, returning the answer at the end.
+//
+// On return, eq_mask will be set to the comparison mask value.  If no match
+// is found, this helper will jump to noMatch.
+//
+// Parameters:
+// sizeKnown - if true, size is valid and needleLen invalid.
+//             if false, size invalid and needleLen valid.
+// size - the size of the needle.  Pass 0 if unknown at compile time
+// noMatch - label bound outside to jump to if there is no match
+// haystack - the address of the first byte of the haystack
+// eq_mask - The bit mask returned that holds the result of the comparison
+// needleLen - Length of the needle in bytes.  Only used if isUL true
+// rTmp - temporary register
+// rxTmp1 - temporary xmm register
+// rxTmp2 - temporary xmm register
+// ae - Argument encoding
+// _masm - Current MacroAssembler instance pointer
+//
+// No need to worry about reading past end of haystack since haystack
+// has been copied to the stack
+//
+// If !sizeKnown, needle is at least 11 bytes long
+static void compare_haystack_to_needle(bool sizeKnown, int size, Label &noMatch, Register haystack,
+                                       Register eq_mask, Register needleLen, Register rTmp,
+                                       XMMRegister rxTmp1, XMMRegister rxTmp2,
+                                       StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm) {
+
+  assert_different_registers(eq_mask, haystack, needleLen, rTmp, nMinusK);
+
+  // NOTE: cmp_0 and result are the same register
+  const XMMRegister cmp_0 = rxTmp1;
+  const XMMRegister result = rxTmp1;
+  const XMMRegister cmp_k = rxTmp2;
+
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = isUL || isUU;  // At least one is UTF-16
+
+  int sizeIncr = isU ? 2 : 1;
+
+  assert((!sizeKnown) || (((size > 0) && (size <= NUMBER_OF_CASES))), "Incorrect size given");
+
+  // Address of the kth byte of the needle within the haystack
+  Address kThByte = sizeKnown ? Address(haystack, size - sizeIncr)
+                              : Address(haystack, needleLen, Address::times_1, -(sizeIncr));
+  size = sizeKnown ? size : NUMBER_OF_CASES + 1;
+
+  // Creates a mask of (n - k + 1) ones.  This prevents
+  // recognizing any false-positives past the end of
+  // the valid haystack.
+  __ movq(rTmp, -1);
+  __ movq(eq_mask, nMinusK);
+  __ addq(eq_mask, 1);
+  __ bzhiq(rTmp, rTmp, eq_mask);
+
+  // Compare first byte of needle to haystack
+     vpcmpeq(cmp_0, XMM_BYTE_0, Address(haystack, 0), Assembler::AVX_256bit, ae, _masm);
+  if (size != sizeIncr) {
+    // Compare last byte of needle to haystack at proper position
+    vpcmpeq(cmp_k, XMM_BYTE_K, kThByte, Assembler::AVX_256bit, ae, _masm);
+
+    __ vpand(result, cmp_k, cmp_0, Assembler::AVX_256bit);
+
+    if (size > (sizeIncr * 2)) {
+      vpcmpeq(cmp_k, XMM_BYTE_1, Address(haystack, 1 * sizeIncr), Assembler::AVX_256bit, ae, _masm);
+      __ vpand(result, cmp_k, result, Assembler::AVX_256bit);
+    }
+  }
+
+  __ vpmovmskb(eq_mask, result, Assembler::AVX_256bit);
+  __ andl(eq_mask, rTmp);
+
+  __ testl(eq_mask, eq_mask);
+  __ je(noMatch);
+  // At this point, we have at least one "match" where first and last bytes
+  // of the needle are found the correct distance apart.
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+// Helper for big haystack loop construct
+//
+// For UTF-16 encoded needles, broadcast a word at the proper offset to the ymm
+// register (case UU)
+// For the UTF-16 encoded haystack with Latin1 encoded needle (case UL) we have
+// to read into a temp register to zero-extend the single byte needle value, then
+// broadcast words to the ymm register.
+//
+// Parameters:
+// sizeKnown - if true, size is valid and needleLen invalid.
+// size - the size of the needle.  Pass 0 if unknown at compile time
+// noMatch - label bound outside to jump to if there is no match
+// loop_top - label bound inside this helper that should be branched to
+//            for additional comparisons.
+// eq_mask - The bit mask returned that holds the result of the comparison
+// hsPtrRet - This will hold the place within the needle where a match is found
+//            This is modified
+// needleLen - The length of the needle
+// needle - Address of the needle
+// haystack - Address of the haystack
+// hsLength - The length of the haystack
+// rTmp1 - Temporary
+// rTmp2 - Temporary
+// rTmp3 - Temporary
+// rTmp4 - Temporary
+// ae - Argument encoding
+// _masm - Current MacroAssembler instance pointer
+//
+// On entry:
+//
+//  rbx: haystack
+//  rcx: k
+//  rdx: junk
+//  rsi: n
+//  rdi: haystack
+//  r10: n - k
+//  r12: k
+//  r13: junk
+//  r14: needle
+//  rbp: junk
+//  XMM_BYTE_0 - first element of needle broadcast
+//  XMM_BYTE_K - last element of needle broadcast
+
+static void big_case_loop_helper(bool sizeKnown, int size, Label &noMatch, Label &loop_top,
+                                 Register eq_mask, Register hsPtrRet, Register needleLen,
+                                 Register needle, Register haystack, Register hsLength,
+                                 Register rTmp1, Register rTmp2, Register rTmp3, Register rTmp4,
+                                 StrIntrinsicNode::ArgEncoding ae, MacroAssembler *_masm) {
+  Label L_midLoop, L_greaterThan32, L_out;
+
+  assert_different_registers(eq_mask, hsPtrRet, needleLen, rdi, r15, rdx, rsi, rbx, r14, nMinusK);
+
+  const Register last = rTmp1;
+  const Register temp1 = rTmp2;
+  const Register temp2 = rTmp3;
+  const Register temp3 = rTmp4;
+
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = isUL || isUU;  // At least one is UTF-16
+
+  // Assume failure
+  __ movq(r11, -1);
+
+  broadcast_additional_needles(sizeKnown, size, needle, needleLen, temp1, ae, _masm);
+
+  __ cmpq(nMinusK, 31);
+  __ jae_b(L_greaterThan32);
+
+  // Here the needle is too long, so we can't do a 32-byte read to compare the last element.
+  //
+  // Instead we match the first two characters, read from the end of the haystack
+  // back 32 characters, shift the result, compare and check that way.
+  //
+  // Set last to hsPtrRet so the next attempt at loop iteration ends the compare.
+  __ movq(last, haystack);
+  __ movq(hsPtrRet, haystack);
+
+  // Compare first element of needle to haystack
+  vpcmpeq(XMM_TMP3, XMM_BYTE_0, Address(haystack, 0), Assembler::AVX_256bit, ae, _masm);
+
+  __ vpmovmskb(eq_mask, XMM_TMP3, Assembler::AVX_256bit);
+
+  if (!sizeKnown || (sizeKnown && (size > (isU ? 4 : 2)))) {
+    // Compare second element of needle to haystack and mask result
+    vpcmpeq(XMM_TMP3, XMM_BYTE_1, Address(haystack, isU ? 2 : 1), Assembler::AVX_256bit, ae, _masm);
+
+    __ vpmovmskb(temp1, XMM_TMP3, Assembler::AVX_256bit);
+    __ andq(eq_mask, temp1);
+  }
+
+  // Compare last element of needle to haystack, shift and mask result
+  vpcmpeq(XMM_TMP3, XMM_BYTE_K, Address(haystack, hsLength, Address::times_1, -32),
+          Assembler::AVX_256bit, ae, _masm);
+
+  __ vpmovmskb(temp1, XMM_TMP3, Assembler::AVX_256bit);
+
+  // Compute the proper shift value.  If we let k be the needle length and n be the haystack
+  // length, we should be comparing to haystack[k - 1] through haystack[k - 1 + 31].  Since
+  // (n - k) < 32, (k - 1 + 31) would be past the end of the haystack.  So the shift value
+  // is computed as (k + 31 - n).
+  //
+  // Clarification:  The BYTE_K compare above compares haystack[(n-32):(n-1)].  We need to
+  // compare haystack[(k-1):(k-1+31)].  Subtracting either index gives shift value of
+  // (k + 31 - n):  x = (k-1+31)-(n-1) = k-1+31-n+1 = k+31-n.
+  if (sizeKnown) {
+    __ movl(temp2, 31 + size);
+  } else {
+    __ movl(temp2, 31);
+    __ addl(temp2, needleLen);
+  }
+  __ subl(temp2, hsLength);
+  __ shrxl(temp1, temp1, temp2);
+  __ andl(eq_mask, temp1);
+
+  __ testl(eq_mask, eq_mask);
+  __ je(noMatch);
+
+  __ jmp(L_out);
+
+  __ bind(L_greaterThan32);
+
+  // Read 32-byte chunks at a time until the last 32-byte read would go
+  // past the end of the haystack.  Then, set the final read to read exactly
+  // the number of bytes in the haystack.
+  // For example, if haystack length is 45 and needle length is 13, the compares
+  // will read the following bytes:
+  //
+  //  First compare          Last compare
+  //   [  0 : 31]            [12 : 43]
+  // Next compare will go past end of haystack ([32:63])
+  // Adjust so final read is:
+  //   [  1 : 32]            [13 : 44]
+
+  __ movq(hsPtrRet, haystack);
+  __ leaq(last, Address(haystack, nMinusK, Address::times_1, isU ? -30 : -31));
+  __ jmpb(L_midLoop);
+
+  __ align(OptoLoopAlignment);
+  __ bind(loop_top);
+  // An equal comparison indicates completion with no match
+  __ cmpq(hsPtrRet, last);
+  __ je(noMatch);
+  __ addq(hsPtrRet, 32);
+
+  // If next compare will go beyond end of haystack adjust start of read
+  // back to last valid read position
+  __ cmpq(hsPtrRet, last);
+  __ jbe_b(L_midLoop);
+  __ movq(hsPtrRet, last);
+
+  __ bind(L_midLoop);
+
+  // compare_big_haystack_to_needle will jump to loop_top until a match has been
+  // found
+  compare_big_haystack_to_needle(sizeKnown, size, loop_top, hsPtrRet, needleLen, eq_mask, XMM_TMP1,
+                                 XMM_TMP2, XMM_TMP3, ae, _masm);
+
+  // At this point, we have at least one "match" where first and last bytes
+  // of the needle are found the correct distance apart.
+  //
+  // NOTE: haystack (rbx) should be preserved; hsPtrRet(rcx) is expected to
+  //    point to the haystack such that hsPtrRet[tzcntl(eq_mask)] points to
+  //    the matched string.
+
+  __ bind(L_out);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+// Helper for comparing small needles to the haystack after a potential match found.
+//
+// Parameters:
+// size - The size of the needle in bytes
+// L_noMatch - Label to jump to if needle does not match haystack at this location
+// L_matchFound - Label to jump to if needle matches haystack at this location
+// needle - the address of the first byte of the needle
+// needleVal - The bytes of the needle to compare
+// haystack - The address of the first byte of the haystack
+// mask - The comparison mask from comparing the first 2 and last elements of the needle
+// foundIndex - The index within the haystack of the match
+// tmp - A temporary register
+// ae - the argument encodings
+// _masm - Current MacroAssembler instance pointer
+//
+// Branches to either L_noMatch or L_matchFound depending on the result of the comparison
+// foundIndex will contain the index within the haystack of the match for L_matchFound
+
+static void byte_compare_helper(int size, Label &L_noMatch, Label &L_matchFound, Register needle,
+                                Register needleVal, Register haystack, Register mask,
+                                Register foundIndex, Register tmp, StrIntrinsicNode::ArgEncoding ae,
+                                MacroAssembler *_masm) {
+  // Compare size bytes of needle to haystack
+  //
+  // At a minimum, the first, second and last bytes of needle already compare equal
+  // to the haystack, so there is no need to compare them again.
+
+  Label L_loopTop;
+
+  assert_different_registers(needle, needleVal, haystack, mask, foundIndex, tmp);
+
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = isUL || isUU;  // At least one is UTF-16
+
+  int bytesAlreadyCompared = 0;
+  int bytesLeftToCompare = 0;
+  int offsetOfFirstByteToCompare = 0;
+
+  Label temp;
+
+  // Getting her we already have the first two and last elements of the needle
+  // comparing equal, so no need to compare them again
+  bytesAlreadyCompared = isU ? 6 : 3;
+  offsetOfFirstByteToCompare = isU ? 4 : 2;
+
+  bytesLeftToCompare = size - bytesAlreadyCompared;
+  assert(bytesLeftToCompare <= 7, "Too many bytes left to compare");
+
+  // The needle is <= 3 elements long, so the ultimate result comes from the mask
+  if (bytesLeftToCompare <= 0) {
+    __ tzcntl(foundIndex, mask);
+    __ jmp(L_matchFound);
+    return;
+  }
+
+  // At this point, there is at least one byte of the needle that needs to be
+  // compared to the haystack.
+
+  // Pre-load the needle bytes to compare here
+  switch (bytesLeftToCompare) {
+  case 1:
+  case 2:
+    // Load for needle size of 4 and 5 bytes
+    __ movl(needleVal, Address(needle, (offsetOfFirstByteToCompare - 2)));
+    break;
+
+  case 3:
+  case 4:
+    // Load for needle size of 6 and 7 bytes
+    __ movl(needleVal, Address(needle, offsetOfFirstByteToCompare));
+    break;
+
+  case 5:
+  case 6:
+    // Load for needle size of 8 and 9 bytes
+    __ movq(needleVal, Address(needle, (offsetOfFirstByteToCompare - 2)));
+    break;
+
+  case 7:
+    // Load for needle size of 10 bytes
+    __ movq(needleVal, Address(needle, offsetOfFirstByteToCompare));
+    break;
+
+  default:
+    break;
+  }
+
+  __ align(OptoLoopAlignment);
+  __ bind(L_loopTop);
+  __ tzcntl(foundIndex, mask);  // Index of match within haystack
+
+  switch (bytesLeftToCompare) {
+  case 1:
+  case 2:
+    // Comparison for needle size of 4 and 5 bytes
+    __ cmpl(Address(haystack, foundIndex, Address::times_1, offsetOfFirstByteToCompare - 2),
+            needleVal);
+    __ je(L_matchFound);
+    break;
+
+  case 3:
+  case 4:
+    // Comparison for needle size of 6 and 7 bytes
+    __ cmpl(Address(haystack, foundIndex, Address::times_1, offsetOfFirstByteToCompare), needleVal);
+    __ je(L_matchFound);
+    break;
+
+  case 5:
+  case 6:
+    // Comparison for needle size of 8 and 9 bytes
+    __ cmpq(Address(haystack, foundIndex, Address::times_1, offsetOfFirstByteToCompare - 2),
+            needleVal);
+    __ je(L_matchFound);
+    break;
+
+  case 7:
+    // Comparison for needle size of 10 bytes
+    __ cmpq(Address(haystack, foundIndex, Address::times_1, offsetOfFirstByteToCompare), needleVal);
+    __ je(L_matchFound);
+    break;
+
+  default:
+    break;
+  }
+
+  CLEAR_BIT(mask);  // Loop as long as there are other bits set
+  __ jne(L_loopTop);
+  __ jmp(L_noMatch);
+}
+
+// highly_optimized_short_cases
+// We can handle the cases where haystack size is <= 32 bytes and needle size <= 6 bytes
+// as a special case.  We first copy the haystack tpo the stack to avoid page faults.  A mask is
+// generated with (n - k + 1) bits set that ensures matches past the end of the original
+// haystack do not get considered during compares. In this equation, n is length of haystack
+// and k is length of needle.
+//
+// A vector compare for the first needle byte is done against the haystack and anded with the mask.
+// For needle size == 1, if there's a match we found it, otherwise failure.  The 2nd position
+// of the needle is compared starting from the 2nd position of the haystack and anded with the
+// mask.  If needle size == 2 and a match is found, success else failure.  This continues for
+// all needle sizes up to 6 bytes.
+//
+// ae - Argument encoding
+// haystack - The address of the haystack
+// haystack_len - the length of the haystack in elements
+// needle - The address of the needle
+// needle_len - the length of the needle in elements
+// XMM0 - Temporary xmm register
+// XMM1 - Temporary xmm register
+// mask - Used to hold comparison mask
+// tmp - Temporary register
+// _masm - Current MacroAssembler instance pointer
+static void highly_optimized_short_cases(StrIntrinsicNode::ArgEncoding ae, Register haystack,
+                                         Register haystack_len, Register needle,
+                                         Register needle_len, XMMRegister XMM0, XMMRegister XMM1,
+                                         Register mask, Register tmp, MacroAssembler *_masm) {
+  // Highly optimized special-cases
+  Label L_noMatch, L_foundall, L_out;
+
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = isUL || isUU;  // At least one is UTF-16
+
+  // Only optimize when haystack can fit on stack with room
+  // left over for page fault prevention
+  assert((COPIED_HAYSTACK_STACK_OFFSET == 0), "Must be zero!");
+  assert((COPIED_HAYSTACK_STACK_SIZE == 64), "Must be 64!");
+
+  // Copy incoming haystack onto stack
+  {
+    Label L_adjustHaystack, L_moreThan16;
+
+    // Copy haystack to stack (haystack <= 32 bytes)
+    __ subptr(rsp, COPIED_HAYSTACK_STACK_SIZE);
+    __ cmpq(haystack_len, isU ? 0x8 : 0x10);
+    __ ja_b(L_moreThan16);
+
+    __ movq(tmp, COPIED_HAYSTACK_STACK_OFFSET + 0x10);
+    __ movdqu(XMM0, Address(haystack, haystack_len, isU ? Address::times_2 : Address::times_1, -0x10));
+    __ movdqu(Address(rsp, COPIED_HAYSTACK_STACK_OFFSET), XMM0);
+    __ jmpb(L_adjustHaystack);
+
+    __ bind(L_moreThan16);
+    __ movq(tmp, COPIED_HAYSTACK_STACK_OFFSET + 0x20);
+    __ vmovdqu(XMM0, Address(haystack, haystack_len, isU ? Address::times_2 : Address::times_1, -0x20));
+    __ vmovdqu(Address(rsp, COPIED_HAYSTACK_STACK_OFFSET), XMM0);
+
+    __ bind(L_adjustHaystack);
+    __ subptr(tmp, haystack_len);
+
+    if (isU) {
+      // For UTF-16, lengths are half
+      __ subptr(tmp, haystack_len);
+    }
+    // Point the haystack to the stack
+    __ leaq(haystack, Address(rsp, tmp, Address::times_1));
+  }
+
+  // Creates a mask of (n - k + 1) ones.  This prevents recognizing any false-positives
+  // past the end of the valid haystack.
+  __ movq(mask, -1);
+  __ subq(haystack_len, needle_len);
+  __ incrementq(haystack_len);
+  if (isU) {
+    __ shlq(haystack_len, 1);
+  }
+  __ bzhiq(mask, mask, haystack_len);
+
+  // Loop for each needle size from 1 to 6 bytes long.  For UU, only 3 elements.
+  for (int size = 1; size <= (isUU ? 3 : 6); size++) {
+    // Broadcast next needle byte into ymm register
+    int needle_position = isUU ? (size - 1) * 2 : size - 1;
+    int haystack_position = isU ? (size - 1) * 2 : size - 1;
+    if (isUU) {
+      __ vpbroadcastw(XMM0, Address(needle, needle_position), Assembler::AVX_256bit);
+    } else if (isUL) {
+      // Expand needle
+      __ movzbl(tmp, Address(needle, needle_position));
+      __ movdl(XMM0, tmp);
+      // Byte of needle to words
+      __ vpbroadcastw(XMM0, XMM0, Assembler::AVX_256bit);
+    } else {
+      __ vpbroadcastb(XMM0, Address(needle, needle_position), Assembler::AVX_256bit);
+    }
+
+    // Compare next byte.  Keep the comparison mask in mask, which will
+    // accumulate
+    vpcmpeq(XMM1, XMM0, Address(haystack, haystack_position), Assembler::AVX_256bit, ae, _masm);
+    __ vpmovmskb(tmp, XMM1, Assembler::AVX_256bit);
+    __ andq(mask, tmp);  // Accumulate matched bytes
+    __ testl(mask, mask);
+    __ je(L_noMatch);
+
+    if (size != (isUU ? 3 : 6)) {
+      // Found a match for this needle size
+      __ cmpq(needle_len, size);
+      __ je(L_foundall);
+    }
+  }
+
+  __ bind(L_foundall);
+  __ tzcntl(rax, mask);
+
+  if (isU) {
+    __ shrl(rax, 1);
+  }
+
+  __ bind(L_out);
+  __ addptr(rsp, COPIED_HAYSTACK_STACK_SIZE);
+  __ vzeroupper();
+  __ leave();
+  __ ret(0);
+
+  __ bind(L_noMatch);
+  __ movq(rax, -1);
+  __ jmpb(L_out);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+//
+// Set up jump table entries for both small and large haystack switches.
+//
+// ae - Argument encoding
+// L_error - Label to branch to if no match found
+// L_checkRange - label to jump to when match found.  Checks validity of returned index
+// L_fixup - Jump to here for big cases.  Return value is pointer to matching haystack byte
+// *big_jump_table - Address of pointer to the first element of big jump table
+// *small_jump_table - Address of pointer to the first element of small jump table
+// _masm - Current MacroAssembler instance pointer
+
+static void setup_jump_tables(StrIntrinsicNode::ArgEncoding ae, Label &L_error, Label &L_checkRange,
+                              Label &L_fixup, address *big_jump_table, address *small_jump_table,
+                              MacroAssembler *_masm) {
+  bool isUL = (ae == StrIntrinsicNode::UL);
+  bool isUU = (ae == StrIntrinsicNode::UU);
+  bool isU = isUL || isUU;  // At least one is UTF-16
+  const XMMRegister byte_1 = XMM_BYTE_1;
+
+  address big_hs_jmp_table[NUMBER_OF_CASES];    // Jump table for large haystacks
+  address small_hs_jmp_table[NUMBER_OF_CASES];  // Jump table for small haystacks
+  int jmp_ndx = 0;
+
+  ////////////////////////////////////////////////
+  //  On entry to each case, the register state is:
+  //
+  //  rax = unused
+  //  rbx = &haystack
+  //  rcx = haystack length
+  //  rdx = &needle
+  //  rsi = haystack length
+  //  rdi = &haystack
+  //  rbp = unused
+  //  r8  = unused
+  //  r9  = unused
+  //  r10 = hs_len - needle len
+  //  r11 = unused
+  //  r12 = needle length
+  //  r13 = (needle length - 1)
+  //  r14 = &needle
+  //  r15 = unused
+  //  XMM_BYTE_0 - first element of needle, broadcast
+  //  XMM_BYTE_K - last element of needle, broadcast
+
+  {
+    ////////////////////////////////////////////////////////////////////////////////////////
+    //
+    // Small haystack (<=32 bytes) switch
+    //
+    // Handle cases that were not handled in highly_optimized_short_cases, which will be
+    // haystack size <= 32 bytes with 6 < needle size < NUMBER_OF_CASES bytes.
+
+    ////////////////////////////////////////////////
+    //  The haystack is <= 32 bytes
+    //
+    // If a match is not found, branch to L_error (which will always
+    // return -1).
+    //
+    // If a match is found, jump to L_checkRange, which ensures the
+    // matched needle is not past the end of the haystack.
+    //
+    // The index where a match is found is returned in set_bit (r11).
+
+    const Register haystack = rbx;
+    const Register needle = r14;
+    const Register needle_val = r8;
+    const Register set_bit = r11;
+    const Register eq_mask = rsi;
+    const Register rTmp = rax;
+
+    for (int i = 6; i < NUMBER_OF_CASES; i++) {
+      small_hs_jmp_table[i] = __ pc();
+      if (isU && ((i + 1) & 1)) {
+        continue;
+      } else {
+        broadcast_additional_needles(true, i + 1, needle, noreg, rTmp, ae, _masm);
+
+        compare_haystack_to_needle(true, i + 1, L_error, haystack, eq_mask, noreg, rTmp, XMM_TMP1,
+                                   XMM_TMP2, ae, _masm);
+
+        byte_compare_helper(i + 1, L_error, L_checkRange, needle, needle_val, haystack, eq_mask,
+                            set_bit, rTmp, ae, _masm);
+      }
+    }
+  }
+
+  ////////////////////////////////////////////////////////////////////////////////////////
+  //
+  // Large haystack (> 32 bytes) switch
+
+  {
+    ////////////////////////////////////////////////
+    //  The haystack is > 32 bytes
+    //
+    // The value returned on a match is in hs_ptr (rcx) which is the address
+    // of the first matching byte within the haystack.  The L_fixup label
+    // takes hs_ptr (rcx), haystack (rbx), and set_bit (r8) to compute the
+    // index as: hs_ptr - haystack + r8.  hs_ptr - haystack is the offset
+    // within the haystack of the 32-byte chunk wherein a match was found,
+    // and set_bit is the index within that 32-byte chunk of the matching string.
+
+    const Register haystack = rbx;
+    const Register needle = r14;
+    const Register needle_len = r12;
+    const Register needle_val = r15;
+    const Register set_bit = r8;
+    const Register eq_mask = r9;
+    const Register hs_ptr = rcx;
+    const Register hsLength = rsi;
+    const Register rTmp1 = rdi;
+    const Register rTmp2 = r15;
+    const Register rTmp3 = rdx;
+    const Register rTmp4 = r13;
+
+    for (int i = 0; i < NUMBER_OF_CASES; i++) {
+      big_hs_jmp_table[i] = __ pc();
+      if (isU && ((i + 1) & 1)) {
+        continue;
+      } else {
+        Label L_loopTop;
+
+        big_case_loop_helper(true, i + 1, L_error, L_loopTop, eq_mask, hs_ptr, needle_len,
+                             needle, haystack, hsLength, rTmp1, rTmp2, rTmp3, rTmp4, ae, _masm);
+        byte_compare_helper(i + 1, L_loopTop, L_fixup, needle, needle_val, hs_ptr, eq_mask, set_bit,
+                            rTmp4, ae, _masm);
+      }
+    }
+  }
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  ////////////////////////////////////////////////////////////////////////////////////////
+  // JUMP TABLES
+  __ align(8);
+
+  *big_jump_table = __ pc();
+
+  for (jmp_ndx = 0; jmp_ndx < NUMBER_OF_CASES; jmp_ndx++) {
+    __ emit_address(big_hs_jmp_table[jmp_ndx]);
+  }
+
+  *small_jump_table = __ pc();
+
+  for (jmp_ndx = 0; jmp_ndx < NUMBER_OF_CASES; jmp_ndx++) {
+    __ emit_address(small_hs_jmp_table[jmp_ndx]);
+  }
+}
+
+#undef STACK_SPACE
+#undef MAX_NEEDLE_LEN_TO_EXPAND
+#undef CLEAR_BIT
+#undef XMM_BYTE_0
+#undef XMM_BYTE_K
+#undef XMM_BYTE_1
+#undef XMM_TMP1
+#undef XMM_TMP2
+#undef XMM_TMP3
+#undef XMM_TMP4
+
+#undef __
diff --git a/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp b/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp
index b71b5a2ab47..64ad7430674 100644
--- a/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp
+++ b/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp
@@ -583,6 +583,25 @@ void SaveLiveRegisters::initialize(BarrierStubC2* stub) {
   caller_saved.Insert(OptoReg::as_OptoReg(r10->as_VMReg()));
   caller_saved.Insert(OptoReg::as_OptoReg(r11->as_VMReg()));
 
+  if (UseAPX) {
+    caller_saved.Insert(OptoReg::as_OptoReg(r16->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r17->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r18->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r19->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r20->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r21->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r22->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r23->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r24->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r25->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r26->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r27->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r28->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r29->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r30->as_VMReg()));
+    caller_saved.Insert(OptoReg::as_OptoReg(r31->as_VMReg()));
+  }
+
   int gp_spill_size = 0;
   int opmask_spill_size = 0;
   int xmm_spill_size = 0;
diff --git a/src/hotspot/cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp b/src/hotspot/cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp
index 4805b213084..a7dc34b17b1 100644
--- a/src/hotspot/cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp
+++ b/src/hotspot/cpu/x86/gc/x/xBarrierSetAssembler_x86.cpp
@@ -484,6 +484,25 @@ class XSaveLiveRegisters {
     caller_saved.Insert(OptoReg::as_OptoReg(r11->as_VMReg()));
     caller_saved.Remove(OptoReg::as_OptoReg(stub->ref()->as_VMReg()));
 
+    if (UseAPX) {
+      caller_saved.Insert(OptoReg::as_OptoReg(r16->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r17->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r18->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r19->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r20->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r21->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r22->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r23->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r24->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r25->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r26->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r27->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r28->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r29->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r30->as_VMReg()));
+      caller_saved.Insert(OptoReg::as_OptoReg(r31->as_VMReg()));
+    }
+
     // Create mask of live registers
     RegMask live = stub->live();
     if (stub->tmp() != noreg) {
diff --git a/src/hotspot/cpu/x86/globalDefinitions_x86.hpp b/src/hotspot/cpu/x86/globalDefinitions_x86.hpp
index 2e82453b380..12ac26aff21 100644
--- a/src/hotspot/cpu/x86/globalDefinitions_x86.hpp
+++ b/src/hotspot/cpu/x86/globalDefinitions_x86.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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
@@ -52,11 +52,6 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
 #define DEFAULT_PADDING_SIZE DEFAULT_CACHE_LINE_SIZE
 #endif
 
-#if defined(COMPILER2)
-// Include Restricted Transactional Memory lock eliding optimization
-#define INCLUDE_RTM_OPT 1
-#endif
-
 #if defined(LINUX) || defined(__APPLE__)
 #define SUPPORT_RESERVED_STACK_AREA
 #endif
diff --git a/src/hotspot/cpu/x86/globals_x86.hpp b/src/hotspot/cpu/x86/globals_x86.hpp
index d73a8d03171..54888a9f849 100644
--- a/src/hotspot/cpu/x86/globals_x86.hpp
+++ b/src/hotspot/cpu/x86/globals_x86.hpp
@@ -115,6 +115,9 @@ define_pd_global(intx, InitArrayShortSize, 8*BytesPerLong);
           "Highest supported AVX instructions set on x86/x64")              \
           range(0, 3)                                                       \
                                                                             \
+  product(bool, UseAPX, false, EXPERIMENTAL,                                \
+          "Use Intel Advanced Performance Extensions")                      \
+                                                                            \
   product(bool, UseKNLSetting, false, DIAGNOSTIC,                           \
           "Control whether Knights platform setting should be used")        \
                                                                             \
@@ -151,51 +154,6 @@ define_pd_global(intx, InitArrayShortSize, 8*BytesPerLong);
   product(bool, UseFastStosb, false,                                        \
           "Use fast-string operation for zeroing: rep stosb")               \
                                                                             \
-  /* Use Restricted Transactional Memory for lock eliding */                \
-  product(bool, UseRTMLocking, false,                                       \
-          "(Deprecated) Enable RTM lock eliding for inflated locks "        \
-          "in compiled code")                                               \
-                                                                            \
-  product(bool, UseRTMForStackLocks, false, EXPERIMENTAL,                   \
-          "Enable RTM lock eliding for stack locks in compiled code")       \
-                                                                            \
-  product(bool, UseRTMDeopt, false,                                         \
-          "(Deprecated) Perform deopt and recompilation based on "          \
-          "RTM abort ratio")                                                \
-                                                                            \
-  product(int, RTMRetryCount, 5,                                            \
-          "(Deprecated) Number of RTM retries on lock abort or busy")       \
-          range(0, max_jint)                                                \
-                                                                            \
-  product(int, RTMSpinLoopCount, 100, EXPERIMENTAL,                         \
-          "Spin count for lock to become free before RTM retry")            \
-          range(0, max_jint)                                                \
-                                                                            \
-  product(int, RTMAbortThreshold, 1000, EXPERIMENTAL,                       \
-          "Calculate abort ratio after this number of aborts")              \
-          range(0, max_jint)                                                \
-                                                                            \
-  product(int, RTMLockingThreshold, 10000, EXPERIMENTAL,                    \
-          "Lock count at which to do RTM lock eliding without "             \
-          "abort ratio calculation")                                        \
-          range(0, max_jint)                                                \
-                                                                            \
-  product(int, RTMAbortRatio, 50, EXPERIMENTAL,                             \
-          "Lock abort ratio at which to stop use RTM lock eliding")         \
-          range(0, 100) /* natural range */                                 \
-                                                                            \
-  product(int, RTMTotalCountIncrRate, 64, EXPERIMENTAL,                     \
-          "Increment total RTM attempted lock count once every n times")    \
-          range(1, max_jint)                                                \
-          constraint(RTMTotalCountIncrRateConstraintFunc,AfterErgo)         \
-                                                                            \
-  product(intx, RTMLockingCalculationDelay, 0, EXPERIMENTAL,                \
-          "Number of milliseconds to wait before start calculating aborts " \
-          "for RTM locking")                                                \
-                                                                            \
-  product(bool, UseRTMXendForLockBusy, true, EXPERIMENTAL,                  \
-          "Use RTM Xend instead of Xabort when lock busy")                  \
-                                                                            \
   /* assembler */                                                           \
   product(bool, UseCountLeadingZerosInstruction, false,                     \
           "Use count leading zeros instruction")                            \
@@ -233,9 +191,6 @@ define_pd_global(intx, InitArrayShortSize, 8*BytesPerLong);
   product(bool, IntelJccErratumMitigation, true, DIAGNOSTIC,                \
              "Turn off JVM mitigations related to Intel micro code "        \
              "mitigations for the Intel JCC erratum")                       \
-                                                                            \
-  product(bool, UseAPX, false, EXPERIMENTAL,                                \
-          "Use Advanced Performance Extensions on x86")                     \
 // end of ARCH_FLAGS
 
 #endif // CPU_X86_GLOBALS_X86_HPP
diff --git a/src/hotspot/cpu/x86/interp_masm_x86.cpp b/src/hotspot/cpu/x86/interp_masm_x86.cpp
index 4329b0b6411..57d77bafd4b 100644
--- a/src/hotspot/cpu/x86/interp_masm_x86.cpp
+++ b/src/hotspot/cpu/x86/interp_masm_x86.cpp
@@ -1955,8 +1955,7 @@ void InterpreterMacroAssembler::notify_method_entry() {
     bind(L);
   }
 
-  {
-    SkipIfEqual skip(this, &DTraceMethodProbes, false, rscratch1);
+  if (DTraceMethodProbes) {
     NOT_LP64(get_thread(rthread);)
     get_method(rarg);
     call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
@@ -2000,8 +1999,7 @@ void InterpreterMacroAssembler::notify_method_exit(
     pop(state);
   }
 
-  {
-    SkipIfEqual skip(this, &DTraceMethodProbes, false, rscratch1);
+  if (DTraceMethodProbes) {
     push(state);
     NOT_LP64(get_thread(rthread);)
     get_method(rarg);
diff --git a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp
index 09056b374ad..8eff2590bfc 100644
--- a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp
+++ b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -39,6 +39,9 @@
 #include "classfile/vmSymbols.hpp"
 #include "code/vmreg.hpp"
 #include "vmreg_x86.inline.hpp"
+#if INCLUDE_ZGC
+#include "gc/z/zBarrierSetAssembler.hpp"
+#endif
 
 jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMCI_TRAPS) {
   if (inst->is_call() || inst->is_jump()) {
@@ -46,12 +49,17 @@ jint CodeInstaller::pd_next_offset(NativeInstruction* inst, jint pc_offset, JVMC
     return (pc_offset + NativeCall::instruction_size);
   } else if (inst->is_mov_literal64()) {
     // mov+call instruction pair
-    jint offset = pc_offset + NativeMovConstReg::instruction_size;
+    jint offset = pc_offset + ((NativeMovConstReg*)inst)->instruction_size();
     u_char* call = (u_char*) (_instructions->start() + offset);
     if (call[0] == Assembler::REX_B) {
       offset += 1; /* prefix byte for extended register R8-R15 */
       call++;
     }
+    if (call[0] == Assembler::REX2) {
+      offset += 2; /* prefix byte for APX extended GPR register R16-R31 */
+      call+=2;
+    }
+    // Register indirect call.
     assert(call[0] == 0xFF, "expected call");
     offset += 2; /* opcode byte + modrm byte */
     return (offset);
@@ -197,7 +205,7 @@ void CodeInstaller::pd_relocate_JavaMethod(CodeBuffer &, methodHandle& method, j
   }
 }
 
-void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
+bool CodeInstaller::pd_relocate(address pc, jint mark) {
   switch (mark) {
     case POLL_NEAR:
     case POLL_FAR:
@@ -206,15 +214,37 @@ void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
       // so that poll_Relocation::fix_relocation_after_move does the right
       // thing (i.e. ignores this relocation record)
       _instructions->relocate(pc, relocInfo::poll_type, Assembler::imm_operand);
-      break;
+      return true;
     case POLL_RETURN_NEAR:
     case POLL_RETURN_FAR:
       // see comment above for POLL_FAR
       _instructions->relocate(pc, relocInfo::poll_return_type, Assembler::imm_operand);
-      break;
+      return true;
+#if INCLUDE_ZGC
+    case Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadGoodBeforeShl);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_LOAD_BAD_AFTER_TEST:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatLoadBadAfterTest);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_AFTER_TEST:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatMarkBadAfterTest);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_CMP:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterCmp);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_AFTER_TEST:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreBadAfterTest);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_OR:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterOr);
+      return true;
+    case Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV:
+      _instructions->relocate(pc, barrier_Relocation::spec(), ZBarrierRelocationFormatStoreGoodAfterMov);
+      return true;
+#endif
     default:
-      JVMCI_ERROR("invalid mark value: %d", mark);
-      break;
+      return false;
   }
 }
 
diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.cpp b/src/hotspot/cpu/x86/macroAssembler_x86.cpp
index 851b89a0a06..affd18f937c 100644
--- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp
+++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp
@@ -4087,6 +4087,11 @@ RegSet MacroAssembler::call_clobbered_gp_registers() {
   regs += RegSet::range(r8, r11);
 #else
   regs += RegSet::of(rax, rcx, rdx);
+#endif
+#ifdef _LP64
+  if (UseAPX) {
+    regs += RegSet::range(r16, as_Register(Register::number_of_registers - 1));
+  }
 #endif
   return regs;
 }
@@ -5137,7 +5142,7 @@ void MacroAssembler::_verify_oop(Register reg, const char* s, const char* file,
     ss.print("verify_oop: %s: %s (%s:%d)", reg->name(), s, file, line);
     b = code_string(ss.as_string());
   }
-  ExternalAddress buffer((address) b);
+  AddressLiteral buffer((address) b, external_word_Relocation::spec_for_immediate());
   pushptr(buffer.addr(), rscratch1);
 
   // call indirectly to solve generation ordering problem
@@ -5207,7 +5212,7 @@ void MacroAssembler::_verify_oop_addr(Address addr, const char* s, const char* f
     ss.print("verify_oop_addr: %s (%s:%d)", s, file, line);
     b = code_string(ss.as_string());
   }
-  ExternalAddress buffer((address) b);
+  AddressLiteral buffer((address) b, external_word_Relocation::spec_for_immediate());
   pushptr(buffer.addr(), rscratch1);
 
   // call indirectly to solve generation ordering problem
@@ -10379,3 +10384,45 @@ void MacroAssembler::lightweight_unlock(Register obj, Register reg_rax, Register
 
   bind(unlocked);
 }
+
+#ifdef _LP64
+// Saves legacy GPRs state on stack.
+void MacroAssembler::save_legacy_gprs() {
+  subq(rsp, 16 * wordSize);
+  movq(Address(rsp, 15 * wordSize), rax);
+  movq(Address(rsp, 14 * wordSize), rcx);
+  movq(Address(rsp, 13 * wordSize), rdx);
+  movq(Address(rsp, 12 * wordSize), rbx);
+  movq(Address(rsp, 10 * wordSize), rbp);
+  movq(Address(rsp, 9 * wordSize), rsi);
+  movq(Address(rsp, 8 * wordSize), rdi);
+  movq(Address(rsp, 7 * wordSize), r8);
+  movq(Address(rsp, 6 * wordSize), r9);
+  movq(Address(rsp, 5 * wordSize), r10);
+  movq(Address(rsp, 4 * wordSize), r11);
+  movq(Address(rsp, 3 * wordSize), r12);
+  movq(Address(rsp, 2 * wordSize), r13);
+  movq(Address(rsp, wordSize), r14);
+  movq(Address(rsp, 0), r15);
+}
+
+// Resotres back legacy GPRs state from stack.
+void MacroAssembler::restore_legacy_gprs() {
+  movq(r15, Address(rsp, 0));
+  movq(r14, Address(rsp, wordSize));
+  movq(r13, Address(rsp, 2 * wordSize));
+  movq(r12, Address(rsp, 3 * wordSize));
+  movq(r11, Address(rsp, 4 * wordSize));
+  movq(r10, Address(rsp, 5 * wordSize));
+  movq(r9,  Address(rsp, 6 * wordSize));
+  movq(r8,  Address(rsp, 7 * wordSize));
+  movq(rdi, Address(rsp, 8 * wordSize));
+  movq(rsi, Address(rsp, 9 * wordSize));
+  movq(rbp, Address(rsp, 10 * wordSize));
+  movq(rbx, Address(rsp, 12 * wordSize));
+  movq(rdx, Address(rsp, 13 * wordSize));
+  movq(rcx, Address(rsp, 14 * wordSize));
+  movq(rax, Address(rsp, 15 * wordSize));
+  addq(rsp, 16 * wordSize);
+}
+#endif
diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.hpp b/src/hotspot/cpu/x86/macroAssembler_x86.hpp
index fd989c7bd22..2ecd2bbe96d 100644
--- a/src/hotspot/cpu/x86/macroAssembler_x86.hpp
+++ b/src/hotspot/cpu/x86/macroAssembler_x86.hpp
@@ -30,7 +30,6 @@
 #include "code/vmreg.inline.hpp"
 #include "compiler/oopMap.hpp"
 #include "utilities/macros.hpp"
-#include "runtime/rtmLocking.hpp"
 #include "runtime/vm_version.hpp"
 #include "utilities/checkedCast.hpp"
 
@@ -2151,6 +2150,11 @@ class MacroAssembler: public Assembler {
 
   void lightweight_lock(Register obj, Register reg_rax, Register thread, Register tmp, Label& slow);
   void lightweight_unlock(Register obj, Register reg_rax, Register thread, Register tmp, Label& slow);
+
+#ifdef _LP64
+  void save_legacy_gprs();
+  void restore_legacy_gprs();
+#endif
 };
 
 /**
diff --git a/src/hotspot/cpu/x86/methodHandles_x86.cpp b/src/hotspot/cpu/x86/methodHandles_x86.cpp
index 16973816f7b..de897d71fac 100644
--- a/src/hotspot/cpu/x86/methodHandles_x86.cpp
+++ b/src/hotspot/cpu/x86/methodHandles_x86.cpp
@@ -536,10 +536,11 @@ void trace_method_handle_stub(const char* adaptername,
       Register r = as_Register(i);
       // The registers are stored in reverse order on the stack (by pusha).
 #ifdef AMD64
-      assert(Register::number_of_registers == 16, "sanity");
+      int num_regs = UseAPX ? 32 : 16;
+      assert(Register::available_gp_registers() == num_regs, "sanity");
       if (r == rsp) {
         // rsp is actually not stored by pusha(), compute the old rsp from saved_regs (rsp after pusha): saved_regs + 16 = old rsp
-        ls.print("%3s=" PTR_FORMAT, r->name(), (intptr_t)(&saved_regs[16]));
+        ls.print("%3s=" PTR_FORMAT, r->name(), (intptr_t)(&saved_regs[num_regs]));
       } else {
         ls.print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]);
       }
diff --git a/src/hotspot/cpu/x86/nativeInst_x86.cpp b/src/hotspot/cpu/x86/nativeInst_x86.cpp
index b59f4246256..395c3219809 100644
--- a/src/hotspot/cpu/x86/nativeInst_x86.cpp
+++ b/src/hotspot/cpu/x86/nativeInst_x86.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -41,143 +41,6 @@ void NativeInstruction::wrote(int offset) {
   ICache::invalidate_word(addr_at(offset));
 }
 
-#ifdef ASSERT
-void NativeLoadGot::report_and_fail() const {
-  tty->print_cr("Addr: " INTPTR_FORMAT " Code: %x %x %x", p2i(instruction_address()),
-                  (has_rex ? ubyte_at(0) : 0), ubyte_at(rex_size), ubyte_at(rex_size + 1));
-  fatal("not a indirect rip mov to rbx");
-}
-
-void NativeLoadGot::verify() const {
-  if (has_rex) {
-    int rex = ubyte_at(0);
-    if (rex != rex_prefix && rex != rex_b_prefix) {
-      report_and_fail();
-    }
-  }
-
-  int inst = ubyte_at(rex_size);
-  if (inst != instruction_code) {
-    report_and_fail();
-  }
-  int modrm = ubyte_at(rex_size + 1);
-  if (modrm != modrm_rbx_code && modrm != modrm_rax_code) {
-    report_and_fail();
-  }
-}
-#endif
-
-intptr_t NativeLoadGot::data() const {
-  return *(intptr_t *) got_address();
-}
-
-address NativePltCall::destination() const {
-  NativeGotJump* jump = nativeGotJump_at(plt_jump());
-  return jump->destination();
-}
-
-address NativePltCall::plt_entry() const {
-  return return_address() + displacement();
-}
-
-address NativePltCall::plt_jump() const {
-  address entry = plt_entry();
-  // Virtual PLT code has move instruction first
-  if (((NativeGotJump*)entry)->is_GotJump()) {
-    return entry;
-  } else {
-    return nativeLoadGot_at(entry)->next_instruction_address();
-  }
-}
-
-address NativePltCall::plt_load_got() const {
-  address entry = plt_entry();
-  if (!((NativeGotJump*)entry)->is_GotJump()) {
-    // Virtual PLT code has move instruction first
-    return entry;
-  } else {
-    // Static PLT code has move instruction second (from c2i stub)
-    return nativeGotJump_at(entry)->next_instruction_address();
-  }
-}
-
-address NativePltCall::plt_c2i_stub() const {
-  address entry = plt_load_got();
-  // This method should be called only for static calls which has C2I stub.
-  NativeLoadGot* load = nativeLoadGot_at(entry);
-  return entry;
-}
-
-address NativePltCall::plt_resolve_call() const {
-  NativeGotJump* jump = nativeGotJump_at(plt_jump());
-  address entry = jump->next_instruction_address();
-  if (((NativeGotJump*)entry)->is_GotJump()) {
-    return entry;
-  } else {
-    // c2i stub 2 instructions
-    entry = nativeLoadGot_at(entry)->next_instruction_address();
-    return nativeGotJump_at(entry)->next_instruction_address();
-  }
-}
-
-void NativePltCall::reset_to_plt_resolve_call() {
-  set_destination_mt_safe(plt_resolve_call());
-}
-
-void NativePltCall::set_destination_mt_safe(address dest) {
-  // rewriting the value in the GOT, it should always be aligned
-  NativeGotJump* jump = nativeGotJump_at(plt_jump());
-  address* got = (address *) jump->got_address();
-  *got = dest;
-}
-
-void NativePltCall::set_stub_to_clean() {
-  NativeLoadGot* method_loader = nativeLoadGot_at(plt_c2i_stub());
-  NativeGotJump* jump          = nativeGotJump_at(method_loader->next_instruction_address());
-  method_loader->set_data(0);
-  jump->set_jump_destination((address)-1);
-}
-
-void NativePltCall::verify() const {
-  // Make sure code pattern is actually a call rip+off32 instruction.
-  int inst = ubyte_at(0);
-  if (inst != instruction_code) {
-    tty->print_cr("Addr: " INTPTR_FORMAT " Code: 0x%x", p2i(instruction_address()),
-                                                        inst);
-    fatal("not a call rip+off32");
-  }
-}
-
-address NativeGotJump::destination() const {
-  address *got_entry = (address *) got_address();
-  return *got_entry;
-}
-
-#ifdef ASSERT
-void NativeGotJump::report_and_fail() const {
-  tty->print_cr("Addr: " INTPTR_FORMAT " Code: %x %x %x", p2i(instruction_address()),
-                 (has_rex() ? ubyte_at(0) : 0), ubyte_at(rex_size()), ubyte_at(rex_size() + 1));
-  fatal("not a indirect rip jump");
-}
-
-void NativeGotJump::verify() const {
-  if (has_rex()) {
-    int rex = ubyte_at(0);
-    if (rex != rex_prefix) {
-      report_and_fail();
-    }
-  }
-  int inst = ubyte_at(rex_size());
-  if (inst != instruction_code) {
-    report_and_fail();
-  }
-  int modrm = ubyte_at(rex_size() + 1);
-  if (modrm != modrm_code) {
-    report_and_fail();
-  }
-}
-#endif
-
 void NativeCall::verify() {
   // Make sure code pattern is actually a call imm32 instruction.
   int inst = ubyte_at(0);
@@ -297,8 +160,13 @@ void NativeCall::set_destination_mt_safe(address dest) {
 void NativeMovConstReg::verify() {
 #ifdef AMD64
   // make sure code pattern is actually a mov reg64, imm64 instruction
-  if ((ubyte_at(0) != Assembler::REX_W && ubyte_at(0) != Assembler::REX_WB) ||
-      (ubyte_at(1) & (0xff ^ register_mask)) != 0xB8) {
+  bool valid_rex_prefix  = ubyte_at(0) == Assembler::REX_W || ubyte_at(0) == Assembler::REX_WB;
+  bool valid_rex2_prefix = ubyte_at(0) == Assembler::REX2  &&
+       (ubyte_at(1) == Assembler::REX2BIT_W  ||
+        ubyte_at(1) == Assembler::REX2BIT_WB ||
+        ubyte_at(1) == Assembler::REX2BIT_WB4);
+  int opcode = has_rex2_prefix() ? ubyte_at(2) : ubyte_at(1);
+  if ((!valid_rex_prefix || !valid_rex2_prefix) && (opcode & (0xff ^ register_mask)) != 0xB8) {
     print();
     fatal("not a REX.W[B] mov reg64, imm64");
   }
@@ -345,6 +213,11 @@ int NativeMovRegMem::instruction_start() const {
     instr_0 = ubyte_at(off);
   }
 
+  if (instr_0 == instruction_REX2_prefix) {
+    off+=2;
+    instr_0 = ubyte_at(off);
+  }
+
   if (instr_0 == instruction_code_xor) {
     off += 2;
     instr_0 = ubyte_at(off);
@@ -363,29 +236,39 @@ int NativeMovRegMem::instruction_start() const {
     instr_0 = ubyte_at(off);
   }
 
+  if (instr_0 == instruction_REX2_prefix) {
+    off+=2;
+    instr_0 = ubyte_at(off);
+  }
+
   if ( instr_0 >= instruction_prefix_wide_lo && // 0x40
        instr_0 <= instruction_prefix_wide_hi) { // 0x4f
     off++;
     instr_0 = ubyte_at(off);
   }
 
-
+  // Extended prefixes can only follow REX prefixes,
+  // REX2 is directly followed by main opcode.
   if (instr_0 == instruction_extended_prefix ) {  // 0x0f
     off++;
   }
 
+  // Offset of instruction opcode.
   return off;
 }
 
+// Format [REX/REX2] [OPCODE] [ModRM] [SIB] [IMM/DISP32]
 int NativeMovRegMem::patch_offset() const {
   int off = data_offset + instruction_start();
   u_char mod_rm = *(u_char*)(instruction_address() + 1);
   // nnnn(r12|rsp) isn't coded as simple mod/rm since that is
   // the encoding to use an SIB byte. Which will have the nnnn
   // field off by one byte
+  // ModRM Byte Format = Mod[2] REG[3] RM[3]
   if ((mod_rm & 7) == 0x4) {
     off++;
   }
+  // Displacement offset.
   return off;
 }
 
@@ -431,12 +314,6 @@ void NativeMovRegMem::print() {
 void NativeLoadAddress::verify() {
   // make sure code pattern is actually a mov [reg+offset], reg instruction
   u_char test_byte = *(u_char*)instruction_address();
-#ifdef _LP64
-  if ( (test_byte == instruction_prefix_wide ||
-        test_byte == instruction_prefix_wide_extended) ) {
-    test_byte = *(u_char*)(instruction_address() + 1);
-  }
-#endif // _LP64
   if ( ! ((test_byte == lea_instruction_code)
           LP64_ONLY(|| (test_byte == mov64_instruction_code) ))) {
     fatal ("not a lea reg, [reg+offs] instruction");
@@ -565,28 +442,6 @@ void NativeJump::patch_verified_entry(address entry, address verified_entry, add
 
 }
 
-address NativeFarJump::jump_destination() const          {
-  NativeMovConstReg* mov = nativeMovConstReg_at(addr_at(0));
-  return (address)mov->data();
-}
-
-void NativeFarJump::verify() {
-  if (is_far_jump()) {
-    NativeMovConstReg* mov = nativeMovConstReg_at(addr_at(0));
-    NativeInstruction* jmp = nativeInstruction_at(mov->next_instruction_address());
-    if (jmp->is_jump_reg()) return;
-  }
-  fatal("not a jump instruction");
-}
-
-void NativePopReg::insert(address code_pos, Register reg) {
-  assert(reg->encoding() < 8, "no space for REX");
-  assert(NativePopReg::instruction_size == sizeof(char), "right address unit for update");
-  *code_pos = (u_char)(instruction_code | reg->encoding());
-  ICache::invalidate_range(code_pos, instruction_size);
-}
-
-
 void NativeIllegalInstruction::insert(address code_pos) {
   assert(NativeIllegalInstruction::instruction_size == sizeof(short), "right address unit for update");
   *(short *)code_pos = instruction_code;
diff --git a/src/hotspot/cpu/x86/nativeInst_x86.hpp b/src/hotspot/cpu/x86/nativeInst_x86.hpp
index f8cbf70f189..d02387aa9ff 100644
--- a/src/hotspot/cpu/x86/nativeInst_x86.hpp
+++ b/src/hotspot/cpu/x86/nativeInst_x86.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -37,7 +37,6 @@
 // - - NativeMovRegMem
 // - - NativeMovRegMemPatching
 // - - NativeJump
-// - - NativeFarJump
 // - - NativeIllegalOpCode
 // - - NativeGeneralJump
 // - - NativeReturn
@@ -64,7 +63,6 @@ class NativeInstruction {
   inline bool is_return();
   inline bool is_jump();
   inline bool is_jump_reg();
-  inline bool is_far_jump();
   inline bool is_cond_jump();
   inline bool is_safepoint_poll();
   inline bool is_mov_literal64();
@@ -92,6 +90,7 @@ class NativeInstruction {
   void wrote(int offset);
 
  public:
+  bool has_rex2_prefix() const { return ubyte_at(0) == Assembler::REX2; }
 
   inline friend NativeInstruction* nativeInstruction_at(address address);
 };
@@ -104,47 +103,6 @@ inline NativeInstruction* nativeInstruction_at(address address) {
   return inst;
 }
 
-class NativePltCall: public NativeInstruction {
-public:
-  enum Intel_specific_constants {
-    instruction_code           = 0xE8,
-    instruction_size           =    5,
-    instruction_offset         =    0,
-    displacement_offset        =    1,
-    return_address_offset      =    5
-  };
-  address instruction_address() const { return addr_at(instruction_offset); }
-  address next_instruction_address() const { return addr_at(return_address_offset); }
-  address displacement_address() const { return addr_at(displacement_offset); }
-  int displacement() const { return (jint) int_at(displacement_offset); }
-  address return_address() const { return addr_at(return_address_offset); }
-  address destination() const;
-  address plt_entry() const;
-  address plt_jump() const;
-  address plt_load_got() const;
-  address plt_resolve_call() const;
-  address plt_c2i_stub() const;
-  void set_stub_to_clean();
-
-  void  reset_to_plt_resolve_call();
-  void  set_destination_mt_safe(address dest);
-
-  void verify() const;
-};
-
-inline NativePltCall* nativePltCall_at(address address) {
-  NativePltCall* call = (NativePltCall*) address;
-#ifdef ASSERT
-  call->verify();
-#endif
-  return call;
-}
-
-inline NativePltCall* nativePltCall_before(address addr) {
-  address at = addr - NativePltCall::instruction_size;
-  return nativePltCall_at(at);
-}
-
 class NativeCall;
 inline NativeCall* nativeCall_at(address address);
 // The NativeCall is an abstraction for accessing/manipulating native call imm32/rel32off
@@ -160,6 +118,7 @@ class NativeCall: public NativeInstruction {
     return_address_offset       =    5
   };
 
+  static int byte_size()                    { return instruction_size; }
   address instruction_address() const       { return addr_at(instruction_offset); }
   address next_instruction_address() const  { return addr_at(return_address_offset); }
   int   displacement() const                { return (jint) int_at(displacement_offset); }
@@ -220,19 +179,28 @@ inline NativeCall* nativeCall_before(address return_address) {
   return call;
 }
 
+// Call with target address in a general purpose register(indirect absolute addressing).
+// Encoding : FF /2  CALL r/m32
+// Primary Opcode: FF
+// Opcode Extension(part of ModRM.REG): /2
+// Operand ModRM.RM  = r/m32
 class NativeCallReg: public NativeInstruction {
  public:
   enum Intel_specific_constants {
     instruction_code            = 0xFF,
     instruction_offset          =    0,
     return_address_offset_norex =    2,
-    return_address_offset_rex   =    3
+    return_address_offset_rex   =    3,
+    return_address_offset_rex2  =    4
   };
 
   int next_instruction_offset() const  {
     if (ubyte_at(0) == NativeCallReg::instruction_code) {
       return return_address_offset_norex;
+    } else if (has_rex2_prefix()) {
+      return return_address_offset_rex2;
     } else {
+      assert((ubyte_at(0) & 0xF0) ==  Assembler::REX, "");
       return return_address_offset_rex;
     }
   }
@@ -240,28 +208,38 @@ class NativeCallReg: public NativeInstruction {
 
 // An interface for accessing/manipulating native mov reg, imm32 instructions.
 // (used to manipulate inlined 32bit data dll calls, etc.)
+// Instruction format for implied addressing mode immediate operand move to register instruction:
+//  [REX/REX2] [OPCODE] [IMM32]
 class NativeMovConstReg: public NativeInstruction {
 #ifdef AMD64
   static const bool has_rex = true;
   static const int rex_size = 1;
+  static const int rex2_size = 2;
 #else
   static const bool has_rex = false;
   static const int rex_size = 0;
+  static const int rex2_size = 0;
 #endif // AMD64
  public:
   enum Intel_specific_constants {
-    instruction_code            = 0xB8,
-    instruction_size            =    1 + rex_size + wordSize,
-    instruction_offset          =    0,
-    data_offset                 =    1 + rex_size,
-    next_instruction_offset     =    instruction_size,
-    register_mask               = 0x07
+    instruction_code             = 0xB8,
+    instruction_offset           =    0,
+    instruction_size_rex         =    1 + rex_size + wordSize,
+    instruction_size_rex2        =    1 + rex2_size + wordSize,
+    data_offset_rex              =    1 + rex_size,
+    data_offset_rex2             =    1 + rex2_size,
+    next_instruction_offset_rex  =    instruction_size_rex,
+    next_instruction_offset_rex2 =    instruction_size_rex2,
+    register_mask                = 0x07
   };
 
+  int instruction_size() const              { return has_rex2_prefix() ? instruction_size_rex2 : instruction_size_rex; }
+  int next_inst_offset() const              { return has_rex2_prefix() ? next_instruction_offset_rex2 : next_instruction_offset_rex; }
+  int data_byte_offset() const              { return has_rex2_prefix() ? data_offset_rex2 : data_offset_rex;}
   address instruction_address() const       { return addr_at(instruction_offset); }
-  address next_instruction_address() const  { return addr_at(next_instruction_offset); }
-  intptr_t data() const                     { return ptr_at(data_offset); }
-  void  set_data(intptr_t x)                { set_ptr_at(data_offset, x); }
+  address next_instruction_address() const  { return addr_at(next_inst_offset()); }
+  intptr_t data() const                     { return ptr_at(data_byte_offset()); }
+  void  set_data(intptr_t x)                { set_ptr_at(data_byte_offset(), x); }
 
   void  verify();
   void  print();
@@ -280,7 +258,10 @@ inline NativeMovConstReg* nativeMovConstReg_at(address address) {
 }
 
 inline NativeMovConstReg* nativeMovConstReg_before(address address) {
-  NativeMovConstReg* test = (NativeMovConstReg*)(address - NativeMovConstReg::instruction_size - NativeMovConstReg::instruction_offset);
+  int instruction_size = ((NativeInstruction*)(address))->has_rex2_prefix() ?
+                                  NativeMovConstReg::instruction_size_rex2 :
+                                  NativeMovConstReg::instruction_size_rex;
+  NativeMovConstReg* test = (NativeMovConstReg*)(address - instruction_size - NativeMovConstReg::instruction_offset);
 #ifdef ASSERT
   test->verify();
 #endif
@@ -321,35 +302,47 @@ class NativeMovRegMem: public NativeInstruction {
     instruction_prefix_wide_hi          = Assembler::REX_WRXB,
     instruction_code_xor                = 0x33,
     instruction_extended_prefix         = 0x0F,
+
+    // Legacy encoding MAP1 instructions promotable to REX2 encoding.
     instruction_code_mem2reg_movslq     = 0x63,
     instruction_code_mem2reg_movzxb     = 0xB6,
     instruction_code_mem2reg_movsxb     = 0xBE,
     instruction_code_mem2reg_movzxw     = 0xB7,
     instruction_code_mem2reg_movsxw     = 0xBF,
     instruction_operandsize_prefix      = 0x66,
+
+    // Legacy encoding MAP0 instructions promotable to REX2 encoding.
     instruction_code_reg2mem            = 0x89,
     instruction_code_mem2reg            = 0x8b,
     instruction_code_reg2memb           = 0x88,
     instruction_code_mem2regb           = 0x8a,
+    instruction_code_lea                = 0x8d,
+
     instruction_code_float_s            = 0xd9,
     instruction_code_float_d            = 0xdd,
     instruction_code_long_volatile      = 0xdf,
+
+    // VEX/EVEX/Legacy encodeded MAP1 instructions promotable to REX2 encoding.
     instruction_code_xmm_ss_prefix      = 0xf3,
     instruction_code_xmm_sd_prefix      = 0xf2,
+
     instruction_code_xmm_code           = 0x0f,
+
+    // Address operand load/store/ldp are promotable to REX2 to accomodate
+    // extended SIB encoding.
     instruction_code_xmm_load           = 0x10,
     instruction_code_xmm_store          = 0x11,
     instruction_code_xmm_lpd            = 0x12,
 
-    instruction_code_lea                = 0x8d,
-
     instruction_VEX_prefix_2bytes       = Assembler::VEX_2bytes,
     instruction_VEX_prefix_3bytes       = Assembler::VEX_3bytes,
     instruction_EVEX_prefix_4bytes      = Assembler::EVEX_4bytes,
+    instruction_REX2_prefix             = Assembler::REX2,
 
     instruction_offset                  = 0,
     data_offset                         = 2,
-    next_instruction_offset             = 4
+    next_instruction_offset_rex         = 4,
+    next_instruction_offset_rex2        = 5
   };
 
   // helper
@@ -425,57 +418,6 @@ class NativeLoadAddress: public NativeMovRegMem {
   }
 };
 
-// destination is rbx or rax
-// mov rbx, [rip + offset]
-class NativeLoadGot: public NativeInstruction {
-#ifdef AMD64
-  static const bool has_rex = true;
-  static const int rex_size = 1;
-#else
-  static const bool has_rex = false;
-  static const int rex_size = 0;
-#endif
-
-  enum Intel_specific_constants {
-    rex_prefix = 0x48,
-    rex_b_prefix = 0x49,
-    instruction_code = 0x8b,
-    modrm_rbx_code = 0x1d,
-    modrm_rax_code = 0x05,
-    instruction_length = 6 + rex_size,
-    offset_offset = 2 + rex_size
-  };
-
-  int rip_offset() const { return int_at(offset_offset); }
-  address return_address() const { return addr_at(instruction_length); }
-  address got_address() const { return return_address() + rip_offset(); }
-
-#ifdef ASSERT
-  void report_and_fail() const;
-  address instruction_address() const { return addr_at(0); }
-#endif
-
-public:
-  address next_instruction_address() const { return return_address(); }
-  intptr_t data() const;
-  void set_data(intptr_t data) {
-    intptr_t *addr = (intptr_t *) got_address();
-    *addr = data;
-  }
-
-  DEBUG_ONLY( void verify() const );
-};
-
-inline NativeLoadGot* nativeLoadGot_at(address addr) {
-  NativeLoadGot* load = (NativeLoadGot*) addr;
-#ifdef ASSERT
-  load->verify();
-#endif
-  return load;
-}
-
-// jump rel32off
-
 class NativeJump: public NativeInstruction {
  public:
   enum Intel_specific_constants {
@@ -531,27 +473,8 @@ inline NativeJump* nativeJump_at(address address) {
   return jump;
 }
 
-// far jump reg
-class NativeFarJump: public NativeInstruction {
- public:
-  address jump_destination() const;
-
-  // Creation
-  inline friend NativeFarJump* nativeFarJump_at(address address);
-
-  void verify();
-
-};
-
-inline NativeFarJump* nativeFarJump_at(address address) {
-  NativeFarJump* jump = (NativeFarJump*)(address);
-#ifdef ASSERT
-  jump->verify();
-#endif
-  return jump;
-}
-
-// Handles all kinds of jump on Intel. Long/far, conditional/unconditional
+// Handles all kinds of jump on Intel. Long/far, conditional/unconditional with relative offsets
+// barring register indirect jumps.
 class NativeGeneralJump: public NativeInstruction {
  public:
   enum Intel_specific_constants {
@@ -584,61 +507,6 @@ inline NativeGeneralJump* nativeGeneralJump_at(address address) {
   return jump;
 }
 
-class NativeGotJump: public NativeInstruction {
-  enum Intel_specific_constants {
-    rex_prefix = 0x41,
-    instruction_code = 0xff,
-    modrm_code = 0x25,
-    instruction_size = 6,
-    rip_offset = 2
-  };
-
-  bool has_rex() const { return ubyte_at(0) == rex_prefix; }
-  int rex_size() const { return has_rex() ? 1 : 0; }
-
-  address return_address() const { return addr_at(instruction_size + rex_size()); }
-  int got_offset() const { return (jint) int_at(rip_offset + rex_size()); }
-
-#ifdef ASSERT
-  void report_and_fail() const;
-  address instruction_address() const { return addr_at(0); }
-#endif
-
-public:
-  address got_address() const { return return_address() + got_offset(); }
-  address next_instruction_address() const { return return_address(); }
-  bool is_GotJump() const { return ubyte_at(rex_size()) == instruction_code; }
-
-  address destination() const;
-  void set_jump_destination(address dest)  {
-    address *got_entry = (address *) got_address();
-    *got_entry = dest;
-  }
-
-  DEBUG_ONLY( void verify() const; )
-};
-
-inline NativeGotJump* nativeGotJump_at(address addr) {
-  NativeGotJump* jump = (NativeGotJump*)(addr);
-  debug_only(jump->verify());
-  return jump;
-}
-
-class NativePopReg : public NativeInstruction {
- public:
-  enum Intel_specific_constants {
-    instruction_code            = 0x58,
-    instruction_size            =    1,
-    instruction_offset          =    0,
-    data_offset                 =    1,
-    next_instruction_offset     =    1
-  };
-
-  // Insert a pop instruction
-  static void insert(address code_pos, Register reg);
-};
-
-
 class NativeIllegalInstruction: public NativeInstruction {
  public:
   enum Intel_specific_constants {
@@ -701,13 +569,12 @@ inline bool NativeInstruction::is_jump_reg()     {
   if (ubyte_at(0) == Assembler::REX_B) pos = 1;
   return ubyte_at(pos) == 0xFF && (ubyte_at(pos + 1) & 0xF0) == 0xE0;
 }
-inline bool NativeInstruction::is_far_jump()     { return is_mov_literal64(); }
 inline bool NativeInstruction::is_cond_jump()    { return (int_at(0) & 0xF0FF) == 0x800F /* long jump */ ||
                                                           (ubyte_at(0) & 0xF0) == 0x70;  /* short jump */ }
 inline bool NativeInstruction::is_safepoint_poll() {
 #ifdef AMD64
   const bool has_rex_prefix = ubyte_at(0) == NativeTstRegMem::instruction_rex_b_prefix;
-  const int test_offset = has_rex_prefix ? 1 : 0;
+  const int test_offset = has_rex2_prefix() ? 2 : (has_rex_prefix ? 1 : 0);
 #else
   const int test_offset = 0;
 #endif
@@ -718,8 +585,14 @@ inline bool NativeInstruction::is_safepoint_poll() {
 
 inline bool NativeInstruction::is_mov_literal64() {
 #ifdef AMD64
-  return ((ubyte_at(0) == Assembler::REX_W || ubyte_at(0) == Assembler::REX_WB) &&
-          (ubyte_at(1) & (0xff ^ NativeMovConstReg::register_mask)) == 0xB8);
+  bool valid_rex_prefix  = ubyte_at(0) == Assembler::REX_W || ubyte_at(0) == Assembler::REX_WB;
+  bool valid_rex2_prefix = ubyte_at(0) == Assembler::REX2  &&
+       (ubyte_at(1) == Assembler::REX2BIT_W  ||
+        ubyte_at(1) == Assembler::REX2BIT_WB ||
+        ubyte_at(1) == Assembler::REX2BIT_WB4);
+
+  int opcode = has_rex2_prefix() ? ubyte_at(2) : ubyte_at(1);
+  return ((valid_rex_prefix || valid_rex2_prefix) &&  (opcode & (0xff ^ NativeMovConstReg::register_mask)) == 0xB8);
 #else
   return false;
 #endif // AMD64
diff --git a/src/hotspot/cpu/x86/register_x86.cpp b/src/hotspot/cpu/x86/register_x86.cpp
index 2aae4a795e3..bb26ab66051 100644
--- a/src/hotspot/cpu/x86/register_x86.cpp
+++ b/src/hotspot/cpu/x86/register_x86.cpp
@@ -35,7 +35,9 @@ const char * Register::RegisterImpl::name() const {
   static const char *const names[number_of_registers] = {
 #ifdef _LP64
     "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
-    "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15"
+    "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
+    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
 #else
     "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
 #endif // _LP64
diff --git a/src/hotspot/cpu/x86/register_x86.hpp b/src/hotspot/cpu/x86/register_x86.hpp
index 5449f0d9724..6844fdc248d 100644
--- a/src/hotspot/cpu/x86/register_x86.hpp
+++ b/src/hotspot/cpu/x86/register_x86.hpp
@@ -45,8 +45,8 @@ class Register {
   inline friend constexpr Register as_Register(int encoding);
 
   enum {
-    number_of_registers      = LP64_ONLY( 16 ) NOT_LP64( 8 ),
-    number_of_byte_registers = LP64_ONLY( 16 ) NOT_LP64( 4 ),
+    number_of_registers      = LP64_ONLY( 32 ) NOT_LP64( 8 ),
+    number_of_byte_registers = LP64_ONLY( 32 ) NOT_LP64( 4 ),
     max_slots_per_register   = LP64_ONLY(  2 ) NOT_LP64( 1 )
   };
 
@@ -76,6 +76,16 @@ class Register {
   int operator!=(const Register r) const { return _encoding != r._encoding; }
 
   constexpr const RegisterImpl* operator->() const { return RegisterImpl::first() + _encoding; }
+
+  // Actually available GP registers for use, depending on actual CPU capabilities and flags.
+  static int available_gp_registers() {
+#ifdef _LP64
+    if (!UseAPX) {
+      return number_of_registers / 2;
+    }
+#endif // _LP64
+    return number_of_registers;
+  }
 };
 
 extern const Register::RegisterImpl all_RegisterImpls[Register::number_of_registers + 1] INTERNAL_VISIBILITY;
@@ -115,6 +125,22 @@ constexpr Register r12 = as_Register(12);
 constexpr Register r13 = as_Register(13);
 constexpr Register r14 = as_Register(14);
 constexpr Register r15 = as_Register(15);
+constexpr Register r16 = as_Register(16);
+constexpr Register r17 = as_Register(17);
+constexpr Register r18 = as_Register(18);
+constexpr Register r19 = as_Register(19);
+constexpr Register r20 = as_Register(20);
+constexpr Register r21 = as_Register(21);
+constexpr Register r22 = as_Register(22);
+constexpr Register r23 = as_Register(23);
+constexpr Register r24 = as_Register(24);
+constexpr Register r25 = as_Register(25);
+constexpr Register r26 = as_Register(26);
+constexpr Register r27 = as_Register(27);
+constexpr Register r28 = as_Register(28);
+constexpr Register r29 = as_Register(29);
+constexpr Register r30 = as_Register(30);
+constexpr Register r31 = as_Register(31);
 #endif // _LP64
 
 
diff --git a/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp b/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp
index febc1b2c3b1..6303c279195 100644
--- a/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp
+++ b/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp
@@ -1476,13 +1476,6 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   // Frame is now completed as far as size and linkage.
   int frame_complete = ((intptr_t)__ pc()) - start;
 
-  if (UseRTMLocking) {
-    // Abort RTM transaction before calling JNI
-    // because critical section will be large and will be
-    // aborted anyway. Also nmethod could be deoptimized.
-    __ xabort(0);
-  }
-
   // Calculate the difference between rsp and rbp,. We need to know it
   // after the native call because on windows Java Natives will pop
   // the arguments and it is painful to do rsp relative addressing
@@ -1619,8 +1612,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   // We have all of the arguments setup at this point. We must not touch any register
   // argument registers at this point (what if we save/restore them there are no oop?
 
-  {
-    SkipIfEqual skip_if(masm, &DTraceMethodProbes, 0, noreg);
+  if (DTraceMethodProbes) {
     __ mov_metadata(rax, method());
     __ call_VM_leaf(
          CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry),
@@ -1864,8 +1856,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
     __ bind(fast_done);
   }
 
-  {
-    SkipIfEqual skip_if(masm, &DTraceMethodProbes, 0, noreg);
+  if (DTraceMethodProbes) {
     // Tell dtrace about this method exit
     save_native_result(masm, ret_type, stack_slots);
     __ mov_metadata(rax, method());
@@ -2422,11 +2413,6 @@ void SharedRuntime::generate_uncommon_trap_blob() {
 
   address start = __ pc();
 
-  if (UseRTMLocking) {
-    // Abort RTM transaction before possible nmethod deoptimization.
-    __ xabort(0);
-  }
-
   // Push self-frame.
   __ subptr(rsp, return_off*wordSize);     // Epilog!
 
@@ -2609,13 +2595,6 @@ SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_t
   bool cause_return = (poll_type == POLL_AT_RETURN);
   bool save_vectors = (poll_type == POLL_AT_VECTOR_LOOP);
 
-  if (UseRTMLocking) {
-    // Abort RTM transaction before calling runtime
-    // because critical section will be large and will be
-    // aborted anyway. Also nmethod could be deoptimized.
-    __ xabort(0);
-  }
-
   // If cause_return is true we are at a poll_return and there is
   // the return address on the stack to the caller on the nmethod
   // that is safepoint. We can leave this return on the stack and
diff --git a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp
index 31bbfb747f8..decaa9d1ee9 100644
--- a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp
+++ b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp
@@ -95,6 +95,7 @@ class RegisterSaver {
   // units because compiler frame slots are jints.
 #define XSAVE_AREA_BEGIN 160
 #define XSAVE_AREA_YMM_BEGIN 576
+#define XSAVE_AREA_EGPRS 960
 #define XSAVE_AREA_OPMASK_BEGIN 1088
 #define XSAVE_AREA_ZMM_BEGIN 1152
 #define XSAVE_AREA_UPPERBANK 1664
@@ -104,8 +105,8 @@ class RegisterSaver {
 #define DEF_OPMASK_OFFS(regnum)    opmask ## regnum ## _off = opmask_off + (regnum)*8/BytesPerInt,     opmask ## regnum ## H_off
 #define DEF_ZMM_UPPER_OFFS(regnum) zmm ## regnum ## _off = zmm_upper_off + (regnum-16)*64/BytesPerInt, zmm ## regnum ## H_off
   enum layout {
-    fpu_state_off = frame::arg_reg_save_area_bytes/BytesPerInt, // fxsave save area
-    xmm_off       = fpu_state_off + XSAVE_AREA_BEGIN/BytesPerInt,            // offset in fxsave save area
+    fpu_state_off = frame::arg_reg_save_area_bytes/BytesPerInt,    // fxsave save area
+    xmm_off       = fpu_state_off + XSAVE_AREA_BEGIN/BytesPerInt,  // offset in fxsave save area
     DEF_XMM_OFFS(0),
     DEF_XMM_OFFS(1),
     // 2..15 are implied in range usage
@@ -113,7 +114,24 @@ class RegisterSaver {
     DEF_YMM_OFFS(0),
     DEF_YMM_OFFS(1),
     // 2..15 are implied in range usage
-    opmask_off         = xmm_off + (XSAVE_AREA_OPMASK_BEGIN - XSAVE_AREA_BEGIN)/BytesPerInt,
+    r31_off = xmm_off + (XSAVE_AREA_EGPRS - XSAVE_AREA_BEGIN)/BytesPerInt,
+    r31H_off,
+    r30_off, r30H_off,
+    r29_off, r29H_off,
+    r28_off, r28H_off,
+    r27_off, r27H_off,
+    r26_off, r26H_off,
+    r25_off, r25H_off,
+    r24_off, r24H_off,
+    r23_off, r23H_off,
+    r22_off, r22H_off,
+    r21_off, r21H_off,
+    r20_off, r20H_off,
+    r19_off, r19H_off,
+    r18_off, r18H_off,
+    r17_off, r17H_off,
+    r16_off, r16H_off,
+    opmask_off   = xmm_off + (XSAVE_AREA_OPMASK_BEGIN - XSAVE_AREA_BEGIN)/BytesPerInt,
     DEF_OPMASK_OFFS(0),
     DEF_OPMASK_OFFS(1),
     // 2..7 are implied in range usage
@@ -199,7 +217,13 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
   // to be under the return like a normal enter.
 
   __ enter();          // rsp becomes 16-byte aligned here
-  __ push_CPU_state(); // Push a multiple of 16 bytes
+  __ pushf();
+  // Make sure rsp stays 16-byte aligned
+  __ subq(rsp, 8);
+  // Push CPU state in multiple of 16 bytes
+  __ save_legacy_gprs();
+  __ push_FPU_state();
+
 
   // push cpu state handles this on EVEX enabled targets
   if (save_wide_vectors) {
@@ -247,6 +271,17 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
 #endif
     }
   }
+
+#if COMPILER2_OR_JVMCI
+  if (UseAPX) {
+      int base_addr = XSAVE_AREA_EGPRS;
+      off = 0;
+      for(int n = 16; n < Register::number_of_registers; n++) {
+        __ movq(Address(rsp, base_addr+(off++*8)), as_Register(n));
+      }
+  }
+#endif
+
   __ vzeroupper();
   if (frame::arg_reg_save_area_bytes != 0) {
     // Allocate argument register save area
@@ -279,6 +314,25 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
   map->set_callee_saved(STACK_OFFSET( r13_off ), r13->as_VMReg());
   map->set_callee_saved(STACK_OFFSET( r14_off ), r14->as_VMReg());
   map->set_callee_saved(STACK_OFFSET( r15_off ), r15->as_VMReg());
+
+  if (UseAPX) {
+    map->set_callee_saved(STACK_OFFSET( r16_off ), r16->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r17_off ), r17->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r18_off ), r18->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r19_off ), r19->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r20_off ), r20->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r21_off ), r21->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r22_off ), r22->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r23_off ), r23->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r24_off ), r24->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r25_off ), r25->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r26_off ), r26->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r27_off ), r27->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r28_off ), r28->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r29_off ), r29->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r30_off ), r30->as_VMReg());
+    map->set_callee_saved(STACK_OFFSET( r31_off ), r31->as_VMReg());
+  }
   // For both AVX and EVEX we will use the legacy FXSAVE area for xmm0..xmm15,
   // on EVEX enabled targets, we get it included in the xsave area
   off = xmm0_off;
@@ -339,6 +393,24 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
     map->set_callee_saved(STACK_OFFSET( r13H_off ), r13->as_VMReg()->next());
     map->set_callee_saved(STACK_OFFSET( r14H_off ), r14->as_VMReg()->next());
     map->set_callee_saved(STACK_OFFSET( r15H_off ), r15->as_VMReg()->next());
+    if (UseAPX) {
+      map->set_callee_saved(STACK_OFFSET( r16H_off ), r16->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r17H_off ), r17->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r18H_off ), r18->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r19H_off ), r19->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r20H_off ), r20->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r21H_off ), r21->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r22H_off ), r22->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r23H_off ), r23->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r24H_off ), r24->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r25H_off ), r25->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r26H_off ), r26->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r27H_off ), r27->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r28H_off ), r28->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r29H_off ), r29->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r30H_off ), r30->as_VMReg()->next());
+      map->set_callee_saved(STACK_OFFSET( r31H_off ), r31->as_VMReg()->next());
+    }
     // For both AVX and EVEX we will use the legacy FXSAVE area for xmm0..xmm15,
     // on EVEX enabled targets, we get it included in the xsave area
     off = xmm0H_off;
@@ -428,8 +500,21 @@ void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_wi
     }
   }
 
+#if COMPILER2_OR_JVMCI
+  if (UseAPX) {
+    int base_addr = XSAVE_AREA_EGPRS;
+    int off = 0;
+    for (int n = 16; n < Register::number_of_registers; n++) {
+      __ movq(as_Register(n), Address(rsp, base_addr+(off++*8)));
+    }
+  }
+#endif
+
   // Recover CPU state
-  __ pop_CPU_state();
+  __ pop_FPU_state();
+  __ restore_legacy_gprs();
+  __ addq(rsp, 8);
+  __ popf();
   // Get the rbp described implicitly by the calling convention (no oopMap)
   __ pop(rbp);
 }
@@ -1959,13 +2044,6 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   // Frame is now completed as far as size and linkage.
   int frame_complete = ((intptr_t)__ pc()) - start;
 
-    if (UseRTMLocking) {
-      // Abort RTM transaction before calling JNI
-      // because critical section will be large and will be
-      // aborted anyway. Also nmethod could be deoptimized.
-      __ xabort(0);
-    }
-
 #ifdef ASSERT
   __ check_stack_alignment(rsp, "improperly aligned stack");
 #endif /* ASSERT */
@@ -2122,8 +2200,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
   // We have all of the arguments setup at this point. We must not touch any register
   // argument registers at this point (what if we save/restore them there are no oop?
 
-  {
-    SkipIfEqual skip(masm, &DTraceMethodProbes, false, rscratch1);
+  if (DTraceMethodProbes) {
     // protect the args we've loaded
     save_args(masm, total_c_args, c_arg, out_regs);
     __ mov_metadata(c_rarg1, method());
@@ -2361,8 +2438,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
 
     __ bind(fast_done);
   }
-  {
-    SkipIfEqual skip(masm, &DTraceMethodProbes, false, rscratch1);
+  if (DTraceMethodProbes) {
     save_native_result(masm, ret_type, stack_slots);
     __ mov_metadata(c_rarg1, method());
     __ call_VM_leaf(
@@ -2550,6 +2626,9 @@ void SharedRuntime::generate_deopt_blob() {
   if (UseAVX > 2) {
     pad += 1024;
   }
+  if (UseAPX) {
+    pad += 1024;
+  }
 #if INCLUDE_JVMCI
   if (EnableJVMCI) {
     pad += 512; // Increase the buffer size when compiling for JVMCI
@@ -2921,11 +3000,6 @@ void SharedRuntime::generate_uncommon_trap_blob() {
 
   address start = __ pc();
 
-  if (UseRTMLocking) {
-    // Abort RTM transaction before possible nmethod deoptimization.
-    __ xabort(0);
-  }
-
   // Push self-frame.  We get here with a return address on the
   // stack, so rsp is 8-byte aligned until we allocate our frame.
   __ subptr(rsp, SimpleRuntimeFrame::return_off << LogBytesPerInt); // Epilog!
@@ -3103,7 +3177,7 @@ SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_t
   OopMap* map;
 
   // Allocate space for the code.  Setup code generation tools.
-  CodeBuffer buffer("handler_blob", 2048, 1024);
+  CodeBuffer buffer("handler_blob", 2348, 1024);
   MacroAssembler* masm = new MacroAssembler(&buffer);
 
   address start   = __ pc();
@@ -3112,13 +3186,6 @@ SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_t
   bool cause_return = (poll_type == POLL_AT_RETURN);
   bool save_wide_vectors = (poll_type == POLL_AT_VECTOR_LOOP);
 
-  if (UseRTMLocking) {
-    // Abort RTM transaction before calling runtime
-    // because critical section will be large and will be
-    // aborted anyway. Also nmethod could be deoptimized.
-    __ xabort(0);
-  }
-
   // Make room for return address (or push it again)
   if (!cause_return) {
     __ push(rbx);
@@ -3266,7 +3333,7 @@ RuntimeStub* SharedRuntime::generate_resolve_blob(address destination, const cha
   // allocate space for the code
   ResourceMark rm;
 
-  CodeBuffer buffer(name, 1200, 512);
+  CodeBuffer buffer(name, 1552, 512);
   MacroAssembler* masm = new MacroAssembler(&buffer);
 
   int frame_size_in_words;
diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp
index 577c56cb7a2..c9c4b056eb5 100644
--- a/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp
+++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp
@@ -4241,6 +4241,12 @@ void StubGenerator::generate_compiler_stubs() {
 
   generate_chacha_stubs();
 
+#ifdef COMPILER2
+  if ((UseAVX == 2) && EnableX86ECoreOpts) {
+    generate_string_indexof(StubRoutines::_string_indexof_array);
+  }
+#endif
+
   if (UseAdler32Intrinsics) {
      StubRoutines::_updateBytesAdler32 = generate_updateBytesAdler32();
   }
diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp b/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp
index 02435bd172c..374679750a4 100644
--- a/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp
+++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp
@@ -575,6 +575,9 @@ class StubGenerator: public StubCodeGenerator {
 
   void generate_libm_stubs();
 
+#ifdef COMPILER2
+  void generate_string_indexof(address *fnptrs);
+#endif
 
   address generate_cont_thaw(const char* label, Continuation::thaw_kind kind);
   address generate_cont_thaw();
diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64_poly_mont.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_64_poly_mont.cpp
index 25ee6807249..4e909afbacc 100644
--- a/src/hotspot/cpu/x86/stubGenerator_x86_64_poly_mont.cpp
+++ b/src/hotspot/cpu/x86/stubGenerator_x86_64_poly_mont.cpp
@@ -249,7 +249,6 @@ address StubGenerator::generate_intpoly_montgomeryMult_P256() {
   const Register tmp     = r9;
 
   montgomeryMultiply(aLimbs, bLimbs, rLimbs, tmp, _masm);
-  __ mov64(rax, 0x1); // Return 1 (Fig. 5, Step 6 [1] skipped in montgomeryMultiply)
 
   __ leave();
   __ ret(0);
diff --git a/src/hotspot/cpu/x86/stubRoutines_x86.hpp b/src/hotspot/cpu/x86/stubRoutines_x86.hpp
index cfb91c5c083..b5ed3719897 100644
--- a/src/hotspot/cpu/x86/stubRoutines_x86.hpp
+++ b/src/hotspot/cpu/x86/stubRoutines_x86.hpp
@@ -37,7 +37,7 @@ enum platform_dependent_constants {
   _continuation_stubs_code_size =  1000 LP64_ONLY(+1000),
   // AVX512 intrinsics add more code in 64-bit VM,
   // Windows have more code to save/restore registers
-  _compiler_stubs_code_size     = 20000 LP64_ONLY(+39000) WINDOWS_ONLY(+2000),
+  _compiler_stubs_code_size     = 20000 LP64_ONLY(+46000) WINDOWS_ONLY(+2000),
   _final_stubs_code_size        = 10000 LP64_ONLY(+20000) WINDOWS_ONLY(+2000) ZGC_ONLY(+20000)
 };
 
diff --git a/src/hotspot/cpu/x86/templateTable_x86.cpp b/src/hotspot/cpu/x86/templateTable_x86.cpp
index 248055337d8..6446ec65987 100644
--- a/src/hotspot/cpu/x86/templateTable_x86.cpp
+++ b/src/hotspot/cpu/x86/templateTable_x86.cpp
@@ -4123,8 +4123,7 @@ void TemplateTable::_new() {
 #endif
     __ store_klass(rax, rcx, rscratch1);  // klass
 
-    {
-      SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0, rscratch1);
+    if (DTraceAllocProbes) {
       // Trigger dtrace event for fastpath
       __ push(atos);
       __ call_VM_leaf(
diff --git a/src/hotspot/cpu/x86/upcallLinker_x86_64.cpp b/src/hotspot/cpu/x86/upcallLinker_x86_64.cpp
index 7b9d49dd461..82179f9022e 100644
--- a/src/hotspot/cpu/x86/upcallLinker_x86_64.cpp
+++ b/src/hotspot/cpu/x86/upcallLinker_x86_64.cpp
@@ -40,13 +40,17 @@
 #define __ _masm->
 
 static bool is_valid_XMM(XMMRegister reg) {
-  return reg->is_valid() && (UseAVX >= 3 || (reg->encoding() < 16)); // why is this not covered by is_valid()?
+  return reg->is_valid() && (reg->encoding() < (UseAVX >= 3 ? 32 : 16)); // why is this not covered by is_valid()?
+}
+
+static bool is_valid_gp(Register reg) {
+  return reg->is_valid() && (reg->encoding() < (UseAPX ? 32 : 16));
 }
 
 // for callee saved regs, according to the caller's ABI
 static int compute_reg_save_area_size(const ABIDescriptor& abi) {
   int size = 0;
-  for (Register reg = as_Register(0); reg->is_valid(); reg = reg->successor()) {
+  for (Register reg = as_Register(0); is_valid_gp(reg); reg = reg->successor()) {
     if (reg == rbp || reg == rsp) continue; // saved/restored by prologue/epilogue
     if (!abi.is_volatile_reg(reg)) {
       size += 8; // bytes
@@ -84,7 +88,7 @@ static void preserve_callee_saved_registers(MacroAssembler* _masm, const ABIDesc
   int offset = reg_save_area_offset;
 
   __ block_comment("{ preserve_callee_saved_regs ");
-  for (Register reg = as_Register(0); reg->is_valid(); reg = reg->successor()) {
+  for (Register reg = as_Register(0); is_valid_gp(reg); reg = reg->successor()) {
     if (reg == rbp || reg == rsp) continue; // saved/restored by prologue/epilogue
     if (!abi.is_volatile_reg(reg)) {
       __ movptr(Address(rsp, offset), reg);
@@ -134,7 +138,7 @@ static void restore_callee_saved_registers(MacroAssembler* _masm, const ABIDescr
   int offset = reg_save_area_offset;
 
   __ block_comment("{ restore_callee_saved_regs ");
-  for (Register reg = as_Register(0); reg->is_valid(); reg = reg->successor()) {
+  for (Register reg = as_Register(0); is_valid_gp(reg); reg = reg->successor()) {
     if (reg == rbp || reg == rsp) continue; // saved/restored by prologue/epilogue
     if (!abi.is_volatile_reg(reg)) {
       __ movptr(reg, Address(rsp, offset));
diff --git a/src/hotspot/cpu/x86/vm_version_x86.cpp b/src/hotspot/cpu/x86/vm_version_x86.cpp
index f5389d0ef90..02e147743cb 100644
--- a/src/hotspot/cpu/x86/vm_version_x86.cpp
+++ b/src/hotspot/cpu/x86/vm_version_x86.cpp
@@ -56,6 +56,10 @@ const char* VM_Version::_features_names[] = { CPU_FEATURE_FLAGS(DECLARE_CPU_FEAT
 address VM_Version::_cpuinfo_segv_addr = 0;
 // Address of instruction after the one which causes SEGV
 address VM_Version::_cpuinfo_cont_addr = 0;
+// Address of instruction which causes APX specific SEGV
+address VM_Version::_cpuinfo_segv_addr_apx = 0;
+// Address of instruction after the one which causes APX specific SEGV
+address VM_Version::_cpuinfo_cont_addr_apx = 0;
 
 static BufferBlob* stub_blob;
 static const int stub_size = 2000;
@@ -63,9 +67,11 @@ static const int stub_size = 2000;
 extern "C" {
   typedef void (*get_cpu_info_stub_t)(void*);
   typedef void (*detect_virt_stub_t)(uint32_t, uint32_t*);
+  typedef void (*clear_apx_test_state_t)(void);
 }
 static get_cpu_info_stub_t get_cpu_info_stub = nullptr;
 static detect_virt_stub_t detect_virt_stub = nullptr;
+static clear_apx_test_state_t clear_apx_test_state_stub = nullptr;
 
 #ifdef _LP64
 
@@ -102,6 +108,27 @@ class VM_Version_StubGenerator: public StubCodeGenerator {
 
   VM_Version_StubGenerator(CodeBuffer *c) : StubCodeGenerator(c) {}
 
+#if defined(_LP64)
+  address clear_apx_test_state() {
+#   define __ _masm->
+    address start = __ pc();
+    // EGPRs are call clobbered registers, Explicit clearing of r16 and r31 during signal
+    // handling guarantees that preserved register values post signal handling were
+    // re-instantiated by operating system and not because they were not modified externally.
+
+    bool save_apx = UseAPX;
+    VM_Version::set_apx_cpuFeatures();
+    UseAPX = true;
+    // EGPR state save/restoration.
+    __ mov64(r16, 0L);
+    __ mov64(r31, 0L);
+    UseAPX = save_apx;
+    VM_Version::clean_cpuFeatures();
+    __ ret(0);
+    return start;
+  }
+#endif
+
   address generate_get_cpu_info() {
     // Flags to test CPU type.
     const uint32_t HS_EFL_AC = 0x40000;
@@ -113,7 +140,8 @@ class VM_Version_StubGenerator: public StubCodeGenerator {
     bool use_evex = FLAG_IS_DEFAULT(UseAVX) || (UseAVX > 2);
 
     Label detect_486, cpu486, detect_586, std_cpuid1, std_cpuid4;
-    Label sef_cpuid, ext_cpuid, ext_cpuid1, ext_cpuid5, ext_cpuid7, ext_cpuid8, done, wrapup;
+    Label sef_cpuid, sefsl1_cpuid, ext_cpuid, ext_cpuid1, ext_cpuid5, ext_cpuid7;
+    Label ext_cpuid8, done, wrapup, vector_save_restore, apx_save_restore_warning;
     Label legacy_setup, save_restore_except, legacy_save_restore, start_simd_check;
 
     StubCodeMark mark(this, "VM_Version", "get_cpu_info_stub");
@@ -288,7 +316,7 @@ class VM_Version_StubGenerator: public StubCodeGenerator {
     __ movl(Address(rsi, 4), rdx);
 
     //
-    // cpuid(0x7) Structured Extended Features
+    // cpuid(0x7) Structured Extended Features Enumeration Leaf.
     //
     __ bind(sef_cpuid);
     __ movl(rax, 7);
@@ -303,12 +331,16 @@ class VM_Version_StubGenerator: public StubCodeGenerator {
     __ movl(Address(rsi, 8), rcx);
     __ movl(Address(rsi, 12), rdx);
 
-    // ECX = 1
+    //
+    // cpuid(0x7) Structured Extended Features Enumeration Sub-Leaf 1.
+    //
+    __ bind(sefsl1_cpuid);
     __ movl(rax, 7);
     __ movl(rcx, 1);
     __ cpuid();
-    __ lea(rsi, Address(rbp, in_bytes(VM_Version::sef_cpuid7_ecx1_offset())));
+    __ lea(rsi, Address(rbp, in_bytes(VM_Version::sefsl1_cpuid7_offset())));
     __ movl(Address(rsi, 0), rax);
+    __ movl(Address(rsi, 4), rdx);
 
     //
     // Extended cpuid(0x80000000)
@@ -387,6 +419,42 @@ class VM_Version_StubGenerator: public StubCodeGenerator {
     __ movl(Address(rsi, 8), rcx);
     __ movl(Address(rsi,12), rdx);
 
+#if defined(_LP64)
+    //
+    // Check if OS has enabled XGETBV instruction to access XCR0
+    // (OSXSAVE feature flag) and CPU supports APX
+    //
+    // To enable APX, check CPUID.EAX=7.ECX=1.EDX[21] bit for HW support
+    // and XCRO[19] bit for OS support to save/restore extended GPR state.
+    __ lea(rsi, Address(rbp, in_bytes(VM_Version::sefsl1_cpuid7_offset())));
+    __ movl(rax, 0x200000);
+    __ andl(rax, Address(rsi, 4));
+    __ cmpl(rax, 0x200000);
+    __ jcc(Assembler::notEqual, vector_save_restore);
+    // check _cpuid_info.xem_xcr0_eax.bits.apx_f
+    __ movl(rax, 0x80000);
+    __ andl(rax, Address(rbp, in_bytes(VM_Version::xem_xcr0_offset()))); // xcr0 bits apx_f
+    __ cmpl(rax, 0x80000);
+    __ jcc(Assembler::notEqual, vector_save_restore);
+
+    bool save_apx = UseAPX;
+    VM_Version::set_apx_cpuFeatures();
+    UseAPX = true;
+    __ mov64(r16, VM_Version::egpr_test_value());
+    __ mov64(r31, VM_Version::egpr_test_value());
+    __ xorl(rsi, rsi);
+    VM_Version::set_cpuinfo_segv_addr_apx(__ pc());
+    // Generate SEGV
+    __ movl(rax, Address(rsi, 0));
+
+    VM_Version::set_cpuinfo_cont_addr_apx(__ pc());
+    __ lea(rsi, Address(rbp, in_bytes(VM_Version::apx_save_offset())));
+    __ movq(Address(rsi, 0), r16);
+    __ movq(Address(rsi, 8), r31);
+
+    UseAPX = save_apx;
+#endif
+    __ bind(vector_save_restore);
     //
     // Check if OS has enabled XGETBV instruction to access XCR0
     // (OSXSAVE feature flag) and CPU supports AVX
@@ -580,6 +648,7 @@ class VM_Version_StubGenerator: public StubCodeGenerator {
     __ vmovdqu(xmm7, Address(rsp, 0));
     __ addptr(rsp, 32);
 #endif // _WINDOWS
+
     generate_vzeroupper(wrapup);
     VM_Version::clean_cpuFeatures();
     UseAVX = saved_useavx;
@@ -940,6 +1009,7 @@ void VM_Version::get_processor_features() {
       FLAG_SET_DEFAULT(UseAVX, use_avx_limit);
     }
   }
+
   if (UseAVX > use_avx_limit) {
     if (UseSSE < 4) {
       warning("UseAVX=%d requires UseSSE=4, setting it to UseAVX=0", UseAVX);
@@ -963,6 +1033,16 @@ void VM_Version::get_processor_features() {
     _features &= ~CPU_AVX512_VBMI2;
     _features &= ~CPU_AVX512_BITALG;
     _features &= ~CPU_AVX512_IFMA;
+    _features &= ~CPU_APX_F;
+  }
+
+  // Currently APX support is only enabled for targets supporting AVX512VL feature.
+  bool apx_supported = os_supports_apx_egprs() && supports_apx_f() && supports_avx512vl();
+  if (UseAPX && !apx_supported) {
+    warning("UseAPX is not supported on this CPU, setting it to false");
+    FLAG_SET_DEFAULT(UseAPX, false);
+  } else if (FLAG_IS_DEFAULT(UseAPX)) {
+    FLAG_SET_DEFAULT(UseAPX, apx_supported ? true : false);
   }
 
   if (UseAVX < 2) {
@@ -1002,14 +1082,6 @@ void VM_Version::get_processor_features() {
     }
   }
 
-  // APX support not enabled yet
-  if (UseAPX) {
-    if (!FLAG_IS_DEFAULT(UseAPX)) {
-        warning("APX is not supported on this CPU.");
-    }
-    FLAG_SET_DEFAULT(UseAPX, false);
-  }
-
   if (FLAG_IS_DEFAULT(IntelJccErratumMitigation)) {
     _has_intel_jcc_erratum = compute_has_intel_jcc_erratum();
   } else {
@@ -1246,55 +1318,6 @@ void VM_Version::get_processor_features() {
     FLAG_SET_DEFAULT(UseSHA, false);
   }
 
-  if (!supports_rtm() && UseRTMLocking) {
-    vm_exit_during_initialization("RTM instructions are not available on this CPU");
-  }
-
-#if INCLUDE_RTM_OPT
-  if (UseRTMLocking) {
-    if (!CompilerConfig::is_c2_enabled()) {
-      // Only C2 does RTM locking optimization.
-      vm_exit_during_initialization("RTM locking optimization is not supported in this VM");
-    }
-    if (is_intel_family_core()) {
-      if ((_model == CPU_MODEL_HASWELL_E3) ||
-          (_model == CPU_MODEL_HASWELL_E7 && _stepping < 3) ||
-          (_model == CPU_MODEL_BROADWELL  && _stepping < 4)) {
-        // currently a collision between SKL and HSW_E3
-        if (!UnlockExperimentalVMOptions && UseAVX < 3) {
-          vm_exit_during_initialization("UseRTMLocking is only available as experimental option on this "
-                                        "platform. It must be enabled via -XX:+UnlockExperimentalVMOptions flag.");
-        } else {
-          warning("UseRTMLocking is only available as experimental option on this platform.");
-        }
-      }
-    }
-    if (!FLAG_IS_CMDLINE(UseRTMLocking)) {
-      // RTM locking should be used only for applications with
-      // high lock contention. For now we do not use it by default.
-      vm_exit_during_initialization("UseRTMLocking flag should be only set on command line");
-    }
-  } else { // !UseRTMLocking
-    if (UseRTMForStackLocks) {
-      if (!FLAG_IS_DEFAULT(UseRTMForStackLocks)) {
-        warning("UseRTMForStackLocks flag should be off when UseRTMLocking flag is off");
-      }
-      FLAG_SET_DEFAULT(UseRTMForStackLocks, false);
-    }
-    if (UseRTMDeopt) {
-      FLAG_SET_DEFAULT(UseRTMDeopt, false);
-    }
-    if (PrintPreciseRTMLockingStatistics) {
-      FLAG_SET_DEFAULT(PrintPreciseRTMLockingStatistics, false);
-    }
-  }
-#else
-  if (UseRTMLocking) {
-    // Only C2 does RTM locking optimization.
-    vm_exit_during_initialization("RTM locking optimization is not supported in this VM");
-  }
-#endif
-
 #ifdef COMPILER2
   if (UseFPUForSpilling) {
     if (UseSSE < 2) {
@@ -2143,6 +2166,12 @@ int VM_Version::avx3_threshold() {
           FLAG_IS_DEFAULT(AVX3Threshold)) ? 0 : AVX3Threshold;
 }
 
+#if defined(_LP64)
+void VM_Version::clear_apx_test_state() {
+  clear_apx_test_state_stub();
+}
+#endif
+
 static bool _vm_version_initialized = false;
 
 void VM_Version::initialize() {
@@ -2160,6 +2189,10 @@ void VM_Version::initialize() {
   detect_virt_stub = CAST_TO_FN_PTR(detect_virt_stub_t,
                                      g.generate_detect_virt());
 
+#if defined(_LP64)
+  clear_apx_test_state_stub = CAST_TO_FN_PTR(clear_apx_test_state_t,
+                                     g.clear_apx_test_state());
+#endif
   get_processor_features();
 
   LP64_ONLY(Assembler::precompute_instructions();)
@@ -2958,6 +2991,10 @@ uint64_t VM_Version::CpuidInfo::feature_flags() const {
     result |= CPU_SSE4_2;
   if (std_cpuid1_ecx.bits.popcnt != 0)
     result |= CPU_POPCNT;
+  if (sefsl1_cpuid7_edx.bits.apx_f != 0 &&
+      xem_xcr0_eax.bits.apx_f != 0) {
+    result |= CPU_APX_F;
+  }
   if (std_cpuid1_ecx.bits.avx != 0 &&
       std_cpuid1_ecx.bits.osxsave != 0 &&
       xem_xcr0_eax.bits.sse != 0 &&
@@ -2968,7 +3005,7 @@ uint64_t VM_Version::CpuidInfo::feature_flags() const {
       result |= CPU_F16C;
     if (sef_cpuid7_ebx.bits.avx2 != 0) {
       result |= CPU_AVX2;
-      if (sef_cpuid7_ecx1_eax.bits.avx_ifma != 0)
+      if (sefsl1_cpuid7_eax.bits.avx_ifma != 0)
         result |= CPU_AVX_IFMA;
     }
     if (sef_cpuid7_ecx.bits.gfni != 0)
@@ -3142,6 +3179,23 @@ bool VM_Version::os_supports_avx_vectors() {
   return retVal;
 }
 
+bool VM_Version::os_supports_apx_egprs() {
+  if (!supports_apx_f()) {
+    return false;
+  }
+  // Enable APX support for product builds after
+  // completion of planned features listed in JDK-8329030.
+#if !defined(PRODUCT)
+  if (_cpuid_info.apx_save[0] != egpr_test_value() ||
+      _cpuid_info.apx_save[1] != egpr_test_value()) {
+    return false;
+  }
+  return true;
+#else
+  return false;
+#endif
+}
+
 uint VM_Version::cores_per_cpu() {
   uint result = 1;
   if (is_intel()) {
diff --git a/src/hotspot/cpu/x86/vm_version_x86.hpp b/src/hotspot/cpu/x86/vm_version_x86.hpp
index 18b272ab58b..d58b5a9c099 100644
--- a/src/hotspot/cpu/x86/vm_version_x86.hpp
+++ b/src/hotspot/cpu/x86/vm_version_x86.hpp
@@ -26,6 +26,7 @@
 #define CPU_X86_VM_VERSION_X86_HPP
 
 #include "runtime/abstract_vm_version.hpp"
+#include "utilities/debug.hpp"
 #include "utilities/macros.hpp"
 #include "utilities/sizes.hpp"
 
@@ -279,7 +280,7 @@ class VM_Version : public Abstract_VM_Version {
     } bits;
   };
 
-  union SefCpuid7Ecx1Eax {
+  union SefCpuid7SubLeaf1Eax {
     uint32_t value;
     struct {
       uint32_t             : 23,
@@ -288,6 +289,15 @@ class VM_Version : public Abstract_VM_Version {
     } bits;
   };
 
+  union SefCpuid7SubLeaf1Edx {
+    uint32_t value;
+    struct {
+      uint32_t       : 21,
+              apx_f  : 1,
+                     : 10;
+    } bits;
+  };
+
   union ExtCpuid1EEbx {
     uint32_t value;
     struct {
@@ -308,7 +318,9 @@ class VM_Version : public Abstract_VM_Version {
                opmask  : 1,
                zmm512  : 1,
                zmm32   : 1,
-                       : 24;
+                       : 11,
+               apx_f   : 1,
+                       : 12;
     } bits;
   };
 
@@ -319,8 +331,10 @@ class VM_Version : public Abstract_VM_Version {
 
   static bool _has_intel_jcc_erratum;
 
-  static address   _cpuinfo_segv_addr; // address of instruction which causes SEGV
-  static address   _cpuinfo_cont_addr; // address of instruction after the one which causes SEGV
+  static address   _cpuinfo_segv_addr;     // address of instruction which causes SEGV
+  static address   _cpuinfo_cont_addr;     // address of instruction after the one which causes SEGV
+  static address   _cpuinfo_segv_addr_apx; // address of instruction which causes APX specific SEGV
+  static address   _cpuinfo_cont_addr_apx; // address of instruction after the one which causes APX specific SEGV
 
   /*
    * Update following files when declaring new flags:
@@ -400,7 +414,8 @@ class VM_Version : public Abstract_VM_Version {
     decl(CET_IBT,           "cet_ibt",           56) /* Control Flow Enforcement - Indirect Branch Tracking */ \
     decl(CET_SS,            "cet_ss",            57) /* Control Flow Enforcement - Shadow Stack */ \
     decl(AVX512_IFMA,       "avx512_ifma",       58) /* Integer Vector FMA instructions*/ \
-    decl(AVX_IFMA,          "avx_ifma",          59) /* 256-bit VEX-coded variant of AVX512-IFMA*/
+    decl(AVX_IFMA,          "avx_ifma",          59) /* 256-bit VEX-coded variant of AVX512-IFMA*/ \
+    decl(APX_F,             "apx_f",             60) /* Intel Advanced Performance Extensions*/
 
 #define DECLARE_CPU_FEATURE_FLAG(id, name, bit) CPU_##id = (1ULL << bit),
     CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_FLAG)
@@ -458,14 +473,17 @@ class VM_Version : public Abstract_VM_Version {
     uint32_t     dcp_cpuid4_ecx; // unused currently
     uint32_t     dcp_cpuid4_edx; // unused currently
 
-    // cpuid function 7 (structured extended features)
-    // ECX = 0 before calling cpuid()
+    // cpuid function 7 (structured extended features enumeration leaf)
+    // eax = 7, ecx = 0
     SefCpuid7Eax sef_cpuid7_eax;
     SefCpuid7Ebx sef_cpuid7_ebx;
     SefCpuid7Ecx sef_cpuid7_ecx;
     SefCpuid7Edx sef_cpuid7_edx;
-    // ECX = 1 before calling cpuid()
-    SefCpuid7Ecx1Eax sef_cpuid7_ecx1_eax;
+
+    // cpuid function 7 (structured extended features enumeration sub-leaf 1)
+    // eax = 7, ecx = 1
+    SefCpuid7SubLeaf1Eax sefsl1_cpuid7_eax;
+    SefCpuid7SubLeaf1Edx sefsl1_cpuid7_edx;
 
     // cpuid function 0xB (processor topology)
     // ecx = 0
@@ -537,6 +555,9 @@ class VM_Version : public Abstract_VM_Version {
     // Space to save zmm registers after signal handle
     int          zmm_save[16*4]; // Save zmm0, zmm7, zmm8, zmm31
 
+    // Space to save apx registers after signal handle
+    jlong        apx_save[2]; // Save r16 and r31
+
     uint64_t feature_flags() const;
 
     // Asserts
@@ -576,6 +597,7 @@ class VM_Version : public Abstract_VM_Version {
   static bool compute_has_intel_jcc_erratum();
 
   static bool os_supports_avx_vectors();
+  static bool os_supports_apx_egprs();
   static void get_processor_features();
 
 public:
@@ -584,7 +606,7 @@ class VM_Version : public Abstract_VM_Version {
   static ByteSize std_cpuid1_offset() { return byte_offset_of(CpuidInfo, std_cpuid1_eax); }
   static ByteSize dcp_cpuid4_offset() { return byte_offset_of(CpuidInfo, dcp_cpuid4_eax); }
   static ByteSize sef_cpuid7_offset() { return byte_offset_of(CpuidInfo, sef_cpuid7_eax); }
-  static ByteSize sef_cpuid7_ecx1_offset() { return byte_offset_of(CpuidInfo, sef_cpuid7_ecx1_eax); }
+  static ByteSize sefsl1_cpuid7_offset() { return byte_offset_of(CpuidInfo, sefsl1_cpuid7_eax); }
   static ByteSize ext_cpuid1_offset() { return byte_offset_of(CpuidInfo, ext_cpuid1_eax); }
   static ByteSize ext_cpuid5_offset() { return byte_offset_of(CpuidInfo, ext_cpuid5_eax); }
   static ByteSize ext_cpuid7_offset() { return byte_offset_of(CpuidInfo, ext_cpuid7_eax); }
@@ -596,9 +618,11 @@ class VM_Version : public Abstract_VM_Version {
   static ByteSize xem_xcr0_offset() { return byte_offset_of(CpuidInfo, xem_xcr0_eax); }
   static ByteSize ymm_save_offset() { return byte_offset_of(CpuidInfo, ymm_save); }
   static ByteSize zmm_save_offset() { return byte_offset_of(CpuidInfo, zmm_save); }
+  static ByteSize apx_save_offset() { return byte_offset_of(CpuidInfo, apx_save); }
 
   // The value used to check ymm register after signal handle
   static int ymm_test_value()    { return 0xCAFEBABE; }
+  static jlong egpr_test_value()   { return 0xCAFEBABECAFEBABELL; }
 
   static void get_cpu_info_wrapper();
   static void set_cpuinfo_segv_addr(address pc) { _cpuinfo_segv_addr = pc; }
@@ -606,9 +630,17 @@ class VM_Version : public Abstract_VM_Version {
   static void set_cpuinfo_cont_addr(address pc) { _cpuinfo_cont_addr = pc; }
   static address  cpuinfo_cont_addr()           { return _cpuinfo_cont_addr; }
 
+  static void set_cpuinfo_segv_addr_apx(address pc) { _cpuinfo_segv_addr_apx = pc; }
+  static bool  is_cpuinfo_segv_addr_apx(address pc) { return _cpuinfo_segv_addr_apx == pc; }
+  static void set_cpuinfo_cont_addr_apx(address pc) { _cpuinfo_cont_addr_apx = pc; }
+  static address  cpuinfo_cont_addr_apx()           { return _cpuinfo_cont_addr_apx; }
+
+  LP64_ONLY(static void clear_apx_test_state());
+
   static void clean_cpuFeatures()   { _features = 0; }
   static void set_avx_cpuFeatures() { _features = (CPU_SSE | CPU_SSE2 | CPU_AVX | CPU_VZEROUPPER ); }
   static void set_evex_cpuFeatures() { _features = (CPU_AVX512F | CPU_SSE | CPU_SSE2 | CPU_VZEROUPPER ); }
+  static void set_apx_cpuFeatures() { _features |= CPU_APX_F; }
 
   // Initialization
   static void initialize();
@@ -705,6 +737,7 @@ class VM_Version : public Abstract_VM_Version {
   static bool supports_avx512novl()   { return (supports_evex() && !supports_avx512vl()); }
   static bool supports_avx512nobw()   { return (supports_evex() && !supports_avx512bw()); }
   static bool supports_avx256only()   { return (supports_avx2() && !supports_evex()); }
+  static bool supports_apx_f()        { return (_features & CPU_APX_F) != 0; }
   static bool supports_avxonly()      { return ((supports_avx2() || supports_avx()) && !supports_evex()); }
   static bool supports_sha()          { return (_features & CPU_SHA) != 0; }
   static bool supports_fma()          { return (_features & CPU_FMA) != 0 && supports_avx(); }
diff --git a/src/hotspot/cpu/x86/vmreg_x86.hpp b/src/hotspot/cpu/x86/vmreg_x86.hpp
index fcf288fe2ed..7d73eadeb04 100644
--- a/src/hotspot/cpu/x86/vmreg_x86.hpp
+++ b/src/hotspot/cpu/x86/vmreg_x86.hpp
@@ -28,7 +28,8 @@
 #include "register_x86.hpp"
 
 inline bool is_Register() {
-  return (unsigned int) value() < (unsigned int) ConcreteRegisterImpl::max_gpr;
+  int uarch_max_gpr = Register::max_slots_per_register * Register::available_gp_registers();
+  return (unsigned int) value() < (unsigned int) uarch_max_gpr;
 }
 
 inline bool is_FloatRegister() {
diff --git a/src/hotspot/cpu/x86/x86_32.ad b/src/hotspot/cpu/x86/x86_32.ad
index 240e9b10323..49a3cad37df 100644
--- a/src/hotspot/cpu/x86/x86_32.ad
+++ b/src/hotspot/cpu/x86/x86_32.ad
@@ -13613,25 +13613,8 @@ instruct RethrowException()
 
 // inlined locking and unlocking
 
-instruct cmpFastLockRTM(eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eDXRegI scr, rRegI cx1, rRegI cx2, eRegP thread) %{
-  predicate(Compile::current()->use_rtm());
-  match(Set cr (FastLock object box));
-  effect(TEMP tmp, TEMP scr, TEMP cx1, TEMP cx2, USE_KILL box, TEMP thread);
-  ins_cost(300);
-  format %{ "FASTLOCK $object,$box\t! kills $box,$tmp,$scr,$cx1,$cx2" %}
-  ins_encode %{
-    __ get_thread($thread$$Register);
-    __ fast_lock($object$$Register, $box$$Register, $tmp$$Register,
-                 $scr$$Register, $cx1$$Register, $cx2$$Register, $thread$$Register,
-                 _rtm_counters, _stack_rtm_counters,
-                 ((Method*)(ra_->C->method()->constant_encoding()))->method_data(),
-                 true, ra_->C->profile_rtm());
-  %}
-  ins_pipe(pipe_slow);
-%}
-
 instruct cmpFastLock(eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eRegP scr, eRegP thread) %{
-  predicate(LockingMode != LM_LIGHTWEIGHT && !Compile::current()->use_rtm());
+  predicate(LockingMode != LM_LIGHTWEIGHT);
   match(Set cr (FastLock object box));
   effect(TEMP tmp, TEMP scr, USE_KILL box, TEMP thread);
   ins_cost(300);
@@ -13639,7 +13622,7 @@ instruct cmpFastLock(eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eRegP
   ins_encode %{
     __ get_thread($thread$$Register);
     __ fast_lock($object$$Register, $box$$Register, $tmp$$Register,
-                 $scr$$Register, noreg, noreg, $thread$$Register, nullptr, nullptr, nullptr, false, false);
+                 $scr$$Register, noreg, noreg, $thread$$Register, nullptr);
   %}
   ins_pipe(pipe_slow);
 %}
@@ -13651,7 +13634,7 @@ instruct cmpFastUnlock(eFlagsReg cr, eRegP object, eAXRegP box, eRegP tmp ) %{
   ins_cost(300);
   format %{ "FASTUNLOCK $object,$box\t! kills $box,$tmp" %}
   ins_encode %{
-    __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, ra_->C->use_rtm());
+    __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register);
   %}
   ins_pipe(pipe_slow);
 %}
diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad
index f3ad721dfcb..1490cfa60b3 100644
--- a/src/hotspot/cpu/x86/x86_64.ad
+++ b/src/hotspot/cpu/x86/x86_64.ad
@@ -128,6 +128,53 @@ reg_def R14_H(SOC, SOE, Op_RegI, 14, r14->as_VMReg()->next());
 reg_def R15  (SOC, SOE, Op_RegI, 15, r15->as_VMReg());
 reg_def R15_H(SOC, SOE, Op_RegI, 15, r15->as_VMReg()->next());
 
+reg_def R16  (SOC, SOC, Op_RegI, 16, r16->as_VMReg());
+reg_def R16_H(SOC, SOC, Op_RegI, 16, r16->as_VMReg()->next());
+
+reg_def R17  (SOC, SOC, Op_RegI, 17, r17->as_VMReg());
+reg_def R17_H(SOC, SOC, Op_RegI, 17, r17->as_VMReg()->next());
+
+reg_def R18  (SOC, SOC, Op_RegI, 18, r18->as_VMReg());
+reg_def R18_H(SOC, SOC, Op_RegI, 18, r18->as_VMReg()->next());
+
+reg_def R19  (SOC, SOC, Op_RegI, 19, r19->as_VMReg());
+reg_def R19_H(SOC, SOC, Op_RegI, 19, r19->as_VMReg()->next());
+
+reg_def R20  (SOC, SOC, Op_RegI, 20, r20->as_VMReg());
+reg_def R20_H(SOC, SOC, Op_RegI, 20, r20->as_VMReg()->next());
+
+reg_def R21  (SOC, SOC, Op_RegI, 21, r21->as_VMReg());
+reg_def R21_H(SOC, SOC, Op_RegI, 21, r21->as_VMReg()->next());
+
+reg_def R22  (SOC, SOC, Op_RegI, 22, r22->as_VMReg());
+reg_def R22_H(SOC, SOC, Op_RegI, 22, r22->as_VMReg()->next());
+
+reg_def R23  (SOC, SOC, Op_RegI, 23, r23->as_VMReg());
+reg_def R23_H(SOC, SOC, Op_RegI, 23, r23->as_VMReg()->next());
+
+reg_def R24  (SOC, SOC, Op_RegI, 24, r24->as_VMReg());
+reg_def R24_H(SOC, SOC, Op_RegI, 24, r24->as_VMReg()->next());
+
+reg_def R25  (SOC, SOC, Op_RegI, 25, r25->as_VMReg());
+reg_def R25_H(SOC, SOC, Op_RegI, 25, r25->as_VMReg()->next());
+
+reg_def R26  (SOC, SOC, Op_RegI, 26, r26->as_VMReg());
+reg_def R26_H(SOC, SOC, Op_RegI, 26, r26->as_VMReg()->next());
+
+reg_def R27  (SOC, SOC, Op_RegI, 27, r27->as_VMReg());
+reg_def R27_H(SOC, SOC, Op_RegI, 27, r27->as_VMReg()->next());
+
+reg_def R28  (SOC, SOC, Op_RegI, 28, r28->as_VMReg());
+reg_def R28_H(SOC, SOC, Op_RegI, 28, r28->as_VMReg()->next());
+
+reg_def R29  (SOC, SOC, Op_RegI, 29, r29->as_VMReg());
+reg_def R29_H(SOC, SOC, Op_RegI, 29, r29->as_VMReg()->next());
+
+reg_def R30  (SOC, SOC, Op_RegI, 30, r30->as_VMReg());
+reg_def R30_H(SOC, SOC, Op_RegI, 30, r30->as_VMReg()->next());
+
+reg_def R31  (SOC, SOC, Op_RegI, 31, r31->as_VMReg());
+reg_def R31_H(SOC, SOC, Op_RegI, 31, r31->as_VMReg()->next());
 
 // Floating Point Registers
 
@@ -154,6 +201,22 @@ alloc_class chunk0(R10,         R10_H,
                    R13,         R13_H,
                    R14,         R14_H,
                    R15,         R15_H,
+                   R16,         R16_H,
+                   R17,         R17_H,
+                   R18,         R18_H,
+                   R19,         R19_H,
+                   R20,         R20_H,
+                   R21,         R21_H,
+                   R22,         R22_H,
+                   R23,         R23_H,
+                   R24,         R24_H,
+                   R25,         R25_H,
+                   R26,         R26_H,
+                   R27,         R27_H,
+                   R28,         R28_H,
+                   R29,         R29_H,
+                   R30,         R30_H,
+                   R31,         R31_H,
                    RSP,         RSP_H);
 
 
@@ -167,7 +230,7 @@ alloc_class chunk0(R10,         R10_H,
 // Empty register class.
 reg_class no_reg();
 
-// Class for all pointer/long registers
+// Class for all pointer/long registers including APX extended GPRs.
 reg_class all_reg(RAX, RAX_H,
                   RDX, RDX_H,
                   RBP, RBP_H,
@@ -183,9 +246,25 @@ reg_class all_reg(RAX, RAX_H,
                   R12, R12_H,
                   R13, R13_H,
                   R14, R14_H,
-                  R15, R15_H);
-
-// Class for all int registers
+                  R15, R15_H,
+                  R16, R16_H,
+                  R17, R17_H,
+                  R18, R18_H,
+                  R19, R19_H,
+                  R20, R20_H,
+                  R21, R21_H,
+                  R22, R22_H,
+                  R23, R23_H,
+                  R24, R24_H,
+                  R25, R25_H,
+                  R26, R26_H,
+                  R27, R27_H,
+                  R28, R28_H,
+                  R29, R29_H,
+                  R30, R30_H,
+                  R31, R31_H);
+
+// Class for all int registers including APX extended GPRs.
 reg_class all_int_reg(RAX
                       RDX,
                       RBP,
@@ -199,7 +278,23 @@ reg_class all_int_reg(RAX
                       R11,
                       R12,
                       R13,
-                      R14);
+                      R14,
+                      R16,
+                      R17,
+                      R18,
+                      R19,
+                      R20,
+                      R21,
+                      R22,
+                      R23,
+                      R24,
+                      R25,
+                      R26,
+                      R27,
+                      R28,
+                      R29,
+                      R30,
+                      R31);
 
 // Class for all pointer registers
 reg_class any_reg %{
@@ -386,6 +481,8 @@ static bool need_r12_heapbase() {
 }
 
 void reg_mask_init() {
+  constexpr Register egprs[] = {r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30, r31};
+
   // _ALL_REG_mask is generated by adlc from the all_reg register class below.
   // We derive a number of subsets from it.
   _ANY_REG_mask = _ALL_REG_mask;
@@ -404,6 +501,12 @@ void reg_mask_init() {
   _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next()));
   _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg()));
   _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg()->next()));
+  if (!UseAPX) {
+    for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) {
+      _PTR_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg()));
+      _PTR_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg()->next()));
+    }
+  }
 
   _STACK_OR_PTR_REG_mask = _PTR_REG_mask;
   _STACK_OR_PTR_REG_mask.OR(STACK_OR_STACK_SLOTS_mask());
@@ -420,6 +523,7 @@ void reg_mask_init() {
   _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg()));
   _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next()));
 
+
   _LONG_REG_mask = _PTR_REG_mask;
   _STACK_OR_LONG_REG_mask = _LONG_REG_mask;
   _STACK_OR_LONG_REG_mask.OR(STACK_OR_STACK_SLOTS_mask());
@@ -441,6 +545,12 @@ void reg_mask_init() {
   _LONG_NO_RBP_R13_REG_mask.Remove(OptoReg::as_OptoReg(r13->as_VMReg()->next()));
 
   _INT_REG_mask = _ALL_INT_REG_mask;
+  if (!UseAPX) {
+    for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) {
+      _INT_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg()));
+    }
+  }
+
   if (PreserveFramePointer) {
     _INT_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()));
   }
@@ -12260,31 +12370,15 @@ instruct jmpConUCF2_short(cmpOpUCF2 cop, rFlagsRegUCF cmp, label labl) %{
 // ============================================================================
 // inlined locking and unlocking
 
-instruct cmpFastLockRTM(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI tmp, rdx_RegI scr, rRegI cx1, rRegI cx2) %{
-  predicate(Compile::current()->use_rtm());
-  match(Set cr (FastLock object box));
-  effect(TEMP tmp, TEMP scr, TEMP cx1, TEMP cx2, USE_KILL box);
-  ins_cost(300);
-  format %{ "fastlock $object,$box\t! kills $box,$tmp,$scr,$cx1,$cx2" %}
-  ins_encode %{
-    __ fast_lock($object$$Register, $box$$Register, $tmp$$Register,
-                 $scr$$Register, $cx1$$Register, $cx2$$Register, r15_thread,
-                 _rtm_counters, _stack_rtm_counters,
-                 ((Method*)(ra_->C->method()->constant_encoding()))->method_data(),
-                 true, ra_->C->profile_rtm());
-  %}
-  ins_pipe(pipe_slow);
-%}
-
 instruct cmpFastLock(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI tmp, rRegP scr) %{
-  predicate(LockingMode != LM_LIGHTWEIGHT && !Compile::current()->use_rtm());
+  predicate(LockingMode != LM_LIGHTWEIGHT);
   match(Set cr (FastLock object box));
   effect(TEMP tmp, TEMP scr, USE_KILL box);
   ins_cost(300);
   format %{ "fastlock $object,$box\t! kills $box,$tmp,$scr" %}
   ins_encode %{
     __ fast_lock($object$$Register, $box$$Register, $tmp$$Register,
-                 $scr$$Register, noreg, noreg, r15_thread, nullptr, nullptr, nullptr, false, false);
+                 $scr$$Register, noreg, noreg, r15_thread, nullptr);
   %}
   ins_pipe(pipe_slow);
 %}
@@ -12296,7 +12390,7 @@ instruct cmpFastUnlock(rFlagsReg cr, rRegP object, rax_RegP box, rRegP tmp) %{
   ins_cost(300);
   format %{ "fastunlock $object,$box\t! kills $box,$tmp" %}
   ins_encode %{
-    __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, ra_->C->use_rtm());
+    __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register);
   %}
   ins_pipe(pipe_slow);
 %}
@@ -12336,7 +12430,6 @@ instruct safePoint_poll_tls(rFlagsReg cr, rRegP poll)
   format %{ "testl   rax, [$poll]\t"
             "# Safepoint: poll for GC" %}
   ins_cost(125);
-  size(4); /* setting an explicit size will cause debug builds to assert if size is incorrect */
   ins_encode %{
     __ relocate(relocInfo::poll_type);
     address pre_pc = __ pc();
diff --git a/src/hotspot/cpu/zero/nativeInst_zero.hpp b/src/hotspot/cpu/zero/nativeInst_zero.hpp
index 77a7d511ac5..2f3d9b80617 100644
--- a/src/hotspot/cpu/zero/nativeInst_zero.hpp
+++ b/src/hotspot/cpu/zero/nativeInst_zero.hpp
@@ -70,6 +70,8 @@ class NativeCall : public NativeInstruction {
     instruction_size = 0 // not used within the interpreter
   };
 
+  static int byte_size() { return instruction_size; }
+
   address instruction_address() const {
     ShouldNotCallThis();
     return nullptr;
diff --git a/src/hotspot/cpu/zero/register_zero.hpp b/src/hotspot/cpu/zero/register_zero.hpp
index 1b6f52879ef..fd30f206762 100644
--- a/src/hotspot/cpu/zero/register_zero.hpp
+++ b/src/hotspot/cpu/zero/register_zero.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2007 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -114,8 +114,6 @@ class ConcreteRegisterImpl : public AbstractRegisterImpl {
 };
 
 CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1));
-#ifndef DONT_USE_REGISTER_DEFINES
 #define noreg ((Register)(noreg_RegisterEnumValue))
-#endif
 
 #endif // CPU_ZERO_REGISTER_ZERO_HPP
diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp
index f0a984d3d1f..dce12db3935 100644
--- a/src/hotspot/os/aix/os_aix.cpp
+++ b/src/hotspot/os/aix/os_aix.cpp
@@ -69,6 +69,7 @@
 #include "signals_posix.hpp"
 #include "utilities/align.hpp"
 #include "utilities/checkedCast.hpp"
+#include "utilities/debug.hpp"
 #include "utilities/decoder.hpp"
 #include "utilities/defaultStream.hpp"
 #include "utilities/events.hpp"
@@ -96,6 +97,12 @@
 #include <sys/ioctl.h>
 #include <sys/ipc.h>
 #include <sys/mman.h>
+// sys/mman.h defines MAP_ANON_64K beginning with AIX7.3 TL1
+#ifndef MAP_ANON_64K
+  #define MAP_ANON_64K 0x400
+#else
+  STATIC_ASSERT(MAP_ANON_64K == 0x400);
+#endif
 #include <sys/resource.h>
 #include <sys/select.h>
 #include <sys/shm.h>
@@ -217,21 +224,22 @@ static address g_brk_at_startup = nullptr;
 //   http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/multiple_page_size_app_support.htm
 //
 static struct {
-  size_t pagesize;            // sysconf _SC_PAGESIZE (4K)
-  size_t datapsize;           // default data page size (LDR_CNTRL DATAPSIZE)
-  size_t shmpsize;            // default shared memory page size (LDR_CNTRL SHMPSIZE)
-  size_t pthr_stack_pagesize; // stack page size of pthread threads
-  size_t textpsize;           // default text page size (LDR_CNTRL STACKPSIZE)
-  bool can_use_64K_pages;     // True if we can alloc 64K pages dynamically with Sys V shm.
-  bool can_use_16M_pages;     // True if we can alloc 16M pages dynamically with Sys V shm.
-  int error;                  // Error describing if something went wrong at multipage init.
+  size_t pagesize;             // sysconf _SC_PAGESIZE (4K)
+  size_t datapsize;            // default data page size (LDR_CNTRL DATAPSIZE)
+  size_t shmpsize;             // default shared memory page size (LDR_CNTRL SHMPSIZE)
+  size_t pthr_stack_pagesize;  // stack page size of pthread threads
+  size_t textpsize;            // default text page size (LDR_CNTRL STACKPSIZE)
+  bool can_use_64K_pages;      // True if we can alloc 64K pages dynamically with Sys V shm.
+  bool can_use_16M_pages;      // True if we can alloc 16M pages dynamically with Sys V shm.
+  bool can_use_64K_mmap_pages; // True if we can alloc 64K pages dynamically with mmap.
+  int error;                   // Error describing if something went wrong at multipage init.
 } g_multipage_support = {
   (size_t) -1,
   (size_t) -1,
   (size_t) -1,
   (size_t) -1,
   (size_t) -1,
-  false, false,
+  false, false, false,
   0
 };
 
@@ -287,6 +295,8 @@ julong os::physical_memory() {
   return Aix::physical_memory();
 }
 
+size_t os::rss() { return (size_t)0; }
+
 // Cpu architecture string
 #if defined(PPC32)
 static char cpu_arch[] = "ppc";
@@ -364,12 +374,16 @@ static void query_multipage_support() {
   // our own page size after allocated.
   {
     const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR);
-    guarantee(shmid != -1, "shmget failed");
-    void* p = ::shmat(shmid, nullptr, 0);
-    ::shmctl(shmid, IPC_RMID, nullptr);
-    guarantee(p != (void*) -1, "shmat failed");
-    g_multipage_support.shmpsize = os::Aix::query_pagesize(p);
-    ::shmdt(p);
+    assert(shmid != -1, "shmget failed");
+    if (shmid != -1) {
+      void* p = ::shmat(shmid, nullptr, 0);
+      ::shmctl(shmid, IPC_RMID, nullptr);
+      assert(p != (void*) -1, "shmat failed");
+      if (p != (void*) -1) {
+        g_multipage_support.shmpsize = os::Aix::query_pagesize(p);
+        ::shmdt(p);
+      }
+    }
   }
 
   // Before querying the stack page size, make sure we are not running as primordial
@@ -419,26 +433,30 @@ static void query_multipage_support() {
       trcVerbose("Probing support for %s pages...", describe_pagesize(pagesize));
       const int shmid = ::shmget(IPC_PRIVATE, pagesize,
         IPC_CREAT | S_IRUSR | S_IWUSR);
-      guarantee0(shmid != -1); // Should always work.
-      // Try to set pagesize.
-      struct shmid_ds shm_buf = { };
-      shm_buf.shm_pagesize = pagesize;
-      if (::shmctl(shmid, SHM_PAGESIZE, &shm_buf) != 0) {
-        const int en = errno;
-        ::shmctl(shmid, IPC_RMID, nullptr); // As early as possible!
-        log_warning(pagesize)("shmctl(SHM_PAGESIZE) failed with errno=%d", errno);
-      } else {
-        // Attach and double check pageisze.
-        void* p = ::shmat(shmid, nullptr, 0);
-        ::shmctl(shmid, IPC_RMID, nullptr); // As early as possible!
-        guarantee0(p != (void*) -1); // Should always work.
-        const size_t real_pagesize = os::Aix::query_pagesize(p);
-        if (real_pagesize != pagesize) {
-          log_warning(pagesize)("real page size (" SIZE_FORMAT_X ") differs.", real_pagesize);
+      assert(shmid != -1, "shmget failed");
+      if (shmid != -1) {
+        // Try to set pagesize.
+        struct shmid_ds shm_buf = { };
+        shm_buf.shm_pagesize = pagesize;
+        if (::shmctl(shmid, SHM_PAGESIZE, &shm_buf) != 0) {
+          const int en = errno;
+          ::shmctl(shmid, IPC_RMID, nullptr); // As early as possible!
+          log_warning(pagesize)("shmctl(SHM_PAGESIZE) failed with errno=%d", errno);
         } else {
-          can_use = true;
+          // Attach and double check pageisze.
+          void* p = ::shmat(shmid, nullptr, 0);
+          ::shmctl(shmid, IPC_RMID, nullptr); // As early as possible!
+          assert(p != (void*) -1, "shmat failed");
+          if (p != (void*) -1) {
+            const size_t real_pagesize = os::Aix::query_pagesize(p);
+            if (real_pagesize != pagesize) {
+              log_warning(pagesize)("real page size (" SIZE_FORMAT_X ") differs.", real_pagesize);
+            } else {
+              can_use = true;
+            }
+            ::shmdt(p);
+          }
         }
-        ::shmdt(p);
       }
       trcVerbose("Can use: %s", (can_use ? "yes" : "no"));
       if (pagesize == 64*K) {
@@ -448,6 +466,16 @@ static void query_multipage_support() {
       }
     }
 
+    // Can we use mmap with 64K pages? (Should be available with AIX7.3 TL1)
+    {
+      void* p = mmap(NULL, 64*K, PROT_READ | PROT_WRITE, MAP_ANON_64K | MAP_ANONYMOUS | MAP_SHARED, -1, 0);
+      assert(p != (void*) -1, "mmap failed");
+      if (p != (void*) -1) {
+        g_multipage_support.can_use_64K_mmap_pages = (64*K == os::Aix::query_pagesize(p));
+        munmap(p, 64*K);
+      }
+    }
+
   } // end: check which pages can be used for shared memory
 
 query_multipage_support_end:
@@ -460,6 +488,8 @@ static void query_multipage_support() {
       describe_pagesize(g_multipage_support.textpsize));
   trcVerbose("Thread stack page size (pthread): %s",
       describe_pagesize(g_multipage_support.pthr_stack_pagesize));
+  trcVerbose("Can use 64K pages with mmap memory: %s",
+      (g_multipage_support.can_use_64K_mmap_pages ? "yes" :"no"));
   trcVerbose("Default shared memory page size: %s",
       describe_pagesize(g_multipage_support.shmpsize));
   trcVerbose("Can use 64K pages dynamically with shared memory: %s",
@@ -1131,6 +1161,8 @@ void os::print_memory_info(outputStream* st) {
     describe_pagesize(g_multipage_support.textpsize));
   st->print_cr("  Thread stack page size (pthread):       %s",
     describe_pagesize(g_multipage_support.pthr_stack_pagesize));
+  st->print_cr("  Can use 64K pages with mmap memory:     %s",
+    (g_multipage_support.can_use_64K_mmap_pages ? "yes" :"no"));
   st->print_cr("  Default shared memory page size:        %s",
     describe_pagesize(g_multipage_support.shmpsize));
   st->print_cr("  Can use 64K pages dynamically with shared memory:  %s",
@@ -1610,6 +1642,10 @@ static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) {
   // later use msync(MS_INVALIDATE) (see os::uncommit_memory).
   int flags = MAP_ANONYMOUS | MAP_SHARED;
 
+  if (os::vm_page_size() == 64*K && g_multipage_support.can_use_64K_mmap_pages) {
+    flags |= MAP_ANON_64K;
+  }
+
   // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what
   // it means if wishaddress is given but MAP_FIXED is not set.
   //
@@ -1659,7 +1695,11 @@ static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) {
     p2i(addr), p2i(addr + bytes), bytes);
 
   // bookkeeping
-  vmembk_add(addr, size, 4*K, VMEM_MAPPED);
+  if (os::vm_page_size() == 64*K && g_multipage_support.can_use_64K_mmap_pages) {
+    vmembk_add(addr, size, 64*K, VMEM_MAPPED);
+  } else {
+    vmembk_add(addr, size, 4*K, VMEM_MAPPED);
+  }
 
   // Test alignment, see above.
   assert0(is_aligned_to(addr, os::vm_page_size()));
@@ -1852,8 +1892,8 @@ char* os::pd_reserve_memory(size_t bytes, bool exec) {
   bytes = align_up(bytes, os::vm_page_size());
 
   // In 4K mode always use mmap.
-  // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted.
-  if (os::vm_page_size() == 4*K) {
+  // In 64K mode allocate with mmap if it supports 64K pages, otherwise use 64K shmatted.
+  if (os::vm_page_size() == 4*K || g_multipage_support.can_use_64K_mmap_pages) {
     return reserve_mmaped_memory(bytes, nullptr /* requested_addr */);
   } else {
     return reserve_shmated_memory(bytes, nullptr /* requested_addr */);
@@ -2040,8 +2080,8 @@ char* os::pd_attempt_reserve_memory_at(char* requested_addr, size_t bytes, bool
   bytes = align_up(bytes, os::vm_page_size());
 
   // In 4K mode always use mmap.
-  // In 64K mode allocate small sizes with mmap, large ones with 64K shmatted.
-  if (os::vm_page_size() == 4*K) {
+  // In 64K mode allocate with mmap if it supports 64K pages, otherwise use 64K shmatted.
+  if (os::vm_page_size() == 4*K || g_multipage_support.can_use_64K_mmap_pages) {
     return reserve_mmaped_memory(bytes, requested_addr);
   } else {
     return reserve_shmated_memory(bytes, requested_addr);
@@ -2181,18 +2221,18 @@ void os::init(void) {
   //    and should be allocated with 64k pages.
   //
   // So, we do the following:
-  // LDR_CNTRL    can_use_64K_pages_dynamically       what we do                      remarks
-  // 4K           no                                  4K                              old systems (aix 5.2) or new systems with AME activated
-  // 4k           yes                                 64k (treat 4k stacks as 64k)    different loader than java and standard settings
+  // LDR_CNTRL    can_use_64K_pages_dynamically(mmap or shm)       what we do                      remarks
+  // 4K           no                                               4K                              old systems (aix 5.2) or new systems with AME activated
+  // 4k           yes                                              64k (treat 4k stacks as 64k)    different loader than java and standard settings
   // 64k          no              --- AIX 5.2 ? ---
-  // 64k          yes                                 64k                             new systems and standard java loader (we set datapsize=64k when linking)
+  // 64k          yes                                              64k                             new systems and standard java loader (we set datapsize=64k when linking)
 
   // We explicitly leave no option to change page size, because only upgrading would work,
   // not downgrading (if stack page size is 64k you cannot pretend its 4k).
 
   if (g_multipage_support.datapsize == 4*K) {
     // datapsize = 4K. Data segment, thread stacks are 4K paged.
-    if (g_multipage_support.can_use_64K_pages) {
+    if (g_multipage_support.can_use_64K_pages || g_multipage_support.can_use_64K_mmap_pages) {
       // .. but we are able to use 64K pages dynamically.
       // This would be typical for java launchers which are not linked
       // with datapsize=64K (like, any other launcher but our own).
@@ -2222,7 +2262,7 @@ void os::init(void) {
     // This normally means that we can allocate 64k pages dynamically.
     // (There is one special case where this may be false: EXTSHM=on.
     // but we decided to not support that mode).
-    assert0(g_multipage_support.can_use_64K_pages);
+    assert0(g_multipage_support.can_use_64K_pages || g_multipage_support.can_use_64K_mmap_pages);
     set_page_size(64*K);
     trcVerbose("64K page mode");
     FLAG_SET_ERGO(Use64KPages, true);
@@ -2707,6 +2747,10 @@ void os::Aix::initialize_libperfstat() {
   }
 }
 
+bool os::Aix::supports_64K_mmap_pages() {
+  return g_multipage_support.can_use_64K_mmap_pages;
+}
+
 /////////////////////////////////////////////////////////////////////////////
 // thread stack
 
diff --git a/src/hotspot/os/aix/os_aix.hpp b/src/hotspot/os/aix/os_aix.hpp
index 759bc552bb7..d17c022e411 100644
--- a/src/hotspot/os/aix/os_aix.hpp
+++ b/src/hotspot/os/aix/os_aix.hpp
@@ -76,6 +76,7 @@ class os::Aix {
  public:
   static void init_thread_fpu_state();
   static pthread_t main_thread(void)                                { return _main_thread; }
+  static bool supports_64K_mmap_pages();
 
   // Given an address, returns the size of the page backing that address
   static size_t query_pagesize(void* p);
diff --git a/src/hotspot/os/bsd/os_bsd.cpp b/src/hotspot/os/bsd/os_bsd.cpp
index e5b6c74ce2f..fe1e7098fd5 100644
--- a/src/hotspot/os/bsd/os_bsd.cpp
+++ b/src/hotspot/os/bsd/os_bsd.cpp
@@ -210,6 +210,22 @@ julong os::physical_memory() {
   return Bsd::physical_memory();
 }
 
+size_t os::rss() {
+  size_t rss = 0;
+#ifdef __APPLE__
+  mach_task_basic_info info;
+  mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;
+
+  kern_return_t ret = task_info(mach_task_self(), MACH_TASK_BASIC_INFO,
+                                (task_info_t)&info, &count);
+  if (ret == KERN_SUCCESS) {
+    rss = info.resident_size;
+  }
+#endif // __APPLE__
+
+  return rss;
+}
+
 // Cpu architecture string
 #if   defined(ZERO)
 static char cpu_arch[] = ZERO_LIBARCH;
diff --git a/src/hotspot/os/linux/cgroupSubsystem_linux.cpp b/src/hotspot/os/linux/cgroupSubsystem_linux.cpp
index be9ff1440c0..1da0e44dbf4 100644
--- a/src/hotspot/os/linux/cgroupSubsystem_linux.cpp
+++ b/src/hotspot/os/linux/cgroupSubsystem_linux.cpp
@@ -28,6 +28,7 @@
 #include "cgroupSubsystem_linux.hpp"
 #include "cgroupV1Subsystem_linux.hpp"
 #include "cgroupV2Subsystem_linux.hpp"
+#include "cgroupUtil_linux.hpp"
 #include "logging/log.hpp"
 #include "memory/allocation.hpp"
 #include "os_linux.hpp"
@@ -41,7 +42,7 @@ static const char* cg_controller_name[] = { "cpu", "cpuset", "cpuacct", "memory"
 CgroupSubsystem* CgroupSubsystemFactory::create() {
   CgroupV1MemoryController* memory = nullptr;
   CgroupV1Controller* cpuset = nullptr;
-  CgroupV1Controller* cpu = nullptr;
+  CgroupV1CpuController* cpu = nullptr;
   CgroupV1Controller* cpuacct = nullptr;
   CgroupV1Controller* pids = nullptr;
   CgroupInfo cg_infos[CG_INFO_LENGTH];
@@ -61,12 +62,18 @@ CgroupSubsystem* CgroupSubsystemFactory::create() {
   if (is_cgroup_v2(&cg_type_flags)) {
     // Cgroups v2 case, we have all the info we need.
     // Construct the subsystem, free resources and return
-    // Note: any index in cg_infos will do as the path is the same for
-    //       all controllers.
-    CgroupController* unified = new CgroupV2Controller(cg_infos[MEMORY_IDX]._mount_path, cg_infos[MEMORY_IDX]._cgroup_path);
+    // Note: We use the memory for non-cpu non-memory controller look-ups.
+    //       Perhaps we ought to have separate controllers for all.
+    CgroupV2Controller mem_other = CgroupV2Controller(cg_infos[MEMORY_IDX]._mount_path,
+                                                      cg_infos[MEMORY_IDX]._cgroup_path,
+                                                      cg_infos[MEMORY_IDX]._read_only);
+    CgroupV2MemoryController* memory = new CgroupV2MemoryController(mem_other);
+    CgroupV2CpuController* cpu = new CgroupV2CpuController(CgroupV2Controller(cg_infos[CPU_IDX]._mount_path,
+                                                                              cg_infos[CPU_IDX]._cgroup_path,
+                                                                              cg_infos[CPU_IDX]._read_only));
     log_debug(os, container)("Detected cgroups v2 unified hierarchy");
     cleanup(cg_infos);
-    return new CgroupV2Subsystem(unified);
+    return new CgroupV2Subsystem(memory, cpu, mem_other);
   }
 
   /*
@@ -100,19 +107,19 @@ CgroupSubsystem* CgroupSubsystemFactory::create() {
     CgroupInfo info = cg_infos[i];
     if (info._data_complete) { // pids controller might have incomplete data
       if (strcmp(info._name, "memory") == 0) {
-        memory = new CgroupV1MemoryController(info._root_mount_path, info._mount_path);
+        memory = new CgroupV1MemoryController(CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only));
         memory->set_subsystem_path(info._cgroup_path);
       } else if (strcmp(info._name, "cpuset") == 0) {
-        cpuset = new CgroupV1Controller(info._root_mount_path, info._mount_path);
+        cpuset = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only);
         cpuset->set_subsystem_path(info._cgroup_path);
       } else if (strcmp(info._name, "cpu") == 0) {
-        cpu = new CgroupV1Controller(info._root_mount_path, info._mount_path);
+        cpu = new CgroupV1CpuController(CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only));
         cpu->set_subsystem_path(info._cgroup_path);
       } else if (strcmp(info._name, "cpuacct") == 0) {
-        cpuacct = new CgroupV1Controller(info._root_mount_path, info._mount_path);
+        cpuacct = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only);
         cpuacct->set_subsystem_path(info._cgroup_path);
       } else if (strcmp(info._name, "pids") == 0) {
-        pids = new CgroupV1Controller(info._root_mount_path, info._mount_path);
+        pids = new CgroupV1Controller(info._root_mount_path, info._mount_path, info._read_only);
         pids->set_subsystem_path(info._cgroup_path);
       }
     } else {
@@ -127,7 +134,8 @@ void CgroupSubsystemFactory::set_controller_paths(CgroupInfo* cg_infos,
                                                   int controller,
                                                   const char* name,
                                                   char* mount_path,
-                                                  char* root_path) {
+                                                  char* root_path,
+                                                  bool read_only) {
   if (cg_infos[controller]._mount_path != nullptr) {
     // On some systems duplicate controllers get mounted in addition to
     // the main cgroup controllers most likely under /sys/fs/cgroup. In that
@@ -139,6 +147,7 @@ void CgroupSubsystemFactory::set_controller_paths(CgroupInfo* cg_infos,
       os::free(cg_infos[controller]._root_mount_path);
       cg_infos[controller]._mount_path = os::strdup(mount_path);
       cg_infos[controller]._root_mount_path = os::strdup(root_path);
+      cg_infos[controller]._read_only = read_only;
     } else {
       log_debug(os, container)("Duplicate %s controllers detected. Picking %s, skipping %s.",
                                name, cg_infos[controller]._mount_path, mount_path);
@@ -146,9 +155,66 @@ void CgroupSubsystemFactory::set_controller_paths(CgroupInfo* cg_infos,
   } else {
     cg_infos[controller]._mount_path = os::strdup(mount_path);
     cg_infos[controller]._root_mount_path = os::strdup(root_path);
+    cg_infos[controller]._read_only = read_only;
   }
 }
 
+/*
+ * Determine whether or not the mount options, which are comma separated,
+ * contain the 'ro' string.
+ */
+static bool find_ro_opt(char* mount_opts) {
+  char* token;
+  char* mo_ptr = mount_opts;
+  // mount options are comma-separated (man proc).
+  while ((token = strsep(&mo_ptr, ",")) != NULL) {
+    if (strcmp(token, "ro") == 0) {
+      return true;
+    }
+  }
+  return false;
+}
+
+/*
+ * Read values of a /proc/self/mountinfo line into variables. For cgroups v1
+ * super options are needed. On cgroups v2 super options are not used.
+ *
+ * The scanning of a single mountinfo line entry is as follows:
+ *
+ * 36  35  98:0      /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
+ * (1) (2) (3):(4)   (5)   (6)      (7)      (8)   (9) (10)   (11)         (12)
+ *
+ * The numbers in parentheses are labels for the descriptions below:
+ *
+ *  (1)   mount ID:        matched with '%*d' and discarded
+ *  (2)   parent ID:       matched with '%*d' and discarded
+ *  (3)   major:           ---,---> major, minor separated by ':'. matched with '%*d:%*d' and discarded
+ *  (4)   minor:           ---'
+ *  (5)   root:            matched with '%s' and captured in 'tmproot'. Must be non-empty.
+ *  (6)   mount point:     matched with '%s' and captured in 'tmpmount'. Must be non-empty.
+ *  (7)   mount options:   matched with '%s' and captured in 'mount_opts'. Must be non-empty.
+ *  (8)   optional fields: ---,---> matched with '%*[^-]-'. Anything not a hyphen, followed by a hyphen
+ *  (9)   separator:       ---'     and discarded. Note: The discarded match is space characters if there
+ *                                  are no optionals. Otherwise it includes the optional fields as well.
+ * (10)   filesystem type: matched with '%s' and captured in 'tmp_fs_type'
+ * (11)   mount source:    matched with '%*s' and discarded
+ * (12)   super options:   matched with '%s' and captured in 'tmpcgroups'
+ */
+static inline bool match_mount_info_line(char* line,
+                                         char* tmproot,
+                                         char* tmpmount,
+                                         char* mount_opts,
+                                         char* tmp_fs_type,
+                                         char* tmpcgroups) {
+ return sscanf(line,
+               "%*d %*d %*d:%*d %s %s %s%*[^-]- %s %*s %s",
+               tmproot,
+               tmpmount,
+               mount_opts,
+               tmp_fs_type,
+               tmpcgroups) == 5;
+}
+
 bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos,
                                             const char* proc_cgroups,
                                             const char* proc_self_cgroup,
@@ -318,26 +384,40 @@ bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos,
     char tmproot[MAXPATHLEN+1];
     char tmpmount[MAXPATHLEN+1];
     char tmpcgroups[MAXPATHLEN+1];
+    char mount_opts[MAXPATHLEN+1];
     char *cptr = tmpcgroups;
     char *token;
 
-    // Cgroup v2 relevant info. We only look for the _mount_path iff is_cgroupsV2 so
-    // as to avoid memory stomping of the _mount_path pointer later on in the cgroup v1
-    // block in the hybrid case.
-    if (is_cgroupsV2 && sscanf(p, "%*d %*d %*d:%*d %s %s %*[^-]- %s %*s %*s", tmproot, tmpmount, tmp_fs_type) == 3) {
+    /* Cgroup v2 relevant info. We only look for the _mount_path iff is_cgroupsV2 so
+     * as to avoid memory stomping of the _mount_path pointer later on in the cgroup v1
+     * block in the hybrid case.
+     *
+     * We collect the read only mount option in the cgroup infos so as to have that
+     * info ready when determining is_containerized().
+     */
+    if (is_cgroupsV2 && match_mount_info_line(p,
+                                              tmproot,
+                                              tmpmount,
+                                              mount_opts,
+                                              tmp_fs_type,
+                                              tmpcgroups /* unused */)) {
       // we likely have an early match return (e.g. cgroup fs match), be sure we have cgroup2 as fstype
       if (strcmp("cgroup2", tmp_fs_type) == 0) {
         cgroupv2_mount_point_found = true;
         any_cgroup_mounts_found = true;
+        // For unified we only have a single line with cgroup2 fs type.
+        // Therefore use that option for all CG info structs.
+        bool ro_option = find_ro_opt(mount_opts);
         for (int i = 0; i < CG_INFO_LENGTH; i++) {
-          set_controller_paths(cg_infos, i, "(cg2, unified)", tmpmount, tmproot);
+          set_controller_paths(cg_infos, i, "(cg2, unified)", tmpmount, tmproot, ro_option);
         }
       }
     }
 
     /* Cgroup v1 relevant info
      *
-     * Find the cgroup mount point for memory, cpuset, cpu, cpuacct, pids
+     * Find the cgroup mount point for memory, cpuset, cpu, cpuacct, pids. For each controller
+     * determine whether or not they show up as mounted read only or not.
      *
      * Example for docker:
      * 219 214 0:29 /docker/7208cebd00fa5f2e342b1094f7bed87fa25661471a4637118e65f1c995be8a34 /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,memory
@@ -346,8 +426,9 @@ bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos,
      * 34 28 0:29 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,memory
      *
      * 44 31 0:39 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:23 - cgroup cgroup rw,pids
+     *
      */
-    if (sscanf(p, "%*d %*d %*d:%*d %s %s %*[^-]- %s %*s %s", tmproot, tmpmount, tmp_fs_type, tmpcgroups) == 4) {
+    if (match_mount_info_line(p, tmproot, tmpmount, mount_opts, tmp_fs_type, tmpcgroups)) {
       if (strcmp("cgroup", tmp_fs_type) != 0) {
         // Skip cgroup2 fs lines on hybrid or unified hierarchy.
         continue;
@@ -355,23 +436,28 @@ bool CgroupSubsystemFactory::determine_type(CgroupInfo* cg_infos,
       while ((token = strsep(&cptr, ",")) != nullptr) {
         if (strcmp(token, "memory") == 0) {
           any_cgroup_mounts_found = true;
-          set_controller_paths(cg_infos, MEMORY_IDX, token, tmpmount, tmproot);
+          bool ro_option = find_ro_opt(mount_opts);
+          set_controller_paths(cg_infos, MEMORY_IDX, token, tmpmount, tmproot, ro_option);
           cg_infos[MEMORY_IDX]._data_complete = true;
         } else if (strcmp(token, "cpuset") == 0) {
           any_cgroup_mounts_found = true;
-          set_controller_paths(cg_infos, CPUSET_IDX, token, tmpmount, tmproot);
+          bool ro_option = find_ro_opt(mount_opts);
+          set_controller_paths(cg_infos, CPUSET_IDX, token, tmpmount, tmproot, ro_option);
           cg_infos[CPUSET_IDX]._data_complete = true;
         } else if (strcmp(token, "cpu") == 0) {
           any_cgroup_mounts_found = true;
-          set_controller_paths(cg_infos, CPU_IDX, token, tmpmount, tmproot);
+          bool ro_option = find_ro_opt(mount_opts);
+          set_controller_paths(cg_infos, CPU_IDX, token, tmpmount, tmproot, ro_option);
           cg_infos[CPU_IDX]._data_complete = true;
         } else if (strcmp(token, "cpuacct") == 0) {
           any_cgroup_mounts_found = true;
-          set_controller_paths(cg_infos, CPUACCT_IDX, token, tmpmount, tmproot);
+          bool ro_option = find_ro_opt(mount_opts);
+          set_controller_paths(cg_infos, CPUACCT_IDX, token, tmpmount, tmproot, ro_option);
           cg_infos[CPUACCT_IDX]._data_complete = true;
         } else if (strcmp(token, "pids") == 0) {
           any_cgroup_mounts_found = true;
-          set_controller_paths(cg_infos, PIDS_IDX, token, tmpmount, tmproot);
+          bool ro_option = find_ro_opt(mount_opts);
+          set_controller_paths(cg_infos, PIDS_IDX, token, tmpmount, tmproot, ro_option);
           cg_infos[PIDS_IDX]._data_complete = true;
         }
       }
@@ -475,13 +561,13 @@ void CgroupSubsystemFactory::cleanup(CgroupInfo* cg_infos) {
  */
 int CgroupSubsystem::active_processor_count() {
   int quota_count = 0;
-  int cpu_count, limit_count;
+  int cpu_count;
   int result;
 
   // We use a cache with a timeout to avoid performing expensive
   // computations in the event this function is called frequently.
   // [See 8227006].
-  CachingCgroupController* contrl = cpu_controller();
+  CachingCgroupController<CgroupCpuController>* contrl = cpu_controller();
   CachedMetric* cpu_limit = contrl->metrics_cache();
   if (!cpu_limit->should_check_metric()) {
     int val = (int)cpu_limit->value();
@@ -489,23 +575,8 @@ int CgroupSubsystem::active_processor_count() {
     return val;
   }
 
-  cpu_count = limit_count = os::Linux::active_processor_count();
-  int quota  = cpu_quota();
-  int period = cpu_period();
-
-  if (quota > -1 && period > 0) {
-    quota_count = ceilf((float)quota / (float)period);
-    log_trace(os, container)("CPU Quota count based on quota/period: %d", quota_count);
-  }
-
-  // Use quotas
-  if (quota_count != 0) {
-    limit_count = quota_count;
-  }
-
-  result = MIN2(cpu_count, limit_count);
-  log_trace(os, container)("OSContainer::active_processor_count: %d", result);
-
+  cpu_count = os::Linux::active_processor_count();
+  result = CgroupUtil::processor_count(contrl->controller(), cpu_count);
   // Update cached metric to avoid re-reading container settings too often
   cpu_limit->set_value(result, OSCONTAINER_CACHE_TIMEOUT);
 
@@ -522,35 +593,14 @@ int CgroupSubsystem::active_processor_count() {
  *    OSCONTAINER_ERROR for not supported
  */
 jlong CgroupSubsystem::memory_limit_in_bytes() {
-  CachingCgroupController* contrl = memory_controller();
+  CachingCgroupController<CgroupMemoryController>* contrl = memory_controller();
   CachedMetric* memory_limit = contrl->metrics_cache();
   if (!memory_limit->should_check_metric()) {
     return memory_limit->value();
   }
   jlong phys_mem = os::Linux::physical_memory();
   log_trace(os, container)("total physical memory: " JLONG_FORMAT, phys_mem);
-  jlong mem_limit = read_memory_limit_in_bytes();
-
-  if (mem_limit <= 0 || mem_limit >= phys_mem) {
-    jlong read_mem_limit = mem_limit;
-    const char *reason;
-    if (mem_limit >= phys_mem) {
-      // Exceeding physical memory is treated as unlimited. Cg v1's implementation
-      // of read_memory_limit_in_bytes() caps this at phys_mem since Cg v1 has no
-      // value to represent 'max'. Cg v2 may return a value >= phys_mem if e.g. the
-      // container engine was started with a memory flag exceeding it.
-      reason = "ignored";
-      mem_limit = -1;
-    } else if (OSCONTAINER_ERROR == mem_limit) {
-      reason = "failed";
-    } else {
-      assert(mem_limit == -1, "Expected unlimited");
-      reason = "unlimited";
-    }
-    log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", using host value " JLONG_FORMAT,
-                             reason, read_mem_limit, phys_mem);
-  }
-
+  jlong mem_limit = contrl->controller()->read_memory_limit_in_bytes(phys_mem);
   // Update cached metric to avoid re-reading container settings too often
   memory_limit->set_value(mem_limit, OSCONTAINER_CACHE_TIMEOUT);
   return mem_limit;
@@ -661,7 +711,7 @@ bool CgroupController::read_numerical_key_value(const char* filename, const char
   for (; line != nullptr; line = fgets(buf, buf_len, fp)) {
     char after_key = line[key_len];
     if (strncmp(line, key, key_len) == 0
-          && isspace(after_key) != 0
+          && isspace((unsigned char) after_key) != 0
           && after_key != '\n') {
       // Skip key, skip space
       const char* value_substr = line + key_len + 1;
@@ -715,3 +765,55 @@ jlong CgroupController::limit_from_str(char* limit_str) {
   }
   return (jlong)limit;
 }
+
+// CgroupSubsystem implementations
+
+jlong CgroupSubsystem::memory_and_swap_limit_in_bytes() {
+  julong phys_mem = os::Linux::physical_memory();
+  julong host_swap = os::Linux::host_swap();
+  return memory_controller()->controller()->memory_and_swap_limit_in_bytes(phys_mem, host_swap);
+}
+
+jlong CgroupSubsystem::memory_and_swap_usage_in_bytes() {
+  julong phys_mem = os::Linux::physical_memory();
+  julong host_swap = os::Linux::host_swap();
+  return memory_controller()->controller()->memory_and_swap_usage_in_bytes(phys_mem, host_swap);
+}
+
+jlong CgroupSubsystem::memory_soft_limit_in_bytes() {
+  julong phys_mem = os::Linux::physical_memory();
+  return memory_controller()->controller()->memory_soft_limit_in_bytes(phys_mem);
+}
+
+jlong CgroupSubsystem::memory_usage_in_bytes() {
+  return memory_controller()->controller()->memory_usage_in_bytes();
+}
+
+jlong CgroupSubsystem::memory_max_usage_in_bytes() {
+  return memory_controller()->controller()->memory_max_usage_in_bytes();
+}
+
+jlong CgroupSubsystem::rss_usage_in_bytes() {
+  return memory_controller()->controller()->rss_usage_in_bytes();
+}
+
+jlong CgroupSubsystem::cache_usage_in_bytes() {
+  return memory_controller()->controller()->cache_usage_in_bytes();
+}
+
+int CgroupSubsystem::cpu_quota() {
+  return cpu_controller()->controller()->cpu_quota();
+}
+
+int CgroupSubsystem::cpu_period() {
+  return cpu_controller()->controller()->cpu_period();
+}
+
+int CgroupSubsystem::cpu_shares() {
+  return cpu_controller()->controller()->cpu_shares();
+}
+
+void CgroupSubsystem::print_version_specific_info(outputStream* st) {
+  julong phys_mem = os::Linux::physical_memory();
+  memory_controller()->controller()->print_version_specific_info(st, phys_mem);
+}
diff --git a/src/hotspot/os/linux/cgroupSubsystem_linux.hpp b/src/hotspot/os/linux/cgroupSubsystem_linux.hpp
index 6c17ff4508d..4d5fa5d4879 100644
--- a/src/hotspot/os/linux/cgroupSubsystem_linux.hpp
+++ b/src/hotspot/os/linux/cgroupSubsystem_linux.hpp
@@ -105,6 +105,7 @@
 class CgroupController: public CHeapObj<mtInternal> {
   public:
     virtual char* subsystem_path() = 0;
+    virtual bool is_read_only() = 0;
 
     /* Read a numerical value as unsigned long
      *
@@ -179,47 +180,73 @@ class CachedMetric : public CHeapObj<mtInternal>{
     }
 };
 
+template <class T>
 class CachingCgroupController : public CHeapObj<mtInternal> {
   private:
-    CgroupController* _controller;
+    T* _controller;
     CachedMetric* _metrics_cache;
 
   public:
-    CachingCgroupController(CgroupController* cont) {
+    CachingCgroupController(T* cont) {
       _controller = cont;
       _metrics_cache = new CachedMetric();
     }
 
     CachedMetric* metrics_cache() { return _metrics_cache; }
-    CgroupController* controller() { return _controller; }
+    T* controller() { return _controller; }
 };
 
-class CgroupSubsystem: public CHeapObj<mtInternal> {
+// Pure virtual class representing version agnostic CPU controllers
+class CgroupCpuController: public CHeapObj<mtInternal> {
   public:
-    jlong memory_limit_in_bytes();
-    int active_processor_count();
-
     virtual int cpu_quota() = 0;
     virtual int cpu_period() = 0;
     virtual int cpu_shares() = 0;
-    virtual jlong pids_max() = 0;
-    virtual jlong pids_current() = 0;
+    virtual bool is_read_only() = 0;
+};
+
+// Pure virtual class representing version agnostic memory controllers
+class CgroupMemoryController: public CHeapObj<mtInternal> {
+  public:
+    virtual jlong read_memory_limit_in_bytes(julong upper_bound) = 0;
     virtual jlong memory_usage_in_bytes() = 0;
-    virtual jlong memory_and_swap_limit_in_bytes() = 0;
-    virtual jlong memory_and_swap_usage_in_bytes() = 0;
-    virtual jlong memory_soft_limit_in_bytes() = 0;
+    virtual jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) = 0;
+    virtual jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) = 0;
+    virtual jlong memory_soft_limit_in_bytes(julong upper_bound) = 0;
     virtual jlong memory_max_usage_in_bytes() = 0;
     virtual jlong rss_usage_in_bytes() = 0;
     virtual jlong cache_usage_in_bytes() = 0;
+    virtual void print_version_specific_info(outputStream* st, julong host_mem) = 0;
+    virtual bool is_read_only() = 0;
+};
+
+class CgroupSubsystem: public CHeapObj<mtInternal> {
+  public:
+    jlong memory_limit_in_bytes();
+    int active_processor_count();
+
+    virtual jlong pids_max() = 0;
+    virtual jlong pids_current() = 0;
+    virtual bool is_containerized() = 0;
 
     virtual char * cpu_cpuset_cpus() = 0;
     virtual char * cpu_cpuset_memory_nodes() = 0;
-    virtual jlong read_memory_limit_in_bytes() = 0;
     virtual const char * container_type() = 0;
-    virtual CachingCgroupController* memory_controller() = 0;
-    virtual CachingCgroupController* cpu_controller() = 0;
-
-    virtual void print_version_specific_info(outputStream* st) = 0;
+    virtual CachingCgroupController<CgroupMemoryController>* memory_controller() = 0;
+    virtual CachingCgroupController<CgroupCpuController>* cpu_controller() = 0;
+
+    int cpu_quota();
+    int cpu_period();
+    int cpu_shares();
+
+    jlong memory_usage_in_bytes();
+    jlong memory_and_swap_limit_in_bytes();
+    jlong memory_and_swap_usage_in_bytes();
+    jlong memory_soft_limit_in_bytes();
+    jlong memory_max_usage_in_bytes();
+    jlong rss_usage_in_bytes();
+    jlong cache_usage_in_bytes();
+    void print_version_specific_info(outputStream* st);
 };
 
 // Utility class for storing info retrieved from /proc/cgroups,
@@ -233,6 +260,7 @@ class CgroupInfo : public StackObj {
     char* _name;
     int _hierarchy_id;
     bool _enabled;
+    bool _read_only;            // whether or not the mount path is mounted read-only
     bool _data_complete;    // indicating cgroup v1 data is complete for this controller
     char* _cgroup_path;     // cgroup controller path from /proc/self/cgroup
     char* _root_mount_path; // root mount path from /proc/self/mountinfo. Unused for cgroup v2
@@ -243,6 +271,7 @@ class CgroupInfo : public StackObj {
       _name = nullptr;
       _hierarchy_id = -1;
       _enabled = false;
+      _read_only = false;
       _data_complete = false;
       _cgroup_path = nullptr;
       _root_mount_path = nullptr;
@@ -274,7 +303,8 @@ class CgroupSubsystemFactory: AllStatic {
                                      int controller,
                                      const char* name,
                                      char* mount_path,
-                                     char* root_path);
+                                     char* root_path,
+                                     bool read_only);
     // Determine the cgroup type (version 1 or version 2), given
     // relevant paths to files. Sets 'flags' accordingly.
     static bool determine_type(CgroupInfo* cg_infos,
diff --git a/src/hotspot/os/linux/cgroupUtil_linux.cpp b/src/hotspot/os/linux/cgroupUtil_linux.cpp
new file mode 100644
index 00000000000..24046991905
--- /dev/null
+++ b/src/hotspot/os/linux/cgroupUtil_linux.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc.
+ * 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.
+ *
+ */
+
+#include "cgroupUtil_linux.hpp"
+
+int CgroupUtil::processor_count(CgroupCpuController* cpu_ctrl, int host_cpus) {
+  assert(host_cpus > 0, "physical host cpus must be positive");
+  int limit_count = host_cpus;
+  int quota  = cpu_ctrl->cpu_quota();
+  int period = cpu_ctrl->cpu_period();
+  int quota_count = 0;
+  int result = 0;
+
+  if (quota > -1 && period > 0) {
+    quota_count = ceilf((float)quota / (float)period);
+    log_trace(os, container)("CPU Quota count based on quota/period: %d", quota_count);
+  }
+
+  // Use quotas
+  if (quota_count != 0) {
+    limit_count = quota_count;
+  }
+
+  result = MIN2(host_cpus, limit_count);
+  log_trace(os, container)("OSContainer::active_processor_count: %d", result);
+  return result;
+}
diff --git a/src/hotspot/os/linux/cgroupUtil_linux.hpp b/src/hotspot/os/linux/cgroupUtil_linux.hpp
new file mode 100644
index 00000000000..fdcc4806c3b
--- /dev/null
+++ b/src/hotspot/os/linux/cgroupUtil_linux.hpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef CGROUP_UTIL_LINUX_HPP
+#define CGROUP_UTIL_LINUX_HPP
+
+#include "utilities/globalDefinitions.hpp"
+#include "cgroupSubsystem_linux.hpp"
+
+class CgroupUtil: AllStatic {
+
+  public:
+    static int processor_count(CgroupCpuController* cpu, int host_cpus);
+};
+
+#endif // CGROUP_UTIL_LINUX_HPP
diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp
index 72adaa23b81..d7f9918afda 100644
--- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp
+++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp
@@ -26,6 +26,7 @@
 #include <math.h>
 #include <errno.h>
 #include "cgroupV1Subsystem_linux.hpp"
+#include "cgroupUtil_linux.hpp"
 #include "logging/log.hpp"
 #include "memory/allocation.hpp"
 #include "runtime/globals.hpp"
@@ -76,42 +77,62 @@ void CgroupV1Controller::set_subsystem_path(char *cgroup_path) {
  */
 jlong CgroupV1MemoryController::uses_mem_hierarchy() {
   julong use_hierarchy;
-  CONTAINER_READ_NUMBER_CHECKED(this, "/memory.use_hierarchy", "Use Hierarchy", use_hierarchy);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.use_hierarchy", "Use Hierarchy", use_hierarchy);
   return (jlong)use_hierarchy;
 }
 
 void CgroupV1MemoryController::set_subsystem_path(char *cgroup_path) {
-  CgroupV1Controller::set_subsystem_path(cgroup_path);
+  reader()->set_subsystem_path(cgroup_path);
   jlong hierarchy = uses_mem_hierarchy();
   if (hierarchy > 0) {
     set_hierarchical(true);
   }
 }
 
-jlong CgroupV1Subsystem::read_memory_limit_in_bytes() {
+static inline
+void verbose_log(julong read_mem_limit, julong host_mem) {
+  if (log_is_enabled(Debug, os, container)) {
+    jlong mem_limit = (jlong)read_mem_limit; // account for negative values
+    if (mem_limit < 0 || read_mem_limit >= host_mem) {
+      const char *reason;
+      if (mem_limit == OSCONTAINER_ERROR) {
+        reason = "failed";
+      } else if (mem_limit == -1) {
+        reason = "unlimited";
+      } else {
+        assert(read_mem_limit >= host_mem, "Expected read value exceeding host_mem");
+        // Exceeding physical memory is treated as unlimited. This implementation
+        // caps it at host_mem since Cg v1 has no value to represent 'max'.
+        reason = "ignored";
+      }
+      log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", using host value " JLONG_FORMAT,
+                               reason, mem_limit, host_mem);
+    }
+  }
+}
+
+jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong phys_mem) {
   julong memlimit;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.limit_in_bytes", "Memory Limit", memlimit);
-  if (memlimit >= os::Linux::physical_memory()) {
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.limit_in_bytes", "Memory Limit", memlimit);
+  if (memlimit >= phys_mem) {
     log_trace(os, container)("Non-Hierarchical Memory Limit is: Unlimited");
-    CgroupV1MemoryController* mem_controller = reinterpret_cast<CgroupV1MemoryController*>(_memory->controller());
-    if (mem_controller->is_hierarchical()) {
+    if (is_hierarchical()) {
       julong hier_memlimit;
-      bool is_ok = _memory->controller()->read_numerical_key_value("/memory.stat",
-                                                                   "hierarchical_memory_limit",
-                                                                   &hier_memlimit);
+      bool is_ok = reader()->read_numerical_key_value("/memory.stat", "hierarchical_memory_limit", &hier_memlimit);
       if (!is_ok) {
         return OSCONTAINER_ERROR;
       }
       log_trace(os, container)("Hierarchical Memory Limit is: " JULONG_FORMAT, hier_memlimit);
-      if (hier_memlimit >= os::Linux::physical_memory()) {
-        log_trace(os, container)("Hierarchical Memory Limit is: Unlimited");
-      } else {
+      if (hier_memlimit < phys_mem) {
+        verbose_log(hier_memlimit, phys_mem);
         return (jlong)hier_memlimit;
       }
+      log_trace(os, container)("Hierarchical Memory Limit is: Unlimited");
     }
+    verbose_log(memlimit, phys_mem);
     return (jlong)-1;
-  }
-  else {
+  } else {
+    verbose_log(memlimit, phys_mem);
     return (jlong)memlimit;
   }
 }
@@ -128,20 +149,17 @@ jlong CgroupV1Subsystem::read_memory_limit_in_bytes() {
  *    * -1 if there isn't any limit in place (note: includes values which exceed a physical
  *      upper bound)
  */
-jlong CgroupV1Subsystem::read_mem_swap() {
-  julong host_total_memsw;
+jlong CgroupV1MemoryController::read_mem_swap(julong host_total_memsw) {
   julong hier_memswlimit;
   julong memswlimit;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit);
-  host_total_memsw = os::Linux::host_swap() + os::Linux::physical_memory();
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit);
   if (memswlimit >= host_total_memsw) {
     log_trace(os, container)("Non-Hierarchical Memory and Swap Limit is: Unlimited");
-    CgroupV1MemoryController* mem_controller = reinterpret_cast<CgroupV1MemoryController*>(_memory->controller());
-    if (mem_controller->is_hierarchical()) {
+    if (is_hierarchical()) {
       const char* matchline = "hierarchical_memsw_limit";
-      bool is_ok = _memory->controller()->read_numerical_key_value("/memory.stat",
-                                                                   matchline,
-                                                                   &hier_memswlimit);
+      bool is_ok = reader()->read_numerical_key_value("/memory.stat",
+                                                           matchline,
+                                                           &hier_memswlimit);
       if (!is_ok) {
         return OSCONTAINER_ERROR;
       }
@@ -158,8 +176,8 @@ jlong CgroupV1Subsystem::read_mem_swap() {
   }
 }
 
-jlong CgroupV1Subsystem::memory_and_swap_limit_in_bytes() {
-  jlong memory_swap = read_mem_swap();
+jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) {
+  jlong memory_swap = read_mem_swap(host_mem + host_swap);
   if (memory_swap == -1) {
     return memory_swap;
   }
@@ -168,7 +186,7 @@ jlong CgroupV1Subsystem::memory_and_swap_limit_in_bytes() {
   // supported.
   jlong swappiness = read_mem_swappiness();
   if (swappiness == 0 || memory_swap == OSCONTAINER_ERROR) {
-    jlong memlimit = read_memory_limit_in_bytes();
+    jlong memlimit = read_memory_limit_in_bytes(host_mem);
     if (memory_swap == OSCONTAINER_ERROR) {
       log_trace(os, container)("Memory and Swap Limit has been reset to " JLONG_FORMAT " because swap is not supported", memlimit);
     } else {
@@ -186,28 +204,28 @@ jlong memory_swap_usage_impl(CgroupController* ctrl) {
   return (jlong)memory_swap_usage;
 }
 
-jlong CgroupV1Subsystem::memory_and_swap_usage_in_bytes() {
-  jlong memory_sw_limit = memory_and_swap_limit_in_bytes();
-  jlong memory_limit = CgroupSubsystem::memory_limit_in_bytes();
+jlong CgroupV1MemoryController::memory_and_swap_usage_in_bytes(julong phys_mem, julong host_swap) {
+  jlong memory_sw_limit = memory_and_swap_limit_in_bytes(phys_mem, host_swap);
+  jlong memory_limit = read_memory_limit_in_bytes(phys_mem);
   if (memory_sw_limit > 0 && memory_limit > 0) {
     jlong delta_swap = memory_sw_limit - memory_limit;
     if (delta_swap > 0) {
-      return memory_swap_usage_impl(_memory->controller());
+      return memory_swap_usage_impl(reader());
     }
   }
   return memory_usage_in_bytes();
 }
 
-jlong CgroupV1Subsystem::read_mem_swappiness() {
+jlong CgroupV1MemoryController::read_mem_swappiness() {
   julong swappiness;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.swappiness", "Swappiness", swappiness);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.swappiness", "Swappiness", swappiness);
   return (jlong)swappiness;
 }
 
-jlong CgroupV1Subsystem::memory_soft_limit_in_bytes() {
+jlong CgroupV1MemoryController::memory_soft_limit_in_bytes(julong phys_mem) {
   julong memsoftlimit;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.soft_limit_in_bytes", "Memory Soft Limit", memsoftlimit);
-  if (memsoftlimit >= os::Linux::physical_memory()) {
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.soft_limit_in_bytes", "Memory Soft Limit", memsoftlimit);
+  if (memsoftlimit >= phys_mem) {
     log_trace(os, container)("Memory Soft Limit is: Unlimited");
     return (jlong)-1;
   } else {
@@ -215,6 +233,17 @@ jlong CgroupV1Subsystem::memory_soft_limit_in_bytes() {
   }
 }
 
+bool CgroupV1Subsystem::is_containerized() {
+  // containerized iff all required controllers are mounted
+  // read-only. See OSContainer::is_containerized() for
+  // the full logic.
+  //
+  return _memory->controller()->is_read_only() &&
+         _cpu->controller()->is_read_only() &&
+         _cpuacct->is_read_only() &&
+         _cpuset->is_read_only();
+}
+
 /* memory_usage_in_bytes
  *
  * Return the amount of used memory for this process.
@@ -224,9 +253,9 @@ jlong CgroupV1Subsystem::memory_soft_limit_in_bytes() {
  *    -1 for unlimited
  *    OSCONTAINER_ERROR for not supported
  */
-jlong CgroupV1Subsystem::memory_usage_in_bytes() {
+jlong CgroupV1MemoryController::memory_usage_in_bytes() {
   julong memusage;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.usage_in_bytes", "Memory Usage", memusage);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.usage_in_bytes", "Memory Usage", memusage);
   return (jlong)memusage;
 }
 
@@ -238,17 +267,15 @@ jlong CgroupV1Subsystem::memory_usage_in_bytes() {
  *    max memory usage in bytes or
  *    OSCONTAINER_ERROR for not supported
  */
-jlong CgroupV1Subsystem::memory_max_usage_in_bytes() {
+jlong CgroupV1MemoryController::memory_max_usage_in_bytes() {
   julong memmaxusage;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.max_usage_in_bytes", "Maximum Memory Usage", memmaxusage);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.max_usage_in_bytes", "Maximum Memory Usage", memmaxusage);
   return (jlong)memmaxusage;
 }
 
-jlong CgroupV1Subsystem::rss_usage_in_bytes() {
+jlong CgroupV1MemoryController::rss_usage_in_bytes() {
   julong rss;
-  bool is_ok = _memory->controller()->read_numerical_key_value("/memory.stat",
-                                                               "rss",
-                                                               &rss);
+  bool is_ok = reader()->read_numerical_key_value("/memory.stat", "rss", &rss);
   if (!is_ok) {
     return OSCONTAINER_ERROR;
   }
@@ -256,11 +283,9 @@ jlong CgroupV1Subsystem::rss_usage_in_bytes() {
   return (jlong)rss;
 }
 
-jlong CgroupV1Subsystem::cache_usage_in_bytes() {
+jlong CgroupV1MemoryController::cache_usage_in_bytes() {
   julong cache;
-  bool is_ok = _memory->controller()->read_numerical_key_value("/memory.stat",
-                                                               "cache",
-                                                               &cache);
+  bool is_ok = reader()->read_numerical_key_value("/memory.stat", "cache", &cache);
   if (!is_ok) {
     return OSCONTAINER_ERROR;
   }
@@ -268,30 +293,30 @@ jlong CgroupV1Subsystem::cache_usage_in_bytes() {
   return cache;
 }
 
-jlong CgroupV1Subsystem::kernel_memory_usage_in_bytes() {
+jlong CgroupV1MemoryController::kernel_memory_usage_in_bytes() {
   julong kmem_usage;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.kmem.usage_in_bytes", "Kernel Memory Usage", kmem_usage);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.kmem.usage_in_bytes", "Kernel Memory Usage", kmem_usage);
   return (jlong)kmem_usage;
 }
 
-jlong CgroupV1Subsystem::kernel_memory_limit_in_bytes() {
+jlong CgroupV1MemoryController::kernel_memory_limit_in_bytes(julong phys_mem) {
   julong kmem_limit;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.kmem.limit_in_bytes", "Kernel Memory Limit", kmem_limit);
-  if (kmem_limit >= os::Linux::physical_memory()) {
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.kmem.limit_in_bytes", "Kernel Memory Limit", kmem_limit);
+  if (kmem_limit >= phys_mem) {
     return (jlong)-1;
   }
   return (jlong)kmem_limit;
 }
 
-jlong CgroupV1Subsystem::kernel_memory_max_usage_in_bytes() {
+jlong CgroupV1MemoryController::kernel_memory_max_usage_in_bytes() {
   julong kmem_max_usage;
-  CONTAINER_READ_NUMBER_CHECKED(_memory->controller(), "/memory.kmem.max_usage_in_bytes", "Maximum Kernel Memory Usage", kmem_max_usage);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.kmem.max_usage_in_bytes", "Maximum Kernel Memory Usage", kmem_max_usage);
   return (jlong)kmem_max_usage;
 }
 
-void CgroupV1Subsystem::print_version_specific_info(outputStream* st) {
+void CgroupV1MemoryController::print_version_specific_info(outputStream* st, julong phys_mem) {
   jlong kmem_usage = kernel_memory_usage_in_bytes();
-  jlong kmem_limit = kernel_memory_limit_in_bytes();
+  jlong kmem_limit = kernel_memory_limit_in_bytes(phys_mem);
   jlong kmem_max_usage = kernel_memory_max_usage_in_bytes();
 
   OSContainer::print_container_helper(st, kmem_usage, "kernel_memory_usage_in_bytes");
@@ -321,10 +346,9 @@ char* CgroupV1Subsystem::cpu_cpuset_memory_nodes() {
  *    -1 for no quota
  *    OSCONTAINER_ERROR for not supported
  */
-int CgroupV1Subsystem::cpu_quota() {
+int CgroupV1CpuController::cpu_quota() {
   julong quota;
-  bool is_ok = _cpu->controller()->
-                  read_number("/cpu.cfs_quota_us", &quota);
+  bool is_ok = reader()->read_number("/cpu.cfs_quota_us", &quota);
   if (!is_ok) {
     log_trace(os, container)("CPU Quota failed: %d", OSCONTAINER_ERROR);
     return OSCONTAINER_ERROR;
@@ -336,9 +360,9 @@ int CgroupV1Subsystem::cpu_quota() {
   return quota_int;
 }
 
-int CgroupV1Subsystem::cpu_period() {
+int CgroupV1CpuController::cpu_period() {
   julong period;
-  CONTAINER_READ_NUMBER_CHECKED(_cpu->controller(), "/cpu.cfs_period_us", "CPU Period", period);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/cpu.cfs_period_us", "CPU Period", period);
   return (int)period;
 }
 
@@ -352,9 +376,9 @@ int CgroupV1Subsystem::cpu_period() {
  *    -1 for no share setup
  *    OSCONTAINER_ERROR for not supported
  */
-int CgroupV1Subsystem::cpu_shares() {
+int CgroupV1CpuController::cpu_shares() {
   julong shares;
-  CONTAINER_READ_NUMBER_CHECKED(_cpu->controller(), "/cpu.shares", "CPU Shares", shares);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/cpu.shares", "CPU Shares", shares);
   int shares_int = (int)shares;
   // Convert 1024 to no shares setup
   if (shares_int == 1024) return -1;
diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp
index 254b17de0ba..251fbde85f0 100644
--- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp
+++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp
@@ -34,28 +34,60 @@
 class CgroupV1Controller: public CgroupController {
   private:
     /* mountinfo contents */
-    char *_root;
-    char *_mount_point;
+    char* _root;
+    char* _mount_point;
+    bool _read_only;
 
     /* Constructed subsystem directory */
-    char *_path;
+    char* _path;
 
   public:
-    CgroupV1Controller(char *root, char *mountpoint) {
-      _root = os::strdup(root);
-      _mount_point = os::strdup(mountpoint);
-      _path = nullptr;
+    CgroupV1Controller(char *root,
+                       char *mountpoint,
+                       bool ro) : _root(os::strdup(root)),
+                                  _mount_point(os::strdup(mountpoint)),
+                                  _read_only(ro),
+                                  _path(nullptr) {
+    }
+    // Shallow copy constructor
+    CgroupV1Controller(const CgroupV1Controller& o) : _root(o._root),
+                                                      _mount_point(o._mount_point),
+                                                      _read_only(o._read_only),
+                                                      _path(o._path) {
+    }
+    ~CgroupV1Controller() {
+      // At least one subsystem controller exists with paths to malloc'd path
+      // names
     }
 
-    virtual void set_subsystem_path(char *cgroup_path);
-    char *subsystem_path() { return _path; }
+    void set_subsystem_path(char *cgroup_path);
+    char *subsystem_path() override { return _path; }
+    bool is_read_only() { return _read_only; }
 };
 
-class CgroupV1MemoryController: public CgroupV1Controller {
+class CgroupV1MemoryController final : public CgroupMemoryController {
 
+  private:
+    CgroupV1Controller _reader;
+    CgroupV1Controller* reader() { return &_reader; }
   public:
     bool is_hierarchical() { return _uses_mem_hierarchy; }
     void set_subsystem_path(char *cgroup_path);
+    jlong read_memory_limit_in_bytes(julong upper_bound) override;
+    jlong memory_usage_in_bytes() override;
+    jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) override;
+    jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) override;
+    jlong memory_soft_limit_in_bytes(julong upper_bound) override;
+    jlong memory_max_usage_in_bytes() override;
+    jlong rss_usage_in_bytes() override;
+    jlong cache_usage_in_bytes() override;
+    jlong kernel_memory_usage_in_bytes();
+    jlong kernel_memory_limit_in_bytes(julong host_mem);
+    jlong kernel_memory_max_usage_in_bytes();
+    void print_version_specific_info(outputStream* st, julong host_mem) override;
+    bool is_read_only() override {
+      return reader()->is_read_only();
+    }
   private:
     /* Some container runtimes set limits via cgroup
      * hierarchy. If set to true consider also memory.stat
@@ -63,26 +95,41 @@ class CgroupV1MemoryController: public CgroupV1Controller {
     bool _uses_mem_hierarchy;
     jlong uses_mem_hierarchy();
     void set_hierarchical(bool value) { _uses_mem_hierarchy = value; }
+    jlong read_mem_swappiness();
+    jlong read_mem_swap(julong host_total_memsw);
 
   public:
-    CgroupV1MemoryController(char *root, char *mountpoint) : CgroupV1Controller(root, mountpoint) {
-      _uses_mem_hierarchy = false;
+    CgroupV1MemoryController(const CgroupV1Controller& reader)
+      : _reader(reader),
+        _uses_mem_hierarchy(false) {
     }
 
 };
 
-class CgroupV1Subsystem: public CgroupSubsystem {
+class CgroupV1CpuController final : public CgroupCpuController {
+
+  private:
+    CgroupV1Controller _reader;
+    CgroupV1Controller* reader() { return &_reader; }
+  public:
+    int cpu_quota() override;
+    int cpu_period() override;
+    int cpu_shares() override;
+    void set_subsystem_path(char *cgroup_path) {
+      reader()->set_subsystem_path(cgroup_path);
+    }
+    bool is_read_only() override {
+      return reader()->is_read_only();
+    }
 
   public:
-    jlong read_memory_limit_in_bytes();
-    jlong memory_and_swap_limit_in_bytes();
-    jlong memory_and_swap_usage_in_bytes();
-    jlong memory_soft_limit_in_bytes();
-    jlong memory_usage_in_bytes();
-    jlong memory_max_usage_in_bytes();
-    jlong rss_usage_in_bytes();
-    jlong cache_usage_in_bytes();
+    CgroupV1CpuController(const CgroupV1Controller& reader) : _reader(reader) {
+    }
+};
+
+class CgroupV1Subsystem: public CgroupSubsystem {
 
+  public:
     jlong kernel_memory_usage_in_bytes();
     jlong kernel_memory_limit_in_bytes();
     jlong kernel_memory_max_usage_in_bytes();
@@ -90,44 +137,35 @@ class CgroupV1Subsystem: public CgroupSubsystem {
     char * cpu_cpuset_cpus();
     char * cpu_cpuset_memory_nodes();
 
-    int cpu_quota();
-    int cpu_period();
-
-    int cpu_shares();
-
     jlong pids_max();
     jlong pids_current();
-
-    void print_version_specific_info(outputStream* st);
+    bool is_containerized();
 
     const char * container_type() {
       return "cgroupv1";
     }
-    CachingCgroupController * memory_controller() { return _memory; }
-    CachingCgroupController * cpu_controller() { return _cpu; }
+    CachingCgroupController<CgroupMemoryController>* memory_controller() { return _memory; }
+    CachingCgroupController<CgroupCpuController>* cpu_controller() { return _cpu; }
 
   private:
     /* controllers */
-    CachingCgroupController* _memory = nullptr;
+    CachingCgroupController<CgroupMemoryController>* _memory = nullptr;
     CgroupV1Controller* _cpuset = nullptr;
-    CachingCgroupController* _cpu = nullptr;
+    CachingCgroupController<CgroupCpuController>* _cpu = nullptr;
     CgroupV1Controller* _cpuacct = nullptr;
     CgroupV1Controller* _pids = nullptr;
 
-    jlong read_mem_swappiness();
-    jlong read_mem_swap();
-
   public:
     CgroupV1Subsystem(CgroupV1Controller* cpuset,
-                      CgroupV1Controller* cpu,
+                      CgroupV1CpuController* cpu,
                       CgroupV1Controller* cpuacct,
                       CgroupV1Controller* pids,
-                      CgroupV1MemoryController* memory) {
-      _cpuset = cpuset;
-      _cpu = new CachingCgroupController(cpu);
-      _cpuacct = cpuacct;
-      _pids = pids;
-      _memory = new CachingCgroupController(memory);
+                      CgroupV1MemoryController* memory) :
+      _memory(new CachingCgroupController<CgroupMemoryController>(memory)),
+      _cpuset(cpuset),
+      _cpu(new CachingCgroupController<CgroupCpuController>(cpu)),
+      _cpuacct(cpuacct),
+      _pids(pids) {
     }
 };
 
diff --git a/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp
index 1ba7c1e69d5..8f7e12d0954 100644
--- a/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp
+++ b/src/hotspot/os/linux/cgroupV2Subsystem_linux.cpp
@@ -23,6 +23,7 @@
  */
 
 #include "cgroupV2Subsystem_linux.hpp"
+#include "cgroupUtil_linux.hpp"
 
 /* cpu_shares
  *
@@ -34,9 +35,9 @@
  *    -1 for no share setup
  *    OSCONTAINER_ERROR for not supported
  */
-int CgroupV2Subsystem::cpu_shares() {
+int CgroupV2CpuController::cpu_shares() {
   julong shares;
-  CONTAINER_READ_NUMBER_CHECKED(_unified, "/cpu.weight", "Raw value for CPU Shares", shares);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/cpu.weight", "Raw value for CPU Shares", shares);
   int shares_int = (int)shares;
   // Convert default value of 100 to no shares setup
   if (shares_int == 100) {
@@ -83,9 +84,9 @@ int CgroupV2Subsystem::cpu_shares() {
  *    -1 for no quota
  *    OSCONTAINER_ERROR for not supported
  */
-int CgroupV2Subsystem::cpu_quota() {
+int CgroupV2CpuController::cpu_quota() {
   jlong quota_val;
-  bool is_ok = _unified->read_numerical_tuple_value("/cpu.max", true /* use_first */, &quota_val);
+  bool is_ok = reader()->read_numerical_tuple_value("/cpu.max", true /* use_first */, &quota_val);
   if (!is_ok) {
     return OSCONTAINER_ERROR;
   }
@@ -94,21 +95,27 @@ int CgroupV2Subsystem::cpu_quota() {
   return limit;
 }
 
+bool CgroupV2Subsystem::is_containerized() {
+  return _unified.is_read_only() &&
+         _memory->controller()->is_read_only() &&
+         _cpu->controller()->is_read_only();
+}
+
 char* CgroupV2Subsystem::cpu_cpuset_cpus() {
   char cpus[1024];
-  CONTAINER_READ_STRING_CHECKED(_unified, "/cpuset.cpus", "cpuset.cpus", cpus, 1024);
+  CONTAINER_READ_STRING_CHECKED(unified(), "/cpuset.cpus", "cpuset.cpus", cpus, 1024);
   return os::strdup(cpus);
 }
 
 char* CgroupV2Subsystem::cpu_cpuset_memory_nodes() {
   char mems[1024];
-  CONTAINER_READ_STRING_CHECKED(_unified, "/cpuset.mems", "cpuset.mems", mems, 1024);
+  CONTAINER_READ_STRING_CHECKED(unified(), "/cpuset.mems", "cpuset.mems", mems, 1024);
   return os::strdup(mems);
 }
 
-int CgroupV2Subsystem::cpu_period() {
+int CgroupV2CpuController::cpu_period() {
   jlong period_val;
-  bool is_ok = _unified->read_numerical_tuple_value("/cpu.max", false /* use_first */, &period_val);
+  bool is_ok = reader()->read_numerical_tuple_value("/cpu.max", false /* use_first */, &period_val);
   if (!is_ok) {
     log_trace(os, container)("CPU Period failed: %d", OSCONTAINER_ERROR);
     return OSCONTAINER_ERROR;
@@ -127,28 +134,27 @@ int CgroupV2Subsystem::cpu_period() {
  *    -1 for unlimited
  *    OSCONTAINER_ERROR for not supported
  */
-jlong CgroupV2Subsystem::memory_usage_in_bytes() {
+jlong CgroupV2MemoryController::memory_usage_in_bytes() {
   julong memusage;
-  CONTAINER_READ_NUMBER_CHECKED(_unified, "/memory.current", "Memory Usage", memusage);
+  CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.current", "Memory Usage", memusage);
   return (jlong)memusage;
 }
 
-jlong CgroupV2Subsystem::memory_soft_limit_in_bytes() {
+jlong CgroupV2MemoryController::memory_soft_limit_in_bytes(julong phys_mem) {
   jlong mem_soft_limit;
-  CONTAINER_READ_NUMBER_CHECKED_MAX(_unified, "/memory.low", "Memory Soft Limit", mem_soft_limit);
+  CONTAINER_READ_NUMBER_CHECKED_MAX(reader(), "/memory.low", "Memory Soft Limit", mem_soft_limit);
   return mem_soft_limit;
 }
 
-jlong CgroupV2Subsystem::memory_max_usage_in_bytes() {
+jlong CgroupV2MemoryController::memory_max_usage_in_bytes() {
   // Log this string at trace level so as to make tests happy.
   log_trace(os, container)("Maximum Memory Usage is not supported.");
   return OSCONTAINER_ERROR; // not supported
 }
 
-jlong CgroupV2Subsystem::rss_usage_in_bytes() {
+jlong CgroupV2MemoryController::rss_usage_in_bytes() {
   julong rss;
-  bool is_ok = _memory->controller()->
-                    read_numerical_key_value("/memory.stat", "anon", &rss);
+  bool is_ok = reader()->read_numerical_key_value("/memory.stat", "anon", &rss);
   if (!is_ok) {
     return OSCONTAINER_ERROR;
   }
@@ -156,10 +162,9 @@ jlong CgroupV2Subsystem::rss_usage_in_bytes() {
   return (jlong)rss;
 }
 
-jlong CgroupV2Subsystem::cache_usage_in_bytes() {
+jlong CgroupV2MemoryController::cache_usage_in_bytes() {
   julong cache;
-  bool is_ok = _memory->controller()->
-                    read_numerical_key_value("/memory.stat", "file", &cache);
+  bool is_ok = reader()->read_numerical_key_value("/memory.stat", "file", &cache);
   if (!is_ok) {
     return OSCONTAINER_ERROR;
   }
@@ -172,18 +177,19 @@ jlong CgroupV2Subsystem::cache_usage_in_bytes() {
 // respectively. In order to properly report a cgroup v1 like
 // compound value we need to sum the two values. Setting a swap limit
 // without also setting a memory limit is not allowed.
-jlong CgroupV2Subsystem::memory_and_swap_limit_in_bytes() {
+jlong CgroupV2MemoryController::memory_and_swap_limit_in_bytes(julong phys_mem,
+                                                               julong host_swap /* unused in cg v2 */) {
   jlong swap_limit;
-  bool is_ok = _memory->controller()->read_number_handle_max("/memory.swap.max", &swap_limit);
+  bool is_ok = reader()->read_number_handle_max("/memory.swap.max", &swap_limit);
   if (!is_ok) {
     // Some container tests rely on this trace logging to happen.
     log_trace(os, container)("Swap Limit failed: %d", OSCONTAINER_ERROR);
     // swap disabled at kernel level, treat it as no swap
-    return read_memory_limit_in_bytes();
+    return read_memory_limit_in_bytes(phys_mem);
   }
   log_trace(os, container)("Swap Limit is: " JLONG_FORMAT, swap_limit);
   if (swap_limit >= 0) {
-    jlong memory_limit = read_memory_limit_in_bytes();
+    jlong memory_limit = read_memory_limit_in_bytes(phys_mem);
     assert(memory_limit >= 0, "swap limit without memory limit?");
     return memory_limit + swap_limit;
   }
@@ -191,29 +197,31 @@ jlong CgroupV2Subsystem::memory_and_swap_limit_in_bytes() {
   return swap_limit;
 }
 
-jlong CgroupV2Subsystem::memory_and_swap_usage_in_bytes() {
-    jlong memory_usage = memory_usage_in_bytes();
-    if (memory_usage >= 0) {
-        jlong swap_current = mem_swp_current_val();
-        return memory_usage + (swap_current >= 0 ? swap_current : 0);
-    }
-    return memory_usage; // not supported or unlimited case
+// memory.swap.current : total amount of swap currently used by the cgroup and its descendants
+static
+jlong memory_swap_current_value(CgroupV2Controller* ctrl) {
+  julong swap_current;
+  CONTAINER_READ_NUMBER_CHECKED(ctrl, "/memory.swap.current", "Swap currently used", swap_current);
+  return (jlong)swap_current;
 }
 
-jlong CgroupV2Subsystem::mem_swp_limit_val() {
-  jlong swap_limit;
-  CONTAINER_READ_NUMBER_CHECKED_MAX(_unified, "/memory.swap.max", "Swap Limit", swap_limit);
-  return swap_limit;
+jlong CgroupV2MemoryController::memory_and_swap_usage_in_bytes(julong host_mem, julong host_swap) {
+  jlong memory_usage = memory_usage_in_bytes();
+  if (memory_usage >= 0) {
+      jlong swap_current = memory_swap_current_value(reader());
+      return memory_usage + (swap_current >= 0 ? swap_current : 0);
+  }
+  return memory_usage; // not supported or unlimited case
 }
 
-// memory.swap.current : total amount of swap currently used by the cgroup and its descendants
-jlong CgroupV2Subsystem::mem_swp_current_val() {
-  julong swap_current;
-  CONTAINER_READ_NUMBER_CHECKED(_unified, "/memory.swap.current", "Swap currently used", swap_current);
-  return (jlong)swap_current;
+static
+jlong memory_limit_value(CgroupV2Controller* ctrl) {
+  jlong memory_limit;
+  CONTAINER_READ_NUMBER_CHECKED_MAX(ctrl, "/memory.max", "Memory Limit", memory_limit);
+  return memory_limit;
 }
 
-/* memory_limit_in_bytes
+/* read_memory_limit_in_bytes
  *
  * Return the limit of available memory for this process.
  *
@@ -221,15 +229,44 @@ jlong CgroupV2Subsystem::mem_swp_current_val() {
  *    memory limit in bytes or
  *    -1 for unlimited, OSCONTAINER_ERROR for an error
  */
-jlong CgroupV2Subsystem::read_memory_limit_in_bytes() {
-  jlong memory_limit;
-  CONTAINER_READ_NUMBER_CHECKED_MAX(_unified, "/memory.max", "Memory Limit", memory_limit);
-  return memory_limit;
+jlong CgroupV2MemoryController::read_memory_limit_in_bytes(julong phys_mem) {
+  jlong limit = memory_limit_value(reader());
+  if (log_is_enabled(Trace, os, container)) {
+    if (limit == -1) {
+      log_trace(os, container)("Memory Limit is: Unlimited");
+    } else {
+      log_trace(os, container)("Memory Limit is: " JLONG_FORMAT, limit);
+    }
+  }
+  if (log_is_enabled(Debug, os, container)) {
+    julong read_limit = (julong)limit; // avoid signed/unsigned compare
+    if (limit < 0 || read_limit >= phys_mem) {
+      const char* reason;
+      if (limit == -1) {
+        reason = "unlimited";
+      } else if (limit == OSCONTAINER_ERROR) {
+        reason = "failed";
+      } else {
+        assert(read_limit >= phys_mem, "Expected mem limit to exceed host memory");
+        reason = "ignored";
+      }
+      log_debug(os, container)("container memory limit %s: " JLONG_FORMAT ", using host value " JLONG_FORMAT,
+                               reason, limit, phys_mem);
+    }
+  }
+  return limit;
+}
+
+static
+jlong memory_swap_limit_value(CgroupV2Controller* ctrl) {
+  jlong swap_limit;
+  CONTAINER_READ_NUMBER_CHECKED_MAX(ctrl, "/memory.swap.max", "Swap Limit", swap_limit);
+  return swap_limit;
 }
 
-void CgroupV2Subsystem::print_version_specific_info(outputStream* st) {
-  jlong swap_current = mem_swp_current_val();
-  jlong swap_limit = mem_swp_limit_val();
+void CgroupV2MemoryController::print_version_specific_info(outputStream* st, julong phys_mem) {
+  jlong swap_current = memory_swap_current_value(reader());
+  jlong swap_limit = memory_swap_limit_value(reader());
 
   OSContainer::print_container_helper(st, swap_current, "memory_swap_current_in_bytes");
   OSContainer::print_container_helper(st, swap_limit, "memory_swap_max_limit_in_bytes");
@@ -255,7 +292,7 @@ char* CgroupV2Controller::construct_path(char* mount_path, char *cgroup_path) {
  */
 jlong CgroupV2Subsystem::pids_max() {
   jlong pids_max;
-  CONTAINER_READ_NUMBER_CHECKED_MAX(_unified, "/pids.max", "Maximum number of tasks", pids_max);
+  CONTAINER_READ_NUMBER_CHECKED_MAX(unified(), "/pids.max", "Maximum number of tasks", pids_max);
   return pids_max;
 }
 
@@ -269,6 +306,6 @@ jlong CgroupV2Subsystem::pids_max() {
  */
 jlong CgroupV2Subsystem::pids_current() {
   julong pids_current;
-  CONTAINER_READ_NUMBER_CHECKED(_unified, "/pids.current", "Current number of tasks", pids_current);
+  CONTAINER_READ_NUMBER_CHECKED(unified(), "/pids.current", "Current number of tasks", pids_current);
   return pids_current;
 }
diff --git a/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp b/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp
index a004c8f75b9..02774fb70ae 100644
--- a/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp
+++ b/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp
@@ -33,63 +33,103 @@ class CgroupV2Controller: public CgroupController {
     char *_mount_path;
     /* The cgroup path for the controller */
     char *_cgroup_path;
+    bool _read_only;
 
     /* Constructed full path to the subsystem directory */
     char *_path;
     static char* construct_path(char* mount_path, char *cgroup_path);
 
   public:
-    CgroupV2Controller(char * mount_path, char *cgroup_path) {
-      _mount_path = mount_path;
-      _cgroup_path = os::strdup(cgroup_path);
-      _path = construct_path(mount_path, cgroup_path);
+    CgroupV2Controller(char* mount_path,
+                       char *cgroup_path,
+                       bool ro) :  _mount_path(os::strdup(mount_path)),
+                                   _cgroup_path(os::strdup(cgroup_path)),
+                                   _read_only(ro),
+                                   _path(construct_path(mount_path, cgroup_path)) {
+    }
+    // Shallow copy constructor
+    CgroupV2Controller(const CgroupV2Controller& o) :
+                                            _mount_path(o._mount_path),
+                                            _cgroup_path(o._cgroup_path),
+                                            _read_only(o._read_only),
+                                            _path(o._path) {
+    }
+    ~CgroupV2Controller() {
+      // At least one controller exists with references to the paths
     }
 
-    char *subsystem_path() { return _path; }
+    char *subsystem_path() override { return _path; }
+    bool is_read_only() override { return _read_only; }
+};
+
+class CgroupV2CpuController: public CgroupCpuController {
+  private:
+    CgroupV2Controller _reader;
+    CgroupV2Controller* reader() { return &_reader; }
+  public:
+    CgroupV2CpuController(const CgroupV2Controller& reader) : _reader(reader) {
+    }
+    int cpu_quota() override;
+    int cpu_period() override;
+    int cpu_shares() override;
+    bool is_read_only() override {
+      return reader()->is_read_only();
+    }
+};
+
+class CgroupV2MemoryController final: public CgroupMemoryController {
+  private:
+    CgroupV2Controller _reader;
+    CgroupV2Controller* reader() { return &_reader; }
+  public:
+    CgroupV2MemoryController(const CgroupV2Controller& reader) : _reader(reader) {
+    }
+
+    jlong read_memory_limit_in_bytes(julong upper_bound) override;
+    jlong memory_and_swap_limit_in_bytes(julong host_mem, julong host_swp) override;
+    jlong memory_and_swap_usage_in_bytes(julong host_mem, julong host_swp) override;
+    jlong memory_soft_limit_in_bytes(julong upper_bound) override;
+    jlong memory_usage_in_bytes() override;
+    jlong memory_max_usage_in_bytes() override;
+    jlong rss_usage_in_bytes() override;
+    jlong cache_usage_in_bytes() override;
+    void print_version_specific_info(outputStream* st, julong host_mem) override;
+    bool is_read_only() override {
+      return reader()->is_read_only();
+    }
 };
 
 class CgroupV2Subsystem: public CgroupSubsystem {
   private:
     /* One unified controller */
-    CgroupController* _unified = nullptr;
+    CgroupV2Controller _unified;
     /* Caching wrappers for cpu/memory metrics */
-    CachingCgroupController* _memory = nullptr;
-    CachingCgroupController* _cpu = nullptr;
+    CachingCgroupController<CgroupMemoryController>* _memory = nullptr;
+    CachingCgroupController<CgroupCpuController>* _cpu = nullptr;
 
-    jlong mem_swp_limit_val();
-    jlong mem_swp_current_val();
+    CgroupV2Controller* unified() { return &_unified; }
 
   public:
-    CgroupV2Subsystem(CgroupController * unified) {
-      _unified = unified;
-      _memory = new CachingCgroupController(unified);
-      _cpu = new CachingCgroupController(unified);
+    CgroupV2Subsystem(CgroupV2MemoryController* memory,
+                      CgroupV2CpuController* cpu,
+                      CgroupV2Controller unified) :
+        _unified(unified),
+        _memory(new CachingCgroupController<CgroupMemoryController>(memory)),
+        _cpu(new CachingCgroupController<CgroupCpuController>(cpu)) {
     }
 
-    jlong read_memory_limit_in_bytes();
-    int cpu_quota();
-    int cpu_period();
-    int cpu_shares();
-    jlong memory_and_swap_limit_in_bytes();
-    jlong memory_and_swap_usage_in_bytes();
-    jlong memory_soft_limit_in_bytes();
-    jlong memory_usage_in_bytes();
-    jlong memory_max_usage_in_bytes();
-    jlong rss_usage_in_bytes();
-    jlong cache_usage_in_bytes();
-
-    char * cpu_cpuset_cpus();
-    char * cpu_cpuset_memory_nodes();
-    jlong pids_max();
-    jlong pids_current();
-
-    void print_version_specific_info(outputStream* st);
-
-    const char * container_type() {
+    char * cpu_cpuset_cpus() override;
+    char * cpu_cpuset_memory_nodes() override;
+    jlong pids_max() override;
+    jlong pids_current() override;
+
+    bool is_containerized() override;
+
+    const char * container_type() override {
       return "cgroupv2";
     }
-    CachingCgroupController * memory_controller() { return _memory; }
-    CachingCgroupController * cpu_controller() { return _cpu; }
+    CachingCgroupController<CgroupMemoryController>* memory_controller() { return _memory; }
+    CachingCgroupController<CgroupCpuController>* cpu_controller() { return _cpu; }
 };
 
 #endif // CGROUP_V2_SUBSYSTEM_LINUX_HPP
diff --git a/src/hotspot/os/linux/gc/x/xPhysicalMemoryBacking_linux.cpp b/src/hotspot/os/linux/gc/x/xPhysicalMemoryBacking_linux.cpp
index 5db59741a58..35625f613d3 100644
--- a/src/hotspot/os/linux/gc/x/xPhysicalMemoryBacking_linux.cpp
+++ b/src/hotspot/os/linux/gc/x/xPhysicalMemoryBacking_linux.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -389,7 +389,7 @@ XErrno XPhysicalMemoryBacking::fallocate_compat_mmap_hugetlbfs(size_t offset, si
   // On hugetlbfs, mapping a file segment will fail immediately, without
   // the need to touch the mapped pages first, if there aren't enough huge
   // pages available to back the mapping.
-  void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset);
+  void* const addr = mmap(nullptr, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset);
   if (addr == MAP_FAILED) {
     // Failed
     return errno;
@@ -439,7 +439,7 @@ static bool safe_touch_mapping(void* addr, size_t length, size_t page_size) {
 XErrno XPhysicalMemoryBacking::fallocate_compat_mmap_tmpfs(size_t offset, size_t length) const {
   // On tmpfs, we need to touch the mapped pages to figure out
   // if there are enough pages available to back the mapping.
-  void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset);
+  void* const addr = mmap(nullptr, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset);
   if (addr == MAP_FAILED) {
     // Failed
     return errno;
diff --git a/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp b/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp
index 76f9d90cd71..b80124cc34e 100644
--- a/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp
+++ b/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -391,7 +391,7 @@ ZErrno ZPhysicalMemoryBacking::fallocate_compat_mmap_hugetlbfs(zoffset offset, s
   // On hugetlbfs, mapping a file segment will fail immediately, without
   // the need to touch the mapped pages first, if there aren't enough huge
   // pages available to back the mapping.
-  void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, untype(offset));
+  void* const addr = mmap(nullptr, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, untype(offset));
   if (addr == MAP_FAILED) {
     // Failed
     return errno;
@@ -441,7 +441,7 @@ static bool safe_touch_mapping(void* addr, size_t length, size_t page_size) {
 ZErrno ZPhysicalMemoryBacking::fallocate_compat_mmap_tmpfs(zoffset offset, size_t length) const {
   // On tmpfs, we need to touch the mapped pages to figure out
   // if there are enough pages available to back the mapping.
-  void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, untype(offset));
+  void* const addr = mmap(nullptr, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, untype(offset));
   if (addr == MAP_FAILED) {
     // Failed
     return errno;
diff --git a/src/hotspot/os/linux/globals_linux.hpp b/src/hotspot/os/linux/globals_linux.hpp
index 8539eab9e97..1cb0b553c52 100644
--- a/src/hotspot/os/linux/globals_linux.hpp
+++ b/src/hotspot/os/linux/globals_linux.hpp
@@ -94,7 +94,9 @@
   product(bool, UseMadvPopulateWrite, true, DIAGNOSTIC,                 \
           "Use MADV_POPULATE_WRITE in os::pd_pretouch_memory.")         \
                                                                         \
-
+  product(bool, PrintMemoryMapAtExit, false, DIAGNOSTIC,                \
+          "Print an annotated memory map at exit")                      \
+                                                                        \
 // end of RUNTIME_OS_FLAGS
 
 //
diff --git a/src/hotspot/os/linux/memMapPrinter_linux.cpp b/src/hotspot/os/linux/memMapPrinter_linux.cpp
index 05d520f6953..0b696b9914e 100644
--- a/src/hotspot/os/linux/memMapPrinter_linux.cpp
+++ b/src/hotspot/os/linux/memMapPrinter_linux.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2023, Red Hat, Inc. and/or its affiliates.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Red Hat, Inc. and/or its affiliates.
  * 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,60 +25,165 @@
 
 #include "precompiled.hpp"
 
-#include "runtime/os.hpp"
 #include "nmt/memMapPrinter.hpp"
+#include "procMapsParser.hpp"
+#include "runtime/os.hpp"
+#include "utilities/align.hpp"
 #include "utilities/globalDefinitions.hpp"
+#include "utilities/powerOfTwo.hpp"
+
 #include <limits.h>
 
-struct ProcMapsInfo {
-  void* from = 0;
-  void* to = 0;
-  char prot[20 + 1];
-  char offset[20 + 1];
-  char dev[20 + 1];
-  char inode[20 + 1];
-  char filename[1024 + 1];
-
-  bool scan_proc_maps_line(const char* line) {
-    prot[0] = offset[0] = dev[0] = inode[0] = filename[0] = '\0';
-    const int items_read = ::sscanf(line, "%p-%p %20s %20s %20s %20s %1024s",
-        &from, &to, prot, offset, dev, inode, filename);
-    return items_read >= 2; // need at least from and to
+class ProcSmapsSummary {
+  unsigned _num_mappings;
+  size_t _vsize;        // combined virtual size
+  size_t _rss;          // combined resident set size
+  size_t _committed;    // combined committed size
+  size_t _shared;       // combined shared size
+  size_t _swapped_out;  // combined amount of swapped-out memory
+  size_t _hugetlb;      // combined amount of memory backed by explicit huge pages
+  size_t _thp;          // combined amount of memory backed by THPs
+public:
+  ProcSmapsSummary() : _num_mappings(0), _vsize(0), _rss(0), _committed(0), _shared(0),
+                     _swapped_out(0), _hugetlb(0), _thp(0) {}
+  void add_mapping(const ProcSmapsInfo& info) {
+    _num_mappings++;
+    _vsize += info.vsize();
+    _rss += info.rss;
+    _committed += info.nr ? 0 : info.vsize();
+    _shared += info.sh ? info.vsize() : 0;
+    _swapped_out += info.swap;
+    _hugetlb += info.private_hugetlb + info.shared_hugetlb;
+    _thp += info.anonhugepages;
+  }
+
+  void print_on(const MappingPrintSession& session) const {
+    outputStream* st = session.out();
+    st->print_cr("Number of mappings: %u", _num_mappings);
+    st->print_cr("             vsize: %zu (" PROPERFMT ")", _vsize, PROPERFMTARGS(_vsize));
+    st->print_cr("               rss: %zu (" PROPERFMT ")", _rss, PROPERFMTARGS(_rss));
+    st->print_cr("         committed: %zu (" PROPERFMT ")", _committed, PROPERFMTARGS(_committed));
+    st->print_cr("            shared: %zu (" PROPERFMT ")", _shared, PROPERFMTARGS(_shared));
+    st->print_cr("       swapped out: %zu (" PROPERFMT ")", _swapped_out, PROPERFMTARGS(_swapped_out));
+    st->print_cr("         using thp: %zu (" PROPERFMT ")", _thp, PROPERFMTARGS(_thp));
+    st->print_cr("           hugetlb: %zu (" PROPERFMT ")", _hugetlb, PROPERFMTARGS(_hugetlb));
   }
 };
 
-class LinuxMappingPrintInformation : public MappingPrintInformation {
-  const ProcMapsInfo _info;
+class ProcSmapsPrinter {
+  const MappingPrintSession& _session;
 public:
+  ProcSmapsPrinter(const MappingPrintSession& session) :
+    _session(session)
+  {}
 
-  LinuxMappingPrintInformation(const void* from, const void* to, const ProcMapsInfo* info) :
-    MappingPrintInformation(from, to), _info(*info) {}
+  void print_single_mapping(const ProcSmapsInfo& info) const {
+    outputStream* st = _session.out();
+#define INDENT_BY(n)          \
+  if (st->fill_to(n) == 0) {  \
+    st->print(" ");           \
+  }
+    st->print(PTR_FORMAT "-" PTR_FORMAT, p2i(info.from), p2i(info.to));
+    INDENT_BY(38);
+    st->print("%12zu", info.vsize());
+    INDENT_BY(51);
+    st->print("%s", info.prot);
+    INDENT_BY(56);
+    st->print("%12zu", info.rss);
+    INDENT_BY(69);
+    st->print("%12zu", info.private_hugetlb);
+    INDENT_BY(82);
+    st->print(EXACTFMT, EXACTFMTARGS(info.kernelpagesize));
+    {
+      INDENT_BY(87);
+      int num_printed = 0;
+#define PRINTIF(cond, s)                                    \
+      if (cond) {                                           \
+        st->print("%s%s", (num_printed > 0 ? "," : ""), s); \
+        num_printed++;                                      \
+      }
+      PRINTIF(info.sh, "shrd");
+      PRINTIF(!info.nr, "com");
+      PRINTIF(info.swap > 0, "swap");
+      PRINTIF(info.ht, "huge");
+      PRINTIF(info.anonhugepages > 0, "thp");
+      PRINTIF(info.hg, "thpad");
+      PRINTIF(info.nh, "nothp");
+      if (num_printed == 0) {
+        st->print("-");
+      }
+#undef PRINTIF
+    }
+    INDENT_BY(104);
+    if (!_session.print_nmt_info_for_region(info.from, info.to)) {
+      st->print("-");
+    }
+    INDENT_BY(142);
+    st->print_raw(info.filename[0] == '\0' ? "-" : info.filename);
+  #undef INDENT_BY
+    st->cr();
+  }
 
-  void print_OS_specific_details(outputStream* st) const override {
-    st->print("%s %s ", _info.prot, _info.offset);
+  void print_legend() const {
+    outputStream* st = _session.out();
+    st->print_cr("from, to, vsize: address range and size");
+    st->print_cr("prot:            protection");
+    st->print_cr("rss:             resident set size");
+    st->print_cr("hugetlb:         size of private hugetlb pages");
+    st->print_cr("pgsz:            page size");
+    st->print_cr("notes:           mapping information  (detail mode only)");
+    st->print_cr("                      shrd: mapping is shared");
+    st->print_cr("                       com: mapping committed (swap space reserved)");
+    st->print_cr("                      swap: mapping partly or completely swapped out");
+    st->print_cr("                       thp: mapping uses THP");
+    st->print_cr("                     thpad: mapping is THP-madvised");
+    st->print_cr("                     nothp: mapping is forbidden to use THP");
+    st->print_cr("                      huge: mapping uses hugetlb pages");
+    st->print_cr("vm info:         VM information (requires NMT)");
+    {
+      streamIndentor si(st, 16);
+      _session.print_nmt_flag_legend();
+    }
+    st->print_cr("file:            file mapped, if mapping is not anonymous");
   }
 
-  const char* filename() const override { return _info.filename; }
+  void print_header() const {
+    outputStream* st = _session.out();
+    //            0         1         2         3         4         5         6         7         8         9         0         1         2         3         4         5         6         7
+    //            012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+    //            0x0000000414000000-0x0000000453000000 123456789012 rw-p 123456789012 123456789012 16g  thp,thpadv       STACK-340754-Monitor-Deflation-Thread /shared/tmp.txt
+    st->print_cr("from               to                        vsize prot          rss      hugetlb pgsz notes            info                                  file");
+    st->print_cr("========================================================================================================================================================================");
+  }
 };
 
-void MemMapPrinter::pd_print_header(outputStream* st) {
-  st->print_cr("size          prot offset  What");
-}
-
-void MemMapPrinter::pd_iterate_all_mappings(MappingPrintClosure& closure) {
-  FILE* f = os::fopen("/proc/self/maps", "r");
+void MemMapPrinter::pd_print_all_mappings(const MappingPrintSession& session) {
+  constexpr char filename[] = "/proc/self/smaps";
+  FILE* f = os::fopen(filename, "r");
   if (f == nullptr) {
+    session.out()->print_cr("Cannot open %s", filename);
     return;
   }
-  constexpr size_t linesize = sizeof(ProcMapsInfo);
-  char line[linesize];
-  while (fgets(line, sizeof(line), f) == line) {
-    line[sizeof(line) - 1] = '\0';
-    ProcMapsInfo info;
-    if (info.scan_proc_maps_line(line)) {
-      LinuxMappingPrintInformation mapinfo(info.from, info.to, &info);
-      closure.do_it(&mapinfo);
-    }
+
+  ProcSmapsPrinter printer(session);
+  ProcSmapsSummary summary;
+
+  outputStream* const st = session.out();
+
+  printer.print_legend();
+  st->cr();
+  printer.print_header();
+
+  ProcSmapsInfo info;
+  ProcSmapsParser parser(f);
+  while (parser.parse_next(info)) {
+    printer.print_single_mapping(info);
+    summary.add_mapping(info);
   }
+  st->cr();
+
+  summary.print_on(session);
+  st->cr();
+
   ::fclose(f);
 }
diff --git a/src/hotspot/os/linux/osContainer_linux.cpp b/src/hotspot/os/linux/osContainer_linux.cpp
index fdb138c864f..25e8eb46410 100644
--- a/src/hotspot/os/linux/osContainer_linux.cpp
+++ b/src/hotspot/os/linux/osContainer_linux.cpp
@@ -58,8 +58,43 @@ void OSContainer::init() {
   if (cgroup_subsystem == nullptr) {
     return; // Required subsystem files not found or other error
   }
-
-  _is_containerized = true;
+  /*
+   * In order to avoid a false positive on is_containerized() on
+   * Linux systems outside a container *and* to ensure compatibility
+   * with in-container usage, we detemine is_containerized() by two
+   * steps:
+   * 1.) Determine if all the cgroup controllers are mounted read only.
+   *     If yes, is_containerized() == true. Otherwise, do the fallback
+   *     in 2.)
+   * 2.) Query for memory and cpu limits. If any limit is set, we set
+   *     is_containerized() == true.
+   *
+   * Step 1.) covers the basic in container use-cases. Step 2.) ensures
+   * that limits enforced by other means (e.g. systemd slice) are properly
+   * detected.
+   */
+  const char *reason;
+  bool any_mem_cpu_limit_present = false;
+  bool controllers_read_only = cgroup_subsystem->is_containerized();
+  if (controllers_read_only) {
+    // in-container case
+    reason = " because all controllers are mounted read-only (container case)";
+  } else {
+    // We can be in one of two cases:
+    //  1.) On a physical Linux system without any limit
+    //  2.) On a physical Linux system with a limit enforced by other means (like systemd slice)
+    any_mem_cpu_limit_present = cgroup_subsystem->memory_limit_in_bytes() > 0 ||
+                                     os::Linux::active_processor_count() != cgroup_subsystem->active_processor_count();
+    if (any_mem_cpu_limit_present) {
+      reason = " because either a cpu or a memory limit is present";
+    } else {
+      reason = " because no cpu or memory limit is present";
+    }
+  }
+  _is_containerized = controllers_read_only || any_mem_cpu_limit_present;
+  log_debug(os, container)("OSContainer::init: is_containerized() = %s%s",
+                                                            _is_containerized ? "true" : "false",
+                                                            reason);
 }
 
 const char * OSContainer::container_type() {
diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp
index 20d3c99cd3e..87150365ed5 100644
--- a/src/hotspot/os/linux/os_linux.cpp
+++ b/src/hotspot/os/linux/os_linux.cpp
@@ -314,7 +314,10 @@ static jlong host_free_swap() {
 }
 
 jlong os::free_swap_space() {
-  jlong host_free_swap_val = host_free_swap();
+  // os::total_swap_space() might return the containerized limit which might be
+  // less than host_free_swap(). The upper bound of free swap needs to be the lower of the two.
+  jlong host_free_swap_val = MIN2(os::total_swap_space(), host_free_swap());
+  assert(host_free_swap_val >= 0, "sysinfo failed?");
   if (OSContainer::is_containerized()) {
     jlong mem_swap_limit = OSContainer::memory_and_swap_limit_in_bytes();
     jlong mem_limit = OSContainer::memory_limit_in_bytes();
@@ -356,6 +359,15 @@ julong os::physical_memory() {
   return phys_mem;
 }
 
+size_t os::rss() {
+  size_t size = 0;
+  os::Linux::meminfo_t info;
+  if (os::Linux::query_process_memory_info(&info)) {
+    size = info.vmrss * K;
+  }
+  return size;
+}
+
 static uint64_t initial_total_ticks = 0;
 static uint64_t initial_steal_ticks = 0;
 static bool     has_initial_tick_info = false;
@@ -1353,7 +1365,7 @@ void os::Linux::capture_initial_stack(size_t max_size) {
       i = 0;
       if (s) {
         // Skip blank chars
-        do { s++; } while (s && isspace(*s));
+        do { s++; } while (s && isspace((unsigned char) *s));
 
 #define _UFM UINTX_FORMAT
 #define _DFM INTX_FORMAT
@@ -3513,81 +3525,6 @@ static address get_stack_commited_bottom(address bottom, size_t size) {
   return nbot;
 }
 
-bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) {
-  int mincore_return_value;
-  const size_t stripe = 1024;  // query this many pages each time
-  unsigned char vec[stripe + 1];
-  // set a guard
-  vec[stripe] = 'X';
-
-  const size_t page_sz = os::vm_page_size();
-  uintx pages = size / page_sz;
-
-  assert(is_aligned(start, page_sz), "Start address must be page aligned");
-  assert(is_aligned(size, page_sz), "Size must be page aligned");
-
-  committed_start = nullptr;
-
-  int loops = checked_cast<int>((pages + stripe - 1) / stripe);
-  int committed_pages = 0;
-  address loop_base = start;
-  bool found_range = false;
-
-  for (int index = 0; index < loops && !found_range; index ++) {
-    assert(pages > 0, "Nothing to do");
-    uintx pages_to_query = (pages >= stripe) ? stripe : pages;
-    pages -= pages_to_query;
-
-    // Get stable read
-    while ((mincore_return_value = mincore(loop_base, pages_to_query * page_sz, vec)) == -1 && errno == EAGAIN);
-
-    // During shutdown, some memory goes away without properly notifying NMT,
-    // E.g. ConcurrentGCThread/WatcherThread can exit without deleting thread object.
-    // Bailout and return as not committed for now.
-    if (mincore_return_value == -1 && errno == ENOMEM) {
-      return false;
-    }
-
-    // If mincore is not supported.
-    if (mincore_return_value == -1 && errno == ENOSYS) {
-      return false;
-    }
-
-    assert(vec[stripe] == 'X', "overflow guard");
-    assert(mincore_return_value == 0, "Range must be valid");
-    // Process this stripe
-    for (uintx vecIdx = 0; vecIdx < pages_to_query; vecIdx ++) {
-      if ((vec[vecIdx] & 0x01) == 0) { // not committed
-        // End of current contiguous region
-        if (committed_start != nullptr) {
-          found_range = true;
-          break;
-        }
-      } else { // committed
-        // Start of region
-        if (committed_start == nullptr) {
-          committed_start = loop_base + page_sz * vecIdx;
-        }
-        committed_pages ++;
-      }
-    }
-
-    loop_base += pages_to_query * page_sz;
-  }
-
-  if (committed_start != nullptr) {
-    assert(committed_pages > 0, "Must have committed region");
-    assert(committed_pages <= int(size / page_sz), "Can not commit more than it has");
-    assert(committed_start >= start && committed_start < start + size, "Out of range");
-    committed_size = page_sz * committed_pages;
-    return true;
-  } else {
-    assert(committed_pages == 0, "Should not have committed region");
-    return false;
-  }
-}
-
-
 // Linux uses a growable mapping for the stack, and if the mapping for
 // the stack guard pages is not removed when we detach a thread the
 // stack cannot grow beyond the pages where the stack guard was
@@ -5219,7 +5156,7 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
   if (s == nullptr) return -1;
 
   // Skip blank chars
-  do { s++; } while (s && isspace(*s));
+  do { s++; } while (s && isspace((unsigned char) *s));
 
   count = sscanf(s,"%c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu",
                  &cdummy, &idummy, &idummy, &idummy, &idummy, &idummy,
diff --git a/src/hotspot/os/linux/procMapsParser.cpp b/src/hotspot/os/linux/procMapsParser.cpp
new file mode 100644
index 00000000000..6dfd49a0596
--- /dev/null
+++ b/src/hotspot/os/linux/procMapsParser.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc. and/or its affiliates.
+ * Copyright (c) 2024, 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.
+ *
+ */
+
+#include "precompiled.hpp"
+
+#include "procMapsParser.hpp"
+#include "runtime/os.hpp"
+#include "utilities/globalDefinitions.hpp"
+
+static bool is_lowercase_hex(char c) {
+  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
+}
+
+static size_t max_mapping_line_len() {
+  return 100 + // everything but the file name
+         os::vm_page_size() // the file name (kernel limits /proc/pid/cmdline to one page
+         ;
+}
+
+ProcSmapsParser::ProcSmapsParser(FILE* f) :
+  _f(f), _linelen(max_mapping_line_len()), _line(nullptr) {
+  assert(_f != nullptr, "Invalid file handle given");
+  _line = NEW_C_HEAP_ARRAY(char, max_mapping_line_len(), mtInternal);
+  _line[0] = '\0';
+}
+
+ProcSmapsParser::~ProcSmapsParser() {
+  FREE_C_HEAP_ARRAY(char, _line);
+}
+
+bool ProcSmapsParser::read_line() {
+  _line[0] = '\0';
+  return ::fgets(_line, _linelen, _f) != nullptr;
+}
+
+bool ProcSmapsParser::is_header_line() {
+  // e.g. ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]
+  return is_lowercase_hex(_line[0]); // All non-header lines in /proc/pid/smaps start with upper-case letters.
+}
+
+void ProcSmapsParser::scan_header_line(ProcSmapsInfo& out) {
+  const int items_read = ::sscanf(_line, "%p-%p %20s %*s %*s %*s %1024s",
+                                  &out.from, &out.to, out.prot, out.filename);
+  assert(items_read >= 2, "Expected header_line");
+}
+
+void ProcSmapsParser::scan_additional_line(ProcSmapsInfo& out) {
+#define SCAN(key, var) \
+ if (::sscanf(_line, key ": %zu kB", &var) == 1) { \
+     var *= K; \
+     return; \
+ }
+  SCAN("KernelPageSize", out.kernelpagesize);
+  SCAN("Rss", out.rss);
+  SCAN("AnonHugePages", out.anonhugepages);
+  SCAN("Private_Hugetlb", out.private_hugetlb);
+  SCAN("Shared_Hugetlb", out.shared_hugetlb);
+  SCAN("Swap", out.swap);
+  int i = 0;
+#undef SCAN
+  // scan some flags too
+  if (strncmp(_line, "VmFlags:", 8) == 0) {
+#define SCAN(flag) { out.flag = (::strstr(_line + 8, " " #flag) != nullptr); }
+    SCAN(rd);
+    SCAN(wr);
+    SCAN(ex);
+    SCAN(nr);
+    SCAN(sh);
+    SCAN(hg);
+    SCAN(ht);
+    SCAN(nh);
+#undef SCAN
+  }
+}
+
+// Starts or continues parsing. Returns true on success,
+// false on EOF or on error.
+bool ProcSmapsParser::parse_next(ProcSmapsInfo& out) {
+
+  // Information about a single mapping reaches across several lines.
+  out.reset();
+
+  // Read header line, unless we already read it
+  if (_line[0] == '\0') {
+    if (!read_line()) {
+      return false;
+    }
+  }
+  assert(is_header_line(), "Not a header line: \"%s\".", _line);
+  scan_header_line(out);
+
+  // Now read until we encounter the next header line or EOF or an error.
+  bool ok = false, stop = false;
+  do {
+    ok = read_line();
+    stop = !ok || is_header_line();
+    if (!stop) {
+      scan_additional_line(out);
+    }
+  } while (!stop);
+
+  return ok;
+}
diff --git a/src/hotspot/os/linux/procMapsParser.hpp b/src/hotspot/os/linux/procMapsParser.hpp
new file mode 100644
index 00000000000..0971c4fb084
--- /dev/null
+++ b/src/hotspot/os/linux/procMapsParser.hpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc. and/or its affiliates.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef OS_LINUX_PROCMAPSPARSER_HPP
+#define OS_LINUX_PROCMAPSPARSER_HPP
+
+#include "utilities/globalDefinitions.hpp"
+
+// This header exposes two simple parsers for /proc/pid/maps and
+// /proc/pid/smaps.
+//
+// Usage:
+//
+// FILE* f = fopen(...)
+// ProcSMapsParser parser(f);
+// ProcSMapsInfo info;
+// while (parser.parse_next(info)) { ... }
+
+struct ProcSmapsInfo {
+  void* from;
+  void* to;
+  char prot[20 + 1];
+  char filename[1024 + 1];
+  size_t kernelpagesize;
+  size_t rss;
+  size_t private_hugetlb;
+  size_t shared_hugetlb;
+  size_t anonhugepages;
+  size_t swap;
+  bool rd, wr, ex;
+  bool sh; // shared
+  bool nr; // no reserve
+  bool hg; // thp-advised
+  bool ht; // uses hugetlb pages
+  bool nh; // thp forbidden
+
+  size_t vsize() const {
+    return from < to ? pointer_delta(to, from, 1) : 0;
+  }
+
+  void reset() {
+    from = to = nullptr;
+    prot[0] = filename[0] = '\0';
+    kernelpagesize = rss = private_hugetlb = shared_hugetlb = anonhugepages = swap = 0;
+    rd = wr = ex = sh = nr = hg = ht = nh = false;
+  }
+};
+
+class ProcSmapsParser {
+  FILE* _f;
+  const size_t _linelen;
+  char* _line;
+
+  bool read_line(); // sets had_error in case of error
+  bool is_header_line();
+  void scan_header_line(ProcSmapsInfo& out);
+  void scan_additional_line(ProcSmapsInfo& out);
+
+public:
+
+  ProcSmapsParser(FILE* f);
+  ~ProcSmapsParser();
+
+  // Starts or continues parsing. Returns true on success,
+  // false on EOF or on error.
+  bool parse_next(ProcSmapsInfo& out);
+};
+
+#endif // OS_LINUX_PROCMAPSPARSER_HPP
diff --git a/src/hotspot/os/posix/os_posix.cpp b/src/hotspot/os/posix/os_posix.cpp
index 1e7473eea1d..26bff6c8bd4 100644
--- a/src/hotspot/os/posix/os_posix.cpp
+++ b/src/hotspot/os/posix/os_posix.cpp
@@ -93,6 +93,9 @@
   #define MAP_ANONYMOUS MAP_ANON
 #endif
 
+/* Input/Output types for mincore(2) */
+typedef LINUX_ONLY(unsigned) char mincore_vec_t;
+
 static jlong initial_time_count = 0;
 
 static int clock_tics_per_sec = 100;
@@ -146,6 +149,94 @@ void os::check_dump_limit(char* buffer, size_t bufferSize) {
   VMError::record_coredump_status(buffer, success);
 }
 
+bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) {
+
+#ifdef _AIX
+  committed_start = start;
+  committed_size = size;
+  return true;
+#else
+
+  int mincore_return_value;
+  constexpr size_t stripe = 1024;  // query this many pages each time
+  mincore_vec_t vec [stripe + 1];
+
+  // set a guard
+  DEBUG_ONLY(vec[stripe] = 'X');
+
+  size_t page_sz = os::vm_page_size();
+  uintx pages = size / page_sz;
+
+  assert(is_aligned(start, page_sz), "Start address must be page aligned");
+  assert(is_aligned(size, page_sz), "Size must be page aligned");
+
+  committed_start = nullptr;
+
+  int loops = checked_cast<int>((pages + stripe - 1) / stripe);
+  int committed_pages = 0;
+  address loop_base = start;
+  bool found_range = false;
+
+  for (int index = 0; index < loops && !found_range; index ++) {
+    assert(pages > 0, "Nothing to do");
+    uintx pages_to_query = (pages >= stripe) ? stripe : pages;
+    pages -= pages_to_query;
+
+    // Get stable read
+    int fail_count = 0;
+    while ((mincore_return_value = mincore(loop_base, pages_to_query * page_sz, vec)) == -1 && errno == EAGAIN){
+      if (++fail_count == 1000){
+        return false;
+      }
+    }
+
+    // During shutdown, some memory goes away without properly notifying NMT,
+    // E.g. ConcurrentGCThread/WatcherThread can exit without deleting thread object.
+    // Bailout and return as not committed for now.
+    if (mincore_return_value == -1 && errno == ENOMEM) {
+      return false;
+    }
+
+    // If mincore is not supported.
+    if (mincore_return_value == -1 && errno == ENOSYS) {
+      return false;
+    }
+
+    assert(vec[stripe] == 'X', "overflow guard");
+    assert(mincore_return_value == 0, "Range must be valid");
+    // Process this stripe
+    for (uintx vecIdx = 0; vecIdx < pages_to_query; vecIdx ++) {
+      if ((vec[vecIdx] & 0x01) == 0) { // not committed
+        // End of current contiguous region
+        if (committed_start != nullptr) {
+          found_range = true;
+          break;
+        }
+      } else { // committed
+        // Start of region
+        if (committed_start == nullptr) {
+          committed_start = loop_base + page_sz * vecIdx;
+        }
+        committed_pages ++;
+      }
+    }
+
+    loop_base += pages_to_query * page_sz;
+  }
+
+  if (committed_start != nullptr) {
+    assert(committed_pages > 0, "Must have committed region");
+    assert(committed_pages <= int(size / page_sz), "Can not commit more than it has");
+    assert(committed_start >= start && committed_start < start + size, "Out of range");
+    committed_size = page_sz * committed_pages;
+    return true;
+  } else {
+    assert(committed_pages == 0, "Should not have committed region");
+    return false;
+  }
+#endif
+}
+
 int os::get_native_stack(address* stack, int frames, int toSkip) {
   int frame_idx = 0;
   int num_of_frames;  // number of frames captured
diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp
index 30783c809f9..096b52a60e2 100644
--- a/src/hotspot/os/windows/os_windows.cpp
+++ b/src/hotspot/os/windows/os_windows.cpp
@@ -858,6 +858,19 @@ julong os::physical_memory() {
   return win32::physical_memory();
 }
 
+size_t os::rss() {
+  size_t rss = 0;
+  PROCESS_MEMORY_COUNTERS_EX pmex;
+  ZeroMemory(&pmex, sizeof(PROCESS_MEMORY_COUNTERS_EX));
+  pmex.cb = sizeof(pmex);
+  BOOL ret = GetProcessMemoryInfo(
+      GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS *)&pmex, sizeof(pmex));
+  if (ret) {
+    rss = pmex.WorkingSetSize;
+  }
+  return rss;
+}
+
 bool os::has_allocatable_memory_limit(size_t* limit) {
   MEMORYSTATUSEX ms;
   ms.dwLength = sizeof(ms);
@@ -2744,6 +2757,15 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
     // Verify that OS save/restore AVX registers.
     return Handle_Exception(exceptionInfo, VM_Version::cpuinfo_cont_addr());
   }
+
+#if !defined(PRODUCT) && defined(_LP64)
+  if ((exception_code == EXCEPTION_ACCESS_VIOLATION) &&
+      VM_Version::is_cpuinfo_segv_addr_apx(pc)) {
+    // Verify that OS save/restore APX registers.
+    VM_Version::clear_apx_test_state();
+    return Handle_Exception(exceptionInfo, VM_Version::cpuinfo_cont_addr_apx());
+  }
+#endif
 #endif
 
   if (t != nullptr && t->is_Java_thread()) {
diff --git a/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp b/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp
index 4e7316e0661..437274a2cb1 100644
--- a/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp
+++ b/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp
@@ -416,6 +416,14 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info,
       stub = VM_Version::cpuinfo_cont_addr();
     }
 
+#if !defined(PRODUCT) && defined(_LP64)
+    if ((sig == SIGSEGV || sig == SIGBUS) && VM_Version::is_cpuinfo_segv_addr_apx(pc)) {
+      // Verify that OS save/restore APX registers.
+      stub = VM_Version::cpuinfo_cont_addr_apx();
+      VM_Version::clear_apx_test_state();
+    }
+#endif
+
     // We test if stub is already set (by the stack overflow code
     // above) so it is not overwritten by the code that follows. This
     // check is not required on other platforms, because on other
diff --git a/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp b/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp
index f74ed8c8f81..3f9f26b525b 100644
--- a/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp
+++ b/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp
@@ -131,7 +131,10 @@ void VM_Version::setup_cpu_available_features() {
       if (_feature_list[i]->feature_string()) {
         const char* tmp = _feature_list[i]->pretty();
         if (strlen(tmp) == 1) {
-          strcat(buf, " ");
+          // Feature string is expected to be in multi-character form
+          // like rvc, rvv, etc so that it will be easier to specify
+          // target feature string in tests.
+          strcat(buf, " rv");
           strcat(buf, tmp);
         } else {
           // Feature string is expected to be lower case.
diff --git a/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp b/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp
index 6cdb2a5e3f6..78988dd4fd0 100644
--- a/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp
+++ b/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp
@@ -248,6 +248,14 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info,
       stub = VM_Version::cpuinfo_cont_addr();
     }
 
+#if !defined(PRODUCT) && defined(_LP64)
+    if ((sig == SIGSEGV) && VM_Version::is_cpuinfo_segv_addr_apx(pc)) {
+      // Verify that OS save/restore APX registers.
+      stub = VM_Version::cpuinfo_cont_addr_apx();
+      VM_Version::clear_apx_test_state();
+    }
+#endif
+
     if (thread->thread_state() == _thread_in_Java) {
       // Java thread running in Java code => find exception handler if any
       // a fault inside compiled code, the interpreter, or a stub
diff --git a/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp b/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp
index 78e98609b6b..722c3c8dd60 100644
--- a/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp
+++ b/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2020, Microsoft Corporation. All rights reserved.
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -219,7 +219,7 @@ void os::print_tos_pc(outputStream *st, const void *context) {
   // this at the end, and hope for the best.
   address pc = (address)uc->Pc;
   st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
-  print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
+  print_hex_dump(st, pc - 32, pc + 32, sizeof(char), /* print_ascii=*/false);
   st->cr();
 }
 
diff --git a/src/hotspot/share/adlc/output_c.cpp b/src/hotspot/share/adlc/output_c.cpp
index 77332b21c01..804e8f1a4e6 100644
--- a/src/hotspot/share/adlc/output_c.cpp
+++ b/src/hotspot/share/adlc/output_c.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -1614,11 +1614,6 @@ void ArchDesc::defineExpand(FILE *fp, InstructForm *node) {
         fprintf(fp, "  ((MachIfNode*)n%d)->_fcnt = _fcnt;\n", cnt);
       }
 
-      if (node->is_ideal_fastlock() && new_inst->is_ideal_fastlock()) {
-        fprintf(fp, "  ((MachFastLockNode*)n%d)->_rtm_counters = _rtm_counters;\n", cnt);
-        fprintf(fp, "  ((MachFastLockNode*)n%d)->_stack_rtm_counters = _stack_rtm_counters;\n", cnt);
-      }
-
       // Fill in the bottom_type where requested
       if (node->captures_bottom_type(_globalNames) &&
           new_inst->captures_bottom_type(_globalNames)) {
@@ -4008,10 +4003,6 @@ void ArchDesc::buildMachNode(FILE *fp_cpp, InstructForm *inst, const char *inden
   if (inst->is_ideal_jump()) {
     fprintf(fp_cpp, "%s node->_probs = _leaf->as_Jump()->_probs;\n", indent);
   }
-  if( inst->is_ideal_fastlock() ) {
-    fprintf(fp_cpp, "%s node->_rtm_counters = _leaf->as_FastLock()->rtm_counters();\n", indent);
-    fprintf(fp_cpp, "%s node->_stack_rtm_counters = _leaf->as_FastLock()->stack_rtm_counters();\n", indent);
-  }
 
 }
 
diff --git a/src/hotspot/share/asm/codeBuffer.cpp b/src/hotspot/share/asm/codeBuffer.cpp
index d0c8feda24a..ea47e435c0b 100644
--- a/src/hotspot/share/asm/codeBuffer.cpp
+++ b/src/hotspot/share/asm/codeBuffer.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -928,6 +928,10 @@ void CodeBuffer::expand(CodeSection* which_cs, csize_t amount) {
   // Move all the code and relocations to the new blob:
   relocate_code_to(&cb);
 
+  // some internal addresses, _last_insn _last_label, are used during code emission,
+  // adjust them in expansion
+  adjust_internal_address(insts_begin(), cb.insts_begin());
+
   // Copy the temporary code buffer into the current code buffer.
   // Basically, do {*this = cb}, except for some control information.
   this->take_over_code_from(&cb);
@@ -949,6 +953,15 @@ void CodeBuffer::expand(CodeSection* which_cs, csize_t amount) {
 #endif //PRODUCT
 }
 
+void CodeBuffer::adjust_internal_address(address from, address to) {
+  if (_last_insn != nullptr) {
+    _last_insn += to - from;
+  }
+  if (_last_label != nullptr) {
+    _last_label += to - from;
+  }
+}
+
 void CodeBuffer::take_over_code_from(CodeBuffer* cb) {
   // Must already have disposed of the old blob somehow.
   assert(blob() == nullptr, "must be empty");
diff --git a/src/hotspot/share/asm/codeBuffer.hpp b/src/hotspot/share/asm/codeBuffer.hpp
index 48476bedfe2..343981e1a7b 100644
--- a/src/hotspot/share/asm/codeBuffer.hpp
+++ b/src/hotspot/share/asm/codeBuffer.hpp
@@ -433,6 +433,7 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) {
   Arena*       _overflow_arena;
 
   address      _last_insn;      // used to merge consecutive memory barriers, loads or stores.
+  address      _last_label;     // record last bind label address, it's also the start of current bb.
 
   SharedStubToInterpRequests* _shared_stub_to_interp_requests; // used to collect requests for shared iterpreter stubs
   SharedTrampolineRequests*   _shared_trampoline_requests;     // used to collect requests for shared trampolines
@@ -457,6 +458,7 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) {
     _oop_recorder    = nullptr;
     _overflow_arena  = nullptr;
     _last_insn       = nullptr;
+    _last_label      = nullptr;
     _finalize_stubs  = false;
     _shared_stub_to_interp_requests = nullptr;
     _shared_trampoline_requests = nullptr;
@@ -510,6 +512,9 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) {
   // moves code sections to new buffer (assumes relocs are already in there)
   void relocate_code_to(CodeBuffer* cb) const;
 
+  // adjust some internal address during expand
+  void adjust_internal_address(address from, address to);
+
   // set up a model of the final layout of my contents
   void compute_final_layout(CodeBuffer* dest) const;
 
@@ -679,6 +684,9 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) {
   void set_last_insn(address a) { _last_insn = a; }
   void clear_last_insn() { set_last_insn(nullptr); }
 
+  address last_label() const { return _last_label; }
+  void set_last_label(address a) { _last_label = a; }
+
 #ifndef PRODUCT
   AsmRemarks &asm_remarks() { return _asm_remarks; }
   DbgStrings &dbg_strings() { return _dbg_strings; }
diff --git a/src/hotspot/share/c1/c1_Compiler.cpp b/src/hotspot/share/c1/c1_Compiler.cpp
index 897e2b6470d..e1c4e90d063 100644
--- a/src/hotspot/share/c1/c1_Compiler.cpp
+++ b/src/hotspot/share/c1/c1_Compiler.cpp
@@ -235,7 +235,7 @@ bool Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
   case vmIntrinsics::_counterTime:
 #endif
   case vmIntrinsics::_getObjectSize:
-#if defined(X86) || defined(AARCH64) || defined(S390) || defined(RISCV)
+#if defined(X86) || defined(AARCH64) || defined(S390) || defined(RISCV) || defined(PPC64)
   case vmIntrinsics::_clone:
 #endif
     break;
diff --git a/src/hotspot/share/c1/c1_LIR.cpp b/src/hotspot/share/c1/c1_LIR.cpp
index 6ca5b1bd136..3f53011024b 100644
--- a/src/hotspot/share/c1/c1_LIR.cpp
+++ b/src/hotspot/share/c1/c1_LIR.cpp
@@ -351,7 +351,7 @@ LIR_OpArrayCopy::LIR_OpArrayCopy(LIR_Opr src, LIR_Opr src_pos, LIR_Opr dst, LIR_
   , _tmp(tmp)
   , _expected_type(expected_type)
   , _flags(flags) {
-#if defined(X86) || defined(AARCH64) || defined(S390) || defined(RISCV)
+#if defined(X86) || defined(AARCH64) || defined(S390) || defined(RISCV) || defined(PPC64)
   if (expected_type != nullptr && flags == 0) {
     _stub = nullptr;
   } else {
diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp
index a98fd04ba68..fdbb6605c13 100644
--- a/src/hotspot/share/cds/archiveBuilder.cpp
+++ b/src/hotspot/share/cds/archiveBuilder.cpp
@@ -717,6 +717,14 @@ void ArchiveBuilder::write_pointer_in_buffer(address* ptr_location, address src_
   }
 }
 
+void ArchiveBuilder::mark_and_relocate_to_buffered_addr(address* ptr_location) {
+  assert(*ptr_location != nullptr, "sanity");
+  if (!is_in_mapped_static_archive(*ptr_location)) {
+    *ptr_location = get_buffered_addr(*ptr_location);
+  }
+  ArchivePtrMarker::mark_pointer(ptr_location);
+}
+
 address ArchiveBuilder::get_buffered_addr(address src_addr) const {
   SourceObjInfo* p = _src_obj_table.get(src_addr);
   assert(p != nullptr, "src_addr " INTPTR_FORMAT " is used but has not been archived",
@@ -755,6 +763,16 @@ void ArchiveBuilder::make_klasses_shareable() {
   int num_obj_array_klasses = 0;
   int num_type_array_klasses = 0;
 
+  for (int i = 0; i < klasses()->length(); i++) {
+    // Some of the code in ConstantPool::remove_unshareable_info() requires the classes
+    // to be in linked state, so it must be call here before the next loop, which returns
+    // all classes to unlinked state.
+    Klass* k = get_buffered_addr(klasses()->at(i));
+    if (k->is_instance_klass()) {
+      InstanceKlass::cast(k)->constants()->remove_unshareable_info();
+    }
+  }
+
   for (int i = 0; i < klasses()->length(); i++) {
     const char* type;
     const char* unlinked = "";
@@ -1255,7 +1273,7 @@ class ArchiveBuilder::CDSMapLogger : AllStatic {
         // longs and doubles will be split into two words.
         unitsize = sizeof(narrowOop);
       }
-      os::print_hex_dump(&lsh, base, top, unitsize, 32, requested_base);
+      os::print_hex_dump(&lsh, base, top, unitsize, /* print_ascii=*/true, /* bytes_per_line=*/32, requested_base);
     }
   }
 
@@ -1394,10 +1412,3 @@ void ArchiveBuilder::report_out_of_space(const char* name, size_t needed_bytes)
   log_error(cds)("Unable to allocate from '%s' region: Please reduce the number of shared classes.", name);
   MetaspaceShared::unrecoverable_writing_error();
 }
-
-
-#ifndef PRODUCT
-void ArchiveBuilder::assert_is_vm_thread() {
-  assert(Thread::current()->is_VM_thread(), "ArchiveBuilder should be used only inside the VMThread");
-}
-#endif
diff --git a/src/hotspot/share/cds/archiveBuilder.hpp b/src/hotspot/share/cds/archiveBuilder.hpp
index cbde5a7e02c..c17090ee53d 100644
--- a/src/hotspot/share/cds/archiveBuilder.hpp
+++ b/src/hotspot/share/cds/archiveBuilder.hpp
@@ -343,8 +343,6 @@ class ArchiveBuilder : public StackObj {
     return to_offset_u4(offset);
   }
 
-  static void assert_is_vm_thread() PRODUCT_RETURN;
-
 public:
   ArchiveBuilder();
   ~ArchiveBuilder();
@@ -408,6 +406,11 @@ class ArchiveBuilder : public StackObj {
     write_pointer_in_buffer((address*)ptr_location, (address)src_addr);
   }
 
+  void mark_and_relocate_to_buffered_addr(address* ptr_location);
+  template <typename T> void mark_and_relocate_to_buffered_addr(T ptr_location) {
+    mark_and_relocate_to_buffered_addr((address*)ptr_location);
+  }
+
   address get_buffered_addr(address src_addr) const;
   template <typename T> T get_buffered_addr(T src_addr) const {
     return (T)get_buffered_addr((address)src_addr);
@@ -427,7 +430,6 @@ class ArchiveBuilder : public StackObj {
   }
 
   static ArchiveBuilder* current() {
-    assert_is_vm_thread();
     assert(_current != nullptr, "ArchiveBuilder must be active");
     return _current;
   }
diff --git a/src/hotspot/share/cds/archiveHeapLoader.cpp b/src/hotspot/share/cds/archiveHeapLoader.cpp
index 2ef502a3643..feaf245d22c 100644
--- a/src/hotspot/share/cds/archiveHeapLoader.cpp
+++ b/src/hotspot/share/cds/archiveHeapLoader.cpp
@@ -34,6 +34,7 @@
 #include "memory/iterator.inline.hpp"
 #include "memory/resourceArea.hpp"
 #include "memory/universe.hpp"
+#include "sanitizers/ub.hpp"
 #include "utilities/bitMap.inline.hpp"
 #include "utilities/copy.hpp"
 
@@ -61,6 +62,7 @@ ptrdiff_t ArchiveHeapLoader::_mapped_heap_delta = 0;
 
 // Every mapped region is offset by _mapped_heap_delta from its requested address.
 // See FileMapInfo::heap_region_requested_address().
+ATTRIBUTE_NO_UBSAN
 void ArchiveHeapLoader::init_mapped_heap_info(address mapped_heap_bottom, ptrdiff_t delta, int dumptime_oop_shift) {
   assert(!_mapped_heap_relocation_initialized, "only once");
   if (!UseCompressedOops) {
diff --git a/src/hotspot/share/cds/archiveUtils.cpp b/src/hotspot/share/cds/archiveUtils.cpp
index 8fd20e20267..76cfa441fa7 100644
--- a/src/hotspot/share/cds/archiveUtils.cpp
+++ b/src/hotspot/share/cds/archiveUtils.cpp
@@ -357,7 +357,7 @@ void ArchiveUtils::log_to_classlist(BootstrapInfo* bootstrap_specifier, TRAPS) {
         ResourceMark rm(THREAD);
         int pool_index = bootstrap_specifier->bss_index();
         ClassListWriter w;
-        w.stream()->print("%s %s", LAMBDA_PROXY_TAG, pool->pool_holder()->name()->as_C_string());
+        w.stream()->print("%s %s", ClassListParser::lambda_proxy_tag(), pool->pool_holder()->name()->as_C_string());
         CDSIndyInfo cii;
         ClassListParser::populate_cds_indy_info(pool, pool_index, &cii, CHECK);
         GrowableArray<const char*>* indy_items = cii.items();
diff --git a/src/hotspot/share/cds/cdsEnumKlass.cpp b/src/hotspot/share/cds/cdsEnumKlass.cpp
new file mode 100644
index 00000000000..b77f2fd9d16
--- /dev/null
+++ b/src/hotspot/share/cds/cdsEnumKlass.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2023, 2024, 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "cds/archiveHeapLoader.hpp"
+#include "cds/cdsEnumKlass.hpp"
+#include "cds/heapShared.hpp"
+#include "classfile/vmClasses.hpp"
+#include "classfile/systemDictionaryShared.hpp"
+#include "memory/resourceArea.hpp"
+#include "oops/fieldStreams.inline.hpp"
+#include "oops/oop.inline.hpp"
+#include "runtime/fieldDescriptor.inline.hpp"
+
+#if INCLUDE_CDS_JAVA_HEAP
+
+bool CDSEnumKlass::is_enum_obj(oop orig_obj) {
+  Klass* k = orig_obj->klass();
+  Klass* buffered_k = ArchiveBuilder::get_buffered_klass(k);
+  return k->is_instance_klass() &&
+         InstanceKlass::cast(k)->java_super() == vmClasses::Enum_klass();
+}
+
+// -- Handling of Enum objects
+// Java Enum classes have synthetic <clinit> methods that look like this
+//     enum MyEnum {FOO, BAR}
+//     MyEnum::<clinint> {
+//        /*static final MyEnum*/ MyEnum::FOO = new MyEnum("FOO");
+//        /*static final MyEnum*/ MyEnum::BAR = new MyEnum("BAR");
+//     }
+//
+// If MyEnum::FOO object is referenced by any of the archived subgraphs, we must
+// ensure the archived value equals (in object address) to the runtime value of
+// MyEnum::FOO.
+//
+// However, since MyEnum::<clinint> is synthetically generated by javac, there's
+// no way of programmatically handling this inside the Java code (as you would handle
+// ModuleLayer::EMPTY_LAYER, for example).
+//
+// Instead, we archive all static field of such Enum classes. At runtime,
+// HeapShared::initialize_enum_klass() skips the <clinit> method and instead pulls
+// the static fields out of the archived heap.
+void CDSEnumKlass::handle_enum_obj(int level,
+                                   KlassSubGraphInfo* subgraph_info,
+                                   oop orig_obj) {
+  assert(level > 1, "must never be called at the first (outermost) level");
+  assert(is_enum_obj(orig_obj), "must be");
+
+  InstanceKlass* ik = InstanceKlass::cast(orig_obj->klass());
+  if (ik->has_archived_enum_objs()) {
+    return;
+  }
+
+  ik->set_has_archived_enum_objs();
+  ArchiveBuilder::get_buffered_klass(ik)->set_has_archived_enum_objs();
+
+  oop mirror = ik->java_mirror();
+  for (JavaFieldStream fs(ik); !fs.done(); fs.next()) {
+    if (fs.access_flags().is_static()) {
+      archive_static_field(level, subgraph_info, ik, mirror, fs);
+    }
+  }
+}
+
+void CDSEnumKlass::archive_static_field(int level, KlassSubGraphInfo* subgraph_info,
+                                        InstanceKlass* ik, oop mirror, JavaFieldStream& fs) {
+  ResourceMark rm;
+  fieldDescriptor& fd = fs.field_descriptor();
+  if (fd.field_type() != T_OBJECT && fd.field_type() != T_ARRAY) {
+    guarantee(false, "static field %s::%s must be T_OBJECT or T_ARRAY",
+              ik->external_name(), fd.name()->as_C_string());
+  }
+  oop oop_field = mirror->obj_field(fd.offset());
+  if (oop_field == nullptr) {
+    guarantee(false, "static field %s::%s must not be null",
+              ik->external_name(), fd.name()->as_C_string());
+  } else if (oop_field->klass() != ik && oop_field->klass() != ik->array_klass_or_null()) {
+    guarantee(false, "static field %s::%s is of the wrong type",
+              ik->external_name(), fd.name()->as_C_string());
+  }
+  bool success = HeapShared::archive_reachable_objects_from(level, subgraph_info, oop_field);
+  assert(success, "VM should have exited with unarchivable objects for _level > 1");
+  int root_index = HeapShared::append_root(oop_field);
+  log_info(cds, heap)("Archived enum obj @%d %s::%s (" INTPTR_FORMAT ")",
+                      root_index, ik->external_name(), fd.name()->as_C_string(),
+                      p2i((oopDesc*)oop_field));
+  SystemDictionaryShared::add_enum_klass_static_field(ik, root_index);
+}
+
+bool CDSEnumKlass::initialize_enum_klass(InstanceKlass* k, TRAPS) {
+  if (!ArchiveHeapLoader::is_in_use()) {
+    return false;
+  }
+
+  RunTimeClassInfo* info = RunTimeClassInfo::get_for(k);
+  assert(info != nullptr, "sanity");
+
+  if (log_is_enabled(Info, cds, heap)) {
+    ResourceMark rm;
+    log_info(cds, heap)("Initializing Enum class: %s", k->external_name());
+  }
+
+  oop mirror = k->java_mirror();
+  int i = 0;
+  for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
+    if (fs.access_flags().is_static()) {
+      int root_index = info->enum_klass_static_field_root_index_at(i++);
+      fieldDescriptor& fd = fs.field_descriptor();
+      assert(fd.field_type() == T_OBJECT || fd.field_type() == T_ARRAY, "must be");
+      mirror->obj_field_put(fd.offset(), HeapShared::get_root(root_index, /*clear=*/true));
+    }
+  }
+  return true;
+}
+#endif // INCLUDE_CDS_JAVA_HEAP
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageOutput.java b/src/hotspot/share/cds/cdsEnumKlass.hpp
similarity index 53%
rename from test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageOutput.java
rename to src/hotspot/share/cds/cdsEnumKlass.hpp
index 473ccc071f9..c898bfec60d 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageOutput.java
+++ b/src/hotspot/share/cds/cdsEnumKlass.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -19,38 +19,32 @@
  * 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 vm.share.process;
-
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.IOException;
-import nsk.share.TestFailure;
-
-public class StreamMessageOutput implements MessageOutput {
-        private OutputStream out;
-        private PrintStream pout;
 
-        public StreamMessageOutput() {
-        }
+#ifndef SHARE_CDS_CDSENUMKLASS_HPP
+#define SHARE_CDS_CDSENUMKLASS_HPP
 
-        public StreamMessageOutput(OutputStream out) {
-                bind(out);
-        }
+#include "memory/allStatic.hpp"
+#include "oops/oop.hpp"
+#include "utilities/exceptions.hpp"
+#include "utilities/macros.hpp"
 
-        public void bind(OutputStream out) {
-                this.out = out;
-                this.pout = new PrintStream(out, true); // Autoflush is important
-        }
+class InstanceKlass;
+class JavaFieldStream;
+class KlassSubGraphInfo;
 
-        public void start() {
-        }
+class CDSEnumKlass: AllStatic {
+public:
+  static bool is_enum_obj(oop orig_obj);
+  static void handle_enum_obj(int level,
+                              KlassSubGraphInfo* subgraph_info,
+                              oop orig_obj);
+  static bool initialize_enum_klass(InstanceKlass* k, TRAPS) NOT_CDS_JAVA_HEAP_RETURN_(false);
 
-        public void send(String msg) {
-                pout.println(msg);
-        }
+private:
+  static void archive_static_field(int level, KlassSubGraphInfo* subgraph_info,
+                                   InstanceKlass* ik, oop mirror, JavaFieldStream& fs);
+};
 
-        public void finish() {
-                pout.close();
-        }
-}
+#endif // SHARE_CDS_CDSENUMKLASS_HPP
diff --git a/src/hotspot/share/cds/classListParser.cpp b/src/hotspot/share/cds/classListParser.cpp
index 4455dd7db1b..b2695ac2e78 100644
--- a/src/hotspot/share/cds/classListParser.cpp
+++ b/src/hotspot/share/cds/classListParser.cpp
@@ -25,6 +25,7 @@
 #include "precompiled.hpp"
 #include "cds/archiveUtils.hpp"
 #include "cds/classListParser.hpp"
+#include "cds/classPrelinker.hpp"
 #include "cds/lambdaFormInvokers.hpp"
 #include "cds/metaspaceShared.hpp"
 #include "cds/unregisteredClasses.hpp"
@@ -52,6 +53,10 @@
 #include "utilities/macros.hpp"
 #include "utilities/utf8.hpp"
 
+const char* ClassListParser::CONSTANT_POOL_TAG = "@cp";
+const char* ClassListParser::LAMBDA_FORM_TAG = "@lambda-form-invoker";
+const char* ClassListParser::LAMBDA_PROXY_TAG = "@lambda-proxy";
+
 volatile Thread* ClassListParser::_parsing_thread = nullptr;
 ClassListParser* ClassListParser::_instance = nullptr;
 
@@ -299,6 +304,9 @@ void ClassListParser::parse_at_tags(TRAPS) {
     }
   } else if (strcmp(_token, LAMBDA_FORM_TAG) == 0) {
     LambdaFormInvokers::append(os::strdup((const char*)(_line + offset), mtInternal));
+  } else if (strcmp(_token, CONSTANT_POOL_TAG) == 0) {
+    _token = _line + offset;
+    parse_constant_pool_tag();
   } else {
     error("Invalid @ tag at the beginning of line \"%s\" line #%zu", _token, lineno());
   }
@@ -395,9 +403,14 @@ void ClassListParser::print_actual_interfaces(InstanceKlass* ik) {
   jio_fprintf(defaultStream::error_stream(), "}\n");
 }
 
-void ClassListParser::error(const char* msg, ...) {
+void ClassListParser::print_diagnostic_info(outputStream* st, const char* msg, ...) {
   va_list ap;
   va_start(ap, msg);
+  print_diagnostic_info(st, msg, ap);
+  va_end(ap);
+}
+
+void ClassListParser::print_diagnostic_info(outputStream* st, const char* msg, va_list ap) {
   int error_index = pointer_delta_as_int(_token, _line);
   if (error_index >= _line_len) {
     error_index = _line_len - 1;
@@ -412,25 +425,34 @@ void ClassListParser::error(const char* msg, ...) {
   jio_vfprintf(defaultStream::error_stream(), msg, ap);
 
   if (_line_len <= 0) {
-    jio_fprintf(defaultStream::error_stream(), "\n");
+    st->print("\n");
   } else {
-    jio_fprintf(defaultStream::error_stream(), ":\n");
+    st->print(":\n");
     for (int i=0; i<_line_len; i++) {
       char c = _line[i];
       if (c == '\0') {
-        jio_fprintf(defaultStream::error_stream(), "%s", " ");
+        st->print("%s", " ");
       } else {
-        jio_fprintf(defaultStream::error_stream(), "%c", c);
+        st->print("%c", c);
       }
     }
-    jio_fprintf(defaultStream::error_stream(), "\n");
+    st->print("\n");
     for (int i=0; i<error_index; i++) {
-      jio_fprintf(defaultStream::error_stream(), "%s", " ");
+      st->print("%s", " ");
     }
-    jio_fprintf(defaultStream::error_stream(), "^\n");
+    st->print("^\n");
   }
-  va_end(ap);
+}
 
+void ClassListParser::error(const char* msg, ...) {
+  va_list ap;
+  va_start(ap, msg);
+  fileStream fs(defaultStream::error_stream());
+  //TODO: we should write to UL/error instead, but that requires fixing some tests cases.
+  //LogTarget(Error, cds) lt;
+  //LogStream ls(lt);
+  print_diagnostic_info(&fs, msg, ap);
+  va_end(ap);
   vm_exit_during_initialization("class list format error.", nullptr);
 }
 
@@ -453,6 +475,16 @@ void ClassListParser::check_class_name(const char* class_name) {
   }
 }
 
+void ClassListParser::constant_pool_resolution_warning(const char* msg, ...) {
+  va_list ap;
+  va_start(ap, msg);
+  LogTarget(Warning, cds, resolve) lt;
+  LogStream ls(lt);
+  print_diagnostic_info(&ls, msg, ap);
+  ls.print("Your classlist may be out of sync with the JDK or the application.");
+  va_end(ap);
+}
+
 // This function is used for loading classes for customized class loaders
 // during archive dumping.
 InstanceKlass* ClassListParser::load_class_from_source(Symbol* class_name, TRAPS) {
@@ -727,3 +759,94 @@ InstanceKlass* ClassListParser::lookup_interface_for_current_class(Symbol* inter
   ShouldNotReachHere();
   return nullptr;
 }
+
+InstanceKlass* ClassListParser::find_builtin_class_helper(JavaThread* current, Symbol* class_name_symbol, oop class_loader_oop) {
+  Handle class_loader(current, class_loader_oop);
+  Handle protection_domain;
+  return SystemDictionary::find_instance_klass(current, class_name_symbol, class_loader, protection_domain);
+}
+
+InstanceKlass* ClassListParser::find_builtin_class(JavaThread* current, const char* class_name) {
+  TempNewSymbol class_name_symbol = SymbolTable::new_symbol(class_name);
+  InstanceKlass* ik;
+
+  if ( (ik = find_builtin_class_helper(current, class_name_symbol, nullptr)) != nullptr
+    || (ik = find_builtin_class_helper(current, class_name_symbol, SystemDictionary::java_platform_loader())) != nullptr
+    || (ik = find_builtin_class_helper(current, class_name_symbol, SystemDictionary::java_system_loader())) != nullptr) {
+    return ik;
+  } else {
+    return nullptr;
+  }
+}
+
+void ClassListParser::parse_constant_pool_tag() {
+  if (parse_lambda_forms_invokers_only()) {
+    return;
+  }
+
+  JavaThread* THREAD = JavaThread::current();
+  skip_whitespaces();
+  char* class_name = _token;
+  skip_non_whitespaces();
+  *_token = '\0';
+  _token ++;
+
+  InstanceKlass* ik = find_builtin_class(THREAD, class_name);
+  if (ik == nullptr) {
+    _token = class_name;
+    if (strstr(class_name, "/$Proxy") != nullptr ||
+        strstr(class_name, "MethodHandle$Species_") != nullptr) {
+      // ignore -- TODO: we should filter these out in classListWriter.cpp
+    } else {
+      constant_pool_resolution_warning("class %s is not (yet) loaded by one of the built-in loaders", class_name);
+    }
+    return;
+  }
+
+  ResourceMark rm(THREAD);
+  constantPoolHandle cp(THREAD, ik->constants());
+  GrowableArray<bool> preresolve_list(cp->length(), cp->length(), false);
+  bool preresolve_class = false;
+  bool preresolve_fmi = false;
+  bool preresolve_indy = false;
+
+  while (*_token) {
+    int cp_index;
+    skip_whitespaces();
+    parse_uint(&cp_index);
+    if (cp_index < 1 || cp_index >= cp->length()) {
+      constant_pool_resolution_warning("Invalid constant pool index %d", cp_index);
+      return;
+    } else {
+      preresolve_list.at_put(cp_index, true);
+    }
+    constantTag cp_tag = cp->tag_at(cp_index);
+    switch (cp_tag.value()) {
+    case JVM_CONSTANT_UnresolvedClass:
+      preresolve_class = true;
+      break;
+    case JVM_CONSTANT_UnresolvedClassInError:
+    case JVM_CONSTANT_Class:
+      // ignore
+      break;
+    case JVM_CONSTANT_Fieldref:
+    case JVM_CONSTANT_Methodref:
+    case JVM_CONSTANT_InterfaceMethodref:
+      preresolve_fmi = true;
+      break;
+      break;
+    default:
+      constant_pool_resolution_warning("Unsupported constant pool index %d: %s (type=%d)",
+                                       cp_index, cp_tag.internal_name(), cp_tag.value());
+      return;
+    }
+  }
+
+  if (preresolve_class) {
+    ClassPrelinker::preresolve_class_cp_entries(THREAD, ik, &preresolve_list);
+  }
+  if (preresolve_fmi) {
+    ClassPrelinker::preresolve_field_and_method_cp_entries(THREAD, ik, &preresolve_list);
+  }
+}
+
diff --git a/src/hotspot/share/cds/classListParser.hpp b/src/hotspot/share/cds/classListParser.hpp
index 50ede4f6dff..540e61335d0 100644
--- a/src/hotspot/share/cds/classListParser.hpp
+++ b/src/hotspot/share/cds/classListParser.hpp
@@ -31,9 +31,6 @@
 #include "utilities/istream.hpp"
 #include "utilities/resizeableResourceHash.hpp"
 
-#define LAMBDA_PROXY_TAG "@lambda-proxy"
-#define LAMBDA_FORM_TAG  "@lambda-form-invoker"
-
 class constantPoolHandle;
 class Thread;
 
@@ -68,6 +65,10 @@ class CDSIndyInfo {
 };
 
 class ClassListParser : public StackObj {
+  static const char* CONSTANT_POOL_TAG;
+  static const char* LAMBDA_FORM_TAG;
+  static const char* LAMBDA_PROXY_TAG;
+
 public:
   enum ParseMode {
     _parse_all,
@@ -117,17 +118,25 @@ class ClassListParser : public StackObj {
   void print_actual_interfaces(InstanceKlass *ik);
   bool is_matching_cp_entry(const constantPoolHandle &pool, int cp_index, TRAPS);
 
+  InstanceKlass* find_builtin_class_helper(JavaThread* current, Symbol* class_name_symbol, oop class_loader_oop);
+  InstanceKlass* find_builtin_class(JavaThread* current, const char* class_name);
+
   void resolve_indy(JavaThread* current, Symbol* class_name_symbol);
   void resolve_indy_impl(Symbol* class_name_symbol, TRAPS);
   void clean_up_input_line();
   void read_class_name_and_attributes();
   void parse_class_name_and_attributes(TRAPS);
   Klass* load_current_class(Symbol* class_name_symbol, TRAPS);
+  void parse_constant_pool_tag();
 
   size_t lineno() { return _input_stream.lineno(); }
   FILE* do_open(const char* file);
   ClassListParser(const char* file, ParseMode _parse_mode);
   ~ClassListParser();
+  void print_diagnostic_info(outputStream* st, const char* msg, va_list ap) ATTRIBUTE_PRINTF(3, 0);
+  void print_diagnostic_info(outputStream* st, const char* msg, ...) ATTRIBUTE_PRINTF(3, 0);
+  void constant_pool_resolution_warning(const char* msg, ...) ATTRIBUTE_PRINTF(2, 0);
+  void error(const char* msg, ...) ATTRIBUTE_PRINTF(2, 0);
 
 public:
   static void parse_classlist(const char* classlist_path, ParseMode parse_mode, TRAPS) {
@@ -141,13 +150,18 @@ class ClassListParser : public StackObj {
     assert(_instance != nullptr, "must be");
     return _instance;
   }
+  static const char* lambda_proxy_tag() {
+    return LAMBDA_PROXY_TAG;
+  }
+  static const char* lambda_form_tag() {
+    return LAMBDA_FORM_TAG;
+  }
 
   void parse(TRAPS);
   void split_tokens_by_whitespace(int offset, GrowableArray<const char*>* items);
   int split_at_tag_from_line();
   void parse_at_tags(TRAPS);
   char* _token;
-  void error(const char* msg, ...);
   void parse_int(int* value);
   void parse_uint(int* value);
   bool try_parse_uint(int* value);
diff --git a/src/hotspot/share/cds/classListWriter.cpp b/src/hotspot/share/cds/classListWriter.cpp
index 2a65ee51d6e..78cd092445b 100644
--- a/src/hotspot/share/cds/classListWriter.cpp
+++ b/src/hotspot/share/cds/classListWriter.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, 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,12 +25,15 @@
 #include "precompiled.hpp"
 #include "cds/cds_globals.hpp"
 #include "cds/classListWriter.hpp"
+#include "cds/lambdaFormInvokers.inline.hpp"
 #include "classfile/classFileStream.hpp"
 #include "classfile/classLoader.hpp"
 #include "classfile/classLoaderData.hpp"
+#include "classfile/classLoaderDataGraph.hpp"
 #include "classfile/moduleEntry.hpp"
 #include "classfile/systemDictionaryShared.hpp"
 #include "memory/resourceArea.hpp"
+#include "oops/constantPool.inline.hpp"
 #include "oops/instanceKlass.hpp"
 #include "runtime/mutexLocker.hpp"
 
@@ -189,3 +192,107 @@ void ClassListWriter::delete_classlist() {
     delete _classlist_file;
   }
 }
+
+class ClassListWriter::WriteResolveConstantsCLDClosure : public CLDClosure {
+public:
+  void do_cld(ClassLoaderData* cld) {
+    for (Klass* klass = cld->klasses(); klass != nullptr; klass = klass->next_link()) {
+      if (klass->is_instance_klass()) {
+        InstanceKlass* ik = InstanceKlass::cast(klass);
+        write_resolved_constants_for(ik);
+      }
+    }
+  }
+};
+
+void ClassListWriter::write_resolved_constants() {
+  if (!is_enabled()) {
+    return;
+  }
+  MutexLocker lock(ClassLoaderDataGraph_lock);
+  MutexLocker lock2(ClassListFile_lock, Mutex::_no_safepoint_check_flag);
+
+  WriteResolveConstantsCLDClosure closure;
+  ClassLoaderDataGraph::loaded_cld_do(&closure);
+}
+
+void ClassListWriter::write_resolved_constants_for(InstanceKlass* ik) {
+  if (!SystemDictionaryShared::is_builtin_loader(ik->class_loader_data()) ||
+      ik->is_hidden()) {
+    return;
+  }
+  if (LambdaFormInvokers::may_be_regenerated_class(ik->name())) {
+    return;
+  }
+  if (ik->name()->equals("jdk/internal/module/SystemModules$all")) {
+    // This class is regenerated during JDK build process, so the classlist
+    // may not match the version that's in the real jdk image.
+    return;
+  }
+
+  if (!has_id(ik)) { // do not resolve CP for classes loaded by custom loaders.
+    return;
+  }
+
+  ResourceMark rm;
+  ConstantPool* cp = ik->constants();
+  GrowableArray<bool> list(cp->length(), cp->length(), false);
+  bool print = false;
+
+  for (int cp_index = 1; cp_index < cp->length(); cp_index++) { // Index 0 is unused
+    switch (cp->tag_at(cp_index).value()) {
+    case JVM_CONSTANT_Class:
+      {
+        Klass* k = cp->resolved_klass_at(cp_index);
+        if (k->is_instance_klass()) {
+          list.at_put(cp_index, true);
+          print = true;
+        }
+      }
+      break;
+    }
+  }
+
+  if (cp->cache() != nullptr) {
+    Array<ResolvedFieldEntry>* field_entries = cp->cache()->resolved_field_entries();
+    if (field_entries != nullptr) {
+      for (int i = 0; i < field_entries->length(); i++) {
+        ResolvedFieldEntry* rfe = field_entries->adr_at(i);
+        if (rfe->is_resolved(Bytecodes::_getfield) ||
+            rfe->is_resolved(Bytecodes::_putfield)) {
+          list.at_put(rfe->constant_pool_index(), true);
+          print = true;
+        }
+      }
+    }
+
+    Array<ResolvedMethodEntry>* method_entries = cp->cache()->resolved_method_entries();
+    if (method_entries != nullptr) {
+      for (int i = 0; i < method_entries->length(); i++) {
+        ResolvedMethodEntry* rme = method_entries->adr_at(i);
+        if (rme->is_resolved(Bytecodes::_invokevirtual) ||
+            rme->is_resolved(Bytecodes::_invokespecial) ||
+            rme->is_resolved(Bytecodes::_invokeinterface)) {
+          list.at_put(rme->constant_pool_index(), true);
+          print = true;
+        }
+      }
+    }
+  }
+
+  if (print) {
+    outputStream* stream = _classlist_file;
+    stream->print("@cp %s", ik->name()->as_C_string());
+    for (int i = 0; i < list.length(); i++) {
+      if (list.at(i)) {
+        constantTag cp_tag = cp->tag_at(i).value();
+        assert(cp_tag.value() == JVM_CONSTANT_Class ||
+               cp_tag.value() == JVM_CONSTANT_Fieldref ||
+               cp_tag.value() == JVM_CONSTANT_Methodref||
+               cp_tag.value() == JVM_CONSTANT_InterfaceMethodref, "sanity");
+        stream->print(" %d", i);
+      }
+    }
+    stream->cr();
+  }
+}
diff --git a/src/hotspot/share/cds/classListWriter.hpp b/src/hotspot/share/cds/classListWriter.hpp
index a6c749fea7c..250e7ddf94b 100644
--- a/src/hotspot/share/cds/classListWriter.hpp
+++ b/src/hotspot/share/cds/classListWriter.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,6 +34,8 @@ class ClassFileStream;
 class ClassListWriter {
 #if INCLUDE_CDS
   class IDTable;
+  class WriteResolveConstantsCLDClosure;
+
   static fileStream* _classlist_file;
   static IDTable* _id_table;
   static int _total_ids;
@@ -42,6 +44,7 @@ class ClassListWriter {
   static int get_id(const InstanceKlass* k);
   static bool has_id(const InstanceKlass* k);
   static void assert_locked() { assert_lock_strong(ClassListFile_lock); }
+  static void write_resolved_constants_for(InstanceKlass* klass);
 public:
   ClassListWriter() : _locker(Thread::current(), ClassListFile_lock, Mutex::_no_safepoint_check_flag) {}
 
@@ -66,6 +69,7 @@ class ClassListWriter {
   static void init() NOT_CDS_RETURN;
   static void write(const InstanceKlass* k, const ClassFileStream* cfs) NOT_CDS_RETURN;
   static void write_to_stream(const InstanceKlass* k, outputStream* stream, const ClassFileStream* cfs = nullptr) NOT_CDS_RETURN;
+  static void write_resolved_constants() NOT_CDS_RETURN;
   static void delete_classlist() NOT_CDS_RETURN;
 };
 
diff --git a/src/hotspot/share/cds/classPrelinker.cpp b/src/hotspot/share/cds/classPrelinker.cpp
index 21946ebe9c0..6b866bac995 100644
--- a/src/hotspot/share/cds/classPrelinker.cpp
+++ b/src/hotspot/share/cds/classPrelinker.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,8 +26,12 @@
 #include "cds/archiveBuilder.hpp"
 #include "cds/cdsConfig.hpp"
 #include "cds/classPrelinker.hpp"
+#include "cds/regeneratedClasses.hpp"
 #include "classfile/systemDictionary.hpp"
+#include "classfile/systemDictionaryShared.hpp"
 #include "classfile/vmClasses.hpp"
+#include "interpreter/bytecodeStream.hpp"
+#include "interpreter/interpreterRuntime.hpp"
 #include "memory/resourceArea.hpp"
 #include "oops/constantPool.inline.hpp"
 #include "oops/instanceKlass.hpp"
@@ -73,33 +77,54 @@ void ClassPrelinker::dispose() {
   _processed_classes = nullptr;
 }
 
-bool ClassPrelinker::can_archive_resolved_klass(ConstantPool* cp, int cp_index) {
+// Returns true if we CAN PROVE that cp_index will always resolve to
+// the same information at both dump time and run time. This is a
+// necessary (but not sufficient) condition for pre-resolving cp_index
+// during CDS archive assembly.
+bool ClassPrelinker::is_resolution_deterministic(ConstantPool* cp, int cp_index) {
   assert(!is_in_archivebuilder_buffer(cp), "sanity");
-  assert(cp->tag_at(cp_index).is_klass(), "must be resolved");
 
-  Klass* resolved_klass = cp->resolved_klass_at(cp_index);
-  assert(resolved_klass != nullptr, "must be");
+  if (cp->tag_at(cp_index).is_klass()) {
+    // We require cp_index to be already resolved. This is fine for now, are we
+    // currently archive only CP entries that are already resolved.
+    Klass* resolved_klass = cp->resolved_klass_at(cp_index);
+    return resolved_klass != nullptr && is_class_resolution_deterministic(cp->pool_holder(), resolved_klass);
+  } else if (cp->tag_at(cp_index).is_field() ||
+             cp->tag_at(cp_index).is_method() ||
+             cp->tag_at(cp_index).is_interface_method()) {
+    int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index);
+    if (!cp->tag_at(klass_cp_index).is_klass()) {
+      // Not yet resolved
+      return false;
+    }
+    Klass* k = cp->resolved_klass_at(klass_cp_index);
+    if (!is_class_resolution_deterministic(cp->pool_holder(), k)) {
+      return false;
+    }
 
-  return can_archive_resolved_klass(cp->pool_holder(), resolved_klass);
+    if (!k->is_instance_klass()) {
+      // TODO: support non instance klasses as well.
+      return false;
+    }
+
+    // Here, We don't check if this entry can actually be resolved to a valid Field/Method.
+    // This method should be called by the ConstantPool to check Fields/Methods that
+    // have already been successfully resolved.
+    return true;
+  } else {
+    return false;
+  }
 }
 
-bool ClassPrelinker::can_archive_resolved_klass(InstanceKlass* cp_holder, Klass* resolved_klass) {
+bool ClassPrelinker::is_class_resolution_deterministic(InstanceKlass* cp_holder, Klass* resolved_class) {
   assert(!is_in_archivebuilder_buffer(cp_holder), "sanity");
-  assert(!is_in_archivebuilder_buffer(resolved_klass), "sanity");
-
-  if (resolved_klass->is_instance_klass()) {
-    InstanceKlass* ik = InstanceKlass::cast(resolved_klass);
-    if (is_vm_class(ik)) { // These are safe to resolve. See is_vm_class declaration.
-      assert(ik->is_shared_boot_class(), "vmClasses must be loaded by boot loader");
-      if (cp_holder->is_shared_boot_class()) {
-        // For now, do this for boot loader only. Other loaders
-        // must go through ConstantPool::klass_at_impl at runtime
-        // to put this class in their directory.
-
-        // TODO: we can support the platform and app loaders as well, if we
-        // preload the vmClasses into these two loaders during VM bootstrap.
-        return true;
-      }
+  assert(!is_in_archivebuilder_buffer(resolved_class), "sanity");
+
+  if (resolved_class->is_instance_klass()) {
+    InstanceKlass* ik = InstanceKlass::cast(resolved_class);
+
+    if (!ik->is_shared() && SystemDictionaryShared::is_excluded_class(ik)) {
+      return false;
     }
 
     if (cp_holder->is_subtype_of(ik)) {
@@ -108,20 +133,34 @@ bool ClassPrelinker::can_archive_resolved_klass(InstanceKlass* cp_holder, Klass*
       return true;
     }
 
-    // TODO -- allow objArray classes, too
+    if (is_vm_class(ik)) {
+      if (ik->class_loader() != cp_holder->class_loader()) {
+        // At runtime, cp_holder() may not be able to resolve to the same
+        // ik. For example, a different version of ik may be defined in
+        // cp->pool_holder()'s loader using MethodHandles.Lookup.defineClass().
+        return false;
+      } else {
+        return true;
+      }
+    }
+  } else if (resolved_class->is_objArray_klass()) {
+    Klass* elem = ObjArrayKlass::cast(resolved_class)->bottom_klass();
+    if (elem->is_instance_klass()) {
+      return is_class_resolution_deterministic(cp_holder, InstanceKlass::cast(elem));
+    } else if (elem->is_typeArray_klass()) {
+      return true;
+    }
+  } else if (resolved_class->is_typeArray_klass()) {
+    return true;
   }
 
   return false;
 }
 
 void ClassPrelinker::dumptime_resolve_constants(InstanceKlass* ik, TRAPS) {
-  constantPoolHandle cp(THREAD, ik->constants());
-  if (cp->cache() == nullptr || cp->reference_map() == nullptr) {
-    // The cache may be null if the pool_holder klass fails verification
-    // at dump time due to missing dependencies.
+  if (!ik->is_linked()) {
     return;
   }
-
   bool first_time;
   _processed_classes->put_if_absent(ik, &first_time);
   if (!first_time) {
@@ -129,12 +168,9 @@ void ClassPrelinker::dumptime_resolve_constants(InstanceKlass* ik, TRAPS) {
     return;
   }
 
+  constantPoolHandle cp(THREAD, ik->constants());
   for (int cp_index = 1; cp_index < cp->length(); cp_index++) { // Index 0 is unused
     switch (cp->tag_at(cp_index).value()) {
-    case JVM_CONSTANT_UnresolvedClass:
-      maybe_resolve_class(cp, cp_index, CHECK);
-      break;
-
     case JVM_CONSTANT_String:
       resolve_string(cp, cp_index, CHECK); // may throw OOM when interning strings.
       break;
@@ -142,43 +178,33 @@ void ClassPrelinker::dumptime_resolve_constants(InstanceKlass* ik, TRAPS) {
   }
 }
 
-Klass* ClassPrelinker::find_loaded_class(JavaThread* THREAD, oop class_loader, Symbol* name) {
-  HandleMark hm(THREAD);
-  Handle h_loader(THREAD, class_loader);
-  Klass* k = SystemDictionary::find_instance_or_array_klass(THREAD, name,
+// This works only for the boot/platform/app loaders
+Klass* ClassPrelinker::find_loaded_class(Thread* current, oop class_loader, Symbol* name) {
+  HandleMark hm(current);
+  Handle h_loader(current, class_loader);
+  Klass* k = SystemDictionary::find_instance_or_array_klass(current, name,
                                                             h_loader,
                                                             Handle());
   if (k != nullptr) {
     return k;
   }
-  if (class_loader == SystemDictionary::java_system_loader()) {
-    return find_loaded_class(THREAD, SystemDictionary::java_platform_loader(), name);
-  } else if (class_loader == SystemDictionary::java_platform_loader()) {
-    return find_loaded_class(THREAD, nullptr, name);
+  if (h_loader() == SystemDictionary::java_system_loader()) {
+    return find_loaded_class(current, SystemDictionary::java_platform_loader(), name);
+  } else if (h_loader() == SystemDictionary::java_platform_loader()) {
+    return find_loaded_class(current, nullptr, name);
+  } else {
+    assert(h_loader() == nullptr, "This function only works for boot/platform/app loaders %p %p %p",
+           cast_from_oop<address>(h_loader()),
+           cast_from_oop<address>(SystemDictionary::java_system_loader()),
+           cast_from_oop<address>(SystemDictionary::java_platform_loader()));
   }
 
   return nullptr;
 }
 
-Klass* ClassPrelinker::maybe_resolve_class(constantPoolHandle cp, int cp_index, TRAPS) {
-  assert(!is_in_archivebuilder_buffer(cp()), "sanity");
-  InstanceKlass* cp_holder = cp->pool_holder();
-  if (!cp_holder->is_shared_boot_class() &&
-      !cp_holder->is_shared_platform_class() &&
-      !cp_holder->is_shared_app_class()) {
-    // Don't trust custom loaders, as they may not be well-behaved
-    // when resolving classes.
-    return nullptr;
-  }
-
-  Symbol* name = cp->klass_name_at(cp_index);
-  Klass* resolved_klass = find_loaded_class(THREAD, cp_holder->class_loader(), name);
-  if (resolved_klass != nullptr && can_archive_resolved_klass(cp_holder, resolved_klass)) {
-    Klass* k = cp->klass_at(cp_index, CHECK_NULL); // Should fail only with OOM
-    assert(k == resolved_klass, "must be");
-  }
-
-  return resolved_klass;
+Klass* ClassPrelinker::find_loaded_class(Thread* current, ConstantPool* cp, int class_cp_index) {
+  Symbol* name = cp->klass_name_at(class_cp_index);
+  return find_loaded_class(current, cp->pool_holder()->class_loader(), name);
 }
 
 #if INCLUDE_CDS_JAVA_HEAP
@@ -190,6 +216,124 @@ void ClassPrelinker::resolve_string(constantPoolHandle cp, int cp_index, TRAPS)
 }
 #endif
 
+void ClassPrelinker::preresolve_class_cp_entries(JavaThread* current, InstanceKlass* ik, GrowableArray<bool>* preresolve_list) {
+  if (!SystemDictionaryShared::is_builtin_loader(ik->class_loader_data())) {
+    return;
+  }
+
+  JavaThread* THREAD = current;
+  constantPoolHandle cp(THREAD, ik->constants());
+  for (int cp_index = 1; cp_index < cp->length(); cp_index++) {
+    if (cp->tag_at(cp_index).value() == JVM_CONSTANT_UnresolvedClass) {
+      if (preresolve_list != nullptr && preresolve_list->at(cp_index) == false) {
+        // This class was not resolved during trial run. Don't attempt to resolve it. Otherwise
+        // the compiler may generate less efficient code.
+        continue;
+      }
+      if (find_loaded_class(current, cp(), cp_index) == nullptr) {
+        // Do not resolve any class that has not been loaded yet
+        continue;
+      }
+      Klass* resolved_klass = cp->klass_at(cp_index, THREAD);
+      if (HAS_PENDING_EXCEPTION) {
+        CLEAR_PENDING_EXCEPTION; // just ignore
+      } else {
+        log_trace(cds, resolve)("Resolved class  [%3d] %s -> %s", cp_index, ik->external_name(),
+                                resolved_klass->external_name());
+      }
+    }
+  }
+}
+
+void ClassPrelinker::preresolve_field_and_method_cp_entries(JavaThread* current, InstanceKlass* ik, GrowableArray<bool>* preresolve_list) {
+  JavaThread* THREAD = current;
+  constantPoolHandle cp(THREAD, ik->constants());
+  if (cp->cache() == nullptr) {
+    return;
+  }
+  for (int i = 0; i < ik->methods()->length(); i++) {
+    Method* m = ik->methods()->at(i);
+    BytecodeStream bcs(methodHandle(THREAD, m));
+    while (!bcs.is_last_bytecode()) {
+      bcs.next();
+      Bytecodes::Code raw_bc = bcs.raw_code();
+      switch (raw_bc) {
+      case Bytecodes::_getfield:
+      case Bytecodes::_putfield:
+        maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD);
+        if (HAS_PENDING_EXCEPTION) {
+          CLEAR_PENDING_EXCEPTION; // just ignore
+        }
+        break;
+      case Bytecodes::_invokespecial:
+      case Bytecodes::_invokevirtual:
+      case Bytecodes::_invokeinterface:
+        maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD);
+        if (HAS_PENDING_EXCEPTION) {
+          CLEAR_PENDING_EXCEPTION; // just ignore
+        }
+        break;
+      default:
+        break;
+      }
+    }
+  }
+}
+
+void ClassPrelinker::maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m, Bytecodes::Code bc, int raw_index,
+                                           GrowableArray<bool>* preresolve_list, TRAPS) {
+  methodHandle mh(THREAD, m);
+  constantPoolHandle cp(THREAD, ik->constants());
+  HandleMark hm(THREAD);
+  int cp_index = cp->to_cp_index(raw_index, bc);
+
+  if (cp->is_resolved(raw_index, bc)) {
+    return;
+  }
+
+  if (preresolve_list != nullptr && preresolve_list->at(cp_index) == false) {
+    // This field wasn't resolved during the trial run. Don't attempt to resolve it. Otherwise
+    // the compiler may generate less efficient code.
+    return;
+  }
+
+  int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index);
+  if (find_loaded_class(THREAD, cp(), klass_cp_index) == nullptr) {
+    // Do not resolve any field/methods from a class that has not been loaded yet.
+    return;
+  }
+
+  Klass* resolved_klass = cp->klass_ref_at(raw_index, bc, CHECK);
+
+  switch (bc) {
+  case Bytecodes::_getfield:
+  case Bytecodes::_putfield:
+    InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, false /*initialize_holder*/, CHECK);
+    break;
+
+  case Bytecodes::_invokevirtual:
+  case Bytecodes::_invokespecial:
+  case Bytecodes::_invokeinterface:
+    InterpreterRuntime::cds_resolve_invoke(bc, raw_index, cp, CHECK);
+    break;
+
+  default:
+    ShouldNotReachHere();
+  }
+
+  if (log_is_enabled(Trace, cds, resolve)) {
+    ResourceMark rm(THREAD);
+    bool resolved = cp->is_resolved(raw_index, bc);
+    Symbol* name = cp->name_ref_at(raw_index, bc);
+    Symbol* signature = cp->signature_ref_at(raw_index, bc);
+    log_trace(cds, resolve)("%s %s [%3d] %s -> %s.%s:%s",
+                            (resolved ? "Resolved" : "Failed to resolve"),
+                            Bytecodes::name(bc), cp_index, ik->external_name(),
+                            resolved_klass->external_name(),
+                            name->as_C_string(), signature->as_C_string());
+  }
+}
+
 #ifdef ASSERT
 bool ClassPrelinker::is_in_archivebuilder_buffer(address p) {
   if (!Thread::current()->is_VM_thread() || ArchiveBuilder::current() == nullptr) {
diff --git a/src/hotspot/share/cds/classPrelinker.hpp b/src/hotspot/share/cds/classPrelinker.hpp
index 7a4f36386ea..41588961d8b 100644
--- a/src/hotspot/share/cds/classPrelinker.hpp
+++ b/src/hotspot/share/cds/classPrelinker.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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,6 +25,7 @@
 #ifndef SHARE_CDS_CLASSPRELINKER_HPP
 #define SHARE_CDS_CLASSPRELINKER_HPP
 
+#include "interpreter/bytecodes.hpp"
 #include "oops/oopsHierarchy.hpp"
 #include "memory/allStatic.hpp"
 #include "memory/allocation.hpp"
@@ -64,14 +65,21 @@ class ClassPrelinker :  AllStatic {
     return is_in_archivebuilder_buffer((address)(p));
   }
   static void resolve_string(constantPoolHandle cp, int cp_index, TRAPS) NOT_CDS_JAVA_HEAP_RETURN;
-  static Klass* maybe_resolve_class(constantPoolHandle cp, int cp_index, TRAPS);
-  static bool can_archive_resolved_klass(InstanceKlass* cp_holder, Klass* resolved_klass);
-  static Klass* find_loaded_class(JavaThread* THREAD, oop class_loader, Symbol* name);
+  static bool is_class_resolution_deterministic(InstanceKlass* cp_holder, Klass* resolved_class);
 
+  static Klass* find_loaded_class(Thread* current, oop class_loader, Symbol* name);
+  static Klass* find_loaded_class(Thread* current, ConstantPool* cp, int class_cp_index);
+
+  // fmi = FieldRef/MethodRef/InterfaceMethodRef
+  static void maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m, Bytecodes::Code bc, int raw_index,
+                                    GrowableArray<bool>* resolve_fmi_list, TRAPS);
 public:
   static void initialize();
   static void dispose();
 
+  static void preresolve_class_cp_entries(JavaThread* current, InstanceKlass* ik, GrowableArray<bool>* preresolve_list);
+  static void preresolve_field_and_method_cp_entries(JavaThread* current, InstanceKlass* ik, GrowableArray<bool>* preresolve_list);
+
   // Is this class resolved as part of vmClasses::resolve_all()? If so, these
   // classes are guatanteed to be loaded at runtime (and cannot be replaced by JVMTI)
   // when CDS is enabled. Therefore, we can safely keep a direct reference to these
@@ -82,10 +90,7 @@ class ClassPrelinker :  AllStatic {
   // CDS archive.
   static void dumptime_resolve_constants(InstanceKlass* ik, TRAPS);
 
-  // Can we resolve the klass entry at cp_index in this constant pool, and store
-  // the result in the CDS archive? Returns true if cp_index is guaranteed to
-  // resolve to the same InstanceKlass* at both dump time and run time.
-  static bool can_archive_resolved_klass(ConstantPool* cp, int cp_index);
+  static bool is_resolution_deterministic(ConstantPool* cp, int cp_index);
 };
 
 #endif // SHARE_CDS_CLASSPRELINKER_HPP
diff --git a/src/hotspot/share/cds/cppVtables.cpp b/src/hotspot/share/cds/cppVtables.cpp
index f17d94a82fd..6dd5e65ae43 100644
--- a/src/hotspot/share/cds/cppVtables.cpp
+++ b/src/hotspot/share/cds/cppVtables.cpp
@@ -66,19 +66,17 @@
 
 class CppVtableInfo {
   intptr_t _vtable_size;
-  intptr_t _cloned_vtable[1];
+  intptr_t _cloned_vtable[1]; // Pseudo flexible array member.
+  static size_t cloned_vtable_offset() { return offset_of(CppVtableInfo, _cloned_vtable); }
 public:
-  static int num_slots(int vtable_size) {
-    return 1 + vtable_size; // Need to add the space occupied by _vtable_size;
-  }
   int vtable_size()           { return int(uintx(_vtable_size)); }
   void set_vtable_size(int n) { _vtable_size = intptr_t(n); }
-  intptr_t* cloned_vtable()   { return &_cloned_vtable[0]; }
-  void zero()                 { memset(_cloned_vtable, 0, sizeof(intptr_t) * vtable_size()); }
+  // Using _cloned_vtable[i] for i > 0 causes undefined behavior. We use address calculation instead.
+  intptr_t* cloned_vtable()   { return (intptr_t*)((char*)this + cloned_vtable_offset()); }
+  void zero()                 { memset(cloned_vtable(), 0, sizeof(intptr_t) * vtable_size()); }
   // Returns the address of the next CppVtableInfo that can be placed immediately after this CppVtableInfo
   static size_t byte_size(int vtable_size) {
-    CppVtableInfo i;
-    return pointer_delta(&i._cloned_vtable[vtable_size], &i, sizeof(u1));
+    return cloned_vtable_offset() + (sizeof(intptr_t) * vtable_size);
   }
 };
 
diff --git a/src/hotspot/share/cds/dumpAllocStats.cpp b/src/hotspot/share/cds/dumpAllocStats.cpp
index 21a40ca8f28..a1dac41e322 100644
--- a/src/hotspot/share/cds/dumpAllocStats.cpp
+++ b/src/hotspot/share/cds/dumpAllocStats.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -102,8 +102,16 @@ void DumpAllocStats::print_stats(int ro_all, int rw_all) {
 
 #undef fmt_stats
 
-  msg.debug("Class CP entries = %d, archived = %d (%3.1f%%)",
-            _num_klass_cp_entries, _num_klass_cp_entries_archived,
-            percent_of(_num_klass_cp_entries_archived, _num_klass_cp_entries));
-
+  msg.info("Class  CP entries = %6d, archived = %6d (%5.1f%%), reverted = %6d",
+           _num_klass_cp_entries, _num_klass_cp_entries_archived,
+           percent_of(_num_klass_cp_entries_archived, _num_klass_cp_entries),
+           _num_klass_cp_entries_reverted);
+  msg.info("Field  CP entries = %6d, archived = %6d (%5.1f%%), reverted = %6d",
+           _num_field_cp_entries, _num_field_cp_entries_archived,
+           percent_of(_num_field_cp_entries_archived, _num_field_cp_entries),
+           _num_field_cp_entries_reverted);
+  msg.info("Method CP entries = %6d, archived = %6d (%5.1f%%), reverted = %6d",
+           _num_method_cp_entries, _num_method_cp_entries_archived,
+           percent_of(_num_method_cp_entries_archived, _num_method_cp_entries),
+           _num_method_cp_entries_reverted);
 }
diff --git a/src/hotspot/share/cds/dumpAllocStats.hpp b/src/hotspot/share/cds/dumpAllocStats.hpp
index f6e170cdef2..0332be73120 100644
--- a/src/hotspot/share/cds/dumpAllocStats.hpp
+++ b/src/hotspot/share/cds/dumpAllocStats.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -65,8 +65,15 @@ class DumpAllocStats : public StackObj {
   int _counts[2][_number_of_types];
   int _bytes [2][_number_of_types];
 
+  int _num_field_cp_entries;
+  int _num_field_cp_entries_archived;
+  int _num_field_cp_entries_reverted;
   int _num_klass_cp_entries;
   int _num_klass_cp_entries_archived;
+  int _num_klass_cp_entries_reverted;
+  int _num_method_cp_entries;
+  int _num_method_cp_entries_archived;
+  int _num_method_cp_entries_reverted;
 
 public:
   enum { RO = 0, RW = 1 };
@@ -74,8 +81,15 @@ class DumpAllocStats : public StackObj {
   DumpAllocStats() {
     memset(_counts, 0, sizeof(_counts));
     memset(_bytes,  0, sizeof(_bytes));
-    _num_klass_cp_entries = 0;
-    _num_klass_cp_entries_archived = 0;
+    _num_field_cp_entries           = 0;
+    _num_field_cp_entries_archived  = 0;
+    _num_field_cp_entries_reverted  = 0;
+    _num_klass_cp_entries           = 0;
+    _num_klass_cp_entries_archived  = 0;
+    _num_klass_cp_entries_reverted  = 0;
+    _num_method_cp_entries          = 0;
+    _num_method_cp_entries_archived = 0;
+    _num_method_cp_entries_reverted = 0;
   };
 
   CompactHashtableStats* symbol_stats() { return &_symbol_stats; }
@@ -102,9 +116,22 @@ class DumpAllocStats : public StackObj {
     _bytes[RW][CppVTablesType] += byte_size;
   }
 
-  void record_klass_cp_entry(bool archived) {
+  void record_field_cp_entry(bool archived, bool reverted) {
+    _num_field_cp_entries ++;
+    _num_field_cp_entries_archived += archived ? 1 : 0;
+    _num_field_cp_entries_reverted += reverted ? 1 : 0;
+  }
+
+  void record_klass_cp_entry(bool archived, bool reverted) {
     _num_klass_cp_entries ++;
     _num_klass_cp_entries_archived += archived ? 1 : 0;
+    _num_klass_cp_entries_reverted += reverted ? 1 : 0;
+  }
+
+  void record_method_cp_entry(bool archived, bool reverted) {
+    _num_method_cp_entries ++;
+    _num_method_cp_entries_archived += archived ? 1 : 0;
+    _num_method_cp_entries_reverted += reverted ? 1 : 0;
   }
 
   void print_stats(int ro_all, int rw_all);
diff --git a/src/hotspot/share/cds/dynamicArchive.cpp b/src/hotspot/share/cds/dynamicArchive.cpp
index 5effa4e458c..04c60b89580 100644
--- a/src/hotspot/share/cds/dynamicArchive.cpp
+++ b/src/hotspot/share/cds/dynamicArchive.cpp
@@ -31,6 +31,7 @@
 #include "cds/classPrelinker.hpp"
 #include "cds/dynamicArchive.hpp"
 #include "cds/regeneratedClasses.hpp"
+#include "classfile/classLoader.hpp"
 #include "classfile/classLoaderData.inline.hpp"
 #include "classfile/symbolTable.hpp"
 #include "classfile/systemDictionaryShared.hpp"
@@ -118,6 +119,9 @@ class DynamicArchiveBuilder : public ArchiveBuilder {
       return;
     }
 
+    log_info(cds,dynamic)("CDS dynamic dump: clinit = " JLONG_FORMAT "ms)",
+                          ClassLoader::class_init_time_ms());
+
     init_header();
     gather_source_objs();
     gather_array_klasses();
diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp
index 5b352b54e4b..96c826fb67e 100644
--- a/src/hotspot/share/cds/filemap.cpp
+++ b/src/hotspot/share/cds/filemap.cpp
@@ -1406,7 +1406,8 @@ void FileMapInfo::open_for_write() {
   if (fd < 0) {
     log_error(cds)("Unable to create shared archive file %s: (%s).", _full_path,
                    os::strerror(errno));
-    MetaspaceShared::unrecoverable_writing_error();
+    MetaspaceShared::writing_error();
+    return;
   }
   _fd = fd;
   _file_open = true;
@@ -1659,7 +1660,7 @@ void FileMapInfo::write_bytes(const void* buffer, size_t nbytes) {
     // If the shared archive is corrupted, close it and remove it.
     close();
     remove(_full_path);
-    MetaspaceShared::unrecoverable_writing_error("Unable to write to shared archive file.");
+    MetaspaceShared::writing_error("Unable to write to shared archive file.");
   }
   _file_offset += nbytes;
 }
diff --git a/src/hotspot/share/cds/heapShared.cpp b/src/hotspot/share/cds/heapShared.cpp
index 7b519a57d57..ff84ddc13fc 100644
--- a/src/hotspot/share/cds/heapShared.cpp
+++ b/src/hotspot/share/cds/heapShared.cpp
@@ -28,6 +28,7 @@
 #include "cds/archiveHeapWriter.hpp"
 #include "cds/archiveUtils.hpp"
 #include "cds/cdsConfig.hpp"
+#include "cds/cdsEnumKlass.hpp"
 #include "cds/cdsHeapVerifier.hpp"
 #include "cds/heapShared.hpp"
 #include "cds/metaspaceShared.hpp"
@@ -451,95 +452,6 @@ void HeapShared::set_has_native_pointers(oop src_obj) {
   info->set_has_native_pointers();
 }
 
-// -- Handling of Enum objects
-// Java Enum classes have synthetic <clinit> methods that look like this
-//     enum MyEnum {FOO, BAR}
-//     MyEnum::<clinint> {
-//        /*static final MyEnum*/ MyEnum::FOO = new MyEnum("FOO");
-//        /*static final MyEnum*/ MyEnum::BAR = new MyEnum("BAR");
-//     }
-//
-// If MyEnum::FOO object is referenced by any of the archived subgraphs, we must
-// ensure the archived value equals (in object address) to the runtime value of
-// MyEnum::FOO.
-//
-// However, since MyEnum::<clinint> is synthetically generated by javac, there's
-// no way of programmatically handling this inside the Java code (as you would handle
-// ModuleLayer::EMPTY_LAYER, for example).
-//
-// Instead, we archive all static field of such Enum classes. At runtime,
-// HeapShared::initialize_enum_klass() will skip the <clinit> method and pull
-// the static fields out of the archived heap.
-void HeapShared::check_enum_obj(int level,
-                                KlassSubGraphInfo* subgraph_info,
-                                oop orig_obj) {
-  assert(level > 1, "must never be called at the first (outermost) level");
-  Klass* k = orig_obj->klass();
-  Klass* buffered_k = ArchiveBuilder::get_buffered_klass(k);
-  if (!k->is_instance_klass()) {
-    return;
-  }
-  InstanceKlass* ik = InstanceKlass::cast(k);
-  if (ik->java_super() == vmClasses::Enum_klass() && !ik->has_archived_enum_objs()) {
-    ResourceMark rm;
-    ik->set_has_archived_enum_objs();
-    buffered_k->set_has_archived_enum_objs();
-    oop mirror = ik->java_mirror();
-
-    for (JavaFieldStream fs(ik); !fs.done(); fs.next()) {
-      if (fs.access_flags().is_static()) {
-        fieldDescriptor& fd = fs.field_descriptor();
-        if (fd.field_type() != T_OBJECT && fd.field_type() != T_ARRAY) {
-          guarantee(false, "static field %s::%s must be T_OBJECT or T_ARRAY",
-                    ik->external_name(), fd.name()->as_C_string());
-        }
-        oop oop_field = mirror->obj_field(fd.offset());
-        if (oop_field == nullptr) {
-          guarantee(false, "static field %s::%s must not be null",
-                    ik->external_name(), fd.name()->as_C_string());
-        } else if (oop_field->klass() != ik && oop_field->klass() != ik->array_klass_or_null()) {
-          guarantee(false, "static field %s::%s is of the wrong type",
-                    ik->external_name(), fd.name()->as_C_string());
-        }
-        bool success = archive_reachable_objects_from(level, subgraph_info, oop_field);
-        assert(success, "VM should have exited with unarchivable objects for _level > 1");
-        int root_index = append_root(oop_field);
-        log_info(cds, heap)("Archived enum obj @%d %s::%s (" INTPTR_FORMAT ")",
-                            root_index, ik->external_name(), fd.name()->as_C_string(),
-                            p2i((oopDesc*)oop_field));
-        SystemDictionaryShared::add_enum_klass_static_field(ik, root_index);
-      }
-    }
-  }
-}
-
-// See comments in HeapShared::check_enum_obj()
-bool HeapShared::initialize_enum_klass(InstanceKlass* k, TRAPS) {
-  if (!ArchiveHeapLoader::is_in_use()) {
-    return false;
-  }
-
-  RunTimeClassInfo* info = RunTimeClassInfo::get_for(k);
-  assert(info != nullptr, "sanity");
-
-  if (log_is_enabled(Info, cds, heap)) {
-    ResourceMark rm;
-    log_info(cds, heap)("Initializing Enum class: %s", k->external_name());
-  }
-
-  oop mirror = k->java_mirror();
-  int i = 0;
-  for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
-    if (fs.access_flags().is_static()) {
-      int root_index = info->enum_klass_static_field_root_index_at(i++);
-      fieldDescriptor& fd = fs.field_descriptor();
-      assert(fd.field_type() == T_OBJECT || fd.field_type() == T_ARRAY, "must be");
-      mirror->obj_field_put(fd.offset(), get_root(root_index, /*clear=*/true));
-    }
-  }
-  return true;
-}
-
 void HeapShared::archive_objects(ArchiveHeapInfo *heap_info) {
   {
     NoSafepointVerifier nsv;
@@ -1241,7 +1153,9 @@ bool HeapShared::archive_reachable_objects_from(int level,
   WalkOopAndArchiveClosure walker(level, record_klasses_only, subgraph_info, orig_obj);
   orig_obj->oop_iterate(&walker);
 
-  check_enum_obj(level + 1, subgraph_info, orig_obj);
+  if (CDSEnumKlass::is_enum_obj(orig_obj)) {
+    CDSEnumKlass::handle_enum_obj(level + 1, subgraph_info, orig_obj);
+  }
   return true;
 }
 
diff --git a/src/hotspot/share/cds/heapShared.hpp b/src/hotspot/share/cds/heapShared.hpp
index aa8c1dd3bc4..fa34289a38e 100644
--- a/src/hotspot/share/cds/heapShared.hpp
+++ b/src/hotspot/share/cds/heapShared.hpp
@@ -212,9 +212,6 @@ class HeapShared: AllStatic {
   };
 
 private:
-  static void check_enum_obj(int level, KlassSubGraphInfo* subgraph_info,
-                             oop orig_obj);
-
   static const int INITIAL_TABLE_SIZE = 15889; // prime number
   static const int MAX_TABLE_SIZE     = 1000000;
   typedef ResizeableResourceHashtable<oop, CachedOopInfo,
@@ -428,7 +425,6 @@ class HeapShared: AllStatic {
   static void write_subgraph_info_table() NOT_CDS_JAVA_HEAP_RETURN;
   static void init_roots(oop roots_oop) NOT_CDS_JAVA_HEAP_RETURN;
   static void serialize_tables(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN;
-  static bool initialize_enum_klass(InstanceKlass* k, TRAPS) NOT_CDS_JAVA_HEAP_RETURN_(false);
 
   static bool is_a_test_class_in_unnamed_module(Klass* ik) NOT_CDS_JAVA_HEAP_RETURN_(false);
 };
diff --git a/src/hotspot/share/cds/lambdaFormInvokers.hpp b/src/hotspot/share/cds/lambdaFormInvokers.hpp
index 7bb5e5932c7..e78ddb1a1bc 100644
--- a/src/hotspot/share/cds/lambdaFormInvokers.hpp
+++ b/src/hotspot/share/cds/lambdaFormInvokers.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -32,6 +32,7 @@
 class ClassFileStream;
 template <class T>
 class Array;
+class SerializeClosure;
 
 class LambdaFormInvokers : public AllStatic {
  private:
@@ -46,5 +47,6 @@ class LambdaFormInvokers : public AllStatic {
   static void regenerate_holder_classes(TRAPS);
   static void serialize(SerializeClosure* soc);
   static void cleanup_regenerated_classes();
+  inline static bool may_be_regenerated_class(Symbol* name);
 };
 #endif // SHARE_CDS_LAMBDAFORMINVOKERS_HPP
diff --git a/src/hotspot/share/cds/lambdaFormInvokers.inline.hpp b/src/hotspot/share/cds/lambdaFormInvokers.inline.hpp
new file mode 100644
index 00000000000..dddd0e36c47
--- /dev/null
+++ b/src/hotspot/share/cds/lambdaFormInvokers.inline.hpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_CDS_LAMBDAFORMINVOKERS_INLINE_HPP
+#define SHARE_CDS_LAMBDAFORMINVOKERS_INLINE_HPP
+
+#include "cds/lambdaFormInvokers.hpp"
+#include "classfile/vmSymbols.hpp"
+
+inline bool LambdaFormInvokers::may_be_regenerated_class(Symbol* name) {
+  return name == vmSymbols::java_lang_invoke_Invokers_Holder() ||
+         name == vmSymbols::java_lang_invoke_DirectMethodHandle_Holder() ||
+         name == vmSymbols::java_lang_invoke_LambdaForm_Holder() ||
+         name == vmSymbols::java_lang_invoke_DelegatingMethodHandle_Holder();
+}
+
+#endif // SHARE_CDS_LAMBDAFORMINVOKERS_INLINE_HPP
diff --git a/src/hotspot/share/cds/metaspaceShared.cpp b/src/hotspot/share/cds/metaspaceShared.cpp
index 30b240b27ca..4d978a7ad88 100644
--- a/src/hotspot/share/cds/metaspaceShared.cpp
+++ b/src/hotspot/share/cds/metaspaceShared.cpp
@@ -444,6 +444,8 @@ void MetaspaceShared::rewrite_nofast_bytecodes_and_calculate_fingerprints(Thread
 class VM_PopulateDumpSharedSpace : public VM_Operation {
 private:
   ArchiveHeapInfo _heap_info;
+  FileMapInfo* _map_info;
+  StaticArchiveBuilder& _builder;
 
   void dump_java_heap_objects(GrowableArray<Klass*>* klasses) NOT_CDS_JAVA_HEAP_RETURN;
   void dump_shared_symbol_table(GrowableArray<Symbol*>* symbols) {
@@ -454,11 +456,14 @@ class VM_PopulateDumpSharedSpace : public VM_Operation {
 
 public:
 
-  VM_PopulateDumpSharedSpace() : VM_Operation(), _heap_info() {}
+  VM_PopulateDumpSharedSpace(StaticArchiveBuilder& b) :
+    VM_Operation(), _heap_info(), _map_info(nullptr), _builder(b) {}
 
   bool skip_operation() const { return false; }
 
   VMOp_Type type() const { return VMOp_PopulateDumpSharedSpace; }
+  ArchiveHeapInfo* heap_info()  { return &_heap_info; }
+  FileMapInfo* map_info() const { return _map_info; }
   void doit();   // outline because gdb sucks
   bool allow_nested_vm_operations() const { return true; }
 }; // class VM_PopulateDumpSharedSpace
@@ -505,6 +510,8 @@ char* VM_PopulateDumpSharedSpace::dump_read_only_tables() {
 }
 
 void VM_PopulateDumpSharedSpace::doit() {
+  guarantee(!CDSConfig::is_using_archive(), "We should not be using an archive when we dump");
+
   DEBUG_ONLY(SystemDictionaryShared::NoClassLoadingMark nclm);
 
   FileMapInfo::check_nonempty_dir_in_shared_path_table();
@@ -515,22 +522,21 @@ void VM_PopulateDumpSharedSpace::doit() {
   MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag);
   SystemDictionaryShared::check_excluded_classes();
 
-  StaticArchiveBuilder builder;
-  builder.gather_source_objs();
-  builder.reserve_buffer();
+  _builder.gather_source_objs();
+  _builder.reserve_buffer();
 
-  CppVtables::dumptime_init(&builder);
+  CppVtables::dumptime_init(&_builder);
 
-  builder.sort_metadata_objs();
-  builder.dump_rw_metadata();
-  builder.dump_ro_metadata();
-  builder.relocate_metaspaceobj_embedded_pointers();
+  _builder.sort_metadata_objs();
+  _builder.dump_rw_metadata();
+  _builder.dump_ro_metadata();
+  _builder.relocate_metaspaceobj_embedded_pointers();
 
-  dump_java_heap_objects(builder.klasses());
-  dump_shared_symbol_table(builder.symbols());
+  dump_java_heap_objects(_builder.klasses());
+  dump_shared_symbol_table(_builder.symbols());
 
   log_info(cds)("Make classes shareable");
-  builder.make_klasses_shareable();
+  _builder.make_klasses_shareable();
 
   char* serialized_data = dump_read_only_tables();
 
@@ -540,28 +546,13 @@ void VM_PopulateDumpSharedSpace::doit() {
   // We don't want to write these addresses into the archive.
   CppVtables::zero_archived_vtables();
 
-  // relocate the data so that it can be mapped to MetaspaceShared::requested_base_address()
-  // without runtime relocation.
-  builder.relocate_to_requested();
-
   // Write the archive file
   const char* static_archive = CDSConfig::static_archive_path();
   assert(static_archive != nullptr, "SharedArchiveFile not set?");
-  FileMapInfo* mapinfo = new FileMapInfo(static_archive, true);
-  mapinfo->populate_header(MetaspaceShared::core_region_alignment());
-  mapinfo->set_serialized_data(serialized_data);
-  mapinfo->set_cloned_vtables(CppVtables::vtables_serialized_base());
-  mapinfo->open_for_write();
-  builder.write_archive(mapinfo, &_heap_info);
-
-  if (PrintSystemDictionaryAtExit) {
-    SystemDictionary::print();
-  }
-
-  if (AllowArchivingWithJavaAgent) {
-    log_warning(cds)("This archive was created with AllowArchivingWithJavaAgent. It should be used "
-            "for testing purposes only and should not be used in a production environment");
-  }
+  _map_info = new FileMapInfo(static_archive, true);
+  _map_info->populate_header(MetaspaceShared::core_region_alignment());
+  _map_info->set_serialized_data(serialized_data);
+  _map_info->set_cloned_vtables(CppVtables::vtables_serialized_base());
 }
 
 class CollectCLDClosure : public CLDClosure {
@@ -663,21 +654,19 @@ void MetaspaceShared::prepare_for_dumping() {
 
 // Preload classes from a list, populate the shared spaces and dump to a
 // file.
-void MetaspaceShared::preload_and_dump() {
-  EXCEPTION_MARK;
+void MetaspaceShared::preload_and_dump(TRAPS) {
   ResourceMark rm(THREAD);
-  preload_and_dump_impl(THREAD);
+  StaticArchiveBuilder builder;
+  preload_and_dump_impl(builder, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     if (PENDING_EXCEPTION->is_a(vmClasses::OutOfMemoryError_klass())) {
       log_error(cds)("Out of memory. Please run with a larger Java heap, current MaxHeapSize = "
                      SIZE_FORMAT "M", MaxHeapSize/M);
-      CLEAR_PENDING_EXCEPTION;
-      MetaspaceShared::unrecoverable_writing_error();
+      MetaspaceShared::writing_error();
     } else {
       log_error(cds)("%s: %s", PENDING_EXCEPTION->klass()->external_name(),
                      java_lang_String::as_utf8_string(java_lang_Throwable::message(PENDING_EXCEPTION)));
-      CLEAR_PENDING_EXCEPTION;
-      MetaspaceShared::unrecoverable_writing_error("VM exits due to exception, use -Xlog:cds,exceptions=trace for detail");
+      MetaspaceShared::writing_error("Unexpected exception, use -Xlog:cds,exceptions=trace for detail");
     }
   }
 }
@@ -768,7 +757,7 @@ void MetaspaceShared::preload_classes(TRAPS) {
   log_info(cds)("Loading classes to share: done.");
 }
 
-void MetaspaceShared::preload_and_dump_impl(TRAPS) {
+void MetaspaceShared::preload_and_dump_impl(StaticArchiveBuilder& builder, TRAPS) {
   preload_classes(CHECK);
 
   if (SharedArchiveConfigFile) {
@@ -805,8 +794,30 @@ void MetaspaceShared::preload_and_dump_impl(TRAPS) {
   }
 #endif
 
-  VM_PopulateDumpSharedSpace op;
+  VM_PopulateDumpSharedSpace op(builder);
   VMThread::execute(&op);
+
+  if (!write_static_archive(&builder, op.map_info(), op.heap_info())) {
+    THROW_MSG(vmSymbols::java_io_IOException(), "Encountered error while dumping");
+  }
+}
+
+bool MetaspaceShared::write_static_archive(ArchiveBuilder* builder, FileMapInfo* map_info, ArchiveHeapInfo* heap_info) {
+  // relocate the data so that it can be mapped to MetaspaceShared::requested_base_address()
+  // without runtime relocation.
+  builder->relocate_to_requested();
+
+  map_info->open_for_write();
+  if (!map_info->is_open()) {
+    return false;
+  }
+  builder->write_archive(map_info, heap_info);
+
+  if (AllowArchivingWithJavaAgent) {
+    log_warning(cds)("This archive was created with AllowArchivingWithJavaAgent. It should be used "
+            "for testing purposes only and should not be used in a production environment");
+  }
+  return true;
 }
 
 // Returns true if the class's status has changed.
@@ -916,11 +927,17 @@ void MetaspaceShared::unrecoverable_loading_error(const char* message) {
 // This function is called when the JVM is unable to write the specified CDS archive due to an
 // unrecoverable error.
 void MetaspaceShared::unrecoverable_writing_error(const char* message) {
+  writing_error(message);
+  vm_direct_exit(1);
+}
+
+// This function is called when the JVM is unable to write the specified CDS archive due to a
+// an error. The error will be propagated
+void MetaspaceShared::writing_error(const char* message) {
   log_error(cds)("An error has occurred while writing the shared archive file.");
   if (message != nullptr) {
     log_error(cds)("%s", message);
   }
-  vm_direct_exit(1);
 }
 
 void MetaspaceShared::initialize_runtime_shared_and_meta_spaces() {
diff --git a/src/hotspot/share/cds/metaspaceShared.hpp b/src/hotspot/share/cds/metaspaceShared.hpp
index 1fb6ae88142..f26af21676a 100644
--- a/src/hotspot/share/cds/metaspaceShared.hpp
+++ b/src/hotspot/share/cds/metaspaceShared.hpp
@@ -31,9 +31,12 @@
 #include "oops/oop.hpp"
 #include "utilities/macros.hpp"
 
+class ArchiveBuilder;
+class ArchiveHeapInfo;
 class FileMapInfo;
 class outputStream;
 class SerializeClosure;
+class StaticArchiveBuilder;
 
 template<class E> class GrowableArray;
 
@@ -66,13 +69,13 @@ class MetaspaceShared : AllStatic {
   };
 
   static void prepare_for_dumping() NOT_CDS_RETURN;
-  static void preload_and_dump() NOT_CDS_RETURN;
+  static void preload_and_dump(TRAPS) NOT_CDS_RETURN;
 #ifdef _LP64
   static void adjust_heap_sizes_for_dumping() NOT_CDS_JAVA_HEAP_RETURN;
 #endif
 
 private:
-  static void preload_and_dump_impl(TRAPS) NOT_CDS_RETURN;
+  static void preload_and_dump_impl(StaticArchiveBuilder& builder, TRAPS) NOT_CDS_RETURN;
   static void preload_classes(TRAPS) NOT_CDS_RETURN;
 
 public:
@@ -105,6 +108,7 @@ class MetaspaceShared : AllStatic {
 
   static void unrecoverable_loading_error(const char* message = nullptr);
   static void unrecoverable_writing_error(const char* message = nullptr);
+  static void writing_error(const char* message = nullptr);
 
   static void serialize(SerializeClosure* sc) NOT_CDS_RETURN;
 
@@ -166,6 +170,7 @@ class MetaspaceShared : AllStatic {
 
 private:
   static void read_extra_data(JavaThread* current, const char* filename) NOT_CDS_RETURN;
+  static bool write_static_archive(ArchiveBuilder* builder, FileMapInfo* map_info, ArchiveHeapInfo* heap_info);
   static FileMapInfo* open_static_archive();
   static FileMapInfo* open_dynamic_archive();
   // use_requested_addr: If true (default), attempt to map at the address the
diff --git a/src/hotspot/share/ci/ciEnv.cpp b/src/hotspot/share/ci/ciEnv.cpp
index 6d11a436f65..565300f43b4 100644
--- a/src/hotspot/share/ci/ciEnv.cpp
+++ b/src/hotspot/share/ci/ciEnv.cpp
@@ -1032,8 +1032,7 @@ void ciEnv::register_method(ciMethod* target,
                             bool has_unsafe_access,
                             bool has_wide_vectors,
                             bool has_monitors,
-                            int immediate_oops_patched,
-                            RTMState  rtm_state) {
+                            int immediate_oops_patched) {
   VM_ENTRY_MARK;
   nmethod* nm = nullptr;
   {
@@ -1090,14 +1089,6 @@ void ciEnv::register_method(ciMethod* target,
       // Check for {class loads, evolution, breakpoints, ...} during compilation
       validate_compile_task_dependencies(target);
     }
-#if INCLUDE_RTM_OPT
-    if (!failing() && (rtm_state != NoRTM) &&
-        (method()->method_data() != nullptr) &&
-        (method()->method_data()->rtm_state() != rtm_state)) {
-      // Preemptive decompile if rtm state was changed.
-      record_failure("RTM state change invalidated rtm code");
-    }
-#endif
 
     if (failing()) {
       // While not a true deoptimization, it is a preemptive decompile.
@@ -1134,9 +1125,6 @@ void ciEnv::register_method(ciMethod* target,
       nm->set_has_wide_vectors(has_wide_vectors);
       nm->set_has_monitors(has_monitors);
       assert(!method->is_synchronized() || nm->has_monitors(), "");
-#if INCLUDE_RTM_OPT
-      nm->set_rtm_state(rtm_state);
-#endif
 
       if (entry_bci == InvocationEntryBci) {
         if (TieredCompilation) {
diff --git a/src/hotspot/share/ci/ciEnv.hpp b/src/hotspot/share/ci/ciEnv.hpp
index 5d3a61f809e..be63632ba4e 100644
--- a/src/hotspot/share/ci/ciEnv.hpp
+++ b/src/hotspot/share/ci/ciEnv.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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
@@ -383,8 +383,7 @@ class ciEnv : StackObj {
                        bool                      has_unsafe_access,
                        bool                      has_wide_vectors,
                        bool                      has_monitors,
-                       int                       immediate_oops_patched,
-                       RTMState                  rtm_state = NoRTM);
+                       int                       immediate_oops_patched);
 
   // Access to certain well known ciObjects.
 #define VM_CLASS_FUNC(name, ignore_s) \
diff --git a/src/hotspot/share/ci/ciInstanceKlass.cpp b/src/hotspot/share/ci/ciInstanceKlass.cpp
index fa084e2287f..240bb25ae3a 100644
--- a/src/hotspot/share/ci/ciInstanceKlass.cpp
+++ b/src/hotspot/share/ci/ciInstanceKlass.cpp
@@ -661,7 +661,8 @@ class StaticFinalFieldPrinter : public FieldClosure {
       ResourceMark rm;
       oop mirror = fd->field_holder()->java_mirror();
       _out->print("staticfield %s %s %s ", _holder, fd->name()->as_quoted_ascii(), fd->signature()->as_quoted_ascii());
-      switch (fd->field_type()) {
+      BasicType field_type = fd->field_type();
+      switch (field_type) {
         case T_BYTE:    _out->print_cr("%d", mirror->byte_field(fd->offset()));   break;
         case T_BOOLEAN: _out->print_cr("%d", mirror->bool_field(fd->offset()));   break;
         case T_SHORT:   _out->print_cr("%d", mirror->short_field(fd->offset()));  break;
@@ -682,9 +683,12 @@ class StaticFinalFieldPrinter : public FieldClosure {
         case T_OBJECT: {
           oop value =  mirror->obj_field_acquire(fd->offset());
           if (value == nullptr) {
-            _out->print_cr("null");
+            if (field_type == T_ARRAY) {
+              _out->print("%d", -1);
+            }
+            _out->cr();
           } else if (value->is_instance()) {
-            assert(fd->field_type() == T_OBJECT, "");
+            assert(field_type == T_OBJECT, "");
             if (value->is_a(vmClasses::String_klass())) {
               const char* ascii_value = java_lang_String::as_quoted_ascii(value);
               _out->print_cr("\"%s\"", (ascii_value != nullptr) ? ascii_value : "");
diff --git a/src/hotspot/share/ci/ciMethod.cpp b/src/hotspot/share/ci/ciMethod.cpp
index aac2a553cda..844ef0a0c03 100644
--- a/src/hotspot/share/ci/ciMethod.cpp
+++ b/src/hotspot/share/ci/ciMethod.cpp
@@ -718,17 +718,10 @@ ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller,
   {
     MutexLocker locker(Compile_lock);
     InstanceKlass* context = actual_recv->get_instanceKlass();
-    if (UseVtableBasedCHA) {
-      target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context,
-                                                                              root_m->get_Method(),
-                                                                              callee_holder->get_Klass(),
-                                                                              this->get_Method()));
-    } else {
-      if (root_m->is_abstract()) {
-        return nullptr; // not supported
-      }
-      target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context, root_m->get_Method()));
-    }
+    target = methodHandle(THREAD, Dependencies::find_unique_concrete_method(context,
+                                                                            root_m->get_Method(),
+                                                                            callee_holder->get_Klass(),
+                                                                            this->get_Method()));
     assert(target() == nullptr || !target()->is_abstract(), "not allowed");
     // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods.
   }
diff --git a/src/hotspot/share/ci/ciMethodData.hpp b/src/hotspot/share/ci/ciMethodData.hpp
index dedbfc9f4d6..a43d011b77e 100644
--- a/src/hotspot/share/ci/ciMethodData.hpp
+++ b/src/hotspot/share/ci/ciMethodData.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -479,17 +479,6 @@ class ciMethodData : public ciMetadata {
 
   int invocation_count() { return _invocation_counter; }
 
-#if INCLUDE_RTM_OPT
-  // return cached value
-  int rtm_state() {
-    if (is_empty()) {
-      return NoRTM;
-    } else {
-      return get_MethodData()->rtm_state();
-    }
-  }
-#endif
-
   // Transfer information about the method to MethodData*.
   // would_profile means we would like to profile this method,
   // meaning it's not trivial.
diff --git a/src/hotspot/share/ci/ciReplay.cpp b/src/hotspot/share/ci/ciReplay.cpp
index 5fa30f86411..3ed71806b07 100644
--- a/src/hotspot/share/ci/ciReplay.cpp
+++ b/src/hotspot/share/ci/ciReplay.cpp
@@ -1056,46 +1056,48 @@ class CompileReplay : public StackObj {
       int length = parse_int("array length");
       oop value = nullptr;
 
-      if (field_signature[1] == JVM_SIGNATURE_ARRAY) {
-        // multi dimensional array
-        ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK);
-        if (kelem == nullptr) {
-          return;
-        }
-        int rank = 0;
-        while (field_signature[rank] == JVM_SIGNATURE_ARRAY) {
-          rank++;
-        }
-        jint* dims = NEW_RESOURCE_ARRAY(jint, rank);
-        dims[0] = length;
-        for (int i = 1; i < rank; i++) {
-          dims[i] = 1; // These aren't relevant to the compiler
-        }
-        value = kelem->multi_allocate(rank, dims, CHECK);
-      } else {
-        if (strcmp(field_signature, "[B") == 0) {
-          value = oopFactory::new_byteArray(length, CHECK);
-        } else if (strcmp(field_signature, "[Z") == 0) {
-          value = oopFactory::new_boolArray(length, CHECK);
-        } else if (strcmp(field_signature, "[C") == 0) {
-          value = oopFactory::new_charArray(length, CHECK);
-        } else if (strcmp(field_signature, "[S") == 0) {
-          value = oopFactory::new_shortArray(length, CHECK);
-        } else if (strcmp(field_signature, "[F") == 0) {
-          value = oopFactory::new_floatArray(length, CHECK);
-        } else if (strcmp(field_signature, "[D") == 0) {
-          value = oopFactory::new_doubleArray(length, CHECK);
-        } else if (strcmp(field_signature, "[I") == 0) {
-          value = oopFactory::new_intArray(length, CHECK);
-        } else if (strcmp(field_signature, "[J") == 0) {
-          value = oopFactory::new_longArray(length, CHECK);
-        } else if (field_signature[0] == JVM_SIGNATURE_ARRAY &&
-                   field_signature[1] == JVM_SIGNATURE_CLASS) {
-          parse_klass(CHECK); // eat up the array class name
-          Klass* kelem = resolve_klass(field_signature + 1, CHECK);
-          value = oopFactory::new_objArray(kelem, length, CHECK);
+      if (length != -1) {
+        if (field_signature[1] == JVM_SIGNATURE_ARRAY) {
+          // multi dimensional array
+          ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK);
+          if (kelem == nullptr) {
+            return;
+          }
+          int rank = 0;
+          while (field_signature[rank] == JVM_SIGNATURE_ARRAY) {
+            rank++;
+          }
+          jint* dims = NEW_RESOURCE_ARRAY(jint, rank);
+          dims[0] = length;
+          for (int i = 1; i < rank; i++) {
+            dims[i] = 1; // These aren't relevant to the compiler
+          }
+          value = kelem->multi_allocate(rank, dims, CHECK);
         } else {
-          report_error("unhandled array staticfield");
+          if (strcmp(field_signature, "[B") == 0) {
+            value = oopFactory::new_byteArray(length, CHECK);
+          } else if (strcmp(field_signature, "[Z") == 0) {
+            value = oopFactory::new_boolArray(length, CHECK);
+          } else if (strcmp(field_signature, "[C") == 0) {
+            value = oopFactory::new_charArray(length, CHECK);
+          } else if (strcmp(field_signature, "[S") == 0) {
+            value = oopFactory::new_shortArray(length, CHECK);
+          } else if (strcmp(field_signature, "[F") == 0) {
+            value = oopFactory::new_floatArray(length, CHECK);
+          } else if (strcmp(field_signature, "[D") == 0) {
+            value = oopFactory::new_doubleArray(length, CHECK);
+          } else if (strcmp(field_signature, "[I") == 0) {
+            value = oopFactory::new_intArray(length, CHECK);
+          } else if (strcmp(field_signature, "[J") == 0) {
+            value = oopFactory::new_longArray(length, CHECK);
+          } else if (field_signature[0] == JVM_SIGNATURE_ARRAY &&
+                     field_signature[1] == JVM_SIGNATURE_CLASS) {
+            Klass* actual_array_klass = parse_klass(CHECK);
+            Klass* kelem = ObjArrayKlass::cast(actual_array_klass)->element_klass();
+            value = oopFactory::new_objArray(kelem, length, CHECK);
+          } else {
+            report_error("unhandled array staticfield");
+          }
         }
       }
       java_mirror->obj_field_put(fd.offset(), value);
@@ -1133,8 +1135,11 @@ class CompileReplay : public StackObj {
         Handle value = java_lang_String::create_from_str(string_value, CHECK);
         java_mirror->obj_field_put(fd.offset(), value());
       } else if (field_signature[0] == JVM_SIGNATURE_CLASS) {
-        Klass* k = resolve_klass(string_value, CHECK);
-        oop value = InstanceKlass::cast(k)->allocate_instance(CHECK);
+        oop value = nullptr;
+        if (string_value != nullptr) {
+          Klass* k = resolve_klass(string_value, CHECK);
+          value = InstanceKlass::cast(k)->allocate_instance(CHECK);
+        }
         java_mirror->obj_field_put(fd.offset(), value);
       } else {
         report_error("unhandled staticfield");
diff --git a/src/hotspot/share/ci/ciStreams.hpp b/src/hotspot/share/ci/ciStreams.hpp
index 224dfbe556f..6c5dc31f4df 100644
--- a/src/hotspot/share/ci/ciStreams.hpp
+++ b/src/hotspot/share/ci/ciStreams.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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
@@ -66,7 +66,7 @@ class ciBytecodeStream : StackObj {
   Bytecodes::Code _raw_bc;         // Current bytecode, raw form
 
   void reset( address base, unsigned int size ) {
-    _bc_start =_was_wide = 0;
+    _bc_start = _was_wide = nullptr;
     _start = _pc = base; _end = base + size;
   }
 
diff --git a/src/hotspot/share/classfile/classLoader.cpp b/src/hotspot/share/classfile/classLoader.cpp
index b317aaa071c..e410824e300 100644
--- a/src/hotspot/share/classfile/classLoader.cpp
+++ b/src/hotspot/share/classfile/classLoader.cpp
@@ -78,6 +78,7 @@
 #include "utilities/classpathStream.hpp"
 #include "utilities/events.hpp"
 #include "utilities/macros.hpp"
+#include "utilities/ostream.hpp"
 #include "utilities/utf8.hpp"
 
 // Entry point in java.dll for path canonicalization
@@ -118,9 +119,40 @@ PerfCounter*    ClassLoader::_perf_define_appclass_time = nullptr;
 PerfCounter*    ClassLoader::_perf_define_appclass_selftime = nullptr;
 PerfCounter*    ClassLoader::_perf_app_classfile_bytes_read = nullptr;
 PerfCounter*    ClassLoader::_perf_sys_classfile_bytes_read = nullptr;
+PerfCounter*    ClassLoader::_perf_ik_link_methods_time = nullptr;
+PerfCounter*    ClassLoader::_perf_method_adapters_time = nullptr;
+PerfCounter*    ClassLoader::_perf_ik_link_methods_count = nullptr;
+PerfCounter*    ClassLoader::_perf_method_adapters_count = nullptr;
 PerfCounter*    ClassLoader::_unsafe_defineClassCallCounter = nullptr;
 PerfCounter*    ClassLoader::_perf_secondary_hash_time = nullptr;
 
+PerfCounter*    ClassLoader::_perf_resolve_indy_time = nullptr;
+PerfCounter*    ClassLoader::_perf_resolve_invokehandle_time = nullptr;
+PerfCounter*    ClassLoader::_perf_resolve_mh_time = nullptr;
+PerfCounter*    ClassLoader::_perf_resolve_mt_time = nullptr;
+
+PerfCounter*    ClassLoader::_perf_resolve_indy_count = nullptr;
+PerfCounter*    ClassLoader::_perf_resolve_invokehandle_count = nullptr;
+PerfCounter*    ClassLoader::_perf_resolve_mh_count = nullptr;
+PerfCounter*    ClassLoader::_perf_resolve_mt_count = nullptr;
+
+void ClassLoader::print_counters(outputStream *st) {
+  // The counters are only active if the logging is enabled, but
+  // we print to the passed in outputStream as requested.
+  if (log_is_enabled(Info, perf, class, link)) {
+    st->print_cr("ClassLoader:");
+    st->print_cr("  clinit:               " JLONG_FORMAT "ms / " JLONG_FORMAT " events", ClassLoader::class_init_time_ms(), ClassLoader::class_init_count());
+    st->print_cr("  link methods:         " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_ik_link_methods_time->get_value())   , _perf_ik_link_methods_count->get_value());
+    st->print_cr("  method adapters:      " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_method_adapters_time->get_value())   , _perf_method_adapters_count->get_value());
+    st->print_cr("  resolve...");
+    st->print_cr("    invokedynamic:   " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_indy_time->get_value())         , _perf_resolve_indy_count->get_value());
+    st->print_cr("    invokehandle:    " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_invokehandle_time->get_value()) , _perf_resolve_invokehandle_count->get_value());
+    st->print_cr("    CP_MethodHandle: " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_mh_time->get_value())           , _perf_resolve_mh_count->get_value());
+    st->print_cr("    CP_MethodType:   " JLONG_FORMAT "ms / " JLONG_FORMAT " events", Management::ticks_to_ms(_perf_resolve_mt_time->get_value())           , _perf_resolve_mt_count->get_value());
+    st->cr();
+  }
+}
+
 GrowableArray<ModuleClassPathList*>* ClassLoader::_patch_mod_entries = nullptr;
 GrowableArray<ModuleClassPathList*>* ClassLoader::_exploded_entries = nullptr;
 ClassPathEntry* ClassLoader::_jrt_entry = nullptr;
@@ -438,7 +470,7 @@ bool ClassPathImageEntry::is_modules_image() const {
 void ClassLoader::exit_with_path_failure(const char* error, const char* message) {
   assert(CDSConfig::is_dumping_archive(), "sanity");
   tty->print_cr("Hint: enable -Xlog:class+path=info to diagnose the failure");
-  vm_exit_during_initialization(error, message);
+  vm_exit_during_cds_dumping(error, message);
 }
 #endif
 
@@ -1336,9 +1368,25 @@ void ClassLoader::initialize(TRAPS) {
     NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self");
     NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes");
     NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes");
-
     NEWPERFEVENTCOUNTER(_unsafe_defineClassCallCounter, SUN_CLS, "unsafeDefineClassCalls");
     NEWPERFTICKCOUNTER(_perf_secondary_hash_time, SUN_CLS, "secondarySuperHashTime");
+
+    if (log_is_enabled(Info, perf, class, link)) {
+      NEWPERFTICKCOUNTER(_perf_ik_link_methods_time, SUN_CLS, "linkMethodsTime");
+      NEWPERFTICKCOUNTER(_perf_method_adapters_time, SUN_CLS, "makeAdaptersTime");
+      NEWPERFEVENTCOUNTER(_perf_ik_link_methods_count, SUN_CLS, "linkMethodsCount");
+      NEWPERFEVENTCOUNTER(_perf_method_adapters_count, SUN_CLS, "makeAdaptersCount");
+
+      NEWPERFTICKCOUNTER(_perf_resolve_indy_time, SUN_CLS, "resolve_invokedynamic_time");
+      NEWPERFTICKCOUNTER(_perf_resolve_invokehandle_time, SUN_CLS, "resolve_invokehandle_time");
+      NEWPERFTICKCOUNTER(_perf_resolve_mh_time, SUN_CLS, "resolve_MethodHandle_time");
+      NEWPERFTICKCOUNTER(_perf_resolve_mt_time, SUN_CLS, "resolve_MethodType_time");
+
+      NEWPERFEVENTCOUNTER(_perf_resolve_indy_count, SUN_CLS, "resolve_invokedynamic_count");
+      NEWPERFEVENTCOUNTER(_perf_resolve_invokehandle_count, SUN_CLS, "resolve_invokehandle_count");
+      NEWPERFEVENTCOUNTER(_perf_resolve_mh_count, SUN_CLS, "resolve_MethodHandle_count");
+      NEWPERFEVENTCOUNTER(_perf_resolve_mt_count, SUN_CLS, "resolve_MethodType_count");
+    }
   }
 
   // lookup java library entry points
diff --git a/src/hotspot/share/classfile/classLoader.hpp b/src/hotspot/share/classfile/classLoader.hpp
index d3ca476ac95..af625082dda 100644
--- a/src/hotspot/share/classfile/classLoader.hpp
+++ b/src/hotspot/share/classfile/classLoader.hpp
@@ -30,6 +30,7 @@
 #include "runtime/perfDataTypes.hpp"
 #include "utilities/exceptions.hpp"
 #include "utilities/macros.hpp"
+#include "utilities/ostream.hpp"
 #include "utilities/zipLibrary.hpp"
 
 // The VM class loader.
@@ -166,6 +167,20 @@ class ClassLoader: AllStatic {
   static PerfCounter* _perf_define_appclass_selftime;
   static PerfCounter* _perf_app_classfile_bytes_read;
   static PerfCounter* _perf_sys_classfile_bytes_read;
+  static PerfCounter* _perf_ik_link_methods_time;
+  static PerfCounter* _perf_method_adapters_time;
+  static PerfCounter* _perf_ik_link_methods_count;
+  static PerfCounter* _perf_method_adapters_count;
+
+  static PerfCounter* _perf_resolve_indy_time;
+  static PerfCounter* _perf_resolve_invokehandle_time;
+  static PerfCounter* _perf_resolve_mh_time;
+  static PerfCounter* _perf_resolve_mt_time;
+
+  static PerfCounter* _perf_resolve_indy_count;
+  static PerfCounter* _perf_resolve_invokehandle_count;
+  static PerfCounter* _perf_resolve_mh_count;
+  static PerfCounter* _perf_resolve_mt_count;
 
   static PerfCounter* _unsafe_defineClassCallCounter;
 
@@ -285,6 +300,23 @@ class ClassLoader: AllStatic {
   static PerfCounter* perf_app_classfile_bytes_read() { return _perf_app_classfile_bytes_read; }
   static PerfCounter* perf_sys_classfile_bytes_read() { return _perf_sys_classfile_bytes_read; }
 
+  static PerfCounter* perf_ik_link_methods_time() { return _perf_ik_link_methods_time; }
+  static PerfCounter* perf_method_adapters_time() { return _perf_method_adapters_time; }
+  static PerfCounter* perf_ik_link_methods_count() { return _perf_ik_link_methods_count; }
+  static PerfCounter* perf_method_adapters_count() { return _perf_method_adapters_count; }
+
+  static PerfCounter* perf_resolve_invokedynamic_time() { return _perf_resolve_indy_time; }
+  static PerfCounter* perf_resolve_invokehandle_time() { return _perf_resolve_invokehandle_time; }
+  static PerfCounter* perf_resolve_method_handle_time() { return _perf_resolve_mh_time; }
+  static PerfCounter* perf_resolve_method_type_time() { return _perf_resolve_mt_time; }
+
+  static PerfCounter* perf_resolve_invokedynamic_count() { return _perf_resolve_indy_count; }
+  static PerfCounter* perf_resolve_invokehandle_count() { return _perf_resolve_invokehandle_count; }
+  static PerfCounter* perf_resolve_method_handle_count() { return _perf_resolve_mh_count; }
+  static PerfCounter* perf_resolve_method_type_count() { return _perf_resolve_mt_count; }
+
+  static void print_counters(outputStream *st);
+
   // Record how many calls to Unsafe_DefineClass
   static PerfCounter* unsafe_defineClassCallCounter() {
     return _unsafe_defineClassCallCounter;
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index 16837da9cf2..de4490e73f3 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -202,9 +202,9 @@ OopHandle ClassLoaderData::ChunkedHandleList::add(oop o) {
 
 int ClassLoaderData::ChunkedHandleList::count() const {
   int count = 0;
-  Chunk* chunk = _head;
+  Chunk* chunk = Atomic::load_acquire(&_head);
   while (chunk != nullptr) {
-    count += chunk->_size;
+    count += Atomic::load(&chunk->_size);
     chunk = chunk->_next;
   }
   return count;
@@ -258,9 +258,9 @@ bool ClassLoaderData::ChunkedHandleList::contains(oop p) {
 
 #ifndef PRODUCT
 bool ClassLoaderData::ChunkedHandleList::owner_of(oop* oop_handle) {
-  Chunk* chunk = _head;
+  Chunk* chunk = Atomic::load_acquire(&_head);
   while (chunk != nullptr) {
-    if (&(chunk->_data[0]) <= oop_handle && oop_handle < &(chunk->_data[chunk->_size])) {
+    if (&(chunk->_data[0]) <= oop_handle && oop_handle < &(chunk->_data[Atomic::load(&chunk->_size)])) {
       return true;
     }
     chunk = chunk->_next;
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
index 2046286651e..adec6dbdeee 100644
--- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
@@ -241,9 +241,14 @@ LockedClassesDo::~LockedClassesDo() {
 
 
 // Iterating over the CLDG needs to be locked because
-// unloading can remove entries concurrently soon.
-template <bool keep_alive = true>
-class ClassLoaderDataGraphIteratorBase : public StackObj {
+// unloading can remove entries concurrently.
+// This iterator does not keep the CLD alive.
+// Any CLD OopHandles (modules, mirrors, resolved refs)
+// resolved must be treated as no keepalive. And requires
+// that its CLD's holder is kept alive if they escape the
+// caller's safepoint or ClassLoaderDataGraph_lock
+// critical section.
+class ClassLoaderDataGraph::ClassLoaderDataGraphIterator : public StackObj {
   ClassLoaderData* _next;
   Thread*          _thread;
   HandleMark       _hm;  // clean up handles when this is done.
@@ -251,12 +256,8 @@ class ClassLoaderDataGraphIteratorBase : public StackObj {
                             // unless verifying at a safepoint.
 
 public:
-  ClassLoaderDataGraphIteratorBase() : _next(ClassLoaderDataGraph::_head), _thread(Thread::current()), _hm(_thread) {
-    if (keep_alive) {
-      assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
-    } else {
-      assert_at_safepoint();
-    }
+  ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head), _thread(Thread::current()), _hm(_thread) {
+    assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
   }
 
   ClassLoaderData* get_next() {
@@ -266,10 +267,6 @@ class ClassLoaderDataGraphIteratorBase : public StackObj {
       cld = cld->next();
     }
     if (cld != nullptr) {
-      if (keep_alive) {
-        // Keep cld that is being returned alive.
-        Handle(_thread, cld->holder());
-      }
       _next = cld->next();
     } else {
       _next = nullptr;
@@ -278,9 +275,6 @@ class ClassLoaderDataGraphIteratorBase : public StackObj {
   }
 };
 
-using ClassLoaderDataGraphIterator = ClassLoaderDataGraphIteratorBase<true /* keep_alive */>;
-using ClassLoaderDataGraphIteratorNoKeepAlive = ClassLoaderDataGraphIteratorBase<false /* keep_alive */>;
-
 void ClassLoaderDataGraph::loaded_cld_do(CLDClosure* cl) {
   ClassLoaderDataGraphIterator iter;
   while (ClassLoaderData* cld = iter.get_next()) {
@@ -288,13 +282,6 @@ void ClassLoaderDataGraph::loaded_cld_do(CLDClosure* cl) {
   }
 }
 
-void ClassLoaderDataGraph::loaded_cld_do_no_keepalive(CLDClosure* cl) {
-  ClassLoaderDataGraphIteratorNoKeepAlive iter;
-  while (ClassLoaderData* cld = iter.get_next()) {
-    cl->do_cld(cld);
-  }
-}
-
 // These functions assume that the caller has locked the ClassLoaderDataGraph_lock
 // if they are not calling the function from a safepoint.
 void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
@@ -318,6 +305,16 @@ void ClassLoaderDataGraph::methods_do(void f(Method*)) {
   }
 }
 
+void ClassLoaderDataGraph::modules_do_keepalive(void f(ModuleEntry*)) {
+  assert_locked_or_safepoint(Module_lock);
+  ClassLoaderDataGraphIterator iter;
+  while (ClassLoaderData* cld = iter.get_next()) {
+    // Keep the holder alive.
+    (void)cld->holder();
+    cld->modules_do(f);
+  }
+}
+
 void ClassLoaderDataGraph::modules_do(void f(ModuleEntry*)) {
   assert_locked_or_safepoint(Module_lock);
   ClassLoaderDataGraphIterator iter;
@@ -334,9 +331,11 @@ void ClassLoaderDataGraph::packages_do(void f(PackageEntry*)) {
   }
 }
 
-void ClassLoaderDataGraph::loaded_classes_do(KlassClosure* klass_closure) {
+void ClassLoaderDataGraph::loaded_classes_do_keepalive(KlassClosure* klass_closure) {
   ClassLoaderDataGraphIterator iter;
   while (ClassLoaderData* cld = iter.get_next()) {
+    // Keep the holder alive.
+    (void)cld->holder();
     cld->loaded_classes_do(klass_closure);
   }
 }
@@ -346,7 +345,7 @@ void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) {
 }
 
 void ClassLoaderDataGraph::verify_dictionary() {
-  ClassLoaderDataGraphIteratorNoKeepAlive iter;
+  ClassLoaderDataGraphIterator iter;
   while (ClassLoaderData* cld = iter.get_next()) {
     if (cld->dictionary() != nullptr) {
       cld->dictionary()->verify();
@@ -354,26 +353,28 @@ void ClassLoaderDataGraph::verify_dictionary() {
   }
 }
 
-#define FOR_ALL_DICTIONARY(X)   ClassLoaderDataGraphIterator iter; \
-                                while (ClassLoaderData* X = iter.get_next()) \
-                                  if (X->dictionary() != nullptr)
-
 void ClassLoaderDataGraph::print_dictionary(outputStream* st) {
-  FOR_ALL_DICTIONARY(cld) {
-    st->print("Dictionary for ");
-    cld->print_value_on(st);
-    st->cr();
-    cld->dictionary()->print_on(st);
-    st->cr();
+  ClassLoaderDataGraphIterator iter;
+  while (ClassLoaderData *cld = iter.get_next()) {
+    if (cld->dictionary() != nullptr) {
+      st->print("Dictionary for ");
+      cld->print_value_on(st);
+      st->cr();
+      cld->dictionary()->print_on(st);
+      st->cr();
+    }
   }
 }
 
 void ClassLoaderDataGraph::print_table_statistics(outputStream* st) {
-  FOR_ALL_DICTIONARY(cld) {
-    ResourceMark rm; // loader_name_and_id
-    stringStream tempst;
-    tempst.print("System Dictionary for %s class loader", cld->loader_name_and_id());
-    cld->dictionary()->print_table_statistics(st, tempst.freeze());
+  ClassLoaderDataGraphIterator iter;
+  while (ClassLoaderData *cld = iter.get_next()) {
+    if (cld->dictionary() != nullptr) {
+      ResourceMark rm; // loader_name_and_id
+      stringStream tempst;
+      tempst.print("System Dictionary for %s class loader", cld->loader_name_and_id());
+      cld->dictionary()->print_table_statistics(st, tempst.freeze());
+    }
   }
 }
 
@@ -550,7 +551,7 @@ Klass* ClassLoaderDataGraphKlassIteratorAtomic::next_klass() {
 }
 
 void ClassLoaderDataGraph::verify() {
-  ClassLoaderDataGraphIteratorNoKeepAlive iter;
+  ClassLoaderDataGraphIterator iter;
   while (ClassLoaderData* cld = iter.get_next()) {
     cld->verify();
   }
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.hpp b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
index 3de2c10850e..a79c6e21089 100644
--- a/src/hotspot/share/classfile/classLoaderDataGraph.hpp
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
@@ -37,10 +37,10 @@ class ClassLoaderDataGraph : public AllStatic {
   friend class ClassLoaderDataGraphMetaspaceIterator;
   friend class ClassLoaderDataGraphKlassIteratorAtomic;
   friend class ClassLoaderDataGraphKlassIteratorStatic;
-  template <bool keep_alive>
-  friend class ClassLoaderDataGraphIteratorBase;
   friend class VMStructs;
  private:
+  class ClassLoaderDataGraphIterator;
+
   // All CLDs (except unlinked CLDs) can be reached by walking _head->_next->...
   static ClassLoaderData* volatile _head;
 
@@ -71,8 +71,12 @@ class ClassLoaderDataGraph : public AllStatic {
   static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
   static void always_strong_cld_do(CLDClosure* cl);
   // Iteration through CLDG not by GC.
+  // All the do suffixed functions do not keep the CLD alive. Any CLD OopHandles
+  // (modules, mirrors, resolved refs) resolved must be treated as no keepalive.
+  // And requires that its CLD's holder is kept alive if they escape the
+  // caller's safepoint or ClassLoaderDataGraph_lock critical section.
+  // The do_keepalive suffixed functions will keep all CLDs alive.
   static void loaded_cld_do(CLDClosure* cl);
-  static void loaded_cld_do_no_keepalive(CLDClosure* cl);
   // klass do
   // Walking classes through the ClassLoaderDataGraph include array classes.  It also includes
   // classes that are allocated but not loaded, classes that have errors, and scratch classes
@@ -81,9 +85,10 @@ class ClassLoaderDataGraph : public AllStatic {
   static void classes_do(KlassClosure* klass_closure);
   static void classes_do(void f(Klass* const));
   static void methods_do(void f(Method*));
+  static void modules_do_keepalive(void f(ModuleEntry*));
   static void modules_do(void f(ModuleEntry*));
   static void packages_do(void f(PackageEntry*));
-  static void loaded_classes_do(KlassClosure* klass_closure);
+  static void loaded_classes_do_keepalive(KlassClosure* klass_closure);
   static void classes_unloading_do(void f(Klass* const));
   static bool do_unloading();
 
diff --git a/src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp b/src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp
index f89090fbb5c..8a8113db403 100644
--- a/src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp
+++ b/src/hotspot/share/classfile/classLoaderHierarchyDCmd.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -39,7 +39,7 @@ ClassLoaderHierarchyDCmd::ClassLoaderHierarchyDCmd(outputStream* output, bool he
   : DCmdWithParser(output, heap),
    _show_classes("show-classes", "Print loaded classes.", "BOOLEAN", false, "false"),
   _verbose("verbose", "Print detailed information.", "BOOLEAN", false, "false"),
-  _fold("fold", "Show loaders of the same name and class as one.", "BOOLEAN", true, "true") {
+  _fold("fold", "Show loaders of the same name and class as one.", "BOOLEAN", false, "true") {
   _dcmdparser.add_dcmd_option(&_show_classes);
   _dcmdparser.add_dcmd_option(&_verbose);
   _dcmdparser.add_dcmd_option(&_fold);
diff --git a/src/hotspot/share/classfile/classLoaderStats.cpp b/src/hotspot/share/classfile/classLoaderStats.cpp
index f09d9968137..6bb49c3a853 100644
--- a/src/hotspot/share/classfile/classLoaderStats.cpp
+++ b/src/hotspot/share/classfile/classLoaderStats.cpp
@@ -165,7 +165,7 @@ void ClassLoaderStatsClosure::addEmptyParents(oop cl) {
 
 void ClassLoaderStatsVMOperation::doit() {
   ClassLoaderStatsClosure clsc (_out);
-  ClassLoaderDataGraph::loaded_cld_do_no_keepalive(&clsc);
+  ClassLoaderDataGraph::loaded_cld_do(&clsc);
   clsc.print();
 }
 
diff --git a/src/hotspot/share/classfile/fieldLayoutBuilder.cpp b/src/hotspot/share/classfile/fieldLayoutBuilder.cpp
index c77016d74aa..f9353465ca7 100644
--- a/src/hotspot/share/classfile/fieldLayoutBuilder.cpp
+++ b/src/hotspot/share/classfile/fieldLayoutBuilder.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -137,7 +137,7 @@ void FieldLayout::initialize_instance_layout(const InstanceKlass* super_klass) {
   } else {
     bool has_fields = reconstruct_layout(super_klass);
     fill_holes(super_klass);
-    if ((UseEmptySlotsInSupers && !super_klass->has_contended_annotations()) || !has_fields) {
+    if (!super_klass->has_contended_annotations() || !has_fields) {
       _start = _blocks;  // start allocating fields from the first empty block
     } else {
       _start = _last;    // append fields at the end of the reconstructed layout
@@ -364,20 +364,6 @@ void FieldLayout::fill_holes(const InstanceKlass* super_klass) {
     b = p;
   }
 
-  if (!UseEmptySlotsInSupers) {
-    // Add an empty slots to align fields of the subclass on a heapOopSize boundary
-    // in order to emulate the behavior of the previous algorithm
-    int align = (b->offset() + b->size()) % heapOopSize;
-    if (align != 0) {
-      int sz = heapOopSize - align;
-      LayoutRawBlock* p = new LayoutRawBlock(LayoutRawBlock::EMPTY, sz);
-      p->set_offset(b->offset() + b->size());
-      b->set_next_block(p);
-      p->set_prev_block(b);
-      b = p;
-    }
-  }
-
   LayoutRawBlock* last = new LayoutRawBlock(LayoutRawBlock::EMPTY, INT_MAX);
   last->set_offset(b->offset() + b->size());
   assert(last->offset() > 0, "Sanity check");
diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp
index 5a3fe239324..4d3aac1598e 100644
--- a/src/hotspot/share/classfile/javaClasses.cpp
+++ b/src/hotspot/share/classfile/javaClasses.cpp
@@ -788,6 +788,7 @@ int java_lang_Class::_class_loader_offset;
 int java_lang_Class::_module_offset;
 int java_lang_Class::_protection_domain_offset;
 int java_lang_Class::_component_mirror_offset;
+int java_lang_Class::_init_lock_offset;
 int java_lang_Class::_signers_offset;
 int java_lang_Class::_name_offset;
 int java_lang_Class::_source_file_offset;
@@ -911,6 +912,12 @@ void java_lang_Class::initialize_mirror_fields(Klass* k,
                                                Handle protection_domain,
                                                Handle classData,
                                                TRAPS) {
+  // Allocate a simple java object for a lock.
+  // This needs to be a java object because during class initialization
+  // it can be held across a java call.
+  typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK);
+  set_init_lock(mirror(), r);
+
   // Set protection domain also
   set_protection_domain(mirror(), protection_domain());
 
@@ -1132,6 +1139,10 @@ bool java_lang_Class::restore_archived_mirror(Klass *k,
   if (!k->is_array_klass()) {
     // - local static final fields with initial values were initialized at dump time
 
+    // create the init_lock
+    typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_(false));
+    set_init_lock(mirror(), r);
+
     if (protection_domain.not_null()) {
       set_protection_domain(mirror(), protection_domain());
     }
@@ -1196,6 +1207,15 @@ oop java_lang_Class::component_mirror(oop java_class) {
   return java_class->obj_field(_component_mirror_offset);
 }
 
+oop java_lang_Class::init_lock(oop java_class) {
+  assert(_init_lock_offset != 0, "must be set");
+  return java_class->obj_field(_init_lock_offset);
+}
+void java_lang_Class::set_init_lock(oop java_class, oop init_lock) {
+  assert(_init_lock_offset != 0, "must be set");
+  java_class->obj_field_put(_init_lock_offset, init_lock);
+}
+
 objArrayOop java_lang_Class::signers(oop java_class) {
   assert(_signers_offset != 0, "must be set");
   return (objArrayOop)java_class->obj_field(_signers_offset);
@@ -1415,12 +1435,18 @@ void java_lang_Class::compute_offsets() {
   InstanceKlass* k = vmClasses::Class_klass();
   CLASS_FIELDS_DO(FIELD_COMPUTE_OFFSET);
 
+  // Init lock is a C union with component_mirror.  Only instanceKlass mirrors have
+  // init_lock and only ArrayKlass mirrors have component_mirror.  Since both are oops
+  // GC treats them the same.
+  _init_lock_offset = _component_mirror_offset;
+
   CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
 }
 
 #if INCLUDE_CDS
 void java_lang_Class::serialize_offsets(SerializeClosure* f) {
   f->do_bool(&_offsets_computed);
+  f->do_u4((u4*)&_init_lock_offset);
 
   CLASS_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
 
diff --git a/src/hotspot/share/classfile/javaClasses.hpp b/src/hotspot/share/classfile/javaClasses.hpp
index e3bb453ae0a..90095545110 100644
--- a/src/hotspot/share/classfile/javaClasses.hpp
+++ b/src/hotspot/share/classfile/javaClasses.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -226,6 +226,7 @@ class java_lang_Class : AllStatic {
   static int _static_oop_field_count_offset;
 
   static int _protection_domain_offset;
+  static int _init_lock_offset;
   static int _signers_offset;
   static int _class_loader_offset;
   static int _module_offset;
@@ -240,6 +241,7 @@ class java_lang_Class : AllStatic {
   static GrowableArray<Klass*>* _fixup_mirror_list;
   static GrowableArray<Klass*>* _fixup_module_field_list;
 
+  static void set_init_lock(oop java_class, oop init_lock);
   static void set_protection_domain(oop java_class, oop protection_domain);
   static void set_class_loader(oop java_class, oop class_loader);
   static void set_component_mirror(oop java_class, oop comp_mirror);
@@ -292,6 +294,10 @@ class java_lang_Class : AllStatic {
 
   // Support for embedded per-class oops
   static oop  protection_domain(oop java_class);
+  static oop  init_lock(oop java_class);
+  static void clear_init_lock(oop java_class) {
+    set_init_lock(java_class, nullptr);
+  }
   static oop  component_mirror(oop java_class);
   static objArrayOop  signers(oop java_class);
   static void set_signers(oop java_class, objArrayOop signers);
diff --git a/src/hotspot/share/classfile/moduleEntry.cpp b/src/hotspot/share/classfile/moduleEntry.cpp
index 78478d282c5..6c60d60d211 100644
--- a/src/hotspot/share/classfile/moduleEntry.cpp
+++ b/src/hotspot/share/classfile/moduleEntry.cpp
@@ -149,7 +149,7 @@ bool ModuleEntry::can_read(ModuleEntry* m) const {
   if (!has_reads_list()) {
     return false;
   } else {
-    return _reads->contains(m);
+    return reads()->contains(m);
   }
 }
 
@@ -164,9 +164,10 @@ void ModuleEntry::add_read(ModuleEntry* m) {
   if (m == nullptr) {
     set_can_read_all_unnamed();
   } else {
-    if (_reads == nullptr) {
+    if (reads() == nullptr) {
       // Lazily create a module's reads list
-      _reads = new (mtModule) GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, mtModule);
+      GrowableArray<ModuleEntry*>* new_reads = new (mtModule) GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, mtModule);
+      set_reads(new_reads);
     }
 
     // Determine, based on this newly established read edge to module m,
@@ -174,7 +175,7 @@ void ModuleEntry::add_read(ModuleEntry* m) {
     set_read_walk_required(m->loader_data());
 
     // Establish readability to module m
-    _reads->append_if_missing(m);
+    reads()->append_if_missing(m);
   }
 }
 
@@ -208,7 +209,7 @@ void ModuleEntry::set_is_open(bool is_open) {
 // module will return false.
 bool ModuleEntry::has_reads_list() const {
   assert_locked_or_safepoint(Module_lock);
-  return ((_reads != nullptr) && !_reads->is_empty());
+  return ((reads() != nullptr) && !reads()->is_empty());
 }
 
 // Purge dead module entries out of reads list.
@@ -227,12 +228,12 @@ void ModuleEntry::purge_reads() {
     }
 
     // Go backwards because this removes entries that are dead.
-    int len = _reads->length();
+    int len = reads()->length();
     for (int idx = len - 1; idx >= 0; idx--) {
-      ModuleEntry* module_idx = _reads->at(idx);
+      ModuleEntry* module_idx = reads()->at(idx);
       ClassLoaderData* cld_idx = module_idx->loader_data();
       if (cld_idx->is_unloading()) {
-        _reads->delete_at(idx);
+        reads()->delete_at(idx);
       } else {
         // Update the need to walk this module's reads based on live modules
         set_read_walk_required(cld_idx);
@@ -246,15 +247,15 @@ void ModuleEntry::module_reads_do(ModuleClosure* f) {
   assert(f != nullptr, "invariant");
 
   if (has_reads_list()) {
-    int reads_len = _reads->length();
-    for (int i = 0; i < reads_len; ++i) {
-      f->do_module(_reads->at(i));
+    int reads_len = reads()->length();
+    for (ModuleEntry* m : *reads()) {
+      f->do_module(m);
     }
   }
 }
 
 void ModuleEntry::delete_reads() {
-  delete _reads;
+  delete reads();
   _reads = nullptr;
 }
 
@@ -272,7 +273,8 @@ ModuleEntry::ModuleEntry(Handle module_handle,
     _has_default_read_edges(false),
     _must_walk_reads(false),
     _is_open(is_open),
-    _is_patched(false) {
+    _is_patched(false)
+    DEBUG_ONLY(COMMA _reads_is_archived(false)) {
 
   // Initialize fields specific to a ModuleEntry
   if (_name == nullptr) {
@@ -466,7 +468,7 @@ void ModuleEntry::iterate_symbols(MetaspaceClosure* closure) {
 }
 
 void ModuleEntry::init_as_archived_entry() {
-  Array<ModuleEntry*>* archived_reads = write_growable_array(_reads);
+  set_archived_reads(write_growable_array(reads()));
 
   _loader_data = nullptr;  // re-init at runtime
   _shared_path_index = FileMapInfo::get_module_shared_path_index(_location);
@@ -474,7 +476,6 @@ void ModuleEntry::init_as_archived_entry() {
     _name = ArchiveBuilder::get_buffered_symbol(_name);
     ArchivePtrMarker::mark_pointer((address*)&_name);
   }
-  _reads = (GrowableArray<ModuleEntry*>*)archived_reads;
   if (_version != nullptr) {
     _version = ArchiveBuilder::get_buffered_symbol(_version);
   }
@@ -515,7 +516,7 @@ void ModuleEntry::verify_archived_module_entries() {
 void ModuleEntry::load_from_archive(ClassLoaderData* loader_data) {
   assert(CDSConfig::is_using_archive(), "runtime only");
   set_loader_data(loader_data);
-  _reads = restore_growable_array((Array<ModuleEntry*>*)_reads);
+  set_reads(restore_growable_array(archived_reads()));
   JFR_ONLY(INIT_ID(this);)
 }
 
@@ -567,7 +568,7 @@ Array<ModuleEntry*>* ModuleEntryTable::allocate_archived_entries() {
 
   if (n > 1) {
     // Always allocate in the same order to produce deterministic archive.
-    QuickSort::sort(archived_modules->data(), n, (_sort_Fn)compare_module_by_name, true);
+    QuickSort::sort(archived_modules->data(), n, compare_module_by_name);
   }
   for (int i = 0; i < n; i++) {
     archived_modules->at_put(i, archived_modules->at(i)->allocate_archived_entry());
diff --git a/src/hotspot/share/classfile/moduleEntry.hpp b/src/hotspot/share/classfile/moduleEntry.hpp
index 62a0ba2a0b7..48adc41eddc 100644
--- a/src/hotspot/share/classfile/moduleEntry.hpp
+++ b/src/hotspot/share/classfile/moduleEntry.hpp
@@ -68,7 +68,11 @@ class ModuleEntry : public CHeapObj<mtModule> {
                                        // for shared classes from this module
   Symbol*          _name;              // name of this module
   ClassLoaderData* _loader_data;
-  GrowableArray<ModuleEntry*>* _reads; // list of modules that are readable by this module
+
+  union {
+    GrowableArray<ModuleEntry*>* _reads;  // list of modules that are readable by this module
+    Array<ModuleEntry*>* _archived_reads; // List of readable modules stored in the CDS archive
+  };
   Symbol* _version;                    // module version number
   Symbol* _location;                   // module location
   CDS_ONLY(int _shared_path_index;)    // >=0 if classes in this module are in CDS archive
@@ -77,6 +81,7 @@ class ModuleEntry : public CHeapObj<mtModule> {
   bool _must_walk_reads;               // walk module's reads list at GC safepoints to purge out dead modules
   bool _is_open;                       // whether the packages in the module are all unqualifiedly exported
   bool _is_patched;                    // whether the module is patched via --patch-module
+  DEBUG_ONLY(bool _reads_is_archived);
   CDS_JAVA_HEAP_ONLY(int _archived_module_index;)
 
   JFR_ONLY(DEFINE_TRACE_ID_FIELD;)
@@ -115,6 +120,22 @@ class ModuleEntry : public CHeapObj<mtModule> {
 
   bool             can_read(ModuleEntry* m) const;
   bool             has_reads_list() const;
+  GrowableArray<ModuleEntry*>* reads() const {
+    assert(!_reads_is_archived, "sanity");
+    return _reads;
+  }
+  void set_reads(GrowableArray<ModuleEntry*>* r) {
+    _reads = r;
+    DEBUG_ONLY(_reads_is_archived = false);
+  }
+  Array<ModuleEntry*>* archived_reads() const {
+    assert(_reads_is_archived, "sanity");
+    return _archived_reads;
+  }
+  void set_archived_reads(Array<ModuleEntry*>* r) {
+    _archived_reads = r;
+    DEBUG_ONLY(_reads_is_archived = true);
+  }
   void             add_read(ModuleEntry* m);
   void             set_read_walk_required(ClassLoaderData* m_loader_data);
 
diff --git a/src/hotspot/share/classfile/packageEntry.cpp b/src/hotspot/share/classfile/packageEntry.cpp
index c6236e51c0a..052960e1735 100644
--- a/src/hotspot/share/classfile/packageEntry.cpp
+++ b/src/hotspot/share/classfile/packageEntry.cpp
@@ -300,7 +300,8 @@ Array<PackageEntry*>* PackageEntryTable::allocate_archived_entries() {
   _table.iterate_all(grab);
 
   if (n > 1) {
-    QuickSort::sort(archived_packages->data(), n, (_sort_Fn)compare_package_by_name, true);
+    // Always allocate in the same order to produce deterministic archive.
+    QuickSort::sort(archived_packages->data(), n, compare_package_by_name);
   }
   for (int i = 0; i < n; i++) {
     archived_packages->at_put(i, archived_packages->at(i)->allocate_archived_entry());
diff --git a/src/hotspot/share/classfile/symbolTable.cpp b/src/hotspot/share/classfile/symbolTable.cpp
index 1fbc49947bf..f680939682a 100644
--- a/src/hotspot/share/classfile/symbolTable.cpp
+++ b/src/hotspot/share/classfile/symbolTable.cpp
@@ -172,7 +172,7 @@ class SymbolTableConfig : public AllStatic {
       // Deleting permanent symbol should not occur very often (insert race condition),
       // so log it.
       log_trace_symboltable_helper(&value, "Freeing permanent symbol");
-      size_t alloc_size = _local_table->get_node_size() + value.byte_size() + value.effective_length();
+      size_t alloc_size = SymbolTableHash::get_dynamic_node_size(value.byte_size());
       if (!SymbolTable::arena()->Afree(memory, alloc_size)) {
         log_trace_symboltable_helper(&value, "Leaked permanent symbol");
       }
@@ -182,7 +182,7 @@ class SymbolTableConfig : public AllStatic {
 
 private:
   static void* allocate_node_impl(size_t size, Value const& value) {
-    size_t alloc_size = size + value.byte_size() + value.effective_length();
+    size_t alloc_size = SymbolTableHash::get_dynamic_node_size(value.byte_size());
 #if INCLUDE_CDS
     if (CDSConfig::is_dumping_static_archive()) {
       MutexLocker ml(DumpRegion_lock, Mutex::_no_safepoint_check_flag);
diff --git a/src/hotspot/share/classfile/systemDictionary.hpp b/src/hotspot/share/classfile/systemDictionary.hpp
index 9f65cb593d3..6355de9c4ce 100644
--- a/src/hotspot/share/classfile/systemDictionary.hpp
+++ b/src/hotspot/share/classfile/systemDictionary.hpp
@@ -177,7 +177,7 @@ class SystemDictionary : AllStatic {
 
   static void classes_do(MetaspaceClosure* it);
   // Iterate over all methods in all klasses
-
+  // Will not keep metadata alive. See ClassLoaderDataGraph::methods_do.
   static void methods_do(void f(Method*));
 
   // Garbage collection support
diff --git a/src/hotspot/share/classfile/vmIntrinsics.hpp b/src/hotspot/share/classfile/vmIntrinsics.hpp
index b8d8c40cc47..7a5c2ee47bb 100644
--- a/src/hotspot/share/classfile/vmIntrinsics.hpp
+++ b/src/hotspot/share/classfile/vmIntrinsics.hpp
@@ -529,8 +529,8 @@ class methodHandle;
   /* support for sun.security.util.math.intpoly.MontgomeryIntegerPolynomialP256 */                                      \
   do_class(sun_security_util_math_intpoly_MontgomeryIntegerPolynomialP256, "sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256")  \
   do_intrinsic(_intpoly_montgomeryMult_P256, sun_security_util_math_intpoly_MontgomeryIntegerPolynomialP256, intPolyMult_name, intPolyMult_signature, F_R) \
-  do_name(intPolyMult_name, "mult")                                                                                     \
-  do_signature(intPolyMult_signature, "([J[J[J)I")                                                                      \
+  do_name(intPolyMult_name, "multImpl")                                                                                     \
+  do_signature(intPolyMult_signature, "([J[J[J)V")                                                                      \
                                                                                                                         \
   do_class(sun_security_util_math_intpoly_IntegerPolynomial, "sun/security/util/math/intpoly/IntegerPolynomial")        \
   do_intrinsic(_intpoly_assign, sun_security_util_math_intpoly_IntegerPolynomial, intPolyAssign_name, intPolyAssign_signature, F_S) \
diff --git a/src/hotspot/share/classfile/vmSymbols.hpp b/src/hotspot/share/classfile/vmSymbols.hpp
index 39340243bc4..8d1ae20eac0 100644
--- a/src/hotspot/share/classfile/vmSymbols.hpp
+++ b/src/hotspot/share/classfile/vmSymbols.hpp
@@ -557,6 +557,7 @@ class SerializeClosure;
   template(bool_array_signature,                      "[Z")                                       \
   template(byte_array_signature,                      "[B")                                       \
   template(char_array_signature,                      "[C")                                       \
+  template(int_array_signature,                       "[I")                                       \
   template(runnable_signature,                        "Ljava/lang/Runnable;")                     \
   template(continuation_signature,                    "Ljdk/internal/vm/Continuation;")           \
   template(continuationscope_signature,               "Ljdk/internal/vm/ContinuationScope;")      \
diff --git a/src/hotspot/share/code/codeCache.cpp b/src/hotspot/share/code/codeCache.cpp
index 20583ce492d..36656515942 100644
--- a/src/hotspot/share/code/codeCache.cpp
+++ b/src/hotspot/share/code/codeCache.cpp
@@ -227,6 +227,11 @@ void CodeCache::initialize_heaps() {
 
   if (!non_nmethod.set) {
     non_nmethod.size += compiler_buffer_size;
+    // Further down, just before FLAG_SET_ERGO(), all segment sizes are
+    // aligned down to the next lower multiple of min_size. For large page
+    // sizes, this may result in (non_nmethod.size == 0) which is not acceptable.
+    // Therefore, force non_nmethod.size to at least min_size.
+    non_nmethod.size = MAX2(non_nmethod.size, min_size);
   }
 
   if (!profiled.set && !non_profiled.set) {
diff --git a/src/hotspot/share/code/dependencies.cpp b/src/hotspot/share/code/dependencies.cpp
index 26e53ed9027..7d3b744313f 100644
--- a/src/hotspot/share/code/dependencies.cpp
+++ b/src/hotspot/share/code/dependencies.cpp
@@ -113,11 +113,7 @@ void Dependencies::assert_unique_concrete_method(ciKlass* ctxk, ciMethod* uniqm)
 void Dependencies::assert_unique_concrete_method(ciKlass* ctxk, ciMethod* uniqm, ciKlass* resolved_klass, ciMethod* resolved_method) {
   check_ctxk(ctxk);
   check_unique_method(ctxk, uniqm);
-  if (UseVtableBasedCHA) {
-    assert_common_4(unique_concrete_method_4, ctxk, uniqm, resolved_klass, resolved_method);
-  } else {
-    assert_common_2(unique_concrete_method_2, ctxk, uniqm);
-  }
+  assert_common_4(unique_concrete_method_4, ctxk, uniqm, resolved_klass, resolved_method);
 }
 
 void Dependencies::assert_unique_implementor(ciInstanceKlass* ctxk, ciInstanceKlass* uniqk) {
@@ -1474,7 +1470,6 @@ class LinkedConcreteMethodFinder : public AbstractClassHierarchyWalker {
   // Optionally, a method which was previously determined as a unique target (uniqm) is added as a participant
   // to enable dependency spot-checking and speed up the search.
   LinkedConcreteMethodFinder(InstanceKlass* resolved_klass, Method* resolved_method, Method* uniqm = nullptr) : AbstractClassHierarchyWalker(nullptr) {
-    assert(UseVtableBasedCHA, "required");
     assert(resolved_klass->is_linked(), "required");
     assert(resolved_method->method_holder()->is_linked(), "required");
     assert(!resolved_method->can_be_statically_bound(), "no vtable index available");
@@ -1948,7 +1943,6 @@ Klass* Dependencies::check_unique_concrete_method(InstanceKlass* ctxk,
                                                   Klass* resolved_klass,
                                                   Method* resolved_method,
                                                   KlassDepChange* changes) {
-  assert(UseVtableBasedCHA, "required");
   assert(!ctxk->is_interface() || ctxk == resolved_klass, "sanity");
   assert(!resolved_method->can_be_statically_bound() || resolved_method == uniqm, "sanity");
   assert(resolved_klass->is_subtype_of(resolved_method->method_holder()), "sanity");
@@ -2129,7 +2123,7 @@ Klass* Dependencies::DepStream::check_klass_dependency(KlassDepChange* changes)
   Dependencies::check_valid_dependency_type(type());
 
   if (changes != nullptr) {
-    if (UseVtableBasedCHA && changes->is_klass_init_change()) {
+    if (changes->is_klass_init_change()) {
       return check_klass_init_dependency(changes->as_klass_init_change());
     } else {
       return check_new_klass_dependency(changes->as_new_klass_change());
diff --git a/src/hotspot/share/code/exceptionHandlerTable.hpp b/src/hotspot/share/code/exceptionHandlerTable.hpp
index 083dc430111..9d7981f392c 100644
--- a/src/hotspot/share/code/exceptionHandlerTable.hpp
+++ b/src/hotspot/share/code/exceptionHandlerTable.hpp
@@ -148,7 +148,7 @@ class ImplicitExceptionTable {
   ReallocMark          _nesting;  // assertion check for reallocations
 
 public:
-  ImplicitExceptionTable( ) :  _size(0), _len(0), _data(0) { }
+  ImplicitExceptionTable( ) :  _size(0), _len(0), _data(nullptr) { }
   // (run-time) construction from nmethod
   ImplicitExceptionTable(const nmethod *nm);
 
diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp
index fab77fbbdb2..ea56ee61298 100644
--- a/src/hotspot/share/code/nmethod.cpp
+++ b/src/hotspot/share/code/nmethod.cpp
@@ -844,10 +844,8 @@ void nmethod::run_nmethod_entry_barrier() {
     // By calling this nmethod entry barrier, it plays along and acts
     // like any other nmethod found on the stack of a thread (fewer surprises).
     nmethod* nm = this;
-    if (bs_nm->is_armed(nm)) {
-      bool alive = bs_nm->nmethod_entry_barrier(nm);
-      assert(alive, "should be alive");
-    }
+    bool alive = bs_nm->nmethod_entry_barrier(nm);
+    assert(alive, "should be alive");
   }
 }
 
@@ -1229,9 +1227,6 @@ void nmethod::init_defaults(CodeBuffer *code_buffer, CodeOffsets* offsets) {
   _oops_do_mark_link          = nullptr;
   _compiled_ic_data           = nullptr;
 
-#if INCLUDE_RTM_OPT
-  _rtm_state                  = NoRTM;
-#endif
   _is_unloading_state         = 0;
   _state                      = not_installed;
 
@@ -3641,10 +3636,22 @@ const char* nmethod::reloc_string_for(u_char* begin, u_char* end) {
         case relocInfo::poll_type:             return "poll";
         case relocInfo::poll_return_type:      return "poll_return";
         case relocInfo::trampoline_stub_type:  return "trampoline_stub";
+        case relocInfo::entry_guard_type:      return "entry_guard";
+        case relocInfo::post_call_nop_type:    return "post_call_nop";
+        case relocInfo::barrier_type: {
+          barrier_Relocation* const reloc = iter.barrier_reloc();
+          stringStream st;
+          st.print("barrier format=%d", reloc->format());
+          return st.as_string();
+        }
+
         case relocInfo::type_mask:             return "type_bit_mask";
 
-        default:
-          break;
+        default: {
+          stringStream st;
+          st.print("unknown relocInfo=%d", (int) iter.type());
+          return st.as_string();
+        }
     }
   }
   return have_one ? "other" : nullptr;
@@ -3987,6 +3994,7 @@ void nmethod::print_statistics() {
   DebugInformationRecorder::print_statistics();
   pc_nmethod_stats.print_pc_stats();
   Dependencies::print_statistics();
+  ExternalsRecorder::print_statistics();
   if (xtty != nullptr)  xtty->tail("statistics");
 }
 
diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp
index 9972b89ae40..ee0fe004331 100644
--- a/src/hotspot/share/code/nmethod.hpp
+++ b/src/hotspot/share/code/nmethod.hpp
@@ -260,12 +260,6 @@ class nmethod : public CodeBlob {
   CompLevel    _comp_level;            // compilation level (s1)
   CompilerType _compiler_type;         // which compiler made this nmethod (u1)
 
-#if INCLUDE_RTM_OPT
-  // RTM state at compile time. Used during deoptimization to decide
-  // whether to restart collecting RTM locking abort statistic again.
-  RTMState _rtm_state;
-#endif
-
   // Local state used to keep track of whether unloading is happening or not
   volatile uint8_t _is_unloading_state;
 
@@ -629,12 +623,6 @@ class nmethod : public CodeBlob {
   bool is_unloading();
   void do_unloading(bool unloading_occurred);
 
-#if INCLUDE_RTM_OPT
-  // rtm state accessing and manipulating
-  RTMState  rtm_state() const          { return _rtm_state; }
-  void set_rtm_state(RTMState state)   { _rtm_state = state; }
-#endif
-
   bool make_in_use() {
     return try_transition(in_use);
   }
@@ -717,6 +705,7 @@ class nmethod : public CodeBlob {
 
   void copy_values(GrowableArray<jobject>* oops);
   void copy_values(GrowableArray<Metadata*>* metadata);
+  void copy_values(GrowableArray<address>* metadata) {} // Nothing to do
 
   // Relocation support
 private:
diff --git a/src/hotspot/share/code/nmethod.inline.hpp b/src/hotspot/share/code/nmethod.inline.hpp
index 4af4d3ffaed..49af1e0b95f 100644
--- a/src/hotspot/share/code/nmethod.inline.hpp
+++ b/src/hotspot/share/code/nmethod.inline.hpp
@@ -37,7 +37,7 @@ inline bool nmethod::is_deopt_pc(address pc) { return is_deopt_entry(pc) || is_d
 inline bool nmethod::is_deopt_entry(address pc) {
   return pc == deopt_handler_begin()
 #if INCLUDE_JVMCI
-    || (is_compiled_by_jvmci() && pc == (deopt_handler_begin() + NativeCall::instruction_size))
+    || (is_compiled_by_jvmci() && pc == (deopt_handler_begin() + NativeCall::byte_size()))
 #endif
     ;
 }
@@ -45,7 +45,7 @@ inline bool nmethod::is_deopt_entry(address pc) {
 inline bool nmethod::is_deopt_mh_entry(address pc) {
   return pc == deopt_mh_handler_begin()
 #if INCLUDE_JVMCI
-    || (is_compiled_by_jvmci() && pc == (deopt_mh_handler_begin() + NativeCall::instruction_size))
+    || (is_compiled_by_jvmci() && pc == (deopt_mh_handler_begin() + NativeCall::byte_size()))
 #endif
     ;
 }
diff --git a/src/hotspot/share/code/oopRecorder.cpp b/src/hotspot/share/code/oopRecorder.cpp
index bfcb4bad475..b8ecc1eccc0 100644
--- a/src/hotspot/share/code/oopRecorder.cpp
+++ b/src/hotspot/share/code/oopRecorder.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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,6 +31,7 @@
 #include "memory/allocation.inline.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/jniHandles.inline.hpp"
+#include "runtime/mutexLocker.hpp"
 #include "utilities/copy.hpp"
 
 #ifdef ASSERT
@@ -211,3 +212,46 @@ OopRecorder::OopRecorder(Arena* arena, bool deduplicate): _oops(arena), _metadat
     _object_lookup = nullptr;
   }
 }
+
+// Explicitly instantiate
+template class ValueRecorder<address>;
+
+ExternalsRecorder* ExternalsRecorder::_recorder = nullptr;
+
+ExternalsRecorder::ExternalsRecorder(): _arena(mtCode), _externals(&_arena) {}
+
+void ExternalsRecorder_init() {
+  ExternalsRecorder::initialize();
+}
+
+void ExternalsRecorder::initialize() {
+  // After Mutex and before CodeCache are initialized
+  assert(_recorder == nullptr, "should initialize only once");
+  _recorder = new ExternalsRecorder();
+}
+
+int ExternalsRecorder::find_index(address adr) {
+  MutexLocker ml(ExternalsRecorder_lock, Mutex::_no_safepoint_check_flag);
+  assert(_recorder != nullptr, "sanity");
+  return _recorder->_externals.find_index(adr);
+}
+
+address ExternalsRecorder::at(int index) {
+  // find_index() may resize array by reallocating it and freeing old,
+  // we need loock here to make sure we not accessing to old freed array.
+  MutexLocker ml(ExternalsRecorder_lock, Mutex::_no_safepoint_check_flag);
+  assert(_recorder != nullptr, "sanity");
+  return _recorder->_externals.at(index);
+}
+
+int ExternalsRecorder::count() {
+  MutexLocker ml(ExternalsRecorder_lock, Mutex::_no_safepoint_check_flag);
+  assert(_recorder != nullptr, "sanity");
+  return _recorder->_externals.count();
+}
+
+#ifndef PRODUCT
+void ExternalsRecorder::print_statistics() {
+  tty->print_cr("External addresses table: %d entries", count());
+}
+#endif
diff --git a/src/hotspot/share/code/oopRecorder.hpp b/src/hotspot/share/code/oopRecorder.hpp
index 41d2c0da591..7eded5410e3 100644
--- a/src/hotspot/share/code/oopRecorder.hpp
+++ b/src/hotspot/share/code/oopRecorder.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -133,10 +133,10 @@ template <class T> class ValueRecorder : public StackObj {
   enum { null_index = 0, first_index = 1, index_cache_threshold = 20 };
 
   GrowableArray<T>*        _handles;  // ordered list (first is always nullptr)
-  GrowableArray<int>*       _no_finds; // all unfindable indexes; usually empty
+  GrowableArray<int>*      _no_finds; // all unfindable indexes; usually empty
   IndexCache<T>*           _indexes;  // map: handle -> its probable index
-  Arena*                    _arena;
-  bool                      _complete;
+  Arena*                   _arena;
+  bool                     _complete;
 
 #ifdef ASSERT
   static int _find_index_calls, _hit_indexes, _missed_indexes;
@@ -186,7 +186,7 @@ class OopRecorder : public ResourceObj {
   int allocate_oop_index(jobject h) {
     return _oops.allocate_index(h);
   }
-  virtual int find_index(jobject h) {
+  int find_index(jobject h) {
     return _object_lookup != nullptr ? _object_lookup->find_index(h, this) : _oops.find_index(h);
   }
   jobject oop_at(int index) {
@@ -203,7 +203,7 @@ class OopRecorder : public ResourceObj {
   int allocate_metadata_index(Metadata* oop) {
     return _metadata.allocate_index(oop);
   }
-  virtual int find_index(Metadata* h) {
+  int find_index(Metadata* h) {
     return _metadata.find_index(h);
   }
   Metadata* metadata_at(int index) {
@@ -243,5 +243,20 @@ class OopRecorder : public ResourceObj {
 #endif
 };
 
+// Class is used to record and retrive external addresses
+// for Relocation info in compiled code and stubs.
+class ExternalsRecorder : public CHeapObj<mtCode> {
+ private:
+  Arena  _arena;
+  ValueRecorder<address> _externals;
+  static ExternalsRecorder* _recorder;
+  ExternalsRecorder();
+ public:
+  static void initialize();
+  static int find_index(address adr);
+  static address at(int index);
+  static int count();
+  static void print_statistics() PRODUCT_RETURN;
+};
 
 #endif // SHARE_CODE_OOPRECORDER_HPP
diff --git a/src/hotspot/share/code/relocInfo.cpp b/src/hotspot/share/code/relocInfo.cpp
index 5527436413c..3b19b63f244 100644
--- a/src/hotspot/share/code/relocInfo.cpp
+++ b/src/hotspot/share/code/relocInfo.cpp
@@ -454,27 +454,15 @@ void trampoline_stub_Relocation::unpack_data() {
 
 void external_word_Relocation::pack_data_to(CodeSection* dest) {
   short* p = (short*) dest->locs_end();
-#ifndef _LP64
-  p = pack_1_int_to(p, (int32_t) (intptr_t)_target);
-#else
-  jlong t = (jlong) _target;
-  int32_t lo = low(t);
-  int32_t hi = high(t);
-  p = pack_2_ints_to(p, lo, hi);
-#endif /* _LP64 */
+  int index = ExternalsRecorder::find_index(_target);
+  p = pack_1_int_to(p, index);
   dest->set_locs_end((relocInfo*) p);
 }
 
 
 void external_word_Relocation::unpack_data() {
-#ifndef _LP64
-  _target = (address) (intptr_t)unpack_1_int();
-#else
-  jint lo, hi;
-  unpack_2_ints(lo, hi);
-  jlong t = jlong_from(hi, lo);;
-  _target = (address) t;
-#endif /* _LP64 */
+  int index = unpack_1_int();
+  _target = ExternalsRecorder::at(index);
 }
 
 
diff --git a/src/hotspot/share/code/vtableStubs.cpp b/src/hotspot/share/code/vtableStubs.cpp
index 5a54426d6a4..a65852e247f 100644
--- a/src/hotspot/share/code/vtableStubs.cpp
+++ b/src/hotspot/share/code/vtableStubs.cpp
@@ -255,6 +255,19 @@ inline uint VtableStubs::hash(bool is_vtable_stub, int vtable_index){
 }
 
 
+inline uint VtableStubs::unsafe_hash(address entry_point) {
+  // The entrypoint may or may not be a VtableStub. Generate a hash as if it was.
+  address vtable_stub_addr = entry_point - VtableStub::entry_offset();
+  assert(CodeCache::contains(vtable_stub_addr), "assumed to always be the case");
+  address vtable_type_addr = vtable_stub_addr + offset_of(VtableStub, _type);
+  address vtable_index_addr = vtable_stub_addr + offset_of(VtableStub, _index);
+  bool is_vtable_stub = *vtable_type_addr == static_cast<uint8_t>(VtableStub::Type::vtable_stub);
+  int vtable_index;
+  memcpy(&vtable_index, vtable_index_addr, sizeof(vtable_index));
+  return hash(is_vtable_stub, vtable_index);
+}
+
+
 VtableStub* VtableStubs::lookup(bool is_vtable_stub, int vtable_index) {
   assert_lock_strong(VtableStubs_lock);
   unsigned hash = VtableStubs::hash(is_vtable_stub, vtable_index);
@@ -275,12 +288,15 @@ void VtableStubs::enter(bool is_vtable_stub, int vtable_index, VtableStub* s) {
 }
 
 VtableStub* VtableStubs::entry_point(address pc) {
+  // The pc may or may not be the entry point for a VtableStub. Use unsafe_hash
+  // to generate the hash that would have been used if it was. The lookup in the
+  // _table will only succeed if there is a VtableStub with an entry point at
+  // the pc.
   MutexLocker ml(VtableStubs_lock, Mutex::_no_safepoint_check_flag);
-  VtableStub* stub = (VtableStub*)(pc - VtableStub::entry_offset());
-  uint hash = VtableStubs::hash(stub->is_vtable_stub(), stub->index());
+  uint hash = VtableStubs::unsafe_hash(pc);
   VtableStub* s;
-  for (s = Atomic::load(&_table[hash]); s != nullptr && s != stub; s = s->next()) {}
-  return (s == stub) ? s : nullptr;
+  for (s = Atomic::load(&_table[hash]); s != nullptr && s->entry_point() != pc; s = s->next()) {}
+  return (s != nullptr && s->entry_point() == pc) ? s : nullptr;
 }
 
 bool VtableStubs::contains(address pc) {
diff --git a/src/hotspot/share/code/vtableStubs.hpp b/src/hotspot/share/code/vtableStubs.hpp
index 3993e1e72d5..06acd8f25b9 100644
--- a/src/hotspot/share/code/vtableStubs.hpp
+++ b/src/hotspot/share/code/vtableStubs.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -93,6 +93,7 @@ class VtableStubs : AllStatic {
   static VtableStub* lookup            (bool is_vtable_stub, int vtable_index);
   static void        enter             (bool is_vtable_stub, int vtable_index, VtableStub* s);
   static inline uint hash              (bool is_vtable_stub, int vtable_index);
+  static inline uint unsafe_hash       (address entry_point);
   static address     find_stub         (bool is_vtable_stub, int vtable_index);
   static void        bookkeeping(MacroAssembler* masm, outputStream* out, VtableStub* s,
                                  address npe_addr, address ame_addr,   bool is_vtable_stub,
@@ -118,6 +119,12 @@ class VtableStub {
  private:
   friend class VtableStubs;
 
+  enum class Type : uint8_t {
+    itable_stub,
+    vtable_stub,
+  };
+
+
   static address _chunk;             // For allocation
   static address _chunk_end;         // For allocation
   static VMReg   _receiver_location; // Where to find receiver
@@ -126,14 +133,14 @@ class VtableStub {
   const short    _index;             // vtable index
   short          _ame_offset;        // Where an AbstractMethodError might occur
   short          _npe_offset;        // Where a NullPointerException might occur
-  bool           _is_vtable_stub;    // True if vtable stub, false, is itable stub
+  Type           _type;              // Type, either vtable stub or itable stub
   /* code follows here */            // The vtableStub code
 
   void* operator new(size_t size, int code_size) throw();
 
   VtableStub(bool is_vtable_stub, short index)
         : _next(nullptr), _index(index), _ame_offset(-1), _npe_offset(-1),
-          _is_vtable_stub(is_vtable_stub) {}
+          _type(is_vtable_stub ? Type::vtable_stub : Type::itable_stub) {}
   VtableStub* next() const                       { return _next; }
   int index() const                              { return _index; }
   static VMReg receiver_location()               { return _receiver_location; }
@@ -141,12 +148,12 @@ class VtableStub {
 
  public:
   address code_begin() const                     { return (address)(this + 1); }
-  address code_end() const                       { return code_begin() + VtableStubs::code_size_limit(_is_vtable_stub); }
+  address code_end() const                       { return code_begin() + VtableStubs::code_size_limit(is_vtable_stub()); }
   address entry_point() const                    { return code_begin(); }
   static int entry_offset()                      { return sizeof(class VtableStub); }
 
   bool matches(bool is_vtable_stub, int index) const {
-    return _index == index && _is_vtable_stub == is_vtable_stub;
+    return _index == index && this->is_vtable_stub() == is_vtable_stub;
   }
   bool contains(address pc) const                { return code_begin() <= pc && pc < code_end(); }
 
@@ -172,8 +179,8 @@ class VtableStub {
 
  public:
   // Query
-  bool is_itable_stub()                          { return !_is_vtable_stub; }
-  bool is_vtable_stub()                          { return  _is_vtable_stub; }
+  bool is_itable_stub() const                    { return _type == Type::itable_stub; }
+  bool is_vtable_stub() const                    { return _type == Type::vtable_stub; }
   bool is_abstract_method_error(address epc)     { return epc == code_begin()+_ame_offset; }
   bool is_null_pointer_exception(address epc)    { return epc == code_begin()+_npe_offset; }
 
diff --git a/src/hotspot/share/compiler/compilationMemoryStatistic.cpp b/src/hotspot/share/compiler/compilationMemoryStatistic.cpp
index 196a11fd065..07d8ec41598 100644
--- a/src/hotspot/share/compiler/compilationMemoryStatistic.cpp
+++ b/src/hotspot/share/compiler/compilationMemoryStatistic.cpp
@@ -604,7 +604,7 @@ void CompilationMemoryStatistic::print_all_by_size(outputStream* st, bool human_
       st->print_cr("(%d/%d)", num, _the_table->number_of_entries());
     }
     if (num > 0) {
-      QuickSort::sort(filtered, num, diff_entries_by_size, false);
+      QuickSort::sort(filtered, num, diff_entries_by_size);
       // Now print. Has to happen under lock protection too, since entries may be changed.
       for (int i = 0; i < num; i ++) {
         filtered[i]->print_on(st, human_readable);
diff --git a/src/hotspot/share/compiler/compilerDefinitions.hpp b/src/hotspot/share/compiler/compilerDefinitions.hpp
index 9b69501a598..03b7d446b1a 100644
--- a/src/hotspot/share/compiler/compilerDefinitions.hpp
+++ b/src/hotspot/share/compiler/compilerDefinitions.hpp
@@ -98,23 +98,6 @@ inline bool is_compile(int comp_level) {
   return is_c1_compile(comp_level) || is_c2_compile(comp_level);
 }
 
-
-// States of Restricted Transactional Memory usage.
-enum RTMState: u1 {
-  NoRTM      = 0x2, // Don't use RTM
-  UseRTM     = 0x1, // Use RTM
-  ProfileRTM = 0x0  // Use RTM with abort ratio calculation
-};
-
-#ifndef INCLUDE_RTM_OPT
-#define INCLUDE_RTM_OPT 0
-#endif
-#if INCLUDE_RTM_OPT
-#define RTM_OPT_ONLY(code) code
-#else
-#define RTM_OPT_ONLY(code)
-#endif
-
 class CompilerConfig : public AllStatic {
 public:
   // Scale compile thresholds
diff --git a/src/hotspot/share/compiler/compilerDirectives.cpp b/src/hotspot/share/compiler/compilerDirectives.cpp
index b48eb4fb817..74259c8e5d4 100644
--- a/src/hotspot/share/compiler/compilerDirectives.cpp
+++ b/src/hotspot/share/compiler/compilerDirectives.cpp
@@ -761,7 +761,7 @@ DirectiveSet* DirectivesStack::getMatchingDirective(const methodHandle& method,
       if (dir->is_default_directive() || dir->match(method)) {
         match = dir->get_for(comp);
         assert(match != nullptr, "Consistency");
-        if (match->EnableOption) {
+        if (match->EnableOption || dir->is_default_directive()) {
           // The directiveSet for this compile is also enabled -> success
           dir->inc_refcount();
           break;
diff --git a/src/hotspot/share/compiler/compilerOracle.hpp b/src/hotspot/share/compiler/compilerOracle.hpp
index 1a85e0629f9..5864ca5dc0d 100644
--- a/src/hotspot/share/compiler/compilerOracle.hpp
+++ b/src/hotspot/share/compiler/compilerOracle.hpp
@@ -77,8 +77,6 @@ class methodHandle;
   option(CompileThresholdScaling, "CompileThresholdScaling", Double) \
   option(ControlIntrinsic,  "ControlIntrinsic",  Ccstrlist) \
   option(DisableIntrinsic,  "DisableIntrinsic",  Ccstrlist) \
-  option(NoRTMLockEliding,  "NoRTMLockEliding",  Bool) \
-  option(UseRTMLockEliding, "UseRTMLockEliding", Bool) \
   option(BlockLayoutByFrequency, "BlockLayoutByFrequency", Bool) \
   option(TraceOptoPipelining, "TraceOptoPipelining", Bool) \
   option(TraceOptoOutput, "TraceOptoOutput", Bool) \
diff --git a/src/hotspot/share/compiler/compilerThread.cpp b/src/hotspot/share/compiler/compilerThread.cpp
index 47e3f5a6f49..e212200a47c 100644
--- a/src/hotspot/share/compiler/compilerThread.cpp
+++ b/src/hotspot/share/compiler/compilerThread.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, 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
@@ -32,7 +32,7 @@
 // Create a CompilerThread
 CompilerThread::CompilerThread(CompileQueue* queue,
                                CompilerCounters* counters)
-                               : JavaThread(&CompilerThread::thread_entry) {
+  : JavaThread(&CompilerThread::thread_entry, 0, mtCompiler) {
   _env   = nullptr;
   _log   = nullptr;
   _task  = nullptr;
@@ -43,9 +43,6 @@ CompilerThread::CompilerThread(CompileQueue* queue,
   _compiler = nullptr;
   _arena_stat = CompilationMemoryStatistic::enabled() ? new ArenaStatCounter : nullptr;
 
-  // Compiler uses resource area for compilation, let's bias it to mtCompiler
-  resource_area()->bias_to(mtCompiler);
-
 #ifndef PRODUCT
   _ideal_graph_printer = nullptr;
 #endif
diff --git a/src/hotspot/share/compiler/oopMap.hpp b/src/hotspot/share/compiler/oopMap.hpp
index 80832cdacd4..634fb8b0bfa 100644
--- a/src/hotspot/share/compiler/oopMap.hpp
+++ b/src/hotspot/share/compiler/oopMap.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -411,7 +411,7 @@ class ImmutableOopMapBuilder {
 
     Mapping() : _kind(OOPMAP_UNKNOWN), _offset(-1), _size(-1), _map(nullptr) {}
 
-    void set(kind_t kind, int offset, int size, const OopMap* map = 0, const OopMap* other = 0) {
+    void set(kind_t kind, int offset, int size, const OopMap* map, const OopMap* other = nullptr) {
       _kind = kind;
       _offset = offset;
       _size = size;
diff --git a/src/hotspot/share/gc/g1/g1AllocRegion.cpp b/src/hotspot/share/gc/g1/g1AllocRegion.cpp
index a205cf71ee6..b06f8fd3223 100644
--- a/src/hotspot/share/gc/g1/g1AllocRegion.cpp
+++ b/src/hotspot/share/gc/g1/g1AllocRegion.cpp
@@ -100,16 +100,13 @@ size_t G1AllocRegion::retire_internal(G1HeapRegion* alloc_region, bool fill_up)
   // it will never be empty.
   size_t waste = 0;
   assert_alloc_region(!alloc_region->is_empty(),
-      "the alloc region should never be empty");
+                      "the alloc region should never be empty");
 
   if (fill_up) {
     waste = fill_up_remaining_space(alloc_region);
   }
 
-  assert_alloc_region(alloc_region->used() >= _used_bytes_before, "invariant");
-  size_t allocated_bytes = alloc_region->used() - _used_bytes_before;
-  retire_region(alloc_region, allocated_bytes);
-  _used_bytes_before = 0;
+  retire_region(alloc_region);
 
   return waste;
 }
@@ -132,15 +129,14 @@ size_t G1AllocRegion::retire(bool fill_up) {
 
 HeapWord* G1AllocRegion::new_alloc_region_and_allocate(size_t word_size) {
   assert_alloc_region(_alloc_region == _dummy_region, "pre-condition");
-  assert_alloc_region(_used_bytes_before == 0, "pre-condition");
 
   trace("attempting region allocation");
   G1HeapRegion* new_alloc_region = allocate_new_region(word_size);
   if (new_alloc_region != nullptr) {
     new_alloc_region->reset_pre_dummy_top();
-    // Need to do this before the allocation
-    _used_bytes_before = new_alloc_region->used();
-    HeapWord* result = allocate(new_alloc_region, word_size);
+
+    assert(new_alloc_region->is_empty(), "new regions should be empty");
+    HeapWord* result = new_alloc_region->allocate(word_size);
     assert_alloc_region(result != nullptr, "the allocation should succeeded");
 
     OrderAccess::storestore();
@@ -159,7 +155,7 @@ HeapWord* G1AllocRegion::new_alloc_region_and_allocate(size_t word_size) {
 
 void G1AllocRegion::init() {
   trace("initializing");
-  assert_alloc_region(_alloc_region == nullptr && _used_bytes_before == 0, "pre-condition");
+  assert_alloc_region(_alloc_region == nullptr, "pre-condition");
   assert_alloc_region(_dummy_region != nullptr, "should have been set");
   _alloc_region = _dummy_region;
   _count = 0;
@@ -168,16 +164,9 @@ void G1AllocRegion::init() {
 
 void G1AllocRegion::set(G1HeapRegion* alloc_region) {
   trace("setting");
-  // We explicitly check that the region is not empty to make sure we
-  // maintain the "the alloc region cannot be empty" invariant.
-  assert_alloc_region(alloc_region != nullptr && !alloc_region->is_empty(), "pre-condition");
-  assert_alloc_region(_alloc_region == _dummy_region &&
-                         _used_bytes_before == 0 && _count == 0,
-                         "pre-condition");
+  assert_alloc_region(_alloc_region == _dummy_region && _count == 0, "pre-condition");
 
-  _used_bytes_before = alloc_region->used();
-  _alloc_region = alloc_region;
-  _count += 1;
+  update_alloc_region(alloc_region);
   trace("set");
 }
 
@@ -237,7 +226,7 @@ void G1AllocRegion::trace(const char* str, size_t min_word_size, size_t desired_
     if (detailed_info) {
       if (result != nullptr) {
         out->print(" min " SIZE_FORMAT " desired " SIZE_FORMAT " actual " SIZE_FORMAT " " PTR_FORMAT,
-                     min_word_size, desired_word_size, actual_word_size, p2i(result));
+                   min_word_size, desired_word_size, actual_word_size, p2i(result));
       } else if (min_word_size != 0) {
         out->print(" min " SIZE_FORMAT " desired " SIZE_FORMAT, min_word_size, desired_word_size);
       }
@@ -247,12 +236,9 @@ void G1AllocRegion::trace(const char* str, size_t min_word_size, size_t desired_
 }
 #endif // PRODUCT
 
-G1AllocRegion::G1AllocRegion(const char* name,
-                             bool bot_updates,
-                             uint node_index)
+G1AllocRegion::G1AllocRegion(const char* name, uint node_index)
   : _alloc_region(nullptr),
     _count(0),
-    _used_bytes_before(0),
     _name(name),
     _node_index(node_index)
  { }
@@ -261,9 +247,8 @@ G1HeapRegion* MutatorAllocRegion::allocate_new_region(size_t word_size) {
   return _g1h->new_mutator_alloc_region(word_size, _node_index);
 }
 
-void MutatorAllocRegion::retire_region(G1HeapRegion* alloc_region,
-                                       size_t allocated_bytes) {
-  _g1h->retire_mutator_alloc_region(alloc_region, allocated_bytes);
+void MutatorAllocRegion::retire_region(G1HeapRegion* alloc_region) {
+  _g1h->retire_mutator_alloc_region(alloc_region, alloc_region->used());
 }
 
 void MutatorAllocRegion::init() {
@@ -346,9 +331,11 @@ G1HeapRegion* G1GCAllocRegion::allocate_new_region(size_t word_size) {
   return _g1h->new_gc_alloc_region(word_size, _purpose, _node_index);
 }
 
-void G1GCAllocRegion::retire_region(G1HeapRegion* alloc_region,
-                                    size_t allocated_bytes) {
+void G1GCAllocRegion::retire_region(G1HeapRegion* alloc_region) {
+  assert(alloc_region->used() >= _used_bytes_before, "invariant");
+  size_t allocated_bytes = alloc_region->used() - _used_bytes_before;
   _g1h->retire_gc_alloc_region(alloc_region, allocated_bytes, _purpose);
+  _used_bytes_before = 0;
 }
 
 size_t G1GCAllocRegion::retire(bool fill_up) {
@@ -360,3 +347,8 @@ size_t G1GCAllocRegion::retire(bool fill_up) {
   }
   return end_waste;
 }
+
+void G1GCAllocRegion::reuse(G1HeapRegion* alloc_region) {
+  _used_bytes_before = alloc_region->used();
+  set(alloc_region);
+}
diff --git a/src/hotspot/share/gc/g1/g1AllocRegion.hpp b/src/hotspot/share/gc/g1/g1AllocRegion.hpp
index a8903fd54f1..4d2d18dd6b8 100644
--- a/src/hotspot/share/gc/g1/g1AllocRegion.hpp
+++ b/src/hotspot/share/gc/g1/g1AllocRegion.hpp
@@ -63,11 +63,6 @@ class G1AllocRegion : public CHeapObj<mtGC> {
   // distinct regions this object can used during an active interval.
   uint _count;
 
-  // When we set up a new active region we save its used bytes in this
-  // field so that, when we retire it, we can calculate how much space
-  // we allocated in it.
-  size_t _used_bytes_before;
-
   // Useful for debugging and tracing.
   const char* _name;
 
@@ -94,24 +89,14 @@ class G1AllocRegion : public CHeapObj<mtGC> {
   // The memory node index this allocation region belongs to.
   uint _node_index;
 
+  void set(G1HeapRegion* alloc_region);
+
   // Reset the alloc region to point the dummy region.
   void reset_alloc_region();
 
-  // Perform a non-MT-safe allocation out of the given region.
-  inline HeapWord* allocate(G1HeapRegion* alloc_region,
-                            size_t word_size);
-
   // Perform a MT-safe allocation out of the given region.
   inline HeapWord* par_allocate(G1HeapRegion* alloc_region,
                                 size_t word_size);
-  // Perform a MT-safe allocation out of the given region, with the given
-  // minimum and desired size. Returns the actual size allocated (between
-  // minimum and desired size) in actual_word_size if the allocation has been
-  // successful.
-  inline HeapWord* par_allocate(G1HeapRegion* alloc_region,
-                                size_t min_word_size,
-                                size_t desired_word_size,
-                                size_t* actual_word_size);
 
   // Ensure that the region passed as a parameter has been filled up
   // so that no one else can allocate out of it any more.
@@ -131,10 +116,9 @@ class G1AllocRegion : public CHeapObj<mtGC> {
   static G1CollectedHeap* _g1h;
 
   virtual G1HeapRegion* allocate_new_region(size_t word_size) = 0;
-  virtual void retire_region(G1HeapRegion* alloc_region,
-                             size_t allocated_bytes) = 0;
+  virtual void retire_region(G1HeapRegion* alloc_region) = 0;
 
-  G1AllocRegion(const char* name, bool bot_updates, uint node_index);
+  G1AllocRegion(const char* name, uint node_index);
 
 public:
   static void setup(G1CollectedHeap* g1h, G1HeapRegion* dummy_region);
@@ -173,12 +157,6 @@ class G1AllocRegion : public CHeapObj<mtGC> {
   // Should be called before we start using this object.
   virtual void init();
 
-  // This can be used to set the active region to a specific
-  // region. (Use Example: we try to retain the last old GC alloc
-  // region that we've used during a GC and we can use set() to
-  // re-instate it at the beginning of the next GC.)
-  void set(G1HeapRegion* alloc_region);
-
   // Should be called when we want to release the active region which
   // is returned after it's been retired.
   virtual G1HeapRegion* release();
@@ -205,13 +183,12 @@ class MutatorAllocRegion : public G1AllocRegion {
   // in it and the free size in the currently retained region, if any.
   bool should_retain(G1HeapRegion* region);
 protected:
-  virtual G1HeapRegion* allocate_new_region(size_t word_size);
-  virtual void retire_region(G1HeapRegion* alloc_region, size_t allocated_bytes);
-  virtual size_t retire(bool fill_up);
-
+  G1HeapRegion* allocate_new_region(size_t word_size) override;
+  void retire_region(G1HeapRegion* alloc_region) override;
+  size_t retire(bool fill_up) override;
 public:
   MutatorAllocRegion(uint node_index)
-    : G1AllocRegion("Mutator Alloc Region", false /* bot_updates */, node_index),
+    : G1AllocRegion("Mutator Alloc Region", node_index),
       _wasted_bytes(0),
       _retained_alloc_region(nullptr) { }
 
@@ -231,39 +208,48 @@ class MutatorAllocRegion : public G1AllocRegion {
 
   // This specialization of release() makes sure that the retained alloc
   // region is retired and set to null.
-  virtual G1HeapRegion* release();
+  G1HeapRegion* release() override;
 
-  virtual void init();
+  void init() override;
 };
 
 // Common base class for allocation regions used during GC.
 class G1GCAllocRegion : public G1AllocRegion {
+  // When we set up a new active region we save its used bytes in this
+  // field so that, when we retire it, we can calculate how much space
+  // we allocated in it.
+  size_t _used_bytes_before;
 protected:
   G1EvacStats* _stats;
   G1HeapRegionAttr::region_type_t _purpose;
 
-  virtual G1HeapRegion* allocate_new_region(size_t word_size);
-  virtual void retire_region(G1HeapRegion* alloc_region, size_t allocated_bytes);
+  G1HeapRegion* allocate_new_region(size_t word_size) override;
+  void retire_region(G1HeapRegion* alloc_region) override;
 
-  virtual size_t retire(bool fill_up);
+  size_t retire(bool fill_up) override;
 
-  G1GCAllocRegion(const char* name, bool bot_updates, G1EvacStats* stats,
+  G1GCAllocRegion(const char* name, G1EvacStats* stats,
                   G1HeapRegionAttr::region_type_t purpose, uint node_index = G1NUMA::AnyNodeIndex)
-  : G1AllocRegion(name, bot_updates, node_index), _stats(stats), _purpose(purpose) {
+    : G1AllocRegion(name, node_index), _used_bytes_before(0), _stats(stats), _purpose(purpose) {
     assert(stats != nullptr, "Must pass non-null PLAB statistics");
   }
+public:
+  // This can be used to reuse a specific region. (Use Example: we try to retain the
+  // last old GC alloc region that we've used during a GC and we can use reuse() to
+  // re-instate it at the beginning of the next GC.)
+  void reuse(G1HeapRegion* alloc_region);
 };
 
 class SurvivorGCAllocRegion : public G1GCAllocRegion {
 public:
   SurvivorGCAllocRegion(G1EvacStats* stats, uint node_index)
-  : G1GCAllocRegion("Survivor GC Alloc Region", false /* bot_updates */, stats, G1HeapRegionAttr::Young, node_index) { }
+  : G1GCAllocRegion("Survivor GC Alloc Region", stats, G1HeapRegionAttr::Young, node_index) { }
 };
 
 class OldGCAllocRegion : public G1GCAllocRegion {
 public:
   OldGCAllocRegion(G1EvacStats* stats)
-  : G1GCAllocRegion("Old GC Alloc Region", true /* bot_updates */, stats, G1HeapRegionAttr::Old) { }
+  : G1GCAllocRegion("Old GC Alloc Region", stats, G1HeapRegionAttr::Old) { }
 };
 
 #endif // SHARE_GC_G1_G1ALLOCREGION_HPP
diff --git a/src/hotspot/share/gc/g1/g1AllocRegion.inline.hpp b/src/hotspot/share/gc/g1/g1AllocRegion.inline.hpp
index ba4f1a12628..457a83f4285 100644
--- a/src/hotspot/share/gc/g1/g1AllocRegion.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1AllocRegion.inline.hpp
@@ -31,9 +31,9 @@
 
 #define assert_alloc_region(p, message)                                  \
   do {                                                                   \
-    assert((p), "[%s] %s c: %u r: " PTR_FORMAT " u: " SIZE_FORMAT,       \
-           _name, (message), _count, p2i(_alloc_region),                 \
-           _used_bytes_before);                                          \
+    assert((p), "[%s] %s c: %u r: " PTR_FORMAT,                          \
+           _name, (message), _count, p2i(_alloc_region)                  \
+          );                                                             \
   } while (0)
 
 
@@ -41,41 +41,27 @@ inline void G1AllocRegion::reset_alloc_region() {
   _alloc_region = _dummy_region;
 }
 
-inline HeapWord* G1AllocRegion::allocate(G1HeapRegion* alloc_region,
-                                         size_t word_size) {
-  assert(alloc_region != nullptr, "pre-condition");
-
-  return alloc_region->allocate(word_size);
-}
-
 inline HeapWord* G1AllocRegion::par_allocate(G1HeapRegion* alloc_region, size_t word_size) {
-  size_t temp;
-  return par_allocate(alloc_region, word_size, word_size, &temp);
-}
-
-inline HeapWord* G1AllocRegion::par_allocate(G1HeapRegion* alloc_region,
-                                             size_t min_word_size,
-                                             size_t desired_word_size,
-                                             size_t* actual_word_size) {
   assert(alloc_region != nullptr, "pre-condition");
   assert(!alloc_region->is_empty(), "pre-condition");
-
-  return alloc_region->par_allocate(min_word_size, desired_word_size, actual_word_size);
+  size_t temp;
+  return alloc_region->par_allocate(word_size, word_size, &temp);
 }
 
 inline HeapWord* G1AllocRegion::attempt_allocation(size_t min_word_size,
                                                    size_t desired_word_size,
                                                    size_t* actual_word_size) {
   G1HeapRegion* alloc_region = _alloc_region;
-  assert_alloc_region(alloc_region != nullptr, "not initialized properly");
+  assert_alloc_region(alloc_region != nullptr && !alloc_region->is_empty(), "not initialized properly");
+
+  HeapWord* result = alloc_region->par_allocate(min_word_size, desired_word_size, actual_word_size);
 
-  HeapWord* result = par_allocate(alloc_region, min_word_size, desired_word_size, actual_word_size);
   if (result != nullptr) {
     trace("alloc", min_word_size, desired_word_size, *actual_word_size, result);
-    return result;
+  } else {
+    trace("alloc failed", min_word_size, desired_word_size);
   }
-  trace("alloc failed", min_word_size, desired_word_size);
-  return nullptr;
+  return result;
 }
 
 inline HeapWord* G1AllocRegion::attempt_allocation_locked(size_t word_size) {
@@ -112,7 +98,7 @@ inline HeapWord* MutatorAllocRegion::attempt_retained_allocation(size_t min_word
                                                                  size_t desired_word_size,
                                                                  size_t* actual_word_size) {
   if (_retained_alloc_region != nullptr) {
-    HeapWord* result = par_allocate(_retained_alloc_region, min_word_size, desired_word_size, actual_word_size);
+    HeapWord* result = _retained_alloc_region->par_allocate(min_word_size, desired_word_size, actual_word_size);
     if (result != nullptr) {
       trace("alloc retained", min_word_size, desired_word_size, *actual_word_size, result);
       return result;
diff --git a/src/hotspot/share/gc/g1/g1Allocator.cpp b/src/hotspot/share/gc/g1/g1Allocator.cpp
index 05c64287ec0..29ce8e26bbb 100644
--- a/src/hotspot/share/gc/g1/g1Allocator.cpp
+++ b/src/hotspot/share/gc/g1/g1Allocator.cpp
@@ -118,7 +118,7 @@ void G1Allocator::reuse_retained_old_region(G1EvacInfo* evacuation_info,
     // we allocate to in the region sets. We'll re-add it later, when
     // it's retired again.
     _g1h->old_set_remove(retained_region);
-    old->set(retained_region);
+    old->reuse(retained_region);
     G1HeapRegionPrinter::reuse(retained_region);
     evacuation_info->set_alloc_regions_used_before(retained_region->used());
   }
diff --git a/src/hotspot/share/gc/g1/g1Arguments.cpp b/src/hotspot/share/gc/g1/g1Arguments.cpp
index a62eb994486..3d4ce0d780d 100644
--- a/src/hotspot/share/gc/g1/g1Arguments.cpp
+++ b/src/hotspot/share/gc/g1/g1Arguments.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2017, Red Hat, Inc. and/or its affiliates.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -125,15 +125,13 @@ void G1Arguments::initialize_mark_stack_size() {
                                   MAX2(MarkStackSize, (size_t)ConcGCThreads * TASKQUEUE_SIZE));
     FLAG_SET_ERGO(MarkStackSize, mark_stack_size);
   }
-
 }
 
-
 void G1Arguments::initialize_card_set_configuration() {
   assert(G1HeapRegion::LogOfHRGrainBytes != 0, "not initialized");
   // Array of Cards card set container globals.
   const uint LOG_M = 20;
-  assert(log2i_exact(HeapRegionBounds::min_size()) == LOG_M, "inv");
+  assert(log2i_exact(G1HeapRegionBounds::min_size()) == LOG_M, "inv");
   assert(G1HeapRegion::LogOfHRGrainBytes >= LOG_M, "from the above");
   uint region_size_log_mb = G1HeapRegion::LogOfHRGrainBytes - LOG_M;
 
diff --git a/src/hotspot/share/gc/g1/g1CardSetContainers.hpp b/src/hotspot/share/gc/g1/g1CardSetContainers.hpp
index 43e6c8a3bf7..84e6e3e9274 100644
--- a/src/hotspot/share/gc/g1/g1CardSetContainers.hpp
+++ b/src/hotspot/share/gc/g1/g1CardSetContainers.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -86,12 +86,22 @@ class G1CardSetInlinePtr : public StackObj {
 
   uint find(uint const card_idx, uint const bits_per_card, uint start_at, uint num_cards);
 
+  static ContainerPtr empty_card_set() {
+    // Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114573
+    // gcc issues -Wzero-as-null-pointer-constant here, even though
+    // ContainerInlinePtr is a *non-literal* constant 0.  We cast a non-const
+    // copy, and let the compiler's constant propagation optimize into
+    // equivalent code.
+    static_assert(G1CardSet::ContainerInlinePtr == 0, "unnecessary warning dodge");
+    auto value = G1CardSet::ContainerInlinePtr;
+    return reinterpret_cast<ContainerPtr>(value);
+  }
+
 public:
-  G1CardSetInlinePtr() : _value_addr(nullptr), _value((ContainerPtr)G1CardSet::ContainerInlinePtr) { }
+  G1CardSetInlinePtr() : G1CardSetInlinePtr(empty_card_set()) {}
 
-  G1CardSetInlinePtr(ContainerPtr value) : _value_addr(nullptr), _value(value) {
-    assert(G1CardSet::container_type(_value) == G1CardSet::ContainerInlinePtr, "Value " PTR_FORMAT " is not a valid G1CardSetInlinePtr.", p2i(_value));
-  }
+  explicit G1CardSetInlinePtr(ContainerPtr value) :
+    G1CardSetInlinePtr(nullptr, value) {}
 
   G1CardSetInlinePtr(ContainerPtr volatile* value_addr, ContainerPtr value) : _value_addr(value_addr), _value(value) {
     assert(G1CardSet::container_type(_value) == G1CardSet::ContainerInlinePtr, "Value " PTR_FORMAT " is not a valid G1CardSetInlinePtr.", p2i(_value));
diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
index 258f3f667c5..afd7b894859 100644
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
@@ -129,7 +129,7 @@ size_t G1CollectedHeap::_humongous_object_threshold_in_words = 0;
 // is done by clients of this interface.)
 
 void G1RegionMappingChangedListener::reset_from_card_cache(uint start_idx, size_t num_regions) {
-  HeapRegionRemSet::invalidate_from_card_cache(start_idx, num_regions);
+  G1HeapRegionRemSet::invalidate_from_card_cache(start_idx, num_regions);
 }
 
 void G1RegionMappingChangedListener::on_commit(uint start_idx, size_t num_regions, bool zero_filled) {
@@ -162,7 +162,7 @@ G1HeapRegion* G1CollectedHeap::new_heap_region(uint hrs_index,
 // Private methods.
 
 G1HeapRegion* G1CollectedHeap::new_region(size_t word_size,
-                                          HeapRegionType type,
+                                          G1HeapRegionType type,
                                           bool do_expand,
                                           uint node_index) {
   assert(!is_humongous(word_size) || word_size <= G1HeapRegion::GrainWords,
@@ -710,7 +710,7 @@ HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size,
   ShouldNotReachHere();
 }
 
-class PostCompactionPrinterClosure: public HeapRegionClosure {
+class PostCompactionPrinterClosure: public G1HeapRegionClosure {
 public:
   bool do_heap_region(G1HeapRegion* hr) {
     assert(!hr->is_young(), "not expecting to find young regions");
@@ -1070,7 +1070,7 @@ void G1CollectedHeap::shrink(size_t shrink_bytes) {
   _verifier->verify_region_sets_optional();
 }
 
-class OldRegionSetChecker : public HeapRegionSetChecker {
+class OldRegionSetChecker : public G1HeapRegionSetChecker {
 public:
   void check_mt_safety() {
     // Master Old Set MT safety protocol:
@@ -1098,7 +1098,7 @@ class OldRegionSetChecker : public HeapRegionSetChecker {
   const char* get_description() { return "Old Regions"; }
 };
 
-class HumongousRegionSetChecker : public HeapRegionSetChecker {
+class HumongousRegionSetChecker : public G1HeapRegionSetChecker {
 public:
   void check_mt_safety() {
     // Humongous Set MT safety protocol:
@@ -1352,9 +1352,9 @@ jint G1CollectedHeap::initialize() {
   guarantee(G1HeapRegion::CardsPerRegion < max_cards_per_region,
             "too many cards per region");
 
-  HeapRegionRemSet::initialize(_reserved);
+  G1HeapRegionRemSet::initialize(_reserved);
 
-  FreeRegionList::set_unrealistically_long_length(max_regions() + 1);
+  G1FreeRegionList::set_unrealistically_long_length(max_regions() + 1);
 
   _bot = new G1BlockOffsetTable(reserved(), bot_storage);
 
@@ -1536,7 +1536,7 @@ size_t G1CollectedHeap::used_unlocked() const {
   return _summary_bytes_used;
 }
 
-class SumUsedClosure: public HeapRegionClosure {
+class SumUsedClosure: public G1HeapRegionClosure {
   size_t _used;
 public:
   SumUsedClosure() : _used(0) {}
@@ -1887,7 +1887,7 @@ bool G1CollectedHeap::is_in(const void* p) const {
 
 // Iterates an ObjectClosure over all objects within a G1HeapRegion.
 
-class IterateObjectClosureRegionClosure: public HeapRegionClosure {
+class IterateObjectClosureRegionClosure: public G1HeapRegionClosure {
   ObjectClosure* _cl;
 public:
   IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {}
@@ -1907,7 +1907,7 @@ void G1CollectedHeap::object_iterate(ObjectClosure* cl) {
 class G1ParallelObjectIterator : public ParallelObjectIteratorImpl {
 private:
   G1CollectedHeap*  _heap;
-  HeapRegionClaimer _claimer;
+  G1HeapRegionClaimer _claimer;
 
 public:
   G1ParallelObjectIterator(uint thread_num) :
@@ -1923,7 +1923,7 @@ ParallelObjectIteratorImpl* G1CollectedHeap::parallel_object_iterator(uint threa
   return new G1ParallelObjectIterator(thread_num);
 }
 
-void G1CollectedHeap::object_iterate_parallel(ObjectClosure* cl, uint worker_id, HeapRegionClaimer* claimer) {
+void G1CollectedHeap::object_iterate_parallel(ObjectClosure* cl, uint worker_id, G1HeapRegionClaimer* claimer) {
   IterateObjectClosureRegionClosure blk(cl);
   heap_region_par_iterate_from_worker_offset(&blk, claimer, worker_id);
 }
@@ -1932,43 +1932,43 @@ void G1CollectedHeap::keep_alive(oop obj) {
   G1BarrierSet::enqueue_preloaded(obj);
 }
 
-void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const {
+void G1CollectedHeap::heap_region_iterate(G1HeapRegionClosure* cl) const {
   _hrm.iterate(cl);
 }
 
-void G1CollectedHeap::heap_region_iterate(HeapRegionIndexClosure* cl) const {
+void G1CollectedHeap::heap_region_iterate(G1HeapRegionIndexClosure* cl) const {
   _hrm.iterate(cl);
 }
 
-void G1CollectedHeap::heap_region_par_iterate_from_worker_offset(HeapRegionClosure* cl,
-                                                                 HeapRegionClaimer *hrclaimer,
+void G1CollectedHeap::heap_region_par_iterate_from_worker_offset(G1HeapRegionClosure* cl,
+                                                                 G1HeapRegionClaimer *hrclaimer,
                                                                  uint worker_id) const {
   _hrm.par_iterate(cl, hrclaimer, hrclaimer->offset_for_worker(worker_id));
 }
 
-void G1CollectedHeap::heap_region_par_iterate_from_start(HeapRegionClosure* cl,
-                                                         HeapRegionClaimer *hrclaimer) const {
+void G1CollectedHeap::heap_region_par_iterate_from_start(G1HeapRegionClosure* cl,
+                                                         G1HeapRegionClaimer *hrclaimer) const {
   _hrm.par_iterate(cl, hrclaimer, 0);
 }
 
-void G1CollectedHeap::collection_set_iterate_all(HeapRegionClosure* cl) {
+void G1CollectedHeap::collection_set_iterate_all(G1HeapRegionClosure* cl) {
   _collection_set.iterate(cl);
 }
 
-void G1CollectedHeap::collection_set_par_iterate_all(HeapRegionClosure* cl,
-                                                     HeapRegionClaimer* hr_claimer,
+void G1CollectedHeap::collection_set_par_iterate_all(G1HeapRegionClosure* cl,
+                                                     G1HeapRegionClaimer* hr_claimer,
                                                      uint worker_id) {
   _collection_set.par_iterate(cl, hr_claimer, worker_id);
 }
 
-void G1CollectedHeap::collection_set_iterate_increment_from(HeapRegionClosure *cl,
-                                                            HeapRegionClaimer* hr_claimer,
+void G1CollectedHeap::collection_set_iterate_increment_from(G1HeapRegionClosure *cl,
+                                                            G1HeapRegionClaimer* hr_claimer,
                                                             uint worker_id) {
   _collection_set.iterate_incremental_part_from(cl, hr_claimer, worker_id);
 }
 
-void G1CollectedHeap::par_iterate_regions_array(HeapRegionClosure* cl,
-                                                HeapRegionClaimer* hr_claimer,
+void G1CollectedHeap::par_iterate_regions_array(G1HeapRegionClosure* cl,
+                                                G1HeapRegionClaimer* hr_claimer,
                                                 const uint regions[],
                                                 size_t length,
                                                 uint worker_id) const {
@@ -2046,10 +2046,10 @@ bool G1CollectedHeap::supports_concurrent_gc_breakpoints() const {
   return true;
 }
 
-class PrintRegionClosure: public HeapRegionClosure {
+class G1PrintRegionClosure: public G1HeapRegionClosure {
   outputStream* _st;
 public:
-  PrintRegionClosure(outputStream* st) : _st(st) {}
+  G1PrintRegionClosure(outputStream* st) : _st(st) {}
   bool do_heap_region(G1HeapRegion* r) {
     r->print_on(_st);
     return false;
@@ -2121,7 +2121,7 @@ void G1CollectedHeap::print_regions_on(outputStream* st) const {
                "CS=collection set, F=free, "
                "TAMS=top-at-mark-start, "
                "PB=parsable bottom");
-  PrintRegionClosure blk(st);
+  G1PrintRegionClosure blk(st);
   heap_region_iterate(&blk);
 }
 
@@ -2281,14 +2281,14 @@ void G1CollectedHeap::start_concurrent_cycle(bool concurrent_operation_is_full_m
 bool G1CollectedHeap::is_potential_eager_reclaim_candidate(G1HeapRegion* r) const {
   // We don't nominate objects with many remembered set entries, on
   // the assumption that such objects are likely still live.
-  HeapRegionRemSet* rem_set = r->rem_set();
+  G1HeapRegionRemSet* rem_set = r->rem_set();
 
   return rem_set->occupancy_less_or_equal_than(G1EagerReclaimRemSetThreshold);
 }
 
 #ifndef PRODUCT
 void G1CollectedHeap::verify_region_attr_remset_is_tracked() {
-  class VerifyRegionAttrRemSet : public HeapRegionClosure {
+  class VerifyRegionAttrRemSet : public G1HeapRegionClosure {
   public:
     virtual bool do_heap_region(G1HeapRegion* r) {
       G1CollectedHeap* g1h = G1CollectedHeap::heap();
@@ -2538,9 +2538,9 @@ void G1CollectedHeap::unload_classes_and_code(const char* description, BoolObjec
 }
 
 class G1BulkUnregisterNMethodTask : public WorkerTask {
-  HeapRegionClaimer _hrclaimer;
+  G1HeapRegionClaimer _hrclaimer;
 
-  class UnregisterNMethodsHeapRegionClosure : public HeapRegionClosure {
+  class UnregisterNMethodsHeapRegionClosure : public G1HeapRegionClosure {
   public:
 
     bool do_heap_region(G1HeapRegion* hr) {
@@ -2614,7 +2614,7 @@ void G1CollectedHeap::clear_bitmap_for_region(G1HeapRegion* hr) {
   concurrent_mark()->clear_bitmap_for_region(hr);
 }
 
-void G1CollectedHeap::free_region(G1HeapRegion* hr, FreeRegionList* free_list) {
+void G1CollectedHeap::free_region(G1HeapRegion* hr, G1FreeRegionList* free_list) {
   assert(!hr->is_free(), "the region should not be free");
   assert(!hr->is_empty(), "the region should not be empty");
   assert(_hrm.is_available(hr->hrm_index()), "region should be committed");
@@ -2636,7 +2636,7 @@ void G1CollectedHeap::retain_region(G1HeapRegion* hr) {
 }
 
 void G1CollectedHeap::free_humongous_region(G1HeapRegion* hr,
-                                            FreeRegionList* free_list) {
+                                            G1FreeRegionList* free_list) {
   assert(hr->is_humongous(), "this is only for humongous regions");
   hr->clear_humongous();
   free_region(hr, free_list);
@@ -2652,7 +2652,7 @@ void G1CollectedHeap::remove_from_old_gen_sets(const uint old_regions_removed,
 
 }
 
-void G1CollectedHeap::prepend_to_freelist(FreeRegionList* list) {
+void G1CollectedHeap::prepend_to_freelist(G1FreeRegionList* list) {
   assert(list != nullptr, "list can't be null");
   if (!list->is_empty()) {
     MutexLocker x(FreeList_lock, Mutex::_no_safepoint_check_flag);
@@ -2678,7 +2678,7 @@ void G1CollectedHeap::rebuild_free_region_list() {
   phase_times()->record_total_rebuild_freelist_time_ms((Ticks::now() - start).seconds() * 1000.0);
 }
 
-class G1AbandonCollectionSetClosure : public HeapRegionClosure {
+class G1AbandonCollectionSetClosure : public G1HeapRegionClosure {
 public:
   virtual bool do_heap_region(G1HeapRegion* r) {
     assert(r->in_collection_set(), "Region %u must have been in collection set", r->hrm_index());
@@ -2707,7 +2707,7 @@ void G1CollectedHeap::set_region_short_lived_locked(G1HeapRegion* hr) {
 
 #ifdef ASSERT
 
-class NoYoungRegionsClosure: public HeapRegionClosure {
+class NoYoungRegionsClosure: public G1HeapRegionClosure {
 private:
   bool _success;
 public:
@@ -2768,22 +2768,22 @@ void G1CollectedHeap::set_used(size_t bytes) {
   _summary_bytes_used = bytes;
 }
 
-class RebuildRegionSetsClosure : public HeapRegionClosure {
+class RebuildRegionSetsClosure : public G1HeapRegionClosure {
 private:
   bool _free_list_only;
 
-  HeapRegionSet* _old_set;
-  HeapRegionSet* _humongous_set;
+  G1HeapRegionSet* _old_set;
+  G1HeapRegionSet* _humongous_set;
 
-  HeapRegionManager* _hrm;
+  G1HeapRegionManager* _hrm;
 
   size_t _total_used;
 
 public:
   RebuildRegionSetsClosure(bool free_list_only,
-                           HeapRegionSet* old_set,
-                           HeapRegionSet* humongous_set,
-                           HeapRegionManager* hrm) :
+                           G1HeapRegionSet* old_set,
+                           G1HeapRegionSet* humongous_set,
+                           G1HeapRegionManager* hrm) :
     _free_list_only(free_list_only), _old_set(old_set),
     _humongous_set(humongous_set), _hrm(hrm), _total_used(0) {
     assert(_hrm->num_free_regions() == 0, "pre-condition");
@@ -2849,7 +2849,7 @@ G1HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size,
   bool should_allocate = policy()->should_allocate_mutator_region();
   if (should_allocate) {
     G1HeapRegion* new_alloc_region = new_region(word_size,
-                                                HeapRegionType::Eden,
+                                                G1HeapRegionType::Eden,
                                                 false /* do_expand */,
                                                 node_index);
     if (new_alloc_region != nullptr) {
@@ -2895,11 +2895,11 @@ G1HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size, G1HeapRegio
     return nullptr;
   }
 
-  HeapRegionType type;
+  G1HeapRegionType type;
   if (dest.is_young()) {
-    type = HeapRegionType::Survivor;
+    type = G1HeapRegionType::Survivor;
   } else {
-    type = HeapRegionType::Old;
+    type = G1HeapRegionType::Old;
   }
 
   G1HeapRegion* new_alloc_region = new_region(word_size,
diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
index 1cf89879fd7..ec3cf8eafe3 100644
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
@@ -162,7 +162,7 @@ class G1CollectedHeap : public CollectedHeap {
 
   // Other related classes.
   friend class G1HeapPrinterMark;
-  friend class HeapRegionClaimer;
+  friend class G1HeapRegionClaimer;
 
   // Testing classes.
   friend class G1CheckRegionAttrTableClosure;
@@ -180,8 +180,8 @@ class G1CollectedHeap : public CollectedHeap {
   static size_t _humongous_object_threshold_in_words;
 
   // These sets keep track of old and humongous regions respectively.
-  HeapRegionSet _old_set;
-  HeapRegionSet _humongous_set;
+  G1HeapRegionSet _old_set;
+  G1HeapRegionSet _humongous_set;
 
   // Young gen memory statistics before GC.
   G1MonotonicArenaMemoryStats _young_gen_card_set_stats;
@@ -212,7 +212,7 @@ class G1CollectedHeap : public CollectedHeap {
   G1NUMA* _numa;
 
   // The sequence of all heap regions in the heap.
-  HeapRegionManager _hrm;
+  G1HeapRegionManager _hrm;
 
   // Manages all allocations with regions except humongous object allocations.
   G1Allocator* _allocator;
@@ -386,9 +386,9 @@ class G1CollectedHeap : public CollectedHeap {
   // an allocation of the given word_size. If do_expand is true,
   // attempt to expand the heap if necessary to satisfy the allocation
   // request. 'type' takes the type of region to be allocated. (Use constants
-  // Old, Eden, Humongous, Survivor defined in HeapRegionType.)
+  // Old, Eden, Humongous, Survivor defined in G1HeapRegionType.)
   G1HeapRegion* new_region(size_t word_size,
-                           HeapRegionType type,
+                           G1HeapRegionType type,
                            bool do_expand,
                            uint node_index = G1NUMA::AnyNodeIndex);
 
@@ -679,7 +679,7 @@ class G1CollectedHeap : public CollectedHeap {
   // in another way).
   // Callers must ensure they are the only one calling free on the given region
   // at the same time.
-  void free_region(G1HeapRegion* hr, FreeRegionList* free_list);
+  void free_region(G1HeapRegion* hr, G1FreeRegionList* free_list);
 
   // Add the given region to the retained regions collection set candidates.
   void retain_region(G1HeapRegion* hr);
@@ -697,7 +697,7 @@ class G1CollectedHeap : public CollectedHeap {
   // The method assumes that only a single thread is ever calling
   // this for a particular region at once.
   void free_humongous_region(G1HeapRegion* hr,
-                             FreeRegionList* free_list);
+                             G1FreeRegionList* free_list);
 
   // Execute func(G1HeapRegion* r, bool is_last) on every region covered by the
   // given range.
@@ -1022,7 +1022,7 @@ class G1CollectedHeap : public CollectedHeap {
 
   void remove_from_old_gen_sets(const uint old_regions_removed,
                                 const uint humongous_regions_removed);
-  void prepend_to_freelist(FreeRegionList* list);
+  void prepend_to_freelist(G1FreeRegionList* list);
   void decrement_summary_bytes(size_t bytes);
 
   bool is_in(const void* p) const override;
@@ -1060,7 +1060,7 @@ class G1CollectedHeap : public CollectedHeap {
 
   // Iteration functions.
 
-  void object_iterate_parallel(ObjectClosure* cl, uint worker_id, HeapRegionClaimer* claimer);
+  void object_iterate_parallel(ObjectClosure* cl, uint worker_id, G1HeapRegionClaimer* claimer);
 
   // Iterate over all objects, calling "cl.do_object" on each.
   void object_iterate(ObjectClosure* cl) override;
@@ -1072,8 +1072,8 @@ class G1CollectedHeap : public CollectedHeap {
 
   // Iterate over heap regions, in address order, terminating the
   // iteration early if the "do_heap_region" method returns "true".
-  void heap_region_iterate(HeapRegionClosure* blk) const;
-  void heap_region_iterate(HeapRegionIndexClosure* blk) const;
+  void heap_region_iterate(G1HeapRegionClosure* blk) const;
+  void heap_region_iterate(G1HeapRegionIndexClosure* blk) const;
 
   // Return the region with the given index. It assumes the index is valid.
   inline G1HeapRegion* region_at(uint index) const;
@@ -1091,41 +1091,41 @@ class G1CollectedHeap : public CollectedHeap {
   inline HeapWord* bottom_addr_for_region(uint index) const;
 
   // Two functions to iterate over the heap regions in parallel. Threads
-  // compete using the HeapRegionClaimer to claim the regions before
+  // compete using the G1HeapRegionClaimer to claim the regions before
   // applying the closure on them.
-  // The _from_worker_offset version uses the HeapRegionClaimer and
+  // The _from_worker_offset version uses the G1HeapRegionClaimer and
   // the worker id to calculate a start offset to prevent all workers to
   // start from the point.
-  void heap_region_par_iterate_from_worker_offset(HeapRegionClosure* cl,
-                                                  HeapRegionClaimer* hrclaimer,
+  void heap_region_par_iterate_from_worker_offset(G1HeapRegionClosure* cl,
+                                                  G1HeapRegionClaimer* hrclaimer,
                                                   uint worker_id) const;
 
-  void heap_region_par_iterate_from_start(HeapRegionClosure* cl,
-                                          HeapRegionClaimer* hrclaimer) const;
+  void heap_region_par_iterate_from_start(G1HeapRegionClosure* cl,
+                                          G1HeapRegionClaimer* hrclaimer) const;
 
   // Iterate over all regions in the collection set in parallel.
-  void collection_set_par_iterate_all(HeapRegionClosure* cl,
-                                      HeapRegionClaimer* hr_claimer,
+  void collection_set_par_iterate_all(G1HeapRegionClosure* cl,
+                                      G1HeapRegionClaimer* hr_claimer,
                                       uint worker_id);
 
   // Iterate over all regions currently in the current collection set.
-  void collection_set_iterate_all(HeapRegionClosure* blk);
+  void collection_set_iterate_all(G1HeapRegionClosure* blk);
 
   // Iterate over the regions in the current increment of the collection set.
   // Starts the iteration so that the start regions of a given worker id over the
   // set active_workers are evenly spread across the set of collection set regions
   // to be iterated.
-  // The variant with the HeapRegionClaimer guarantees that the closure will be
+  // The variant with the G1HeapRegionClaimer guarantees that the closure will be
   // applied to a particular region exactly once.
-  void collection_set_iterate_increment_from(HeapRegionClosure *blk, uint worker_id) {
+  void collection_set_iterate_increment_from(G1HeapRegionClosure *blk, uint worker_id) {
     collection_set_iterate_increment_from(blk, nullptr, worker_id);
   }
-  void collection_set_iterate_increment_from(HeapRegionClosure *blk, HeapRegionClaimer* hr_claimer, uint worker_id);
+  void collection_set_iterate_increment_from(G1HeapRegionClosure *blk, G1HeapRegionClaimer* hr_claimer, uint worker_id);
   // Iterate over the array of region indexes, uint regions[length], applying
-  // the given HeapRegionClosure on each region. The worker_id will determine where
+  // the given G1HeapRegionClosure on each region. The worker_id will determine where
   // to start the iteration to allow for more efficient parallel iteration.
-  void par_iterate_regions_array(HeapRegionClosure* cl,
-                                 HeapRegionClaimer* hr_claimer,
+  void par_iterate_regions_array(G1HeapRegionClosure* cl,
+                                 G1HeapRegionClaimer* hr_claimer,
                                  const uint regions[],
                                  size_t length,
                                  uint worker_id) const;
diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp
index ed594d72d06..63eceb4a5ba 100644
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp
@@ -227,7 +227,7 @@ void G1CollectedHeap::register_region_with_region_attr(G1HeapRegion* r) {
 void G1CollectedHeap::register_old_region_with_region_attr(G1HeapRegion* r) {
   assert(!r->has_pinned_objects(), "must be");
   assert(r->rem_set()->is_complete(), "must be");
-  _region_attr.set_in_old(r->hrm_index(), r->rem_set()->is_tracked());
+  _region_attr.set_in_old(r->hrm_index(), true);
   _rem_set->exclude_region_from_scan(r->hrm_index());
 }
 
@@ -253,6 +253,7 @@ inline bool G1CollectedHeap::is_obj_filler(const oop obj) {
 }
 
 inline bool G1CollectedHeap::is_obj_dead(const oop obj, const G1HeapRegion* hr) const {
+  assert(!hr->is_free(), "looking up obj " PTR_FORMAT " in Free region %u", p2i(obj), hr->hrm_index());
   if (hr->is_in_parsable_area(obj)) {
     // This object is in the parsable part of the heap, live unless scrubbed.
     return is_obj_filler(obj);
diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.cpp b/src/hotspot/share/gc/g1/g1CollectionSet.cpp
index a70d003ab53..fe4dfafee97 100644
--- a/src/hotspot/share/gc/g1/g1CollectionSet.cpp
+++ b/src/hotspot/share/gc/g1/g1CollectionSet.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -129,7 +129,7 @@ void G1CollectionSet::clear() {
   _collection_set_cur_length = 0;
 }
 
-void G1CollectionSet::iterate(HeapRegionClosure* cl) const {
+void G1CollectionSet::iterate(G1HeapRegionClosure* cl) const {
   size_t len = _collection_set_cur_length;
   OrderAccess::loadload();
 
@@ -143,13 +143,13 @@ void G1CollectionSet::iterate(HeapRegionClosure* cl) const {
   }
 }
 
-void G1CollectionSet::par_iterate(HeapRegionClosure* cl,
-                                  HeapRegionClaimer* hr_claimer,
+void G1CollectionSet::par_iterate(G1HeapRegionClosure* cl,
+                                  G1HeapRegionClaimer* hr_claimer,
                                   uint worker_id) const {
   iterate_part_from(cl, hr_claimer, 0, cur_length(), worker_id);
 }
 
-void G1CollectionSet::iterate_optional(HeapRegionClosure* cl) const {
+void G1CollectionSet::iterate_optional(G1HeapRegionClosure* cl) const {
   assert_at_safepoint();
 
   for (G1HeapRegion* r : _optional_old_regions) {
@@ -158,14 +158,14 @@ void G1CollectionSet::iterate_optional(HeapRegionClosure* cl) const {
   }
 }
 
-void G1CollectionSet::iterate_incremental_part_from(HeapRegionClosure* cl,
-                                                    HeapRegionClaimer* hr_claimer,
+void G1CollectionSet::iterate_incremental_part_from(G1HeapRegionClosure* cl,
+                                                    G1HeapRegionClaimer* hr_claimer,
                                                     uint worker_id) const {
   iterate_part_from(cl, hr_claimer, _inc_part_start, increment_length(), worker_id);
 }
 
-void G1CollectionSet::iterate_part_from(HeapRegionClosure* cl,
-                                        HeapRegionClaimer* hr_claimer,
+void G1CollectionSet::iterate_part_from(G1HeapRegionClosure* cl,
+                                        G1HeapRegionClaimer* hr_claimer,
                                         size_t offset,
                                         size_t length,
                                         uint worker_id) const {
@@ -207,11 +207,11 @@ void G1CollectionSet::add_eden_region(G1HeapRegion* hr) {
 }
 
 #ifndef PRODUCT
-class G1VerifyYoungAgesClosure : public HeapRegionClosure {
+class G1VerifyYoungAgesClosure : public G1HeapRegionClosure {
 public:
   bool _valid;
 
-  G1VerifyYoungAgesClosure() : HeapRegionClosure(), _valid(true) { }
+  G1VerifyYoungAgesClosure() : G1HeapRegionClosure(), _valid(true) { }
 
   virtual bool do_heap_region(G1HeapRegion* r) {
     guarantee(r->is_young(), "Region must be young but is %s", r->get_type_str());
@@ -246,10 +246,10 @@ bool G1CollectionSet::verify_young_ages() {
   return cl.valid();
 }
 
-class G1PrintCollectionSetDetailClosure : public HeapRegionClosure {
+class G1PrintCollectionSetDetailClosure : public G1HeapRegionClosure {
   outputStream* _st;
 public:
-  G1PrintCollectionSetDetailClosure(outputStream* st) : HeapRegionClosure(), _st(st) { }
+  G1PrintCollectionSetDetailClosure(outputStream* st) : G1HeapRegionClosure(), _st(st) { }
 
   virtual bool do_heap_region(G1HeapRegion* r) {
     assert(r->in_collection_set(), "Region %u should be in collection set", r->hrm_index());
@@ -383,7 +383,7 @@ void G1CollectionSet::finalize_old_part(double time_remaining_ms) {
   double non_young_end_time_sec = os::elapsedTime();
   phase_times()->record_non_young_cset_choice_time_ms((non_young_end_time_sec - non_young_start_time_sec) * 1000.0);
 
-  QuickSort::sort(_collection_set_regions, _collection_set_cur_length, compare_region_idx, true);
+  QuickSort::sort(_collection_set_regions, _collection_set_cur_length, compare_region_idx);
 }
 
 void G1CollectionSet::move_candidates_to_collection_set(G1CollectionCandidateRegionList* regions) {
@@ -471,12 +471,12 @@ void G1CollectionSet::abandon_optional_collection_set(G1ParScanThreadStateSet* p
 }
 
 #ifdef ASSERT
-class G1VerifyYoungCSetIndicesClosure : public HeapRegionClosure {
+class G1VerifyYoungCSetIndicesClosure : public G1HeapRegionClosure {
 private:
   size_t _young_length;
   uint* _heap_region_indices;
 public:
-  G1VerifyYoungCSetIndicesClosure(size_t young_length) : HeapRegionClosure(), _young_length(young_length) {
+  G1VerifyYoungCSetIndicesClosure(size_t young_length) : G1HeapRegionClosure(), _young_length(young_length) {
     _heap_region_indices = NEW_C_HEAP_ARRAY(uint, young_length + 1, mtGC);
     for (size_t i = 0; i < young_length + 1; i++) {
       _heap_region_indices[i] = UINT_MAX;
diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.hpp b/src/hotspot/share/gc/g1/g1CollectionSet.hpp
index e78a426e403..e569d3ee966 100644
--- a/src/hotspot/share/gc/g1/g1CollectionSet.hpp
+++ b/src/hotspot/share/gc/g1/g1CollectionSet.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -36,8 +36,8 @@ class G1ParScanThreadStateSet;
 class G1Policy;
 class G1SurvivorRegions;
 class G1HeapRegion;
-class HeapRegionClaimer;
-class HeapRegionClosure;
+class G1HeapRegionClaimer;
+class G1HeapRegionClosure;
 
 // The collection set.
 //
@@ -197,10 +197,10 @@ class G1CollectionSet {
   void finalize_old_part(double time_remaining_ms);
 
   // Iterate the part of the collection set given by the offset and length applying the given
-  // HeapRegionClosure. The worker_id will determine where in the part to start the iteration
+  // G1HeapRegionClosure. The worker_id will determine where in the part to start the iteration
   // to allow for more efficient parallel iteration.
-  void iterate_part_from(HeapRegionClosure* cl,
-                         HeapRegionClaimer* hr_claimer,
+  void iterate_part_from(G1HeapRegionClosure* cl,
+                         G1HeapRegionClaimer* hr_claimer,
                          size_t offset,
                          size_t length,
                          uint worker_id) const;
@@ -243,9 +243,9 @@ class G1CollectionSet {
   // Stop adding regions to the current collection set increment.
   void stop_incremental_building() { _inc_build_state = Inactive; }
 
-  // Iterate over the current collection set increment applying the given HeapRegionClosure
+  // Iterate over the current collection set increment applying the given G1HeapRegionClosure
   // from a starting position determined by the given worker id.
-  void iterate_incremental_part_from(HeapRegionClosure* cl, HeapRegionClaimer* hr_claimer, uint worker_id) const;
+  void iterate_incremental_part_from(G1HeapRegionClosure* cl, G1HeapRegionClaimer* hr_claimer, uint worker_id) const;
 
   // Returns the length of the current increment in number of regions.
   size_t increment_length() const { return _collection_set_cur_length - _inc_part_start; }
@@ -253,13 +253,13 @@ class G1CollectionSet {
   size_t cur_length() const { return _collection_set_cur_length; }
 
   // Iterate over the entire collection set (all increments calculated so far), applying
-  // the given HeapRegionClosure on all of them.
-  void iterate(HeapRegionClosure* cl) const;
-  void par_iterate(HeapRegionClosure* cl,
-                   HeapRegionClaimer* hr_claimer,
+  // the given G1HeapRegionClosure on all of them.
+  void iterate(G1HeapRegionClosure* cl) const;
+  void par_iterate(G1HeapRegionClosure* cl,
+                   G1HeapRegionClaimer* hr_claimer,
                    uint worker_id) const;
 
-  void iterate_optional(HeapRegionClosure* cl) const;
+  void iterate_optional(G1HeapRegionClosure* cl) const;
 
   // Finalize the initial collection set consisting of all young regions potentially a
   // few old gen regions.
diff --git a/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp b/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp
index 7d24f022461..e629aa8f363 100644
--- a/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp
+++ b/src/hotspot/share/gc/g1/g1CollectionSetCandidates.hpp
@@ -36,7 +36,7 @@
 class G1CollectionCandidateList;
 class G1CollectionSetCandidates;
 class G1HeapRegion;
-class HeapRegionClosure;
+class G1HeapRegionClosure;
 
 using G1CollectionCandidateRegionListIterator = GrowableArrayIterator<G1HeapRegion*>;
 
@@ -110,7 +110,7 @@ class G1CollectionCandidateList : public CHeapObj<mtGC> {
   // Restore sorting order by decreasing gc efficiency, using the existing efficiency
   // values.
   void sort_by_efficiency();
-  // Removes any HeapRegions stored in this list also in the other list. The other
+  // Removes any heap regions stored in this list also in the other list. The other
   // list may only contain regions in this list, sorted by gc efficiency. It need
   // not be a prefix of this list. Returns the number of regions removed.
   // E.g. if this list is "A B G H", the other list may be "A G H", but not "F" (not in
diff --git a/src/hotspot/share/gc/g1/g1CollectionSetChooser.cpp b/src/hotspot/share/gc/g1/g1CollectionSetChooser.cpp
index a45e7de67bf..630fb8a7a11 100644
--- a/src/hotspot/share/gc/g1/g1CollectionSetChooser.cpp
+++ b/src/hotspot/share/gc/g1/g1CollectionSetChooser.cpp
@@ -116,7 +116,7 @@ class G1BuildCandidateRegionsTask : public WorkerTask {
   // Per-region closure. In addition to determining whether a region should be
   // added to the candidates, and calculating those regions' gc efficiencies, also
   // gather additional statistics.
-  class G1BuildCandidateRegionsClosure : public HeapRegionClosure {
+  class G1BuildCandidateRegionsClosure : public G1HeapRegionClosure {
     G1BuildCandidateArray* _array;
 
     uint _cur_chunk_idx;
@@ -177,7 +177,7 @@ class G1BuildCandidateRegionsTask : public WorkerTask {
   };
 
   G1CollectedHeap* _g1h;
-  HeapRegionClaimer _hrclaimer;
+  G1HeapRegionClaimer _hrclaimer;
 
   uint volatile _num_regions_added;
 
diff --git a/src/hotspot/share/gc/g1/g1CommittedRegionMap.cpp b/src/hotspot/share/gc/g1/g1CommittedRegionMap.cpp
index 80cbcf1c7dc..6919cc7d0c9 100644
--- a/src/hotspot/share/gc/g1/g1CommittedRegionMap.cpp
+++ b/src/hotspot/share/gc/g1/g1CommittedRegionMap.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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,7 @@
 #include "runtime/safepoint.hpp"
 #include "utilities/debug.hpp"
 
-HeapRegionRange::HeapRegionRange(uint start, uint end) :
+G1HeapRegionRange::G1HeapRegionRange(uint start, uint end) :
     _start(start),
     _end(end) {
   assert(start <= end, "Invariant");
@@ -97,21 +97,21 @@ void G1CommittedRegionMap::uncommit(uint start, uint end) {
   inactive_clear_range(start, end);
 }
 
-HeapRegionRange G1CommittedRegionMap::next_active_range(uint offset) const {
+G1HeapRegionRange G1CommittedRegionMap::next_active_range(uint offset) const {
   // Find first active index from offset.
   uint start = (uint) _active.find_first_set_bit(offset);
   if (start == max_length()) {
     // Early out when no active regions are found.
-    return HeapRegionRange(max_length(), max_length());
+    return G1HeapRegionRange(max_length(), max_length());
   }
 
   uint end = (uint) _active.find_first_clear_bit(start);
   verify_active_range(start, end);
 
-  return HeapRegionRange(start, end);
+  return G1HeapRegionRange(start, end);
 }
 
-HeapRegionRange G1CommittedRegionMap::next_committable_range(uint offset) const {
+G1HeapRegionRange G1CommittedRegionMap::next_committable_range(uint offset) const {
   // We should only call this function when there are no inactive regions.
   verify_no_inactive_regons();
 
@@ -119,28 +119,28 @@ HeapRegionRange G1CommittedRegionMap::next_committable_range(uint offset) const
   uint start = (uint) _active.find_first_clear_bit(offset);
   if (start == max_length()) {
     // Early out when no free regions are found.
-    return HeapRegionRange(max_length(), max_length());
+    return G1HeapRegionRange(max_length(), max_length());
   }
 
   uint end = (uint) _active.find_first_set_bit(start);
   verify_free_range(start, end);
 
-  return HeapRegionRange(start, end);
+  return G1HeapRegionRange(start, end);
 }
 
-HeapRegionRange G1CommittedRegionMap::next_inactive_range(uint offset) const {
+G1HeapRegionRange G1CommittedRegionMap::next_inactive_range(uint offset) const {
   // Find first inactive region from offset.
   uint start = (uint) _inactive.find_first_set_bit(offset);
 
   if (start == max_length()) {
     // Early when no inactive regions are found.
-    return HeapRegionRange(max_length(), max_length());
+    return G1HeapRegionRange(max_length(), max_length());
   }
 
   uint end = (uint) _inactive.find_first_clear_bit(start);
   verify_inactive_range(start, end);
 
-  return HeapRegionRange(start, end);
+  return G1HeapRegionRange(start, end);
 }
 
 void G1CommittedRegionMap::active_set_range(uint start, uint end) {
diff --git a/src/hotspot/share/gc/g1/g1CommittedRegionMap.hpp b/src/hotspot/share/gc/g1/g1CommittedRegionMap.hpp
index 38db9bf8f34..595a6f7f9c9 100644
--- a/src/hotspot/share/gc/g1/g1CommittedRegionMap.hpp
+++ b/src/hotspot/share/gc/g1/g1CommittedRegionMap.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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,13 +30,13 @@
 #include "utilities/macros.hpp"
 
 // Helper class to define a range [start, end) of regions.
-class HeapRegionRange : public StackObj {
+class G1HeapRegionRange : public StackObj {
   // Inclusive start of the range.
   uint _start;
   // Exclusive end of the range.
   uint _end;
  public:
-  HeapRegionRange(uint start, uint end);
+  G1HeapRegionRange(uint start, uint end);
 
   uint start() const { return _start; }
   uint end() const { return _end; }
@@ -101,13 +101,13 @@ class G1CommittedRegionMap : public CHeapObj<mtGC> {
   void uncommit(uint start, uint end);
 
   // Finds the next range of active regions starting at offset.
-  HeapRegionRange next_active_range(uint offset) const;
+  G1HeapRegionRange next_active_range(uint offset) const;
   // Finds the next range of inactive regions starting at offset.
-  HeapRegionRange next_inactive_range(uint offset) const;
+  G1HeapRegionRange next_inactive_range(uint offset) const;
   // Finds the next range of committable regions starting at offset.
   // This function must only be called when no inactive regions are
   // present and can be used to activate more regions.
-  HeapRegionRange next_committable_range(uint offset) const;
+  G1HeapRegionRange next_committable_range(uint offset) const;
 
 protected:
   virtual void guarantee_mt_safety_active() const;
diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
index 827c538a2e5..3d56973299e 100644
--- a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
+++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp
@@ -675,7 +675,7 @@ class G1ClearBitMapTask : public WorkerTask {
 
 private:
   // Heap region closure used for clearing the _mark_bitmap.
-  class G1ClearBitmapHRClosure : public HeapRegionClosure {
+  class G1ClearBitmapHRClosure : public G1HeapRegionClosure {
   private:
     G1ConcurrentMark* _cm;
     G1CMBitMap* _bitmap;
@@ -715,7 +715,7 @@ class G1ClearBitMapTask : public WorkerTask {
 
   public:
     G1ClearBitmapHRClosure(G1ConcurrentMark* cm, bool suspendible) :
-      HeapRegionClosure(),
+      G1HeapRegionClosure(),
       _cm(cm),
       _bitmap(cm->mark_bitmap()),
       _suspendible(suspendible)
@@ -759,7 +759,7 @@ class G1ClearBitMapTask : public WorkerTask {
   };
 
   G1ClearBitmapHRClosure _cl;
-  HeapRegionClaimer _hr_claimer;
+  G1HeapRegionClaimer _hr_claimer;
   bool _suspendible; // If the task is suspendible, workers must join the STS.
 
 public:
@@ -843,7 +843,7 @@ class G1PreConcurrentStartTask::ResetMarkingStateTask : public G1AbstractSubTask
 };
 
 class G1PreConcurrentStartTask::NoteStartOfMarkTask : public G1AbstractSubTask {
-  HeapRegionClaimer _claimer;
+  G1HeapRegionClaimer _claimer;
 public:
   NoteStartOfMarkTask() : G1AbstractSubTask(G1GCPhaseTimes::NoteStartOfMark), _claimer(0) { }
 
@@ -863,11 +863,11 @@ void G1PreConcurrentStartTask::ResetMarkingStateTask::do_work(uint worker_id) {
   _cm->reset();
 }
 
-class NoteStartOfMarkHRClosure : public HeapRegionClosure {
+class NoteStartOfMarkHRClosure : public G1HeapRegionClosure {
   G1ConcurrentMark* _cm;
 
 public:
-  NoteStartOfMarkHRClosure() : HeapRegionClosure(), _cm(G1CollectedHeap::heap()->concurrent_mark()) { }
+  NoteStartOfMarkHRClosure() : G1HeapRegionClosure(), _cm(G1CollectedHeap::heap()->concurrent_mark()) { }
 
   bool do_heap_region(G1HeapRegion* r) override {
     if (r->is_old_or_humongous() && !r->is_collection_set_candidate() && !r->in_collection_set()) {
@@ -1204,14 +1204,14 @@ void G1ConcurrentMark::verify_during_pause(G1HeapVerifier::G1VerifyType type,
 class G1UpdateRegionLivenessAndSelectForRebuildTask : public WorkerTask {
   G1CollectedHeap* _g1h;
   G1ConcurrentMark* _cm;
-  HeapRegionClaimer _hrclaimer;
+  G1HeapRegionClaimer _hrclaimer;
 
   uint volatile _total_selected_for_rebuild;
 
   // Reclaimed empty regions
-  FreeRegionList _cleanup_list;
+  G1FreeRegionList _cleanup_list;
 
-  struct G1OnRegionClosure : public HeapRegionClosure {
+  struct G1OnRegionClosure : public G1HeapRegionClosure {
     G1CollectedHeap* _g1h;
     G1ConcurrentMark* _cm;
     // The number of regions actually selected for rebuild.
@@ -1220,11 +1220,11 @@ class G1UpdateRegionLivenessAndSelectForRebuildTask : public WorkerTask {
     size_t _freed_bytes;
     uint _num_old_regions_removed;
     uint _num_humongous_regions_removed;
-    FreeRegionList* _local_cleanup_list;
+    G1FreeRegionList* _local_cleanup_list;
 
     G1OnRegionClosure(G1CollectedHeap* g1h,
                       G1ConcurrentMark* cm,
-                      FreeRegionList* local_cleanup_list) :
+                      G1FreeRegionList* local_cleanup_list) :
       _g1h(g1h),
       _cm(cm),
       _num_selected_for_rebuild(0),
@@ -1325,7 +1325,7 @@ class G1UpdateRegionLivenessAndSelectForRebuildTask : public WorkerTask {
   }
 
   void work(uint worker_id) override {
-    FreeRegionList local_cleanup_list("Local Cleanup List");
+    G1FreeRegionList local_cleanup_list("Local Cleanup List");
     G1OnRegionClosure on_region_cl(_g1h, _cm, &local_cleanup_list);
     _g1h->heap_region_par_iterate_from_worker_offset(&on_region_cl, &_hrclaimer, worker_id);
 
@@ -1352,7 +1352,7 @@ class G1UpdateRegionLivenessAndSelectForRebuildTask : public WorkerTask {
   }
 };
 
-class G1UpdateRegionsAfterRebuild : public HeapRegionClosure {
+class G1UpdateRegionsAfterRebuild : public G1HeapRegionClosure {
   G1CollectedHeap* _g1h;
 
 public:
@@ -3078,7 +3078,7 @@ G1PrintRegionLivenessInfoClosure::~G1PrintRegionLivenessInfoClosure() {
   G1CollectedHeap* g1h = G1CollectedHeap::heap();
   _total_remset_bytes += g1h->card_set_freelist_pool()->mem_size();
   // add static memory usages to remembered set sizes
-  _total_remset_bytes += HeapRegionRemSet::static_mem_size();
+  _total_remset_bytes += G1HeapRegionRemSet::static_mem_size();
   // Print the footer of the output.
   log_trace(gc, liveness)(G1PPRL_LINE_PREFIX);
   log_trace(gc, liveness)(G1PPRL_LINE_PREFIX
diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp
index f2206664b25..918384372bb 100644
--- a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp
+++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -949,7 +949,7 @@ class G1CMTask : public TerminatorTerminator {
 // Class that's used to to print out per-region liveness
 // information. It's currently used at the end of marking and also
 // after we sort the old regions at the end of the cleanup operation.
-class G1PrintRegionLivenessInfoClosure : public HeapRegionClosure {
+class G1PrintRegionLivenessInfoClosure : public G1HeapRegionClosure {
   // Accumulators for these values.
   size_t _total_used_bytes;
   size_t _total_capacity_bytes;
diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp
index 9f165cf1d22..7b9be48d9b5 100644
--- a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp
@@ -214,17 +214,14 @@ inline HeapWord* G1ConcurrentMark::top_at_rebuild_start(G1HeapRegion* r) const {
 }
 
 inline void G1ConcurrentMark::update_top_at_rebuild_start(G1HeapRegion* r) {
+  assert(r->is_old() || r->is_humongous(), "precondition");
+
   uint const region = r->hrm_index();
   assert(region < _g1h->max_reserved_regions(), "Tried to access TARS for region %u out of bounds", region);
   assert(_top_at_rebuild_starts[region] == nullptr,
          "TARS for region %u has already been set to " PTR_FORMAT " should be null",
          region, p2i(_top_at_rebuild_starts[region]));
-  G1RemSetTrackingPolicy* tracker = _g1h->policy()->remset_tracker();
-  if (tracker->needs_scan_for_rebuild(r)) {
-    _top_at_rebuild_starts[region] = r->top();
-  } else {
-    // Leave TARS at null.
-  }
+  _top_at_rebuild_starts[region] = r->top();
 }
 
 inline void G1CMTask::update_liveness(oop const obj, const size_t obj_size) {
diff --git a/src/hotspot/share/gc/g1/g1ConcurrentRebuildAndScrub.cpp b/src/hotspot/share/gc/g1/g1ConcurrentRebuildAndScrub.cpp
index cacb28f84b1..1b6b1eed7b1 100644
--- a/src/hotspot/share/gc/g1/g1ConcurrentRebuildAndScrub.cpp
+++ b/src/hotspot/share/gc/g1/g1ConcurrentRebuildAndScrub.cpp
@@ -63,11 +63,11 @@
 // a pause.
 class G1RebuildRSAndScrubTask : public WorkerTask {
   G1ConcurrentMark* _cm;
-  HeapRegionClaimer _hr_claimer;
+  G1HeapRegionClaimer _hr_claimer;
 
   const bool _should_rebuild_remset;
 
-  class G1RebuildRSAndScrubRegionClosure : public HeapRegionClosure {
+  class G1RebuildRSAndScrubRegionClosure : public G1HeapRegionClosure {
     G1ConcurrentMark* _cm;
     const G1CMBitMap* _bitmap;
 
diff --git a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp
index 2fabeec9805..7d6cc9a41cb 100644
--- a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp
+++ b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -253,17 +253,16 @@ uint64_t G1ConcurrentRefine::adjust_threads_wait_ms() const {
   }
 }
 
-class G1ConcurrentRefine::RemSetSamplingClosure : public HeapRegionClosure {
-  G1CollectionSet* _cset;
+class G1ConcurrentRefine::RemSetSamplingClosure : public G1HeapRegionClosure {
   size_t _sampled_card_rs_length;
   size_t _sampled_code_root_rs_length;
 
 public:
-  explicit RemSetSamplingClosure(G1CollectionSet* cset) :
-    _cset(cset), _sampled_card_rs_length(0), _sampled_code_root_rs_length(0) {}
+  RemSetSamplingClosure() :
+    _sampled_card_rs_length(0), _sampled_code_root_rs_length(0) {}
 
   bool do_heap_region(G1HeapRegion* r) override {
-    HeapRegionRemSet* rem_set = r->rem_set();
+    G1HeapRegionRemSet* rem_set = r->rem_set();
     _sampled_card_rs_length += rem_set->occupied();
     _sampled_code_root_rs_length += rem_set->code_roots_list_length();
     return false;
@@ -287,8 +286,8 @@ class G1ConcurrentRefine::RemSetSamplingClosure : public HeapRegionClosure {
 // gen size to keep pause time length goal.
 void G1ConcurrentRefine::adjust_young_list_target_length() {
   if (_policy->use_adaptive_young_list_length()) {
+    RemSetSamplingClosure cl;
     G1CollectionSet* cset = G1CollectedHeap::heap()->collection_set();
-    RemSetSamplingClosure cl{cset};
     cset->iterate(&cl);
     _policy->revise_young_list_target_length(cl.sampled_card_rs_length(), cl.sampled_code_root_rs_length());
   }
diff --git a/src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp b/src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp
index 67059b6ec1c..cc23e0dabe5 100644
--- a/src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp
+++ b/src/hotspot/share/gc/g1/g1DirtyCardQueue.cpp
@@ -359,8 +359,7 @@ class G1RefineBufferedCards : public StackObj {
   void sort_cards(size_t start_index) {
     QuickSort::sort(&_node_buffer[start_index],
                     _node_buffer_capacity - start_index,
-                    compare_cards,
-                    false);
+                    compare_cards);
   }
 
   // Returns the index to the first clean card in the buffer.
diff --git a/src/hotspot/share/gc/g1/g1EvacFailureRegions.cpp b/src/hotspot/share/gc/g1/g1EvacFailureRegions.cpp
index 845868c3e24..afc1602639a 100644
--- a/src/hotspot/share/gc/g1/g1EvacFailureRegions.cpp
+++ b/src/hotspot/share/gc/g1/g1EvacFailureRegions.cpp
@@ -64,8 +64,8 @@ bool G1EvacFailureRegions::contains(uint region_idx) const {
   return _regions_evac_failed.par_at(region_idx, memory_order_relaxed);
 }
 
-void G1EvacFailureRegions::par_iterate(HeapRegionClosure* closure,
-                                       HeapRegionClaimer* hrclaimer,
+void G1EvacFailureRegions::par_iterate(G1HeapRegionClosure* closure,
+                                       G1HeapRegionClaimer* hrclaimer,
                                        uint worker_id) const {
   G1CollectedHeap::heap()->par_iterate_regions_array(closure,
                                                      hrclaimer,
diff --git a/src/hotspot/share/gc/g1/g1EvacFailureRegions.hpp b/src/hotspot/share/gc/g1/g1EvacFailureRegions.hpp
index b8f9ea80038..9d29957b782 100644
--- a/src/hotspot/share/gc/g1/g1EvacFailureRegions.hpp
+++ b/src/hotspot/share/gc/g1/g1EvacFailureRegions.hpp
@@ -28,8 +28,8 @@
 #include "utilities/bitMap.hpp"
 
 class G1AbstractSubTask;
-class HeapRegionClosure;
-class HeapRegionClaimer;
+class G1HeapRegionClaimer;
+class G1HeapRegionClosure;
 
 // This class records for every region on the heap whether it had experienced an
 // evacuation failure.
@@ -70,8 +70,8 @@ class G1EvacFailureRegions {
   void post_collection();
 
   bool contains(uint region_idx) const;
-  void par_iterate(HeapRegionClosure* closure,
-                   HeapRegionClaimer* hrclaimer,
+  void par_iterate(G1HeapRegionClosure* closure,
+                   G1HeapRegionClaimer* hrclaimer,
                    uint worker_id) const;
 
   // Return a G1AbstractSubTask which does necessary preparation for evacuation failed regions
diff --git a/src/hotspot/share/gc/g1/g1FullCollector.cpp b/src/hotspot/share/gc/g1/g1FullCollector.cpp
index 0fba8c1017f..219480227d3 100644
--- a/src/hotspot/share/gc/g1/g1FullCollector.cpp
+++ b/src/hotspot/share/gc/g1/g1FullCollector.cpp
@@ -164,7 +164,7 @@ G1FullCollector::~G1FullCollector() {
   FREE_C_HEAP_ARRAY(G1RegionMarkStats, _live_stats);
 }
 
-class PrepareRegionsClosure : public HeapRegionClosure {
+class PrepareRegionsClosure : public G1HeapRegionClosure {
   G1FullCollector* _collector;
 
 public:
diff --git a/src/hotspot/share/gc/g1/g1FullGCAdjustTask.cpp b/src/hotspot/share/gc/g1/g1FullGCAdjustTask.cpp
index 75da25199eb..0d4adbe632e 100644
--- a/src/hotspot/share/gc/g1/g1FullGCAdjustTask.cpp
+++ b/src/hotspot/share/gc/g1/g1FullGCAdjustTask.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -51,7 +51,7 @@ class G1AdjustLiveClosure : public StackObj {
   }
 };
 
-class G1AdjustRegionClosure : public HeapRegionClosure {
+class G1AdjustRegionClosure : public G1HeapRegionClosure {
   G1FullCollector* _collector;
   G1CMBitMap* _bitmap;
   uint _worker_id;
diff --git a/src/hotspot/share/gc/g1/g1FullGCAdjustTask.hpp b/src/hotspot/share/gc/g1/g1FullGCAdjustTask.hpp
index 26ac183d10d..af232188e46 100644
--- a/src/hotspot/share/gc/g1/g1FullGCAdjustTask.hpp
+++ b/src/hotspot/share/gc/g1/g1FullGCAdjustTask.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -37,7 +37,7 @@ class G1CollectedHeap;
 class G1FullGCAdjustTask : public G1FullGCTask {
   G1RootProcessor          _root_processor;
   WeakProcessor::Task      _weak_proc_task;
-  HeapRegionClaimer        _hrclaimer;
+  G1HeapRegionClaimer      _hrclaimer;
   G1AdjustClosure          _adjust;
 
 public:
diff --git a/src/hotspot/share/gc/g1/g1FullGCCompactTask.hpp b/src/hotspot/share/gc/g1/g1FullGCCompactTask.hpp
index 341542f6d6f..5c3929f1eed 100644
--- a/src/hotspot/share/gc/g1/g1FullGCCompactTask.hpp
+++ b/src/hotspot/share/gc/g1/g1FullGCCompactTask.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -37,7 +37,7 @@ class G1FullCollector;
 
 class G1FullGCCompactTask : public G1FullGCTask {
   G1FullCollector* _collector;
-  HeapRegionClaimer _claimer;
+  G1HeapRegionClaimer _claimer;
   G1CollectedHeap* _g1h;
 
   void compact_region(G1HeapRegion* hr);
diff --git a/src/hotspot/share/gc/g1/g1FullGCHeapRegionAttr.hpp b/src/hotspot/share/gc/g1/g1FullGCHeapRegionAttr.hpp
index 2fc7d74f331..9eaa172b5e5 100644
--- a/src/hotspot/share/gc/g1/g1FullGCHeapRegionAttr.hpp
+++ b/src/hotspot/share/gc/g1/g1FullGCHeapRegionAttr.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,7 @@
 
 #include "gc/g1/g1BiasedArray.hpp"
 
-// This table is used to store attribute values of all HeapRegions that need
+// This table is used to store attribute values of all heap regions that need
 // fast access during the full collection. In particular some parts of the
 // region type information is encoded in these per-region bytes. Value encoding
 // has been specifically chosen to make required accesses fast. In particular,
diff --git a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp
index a4dbbf2edba..9d2887c01a6 100644
--- a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp
+++ b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -37,7 +37,7 @@ class G1HeapRegion;
 
 // Determines the regions in the heap that should be part of the compaction and
 // distributes them among the compaction queues in round-robin fashion.
-class G1DetermineCompactionQueueClosure : public HeapRegionClosure {
+class G1DetermineCompactionQueueClosure : public G1HeapRegionClosure {
   G1CollectedHeap* _g1h;
   G1FullCollector* _collector;
   uint _cur_worker;
@@ -62,7 +62,7 @@ class G1DetermineCompactionQueueClosure : public HeapRegionClosure {
 
 class G1FullGCPrepareTask : public G1FullGCTask {
   volatile bool     _has_free_compaction_targets;
-  HeapRegionClaimer _hrclaimer;
+  G1HeapRegionClaimer _hrclaimer;
 
   void set_has_free_compaction_targets();
 
@@ -74,7 +74,7 @@ class G1FullGCPrepareTask : public G1FullGCTask {
   bool has_free_compaction_targets();
 
 private:
-  class G1CalculatePointersClosure : public HeapRegionClosure {
+  class G1CalculatePointersClosure : public G1HeapRegionClosure {
     G1CollectedHeap* _g1h;
     G1FullCollector* _collector;
     G1CMBitMap* _bitmap;
diff --git a/src/hotspot/share/gc/g1/g1FullGCResetMetadataTask.hpp b/src/hotspot/share/gc/g1/g1FullGCResetMetadataTask.hpp
index 98d7af6e2f3..5f046e35001 100644
--- a/src/hotspot/share/gc/g1/g1FullGCResetMetadataTask.hpp
+++ b/src/hotspot/share/gc/g1/g1FullGCResetMetadataTask.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -29,9 +29,9 @@
 
 class G1FullGCResetMetadataTask : public G1FullGCTask {
   G1FullCollector* _collector;
-  HeapRegionClaimer _claimer;
+  G1HeapRegionClaimer _claimer;
 
-  class G1ResetMetadataClosure : public HeapRegionClosure {
+  class G1ResetMetadataClosure : public G1HeapRegionClosure {
     G1CollectedHeap* _g1h;
     G1FullCollector* _collector;
 
diff --git a/src/hotspot/share/gc/g1/g1HeapRegion.cpp b/src/hotspot/share/gc/g1/g1HeapRegion.cpp
index 94382a3b256..9851b1df9c9 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegion.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegion.cpp
@@ -55,20 +55,20 @@ size_t G1HeapRegion::GrainWords        = 0;
 size_t G1HeapRegion::CardsPerRegion    = 0;
 
 size_t G1HeapRegion::max_region_size() {
-  return HeapRegionBounds::max_size();
+  return G1HeapRegionBounds::max_size();
 }
 
 size_t G1HeapRegion::min_region_size_in_words() {
-  return HeapRegionBounds::min_size() >> LogHeapWordSize;
+  return G1HeapRegionBounds::min_size() >> LogHeapWordSize;
 }
 
 void G1HeapRegion::setup_heap_region_size(size_t max_heap_size) {
   size_t region_size = G1HeapRegionSize;
   // G1HeapRegionSize = 0 means decide ergonomically.
   if (region_size == 0) {
-    region_size = clamp(max_heap_size / HeapRegionBounds::target_number(),
-                        HeapRegionBounds::min_size(),
-                        HeapRegionBounds::max_ergonomics_size());
+    region_size = clamp(max_heap_size / G1HeapRegionBounds::target_number(),
+                        G1HeapRegionBounds::min_size(),
+                        G1HeapRegionBounds::max_ergonomics_size());
   }
 
   // Make sure region size is a power of 2. Rounding up since this
@@ -76,7 +76,7 @@ void G1HeapRegion::setup_heap_region_size(size_t max_heap_size) {
   region_size = round_up_power_of_2(region_size);
 
   // Now make sure that we don't go over or under our limits.
-  region_size = clamp(region_size, HeapRegionBounds::min_size(), HeapRegionBounds::max_size());
+  region_size = clamp(region_size, G1HeapRegionBounds::min_size(), G1HeapRegionBounds::max_size());
 
   // Now, set up the globals.
   guarantee(LogOfHRGrainBytes == 0, "we should only set it once");
@@ -247,7 +247,7 @@ G1HeapRegion::G1HeapRegion(uint hrm_index,
   assert(Universe::on_page_boundary(mr.start()) && Universe::on_page_boundary(mr.end()),
          "invalid space boundaries");
 
-  _rem_set = new HeapRegionRemSet(this, config);
+  _rem_set = new G1HeapRegionRemSet(this, config);
   initialize();
 }
 
@@ -264,11 +264,11 @@ void G1HeapRegion::initialize(bool clear_space, bool mangle_space) {
 }
 
 void G1HeapRegion::report_region_type_change(G1HeapRegionTraceType::Type to) {
-  HeapRegionTracer::send_region_type_change(_hrm_index,
-                                            get_trace_type(),
-                                            to,
-                                            (uintptr_t)bottom(),
-                                            used());
+  G1HeapRegionTracer::send_region_type_change(_hrm_index,
+                                              get_trace_type(),
+                                              to,
+                                              (uintptr_t)bottom(),
+                                              used());
 }
 
  void G1HeapRegion::note_evacuation_failure() {
@@ -377,7 +377,7 @@ bool G1HeapRegion::verify_code_roots(VerifyOption vo) const {
     return false;
   }
 
-  HeapRegionRemSet* hrrs = rem_set();
+  G1HeapRegionRemSet* hrrs = rem_set();
   size_t code_roots_length = hrrs->code_roots_list_length();
 
   // if this region is empty then there should be no entries
@@ -547,7 +547,10 @@ class G1VerifyLiveAndRemSetClosure : public BasicOopIterateClosure {
     }
 
     bool failed() const {
-      return !_is_in_heap || this->_g1h->is_obj_dead_cond(this->_obj, _vo);
+      return !_is_in_heap ||
+             // is_obj_dead* assume that obj is not in a Free region.
+             this->_g1h->heap_region_containing(this->_obj)->is_free() ||
+             this->_g1h->is_obj_dead_cond(this->_obj, _vo);
     }
 
     void report_error() {
diff --git a/src/hotspot/share/gc/g1/g1HeapRegion.hpp b/src/hotspot/share/gc/g1/g1HeapRegion.hpp
index dc2c71bcbb4..ed953094a67 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegion.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegion.hpp
@@ -40,9 +40,9 @@ class G1CardSetConfiguration;
 class G1CollectedHeap;
 class G1CMBitMap;
 class G1Predictions;
-class HeapRegionRemSet;
 class G1HeapRegion;
-class HeapRegionSetBase;
+class G1HeapRegionRemSet;
+class G1HeapRegionSetBase;
 class nmethod;
 
 #define HR_FORMAT "%u:(%s)[" PTR_FORMAT "," PTR_FORMAT "," PTR_FORMAT "]"
@@ -127,18 +127,6 @@ class G1HeapRegion : public CHeapObj<mtGC> {
 
   void mangle_unused_area() PRODUCT_RETURN;
 
-  // Try to allocate at least min_word_size and up to desired_size from this region.
-  // Returns null if not possible, otherwise sets actual_word_size to the amount of
-  // space allocated.
-  // This version assumes that all allocation requests to this G1HeapRegion are properly
-  // synchronized.
-  inline HeapWord* allocate_impl(size_t min_word_size, size_t desired_word_size, size_t* actual_word_size);
-  // Try to allocate at least min_word_size and up to desired_size from this G1HeapRegion.
-  // Returns null if not possible, otherwise sets actual_word_size to the amount of
-  // space allocated.
-  // This version synchronizes with other calls to par_allocate_impl().
-  inline HeapWord* par_allocate_impl(size_t min_word_size, size_t desired_word_size, size_t* actual_word_size);
-
   inline HeapWord* advance_to_block_containing_addr(const void* addr,
                                                     HeapWord* const pb,
                                                     HeapWord* first_block) const;
@@ -163,8 +151,18 @@ class G1HeapRegion : public CHeapObj<mtGC> {
   // All allocations are done without updating the BOT. The BOT
   // needs to be kept in sync for old generation regions and
   // this is done by explicit updates when crossing thresholds.
+
+  // Try to allocate at least min_word_size and up to desired_size from this HeapRegion.
+  // Returns null if not possible, otherwise sets actual_word_size to the amount of
+  // space allocated.
+  // This version synchronizes with other calls to par_allocate().
   inline HeapWord* par_allocate(size_t min_word_size, size_t desired_word_size, size_t* word_size);
   inline HeapWord* allocate(size_t word_size);
+  // Try to allocate at least min_word_size and up to desired_size from this region.
+  // Returns null if not possible, otherwise sets actual_word_size to the amount of
+  // space allocated.
+  // This version assumes that all allocation requests to this HeapRegion are properly
+  // synchronized.
   inline HeapWord* allocate(size_t min_word_size, size_t desired_word_size, size_t* actual_size);
 
   // Full GC support methods.
@@ -197,12 +195,12 @@ class G1HeapRegion : public CHeapObj<mtGC> {
 
 private:
   // The remembered set for this region.
-  HeapRegionRemSet* _rem_set;
+  G1HeapRegionRemSet* _rem_set;
 
   // Cached index of this region in the heap region sequence.
   const uint _hrm_index;
 
-  HeapRegionType _type;
+  G1HeapRegionType _type;
 
   // For a humongous region, region in which it starts.
   G1HeapRegion* _humongous_start_region;
@@ -213,11 +211,11 @@ class G1HeapRegion : public CHeapObj<mtGC> {
   // is considered optional during a mixed collections.
   uint _index_in_opt_cset;
 
-  // Fields used by the HeapRegionSetBase class and subclasses.
+  // Fields used by the G1HeapRegionSetBase class and subclasses.
   G1HeapRegion* _next;
   G1HeapRegion* _prev;
 #ifdef ASSERT
-  HeapRegionSetBase* _containing_set;
+  G1HeapRegionSetBase* _containing_set;
 #endif // ASSERT
 
   // The area above this limit is fully parsable. This limit
@@ -278,7 +276,7 @@ class G1HeapRegion : public CHeapObj<mtGC> {
              MemRegion mr,
              G1CardSetConfiguration* config);
 
-  // If this region is a member of a HeapRegionManager, the index in that
+  // If this region is a member of a G1HeapRegionManager, the index in that
   // sequence, otherwise -1.
   uint hrm_index() const { return _hrm_index; }
 
@@ -420,9 +418,9 @@ class G1HeapRegion : public CHeapObj<mtGC> {
   // Unsets the humongous-related fields on the region.
   void clear_humongous();
 
-  void set_rem_set(HeapRegionRemSet* rem_set) { _rem_set = rem_set; }
+  void set_rem_set(G1HeapRegionRemSet* rem_set) { _rem_set = rem_set; }
   // If the region has a remembered set, return a pointer to it.
-  HeapRegionRemSet* rem_set() const {
+  G1HeapRegionRemSet* rem_set() const {
     return _rem_set;
   }
 
@@ -430,7 +428,7 @@ class G1HeapRegion : public CHeapObj<mtGC> {
 
   void prepare_remset_for_scan();
 
-  // Methods used by the HeapRegionSetBase class and subclasses.
+  // Methods used by the G1HeapRegionSetBase class and subclasses.
 
   // Getter and setter for the next and prev fields used to link regions into
   // linked lists.
@@ -447,7 +445,7 @@ class G1HeapRegion : public CHeapObj<mtGC> {
   // the contents of a set are as they should be and it's only
   // available in non-product builds.
 #ifdef ASSERT
-  void set_containing_set(HeapRegionSetBase* containing_set) {
+  void set_containing_set(G1HeapRegionSetBase* containing_set) {
     assert((containing_set != nullptr && _containing_set == nullptr) ||
             containing_set == nullptr,
            "containing_set: " PTR_FORMAT " "
@@ -457,9 +455,9 @@ class G1HeapRegion : public CHeapObj<mtGC> {
     _containing_set = containing_set;
   }
 
-  HeapRegionSetBase* containing_set() { return _containing_set; }
+  G1HeapRegionSetBase* containing_set() { return _containing_set; }
 #else // ASSERT
-  void set_containing_set(HeapRegionSetBase* containing_set) { }
+  void set_containing_set(G1HeapRegionSetBase* containing_set) { }
 
   // containing_set() is only used in asserts so there's no reason
   // to provide a dummy version of it.
@@ -554,10 +552,10 @@ class G1HeapRegion : public CHeapObj<mtGC> {
   bool verify(VerifyOption vo) const;
 };
 
-// HeapRegionClosure is used for iterating over regions.
+// G1HeapRegionClosure is used for iterating over regions.
 // Terminates the iteration when the "do_heap_region" method returns "true".
-class HeapRegionClosure : public StackObj {
-  friend class HeapRegionManager;
+class G1HeapRegionClosure : public StackObj {
+  friend class G1HeapRegionManager;
   friend class G1CollectionSet;
   friend class G1CollectionSetCandidates;
 
@@ -565,7 +563,7 @@ class HeapRegionClosure : public StackObj {
   void set_incomplete() { _is_complete = false; }
 
 public:
-  HeapRegionClosure(): _is_complete(true) {}
+  G1HeapRegionClosure(): _is_complete(true) {}
 
   // Typically called on each region until it returns true.
   virtual bool do_heap_region(G1HeapRegion* r) = 0;
@@ -575,8 +573,8 @@ class HeapRegionClosure : public StackObj {
   bool is_complete() { return _is_complete; }
 };
 
-class HeapRegionIndexClosure : public StackObj {
-  friend class HeapRegionManager;
+class G1HeapRegionIndexClosure : public StackObj {
+  friend class G1HeapRegionManager;
   friend class G1CollectionSet;
   friend class G1CollectionSetCandidates;
 
@@ -584,7 +582,7 @@ class HeapRegionIndexClosure : public StackObj {
   void set_incomplete() { _is_complete = false; }
 
 public:
-  HeapRegionIndexClosure(): _is_complete(true) {}
+  G1HeapRegionIndexClosure(): _is_complete(true) {}
 
   // Typically called on each region until it returns true.
   virtual bool do_heap_region_index(uint region_index) = 0;
diff --git a/src/hotspot/share/gc/g1/g1HeapRegion.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegion.inline.hpp
index 8e5e594b5ca..f31c5fb553e 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegion.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegion.inline.hpp
@@ -42,47 +42,6 @@
 #include "utilities/align.hpp"
 #include "utilities/globalDefinitions.hpp"
 
-inline HeapWord* G1HeapRegion::allocate_impl(size_t min_word_size,
-                                           size_t desired_word_size,
-                                           size_t* actual_size) {
-  HeapWord* obj = top();
-  size_t available = pointer_delta(end(), obj);
-  size_t want_to_allocate = MIN2(available, desired_word_size);
-  if (want_to_allocate >= min_word_size) {
-    HeapWord* new_top = obj + want_to_allocate;
-    set_top(new_top);
-    assert(is_object_aligned(obj) && is_object_aligned(new_top), "checking alignment");
-    *actual_size = want_to_allocate;
-    return obj;
-  } else {
-    return nullptr;
-  }
-}
-
-inline HeapWord* G1HeapRegion::par_allocate_impl(size_t min_word_size,
-                                               size_t desired_word_size,
-                                               size_t* actual_size) {
-  do {
-    HeapWord* obj = top();
-    size_t available = pointer_delta(end(), obj);
-    size_t want_to_allocate = MIN2(available, desired_word_size);
-    if (want_to_allocate >= min_word_size) {
-      HeapWord* new_top = obj + want_to_allocate;
-      HeapWord* result = Atomic::cmpxchg(&_top, obj, new_top);
-      // result can be one of two:
-      //  the old top value: the exchange succeeded
-      //  otherwise: the new value of the top is returned.
-      if (result == obj) {
-        assert(is_object_aligned(obj) && is_object_aligned(new_top), "checking alignment");
-        *actual_size = want_to_allocate;
-        return obj;
-      }
-    } else {
-      return nullptr;
-    }
-  } while (true);
-}
-
 inline HeapWord* G1HeapRegion::block_start(const void* addr) const {
   return block_start(addr, parsable_bottom_acquire());
 }
@@ -225,9 +184,27 @@ inline void G1HeapRegion::apply_to_marked_objects(G1CMBitMap* bitmap, ApplyToMar
 }
 
 inline HeapWord* G1HeapRegion::par_allocate(size_t min_word_size,
-                                          size_t desired_word_size,
-                                          size_t* actual_word_size) {
-  return par_allocate_impl(min_word_size, desired_word_size, actual_word_size);
+                                            size_t desired_word_size,
+                                            size_t* actual_word_size) {
+  do {
+    HeapWord* obj = top();
+    size_t available = pointer_delta(end(), obj);
+    size_t want_to_allocate = MIN2(available, desired_word_size);
+    if (want_to_allocate >= min_word_size) {
+      HeapWord* new_top = obj + want_to_allocate;
+      HeapWord* result = Atomic::cmpxchg(&_top, obj, new_top);
+      // result can be one of two:
+      // the old top value: the exchange succeeded
+      // otherwise: the new value of the top is returned.
+      if (result == obj) {
+        assert(is_object_aligned(obj) && is_object_aligned(new_top), "checking alignment");
+        *actual_word_size = want_to_allocate;
+        return obj;
+      }
+    } else {
+      return nullptr;
+    }
+  } while (true);
 }
 
 inline HeapWord* G1HeapRegion::allocate(size_t word_size) {
@@ -236,9 +213,20 @@ inline HeapWord* G1HeapRegion::allocate(size_t word_size) {
 }
 
 inline HeapWord* G1HeapRegion::allocate(size_t min_word_size,
-                                      size_t desired_word_size,
-                                      size_t* actual_word_size) {
-  return allocate_impl(min_word_size, desired_word_size, actual_word_size);
+                                        size_t desired_word_size,
+                                        size_t* actual_word_size) {
+  HeapWord* obj = top();
+  size_t available = pointer_delta(end(), obj);
+  size_t want_to_allocate = MIN2(available, desired_word_size);
+  if (want_to_allocate >= min_word_size) {
+    HeapWord* new_top = obj + want_to_allocate;
+    set_top(new_top);
+    assert(is_object_aligned(obj) && is_object_aligned(new_top), "checking alignment");
+    *actual_word_size = want_to_allocate;
+    return obj;
+  } else {
+    return nullptr;
+  }
 }
 
 inline void G1HeapRegion::update_bot() {
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionBounds.hpp b/src/hotspot/share/gc/g1/g1HeapRegionBounds.hpp
index 3cde2f77d4a..83314820c83 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionBounds.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionBounds.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,7 @@
 #include "memory/allStatic.hpp"
 #include "utilities/globalDefinitions.hpp"
 
-class HeapRegionBounds : public AllStatic {
+class G1HeapRegionBounds : public AllStatic {
 private:
   // Minimum region size; we won't go lower than that.
   // We might want to decrease this in the future, to deal with small
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionBounds.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegionBounds.inline.hpp
index 473057144d3..63c086c178a 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionBounds.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionBounds.inline.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,19 +27,19 @@
 
 #include "gc/g1/g1HeapRegionBounds.hpp"
 
-size_t HeapRegionBounds::min_size() {
+size_t G1HeapRegionBounds::min_size() {
   return MIN_REGION_SIZE;
 }
 
-size_t HeapRegionBounds::max_ergonomics_size() {
+size_t G1HeapRegionBounds::max_ergonomics_size() {
   return MAX_ERGONOMICS_SIZE;
 }
 
-size_t HeapRegionBounds::max_size() {
+size_t G1HeapRegionBounds::max_size() {
   return MAX_REGION_SIZE;
 }
 
-size_t HeapRegionBounds::target_number() {
+size_t G1HeapRegionBounds::target_number() {
   return TARGET_REGION_NUMBER;
 }
 
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionEventSender.cpp b/src/hotspot/share/gc/g1/g1HeapRegionEventSender.cpp
index 6f01524a14b..3be3ec2410c 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionEventSender.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionEventSender.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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,7 @@
 #include "jfr/jfrEvents.hpp"
 #include "runtime/vmThread.hpp"
 
-class DumpEventInfoClosure : public HeapRegionClosure {
+class DumpEventInfoClosure : public G1HeapRegionClosure {
 public:
   bool do_heap_region(G1HeapRegion* r) {
     EventG1HeapRegionInformation evt;
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionManager.cpp b/src/hotspot/share/gc/g1/g1HeapRegionManager.cpp
index 2cf6a4088d3..b37e65f8b86 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionManager.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionManager.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -40,7 +40,7 @@
 #include "runtime/orderAccess.hpp"
 #include "utilities/bitMap.inline.hpp"
 
-class MasterFreeRegionListChecker : public HeapRegionSetChecker {
+class G1MasterFreeRegionListChecker : public G1HeapRegionSetChecker {
 public:
   void check_mt_safety() {
     // Master Free List MT safety protocol:
@@ -62,20 +62,20 @@ class MasterFreeRegionListChecker : public HeapRegionSetChecker {
   const char* get_description() { return "Free Regions"; }
 };
 
-HeapRegionManager::HeapRegionManager() :
+G1HeapRegionManager::G1HeapRegionManager() :
   _bot_mapper(nullptr),
   _cardtable_mapper(nullptr),
   _committed_map(),
   _allocated_heapregions_length(0),
   _regions(), _heap_mapper(nullptr),
   _bitmap_mapper(nullptr),
-  _free_list("Free list", new MasterFreeRegionListChecker())
+  _free_list("Free list", new G1MasterFreeRegionListChecker())
 { }
 
-void HeapRegionManager::initialize(G1RegionToSpaceMapper* heap_storage,
-                                   G1RegionToSpaceMapper* bitmap,
-                                   G1RegionToSpaceMapper* bot,
-                                   G1RegionToSpaceMapper* cardtable) {
+void G1HeapRegionManager::initialize(G1RegionToSpaceMapper* heap_storage,
+                                     G1RegionToSpaceMapper* bitmap,
+                                     G1RegionToSpaceMapper* bot,
+                                     G1RegionToSpaceMapper* cardtable) {
   _allocated_heapregions_length = 0;
 
   _heap_mapper = heap_storage;
@@ -90,7 +90,7 @@ void HeapRegionManager::initialize(G1RegionToSpaceMapper* heap_storage,
   _committed_map.initialize(reserved_length());
 }
 
-G1HeapRegion* HeapRegionManager::allocate_free_region(HeapRegionType type, uint requested_node_index) {
+G1HeapRegion* G1HeapRegionManager::allocate_free_region(G1HeapRegionType type, uint requested_node_index) {
   G1HeapRegion* hr = nullptr;
   bool from_head = !type.is_young();
   G1NUMA* numa = G1NUMA::numa();
@@ -118,7 +118,7 @@ G1HeapRegion* HeapRegionManager::allocate_free_region(HeapRegionType type, uint
   return hr;
 }
 
-G1HeapRegion* HeapRegionManager::allocate_humongous_from_free_list(uint num_regions) {
+G1HeapRegion* G1HeapRegionManager::allocate_humongous_from_free_list(uint num_regions) {
   uint candidate = find_contiguous_in_free_list(num_regions);
   if (candidate == G1_NO_HRM_INDEX) {
     return nullptr;
@@ -126,7 +126,7 @@ G1HeapRegion* HeapRegionManager::allocate_humongous_from_free_list(uint num_regi
   return allocate_free_regions_starting_at(candidate, num_regions);
 }
 
-G1HeapRegion* HeapRegionManager::allocate_humongous_allow_expand(uint num_regions) {
+G1HeapRegion* G1HeapRegionManager::allocate_humongous_allow_expand(uint num_regions) {
   uint candidate = find_contiguous_allow_expand(num_regions);
   if (candidate == G1_NO_HRM_INDEX) {
     return nullptr;
@@ -135,25 +135,25 @@ G1HeapRegion* HeapRegionManager::allocate_humongous_allow_expand(uint num_region
   return allocate_free_regions_starting_at(candidate, num_regions);
 }
 
-G1HeapRegion* HeapRegionManager::allocate_humongous(uint num_regions) {
+G1HeapRegion* G1HeapRegionManager::allocate_humongous(uint num_regions) {
   // Special case a single region to avoid expensive search.
   if (num_regions == 1) {
-    return allocate_free_region(HeapRegionType::Humongous, G1NUMA::AnyNodeIndex);
+    return allocate_free_region(G1HeapRegionType::Humongous, G1NUMA::AnyNodeIndex);
   }
   return allocate_humongous_from_free_list(num_regions);
 }
 
-G1HeapRegion* HeapRegionManager::expand_and_allocate_humongous(uint num_regions) {
+G1HeapRegion* G1HeapRegionManager::expand_and_allocate_humongous(uint num_regions) {
   return allocate_humongous_allow_expand(num_regions);
 }
 
 #ifdef ASSERT
-bool HeapRegionManager::is_free(G1HeapRegion* hr) const {
+bool G1HeapRegionManager::is_free(G1HeapRegion* hr) const {
   return _free_list.contains(hr);
 }
 #endif
 
-G1HeapRegion* HeapRegionManager::new_heap_region(uint hrm_index) {
+G1HeapRegion* G1HeapRegionManager::new_heap_region(uint hrm_index) {
   G1CollectedHeap* g1h = G1CollectedHeap::heap();
   HeapWord* bottom = g1h->bottom_addr_for_region(hrm_index);
   MemRegion mr(bottom, bottom + G1HeapRegion::GrainWords);
@@ -161,7 +161,7 @@ G1HeapRegion* HeapRegionManager::new_heap_region(uint hrm_index) {
   return g1h->new_heap_region(hrm_index, mr);
 }
 
-void HeapRegionManager::expand(uint start, uint num_regions, WorkerThreads* pretouch_workers) {
+void G1HeapRegionManager::expand(uint start, uint num_regions, WorkerThreads* pretouch_workers) {
   commit_regions(start, num_regions, pretouch_workers);
   for (uint i = start; i < start + num_regions; i++) {
     G1HeapRegion* hr = _regions.get_by_index(i);
@@ -176,7 +176,7 @@ void HeapRegionManager::expand(uint start, uint num_regions, WorkerThreads* pret
   activate_regions(start, num_regions);
 }
 
-void HeapRegionManager::commit_regions(uint index, size_t num_regions, WorkerThreads* pretouch_workers) {
+void G1HeapRegionManager::commit_regions(uint index, size_t num_regions, WorkerThreads* pretouch_workers) {
   guarantee(num_regions > 0, "Must commit more than zero regions");
   guarantee(num_regions <= available(),
             "Cannot commit more than the maximum amount of regions");
@@ -190,7 +190,7 @@ void HeapRegionManager::commit_regions(uint index, size_t num_regions, WorkerThr
   _cardtable_mapper->commit_regions(index, num_regions, pretouch_workers);
 }
 
-void HeapRegionManager::uncommit_regions(uint start, uint num_regions) {
+void G1HeapRegionManager::uncommit_regions(uint start, uint num_regions) {
   guarantee(num_regions > 0, "No point in calling this for zero regions");
 
   uint end = start + num_regions;
@@ -215,7 +215,7 @@ void HeapRegionManager::uncommit_regions(uint start, uint num_regions) {
   _committed_map.uncommit(start, end);
 }
 
-void HeapRegionManager::initialize_regions(uint start, uint num_regions) {
+void G1HeapRegionManager::initialize_regions(uint start, uint num_regions) {
   for (uint i = start; i < start + num_regions; i++) {
     assert(is_available(i), "Just made region %u available but is apparently not.", i);
     G1HeapRegion* hr = at(i);
@@ -227,12 +227,12 @@ void HeapRegionManager::initialize_regions(uint start, uint num_regions) {
   }
 }
 
-void HeapRegionManager::activate_regions(uint start, uint num_regions) {
+void G1HeapRegionManager::activate_regions(uint start, uint num_regions) {
   _committed_map.activate(start, start + num_regions);
   initialize_regions(start, num_regions);
 }
 
-void HeapRegionManager::reactivate_regions(uint start, uint num_regions) {
+void G1HeapRegionManager::reactivate_regions(uint start, uint num_regions) {
   assert(num_regions > 0, "No point in calling this for zero regions");
 
   clear_auxiliary_data_structures(start, num_regions);
@@ -241,7 +241,7 @@ void HeapRegionManager::reactivate_regions(uint start, uint num_regions) {
   initialize_regions(start, num_regions);
 }
 
-void HeapRegionManager::deactivate_regions(uint start, uint num_regions) {
+void G1HeapRegionManager::deactivate_regions(uint start, uint num_regions) {
   assert(num_regions > 0, "Need to specify at least one region to uncommit, tried to uncommit zero regions at %u", start);
   assert(length() >= num_regions, "pre-condition");
 
@@ -256,7 +256,7 @@ void HeapRegionManager::deactivate_regions(uint start, uint num_regions) {
   _committed_map.deactivate(start, end);
 }
 
-void HeapRegionManager::clear_auxiliary_data_structures(uint start, uint num_regions) {
+void G1HeapRegionManager::clear_auxiliary_data_structures(uint start, uint num_regions) {
   // Signal marking bitmaps to clear the given regions.
   _bitmap_mapper->signal_mapping_changed(start, num_regions);
   // Signal G1BlockOffsetTable to clear the given regions.
@@ -265,7 +265,7 @@ void HeapRegionManager::clear_auxiliary_data_structures(uint start, uint num_reg
   _cardtable_mapper->signal_mapping_changed(start, num_regions);
 }
 
-MemoryUsage HeapRegionManager::get_auxiliary_data_memory_usage() const {
+MemoryUsage G1HeapRegionManager::get_auxiliary_data_memory_usage() const {
   size_t used_sz =
     _bitmap_mapper->committed_size() +
     _bot_mapper->committed_size() +
@@ -279,18 +279,18 @@ MemoryUsage HeapRegionManager::get_auxiliary_data_memory_usage() const {
   return MemoryUsage(0, used_sz, committed_sz, committed_sz);
 }
 
-bool HeapRegionManager::has_inactive_regions() const {
+bool G1HeapRegionManager::has_inactive_regions() const {
   return _committed_map.num_inactive() > 0;
 }
 
-uint HeapRegionManager::uncommit_inactive_regions(uint limit) {
+uint G1HeapRegionManager::uncommit_inactive_regions(uint limit) {
   assert(limit > 0, "Need to specify at least one region to uncommit");
 
   uint uncommitted = 0;
   uint offset = 0;
   do {
     MutexLocker uc(Uncommit_lock, Mutex::_no_safepoint_check_flag);
-    HeapRegionRange range = _committed_map.next_inactive_range(offset);
+    G1HeapRegionRange range = _committed_map.next_inactive_range(offset);
     // No more regions available for uncommit. Return the number of regions
     // already uncommitted or 0 if there were no longer any inactive regions.
     if (range.length() == 0) {
@@ -307,12 +307,12 @@ uint HeapRegionManager::uncommit_inactive_regions(uint limit) {
   return uncommitted;
 }
 
-uint HeapRegionManager::expand_inactive(uint num_regions) {
+uint G1HeapRegionManager::expand_inactive(uint num_regions) {
   uint offset = 0;
   uint expanded = 0;
 
   do {
-    HeapRegionRange regions = _committed_map.next_inactive_range(offset);
+    G1HeapRegionRange regions = _committed_map.next_inactive_range(offset);
     if (regions.length() == 0) {
       // No more unavailable regions.
       break;
@@ -327,14 +327,14 @@ uint HeapRegionManager::expand_inactive(uint num_regions) {
   return expanded;
 }
 
-uint HeapRegionManager::expand_any(uint num_regions, WorkerThreads* pretouch_workers) {
+uint G1HeapRegionManager::expand_any(uint num_regions, WorkerThreads* pretouch_workers) {
   assert(num_regions > 0, "Must expand at least 1 region");
 
   uint offset = 0;
   uint expanded = 0;
 
   do {
-    HeapRegionRange regions = _committed_map.next_committable_range(offset);
+    G1HeapRegionRange regions = _committed_map.next_committable_range(offset);
     if (regions.length() == 0) {
       // No more unavailable regions.
       break;
@@ -349,7 +349,7 @@ uint HeapRegionManager::expand_any(uint num_regions, WorkerThreads* pretouch_wor
   return expanded;
 }
 
-uint HeapRegionManager::expand_by(uint num_regions, WorkerThreads* pretouch_workers) {
+uint G1HeapRegionManager::expand_by(uint num_regions, WorkerThreads* pretouch_workers) {
   assert(num_regions > 0, "Must expand at least 1 region");
 
   // First "undo" any requests to uncommit memory concurrently by
@@ -365,7 +365,7 @@ uint HeapRegionManager::expand_by(uint num_regions, WorkerThreads* pretouch_work
   return expanded;
 }
 
-void HeapRegionManager::expand_exact(uint start, uint num_regions, WorkerThreads* pretouch_workers) {
+void G1HeapRegionManager::expand_exact(uint start, uint num_regions, WorkerThreads* pretouch_workers) {
   assert(num_regions != 0, "Need to request at least one region");
   uint end = start + num_regions;
 
@@ -393,7 +393,7 @@ void HeapRegionManager::expand_exact(uint start, uint num_regions, WorkerThreads
   verify_optional();
 }
 
-uint HeapRegionManager::expand_on_preferred_node(uint preferred_index) {
+uint G1HeapRegionManager::expand_on_preferred_node(uint preferred_index) {
   uint expand_candidate = UINT_MAX;
 
   if (available() >= 1) {
@@ -420,13 +420,13 @@ uint HeapRegionManager::expand_on_preferred_node(uint preferred_index) {
   return 1;
 }
 
-bool HeapRegionManager::is_on_preferred_index(uint region_index, uint preferred_node_index) {
+bool G1HeapRegionManager::is_on_preferred_index(uint region_index, uint preferred_node_index) {
   uint region_node_index = G1NUMA::numa()->preferred_node_index_for_index(region_index);
   return region_node_index == preferred_node_index;
 }
 
 #ifdef ASSERT
-void HeapRegionManager::assert_contiguous_range(uint start, uint num_regions) {
+void G1HeapRegionManager::assert_contiguous_range(uint start, uint num_regions) {
   // General sanity check, regions found should either be available and empty
   // or not available so that we can make them available and use them.
   for (uint i = start; i < (start + num_regions); i++) {
@@ -439,7 +439,7 @@ void HeapRegionManager::assert_contiguous_range(uint start, uint num_regions) {
 }
 #endif
 
-uint HeapRegionManager::find_contiguous_in_range(uint start, uint end, uint num_regions) {
+uint G1HeapRegionManager::find_contiguous_in_range(uint start, uint end, uint num_regions) {
   assert(start <= end, "precondition");
   assert(num_regions >= 1, "precondition");
   uint candidate = start;       // First region in candidate sequence.
@@ -465,9 +465,9 @@ uint HeapRegionManager::find_contiguous_in_range(uint start, uint end, uint num_
   return G1_NO_HRM_INDEX;
 }
 
-uint HeapRegionManager::find_contiguous_in_free_list(uint num_regions) {
+uint G1HeapRegionManager::find_contiguous_in_free_list(uint num_regions) {
   uint candidate = G1_NO_HRM_INDEX;
-  HeapRegionRange range(0,0);
+  G1HeapRegionRange range(0,0);
 
   do {
     range = _committed_map.next_active_range(range.end());
@@ -477,7 +477,7 @@ uint HeapRegionManager::find_contiguous_in_free_list(uint num_regions) {
   return candidate;
 }
 
-uint HeapRegionManager::find_contiguous_allow_expand(uint num_regions) {
+uint G1HeapRegionManager::find_contiguous_allow_expand(uint num_regions) {
   // Check if we can actually satisfy the allocation.
   if (num_regions > available()) {
     return G1_NO_HRM_INDEX;
@@ -486,7 +486,7 @@ uint HeapRegionManager::find_contiguous_allow_expand(uint num_regions) {
   return find_contiguous_in_range(0, reserved_length(), num_regions);
 }
 
-G1HeapRegion* HeapRegionManager::next_region_in_heap(const G1HeapRegion* r) const {
+G1HeapRegion* G1HeapRegionManager::next_region_in_heap(const G1HeapRegion* r) const {
   guarantee(r != nullptr, "Start region must be a valid region");
   guarantee(is_available(r->hrm_index()), "Trying to iterate starting from region %u which is not in the heap", r->hrm_index());
   for (uint i = r->hrm_index() + 1; i < _allocated_heapregions_length; i++) {
@@ -498,7 +498,7 @@ G1HeapRegion* HeapRegionManager::next_region_in_heap(const G1HeapRegion* r) cons
   return nullptr;
 }
 
-void HeapRegionManager::iterate(HeapRegionClosure* blk) const {
+void G1HeapRegionManager::iterate(G1HeapRegionClosure* blk) const {
   uint len = reserved_length();
 
   for (uint i = 0; i < len; i++) {
@@ -514,7 +514,7 @@ void HeapRegionManager::iterate(HeapRegionClosure* blk) const {
   }
 }
 
-void HeapRegionManager::iterate(HeapRegionIndexClosure* blk) const {
+void G1HeapRegionManager::iterate(G1HeapRegionIndexClosure* blk) const {
   uint len = reserved_length();
 
   for (uint i = 0; i < len; i++) {
@@ -529,7 +529,7 @@ void HeapRegionManager::iterate(HeapRegionIndexClosure* blk) const {
   }
 }
 
-uint HeapRegionManager::find_highest_free(bool* expanded) {
+uint G1HeapRegionManager::find_highest_free(bool* expanded) {
   // Loop downwards from the highest region index, looking for an
   // entry which is either free or not yet committed.  If not yet
   // committed, expand at that index.
@@ -551,7 +551,7 @@ uint HeapRegionManager::find_highest_free(bool* expanded) {
   return G1_NO_HRM_INDEX;
 }
 
-bool HeapRegionManager::allocate_containing_regions(MemRegion range, size_t* commit_count, WorkerThreads* pretouch_workers) {
+bool G1HeapRegionManager::allocate_containing_regions(MemRegion range, size_t* commit_count, WorkerThreads* pretouch_workers) {
   size_t commits = 0;
   uint start_index = (uint)_regions.get_index_by_address(range.start());
   uint last_index = (uint)_regions.get_index_by_address(range.last());
@@ -574,7 +574,7 @@ bool HeapRegionManager::allocate_containing_regions(MemRegion range, size_t* com
   return true;
 }
 
-void HeapRegionManager::par_iterate(HeapRegionClosure* blk, HeapRegionClaimer* hrclaimer, const uint start_index) const {
+void G1HeapRegionManager::par_iterate(G1HeapRegionClosure* blk, G1HeapRegionClaimer* hrclaimer, const uint start_index) const {
   // Every worker will actually look at all regions, skipping over regions that
   // are currently not committed.
   // This also (potentially) iterates over regions newly allocated during GC. This
@@ -603,7 +603,7 @@ void HeapRegionManager::par_iterate(HeapRegionClosure* blk, HeapRegionClaimer* h
   }
 }
 
-uint HeapRegionManager::shrink_by(uint num_regions_to_remove) {
+uint G1HeapRegionManager::shrink_by(uint num_regions_to_remove) {
   assert(length() > 0, "the region sequence should not be empty");
   assert(length() <= _allocated_heapregions_length, "invariant");
   assert(_allocated_heapregions_length > 0, "we should have at least one region committed");
@@ -633,7 +633,7 @@ uint HeapRegionManager::shrink_by(uint num_regions_to_remove) {
   return removed;
 }
 
-void HeapRegionManager::shrink_at(uint index, size_t num_regions) {
+void G1HeapRegionManager::shrink_at(uint index, size_t num_regions) {
 #ifdef ASSERT
   for (uint i = index; i < (index + num_regions); i++) {
     assert(is_available(i), "Expected available region at index %u", i);
@@ -645,7 +645,7 @@ void HeapRegionManager::shrink_at(uint index, size_t num_regions) {
   deactivate_regions(index, (uint) num_regions);
 }
 
-uint HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_idx) const {
+uint G1HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_idx) const {
   guarantee(start_idx <= _allocated_heapregions_length, "checking");
   guarantee(res_idx != nullptr, "checking");
 
@@ -679,7 +679,7 @@ uint HeapRegionManager::find_empty_from_idx_reverse(uint start_idx, uint* res_id
   return num_regions_found;
 }
 
-void HeapRegionManager::verify() {
+void G1HeapRegionManager::verify() {
   guarantee(length() <= _allocated_heapregions_length,
             "invariant: _length: %u _allocated_length: %u",
             length(), _allocated_heapregions_length);
@@ -724,65 +724,65 @@ void HeapRegionManager::verify() {
 }
 
 #ifndef PRODUCT
-void HeapRegionManager::verify_optional() {
+void G1HeapRegionManager::verify_optional() {
   verify();
 }
 #endif // PRODUCT
 
-HeapRegionClaimer::HeapRegionClaimer(uint n_workers) :
+G1HeapRegionClaimer::G1HeapRegionClaimer(uint n_workers) :
     _n_workers(n_workers), _n_regions(G1CollectedHeap::heap()->_hrm._allocated_heapregions_length), _claims(nullptr) {
   uint* new_claims = NEW_C_HEAP_ARRAY(uint, _n_regions, mtGC);
   memset(new_claims, Unclaimed, sizeof(*_claims) * _n_regions);
   _claims = new_claims;
 }
 
-HeapRegionClaimer::~HeapRegionClaimer() {
+G1HeapRegionClaimer::~G1HeapRegionClaimer() {
   FREE_C_HEAP_ARRAY(uint, _claims);
 }
 
-uint HeapRegionClaimer::offset_for_worker(uint worker_id) const {
+uint G1HeapRegionClaimer::offset_for_worker(uint worker_id) const {
   assert(_n_workers > 0, "must be set");
   assert(worker_id < _n_workers, "Invalid worker_id.");
   return _n_regions * worker_id / _n_workers;
 }
 
-bool HeapRegionClaimer::is_region_claimed(uint region_index) const {
+bool G1HeapRegionClaimer::is_region_claimed(uint region_index) const {
   assert(region_index < _n_regions, "Invalid index.");
   return _claims[region_index] == Claimed;
 }
 
-bool HeapRegionClaimer::claim_region(uint region_index) {
+bool G1HeapRegionClaimer::claim_region(uint region_index) {
   assert(region_index < _n_regions, "Invalid index.");
   uint old_val = Atomic::cmpxchg(&_claims[region_index], Unclaimed, Claimed);
   return old_val == Unclaimed;
 }
 
 class G1RebuildFreeListTask : public WorkerTask {
-  HeapRegionManager* _hrm;
-  FreeRegionList*    _worker_freelists;
-  uint               _worker_chunk_size;
-  uint               _num_workers;
+  G1HeapRegionManager* _hrm;
+  G1FreeRegionList*    _worker_freelists;
+  uint                 _worker_chunk_size;
+  uint                 _num_workers;
 
 public:
-  G1RebuildFreeListTask(HeapRegionManager* hrm, uint num_workers) :
+  G1RebuildFreeListTask(G1HeapRegionManager* hrm, uint num_workers) :
       WorkerTask("G1 Rebuild Free List Task"),
       _hrm(hrm),
-      _worker_freelists(NEW_C_HEAP_ARRAY(FreeRegionList, num_workers, mtGC)),
+      _worker_freelists(NEW_C_HEAP_ARRAY(G1FreeRegionList, num_workers, mtGC)),
       _worker_chunk_size((_hrm->reserved_length() + num_workers - 1) / num_workers),
       _num_workers(num_workers) {
     for (uint worker = 0; worker < _num_workers; worker++) {
-      ::new (&_worker_freelists[worker]) FreeRegionList("Appendable Worker Free List");
+      ::new (&_worker_freelists[worker]) G1FreeRegionList("Appendable Worker Free List");
     }
   }
 
   ~G1RebuildFreeListTask() {
     for (uint worker = 0; worker < _num_workers; worker++) {
-      _worker_freelists[worker].~FreeRegionList();
+      _worker_freelists[worker].~G1FreeRegionList();
     }
-    FREE_C_HEAP_ARRAY(FreeRegionList, _worker_freelists);
+    FREE_C_HEAP_ARRAY(G1FreeRegionList, _worker_freelists);
   }
 
-  FreeRegionList* worker_freelist(uint worker) {
+  G1FreeRegionList* worker_freelist(uint worker) {
     return &_worker_freelists[worker];
   }
 
@@ -800,7 +800,7 @@ class G1RebuildFreeListTask : public WorkerTask {
       return;
     }
 
-    FreeRegionList* free_list = worker_freelist(worker_id);
+    G1FreeRegionList* free_list = worker_freelist(worker_id);
     for (uint i = start; i < end; i++) {
       G1HeapRegion* region = _hrm->at_or_null(i);
       if (region != nullptr && region->is_free()) {
@@ -815,7 +815,7 @@ class G1RebuildFreeListTask : public WorkerTask {
   }
 };
 
-void HeapRegionManager::rebuild_free_list(WorkerThreads* workers) {
+void G1HeapRegionManager::rebuild_free_list(WorkerThreads* workers) {
   // Abandon current free list to allow a rebuild.
   _free_list.abandon();
 
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionManager.hpp b/src/hotspot/share/gc/g1/g1HeapRegionManager.hpp
index 3162cc39a99..d3f1843f07d 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionManager.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionManager.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -33,9 +33,9 @@
 #include "services/memoryUsage.hpp"
 
 class G1HeapRegion;
-class HeapRegionClosure;
-class HeapRegionClaimer;
-class FreeRegionList;
+class G1HeapRegionClaimer;
+class G1HeapRegionClosure;
+class G1FreeRegionList;
 class WorkerThreads;
 
 class G1HeapRegionTable : public G1BiasedMappedArray<G1HeapRegion*> {
@@ -49,7 +49,7 @@ class G1HeapRegionTable : public G1BiasedMappedArray<G1HeapRegion*> {
 // This allows maximum flexibility for deciding what to commit or uncommit given
 // a request from outside.
 //
-// HeapRegions are kept in the _regions array in address order. A region's
+// G1HeapRegions are kept in the _regions array in address order. A region's
 // index in the array corresponds to its index in the heap (i.e., 0 is the
 // region at the bottom of the heap, 1 is the one after it, etc.). Two
 // regions that are consecutive in the array should also be adjacent in the
@@ -65,14 +65,14 @@ class G1HeapRegionTable : public G1BiasedMappedArray<G1HeapRegion*> {
 // * _num_committed (returned by length()) is the number of currently
 //   committed regions. These may not be contiguous.
 // * _allocated_heapregions_length (not exposed outside this class) is the
-//   number of regions+1 for which we have HeapRegions.
+//   number of regions+1 for which we have G1HeapRegions.
 // * max_length() returns the maximum number of regions the heap may commit.
 // * reserved_length() returns the maximum number of regions the heap has reserved.
 //
 
-class HeapRegionManager: public CHeapObj<mtGC> {
+class G1HeapRegionManager: public CHeapObj<mtGC> {
   friend class VMStructs;
-  friend class HeapRegionClaimer;
+  friend class G1HeapRegionClaimer;
 
   G1RegionToSpaceMapper* _bot_mapper;
   G1RegionToSpaceMapper* _cardtable_mapper;
@@ -90,7 +90,7 @@ class HeapRegionManager: public CHeapObj<mtGC> {
   // Pass down commit calls to the VirtualSpace.
   void commit_regions(uint index, size_t num_regions = 1, WorkerThreads* pretouch_workers = nullptr);
 
-  // Initialize the HeapRegions in the range and put them on the free list.
+  // Initialize the G1HeapRegions in the range and put them on the free list.
   void initialize_regions(uint start, uint num_regions);
 
   // Find a contiguous set of empty or uncommitted regions of length num_regions and return
@@ -123,7 +123,7 @@ class HeapRegionManager: public CHeapObj<mtGC> {
   G1HeapRegionTable _regions;
   G1RegionToSpaceMapper* _heap_mapper;
   G1RegionToSpaceMapper* _bitmap_mapper;
-  FreeRegionList _free_list;
+  G1FreeRegionList _free_list;
 
   void expand(uint index, uint num_regions, WorkerThreads* pretouch_workers = nullptr);
 
@@ -157,7 +157,7 @@ class HeapRegionManager: public CHeapObj<mtGC> {
 #endif
 public:
   // Empty constructor, we'll initialize it with the initialize() method.
-  HeapRegionManager();
+  G1HeapRegionManager();
 
   void initialize(G1RegionToSpaceMapper* heap_storage,
                   G1RegionToSpaceMapper* bitmap,
@@ -196,12 +196,12 @@ class HeapRegionManager: public CHeapObj<mtGC> {
   void rebuild_free_list(WorkerThreads* workers);
 
   // Insert the given region list into the global free region list.
-  void insert_list_into_free_list(FreeRegionList* list) {
+  void insert_list_into_free_list(G1FreeRegionList* list) {
     _free_list.add_ordered(list);
   }
 
   // Allocate a free region with specific node index. If fails allocate with next node index.
-  G1HeapRegion* allocate_free_region(HeapRegionType type, uint requested_node_index);
+  G1HeapRegion* allocate_free_region(G1HeapRegionType type, uint requested_node_index);
 
   // Allocate a humongous object from the free list
   G1HeapRegion* allocate_humongous(uint num_regions);
@@ -246,7 +246,7 @@ class HeapRegionManager: public CHeapObj<mtGC> {
   MemRegion reserved() const { return MemRegion(heap_bottom(), heap_end()); }
 
   // Expand the sequence to reflect that the heap has grown. Either create new
-  // HeapRegions, or re-use existing ones. Returns the number of regions the
+  // G1HeapRegions, or re-use existing ones. Returns the number of regions the
   // sequence was expanded by. If a G1HeapRegion allocation fails, the resulting
   // number of regions might be smaller than what's desired.
   uint expand_by(uint num_regions, WorkerThreads* pretouch_workers);
@@ -268,10 +268,10 @@ class HeapRegionManager: public CHeapObj<mtGC> {
 
   // Apply blk->do_heap_region() on all committed regions in address order,
   // terminating the iteration early if do_heap_region() returns true.
-  void iterate(HeapRegionClosure* blk) const;
-  void iterate(HeapRegionIndexClosure* blk) const;
+  void iterate(G1HeapRegionClosure* blk) const;
+  void iterate(G1HeapRegionIndexClosure* blk) const;
 
-  void par_iterate(HeapRegionClosure* blk, HeapRegionClaimer* hrclaimer, const uint start_index) const;
+  void par_iterate(G1HeapRegionClosure* blk, G1HeapRegionClaimer* hrclaimer, const uint start_index) const;
 
   // Uncommit up to num_regions_to_remove regions that are completely free.
   // Return the actual number of uncommitted regions.
@@ -294,9 +294,9 @@ class HeapRegionManager: public CHeapObj<mtGC> {
   void verify_optional() PRODUCT_RETURN;
 };
 
-// The HeapRegionClaimer is used during parallel iteration over heap regions,
+// The G1HeapRegionClaimer is used during parallel iteration over heap regions,
 // allowing workers to claim heap regions, gaining exclusive rights to these regions.
-class HeapRegionClaimer : public StackObj {
+class G1HeapRegionClaimer : public StackObj {
   uint           _n_workers;
   uint           _n_regions;
   volatile uint* _claims;
@@ -305,8 +305,8 @@ class HeapRegionClaimer : public StackObj {
   static const uint Claimed   = 1;
 
  public:
-  HeapRegionClaimer(uint n_workers);
-  ~HeapRegionClaimer();
+  G1HeapRegionClaimer(uint n_workers);
+  ~G1HeapRegionClaimer();
 
   inline uint n_regions() const {
     return _n_regions;
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionManager.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegionManager.inline.hpp
index 0a74a22c52e..f78f12672e3 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionManager.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionManager.inline.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,11 +31,11 @@
 #include "gc/g1/g1HeapRegion.hpp"
 #include "gc/g1/g1HeapRegionSet.inline.hpp"
 
-inline bool HeapRegionManager::is_available(uint region) const {
+inline bool G1HeapRegionManager::is_available(uint region) const {
   return _committed_map.active(region);
 }
 
-inline G1HeapRegion* HeapRegionManager::addr_to_region(HeapWord* addr) const {
+inline G1HeapRegion* G1HeapRegionManager::addr_to_region(HeapWord* addr) const {
   assert(addr < heap_end(),
         "addr: " PTR_FORMAT " end: " PTR_FORMAT, p2i(addr), p2i(heap_end()));
   assert(addr >= heap_bottom(),
@@ -43,7 +43,7 @@ inline G1HeapRegion* HeapRegionManager::addr_to_region(HeapWord* addr) const {
   return _regions.get_by_address(addr);
 }
 
-inline G1HeapRegion* HeapRegionManager::at(uint index) const {
+inline G1HeapRegion* G1HeapRegionManager::at(uint index) const {
   assert(is_available(index), "pre-condition");
   G1HeapRegion* hr = _regions.get_by_index(index);
   assert(hr != nullptr, "sanity");
@@ -51,7 +51,7 @@ inline G1HeapRegion* HeapRegionManager::at(uint index) const {
   return hr;
 }
 
-inline G1HeapRegion* HeapRegionManager::at_or_null(uint index) const {
+inline G1HeapRegion* G1HeapRegionManager::at_or_null(uint index) const {
   if (!is_available(index)) {
     return nullptr;
   }
@@ -61,7 +61,7 @@ inline G1HeapRegion* HeapRegionManager::at_or_null(uint index) const {
   return hr;
 }
 
-inline G1HeapRegion* HeapRegionManager::next_region_in_humongous(G1HeapRegion* hr) const {
+inline G1HeapRegion* G1HeapRegionManager::next_region_in_humongous(G1HeapRegion* hr) const {
   uint index = hr->hrm_index();
   assert(is_available(index), "pre-condition");
   assert(hr->is_humongous(), "next_region_in_humongous should only be called for a humongous region.");
@@ -73,11 +73,11 @@ inline G1HeapRegion* HeapRegionManager::next_region_in_humongous(G1HeapRegion* h
   }
 }
 
-inline void HeapRegionManager::insert_into_free_list(G1HeapRegion* hr) {
+inline void G1HeapRegionManager::insert_into_free_list(G1HeapRegion* hr) {
   _free_list.add_ordered(hr);
 }
 
-inline G1HeapRegion* HeapRegionManager::allocate_free_regions_starting_at(uint first, uint num_regions) {
+inline G1HeapRegion* G1HeapRegionManager::allocate_free_regions_starting_at(uint first, uint num_regions) {
   G1HeapRegion* start = at(first);
   _free_list.remove_starting_at(start, num_regions);
   return start;
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionPrinter.hpp b/src/hotspot/share/gc/g1/g1HeapRegionPrinter.hpp
index bd686f3809d..d7b1a6da92c 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionPrinter.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionPrinter.hpp
@@ -29,7 +29,7 @@
 #include "logging/log.hpp"
 #include "memory/allStatic.hpp"
 
-class FreeRegionList;
+class G1FreeRegionList;
 
 class G1HeapRegionPrinter : public AllStatic {
 
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.cpp b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.cpp
index 2610fbde298..6e98b64adbc 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -45,17 +45,17 @@
 #include "utilities/growableArray.hpp"
 #include "utilities/powerOfTwo.hpp"
 
-HeapWord* HeapRegionRemSet::_heap_base_address = nullptr;
+HeapWord* G1HeapRegionRemSet::_heap_base_address = nullptr;
 
-const char* HeapRegionRemSet::_state_strings[] =  {"Untracked", "Updating", "Complete"};
-const char* HeapRegionRemSet::_short_state_strings[] =  {"UNTRA", "UPDAT", "CMPLT"};
+const char* G1HeapRegionRemSet::_state_strings[] =  {"Untracked", "Updating", "Complete"};
+const char* G1HeapRegionRemSet::_short_state_strings[] =  {"UNTRA", "UPDAT", "CMPLT"};
 
-void HeapRegionRemSet::initialize(MemRegion reserved) {
+void G1HeapRegionRemSet::initialize(MemRegion reserved) {
   G1CardSet::initialize(reserved);
   _heap_base_address = reserved.start();
 }
 
-HeapRegionRemSet::HeapRegionRemSet(G1HeapRegion* hr,
+G1HeapRegionRemSet::G1HeapRegionRemSet(G1HeapRegion* hr,
                                    G1CardSetConfiguration* config) :
   _code_roots(),
   _card_set_mm(config, G1CollectedHeap::heap()->card_set_freelist_pool()),
@@ -63,11 +63,11 @@ HeapRegionRemSet::HeapRegionRemSet(G1HeapRegion* hr,
   _hr(hr),
   _state(Untracked) { }
 
-void HeapRegionRemSet::clear_fcc() {
+void G1HeapRegionRemSet::clear_fcc() {
   G1FromCardCache::clear(_hr->hrm_index());
 }
 
-void HeapRegionRemSet::clear(bool only_cardset, bool keep_tracked) {
+void G1HeapRegionRemSet::clear(bool only_cardset, bool keep_tracked) {
   if (!only_cardset) {
     _code_roots.clear();
   }
@@ -81,17 +81,17 @@ void HeapRegionRemSet::clear(bool only_cardset, bool keep_tracked) {
   assert(occupied() == 0, "Should be clear.");
 }
 
-void HeapRegionRemSet::reset_table_scanner() {
+void G1HeapRegionRemSet::reset_table_scanner() {
   _code_roots.reset_table_scanner();
   _card_set.reset_table_scanner();
 }
 
-G1MonotonicArenaMemoryStats HeapRegionRemSet::card_set_memory_stats() const {
+G1MonotonicArenaMemoryStats G1HeapRegionRemSet::card_set_memory_stats() const {
   return _card_set_mm.memory_stats();
 }
 
-void HeapRegionRemSet::print_static_mem_size(outputStream* out) {
-  out->print_cr("  Static structures = " SIZE_FORMAT, HeapRegionRemSet::static_mem_size());
+void G1HeapRegionRemSet::print_static_mem_size(outputStream* out) {
+  out->print_cr("  Static structures = " SIZE_FORMAT, G1HeapRegionRemSet::static_mem_size());
 }
 
 // Code roots support
@@ -101,12 +101,12 @@ void HeapRegionRemSet::print_static_mem_size(outputStream* out) {
 // except when doing a full gc.
 // When not at safepoint the CodeCache_lock must be held during modifications.
 
-void HeapRegionRemSet::add_code_root(nmethod* nm) {
+void G1HeapRegionRemSet::add_code_root(nmethod* nm) {
   assert(nm != nullptr, "sanity");
   _code_roots.add(nm);
 }
 
-void HeapRegionRemSet::remove_code_root(nmethod* nm) {
+void G1HeapRegionRemSet::remove_code_root(nmethod* nm) {
   assert(nm != nullptr, "sanity");
 
   _code_roots.remove(nm);
@@ -115,18 +115,18 @@ void HeapRegionRemSet::remove_code_root(nmethod* nm) {
   guarantee(!_code_roots.contains(nm), "duplicate entry found");
 }
 
-void HeapRegionRemSet::bulk_remove_code_roots() {
+void G1HeapRegionRemSet::bulk_remove_code_roots() {
   _code_roots.bulk_remove();
 }
 
-void HeapRegionRemSet::code_roots_do(NMethodClosure* blk) const {
+void G1HeapRegionRemSet::code_roots_do(NMethodClosure* blk) const {
   _code_roots.nmethods_do(blk);
 }
 
-void HeapRegionRemSet::clean_code_roots(G1HeapRegion* hr) {
+void G1HeapRegionRemSet::clean_code_roots(G1HeapRegion* hr) {
   _code_roots.clean(hr);
 }
 
-size_t HeapRegionRemSet::code_roots_mem_size() {
+size_t G1HeapRegionRemSet::code_roots_mem_size() {
   return _code_roots.mem_size();
 }
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.hpp b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.hpp
index fb0a64ac0d1..e92ecdc9cf9 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -37,7 +37,7 @@
 class G1CardSetMemoryManager;
 class outputStream;
 
-class HeapRegionRemSet : public CHeapObj<mtGC> {
+class G1HeapRegionRemSet : public CHeapObj<mtGC> {
   friend class VMStructs;
 
   // A set of nmethods whose code contains pointers into
@@ -57,7 +57,7 @@ class HeapRegionRemSet : public CHeapObj<mtGC> {
   void clear_fcc();
 
 public:
-  HeapRegionRemSet(G1HeapRegion* hr, G1CardSetConfiguration* config);
+  G1HeapRegionRemSet(G1HeapRegion* hr, G1CardSetConfiguration* config);
 
   bool cardset_is_empty() const {
     return _card_set.is_empty();
@@ -126,7 +126,7 @@ class HeapRegionRemSet : public CHeapObj<mtGC> {
   // root set.
   size_t mem_size() {
     return _card_set.mem_size()
-           + (sizeof(HeapRegionRemSet) - sizeof(G1CardSet)) // Avoid double-counting G1CardSet.
+           + (sizeof(G1HeapRegionRemSet) - sizeof(G1CardSet)) // Avoid double-counting G1CardSet.
            + code_roots_mem_size();
   }
 
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.inline.hpp
index 78153cc0c30..457027ad126 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionRemSet.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionRemSet.inline.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -33,7 +33,7 @@
 #include "runtime/atomic.hpp"
 #include "utilities/bitMap.inline.hpp"
 
-void HeapRegionRemSet::set_state_untracked() {
+void G1HeapRegionRemSet::set_state_untracked() {
   guarantee(SafepointSynchronize::is_at_safepoint() || !is_tracked(),
             "Should only set to Untracked during safepoint but is %s.", get_state_str());
   if (_state == Untracked) {
@@ -43,14 +43,14 @@ void HeapRegionRemSet::set_state_untracked() {
   _state = Untracked;
 }
 
-void HeapRegionRemSet::set_state_updating() {
+void G1HeapRegionRemSet::set_state_updating() {
   guarantee(SafepointSynchronize::is_at_safepoint() && !is_tracked(),
             "Should only set to Updating from Untracked during safepoint but is %s", get_state_str());
   clear_fcc();
   _state = Updating;
 }
 
-void HeapRegionRemSet::set_state_complete() {
+void G1HeapRegionRemSet::set_state_complete() {
   clear_fcc();
   _state = Complete;
 }
@@ -107,7 +107,7 @@ class G1HeapRegionRemSetMergeCardClosure : public G1CardSet::ContainerPtrClosure
 };
 
 template <class CardOrRangeVisitor>
-inline void HeapRegionRemSet::iterate_for_merge(CardOrRangeVisitor& cl) {
+inline void G1HeapRegionRemSet::iterate_for_merge(CardOrRangeVisitor& cl) {
   G1HeapRegionRemSetMergeCardClosure<CardOrRangeVisitor, G1ContainerCardsOrRanges> cl2(&_card_set,
                                                                                        cl,
                                                                                        _card_set.config()->log2_card_regions_per_heap_region(),
@@ -116,11 +116,11 @@ inline void HeapRegionRemSet::iterate_for_merge(CardOrRangeVisitor& cl) {
 }
 
 
-uintptr_t HeapRegionRemSet::to_card(OopOrNarrowOopStar from) const {
+uintptr_t G1HeapRegionRemSet::to_card(OopOrNarrowOopStar from) const {
   return pointer_delta(from, _heap_base_address, 1) >> CardTable::card_shift();
 }
 
-void HeapRegionRemSet::add_reference(OopOrNarrowOopStar from, uint tid) {
+void G1HeapRegionRemSet::add_reference(OopOrNarrowOopStar from, uint tid) {
   assert(_state != Untracked, "must be");
 
   uint cur_idx = _hr->hrm_index();
@@ -136,11 +136,11 @@ void HeapRegionRemSet::add_reference(OopOrNarrowOopStar from, uint tid) {
   _card_set.add_card(to_card(from));
 }
 
-bool HeapRegionRemSet::contains_reference(OopOrNarrowOopStar from) {
+bool G1HeapRegionRemSet::contains_reference(OopOrNarrowOopStar from) {
   return _card_set.contains_card(to_card(from));
 }
 
-void HeapRegionRemSet::print_info(outputStream* st, OopOrNarrowOopStar from) {
+void G1HeapRegionRemSet::print_info(outputStream* st, OopOrNarrowOopStar from) {
   _card_set.print_info(st, to_card(from));
 }
 
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionSet.cpp b/src/hotspot/share/gc/g1/g1HeapRegionSet.cpp
index eaf475aff34..38796239168 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionSet.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionSet.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,10 +28,10 @@
 #include "gc/g1/g1HeapRegionSet.inline.hpp"
 #include "gc/g1/g1NUMA.hpp"
 
-uint FreeRegionList::_unrealistically_long_length = 0;
+uint G1FreeRegionList::_unrealistically_long_length = 0;
 
 #ifndef PRODUCT
-void HeapRegionSetBase::verify_region(G1HeapRegion* hr) {
+void G1HeapRegionSetBase::verify_region(G1HeapRegion* hr) {
   assert(hr->containing_set() == this, "Inconsistent containing set for %u", hr->hrm_index());
   assert(!hr->is_young(), "Adding young region %u", hr->hrm_index()); // currently we don't use these sets for young regions
   assert(_checker == nullptr || _checker->is_correct_type(hr), "Wrong type of region %u (%s) and set %s",
@@ -41,7 +41,7 @@ void HeapRegionSetBase::verify_region(G1HeapRegion* hr) {
 }
 #endif
 
-void HeapRegionSetBase::verify() {
+void G1HeapRegionSetBase::verify() {
   // It's important that we also observe the MT safety protocol even
   // for the verification calls. If we do verification without the
   // appropriate locks and the set changes underneath our feet
@@ -53,18 +53,18 @@ void HeapRegionSetBase::verify() {
                             "invariant");
 }
 
-void HeapRegionSetBase::verify_start() {
+void G1HeapRegionSetBase::verify_start() {
   // See comment in verify() about MT safety and verification.
   check_mt_safety();
   assert_heap_region_set(!_verify_in_progress, "verification should not be in progress");
 
   // Do the basic verification first before we do the checks over the regions.
-  HeapRegionSetBase::verify();
+  G1HeapRegionSetBase::verify();
 
   _verify_in_progress = true;
 }
 
-void HeapRegionSetBase::verify_end() {
+void G1HeapRegionSetBase::verify_end() {
   // See comment in verify() about MT safety and verification.
   check_mt_safety();
   assert_heap_region_set(_verify_in_progress, "verification should be in progress");
@@ -72,30 +72,30 @@ void HeapRegionSetBase::verify_end() {
   _verify_in_progress = false;
 }
 
-void HeapRegionSetBase::print_on(outputStream* out, bool print_contents) {
+void G1HeapRegionSetBase::print_on(outputStream* out, bool print_contents) {
   out->cr();
   out->print_cr("Set: %s (" PTR_FORMAT ")", name(), p2i(this));
   out->print_cr("  Region Type         : %s", _checker->get_description());
   out->print_cr("  Length              : %14u", length());
 }
 
-HeapRegionSetBase::HeapRegionSetBase(const char* name, HeapRegionSetChecker* checker)
+G1HeapRegionSetBase::G1HeapRegionSetBase(const char* name, G1HeapRegionSetChecker* checker)
   : _checker(checker), _length(0), _name(name), _verify_in_progress(false)
 {
 }
 
-void FreeRegionList::set_unrealistically_long_length(uint len) {
+void G1FreeRegionList::set_unrealistically_long_length(uint len) {
   guarantee(_unrealistically_long_length == 0, "should only be set once");
   _unrealistically_long_length = len;
 }
 
-void FreeRegionList::abandon() {
+void G1FreeRegionList::abandon() {
   check_mt_safety();
   clear();
   verify_optional();
 }
 
-void FreeRegionList::remove_all() {
+void G1FreeRegionList::remove_all() {
   check_mt_safety();
   verify_optional();
 
@@ -117,7 +117,7 @@ void FreeRegionList::remove_all() {
   verify_optional();
 }
 
-void FreeRegionList::add_list_common_start(FreeRegionList* from_list) {
+void G1FreeRegionList::add_list_common_start(G1FreeRegionList* from_list) {
   check_mt_safety();
   from_list->check_mt_safety();
   verify_optional();
@@ -132,7 +132,7 @@ void FreeRegionList::add_list_common_start(FreeRegionList* from_list) {
   }
 
   #ifdef ASSERT
-  FreeRegionListIterator iter(from_list);
+  G1FreeRegionListIterator iter(from_list);
   while (iter.more_available()) {
     G1HeapRegion* hr = iter.get_next();
     // In set_containing_set() we check that we either set the value
@@ -144,7 +144,7 @@ void FreeRegionList::add_list_common_start(FreeRegionList* from_list) {
   #endif // ASSERT
 }
 
-void FreeRegionList::add_list_common_end(FreeRegionList* from_list) {
+void G1FreeRegionList::add_list_common_end(G1FreeRegionList* from_list) {
   _length += from_list->length();
   from_list->clear();
 
@@ -152,7 +152,7 @@ void FreeRegionList::add_list_common_end(FreeRegionList* from_list) {
   from_list->verify_optional();
 }
 
-void FreeRegionList::append_ordered(FreeRegionList* from_list) {
+void G1FreeRegionList::append_ordered(G1FreeRegionList* from_list) {
   add_list_common_start(from_list);
 
   if (from_list->is_empty()) {
@@ -177,7 +177,7 @@ void FreeRegionList::append_ordered(FreeRegionList* from_list) {
   add_list_common_end(from_list);
 }
 
-void FreeRegionList::add_ordered(FreeRegionList* from_list) {
+void G1FreeRegionList::add_ordered(G1FreeRegionList* from_list) {
   add_list_common_start(from_list);
 
   if (from_list->is_empty()) {
@@ -227,7 +227,7 @@ void FreeRegionList::add_ordered(FreeRegionList* from_list) {
 }
 
 #ifdef ASSERT
-void FreeRegionList::verify_region_to_remove(G1HeapRegion* curr, G1HeapRegion* next) {
+void G1FreeRegionList::verify_region_to_remove(G1HeapRegion* curr, G1HeapRegion* next) {
   assert_free_region_list(_head != next, "invariant");
   if (next != nullptr) {
     assert_free_region_list(next->prev() == curr, "invariant");
@@ -244,7 +244,7 @@ void FreeRegionList::verify_region_to_remove(G1HeapRegion* curr, G1HeapRegion* n
 }
 #endif
 
-void FreeRegionList::remove_starting_at(G1HeapRegion* first, uint num_regions) {
+void G1FreeRegionList::remove_starting_at(G1HeapRegion* first, uint num_regions) {
   check_mt_safety();
   assert_free_region_list(num_regions >= 1, "pre-condition");
   assert_free_region_list(!is_empty(), "pre-condition");
@@ -304,8 +304,8 @@ void FreeRegionList::remove_starting_at(G1HeapRegion* first, uint num_regions) {
   verify_optional();
 }
 
-void FreeRegionList::verify() {
-  // See comment in HeapRegionSetBase::verify() about MT safety and
+void G1FreeRegionList::verify() {
+  // See comment in G1HeapRegionSetBase::verify() about MT safety and
   // verification.
   check_mt_safety();
 
@@ -317,7 +317,7 @@ void FreeRegionList::verify() {
   verify_end();
 }
 
-void FreeRegionList::clear() {
+void G1FreeRegionList::clear() {
   _length = 0;
   _head = nullptr;
   _tail = nullptr;
@@ -328,7 +328,7 @@ void FreeRegionList::clear() {
   }
 }
 
-void FreeRegionList::verify_list() {
+void G1FreeRegionList::verify_list() {
   G1HeapRegion* curr = _head;
   G1HeapRegion* prev1 = nullptr;
   G1HeapRegion* prev0 = nullptr;
@@ -364,37 +364,37 @@ void FreeRegionList::verify_list() {
 }
 
 
-FreeRegionList::FreeRegionList(const char* name, HeapRegionSetChecker* checker):
-  HeapRegionSetBase(name, checker),
+G1FreeRegionList::G1FreeRegionList(const char* name, G1HeapRegionSetChecker* checker):
+  G1HeapRegionSetBase(name, checker),
   _node_info(G1NUMA::numa()->is_enabled() ? new NodeInfo() : nullptr) {
 
   clear();
 }
 
-FreeRegionList::~FreeRegionList() {
+G1FreeRegionList::~G1FreeRegionList() {
   if (_node_info != nullptr) {
     delete _node_info;
   }
 }
 
-FreeRegionList::NodeInfo::NodeInfo() : _numa(G1NUMA::numa()), _length_of_node(nullptr),
-                                       _num_nodes(_numa->num_active_nodes()) {
+G1FreeRegionList::NodeInfo::NodeInfo() : _numa(G1NUMA::numa()), _length_of_node(nullptr),
+                                         _num_nodes(_numa->num_active_nodes()) {
   assert(UseNUMA, "Invariant");
 
   _length_of_node = NEW_C_HEAP_ARRAY(uint, _num_nodes, mtGC);
 }
 
-FreeRegionList::NodeInfo::~NodeInfo() {
+G1FreeRegionList::NodeInfo::~NodeInfo() {
   FREE_C_HEAP_ARRAY(uint, _length_of_node);
 }
 
-void FreeRegionList::NodeInfo::clear() {
+void G1FreeRegionList::NodeInfo::clear() {
   for (uint i = 0; i < _num_nodes; ++i) {
     _length_of_node[i] = 0;
   }
 }
 
-void FreeRegionList::NodeInfo::add(NodeInfo* info) {
+void G1FreeRegionList::NodeInfo::add(NodeInfo* info) {
   for (uint i = 0; i < _num_nodes; ++i) {
     _length_of_node[i] += info->_length_of_node[i];
   }
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionSet.hpp b/src/hotspot/share/gc/g1/g1HeapRegionSet.hpp
index e401b38aadc..19e98e8c54c 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionSet.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionSet.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -48,14 +48,14 @@
 
 
 // Interface collecting various instance specific verification methods of
-// HeapRegionSets.
-class HeapRegionSetChecker : public CHeapObj<mtGC> {
+// G1HeapRegionSets.
+class G1HeapRegionSetChecker : public CHeapObj<mtGC> {
 public:
-  // Verify MT safety for this HeapRegionSet.
+  // Verify MT safety for this G1HeapRegionSet.
   virtual void check_mt_safety() = 0;
-  // Returns true if the given G1HeapRegion is of the correct type for this HeapRegionSet.
+  // Returns true if the given G1HeapRegion is of the correct type for this G1HeapRegionSet.
   virtual bool is_correct_type(G1HeapRegion* hr) = 0;
-  // Return a description of the type of regions this HeapRegionSet contains.
+  // Return a description of the type of regions this G1HeapRegionSet contains.
   virtual const char* get_description() = 0;
 };
 
@@ -64,10 +64,10 @@ class HeapRegionSetChecker : public CHeapObj<mtGC> {
 // (e.g., length, region num, used bytes sum) plus any shared
 // functionality (e.g., verification).
 
-class HeapRegionSetBase {
+class G1HeapRegionSetBase {
   friend class VMStructs;
 
-  HeapRegionSetChecker* _checker;
+  G1HeapRegionSetChecker* _checker;
 
 protected:
   // The number of regions in to the set.
@@ -87,7 +87,7 @@ class HeapRegionSetBase {
     }
   }
 
-  HeapRegionSetBase(const char* name, HeapRegionSetChecker* verifier);
+  G1HeapRegionSetBase(const char* name, G1HeapRegionSetChecker* verifier);
 
 public:
   const char* name() { return _name; }
@@ -117,12 +117,12 @@ class HeapRegionSetBase {
 // This class represents heap region sets whose members are not
 // explicitly tracked. It's helpful to group regions using such sets
 // so that we can reason about all the region groups in the heap using
-// the same interface (namely, the HeapRegionSetBase API).
+// the same interface (namely, the G1HeapRegionSetBase API).
 
-class HeapRegionSet : public HeapRegionSetBase {
+class G1HeapRegionSet : public G1HeapRegionSetBase {
 public:
-  HeapRegionSet(const char* name, HeapRegionSetChecker* checker):
-    HeapRegionSetBase(name, checker) {
+  G1HeapRegionSet(const char* name, G1HeapRegionSetChecker* checker):
+    G1HeapRegionSetBase(name, checker) {
   }
 
   void bulk_remove(const uint removed) {
@@ -135,11 +135,11 @@ class HeapRegionSet : public HeapRegionSetBase {
 // such lists in performance critical paths. Typically we should
 // add / remove one region at a time or concatenate two lists.
 
-class FreeRegionListIterator;
+class G1FreeRegionListIterator;
 class G1NUMA;
 
-class FreeRegionList : public HeapRegionSetBase {
-  friend class FreeRegionListIterator;
+class G1FreeRegionList : public G1HeapRegionSetBase {
+  friend class G1FreeRegionListIterator;
 
 private:
 
@@ -181,17 +181,17 @@ class FreeRegionList : public HeapRegionSetBase {
   inline void decrease_length(uint node_index);
 
   // Common checks for adding a list.
-  void add_list_common_start(FreeRegionList* from_list);
-  void add_list_common_end(FreeRegionList* from_list);
+  void add_list_common_start(G1FreeRegionList* from_list);
+  void add_list_common_end(G1FreeRegionList* from_list);
 
   void verify_region_to_remove(G1HeapRegion* curr, G1HeapRegion* next) NOT_DEBUG_RETURN;
 protected:
-  // See the comment for HeapRegionSetBase::clear()
+  // See the comment for G1HeapRegionSetBase::clear()
   virtual void clear();
 
 public:
-  FreeRegionList(const char* name, HeapRegionSetChecker* checker = nullptr);
-  ~FreeRegionList();
+  G1FreeRegionList(const char* name, G1HeapRegionSetChecker* checker = nullptr);
+  ~G1FreeRegionList();
 
   void verify_list();
 
@@ -218,8 +218,8 @@ class FreeRegionList : public HeapRegionSetBase {
 
   // Merge two ordered lists. The result is also ordered. The order is
   // determined by hrm_index.
-  void add_ordered(FreeRegionList* from_list);
-  void append_ordered(FreeRegionList* from_list);
+  void add_ordered(G1FreeRegionList* from_list);
+  void append_ordered(G1FreeRegionList* from_list);
 
   // It empties the list by removing all regions from it.
   void remove_all();
@@ -235,16 +235,16 @@ class FreeRegionList : public HeapRegionSetBase {
 
   virtual void verify();
 
-  using HeapRegionSetBase::length;
+  using G1HeapRegionSetBase::length;
   uint length(uint node_index) const;
 };
 
 // Iterator class that provides a convenient way to iterate over the
 // regions of a FreeRegionList.
 
-class FreeRegionListIterator : public StackObj {
+class G1FreeRegionListIterator : public StackObj {
 private:
-  FreeRegionList* _list;
+  G1FreeRegionList* _list;
   G1HeapRegion*   _curr;
 
 public:
@@ -265,7 +265,7 @@ class FreeRegionListIterator : public StackObj {
     return hr;
   }
 
-  FreeRegionListIterator(FreeRegionList* list)
+  G1FreeRegionListIterator(G1FreeRegionList* list)
   : _list(list),
     _curr(list->_head) {
   }
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionSet.inline.hpp b/src/hotspot/share/gc/g1/g1HeapRegionSet.inline.hpp
index f0a38a41754..80b23616f92 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionSet.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionSet.inline.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -29,7 +29,7 @@
 
 #include "gc/g1/g1NUMA.hpp"
 
-inline void HeapRegionSetBase::add(G1HeapRegion* hr) {
+inline void G1HeapRegionSetBase::add(G1HeapRegion* hr) {
   check_mt_safety();
   assert_heap_region_set(hr->containing_set() == nullptr, "should not already have a containing set");
   assert_heap_region_set(hr->next() == nullptr, "should not already be linked");
@@ -40,7 +40,7 @@ inline void HeapRegionSetBase::add(G1HeapRegion* hr) {
   verify_region(hr);
 }
 
-inline void HeapRegionSetBase::remove(G1HeapRegion* hr) {
+inline void G1HeapRegionSetBase::remove(G1HeapRegion* hr) {
   check_mt_safety();
   verify_region(hr);
   assert_heap_region_set(hr->next() == nullptr, "should already be unlinked");
@@ -51,7 +51,7 @@ inline void HeapRegionSetBase::remove(G1HeapRegion* hr) {
   _length--;
 }
 
-inline void FreeRegionList::add_to_tail(G1HeapRegion* region_to_add) {
+inline void G1FreeRegionList::add_to_tail(G1HeapRegion* region_to_add) {
   assert_free_region_list((length() == 0 && _head == nullptr && _tail == nullptr && _last == nullptr) ||
                           (length() >  0 && _head != nullptr && _tail != nullptr && _tail->hrm_index() < region_to_add->hrm_index()),
                           "invariant");
@@ -71,7 +71,7 @@ inline void FreeRegionList::add_to_tail(G1HeapRegion* region_to_add) {
   increase_length(region_to_add->node_index());
 }
 
-inline void FreeRegionList::add_ordered(G1HeapRegion* hr) {
+inline void G1FreeRegionList::add_ordered(G1HeapRegion* hr) {
   assert_free_region_list((length() == 0 && _head == nullptr && _tail == nullptr && _last == nullptr) ||
                           (length() >  0 && _head != nullptr && _tail != nullptr),
                           "invariant");
@@ -120,7 +120,7 @@ inline void FreeRegionList::add_ordered(G1HeapRegion* hr) {
   increase_length(hr->node_index());
 }
 
-inline G1HeapRegion* FreeRegionList::remove_from_head_impl() {
+inline G1HeapRegion* G1FreeRegionList::remove_from_head_impl() {
   G1HeapRegion* result = _head;
   _head = result->next();
   if (_head == nullptr) {
@@ -132,7 +132,7 @@ inline G1HeapRegion* FreeRegionList::remove_from_head_impl() {
   return result;
 }
 
-inline G1HeapRegion* FreeRegionList::remove_from_tail_impl() {
+inline G1HeapRegion* G1FreeRegionList::remove_from_tail_impl() {
   G1HeapRegion* result = _tail;
 
   _tail = result->prev();
@@ -145,7 +145,7 @@ inline G1HeapRegion* FreeRegionList::remove_from_tail_impl() {
   return result;
 }
 
-inline G1HeapRegion* FreeRegionList::remove_region(bool from_head) {
+inline G1HeapRegion* G1FreeRegionList::remove_region(bool from_head) {
   check_mt_safety();
   verify_optional();
 
@@ -174,7 +174,7 @@ inline G1HeapRegion* FreeRegionList::remove_region(bool from_head) {
   return hr;
 }
 
-inline G1HeapRegion* FreeRegionList::remove_region_with_node_index(bool from_head,
+inline G1HeapRegion* G1FreeRegionList::remove_region_with_node_index(bool from_head,
                                                                  uint requested_node_index) {
   assert(UseNUMA, "Invariant");
 
@@ -232,13 +232,13 @@ inline G1HeapRegion* FreeRegionList::remove_region_with_node_index(bool from_hea
   return cur;
 }
 
-inline void FreeRegionList::NodeInfo::increase_length(uint node_index) {
+inline void G1FreeRegionList::NodeInfo::increase_length(uint node_index) {
   if (node_index < _num_nodes) {
     _length_of_node[node_index] += 1;
   }
 }
 
-inline void FreeRegionList::NodeInfo::decrease_length(uint node_index) {
+inline void G1FreeRegionList::NodeInfo::decrease_length(uint node_index) {
   if (node_index < _num_nodes) {
     assert(_length_of_node[node_index] > 0,
            "Current length %u should be greater than zero for node %u",
@@ -247,23 +247,23 @@ inline void FreeRegionList::NodeInfo::decrease_length(uint node_index) {
   }
 }
 
-inline uint FreeRegionList::NodeInfo::length(uint node_index) const {
+inline uint G1FreeRegionList::NodeInfo::length(uint node_index) const {
   return _length_of_node[node_index];
 }
 
-inline void FreeRegionList::increase_length(uint node_index) {
+inline void G1FreeRegionList::increase_length(uint node_index) {
   if (_node_info != nullptr) {
     return _node_info->increase_length(node_index);
   }
 }
 
-inline void FreeRegionList::decrease_length(uint node_index) {
+inline void G1FreeRegionList::decrease_length(uint node_index) {
   if (_node_info != nullptr) {
     return _node_info->decrease_length(node_index);
   }
 }
 
-inline uint FreeRegionList::length(uint node_index) const {
+inline uint G1FreeRegionList::length(uint node_index) const {
   if (_node_info != nullptr) {
     return _node_info->length(node_index);
   } else {
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionTracer.cpp b/src/hotspot/share/gc/g1/g1HeapRegionTracer.cpp
index c66ae0cb069..749b7d2d1f5 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionTracer.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionTracer.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@
 #include "gc/g1/g1HeapRegionTracer.hpp"
 #include "jfr/jfrEvents.hpp"
 
-void HeapRegionTracer::send_region_type_change(uint index,
+void G1HeapRegionTracer::send_region_type_change(uint index,
                                                G1HeapRegionTraceType::Type from,
                                                G1HeapRegionTraceType::Type to,
                                                uintptr_t start,
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionTracer.hpp b/src/hotspot/share/gc/g1/g1HeapRegionTracer.hpp
index 137bc6189ae..42c88aa5f0f 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionTracer.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionTracer.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -29,7 +29,7 @@
 #include "memory/allStatic.hpp"
 #include "utilities/globalDefinitions.hpp"
 
-class HeapRegionTracer : AllStatic {
+class G1HeapRegionTracer : AllStatic {
   public:
     static void send_region_type_change(uint index,
                                         G1HeapRegionTraceType::Type from,
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionType.cpp b/src/hotspot/share/gc/g1/g1HeapRegionType.cpp
index e55759b3bf3..c6d38e341be 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionType.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionType.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,12 +26,12 @@
 #include "gc/g1/g1HeapRegionTraceType.hpp"
 #include "gc/g1/g1HeapRegionType.hpp"
 
-const HeapRegionType HeapRegionType::Eden      = HeapRegionType(EdenTag);
-const HeapRegionType HeapRegionType::Survivor  = HeapRegionType(SurvTag);
-const HeapRegionType HeapRegionType::Old       = HeapRegionType(OldTag);
-const HeapRegionType HeapRegionType::Humongous = HeapRegionType(StartsHumongousTag);
+const G1HeapRegionType G1HeapRegionType::Eden      = G1HeapRegionType(EdenTag);
+const G1HeapRegionType G1HeapRegionType::Survivor  = G1HeapRegionType(SurvTag);
+const G1HeapRegionType G1HeapRegionType::Old       = G1HeapRegionType(OldTag);
+const G1HeapRegionType G1HeapRegionType::Humongous = G1HeapRegionType(StartsHumongousTag);
 
-bool HeapRegionType::is_valid(Tag tag) {
+bool G1HeapRegionType::is_valid(Tag tag) {
   switch (tag) {
     case FreeTag:
     case EdenTag:
@@ -45,7 +45,7 @@ bool HeapRegionType::is_valid(Tag tag) {
   }
 }
 
-const char* HeapRegionType::get_str() const {
+const char* G1HeapRegionType::get_str() const {
   hrt_assert_is_valid(_tag);
   switch (_tag) {
     case FreeTag:               return "FREE";
@@ -60,7 +60,7 @@ const char* HeapRegionType::get_str() const {
   }
 }
 
-const char* HeapRegionType::get_short_str() const {
+const char* G1HeapRegionType::get_short_str() const {
   hrt_assert_is_valid(_tag);
   switch (_tag) {
     case FreeTag:               return "F";
@@ -75,7 +75,7 @@ const char* HeapRegionType::get_short_str() const {
   }
 }
 
-G1HeapRegionTraceType::Type HeapRegionType::get_trace_type() {
+G1HeapRegionTraceType::Type G1HeapRegionType::get_trace_type() {
   hrt_assert_is_valid(_tag);
   switch (_tag) {
     case FreeTag:               return G1HeapRegionTraceType::Free;
diff --git a/src/hotspot/share/gc/g1/g1HeapRegionType.hpp b/src/hotspot/share/gc/g1/g1HeapRegionType.hpp
index b62699cc3fb..839df68febd 100644
--- a/src/hotspot/share/gc/g1/g1HeapRegionType.hpp
+++ b/src/hotspot/share/gc/g1/g1HeapRegionType.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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,7 +31,7 @@
 #define hrt_assert_is_valid(tag) \
   assert(is_valid((tag)), "invalid HR type: %u", (uint) (tag))
 
-class HeapRegionType {
+class G1HeapRegionType {
 friend class VMStructs;
 
 private:
@@ -101,7 +101,7 @@ friend class VMStructs;
   }
 
   // Private constructor used for static constants
-  HeapRegionType(Tag t) : _tag(t) { hrt_assert_is_valid(_tag); }
+  G1HeapRegionType(Tag t) : _tag(t) { hrt_assert_is_valid(_tag); }
 
 public:
   // Queries
@@ -159,12 +159,12 @@ friend class VMStructs;
   const char* get_short_str() const;
   G1HeapRegionTraceType::Type get_trace_type();
 
-  HeapRegionType() : _tag(FreeTag) { hrt_assert_is_valid(_tag); }
+  G1HeapRegionType() : _tag(FreeTag) { hrt_assert_is_valid(_tag); }
 
-  static const HeapRegionType Eden;
-  static const HeapRegionType Survivor;
-  static const HeapRegionType Old;
-  static const HeapRegionType Humongous;
+  static const G1HeapRegionType Eden;
+  static const G1HeapRegionType Survivor;
+  static const G1HeapRegionType Old;
+  static const G1HeapRegionType Humongous;
 };
 
 #endif // SHARE_GC_G1_G1HEAPREGIONTYPE_HPP
diff --git a/src/hotspot/share/gc/g1/g1HeapTransition.cpp b/src/hotspot/share/gc/g1/g1HeapTransition.cpp
index 8804d37cc71..815b701c4be 100644
--- a/src/hotspot/share/gc/g1/g1HeapTransition.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapTransition.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -79,7 +79,7 @@ struct G1HeapTransition::DetailedUsage : public StackObj {
     _humongous_region_count(0) {}
 };
 
-class G1HeapTransition::DetailedUsageClosure: public HeapRegionClosure {
+class G1HeapTransition::DetailedUsageClosure: public G1HeapRegionClosure {
 public:
   DetailedUsage _usage;
   bool do_heap_region(G1HeapRegion* r) {
diff --git a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp
index 9201fc98c8a..7d399b8265e 100644
--- a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -111,7 +111,7 @@ class G1VerifyCodeRootOopClosure: public OopClosure {
 
       // Now fetch the region containing the object
       G1HeapRegion* hr = _g1h->heap_region_containing(obj);
-      HeapRegionRemSet* hrrs = hr->rem_set();
+      G1HeapRegionRemSet* hrrs = hr->rem_set();
       // Verify that the code root list for this region
       // contains the nmethod
       if (!hrrs->code_roots_list_contains(_nm)) {
@@ -231,7 +231,7 @@ class VerifyObjsInRegionClosure: public ObjectClosure {
   size_t live_bytes() { return _live_bytes; }
 };
 
-class VerifyRegionClosure: public HeapRegionClosure {
+class VerifyRegionClosure: public G1HeapRegionClosure {
 private:
   VerifyOption     _vo;
   bool             _failures;
@@ -287,10 +287,10 @@ class VerifyRegionClosure: public HeapRegionClosure {
 
 class G1VerifyTask: public WorkerTask {
 private:
-  G1CollectedHeap*  _g1h;
-  VerifyOption      _vo;
-  bool              _failures;
-  HeapRegionClaimer _hrclaimer;
+  G1CollectedHeap*    _g1h;
+  VerifyOption        _vo;
+  bool                _failures;
+  G1HeapRegionClaimer _hrclaimer;
 
 public:
   G1VerifyTask(G1CollectedHeap* g1h, VerifyOption vo) :
@@ -377,20 +377,20 @@ void G1HeapVerifier::verify(VerifyOption vo) {
 
 // Heap region set verification
 
-class VerifyRegionListsClosure : public HeapRegionClosure {
+class VerifyRegionListsClosure : public G1HeapRegionClosure {
 private:
-  HeapRegionSet*   _old_set;
-  HeapRegionSet*   _humongous_set;
-  HeapRegionManager* _hrm;
+  G1HeapRegionSet*     _old_set;
+  G1HeapRegionSet*     _humongous_set;
+  G1HeapRegionManager* _hrm;
 
 public:
   uint _old_count;
   uint _humongous_count;
   uint _free_count;
 
-  VerifyRegionListsClosure(HeapRegionSet* old_set,
-                           HeapRegionSet* humongous_set,
-                           HeapRegionManager* hrm) :
+  VerifyRegionListsClosure(G1HeapRegionSet* old_set,
+                           G1HeapRegionSet* humongous_set,
+                           G1HeapRegionManager* hrm) :
     _old_set(old_set), _humongous_set(humongous_set), _hrm(hrm),
     _old_count(), _humongous_count(), _free_count(){ }
 
@@ -412,7 +412,7 @@ class VerifyRegionListsClosure : public HeapRegionClosure {
     return false;
   }
 
-  void verify_counts(HeapRegionSet* old_set, HeapRegionSet* humongous_set, HeapRegionManager* free_list) {
+  void verify_counts(G1HeapRegionSet* old_set, G1HeapRegionSet* humongous_set, G1HeapRegionManager* free_list) {
     guarantee(old_set->length() == _old_count, "Old set count mismatch. Expected %u, actual %u.", old_set->length(), _old_count);
     guarantee(humongous_set->length() == _humongous_count, "Hum set count mismatch. Expected %u, actual %u.", humongous_set->length(), _humongous_count);
     guarantee(free_list->num_free_regions() == _free_count, "Free list count mismatch. Expected %u, actual %u.", free_list->num_free_regions(), _free_count);
@@ -435,7 +435,7 @@ void G1HeapVerifier::verify_region_sets() {
   _g1h->collection_set()->candidates()->verify();
 }
 
-class G1VerifyRegionMarkingStateClosure : public HeapRegionClosure {
+class G1VerifyRegionMarkingStateClosure : public G1HeapRegionClosure {
   class MarkedBytesClosure {
     size_t _marked_words;
 
@@ -535,7 +535,7 @@ void G1HeapVerifier::verify_bitmap_clear(bool from_tams) {
     return;
   }
 
-  class G1VerifyBitmapClear : public HeapRegionClosure {
+  class G1VerifyBitmapClear : public G1HeapRegionClosure {
     bool _from_tams;
 
   public:
@@ -557,7 +557,7 @@ void G1HeapVerifier::verify_bitmap_clear(bool from_tams) {
 }
 
 #ifndef PRODUCT
-class G1VerifyCardTableCleanup: public HeapRegionClosure {
+class G1VerifyCardTableCleanup: public G1HeapRegionClosure {
   G1HeapVerifier* _verifier;
 public:
   G1VerifyCardTableCleanup(G1HeapVerifier* verifier)
@@ -603,11 +603,11 @@ void G1HeapVerifier::verify_dirty_region(G1HeapRegion* hr) {
   }
 }
 
-class G1VerifyDirtyYoungListClosure : public HeapRegionClosure {
+class G1VerifyDirtyYoungListClosure : public G1HeapRegionClosure {
 private:
   G1HeapVerifier* _verifier;
 public:
-  G1VerifyDirtyYoungListClosure(G1HeapVerifier* verifier) : HeapRegionClosure(), _verifier(verifier) { }
+  G1VerifyDirtyYoungListClosure(G1HeapVerifier* verifier) : G1HeapRegionClosure(), _verifier(verifier) { }
   virtual bool do_heap_region(G1HeapRegion* r) {
     _verifier->verify_dirty_region(r);
     return false;
@@ -619,12 +619,12 @@ void G1HeapVerifier::verify_dirty_young_regions() {
   _g1h->collection_set()->iterate(&cl);
 }
 
-class G1CheckRegionAttrTableClosure : public HeapRegionClosure {
+class G1CheckRegionAttrTableClosure : public G1HeapRegionClosure {
 private:
   bool _failures;
 
 public:
-  G1CheckRegionAttrTableClosure() : HeapRegionClosure(), _failures(false) { }
+  G1CheckRegionAttrTableClosure() : G1HeapRegionClosure(), _failures(false) { }
 
   virtual bool do_heap_region(G1HeapRegion* hr) {
     uint i = hr->hrm_index();
diff --git a/src/hotspot/share/gc/g1/g1NUMA.cpp b/src/hotspot/share/gc/g1/g1NUMA.cpp
index fd80bd52ce1..923d3af621d 100644
--- a/src/hotspot/share/gc/g1/g1NUMA.cpp
+++ b/src/hotspot/share/gc/g1/g1NUMA.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -224,7 +224,7 @@ void G1NUMA::request_memory_on_node(void* aligned_address, size_t size_in_bytes,
 
 uint G1NUMA::max_search_depth() const {
   // Multiple of 3 is just random number to limit iterations.
-  // There would be some cases that 1 page may be consisted of multiple HeapRegions.
+  // There would be some cases that 1 page may be consisted of multiple heap regions.
   return 3 * MAX2((uint)(page_size() / region_size()), (uint)1) * num_active_nodes();
 }
 
diff --git a/src/hotspot/share/gc/g1/g1NUMA.hpp b/src/hotspot/share/gc/g1/g1NUMA.hpp
index e9726fcad1b..72d6702822b 100644
--- a/src/hotspot/share/gc/g1/g1NUMA.hpp
+++ b/src/hotspot/share/gc/g1/g1NUMA.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -95,7 +95,7 @@ class G1NUMA: public CHeapObj<mtGC> {
   uint index_of_current_thread() const;
 
   // Returns the preferred index for the given G1HeapRegion index.
-  // This assumes that HeapRegions are evenly spit, so we can decide preferred index
+  // This assumes that heap regions are evenly spit, so we can decide preferred index
   // with the given G1HeapRegion index.
   // Result is less than num_active_nodes().
   uint preferred_node_index_for_index(uint region_index) const;
@@ -127,7 +127,7 @@ class G1NUMA: public CHeapObj<mtGC> {
   void print_statistics() const;
 };
 
-class G1NodeIndexCheckClosure : public HeapRegionClosure {
+class G1NodeIndexCheckClosure : public G1HeapRegionClosure {
   const char* _desc;
   G1NUMA* _numa;
   // Records matched count of each node.
diff --git a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp
index 1d4a1d5ab86..26cc88de0be 100644
--- a/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp
+++ b/src/hotspot/share/gc/g1/g1OopClosures.inline.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -146,7 +146,7 @@ inline void G1ConcurrentRefineOopClosure::do_oop_work(T* p) {
     return;
   }
 
-  HeapRegionRemSet* to_rem_set = _g1h->heap_region_containing(obj)->rem_set();
+  G1HeapRegionRemSet* to_rem_set = _g1h->heap_region_containing(obj)->rem_set();
 
   assert(to_rem_set != nullptr, "Need per-region 'into' remsets.");
   if (to_rem_set->is_tracked()) {
@@ -266,7 +266,7 @@ template <class T> void G1RebuildRemSetClosure::do_oop_work(T* p) {
   }
 
   G1HeapRegion* to = _g1h->heap_region_containing(obj);
-  HeapRegionRemSet* rem_set = to->rem_set();
+  G1HeapRegionRemSet* rem_set = to->rem_set();
   if (rem_set->is_tracked()) {
     rem_set->add_reference(p, _worker_id);
   }
diff --git a/src/hotspot/share/gc/g1/g1RemSet.cpp b/src/hotspot/share/gc/g1/g1RemSet.cpp
index 39c9c2c7a30..f2426cdfca5 100644
--- a/src/hotspot/share/gc/g1/g1RemSet.cpp
+++ b/src/hotspot/share/gc/g1/g1RemSet.cpp
@@ -365,7 +365,7 @@ class G1RemSetScanState : public CHeapObj<mtGC> {
     _next_dirty_regions = nullptr;
   }
 
-  void iterate_dirty_regions_from(HeapRegionClosure* cl, uint worker_id) {
+  void iterate_dirty_regions_from(G1HeapRegionClosure* cl, uint worker_id) {
     uint num_regions = _next_dirty_regions->size();
 
     if (num_regions == 0) {
@@ -481,7 +481,7 @@ class G1CardTableChunkClaimer {
 };
 
 // Scans a heap region for dirty cards.
-class G1ScanHRForRegionClosure : public HeapRegionClosure {
+class G1ScanHRForRegionClosure : public G1HeapRegionClosure {
   using CardValue = CardTable::CardValue;
 
   G1CollectedHeap* _g1h;
@@ -755,7 +755,7 @@ class G1ScanAndCountNMethodClosure : public NMethodClosure {
 
 // Heap region closure to be applied to all regions in the current collection set
 // increment to fix up non-card related roots.
-class G1ScanCollectionSetRegionClosure : public HeapRegionClosure {
+class G1ScanCollectionSetRegionClosure : public G1HeapRegionClosure {
   G1ParScanThreadState* _pss;
   G1RemSetScanState* _scan_state;
 
@@ -972,13 +972,13 @@ class G1MergeHeapRootsTask : public WorkerTask {
 
   // Visitor for remembered sets. Several methods of it are called by a region's
   // card set iterator to drop card set remembered set entries onto the card.
-  // table. This is in addition to being the HeapRegionClosure to iterate over
+  // table. This is in addition to being the HG1eapRegionClosure to iterate over
   // all region's remembered sets.
   //
   // We add a small prefetching cache in front of the actual work as dropping
   // onto the card table is basically random memory access. This improves
   // performance of this operation significantly.
-  class G1MergeCardSetClosure : public HeapRegionClosure {
+  class G1MergeCardSetClosure : public G1HeapRegionClosure {
     friend class G1MergeCardSetCache;
 
     G1RemSetScanState* _scan_state;
@@ -1074,7 +1074,7 @@ class G1MergeHeapRootsTask : public WorkerTask {
     void merge_card_set_for_region(G1HeapRegion* r) {
       assert(r->in_collection_set() || r->is_starts_humongous(), "must be");
 
-      HeapRegionRemSet* rem_set = r->rem_set();
+      G1HeapRegionRemSet* rem_set = r->rem_set();
       if (!rem_set->is_empty()) {
         rem_set->iterate_for_merge(*this);
       }
@@ -1098,7 +1098,7 @@ class G1MergeHeapRootsTask : public WorkerTask {
   // Closure to make sure that the marking bitmap is clear for any old region in
   // the collection set.
   // This is needed to be able to use the bitmap for evacuation failure handling.
-  class G1ClearBitmapClosure : public HeapRegionClosure {
+  class G1ClearBitmapClosure : public G1HeapRegionClosure {
     G1CollectedHeap* _g1h;
 
     void assert_bitmap_clear(G1HeapRegion* hr, const G1CMBitMap* bitmap) {
@@ -1144,11 +1144,11 @@ class G1MergeHeapRootsTask : public WorkerTask {
 
   // Helper to allow two closure to be applied when
   // iterating through the collection set.
-  class G1CombinedClosure : public HeapRegionClosure {
-    HeapRegionClosure* _closure1;
-    HeapRegionClosure* _closure2;
+  class G1CombinedClosure : public G1HeapRegionClosure {
+    G1HeapRegionClosure* _closure1;
+    G1HeapRegionClosure* _closure2;
   public:
-    G1CombinedClosure(HeapRegionClosure* cl1, HeapRegionClosure* cl2) :
+    G1CombinedClosure(G1HeapRegionClosure* cl1, G1HeapRegionClosure* cl2) :
       _closure1(cl1),
       _closure2(cl2) { }
 
@@ -1160,7 +1160,7 @@ class G1MergeHeapRootsTask : public WorkerTask {
 
   // Visitor for the remembered sets of humongous candidate regions to merge their
   // remembered set into the card table.
-  class G1FlushHumongousCandidateRemSets : public HeapRegionIndexClosure {
+  class G1FlushHumongousCandidateRemSets : public G1HeapRegionIndexClosure {
     G1MergeCardSetClosure _cl;
 
   public:
diff --git a/src/hotspot/share/gc/g1/g1RemSet.hpp b/src/hotspot/share/gc/g1/g1RemSet.hpp
index 65eabc312a6..0445ad185d3 100644
--- a/src/hotspot/share/gc/g1/g1RemSet.hpp
+++ b/src/hotspot/share/gc/g1/g1RemSet.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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 @@ class CardTableBarrierSet;
 class G1AbstractSubTask;
 class G1CollectedHeap;
 class G1CMBitMap;
+class G1HeapRegionClaimer;
 class G1RemSetScanState;
 class G1ParScanThreadState;
 class G1ParScanThreadStateSet;
@@ -49,7 +50,6 @@ class G1Policy;
 class G1RemSetSamplingTask;
 class G1ScanCardClosure;
 class G1ServiceThread;
-class HeapRegionClaimer;
 
 // A G1RemSet in which each heap region has a rem set that records the
 // external heap references into it.  Uses a mod ref bs to track updates,
diff --git a/src/hotspot/share/gc/g1/g1RemSetSummary.cpp b/src/hotspot/share/gc/g1/g1RemSetSummary.cpp
index b8a0c709276..14fb8c0b8d2 100644
--- a/src/hotspot/share/gc/g1/g1RemSetSummary.cpp
+++ b/src/hotspot/share/gc/g1/g1RemSetSummary.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -181,7 +181,7 @@ class RegionTypeCounter {
 };
 
 
-class HRRSStatsIter: public HeapRegionClosure {
+class HRRSStatsIter: public G1HeapRegionClosure {
 private:
   RegionTypeCounter _young;
   RegionTypeCounter _humongous;
@@ -216,9 +216,9 @@ class HRRSStatsIter: public HeapRegionClosure {
   {}
 
   bool do_heap_region(G1HeapRegion* r) {
-    HeapRegionRemSet* hrrs = r->rem_set();
+    G1HeapRegionRemSet* hrrs = r->rem_set();
 
-    // HeapRegionRemSet::mem_size() includes the
+    // G1HeapRegionRemSet::mem_size() includes the
     // size of the code roots
     size_t rs_unused_mem_sz = hrrs->unused_mem_size();
     size_t rs_mem_sz = hrrs->mem_size();
@@ -274,19 +274,19 @@ class HRRSStatsIter: public HeapRegionClosure {
     }
 
     // Largest sized rem set region statistics
-    HeapRegionRemSet* rem_set = max_rs_mem_sz_region()->rem_set();
+    G1HeapRegionRemSet* rem_set = max_rs_mem_sz_region()->rem_set();
     out->print_cr("    Region with largest rem set = " HR_FORMAT ", "
                   "size = " SIZE_FORMAT " occupied = " SIZE_FORMAT,
                   HR_FORMAT_PARAMS(max_rs_mem_sz_region()),
                   rem_set->mem_size(),
                   rem_set->occupied());
 
-    HeapRegionRemSet::print_static_mem_size(out);
+    G1HeapRegionRemSet::print_static_mem_size(out);
     G1CollectedHeap* g1h = G1CollectedHeap::heap();
     g1h->card_set_freelist_pool()->print_on(out);
 
     // Code root statistics
-    HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region()->rem_set();
+    G1HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region()->rem_set();
     out->print_cr("  Total heap region code root sets sizes = " SIZE_FORMAT "%s."
                   "  Max = " SIZE_FORMAT "%s.",
                   byte_size_in_proper_unit(total_code_root_mem_sz()),
diff --git a/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp b/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp
index 6a97deacfab..21b188c00c2 100644
--- a/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp
+++ b/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.cpp
@@ -30,14 +30,6 @@
 #include "gc/g1/g1RemSetTrackingPolicy.hpp"
 #include "runtime/safepoint.hpp"
 
-bool G1RemSetTrackingPolicy::needs_scan_for_rebuild(G1HeapRegion* r) const {
-  // All non-free and non-young regions need to be scanned for references;
-  // At every gc we gather references to other regions in young.
-  // Free regions trivially do not need scanning because they do not contain live
-  // objects.
-  return !(r->is_young() || r->is_free());
-}
-
 void G1RemSetTrackingPolicy::update_at_allocate(G1HeapRegion* r) {
   assert(r->is_young() || r->is_humongous() || r->is_old(),
         "Region %u with unexpected heap region type %s", r->hrm_index(), r->get_type_str());
diff --git a/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp b/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp
index 7560b726080..a89c24e6f4e 100644
--- a/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp
+++ b/src/hotspot/share/gc/g1/g1RemSetTrackingPolicy.hpp
@@ -34,9 +34,6 @@
 // set is complete.
 class G1RemSetTrackingPolicy : public CHeapObj<mtGC> {
 public:
-  // Do we need to scan the given region to get all outgoing references for remembered
-  // set rebuild?
-  bool needs_scan_for_rebuild(G1HeapRegion* r) const;
   // Update remembered set tracking state at allocation of the region. May be
   // called at any time. The caller makes sure that the changes to the remembered
   // set state are visible to other threads.
diff --git a/src/hotspot/share/gc/g1/g1YoungCollector.cpp b/src/hotspot/share/gc/g1/g1YoungCollector.cpp
index d0d49fa6d40..cadab2fbc48 100644
--- a/src/hotspot/share/gc/g1/g1YoungCollector.cpp
+++ b/src/hotspot/share/gc/g1/g1YoungCollector.cpp
@@ -259,7 +259,7 @@ void G1YoungCollector::wait_for_root_region_scanning() {
   phase_times()->record_root_region_scan_wait_time(wait_time.seconds() * MILLIUNITS);
 }
 
-class G1PrintCollectionSetClosure : public HeapRegionClosure {
+class G1PrintCollectionSetClosure : public G1HeapRegionClosure {
 public:
   virtual bool do_heap_region(G1HeapRegion* r) {
     G1HeapRegionPrinter::cset(r);
@@ -286,7 +286,7 @@ void G1YoungCollector::calculate_collection_set(G1EvacInfo* evacuation_info, dou
 }
 
 class G1PrepareEvacuationTask : public WorkerTask {
-  class G1PrepareRegionsClosure : public HeapRegionClosure {
+  class G1PrepareRegionsClosure : public G1HeapRegionClosure {
     G1CollectedHeap* _g1h;
     G1PrepareEvacuationTask* _parent_task;
     uint _worker_humongous_total;
@@ -418,7 +418,7 @@ class G1PrepareEvacuationTask : public WorkerTask {
   };
 
   G1CollectedHeap* _g1h;
-  HeapRegionClaimer _claimer;
+  G1HeapRegionClaimer _claimer;
   volatile uint _humongous_total;
   volatile uint _humongous_candidates;
 
diff --git a/src/hotspot/share/gc/g1/g1YoungGCAllocationFailureInjector.cpp b/src/hotspot/share/gc/g1/g1YoungGCAllocationFailureInjector.cpp
index 066f4353d4c..dcf42b31bb1 100644
--- a/src/hotspot/share/gc/g1/g1YoungGCAllocationFailureInjector.cpp
+++ b/src/hotspot/share/gc/g1/g1YoungGCAllocationFailureInjector.cpp
@@ -30,7 +30,7 @@
 
 #if ALLOCATION_FAILURE_INJECTOR
 
-class SelectAllocationFailureRegionClosure : public HeapRegionClosure {
+class SelectAllocationFailureRegionClosure : public G1HeapRegionClosure {
   CHeapBitMap& _allocation_failure_regions;
   size_t _allocation_failure_regions_num;
 
diff --git a/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp b/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp
index 90c85250c05..c5ebdb3d22d 100644
--- a/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp
+++ b/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, 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
@@ -333,7 +333,7 @@ G1PostEvacuateCollectionSetCleanupTask1::G1PostEvacuateCollectionSetCleanupTask1
   }
 }
 
-class G1FreeHumongousRegionClosure : public HeapRegionIndexClosure {
+class G1FreeHumongousRegionClosure : public G1HeapRegionIndexClosure {
   uint _humongous_objects_reclaimed;
   uint _humongous_regions_reclaimed;
   size_t _freed_bytes;
@@ -537,9 +537,9 @@ class RedirtyLoggedCardTableEntryClosure : public G1CardTableEntryClosure {
 
 class G1PostEvacuateCollectionSetCleanupTask2::ProcessEvacuationFailedRegionsTask : public G1AbstractSubTask {
   G1EvacFailureRegions* _evac_failure_regions;
-  HeapRegionClaimer _claimer;
+  G1HeapRegionClaimer _claimer;
 
-  class ProcessEvacuationFailedRegionsClosure : public HeapRegionClosure {
+  class ProcessEvacuationFailedRegionsClosure : public G1HeapRegionClosure {
   public:
 
     bool do_heap_region(G1HeapRegion* r) override {
@@ -706,7 +706,7 @@ class FreeCSetStats {
 };
 
 // Closure applied to all regions in the collection set.
-class FreeCSetClosure : public HeapRegionClosure {
+class FreeCSetClosure : public G1HeapRegionClosure {
   // Helper to send JFR events for regions.
   class JFREventForRegion {
     EventGCPhaseParallel _event;
@@ -807,7 +807,7 @@ class FreeCSetClosure : public HeapRegionClosure {
                   uint worker_id,
                   FreeCSetStats* stats,
                   G1EvacFailureRegions* evac_failure_regions) :
-      HeapRegionClosure(),
+      G1HeapRegionClosure(),
       _g1h(G1CollectedHeap::heap()),
       _surviving_young_words(surviving_young_words),
       _worker_id(worker_id),
@@ -853,14 +853,14 @@ class FreeCSetClosure : public HeapRegionClosure {
 };
 
 class G1PostEvacuateCollectionSetCleanupTask2::FreeCollectionSetTask : public G1AbstractSubTask {
-  G1CollectedHeap*  _g1h;
-  G1EvacInfo*       _evacuation_info;
-  FreeCSetStats*    _worker_stats;
-  HeapRegionClaimer _claimer;
-  const size_t*     _surviving_young_words;
-  uint              _active_workers;
+  G1CollectedHeap*    _g1h;
+  G1EvacInfo*         _evacuation_info;
+  FreeCSetStats*      _worker_stats;
+  G1HeapRegionClaimer _claimer;
+  const size_t*       _surviving_young_words;
+  uint                _active_workers;
   G1EvacFailureRegions* _evac_failure_regions;
-  volatile uint     _num_retained_regions;
+  volatile uint       _num_retained_regions;
 
   FreeCSetStats* worker_stats(uint worker) {
     return &_worker_stats[worker];
diff --git a/src/hotspot/share/gc/g1/jvmFlagConstraintsG1.cpp b/src/hotspot/share/gc/g1/jvmFlagConstraintsG1.cpp
index 46c850cb643..0a29caed8cc 100644
--- a/src/hotspot/share/gc/g1/jvmFlagConstraintsG1.cpp
+++ b/src/hotspot/share/gc/g1/jvmFlagConstraintsG1.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -81,7 +81,7 @@ JVMFlag::Error G1HeapRegionSizeConstraintFunc(size_t value, bool verbose) {
   if (!UseG1GC) return JVMFlag::SUCCESS;
 
   // Default value of G1HeapRegionSize=0 means will be set ergonomically.
-  if (FLAG_IS_CMDLINE(G1HeapRegionSize) && (value < HeapRegionBounds::min_size())) {
+  if (FLAG_IS_CMDLINE(G1HeapRegionSize) && (value < G1HeapRegionBounds::min_size())) {
     JVMFlag::printError(verbose,
                         "G1HeapRegionSize (" SIZE_FORMAT ") must be "
                         "greater than or equal to ergonomic heap region minimum size\n",
@@ -180,7 +180,7 @@ JVMFlag::Error NewSizeConstraintFuncG1(size_t value, bool verbose) {
 }
 
 size_t MaxSizeForHeapAlignmentG1() {
-  return HeapRegionBounds::max_size();
+  return G1HeapRegionBounds::max_size();
 }
 
 static JVMFlag::Error buffer_size_constraint_helper(JVMFlagsEnum flagid,
diff --git a/src/hotspot/share/gc/g1/vmStructs_g1.hpp b/src/hotspot/share/gc/g1/vmStructs_g1.hpp
index ec0db2d9782..22c4cfc584a 100644
--- a/src/hotspot/share/gc/g1/vmStructs_g1.hpp
+++ b/src/hotspot/share/gc/g1/vmStructs_g1.hpp
@@ -37,13 +37,13 @@
   static_field(G1HeapRegion, GrainBytes,        size_t)                       \
   static_field(G1HeapRegion, LogOfHRGrainBytes, uint)                         \
                                                                               \
-  nonstatic_field(G1HeapRegion, _type,           HeapRegionType)              \
+  nonstatic_field(G1HeapRegion, _type,           G1HeapRegionType)            \
   nonstatic_field(G1HeapRegion, _bottom,         HeapWord* const)             \
   nonstatic_field(G1HeapRegion, _top,            HeapWord* volatile)          \
   nonstatic_field(G1HeapRegion, _end,            HeapWord* const)             \
   volatile_nonstatic_field(G1HeapRegion, _pinned_object_count, size_t)        \
                                                                               \
-  nonstatic_field(HeapRegionType, _tag,       HeapRegionType::Tag volatile)   \
+  nonstatic_field(G1HeapRegionType, _tag,   G1HeapRegionType::Tag volatile)   \
                                                                               \
                                                                               \
   nonstatic_field(G1HeapRegionTable, _base,             address)              \
@@ -52,13 +52,13 @@
   nonstatic_field(G1HeapRegionTable, _bias,             size_t)               \
   nonstatic_field(G1HeapRegionTable, _shift_by,         uint)                 \
                                                                               \
-  nonstatic_field(HeapRegionManager, _regions,          G1HeapRegionTable)    \
+  nonstatic_field(G1HeapRegionManager, _regions,        G1HeapRegionTable)    \
                                                                               \
   volatile_nonstatic_field(G1CollectedHeap, _summary_bytes_used, size_t)      \
-  nonstatic_field(G1CollectedHeap, _hrm,                HeapRegionManager)    \
+  nonstatic_field(G1CollectedHeap, _hrm,                G1HeapRegionManager)  \
   nonstatic_field(G1CollectedHeap, _monitoring_support, G1MonitoringSupport*) \
-  nonstatic_field(G1CollectedHeap, _old_set,            HeapRegionSetBase)    \
-  nonstatic_field(G1CollectedHeap, _humongous_set,      HeapRegionSetBase)    \
+  nonstatic_field(G1CollectedHeap, _old_set,            G1HeapRegionSetBase)  \
+  nonstatic_field(G1CollectedHeap, _humongous_set,      G1HeapRegionSetBase)  \
                                                                               \
   nonstatic_field(G1MonitoringSupport, _eden_space_committed,     size_t)     \
   nonstatic_field(G1MonitoringSupport, _eden_space_used,          size_t)     \
@@ -67,21 +67,21 @@
   nonstatic_field(G1MonitoringSupport, _old_gen_committed,        size_t)     \
   nonstatic_field(G1MonitoringSupport, _old_gen_used,             size_t)     \
                                                                               \
-  nonstatic_field(HeapRegionSetBase,   _length,         uint)                 \
+  nonstatic_field(G1HeapRegionSetBase,   _length,       uint)                 \
                                                                               \
   nonstatic_field(SATBMarkQueue,       _active,         bool)                 \
   nonstatic_field(PtrQueue,            _buf,            void**)               \
   nonstatic_field(PtrQueue,            _index,          size_t)
 
 #define VM_INT_CONSTANTS_G1GC(declare_constant, declare_constant_with_value)  \
-  declare_constant(HeapRegionType::FreeTag)                                   \
-  declare_constant(HeapRegionType::YoungMask)                                 \
-  declare_constant(HeapRegionType::EdenTag)                                   \
-  declare_constant(HeapRegionType::SurvTag)                                   \
-  declare_constant(HeapRegionType::HumongousMask)                             \
-  declare_constant(HeapRegionType::StartsHumongousTag)                        \
-  declare_constant(HeapRegionType::ContinuesHumongousTag)                     \
-  declare_constant(HeapRegionType::OldMask)                                   \
+  declare_constant(G1HeapRegionType::FreeTag)                                 \
+  declare_constant(G1HeapRegionType::YoungMask)                               \
+  declare_constant(G1HeapRegionType::EdenTag)                                 \
+  declare_constant(G1HeapRegionType::SurvTag)                                 \
+  declare_constant(G1HeapRegionType::HumongousMask)                           \
+  declare_constant(G1HeapRegionType::StartsHumongousTag)                      \
+  declare_constant(G1HeapRegionType::ContinuesHumongousTag)                   \
+  declare_constant(G1HeapRegionType::OldMask)                                 \
   declare_constant(BarrierSet::G1BarrierSet)                                  \
   declare_constant(G1CardTable::g1_young_gen)
 
@@ -94,11 +94,11 @@
   declare_type(G1CollectedHeap, CollectedHeap)                                \
                                                                               \
   declare_toplevel_type(G1HeapRegion)                                         \
-  declare_toplevel_type(HeapRegionManager)                                    \
-  declare_toplevel_type(HeapRegionSetBase)                                    \
+  declare_toplevel_type(G1HeapRegionManager)                                  \
+  declare_toplevel_type(G1HeapRegionSetBase)                                  \
   declare_toplevel_type(G1MonitoringSupport)                                  \
   declare_toplevel_type(PtrQueue)                                             \
-  declare_toplevel_type(HeapRegionType)                                       \
+  declare_toplevel_type(G1HeapRegionType)                                     \
   declare_toplevel_type(SATBMarkQueue)                                        \
   declare_toplevel_type(G1DirtyCardQueue)                                     \
                                                                               \
@@ -106,6 +106,6 @@
   declare_toplevel_type(G1HeapRegion*)                                        \
   declare_toplevel_type(G1MonitoringSupport*)                                 \
                                                                               \
-  declare_integer_type(HeapRegionType::Tag volatile)
+  declare_integer_type(G1HeapRegionType::Tag volatile)
 
 #endif // SHARE_GC_G1_VMSTRUCTS_G1_HPP
diff --git a/src/hotspot/share/gc/parallel/parMarkBitMap.cpp b/src/hotspot/share/gc/parallel/parMarkBitMap.cpp
index 434b719aa13..658c3ef106f 100644
--- a/src/hotspot/share/gc/parallel/parMarkBitMap.cpp
+++ b/src/hotspot/share/gc/parallel/parMarkBitMap.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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
@@ -62,7 +62,7 @@ ParMarkBitMap::initialize(MemRegion covered_region)
     return true;
   }
 
-  _heap_start = 0;
+  _heap_start = nullptr;
   _heap_size = 0;
   if (_virtual_space != nullptr) {
     delete _virtual_space;
diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
index 2984cedafe1..33a499ce471 100644
--- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
+++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
@@ -441,11 +441,7 @@ HeapWord* ParallelScavengeHeap::mem_allocate_old_gen(size_t size) {
 }
 
 void ParallelScavengeHeap::do_full_collection(bool clear_all_soft_refs) {
-  // The do_full_collection() parameter clear_all_soft_refs
-  // is interpreted here as maximum_compaction which will
-  // cause SoftRefs to be cleared.
-  bool maximum_compaction = clear_all_soft_refs;
-  PSParallelCompact::invoke(maximum_compaction);
+  PSParallelCompact::invoke(clear_all_soft_refs);
 }
 
 // Failed allocation policy. Must be called from the VM thread, and
@@ -661,7 +657,7 @@ HeapWord* ParallelScavengeHeap::block_start(const void* addr) const {
            "addr should be in allocated part of old gen");
     return old_gen()->start_array()->object_start((HeapWord*)addr);
   }
-  return 0;
+  return nullptr;
 }
 
 bool ParallelScavengeHeap::block_is_obj(const HeapWord* addr) const {
diff --git a/src/hotspot/share/gc/parallel/parallel_globals.hpp b/src/hotspot/share/gc/parallel/parallel_globals.hpp
index 291dd5d73c6..e3b9660b069 100644
--- a/src/hotspot/share/gc/parallel/parallel_globals.hpp
+++ b/src/hotspot/share/gc/parallel/parallel_globals.hpp
@@ -36,10 +36,6 @@
           "any dead space)")                                                \
           range(0, max_uintx)                                               \
                                                                             \
-  product(uintx, HeapFirstMaximumCompactionCount, 3,                        \
-          "The collection count for the first maximum compaction")          \
-          range(0, max_uintx)                                               \
-                                                                            \
   product(bool, UseMaximumCompactionOnSystemGC, true,                       \
           "Use maximum compaction in the Parallel Old garbage collector "   \
           "for a system GC")                                                \
diff --git a/src/hotspot/share/gc/parallel/psOldGen.hpp b/src/hotspot/share/gc/parallel/psOldGen.hpp
index 35cefec8a0a..68cac7128da 100644
--- a/src/hotspot/share/gc/parallel/psOldGen.hpp
+++ b/src/hotspot/share/gc/parallel/psOldGen.hpp
@@ -108,11 +108,6 @@ class PSOldGen : public CHeapObj<mtGC> {
   // Size info
   size_t capacity_in_bytes() const        { return object_space()->capacity_in_bytes(); }
   size_t used_in_bytes() const            { return object_space()->used_in_bytes(); }
-  size_t free_in_bytes() const            { return object_space()->free_in_bytes(); }
-
-  size_t capacity_in_words() const        { return object_space()->capacity_in_words(); }
-  size_t used_in_words() const            { return object_space()->used_in_words(); }
-  size_t free_in_words() const            { return object_space()->free_in_words(); }
 
   bool is_maximal_no_gc() const {
     return virtual_space()->uncommitted_size() == 0;
diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
index 7b8ae42aaa4..d4a24b710cf 100644
--- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
@@ -200,188 +200,6 @@ void PSParallelCompact::print_on_error(outputStream* st) {
   _mark_bitmap.print_on_error(st);
 }
 
-#ifndef PRODUCT
-const char* PSParallelCompact::space_names[] = {
-  "old ", "eden", "from", "to  "
-};
-
-void PSParallelCompact::print_region_ranges() {
-  if (!log_develop_is_enabled(Trace, gc, compaction)) {
-    return;
-  }
-  Log(gc, compaction) log;
-  ResourceMark rm;
-  LogStream ls(log.trace());
-  Universe::print_on(&ls);
-  log.trace("space  bottom     top        end        new_top");
-  log.trace("------ ---------- ---------- ---------- ----------");
-
-  for (unsigned int id = 0; id < last_space_id; ++id) {
-    const MutableSpace* space = _space_info[id].space();
-    log.trace("%u %s "
-              SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10) " "
-              SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10) " ",
-              id, space_names[id],
-              summary_data().addr_to_region_idx(space->bottom()),
-              summary_data().addr_to_region_idx(space->top()),
-              summary_data().addr_to_region_idx(space->end()),
-              summary_data().addr_to_region_idx(_space_info[id].new_top()));
-  }
-}
-
-static void
-print_generic_summary_region(size_t i, const ParallelCompactData::RegionData* c)
-{
-#define REGION_IDX_FORMAT        SIZE_FORMAT_W(7)
-#define REGION_DATA_FORMAT       SIZE_FORMAT_W(5)
-
-  ParallelCompactData& sd = PSParallelCompact::summary_data();
-  size_t dci = c->destination() ? sd.addr_to_region_idx(c->destination()) : 0;
-  log_develop_trace(gc, compaction)(
-      REGION_IDX_FORMAT " "
-      REGION_IDX_FORMAT " " PTR_FORMAT " "
-      REGION_DATA_FORMAT " " REGION_DATA_FORMAT " "
-      REGION_DATA_FORMAT " " REGION_IDX_FORMAT " %d",
-      i, dci, p2i(c->destination()),
-      c->partial_obj_size(), c->live_obj_size(),
-      c->data_size(), c->source_region(), c->destination_count());
-
-#undef  REGION_IDX_FORMAT
-#undef  REGION_DATA_FORMAT
-}
-
-void
-print_generic_summary_data(ParallelCompactData& summary_data,
-                           HeapWord* const beg_addr,
-                           HeapWord* const end_addr)
-{
-  size_t total_words = 0;
-  size_t i = summary_data.addr_to_region_idx(beg_addr);
-  const size_t last = summary_data.addr_to_region_idx(end_addr);
-  HeapWord* pdest = 0;
-
-  while (i < last) {
-    ParallelCompactData::RegionData* c = summary_data.region(i);
-    if (c->data_size() != 0 || c->destination() != pdest) {
-      print_generic_summary_region(i, c);
-      total_words += c->data_size();
-      pdest = c->destination();
-    }
-    ++i;
-  }
-
-  log_develop_trace(gc, compaction)("summary_data_bytes=" SIZE_FORMAT, total_words * HeapWordSize);
-}
-
-void
-PSParallelCompact::print_generic_summary_data(ParallelCompactData& summary_data,
-                                              HeapWord* const beg_addr,
-                                              HeapWord* const end_addr) {
-  ::print_generic_summary_data(summary_data,beg_addr, end_addr);
-}
-
-static void
-print_initial_summary_data(ParallelCompactData& summary_data,
-                           const MutableSpace* space) {
-  if (space->top() == space->bottom()) {
-    return;
-  }
-
-  const size_t region_size = ParallelCompactData::RegionSize;
-  typedef ParallelCompactData::RegionData RegionData;
-  HeapWord* const top_aligned_up = summary_data.region_align_up(space->top());
-  const size_t end_region = summary_data.addr_to_region_idx(top_aligned_up);
-  const RegionData* c = summary_data.region(end_region - 1);
-  HeapWord* end_addr = c->destination() + c->data_size();
-  const size_t live_in_space = pointer_delta(end_addr, space->bottom());
-
-  // Print (and count) the full regions at the beginning of the space.
-  size_t full_region_count = 0;
-  size_t i = summary_data.addr_to_region_idx(space->bottom());
-  while (i < end_region && summary_data.region(i)->data_size() == region_size) {
-    ParallelCompactData::RegionData* c = summary_data.region(i);
-    log_develop_trace(gc, compaction)(
-        SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d",
-        i, p2i(c->destination()),
-        c->partial_obj_size(), c->live_obj_size(),
-        c->data_size(), c->source_region(), c->destination_count());
-    ++full_region_count;
-    ++i;
-  }
-
-  size_t live_to_right = live_in_space - full_region_count * region_size;
-
-  double max_reclaimed_ratio = 0.0;
-  size_t max_reclaimed_ratio_region = 0;
-  size_t max_dead_to_right = 0;
-  size_t max_live_to_right = 0;
-
-  // Print the 'reclaimed ratio' for regions while there is something live in
-  // the region or to the right of it.  The remaining regions are empty (and
-  // uninteresting), and computing the ratio will result in division by 0.
-  while (i < end_region && live_to_right > 0) {
-    c = summary_data.region(i);
-    HeapWord* const region_addr = summary_data.region_to_addr(i);
-    const size_t used_to_right = pointer_delta(space->top(), region_addr);
-    const size_t dead_to_right = used_to_right - live_to_right;
-    const double reclaimed_ratio = double(dead_to_right) / live_to_right;
-
-    if (reclaimed_ratio > max_reclaimed_ratio) {
-            max_reclaimed_ratio = reclaimed_ratio;
-            max_reclaimed_ratio_region = i;
-            max_dead_to_right = dead_to_right;
-            max_live_to_right = live_to_right;
-    }
-
-    ParallelCompactData::RegionData* c = summary_data.region(i);
-    log_develop_trace(gc, compaction)(
-        SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d"
-        "%12.10f " SIZE_FORMAT_W(10) " " SIZE_FORMAT_W(10),
-        i, p2i(c->destination()),
-        c->partial_obj_size(), c->live_obj_size(),
-        c->data_size(), c->source_region(), c->destination_count(),
-        reclaimed_ratio, dead_to_right, live_to_right);
-
-
-    live_to_right -= c->data_size();
-    ++i;
-  }
-
-  // Any remaining regions are empty.  Print one more if there is one.
-  if (i < end_region) {
-    ParallelCompactData::RegionData* c = summary_data.region(i);
-    log_develop_trace(gc, compaction)(
-        SIZE_FORMAT_W(5) " " PTR_FORMAT " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " " SIZE_FORMAT_W(5) " %d",
-         i, p2i(c->destination()),
-         c->partial_obj_size(), c->live_obj_size(),
-         c->data_size(), c->source_region(), c->destination_count());
-  }
-
-  log_develop_trace(gc, compaction)("max:  " SIZE_FORMAT_W(4) " d2r=" SIZE_FORMAT_W(10) " l2r=" SIZE_FORMAT_W(10) " max_ratio=%14.12f",
-                                    max_reclaimed_ratio_region, max_dead_to_right, max_live_to_right, max_reclaimed_ratio);
-}
-
-static void
-print_initial_summary_data(ParallelCompactData& summary_data,
-                           SpaceInfo* space_info) {
-  if (!log_develop_is_enabled(Trace, gc, compaction)) {
-    return;
-  }
-
-  unsigned int id = PSParallelCompact::old_space_id;
-  const MutableSpace* space;
-  do {
-    space = space_info[id].space();
-    print_initial_summary_data(summary_data, space);
-  } while (++id < PSParallelCompact::eden_space_id);
-
-  do {
-    space = space_info[id].space();
-    print_generic_summary_data(summary_data, space->bottom(), space->top());
-  } while (++id < PSParallelCompact::last_space_id);
-}
-#endif  // #ifndef PRODUCT
-
 ParallelCompactData::ParallelCompactData() :
   _heap_start(nullptr),
   DEBUG_ONLY(_heap_end(nullptr) COMMA)
@@ -419,7 +237,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size)
   MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
 
   PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz);
-  if (vspace != 0) {
+  if (vspace != nullptr) {
     if (vspace->expand_by(_reserved_byte_size)) {
       return vspace;
     }
@@ -428,7 +246,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size)
     rs.release();
   }
 
-  return 0;
+  return nullptr;
 }
 
 bool ParallelCompactData::initialize_region_data(size_t heap_size)
@@ -437,7 +255,7 @@ bool ParallelCompactData::initialize_region_data(size_t heap_size)
 
   const size_t count = heap_size >> Log2RegionSize;
   _region_vspace = create_vspace(count, sizeof(RegionData));
-  if (_region_vspace != 0) {
+  if (_region_vspace != nullptr) {
     _region_data = (RegionData*)_region_vspace->reserved_low_addr();
     _region_count = count;
     return true;
@@ -1008,48 +826,30 @@ void PSParallelCompact::fill_dense_prefix_end(SpaceId id) {
   }
 }
 
-#ifndef PRODUCT
-void PSParallelCompact::summary_phase_msg(SpaceId dst_space_id,
-                                          HeapWord* dst_beg, HeapWord* dst_end,
-                                          SpaceId src_space_id,
-                                          HeapWord* src_beg, HeapWord* src_end)
-{
-  log_develop_trace(gc, compaction)(
-      "Summarizing %d [%s] into %d [%s]:  "
-      "src=" PTR_FORMAT "-" PTR_FORMAT " "
-      SIZE_FORMAT "-" SIZE_FORMAT " "
-      "dst=" PTR_FORMAT "-" PTR_FORMAT " "
-      SIZE_FORMAT "-" SIZE_FORMAT,
-      src_space_id, space_names[src_space_id],
-      dst_space_id, space_names[dst_space_id],
-      p2i(src_beg), p2i(src_end),
-      _summary_data.addr_to_region_idx(src_beg),
-      _summary_data.addr_to_region_idx(src_end),
-      p2i(dst_beg), p2i(dst_end),
-      _summary_data.addr_to_region_idx(dst_beg),
-      _summary_data.addr_to_region_idx(dst_end));
-}
-#endif  // #ifndef PRODUCT
+bool PSParallelCompact::check_maximum_compaction(size_t total_live_words,
+                                                 MutableSpace* const old_space,
+                                                 HeapWord* full_region_prefix_end) {
+
+  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
+
+  // Check System.GC
+  bool is_max_on_system_gc = UseMaximumCompactionOnSystemGC
+                          && GCCause::is_user_requested_gc(heap->gc_cause());
 
-bool PSParallelCompact::reassess_maximum_compaction(bool maximum_compaction,
-                                                    size_t total_live_words,
-                                                    MutableSpace* const old_space,
-                                                    HeapWord* full_region_prefix_end) {
   // Check if all live objs are larger than old-gen.
   const bool is_old_gen_overflowing = (total_live_words > old_space->capacity_in_words());
 
   // JVM flags
-  const uint total_invocations = ParallelScavengeHeap::heap()->total_full_collections();
+  const uint total_invocations = heap->total_full_collections();
   assert(total_invocations >= _maximum_compaction_gc_num, "sanity");
   const size_t gcs_since_max = total_invocations - _maximum_compaction_gc_num;
-  const bool is_interval_ended = gcs_since_max > HeapMaximumCompactionInterval
-                              || total_invocations == HeapFirstMaximumCompactionCount;
+  const bool is_interval_ended = gcs_since_max > HeapMaximumCompactionInterval;
 
   // If all regions in old-gen are full
   const bool is_region_full =
     full_region_prefix_end >= _summary_data.region_align_down(old_space->top());
 
-  if (maximum_compaction || is_old_gen_overflowing || is_interval_ended || is_region_full) {
+  if (is_max_on_system_gc || is_old_gen_overflowing || is_interval_ended || is_region_full) {
     _maximum_compaction_gc_num = total_invocations;
     return true;
   }
@@ -1057,7 +857,7 @@ bool PSParallelCompact::reassess_maximum_compaction(bool maximum_compaction,
   return false;
 }
 
-void PSParallelCompact::summary_phase(bool maximum_compaction)
+void PSParallelCompact::summary_phase()
 {
   GCTraceTime(Info, gc, phases) tm("Summary Phase", &_gc_timer);
 
@@ -1080,10 +880,9 @@ void PSParallelCompact::summary_phase(bool maximum_compaction)
       _space_info[i].set_dense_prefix(space->bottom());
     }
 
-    maximum_compaction = reassess_maximum_compaction(maximum_compaction,
-                                                     total_live_words,
-                                                     old_space,
-                                                     full_region_prefix_end);
+    bool maximum_compaction = check_maximum_compaction(total_live_words,
+                                                       old_space,
+                                                       full_region_prefix_end);
     HeapWord* dense_prefix_end =
       maximum_compaction ? full_region_prefix_end
                          : compute_dense_prefix_for_old_space(old_space,
@@ -1114,8 +913,6 @@ void PSParallelCompact::summary_phase(bool maximum_compaction)
                                       space->bottom());
     const size_t available = pointer_delta(dst_space_end, *new_top_addr);
 
-    NOT_PRODUCT(summary_phase_msg(dst_space_id, *new_top_addr, dst_space_end,
-                                  SpaceId(id), space->bottom(), space->top());)
     if (live > 0 && live <= available) {
       // All the live data will fit.
       bool done = _summary_data.summarize(_space_info[id].split_info(),
@@ -1143,9 +940,6 @@ void PSParallelCompact::summary_phase(bool maximum_compaction)
       dst_space_id = SpaceId(id);
       dst_space_end = space->end();
       new_top_addr = _space_info[id].new_top_addr();
-      NOT_PRODUCT(summary_phase_msg(dst_space_id,
-                                    space->bottom(), dst_space_end,
-                                    SpaceId(id), next_src_addr, space->top());)
       done = _summary_data.summarize(_space_info[id].split_info(),
                                      next_src_addr, space->top(),
                                      nullptr,
@@ -1155,10 +949,6 @@ void PSParallelCompact::summary_phase(bool maximum_compaction)
       assert(*new_top_addr <= space->top(), "usage should not grow");
     }
   }
-
-  log_develop_trace(gc, compaction)("Summary_phase:  after final summarization");
-  NOT_PRODUCT(print_region_ranges());
-  NOT_PRODUCT(print_initial_summary_data(_summary_data, _space_info));
 }
 
 // This method should contain all heap-specific policy for invoking a full
@@ -1173,26 +963,23 @@ void PSParallelCompact::summary_phase(bool maximum_compaction)
 // may be true because this method can be called without intervening
 // activity.  For example when the heap space is tight and full measure
 // are being taken to free space.
-bool PSParallelCompact::invoke(bool maximum_heap_compaction) {
+bool PSParallelCompact::invoke(bool clear_all_soft_refs) {
   assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
   assert(Thread::current() == (Thread*)VMThread::vm_thread(),
          "should be in vm thread");
 
-  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
-  assert(!heap->is_stw_gc_active(), "not reentrant");
-
   IsSTWGCActiveMark mark;
 
-  const bool clear_all_soft_refs =
-    heap->soft_ref_policy()->should_clear_all_soft_refs();
+  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
+  clear_all_soft_refs = clear_all_soft_refs
+                     || heap->soft_ref_policy()->should_clear_all_soft_refs();
 
-  return PSParallelCompact::invoke_no_policy(clear_all_soft_refs ||
-                                             maximum_heap_compaction);
+  return PSParallelCompact::invoke_no_policy(clear_all_soft_refs);
 }
 
 // This method contains no policy. You should probably
 // be calling invoke() instead.
-bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
+bool PSParallelCompact::invoke_no_policy(bool clear_all_soft_refs) {
   assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
   assert(ref_processor() != nullptr, "Sanity");
 
@@ -1213,7 +1000,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
 
   // The scope of casr should end after code that can change
   // SoftRefPolicy::_should_clear_all_soft_refs.
-  ClearedAllSoftRefs casr(maximum_heap_compaction,
+  ClearedAllSoftRefs casr(clear_all_soft_refs,
                           heap->soft_ref_policy());
 
   // Make sure data structures are sane, make the heap parsable, and do other
@@ -1248,7 +1035,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
     DerivedPointerTable::clear();
 #endif
 
-    ref_processor()->start_discovery(maximum_heap_compaction);
+    ref_processor()->start_discovery(clear_all_soft_refs);
 
     ClassUnloadingContext ctx(1 /* num_nmethod_unlink_workers */,
                               false /* unregister_nmethods_during_purge */,
@@ -1256,9 +1043,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
 
     marking_phase(&_gc_tracer);
 
-    bool max_on_system_gc = UseMaximumCompactionOnSystemGC
-      && GCCause::is_user_requested_gc(gc_cause);
-    summary_phase(maximum_heap_compaction || max_on_system_gc);
+    summary_phase();
 
 #if COMPILER2_OR_JVMCI
     assert(DerivedPointerTable::is_active(), "Sanity");
@@ -2126,15 +1911,12 @@ void PSParallelCompact::verify_complete(SpaceId space_id) {
   const size_t new_top_region = sd.addr_to_region_idx(new_top_addr);
   const size_t old_top_region = sd.addr_to_region_idx(old_top_addr);
 
-  bool issued_a_warning = false;
-
   size_t cur_region;
   for (cur_region = beg_region; cur_region < new_top_region; ++cur_region) {
     const RegionData* const c = sd.region(cur_region);
     if (!c->completed()) {
       log_warning(gc)("region " SIZE_FORMAT " not filled: destination_count=%u",
                       cur_region, c->destination_count());
-      issued_a_warning = true;
     }
   }
 
@@ -2143,13 +1925,8 @@ void PSParallelCompact::verify_complete(SpaceId space_id) {
     if (!c->available()) {
       log_warning(gc)("region " SIZE_FORMAT " not empty: destination_count=%u",
                       cur_region, c->destination_count());
-      issued_a_warning = true;
     }
   }
-
-  if (issued_a_warning) {
-    print_region_ranges();
-  }
 }
 #endif  // #ifdef ASSERT
 
@@ -2450,7 +2227,7 @@ void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosu
     if (closure.is_full()) {
       decrement_destination_counts(cm, src_space_id, src_region_idx,
                                    closure.source());
-      closure.complete_region(cm, dest_addr, region_ptr);
+      closure.complete_region(dest_addr, region_ptr);
       return;
     }
 
@@ -2493,7 +2270,7 @@ void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosu
     if (closure.is_full()) {
       decrement_destination_counts(cm, src_space_id, src_region_idx,
                                    closure.source());
-      closure.complete_region(cm, dest_addr, region_ptr);
+      closure.complete_region(dest_addr, region_ptr);
       return;
     }
 
@@ -2526,7 +2303,7 @@ void PSParallelCompact::fill_and_update_shadow_region(ParCompactionManager* cm,
     region_ptr->shadow_to_normal();
     return fill_region(cm, cl, region_idx);
   } else {
-    MoveAndUpdateShadowClosure cl(mark_bitmap(), cm, region_idx, shadow_region);
+    MoveAndUpdateShadowClosure cl(mark_bitmap(), region_idx, shadow_region);
     return fill_region(cm, cl, region_idx);
   }
 }
@@ -2603,8 +2380,7 @@ void MoveAndUpdateClosure::copy_partial_obj(size_t partial_obj_size)
   update_state(words);
 }
 
-void MoveAndUpdateClosure::complete_region(ParCompactionManager *cm, HeapWord *dest_addr,
-                                           PSParallelCompact::RegionData *region_ptr) {
+void MoveAndUpdateClosure::complete_region(HeapWord* dest_addr, PSParallelCompact::RegionData* region_ptr) {
   assert(region_ptr->shadow_state() == ParallelCompactData::RegionData::NormalRegion, "Region should be finished");
   region_ptr->set_completed();
 }
@@ -2634,8 +2410,7 @@ void MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) {
   update_state(words);
 }
 
-void MoveAndUpdateShadowClosure::complete_region(ParCompactionManager *cm, HeapWord *dest_addr,
-                                                 PSParallelCompact::RegionData *region_ptr) {
+void MoveAndUpdateShadowClosure::complete_region(HeapWord* dest_addr, PSParallelCompact::RegionData* region_ptr) {
   assert(region_ptr->shadow_state() == ParallelCompactData::RegionData::ShadowRegion, "Region should be shadow");
   // Record the shadow region index
   region_ptr->set_shadow_region(_shadow);
diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.hpp b/src/hotspot/share/gc/parallel/psParallelCompact.hpp
index b30ed0ab98a..1e04beb8c66 100644
--- a/src/hotspot/share/gc/parallel/psParallelCompact.hpp
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.hpp
@@ -695,8 +695,6 @@ class PSParallelCompact : AllStatic {
     virtual bool do_object_b(oop p);
   };
 
-  friend class PSParallelCompactTest;
-
 private:
   static STWGCTimer           _gc_timer;
   static ParallelOldTracer    _gc_tracer;
@@ -725,10 +723,9 @@ class PSParallelCompact : AllStatic {
   static void pre_compact();
   static void post_compact();
 
-  static bool reassess_maximum_compaction(bool maximum_compaction,
-                                          size_t total_live_words,
-                                          MutableSpace* const old_space,
-                                          HeapWord* full_region_prefix_end);
+  static bool check_maximum_compaction(size_t total_live_words,
+                                       MutableSpace* const old_space,
+                                       HeapWord* full_region_prefix_end);
 
   // Mark live objects
   static void marking_phase(ParallelOldTracer *gc_tracer);
@@ -741,7 +738,7 @@ class PSParallelCompact : AllStatic {
   // make the heap parsable.
   static void fill_dense_prefix_end(SpaceId id);
 
-  static void summary_phase(bool maximum_compaction);
+  static void summary_phase();
 
   static void adjust_pointers();
   static void forward_to_new_addr();
@@ -755,13 +752,6 @@ class PSParallelCompact : AllStatic {
   // Add available regions to the stack and draining tasks to the task queue.
   static void prepare_region_draining_tasks(uint parallel_gc_threads);
 
-#ifndef PRODUCT
-  // Print generic summary data
-  static void print_generic_summary_data(ParallelCompactData& summary_data,
-                                         HeapWord* const beg_addr,
-                                         HeapWord* const end_addr);
-#endif  // #ifndef PRODUCT
-
   static void fill_range_in_dense_prefix(HeapWord* start, HeapWord* end);
 
 public:
@@ -857,16 +847,6 @@ class PSParallelCompact : AllStatic {
 
   static void print_on_error(outputStream* st);
 
-#ifndef PRODUCT
-  // Debugging support.
-  static const char* space_names[last_space_id];
-  static void print_region_ranges();
-  static void summary_phase_msg(SpaceId dst_space_id,
-                                HeapWord* dst_beg, HeapWord* dst_end,
-                                SpaceId src_space_id,
-                                HeapWord* src_beg, HeapWord* src_end);
-#endif  // #ifndef PRODUCT
-
 #ifdef  ASSERT
   // Sanity check the new location of a word in the heap.
   static inline void check_new_location(HeapWord* old_addr, HeapWord* new_addr);
@@ -914,8 +894,7 @@ class MoveAndUpdateClosure: public StackObj {
   // updated.
   void copy_partial_obj(size_t partial_obj_size);
 
-  virtual void complete_region(ParCompactionManager* cm, HeapWord* dest_addr,
-                               PSParallelCompact::RegionData* region_ptr);
+  virtual void complete_region(HeapWord* dest_addr, PSParallelCompact::RegionData* region_ptr);
 };
 
 inline void MoveAndUpdateClosure::decrement_words_remaining(size_t words) {
@@ -951,11 +930,9 @@ inline void MoveAndUpdateClosure::update_state(size_t words)
 class MoveAndUpdateShadowClosure: public MoveAndUpdateClosure {
   inline size_t calculate_shadow_offset(size_t region_idx, size_t shadow_idx);
 public:
-  inline MoveAndUpdateShadowClosure(ParMarkBitMap* bitmap, ParCompactionManager* cm,
-                       size_t region, size_t shadow);
+  inline MoveAndUpdateShadowClosure(ParMarkBitMap* bitmap, size_t region, size_t shadow);
 
-  virtual void complete_region(ParCompactionManager* cm, HeapWord* dest_addr,
-                               PSParallelCompact::RegionData* region_ptr);
+  virtual void complete_region(HeapWord* dest_addr, PSParallelCompact::RegionData* region_ptr);
 
 private:
   size_t _shadow;
@@ -969,10 +946,7 @@ inline size_t MoveAndUpdateShadowClosure::calculate_shadow_offset(size_t region_
 }
 
 inline
-MoveAndUpdateShadowClosure::MoveAndUpdateShadowClosure(ParMarkBitMap *bitmap,
-                                                       ParCompactionManager *cm,
-                                                       size_t region,
-                                                       size_t shadow) :
+MoveAndUpdateShadowClosure::MoveAndUpdateShadowClosure(ParMarkBitMap* bitmap, size_t region, size_t shadow) :
   MoveAndUpdateClosure(bitmap, region),
   _shadow(shadow) {
   _offset = calculate_shadow_offset(region, shadow);
diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp
index eb27e9776ed..390dea4976d 100644
--- a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp
+++ b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp
@@ -148,10 +148,6 @@ inline oop PSPromotionManager::copy_to_survivor_space(oop o) {
   if (!m.is_forwarded()) {
     return copy_unmarked_to_survivor_space<promote_immediately>(o, m);
   } else {
-    // Ensure any loads from the forwardee follow all changes that precede
-    // the release-cmpxchg that performed the forwarding, possibly in some
-    // other thread.
-    OrderAccess::acquire();
     // Return the already installed forwardee.
     return m.forwardee();
   }
@@ -253,13 +249,12 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o,
   // Copy obj
   Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(o), cast_from_oop<HeapWord*>(new_obj), new_obj_size);
 
-  // Parallel GC claims with a release - so other threads might access this object
-  // after claiming and they should see the "completed" object.
-  ContinuationGCSupport::transform_stack_chunk(new_obj);
-
   // Now we have to CAS in the header.
-  // Make copy visible to threads reading the forwardee.
-  oop forwardee = o->forward_to_atomic(new_obj, test_mark, memory_order_release);
+  // Because the forwarding is done with memory_order_relaxed there is no
+  // ordering with the above copy.  Clients that get the forwardee must not
+  // examine its contents without other synchronization, since the contents
+  // may not be up to date for them.
+  oop forwardee = o->forward_to_atomic(new_obj, test_mark, memory_order_relaxed);
   if (forwardee == nullptr) {  // forwardee is null when forwarding is successful
     // We won any races, we "own" this object.
     assert(new_obj == o->forwardee(), "Sanity");
@@ -272,6 +267,8 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o,
       assert(young_space()->contains(new_obj), "Attempt to push non-promoted obj");
     }
 
+    ContinuationGCSupport::transform_stack_chunk(new_obj);
+
     // Do the size comparison first with new_obj_size, which we
     // already have. Hopefully, only a few objects are larger than
     // _min_array_size_for_chunking, and most of them will be arrays.
@@ -295,9 +292,6 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o,
     return new_obj;
   } else {
     // We lost, someone else "owns" this object.
-    // Ensure loads from the forwardee follow all changes that preceded the
-    // release-cmpxchg that performed the forwarding in another thread.
-    OrderAccess::acquire();
 
     assert(o->is_forwarded(), "Object must be forwarded if the cas failed.");
     assert(o->forwardee() == forwardee, "invariant");
diff --git a/src/hotspot/share/gc/parallel/psScavenge.cpp b/src/hotspot/share/gc/parallel/psScavenge.cpp
index 865bbd17099..708bb9da48a 100644
--- a/src/hotspot/share/gc/parallel/psScavenge.cpp
+++ b/src/hotspot/share/gc/parallel/psScavenge.cpp
@@ -235,7 +235,6 @@ bool PSScavenge::invoke() {
   assert(!ParallelScavengeHeap::heap()->is_stw_gc_active(), "not reentrant");
 
   ParallelScavengeHeap* const heap = ParallelScavengeHeap::heap();
-  PSAdaptiveSizePolicy* policy = heap->size_policy();
   IsSTWGCActiveMark mark;
 
   const bool scavenge_done = PSScavenge::invoke_no_policy();
@@ -250,8 +249,7 @@ bool PSScavenge::invoke() {
 
   if (need_full_gc) {
     GCCauseSetter gccs(heap, GCCause::_adaptive_size_policy);
-    SoftRefPolicy* srp = heap->soft_ref_policy();
-    const bool clear_all_softrefs = srp->should_clear_all_soft_refs();
+    const bool clear_all_softrefs = heap->soft_ref_policy()->should_clear_all_soft_refs();
 
     full_gc_done = PSParallelCompact::invoke_no_policy(clear_all_softrefs);
   }
diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp
index be104dce571..715b82fd38d 100644
--- a/src/hotspot/share/gc/serial/defNewGeneration.cpp
+++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp
@@ -229,7 +229,6 @@ DefNewGeneration::DefNewGeneration(ReservedSpace rs,
     _promotion_failed(false),
     _preserved_marks_set(false /* in_c_heap */),
     _promo_failure_drain_in_progress(false),
-    _should_allocate_from_space(false),
     _string_dedup_requests()
 {
   MemRegion cmr((HeapWord*)_virtual_space.low(),
@@ -534,11 +533,6 @@ size_t DefNewGeneration::capacity_before_gc() const {
   return eden()->capacity();
 }
 
-size_t DefNewGeneration::contiguous_available() const {
-  return eden()->free();
-}
-
-
 void DefNewGeneration::object_iterate(ObjectClosure* blk) {
   eden()->object_iterate(blk);
   from()->object_iterate(blk);
@@ -578,33 +572,6 @@ HeapWord* DefNewGeneration::block_start(const void* p) const {
   return block_start_const(to(), p);
 }
 
-// The last collection bailed out, we are running out of heap space,
-// so we try to allocate the from-space, too.
-HeapWord* DefNewGeneration::allocate_from_space(size_t size) {
-  bool should_try_alloc = should_allocate_from_space() || GCLocker::is_active_and_needs_gc();
-
-  // If the Heap_lock is not locked by this thread, this will be called
-  // again later with the Heap_lock held.
-  bool do_alloc = should_try_alloc && (Heap_lock->owned_by_self() || (SafepointSynchronize::is_at_safepoint() && Thread::current()->is_VM_thread()));
-
-  HeapWord* result = nullptr;
-  if (do_alloc) {
-    result = from()->allocate(size);
-  }
-
-  log_trace(gc, alloc)("DefNewGeneration::allocate_from_space(" SIZE_FORMAT "):  will_fail: %s  heap_lock: %s  free: " SIZE_FORMAT "%s%s returns %s",
-                        size,
-                        SerialHeap::heap()->incremental_collection_will_fail(false /* don't consult_young */) ?
-                          "true" : "false",
-                        Heap_lock->is_locked() ? "locked" : "unlocked",
-                        from()->free(),
-                        should_try_alloc ? "" : "  should_allocate_from_space: NOT",
-                        do_alloc ? "  Heap_lock is not owned by self" : "",
-                        result == nullptr ? "null" : "object");
-
-  return result;
-}
-
 HeapWord* DefNewGeneration::expand_and_allocate(size_t size, bool is_tlab) {
   // We don't attempt to expand the young generation (but perhaps we should.)
   return allocate(size, is_tlab);
@@ -707,21 +674,12 @@ bool DefNewGeneration::collect(bool clear_all_soft_refs) {
     assert(to()->is_empty(), "to space should be empty now");
 
     adjust_desired_tenuring_threshold();
-
-    assert(!heap->incremental_collection_failed(), "Should be clear");
   } else {
     assert(_promo_failure_scan_stack.is_empty(), "post condition");
     _promo_failure_scan_stack.clear(true); // Clear cached segments.
 
     remove_forwarding_pointers();
     log_info(gc, promotion)("Promotion failed");
-    // Add to-space to the list of space to compact
-    // when a promotion failure has occurred.  In that
-    // case there can be live objects in to-space
-    // as a result of a partial evacuation of eden
-    // and from-space.
-    swap_spaces();   // For uniformity wrt ParNewGeneration.
-    heap->set_incremental_collection_failed();
 
     _gc_tracer->report_promotion_failed(_promotion_failed_info);
 
@@ -804,25 +762,25 @@ oop DefNewGeneration::copy_to_survivor_space(oop old) {
   bool new_obj_is_tenured = false;
   // Otherwise try allocating obj tenured
   if (obj == nullptr) {
-    obj = _old_gen->promote(old, s);
+    obj = _old_gen->allocate_for_promotion(old, s);
     if (obj == nullptr) {
       handle_promotion_failure(old);
       return old;
     }
 
-    ContinuationGCSupport::transform_stack_chunk(obj);
-
     new_obj_is_tenured = true;
-  } else {
-    // Prefetch beyond obj
-    const intx interval = PrefetchCopyIntervalInBytes;
-    Prefetch::write(obj, interval);
+  }
+
+  // Prefetch beyond obj
+  const intx interval = PrefetchCopyIntervalInBytes;
+  Prefetch::write(obj, interval);
 
-    // Copy obj
-    Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(old), cast_from_oop<HeapWord*>(obj), s);
+  // Copy obj
+  Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(old), cast_from_oop<HeapWord*>(obj), s);
 
-    ContinuationGCSupport::transform_stack_chunk(obj);
+  ContinuationGCSupport::transform_stack_chunk(obj);
 
+  if (!new_obj_is_tenured) {
     // Increment age if obj still in new generation
     obj->incr_age();
     age_table()->add(obj, s);
@@ -871,63 +829,11 @@ void DefNewGeneration::reset_scratch() {
   }
 }
 
-bool DefNewGeneration::collection_attempt_is_safe() {
-  if (!to()->is_empty()) {
-    log_trace(gc)(":: to is not empty ::");
-    return false;
-  }
-  if (_old_gen == nullptr) {
-    _old_gen = SerialHeap::heap()->old_gen();
-  }
-  return _old_gen->promotion_attempt_is_safe(used());
-}
-
 void DefNewGeneration::gc_epilogue(bool full) {
-  DEBUG_ONLY(static bool seen_incremental_collection_failed = false;)
-
   assert(!GCLocker::is_active(), "We should not be executing here");
-  // Check if the heap is approaching full after a collection has
-  // been done.  Generally the young generation is empty at
-  // a minimum at the end of a collection.  If it is not, then
-  // the heap is approaching full.
-  SerialHeap* gch = SerialHeap::heap();
-  if (full) {
-    DEBUG_ONLY(seen_incremental_collection_failed = false;)
-    if (!collection_attempt_is_safe() && !_eden_space->is_empty()) {
-      log_trace(gc)("DefNewEpilogue: cause(%s), full, not safe, set_failed, set_alloc_from, clear_seen",
-                            GCCause::to_string(gch->gc_cause()));
-      gch->set_incremental_collection_failed(); // Slight lie: a full gc left us in that state
-      set_should_allocate_from_space(); // we seem to be running out of space
-    } else {
-      log_trace(gc)("DefNewEpilogue: cause(%s), full, safe, clear_failed, clear_alloc_from, clear_seen",
-                            GCCause::to_string(gch->gc_cause()));
-      gch->clear_incremental_collection_failed(); // We just did a full collection
-      clear_should_allocate_from_space(); // if set
-    }
-  } else {
-#ifdef ASSERT
-    // It is possible that incremental_collection_failed() == true
-    // here, because an attempted scavenge did not succeed. The policy
-    // is normally expected to cause a full collection which should
-    // clear that condition, so we should not be here twice in a row
-    // with incremental_collection_failed() == true without having done
-    // a full collection in between.
-    if (!seen_incremental_collection_failed &&
-        gch->incremental_collection_failed()) {
-      log_trace(gc)("DefNewEpilogue: cause(%s), not full, not_seen_failed, failed, set_seen_failed",
-                            GCCause::to_string(gch->gc_cause()));
-      seen_incremental_collection_failed = true;
-    } else if (seen_incremental_collection_failed) {
-      log_trace(gc)("DefNewEpilogue: cause(%s), not full, seen_failed, will_clear_seen_failed",
-                            GCCause::to_string(gch->gc_cause()));
-      seen_incremental_collection_failed = false;
-    }
-#endif // ASSERT
-  }
-
   // update the generation and space performance counters
   update_counters();
-  gch->counters()->update_counters();
+  SerialHeap::heap()->counters()->update_counters();
 }
 
 void DefNewGeneration::update_counters() {
@@ -967,13 +873,6 @@ HeapWord* DefNewGeneration::allocate(size_t word_size, bool is_tlab) {
   // Note that since DefNewGeneration supports lock-free allocation, we
   // have to use it here, as well.
   HeapWord* result = eden()->par_allocate(word_size);
-  if (result == nullptr) {
-    // If the eden is full and the last collection bailed out, we are running
-    // out of heap space, and we try to allocate the from-space, too.
-    // allocate_from_space can't be inlined because that would introduce a
-    // circular dependency at compile time.
-    result = allocate_from_space(word_size);
-  }
   return result;
 }
 
diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp
index 65ee52cf4ea..011b79fdabd 100644
--- a/src/hotspot/share/gc/serial/defNewGeneration.hpp
+++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp
@@ -43,7 +43,6 @@ class CSpaceCounters;
 class OldGenScanClosure;
 class YoungGenScanClosure;
 class DefNewTracer;
-class ScanWeakRefClosure;
 class SerialHeap;
 class STWGCTimer;
 
@@ -119,18 +118,6 @@ class DefNewGeneration: public Generation {
   size_t               _max_eden_size;
   size_t               _max_survivor_size;
 
-  // Allocation support
-  bool _should_allocate_from_space;
-  bool should_allocate_from_space() const {
-    return _should_allocate_from_space;
-  }
-  void clear_should_allocate_from_space() {
-    _should_allocate_from_space = false;
-  }
-  void set_should_allocate_from_space() {
-    _should_allocate_from_space = true;
-  }
-
   // Tenuring
   void adjust_desired_tenuring_threshold();
 
@@ -185,13 +172,10 @@ class DefNewGeneration: public Generation {
   // heuristic resizing decisions.
   size_t unsafe_max_alloc_nogc() const;
 
-  size_t contiguous_available() const;
-
   size_t max_eden_size() const              { return _max_eden_size; }
   size_t max_survivor_size() const          { return _max_survivor_size; }
 
   // Thread-local allocation buffers
-  bool supports_tlab_allocation() const { return true; }
   size_t tlab_capacity() const;
   size_t tlab_used() const;
   size_t unsafe_max_tlab_alloc() const;
@@ -226,7 +210,6 @@ class DefNewGeneration: public Generation {
   }
 
   HeapWord* allocate(size_t word_size, bool is_tlab);
-  HeapWord* allocate_from_space(size_t word_size);
 
   HeapWord* par_allocate(size_t word_size, bool is_tlab);
 
@@ -242,13 +225,6 @@ class DefNewGeneration: public Generation {
   // GC support
   void compute_new_size();
 
-  // Returns true if the collection is likely to be safely
-  // completed. Even if this method returns true, a collection
-  // may not be guaranteed to succeed, and the system should be
-  // able to safely unwind and recover from that failure, albeit
-  // at some additional cost.
-  bool collection_attempt_is_safe();
-
   bool collect(bool clear_all_soft_refs);
 
   HeapWord* expand_and_allocate(size_t size, bool is_tlab);
diff --git a/src/hotspot/share/gc/serial/generation.hpp b/src/hotspot/share/gc/serial/generation.hpp
index 9f73caacb19..a757c97c5cb 100644
--- a/src/hotspot/share/gc/serial/generation.hpp
+++ b/src/hotspot/share/gc/serial/generation.hpp
@@ -96,10 +96,6 @@ class Generation: public CHeapObj<mtGC> {
   // for the allocation of objects.
   virtual size_t max_capacity() const;
 
-  // The largest number of contiguous free bytes in the generation,
-  // including expansion  (Assumes called at a safepoint.)
-  virtual size_t contiguous_available() const = 0;
-
   MemRegion reserved() const { return _reserved; }
 
   /* Returns "TRUE" iff "p" points into the reserved area of the generation. */
@@ -114,9 +110,6 @@ class Generation: public CHeapObj<mtGC> {
   // Like "allocate", but performs any necessary locking internally.
   virtual HeapWord* par_allocate(size_t word_size, bool is_tlab) = 0;
 
-  // Thread-local allocation buffers
-  virtual bool supports_tlab_allocation() const { return false; }
-
   // Perform a heap collection, attempting to create (at least) enough
   // space to support an allocation of the given "word_size".  If
   // successful, perform the allocation and return the resulting
diff --git a/src/hotspot/share/gc/serial/serialHeap.cpp b/src/hotspot/share/gc/serial/serialHeap.cpp
index f4e9e5c6f2e..c1fdc1eba1a 100644
--- a/src/hotspot/share/gc/serial/serialHeap.cpp
+++ b/src/hotspot/share/gc/serial/serialHeap.cpp
@@ -92,7 +92,6 @@ SerialHeap::SerialHeap() :
     _old_gen(nullptr),
     _rem_set(nullptr),
     _gc_policy_counters(new GCPolicyCounters("Copy:MSC", 2, 2)),
-    _incremental_collection_failed(false),
     _young_manager(nullptr),
     _old_manager(nullptr),
     _eden_pool(nullptr),
@@ -287,8 +286,7 @@ size_t SerialHeap::max_capacity() const {
 bool SerialHeap::should_try_older_generation_allocation(size_t word_size) const {
   size_t young_capacity = _young_gen->capacity_before_gc();
   return    (word_size > heap_word_size(young_capacity))
-         || GCLocker::is_active_and_needs_gc()
-         || incremental_collection_failed();
+         || GCLocker::is_active_and_needs_gc();
 }
 
 HeapWord* SerialHeap::expand_heap_and_allocate(size_t size, bool is_tlab) {
@@ -468,7 +466,10 @@ bool SerialHeap::do_young_collection(bool clear_soft_refs) {
 
   COMPILER2_OR_JVMCI_PRESENT(DerivedPointerTable::update_pointers());
 
-  update_gc_stats(_young_gen, false);
+  // Only update stats for successful young-gc
+  if (result) {
+    _old_gen->update_promote_stats();
+  }
 
   if (should_verify && VerifyAfterGC) {
     Universe::verify("After GC");
@@ -761,6 +762,8 @@ void SerialHeap::do_full_collection_no_gc_locker(bool clear_all_soft_refs) {
   // Need to clear claim bits for the next mark.
   ClassLoaderDataGraph::clear_claimed_marks();
 
+  _old_gen->update_promote_stats();
+
   // Resize the metaspace capacity after full collections
   MetaspaceGC::compute_new_size();
 
@@ -828,20 +831,15 @@ bool SerialHeap::block_is_obj(const HeapWord* addr) const {
 }
 
 size_t SerialHeap::tlab_capacity(Thread* thr) const {
-  assert(!_old_gen->supports_tlab_allocation(), "Old gen supports TLAB allocation?!");
-  assert(_young_gen->supports_tlab_allocation(), "Young gen doesn't support TLAB allocation?!");
+  // Only young-gen supports tlab allocation.
   return _young_gen->tlab_capacity();
 }
 
 size_t SerialHeap::tlab_used(Thread* thr) const {
-  assert(!_old_gen->supports_tlab_allocation(), "Old gen supports TLAB allocation?!");
-  assert(_young_gen->supports_tlab_allocation(), "Young gen doesn't support TLAB allocation?!");
   return _young_gen->tlab_used();
 }
 
 size_t SerialHeap::unsafe_max_tlab_alloc(Thread* thr) const {
-  assert(!_old_gen->supports_tlab_allocation(), "Old gen supports TLAB allocation?!");
-  assert(_young_gen->supports_tlab_allocation(), "Young gen doesn't support TLAB allocation?!");
   return _young_gen->unsafe_max_tlab_alloc();
 }
 
diff --git a/src/hotspot/share/gc/serial/serialHeap.hpp b/src/hotspot/share/gc/serial/serialHeap.hpp
index 4b606099bf3..750bb322b2a 100644
--- a/src/hotspot/share/gc/serial/serialHeap.hpp
+++ b/src/hotspot/share/gc/serial/serialHeap.hpp
@@ -72,14 +72,8 @@ class SerialHeap : public CollectedHeap {
   friend class HeapInspection;
   friend class GCCauseSetter;
   friend class VMStructs;
-public:
   friend class VM_PopulateDumpSharedSpace;
 
-  enum GenerationType {
-    YoungGen,
-    OldGen
-  };
-
 private:
   DefNewGeneration* _young_gen;
   TenuredGeneration* _old_gen;
@@ -91,11 +85,6 @@ class SerialHeap : public CollectedHeap {
 
   GCPolicyCounters* _gc_policy_counters;
 
-  // Indicates that the most recent previous incremental collection failed.
-  // The flag is cleared when an action is taken that might clear the
-  // condition that caused that incremental collection to fail.
-  bool _incremental_collection_failed;
-
   bool do_young_collection(bool clear_soft_refs);
 
   // Reserve aligned space for the heap as needed by the contained generations.
@@ -129,7 +118,6 @@ class SerialHeap : public CollectedHeap {
   // Does operations required after initialization has been done.
   void post_initialize() override;
 
-  bool is_young_gen(const Generation* gen) const { return gen == _young_gen; }
   bool is_in_reserved(const void* addr) const { return _reserved.contains(addr); }
 
   // Performance Counter support
@@ -208,11 +196,6 @@ class SerialHeap : public CollectedHeap {
                               size_t requested_size,
                               size_t* actual_size) override;
 
-  // Update the gc statistics for each generation.
-  void update_gc_stats(Generation* current_generation, bool full) {
-    _old_gen->update_gc_stats(current_generation, full);
-  }
-
   void prepare_for_verify() override;
   void verify(VerifyOption option) override;
 
@@ -260,29 +243,6 @@ class SerialHeap : public CollectedHeap {
   // in other generations, it should call this method.
   void save_marks();
 
-  // Returns true if an incremental collection is likely to fail.
-  // We optionally consult the young gen, if asked to do so;
-  // otherwise we base our answer on whether the previous incremental
-  // collection attempt failed with no corrective action as of yet.
-  bool incremental_collection_will_fail(bool consult_young) {
-    // The first disjunct remembers if an incremental collection failed, even
-    // when we thought (second disjunct) that it would not.
-    return incremental_collection_failed() ||
-           (consult_young && !_young_gen->collection_attempt_is_safe());
-  }
-
-  // If a generation bails out of an incremental collection,
-  // it sets this flag.
-  bool incremental_collection_failed() const {
-    return _incremental_collection_failed;
-  }
-  void set_incremental_collection_failed() {
-    _incremental_collection_failed = true;
-  }
-  void clear_incremental_collection_failed() {
-    _incremental_collection_failed = false;
-  }
-
 private:
   // Return true if an allocation should be attempted in the older generation
   // if it fails in the younger generation.  Return false, otherwise.
@@ -294,7 +254,6 @@ class SerialHeap : public CollectedHeap {
   HeapWord* mem_allocate_work(size_t size,
                               bool is_tlab);
 
-private:
   MemoryPool* _eden_pool;
   MemoryPool* _survivor_pool;
   MemoryPool* _old_pool;
diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.cpp b/src/hotspot/share/gc/serial/tenuredGeneration.cpp
index 9602553a6f3..b1b75070947 100644
--- a/src/hotspot/share/gc/serial/tenuredGeneration.cpp
+++ b/src/hotspot/share/gc/serial/tenuredGeneration.cpp
@@ -32,6 +32,7 @@
 #include "gc/shared/gcLocker.hpp"
 #include "gc/shared/gcTimer.hpp"
 #include "gc/shared/gcTrace.hpp"
+#include "gc/shared/genArguments.hpp"
 #include "gc/shared/space.hpp"
 #include "gc/shared/spaceDecorator.hpp"
 #include "logging/log.hpp"
@@ -357,25 +358,15 @@ void TenuredGeneration::compute_new_size() {
          " capacity: " SIZE_FORMAT, used(), used_after_gc, capacity());
 }
 
-void TenuredGeneration::update_gc_stats(Generation* current_generation,
-                                        bool full) {
-  // If the young generation has been collected, gather any statistics
-  // that are of interest at this point.
-  bool current_is_young = SerialHeap::heap()->is_young_gen(current_generation);
-  if (!full && current_is_young) {
-    // Calculate size of data promoted from the young generation
-    // before doing the collection.
-    size_t used_before_gc = used();
-
-    // If the young gen collection was skipped, then the
-    // number of promoted bytes will be 0 and adding it to the
-    // average will incorrectly lessen the average.  It is, however,
-    // also possible that no promotion was needed.
-    if (used_before_gc >= _used_at_prologue) {
-      size_t promoted_in_bytes = used_before_gc - _used_at_prologue;
-      _avg_promoted->sample(promoted_in_bytes);
-    }
+void TenuredGeneration::update_promote_stats() {
+  size_t used_after_gc = used();
+  size_t promoted_in_bytes;
+  if (used_after_gc > _used_at_prologue) {
+    promoted_in_bytes = used_after_gc - _used_at_prologue;
+  } else {
+    promoted_in_bytes = 0;
   }
+  _avg_promoted->sample(promoted_in_bytes);
 }
 
 void TenuredGeneration::update_counters() {
@@ -386,7 +377,7 @@ void TenuredGeneration::update_counters() {
 }
 
 bool TenuredGeneration::promotion_attempt_is_safe(size_t max_promotion_in_bytes) const {
-  size_t available = contiguous_available();
+  size_t available = _the_space->free() + _virtual_space.uncommitted_size();
   size_t av_promo  = (size_t)_avg_promoted->padded_average();
   bool   res = (available >= av_promo) || (available >= max_promotion_in_bytes);
 
@@ -396,7 +387,7 @@ bool TenuredGeneration::promotion_attempt_is_safe(size_t max_promotion_in_bytes)
   return res;
 }
 
-oop TenuredGeneration::promote(oop obj, size_t obj_size) {
+oop TenuredGeneration::allocate_for_promotion(oop obj, size_t obj_size) {
   assert(obj_size == obj->size(), "bad obj_size passed in");
 
 #ifndef PRODUCT
@@ -410,15 +401,9 @@ oop TenuredGeneration::promote(oop obj, size_t obj_size) {
   if (result == nullptr) {
     // Promotion of obj into gen failed.  Try to expand and allocate.
     result = expand_and_allocate(obj_size, false);
-    if (result == nullptr) {
-      return nullptr;
-    }
   }
 
-  // Copy to new location.
-  Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(obj), result, obj_size);
-  oop new_obj = cast_to_oop<HeapWord*>(result);
-  return new_obj;
+  return cast_to_oop<HeapWord*>(result);
 }
 
 HeapWord*
@@ -428,10 +413,6 @@ TenuredGeneration::expand_and_allocate(size_t word_size, bool is_tlab) {
   return allocate(word_size, is_tlab);
 }
 
-size_t TenuredGeneration::contiguous_available() const {
-  return _the_space->free() + _virtual_space.uncommitted_size();
-}
-
 void TenuredGeneration::assert_correct_size_change_locking() {
   assert_locked_or_safepoint(Heap_lock);
 }
diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.hpp b/src/hotspot/share/gc/serial/tenuredGeneration.hpp
index cfc18b92f2a..dcec912d488 100644
--- a/src/hotspot/share/gc/serial/tenuredGeneration.hpp
+++ b/src/hotspot/share/gc/serial/tenuredGeneration.hpp
@@ -124,8 +124,6 @@ class TenuredGeneration: public Generation {
   const char* name() const { return "tenured generation"; }
   const char* short_name() const { return "Tenured"; }
 
-  size_t contiguous_available() const;
-
   // Iteration
   void object_iterate(ObjectClosure* blk);
 
@@ -143,7 +141,7 @@ class TenuredGeneration: public Generation {
   bool should_allocate(size_t word_size, bool is_tlab) {
     bool result = false;
     size_t overflow_limit = (size_t)1 << (BitsPerSize_t - LogHeapWordSize);
-    if (!is_tlab || supports_tlab_allocation()) {
+    if (!is_tlab) {
       result = (word_size > 0) && (word_size < overflow_limit);
     }
     return result;
@@ -154,7 +152,7 @@ class TenuredGeneration: public Generation {
 
   // Statistics
 
-  void update_gc_stats(Generation* current_generation, bool full);
+  void update_promote_stats();
 
   // Returns true if promotions of the specified amount are
   // likely to succeed without a promotion failure.
@@ -163,12 +161,11 @@ class TenuredGeneration: public Generation {
   bool promotion_attempt_is_safe(size_t max_promoted_in_bytes) const;
 
   // "obj" is the address of an object in young-gen.  Allocate space for "obj"
-  // in the old-gen, and copy "obj" into the newly allocated space, if
-  // possible, returning the result (or null if the allocation failed).
+  // in the old-gen, returning the result (or null if the allocation failed).
   //
   // The "obj_size" argument is just obj->size(), passed along so the caller can
   // avoid repeating the virtual call to retrieve it.
-  oop promote(oop obj, size_t obj_size);
+  oop allocate_for_promotion(oop obj, size_t obj_size);
 
   virtual void verify();
   virtual void print_on(outputStream* st) const;
diff --git a/src/hotspot/share/gc/shared/barrierSetNMethod.cpp b/src/hotspot/share/gc/shared/barrierSetNMethod.cpp
index 548e6b671ef..f041a2ccce1 100644
--- a/src/hotspot/share/gc/shared/barrierSetNMethod.cpp
+++ b/src/hotspot/share/gc/shared/barrierSetNMethod.cpp
@@ -100,6 +100,12 @@ bool BarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
     virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
   };
 
+  if (!is_armed(nm)) {
+    // Some other thread got here first and healed the oops
+    // and disarmed the nmethod. No need to continue.
+    return true;
+  }
+
   // If the nmethod is the only thing pointing to the oops, and we are using a
   // SATB GC, then it is important that this code marks them live.
   // Also, with concurrent GC, it is possible that frames in continuation stack
@@ -172,13 +178,9 @@ int BarrierSetNMethod::nmethod_stub_entry_barrier(address* return_address_ptr) {
   nmethod* nm = cb->as_nmethod();
   BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
 
-  if (!bs_nm->is_armed(nm)) {
-    return 0;
-  }
-
-  assert(!nm->is_osr_method(), "Should not reach here");
   // Called upon first entry after being armed
   bool may_enter = bs_nm->nmethod_entry_barrier(nm);
+  assert(!nm->is_osr_method() || may_enter, "OSR nmethods should always be entrant after migration");
 
   // In case a concurrent thread disarmed the nmethod, we need to ensure the new instructions
   // are made visible, by using a cross modify fence. Note that this is synchronous cross modifying
@@ -188,11 +190,11 @@ int BarrierSetNMethod::nmethod_stub_entry_barrier(address* return_address_ptr) {
   // it can be made conditional on the nmethod_patching_type.
   OrderAccess::cross_modify_fence();
 
-  // Diagnostic option to force deoptimization 1 in 3 times. It is otherwise
+  // Diagnostic option to force deoptimization 1 in 10 times. It is otherwise
   // a very rare event.
-  if (DeoptimizeNMethodBarriersALot) {
+  if (DeoptimizeNMethodBarriersALot && !nm->is_osr_method()) {
     static volatile uint32_t counter=0;
-    if (Atomic::add(&counter, 1u) % 3 == 0) {
+    if (Atomic::add(&counter, 1u) % 10 == 0) {
       may_enter = false;
     }
   }
@@ -205,15 +207,6 @@ int BarrierSetNMethod::nmethod_stub_entry_barrier(address* return_address_ptr) {
 }
 
 bool BarrierSetNMethod::nmethod_osr_entry_barrier(nmethod* nm) {
-  // This check depends on the invariant that all nmethods that are deoptimized / made not entrant
-  // are NOT disarmed.
-  // This invariant is important because a method can be deoptimized after the method have been
-  // resolved / looked up by OSR by another thread. By not deoptimizing them we guarantee that
-  // a deoptimized method will always hit the barrier and come to the same conclusion - deoptimize
-  if (!is_armed(nm)) {
-    return true;
-  }
-
   assert(nm->is_osr_method(), "Should not reach here");
   log_trace(nmethod, barrier)("Running osr nmethod entry barrier: " PTR_FORMAT, p2i(nm));
   bool result = nmethod_entry_barrier(nm);
diff --git a/src/hotspot/share/gc/shared/gcOverheadChecker.cpp b/src/hotspot/share/gc/shared/gcOverheadChecker.cpp
index acbc1d65c26..18a92caf5df 100644
--- a/src/hotspot/share/gc/shared/gcOverheadChecker.cpp
+++ b/src/hotspot/share/gc/shared/gcOverheadChecker.cpp
@@ -40,7 +40,11 @@ void GCOverheadChecker::check_gc_overhead_limit(GCOverheadTester* time_overhead,
                                                 bool is_full_gc,
                                                 GCCause::Cause gc_cause,
                                                 SoftRefPolicy* soft_ref_policy) {
-
+  if (is_full_gc) {
+    // Explicit Full GC would do the clearing of soft-refs as well
+    // So reset in the beginning
+    soft_ref_policy->set_should_clear_all_soft_refs(false);
+  }
   // Ignore explicit GC's.  Exiting here does not set the flag and
   // does not reset the count.
   if (GCCause::is_user_requested_gc(gc_cause) ||
diff --git a/src/hotspot/share/gc/shared/gcVMOperations.cpp b/src/hotspot/share/gc/shared/gcVMOperations.cpp
index 4cf1a4ccbaf..4cc75f47459 100644
--- a/src/hotspot/share/gc/shared/gcVMOperations.cpp
+++ b/src/hotspot/share/gc/shared/gcVMOperations.cpp
@@ -132,7 +132,7 @@ bool VM_GC_Operation::doit_prologue() {
 void VM_GC_Operation::doit_epilogue() {
   // GC thread root traversal likely used OopMapCache a lot, which
   // might have created lots of old entries. Trigger the cleanup now.
-  OopMapCache::trigger_cleanup();
+  OopMapCache::try_trigger_cleanup();
   if (Universe::has_reference_pending_list()) {
     Heap_lock->notify_all();
   }
diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp
index 1440f788e18..66496544b96 100644
--- a/src/hotspot/share/gc/shared/gc_globals.hpp
+++ b/src/hotspot/share/gc/shared/gc_globals.hpp
@@ -540,10 +540,6 @@
           "Soft limit for maximum heap size (in bytes)")                    \
           constraint(SoftMaxHeapSizeConstraintFunc,AfterMemoryInit)         \
                                                                             \
-  product(size_t, OldSize, ScaleForWordSize(4*M),                           \
-          "(Deprecated) Initial tenured generation size (in bytes)")        \
-          range(0, max_uintx)                                               \
-                                                                            \
   product(size_t, NewSize, ScaleForWordSize(1*M),                           \
           "Initial new generation size (in bytes)")                         \
           constraint(NewSizeConstraintFunc,AfterErgo)                       \
diff --git a/src/hotspot/share/gc/shared/genArguments.cpp b/src/hotspot/share/gc/shared/genArguments.cpp
index 3eac2e39f38..76f9f6d4052 100644
--- a/src/hotspot/share/gc/shared/genArguments.cpp
+++ b/src/hotspot/share/gc/shared/genArguments.cpp
@@ -37,6 +37,8 @@ size_t MinNewSize = 0;
 size_t MinOldSize = 0;
 size_t MaxOldSize = 0;
 
+size_t OldSize = 0;
+
 size_t GenAlignment = 0;
 
 size_t GenArguments::conservative_max_heap_alignment() { return (size_t)Generation::GenGrain; }
@@ -152,24 +154,7 @@ void GenArguments::initialize_heap_flags_and_sizes() {
     vm_exit_during_initialization("Invalid young gen ratio specified");
   }
 
-  if (OldSize < old_gen_size_lower_bound()) {
-    FLAG_SET_ERGO(OldSize, old_gen_size_lower_bound());
-  }
-  if (!is_aligned(OldSize, GenAlignment)) {
-    FLAG_SET_ERGO(OldSize, align_down(OldSize, GenAlignment));
-  }
-
-  if (FLAG_IS_CMDLINE(OldSize) && FLAG_IS_DEFAULT(MaxHeapSize)) {
-    // NewRatio will be used later to set the young generation size so we use
-    // it to calculate how big the heap should be based on the requested OldSize
-    // and NewRatio.
-    assert(NewRatio > 0, "NewRatio should have been set up earlier");
-    size_t calculated_heapsize = (OldSize / NewRatio) * (NewRatio + 1);
-
-    calculated_heapsize = align_up(calculated_heapsize, HeapAlignment);
-    FLAG_SET_ERGO(MaxHeapSize, calculated_heapsize);
-    FLAG_SET_ERGO(InitialHeapSize, calculated_heapsize);
-  }
+  OldSize = old_gen_size_lower_bound();
 
   // Adjust NewSize and OldSize or MaxHeapSize to match each other
   if (NewSize + OldSize > MaxHeapSize) {
@@ -185,23 +170,12 @@ void GenArguments::initialize_heap_flags_and_sizes() {
       // HeapAlignment, and we just made sure that NewSize is aligned to
       // GenAlignment. In initialize_flags() we verified that HeapAlignment
       // is a multiple of GenAlignment.
-      FLAG_SET_ERGO(OldSize, MaxHeapSize - NewSize);
+      OldSize = MaxHeapSize - NewSize;
     } else {
       FLAG_SET_ERGO(MaxHeapSize, align_up(NewSize + OldSize, HeapAlignment));
     }
   }
 
-  // Update NewSize, if possible, to avoid sizing the young gen too small when only
-  // OldSize is set on the command line.
-  if (FLAG_IS_CMDLINE(OldSize) && !FLAG_IS_CMDLINE(NewSize)) {
-    if (OldSize < InitialHeapSize) {
-      size_t new_size = InitialHeapSize - OldSize;
-      if (new_size >= MinNewSize && new_size <= MaxNewSize) {
-        FLAG_SET_ERGO(NewSize, new_size);
-      }
-    }
-  }
-
   DEBUG_ONLY(assert_flags();)
 }
 
@@ -215,12 +189,6 @@ void GenArguments::initialize_heap_flags_and_sizes() {
 // In the absence of explicitly set command line flags, policies
 // such as the use of NewRatio are used to size the generation.
 
-// Minimum sizes of the generations may be different than
-// the initial sizes.  An inconsistency is permitted here
-// in the total size that can be specified explicitly by
-// command line specification of OldSize and NewSize and
-// also a command line specification of -Xms.  Issue a warning
-// but allow the values to pass.
 void GenArguments::initialize_size_info() {
   GCArguments::initialize_size_info();
 
@@ -286,37 +254,7 @@ void GenArguments::initialize_size_info() {
                     InitialHeapSize - initial_young_size,
                     MinHeapSize - MinNewSize);
 
-  size_t initial_old_size = OldSize;
-
-  // If no explicit command line flag has been set for the
-  // old generation size, use what is left.
-  if (!FLAG_IS_CMDLINE(OldSize)) {
-    // The user has not specified any value but the ergonomics
-    // may have chosen a value (which may or may not be consistent
-    // with the overall heap size).  In either case make
-    // the minimum, maximum and initial sizes consistent
-    // with the young sizes and the overall heap sizes.
-    initial_old_size = clamp(InitialHeapSize - initial_young_size, MinOldSize, MaxOldSize);
-    // MaxOldSize and MinOldSize have already been made consistent above.
-  } else {
-    // OldSize has been explicitly set on the command line. Use it
-    // for the initial size but make sure the minimum allow a young
-    // generation to fit as well.
-    // If the user has explicitly set an OldSize that is inconsistent
-    // with other command line flags, issue a warning.
-    // The generation minimums and the overall heap minimum should
-    // be within one generation alignment.
-    if (initial_old_size > MaxOldSize) {
-      log_warning(gc, ergo)("Inconsistency between maximum heap size and maximum "
-                            "generation sizes: using maximum heap = " SIZE_FORMAT
-                            ", -XX:OldSize flag is being ignored",
-                            MaxHeapSize);
-      initial_old_size = MaxOldSize;
-    } else if (initial_old_size < MinOldSize) {
-      log_warning(gc, ergo)("Inconsistency between initial old size and minimum old size");
-      MinOldSize = initial_old_size;
-    }
-  }
+  size_t initial_old_size = clamp(InitialHeapSize - initial_young_size, MinOldSize, MaxOldSize);;
 
   // The initial generation sizes should match the initial heap size,
   // if not issue a warning and resize the generations. This behavior
@@ -359,7 +297,7 @@ void GenArguments::initialize_size_info() {
   }
 
   if (OldSize != initial_old_size) {
-    FLAG_SET_ERGO(OldSize, initial_old_size);
+    OldSize = initial_old_size;
   }
 
   log_trace(gc, heap)("Minimum old " SIZE_FORMAT "  Initial old " SIZE_FORMAT "  Maximum old " SIZE_FORMAT,
diff --git a/src/hotspot/share/gc/shared/genArguments.hpp b/src/hotspot/share/gc/shared/genArguments.hpp
index a4c62ff5afe..dfc392cac6b 100644
--- a/src/hotspot/share/gc/shared/genArguments.hpp
+++ b/src/hotspot/share/gc/shared/genArguments.hpp
@@ -33,6 +33,8 @@ extern size_t MinNewSize;
 extern size_t MinOldSize;
 extern size_t MaxOldSize;
 
+extern size_t OldSize;
+
 extern size_t GenAlignment;
 
 class GenArguments : public GCArguments {
diff --git a/src/hotspot/share/gc/shared/memAllocator.cpp b/src/hotspot/share/gc/shared/memAllocator.cpp
index 156b55c1046..318ab00188b 100644
--- a/src/hotspot/share/gc/shared/memAllocator.cpp
+++ b/src/hotspot/share/gc/shared/memAllocator.cpp
@@ -388,6 +388,7 @@ oop ObjArrayAllocator::initialize(HeapWord* mem) const {
   assert(_length >= 0, "length should be non-negative");
   if (_do_zero) {
     mem_clear(mem);
+    mem_zap_start_padding(mem);
     mem_zap_end_padding(mem);
   }
   arrayOopDesc::set_length(mem, _length);
@@ -395,6 +396,20 @@ oop ObjArrayAllocator::initialize(HeapWord* mem) const {
 }
 
 #ifndef PRODUCT
+void ObjArrayAllocator::mem_zap_start_padding(HeapWord* mem) const {
+  const BasicType element_type = ArrayKlass::cast(_klass)->element_type();
+  const size_t base_offset_in_bytes = arrayOopDesc::base_offset_in_bytes(element_type);
+  const size_t header_size_in_bytes = arrayOopDesc::header_size_in_bytes();
+
+  const address base = reinterpret_cast<address>(mem) + base_offset_in_bytes;
+  const address header_end = reinterpret_cast<address>(mem) + header_size_in_bytes;
+
+  if (header_end < base) {
+    const size_t padding_in_bytes = base - header_end;
+    Copy::fill_to_bytes(header_end, padding_in_bytes, heapPaddingByteVal);
+  }
+}
+
 void ObjArrayAllocator::mem_zap_end_padding(HeapWord* mem) const {
   const size_t length_in_bytes = static_cast<size_t>(_length) << ArrayKlass::cast(_klass)->log2_element_size();
   const BasicType element_type = ArrayKlass::cast(_klass)->element_type();
diff --git a/src/hotspot/share/gc/shared/memAllocator.hpp b/src/hotspot/share/gc/shared/memAllocator.hpp
index a0450af4450..ec67616adba 100644
--- a/src/hotspot/share/gc/shared/memAllocator.hpp
+++ b/src/hotspot/share/gc/shared/memAllocator.hpp
@@ -94,6 +94,7 @@ class ObjArrayAllocator: public MemAllocator {
   const int  _length;
   const bool _do_zero;
 
+  void mem_zap_start_padding(HeapWord* mem) const PRODUCT_RETURN;
   void mem_zap_end_padding(HeapWord* mem) const PRODUCT_RETURN;
 
 public:
diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp
index 39cbcc39cd2..af295df0050 100644
--- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp
+++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp
@@ -1334,6 +1334,14 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) {
       OuterStripMinedLoopNode* outer = head->as_OuterStripMinedLoop();
       hide_strip_mined_loop(outer, outer->unique_ctrl_out()->as_CountedLoop(), phase);
     }
+    if (head->is_BaseCountedLoop() && ctrl->is_IfProj() && ctrl->in(0)->is_BaseCountedLoopEnd() &&
+        head->as_BaseCountedLoop()->loopexit() == ctrl->in(0)) {
+      Node* entry = head->in(LoopNode::EntryControl);
+      Node* backedge = head->in(LoopNode::LoopBackControl);
+      Node* new_head = new LoopNode(entry, backedge);
+      phase->register_control(new_head, phase->get_loop(entry), entry);
+      phase->lazy_replace(head, new_head);
+    }
   }
 
   // Expand load-reference-barriers
diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp
index 0586e26310e..505f0b623eb 100644
--- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp
+++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.cpp
@@ -104,7 +104,7 @@ void ShenandoahAdaptiveHeuristics::choose_collection_set_from_regiondata(Shenand
                      byte_size_in_proper_unit(min_garbage), proper_unit_for_byte_size(min_garbage));
 
   // Better select garbage-first regions
-  QuickSort::sort<RegionData>(data, (int)size, compare_by_garbage, false);
+  QuickSort::sort(data, size, compare_by_garbage);
 
   size_t cur_cset = 0;
   size_t cur_garbage = 0;
diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGlobalHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGlobalHeuristics.cpp
index 4782b41b10c..6d1b648deb1 100644
--- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGlobalHeuristics.cpp
+++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGlobalHeuristics.cpp
@@ -65,7 +65,7 @@ void ShenandoahGlobalHeuristics::choose_collection_set_from_regiondata(Shenandoa
 
 
   // Better select garbage-first regions
-  QuickSort::sort<RegionData>(data, (int) size, compare_by_garbage, false);
+  QuickSort::sort<RegionData>(data, (int) size, compare_by_garbage);
 
   size_t cur_young_garbage = add_preselected_regions_to_collection_set(cset, data, size);
 
diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp
index f7c7b644815..b3f076c8af7 100644
--- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp
+++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp
@@ -376,7 +376,7 @@ void ShenandoahOldHeuristics::prepare_for_old_collections() {
   // old-gen, we want to pack these underutilized regions together so we can have more unaffiliated (unfragmented) free regions
   // in old-gen.
 
-  QuickSort::sort<RegionData>(candidates, cand_idx, compare_by_live, false);
+  QuickSort::sort<RegionData>(candidates, cand_idx, compare_by_live);
 
   // Any old-gen region that contains (ShenandoahOldGarbageThreshold (default value 25)% garbage or more is to be
   // added to the list of candidates for subsequent mixed evacuations.
@@ -430,7 +430,7 @@ void ShenandoahOldHeuristics::prepare_for_old_collections() {
     // Sort the regions that were initially rejected from the collection set in order of index.  This allows us to
     // focus our attention on the regions that have low index value (i.e. the old-gen regions at the bottom of the heap).
     QuickSort::sort<RegionData>(candidates + _last_old_collection_candidate, cand_idx - _last_old_collection_candidate,
-                                compare_by_index, false);
+                                compare_by_index);
 
     const size_t first_unselected_old_region = candidates[_last_old_collection_candidate]._region->index();
     const size_t last_unselected_old_region = candidates[cand_idx - 1]._region->index();
diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahYoungHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahYoungHeuristics.cpp
index 6770d5d09e2..ac96e40b54c 100644
--- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahYoungHeuristics.cpp
+++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahYoungHeuristics.cpp
@@ -65,7 +65,7 @@ void ShenandoahYoungHeuristics::choose_collection_set_from_regiondata(Shenandoah
   // to exclude one of the regions because it might require evacuation of too much live data.
 
   // Better select garbage-first regions
-  QuickSort::sort<RegionData>(data, (int) size, compare_by_garbage, false);
+  QuickSort::sort<RegionData>(data, (int) size, compare_by_garbage);
 
   size_t cur_young_garbage = add_preselected_regions_to_collection_set(cset, data, size);
 
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp
index 20954156b9e..7b30e1ecbac 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp
@@ -36,13 +36,19 @@
 #include "runtime/threadWXSetters.inline.hpp"
 
 bool ShenandoahBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
+  if (!is_armed(nm)) {
+    // Some other thread got here first and healed the oops
+    // and disarmed the nmethod. No need to continue.
+    return true;
+  }
+
   ShenandoahReentrantLock* lock = ShenandoahNMethod::lock_for_nmethod(nm);
   assert(lock != nullptr, "Must be");
   ShenandoahReentrantLocker locker(lock);
 
   if (!is_armed(nm)) {
-    // Some other thread got here first and healed the oops
-    // and disarmed the nmethod.
+    // Some other thread managed to complete while we were
+    // waiting for lock. No need to continue.
     return true;
   }
 
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
index 960927ee787..e61dca2bdbf 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2017, 2022, Red Hat, Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -102,12 +103,10 @@ class ShenandoahDisarmNMethodsTask : public WorkerTask {
     WorkerTask("Shenandoah Disarm NMethods"),
     _iterator(ShenandoahCodeRoots::table()) {
     assert(SafepointSynchronize::is_at_safepoint(), "Only at a safepoint");
-    MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
     _iterator.nmethods_do_begin();
   }
 
   ~ShenandoahDisarmNMethodsTask() {
-    MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
     _iterator.nmethods_do_end();
   }
 
@@ -177,12 +176,10 @@ class ShenandoahUnlinkTask : public WorkerTask {
     WorkerTask("Shenandoah Unlink NMethods"),
     _cl(unloading_occurred),
     _iterator(ShenandoahCodeRoots::table()) {
-    MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
     _iterator.nmethods_do_begin();
   }
 
   ~ShenandoahUnlinkTask() {
-    MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
     _iterator.nmethods_do_end();
   }
 
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp
index 9da05188b78..cf360d6a464 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2021, 2022, Red Hat, Inc. All rights reserved.
  * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -167,12 +168,7 @@ bool ShenandoahConcurrentGC::collect(GCCause::Cause cause) {
   // we will not age young-gen objects in the case that we skip evacuation.
   entry_cleanup_early();
 
-  {
-    // TODO: Not sure there is value in logging free-set status right here.  Note that whenever the free set is rebuilt,
-    // it logs the newly rebuilt status.
-    ShenandoahHeapLocker locker(heap->lock());
-    heap->free_set()->log_status();
-  }
+  heap->free_set()->log_status_under_lock();
 
   // Perform concurrent class unloading
   if (heap->unload_classes() &&
@@ -928,14 +924,12 @@ class ShenandoahConcurrentWeakRootsEvacUpdateTask : public WorkerTask {
     _nmethod_itr(ShenandoahCodeRoots::table()),
     _phase(phase) {
     if (ShenandoahHeap::heap()->unload_classes()) {
-      MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
       _nmethod_itr.nmethods_do_begin();
     }
   }
 
   ~ShenandoahConcurrentWeakRootsEvacUpdateTask() {
     if (ShenandoahHeap::heap()->unload_classes()) {
-      MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
       _nmethod_itr.nmethods_do_end();
     }
     // Notify runtime data structures of potentially dead oops
@@ -1044,14 +1038,12 @@ class ShenandoahConcurrentRootsEvacUpdateTask : public WorkerTask {
     _cld_roots(phase, ShenandoahHeap::heap()->workers()->active_workers(), false /*heap iteration*/),
     _nmethod_itr(ShenandoahCodeRoots::table()) {
     if (!ShenandoahHeap::heap()->unload_classes()) {
-      MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
       _nmethod_itr.nmethods_do_begin();
     }
   }
 
   ~ShenandoahConcurrentRootsEvacUpdateTask() {
     if (!ShenandoahHeap::heap()->unload_classes()) {
-      MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
       _nmethod_itr.nmethods_do_end();
     }
   }
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
index cd6fb3cc19a..a69318da0d4 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahControlThread.cpp
@@ -148,10 +148,7 @@ void ShenandoahControlThread::run_service() {
       heap->set_forced_counters_update(true);
 
       // If GC was requested, we better dump freeset data for performance debugging
-      {
-        ShenandoahHeapLocker locker(heap->lock());
-        heap->free_set()->log_status();
-      }
+      heap->free_set()->log_status_under_lock();
 
       switch (mode) {
         case concurrent_normal:
@@ -179,18 +176,15 @@ void ShenandoahControlThread::run_service() {
 
       // Report current free set state at the end of cycle, whether
       // it is a normal completion, or the abort.
-      {
-        ShenandoahHeapLocker locker(heap->lock());
-        heap->free_set()->log_status();
+      heap->free_set()->log_status_under_lock();
 
-        // Notify Universe about new heap usage. This has implications for
-        // global soft refs policy, and we better report it every time heap
-        // usage goes down.
-        heap->update_capacity_and_used_at_gc();
+      // Notify Universe about new heap usage. This has implications for
+      // global soft refs policy, and we better report it every time heap
+      // usage goes down.
+      heap->update_capacity_and_used_at_gc();
 
-        // Signal that we have completed a visit to all live objects.
-        heap->record_whole_heap_examined_timestamp();
-      }
+      // Signal that we have completed a visit to all live objects.
+      heap->record_whole_heap_examined_timestamp();
 
       // Disable forced counters update, and update counters one more time
       // to capture the state at the end of GC session.
@@ -325,7 +319,7 @@ void ShenandoahControlThread::service_concurrent_normal_cycle(GCCause::Cause cau
 
   ShenandoahConcurrentGC gc(heap->global_generation(), false);
   if (gc.collect(cause)) {
-    // Cycle is complete
+    // Cycle is complete.  There were no failed allocation requests and no degeneration, so count this as good progress.
     heap->notify_gc_progress();
     heap->global_generation()->heuristics()->record_success_concurrent();
     heap->shenandoah_policy()->record_success_concurrent(false, gc.abbreviated());
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp
index 40c047ab02a..028dbaebac5 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp
@@ -1747,6 +1747,15 @@ void ShenandoahFreeSet::establish_old_collector_alloc_bias() {
                                           (available_in_second_half > available_in_first_half));
 }
 
+void ShenandoahFreeSet::log_status_under_lock() {
+  // Must not be heap locked, it acquires heap lock only when log is enabled
+  shenandoah_assert_not_heaplocked();
+  if (LogTarget(Info, gc, free)::is_enabled()
+      DEBUG_ONLY(|| LogTarget(Debug, gc, free)::is_enabled())) {
+    ShenandoahHeapLocker locker(_heap->lock());
+    log_status();
+  }
+}
 
 void ShenandoahFreeSet::log_status() {
   shenandoah_assert_heaplocked();
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp
index 677fd40e50b..af9a106a8d3 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp
@@ -354,6 +354,9 @@ class ShenandoahFreeSet : public CHeapObj<mtGC> {
   void establish_generation_sizes(size_t young_region_count, size_t old_region_count);
   size_t get_usable_free_words(size_t free_bytes) const;
 
+  // log status, assuming lock has already been acquired by the caller.
+  void log_status();
+
 public:
   ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions);
 
@@ -408,7 +411,8 @@ class ShenandoahFreeSet : public CHeapObj<mtGC> {
 
   void recycle_trash();
 
-  void log_status();
+  // Acquire heap lock and log status, assuming heap lock is not acquired by the caller.
+  void log_status_under_lock();
 
   inline size_t capacity()  const { return _partitions.capacity_of(ShenandoahFreeSetPartitionId::Mutator); }
   inline size_t used()      const { return _partitions.used_by(ShenandoahFreeSetPartitionId::Mutator);     }
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp
index 825df6e4c3e..3956b20412a 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp
@@ -618,7 +618,7 @@ size_t ShenandoahGeneration::select_aged_regions(size_t old_available) {
   if (candidates > 0) {
     size_t selected_regions = 0;
     size_t selected_live = 0;
-    QuickSort::sort<AgedRegionData>(sorted_regions, candidates, compare_by_aged_live, false);
+    QuickSort::sort<AgedRegionData>(sorted_regions, candidates, compare_by_aged_live);
     for (size_t i = 0; i < candidates; i++) {
       ShenandoahHeapRegion* const region = sorted_regions[i]._region;
       size_t region_live_data = sorted_regions[i]._live_data;
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp
index 1eba7e19782..0f60fbf7ee6 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp
@@ -215,10 +215,8 @@ void ShenandoahGenerationalControlThread::run_service() {
       heap->set_forced_counters_update(true);
 
       // If GC was requested, we better dump freeset data for performance debugging
-      {
-        ShenandoahHeapLocker locker(heap->lock());
-        heap->free_set()->log_status();
-      }
+      heap->free_set()->log_status_under_lock();
+
       // In case this is a degenerated cycle, remember whether original cycle was aging.
       const bool was_aging_cycle = heap->is_aging_cycle();
       heap->set_aging_cycle(false);
@@ -272,18 +270,15 @@ void ShenandoahGenerationalControlThread::run_service() {
 
       // Report current free set state at the end of cycle, whether
       // it is a normal completion, or the abort.
-      {
-        ShenandoahHeapLocker locker(heap->lock());
-        heap->free_set()->log_status();
+      heap->free_set()->log_status_under_lock();
 
-        // Notify Universe about new heap usage. This has implications for
-        // global soft refs policy, and we better report it every time heap
-        // usage goes down.
-        heap->update_capacity_and_used_at_gc();
+      // Notify Universe about new heap usage. This has implications for
+      // global soft refs policy, and we better report it every time heap
+      // usage goes down.
+      heap->update_capacity_and_used_at_gc();
 
-        // Signal that we have completed a visit to all live objects.
-        heap->record_whole_heap_examined_timestamp();
-      }
+      // Signal that we have completed a visit to all live objects.
+      heap->record_whole_heap_examined_timestamp();
 
       // Disable forced counters update, and update counters one more time
       // to capture the state at the end of GC session.
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
index 15b95fb149c..a55dc37767a 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
@@ -989,55 +989,42 @@ HeapWord* ShenandoahHeap::allocate_memory(ShenandoahAllocRequest& req) {
     // This will notify the collector to start a cycle, but will raise
     // an OOME to the mutator if the last Full GCs have not made progress.
     // gc_no_progress_count is incremented following each degen or full GC that fails to achieve is_good_progress().
-    if ((result == nullptr) && !req.is_lab_alloc() && (get_gc_no_progress_count() > ShenandoahNoProgressThreshold)) {
+    if (result == nullptr && !req.is_lab_alloc() && get_gc_no_progress_count() > ShenandoahNoProgressThreshold) {
       control_thread()->handle_alloc_failure(req, false);
       req.set_actual_size(0);
       return nullptr;
     }
 
-    // Block until control thread reacted, then retry allocation.
-    //
-    // It might happen that one of the threads requesting allocation would unblock
-    // way later after GC happened, only to fail the second allocation, because
-    // other threads have already depleted the free storage. In this case, a better
-    // strategy is to try again, as long as GC makes progress (or until at least
-    // one full GC has completed).
-
-    size_t original_count = shenandoah_policy()->full_gc_count();
-
-    // Stop retrying and return nullptr to cause OOMError exception if our allocation failed even after:
-    //   a) We experienced a GC that had good progress, or
-    //   b) We experienced at least one Full GC (whether or not it had good progress)
-    //
-    // TODO: Rather than require a Full GC before throwing OOMError, it might be more appropriate for handle_alloc_failure()
-    //       to trigger a concurrent GLOBAL GC, and throw OOMError if we cannot allocate even after GLOBAL GC has finished.
-    //       There is no "perfect" solution here:
-    //
-    //        1. As currently implemented, there may be a race between multiple allocating threads, both attempting
-    //           to allocate very large objects.  The first thread to retry its allocation might succeed and the second
-    //           thread to retry its allocation might fail (because the first thread consumed the newly available memory).
-    //           So the second thread experiences OOMError even through another GC would have reclaimed the memory it wanted
-    //           to allocate.
-    //        2. A GLOBAL GC won't necessarily reclaim all garbage.  Following a concurrent Generational GLOBAL GC, we may
-    //           need to perform multiple concurrent mixed evacuations in order to reclaim all of the dead memory identified
-    //           by the GLOBAL GC mark.  However, the first evacuation performed by the GLOBAL GC will normally reclaim
-    //           a significant amount of garbage (as guided by garbage first heuristic).  If this is not enough memory
-    //           to satisfy the pending allocation request, we are in "dire straits", and a fail-fast OOMError is probably
-    //           the better remediation than repeated attempts to allocate following repeated GC cycles.
-
     if (result == nullptr) {
+      // Block until control thread reacted, then retry allocation.
+      //
+      // It might happen that one of the threads requesting allocation would unblock
+      // way later after GC happened, only to fail the second allocation, because
+      // other threads have already depleted the free storage. In this case, a better
+      // strategy is to try again, until at least one full GC has completed.
+      //
+      // Stop retrying and return nullptr to cause OOMError exception if our allocation failed even after:
+      //   a) We experienced a GC that had good progress, or
+      //   b) We experienced at least one Full GC (whether or not it had good progress)
+      //
+      // TODO: Consider GLOBAL GC rather than Full GC to remediate OOM condition: https://bugs.openjdk.org/browse/JDK-8335910
+
+      size_t original_count = shenandoah_policy()->full_gc_count();
       while ((result == nullptr) && (original_count == shenandoah_policy()->full_gc_count())) {
         control_thread()->handle_alloc_failure(req, true);
         result = allocate_memory_under_lock(req, in_new_region);
       }
-      if ((result != nullptr) && mode()->is_generational()) {
+      if (result != nullptr) {
+        // If our allocation request has been satisifed after it initially failed, we count this as good gc progress
         notify_gc_progress();
       }
-    }
-    if (log_is_enabled(Debug, gc, alloc)) {
-      ResourceMark rm;
-      log_debug(gc, alloc)("Thread: %s, Result: " PTR_FORMAT ", Request: %s, Size: " SIZE_FORMAT ", Original: " SIZE_FORMAT ", Latest: " SIZE_FORMAT,
-                           Thread::current()->name(), p2i(result), req.type_string(), req.size(), original_count, get_gc_no_progress_count());
+      if (log_is_enabled(Debug, gc, alloc)) {
+        ResourceMark rm;
+        log_debug(gc, alloc)("Thread: %s, Result: " PTR_FORMAT ", Request: %s, Size: " SIZE_FORMAT
+                             ", Original: " SIZE_FORMAT ", Latest: " SIZE_FORMAT,
+                             Thread::current()->name(), p2i(result), req.type_string(), req.size(),
+                             original_count, get_gc_no_progress_count());
+      }
     }
   } else {
     assert(req.is_gc_alloc(), "Can only accept GC allocs here");
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp b/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp
index 349f5415cdc..63c6c9ea886 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp
@@ -32,40 +32,49 @@
 #include "runtime/javaThread.hpp"
 #include "runtime/os.inline.hpp"
 
-// These are inline variants of Thread::SpinAcquire with optional blocking in VM.
-
-class ShenandoahNoBlockOp : public StackObj {
-public:
-  ShenandoahNoBlockOp(JavaThread* java_thread) {
-    assert(java_thread == nullptr, "Should not pass anything");
-  }
-};
-
 void ShenandoahLock::contended_lock(bool allow_block_for_safepoint) {
   Thread* thread = Thread::current();
   if (allow_block_for_safepoint && thread->is_Java_thread()) {
-    contended_lock_internal<ThreadBlockInVM>(JavaThread::cast(thread));
+    contended_lock_internal<true>(JavaThread::cast(thread));
   } else {
-    contended_lock_internal<ShenandoahNoBlockOp>(nullptr);
+    contended_lock_internal<false>(nullptr);
   }
 }
 
-template<typename BlockOp>
+template<bool ALLOW_BLOCK>
 void ShenandoahLock::contended_lock_internal(JavaThread* java_thread) {
-  int ctr = 0;
-  int yields = 0;
+  assert(!ALLOW_BLOCK || java_thread != nullptr, "Must have a Java thread when allowing block.");
+  // Spin this much, but only on multi-processor systems.
+  int ctr = os::is_MP() ? 0xFF : 0;
+  // Apply TTAS to avoid more expensive CAS calls if the lock is still held by other thread.
   while (Atomic::load(&_state) == locked ||
          Atomic::cmpxchg(&_state, unlocked, locked) != unlocked) {
-    if ((++ctr & 0xFFF) == 0) {
-      BlockOp block(java_thread);
-      if (yields > 5) {
-        os::naked_short_sleep(1);
+    if (ctr > 0 && !SafepointSynchronize::is_synchronizing()) {
+      // Lightly contended, spin a little if no safepoint is pending.
+      SpinPause();
+      ctr--;
+    } else if (ALLOW_BLOCK) {
+      ThreadBlockInVM block(java_thread);
+      if (SafepointSynchronize::is_synchronizing()) {
+        // If safepoint is pending, we want to block and allow safepoint to proceed.
+        // Normally, TBIVM above would block us in its destructor.
+        //
+        // But that blocking only happens when TBIVM knows the thread poll is armed.
+        // There is a window between announcing a safepoint and arming the thread poll
+        // during which trying to continuously enter TBIVM is counter-productive.
+        // Under high contention, we may end up going in circles thousands of times.
+        // To avoid it, we wait here until local poll is armed and then proceed
+        // to TBVIM exit for blocking. We do not SpinPause, but yield to let
+        // VM thread to arm the poll sooner.
+        while (SafepointSynchronize::is_synchronizing() &&
+               !SafepointMechanism::local_poll_armed(java_thread)) {
+          os::naked_yield();
+        }
       } else {
         os::naked_yield();
-        yields++;
       }
     } else {
-      SpinPause();
+      os::naked_yield();
     }
   }
 }
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp b/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp
index 4412680bc8c..4d7eefd460c 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp
@@ -37,20 +37,22 @@ class ShenandoahLock  {
   shenandoah_padding(0);
   volatile LockState _state;
   shenandoah_padding(1);
-  volatile Thread* _owner;
+  Thread* volatile _owner;
   shenandoah_padding(2);
 
-  template<typename BlockOp>
+  template<bool ALLOW_BLOCK>
   void contended_lock_internal(JavaThread* java_thread);
-
 public:
   ShenandoahLock() : _state(unlocked), _owner(nullptr) {};
 
   void lock(bool allow_block_for_safepoint) {
     assert(Atomic::load(&_owner) != Thread::current(), "reentrant locking attempt, would deadlock");
 
-    // Try to lock fast, or dive into contended lock handling.
-    if (Atomic::cmpxchg(&_state, unlocked, locked) != unlocked) {
+    if ((allow_block_for_safepoint && SafepointSynchronize::is_synchronizing()) ||
+        (Atomic::cmpxchg(&_state, unlocked, locked) != unlocked)) {
+      // 1. Java thread, and there is a pending safepoint. Dive into contended locking
+      //    immediately without trying anything else, and block.
+      // 2. Fast lock fails, dive into contended lock handling.
       contended_lock(allow_block_for_safepoint);
     }
 
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp b/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp
index 2edb64a42c3..78b17244943 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahNMethod.cpp
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2019, 2022, Red Hat, Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -478,7 +479,7 @@ ShenandoahConcurrentNMethodIterator::ShenandoahConcurrentNMethodIterator(Shenand
 }
 
 void ShenandoahConcurrentNMethodIterator::nmethods_do_begin() {
-  assert(CodeCache_lock->owned_by_self(), "Lock must be held");
+  MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
   _table_snapshot = _table->snapshot_for_iteration();
 }
 
@@ -488,7 +489,7 @@ void ShenandoahConcurrentNMethodIterator::nmethods_do(NMethodClosure* cl) {
 }
 
 void ShenandoahConcurrentNMethodIterator::nmethods_do_end() {
-  assert(CodeCache_lock->owned_by_self(), "Lock must be held");
+  MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
   _table->finish_iteration(_table_snapshot);
   CodeCache_lock->notify_all();
 }
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp
index 060fe1d1529..727128d4382 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp
@@ -131,10 +131,7 @@ bool ShenandoahOldGC::collect(GCCause::Cause cause) {
   // the space. This would be the last action if there is nothing to evacuate.
   entry_cleanup_early();
 
-  {
-    ShenandoahHeapLocker locker(heap->lock());
-    heap->free_set()->log_status();
-  }
+  heap->free_set()->log_status_under_lock();
 
 
   // TODO: Old marking doesn't support class unloading yet
diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp
index 4371501762b..cd16f482f80 100644
--- a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp
+++ b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp
@@ -48,7 +48,7 @@ void VM_ShenandoahOperation::doit_epilogue() {
   assert(!ShenandoahHeap::heap()->has_gc_state_changed(), "GC State was not synchronized to java threads.");
   // GC thread root traversal likely used OopMapCache a lot, which
   // might have created lots of old entries. Trigger the cleanup now.
-  OopMapCache::trigger_cleanup();
+  OopMapCache::try_trigger_cleanup();
 }
 
 void VM_ShenandoahOperation::log_active_generation(const char* prefix) {
diff --git a/src/hotspot/share/gc/x/xBarrierSetNMethod.cpp b/src/hotspot/share/gc/x/xBarrierSetNMethod.cpp
index 002d6bc00c5..3dc76463028 100644
--- a/src/hotspot/share/gc/x/xBarrierSetNMethod.cpp
+++ b/src/hotspot/share/gc/x/xBarrierSetNMethod.cpp
@@ -32,12 +32,18 @@
 #include "runtime/threadWXSetters.inline.hpp"
 
 bool XBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
+  if (!is_armed(nm)) {
+    // Some other thread got here first and healed the oops
+    // and disarmed the nmethod. No need to continue.
+    return true;
+  }
+
   XLocker<XReentrantLock> locker(XNMethod::lock_for_nmethod(nm));
   log_trace(nmethod, barrier)("Entered critical zone for %p", nm);
 
   if (!is_armed(nm)) {
-    // Some other thread got here first and healed the oops
-    // and disarmed the nmethod.
+    // Some other thread managed to complete while we were
+    // waiting for lock. No need to continue.
     return true;
   }
 
diff --git a/src/hotspot/share/gc/x/xDriver.cpp b/src/hotspot/share/gc/x/xDriver.cpp
index c477f4a135c..3e6fd03134e 100644
--- a/src/hotspot/share/gc/x/xDriver.cpp
+++ b/src/hotspot/share/gc/x/xDriver.cpp
@@ -134,7 +134,7 @@ class VM_XOperation : public VM_Operation {
 
     // GC thread root traversal likely used OopMapCache a lot, which
     // might have created lots of old entries. Trigger the cleanup now.
-    OopMapCache::trigger_cleanup();
+    OopMapCache::try_trigger_cleanup();
   }
 
   bool gc_locked() const {
diff --git a/src/hotspot/share/gc/z/zBarrier.hpp b/src/hotspot/share/gc/z/zBarrier.hpp
index 4a271c1469f..fa0fbbcd88f 100644
--- a/src/hotspot/share/gc/z/zBarrier.hpp
+++ b/src/hotspot/share/gc/z/zBarrier.hpp
@@ -151,6 +151,8 @@ class ZBarrier : public AllStatic {
   static zaddress load_barrier_on_oop_field(volatile zpointer* p);
   static zaddress load_barrier_on_oop_field_preloaded(volatile zpointer* p, zpointer o);
 
+  static void load_barrier_on_oop_array(volatile zpointer* p, size_t length);
+
   static zaddress keep_alive_load_barrier_on_oop_field_preloaded(volatile zpointer* p, zpointer o);
 
   // Load barriers on non-strong oop refs
diff --git a/src/hotspot/share/gc/z/zBarrier.inline.hpp b/src/hotspot/share/gc/z/zBarrier.inline.hpp
index 2c81c14865b..b3191e9ae3f 100644
--- a/src/hotspot/share/gc/z/zBarrier.inline.hpp
+++ b/src/hotspot/share/gc/z/zBarrier.inline.hpp
@@ -475,6 +475,12 @@ inline zaddress ZBarrier::keep_alive_load_barrier_on_oop_field_preloaded(volatil
   return barrier(is_mark_good_fast_path, keep_alive_slow_path, color_mark_good, p, o);
 }
 
+inline void ZBarrier::load_barrier_on_oop_array(volatile zpointer* p, size_t length) {
+  for (volatile const zpointer* const end = p + length; p < end; p++) {
+    load_barrier_on_oop_field(p);
+  }
+}
+
 //
 // Load barrier on non-strong oop refs
 //
diff --git a/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp b/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp
index 2c58b015564..b8ecc3eddd3 100644
--- a/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp
+++ b/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp
@@ -37,6 +37,13 @@
 #include "runtime/threadWXSetters.inline.hpp"
 
 bool ZBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
+  if (!is_armed(nm)) {
+    log_develop_trace(gc, nmethod)("nmethod: " PTR_FORMAT " visited by entry (disarmed before lock)", p2i(nm));
+    // Some other thread got here first and healed the oops
+    // and disarmed the nmethod. No need to continue.
+    return true;
+  }
+
   ZLocker<ZReentrantLock> locker(ZNMethod::lock_for_nmethod(nm));
   log_trace(nmethod, barrier)("Entered critical zone for %p", nm);
 
@@ -44,8 +51,8 @@ bool ZBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
 
   if (!is_armed(nm)) {
     log_develop_trace(gc, nmethod)("nmethod: " PTR_FORMAT " visited by entry (disarmed)", p2i(nm));
-    // Some other thread got here first and healed the oops
-    // and disarmed the nmethod.
+    // Some other thread managed to complete while we were
+    // waiting for lock. No need to continue.
     return true;
   }
 
diff --git a/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp b/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp
index da7adf7cc3a..b41fec3d0a5 100644
--- a/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp
+++ b/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp
@@ -63,6 +63,10 @@ JRT_LEAF(void, ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_hea
   ZBarrier::store_barrier_on_native_oop_field((zpointer*)p, false /* heal */);
 JRT_END
 
+JRT_LEAF(void, ZBarrierSetRuntime::load_barrier_on_oop_array(oop* p, size_t length))
+  ZBarrier::load_barrier_on_oop_array((zpointer*)p, length);
+JRT_END
+
 JRT_LEAF(void, ZBarrierSetRuntime::clone(oopDesc* src, oopDesc* dst, size_t size))
   HeapAccess<>::clone(src, dst, size);
 JRT_END
@@ -126,6 +130,10 @@ address ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_healing_ad
   return reinterpret_cast<address>(store_barrier_on_native_oop_field_without_healing);
 }
 
+address ZBarrierSetRuntime::load_barrier_on_oop_array_addr() {
+  return reinterpret_cast<address>(load_barrier_on_oop_array);
+}
+
 address ZBarrierSetRuntime::clone_addr() {
   return reinterpret_cast<address>(clone);
 }
diff --git a/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp b/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp
index a569ff3c158..8a81f162bf1 100644
--- a/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp
+++ b/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp
@@ -41,6 +41,7 @@ class ZBarrierSetRuntime : public AllStatic {
   static void store_barrier_on_oop_field_with_healing(oop* p);
   static void store_barrier_on_oop_field_without_healing(oop* p);
   static void store_barrier_on_native_oop_field_without_healing(oop* p);
+  static void load_barrier_on_oop_array(oop* p, size_t length);
   static void clone(oopDesc* src, oopDesc* dst, size_t size);
 
 public:
@@ -54,6 +55,7 @@ class ZBarrierSetRuntime : public AllStatic {
   static address store_barrier_on_oop_field_with_healing_addr();
   static address store_barrier_on_oop_field_without_healing_addr();
   static address store_barrier_on_native_oop_field_without_healing_addr();
+  static address load_barrier_on_oop_array_addr();
   static address clone_addr();
 };
 
diff --git a/src/hotspot/share/gc/z/zDirector.cpp b/src/hotspot/share/gc/z/zDirector.cpp
index 47e24063ead..162e05f2c07 100644
--- a/src/hotspot/share/gc/z/zDirector.cpp
+++ b/src/hotspot/share/gc/z/zDirector.cpp
@@ -524,6 +524,10 @@ static bool rule_major_allocation_rate(const ZDirectorStats& stats) {
 }
 
 static double calculate_young_to_old_worker_ratio(const ZDirectorStats& stats) {
+  if (!stats._old_stats._cycle._is_time_trustable) {
+    return 1.0;
+  }
+
   const double young_gc_time = gc_time(stats._young_stats);
   const double old_gc_time = gc_time(stats._old_stats);
   const size_t reclaimed_per_young_gc = stats._young_stats._stat_heap._reclaimed_avg;
diff --git a/src/hotspot/share/gc/z/zGeneration.cpp b/src/hotspot/share/gc/z/zGeneration.cpp
index 5c3afa9db8c..be86550d321 100644
--- a/src/hotspot/share/gc/z/zGeneration.cpp
+++ b/src/hotspot/share/gc/z/zGeneration.cpp
@@ -456,7 +456,7 @@ class VM_ZOperation : public VM_Operation {
 
     // GC thread root traversal likely used OopMapCache a lot, which
     // might have created lots of old entries. Trigger the cleanup now.
-    OopMapCache::trigger_cleanup();
+    OopMapCache::try_trigger_cleanup();
   }
 
   bool success() const {
diff --git a/src/hotspot/share/gc/z/zObjArrayAllocator.cpp b/src/hotspot/share/gc/z/zObjArrayAllocator.cpp
index 1b2f3804e3d..ad19f273dcf 100644
--- a/src/hotspot/share/gc/z/zObjArrayAllocator.cpp
+++ b/src/hotspot/share/gc/z/zObjArrayAllocator.cpp
@@ -139,6 +139,8 @@ oop ZObjArrayAllocator::initialize(HeapWord* mem) const {
     return true;
   };
 
+  mem_zap_start_padding(mem);
+
   if (!initialize_memory()) {
     // Re-color with 11 remset bits if we got intercepted by a GC safepoint
     const bool result = initialize_memory();
diff --git a/src/hotspot/share/gc/z/zPage.inline.hpp b/src/hotspot/share/gc/z/zPage.inline.hpp
index ff5fe0bbd6c..0b4ee28ba7d 100644
--- a/src/hotspot/share/gc/z/zPage.inline.hpp
+++ b/src/hotspot/share/gc/z/zPage.inline.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -65,7 +65,6 @@ inline const char* ZPage::type_to_string() const {
 
   default:
     fatal("Unexpected page type");
-    return 0;
   }
 }
 
diff --git a/src/hotspot/share/include/jvm.h b/src/hotspot/share/include/jvm.h
index 99cdac3aec5..0aad9160ae8 100644
--- a/src/hotspot/share/include/jvm.h
+++ b/src/hotspot/share/include/jvm.h
@@ -150,6 +150,9 @@ JVM_ActiveProcessorCount(void);
 JNIEXPORT jboolean JNICALL
 JVM_IsUseContainerSupport(void);
 
+JNIEXPORT jboolean JNICALL
+JVM_IsContainerized(void);
+
 JNIEXPORT void * JNICALL
 JVM_LoadZipLibrary();
 
diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp
index dc5f2f5b637..4f2eae023f6 100644
--- a/src/hotspot/share/interpreter/interpreterRuntime.cpp
+++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp
@@ -645,27 +645,31 @@ JRT_END
 //
 
 void InterpreterRuntime::resolve_get_put(JavaThread* current, Bytecodes::Code bytecode) {
-  // resolve field
-  fieldDescriptor info;
   LastFrameAccessor last_frame(current);
   constantPoolHandle pool(current, last_frame.method()->constants());
   methodHandle m(current, last_frame.method());
+
+  resolve_get_put(bytecode, last_frame.get_index_u2(bytecode), m, pool, true /*initialize_holder*/, current);
+}
+
+void InterpreterRuntime::resolve_get_put(Bytecodes::Code bytecode, int field_index,
+                                         methodHandle& m,
+                                         constantPoolHandle& pool,
+                                         bool initialize_holder, TRAPS) {
+  fieldDescriptor info;
   bool is_put    = (bytecode == Bytecodes::_putfield  || bytecode == Bytecodes::_nofast_putfield ||
                     bytecode == Bytecodes::_putstatic);
   bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic);
 
-  int field_index = last_frame.get_index_u2(bytecode);
   {
-    JvmtiHideSingleStepping jhss(current);
-    JavaThread* THREAD = current; // For exception macros.
+    JvmtiHideSingleStepping jhss(THREAD);
     LinkResolver::resolve_field_access(info, pool, field_index,
-                                       m, bytecode, CHECK);
+                                       m, bytecode, initialize_holder, CHECK);
   } // end JvmtiHideSingleStepping
 
   // check if link resolution caused cpCache to be updated
   if (pool->resolved_field_entry_at(field_index)->is_resolved(bytecode)) return;
 
-
   // compute auxiliary field attributes
   TosState state  = as_TosState(info.field_type());
 
@@ -828,7 +832,6 @@ void InterpreterRuntime::resolve_invoke(JavaThread* current, Bytecodes::Code byt
   // resolve method
   CallInfo info;
   constantPoolHandle pool(current, last_frame.method()->constants());
-  ConstantPoolCache* cache = pool->cache();
 
   methodHandle resolved_method;
 
@@ -853,10 +856,18 @@ void InterpreterRuntime::resolve_invoke(JavaThread* current, Bytecodes::Code byt
     resolved_method = methodHandle(current, info.resolved_method());
   } // end JvmtiHideSingleStepping
 
+  update_invoke_cp_cache_entry(info, bytecode, resolved_method, pool, method_index);
+}
+
+void InterpreterRuntime::update_invoke_cp_cache_entry(CallInfo& info, Bytecodes::Code bytecode,
+                                                      methodHandle& resolved_method,
+                                                      constantPoolHandle& pool,
+                                                      int method_index) {
   // Don't allow safepoints until the method is cached.
   NoSafepointVerifier nsv;
 
   // check if link resolution caused cpCache to be updated
+  ConstantPoolCache* cache = pool->cache();
   if (cache->resolved_method_entry_at(method_index)->is_resolved(bytecode)) return;
 
 #ifdef ASSERT
@@ -908,6 +919,33 @@ void InterpreterRuntime::resolve_invoke(JavaThread* current, Bytecodes::Code byt
   }
 }
 
+void InterpreterRuntime::cds_resolve_invoke(Bytecodes::Code bytecode, int method_index,
+                                            constantPoolHandle& pool, TRAPS) {
+  LinkInfo link_info(pool, method_index, bytecode, CHECK);
+
+  if (!link_info.resolved_klass()->is_instance_klass() || InstanceKlass::cast(link_info.resolved_klass())->is_linked()) {
+    CallInfo call_info;
+    switch (bytecode) {
+      case Bytecodes::_invokevirtual:   LinkResolver::cds_resolve_virtual_call  (call_info, link_info, CHECK); break;
+      case Bytecodes::_invokeinterface: LinkResolver::cds_resolve_interface_call(call_info, link_info, CHECK); break;
+      case Bytecodes::_invokespecial:   LinkResolver::cds_resolve_special_call  (call_info, link_info, CHECK); break;
+
+      default: fatal("Unimplemented: %s", Bytecodes::name(bytecode));
+    }
+    methodHandle resolved_method(THREAD, call_info.resolved_method());
+    guarantee(resolved_method->method_holder()->is_linked(), "");
+    update_invoke_cp_cache_entry(call_info, bytecode, resolved_method, pool, method_index);
+  } else {
+    // FIXME: why a shared class is not linked yet?
+    // Can't link it here since there are no guarantees it'll be prelinked on the next run.
+    ResourceMark rm;
+    InstanceKlass* resolved_iklass = InstanceKlass::cast(link_info.resolved_klass());
+    log_info(cds, resolve)("Not resolved: class not linked: %s %s %s",
+                           resolved_iklass->is_shared() ? "is_shared" : "",
+                           resolved_iklass->init_state_name(),
+                           resolved_iklass->external_name());
+  }
+}
 
 // First time execution:  Resolve symbols, create a permanent MethodType object.
 void InterpreterRuntime::resolve_invokehandle(JavaThread* current) {
diff --git a/src/hotspot/share/interpreter/interpreterRuntime.hpp b/src/hotspot/share/interpreter/interpreterRuntime.hpp
index 297585d37e8..61041694fc6 100644
--- a/src/hotspot/share/interpreter/interpreterRuntime.hpp
+++ b/src/hotspot/share/interpreter/interpreterRuntime.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -91,7 +91,14 @@ class InterpreterRuntime: AllStatic {
   static void    throw_pending_exception(JavaThread* current);
 
   static void resolve_from_cache(JavaThread* current, Bytecodes::Code bytecode);
- private:
+
+  // Used by ClassPrelinker
+  static void resolve_get_put(Bytecodes::Code bytecode, int field_index,
+                              methodHandle& m, constantPoolHandle& pool, bool initialize_holder, TRAPS);
+  static void cds_resolve_invoke(Bytecodes::Code bytecode, int method_index,
+                                 constantPoolHandle& pool, TRAPS);
+
+private:
   // Statics & fields
   static void resolve_get_put(JavaThread* current, Bytecodes::Code bytecode);
 
@@ -100,6 +107,9 @@ class InterpreterRuntime: AllStatic {
   static void resolve_invokehandle (JavaThread* current);
   static void resolve_invokedynamic(JavaThread* current);
 
+  static void update_invoke_cp_cache_entry(CallInfo& info, Bytecodes::Code bytecode,
+                                           methodHandle& resolved_method,
+                                           constantPoolHandle& pool, int method_index);
  public:
   // Synchronization
   static void    monitorenter(JavaThread* current, BasicObjectLock* elem);
diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp
index 9b80550130f..cadc3e8a2e8 100644
--- a/src/hotspot/share/interpreter/linkResolver.cpp
+++ b/src/hotspot/share/interpreter/linkResolver.cpp
@@ -24,6 +24,7 @@
 
 #include "precompiled.hpp"
 #include "cds/archiveUtils.hpp"
+#include "classfile/classLoader.hpp"
 #include "classfile/defaultMethods.hpp"
 #include "classfile/javaClasses.hpp"
 #include "classfile/systemDictionary.hpp"
@@ -55,7 +56,8 @@
 #include "runtime/fieldDescriptor.inline.hpp"
 #include "runtime/frame.inline.hpp"
 #include "runtime/handles.inline.hpp"
-#include "runtime/javaThread.hpp"
+#include "runtime/javaThread.inline.hpp"
+#include "runtime/perfData.hpp"
 #include "runtime/reflection.hpp"
 #include "runtime/safepointVerifiers.hpp"
 #include "runtime/sharedRuntime.hpp"
@@ -140,7 +142,9 @@ void CallInfo::set_common(Klass* resolved_klass,
                           CallKind kind,
                           int index,
                           TRAPS) {
-  assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
+  if (selected_method.not_null()) {
+    assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
+  }
   _resolved_klass  = resolved_klass;
   _resolved_method = resolved_method;
   _selected_method = selected_method;
@@ -149,7 +153,9 @@ void CallInfo::set_common(Klass* resolved_klass,
   _resolved_appendix = Handle();
   DEBUG_ONLY(verify());  // verify before making side effects
 
-  CompilationPolicy::compile_if_required(selected_method, THREAD);
+  if (selected_method.not_null()) {
+    CompilationPolicy::compile_if_required(selected_method, THREAD);
+  }
 }
 
 // utility query for unreflecting a method
@@ -972,9 +978,14 @@ void LinkResolver::check_field_accessability(Klass* ref_klass,
   }
 }
 
-void LinkResolver::resolve_field_access(fieldDescriptor& fd, const constantPoolHandle& pool, int index, const methodHandle& method, Bytecodes::Code byte, TRAPS) {
+void LinkResolver::resolve_field_access(fieldDescriptor& fd,
+                                        const constantPoolHandle& pool,
+                                        int index,
+                                        const methodHandle& method,
+                                        Bytecodes::Code byte,
+                                        bool initialize_class, TRAPS) {
   LinkInfo link_info(pool, index, method, byte, CHECK);
-  resolve_field(fd, link_info, byte, true, CHECK);
+  resolve_field(fd, link_info, byte, initialize_class, CHECK);
 }
 
 void LinkResolver::resolve_field(fieldDescriptor& fd,
@@ -1145,6 +1156,10 @@ void LinkResolver::resolve_special_call(CallInfo& result,
   runtime_resolve_special_method(result, link_info, methodHandle(THREAD, resolved_method), recv, CHECK);
 }
 
+void LinkResolver::cds_resolve_special_call(CallInfo& result, const LinkInfo& link_info, TRAPS) {
+  resolve_special_call(result, Handle(), link_info, CHECK);
+}
+
 // throws linktime exceptions
 Method* LinkResolver::linktime_resolve_special_method(const LinkInfo& link_info, TRAPS) {
 
@@ -1326,7 +1341,17 @@ void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, Klass* re
   runtime_resolve_virtual_method(result, methodHandle(THREAD, resolved_method),
                                  link_info.resolved_klass(),
                                  recv, receiver_klass,
-                                 check_null_and_abstract, CHECK);
+                                 check_null_and_abstract,
+                                 /*is_abstract_interpretation*/ false, CHECK);
+}
+
+void LinkResolver::cds_resolve_virtual_call(CallInfo& result, const LinkInfo& link_info, TRAPS) {
+  Method* resolved_method = linktime_resolve_virtual_method(link_info, CHECK);
+  runtime_resolve_virtual_method(result, methodHandle(THREAD, resolved_method),
+                                 link_info.resolved_klass(),
+                                 Handle(), nullptr,
+                                 /*check_null_and_abstract*/ false,
+                                 /*is_abstract_interpretation*/ true, CHECK);
 }
 
 // throws linktime exceptions
@@ -1378,7 +1403,11 @@ void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
                                                   Handle recv,
                                                   Klass* recv_klass,
                                                   bool check_null_and_abstract,
+                                                  bool is_abstract_interpretation,
                                                   TRAPS) {
+  // is_abstract_interpretation is true IFF CDS is resolving method references without
+  // running any actual bytecode. Therefore, we don't have an actual recv/recv_klass, so
+  // we cannot check the actual selected_method (which is not needed by CDS anyway).
 
   // setup default return values
   int vtable_index = Method::invalid_vtable_index;
@@ -1399,7 +1428,9 @@ void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
     vtable_index = vtable_index_of_interface_method(resolved_klass, resolved_method);
     assert(vtable_index >= 0 , "we should have valid vtable index at this point");
 
-    selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index));
+    if (!is_abstract_interpretation) {
+      selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index));
+    }
   } else {
     // at this point we are sure that resolved_method is virtual and not
     // a default or miranda method; therefore, it must have a valid vtable index.
@@ -1413,31 +1444,40 @@ void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
     // resolved method, and it can never be changed by an override.
     if (vtable_index == Method::nonvirtual_vtable_index) {
       assert(resolved_method->can_be_statically_bound(), "cannot override this method");
-      selected_method = resolved_method;
+      if (!is_abstract_interpretation) {
+        selected_method = resolved_method;
+      }
     } else {
-      selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index));
+      if (!is_abstract_interpretation) {
+        selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index));
+      }
     }
   }
 
-  // check if method exists
-  if (selected_method.is_null()) {
-    throw_abstract_method_error(resolved_method, recv_klass, CHECK);
-  }
+  if (!is_abstract_interpretation) {
+    // check if method exists
+    if (selected_method.is_null()) {
+      throw_abstract_method_error(resolved_method, recv_klass, CHECK);
+    }
 
-  // check if abstract
-  if (check_null_and_abstract && selected_method->is_abstract()) {
-    // Pass arguments for generating a verbose error message.
-    throw_abstract_method_error(resolved_method, selected_method, recv_klass, CHECK);
-  }
+    // check if abstract
+    if (check_null_and_abstract && selected_method->is_abstract()) {
+      // Pass arguments for generating a verbose error message.
+      throw_abstract_method_error(resolved_method, selected_method, recv_klass, CHECK);
+    }
 
-  if (log_develop_is_enabled(Trace, vtables)) {
-    trace_method_resolution("invokevirtual selected method: receiver-class:",
-                            recv_klass, resolved_klass, selected_method(),
-                            false, vtable_index);
+    if (log_develop_is_enabled(Trace, vtables)) {
+      trace_method_resolution("invokevirtual selected method: receiver-class:",
+                              recv_klass, resolved_klass, selected_method(),
+                              false, vtable_index);
+    }
   }
+
   // setup result
   result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK);
-  JFR_ONLY(Jfr::on_resolution(result, CHECK);)
+  if (selected_method.not_null()) {
+    JFR_ONLY(Jfr::on_resolution(result, CHECK);)
+  }
 }
 
 void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass* recv_klass,
@@ -1447,7 +1487,16 @@ void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass*
   Method* resolved_method = linktime_resolve_interface_method(link_info, CHECK);
   methodHandle mh(THREAD, resolved_method);
   runtime_resolve_interface_method(result, mh, link_info.resolved_klass(),
-                                   recv, recv_klass, check_null_and_abstract, CHECK);
+                                   recv, recv_klass, check_null_and_abstract,
+                                   /*is_abstract_interpretation*/ false, CHECK);
+}
+
+void LinkResolver::cds_resolve_interface_call(CallInfo& result, const LinkInfo& link_info, TRAPS) {
+  Method* resolved_method = linktime_resolve_interface_method(link_info, CHECK);
+  runtime_resolve_interface_method(result, methodHandle(THREAD, resolved_method), link_info.resolved_klass(),
+                                   Handle(), nullptr,
+                                   /*check_null_and_abstract*/ false,
+                                   /*is_abstract_interpretation*/ true, CHECK);
 }
 
 Method* LinkResolver::linktime_resolve_interface_method(const LinkInfo& link_info,
@@ -1466,7 +1515,9 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
                                                     Klass* resolved_klass,
                                                     Handle recv,
                                                     Klass* recv_klass,
-                                                    bool check_null_and_abstract, TRAPS) {
+                                                    bool check_null_and_abstract,
+                                                    bool is_abstract_interpretation, TRAPS) {
+  // is_abstract_interpretation -- see comments in runtime_resolve_virtual_method()
 
   // check if receiver exists
   if (check_null_and_abstract && recv.is_null()) {
@@ -1474,7 +1525,7 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
   }
 
   // check if receiver klass implements the resolved interface
-  if (!recv_klass->is_subtype_of(resolved_klass)) {
+  if (!is_abstract_interpretation && !recv_klass->is_subtype_of(resolved_klass)) {
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
@@ -1483,10 +1534,14 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
-  methodHandle selected_method = resolved_method;
+  methodHandle selected_method;
+
+  if (!is_abstract_interpretation) {
+    selected_method = resolved_method;
+  }
 
   // resolve the method in the receiver class, unless it is private
-  if (!resolved_method()->is_private()) {
+  if (!is_abstract_interpretation && !resolved_method()->is_private()) {
     // do lookup based on receiver klass
     // This search must match the linktime preparation search for itable initialization
     // to correctly enforce loader constraints for interface method inheritance.
@@ -1532,7 +1587,7 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
   if (resolved_method->has_vtable_index()) {
     int vtable_index = resolved_method->vtable_index();
     log_develop_trace(itables)("  -- vtable index: %d", vtable_index);
-    assert(vtable_index == selected_method->vtable_index(), "sanity check");
+    assert(is_abstract_interpretation || vtable_index == selected_method->vtable_index(), "sanity check");
     result.set_virtual(resolved_klass, resolved_method, selected_method, vtable_index, CHECK);
   } else if (resolved_method->has_itable_index()) {
     int itable_index = resolved_method()->itable_index();
@@ -1549,7 +1604,9 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
     // This sets up the nonvirtual form of "virtual" call (as needed for final and private methods)
     result.set_virtual(resolved_klass, resolved_method, resolved_method, index, CHECK);
   }
-  JFR_ONLY(Jfr::on_resolution(result, CHECK);)
+  if (!is_abstract_interpretation) {
+    JFR_ONLY(Jfr::on_resolution(result, CHECK);)
+  }
 }
 
 
@@ -1728,6 +1785,10 @@ bool LinkResolver::resolve_previously_linked_invokehandle(CallInfo& result, cons
 }
 
 void LinkResolver::resolve_invokehandle(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) {
+
+  PerfTraceTimedEvent timer(ClassLoader::perf_resolve_invokehandle_time(),
+                            ClassLoader::perf_resolve_invokehandle_count());
+
   LinkInfo link_info(pool, index, Bytecodes::_invokehandle, CHECK);
   if (log_is_enabled(Info, methodhandles)) {
     ResourceMark rm(THREAD);
@@ -1779,6 +1840,9 @@ void LinkResolver::resolve_handle_call(CallInfo& result,
 }
 
 void LinkResolver::resolve_invokedynamic(CallInfo& result, const constantPoolHandle& pool, int indy_index, TRAPS) {
+  PerfTraceTimedEvent timer(ClassLoader::perf_resolve_invokedynamic_time(),
+                            ClassLoader::perf_resolve_invokedynamic_count());
+
   int pool_index = pool->resolved_indy_entry_at(indy_index)->constant_pool_index();
 
   // Resolve the bootstrap specifier (BSM + optional arguments).
@@ -1810,7 +1874,7 @@ void LinkResolver::resolve_invokedynamic(CallInfo& result, const constantPoolHan
   // the interpreter or runtime performs a serialized check of
   // the relevant ResolvedIndyEntry::method field.  This is done by the caller
   // of this method, via CPC::set_dynamic_call, which uses
-  // a lock to do the final serialization of updates
+  // an ObjectLocker to do the final serialization of updates
   // to ResolvedIndyEntry state, including method.
 
   // Log dynamic info to CDS classlist.
diff --git a/src/hotspot/share/interpreter/linkResolver.hpp b/src/hotspot/share/interpreter/linkResolver.hpp
index e18749cd6a5..340c7d412d5 100644
--- a/src/hotspot/share/interpreter/linkResolver.hpp
+++ b/src/hotspot/share/interpreter/linkResolver.hpp
@@ -242,13 +242,15 @@ class LinkResolver: AllStatic {
                                                  Klass* resolved_klass,
                                                  Handle recv,
                                                  Klass* recv_klass,
-                                                 bool check_null_and_abstract, TRAPS);
+                                                 bool check_null_and_abstract,
+                                                 bool is_abstract_interpretation, TRAPS);
   static void runtime_resolve_interface_method  (CallInfo& result,
                                                  const methodHandle& resolved_method,
                                                  Klass* resolved_klass,
                                                  Handle recv,
                                                  Klass* recv_klass,
-                                                 bool check_null_and_abstract, TRAPS);
+                                                 bool check_null_and_abstract,
+                                                 bool is_abstract_interpretation, TRAPS);
 
   static bool resolve_previously_linked_invokehandle(CallInfo& result,
                                                      const LinkInfo& link_info,
@@ -293,7 +295,16 @@ class LinkResolver: AllStatic {
                                    const constantPoolHandle& pool,
                                    int index,
                                    const methodHandle& method,
-                                   Bytecodes::Code byte, TRAPS);
+                                   Bytecodes::Code byte,
+                                   bool initialize_class, TRAPS);
+  static void resolve_field_access(fieldDescriptor& result,
+                                   const constantPoolHandle& pool,
+                                   int index,
+                                   const methodHandle& method,
+                                   Bytecodes::Code byte, TRAPS) {
+    resolve_field_access(result, pool, index, method, byte,
+                         /* initialize_class*/true, THREAD);
+  }
   static void resolve_field(fieldDescriptor& result, const LinkInfo& link_info,
                             Bytecodes::Code access_kind,
                             bool initialize_class, TRAPS);
@@ -316,6 +327,10 @@ class LinkResolver: AllStatic {
   static void resolve_dynamic_call  (CallInfo& result,
                                      BootstrapInfo& bootstrap_specifier, TRAPS);
 
+  static void cds_resolve_virtual_call  (CallInfo& result, const LinkInfo& link_info, TRAPS);
+  static void cds_resolve_interface_call(CallInfo& result, const LinkInfo& link_info, TRAPS);
+  static void cds_resolve_special_call  (CallInfo& result, const LinkInfo& link_info, TRAPS);
+
   // same as above for compile-time resolution; but returns null handle instead of throwing
   // an exception on error also, does not initialize klass (i.e., no side effects)
   static Method* resolve_virtual_call_or_null(Klass* receiver_klass,
diff --git a/src/hotspot/share/interpreter/oopMapCache.cpp b/src/hotspot/share/interpreter/oopMapCache.cpp
index cae0efae9b2..87b124e9d79 100644
--- a/src/hotspot/share/interpreter/oopMapCache.cpp
+++ b/src/hotspot/share/interpreter/oopMapCache.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -66,9 +66,6 @@ class OopMapCacheEntry: private InterpreterOopMap {
  public:
   OopMapCacheEntry() : InterpreterOopMap() {
     _next = nullptr;
-#ifdef ASSERT
-    _resource_allocate_bit_mask = false;
-#endif
   }
 };
 
@@ -177,9 +174,13 @@ class VerifyClosure : public OffsetClosure {
 
 InterpreterOopMap::InterpreterOopMap() {
   initialize();
-#ifdef ASSERT
-  _resource_allocate_bit_mask = true;
-#endif
+}
+
+InterpreterOopMap::~InterpreterOopMap() {
+  if (has_valid_mask() && mask_size() > small_mask_limit) {
+    assert(_bit_mask[0] != 0, "should have pointer to C heap");
+    FREE_C_HEAP_ARRAY(uintptr_t, _bit_mask[0]);
+  }
 }
 
 bool InterpreterOopMap::is_empty() const {
@@ -399,37 +400,24 @@ void OopMapCacheEntry::deallocate(OopMapCacheEntry* const entry) {
 
 // Implementation of OopMapCache
 
-void InterpreterOopMap::resource_copy(OopMapCacheEntry* from) {
-  assert(_resource_allocate_bit_mask,
-    "Should not resource allocate the _bit_mask");
-  assert(from->has_valid_mask(),
-    "Cannot copy entry with an invalid mask");
+void InterpreterOopMap::copy_from(const OopMapCacheEntry* src) {
+  // The expectation is that this InterpreterOopMap is recently created
+  // and empty. It is used to get a copy of a cached entry.
+  assert(!has_valid_mask(), "InterpreterOopMap object can only be filled once");
+  assert(src->has_valid_mask(), "Cannot copy entry with an invalid mask");
 
-  set_method(from->method());
-  set_bci(from->bci());
-  set_mask_size(from->mask_size());
-  set_expression_stack_size(from->expression_stack_size());
-  _num_oops = from->num_oops();
+  set_method(src->method());
+  set_bci(src->bci());
+  set_mask_size(src->mask_size());
+  set_expression_stack_size(src->expression_stack_size());
+  _num_oops = src->num_oops();
 
   // Is the bit mask contained in the entry?
-  if (from->mask_size() <= small_mask_limit) {
-    memcpy((void *)_bit_mask, (void *)from->_bit_mask,
-      mask_word_size() * BytesPerWord);
+  if (src->mask_size() <= small_mask_limit) {
+    memcpy(_bit_mask, src->_bit_mask, mask_word_size() * BytesPerWord);
   } else {
-    // The expectation is that this InterpreterOopMap is a recently created
-    // and empty. It is used to get a copy of a cached entry.
-    // If the bit mask has a value, it should be in the
-    // resource area.
-    assert(_bit_mask[0] == 0 ||
-      Thread::current()->resource_area()->contains((void*)_bit_mask[0]),
-      "The bit mask should have been allocated from a resource area");
-    // Allocate the bit_mask from a Resource area for performance.  Allocating
-    // from the C heap as is done for OopMapCache has a significant
-    // performance impact.
-    _bit_mask[0] = (uintptr_t) NEW_RESOURCE_ARRAY(uintptr_t, mask_word_size());
-    assert(_bit_mask[0] != 0, "bit mask was not allocated");
-    memcpy((void*) _bit_mask[0], (void*) from->_bit_mask[0],
-      mask_word_size() * BytesPerWord);
+    _bit_mask[0] = (uintptr_t) NEW_C_HEAP_ARRAY(uintptr_t, mask_word_size(), mtClass);
+    memcpy((void*) _bit_mask[0], (void*) src->_bit_mask[0], mask_word_size() * BytesPerWord);
   }
 }
 
@@ -445,29 +433,25 @@ inline unsigned int OopMapCache::hash_value_for(const methodHandle& method, int
 OopMapCacheEntry* volatile OopMapCache::_old_entries = nullptr;
 
 OopMapCache::OopMapCache() {
-  _array  = NEW_C_HEAP_ARRAY(OopMapCacheEntry*, _size, mtClass);
-  for(int i = 0; i < _size; i++) _array[i] = nullptr;
+  for(int i = 0; i < size; i++) _array[i] = nullptr;
 }
 
 
 OopMapCache::~OopMapCache() {
-  assert(_array != nullptr, "sanity check");
   // Deallocate oop maps that are allocated out-of-line
   flush();
-  // Deallocate array
-  FREE_C_HEAP_ARRAY(OopMapCacheEntry*, _array);
 }
 
 OopMapCacheEntry* OopMapCache::entry_at(int i) const {
-  return Atomic::load_acquire(&(_array[i % _size]));
+  return Atomic::load_acquire(&(_array[i % size]));
 }
 
 bool OopMapCache::put_at(int i, OopMapCacheEntry* entry, OopMapCacheEntry* old) {
-  return Atomic::cmpxchg(&_array[i % _size], old, entry) == old;
+  return Atomic::cmpxchg(&_array[i % size], old, entry) == old;
 }
 
 void OopMapCache::flush() {
-  for (int i = 0; i < _size; i++) {
+  for (int i = 0; i < size; i++) {
     OopMapCacheEntry* entry = _array[i];
     if (entry != nullptr) {
       _array[i] = nullptr;  // no barrier, only called in OopMapCache destructor
@@ -478,7 +462,7 @@ void OopMapCache::flush() {
 
 void OopMapCache::flush_obsolete_entries() {
   assert(SafepointSynchronize::is_at_safepoint(), "called by RedefineClasses in a safepoint");
-  for (int i = 0; i < _size; i++) {
+  for (int i = 0; i < size; i++) {
     OopMapCacheEntry* entry = _array[i];
     if (entry != nullptr && !entry->is_empty() && entry->method()->is_old()) {
       // Cache entry is occupied by an old redefined method and we don't want
@@ -513,10 +497,10 @@ void OopMapCache::lookup(const methodHandle& method,
   // Need a critical section to avoid race against concurrent reclamation.
   {
     GlobalCounter::CriticalSection cs(Thread::current());
-    for (int i = 0; i < _probe_depth; i++) {
+    for (int i = 0; i < probe_depth; i++) {
       OopMapCacheEntry *entry = entry_at(probe + i);
       if (entry != nullptr && !entry->is_empty() && entry->match(method, bci)) {
-        entry_for->resource_copy(entry);
+        entry_for->copy_from(entry);
         assert(!entry_for->is_empty(), "A non-empty oop map should be returned");
         log_debug(interpreter, oopmap)("- found at hash %d", probe + i);
         return;
@@ -530,7 +514,7 @@ void OopMapCache::lookup(const methodHandle& method,
   OopMapCacheEntry* tmp = NEW_C_HEAP_OBJ(OopMapCacheEntry, mtClass);
   tmp->initialize();
   tmp->fill(method, bci);
-  entry_for->resource_copy(tmp);
+  entry_for->copy_from(tmp);
 
   if (method->should_not_be_cached()) {
     // It is either not safe or not a good idea to cache this Method*
@@ -542,7 +526,7 @@ void OopMapCache::lookup(const methodHandle& method,
   }
 
   // First search for an empty slot
-  for (int i = 0; i < _probe_depth; i++) {
+  for (int i = 0; i < probe_depth; i++) {
     OopMapCacheEntry* entry = entry_at(probe + i);
     if (entry == nullptr) {
       if (put_at(probe + i, tmp, nullptr)) {
@@ -592,10 +576,13 @@ bool OopMapCache::has_cleanup_work() {
   return Atomic::load(&_old_entries) != nullptr;
 }
 
-void OopMapCache::trigger_cleanup() {
-  if (has_cleanup_work()) {
-    MutexLocker ml(Service_lock, Mutex::_no_safepoint_check_flag);
+void OopMapCache::try_trigger_cleanup() {
+  // See we can take the lock for the notification without blocking.
+  // This allows triggering the cleanup from GC paths, that can hold
+  // the service lock for e.g. oop iteration in service thread.
+  if (has_cleanup_work() && Service_lock->try_lock_without_rank_check()) {
     Service_lock->notify_all();
+    Service_lock->unlock();
   }
 }
 
@@ -628,7 +615,7 @@ void OopMapCache::compute_one_oop_map(const methodHandle& method, int bci, Inter
   tmp->initialize();
   tmp->fill(method, bci);
   if (tmp->has_valid_mask()) {
-    entry->resource_copy(tmp);
+    entry->copy_from(tmp);
   }
   OopMapCacheEntry::deallocate(tmp);
 }
diff --git a/src/hotspot/share/interpreter/oopMapCache.hpp b/src/hotspot/share/interpreter/oopMapCache.hpp
index 3c124631377..062b4178ce0 100644
--- a/src/hotspot/share/interpreter/oopMapCache.hpp
+++ b/src/hotspot/share/interpreter/oopMapCache.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -36,13 +36,14 @@
 // OopMapCache's are allocated lazily per InstanceKlass.
 
 // The oopMap (InterpreterOopMap) is stored as a bit mask. If the
-// bit_mask can fit into two words it is stored in
+// bit_mask can fit into four words it is stored in
 // the _bit_mask array, otherwise it is allocated on the heap.
 // For OopMapCacheEntry the bit_mask is allocated in the C heap
 // because these entries persist between garbage collections.
-// For InterpreterOopMap the bit_mask is allocated in
-// a resource area for better performance.  InterpreterOopMap
-// should only be created and deleted during same garbage collection.
+// For InterpreterOopMap the bit_mask is allocated in the C heap
+// to avoid issues with allocations from the resource area that have
+// to live accross the oop closure. InterpreterOopMap should only be
+// created and deleted during the same garbage collection.
 //
 // If ENABBLE_ZAP_DEAD_LOCALS is defined, two bits are used
 // per entry instead of one. In all cases,
@@ -83,21 +84,18 @@ class InterpreterOopMap: ResourceObj {
 
  private:
   Method*        _method;         // the method for which the mask is valid
-  unsigned short _bci;            // the bci    for which the mask is valid
   int            _mask_size;      // the mask size in bits (USHRT_MAX if invalid)
   int            _expression_stack_size; // the size of the expression stack in slots
+  unsigned short _bci;            // the bci    for which the mask is valid
 
  protected:
+  int            _num_oops;
   intptr_t       _bit_mask[N];    // the bit mask if
                                   // mask_size <= small_mask_limit,
                                   // ptr to bit mask otherwise
                                   // "protected" so that sub classes can
                                   // access it without using trickery in
                                   // method bit_mask().
-  int            _num_oops;
-#ifdef ASSERT
-  bool _resource_allocate_bit_mask;
-#endif
 
   // access methods
   Method*        method() const                  { return _method; }
@@ -128,12 +126,13 @@ class InterpreterOopMap: ResourceObj {
 
  public:
   InterpreterOopMap();
+  ~InterpreterOopMap();
 
-  // Copy the OopMapCacheEntry in parameter "from" into this
-  // InterpreterOopMap.  If the _bit_mask[0] in "from" points to
-  // allocated space (i.e., the bit mask was to large to hold
-  // in-line), allocate the space from a Resource area.
-  void resource_copy(OopMapCacheEntry* from);
+  // Copy the OopMapCacheEntry in parameter "src" into this
+  // InterpreterOopMap.  If the _bit_mask[0] in "src" points to
+  // allocated space (i.e., the bit mask was too large to hold
+  // in-line), allocate the space from the C heap.
+  void copy_from(const OopMapCacheEntry* src);
 
   void iterate_oop(OffsetClosure* oop_closure) const;
   void print() const;
@@ -152,11 +151,10 @@ class InterpreterOopMap: ResourceObj {
 class OopMapCache : public CHeapObj<mtClass> {
  static OopMapCacheEntry* volatile _old_entries;
  private:
-  enum { _size        = 32,     // Use fixed size for now
-         _probe_depth = 3       // probe depth in case of collisions
-  };
+  static constexpr int size = 32;        // Use fixed size for now
+  static constexpr int probe_depth = 3;  // probe depth in case of collisions
 
-  OopMapCacheEntry* volatile * _array;
+  OopMapCacheEntry* volatile _array[size];
 
   unsigned int hash_value_for(const methodHandle& method, int bci) const;
   OopMapCacheEntry* entry_at(int i) const;
@@ -183,8 +181,8 @@ class OopMapCache : public CHeapObj<mtClass> {
   // Check if we need to clean up old entries
   static bool has_cleanup_work();
 
-  // Request cleanup if work is needed
-  static void trigger_cleanup();
+  // Request cleanup if work is needed and notification is currently possible
+  static void try_trigger_cleanup();
 
   // Clean up the old entries
   static void cleanup();
diff --git a/src/hotspot/share/jfr/jni/jfrJniMethod.cpp b/src/hotspot/share/jfr/jni/jfrJniMethod.cpp
index 8953976cd0c..d60baa3c1cc 100644
--- a/src/hotspot/share/jfr/jni/jfrJniMethod.cpp
+++ b/src/hotspot/share/jfr/jni/jfrJniMethod.cpp
@@ -30,6 +30,7 @@
 #include "jfr/recorder/jfrRecorder.hpp"
 #include "jfr/recorder/checkpoint/jfrMetadataEvent.hpp"
 #include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp"
+#include "jfr/recorder/repository/jfrChunk.hpp"
 #include "jfr/recorder/repository/jfrRepository.hpp"
 #include "jfr/recorder/repository/jfrChunkRotation.hpp"
 #include "jfr/recorder/repository/jfrChunkWriter.hpp"
@@ -425,3 +426,7 @@ JVM_END
 JVM_ENTRY_NO_ENV(void, jfr_unregister_stack_filter(JNIEnv* env,  jclass jvm, jlong id))
   JfrStackFilterRegistry::remove(id);
 JVM_END
+
+NO_TRANSITION(jlong, jfr_nanos_now(JNIEnv* env, jclass jvm))
+  return JfrChunk::nanos_now();
+NO_TRANSITION_END
diff --git a/src/hotspot/share/jfr/jni/jfrJniMethod.hpp b/src/hotspot/share/jfr/jni/jfrJniMethod.hpp
index 6a2d622d7e9..ca119c1f8c3 100644
--- a/src/hotspot/share/jfr/jni/jfrJniMethod.hpp
+++ b/src/hotspot/share/jfr/jni/jfrJniMethod.hpp
@@ -165,6 +165,8 @@ jlong JNICALL jfr_register_stack_filter(JNIEnv* env, jclass jvm, jobjectArray cl
 
 jlong JNICALL jfr_unregister_stack_filter(JNIEnv* env, jclass jvm, jlong id);
 
+jlong JNICALL jfr_nanos_now(JNIEnv* env, jclass jvm);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp b/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp
index 7ef831f6282..415c7468a62 100644
--- a/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp
+++ b/src/hotspot/share/jfr/jni/jfrJniMethodRegistration.cpp
@@ -100,7 +100,8 @@ JfrJniMethodRegistration::JfrJniMethodRegistration(JNIEnv* env) {
       (char*)"hostTotalSwapMemory", (char*)"()J", (void*) jfr_host_total_swap_memory,
       (char*)"emitDataLoss", (char*)"(J)V", (void*)jfr_emit_data_loss,
       (char*)"registerStackFilter", (char*)"([Ljava/lang/String;[Ljava/lang/String;)J", (void*)jfr_register_stack_filter,
-      (char*)"unregisterStackFilter", (char*)"(J)V", (void*)jfr_unregister_stack_filter
+      (char*)"unregisterStackFilter", (char*)"(J)V", (void*)jfr_unregister_stack_filter,
+      (char*)"nanosNow", (char*)"()J", (void*)jfr_nanos_now
     };
 
     const size_t method_array_length = sizeof(method) / sizeof(JNINativeMethod);
diff --git a/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.cpp b/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.cpp
index 2412454f6aa..b7f9b733c0f 100644
--- a/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.cpp
+++ b/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.cpp
@@ -36,6 +36,7 @@
 #include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp"
 #include "jfr/recorder/service/jfrOptionSet.hpp"
 #include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp"
+#include "jfr/recorder/storage/jfrReferenceCountedStorage.hpp"
 #include "jfr/support/jfrKlassUnloading.hpp"
 #include "jfr/support/jfrMethodLookup.hpp"
 #include "jfr/utilities/jfrHashtable.hpp"
@@ -272,11 +273,30 @@ static void install_stack_traces(const ObjectSampler* sampler) {
   iterate_samples(installer);
 }
 
+// Resets the blob write states from the previous epoch.
+static void reset_blob_write_state(const ObjectSampler* sampler, JavaThread* jt) {
+  assert(sampler != nullptr, "invariant");
+  const ObjectSample* sample = sampler->last_resolved();
+  while (sample != nullptr) {
+    if (sample->has_stacktrace()) {
+      sample->stacktrace()->reset_write_state();
+    }
+    if (sample->has_thread()) {
+      sample->thread()->reset_write_state();
+    }
+    if (sample->has_type_set()) {
+      sample->type_set()->reset_write_state();
+    }
+    sample = sample->next();
+  }
+}
+
 void ObjectSampleCheckpoint::on_rotation(const ObjectSampler* sampler) {
   assert(sampler != nullptr, "invariant");
   assert(LeakProfiler::is_running(), "invariant");
   JavaThread* const thread = JavaThread::current();
   DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_native(thread);)
+  reset_blob_write_state(sampler, thread);
   if (!ObjectSampler::has_unresolved_entry()) {
     return;
   }
@@ -326,38 +346,34 @@ void ObjectSampleCheckpoint::write_stacktrace(const JfrStackTrace* trace, JfrChe
   }
 }
 
-static void write_blob(const JfrBlobHandle& blob, JfrCheckpointWriter& writer, bool reset) {
-  if (reset) {
-    blob->reset_write_state();
-    return;
-  }
+static void write_blob(const JfrBlobHandle& blob, JfrCheckpointWriter& writer) {
   blob->exclusive_write(writer);
 }
 
-static void write_type_set_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) {
+static void write_type_set_blob(const ObjectSample* sample, JfrCheckpointWriter& writer) {
   if (sample->has_type_set()) {
-    write_blob(sample->type_set(), writer, reset);
+    write_blob(sample->type_set(), writer);
   }
 }
 
-static void write_thread_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) {
+static void write_thread_blob(const ObjectSample* sample, JfrCheckpointWriter& writer) {
   assert(sample->has_thread(), "invariant");
   if (sample->is_virtual_thread() || has_thread_exited(sample->thread_id())) {
-    write_blob(sample->thread(), writer, reset);
+    write_blob(sample->thread(), writer);
   }
 }
 
-static void write_stacktrace_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) {
+static void write_stacktrace_blob(const ObjectSample* sample, JfrCheckpointWriter& writer) {
   if (sample->has_stacktrace()) {
-    write_blob(sample->stacktrace(), writer, reset);
+    write_blob(sample->stacktrace(), writer);
   }
 }
 
-static void write_blobs(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) {
+static void write_blobs(const ObjectSample* sample, JfrCheckpointWriter& writer) {
   assert(sample != nullptr, "invariant");
-  write_stacktrace_blob(sample, writer, reset);
-  write_thread_blob(sample, writer, reset);
-  write_type_set_blob(sample, writer, reset);
+  write_stacktrace_blob(sample, writer);
+  write_thread_blob(sample, writer);
+  write_type_set_blob(sample, writer);
 }
 
 class BlobWriter {
@@ -365,18 +381,14 @@ class BlobWriter {
   const ObjectSampler* _sampler;
   JfrCheckpointWriter& _writer;
   const jlong _last_sweep;
-  bool _reset;
  public:
   BlobWriter(const ObjectSampler* sampler, JfrCheckpointWriter& writer, jlong last_sweep) :
-    _sampler(sampler), _writer(writer), _last_sweep(last_sweep), _reset(false)  {}
+    _sampler(sampler), _writer(writer), _last_sweep(last_sweep) {}
   void sample_do(ObjectSample* sample) {
     if (sample->is_alive_and_older_than(_last_sweep)) {
-      write_blobs(sample, _writer, _reset);
+      write_blobs(sample, _writer);
     }
   }
-  void set_reset() {
-    _reset = true;
-  }
 };
 
 static void write_sample_blobs(const ObjectSampler* sampler, bool emit_all, Thread* thread) {
@@ -385,9 +397,6 @@ static void write_sample_blobs(const ObjectSampler* sampler, bool emit_all, Thre
   JfrCheckpointWriter writer(thread, false);
   BlobWriter cbw(sampler, writer, last_sweep);
   iterate_samples(cbw, true);
-  // reset blob write states
-  cbw.set_reset();
-  iterate_samples(cbw, true);
 }
 
 void ObjectSampleCheckpoint::write(const ObjectSampler* sampler, EdgeStore* edge_store, bool emit_all, Thread* thread) {
@@ -403,67 +412,17 @@ void ObjectSampleCheckpoint::write(const ObjectSampler* sampler, EdgeStore* edge
   }
 }
 
-// A linked list of saved type set blobs for the epoch.
-// The link consist of a reference counted handle.
-static JfrBlobHandle saved_type_set_blobs;
-
-static void release_state_for_previous_epoch() {
-  // decrements the reference count and the list is reinitialized
-  saved_type_set_blobs = JfrBlobHandle();
-}
-
-class BlobInstaller {
- public:
-  ~BlobInstaller() {
-    release_state_for_previous_epoch();
-  }
-  void sample_do(ObjectSample* sample) {
-    if (!sample->is_dead()) {
-      sample->set_type_set(saved_type_set_blobs);
-    }
-  }
-};
-
-static void install_type_set_blobs() {
-  if (saved_type_set_blobs.valid()) {
-    BlobInstaller installer;
-    iterate_samples(installer);
-  }
-}
-
-static void save_type_set_blob(JfrCheckpointWriter& writer) {
-  assert(writer.has_data(), "invariant");
-  const JfrBlobHandle blob = writer.copy();
-  if (saved_type_set_blobs.valid()) {
-    saved_type_set_blobs->set_next(blob);
-  } else {
-    saved_type_set_blobs = blob;
-  }
-}
-
 // This routine has exclusive access to the sampler instance on entry.
-void ObjectSampleCheckpoint::on_type_set(JfrCheckpointWriter& writer) {
+void ObjectSampleCheckpoint::on_type_set(JavaThread* jt) {
   assert(LeakProfiler::is_running(), "invariant");
   DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(JavaThread::current());)
   assert(ClassLoaderDataGraph_lock->owned_by_self(), "invariant");
   if (!ObjectSampler::has_unresolved_entry()) {
     return;
   }
-  const ObjectSample* const last = ObjectSampler::sampler()->last();
+  ObjectSample* const last = ObjectSampler::sampler()->last();
   assert(last != nullptr, "invariant");
   assert(last != ObjectSampler::sampler()->last_resolved(), "invariant");
-  if (writer.has_data()) {
-    save_type_set_blob(writer);
-  }
-  install_type_set_blobs();
+  JfrReferenceCountedStorage::install(last, ObjectSampler::sampler()->last_resolved());
   ObjectSampler::sampler()->set_last_resolved(last);
 }
-
-// This routine does NOT have exclusive access to the sampler instance on entry.
-void ObjectSampleCheckpoint::on_type_set_unload(JfrCheckpointWriter& writer) {
-  assert(LeakProfiler::is_running(), "invariant");
-  assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
-  if (writer.has_data() && ObjectSampler::has_unresolved_entry()) {
-    save_type_set_blob(writer);
-  }
-}
diff --git a/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp b/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp
index eb887f2db9a..bf1965b13b5 100644
--- a/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp
+++ b/src/hotspot/share/jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -50,8 +50,7 @@ class ObjectSampleCheckpoint : AllStatic {
   static void write(const ObjectSampler* sampler, EdgeStore* edge_store, bool emit_all, Thread* thread);
   static void clear();
  public:
-  static void on_type_set(JfrCheckpointWriter& writer);
-  static void on_type_set_unload(JfrCheckpointWriter& writer);
+  static void on_type_set(JavaThread* jt);
   static void on_thread_exit(traceid tid);
   static void on_rotation(const ObjectSampler* sampler);
 };
diff --git a/src/hotspot/share/jfr/leakprofiler/sampling/objectSample.hpp b/src/hotspot/share/jfr/leakprofiler/sampling/objectSample.hpp
index c202ba8d8aa..214de827d03 100644
--- a/src/hotspot/share/jfr/leakprofiler/sampling/objectSample.hpp
+++ b/src/hotspot/share/jfr/leakprofiler/sampling/objectSample.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -233,7 +233,7 @@ class ObjectSample : public JfrCHeapObj {
     return _type_set.valid();
   }
 
-  void set_type_set(const JfrBlobHandle& ref) {
+  void install_type_set(const JfrBlobHandle& ref) {
     if (_type_set != ref) {
       if (_type_set.valid()) {
         _type_set->set_next(ref);
diff --git a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp
index 0aed916702e..a2e887e71a3 100644
--- a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp
+++ b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointManager.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -37,6 +37,7 @@
 #include "jfr/recorder/service/jfrOptionSet.hpp"
 #include "jfr/recorder/storage/jfrEpochStorage.inline.hpp"
 #include "jfr/recorder/storage/jfrMemorySpace.inline.hpp"
+#include "jfr/recorder/storage/jfrReferenceCountedStorage.hpp"
 #include "jfr/recorder/storage/jfrStorageUtils.inline.hpp"
 #include "jfr/recorder/stringpool/jfrStringPool.hpp"
 #include "jfr/support/jfrDeprecationManager.hpp"
@@ -589,12 +590,14 @@ void JfrCheckpointManager::clear_type_set() {
     MutexLocker module_lock(Module_lock);
     JfrTypeSet::clear(&writer, &leakp_writer);
   }
-  JfrDeprecationManager::on_type_set(leakp_writer, nullptr, thread);
-  // We placed a blob in the Deprecated subsystem by moving the information
-  // from the leakp writer. For the real writer, the data will not be
-  // committed, because the JFR system is yet to be started.
-  // Therefore, the writer is cancelled before its destructor is run,
-  // to avoid writing unnecessary information into the checkpoint system.
+  JfrAddRefCountedBlob add_blob(leakp_writer);
+  JfrDeprecationManager::on_type_set(nullptr, thread);
+  // We installed a blob in the JfrReferenceCountedStorage subsystem
+  // by moving the information from the leakp writer.
+  // For the real writer, the data will not be committed,
+  // because the JFR system is yet to be started.
+  // Therefore, we cancel the writer before its destructor is run
+  // to avoid writing invalid information into the checkpoint system.
   writer.cancel();
 }
 
@@ -613,11 +616,11 @@ void JfrCheckpointManager::write_type_set() {
       MutexLocker module_lock(thread, Module_lock);
       JfrTypeSet::serialize(&writer, &leakp_writer, false, false);
     }
+    JfrAddRefCountedBlob add_blob(leakp_writer);
     if (LeakProfiler::is_running()) {
-      ObjectSampleCheckpoint::on_type_set(leakp_writer);
+      ObjectSampleCheckpoint::on_type_set(thread);
     }
-    // Place this call after ObjectSampleCheckpoint::on_type_set.
-    JfrDeprecationManager::on_type_set(leakp_writer, _chunkwriter, thread);
+    JfrDeprecationManager::on_type_set(_chunkwriter, thread);
   }
   write();
 }
@@ -626,10 +629,7 @@ void JfrCheckpointManager::on_unloading_classes() {
   assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
   JfrCheckpointWriter writer(Thread::current());
   JfrTypeSet::on_unloading_classes(&writer);
-  if (LeakProfiler::is_running()) {
-    ObjectSampleCheckpoint::on_type_set_unload(writer);
-  }
-  JfrDeprecationManager::on_type_set_unload(writer);
+  JfrAddRefCountedBlob add_blob(writer, false /* move */, false /* reset */);
 }
 
 static size_t flush_type_set(Thread* thread) {
diff --git a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp
index a8ec2fd70f5..aaebc8f3e7e 100644
--- a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp
+++ b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp
@@ -54,6 +54,7 @@ struct JfrCheckpointContext {
 };
 
 class JfrCheckpointWriter : public JfrCheckpointWriterBase {
+  friend class JfrAddRefCountedBlob;
   friend class JfrCheckpointManager;
   friend class JfrDeprecationManager;
   friend class JfrSerializerRegistration;
diff --git a/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp b/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp
index 6d0ec7773b9..a35b046e56c 100644
--- a/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp
+++ b/src/hotspot/share/jfr/recorder/repository/jfrChunk.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, 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
@@ -35,7 +35,7 @@ static const u2 JFR_VERSION_MAJOR = 2;
 static const u2 JFR_VERSION_MINOR = 1;
 
 // strictly monotone
-static jlong nanos_now() {
+jlong JfrChunk::nanos_now() {
   static jlong last = 0;
 
   jlong seconds;
@@ -47,8 +47,6 @@ static jlong nanos_now() {
   const jlong now = seconds * 1000000000 + nanos;
   if (now > last) {
     last = now;
-  } else {
-    ++last;
   }
   return last;
 }
@@ -147,7 +145,7 @@ void JfrChunk::update_start_ticks() {
 }
 
 void JfrChunk::update_start_nanos() {
-  const jlong now = nanos_now();
+  const jlong now = JfrChunk::nanos_now();
   assert(now >= _start_nanos, "invariant");
   assert(now >= _last_update_nanos, "invariant");
   _start_nanos = _last_update_nanos = now;
diff --git a/src/hotspot/share/jfr/recorder/repository/jfrChunk.hpp b/src/hotspot/share/jfr/recorder/repository/jfrChunk.hpp
index d7bd3411160..91b42948181 100644
--- a/src/hotspot/share/jfr/recorder/repository/jfrChunk.hpp
+++ b/src/hotspot/share/jfr/recorder/repository/jfrChunk.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,6 +34,8 @@ const u1 PAD = 0;
 class JfrChunk : public JfrCHeapObj {
   friend class JfrChunkWriter;
   friend class JfrChunkHeadWriter;
+ public:
+   static jlong nanos_now();
  private:
   char* _path;
   int64_t _start_ticks;
diff --git a/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.cpp b/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.cpp
new file mode 100644
index 00000000000..ac652905c5b
--- /dev/null
+++ b/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2024, 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "jfr/leakprofiler/sampling/objectSampler.hpp"
+#include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp"
+#include "jfr/recorder/storage/jfrReferenceCountedStorage.hpp"
+#include "jfr/support/jfrDeprecationManager.hpp"
+
+// Currently only two subsystems use type set blobs. Save a blob only if either has an unresolved entry.
+static inline bool save_blob_predicate() {
+  return JfrDeprecationManager::has_unresolved_entry() || ObjectSampler::has_unresolved_entry();
+}
+
+JfrAddRefCountedBlob::JfrAddRefCountedBlob(JfrCheckpointWriter& writer, bool move /* true */, bool reset /* true */) : _reset(reset) {
+  if (writer.has_data()) {
+    if (save_blob_predicate()) {
+      JfrReferenceCountedStorage::save_blob(writer, move);
+    } else if (move) {
+      writer.cancel();
+    }
+  }
+  DEBUG_ONLY(if (reset) JfrReferenceCountedStorage::set_scope();)
+}
+
+JfrAddRefCountedBlob::~JfrAddRefCountedBlob() {
+  if (_reset) {
+    JfrReferenceCountedStorage::reset();
+  }
+}
+
+JfrBlobHandle JfrReferenceCountedStorage::_type_sets = JfrBlobHandle();
+DEBUG_ONLY(bool JfrReferenceCountedStorage::_scope = false;)
+
+void JfrReferenceCountedStorage::save_blob(JfrCheckpointWriter& writer, bool move /* false */) {
+  assert(writer.has_data(), "invariant");
+  const JfrBlobHandle blob = move ? writer.move() : writer.copy();
+  if (_type_sets.valid()) {
+    _type_sets->set_next(blob);
+    return;
+  }
+  _type_sets = blob;
+}
+
+void JfrReferenceCountedStorage::reset() {
+  assert(_scope, "invariant");
+  if (_type_sets.valid()) {
+    _type_sets = JfrBlobHandle();
+  }
+  DEBUG_ONLY(_scope = false;)
+}
+
+#ifdef ASSERT
+void JfrReferenceCountedStorage::set_scope() {
+  assert(!_scope, "invariant");
+  _scope = true;
+}
+#endif
diff --git a/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.hpp b/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.hpp
new file mode 100644
index 00000000000..6d32e1b0ead
--- /dev/null
+++ b/src/hotspot/share/jfr/recorder/storage/jfrReferenceCountedStorage.hpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_JFR_RECORDER_STORAGE_JFRREFERENCECOUNTEDSTORAGE_HPP
+#define SHARE_JFR_RECORDER_STORAGE_JFRREFERENCECOUNTEDSTORAGE_HPP
+
+#include "jfr/utilities/jfrBlob.hpp"
+#include "memory/allocation.hpp"
+#include "utilities/macros.hpp"
+
+class JfrCheckpointWriter;
+
+// RAII helper class for adding blobs to the storage.
+class JfrAddRefCountedBlob : public StackObj {
+ private:
+  bool _reset;
+ public:
+  JfrAddRefCountedBlob(JfrCheckpointWriter& writer, bool move = true, bool reset = true);
+  ~JfrAddRefCountedBlob();
+};
+
+// The debug aid 'scope' implies the proper RAII save construct is placed on stack.
+// This is a necessary condition for installing reference counted storage to nodes.
+class JfrReferenceCountedStorage : AllStatic {
+  friend class JfrAddRefCountedBlob;
+ private:
+  static JfrBlobHandle _type_sets; // linked-list of blob handles saved during epoch.
+  DEBUG_ONLY(static bool _scope;)
+
+  static void save_blob(JfrCheckpointWriter& writer, bool move = false);
+  static void reset();
+  DEBUG_ONLY(static void set_scope();)
+
+ public:
+  template <typename T>
+  static void install(T* node, const T* end) {
+    assert(_scope, "invariant");
+    if (_type_sets.valid()) {
+      while (node != end) {
+        node->install_type_set(_type_sets);
+        node = node->next();
+      }
+    }
+  }
+};
+
+#endif // SHARE_JFR_RECORDER_STORAGE_JFRREFERENCECOUNTEDSTORAGE_HPP
diff --git a/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.cpp b/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.cpp
index 24cdbdc1611..4aa61bdddff 100644
--- a/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.cpp
+++ b/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2023, 2024, 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
@@ -116,8 +116,8 @@ bool JfrDeprecatedStackTraceWriter::process(const JfrDeprecatedEdge* edge) {
   return true;
 }
 
-JfrDeprecatedEventWriter::JfrDeprecatedEventWriter(JfrChunkWriter& cw, bool stacktrace) :
-  _now(JfrTicks::now()),_cw(cw), _for_removal(only_for_removal()), _stacktrace(stacktrace), _did_write(false) {}
+JfrDeprecatedEventWriter::JfrDeprecatedEventWriter(JfrChunkWriter& cw, JfrCheckpointWriter& tsw, bool stacktrace) :
+  _now(JfrTicks::now()),_cw(cw), _tsw(tsw), _for_removal(only_for_removal()), _stacktrace(stacktrace) {}
 
 static size_t calculate_event_size(const JfrDeprecatedEdge* edge, JfrChunkWriter& cw, const JfrTicks& now, bool stacktrace) {
   assert(edge != nullptr, "invariant");
@@ -141,14 +141,31 @@ static void write_event(const JfrDeprecatedEdge* edge, JfrChunkWriter& cw, const
   cw.write(edge->for_removal());
 }
 
+static void write_type_set(const JfrDeprecatedEdge* edge, JfrCheckpointWriter& tsw) {
+  if (!edge->has_type_set()) {
+    return;
+  }
+  edge->type_set()->exclusive_write(tsw);
+}
+
 bool JfrDeprecatedEventWriter::process(const JfrDeprecatedEdge* edge) {
   assert(edge != nullptr, "invariant");
   if (_for_removal && !edge->for_removal()) {
     return true;
   }
-  write_event(edge, _cw,_now, _stacktrace);
-  if (!_did_write) {
-    _did_write = true;
+  write_event(edge, _cw, _now, _stacktrace);
+  write_type_set(edge, _tsw);
+  return true;
+}
+
+JfrDeprecatedEventClear::JfrDeprecatedEventClear() {}
+
+bool JfrDeprecatedEventClear::process(const JfrDeprecatedEdge* edge) {
+  assert(edge != nullptr, "invariant");
+  if (!edge->has_type_set()) {
+    return true;
   }
+  edge->type_set()->reset_write_state();
   return true;
 }
+
diff --git a/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.hpp b/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.hpp
index 77699c94979..1d73d4dc3a3 100644
--- a/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.hpp
+++ b/src/hotspot/share/jfr/support/jfrDeprecationEventWriter.hpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2023, 2024, 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
@@ -56,12 +56,17 @@ class JfrDeprecatedEventWriter : public StackObj {
  private:
   JfrTicks _now;
   JfrChunkWriter& _cw;
+  JfrCheckpointWriter& _tsw;
   bool _for_removal;
   bool _stacktrace;
-  bool _did_write;
  public:
-  JfrDeprecatedEventWriter(JfrChunkWriter& cw, bool stacktrace);
-  bool did_write() const { return _did_write; }
+  JfrDeprecatedEventWriter(JfrChunkWriter& cw, JfrCheckpointWriter& tsw, bool stacktrace);
+  bool process(const JfrDeprecatedEdge* edge);
+};
+
+class JfrDeprecatedEventClear : public StackObj {
+ public:
+  JfrDeprecatedEventClear();
   bool process(const JfrDeprecatedEdge* edge);
 };
 
diff --git a/src/hotspot/share/jfr/support/jfrDeprecationManager.cpp b/src/hotspot/share/jfr/support/jfrDeprecationManager.cpp
index 5f5c87d239c..8969b787a1c 100644
--- a/src/hotspot/share/jfr/support/jfrDeprecationManager.cpp
+++ b/src/hotspot/share/jfr/support/jfrDeprecationManager.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2023, 2024, 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
@@ -32,6 +32,7 @@
 #include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp"
 #include "jfr/recorder/repository/jfrChunkWriter.hpp"
 #include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp"
+#include "jfr/recorder/storage/jfrReferenceCountedStorage.hpp"
 #include "jfr/support/jfrDeprecationEventWriter.hpp"
 #include "jfr/support/jfrDeprecationManager.hpp"
 #include "jfr/support/jfrKlassUnloading.hpp"
@@ -66,6 +67,7 @@ static inline traceid load_traceid(const Method* method) {
 JfrDeprecatedEdge::JfrDeprecatedEdge(const Method* method, Method* sender, int bci, u1 frame_type, JavaThread* jt) :
   _invocation_time(JfrTicks::now()),
   _stacktrace(),
+  _type_set(),
   _next(nullptr),
   _deprecated_ik(method->method_holder()),
   _deprecated_methodid(load_traceid(method)),
@@ -94,11 +96,25 @@ const JfrBlobHandle& JfrDeprecatedEdge::stacktrace() const {
   return _stacktrace;
 }
 
+bool JfrDeprecatedEdge::has_type_set() const {
+  return _type_set.valid();
+}
+
+const JfrBlobHandle& JfrDeprecatedEdge::type_set() const {
+  assert(has_type_set(), "invariant");
+  return _type_set;
+}
+
+void JfrDeprecatedEdge::install_type_set(const JfrBlobHandle& type_set) {
+  assert(!has_type_set(), "invariant");
+  _type_set = type_set;
+}
+
 typedef JfrLinkedList<JfrDeprecatedEdge> DeprecatedEdgeList;
 
 static DeprecatedEdgeList _list; // Newly constructed edges are concurrently added to this list.
 static DeprecatedEdgeList _pending_list; // During epoch rotation (safepoint) entries in _list are moved onto _pending_list
-static DeprecatedEdgeList _resolved_list; // Fully resolved edges (event and stacktrace blobs).
+static DeprecatedEdgeList _resolved_list; // Fully resolved edges (event, stacktrace and typeset blobs).
 
 static JfrDeprecatedEdge* allocate_edge(const Method* method, Method* sender, int bci, u1 frame_type, JavaThread* jt) {
   DEBUG_ONLY(JfrJavaSupport::check_java_thread_in_vm(jt);)
@@ -225,10 +241,6 @@ static void transfer_list() {
   }
 }
 
-void JfrDeprecationManager::on_level_setting_update(int64_t new_level) {
-  JfrDeprecatedEventWriterState::on_level_setting_update(new_level);
-}
-
 void JfrDeprecationManager::on_safepoint_clear() {
   assert(!_enqueue_klasses, "invariant");
   // We are now starting JFR, so begin enqueuing tagged klasses.
@@ -270,6 +282,23 @@ static void add_to_leakp_set(const JfrDeprecatedEdge* edge) {
 static DeprecatedEdgeList::NodePtr _pending_head = nullptr;
 static DeprecatedEdgeList::NodePtr _pending_tail = nullptr;
 
+inline DeprecatedEdgeList::NodePtr pending_head() {
+  return Atomic::load(&_pending_head);
+}
+
+// The test for a pending head can be read concurrently from a thread doing class unloading.
+inline static bool has_pending_head() {
+  return pending_head() != nullptr;
+}
+
+inline static bool no_pending_head() {
+  return !has_pending_head();
+}
+
+inline static void set_pending_head(DeprecatedEdgeList::NodePtr head) {
+  Atomic::store(&_pending_head, head);
+}
+
 class PendingListProcessor {
  private:
   JfrCheckpointWriter& _writer;
@@ -281,66 +310,57 @@ class PendingListProcessor {
     JfrDeprecatedStackTraceWriter::install_stacktrace_blob(edge, _writer, _jt);
     assert(edge->has_stacktrace(), "invariant");
     add_to_leakp_set(edge);
-    if (_pending_head == nullptr) {
-      _pending_head = edge;
+    if (no_pending_head()) {
+      set_pending_head(edge);
     }
     _pending_tail = edge;
     return true;
   }
 };
 
-void JfrDeprecationManager::prepare_type_set(JavaThread* jt) {
-  _pending_head = nullptr;
+// Resets the pending head and tail.
+// Resets blob write states for nodes on the resolved list, dirtied in the previous epoch.
+static void reset_type_set_blobs() {
+  set_pending_head(nullptr);
   _pending_tail = nullptr;
+  if (_resolved_list.is_nonempty()) {
+    JfrDeprecatedEventClear clear;
+    _resolved_list.iterate(clear);
+  }
+}
+
+void JfrDeprecationManager::prepare_type_set(JavaThread* jt) {
+  reset_type_set_blobs();
   if (_pending_list.is_nonempty()) {
     JfrKlassUnloading::sort(true);
     JfrCheckpointWriter writer(true /* prev epoch */, jt,  false /* header */);
     PendingListProcessor plp(writer, jt);
     _pending_list.iterate(plp);
-    assert(_pending_head != nullptr, "invariant");
+    assert(has_pending_head(), "invariant");
     assert(_pending_tail != nullptr, "invariant");
     assert(_pending_tail->next() == nullptr, "invariant");
     // Excise already resolved edges to link them.
     _pending_tail->set_next(_resolved_list.cut());
     // Re-insertion.
-    _resolved_list.add_list(_pending_head);
+    _resolved_list.add_list(pending_head());
     _pending_list.clear();
   }
   assert(_pending_list.is_empty(), "invariant");
 }
 
-// A linked-list of blob handles.
-static JfrBlobHandle type_set_blobs;
-
-static inline void write_type_set_blobs(JfrCheckpointWriter& writer) {
-  type_set_blobs->write(writer);
-}
-
-static void save_type_set_blob(JfrCheckpointWriter& writer, bool copy = false) {
-  assert(writer.has_data(), "invariant");
-  const JfrBlobHandle blob = copy ? writer.copy() : writer.move();
-  if (type_set_blobs.valid()) {
-    type_set_blobs->set_next(blob);
-  } else {
-    type_set_blobs = blob;
-  }
-}
-
-void JfrDeprecationManager::on_type_set_unload(JfrCheckpointWriter& writer) {
-  if (writer.has_data()) {
-    save_type_set_blob(writer, true);
-  }
+bool JfrDeprecationManager::has_unresolved_entry() {
+  return _list.is_nonempty() || has_pending_head() || _pending_list.is_nonempty();
 }
 
 static inline bool has_stacktrace() {
   return JfrEventSetting::has_stacktrace(JfrDeprecatedInvocationEvent);
 }
 
-static inline bool write_events(JfrChunkWriter& cw) {
+static inline void write_events(JfrChunkWriter& cw, Thread* thread, bool on_error) {
   assert(_resolved_list.is_nonempty(), "invariant");
-  JfrDeprecatedEventWriter ebw(cw, has_stacktrace());
+  JfrCheckpointWriter type_set_writer(!on_error, thread, false);
+  JfrDeprecatedEventWriter ebw(cw, type_set_writer, has_stacktrace());
   _resolved_list.iterate(ebw);
-  return ebw.did_write();
 }
 
 static inline void write_stacktraces(JfrChunkWriter& cw) {
@@ -349,34 +369,30 @@ static inline void write_stacktraces(JfrChunkWriter& cw) {
   _resolved_list.iterate(scw);
 }
 
-static inline void write_type_sets(Thread* thread, bool on_error) {
-  JfrCheckpointWriter writer(!on_error, thread, false);
-  write_type_set_blobs(writer);
-}
-
-// First, we consolidate all stacktrace blobs into a single TYPE_STACKTRACE checkpoint and serialize it to the chunk.
-// Secondly, we serialize all events to the chunk.
-// Thirdly, the type set blobs are written into the JfrCheckpoint system, to be serialized to the chunk
-// just after we return from here.
+// First, we consolidate all stack trace blobs into a single TYPE_STACKTRACE checkpoint
+// and serialize it to the chunk. Then, all events are serialized, and unique type set blobs
+// written into the JfrCheckpoint system to be serialized to the chunk upon return.
 void JfrDeprecationManager::write_edges(JfrChunkWriter& cw, Thread* thread, bool on_error /* false */) {
   if (_resolved_list.is_nonempty() && JfrEventSetting::is_enabled(JfrDeprecatedInvocationEvent)) {
     if (has_stacktrace()) {
       write_stacktraces(cw);
     }
-    if (write_events(cw)) {
-      write_type_sets(thread, on_error);
-    }
+    write_events(cw, thread, on_error);
   }
 }
 
-void JfrDeprecationManager::on_type_set(JfrCheckpointWriter& writer, JfrChunkWriter* cw, Thread* thread) {
+void JfrDeprecationManager::on_type_set(JfrChunkWriter* cw, Thread* thread) {
   assert(_pending_list.is_empty(), "invariant");
-  if (_pending_head != nullptr) {
-    save_type_set_blob(writer);
-  } else {
-    writer.cancel();
+  if (has_pending_head()) {
+    assert(_pending_tail != nullptr, "invariant");
+    // Install type set blobs for the pending, i.e. unresolved nodes.
+    JfrReferenceCountedStorage::install(pending_head(), _pending_tail->next());
   }
   if (cw != nullptr) {
     write_edges(*cw, thread);
   }
 }
+
+void JfrDeprecationManager::on_level_setting_update(int64_t new_level) {
+  JfrDeprecatedEventWriterState::on_level_setting_update(new_level);
+}
diff --git a/src/hotspot/share/jfr/support/jfrDeprecationManager.hpp b/src/hotspot/share/jfr/support/jfrDeprecationManager.hpp
index a1948357491..d156679521a 100644
--- a/src/hotspot/share/jfr/support/jfrDeprecationManager.hpp
+++ b/src/hotspot/share/jfr/support/jfrDeprecationManager.hpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2023, 2024, 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 @@ class JfrDeprecatedEdge : public CHeapObj<mtTracing> {
  private:
   JfrTicks _invocation_time;
   JfrBlobHandle _stacktrace;
+  JfrBlobHandle _type_set;
   JfrDeprecatedEdge* _next;
   InstanceKlass* _deprecated_ik;
   traceid _deprecated_methodid;
@@ -58,7 +59,7 @@ class JfrDeprecatedEdge : public CHeapObj<mtTracing> {
  public:
   JfrDeprecatedEdge(const Method* method, Method* sender, int bci, u1 frame_type, JavaThread* jt);
 
-  const JfrDeprecatedEdge* next() const { return _next; }
+  JfrDeprecatedEdge* next() const { return _next; }
   void set_next(JfrDeprecatedEdge* edge) { _next = edge; }
 
   bool has_event() const;
@@ -68,6 +69,10 @@ class JfrDeprecatedEdge : public CHeapObj<mtTracing> {
   const JfrBlobHandle& stacktrace() const;
   void install_stacktrace_blob(JavaThread* jt);
 
+  bool has_type_set() const;
+  const JfrBlobHandle& type_set() const;
+  void install_type_set(const JfrBlobHandle& type_set);
+
   const InstanceKlass* deprecated_ik() const { return _deprecated_ik; }
   traceid deprecated_methodid() const { return _deprecated_methodid; }
 
@@ -89,11 +94,11 @@ class JfrDeprecationManager : AllStatic {
   static void on_safepoint_write();
   static void on_recorder_stop();
   static void prepare_type_set(JavaThread* jt);
-  static void on_type_set(JfrCheckpointWriter& writer, JfrChunkWriter* cw, Thread* thread);
-  static void on_type_set_unload(JfrCheckpointWriter& writer);
+  static void on_type_set(JfrChunkWriter* cw, Thread* thread);
   static void write_edges(JfrChunkWriter& cw, Thread* thread, bool on_error = false);
   static void on_link(const Method* method, Method* sender, int bci, u1 frame_type, JavaThread* thread);
   static void on_level_setting_update(int64_t new_level);
+  static bool has_unresolved_entry();
 };
 
 #endif // SHARE_JFR_SUPPORT_JFRDEPRECATIONMANAGER_HPP
diff --git a/src/hotspot/share/jfr/support/jfrIntrinsics.hpp b/src/hotspot/share/jfr/support/jfrIntrinsics.hpp
index 65a94164a97..77affc69926 100644
--- a/src/hotspot/share/jfr/support/jfrIntrinsics.hpp
+++ b/src/hotspot/share/jfr/support/jfrIntrinsics.hpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2012, 2024, 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
@@ -47,13 +47,13 @@ class JfrIntrinsicSupport : AllStatic {
 #define JFR_HAVE_INTRINSICS
 
 #define JFR_TEMPLATES(template)                                                                                      \
+  template(jdk_jfr_internal_management_HiddenWait,                    "jdk/jfr/internal/management/HiddenWait")      \
   template(jdk_jfr_internal_JVM,                                      "jdk/jfr/internal/JVM")                        \
   template(jdk_jfr_internal_event_EventWriterFactory,                 "jdk/jfr/internal/event/EventWriterFactory")   \
   template(jdk_jfr_internal_event_EventConfiguration_signature,       "Ljdk/jfr/internal/event/EventConfiguration;") \
   template(getEventWriter_signature,                                  "()Ljdk/jfr/internal/event/EventWriter;")      \
   template(eventConfiguration_name,                                   "eventConfiguration")                          \
   template(commit_name,                                               "commit")                                      \
-  template(jfr_chunk_rotation_monitor,                                "jdk/jfr/internal/JVM$ChunkRotationMonitor")   \
 
 #define JFR_INTRINSICS(do_intrinsic, do_class, do_name, do_signature, do_alias)                                      \
   do_intrinsic(_counterTime,        jdk_jfr_internal_JVM, counterTime_name, void_long_signature, F_SN)               \
diff --git a/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp b/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp
index 52a060427d5..c62257bd23b 100644
--- a/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp
+++ b/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp
@@ -1297,6 +1297,10 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile
   u1 id = stream->read_u1("mark:id");
   address pc = _instructions->start() + pc_offset;
 
+  if (pd_relocate(pc, id)) {
+    return;
+  }
+
   switch (id) {
     case UNVERIFIED_ENTRY:
       _offsets.set_value(CodeOffsets::Entry, pc_offset);
@@ -1330,12 +1334,6 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile
       _next_call_type = (MarkId) id;
       _invoke_mark_pc = pc;
       break;
-    case POLL_NEAR:
-    case POLL_FAR:
-    case POLL_RETURN_NEAR:
-    case POLL_RETURN_FAR:
-      pd_relocate_poll(pc, id, JVMCI_CHECK);
-      break;
     case CARD_TABLE_SHIFT:
     case CARD_TABLE_ADDRESS:
     case HEAP_TOP_ADDRESS:
@@ -1350,6 +1348,7 @@ void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompile
     case VERIFY_OOP_MASK:
     case VERIFY_OOP_COUNT_ADDRESS:
       break;
+
     default:
       JVMCI_ERROR("invalid mark id: %d%s", id, stream->context());
       break;
diff --git a/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp b/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp
index 98fed480bf1..0cb7f287480 100644
--- a/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp
+++ b/src/hotspot/share/jvmci/jvmciCodeInstaller.hpp
@@ -176,6 +176,23 @@ class CodeInstaller : public StackObj {
     VERIFY_OOP_BITS,
     VERIFY_OOP_MASK,
     VERIFY_OOP_COUNT_ADDRESS,
+
+#ifdef X86
+    Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL,
+    Z_BARRIER_RELOCATION_FORMAT_LOAD_BAD_AFTER_TEST,
+    Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_AFTER_TEST,
+    Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_CMP,
+    Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_AFTER_TEST,
+    Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_OR,
+    Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV,
+#endif
+#ifdef AARCH64
+    Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_TB_X,
+    Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_BEFORE_MOV,
+    Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_BEFORE_MOV,
+    Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_BEFORE_MOV,
+#endif
+
     INVOKE_INVALID = -1
   };
 
@@ -312,7 +329,7 @@ class CodeInstaller : public StackObj {
   void pd_patch_DataSectionReference(int pc_offset, int data_offset, JVMCI_TRAPS);
   void pd_relocate_ForeignCall(NativeInstruction* inst, jlong foreign_call_destination, JVMCI_TRAPS);
   void pd_relocate_JavaMethod(CodeBuffer &cbuf, methodHandle& method, jint pc_offset, JVMCI_TRAPS);
-  void pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS);
+  bool pd_relocate(address pc, jint mark);
 
 public:
 
diff --git a/src/hotspot/share/jvmci/jvmciCompiler.cpp b/src/hotspot/share/jvmci/jvmciCompiler.cpp
index 5be065aadad..2b8684f7ab8 100644
--- a/src/hotspot/share/jvmci/jvmciCompiler.cpp
+++ b/src/hotspot/share/jvmci/jvmciCompiler.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -200,6 +200,15 @@ void JVMCICompiler::print_timers() {
   _hosted_code_installs.print_on(tty, "       Install Code:   ");
 }
 
+bool JVMCICompiler::is_intrinsic_supported(const methodHandle& method) {
+  vmIntrinsics::ID id = method->intrinsic_id();
+  assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
+  JavaThread* thread = JavaThread::current();
+  JVMCIEnv jvmciEnv(thread, __FILE__, __LINE__);
+  JVMCIRuntime* runtime = JVMCI::compiler_runtime(thread, false);
+  return runtime->is_intrinsic_supported(&jvmciEnv, (jint) id);
+}
+
 void JVMCICompiler::CodeInstallStats::print_on(outputStream* st, const char* prefix) const {
   double time = _timer.seconds();
   st->print_cr("%s%7.3f s (installs: %d, CodeBlob total size: %d, CodeBlob code size: %d)",
diff --git a/src/hotspot/share/jvmci/jvmciCompiler.hpp b/src/hotspot/share/jvmci/jvmciCompiler.hpp
index bdb50cfc26a..0d03bd08bf6 100644
--- a/src/hotspot/share/jvmci/jvmciCompiler.hpp
+++ b/src/hotspot/share/jvmci/jvmciCompiler.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -136,6 +136,8 @@ class JVMCICompiler : public AbstractCompiler {
   // Print compilation timers and statistics
   virtual void print_timers();
 
+  virtual bool is_intrinsic_supported(const methodHandle& method);
+
   // Gets the number of methods that have been successfully compiled by
   // a call to JVMCICompiler::compile_method().
   int methods_compiled() { return _methods_compiled; }
diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
index fb06abe9174..68168c56b9a 100644
--- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
+++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
@@ -897,7 +897,9 @@ C2V_VMENTRY_NULL(jobject, lookupKlassInPool, (JNIEnv* env, jobject, ARGUMENT_PAI
     } else if (tag.is_symbol()) {
       symbol = cp->symbol_at(index);
     } else {
-      assert(cp->tag_at(index).is_unresolved_klass(), "wrong tag");
+      if (!tag.is_unresolved_klass()) {
+        JVMCI_THROW_MSG_NULL(InternalError, err_msg("Expected %d at index %d, got %d", JVM_CONSTANT_UnresolvedClassInError, index, tag.value()));
+      }
       symbol = cp->klass_name_at(index);
     }
   }
@@ -1208,12 +1210,19 @@ C2V_VMENTRY_NULL(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject
   HandleMark hm(THREAD);
 
   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
-  JVMCINMethodHandle nmethod_handle(THREAD);
-  nmethod* nm = JVMCIENV->get_nmethod(nmethod_mirror, nmethod_handle);
-  if (nm == nullptr || !nm->is_in_use()) {
-    JVMCI_THROW_NULL(InvalidInstalledCodeException);
+  methodHandle mh;
+  {
+    // Reduce the scope of JVMCINMethodHandle so that it isn't alive across the Java call.  Once the
+    // nmethod has been validated and the method is fetched from the nmethod it's fine for the
+    // nmethod to be reclaimed if necessary.
+    JVMCINMethodHandle nmethod_handle(THREAD);
+    nmethod* nm = JVMCIENV->get_nmethod(nmethod_mirror, nmethod_handle);
+    if (nm == nullptr || !nm->is_in_use()) {
+      JVMCI_THROW_NULL(InvalidInstalledCodeException);
+    }
+    methodHandle nmh(THREAD, nm->method());
+    mh = nmh;
   }
-  methodHandle mh(THREAD, nm->method());
   Symbol* signature = mh->signature();
   JavaCallArguments jca(mh->size_of_parameters());
 
diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp
index ff159a490c1..665656d0be4 100644
--- a/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp
+++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -68,6 +68,10 @@ class CompilerToVM {
     static address ZBarrierSetRuntime_load_barrier_on_oop_array;
     static address ZBarrierSetRuntime_clone;
 
+    static address ZPointerVectorLoadBadMask_address;
+    static address ZPointerVectorStoreBadMask_address;
+    static address ZPointerVectorStoreGoodMask_address;
+
     static bool continuations_enabled;
 
     static size_t ThreadLocalAllocBuffer_alignment_reserve;
@@ -100,6 +104,13 @@ class CompilerToVM {
     static int sizeof_narrowKlass;
     static int sizeof_arrayOopDesc;
     static int sizeof_BasicLock;
+#if INCLUDE_ZGC
+    static int sizeof_ZStoreBarrierEntry;
+#endif
+
+#ifdef X86
+    static int L1_line_size;
+#endif
 
     static address dsin;
     static address dcos;
diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp
index a2ba0f2b3e5..02cf6baff78 100644
--- a/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp
+++ b/src/hotspot/share/jvmci/jvmciCompilerToVMInit.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -38,6 +38,8 @@
 #if INCLUDE_ZGC
 #include "gc/x/xBarrierSetRuntime.hpp"
 #include "gc/x/xThreadLocalData.hpp"
+#include "gc/z/zBarrierSetRuntime.hpp"
+#include "gc/z/zThreadLocalData.hpp"
 #endif
 #include "jvmci/jvmciCompilerToVM.hpp"
 #include "jvmci/jvmciEnv.hpp"
@@ -80,6 +82,10 @@ address CompilerToVM::Data::ZBarrierSetRuntime_weak_load_barrier_on_phantom_oop_
 address CompilerToVM::Data::ZBarrierSetRuntime_load_barrier_on_oop_array;
 address CompilerToVM::Data::ZBarrierSetRuntime_clone;
 
+address CompilerToVM::Data::ZPointerVectorLoadBadMask_address;
+address CompilerToVM::Data::ZPointerVectorStoreBadMask_address;
+address CompilerToVM::Data::ZPointerVectorStoreGoodMask_address;
+
 bool CompilerToVM::Data::continuations_enabled;
 
 #ifdef AARCH64
@@ -108,6 +114,10 @@ int CompilerToVM::Data::_fields_annotations_base_offset;
 CardTable::CardValue* CompilerToVM::Data::cardtable_start_address;
 int CompilerToVM::Data::cardtable_shift;
 
+#ifdef X86
+int CompilerToVM::Data::L1_line_size;
+#endif
+
 size_t CompilerToVM::Data::vm_page_size;
 
 int CompilerToVM::Data::sizeof_vtableEntry = sizeof(vtableEntry);
@@ -117,6 +127,9 @@ int CompilerToVM::Data::sizeof_ConstantPool = sizeof(ConstantPool);
 int CompilerToVM::Data::sizeof_narrowKlass = sizeof(narrowKlass);
 int CompilerToVM::Data::sizeof_arrayOopDesc = sizeof(arrayOopDesc);
 int CompilerToVM::Data::sizeof_BasicLock = sizeof(BasicLock);
+#if INCLUDE_ZGC
+int CompilerToVM::Data::sizeof_ZStoreBarrierEntry = sizeof(ZStoreBarrierEntry);
+#endif
 
 address CompilerToVM::Data::dsin;
 address CompilerToVM::Data::dcos;
@@ -157,15 +170,23 @@ void CompilerToVM::Data::initialize(JVMCI_TRAPS) {
 
 #if INCLUDE_ZGC
   if (UseZGC) {
-    thread_address_bad_mask_offset = in_bytes(XThreadLocalData::address_bad_mask_offset());
-    ZBarrierSetRuntime_load_barrier_on_oop_field_preloaded =                     XBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr();
-    ZBarrierSetRuntime_load_barrier_on_weak_oop_field_preloaded =                XBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded_addr();
-    ZBarrierSetRuntime_load_barrier_on_phantom_oop_field_preloaded =             XBarrierSetRuntime::load_barrier_on_phantom_oop_field_preloaded_addr();
-    ZBarrierSetRuntime_weak_load_barrier_on_oop_field_preloaded =                XBarrierSetRuntime::weak_load_barrier_on_oop_field_preloaded_addr();
-    ZBarrierSetRuntime_weak_load_barrier_on_weak_oop_field_preloaded =           XBarrierSetRuntime::weak_load_barrier_on_weak_oop_field_preloaded_addr();
-    ZBarrierSetRuntime_weak_load_barrier_on_phantom_oop_field_preloaded =        XBarrierSetRuntime::weak_load_barrier_on_phantom_oop_field_preloaded_addr();
-    ZBarrierSetRuntime_load_barrier_on_oop_array =                               XBarrierSetRuntime::load_barrier_on_oop_array_addr();
-    ZBarrierSetRuntime_clone =                                                   XBarrierSetRuntime::clone_addr();
+    if (ZGenerational) {
+      ZPointerVectorLoadBadMask_address   = (address) &ZPointerVectorLoadBadMask;
+      ZPointerVectorStoreBadMask_address  = (address) &ZPointerVectorStoreBadMask;
+      ZPointerVectorStoreGoodMask_address = (address) &ZPointerVectorStoreGoodMask;
+    } else {
+      thread_address_bad_mask_offset = in_bytes(XThreadLocalData::address_bad_mask_offset());
+      // Initialize the old names for compatibility.  The proper XBarrierSetRuntime names are
+      // exported as addresses in vmStructs_jvmci.cpp as are the new ZBarrierSetRuntime names.
+      ZBarrierSetRuntime_load_barrier_on_oop_field_preloaded              = XBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr();
+      ZBarrierSetRuntime_load_barrier_on_weak_oop_field_preloaded         = XBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded_addr();
+      ZBarrierSetRuntime_load_barrier_on_phantom_oop_field_preloaded      = XBarrierSetRuntime::load_barrier_on_phantom_oop_field_preloaded_addr();
+      ZBarrierSetRuntime_weak_load_barrier_on_oop_field_preloaded         = XBarrierSetRuntime::weak_load_barrier_on_oop_field_preloaded_addr();
+      ZBarrierSetRuntime_weak_load_barrier_on_weak_oop_field_preloaded    = XBarrierSetRuntime::weak_load_barrier_on_weak_oop_field_preloaded_addr();
+      ZBarrierSetRuntime_weak_load_barrier_on_phantom_oop_field_preloaded = XBarrierSetRuntime::weak_load_barrier_on_phantom_oop_field_preloaded_addr();
+      ZBarrierSetRuntime_load_barrier_on_oop_array                        = XBarrierSetRuntime::load_barrier_on_oop_array_addr();
+      ZBarrierSetRuntime_clone                                            = XBarrierSetRuntime::clone_addr();
+    }
   }
 #endif
 
@@ -223,6 +244,10 @@ void CompilerToVM::Data::initialize(JVMCI_TRAPS) {
     cardtable_shift = 0;
   }
 
+#ifdef X86
+  L1_line_size = VM_Version::L1_line_size();
+#endif
+
   vm_page_size = os::vm_page_size();
 
 #define SET_TRIGFUNC(name)                                      \
diff --git a/src/hotspot/share/jvmci/jvmciEnv.cpp b/src/hotspot/share/jvmci/jvmciEnv.cpp
index 624b25b9e2c..01b78b45b2a 100644
--- a/src/hotspot/share/jvmci/jvmciEnv.cpp
+++ b/src/hotspot/share/jvmci/jvmciEnv.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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
@@ -967,6 +967,31 @@ jboolean JVMCIEnv::call_HotSpotJVMCIRuntime_isGCSupported (JVMCIObject runtime,
   }
 }
 
+jboolean JVMCIEnv::call_HotSpotJVMCIRuntime_isIntrinsicSupported (JVMCIObject runtime, jint intrinsicIdentifier) {
+  JavaThread* THREAD = JavaThread::current(); // For exception macros.
+  if (is_hotspot()) {
+    JavaCallArguments jargs;
+    jargs.push_oop(Handle(THREAD, HotSpotJVMCI::resolve(runtime)));
+    jargs.push_int(intrinsicIdentifier);
+    JavaValue result(T_BOOLEAN);
+    JavaCalls::call_special(&result,
+                            HotSpotJVMCI::HotSpotJVMCIRuntime::klass(),
+                            vmSymbols::isIntrinsicSupported_name(),
+                            vmSymbols::int_bool_signature(), &jargs, CHECK_0);
+    return result.get_jboolean();
+  } else {
+    JNIAccessMark jni(this, THREAD);
+    jboolean result = jni()->CallNonvirtualBooleanMethod(runtime.as_jobject(),
+                                                     JNIJVMCI::HotSpotJVMCIRuntime::clazz(),
+                                                     JNIJVMCI::HotSpotJVMCIRuntime::isIntrinsicSupported_method(),
+                                                     intrinsicIdentifier);
+    if (jni()->ExceptionCheck()) {
+      return false;
+    }
+    return result;
+  }
+}
+
 JVMCIObject JVMCIEnv::call_HotSpotJVMCIRuntime_compileMethod (JVMCIObject runtime, JVMCIObject method, int entry_bci,
                                                               jlong compile_state, int id) {
   JavaThread* THREAD = JVMCI::compilation_tick(JavaThread::current()); // For exception macros.
diff --git a/src/hotspot/share/jvmci/jvmciEnv.hpp b/src/hotspot/share/jvmci/jvmciEnv.hpp
index b3aa487f34c..69f6647b0d6 100644
--- a/src/hotspot/share/jvmci/jvmciEnv.hpp
+++ b/src/hotspot/share/jvmci/jvmciEnv.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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
@@ -359,6 +359,8 @@ class JVMCIEnv : public ResourceObj {
 
   jboolean call_HotSpotJVMCIRuntime_isGCSupported(JVMCIObject runtime, jint gcIdentifier);
 
+  jboolean call_HotSpotJVMCIRuntime_isIntrinsicSupported(JVMCIObject runtime, jint intrinsicIdentifier);
+
   void call_HotSpotJVMCIRuntime_postTranslation(JVMCIObject object, JVMCI_TRAPS);
 
   // Converts the JavaKind.typeChar value in `ch` to a BasicType
diff --git a/src/hotspot/share/jvmci/jvmciJavaClasses.hpp b/src/hotspot/share/jvmci/jvmciJavaClasses.hpp
index 3561093caaa..d5fcd2aaaba 100644
--- a/src/hotspot/share/jvmci/jvmciJavaClasses.hpp
+++ b/src/hotspot/share/jvmci/jvmciJavaClasses.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -202,6 +202,7 @@
     objectarray_field(HotSpotJVMCIRuntime, excludeFromJVMCICompilation, "[Ljava/lang/Module;")                \
     jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, compileMethod, compileMethod_signature) \
     jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, isGCSupported, int_bool_signature) \
+    jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, isIntrinsicSupported, int_bool_signature) \
     jvmci_method(CallNonvirtualVoidMethod, GetMethodID, call_special, void, HotSpotJVMCIRuntime, bootstrapFinished, void_method_signature) \
     jvmci_method(CallNonvirtualVoidMethod, GetMethodID, call_special, void, HotSpotJVMCIRuntime, shutdown, void_method_signature) \
     jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, HotSpotJVMCIRuntime, runtime, runtime_signature) \
diff --git a/src/hotspot/share/jvmci/jvmciRuntime.cpp b/src/hotspot/share/jvmci/jvmciRuntime.cpp
index 9dc0e381df9..9770e329a88 100644
--- a/src/hotspot/share/jvmci/jvmciRuntime.cpp
+++ b/src/hotspot/share/jvmci/jvmciRuntime.cpp
@@ -874,7 +874,7 @@ int JVMCIRuntime::release_and_clear_oop_handles() {
     for (int i = 0; i < _oop_handles.length(); i++) {
       oop* oop_ptr = _oop_handles.at(i);
       guarantee(oop_ptr != nullptr, "release_cleared_oop_handles left null entry in _oop_handles");
-      guarantee(*oop_ptr != nullptr, "unexpected cleared handle");
+      guarantee(NativeAccess<>::oop_load(oop_ptr) != nullptr, "unexpected cleared handle");
       // Satisfy OopHandles::release precondition that all
       // handles being released are null.
       NativeAccess<>::oop_store(oop_ptr, (oop) nullptr);
@@ -889,7 +889,7 @@ int JVMCIRuntime::release_and_clear_oop_handles() {
 }
 
 static bool is_referent_non_null(oop* handle) {
-  return handle != nullptr && *handle != nullptr;
+  return handle != nullptr && NativeAccess<>::oop_load(handle) != nullptr;
 }
 
 // Swaps the elements in `array` at index `a` and index `b`
@@ -2050,6 +2050,16 @@ bool JVMCIRuntime::is_gc_supported(JVMCIEnv* JVMCIENV, CollectedHeap::Name name)
   return JVMCIENV->call_HotSpotJVMCIRuntime_isGCSupported(receiver, (int) name);
 }
 
+bool JVMCIRuntime::is_intrinsic_supported(JVMCIEnv* JVMCIENV, jint id) {
+  JVMCI_EXCEPTION_CONTEXT
+
+  JVMCIObject receiver = get_HotSpotJVMCIRuntime(JVMCIENV);
+  if (JVMCIENV->has_pending_exception()) {
+    fatal_exception(JVMCIENV, "Exception during HotSpotJVMCIRuntime initialization");
+  }
+  return JVMCIENV->call_HotSpotJVMCIRuntime_isIntrinsicSupported(receiver, id);
+}
+
 // ------------------------------------------------------------------
 JVMCI::CodeInstallResult JVMCIRuntime::register_method(JVMCIEnv* JVMCIENV,
                                                        const methodHandle& method,
diff --git a/src/hotspot/share/jvmci/jvmciRuntime.hpp b/src/hotspot/share/jvmci/jvmciRuntime.hpp
index 123cfde15ac..bc5bee4edeb 100644
--- a/src/hotspot/share/jvmci/jvmciRuntime.hpp
+++ b/src/hotspot/share/jvmci/jvmciRuntime.hpp
@@ -431,6 +431,9 @@ class JVMCIRuntime: public CHeapObj<mtJVMCI> {
   // Determines if the GC identified by `name` is supported by the JVMCI compiler.
   bool is_gc_supported(JVMCIEnv* JVMCIENV, CollectedHeap::Name name);
 
+  // Determines if the intrinsic identified by `id` is supported by the JVMCI compiler.
+  bool is_intrinsic_supported(JVMCIEnv* JVMCIENV, jint id);
+
   // Register the result of a compilation.
   JVMCI::CodeInstallResult register_method(JVMCIEnv* JVMCIENV,
                                            const methodHandle&       target,
diff --git a/src/hotspot/share/jvmci/jvmci_globals.cpp b/src/hotspot/share/jvmci/jvmci_globals.cpp
index 8253332e3a9..86d8491b733 100644
--- a/src/hotspot/share/jvmci/jvmci_globals.cpp
+++ b/src/hotspot/share/jvmci/jvmci_globals.cpp
@@ -223,16 +223,14 @@ bool JVMCIGlobals::enable_jvmci_product_mode(JVMFlagOrigin origin, bool use_graa
 }
 
 bool JVMCIGlobals::gc_supports_jvmci() {
-  return UseSerialGC || UseParallelGC || UseG1GC || (UseZGC && !ZGenerational);
+  return UseSerialGC || UseParallelGC || UseG1GC || UseZGC || UseEpsilonGC;
 }
 
 void JVMCIGlobals::check_jvmci_supported_gc() {
   if (EnableJVMCI) {
     // Check if selected GC is supported by JVMCI and Java compiler
     if (!gc_supports_jvmci()) {
-      log_warning(gc, jvmci)("Setting EnableJVMCI to false as selected GC does not support JVMCI: %s", GCConfig::hs_err_name());
-      FLAG_SET_DEFAULT(EnableJVMCI, false);
-      FLAG_SET_DEFAULT(UseJVMCICompiler, false);
+      fatal("JVMCI does not support the selected GC");
     }
   }
 }
diff --git a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp
index f0ecc5af7d2..f55c7bf91a9 100644
--- a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp
+++ b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp
@@ -42,10 +42,17 @@
 #include "runtime/stubRoutines.hpp"
 #include "runtime/vm_version.hpp"
 #if INCLUDE_G1GC
+#include "gc/g1/g1BarrierSetRuntime.hpp"
 #include "gc/g1/g1CardTable.hpp"
 #include "gc/g1/g1HeapRegion.hpp"
 #include "gc/g1/g1ThreadLocalData.hpp"
 #endif
+#if INCLUDE_ZGC
+#include "gc/x/xBarrierSetRuntime.hpp"
+#include "gc/z/zBarrierSetAssembler.hpp"
+#include "gc/z/zBarrierSetRuntime.hpp"
+#include "gc/z/zThreadLocalData.hpp"
+#endif
 
 #define VM_STRUCTS(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field) \
   static_field(CompilerToVM::Data,             Klass_vtable_start_offset,              int)                                          \
@@ -66,6 +73,7 @@
   static_field(CompilerToVM::Data,             thread_disarmed_guard_value_offset, int)                                              \
   static_field(CompilerToVM::Data,             thread_address_bad_mask_offset, int)                                                  \
   AARCH64_ONLY(static_field(CompilerToVM::Data, BarrierSetAssembler_nmethod_patching_type, int))                                     \
+  AARCH64_ONLY(static_field(CompilerToVM::Data, BarrierSetAssembler_patching_epoch_addr, address))                                   \
                                                                                                                                      \
   static_field(CompilerToVM::Data,             ZBarrierSetRuntime_load_barrier_on_oop_field_preloaded, address)                      \
   static_field(CompilerToVM::Data,             ZBarrierSetRuntime_load_barrier_on_weak_oop_field_preloaded, address)                 \
@@ -76,6 +84,10 @@
   static_field(CompilerToVM::Data,             ZBarrierSetRuntime_load_barrier_on_oop_array, address)                                \
   static_field(CompilerToVM::Data,             ZBarrierSetRuntime_clone, address)                                                    \
                                                                                                                                      \
+  static_field(CompilerToVM::Data,             ZPointerVectorLoadBadMask_address, address)                                           \
+  static_field(CompilerToVM::Data,             ZPointerVectorStoreBadMask_address, address)                                          \
+  static_field(CompilerToVM::Data,             ZPointerVectorStoreGoodMask_address, address)                                         \
+                                                                                                                                     \
   static_field(CompilerToVM::Data,             continuations_enabled, bool)                                                          \
                                                                                                                                      \
   static_field(CompilerToVM::Data,             ThreadLocalAllocBuffer_alignment_reserve, size_t)                                     \
@@ -100,6 +112,8 @@
   static_field(CompilerToVM::Data,             cardtable_start_address,                CardTable::CardValue*)                        \
   static_field(CompilerToVM::Data,             cardtable_shift,                        int)                                          \
                                                                                                                                      \
+  X86_ONLY(static_field(CompilerToVM::Data,    L1_line_size,                           int))                                         \
+                                                                                                                                     \
   static_field(CompilerToVM::Data,             vm_page_size,                           size_t)                                       \
                                                                                                                                      \
   static_field(CompilerToVM::Data,             sizeof_vtableEntry,                     int)                                          \
@@ -109,6 +123,7 @@
   static_field(CompilerToVM::Data,             sizeof_narrowKlass,                     int)                                          \
   static_field(CompilerToVM::Data,             sizeof_arrayOopDesc,                    int)                                          \
   static_field(CompilerToVM::Data,             sizeof_BasicLock,                       int)                                          \
+  ZGC_ONLY(static_field(CompilerToVM::Data,    sizeof_ZStoreBarrierEntry,              int))                                         \
                                                                                                                                      \
   static_field(CompilerToVM::Data,             dsin,                                   address)                                      \
   static_field(CompilerToVM::Data,             dcos,                                   address)                                      \
@@ -763,6 +778,7 @@
   declare_constant(vmIntrinsics::_linkToStatic)                           \
   declare_constant(vmIntrinsics::_linkToSpecial)                          \
   declare_constant(vmIntrinsics::_linkToInterface)                        \
+  declare_constant(vmIntrinsics::_linkToNative)                           \
                                                                           \
   declare_constant(vmSymbols::FIRST_SID)                                  \
   declare_constant(vmSymbols::SID_LIMIT)                                  \
@@ -784,7 +800,12 @@
   declare_constant(markWord::no_hash_in_place)                            \
   declare_constant(markWord::no_lock_in_place)                            \
 
-#define VM_ADDRESSES(declare_address, declare_preprocessor_address, declare_function) \
+// Helper macro to support ZGC pattern where the function itself isn't exported
+#define DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, name) \
+  declare_function_with_value(name, name##_addr())
+
+
+#define VM_ADDRESSES(declare_address, declare_preprocessor_address, declare_function, declare_function_with_value) \
   declare_function(SharedRuntime::register_finalizer)                     \
   declare_function(SharedRuntime::exception_handler_for_return_address)   \
   declare_function(SharedRuntime::OSR_migration_end)                      \
@@ -801,6 +822,26 @@
   declare_function(os::javaTimeMillis)                                    \
   declare_function(os::javaTimeNanos)                                     \
                                                                           \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::load_barrier_on_oop_field_preloaded))                      \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded))                 \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::load_barrier_on_phantom_oop_field_preloaded))              \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::weak_load_barrier_on_oop_field_preloaded))                 \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::weak_load_barrier_on_weak_oop_field_preloaded))            \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::weak_load_barrier_on_phantom_oop_field_preloaded))         \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::load_barrier_on_oop_array))                                \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, XBarrierSetRuntime::clone))                                                    \
+                                                                                                                      \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded))                      \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded))                 \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_phantom_oop_field_preloaded))              \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_store_good))           \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::no_keepalive_load_barrier_on_weak_oop_field_preloaded))    \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::no_keepalive_load_barrier_on_phantom_oop_field_preloaded)) \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_healing))        \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::store_barrier_on_oop_field_with_healing))                  \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::store_barrier_on_oop_field_without_healing))               \
+  ZGC_ONLY(DECLARE_FUNCTION_FROM_ADDR(declare_function_with_value, ZBarrierSetRuntime::load_barrier_on_oop_array))                                \
+                                                                          \
   declare_function(Deoptimization::fetch_unroll_info)                     \
   declare_function(Deoptimization::uncommon_trap)                         \
   declare_function(Deoptimization::unpack_frames)                         \
@@ -851,9 +892,35 @@
 #endif // INCLUDE_G1GC
 
 
+#if INCLUDE_ZGC
+
+#define VM_INT_CONSTANTS_JVMCI_ZGC(declare_constant, declare_constant_with_value, declare_preprocessor_constant)                           \
+  declare_constant_with_value("ZThreadLocalData::store_good_mask_offset" , in_bytes(ZThreadLocalData::store_good_mask_offset()))           \
+  declare_constant_with_value("ZThreadLocalData::store_bad_mask_offset" , in_bytes(ZThreadLocalData::store_bad_mask_offset()))             \
+  declare_constant_with_value("ZThreadLocalData::store_barrier_buffer_offset" , in_bytes(ZThreadLocalData::store_barrier_buffer_offset())) \
+  declare_constant_with_value("ZStoreBarrierBuffer::current_offset" , in_bytes(ZStoreBarrierBuffer::current_offset()))                     \
+  declare_constant_with_value("ZStoreBarrierBuffer::buffer_offset" , in_bytes(ZStoreBarrierBuffer::buffer_offset()))                       \
+  declare_constant_with_value("ZStoreBarrierEntry::p_offset" , in_bytes(ZStoreBarrierEntry::p_offset()))                                   \
+  declare_constant_with_value("ZStoreBarrierEntry::prev_offset" , in_bytes(ZStoreBarrierEntry::prev_offset()))                             \
+  AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_SHL))                                            \
+  AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_LOAD_BAD_AFTER_TEST))                                             \
+  AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_AFTER_TEST))                                             \
+  AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_CMP))                                            \
+  AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_AFTER_TEST))                                            \
+  AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_OR))                                             \
+  AMD64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_AFTER_MOV))                                            \
+  AARCH64_ONLY(declare_constant(ZPointerLoadShift))                                                                                        \
+  AARCH64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_LOAD_GOOD_BEFORE_TB_X))                                         \
+  AARCH64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_MARK_BAD_BEFORE_MOV))                                           \
+  AARCH64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_GOOD_BEFORE_MOV))                                         \
+  AARCH64_ONLY(declare_constant(CodeInstaller::Z_BARRIER_RELOCATION_FORMAT_STORE_BAD_BEFORE_MOV))
+
+#endif // INCLUDE_ZGC
+
+
 #ifdef LINUX
 
-#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function) \
+#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function, declare_function_with_value) \
   declare_preprocessor_address("RTLD_DEFAULT", RTLD_DEFAULT)
 
 #endif
@@ -861,7 +928,7 @@
 
 #ifdef BSD
 
-#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function) \
+#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function, declare_function_with_value) \
   declare_preprocessor_address("RTLD_DEFAULT", RTLD_DEFAULT)
 
 #endif
@@ -912,13 +979,17 @@
 #endif
 
 #ifndef VM_ADDRESSES_OS
-#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function)
+#define VM_ADDRESSES_OS(declare_address, declare_preprocessor_address, declare_function, declare_function_with_value)
 #endif
 
 //
 // Instantiation of VMStructEntries, VMTypeEntries and VMIntConstantEntries
 //
 
+#define GENERATE_VM_FUNCTION_WITH_VALUE_ENTRY(name, value) \
+  { QUOTE(name), CAST_FROM_FN_PTR(void*, value) },
+
+
 // These initializers are allowed to access private fields in classes
 // as long as class VMStructs is a friend
 VMStructEntry JVMCIVMStructs::localHotSpotVMStructs[] = {
@@ -969,6 +1040,11 @@ VMIntConstantEntry JVMCIVMStructs::localHotSpotVMIntConstants[] = {
                               GENERATE_VM_INT_CONSTANT_WITH_VALUE_ENTRY,
                               GENERATE_PREPROCESSOR_VM_INT_CONSTANT_ENTRY)
 #endif
+#if INCLUDE_ZGC
+  VM_INT_CONSTANTS_JVMCI_ZGC(GENERATE_VM_INT_CONSTANT_ENTRY,
+                              GENERATE_VM_INT_CONSTANT_WITH_VALUE_ENTRY,
+                              GENERATE_PREPROCESSOR_VM_INT_CONSTANT_ENTRY)
+#endif
 #ifdef VM_INT_CPU_FEATURE_CONSTANTS
   VM_INT_CPU_FEATURE_CONSTANTS
 #endif
@@ -994,10 +1070,12 @@ VMLongConstantEntry JVMCIVMStructs::localHotSpotVMLongConstants[] = {
 VMAddressEntry JVMCIVMStructs::localHotSpotVMAddresses[] = {
   VM_ADDRESSES(GENERATE_VM_ADDRESS_ENTRY,
                GENERATE_PREPROCESSOR_VM_ADDRESS_ENTRY,
-               GENERATE_VM_FUNCTION_ENTRY)
+               GENERATE_VM_FUNCTION_ENTRY,
+               GENERATE_VM_FUNCTION_WITH_VALUE_ENTRY)
   VM_ADDRESSES_OS(GENERATE_VM_ADDRESS_ENTRY,
                   GENERATE_PREPROCESSOR_VM_ADDRESS_ENTRY,
-                  GENERATE_VM_FUNCTION_ENTRY)
+                  GENERATE_VM_FUNCTION_ENTRY,
+                  GENERATE_VM_FUNCTION_WITH_VALUE_ENTRY)
 
   GENERATE_VM_ADDRESS_LAST_ENTRY()
 };
diff --git a/src/hotspot/share/jvmci/vmSymbols_jvmci.hpp b/src/hotspot/share/jvmci/vmSymbols_jvmci.hpp
index 13d81d9f286..c0a7afe2b63 100644
--- a/src/hotspot/share/jvmci/vmSymbols_jvmci.hpp
+++ b/src/hotspot/share/jvmci/vmSymbols_jvmci.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, 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
@@ -81,6 +81,7 @@
   template(compileMethod_name,                                    "compileMethod")                                                        \
   template(compileMethod_signature,                               "(Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;IJI)Ljdk/vm/ci/hotspot/HotSpotCompilationRequestResult;") \
   template(isGCSupported_name,                                    "isGCSupported")                                                        \
+  template(isIntrinsicSupported_name,                             "isIntrinsicSupported")                                                 \
   template(fromMetaspace_name,                                    "fromMetaspace")                                                        \
   template(method_fromMetaspace_signature,                        "(JLjdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;)Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \
   template(constantPool_fromMetaspace_signature,                  "(J)Ljdk/vm/ci/hotspot/HotSpotConstantPool;")                           \
diff --git a/src/hotspot/share/logging/logSelection.cpp b/src/hotspot/share/logging/logSelection.cpp
index 16c6c6f63ca..aea5719b36d 100644
--- a/src/hotspot/share/logging/logSelection.cpp
+++ b/src/hotspot/share/logging/logSelection.cpp
@@ -322,7 +322,7 @@ void LogSelection::suggest_similar_matching(outputStream* out) const {
 
   // Sort found suggestions to suggest the best one first
   SimilarityComparator sc(*this);
-  QuickSort::sort(suggestions, nsuggestions, sc, false);
+  QuickSort::sort(suggestions, nsuggestions, sc);
 
   out->print("Did you mean any of the following?");
   for (size_t i = 0; i < nsuggestions; i++) {
diff --git a/src/hotspot/share/logging/logTag.hpp b/src/hotspot/share/logging/logTag.hpp
index bf60af68770..b64097311a4 100644
--- a/src/hotspot/share/logging/logTag.hpp
+++ b/src/hotspot/share/logging/logTag.hpp
@@ -110,6 +110,7 @@ class outputStream;
   LOG_TAG(jvmti) \
   LOG_TAG(lambda) \
   LOG_TAG(library) \
+  LOG_TAG(link) \
   LOG_TAG(liveness) \
   LOG_TAG(load) /* Trace all classes loaded */ \
   LOG_TAG(loader) \
diff --git a/src/hotspot/share/memory/arena.cpp b/src/hotspot/share/memory/arena.cpp
index 6faffe0d20b..0399c6922e3 100644
--- a/src/hotspot/share/memory/arena.cpp
+++ b/src/hotspot/share/memory/arena.cpp
@@ -209,7 +209,12 @@ void Chunk::next_chop(Chunk* k) {
   k->_next = nullptr;
 }
 
-Arena::Arena(MEMFLAGS flag, Tag tag, size_t init_size) : _flags(flag), _tag(tag), _size_in_bytes(0)  {
+Arena::Arena(MEMFLAGS flag, Tag tag, size_t init_size) :
+  _flags(flag), _tag(tag),
+  _size_in_bytes(0),
+  _first(nullptr), _chunk(nullptr),
+  _hwm(nullptr), _max(nullptr)
+{
   init_size = ARENA_ALIGN(init_size);
   _chunk = ChunkPool::allocate_chunk(init_size, AllocFailStrategy::EXIT_OOM);
   _first = _chunk;
@@ -219,15 +224,6 @@ Arena::Arena(MEMFLAGS flag, Tag tag, size_t init_size) : _flags(flag), _tag(tag)
   set_size_in_bytes(init_size);
 }
 
-Arena::Arena(MEMFLAGS flag, Tag tag) : _flags(flag), _tag(tag), _size_in_bytes(0) {
-  _chunk = ChunkPool::allocate_chunk(Chunk::init_size, AllocFailStrategy::EXIT_OOM);
-  _first = _chunk;
-  _hwm = _chunk->bottom();      // Save the cached hwm, max
-  _max = _chunk->top();
-  MemTracker::record_new_arena(flag);
-  set_size_in_bytes(Chunk::init_size);
-}
-
 Arena::~Arena() {
   destruct_contents();
   MemTracker::record_arena_free(_flags);
diff --git a/src/hotspot/share/memory/arena.hpp b/src/hotspot/share/memory/arena.hpp
index 4c95d656e25..1ca8a787825 100644
--- a/src/hotspot/share/memory/arena.hpp
+++ b/src/hotspot/share/memory/arena.hpp
@@ -87,27 +87,30 @@ class Chunk {
 class Arena : public CHeapObjBase {
 public:
 
-  enum class Tag {
+  enum class Tag : uint8_t {
     tag_other = 0,
     tag_ra,   // resource area
     tag_ha,   // handle area
     tag_node  // C2 Node arena
   };
 
+private:
+  const MEMFLAGS _flags;        // Memory tracking flags
+  const Tag _tag;
+  size_t _size_in_bytes;        // Size of arena (used for native memory tracking)
+
 protected:
   friend class HandleMark;
   friend class NoHandleMark;
   friend class VMStructs;
 
-  MEMFLAGS    _flags;           // Memory tracking flags
-  const Tag _tag;
   Chunk* _first;                // First chunk
   Chunk* _chunk;                // current chunk
   char* _hwm;                   // High water mark
   char* _max;                   // and max in current chunk
+
   // Get a new Chunk of at least size x
   void* grow(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM);
-  size_t _size_in_bytes;        // Size of arena (used for native memory tracking)
 
   void* internal_amalloc(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM)  {
     assert(is_aligned(x, BytesPerWord), "misaligned size");
@@ -123,8 +126,7 @@ class Arena : public CHeapObjBase {
  public:
   // Start the chunk_pool cleaner task
   static void start_chunk_pool_cleaner_task();
-  Arena(MEMFLAGS memflag, Tag tag = Tag::tag_other);
-  Arena(MEMFLAGS memflag, Tag tag, size_t init_size);
+  Arena(MEMFLAGS memflag, Tag tag = Tag::tag_other, size_t init_size = Chunk::init_size);
   ~Arena();
   void  destruct_contents();
   char* hwm() const             { return _hwm; }
diff --git a/src/hotspot/share/memory/metaspace/metaspaceArena.cpp b/src/hotspot/share/memory/metaspace/metaspaceArena.cpp
index 8c5ebfed289..92d7d0ea7eb 100644
--- a/src/hotspot/share/memory/metaspace/metaspaceArena.cpp
+++ b/src/hotspot/share/memory/metaspace/metaspaceArena.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -117,9 +117,6 @@ MetaspaceArena::MetaspaceArena(ChunkManager* chunk_manager, const ArenaGrowthPol
   _fbl(nullptr),
   _total_used_words_counter(total_used_words_counter),
   _name(name)
-#ifdef ASSERT
-  , _first_fence(nullptr)
-#endif
 {
   UL(debug, ": born.");
 
@@ -128,14 +125,7 @@ MetaspaceArena::MetaspaceArena(ChunkManager* chunk_manager, const ArenaGrowthPol
 }
 
 MetaspaceArena::~MetaspaceArena() {
-#ifdef ASSERT
-  SOMETIMES(verify();)
-  if (Settings::use_allocation_guard()) {
-    verify_allocation_guards();
-  }
-#endif
   MemRangeCounter return_counter;
-
   Metachunk* c = _chunks.first();
   Metachunk* c2 = nullptr;
 
@@ -239,23 +229,6 @@ MetaWord* MetaspaceArena::allocate(size_t requested_word_size) {
   // Primary allocation
   p = allocate_inner(aligned_word_size);
 
-#ifdef ASSERT
-  // Fence allocation
-  if (p != nullptr && Settings::use_allocation_guard()) {
-    STATIC_ASSERT(is_aligned(sizeof(Fence), BytesPerWord));
-    MetaWord* guard = allocate_inner(sizeof(Fence) / BytesPerWord);
-    if (guard != nullptr) {
-      // Ignore allocation errors for the fence to keep coding simple. If this
-      // happens (e.g. because right at this time we hit the Metaspace GC threshold)
-      // we miss adding this one fence. Not a big deal. Note that his would
-      // be pretty rare. Chances are much higher the primary allocation above
-      // would have already failed).
-      Fence* f = new(guard) Fence(_first_fence);
-      _first_fence = f;
-    }
-  }
-#endif // ASSERT
-
   return p;
 }
 
@@ -427,18 +400,6 @@ void MetaspaceArena::verify() const {
   }
 }
 
-void MetaspaceArena::Fence::verify() const {
-  assert(_eye1 == EyeCatcher && _eye2 == EyeCatcher,
-         "Metaspace corruption: fence block at " PTR_FORMAT " broken.", p2i(this));
-}
-
-void MetaspaceArena::verify_allocation_guards() const {
-  assert(Settings::use_allocation_guard(), "Don't call with guards disabled.");
-  for (const Fence* f = _first_fence; f != nullptr; f = f->next()) {
-    f->verify();
-  }
-}
-
 // Returns true if the area indicated by pointer and size have actually been allocated
 // from this arena.
 bool MetaspaceArena::is_valid_area(MetaWord* p, size_t word_size) const {
diff --git a/src/hotspot/share/memory/metaspace/metaspaceArena.hpp b/src/hotspot/share/memory/metaspace/metaspaceArena.hpp
index 58d80e97e17..77eb939c6b4 100644
--- a/src/hotspot/share/memory/metaspace/metaspaceArena.hpp
+++ b/src/hotspot/share/memory/metaspace/metaspaceArena.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2020 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -100,28 +100,6 @@ class MetaspaceArena : public CHeapObj<mtClass> {
   // A name for purely debugging/logging purposes.
   const char* const _name;
 
-#ifdef ASSERT
-  // Allocation guards: When active, arena allocations are interleaved with
-  //  fence allocations. An overwritten fence indicates a buffer overrun in either
-  //  the preceding or the following user block. All fences are linked together;
-  //  validating the fences just means walking that linked list.
-  // Note that for the Arena, fence blocks are just another form of user blocks.
-  class Fence {
-    static const uintx EyeCatcher =
-      NOT_LP64(0x77698465) LP64_ONLY(0x7769846577698465ULL); // "META" resp "METAMETA"
-    // Two eyecatchers to easily spot a corrupted _next pointer
-    const uintx _eye1;
-    const Fence* const _next;
-    NOT_LP64(uintx _dummy;)
-    const uintx _eye2;
-  public:
-    Fence(const Fence* next) : _eye1(EyeCatcher), _next(next), _eye2(EyeCatcher) {}
-    const Fence* next() const { return _next; }
-    void verify() const;
-  };
-  const Fence* _first_fence;
-#endif // ASSERT
-
   ChunkManager* chunk_manager() const           { return _chunk_manager; }
 
   // free block list
diff --git a/src/hotspot/share/memory/metaspace/metaspaceSettings.cpp b/src/hotspot/share/memory/metaspace/metaspaceSettings.cpp
index 7dc742755b6..b812341a2da 100644
--- a/src/hotspot/share/memory/metaspace/metaspaceSettings.cpp
+++ b/src/hotspot/share/memory/metaspace/metaspaceSettings.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -36,8 +36,6 @@
 
 namespace metaspace {
 
-DEBUG_ONLY(bool Settings::_use_allocation_guard = false;)
-
 void Settings::ergo_initialize() {
 
   // Granules must be a multiple of page size, and a power-2-value.
@@ -46,9 +44,6 @@ void Settings::ergo_initialize() {
          "Granule size must be a page-size-aligned power-of-2 value");
   assert(commit_granule_words() <= chunklevel::MAX_CHUNK_WORD_SIZE, "Too large granule size");
 
-  // Off for release builds, off by default - but switchable - for debug builds.
-  DEBUG_ONLY(_use_allocation_guard = MetaspaceGuardAllocations;)
-
   LogStream ls(Log(metaspace)::info());
   Settings::print_on(&ls);
 }
@@ -58,7 +53,6 @@ void Settings::print_on(outputStream* st) {
   st->print_cr(" - commit_granule_words: " SIZE_FORMAT ".", commit_granule_words());
   st->print_cr(" - virtual_space_node_default_size: " SIZE_FORMAT ".", virtual_space_node_default_word_size());
   st->print_cr(" - enlarge_chunks_in_place: %d.", (int)enlarge_chunks_in_place());
-  st->print_cr(" - use_allocation_guard: %d.", (int)use_allocation_guard());
 }
 
 } // namespace metaspace
diff --git a/src/hotspot/share/memory/metaspace/metaspaceSettings.hpp b/src/hotspot/share/memory/metaspace/metaspaceSettings.hpp
index 93be0eb6fe6..84dcf8d2f0f 100644
--- a/src/hotspot/share/memory/metaspace/metaspaceSettings.hpp
+++ b/src/hotspot/share/memory/metaspace/metaspaceSettings.hpp
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -56,9 +56,6 @@ class Settings : public AllStatic {
   // the requested size, we attempt to double the chunk size in place...
   static const bool _enlarge_chunks_in_place = true;
 
-  // If true, metablock allocations are guarded and periodically checked.
-  DEBUG_ONLY(static bool _use_allocation_guard;)
-
 public:
 
   static size_t commit_granule_bytes()                        { return _commit_granule_bytes; }
@@ -66,7 +63,6 @@ class Settings : public AllStatic {
   static size_t virtual_space_node_default_word_size()        { return _virtual_space_node_default_word_size; }
   static size_t virtual_space_node_reserve_alignment_words()  { return _virtual_space_node_reserve_alignment_words; }
   static bool enlarge_chunks_in_place()                       { return _enlarge_chunks_in_place; }
-  static bool use_allocation_guard()                          { return DEBUG_ONLY(_use_allocation_guard) NOT_DEBUG(false); }
 
   static void ergo_initialize();
 
diff --git a/src/hotspot/share/memory/resourceArea.cpp b/src/hotspot/share/memory/resourceArea.cpp
index 409460709e4..d5a7513ba19 100644
--- a/src/hotspot/share/memory/resourceArea.cpp
+++ b/src/hotspot/share/memory/resourceArea.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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,17 +30,6 @@
 #include "runtime/javaThread.hpp"
 #include "utilities/vmError.hpp"
 
-void ResourceArea::bias_to(MEMFLAGS new_flags) {
-  if (new_flags != _flags) {
-    size_t size = size_in_bytes();
-    MemTracker::record_arena_size_change(-ssize_t(size), _flags);
-    MemTracker::record_arena_free(_flags);
-    MemTracker::record_new_arena(new_flags);
-    MemTracker::record_arena_size_change(ssize_t(size), new_flags);
-    _flags = new_flags;
-  }
-}
-
 #ifdef ASSERT
 
 ResourceMark::ResourceMark(ResourceArea* area, Thread* thread) :
diff --git a/src/hotspot/share/memory/resourceArea.hpp b/src/hotspot/share/memory/resourceArea.hpp
index ba294e33eff..5fd376068c5 100644
--- a/src/hotspot/share/memory/resourceArea.hpp
+++ b/src/hotspot/share/memory/resourceArea.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -60,10 +60,6 @@ class ResourceArea: public Arena {
 
   char* allocate_bytes(size_t size, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM);
 
-  // Bias this resource area to specific memory type
-  // (by default, ResourceArea is tagged as mtThread, per-thread general purpose storage)
-  void bias_to(MEMFLAGS flags);
-
   DEBUG_ONLY(int nesting() const { return _nesting; })
 
   // Capture the state of a ResourceArea needed by a ResourceMark for
@@ -81,7 +77,7 @@ class ResourceArea: public Arena {
       _chunk(area->_chunk),
       _hwm(area->_hwm),
       _max(area->_max),
-      _size_in_bytes(area->_size_in_bytes)
+      _size_in_bytes(area->size_in_bytes())
       DEBUG_ONLY(COMMA _nesting(area->_nesting))
     {}
   };
diff --git a/src/hotspot/share/memory/virtualspace.cpp b/src/hotspot/share/memory/virtualspace.cpp
index a75d9f076ad..7df35bbeec8 100644
--- a/src/hotspot/share/memory/virtualspace.cpp
+++ b/src/hotspot/share/memory/virtualspace.cpp
@@ -380,7 +380,7 @@ void ReservedHeapSpace::establish_noaccess_prefix() {
   if (base() && base() + _size > (char *)OopEncodingHeapMax) {
     if (true
         WIN64_ONLY(&& !UseLargePages)
-        AIX_ONLY(&& os::vm_page_size() != 64*K)) {
+        AIX_ONLY(&& (os::Aix::supports_64K_mmap_pages() || os::vm_page_size() == 4*K))) {
       // Protect memory at the base of the allocated region.
       // If special, the page was committed (only matters on windows)
       if (!os::protect_memory(_base, _noaccess_prefix, os::MEM_PROT_NONE, _special)) {
diff --git a/src/hotspot/share/nmt/arrayWithFreeList.hpp b/src/hotspot/share/nmt/arrayWithFreeList.hpp
new file mode 100644
index 00000000000..13aa1045fe7
--- /dev/null
+++ b/src/hotspot/share/nmt/arrayWithFreeList.hpp
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+
+ */
+
+#ifndef SHARE_NMT_ARRAYWITHFREELIST_HPP
+#define SHARE_NMT_ARRAYWITHFREELIST_HPP
+
+#include "utilities/growableArray.hpp"
+#include <type_traits>
+
+// A flat array of elements E, backed by C-heap, growing on-demand. It allows for
+// returning arbitrary elements and keeps them in a freelist. Elements can be uniquely
+// identified via array index.
+template<typename E, MEMFLAGS flag>
+class ArrayWithFreeList {
+
+  // An E must be trivially copyable and destructible, but it may be constructed
+  // however it likes.
+  constexpr void static_assert_E_satisfies_type_requirements() const {
+    static_assert(std::is_trivially_copyable<E>::value && std::is_trivially_destructible<E>::value, "must be");
+  }
+
+public:
+  using I = int32_t;
+  static constexpr const I nil = -1;
+
+private:
+  // A free list allocator element is either a link to the next free space
+  // or an actual element.
+  union BackingElement {
+    I link;
+    E e;
+  };
+
+  GrowableArrayCHeap<BackingElement, flag> _backing_storage;
+  I _free_start;
+
+  bool is_in_bounds(I i) {
+    return i >= 0 && i < _backing_storage.length();
+  }
+
+public:
+  NONCOPYABLE(ArrayWithFreeList);
+
+  ArrayWithFreeList(int initial_capacity = 8)
+    : _backing_storage(initial_capacity),
+    _free_start(nil) {}
+
+  template<typename... Args>
+  I allocate(Args... args) {
+    static_assert_E_satisfies_type_requirements();
+    BackingElement* be;
+    I i;
+    if (_free_start != nil) {
+      // Must point to already existing index
+      be = &_backing_storage.at(_free_start);
+      i = _free_start;
+      _free_start = be->link;
+    } else {
+      // There are no free elements, allocate a new one.
+      i = _backing_storage.append(BackingElement());
+      be = _backing_storage.adr_at(i);
+    }
+
+    ::new (be) E{args...};
+    return i;
+  }
+
+  void deallocate(I i) {
+    static_assert_E_satisfies_type_requirements();
+    assert(i == nil || is_in_bounds(i), "out of bounds free");
+    if (i == nil) return;
+    BackingElement& be_freed = _backing_storage.at(i);
+    be_freed.link = _free_start;
+    _free_start = i;
+  }
+
+  E& at(I i) {
+    static_assert_E_satisfies_type_requirements();
+    assert(i != nil, "null pointer dereference");
+    assert(is_in_bounds(i), "out of bounds dereference");
+    return _backing_storage.at(i).e;
+  }
+};
+
+#endif // SHARE_NMT_ARRAYWITHFREELIST_HPP
diff --git a/src/hotspot/share/nmt/mallocHeader.cpp b/src/hotspot/share/nmt/mallocHeader.cpp
index a125ba416b1..d5a7b689c2a 100644
--- a/src/hotspot/share/nmt/mallocHeader.cpp
+++ b/src/hotspot/share/nmt/mallocHeader.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2021, 2022 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -64,7 +64,3 @@ void MallocHeader::print_block_on_error(outputStream* st, address bad_address) c
     os::print_hex_dump(st, from1, to2, 1);
   }
 }
-
-bool MallocHeader::get_stack(NativeCallStack& stack) const {
-  return MallocSiteTable::access_stack(stack, _mst_marker);
-}
diff --git a/src/hotspot/share/nmt/mallocHeader.hpp b/src/hotspot/share/nmt/mallocHeader.hpp
index 6d847a22de3..9f9f7f97ea7 100644
--- a/src/hotspot/share/nmt/mallocHeader.hpp
+++ b/src/hotspot/share/nmt/mallocHeader.hpp
@@ -130,7 +130,6 @@ class MallocHeader {
   inline size_t   size()  const { return _size; }
   inline MEMFLAGS flags() const { return _flags; }
   inline uint32_t mst_marker() const { return _mst_marker; }
-  bool get_stack(NativeCallStack& stack) const;
 
   // Return the necessary data to deaccount the block with NMT.
   FreeInfo free_info() {
diff --git a/src/hotspot/share/nmt/mallocSiteTable.hpp b/src/hotspot/share/nmt/mallocSiteTable.hpp
index 47fe82b590a..ae9266f5369 100644
--- a/src/hotspot/share/nmt/mallocSiteTable.hpp
+++ b/src/hotspot/share/nmt/mallocSiteTable.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -131,8 +131,8 @@ class MallocSiteTable : AllStatic {
 
   // Access and copy a call stack from this table. Shared lock should be
   // acquired before access the entry.
-  static inline bool access_stack(NativeCallStack& stack, uint32_t marker) {
-    MallocSite* site = malloc_site(marker);
+  static inline bool access_stack(NativeCallStack& stack, const MallocHeader& header) {
+    MallocSite* site = malloc_site(header.mst_marker());
     if (site != nullptr) {
       stack = *site->call_stack();
       return true;
diff --git a/src/hotspot/share/nmt/mallocTracker.cpp b/src/hotspot/share/nmt/mallocTracker.cpp
index ab323b3bae6..021ce5d1332 100644
--- a/src/hotspot/share/nmt/mallocTracker.cpp
+++ b/src/hotspot/share/nmt/mallocTracker.cpp
@@ -299,7 +299,7 @@ bool MallocTracker::print_pointer_information(const void* p, outputStream* st) {
                  block->size(), NMTUtil::flag_to_enum_name(block->flags()));
     if (MemTracker::tracking_level() == NMT_detail) {
       NativeCallStack ncs;
-      if (block->get_stack(ncs)) {
+      if (MallocSiteTable::access_stack(ncs, *block)) {
         ncs.print_on(st);
         st->cr();
       }
diff --git a/src/hotspot/share/nmt/memMapPrinter.cpp b/src/hotspot/share/nmt/memMapPrinter.cpp
index ec5003c562e..5f920b102a9 100644
--- a/src/hotspot/share/nmt/memMapPrinter.cpp
+++ b/src/hotspot/share/nmt/memMapPrinter.cpp
@@ -27,21 +27,22 @@
 
 #ifdef LINUX
 
-#include "logging/logAsyncWriter.hpp"
 #include "gc/shared/collectedHeap.hpp"
+#include "logging/logAsyncWriter.hpp"
+#include "memory/allocation.hpp"
 #include "memory/universe.hpp"
+#include "memory/resourceArea.hpp"
 #include "nmt/memflags.hpp"
+#include "nmt/memFlagBitmap.hpp"
+#include "nmt/memMapPrinter.hpp"
+#include "nmt/memTracker.hpp"
+#include "nmt/virtualMemoryTracker.hpp"
 #include "runtime/nonJavaThread.hpp"
 #include "runtime/osThread.hpp"
 #include "runtime/thread.hpp"
 #include "runtime/threadSMR.hpp"
 #include "runtime/vmThread.hpp"
-#include "nmt/memFlagBitmap.hpp"
-#include "nmt/memMapPrinter.hpp"
-#include "nmt/memTracker.hpp"
-#include "nmt/virtualMemoryTracker.hpp"
 #include "utilities/globalDefinitions.hpp"
-#include "utilities/growableArray.hpp"
 #include "utilities/ostream.hpp"
 
 // Note: throughout this code we will use the term "VMA" for OS system level memory mapping
@@ -159,13 +160,6 @@ class CachedNMTInformation : public VirtualMemoryWalker {
   bool fill_from_nmt() {
     return VirtualMemoryTracker::walk_virtual_memory(this);
   }
-
-  void print_on(outputStream* st) const {
-    for (size_t i = 0; i < _count; i ++) {
-      st->print_cr(PTR_FORMAT "-" PTR_FORMAT " %s", p2i(_ranges[i].from), p2i(_ranges[i].to),
-          NMTUtil::flag_to_enum_name(_flags[i]));
-    }
-  }
 };
 
 /////// Thread information //////////////////////////
@@ -197,12 +191,23 @@ struct GCThreadClosure : public ThreadClosure {
 };
 
 static void print_thread_details(uintx thread_id, const char* name, outputStream* st) {
-  st->print("(" UINTX_FORMAT " \"%s\")", (uintx)thread_id, name);
+  // avoid commas and spaces in output to ease post-processing via awk
+  char tmp[64];
+  stringStream ss(tmp, sizeof(tmp));
+  ss.print(":" UINTX_FORMAT "-%s", (uintx)thread_id, name);
+  for (int i = 0; tmp[i] != '\0'; i++) {
+    if (!isalnum(tmp[i])) {
+      tmp[i] = '-';
+    }
+  }
+  st->print_raw(tmp);
 }
 
 // Given a region [from, to), if it intersects a known thread stack, print detail infos about that thread.
 static void print_thread_details_for_supposed_stack_address(const void* from, const void* to, outputStream* st) {
 
+  ResourceMark rm;
+
 #define HANDLE_THREAD(T)                                                        \
   if (T != nullptr && vma_touches_thread_stack(from, to, T)) {                  \
     print_thread_details((uintx)(T->osthread()->thread_id()), T->name(), st);   \
@@ -227,41 +232,18 @@ static void print_thread_details_for_supposed_stack_address(const void* from, co
 
 ///////////////
 
-static void print_legend(outputStream* st) {
-#define DO(flag, shortname, text) st->print_cr("%10s    %s", shortname, text);
+MappingPrintSession::MappingPrintSession(outputStream* st, const CachedNMTInformation& nmt_info) :
+    _out(st), _nmt_info(nmt_info)
+{}
+
+void MappingPrintSession::print_nmt_flag_legend() const {
+#define DO(flag, shortname, text) _out->indent(); _out->print_cr("%10s: %s", shortname, text);
   NMT_FLAGS_DO(DO)
 #undef DO
 }
 
-MappingPrintClosure::MappingPrintClosure(outputStream* st, bool human_readable, const CachedNMTInformation& nmt_info) :
-    _out(st), _human_readable(human_readable),
-    _total_count(0), _total_vsize(0), _nmt_info(nmt_info)
-{}
-
-void MappingPrintClosure::do_it(const MappingPrintInformation* info) {
-
-  _total_count++;
-
-  const void* const vma_from = info->from();
-  const void* const vma_to = info->to();
-
-  // print from, to
-  _out->print(PTR_FORMAT " - " PTR_FORMAT " ", p2i(vma_from), p2i(vma_to));
-  const size_t size = pointer_delta(vma_to, vma_from, 1);
-  _total_vsize += size;
-
-  // print mapping size
-  if (_human_readable) {
-    _out->print(PROPERFMT " ", PROPERFMTARGS(size));
-  } else {
-    _out->print("%11zu", size);
-  }
-
-  assert(info->from() <= info->to(), "Invalid VMA");
-  _out->fill_to(53);
-  info->print_OS_specific_details(_out);
-  _out->fill_to(70);
-
+bool MappingPrintSession::print_nmt_info_for_region(const void* vma_from, const void* vma_to) const {
+  int num_printed = 0;
   // print NMT information, if available
   if (MemTracker::enabled()) {
     // Correlate vma region (from, to) with NMT region(s) we collected previously.
@@ -270,59 +252,33 @@ void MappingPrintClosure::do_it(const MappingPrintInformation* info) {
       for (int i = 0; i < mt_number_of_types; i++) {
         const MEMFLAGS flag = (MEMFLAGS)i;
         if (flags.has_flag(flag)) {
+          if (num_printed > 0) {
+            _out->put(',');
+          }
           _out->print("%s", get_shortname_for_nmt_flag(flag));
           if (flag == mtThreadStack) {
             print_thread_details_for_supposed_stack_address(vma_from, vma_to, _out);
           }
-          _out->print(" ");
+          num_printed++;
         }
       }
     }
   }
-
-  // print file name, if available
-  const char* f = info->filename();
-  if (f != nullptr) {
-    _out->print_raw(f);
-  }
-  _out->cr();
-}
-
-void MemMapPrinter::print_header(outputStream* st) {
-  st->print(
-#ifdef _LP64
-  //   0x0000000000000000 - 0x0000000000000000
-      "from                 to                 "
-#else
-  //   0x00000000 - 0x00000000
-      "from         to         "
-#endif
-  );
-  // Print platform-specific columns
-  pd_print_header(st);
+  return num_printed > 0;
 }
 
-void MemMapPrinter::print_all_mappings(outputStream* st, bool human_readable) {
-  // First collect all NMT information
+void MemMapPrinter::print_all_mappings(outputStream* st) {
   CachedNMTInformation nmt_info;
-  nmt_info.fill_from_nmt();
-  DEBUG_ONLY(nmt_info.print_on(st);)
   st->print_cr("Memory mappings:");
-  if (!MemTracker::enabled()) {
-    st->cr();
-    st->print_cr(" (NMT is disabled, will not annotate mappings).");
+  // Prepare NMT info cache. But only do so if we print individual mappings,
+  // otherwise, we won't need it and can save that work.
+  if (MemTracker::enabled()) {
+    nmt_info.fill_from_nmt();
+  } else {
+    st->print_cr("NMT is disabled. VM info not available.");
   }
-  st->cr();
-
-  print_legend(st);
-  st->print_cr("(*) - Mapping contains data from multiple regions");
-  st->cr();
-
-  pd_print_header(st);
-  MappingPrintClosure closure(st, human_readable, nmt_info);
-  pd_iterate_all_mappings(closure);
-  st->print_cr("Total: " UINTX_FORMAT " mappings with a total vsize of %zu (" PROPERFMT ")",
-               closure.total_count(), closure.total_vsize(), PROPERFMTARGS(closure.total_vsize()));
+  MappingPrintSession session(st, nmt_info);
+  pd_print_all_mappings(session);
 }
 
 #endif // LINUX
diff --git a/src/hotspot/share/nmt/memMapPrinter.hpp b/src/hotspot/share/nmt/memMapPrinter.hpp
index 67706c4d4d7..aa35a830001 100644
--- a/src/hotspot/share/nmt/memMapPrinter.hpp
+++ b/src/hotspot/share/nmt/memMapPrinter.hpp
@@ -35,39 +35,20 @@
 class outputStream;
 class CachedNMTInformation;
 
-class MappingPrintInformation {
-  const void* const _from;
-  const void* const _to;
-public:
-  MappingPrintInformation(const void* from, const void* to) : _from(from), _to(to) {}
-  const void* from() const { return _from; }
-  const void* to() const { return _to; }
-  // Will be called for each mapping before VM annotations are printed.
-  virtual void print_OS_specific_details(outputStream* st) const {}
-  // If mapping is backed by a file, the name of that file
-  virtual const char* filename() const { return nullptr; }
-};
-
-class MappingPrintClosure {
+class MappingPrintSession {
   outputStream* const _out;
-  const bool _human_readable;
-  uintx _total_count;
-  size_t _total_vsize;
   const CachedNMTInformation& _nmt_info;
 public:
-  MappingPrintClosure(outputStream* st, bool human_readable, const CachedNMTInformation& nmt_info);
-  void do_it(const MappingPrintInformation* info); // returns false if timeout reached.
-  uintx total_count() const { return _total_count; }
-  size_t total_vsize() const { return _total_vsize; }
+  MappingPrintSession(outputStream* st, const CachedNMTInformation& nmt_info);
+  bool print_nmt_info_for_region(const void* from, const void* to) const;
+  void print_nmt_flag_legend() const;
+  outputStream* out() const { return _out; }
 };
 
 class MemMapPrinter : public AllStatic {
-  static void pd_print_header(outputStream* st);
-  static void print_header(outputStream* st);
-  static void pd_iterate_all_mappings(MappingPrintClosure& closure);
+  static void pd_print_all_mappings(const MappingPrintSession& session);
 public:
-  static void mark_page_malloced(const void* p, MEMFLAGS f);
-  static void print_all_mappings(outputStream* st, bool human_readable);
+  static void print_all_mappings(outputStream* st);
 };
 
 #endif // LINUX
diff --git a/src/hotspot/share/nmt/memReporter.cpp b/src/hotspot/share/nmt/memReporter.cpp
index 1dc4e58169d..b09cf7ae2bd 100644
--- a/src/hotspot/share/nmt/memReporter.cpp
+++ b/src/hotspot/share/nmt/memReporter.cpp
@@ -31,7 +31,14 @@
 #include "nmt/memoryFileTracker.hpp"
 #include "nmt/threadStackTracker.hpp"
 #include "nmt/virtualMemoryTracker.hpp"
+#include "utilities/debug.hpp"
 #include "utilities/globalDefinitions.hpp"
+#include "utilities/ostream.hpp"
+
+#define INDENT_BY(num_chars, CODE) { \
+  streamIndentor si(out, num_chars); \
+  { CODE }                           \
+}
 
 // Diff two counters, express them as signed, with range checks
 static ssize_t counter_diff(size_t c1, size_t c2) {
@@ -43,6 +50,9 @@ static ssize_t counter_diff(size_t c1, size_t c2) {
   return c1 - c2;
 }
 
+MemReporterBase::MemReporterBase(outputStream* out, size_t scale) :
+  _scale(scale), _output(out), _auto_indentor(out) {}
+
 size_t MemReporterBase::reserved_total(const MallocMemory* malloc, const VirtualMemory* vm) {
   return malloc->malloc_size() + malloc->arena_size() + vm->reserved();
 }
@@ -105,27 +115,15 @@ void MemReporterBase::print_virtual_memory(size_t reserved, size_t committed, si
   }
 }
 
-void MemReporterBase::print_malloc_line(const MemoryCounter* c) const {
-  output()->print("%28s", " ");
-  print_malloc(c);
-  output()->print_cr(" ");
-}
-
-void MemReporterBase::print_virtual_memory_line(size_t reserved, size_t committed, size_t peak) const {
-  output()->print("%28s", " ");
-  print_virtual_memory(reserved, committed, peak);
-  output()->print_cr(" ");
-}
-
-void MemReporterBase::print_arena_line(const MemoryCounter* c) const {
+void MemReporterBase::print_arena(const MemoryCounter* c) const {
   const char* scale = current_scale();
   outputStream* out = output();
 
   const size_t amount = c->size();
   const size_t count = c->count();
 
-  out->print("%27s (arena=" SIZE_FORMAT "%s #" SIZE_FORMAT ")", "",
-    amount_in_current_scale(amount), scale, count);
+  out->print("(arena=" SIZE_FORMAT "%s #" SIZE_FORMAT ")",
+             amount_in_current_scale(amount), scale, count);
 
   size_t pk_amount = c->peak_size();
   if (pk_amount == amount) {
@@ -135,8 +133,6 @@ void MemReporterBase::print_arena_line(const MemoryCounter* c) const {
     out->print(" (peak=" SIZE_FORMAT "%s #" SIZE_FORMAT ")",
         amount_in_current_scale(pk_amount), scale, pk_count);
   }
-
-  out->cr();
 }
 
 void MemReporterBase::print_virtual_memory_region(const char* type, address base, size_t size) const {
@@ -156,7 +152,9 @@ void MemSummaryReporter::report() {
   size_t total_committed_amount = total_malloced_bytes + total_mmap_committed_bytes;
 
   // Overall total
-  out->print_cr("\nNative Memory Tracking:\n");
+  out->cr();
+  out->print_cr("Native Memory Tracking:");
+  out->cr();
 
   if (scale() > 1) {
     out->print_cr("(Omitting categories weighting less than 1%s)", current_scale());
@@ -166,13 +164,15 @@ void MemSummaryReporter::report() {
   out->print("Total: ");
   print_total(total_reserved_amount, total_committed_amount);
   out->cr();
-  out->print_cr("       malloc: " SIZE_FORMAT "%s #" SIZE_FORMAT ", peak=" SIZE_FORMAT "%s #" SIZE_FORMAT,
-                amount_in_current_scale(total_malloced_bytes), current_scale(),
-                _malloc_snapshot->total_count(),
-                amount_in_current_scale(_malloc_snapshot->total_peak()),
-                current_scale(), _malloc_snapshot->total_peak_count());
-  out->print("       mmap:   ");
-  print_total(total_mmap_reserved_bytes, total_mmap_committed_bytes);
+  INDENT_BY(7,
+    out->print_cr("malloc: " SIZE_FORMAT "%s #" SIZE_FORMAT ", peak=" SIZE_FORMAT "%s #" SIZE_FORMAT,
+                  amount_in_current_scale(total_malloced_bytes), current_scale(),
+                  _malloc_snapshot->total_count(),
+                  amount_in_current_scale(_malloc_snapshot->total_peak()),
+                  current_scale(), _malloc_snapshot->total_peak_count());
+    out->print("mmap:   ");
+    print_total(total_mmap_reserved_bytes, total_mmap_committed_bytes);
+  )
   out->cr();
   out->cr();
 
@@ -218,7 +218,8 @@ void MemSummaryReporter::report_summary_of_type(MEMFLAGS flag,
 
   outputStream* out   = output();
   const char*   scale = current_scale();
-  out->print("-%26s (", NMTUtil::flag_to_name(flag));
+  constexpr int indent = 28;
+  out->print("-%*s (", indent - 2, NMTUtil::flag_to_name(flag));
   print_total(reserved_amount, committed_amount);
 #if INCLUDE_CDS
   if (flag == mtClassShared) {
@@ -229,39 +230,43 @@ void MemSummaryReporter::report_summary_of_type(MEMFLAGS flag,
 #endif
   out->print_cr(")");
 
+  streamIndentor si(out, indent);
+
   if (flag == mtClass) {
     // report class count
-    out->print_cr("%27s (classes #" SIZE_FORMAT ")",
-      " ", (_instance_class_count + _array_class_count));
-    out->print_cr("%27s (  instance classes #" SIZE_FORMAT ", array classes #" SIZE_FORMAT ")",
-      " ", _instance_class_count, _array_class_count);
+    out->print_cr("(classes #" SIZE_FORMAT ")", (_instance_class_count + _array_class_count));
+    out->print_cr("(  instance classes #" SIZE_FORMAT ", array classes #" SIZE_FORMAT ")",
+                  _instance_class_count, _array_class_count);
   } else if (flag == mtThread) {
     const VirtualMemory* thread_stack_usage =
      _vm_snapshot->by_type(mtThreadStack);
     // report thread count
-    out->print_cr("%27s (threads #" SIZE_FORMAT ")", " ", ThreadStackTracker::thread_count());
-    out->print("%27s (stack: ", " ");
+    out->print_cr("(threads #" SIZE_FORMAT ")", ThreadStackTracker::thread_count());
+    out->print("(stack: ");
     print_total(thread_stack_usage->reserved(), thread_stack_usage->committed(), thread_stack_usage->peak_size());
     out->print_cr(")");
   }
 
    // report malloc'd memory
   if (amount_in_current_scale(MAX2(malloc_memory->malloc_size(), pk_malloc)) > 0) {
-    print_malloc_line(malloc_memory->malloc_counter());
+    print_malloc(malloc_memory->malloc_counter());
+    out->cr();
   }
 
   if (amount_in_current_scale(MAX2(virtual_memory->reserved(), pk_vm)) > 0) {
-    print_virtual_memory_line(virtual_memory->reserved(), virtual_memory->committed(), virtual_memory->peak_size());
+    print_virtual_memory(virtual_memory->reserved(), virtual_memory->committed(), virtual_memory->peak_size());
+    out->cr();
   }
 
   if (amount_in_current_scale(MAX2(malloc_memory->arena_size(), pk_arena)) > 0) {
-    print_arena_line(malloc_memory->arena_counter());
+    print_arena(malloc_memory->arena_counter());
+    out->cr();
   }
 
   if (flag == mtNMT &&
     amount_in_current_scale(_malloc_snapshot->malloc_overhead()) > 0) {
-    out->print_cr("%27s (tracking overhead=" SIZE_FORMAT "%s)", " ",
-      amount_in_current_scale(_malloc_snapshot->malloc_overhead()), scale);
+    out->print_cr("(tracking overhead=" SIZE_FORMAT "%s)",
+                   amount_in_current_scale(_malloc_snapshot->malloc_overhead()), scale);
   } else if (flag == mtClass) {
     // Metadata information
     report_metadata(Metaspace::NonClassType);
@@ -269,7 +274,7 @@ void MemSummaryReporter::report_summary_of_type(MEMFLAGS flag,
       report_metadata(Metaspace::ClassType);
     }
   }
-  out->print_cr(" ");
+  out->cr();
 }
 
 void MemSummaryReporter::report_metadata(Metaspace::MetadataType type) const {
@@ -292,13 +297,13 @@ void MemSummaryReporter::report_metadata(Metaspace::MetadataType type) const {
   size_t waste = stats.committed() - stats.used();
   float waste_percentage = stats.committed() > 0 ? (((float)waste * 100)/(float)stats.committed()) : 0.0f;
 
-  out->print_cr("%27s (  %s)", " ", name);
-  out->print("%27s (    ", " ");
+  out->print_cr("(  %s)", name);
+  out->print("(    ");
   print_total(stats.reserved(), stats.committed());
   out->print_cr(")");
-  out->print_cr("%27s (    used=" SIZE_FORMAT "%s)", " ", amount_in_current_scale(stats.used()), scale);
-  out->print_cr("%27s (    waste=" SIZE_FORMAT "%s =%2.2f%%)", " ", amount_in_current_scale(waste),
-    scale, waste_percentage);
+  out->print_cr("(    used=" SIZE_FORMAT "%s)", amount_in_current_scale(stats.used()), scale);
+  out->print_cr("(    waste=" SIZE_FORMAT "%s =%2.2f%%)", amount_in_current_scale(waste),
+                scale, waste_percentage);
 }
 
 void MemDetailReporter::report_detail() {
@@ -332,13 +337,16 @@ int MemDetailReporter::report_malloc_sites() {
       continue;
     }
     const NativeCallStack* stack = malloc_site->call_stack();
-    stack->print_on(out);
-    out->print("%29s", " ");
+    _stackprinter.print_stack(stack);
     MEMFLAGS flag = malloc_site->flag();
     assert(NMTUtil::flag_is_valid(flag) && flag != mtNone,
       "Must have a valid memory type");
-    print_malloc(malloc_site->counter(), flag);
-    out->print_cr("\n");
+    INDENT_BY(29,
+      out->print("(");
+      print_malloc(malloc_site->counter(), flag);
+      out->print_cr(")");
+    )
+    out->cr();
   }
   return num_omitted;
 }
@@ -350,6 +358,7 @@ int MemDetailReporter::report_virtual_memory_allocation_sites()  {
   if (virtual_memory_itr.is_empty()) return 0;
 
   outputStream* out = output();
+
   const VirtualMemoryAllocationSite*  virtual_memory_site;
   int num_omitted = 0;
   while ((virtual_memory_site = virtual_memory_itr.next()) != nullptr) {
@@ -365,14 +374,17 @@ int MemDetailReporter::report_virtual_memory_allocation_sites()  {
       continue;
     }
     const NativeCallStack* stack = virtual_memory_site->call_stack();
-    stack->print_on(out);
-    out->print("%28s (", " ");
-    print_total(virtual_memory_site->reserved(), virtual_memory_site->committed());
-    MEMFLAGS flag = virtual_memory_site->flag();
-    if (flag != mtNone) {
-      out->print(" Type=%s", NMTUtil::flag_to_name(flag));
-    }
-    out->print_cr(")\n");
+    _stackprinter.print_stack(stack);
+    INDENT_BY(29,
+      out->print("(");
+      print_total(virtual_memory_site->reserved(), virtual_memory_site->committed());
+      const MEMFLAGS flag = virtual_memory_site->flag();
+      if (flag != mtNone) {
+        out->print(" Type=%s", NMTUtil::flag_to_name(flag));
+      }
+      out->print_cr(")");
+    )
+    out->cr();
   }
   return num_omitted;
 }
@@ -409,14 +421,14 @@ void MemDetailReporter::report_virtual_memory_region(const ReservedMemoryRegion*
   const NativeCallStack*  stack = reserved_rgn->call_stack();
   bool all_committed = reserved_rgn->size() == reserved_rgn->committed_size();
   const char* region_type = (all_committed ? "reserved and committed" : "reserved");
-  out->print_cr(" ");
+  out->cr();
   print_virtual_memory_region(region_type, reserved_rgn->base(), reserved_rgn->size());
   out->print(" for %s", NMTUtil::flag_to_name(reserved_rgn->flag()));
   if (stack->is_empty()) {
-    out->print_cr(" ");
+    out->cr();
   } else {
     out->print_cr(" from");
-    stack->print_on(out, 4);
+    INDENT_BY(4, _stackprinter.print_stack(stack);)
   }
 
   if (all_committed) {
@@ -437,20 +449,33 @@ void MemDetailReporter::report_virtual_memory_region(const ReservedMemoryRegion*
     // Don't report if size is too small
     if (amount_in_current_scale(committed_rgn->size()) == 0) continue;
     stack = committed_rgn->call_stack();
-    out->print("\n\t");
-    print_virtual_memory_region("committed", committed_rgn->base(), committed_rgn->size());
-    if (stack->is_empty()) {
-      out->print_cr(" ");
-    } else {
-      out->print_cr(" from");
-      stack->print_on(out, 12);
-    }
+    out->cr();
+    INDENT_BY(8,
+      print_virtual_memory_region("committed", committed_rgn->base(), committed_rgn->size());
+      if (stack->is_empty()) {
+        out->cr();
+      } else {
+        out->print_cr(" from");
+        INDENT_BY(4, stack->print_on(out);)
+      }
+    )
+  }
+}
+
+void MemDetailReporter::report_memory_file_allocations() {
+  stringStream st;
+  {
+    MemoryFileTracker::Instance::Locker lock;
+    MemoryFileTracker::Instance::print_all_reports_on(&st, scale());
   }
+  output()->print_raw(st.freeze());
 }
 
 void MemSummaryDiffReporter::report_diff() {
   outputStream* out = output();
-  out->print_cr("\nNative Memory Tracking:\n");
+  out->cr();
+  out->print_cr("Native Memory Tracking:");
+  out->cr();
 
   if (scale() > 1) {
     out->print_cr("(Omitting categories weighting less than 1%s)", current_scale());
@@ -463,7 +488,8 @@ void MemSummaryDiffReporter::report_diff() {
     _current_baseline.total_committed_memory(), _early_baseline.total_reserved_memory(),
     _early_baseline.total_committed_memory());
 
-  out->print_cr("\n");
+  out->cr();
+  out->cr();
 
   // Summary diff by memory type
   for (int index = 0; index < mt_number_of_types; index ++) {
@@ -548,6 +574,7 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
 
   outputStream* out = output();
   const char* scale = current_scale();
+  constexpr int indent = 28;
 
   // Total reserved and committed memory in current baseline
   size_t current_reserved_amount  = reserved_total (current_malloc, current_vm);
@@ -581,15 +608,17 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
       diff_in_current_scale(current_reserved_amount, early_reserved_amount) != 0) {
 
     // print summary line
-    out->print("-%26s (", NMTUtil::flag_to_name(flag));
+    out->print("-%*s (", indent - 2, NMTUtil::flag_to_name(flag));
     print_virtual_memory_diff(current_reserved_amount, current_committed_amount,
       early_reserved_amount, early_committed_amount);
     out->print_cr(")");
 
+    streamIndentor si(out, indent);
+
     // detail lines
     if (flag == mtClass) {
       // report class count
-      out->print("%27s (classes #" SIZE_FORMAT "", " ", _current_baseline.class_count());
+      out->print("(classes #" SIZE_FORMAT, _current_baseline.class_count());
       const ssize_t class_count_diff =
           counter_diff(_current_baseline.class_count(), _early_baseline.class_count());
       if (class_count_diff != 0) {
@@ -597,7 +626,7 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
       }
       out->print_cr(")");
 
-      out->print("%27s (  instance classes #" SIZE_FORMAT, " ", _current_baseline.instance_class_count());
+      out->print("(  instance classes #" SIZE_FORMAT, _current_baseline.instance_class_count());
       const ssize_t instance_class_count_diff =
           counter_diff(_current_baseline.instance_class_count(), _early_baseline.instance_class_count());
       if (instance_class_count_diff != 0) {
@@ -613,14 +642,14 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
 
     } else if (flag == mtThread) {
       // report thread count
-      out->print("%27s (threads #" SIZE_FORMAT "", " ", _current_baseline.thread_count());
+      out->print("(threads #" SIZE_FORMAT, _current_baseline.thread_count());
       const ssize_t thread_count_diff = counter_diff(_current_baseline.thread_count(), _early_baseline.thread_count());
       if (thread_count_diff != 0) {
         out->print(" " SSIZE_PLUS_FORMAT, thread_count_diff);
       }
       out->print_cr(")");
 
-      out->print("%27s (stack: ", " ");
+      out->print("(stack: ");
       // report thread stack
       const VirtualMemory* current_thread_stack =
         _current_baseline.virtual_memory(mtThreadStack);
@@ -638,7 +667,7 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
     size_t early_malloc_amount   = early_malloc->malloc_size();
     if (amount_in_current_scale(current_malloc_amount) > 0 ||
         diff_in_current_scale(current_malloc_amount, early_malloc_amount) != 0) {
-      out->print("%28s(", " ");
+      out->print("(");
       print_malloc_diff(current_malloc_amount, (flag == mtChunk) ? 0 : current_malloc->malloc_count(),
         early_malloc_amount, early_malloc->malloc_count(), mtNone);
       out->print_cr(")");
@@ -647,7 +676,7 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
     // Report virtual memory
     if (amount_in_current_scale(current_vm->reserved()) > 0 ||
         diff_in_current_scale(current_vm->reserved(), early_vm->reserved()) != 0) {
-      out->print("%27s (mmap: ", " ");
+      out->print("(mmap: ");
       print_virtual_memory_diff(current_vm->reserved(), current_vm->committed(),
         early_vm->reserved(), early_vm->committed());
       out->print_cr(")");
@@ -656,7 +685,7 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
     // Report arena memory
     if (amount_in_current_scale(current_malloc->arena_size()) > 0 ||
         diff_in_current_scale(current_malloc->arena_size(), early_malloc->arena_size()) != 0) {
-      out->print("%28s(", " ");
+      out->print("(");
       print_arena_diff(current_malloc->arena_size(), current_malloc->arena_count(),
         early_malloc->arena_size(), early_malloc->arena_count());
       out->print_cr(")");
@@ -667,8 +696,8 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
       size_t current_tracking_overhead = amount_in_current_scale(_current_baseline.malloc_tracking_overhead());
       size_t early_tracking_overhead   = amount_in_current_scale(_early_baseline.malloc_tracking_overhead());
 
-      out->print("%27s (tracking overhead=" SIZE_FORMAT "%s", " ",
-        amount_in_current_scale(_current_baseline.malloc_tracking_overhead()), scale);
+      out->print("(tracking overhead=" SIZE_FORMAT "%s",
+                 amount_in_current_scale(_current_baseline.malloc_tracking_overhead()), scale);
 
       int64_t overhead_diff = diff_in_current_scale(_current_baseline.malloc_tracking_overhead(),
                                                     _early_baseline.malloc_tracking_overhead());
@@ -679,7 +708,7 @@ void MemSummaryDiffReporter::diff_summary_of_type(MEMFLAGS flag,
     } else if (flag == mtClass) {
       print_metaspace_diff(current_ms, early_ms);
     }
-    out->print_cr(" ");
+    out->cr();
   }
 }
 
@@ -697,8 +726,8 @@ void MemSummaryDiffReporter::print_metaspace_diff(const char* header,
   outputStream* out = output();
   const char* scale = current_scale();
 
-  out->print_cr("%27s: (  %s)", " ", header);
-  out->print("%27s (    ", " ");
+  out->print_cr("(  %s)", header);
+  out->print("(    ");
   print_virtual_memory_diff(current_stats.reserved(),
                             current_stats.committed(),
                             early_stats.reserved(),
@@ -713,8 +742,8 @@ void MemSummaryDiffReporter::print_metaspace_diff(const char* header,
   int64_t diff_waste = diff_in_current_scale(current_waste, early_waste);
 
   // Diff used
-  out->print("%27s (    used=" SIZE_FORMAT "%s", " ",
-    amount_in_current_scale(current_stats.used()), scale);
+  out->print("(    used=" SIZE_FORMAT "%s",
+             amount_in_current_scale(current_stats.used()), scale);
   if (diff_used != 0) {
     out->print(" " INT64_PLUS_FORMAT "%s", diff_used, scale);
   }
@@ -723,8 +752,8 @@ void MemSummaryDiffReporter::print_metaspace_diff(const char* header,
   // Diff waste
   const float waste_percentage = current_stats.committed() == 0 ? 0.0f :
                                  ((float)current_waste * 100.0f) / (float)current_stats.committed();
-  out->print("%27s (    waste=" SIZE_FORMAT "%s =%2.2f%%", " ",
-    amount_in_current_scale(current_waste), scale, waste_percentage);
+  out->print("(    waste=" SIZE_FORMAT "%s =%2.2f%%",
+             amount_in_current_scale(current_waste), scale, waste_percentage);
   if (diff_waste != 0) {
     out->print(" " INT64_PLUS_FORMAT "%s", diff_waste, scale);
   }
@@ -840,12 +869,14 @@ void MemDetailDiffReporter::diff_malloc_site(const NativeCallStack* stack, size_
       return;
   }
 
-  stack->print_on(out);
-  out->print("%28s (", " ");
-  print_malloc_diff(current_size, current_count,
-    early_size, early_count, flags);
+  _stackprinter.print_stack(stack);
+  INDENT_BY(28,
+    out->print("(");
+    print_malloc_diff(current_size, current_count, early_size, early_count, flags);
+    out->print_cr(")");
+  )
+  out->cr();
 
-  out->print_cr(")\n");
 }
 
 
@@ -873,23 +904,15 @@ void MemDetailDiffReporter::diff_virtual_memory_site(const NativeCallStack* stac
     return;
   }
 
-  stack->print_on(out);
-  out->print("%28s (mmap: ", " ");
-  print_virtual_memory_diff(current_reserved, current_committed,
-    early_reserved, early_committed);
-
-  if (flag != mtNone) {
-    out->print(" Type=%s", NMTUtil::flag_to_name(flag));
-  }
-
-  out->print_cr(")\n");
+  _stackprinter.print_stack(stack);
+  INDENT_BY(28,
+    out->print("(mmap: ");
+    print_virtual_memory_diff(current_reserved, current_committed, early_reserved, early_committed);
+    if (flag != mtNone) {
+      out->print(" Type=%s", NMTUtil::flag_to_name(flag));
+    }
+    out->print_cr(")");
+  )
+  out->cr();
 }
 
-void MemDetailReporter::report_memory_file_allocations() {
-  stringStream st;
-  {
-    MemoryFileTracker::Instance::Locker lock;
-    MemoryFileTracker::Instance::print_all_reports_on(&st, scale());
-  }
-  output()->print_raw(st.freeze());
-}
diff --git a/src/hotspot/share/nmt/memReporter.hpp b/src/hotspot/share/nmt/memReporter.hpp
index 9355704531c..095c0550939 100644
--- a/src/hotspot/share/nmt/memReporter.hpp
+++ b/src/hotspot/share/nmt/memReporter.hpp
@@ -28,8 +28,10 @@
 #include "memory/metaspace.hpp"
 #include "nmt/mallocTracker.hpp"
 #include "nmt/memBaseline.hpp"
+#include "nmt/nativeCallStackPrinter.hpp"
 #include "nmt/nmtCommon.hpp"
 #include "nmt/virtualMemoryTracker.hpp"
+#include "utilities/nativeCallStack.hpp"
 
 /*
  * Base class that provides helpers
@@ -38,15 +40,14 @@ class MemReporterBase : public StackObj {
  private:
   const size_t  _scale;         // report in this scale
   outputStream* const _output;  // destination
+  StreamAutoIndentor _auto_indentor;
 
  public:
 
   // Default scale to use if no scale given.
   static const size_t default_scale = K;
 
-  MemReporterBase(outputStream* out, size_t scale = default_scale) :
-    _scale(scale), _output(out)
-  {}
+  MemReporterBase(outputStream* out, size_t scale = default_scale);
 
   // Helper functions
   // Calculate total reserved and committed amount
@@ -109,10 +110,7 @@ class MemReporterBase : public StackObj {
   void print_total(size_t reserved, size_t committed, size_t peak = 0) const;
   void print_malloc(const MemoryCounter* c, MEMFLAGS flag = mtNone) const;
   void print_virtual_memory(size_t reserved, size_t committed, size_t peak) const;
-
-  void print_malloc_line(const MemoryCounter* c) const;
-  void print_virtual_memory_line(size_t reserved, size_t committed, size_t peak) const;
-  void print_arena_line(const MemoryCounter* c) const;
+  void print_arena(const MemoryCounter* c) const;
 
   void print_virtual_memory_region(const char* type, address base, size_t size) const;
 };
@@ -153,11 +151,11 @@ class MemSummaryReporter : public MemReporterBase {
 class MemDetailReporter : public MemSummaryReporter {
  private:
   MemBaseline&   _baseline;
-
+  NativeCallStackPrinter _stackprinter;
  public:
   MemDetailReporter(MemBaseline& baseline, outputStream* output, size_t scale = default_scale) :
     MemSummaryReporter(baseline, output, scale),
-     _baseline(baseline) { }
+     _baseline(baseline), _stackprinter(output) { }
 
   // Generate detail report.
   // The report contains summary and detail sections.
@@ -233,10 +231,12 @@ class MemSummaryDiffReporter : public MemReporterBase {
  * both baselines have to be detail baseline.
  */
 class MemDetailDiffReporter : public MemSummaryDiffReporter {
+  NativeCallStackPrinter _stackprinter;
  public:
   MemDetailDiffReporter(MemBaseline& early_baseline, MemBaseline& current_baseline,
     outputStream* output, size_t scale = default_scale) :
-    MemSummaryDiffReporter(early_baseline, current_baseline, output, scale) { }
+    MemSummaryDiffReporter(early_baseline, current_baseline, output, scale),
+    _stackprinter(output) { }
 
   // Generate detail comparison report
   virtual void report_diff();
diff --git a/src/hotspot/share/nmt/memoryFileTracker.cpp b/src/hotspot/share/nmt/memoryFileTracker.cpp
index a92f8e9f538..25f2667e5c3 100644
--- a/src/hotspot/share/nmt/memoryFileTracker.cpp
+++ b/src/hotspot/share/nmt/memoryFileTracker.cpp
@@ -92,7 +92,10 @@ void MemoryFileTracker::print_report_on(const MemoryFile* file, outputStream* st
                        NMTUtil::amount_in_scale(end_addr - start_addr, scale),
                        NMTUtil::scale_name(scale),
                        NMTUtil::flag_to_name(prev->val().out.flag()));
-      _stack_storage.get(prev->val().out.stack()).print_on(stream, 4);
+      {
+        streamIndentor si(stream, 4);
+        _stack_storage.get(prev->val().out.stack()).print_on(stream);
+      }
       stream->cr();
     }
     prev = current;
diff --git a/src/hotspot/share/nmt/memoryFileTracker.hpp b/src/hotspot/share/nmt/memoryFileTracker.hpp
index f662893af0a..432b6f9d99e 100644
--- a/src/hotspot/share/nmt/memoryFileTracker.hpp
+++ b/src/hotspot/share/nmt/memoryFileTracker.hpp
@@ -40,7 +40,7 @@
 // storage with its own memory space separate from the process.
 // A typical example of such a file is a memory mapped file.
 class MemoryFileTracker {
-  friend class MemoryFileTrackerTest;
+  friend class NMTMemoryFileTrackerTest;
 
   // Provide caching of stacks.
   NativeCallStackStorage _stack_storage;
@@ -48,7 +48,7 @@ class MemoryFileTracker {
 public:
   class MemoryFile : public CHeapObj<mtNMT> {
     friend MemoryFileTracker;
-    friend class MemoryFileTrackerTest;
+    friend class NMTMemoryFileTrackerTest;
     const char* _descriptive_name;
     VirtualMemorySnapshot _summary;
     VMATree _tree;
diff --git a/src/hotspot/share/nmt/nativeCallStackPrinter.cpp b/src/hotspot/share/nmt/nativeCallStackPrinter.cpp
new file mode 100644
index 00000000000..70031698a7d
--- /dev/null
+++ b/src/hotspot/share/nmt/nativeCallStackPrinter.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc. All rights reserved.
+ * Copyright (c) 2024, 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "logging/log.hpp"
+#include "nmt/nativeCallStackPrinter.hpp"
+#include "utilities/globalDefinitions.hpp"
+#include "utilities/nativeCallStack.hpp"
+#include "utilities/ostream.hpp"
+
+NativeCallStackPrinter::NativeCallStackPrinter(outputStream* out) :
+    _text_storage(mtNMT, Arena::Tag::tag_other, 128 * K), _out(out)
+{}
+
+void NativeCallStackPrinter::print_stack(const NativeCallStack* stack) const {
+  for (int i = 0; i < NMT_TrackingStackDepth; i++) {
+    const address pc = stack->get_frame(i);
+    if (pc == nullptr) {
+      break;
+    }
+    bool created = false;
+    const char** cached_frame_text = _cache.put_if_absent(pc, &created);
+    if (created) {
+      stringStream ss(4 * K);
+      stack->print_frame(&ss, pc);
+      const size_t len = ss.size();
+      char* store = NEW_ARENA_ARRAY(&_text_storage, char, len + 1);
+      memcpy(store, ss.base(), len + 1);
+      (*cached_frame_text) = store;
+    }
+    _out->print_raw_cr(*cached_frame_text);
+  }
+}
diff --git a/src/hotspot/share/nmt/nativeCallStackPrinter.hpp b/src/hotspot/share/nmt/nativeCallStackPrinter.hpp
new file mode 100644
index 00000000000..deebb338626
--- /dev/null
+++ b/src/hotspot/share/nmt/nativeCallStackPrinter.hpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc. All rights reserved.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_NMT_NATIVECALLSTACKPRINTER_HPP
+#define SHARE_NMT_NATIVECALLSTACKPRINTER_HPP
+
+#include "memory/arena.hpp"
+#include "nmt/memflags.hpp"
+#include "utilities/globalDefinitions.hpp"
+#include "utilities/resourceHash.hpp"
+
+class outputStream;
+class NativeCallStack;
+
+// This is a text cache for NativeCallStack frames by PC. When printing tons of
+// NativeCallStack instances (e.g. during NMT detail reports), printing through
+// this printer speeds up frame description resolution by quite a bit.
+class NativeCallStackPrinter {
+  // Cache-related data are mutable to be able to use NativeCallStackPrinter as
+  // inline member in classes with const printing methods.
+  mutable Arena _text_storage;
+  mutable ResourceHashtable<address, const char*, 293, AnyObj::C_HEAP, mtNMT> _cache;
+  outputStream* const _out;
+public:
+  NativeCallStackPrinter(outputStream* out);
+  void print_stack(const NativeCallStack* stack) const;
+};
+
+#endif // SHARE_NMT_NATIVECALLSTACKPRINTER_HPP
diff --git a/src/hotspot/share/nmt/nmtNativeCallStackStorage.cpp b/src/hotspot/share/nmt/nmtNativeCallStackStorage.cpp
new file mode 100644
index 00000000000..fd7a67a358e
--- /dev/null
+++ b/src/hotspot/share/nmt/nmtNativeCallStackStorage.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2024, 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "memory/allocation.hpp"
+#include "nmt/nmtNativeCallStackStorage.hpp"
+
+NativeCallStackStorage::StackIndex NativeCallStackStorage::put(const NativeCallStack& value) {
+  int bucket = value.calculate_hash() % _table_size;
+  TableEntryIndex link = _table[bucket];
+  while (link != TableEntryStorage::nil) {
+    TableEntry& l = _entry_storage.at(link);
+    if (value.equals(get(l.stack))) {
+      return l.stack;
+    }
+    link = l.next;
+  }
+  int idx = _stacks.append(value);
+  StackIndex si{idx};
+  TableEntryIndex new_link = _entry_storage.allocate(_table[bucket], si);
+  _table[bucket] = new_link;
+  return si;
+}
+NativeCallStackStorage::NativeCallStackStorage(bool is_detailed_mode, int table_size)
+  : _table_size(table_size),
+    _table(nullptr),
+    _stacks(),
+    _is_detailed_mode(is_detailed_mode),
+    _fake_stack() {
+  if (_is_detailed_mode) {
+    _table = NEW_C_HEAP_ARRAY(TableEntryIndex, _table_size, mtNMT);
+    for (int i = 0; i < _table_size; i++) {
+      _table[i] = TableEntryStorage::nil;
+    }
+  }
+}
+NativeCallStackStorage::~NativeCallStackStorage() {
+  FREE_C_HEAP_ARRAY(LinkPtr, _table);
+}
diff --git a/src/hotspot/share/nmt/nmtNativeCallStackStorage.hpp b/src/hotspot/share/nmt/nmtNativeCallStackStorage.hpp
index 5f05e0c9304..1b09002028e 100644
--- a/src/hotspot/share/nmt/nmtNativeCallStackStorage.hpp
+++ b/src/hotspot/share/nmt/nmtNativeCallStackStorage.hpp
@@ -25,8 +25,7 @@
 #ifndef SHARE_NMT_NMTNATIVECALLSTACKSTORAGE_HPP
 #define SHARE_NMT_NMTNATIVECALLSTACKSTORAGE_HPP
 
-#include "memory/allocation.hpp"
-#include "memory/arena.hpp"
+#include "nmt/arrayWithFreeList.hpp"
 #include "utilities/growableArray.hpp"
 #include "utilities/nativeCallStack.hpp"
 
@@ -40,64 +39,41 @@
 // - Have fast comparisons
 // - Have constant time access
 // We achieve this by using a closed hashtable for finding previously existing NCS:s and referring to them by an index that's smaller than a pointer.
-class NativeCallStackStorage : public CHeapObj<mtNMT> {
+class NativeCallStackStorage : public CHeapObjBase {
 public:
   struct StackIndex {
     friend NativeCallStackStorage;
-
-  private:
-    static constexpr const int32_t _invalid = -1;
-
     int32_t _stack_index;
-    StackIndex(int32_t stack_index)
-      : _stack_index(stack_index) {
-    }
-
   public:
+    static constexpr const int32_t invalid = -1;
     static bool equals(const StackIndex& a, const StackIndex& b) {
       return a._stack_index == b._stack_index;
     }
 
     bool is_invalid() {
-      return _stack_index == _invalid;
-    }
-
-    StackIndex()
-      : _stack_index(_invalid) {
+      return _stack_index == invalid;
     }
   };
 
 private:
-  struct Link : public ArenaObj {
-    Link* next;
+  struct TableEntry;
+  using TableEntryStorage = ArrayWithFreeList<TableEntry, mtNMT>;
+  using TableEntryIndex = typename TableEntryStorage::I;
+
+  TableEntryStorage _entry_storage;
+
+  struct TableEntry {
+    TableEntryIndex next;
     StackIndex stack;
-    Link(Link* next, StackIndex v)
-      : next(next),
-        stack(v) {
-    }
   };
-  StackIndex put(const NativeCallStack& value) {
-    int bucket = value.calculate_hash() % _table_size;
-    Link* link = _table[bucket];
-    while (link != nullptr) {
-      if (value.equals(get(link->stack))) {
-        return link->stack;
-      }
-      link = link->next;
-    }
-    int idx = _stacks.append(value);
-    Link* new_link = new (&_arena) Link(_table[bucket], StackIndex(idx));
-    _table[bucket] = new_link;
-    return new_link->stack;
-  }
 
-  // For storage of the Links
-  Arena _arena;
+  StackIndex put(const NativeCallStack& value);
+
   // Pick a prime number of buckets.
   // 4099 gives a 50% probability of collisions at 76 stacks (as per birthday problem).
   static const constexpr int default_table_size = 4099;
-  int _table_size;
-  Link** _table;
+  const int _table_size;
+  TableEntryIndex* _table;
   GrowableArrayCHeap<NativeCallStack, mtNMT> _stacks;
   const bool _is_detailed_mode;
 
@@ -107,7 +83,7 @@ class NativeCallStackStorage : public CHeapObj<mtNMT> {
   StackIndex push(const NativeCallStack& stack) {
     // Not in detailed mode, so not tracking stacks.
     if (!_is_detailed_mode) {
-      return StackIndex();
+      return StackIndex{StackIndex::invalid};
     }
     return put(stack);
   }
@@ -119,16 +95,9 @@ class NativeCallStackStorage : public CHeapObj<mtNMT> {
     return _stacks.at(si._stack_index);
   }
 
-  NativeCallStackStorage(bool is_detailed_mode, int table_size = default_table_size)
-  : _arena(mtNMT), _table_size(table_size), _table(nullptr), _stacks(),
-    _is_detailed_mode(is_detailed_mode), _fake_stack() {
-    if (_is_detailed_mode) {
-      _table = NEW_ARENA_ARRAY(&_arena, Link*, _table_size);
-      for (int i = 0; i < _table_size; i++) {
-        _table[i] = nullptr;
-      }
-    }
-  }
+  NativeCallStackStorage(bool is_detailed_mode, int table_size = default_table_size);
+
+  ~NativeCallStackStorage();
 };
 
 #endif // SHARE_NMT_NMTNATIVECALLSTACKSTORAGE_HPP
diff --git a/src/hotspot/share/nmt/nmtTreap.hpp b/src/hotspot/share/nmt/nmtTreap.hpp
index 97a5cddcb81..70063497439 100644
--- a/src/hotspot/share/nmt/nmtTreap.hpp
+++ b/src/hotspot/share/nmt/nmtTreap.hpp
@@ -25,13 +25,12 @@
 #ifndef SHARE_NMT_NMTTREAP_HPP
 #define SHARE_NMT_NMTTREAP_HPP
 
-#include "memory/allocation.hpp"
 #include "runtime/os.hpp"
 #include "utilities/debug.hpp"
 #include "utilities/globalDefinitions.hpp"
 #include "utilities/growableArray.hpp"
 #include "utilities/macros.hpp"
-#include <stdint.h>
+#include "utilities/powerOfTwo.hpp"
 
 // A Treap is a self-balanced binary tree where each node is equipped with a
 // priority. It adds the invariant that the priority of a parent P is strictly larger
@@ -53,8 +52,8 @@
 
 template<typename K, typename V, typename COMPARATOR, typename ALLOCATOR>
 class Treap {
-  friend class VMATreeTest;
-  friend class TreapTest;
+  friend class NMTVMATreeTest;
+  friend class NMTTreapTest;
 public:
   class TreapNode {
     friend Treap;
@@ -84,16 +83,16 @@ class Treap {
 private:
   ALLOCATOR _allocator;
   TreapNode* _root;
+
+  // A random number
+  static constexpr const uint64_t _initial_seed = 0xC8DD2114AE0543A3;
   uint64_t _prng_seed;
   int _node_count;
 
   uint64_t prng_next() {
-    // Taken directly off of JFRPrng
-    static const constexpr uint64_t PrngMult = 0x5DEECE66DLL;
-    static const constexpr uint64_t PrngAdd = 0xB;
-    static const constexpr uint64_t PrngModPower = 48;
-    static const constexpr uint64_t PrngModMask = (static_cast<uint64_t>(1) << PrngModPower) - 1;
-    _prng_seed = (PrngMult * _prng_seed + PrngAdd) & PrngModMask;
+    uint64_t first_half = os::next_random(_prng_seed);
+    uint64_t second_half = os::next_random(_prng_seed >> 32);
+    _prng_seed = first_half | (second_half << 32);
     return _prng_seed;
   }
 
@@ -173,9 +172,9 @@ class Treap {
 #ifdef ASSERT
   void verify_self() {
     // A balanced binary search tree should have a depth on the order of log(N).
-    // We take the ceiling of log_2(N + 1) * 2.5 as our maximum bound.
+    // We take the ceiling of log_2(N + 1) * 3 as our maximum bound.
     // For comparison, a RB-tree has a proven max depth of log_2(N + 1) * 2.
-    const int expected_maximum_depth = ceil((log(this->_node_count+1) / log(2)) * 2.5);
+    const int expected_maximum_depth = ceil(log2i(this->_node_count+1) * 3);
     // Find the maximum depth through DFS and ensure that the priority invariant holds.
     int maximum_depth_found = 0;
 
@@ -225,11 +224,10 @@ class Treap {
 public:
   NONCOPYABLE(Treap);
 
-  Treap(uint64_t seed = static_cast<uint64_t>(os::random())
-                        | (static_cast<uint64_t>(os::random()) << 32))
+  Treap()
   : _allocator(),
     _root(nullptr),
-    _prng_seed(seed),
+    _prng_seed(_initial_seed),
     _node_count(0) {}
 
   ~Treap() {
diff --git a/src/hotspot/share/nmt/virtualMemoryTracker.cpp b/src/hotspot/share/nmt/virtualMemoryTracker.cpp
index 46d7e4b644f..d25f3689a42 100644
--- a/src/hotspot/share/nmt/virtualMemoryTracker.cpp
+++ b/src/hotspot/share/nmt/virtualMemoryTracker.cpp
@@ -26,6 +26,7 @@
 #include "memory/metaspaceStats.hpp"
 #include "memory/metaspaceUtils.hpp"
 #include "nmt/memTracker.hpp"
+#include "nmt/nativeCallStackPrinter.hpp"
 #include "nmt/threadStackTracker.hpp"
 #include "nmt/virtualMemoryTracker.hpp"
 #include "runtime/os.hpp"
@@ -679,16 +680,17 @@ class PrintRegionWalker : public VirtualMemoryWalker {
 private:
   const address               _p;
   outputStream*               _st;
+  NativeCallStackPrinter      _stackprinter;
 public:
   PrintRegionWalker(const void* p, outputStream* st) :
-    _p((address)p), _st(st) { }
+    _p((address)p), _st(st), _stackprinter(st) { }
 
   bool do_allocation_site(const ReservedMemoryRegion* rgn) {
     if (rgn->contain_address(_p)) {
       _st->print_cr(PTR_FORMAT " in mmap'd memory region [" PTR_FORMAT " - " PTR_FORMAT "], tag %s",
         p2i(_p), p2i(rgn->base()), p2i(rgn->base() + rgn->size()), NMTUtil::flag_to_enum_name(rgn->flag()));
       if (MemTracker::tracking_level() == NMT_detail) {
-        rgn->call_stack()->print_on(_st);
+        _stackprinter.print_stack(rgn->call_stack());
         _st->cr();
       }
       return false;
diff --git a/src/hotspot/share/nmt/vmatree.hpp b/src/hotspot/share/nmt/vmatree.hpp
index b8946b3b8c1..a93c282f4d2 100644
--- a/src/hotspot/share/nmt/vmatree.hpp
+++ b/src/hotspot/share/nmt/vmatree.hpp
@@ -38,7 +38,7 @@
 // or from committed memory of a certain MEMFLAGS to committed memory of a different MEMFLAGS.
 // The set of points is stored in a balanced binary tree for efficient querying and updating.
 class VMATree {
-  friend class VMATreeTest;
+  friend class NMTVMATreeTest;
   // A position in memory.
 public:
   using position = size_t;
diff --git a/src/hotspot/share/oops/constantPool.cpp b/src/hotspot/share/oops/constantPool.cpp
index 85cc5a77f1e..35a1d95b6e6 100644
--- a/src/hotspot/share/oops/constantPool.cpp
+++ b/src/hotspot/share/oops/constantPool.cpp
@@ -29,6 +29,7 @@
 #include "cds/cdsConfig.hpp"
 #include "cds/classPrelinker.hpp"
 #include "cds/heapShared.hpp"
+#include "classfile/classLoader.hpp"
 #include "classfile/classLoaderData.hpp"
 #include "classfile/javaClasses.inline.hpp"
 #include "classfile/metadataOnStackMark.hpp"
@@ -62,7 +63,8 @@
 #include "runtime/handles.inline.hpp"
 #include "runtime/init.hpp"
 #include "runtime/javaCalls.hpp"
-#include "runtime/javaThread.hpp"
+#include "runtime/javaThread.inline.hpp"
+#include "runtime/perfData.hpp"
 #include "runtime/signature.hpp"
 #include "runtime/vframe.inline.hpp"
 #include "utilities/checkedCast.hpp"
@@ -298,20 +300,22 @@ objArrayOop ConstantPool::prepare_resolved_references_for_archiving() {
 
   objArrayOop rr = resolved_references();
   if (rr != nullptr) {
-    ConstantPool* orig_pool = ArchiveBuilder::current()->get_source_addr(this);
-    objArrayOop scratch_rr = HeapShared::scratch_resolved_references(orig_pool);
+    int rr_len = rr->length();
+    ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this);
+    objArrayOop scratch_rr = HeapShared::scratch_resolved_references(src_cp);
     Array<u2>* ref_map = reference_map();
     int ref_map_len = ref_map == nullptr ? 0 : ref_map->length();
-    int rr_len = rr->length();
     for (int i = 0; i < rr_len; i++) {
       oop obj = rr->obj_at(i);
       scratch_rr->obj_at_put(i, nullptr);
-      if (obj != nullptr && i < ref_map_len) {
-        int index = object_to_cp_index(i);
-        if (tag_at(index).is_string()) {
-          assert(java_lang_String::is_instance(obj), "must be");
-          if (!ArchiveHeapWriter::is_string_too_large_to_archive(obj)) {
-            scratch_rr->obj_at_put(i, obj);
+      if (obj != nullptr) {
+        if (i < ref_map_len) {
+          int index = object_to_cp_index(i);
+          if (tag_at(index).is_string()) {
+            assert(java_lang_String::is_instance(obj), "must be");
+            if (!ArchiveHeapWriter::is_string_too_large_to_archive(obj)) {
+              scratch_rr->obj_at_put(i, obj);
+            }
           }
         }
       }
@@ -384,23 +388,61 @@ void ConstantPool::remove_unshareable_info() {
   // we always set _on_stack to true to avoid having to change _flags during runtime.
   _flags |= (_on_stack | _is_shared);
 
-  if (!_pool_holder->is_linked() && !_pool_holder->verified_at_dump_time()) {
-    return;
+  // resolved_references(): remember its length. If it cannot be restored
+  // from the archived heap objects at run time, we need to dynamically allocate it.
+  if (cache() != nullptr) {
+    set_resolved_reference_length(
+        resolved_references() != nullptr ? resolved_references()->length() : 0);
+    set_resolved_references(OopHandle());
+  }
+  remove_unshareable_entries();
+}
+
+static const char* get_type(Klass* k) {
+  const char* type;
+  Klass* src_k;
+  if (ArchiveBuilder::is_active() && ArchiveBuilder::current()->is_in_buffer_space(k)) {
+    src_k = ArchiveBuilder::current()->get_source_addr(k);
+  } else {
+    src_k = k;
+  }
+
+  if (src_k->is_objArray_klass()) {
+    src_k = ObjArrayKlass::cast(src_k)->bottom_klass();
+    assert(!src_k->is_objArray_klass(), "sanity");
+  }
+
+  if (src_k->is_typeArray_klass()) {
+    type = "prim";
+  } else {
+    InstanceKlass* src_ik = InstanceKlass::cast(src_k);
+    oop loader = src_ik->class_loader();
+    if (loader == nullptr) {
+      type = "boot";
+    } else if (loader == SystemDictionary::java_platform_loader()) {
+      type = "plat";
+    } else if (loader == SystemDictionary::java_system_loader()) {
+      type = "app";
+    } else {
+      type = "unreg";
+    }
   }
-  // Resolved references are not in the shared archive.
-  // Save the length for restoration.  It is not necessarily the same length
-  // as reference_map.length() if invokedynamic is saved. It is needed when
-  // re-creating the resolved reference array if archived heap data cannot be map
-  // at runtime.
-  set_resolved_reference_length(
-    resolved_references() != nullptr ? resolved_references()->length() : 0);
-  set_resolved_references(OopHandle());
 
-  bool archived = false;
+  return type;
+}
+
+void ConstantPool::remove_unshareable_entries() {
+  ResourceMark rm;
+  log_info(cds, resolve)("Archiving CP entries for %s", pool_holder()->name()->as_C_string());
   for (int cp_index = 1; cp_index < length(); cp_index++) { // cp_index 0 is unused
-    switch (tag_at(cp_index).value()) {
+    int cp_tag = tag_at(cp_index).value();
+    switch (cp_tag) {
+    case JVM_CONSTANT_UnresolvedClass:
+      ArchiveBuilder::alloc_stats()->record_klass_cp_entry(false, false);
+      break;
     case JVM_CONSTANT_UnresolvedClassInError:
       tag_at_put(cp_index, JVM_CONSTANT_UnresolvedClass);
+      ArchiveBuilder::alloc_stats()->record_klass_cp_entry(false, true);
       break;
     case JVM_CONSTANT_MethodHandleInError:
       tag_at_put(cp_index, JVM_CONSTANT_MethodHandle);
@@ -412,8 +454,9 @@ void ConstantPool::remove_unshareable_info() {
       tag_at_put(cp_index, JVM_CONSTANT_Dynamic);
       break;
     case JVM_CONSTANT_Class:
-      archived = maybe_archive_resolved_klass_at(cp_index);
-      ArchiveBuilder::alloc_stats()->record_klass_cp_entry(archived);
+      remove_resolved_klass_if_non_deterministic(cp_index);
+      break;
+    default:
       break;
     }
   }
@@ -424,40 +467,46 @@ void ConstantPool::remove_unshareable_info() {
   }
 }
 
-bool ConstantPool::maybe_archive_resolved_klass_at(int cp_index) {
+void ConstantPool::remove_resolved_klass_if_non_deterministic(int cp_index) {
   assert(ArchiveBuilder::current()->is_in_buffer_space(this), "must be");
   assert(tag_at(cp_index).is_klass(), "must be resolved");
 
-  if (pool_holder()->is_hidden() && cp_index == pool_holder()->this_class_index()) {
-    // All references to a hidden class's own field/methods are through this
-    // index, which was resolved in ClassFileParser::fill_instance_klass. We
-    // must preserve it.
-    return true;
+  Klass* k = resolved_klass_at(cp_index);
+  bool can_archive;
+
+  if (k == nullptr) {
+    // We'd come here if the referenced class has been excluded via
+    // SystemDictionaryShared::is_excluded_class(). As a result, ArchiveBuilder
+    // has cleared the resolved_klasses()->at(...) pointer to NULL. Thus, we
+    // need to revert the tag to JVM_CONSTANT_UnresolvedClass.
+    can_archive = false;
+  } else {
+    ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this);
+    can_archive = ClassPrelinker::is_resolution_deterministic(src_cp, cp_index);
   }
 
-  CPKlassSlot kslot = klass_slot_at(cp_index);
-  int resolved_klass_index = kslot.resolved_klass_index();
-  Klass* k = resolved_klasses()->at(resolved_klass_index);
-  // k could be null if the referenced class has been excluded via
-  // SystemDictionaryShared::is_excluded_class().
+  if (!can_archive) {
+    int resolved_klass_index = klass_slot_at(cp_index).resolved_klass_index();
+    resolved_klasses()->at_put(resolved_klass_index, nullptr);
+    tag_at_put(cp_index, JVM_CONSTANT_UnresolvedClass);
+  }
 
-  if (k != nullptr) {
-    ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this);
-    if (ClassPrelinker::can_archive_resolved_klass(src_cp, cp_index)) {
-      if (log_is_enabled(Debug, cds, resolve)) {
-        ResourceMark rm;
-        log_debug(cds, resolve)("Resolved klass CP entry [%d]: %s => %s", cp_index,
-                                pool_holder()->external_name(), k->external_name());
-      }
-      return true;
+  LogStreamHandle(Trace, cds, resolve) log;
+  if (log.is_enabled()) {
+    ResourceMark rm;
+    log.print("%s klass  CP entry [%3d]: %s %s",
+              (can_archive ? "archived" : "reverted"),
+              cp_index, pool_holder()->name()->as_C_string(), get_type(pool_holder()));
+    if (can_archive) {
+      log.print(" => %s %s%s", k->name()->as_C_string(), get_type(k),
+                (!k->is_instance_klass() || pool_holder()->is_subtype_of(k)) ? "" : " (not supertype)");
+    } else {
+      Symbol* name = klass_name_at(cp_index);
+      log.print("    %s", name->as_C_string());
     }
   }
 
-  // This referenced class cannot be archived. Revert the tag to UnresolvedClass,
-  // so that the proper class loading and initialization can happen at runtime.
-  resolved_klasses()->at_put(resolved_klass_index, nullptr);
-  tag_at_put(cp_index, JVM_CONSTANT_UnresolvedClass);
-  return false;
+  ArchiveBuilder::alloc_stats()->record_klass_cp_entry(can_archive, /*reverted=*/!can_archive);
 }
 #endif // INCLUDE_CDS
 
@@ -705,6 +754,31 @@ int ConstantPool::to_cp_index(int index, Bytecodes::Code code) {
   }
 }
 
+bool ConstantPool::is_resolved(int index, Bytecodes::Code code) {
+  assert(cache() != nullptr, "'index' is a rewritten index so this class must have been rewritten");
+  switch(code) {
+    case Bytecodes::_invokedynamic:
+      return resolved_indy_entry_at(index)->is_resolved();
+
+    case Bytecodes::_getfield:
+    case Bytecodes::_getstatic:
+    case Bytecodes::_putfield:
+    case Bytecodes::_putstatic:
+      return resolved_field_entry_at(index)->is_resolved(code);
+
+    case Bytecodes::_invokeinterface:
+    case Bytecodes::_invokehandle:
+    case Bytecodes::_invokespecial:
+    case Bytecodes::_invokestatic:
+    case Bytecodes::_invokevirtual:
+    case Bytecodes::_fast_invokevfinal: // Bytecode interpreter uses this
+      return resolved_method_entry_at(index)->is_resolved(code);
+
+    default:
+      fatal("Unexpected bytecode: %s", Bytecodes::name(code));
+  }
+}
+
 u2 ConstantPool::uncached_name_and_type_ref_index_at(int cp_index)  {
   if (tag_at(cp_index).has_bootstrap()) {
     u2 pool_index = bootstrap_name_and_type_ref_index_at(cp_index);
@@ -1014,7 +1088,9 @@ oop ConstantPool::resolve_constant_at_impl(const constantPoolHandle& this_cp,
     }
 
   case JVM_CONSTANT_Dynamic:
-    {
+    { PerfTraceTimedEvent timer(ClassLoader::perf_resolve_invokedynamic_time(),
+                                ClassLoader::perf_resolve_invokedynamic_count());
+
       // Resolve the Dynamically-Computed constant to invoke the BSM in order to obtain the resulting oop.
       BootstrapInfo bootstrap_specifier(this_cp, cp_index);
 
@@ -1072,7 +1148,9 @@ oop ConstantPool::resolve_constant_at_impl(const constantPoolHandle& this_cp,
     break;
 
   case JVM_CONSTANT_MethodHandle:
-    {
+    { PerfTraceTimedEvent timer(ClassLoader::perf_resolve_method_handle_time(),
+                                ClassLoader::perf_resolve_method_handle_count());
+
       int ref_kind                 = this_cp->method_handle_ref_kind_at(cp_index);
       int callee_index             = this_cp->method_handle_klass_index_at(cp_index);
       Symbol*  name =      this_cp->method_handle_name_ref_at(cp_index);
@@ -1120,7 +1198,9 @@ oop ConstantPool::resolve_constant_at_impl(const constantPoolHandle& this_cp,
     }
 
   case JVM_CONSTANT_MethodType:
-    {
+    { PerfTraceTimedEvent timer(ClassLoader::perf_resolve_method_type_time(),
+                                ClassLoader::perf_resolve_method_type_count());
+
       Symbol*  signature = this_cp->method_type_signature_at(cp_index);
       { ResourceMark rm(THREAD);
         log_debug(class, resolve)("resolve JVM_CONSTANT_MethodType [%d/%d] %s",
diff --git a/src/hotspot/share/oops/constantPool.hpp b/src/hotspot/share/oops/constantPool.hpp
index e48229749f3..7a17c62ddaf 100644
--- a/src/hotspot/share/oops/constantPool.hpp
+++ b/src/hotspot/share/oops/constantPool.hpp
@@ -661,6 +661,8 @@ class ConstantPool : public Metadata {
 
   int to_cp_index(int which, Bytecodes::Code code);
 
+  bool is_resolved(int which, Bytecodes::Code code);
+
   // Lookup for entries consisting of (name_index, signature_index)
   u2 name_ref_index_at(int cp_index);            // ==  low-order jshort of name_and_type_at(cp_index)
   u2 signature_ref_index_at(int cp_index);       // == high-order jshort of name_and_type_at(cp_index)
@@ -677,9 +679,11 @@ class ConstantPool : public Metadata {
   // CDS support
   objArrayOop prepare_resolved_references_for_archiving() NOT_CDS_JAVA_HEAP_RETURN_(nullptr);
   void add_dumped_interned_strings() NOT_CDS_JAVA_HEAP_RETURN;
-  bool maybe_archive_resolved_klass_at(int cp_index);
   void remove_unshareable_info();
   void restore_unshareable_info(TRAPS);
+private:
+  void remove_unshareable_entries();
+  void remove_resolved_klass_if_non_deterministic(int cp_index);
 #endif
 
  private:
diff --git a/src/hotspot/share/oops/cpCache.cpp b/src/hotspot/share/oops/cpCache.cpp
index 03dbce19f2e..817a35959f3 100644
--- a/src/hotspot/share/oops/cpCache.cpp
+++ b/src/hotspot/share/oops/cpCache.cpp
@@ -25,6 +25,7 @@
 #include "precompiled.hpp"
 #include "cds/archiveBuilder.hpp"
 #include "cds/cdsConfig.hpp"
+#include "cds/classPrelinker.hpp"
 #include "cds/heapShared.hpp"
 #include "classfile/resolutionErrors.hpp"
 #include "classfile/systemDictionary.hpp"
@@ -45,6 +46,7 @@
 #include "oops/compressedOops.hpp"
 #include "oops/constantPool.inline.hpp"
 #include "oops/cpCache.inline.hpp"
+#include "oops/method.inline.hpp"
 #include "oops/objArrayOop.inline.hpp"
 #include "oops/oop.inline.hpp"
 #include "oops/resolvedFieldEntry.hpp"
@@ -55,6 +57,7 @@
 #include "runtime/atomic.hpp"
 #include "runtime/handles.inline.hpp"
 #include "runtime/mutexLocker.hpp"
+#include "runtime/synchronizer.hpp"
 #include "runtime/vm_version.hpp"
 #include "utilities/macros.hpp"
 
@@ -173,7 +176,7 @@ void ConstantPoolCache::set_direct_or_vtable_call(Bytecodes::Code invoke_code,
     }
     if (invoke_code == Bytecodes::_invokestatic) {
       assert(method->method_holder()->is_initialized() ||
-             method->method_holder()->is_init_thread(JavaThread::current()),
+             method->method_holder()->is_reentrant_initialization(JavaThread::current()),
              "invalid class initialization state for invoke_static");
 
       if (!VM_Version::supports_fast_class_init_checks() && method->needs_clinit_barrier()) {
@@ -268,11 +271,20 @@ ResolvedMethodEntry* ConstantPoolCache::set_method_handle(int method_index, cons
   // A losing writer waits on the lock until the winner writes the method and leaves
   // the lock, so that when the losing writer returns, he can use the linked
   // cache entry.
+
   // Lock fields to write
   Bytecodes::Code invoke_code = Bytecodes::_invokehandle;
-  MutexLocker ml(constant_pool()->pool_holder()->init_monitor());
-  ResolvedMethodEntry* method_entry = resolved_method_entry_at(method_index);
 
+  JavaThread* current = JavaThread::current();
+  objArrayHandle resolved_references(current, constant_pool()->resolved_references());
+  // Use the resolved_references() lock for this cpCache entry.
+  // resolved_references are created for all classes with Invokedynamic, MethodHandle
+  // or MethodType constant pool cache entries.
+  assert(resolved_references() != nullptr,
+         "a resolved_references array should have been created for this class");
+  ObjectLocker ol(resolved_references, current);
+
+  ResolvedMethodEntry* method_entry = resolved_method_entry_at(method_index);
   if (method_entry->is_resolved(invoke_code)) {
     return method_entry;
   }
@@ -310,7 +322,6 @@ ResolvedMethodEntry* ConstantPoolCache::set_method_handle(int method_index, cons
   // Store appendix, if any.
   if (has_appendix) {
     const int appendix_index = method_entry->resolved_references_index();
-    objArrayOop resolved_references = constant_pool()->resolved_references();
     assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob");
     assert(resolved_references->obj_at(appendix_index) == nullptr, "init just once");
     resolved_references->obj_at_put(appendix_index, appendix());
@@ -388,25 +399,144 @@ void ConstantPoolCache::record_gc_epoch() {
 #if INCLUDE_CDS
 void ConstantPoolCache::remove_unshareable_info() {
   assert(CDSConfig::is_dumping_archive(), "sanity");
-  // <this> is the copy to be written into the archive. It's in the ArchiveBuilder's "buffer space".
-  // However, this->_initial_entries was not copied/relocated by the ArchiveBuilder, so it's
-  // still pointing to the array allocated inside save_for_archive().
+
   if (_resolved_indy_entries != nullptr) {
     for (int i = 0; i < _resolved_indy_entries->length(); i++) {
       resolved_indy_entry_at(i)->remove_unshareable_info();
     }
   }
   if (_resolved_field_entries != nullptr) {
-    for (int i = 0; i < _resolved_field_entries->length(); i++) {
-      resolved_field_entry_at(i)->remove_unshareable_info();
-    }
+    remove_resolved_field_entries_if_non_deterministic();
   }
   if (_resolved_method_entries != nullptr) {
-    for (int i = 0; i < _resolved_method_entries->length(); i++) {
-      resolved_method_entry_at(i)->remove_unshareable_info();
+    remove_resolved_method_entries_if_non_deterministic();
+  }
+}
+
+void ConstantPoolCache::remove_resolved_field_entries_if_non_deterministic() {
+  ConstantPool* cp = constant_pool();
+  ConstantPool* src_cp =  ArchiveBuilder::current()->get_source_addr(cp);
+  for (int i = 0; i < _resolved_field_entries->length(); i++) {
+    ResolvedFieldEntry* rfi = _resolved_field_entries->adr_at(i);
+    int cp_index = rfi->constant_pool_index();
+    bool archived = false;
+    bool resolved = rfi->is_resolved(Bytecodes::_getfield)  ||
+                    rfi->is_resolved(Bytecodes::_putfield);
+    if (resolved && ClassPrelinker::is_resolution_deterministic(src_cp, cp_index)) {
+      rfi->mark_and_relocate();
+      archived = true;
+    } else {
+      rfi->remove_unshareable_info();
     }
+    if (resolved) {
+      LogStreamHandle(Trace, cds, resolve) log;
+      if (log.is_enabled()) {
+        ResourceMark rm;
+        int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index);
+        Symbol* klass_name = cp->klass_name_at(klass_cp_index);
+        Symbol* name = cp->uncached_name_ref_at(cp_index);
+        Symbol* signature = cp->uncached_signature_ref_at(cp_index);
+        log.print("%s field  CP entry [%3d]: %s %s %s.%s:%s",
+                  (archived ? "archived" : "reverted"),
+                  cp_index,
+                  cp->pool_holder()->name()->as_C_string(),
+                  (archived ? "=>" : "  "),
+                  klass_name->as_C_string(), name->as_C_string(), signature->as_C_string());
+      }
+    }
+    ArchiveBuilder::alloc_stats()->record_field_cp_entry(archived, resolved && !archived);
   }
 }
+
+void ConstantPoolCache::remove_resolved_method_entries_if_non_deterministic() {
+  ConstantPool* cp = constant_pool();
+  ConstantPool* src_cp =  ArchiveBuilder::current()->get_source_addr(cp);
+  for (int i = 0; i < _resolved_method_entries->length(); i++) {
+    ResolvedMethodEntry* rme = _resolved_method_entries->adr_at(i);
+    int cp_index = rme->constant_pool_index();
+    bool archived = false;
+    bool resolved = rme->is_resolved(Bytecodes::_invokevirtual)   ||
+                    rme->is_resolved(Bytecodes::_invokespecial)   ||
+                    rme->is_resolved(Bytecodes::_invokeinterface);
+
+    // Just for safety -- this should not happen, but do not archive if we ever see this.
+    resolved &= !(rme->is_resolved(Bytecodes::_invokehandle) ||
+                  rme->is_resolved(Bytecodes::_invokestatic));
+
+    if (resolved && can_archive_resolved_method(rme)) {
+      rme->mark_and_relocate(src_cp);
+      archived = true;
+    } else {
+      rme->remove_unshareable_info();
+    }
+    if (resolved) {
+      LogStreamHandle(Trace, cds, resolve) log;
+      if (log.is_enabled()) {
+        ResourceMark rm;
+        int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index);
+        Symbol* klass_name = cp->klass_name_at(klass_cp_index);
+        Symbol* name = cp->uncached_name_ref_at(cp_index);
+        Symbol* signature = cp->uncached_signature_ref_at(cp_index);
+        log.print("%s%s method CP entry [%3d]: %s %s.%s:%s",
+                  (archived ? "archived" : "reverted"),
+                  (rme->is_resolved(Bytecodes::_invokeinterface) ? " interface" : ""),
+                  cp_index,
+                  cp->pool_holder()->name()->as_C_string(),
+                  klass_name->as_C_string(), name->as_C_string(), signature->as_C_string());
+        if (archived) {
+          Klass* resolved_klass = cp->resolved_klass_at(klass_cp_index);
+          log.print(" => %s%s",
+                    resolved_klass->name()->as_C_string(),
+                    (rme->is_resolved(Bytecodes::_invokestatic) ? " *** static" : ""));
+        }
+      }
+      ArchiveBuilder::alloc_stats()->record_method_cp_entry(archived, resolved && !archived);
+    }
+  }
+}
+
+bool ConstantPoolCache::can_archive_resolved_method(ResolvedMethodEntry* method_entry) {
+  InstanceKlass* pool_holder = constant_pool()->pool_holder();
+  if (!(pool_holder->is_shared_boot_class() || pool_holder->is_shared_platform_class() ||
+        pool_holder->is_shared_app_class())) {
+    // Archiving resolved cp entries for classes from non-builtin loaders
+    // is not yet supported.
+    return false;
+  }
+
+  if (CDSConfig::is_dumping_dynamic_archive()) {
+    // InstanceKlass::methods() has been resorted. We need to
+    // update the vtable_index in method_entry (not implemented)
+    return false;
+  }
+
+  if (!method_entry->is_resolved(Bytecodes::_invokevirtual)) {
+    if (method_entry->method() == nullptr) {
+      return false;
+    }
+    if (method_entry->method()->is_continuation_native_intrinsic()) {
+      return false; // FIXME: corresponding stub is generated on demand during method resolution (see LinkResolver::resolve_static_call).
+    }
+  }
+
+  int cp_index = method_entry->constant_pool_index();
+  ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(constant_pool());
+  assert(src_cp->tag_at(cp_index).is_method() || src_cp->tag_at(cp_index).is_interface_method(), "sanity");
+
+  if (!ClassPrelinker::is_resolution_deterministic(src_cp, cp_index)) {
+    return false;
+  }
+
+  if (method_entry->is_resolved(Bytecodes::_invokeinterface) ||
+      method_entry->is_resolved(Bytecodes::_invokevirtual) ||
+      method_entry->is_resolved(Bytecodes::_invokespecial)) {
+    return true;
+  } else {
+    // invokestatic and invokehandle are not supported yet.
+    return false;
+  }
+
+}
 #endif // INCLUDE_CDS
 
 void ConstantPoolCache::deallocate_contents(ClassLoaderData* data) {
@@ -555,7 +685,14 @@ bool ConstantPoolCache::save_and_throw_indy_exc(
   assert(PENDING_EXCEPTION->is_a(vmClasses::LinkageError_klass()),
          "No LinkageError exception");
 
-  MutexLocker ml(THREAD, cpool->pool_holder()->init_monitor());
+  // Use the resolved_references() lock for this cpCache entry.
+  // resolved_references are created for all classes with Invokedynamic, MethodHandle
+  // or MethodType constant pool cache entries.
+  JavaThread* current = THREAD;
+  objArrayHandle resolved_references(current, cpool->resolved_references());
+  assert(resolved_references() != nullptr,
+         "a resolved_references array should have been created for this class");
+  ObjectLocker ol(resolved_references, current);
 
   // if the indy_info is resolved or the indy_resolution_failed flag is set then another
   // thread either succeeded in resolving the method or got a LinkageError
@@ -578,11 +715,21 @@ bool ConstantPoolCache::save_and_throw_indy_exc(
 
 oop ConstantPoolCache::set_dynamic_call(const CallInfo &call_info, int index) {
   ResourceMark rm;
-  MutexLocker ml(constant_pool()->pool_holder()->init_monitor());
+
+  // Use the resolved_references() lock for this cpCache entry.
+  // resolved_references are created for all classes with Invokedynamic, MethodHandle
+  // or MethodType constant pool cache entries.
+  JavaThread* current = JavaThread::current();
+  constantPoolHandle cp(current, constant_pool());
+
+  objArrayHandle resolved_references(current, cp->resolved_references());
+  assert(resolved_references() != nullptr,
+         "a resolved_references array should have been created for this class");
+  ObjectLocker ol(resolved_references, current);
   assert(index >= 0, "Indy index must be positive at this point");
 
   if (resolved_indy_entry_at(index)->method() != nullptr) {
-    return constant_pool()->resolved_reference_from_indy(index);
+    return cp->resolved_reference_from_indy(index);
   }
 
   if (resolved_indy_entry_at(index)->resolution_failed()) {
@@ -590,9 +737,7 @@ oop ConstantPoolCache::set_dynamic_call(const CallInfo &call_info, int index) {
     // resolution.  Ignore our success and throw their exception.
     guarantee(index >= 0, "Invalid indy index");
     int encoded_index = ResolutionErrorTable::encode_indy_index(index);
-    JavaThread* THREAD = JavaThread::current(); // For exception macros.
-    constantPoolHandle cp(THREAD, constant_pool());
-    ConstantPool::throw_resolution_error(cp, encoded_index, THREAD);
+    ConstantPool::throw_resolution_error(cp, encoded_index, current);
     return nullptr;
   }
 
@@ -616,7 +761,6 @@ oop ConstantPoolCache::set_dynamic_call(const CallInfo &call_info, int index) {
 
   if (has_appendix) {
     const int appendix_index = resolved_indy_entry_at(index)->resolved_references_index();
-    objArrayOop resolved_references = constant_pool()->resolved_references();
     assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob");
     assert(resolved_references->obj_at(appendix_index) == nullptr, "init just once");
     resolved_references->obj_at_put(appendix_index, appendix());
diff --git a/src/hotspot/share/oops/cpCache.hpp b/src/hotspot/share/oops/cpCache.hpp
index f9239835198..c741201c833 100644
--- a/src/hotspot/share/oops/cpCache.hpp
+++ b/src/hotspot/share/oops/cpCache.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -193,14 +193,12 @@ class ConstantPoolCache: public MetaspaceObj {
 
 #if INCLUDE_CDS
   void remove_unshareable_info();
-  void save_for_archive(TRAPS);
 #endif
 
  public:
   static int size() { return align_metadata_size(sizeof(ConstantPoolCache) / wordSize); }
 
  private:
-
   // Helpers
   ConstantPool**        constant_pool_addr()     { return &_constant_pool; }
 
@@ -224,6 +222,12 @@ class ConstantPoolCache: public MetaspaceObj {
   void dump_cache();
 #endif // INCLUDE_JVMTI
 
+#if INCLUDE_CDS
+  void remove_resolved_field_entries_if_non_deterministic();
+  void remove_resolved_method_entries_if_non_deterministic();
+  bool can_archive_resolved_method(ResolvedMethodEntry* method_entry);
+#endif
+
   // RedefineClasses support
   DEBUG_ONLY(bool on_stack() { return false; })
   void deallocate_contents(ClassLoaderData* data);
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
index d66ce5ce247..930f8cf1771 100644
--- a/src/hotspot/share/oops/instanceKlass.cpp
+++ b/src/hotspot/share/oops/instanceKlass.cpp
@@ -25,6 +25,7 @@
 #include "precompiled.hpp"
 #include "cds/archiveUtils.hpp"
 #include "cds/cdsConfig.hpp"
+#include "cds/cdsEnumKlass.hpp"
 #include "cds/classListWriter.hpp"
 #include "cds/heapShared.hpp"
 #include "cds/metaspaceShared.hpp"
@@ -86,6 +87,7 @@
 #include "runtime/orderAccess.hpp"
 #include "runtime/os.inline.hpp"
 #include "runtime/reflection.hpp"
+#include "runtime/synchronizer.hpp"
 #include "runtime/threads.hpp"
 #include "services/classLoadingService.hpp"
 #include "services/finalizerService.hpp"
@@ -497,9 +499,6 @@ Array<int>* InstanceKlass::create_new_default_vtable_indices(int len, TRAPS) {
   return vtable_indices;
 }
 
-static Monitor* create_init_monitor(const char* name) {
-  return new Monitor(Mutex::safepoint, name);
-}
 
 InstanceKlass::InstanceKlass() {
   assert(CDSConfig::is_dumping_static_archive() || CDSConfig::is_using_archive(), "only for CDS");
@@ -517,7 +516,6 @@ InstanceKlass::InstanceKlass(const ClassFileParser& parser, KlassKind kind, Refe
   _nest_host_index(0),
   _init_state(allocated),
   _reference_type(reference_type),
-  _init_monitor(create_init_monitor("InstanceKlassInitMonitor_lock")),
   _init_thread(nullptr)
 {
   set_vtable_length(parser.vtable_size());
@@ -745,6 +743,28 @@ objArrayOop InstanceKlass::signers() const {
   return java_lang_Class::signers(java_mirror());
 }
 
+oop InstanceKlass::init_lock() const {
+  // return the init lock from the mirror
+  oop lock = java_lang_Class::init_lock(java_mirror());
+  // Prevent reordering with any access of initialization state
+  OrderAccess::loadload();
+  assert(lock != nullptr || !is_not_initialized(), // initialized or in_error state
+         "only fully initialized state can have a null lock");
+  return lock;
+}
+
+// Set the initialization lock to null so the object can be GC'ed.  Any racing
+// threads to get this lock will see a null lock and will not lock.
+// That's okay because they all check for initialized state after getting
+// the lock and return.
+void InstanceKlass::fence_and_clear_init_lock() {
+  // make sure previous stores are all done, notably the init_state.
+  OrderAccess::storestore();
+  java_lang_Class::clear_init_lock(java_mirror());
+  assert(!is_not_initialized(), "class must be initialized now");
+}
+
+
 // See "The Virtual Machine Specification" section 2.16.5 for a detailed explanation of the class initialization
 // process. The step comments refers to the procedure described in that section.
 // Note: implementation moved to static method to expose the this pointer.
@@ -772,49 +792,6 @@ void InstanceKlass::link_class(TRAPS) {
   }
 }
 
-void InstanceKlass::check_link_state_and_wait(JavaThread* current) {
-  MonitorLocker ml(current, _init_monitor);
-
-  bool debug_logging_enabled = log_is_enabled(Debug, class, init);
-
-  // Another thread is linking this class, wait.
-  while (is_being_linked() && !is_init_thread(current)) {
-    if (debug_logging_enabled) {
-      ResourceMark rm(current);
-      log_debug(class, init)("Thread \"%s\" waiting for linking of %s by thread \"%s\"",
-                             current->name(), external_name(), init_thread_name());
-    }
-    ml.wait();
-  }
-
-  // This thread is recursively linking this class, continue
-  if (is_being_linked() && is_init_thread(current)) {
-    if (debug_logging_enabled) {
-      ResourceMark rm(current);
-      log_debug(class, init)("Thread \"%s\" recursively linking %s",
-                             current->name(), external_name());
-    }
-    return;
-  }
-
-  // If this class wasn't linked already, set state to being_linked
-  if (!is_linked()) {
-    if (debug_logging_enabled) {
-      ResourceMark rm(current);
-      log_debug(class, init)("Thread \"%s\" linking %s",
-                             current->name(), external_name());
-    }
-    set_init_state(being_linked);
-    set_init_thread(current);
-  } else {
-    if (debug_logging_enabled) {
-      ResourceMark rm(current);
-      log_debug(class, init)("Thread \"%s\" found %s already linked",
-                             current->name(), external_name());
-      }
-  }
-}
-
 // Called to verify that a class can link during initialization, without
 // throwing a VerifyError.
 bool InstanceKlass::link_class_or_fail(TRAPS) {
@@ -893,8 +870,9 @@ bool InstanceKlass::link_class_impl(TRAPS) {
 
   // verification & rewriting
   {
-    LockLinkState init_lock(this, jt);
-
+    HandleMark hm(THREAD);
+    Handle h_init_lock(THREAD, init_lock());
+    ObjectLocker ol(h_init_lock, jt);
     // rewritten will have been set if loader constraint error found
     // on an earlier link attempt
     // don't verify or rewrite if already rewritten
@@ -952,7 +930,21 @@ bool InstanceKlass::link_class_impl(TRAPS) {
       // In case itable verification is ever added.
       // itable().verify(tty, true);
 #endif
-      set_initialization_state_and_notify(linked, THREAD);
+      if (Universe::is_fully_initialized()) {
+        DeoptimizationScope deopt_scope;
+        {
+          // Now mark all code that assumes the class is not linked.
+          // Set state under the Compile_lock also.
+          MutexLocker ml(THREAD, Compile_lock);
+
+          set_init_state(linked);
+          CodeCache::mark_dependents_on(&deopt_scope, this);
+        }
+        // Perform the deopt handshake outside Compile_lock.
+        deopt_scope.deoptimize_marked();
+      } else {
+        set_init_state(linked);
+      }
       if (JvmtiExport::should_post_class_prepare()) {
         JvmtiExport::post_class_prepare(THREAD, this);
       }
@@ -978,6 +970,8 @@ void InstanceKlass::rewrite_class(TRAPS) {
 // This is outside is_rewritten flag. In case of an exception, it can be
 // executed more than once.
 void InstanceKlass::link_methods(TRAPS) {
+  PerfTraceTime timer(ClassLoader::perf_ik_link_methods_time());
+
   int len = methods()->length();
   for (int i = len-1; i >= 0; i--) {
     methodHandle m(THREAD, methods()->at(i));
@@ -1082,7 +1076,6 @@ void InstanceKlass::initialize_impl(TRAPS) {
   DTRACE_CLASSINIT_PROBE(required, -1);
 
   bool wait = false;
-  bool throw_error = false;
 
   JavaThread* jt = THREAD;
 
@@ -1091,24 +1084,27 @@ void InstanceKlass::initialize_impl(TRAPS) {
   // refer to the JVM book page 47 for description of steps
   // Step 1
   {
-    MonitorLocker ml(jt, _init_monitor);
+    Handle h_init_lock(THREAD, init_lock());
+    ObjectLocker ol(h_init_lock, jt);
 
     // Step 2
-    while (is_being_initialized() && !is_init_thread(jt)) {
+    // If we were to use wait() instead of waitInterruptibly() then
+    // we might end up throwing IE from link/symbol resolution sites
+    // that aren't expected to throw.  This would wreak havoc.  See 6320309.
+    while (is_being_initialized() && !is_reentrant_initialization(jt)) {
       if (debug_logging_enabled) {
         ResourceMark rm(jt);
         log_debug(class, init)("Thread \"%s\" waiting for initialization of %s by thread \"%s\"",
                                jt->name(), external_name(), init_thread_name());
       }
-
       wait = true;
       jt->set_class_to_be_initialized(this);
-      ml.wait();
+      ol.wait_uninterruptibly(jt);
       jt->set_class_to_be_initialized(nullptr);
     }
 
     // Step 3
-    if (is_being_initialized() && is_init_thread(jt)) {
+    if (is_being_initialized() && is_reentrant_initialization(jt)) {
       if (debug_logging_enabled) {
         ResourceMark rm(jt);
         log_debug(class, init)("Thread \"%s\" recursively initializing %s",
@@ -1136,7 +1132,19 @@ void InstanceKlass::initialize_impl(TRAPS) {
         log_debug(class, init)("Thread \"%s\" found %s is in error state",
                                jt->name(), external_name());
       }
-      throw_error = true;
+
+      DTRACE_CLASSINIT_PROBE_WAIT(erroneous, -1, wait);
+      ResourceMark rm(THREAD);
+      Handle cause(THREAD, get_initialization_error(THREAD));
+
+      stringStream ss;
+      ss.print("Could not initialize class %s", external_name());
+      if (cause.is_null()) {
+        THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), ss.as_string());
+      } else {
+        THROW_MSG_CAUSE(vmSymbols::java_lang_NoClassDefFoundError(),
+                        ss.as_string(), cause);
+      }
     } else {
 
       // Step 6
@@ -1150,22 +1158,6 @@ void InstanceKlass::initialize_impl(TRAPS) {
     }
   }
 
-  // Throw error outside lock
-  if (throw_error) {
-    DTRACE_CLASSINIT_PROBE_WAIT(erroneous, -1, wait);
-    ResourceMark rm(THREAD);
-    Handle cause(THREAD, get_initialization_error(THREAD));
-
-    stringStream ss;
-    ss.print("Could not initialize class %s", external_name());
-    if (cause.is_null()) {
-      THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), ss.as_string());
-    } else {
-      THROW_MSG_CAUSE(vmSymbols::java_lang_NoClassDefFoundError(),
-                      ss.as_string(), cause);
-    }
-  }
-
   // Step 7
   // Next, if C is a class rather than an interface, initialize it's super class and super
   // interfaces.
@@ -1223,7 +1215,7 @@ void InstanceKlass::initialize_impl(TRAPS) {
 
   // Step 9
   if (!HAS_PENDING_EXCEPTION) {
-    set_initialization_state_and_notify(fully_initialized, THREAD);
+    set_initialization_state_and_notify(fully_initialized, CHECK);
     debug_only(vtable().verify(tty, true);)
   }
   else {
@@ -1256,28 +1248,19 @@ void InstanceKlass::initialize_impl(TRAPS) {
 }
 
 
-void InstanceKlass::set_initialization_state_and_notify(ClassState state, JavaThread* current) {
-  MonitorLocker ml(current, _init_monitor);
-
-  if (state == linked && UseVtableBasedCHA && Universe::is_fully_initialized()) {
-    DeoptimizationScope deopt_scope;
-    {
-      // Now mark all code that assumes the class is not linked.
-      // Set state under the Compile_lock also.
-      MutexLocker ml(current, Compile_lock);
-
-      set_init_thread(nullptr); // reset _init_thread before changing _init_state
-      set_init_state(state);
-
-      CodeCache::mark_dependents_on(&deopt_scope, this);
-    }
-    // Perform the deopt handshake outside Compile_lock.
-    deopt_scope.deoptimize_marked();
+void InstanceKlass::set_initialization_state_and_notify(ClassState state, TRAPS) {
+  Handle h_init_lock(THREAD, init_lock());
+  if (h_init_lock() != nullptr) {
+    ObjectLocker ol(h_init_lock, THREAD);
+    set_init_thread(nullptr); // reset _init_thread before changing _init_state
+    set_init_state(state);
+    fence_and_clear_init_lock();
+    ol.notify_all(CHECK);
   } else {
+    assert(h_init_lock() != nullptr, "The initialization state should never be set twice");
     set_init_thread(nullptr); // reset _init_thread before changing _init_state
     set_init_state(state);
   }
-  ml.notify_all();
 }
 
 // Update hierarchy. This is done before the new klass has been added to the SystemDictionary. The Compile_lock
@@ -1285,14 +1268,6 @@ void InstanceKlass::set_initialization_state_and_notify(ClassState state, JavaTh
 void InstanceKlass::add_to_hierarchy(JavaThread* current) {
   assert(!SafepointSynchronize::is_at_safepoint(), "must NOT be at safepoint");
 
-  // In case we are not using CHA based vtables we need to make sure the loaded
-  // deopt is completed before anyone links this class.
-  // Linking is done with _init_monitor held, by loading and deopting with it
-  // held we make sure the deopt is completed before linking.
-  if (!UseVtableBasedCHA) {
-    init_monitor()->lock();
-  }
-
   DeoptimizationScope deopt_scope;
   {
     MutexLocker ml(current, Compile_lock);
@@ -1314,12 +1289,9 @@ void InstanceKlass::add_to_hierarchy(JavaThread* current) {
   }
   // Perform the deopt handshake outside Compile_lock.
   deopt_scope.deoptimize_marked();
-
-  if (!UseVtableBasedCHA) {
-    init_monitor()->unlock();
-  }
 }
 
+
 InstanceKlass* InstanceKlass::implementor() const {
   InstanceKlass* volatile* ik = adr_implementor();
   if (ik == nullptr) {
@@ -1605,7 +1577,7 @@ void InstanceKlass::call_class_initializer(TRAPS) {
   // This is needed to ensure the consistency of the archived heap objects.
   if (has_archived_enum_objs()) {
     assert(is_shared(), "must be");
-    bool initialized = HeapShared::initialize_enum_klass(this, CHECK);
+    bool initialized = CDSEnumKlass::initialize_enum_klass(this, CHECK);
     if (initialized) {
       return;
     }
@@ -2555,7 +2527,9 @@ void InstanceKlass::remove_unshareable_info() {
     init_implementor();
   }
 
-  constants()->remove_unshareable_info();
+  // Call remove_unshareable_info() on other objects that belong to this class, except
+  // for constants()->remove_unshareable_info(), which is called in a separate pass in
+  // ArchiveBuilder::make_klasses_shareable(),
 
   for (int i = 0; i < methods()->length(); i++) {
     Method* m = methods()->at(i);
@@ -2586,7 +2560,6 @@ void InstanceKlass::remove_unshareable_info() {
   _nest_host = nullptr;
   init_shared_package_entry();
   _dep_context_last_cleaned = 0;
-  _init_monitor = nullptr;
 
   remove_unshareable_flags();
 }
@@ -2690,9 +2663,6 @@ void InstanceKlass::restore_unshareable_info(ClassLoaderData* loader_data, Handl
   if (DiagnoseSyncOnValueBasedClasses && has_value_based_class_annotation()) {
     set_is_value_based();
   }
-
-  // restore the monitor
-  _init_monitor = create_init_monitor("InstanceKlassInitMonitorRestored_lock");
 }
 
 // Check if a class or any of its supertypes has a version older than 50.
@@ -2788,9 +2758,6 @@ void InstanceKlass::release_C_heap_structures(bool release_sub_metadata) {
     methods_do(method_release_C_heap_structures);
   }
 
-  // Destroy the init_monitor
-  delete _init_monitor;
-
   // Deallocate oop map cache
   if (_oop_map_cache != nullptr) {
     delete _oop_map_cache;
@@ -3482,7 +3449,7 @@ nmethod* InstanceKlass::lookup_osr_nmethod(const Method* m, int bci, int comp_le
 #define BULLET  " - "
 
 static const char* state_names[] = {
-  "allocated", "loaded", "being_linked", "linked", "being_initialized", "fully_initialized", "initialization_error"
+  "allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error"
 };
 
 static void print_vtable(intptr_t* start, int len, outputStream* st) {
@@ -3556,9 +3523,7 @@ void InstanceKlass::print_on(outputStream* st) const {
       }
     }
   }
-  if (default_vtable_indices() != nullptr) {
-    st->print(BULLET"default vtable indices:   "); default_vtable_indices()->print_value_on(st);       st->cr();
-  }
+  print_on_maybe_null(st, BULLET"default vtable indices:   ", default_vtable_indices());
   st->print(BULLET"local interfaces:  "); local_interfaces()->print_value_on(st);      st->cr();
   st->print(BULLET"trans. interfaces: "); transitive_interfaces()->print_value_on(st); st->cr();
 
@@ -3585,25 +3550,18 @@ void InstanceKlass::print_on(outputStream* st) const {
     }
   }
   st->print(BULLET"constants:         "); constants()->print_value_on(st);         st->cr();
-  if (class_loader_data() != nullptr) {
-    st->print(BULLET"class loader data:  ");
-    class_loader_data()->print_value_on(st);
-    st->cr();
-  }
-  if (source_file_name() != nullptr) {
-    st->print(BULLET"source file:       ");
-    source_file_name()->print_value_on(st);
-    st->cr();
-  }
+
+  print_on_maybe_null(st, BULLET"class loader data:  ", class_loader_data());
+  print_on_maybe_null(st, BULLET"source file:       ", source_file_name());
   if (source_debug_extension() != nullptr) {
     st->print(BULLET"source debug extension:       ");
     st->print("%s", source_debug_extension());
     st->cr();
   }
-  st->print(BULLET"class annotations:       "); class_annotations()->print_value_on(st); st->cr();
-  st->print(BULLET"class type annotations:  "); class_type_annotations()->print_value_on(st); st->cr();
-  st->print(BULLET"field annotations:       "); fields_annotations()->print_value_on(st); st->cr();
-  st->print(BULLET"field type annotations:  "); fields_type_annotations()->print_value_on(st); st->cr();
+  print_on_maybe_null(st, BULLET"class annotations:       ", class_annotations());
+  print_on_maybe_null(st, BULLET"class type annotations:  ", class_type_annotations());
+  print_on_maybe_null(st, BULLET"field annotations:       ", fields_annotations());
+  print_on_maybe_null(st, BULLET"field type annotations:  ", fields_type_annotations());
   {
     bool have_pv = false;
     // previous versions are linked together through the InstanceKlass
@@ -3618,16 +3576,10 @@ void InstanceKlass::print_on(outputStream* st) const {
     if (have_pv) st->cr();
   }
 
-  if (generic_signature() != nullptr) {
-    st->print(BULLET"generic signature: ");
-    generic_signature()->print_value_on(st);
-    st->cr();
-  }
+  print_on_maybe_null(st, BULLET"generic signature: ", generic_signature());
   st->print(BULLET"inner classes:     "); inner_classes()->print_value_on(st);     st->cr();
   st->print(BULLET"nest members:     "); nest_members()->print_value_on(st);     st->cr();
-  if (record_components() != nullptr) {
-    st->print(BULLET"record components:     "); record_components()->print_value_on(st);     st->cr();
-  }
+  print_on_maybe_null(st, BULLET"record components:     ", record_components());
   st->print(BULLET"permitted subclasses:     "); permitted_subclasses()->print_value_on(st);     st->cr();
   if (java_mirror() != nullptr) {
     st->print(BULLET"java mirror:       ");
@@ -4132,17 +4084,13 @@ void JNIid::verify(Klass* holder) {
 }
 
 void InstanceKlass::set_init_state(ClassState state) {
-  if (state > loaded) {
-    assert_lock_strong(_init_monitor);
-  }
 #ifdef ASSERT
   bool good_state = is_shared() ? (_init_state <= state)
                                                : (_init_state < state);
-  bool link_failed = _init_state == being_linked && state == loaded;
-  assert(good_state || state == allocated || link_failed, "illegal state transition");
+  assert(good_state || state == allocated, "illegal state transition");
 #endif
   assert(_init_thread == nullptr, "should be cleared before state change");
-  Atomic::store(&_init_state, state);
+  _init_state = state;
 }
 
 #if INCLUDE_JVMTI
diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp
index 27c97e38b62..6e5d4ac8e7f 100644
--- a/src/hotspot/share/oops/instanceKlass.hpp
+++ b/src/hotspot/share/oops/instanceKlass.hpp
@@ -152,7 +152,6 @@ class InstanceKlass: public Klass {
   enum ClassState : u1 {
     allocated,                          // allocated (but not yet linked)
     loaded,                             // loaded and inserted in class hierarchy (but not linked yet)
-    being_linked,                       // currently running verifier and rewriter
     linked,                             // successfully linked/verified (but not initialized yet)
     being_initialized,                  // currently running class initializer
     fully_initialized,                  // initialized (successful final state)
@@ -226,14 +225,20 @@ class InstanceKlass: public Klass {
 
   volatile u2     _idnum_allocated_count;   // JNI/JVMTI: increments with the addition of methods, old ids don't change
 
+  // _is_marked_dependent can be set concurrently, thus cannot be part of the
+  // _misc_flags.
+  bool            _is_marked_dependent;     // used for marking during flushing and deoptimization
+
+  // Class states are defined as ClassState (see above).
+  // Place the _init_state here to utilize the unused 2-byte after
+  // _idnum_allocated_count.
   volatile ClassState _init_state;          // state of class
 
-  u1              _reference_type;          // reference type
+  u1              _reference_type;                // reference type
 
   // State is set either at parse time or while executing, atomically to not disturb other state
   InstanceKlassFlags _misc_flags;
 
-  Monitor*             _init_monitor;       // mutual exclusion to _init_state and _init_thread.
   JavaThread* volatile _init_thread;        // Pointer to current thread doing initialization (to handle recursive initialization)
 
   OopMapCache*    volatile _oop_map_cache;   // OopMapCache for all methods in the klass (allocated lazily)
@@ -497,41 +502,23 @@ class InstanceKlass: public Klass {
                                        TRAPS);
 
   JavaThread* init_thread()  { return Atomic::load(&_init_thread); }
-  // We can safely access the name as long as we hold the _init_monitor.
   const char* init_thread_name() {
-    assert(_init_monitor->owned_by_self(), "Must hold _init_monitor here");
     return init_thread()->name_raw();
   }
 
  public:
   // initialization state
-  bool is_loaded() const                   { return init_state() >= loaded; }
-  bool is_linked() const                   { return init_state() >= linked; }
-  bool is_being_linked() const             { return init_state() == being_linked; }
-  bool is_initialized() const              { return init_state() == fully_initialized; }
-  bool is_not_initialized() const          { return init_state() <  being_initialized; }
-  bool is_being_initialized() const        { return init_state() == being_initialized; }
-  bool is_in_error_state() const           { return init_state() == initialization_error; }
-  bool is_init_thread(JavaThread *thread)  { return thread == init_thread(); }
-  ClassState  init_state() const           { return Atomic::load(&_init_state); }
+  bool is_loaded() const                   { return _init_state >= loaded; }
+  bool is_linked() const                   { return _init_state >= linked; }
+  bool is_initialized() const              { return _init_state == fully_initialized; }
+  bool is_not_initialized() const          { return _init_state <  being_initialized; }
+  bool is_being_initialized() const        { return _init_state == being_initialized; }
+  bool is_in_error_state() const           { return _init_state == initialization_error; }
+  bool is_reentrant_initialization(Thread *thread)  { return thread == _init_thread; }
+  ClassState  init_state() const           { return _init_state; }
   const char* init_state_name() const;
   bool is_rewritten() const                { return _misc_flags.rewritten(); }
 
-  class LockLinkState : public StackObj {
-    InstanceKlass* _ik;
-    JavaThread*    _current;
-   public:
-    LockLinkState(InstanceKlass* ik, JavaThread* current) : _ik(ik), _current(current) {
-      ik->check_link_state_and_wait(current);
-    }
-    ~LockLinkState() {
-      if (!_ik->is_linked()) {
-        // Reset to loaded if linking failed.
-        _ik->set_initialization_state_and_notify(loaded, _current);
-      }
-    }
-  };
-
   // is this a sealed class
   bool is_sealed() const;
 
@@ -829,7 +816,7 @@ class InstanceKlass: public Klass {
 
   // initialization
   void call_class_initializer(TRAPS);
-  void set_initialization_state_and_notify(ClassState state, JavaThread* current);
+  void set_initialization_state_and_notify(ClassState state, TRAPS);
 
   // OopMapCache support
   OopMapCache* oop_map_cache()               { return _oop_map_cache; }
@@ -841,6 +828,7 @@ class InstanceKlass: public Klass {
   void set_jni_ids(JNIid* ids)                   { _jni_ids = ids; }
   JNIid* jni_id_for(int offset);
 
+ public:
   // maintenance of deoptimization dependencies
   inline DependencyContext dependencies();
   void mark_dependent_nmethods(DeoptimizationScope* deopt_scope, KlassDepChange& changes);
@@ -1055,7 +1043,7 @@ class InstanceKlass: public Klass {
  public:
   u2 idnum_allocated_count() const      { return _idnum_allocated_count; }
 
- private:
+private:
   // initialization state
   void set_init_state(ClassState state);
   void set_rewritten()                  { _misc_flags.set_rewritten(true); }
@@ -1072,6 +1060,12 @@ class InstanceKlass: public Klass {
   jmethodID update_jmethod_id(jmethodID* jmeths, Method* method, int idnum);
 
 public:
+  // Lock for (1) initialization; (2) access to the ConstantPool of this class.
+  // Must be one per class and it has to be a VM internal object so java code
+  // cannot lock it (like the mirror).
+  // It has to be an object not a Mutex because it's held through java calls.
+  oop init_lock() const;
+
   // Returns the array class for the n'th dimension
   virtual ArrayKlass* array_klass(int n, TRAPS);
   virtual ArrayKlass* array_klass_or_null(int n);
@@ -1081,10 +1075,9 @@ class InstanceKlass: public Klass {
   virtual ArrayKlass* array_klass_or_null();
 
   static void clean_initialization_error_table();
-
-  Monitor* init_monitor() const { return _init_monitor; }
 private:
-  void check_link_state_and_wait(JavaThread* current);
+  void fence_and_clear_init_lock();
+
   bool link_class_impl                           (TRAPS);
   bool verify_code                               (TRAPS);
   void initialize_impl                           (TRAPS);
diff --git a/src/hotspot/share/oops/klass.hpp b/src/hotspot/share/oops/klass.hpp
index 2923235e2f3..6ec6ac889be 100644
--- a/src/hotspot/share/oops/klass.hpp
+++ b/src/hotspot/share/oops/klass.hpp
@@ -159,11 +159,6 @@ class Klass : public Metadata {
   // Provide access the corresponding instance java.lang.ClassLoader.
   ClassLoaderData* _class_loader_data;
 
-  // Bitmap and hash code used by hashed secondary supers.
-  uintx    _bitmap;
-  uint8_t  _hash_slot;
-
-  static uint8_t compute_hash_slot(Symbol* s);
 
   int _vtable_len;              // vtable length. This field may be read very often when we
                                 // have lots of itable dispatches (e.g., lambdas and streams).
@@ -173,6 +168,10 @@ class Klass : public Metadata {
 
   JFR_ONLY(DEFINE_TRACE_ID_FIELD;)
 
+  // Bitmap and hash code used by hashed secondary supers.
+  uintx    _bitmap;
+  uint8_t  _hash_slot;
+
 private:
   // This is an index into FileMapHeader::_shared_path_table[], to
   // associate this class with the JAR file where it's loaded from during
@@ -392,6 +391,7 @@ class Klass : public Metadata {
   void     set_next_sibling(Klass* s);
 
  private:
+  static uint8_t compute_hash_slot(Symbol* s);
   static void  hash_insert(Klass* klass, GrowableArray<Klass*>* secondaries, uintx& bitmap);
   static uintx hash_secondary_supers(Array<Klass*>* secondaries, bool rewrite);
 
diff --git a/src/hotspot/share/oops/klassVtable.hpp b/src/hotspot/share/oops/klassVtable.hpp
index f986139d3f4..349a859a17f 100644
--- a/src/hotspot/share/oops/klassVtable.hpp
+++ b/src/hotspot/share/oops/klassVtable.hpp
@@ -54,6 +54,9 @@ class klassVtable {
   klassVtable(Klass* klass, void* base, int length) : _klass(klass) {
     _tableOffset = int((address)base - (address)klass);
     _length = length;
+#ifndef PRODUCT
+    _verify_count = 0;
+#endif
   }
 
   // accessors
diff --git a/src/hotspot/share/oops/metadata.hpp b/src/hotspot/share/oops/metadata.hpp
index c118ade8586..f5aee34c80d 100644
--- a/src/hotspot/share/oops/metadata.hpp
+++ b/src/hotspot/share/oops/metadata.hpp
@@ -76,4 +76,13 @@ class Metadata : public MetaspaceObj {
   static void mark_on_stack(Metadata* m) { m->set_on_stack(true); }
 };
 
+template <typename M>
+static void print_on_maybe_null(outputStream* st, const char* str, const M* m) {
+  if (nullptr != m) {
+    st->print_raw(str);
+    m->print_value_on(st);
+    st->cr();
+  }
+}
+
 #endif // SHARE_OOPS_METADATA_HPP
diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp
index a5b2267cf33..e5ba0d61031 100644
--- a/src/hotspot/share/oops/method.cpp
+++ b/src/hotspot/share/oops/method.cpp
@@ -26,6 +26,7 @@
 #include "cds/cdsConfig.hpp"
 #include "cds/cppVtables.hpp"
 #include "cds/metaspaceShared.hpp"
+#include "classfile/classLoader.hpp"
 #include "classfile/classLoaderDataGraph.hpp"
 #include "classfile/metadataOnStackMark.hpp"
 #include "classfile/symbolTable.hpp"
@@ -62,12 +63,14 @@
 #include "prims/jvmtiExport.hpp"
 #include "prims/methodHandles.hpp"
 #include "runtime/atomic.hpp"
+#include "runtime/arguments.hpp"
 #include "runtime/continuationEntry.hpp"
 #include "runtime/frame.inline.hpp"
 #include "runtime/handles.inline.hpp"
 #include "runtime/init.hpp"
 #include "runtime/java.hpp"
 #include "runtime/orderAccess.hpp"
+#include "runtime/perfData.hpp"
 #include "runtime/relocator.hpp"
 #include "runtime/safepointVerifiers.hpp"
 #include "runtime/sharedRuntime.hpp"
@@ -1168,6 +1171,10 @@ void Method::remove_unshareable_flags() {
 // Called when the method_holder is getting linked. Setup entrypoints so the method
 // is ready to be called from interpreter, compiler, and vtables.
 void Method::link_method(const methodHandle& h_method, TRAPS) {
+  if (log_is_enabled(Info, perf, class, link)) {
+    ClassLoader::perf_ik_link_methods_count()->inc();
+  }
+
   // If the code cache is full, we may reenter this function for the
   // leftover methods that weren't linked.
   if (adapter() != nullptr) {
@@ -1219,6 +1226,8 @@ void Method::link_method(const methodHandle& h_method, TRAPS) {
 }
 
 address Method::make_adapters(const methodHandle& mh, TRAPS) {
+  PerfTraceTime timer(ClassLoader::perf_method_adapters_time());
+
   // Adapters for compiled code are made eagerly here.  They are fairly
   // small (generally < 100 bytes) and quick to make (and cached and shared)
   // so making them eagerly shouldn't be too expensive.
@@ -1724,7 +1733,7 @@ void Method::sort_methods(Array<Method*>* methods, bool set_idnums, method_compa
     }
     {
       NoSafepointVerifier nsv;
-      QuickSort::sort(methods->data(), length, func, /*idempotent=*/false);
+      QuickSort::sort(methods->data(), length, func);
     }
     // Reset method ordering
     if (set_idnums) {
diff --git a/src/hotspot/share/oops/methodData.cpp b/src/hotspot/share/oops/methodData.cpp
index 08dfc1fe95a..af19d59f281 100644
--- a/src/hotspot/share/oops/methodData.cpp
+++ b/src/hotspot/share/oops/methodData.cpp
@@ -1333,21 +1333,6 @@ void MethodData::init() {
   _failed_speculations = nullptr;
 #endif
 
-#if INCLUDE_RTM_OPT
-  _rtm_state = NoRTM; // No RTM lock eliding by default
-  if (UseRTMLocking &&
-      !CompilerOracle::has_option(mh, CompileCommandEnum::NoRTMLockEliding)) {
-    if (CompilerOracle::has_option(mh, CompileCommandEnum::UseRTMLockEliding) || !UseRTMDeopt) {
-      // Generate RTM lock eliding code without abort ratio calculation code.
-      _rtm_state = UseRTM;
-    } else if (UseRTMDeopt) {
-      // Generate RTM lock eliding code and include abort ratio calculation
-      // code if UseRTMDeopt is on.
-      _rtm_state = ProfileRTM;
-    }
-  }
-#endif
-
   // Initialize escape flags.
   clear_escape_info();
 }
diff --git a/src/hotspot/share/oops/methodData.hpp b/src/hotspot/share/oops/methodData.hpp
index 4fa42eec960..5071c29f1d7 100644
--- a/src/hotspot/share/oops/methodData.hpp
+++ b/src/hotspot/share/oops/methodData.hpp
@@ -1946,7 +1946,6 @@ class ciMethodData;
 class MethodData : public Metadata {
   friend class VMStructs;
   friend class JVMCIVMStructs;
-private:
   friend class ProfileData;
   friend class TypeEntriesAtCall;
   friend class ciMethodData;
@@ -2070,11 +2069,6 @@ class MethodData : public Metadata {
   int               _invoke_mask;      // per-method Tier0InvokeNotifyFreqLog
   int               _backedge_mask;    // per-method Tier0BackedgeNotifyFreqLog
 
-#if INCLUDE_RTM_OPT
-  // State of RTM code generation during compilation of the method
-  int               _rtm_state;
-#endif
-
   // Number of loops and blocks is computed when compiling the first
   // time with C1. It is used to determine if method is trivial.
   short             _num_loops;
@@ -2085,8 +2079,8 @@ class MethodData : public Metadata {
 
 #if INCLUDE_JVMCI
   // Support for HotSpotMethodData.setCompiledIRSize(int)
-  int                _jvmci_ir_size;
   FailedSpeculation* _failed_speculations;
+  int                _jvmci_ir_size;
 #endif
 
   // Size of _data array in bytes.  (Excludes header and extra_data fields.)
@@ -2270,22 +2264,6 @@ class MethodData : public Metadata {
   }
 #endif
 
-#if INCLUDE_RTM_OPT
-  int rtm_state() const {
-    return _rtm_state;
-  }
-  void set_rtm_state(RTMState rstate) {
-    _rtm_state = (int)rstate;
-  }
-  void atomic_set_rtm_state(RTMState rstate) {
-    Atomic::store(&_rtm_state, (int)rstate);
-  }
-
-  static ByteSize rtm_state_offset() {
-    return byte_offset_of(MethodData, _rtm_state);
-  }
-#endif
-
   void set_would_profile(bool p)              { _would_profile = p ? profile : no_profile; }
   bool would_profile() const                  { return _would_profile != no_profile; }
 
diff --git a/src/hotspot/share/oops/resolvedFieldEntry.cpp b/src/hotspot/share/oops/resolvedFieldEntry.cpp
index 779f7676293..83243251306 100644
--- a/src/hotspot/share/oops/resolvedFieldEntry.cpp
+++ b/src/hotspot/share/oops/resolvedFieldEntry.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,8 @@
  */
 
 #include "precompiled.hpp"
-#include "resolvedFieldEntry.hpp"
+#include "cds/archiveBuilder.hpp"
+#include "oops/resolvedFieldEntry.hpp"
 
 void ResolvedFieldEntry::print_on(outputStream* st) const {
   st->print_cr("Field Entry:");
@@ -43,8 +44,14 @@ void ResolvedFieldEntry::print_on(outputStream* st) const {
   st->print_cr(" - Put Bytecode: %s", Bytecodes::name((Bytecodes::Code)put_code()));
 }
 
+#if INCLUDE_CDS
 void ResolvedFieldEntry::remove_unshareable_info() {
   u2 saved_cpool_index = _cpool_index;
   memset(this, 0, sizeof(*this));
   _cpool_index = saved_cpool_index;
 }
+
+void ResolvedFieldEntry::mark_and_relocate() {
+  ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_field_holder);
+}
+#endif
diff --git a/src/hotspot/share/oops/resolvedFieldEntry.hpp b/src/hotspot/share/oops/resolvedFieldEntry.hpp
index 7765240926d..c98d5f54d1e 100644
--- a/src/hotspot/share/oops/resolvedFieldEntry.hpp
+++ b/src/hotspot/share/oops/resolvedFieldEntry.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -55,6 +55,17 @@ class ResolvedFieldEntry {
   u1 _flags;                    // Flags: [0000|00|is_final|is_volatile]
   u1 _get_code, _put_code;      // Get and Put bytecodes of the field
 
+  void copy_from(const ResolvedFieldEntry& other) {
+    _field_holder = other._field_holder;
+    _field_offset = other._field_offset;
+    _field_index = other._field_index;
+    _cpool_index = other._cpool_index;
+    _tos_state = other._tos_state;
+    _flags = other._flags;
+    _get_code = other._get_code;
+    _put_code = other._put_code;
+  }
+
 public:
   ResolvedFieldEntry(u2 cpi) :
     _field_holder(nullptr),
@@ -65,9 +76,19 @@ class ResolvedFieldEntry {
     _flags(0),
     _get_code(0),
     _put_code(0) {}
+
   ResolvedFieldEntry() :
     ResolvedFieldEntry(0) {}
 
+  ResolvedFieldEntry(const ResolvedFieldEntry& other) {
+    copy_from(other);
+  }
+
+  ResolvedFieldEntry& operator=(const ResolvedFieldEntry& other) {
+    copy_from(other);
+    return *this;
+  }
+
   // Bit shift to get flags
   // Note: Only two flags exists at the moment but more could be added
   enum {
@@ -131,7 +152,10 @@ class ResolvedFieldEntry {
   }
 
   // CDS
+#if INCLUDE_CDS
   void remove_unshareable_info();
+  void mark_and_relocate();
+#endif
 
   // Offsets
   static ByteSize field_holder_offset() { return byte_offset_of(ResolvedFieldEntry, _field_holder); }
diff --git a/src/hotspot/share/oops/resolvedIndyEntry.cpp b/src/hotspot/share/oops/resolvedIndyEntry.cpp
index eff543a5448..93ba3d6916c 100644
--- a/src/hotspot/share/oops/resolvedIndyEntry.cpp
+++ b/src/hotspot/share/oops/resolvedIndyEntry.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "cds/archiveBuilder.hpp"
 #include "code/compressedStream.hpp"
 #include "oops/method.hpp"
 #include "oops/resolvedIndyEntry.hpp"
@@ -37,6 +38,7 @@ bool ResolvedIndyEntry::check_no_old_or_obsolete_entry() {
   }
 }
 
+#if INCLUDE_CDS
 void ResolvedIndyEntry::remove_unshareable_info() {
   u2 saved_resolved_references_index = _resolved_references_index;
   u2 saved_cpool_index = _cpool_index;
@@ -45,6 +47,12 @@ void ResolvedIndyEntry::remove_unshareable_info() {
   _cpool_index = saved_cpool_index;
 }
 
+void ResolvedIndyEntry::mark_and_relocate() {
+  assert(is_resolved(), "must be");
+  ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_method);
+}
+#endif
+
 void ResolvedIndyEntry::print_on(outputStream* st) const {
   st->print_cr("Resolved InvokeDynamic Info:");
   if (_method != nullptr) {
diff --git a/src/hotspot/share/oops/resolvedIndyEntry.hpp b/src/hotspot/share/oops/resolvedIndyEntry.hpp
index 25797d338c4..3d7d3893311 100644
--- a/src/hotspot/share/oops/resolvedIndyEntry.hpp
+++ b/src/hotspot/share/oops/resolvedIndyEntry.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -129,7 +129,10 @@ class ResolvedIndyEntry {
   bool check_no_old_or_obsolete_entry();
 
   // CDS
+#if INCLUDE_CDS
   void remove_unshareable_info();
+  void mark_and_relocate();
+#endif
 
   // Offsets
   static ByteSize method_offset()                    { return byte_offset_of(ResolvedIndyEntry, _method);                    }
diff --git a/src/hotspot/share/oops/resolvedMethodEntry.cpp b/src/hotspot/share/oops/resolvedMethodEntry.cpp
index 7702dddd9cc..9564dbbcdc4 100644
--- a/src/hotspot/share/oops/resolvedMethodEntry.cpp
+++ b/src/hotspot/share/oops/resolvedMethodEntry.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "cds/archiveBuilder.hpp"
 #include "oops/method.hpp"
 #include "oops/resolvedMethodEntry.hpp"
 
@@ -50,10 +51,23 @@ void ResolvedMethodEntry::reset_entry() {
   }
 }
 
+#if INCLUDE_CDS
 void ResolvedMethodEntry::remove_unshareable_info() {
   reset_entry();
 }
 
+void ResolvedMethodEntry::mark_and_relocate(ConstantPool* src_cp) {
+  if (_method == nullptr) {
+    assert(bytecode2() == Bytecodes::_invokevirtual, "");
+  } else {
+    ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_method);
+  }
+  if (bytecode1() == Bytecodes::_invokeinterface) {
+    ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_entry_specific._interface_klass);
+  }
+}
+#endif
+
 void ResolvedMethodEntry::print_on(outputStream* st) const {
   st->print_cr("Method Entry:");
 
diff --git a/src/hotspot/share/oops/resolvedMethodEntry.hpp b/src/hotspot/share/oops/resolvedMethodEntry.hpp
index f5f7b8fbab5..8f49608127f 100644
--- a/src/hotspot/share/oops/resolvedMethodEntry.hpp
+++ b/src/hotspot/share/oops/resolvedMethodEntry.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -82,6 +82,21 @@ class ResolvedMethodEntry {
   bool _has_table_index;
 #endif
 
+  void copy_from(const ResolvedMethodEntry& other) {
+    _method = other._method;
+    _entry_specific = other._entry_specific;
+    _cpool_index = other._cpool_index;
+    _number_of_parameters = other._number_of_parameters;
+    _tos_state = other._tos_state;
+    _flags = other._flags;
+    _bytecode1 = other._bytecode1;
+    _bytecode2 = other._bytecode2;
+#ifdef ASSERT
+    _has_interface_klass = other._has_interface_klass;
+    _has_table_index = other._has_table_index;
+#endif
+  }
+
   // Constructors
   public:
     ResolvedMethodEntry(u2 cpi) :
@@ -99,6 +114,16 @@ class ResolvedMethodEntry {
     ResolvedMethodEntry() :
       ResolvedMethodEntry(0) {}
 
+    ResolvedMethodEntry(const ResolvedMethodEntry& other) {
+      copy_from(other);
+    }
+
+    ResolvedMethodEntry& operator=(const ResolvedMethodEntry& other) {
+      copy_from(other);
+      return *this;
+    }
+
+
   // Bit shift to get flags
   enum {
       is_vfinal_shift           = 0,
@@ -224,7 +249,10 @@ class ResolvedMethodEntry {
   void reset_entry();
 
   // CDS
+#if INCLUDE_CDS
   void remove_unshareable_info();
+  void mark_and_relocate(ConstantPool* src_cp);
+#endif
 
   // Offsets
   static ByteSize klass_offset()                     { return byte_offset_of(ResolvedMethodEntry, _entry_specific._interface_klass); }
diff --git a/src/hotspot/share/oops/symbol.hpp b/src/hotspot/share/oops/symbol.hpp
index 008b979492d..3b3f1366203 100644
--- a/src/hotspot/share/oops/symbol.hpp
+++ b/src/hotspot/share/oops/symbol.hpp
@@ -122,7 +122,7 @@ class Symbol : public MetaspaceObj {
   };
 
   static int byte_size(int length) {
-    // minimum number of natural words needed to hold these bits (no non-heap version)
+    // minimum number of bytes needed to hold these bits (no non-heap version)
     return (int)(sizeof(Symbol) + (length > 2 ? length - 2 : 0));
   }
   static int size(int length) {
@@ -146,8 +146,6 @@ class Symbol : public MetaspaceObj {
 
   int size()      const     { return size(utf8_length()); }
   int byte_size() const     { return byte_size(utf8_length()); };
-  // length without the _body
-  size_t effective_length() const { return (size_t)byte_size() - sizeof(Symbol); }
 
   // Symbols should be stored in the read-only region of CDS archive.
   static bool is_read_only_by_default() { return true; }
diff --git a/src/hotspot/share/opto/addnode.hpp b/src/hotspot/share/opto/addnode.hpp
index fd044d6eead..8879606954a 100644
--- a/src/hotspot/share/opto/addnode.hpp
+++ b/src/hotspot/share/opto/addnode.hpp
@@ -43,7 +43,7 @@ typedef const Pair<Node*, jint> ConstAddOperands;
 class AddNode : public Node {
   virtual uint hash() const;
 public:
-  AddNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {
+  AddNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {
     init_class_id(Class_Add);
   }
 
@@ -165,7 +165,7 @@ class AddPNode : public Node {
          Base,                  // Base oop, for GC purposes
          Address,               // Actually address, derived from base
          Offset } ;             // Offset added to address
-  AddPNode( Node *base, Node *ptr, Node *off ) : Node(0,base,ptr,off) {
+  AddPNode( Node *base, Node *ptr, Node *off ) : Node(nullptr,base,ptr,off) {
     init_class_id(Class_AddP);
   }
   virtual int Opcode() const;
diff --git a/src/hotspot/share/opto/block.hpp b/src/hotspot/share/opto/block.hpp
index 2a08328b95c..e48b50b06ae 100644
--- a/src/hotspot/share/opto/block.hpp
+++ b/src/hotspot/share/opto/block.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -281,7 +281,7 @@ class Block : public CFGElement {
       _succs(a),
       _num_succs(0),
       _pre_order(0),
-      _idom(0),
+      _idom(nullptr),
       _loop(nullptr),
       _reg_pressure(0),
       _ihrp_index(1),
diff --git a/src/hotspot/share/opto/c2_globals.hpp b/src/hotspot/share/opto/c2_globals.hpp
index f2445e4f136..7288533cd33 100644
--- a/src/hotspot/share/opto/c2_globals.hpp
+++ b/src/hotspot/share/opto/c2_globals.hpp
@@ -457,9 +457,6 @@
   develop(bool, PrintLockStatistics, false,                                 \
           "Print precise statistics on the dynamic lock usage")             \
                                                                             \
-  product(bool, PrintPreciseRTMLockingStatistics, false, DIAGNOSTIC,        \
-          "Print per-lock-site statistics of rtm locking in JVM")           \
-                                                                            \
   develop(bool, PrintEliminateLocks, false,                                 \
           "Print out when locks are eliminated")                            \
                                                                             \
diff --git a/src/hotspot/share/opto/callnode.cpp b/src/hotspot/share/opto/callnode.cpp
index 98837e5e046..6ac3d6e4c61 100644
--- a/src/hotspot/share/opto/callnode.cpp
+++ b/src/hotspot/share/opto/callnode.cpp
@@ -1950,6 +1950,22 @@ bool AbstractLockNode::find_unlocks_for_region(const RegionNode* region, LockNod
 
 }
 
+// Check that all locks/unlocks associated with object come from balanced regions.
+bool AbstractLockNode::is_balanced() {
+  Node* obj = obj_node();
+  for (uint j = 0; j < obj->outcnt(); j++) {
+    Node* n = obj->raw_out(j);
+    if (n->is_AbstractLock() &&
+        n->as_AbstractLock()->obj_node()->eqv_uncast(obj)) {
+      BoxLockNode* n_box = n->as_AbstractLock()->box_node()->as_BoxLock();
+      if (n_box->is_unbalanced()) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
 const char* AbstractLockNode::_kind_names[] = {"Regular", "NonEscObj", "Coarsened", "Nested"};
 
 const char * AbstractLockNode::kind_as_string() const {
@@ -2056,6 +2072,8 @@ Node *LockNode::Ideal(PhaseGVN *phase, bool can_reshape) {
           int unlocks = 0;
           if (Verbose) {
             tty->print_cr("=== Locks coarsening ===");
+            tty->print("Obj: ");
+            obj_node()->dump();
           }
           for (int i = 0; i < lock_ops.length(); i++) {
             AbstractLockNode* lock = lock_ops.at(i);
@@ -2064,6 +2082,8 @@ Node *LockNode::Ideal(PhaseGVN *phase, bool can_reshape) {
             else
               unlocks++;
             if (Verbose) {
+              tty->print("Box %d: ", i);
+              box_node()->dump();
               tty->print(" %d: ", i);
               lock->dump();
             }
diff --git a/src/hotspot/share/opto/callnode.hpp b/src/hotspot/share/opto/callnode.hpp
index efa84850bb2..818640a6f65 100644
--- a/src/hotspot/share/opto/callnode.hpp
+++ b/src/hotspot/share/opto/callnode.hpp
@@ -1154,6 +1154,10 @@ class AbstractLockNode: public CallNode {
   void set_coarsened()   { _kind = Coarsened; set_eliminated_lock_counter(); }
   void set_nested()      { _kind = Nested; set_eliminated_lock_counter(); }
 
+  // Check that all locks/unlocks associated with object come from balanced regions.
+  // They can become unbalanced after coarsening optimization or on OSR entry.
+  bool is_balanced();
+
   // locking does not modify its arguments
   virtual bool may_modify(const TypeOopPtr* t_oop, PhaseValues* phase){ return false; }
 
diff --git a/src/hotspot/share/opto/cfgnode.hpp b/src/hotspot/share/opto/cfgnode.hpp
index de37f4cdd65..18d7577d9e6 100644
--- a/src/hotspot/share/opto/cfgnode.hpp
+++ b/src/hotspot/share/opto/cfgnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -57,6 +57,7 @@ class     JProjNode;
 class       JumpProjNode;
 class     SCMemProjNode;
 class PhaseIdealLoop;
+enum class AssertionPredicateType;
 
 // The success projection of a Parse Predicate is always an IfTrueNode and the uncommon projection an IfFalseNode
 typedef IfTrueNode ParsePredicateSuccessProj;
@@ -237,7 +238,7 @@ class PhiNode : public TypeNode {
   int is_diamond_phi() const;
   bool try_clean_memory_phi(PhaseIterGVN* igvn);
   virtual int Opcode() const;
-  virtual bool pinned() const { return in(0) != 0; }
+  virtual bool pinned() const { return in(0) != nullptr; }
   virtual const TypePtr *adr_type() const { verify_adr_type(true); return _adr_type; }
 
   void  set_inst_mem_id(int inst_mem_id) { _inst_mem_id = inst_mem_id; }
@@ -318,11 +319,23 @@ class MultiBranchNode : public MultiNode {
 //------------------------------IfNode-----------------------------------------
 // Output selected Control, based on a boolean test
 class IfNode : public MultiBranchNode {
+ public:
+  float _prob;                           // Probability of true path being taken.
+  float _fcnt;                           // Frequency counter
+
+ private:
+  NOT_PRODUCT(AssertionPredicateType _assertion_predicate_type;)
+
+  void init_node(Node* control, Node* bol) {
+    init_class_id(Class_If);
+    init_req(0, control);
+    init_req(1, bol);
+  }
+
   // Size is bigger to hold the probability field.  However, _prob does not
   // change the semantics so it does not appear in the hash & cmp functions.
   virtual uint size_of() const { return sizeof(*this); }
 
-private:
   // Helper methods for fold_compares
   bool cmpi_folds(PhaseIterGVN* igvn, bool fold_ne = false);
   bool is_ctrl_folds(Node* ctrl, PhaseIterGVN* igvn);
@@ -413,14 +426,8 @@ class IfNode : public MultiBranchNode {
   // Magic manifest probabilities such as 0.83, 0.7, ... can be found in
   // gen_subtype_check() and catch_inline_exceptions().
 
-  float _prob;                  // Probability of true path being taken.
-  float _fcnt;                  // Frequency counter
-  IfNode( Node *control, Node *b, float p, float fcnt )
-    : MultiBranchNode(2), _prob(p), _fcnt(fcnt) {
-    init_class_id(Class_If);
-    init_req(0,control);
-    init_req(1,b);
-  }
+  IfNode(Node* control, Node* bol, float p, float fcnt);
+  NOT_PRODUCT(IfNode(Node* control, Node* bol, float p, float fcnt, AssertionPredicateType assertion_predicate_type);)
 
   static IfNode* make_with_same_profile(IfNode* if_node_profile, Node* ctrl, BoolNode* bol);
 
@@ -450,13 +457,19 @@ class IfNode : public MultiBranchNode {
 
 class RangeCheckNode : public IfNode {
 private:
-  int is_range_check(Node* &range, Node* &index, jint &offset);
+  int is_range_check(Node*& range, Node*& index, jint& offset);
 
 public:
-  RangeCheckNode(Node* control, Node *b, float p, float fcnt)
-    : IfNode(control, b, p, fcnt) {
+  RangeCheckNode(Node* control, Node* bol, float p, float fcnt) : IfNode(control, bol, p, fcnt) {
+    init_class_id(Class_RangeCheck);
+  }
+
+#ifndef PRODUCT
+  RangeCheckNode(Node* control, Node* bol, float p, float fcnt, AssertionPredicateType assertion_predicate_type)
+      : IfNode(control, bol, p, fcnt, assertion_predicate_type) {
     init_class_id(Class_RangeCheck);
   }
+#endif // NOT PRODUCT
 
   virtual int Opcode() const;
   virtual Node* Ideal(PhaseGVN *phase, bool can_reshape);
diff --git a/src/hotspot/share/opto/classes.hpp b/src/hotspot/share/opto/classes.hpp
index db6cb817d77..7908f21de10 100644
--- a/src/hotspot/share/opto/classes.hpp
+++ b/src/hotspot/share/opto/classes.hpp
@@ -269,7 +269,6 @@ macro(Opaque1)
 macro(OpaqueLoopInit)
 macro(OpaqueLoopStride)
 macro(OpaqueZeroTripGuard)
-macro(Opaque3)
 macro(Opaque4)
 macro(OpaqueInitializedAssertionPredicate)
 macro(ProfileBoolean)
diff --git a/src/hotspot/share/opto/compile.cpp b/src/hotspot/share/opto/compile.cpp
index 25c7ced8aeb..3687bc70efd 100644
--- a/src/hotspot/share/opto/compile.cpp
+++ b/src/hotspot/share/opto/compile.cpp
@@ -713,10 +713,9 @@ Compile::Compile( ciEnv* ci_env, ciMethod* target, int osr_bci,
   set_print_intrinsics(directive->PrintIntrinsicsOption);
   set_has_irreducible_loop(true); // conservative until build_loop_tree() reset it
 
-  if (ProfileTraps RTM_OPT_ONLY( || UseRTMLocking )) {
+  if (ProfileTraps) {
     // Make sure the method being compiled gets its own MDO,
     // so we can at least track the decompile_count().
-    // Need MDO to record RTM code generation state.
     method()->ensure_method_data();
   }
 
@@ -1075,25 +1074,8 @@ void Compile::Init(bool aliasing) {
   set_use_cmove(UseCMoveUnconditionally /* || do_vector_loop()*/); //TODO: consider do_vector_loop() mandate use_cmove unconditionally
   NOT_PRODUCT(if (use_cmove() && Verbose && has_method()) {tty->print("Compile::Init: use CMove without profitability tests for method %s\n",  method()->name()->as_quoted_ascii());})
 
-  set_rtm_state(NoRTM); // No RTM lock eliding by default
   _max_node_limit = _directive->MaxNodeLimitOption;
 
-#if INCLUDE_RTM_OPT
-  if (UseRTMLocking && has_method() && (method()->method_data_or_null() != nullptr)) {
-    int rtm_state = method()->method_data()->rtm_state();
-    if (method_has_option(CompileCommandEnum::NoRTMLockEliding) || ((rtm_state & NoRTM) != 0)) {
-      // Don't generate RTM lock eliding code.
-      set_rtm_state(NoRTM);
-    } else if (method_has_option(CompileCommandEnum::UseRTMLockEliding) || ((rtm_state & UseRTM) != 0) || !UseRTMDeopt) {
-      // Generate RTM lock eliding code without abort ratio calculation code.
-      set_rtm_state(UseRTM);
-    } else if (UseRTMDeopt) {
-      // Generate RTM lock eliding code and include abort ratio calculation
-      // code if UseRTMDeopt is on.
-      set_rtm_state(ProfileRTM);
-    }
-  }
-#endif
   if (VM_Version::supports_fast_class_init_checks() && has_method() && !is_osr_compilation() && method()->needs_clinit_barrier()) {
     set_clinit_barrier_on_entry(true);
   }
@@ -3222,7 +3204,6 @@ void Compile::final_graph_reshaping_main_switch(Node* n, Final_Reshape_Counts& f
     frc.inc_double_count();
     break;
   case Op_Opaque1:              // Remove Opaque Nodes before matching
-  case Op_Opaque3:
     n->subsume_by(n->in(1), this);
     break;
   case Op_CallStaticJava:
diff --git a/src/hotspot/share/opto/compile.hpp b/src/hotspot/share/opto/compile.hpp
index e1d9b61f7f8..7c998d59d37 100644
--- a/src/hotspot/share/opto/compile.hpp
+++ b/src/hotspot/share/opto/compile.hpp
@@ -355,7 +355,6 @@ class Compile : public Phase {
   bool                  _has_method_handle_invokes; // True if this method has MethodHandle invokes.
   bool                  _has_monitors;          // Metadata transfered to nmethod to enable Continuations lock-detection fastpath
   bool                  _clinit_barrier_on_entry; // True if clinit barrier is needed on nmethod entry
-  RTMState              _rtm_state;             // State of Restricted Transactional Memory usage
   int                   _loop_opts_cnt;         // loop opts round
   uint                  _stress_seed;           // Seed for stress testing
 
@@ -667,10 +666,6 @@ class Compile : public Phase {
   void          set_print_inlining(bool z)       { _print_inlining = z; }
   bool              print_intrinsics() const     { return _print_intrinsics; }
   void          set_print_intrinsics(bool z)     { _print_intrinsics = z; }
-  RTMState          rtm_state()  const           { return _rtm_state; }
-  void          set_rtm_state(RTMState s)        { _rtm_state = s; }
-  bool              use_rtm() const              { return (_rtm_state & NoRTM) == 0; }
-  bool          profile_rtm() const              { return _rtm_state == ProfileRTM; }
   uint              max_node_limit() const       { return (uint)_max_node_limit; }
   void          set_max_node_limit(uint n)       { _max_node_limit = n; }
   bool              clinit_barrier_on_entry()       { return _clinit_barrier_on_entry; }
diff --git a/src/hotspot/share/opto/constantTable.hpp b/src/hotspot/share/opto/constantTable.hpp
index f7197783773..74d310ec8d5 100644
--- a/src/hotspot/share/opto/constantTable.hpp
+++ b/src/hotspot/share/opto/constantTable.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -50,7 +50,7 @@ class ConstantTable {
     bool      _can_be_reused;  // true (default) if the value can be shared with other users.
 
   public:
-    Constant() : _type(T_ILLEGAL), _is_array(false), _alignment(-1), _offset(-1), _freq(0.0f), _can_be_reused(true) { _v._value.l = 0; }
+    Constant() : _type(T_ILLEGAL), _is_array(false), _alignment(-1), _offset(-1), _freq(0.0f), _can_be_reused(true) { _v._value.l = nullptr; }
     Constant(BasicType type, jvalue value, float freq = 0.0f, bool can_be_reused = true) :
       _type(type),
       _is_array(false),
diff --git a/src/hotspot/share/opto/convertnode.hpp b/src/hotspot/share/opto/convertnode.hpp
index cf76f5ab6fd..9438176a9f9 100644
--- a/src/hotspot/share/opto/convertnode.hpp
+++ b/src/hotspot/share/opto/convertnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -260,7 +260,7 @@ class RoundDoubleModeNode: public Node {
     rmode_floor = 1,
     rmode_ceil  = 2
   };
-  RoundDoubleModeNode(Node *in1, Node * rmode): Node(0, in1, rmode) {}
+  RoundDoubleModeNode(Node *in1, Node * rmode): Node(nullptr, in1, rmode) {}
   static RoundDoubleModeNode* make(PhaseGVN& gvn, Node* arg, RoundDoubleModeNode::RoundingMode rmode);
   virtual int   Opcode() const;
   virtual const Type *bottom_type() const { return Type::DOUBLE; }
diff --git a/src/hotspot/share/opto/countbitsnode.hpp b/src/hotspot/share/opto/countbitsnode.hpp
index b0703d33326..410d5129882 100644
--- a/src/hotspot/share/opto/countbitsnode.hpp
+++ b/src/hotspot/share/opto/countbitsnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -33,7 +33,7 @@ class PhaseTransform;
 //---------- CountBitsNode -----------------------------------------------------
 class CountBitsNode : public Node {
   public:
-  CountBitsNode(Node* in1) : Node(0, in1) {}
+  CountBitsNode(Node* in1) : Node(nullptr, in1) {}
   const Type* bottom_type() const { return TypeInt::INT; }
   virtual uint ideal_reg() const { return Op_RegI; }
 };
diff --git a/src/hotspot/share/opto/divnode.cpp b/src/hotspot/share/opto/divnode.cpp
index 9c6c6ed25de..967d6661eec 100644
--- a/src/hotspot/share/opto/divnode.cpp
+++ b/src/hotspot/share/opto/divnode.cpp
@@ -266,7 +266,6 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
   }
 
   // Taken from Hacker's Delight, Fig. 8-2. Multiply high signed.
-  // (http://www.hackersdelight.org/HDcode/mulhs.c)
   //
   // int mulhs(int u, int v) {
   //    unsigned u0, v0, w0;
diff --git a/src/hotspot/share/opto/escape.cpp b/src/hotspot/share/opto/escape.cpp
index 5630ee0228d..2ca722148b6 100644
--- a/src/hotspot/share/opto/escape.cpp
+++ b/src/hotspot/share/opto/escape.cpp
@@ -574,18 +574,23 @@ bool ConnectionGraph::can_reduce_check_users(Node* n, uint nesting) const {
         // CmpP/N used by the If controlling the cast.
         if (use->in(0)->is_IfTrue() || use->in(0)->is_IfFalse()) {
           Node* iff = use->in(0)->in(0);
-          if (iff->Opcode() == Op_If && iff->in(1)->is_Bool() && iff->in(1)->in(1)->is_Cmp()) {
+          // We may have Opaque4 node between If and Bool nodes.
+          // Bail out in such case - we need to preserve Opaque4 for correct
+          // processing predicates after loop opts.
+          bool can_reduce = (iff->Opcode() == Op_If) && iff->in(1)->is_Bool() && iff->in(1)->in(1)->is_Cmp();
+          if (can_reduce) {
             Node* iff_cmp = iff->in(1)->in(1);
             int opc = iff_cmp->Opcode();
-            if ((opc == Op_CmpP || opc == Op_CmpN) && !can_reduce_cmp(n, iff_cmp)) {
+            can_reduce = (opc == Op_CmpP || opc == Op_CmpN) && can_reduce_cmp(n, iff_cmp);
+          }
+          if (!can_reduce) {
 #ifndef PRODUCT
-              if (TraceReduceAllocationMerges) {
-                tty->print_cr("Can NOT reduce Phi %d on invocation %d. CastPP %d doesn't have simple control.", n->_idx, _invocation, use->_idx);
-                n->dump(5);
-              }
-#endif
-              return false;
+            if (TraceReduceAllocationMerges) {
+              tty->print_cr("Can NOT reduce Phi %d on invocation %d. CastPP %d doesn't have simple control.", n->_idx, _invocation, use->_idx);
+              n->dump(5);
             }
+#endif
+            return false;
           }
         }
       }
@@ -651,7 +656,12 @@ Node* ConnectionGraph::specialize_cmp(Node* base, Node* curr_ctrl) {
   if (curr_ctrl == nullptr || curr_ctrl->is_Region()) {
     con = _igvn->zerocon(t->basic_type());
   } else {
-    Node* curr_cmp = curr_ctrl->in(0)->in(1)->in(1); // true/false -> if -> bool -> cmp
+    // can_reduce_check_users() verified graph: true/false -> if -> bool -> cmp
+    assert(curr_ctrl->in(0)->Opcode() == Op_If, "unexpected node %s", curr_ctrl->in(0)->Name());
+    Node* bol = curr_ctrl->in(0)->in(1);
+    assert(bol->is_Bool(), "unexpected node %s", bol->Name());
+    Node* curr_cmp = bol->in(1);
+    assert(curr_cmp->Opcode() == Op_CmpP || curr_cmp->Opcode() == Op_CmpN, "unexpected node %s", curr_cmp->Name());
     con = curr_cmp->in(1)->is_Con() ? curr_cmp->in(1) : curr_cmp->in(2);
   }
 
@@ -2197,6 +2207,7 @@ void ConnectionGraph::process_call_arguments(CallNode *call) {
                   strcmp(call->as_CallLeaf()->_name, "bigIntegerRightShiftWorker") == 0 ||
                   strcmp(call->as_CallLeaf()->_name, "bigIntegerLeftShiftWorker") == 0 ||
                   strcmp(call->as_CallLeaf()->_name, "vectorizedMismatch") == 0 ||
+                  strcmp(call->as_CallLeaf()->_name, "stringIndexOf") == 0 ||
                   strcmp(call->as_CallLeaf()->_name, "arraysort_stub") == 0 ||
                   strcmp(call->as_CallLeaf()->_name, "array_partition_stub") == 0 ||
                   strcmp(call->as_CallLeaf()->_name, "get_class_id_intrinsic") == 0 ||
@@ -3501,12 +3512,11 @@ bool ConnectionGraph::not_global_escape(Node *n) {
 // and locked code region (identified by BoxLockNode) is balanced:
 // all compiled code paths have corresponding Lock/Unlock pairs.
 bool ConnectionGraph::can_eliminate_lock(AbstractLockNode* alock) {
-  BoxLockNode* box = alock->box_node()->as_BoxLock();
-  if (!box->is_unbalanced() && not_global_escape(alock->obj_node())) {
+  if (alock->is_balanced() && not_global_escape(alock->obj_node())) {
     if (EliminateNestedLocks) {
       // We can mark whole locking region as Local only when only
       // one object is used for locking.
-      box->set_local();
+      alock->box_node()->as_BoxLock()->set_local();
     }
     return true;
   }
diff --git a/src/hotspot/share/opto/graphKit.cpp b/src/hotspot/share/opto/graphKit.cpp
index 614a4123c0d..134d21e5bad 100644
--- a/src/hotspot/share/opto/graphKit.cpp
+++ b/src/hotspot/share/opto/graphKit.cpp
@@ -3491,9 +3491,6 @@ FastLockNode* GraphKit::shared_lock(Node* obj) {
 
   FastLockNode * flock = _gvn.transform(new FastLockNode(0, obj, box) )->as_FastLock();
 
-  // Create the rtm counters for this fast lock if needed.
-  flock->create_rtm_lock_counter(sync_jvms()); // sync_jvms used to get current bci
-
   // Add monitor to debug info for the slow path.  If we block inside the
   // slow path and de-opt, we need the monitor hanging around
   map()->push_monitor( flock );
diff --git a/src/hotspot/share/opto/idealGraphPrinter.cpp b/src/hotspot/share/opto/idealGraphPrinter.cpp
index 8a9da980893..4b813252ff9 100644
--- a/src/hotspot/share/opto/idealGraphPrinter.cpp
+++ b/src/hotspot/share/opto/idealGraphPrinter.cpp
@@ -143,21 +143,24 @@ void IdealGraphPrinter::init(const char* file_name, bool use_multiple_files, boo
   _depth = 0;
   _current_method = nullptr;
   _network_stream = nullptr;
+  _append = append;
 
   if (file_name != nullptr) {
-    init_file_stream(file_name, use_multiple_files, append);
+    init_file_stream(file_name, use_multiple_files);
   } else {
     init_network_stream();
   }
   _xml = new (mtCompiler) xmlStream(_output);
-  if (!append) {
+  if (!_append) {
     head(TOP_ELEMENT);
   }
 }
 
 // Destructor, close file or network stream
 IdealGraphPrinter::~IdealGraphPrinter() {
-  tail(TOP_ELEMENT);
+  if (!_append) {
+    tail(TOP_ELEMENT);
+  }
 
   // tty->print_cr("Walk time: %d", (int)_walk_time.milliseconds());
   // tty->print_cr("Output time: %d", (int)_output_time.milliseconds());
@@ -860,10 +863,10 @@ void IdealGraphPrinter::print(const char *name, Node *node) {
   _xml->flush();
 }
 
-void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multiple_files, bool append) {
+void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multiple_files) {
   ThreadCritical tc;
   if (use_multiple_files && _file_count != 0) {
-    assert(!append, "append should only be used for debugging with a single file");
+    assert(!_append, "append should only be used for debugging with a single file");
     ResourceMark rm;
     stringStream st;
     const char* dot = strrchr(file_name, '.');
@@ -875,10 +878,10 @@ void IdealGraphPrinter::init_file_stream(const char* file_name, bool use_multipl
     }
     _output = new (mtCompiler) fileStream(st.as_string(), "w");
   } else {
-    _output = new (mtCompiler) fileStream(file_name, append ? "a" : "w");
+    _output = new (mtCompiler) fileStream(file_name, _append ? "a" : "w");
   }
   if (use_multiple_files) {
-    assert(!append, "append should only be used for debugging with a single file");
+    assert(!_append, "append should only be used for debugging with a single file");
     _file_count++;
   }
 }
@@ -909,9 +912,16 @@ void IdealGraphPrinter::update_compiled_method(ciMethod* current_method) {
   assert(C != nullptr, "must already be set");
   if (current_method != _current_method) {
     // If a different method, end the old and begin with the new one.
-    end_method();
-    _current_method = nullptr;
-    begin_method();
+    if (_append) {
+      // Do not call `end_method` if we are appending, just update `_current_method`,
+      // because `begin_method` is not called in the constructor in append mode.
+      _current_method = current_method;
+    } else {
+      // End the old method and begin a new one.
+      // Don't worry about `_current_method`, `end_method` will clear it.
+      end_method();
+      begin_method();
+    }
   }
 }
 
diff --git a/src/hotspot/share/opto/idealGraphPrinter.hpp b/src/hotspot/share/opto/idealGraphPrinter.hpp
index 11b0b6e5ea1..65d7f4b5473 100644
--- a/src/hotspot/share/opto/idealGraphPrinter.hpp
+++ b/src/hotspot/share/opto/idealGraphPrinter.hpp
@@ -96,6 +96,7 @@ class IdealGraphPrinter : public CHeapObj<mtCompiler> {
   bool _traverse_outs;
   Compile *C;
   double _max_freq;
+  bool _append;
 
   void print_method(ciMethod* method, int bci, InlineTree* tree);
   void print_inline_tree(InlineTree* tree);
@@ -118,7 +119,7 @@ class IdealGraphPrinter : public CHeapObj<mtCompiler> {
   void head(const char *name);
   void text(const char *s);
   void init(const char* file_name, bool use_multiple_files, bool append);
-  void init_file_stream(const char* file_name, bool use_multiple_files, bool append);
+  void init_file_stream(const char* file_name, bool use_multiple_files);
   void init_network_stream();
   IdealGraphPrinter();
   ~IdealGraphPrinter();
diff --git a/src/hotspot/share/opto/ifnode.cpp b/src/hotspot/share/opto/ifnode.cpp
index 9760be95ddd..a5722c45a5e 100644
--- a/src/hotspot/share/opto/ifnode.cpp
+++ b/src/hotspot/share/opto/ifnode.cpp
@@ -47,6 +47,24 @@
 extern uint explicit_null_checks_elided;
 #endif
 
+IfNode::IfNode(Node* control, Node* bol, float p, float fcnt)
+    : MultiBranchNode(2),
+      _prob(p),
+      _fcnt(fcnt)
+      NOT_PRODUCT(COMMA _assertion_predicate_type(AssertionPredicateType::None)) {
+  init_node(control, bol);
+}
+
+#ifndef PRODUCT
+IfNode::IfNode(Node* control, Node* bol, float p, float fcnt, AssertionPredicateType assertion_predicate_type)
+    : MultiBranchNode(2),
+      _prob(p),
+      _fcnt(fcnt),
+      _assertion_predicate_type(assertion_predicate_type) {
+  init_node(control, bol);
+}
+#endif // NOT_PRODUCT
+
 //=============================================================================
 //------------------------------Value------------------------------------------
 // Return a tuple for whichever arm of the IF is reachable
@@ -1822,11 +1840,23 @@ void IfProjNode::pin_array_access_nodes(PhaseIterGVN* igvn) {
 }
 
 #ifndef PRODUCT
-//------------------------------dump_spec--------------------------------------
-void IfNode::dump_spec(outputStream *st) const {
-  st->print("P=%f, C=%f",_prob,_fcnt);
+void IfNode::dump_spec(outputStream* st) const {
+  switch (_assertion_predicate_type) {
+    case AssertionPredicateType::Init_value:
+      st->print("#Init Value Assertion Predicate  ");
+      break;
+    case AssertionPredicateType::Last_value:
+      st->print("#Last Value Assertion Predicate  ");
+      break;
+    case AssertionPredicateType::None:
+      // No Assertion Predicate
+      break;
+    default:
+      fatal("Unknown Assertion Predicate type");
+  }
+  st->print("P=%f, C=%f", _prob, _fcnt);
 }
-#endif
+#endif // NOT PRODUCT
 
 //------------------------------idealize_test----------------------------------
 // Try to canonicalize tests better.  Peek at the Cmp/Bool/If sequence and
@@ -2181,6 +2211,8 @@ void ParsePredicateNode::dump_spec(outputStream* st) const {
     default:
       fatal("unknown kind");
   }
+  if (_useless) {
+    st->print("#useless ");
+  }
 }
-
 #endif // NOT PRODUCT
diff --git a/src/hotspot/share/opto/intrinsicnode.hpp b/src/hotspot/share/opto/intrinsicnode.hpp
index e8ebad788eb..bfb200b5e96 100644
--- a/src/hotspot/share/opto/intrinsicnode.hpp
+++ b/src/hotspot/share/opto/intrinsicnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -239,7 +239,7 @@ class WhitespaceNode : public Node {
 //------------------------------CopySign-----------------------------------------
 class CopySignDNode : public Node {
  protected:
-  CopySignDNode(Node* in1, Node* in2, Node* in3) : Node(0, in1, in2, in3) {}
+  CopySignDNode(Node* in1, Node* in2, Node* in3) : Node(nullptr, in1, in2, in3) {}
  public:
   static CopySignDNode* make(PhaseGVN& gvn, Node* in1, Node* in2);
   virtual int Opcode() const;
@@ -249,7 +249,7 @@ class CopySignDNode : public Node {
 
 class CopySignFNode : public Node {
  public:
-  CopySignFNode(Node* in1, Node* in2) : Node(0, in1, in2) {}
+  CopySignFNode(Node* in1, Node* in2) : Node(nullptr, in1, in2) {}
   virtual int Opcode() const;
   const Type* bottom_type() const { return TypeLong::FLOAT; }
   virtual uint ideal_reg() const { return Op_RegF; }
@@ -258,7 +258,7 @@ class CopySignFNode : public Node {
 //------------------------------Signum-------------------------------------------
 class SignumDNode : public Node {
  protected:
-  SignumDNode(Node* in1, Node* in2, Node* in3) : Node(0, in1, in2, in3) {}
+  SignumDNode(Node* in1, Node* in2, Node* in3) : Node(nullptr, in1, in2, in3) {}
  public:
   static SignumDNode* make(PhaseGVN& gvn, Node* in);
   virtual int Opcode() const;
@@ -268,7 +268,7 @@ class SignumDNode : public Node {
 
 class SignumFNode : public Node {
  protected:
-  SignumFNode(Node* in1, Node* in2, Node* in3) : Node(0, in1, in2, in3) {}
+  SignumFNode(Node* in1, Node* in2, Node* in3) : Node(nullptr, in1, in2, in3) {}
  public:
   static SignumFNode* make(PhaseGVN& gvn, Node* in);
   virtual int Opcode() const;
@@ -306,7 +306,7 @@ class ExpandBitsNode : public TypeNode {
 //---------- IsInfiniteFNode -----------------------------------------------------
 class IsInfiniteFNode : public Node {
   public:
-  IsInfiniteFNode(Node* in1) : Node(0, in1) {}
+  IsInfiniteFNode(Node* in1) : Node(nullptr, in1) {}
   virtual int   Opcode() const;
   const Type* bottom_type() const { return TypeInt::BOOL; }
   virtual uint ideal_reg() const { return Op_RegI; }
@@ -315,7 +315,7 @@ class IsInfiniteFNode : public Node {
 //---------- IsInfiniteDNode -----------------------------------------------------
 class IsInfiniteDNode : public Node {
   public:
-  IsInfiniteDNode(Node* in1) : Node(0, in1) {}
+  IsInfiniteDNode(Node* in1) : Node(nullptr, in1) {}
   virtual int   Opcode() const;
   const Type* bottom_type() const { return TypeInt::BOOL; }
   virtual uint ideal_reg() const { return Op_RegI; }
@@ -324,7 +324,7 @@ class IsInfiniteDNode : public Node {
 //---------- IsFiniteFNode -----------------------------------------------------
 class IsFiniteFNode : public Node {
   public:
-  IsFiniteFNode(Node* in1) : Node(0, in1) {}
+  IsFiniteFNode(Node* in1) : Node(nullptr, in1) {}
   virtual int   Opcode() const;
   const Type* bottom_type() const { return TypeInt::BOOL; }
   virtual uint ideal_reg() const { return Op_RegI; }
@@ -333,7 +333,7 @@ class IsFiniteFNode : public Node {
 //---------- IsFiniteDNode -----------------------------------------------------
 class IsFiniteDNode : public Node {
   public:
-  IsFiniteDNode(Node* in1) : Node(0, in1) {}
+  IsFiniteDNode(Node* in1) : Node(nullptr, in1) {}
   virtual int   Opcode() const;
   const Type* bottom_type() const { return TypeInt::BOOL; }
   virtual uint ideal_reg() const { return Op_RegI; }
diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp
index 33c2d7309d0..ebe9258f99b 100644
--- a/src/hotspot/share/opto/library_call.cpp
+++ b/src/hotspot/share/opto/library_call.cpp
@@ -1205,6 +1205,9 @@ bool LibraryCallKit::inline_string_indexOf(StrIntrinsicNode::ArgEnc ae) {
   Node* tgt_start = array_element_address(tgt, intcon(0), T_BYTE);
   Node* tgt_count = load_array_length(tgt);
 
+  Node* result = nullptr;
+  bool call_opt_stub = (StubRoutines::_string_indexof_array[ae] != nullptr);
+
   if (ae == StrIntrinsicNode::UU || ae == StrIntrinsicNode::UL) {
     // Divide src size by 2 if String is UTF16 encoded
     src_count = _gvn.transform(new RShiftINode(src_count, intcon(1)));
@@ -1214,7 +1217,16 @@ bool LibraryCallKit::inline_string_indexOf(StrIntrinsicNode::ArgEnc ae) {
     tgt_count = _gvn.transform(new RShiftINode(tgt_count, intcon(1)));
   }
 
-  Node* result = make_indexOf_node(src_start, src_count, tgt_start, tgt_count, result_rgn, result_phi, ae);
+  if (call_opt_stub) {
+    Node* call = make_runtime_call(RC_LEAF, OptoRuntime::string_IndexOf_Type(),
+                                   StubRoutines::_string_indexof_array[ae],
+                                   "stringIndexOf", TypePtr::BOTTOM, src_start,
+                                   src_count, tgt_start, tgt_count);
+    result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
+  } else {
+    result = make_indexOf_node(src_start, src_count, tgt_start, tgt_count,
+                               result_rgn, result_phi, ae);
+  }
   if (result != nullptr) {
     result_phi->init_req(3, result);
     result_rgn->init_req(3, control());
@@ -1226,7 +1238,7 @@ bool LibraryCallKit::inline_string_indexOf(StrIntrinsicNode::ArgEnc ae) {
   return true;
 }
 
-//-----------------------------inline_string_indexOf-----------------------
+//-----------------------------inline_string_indexOfI-----------------------
 bool LibraryCallKit::inline_string_indexOfI(StrIntrinsicNode::ArgEnc ae) {
   if (too_many_traps(Deoptimization::Reason_intrinsic)) {
     return false;
@@ -1234,6 +1246,7 @@ bool LibraryCallKit::inline_string_indexOfI(StrIntrinsicNode::ArgEnc ae) {
   if (!Matcher::match_rule_supported(Op_StrIndexOf)) {
     return false;
   }
+
   assert(callee()->signature()->size() == 5, "String.indexOf() has 5 arguments");
   Node* src         = argument(0); // byte[]
   Node* src_count   = argument(1); // char count
@@ -1259,8 +1272,21 @@ bool LibraryCallKit::inline_string_indexOfI(StrIntrinsicNode::ArgEnc ae) {
 
   RegionNode* region = new RegionNode(5);
   Node* phi = new PhiNode(region, TypeInt::INT);
+  Node* result = nullptr;
 
-  Node* result = make_indexOf_node(src_start, src_count, tgt_start, tgt_count, region, phi, ae);
+  bool call_opt_stub = (StubRoutines::_string_indexof_array[ae] != nullptr);
+
+  if (call_opt_stub) {
+    assert(arrayOopDesc::base_offset_in_bytes(T_BYTE) >= 16, "Needed for indexOf");
+    Node* call = make_runtime_call(RC_LEAF, OptoRuntime::string_IndexOf_Type(),
+                                   StubRoutines::_string_indexof_array[ae],
+                                   "stringIndexOf", TypePtr::BOTTOM, src_start,
+                                   src_count, tgt_start, tgt_count);
+    result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
+  } else {
+    result = make_indexOf_node(src_start, src_count, tgt_start, tgt_count,
+                               region, phi, ae);
+  }
   if (result != nullptr) {
     // The result is index relative to from_index if substring was found, -1 otherwise.
     // Generate code which will fold into cmove.
@@ -5463,42 +5489,72 @@ void LibraryCallKit::create_new_uncommon_trap(CallStaticJavaNode* uncommon_trap_
   uncommon_trap_call->set_req(0, top()); // not used anymore, kill it
 }
 
+// Common checks for array sorting intrinsics arguments.
+// Returns `true` if checks passed.
+bool LibraryCallKit::check_array_sort_arguments(Node* elementType, Node* obj, BasicType& bt) {
+  // check address of the class
+  if (elementType == nullptr || elementType->is_top()) {
+    return false;  // dead path
+  }
+  const TypeInstPtr* elem_klass = gvn().type(elementType)->isa_instptr();
+  if (elem_klass == nullptr) {
+    return false;  // dead path
+  }
+  // java_mirror_type() returns non-null for compile-time Class constants only
+  ciType* elem_type = elem_klass->java_mirror_type();
+  if (elem_type == nullptr) {
+    return false;
+  }
+  bt = elem_type->basic_type();
+  // Disable the intrinsic if the CPU does not support SIMD sort
+  if (!Matcher::supports_simd_sort(bt)) {
+    return false;
+  }
+  // check address of the array
+  if (obj == nullptr || obj->is_top()) {
+    return false;  // dead path
+  }
+  const TypeAryPtr* obj_t = _gvn.type(obj)->isa_aryptr();
+  if (obj_t == nullptr || obj_t->elem() == Type::BOTTOM) {
+    return false; // failed input validation
+  }
+  return true;
+}
+
 //------------------------------inline_array_partition-----------------------
 bool LibraryCallKit::inline_array_partition() {
+  address stubAddr = StubRoutines::select_array_partition_function();
+  if (stubAddr == nullptr) {
+    return false; // Intrinsic's stub is not implemented on this platform
+  }
+  assert(callee()->signature()->size() == 9, "arrayPartition has 8 parameters (one long)");
 
-  Node* elementType     = null_check(argument(0));
+  // no receiver because it is a static method
+  Node* elementType     = argument(0);
   Node* obj             = argument(1);
-  Node* offset          = argument(2);
+  Node* offset          = argument(2); // long
   Node* fromIndex       = argument(4);
   Node* toIndex         = argument(5);
   Node* indexPivot1     = argument(6);
   Node* indexPivot2     = argument(7);
+  // PartitionOperation:  argument(8) is ignored
 
   Node* pivotIndices = nullptr;
+  BasicType bt = T_ILLEGAL;
 
+  if (!check_array_sort_arguments(elementType, obj, bt)) {
+    return false;
+  }
+  null_check(obj);
+  // If obj is dead, only null-path is taken.
+  if (stopped()) {
+    return true;
+  }
   // Set the original stack and the reexecute bit for the interpreter to reexecute
   // the bytecode that invokes DualPivotQuicksort.partition() if deoptimization happens.
   { PreserveReexecuteState preexecs(this);
     jvms()->set_should_reexecute(true);
 
-    const TypeInstPtr* elem_klass = gvn().type(elementType)->isa_instptr();
-    ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
-    BasicType bt = elem_type->basic_type();
-    // Disable the intrinsic if the CPU does not support SIMD sort
-    if (!Matcher::supports_simd_sort(bt)) {
-      return false;
-    }
-    address stubAddr = nullptr;
-    stubAddr = StubRoutines::select_array_partition_function();
-    // stub not loaded
-    if (stubAddr == nullptr) {
-      return false;
-    }
-    // get the address of the array
-    const TypeAryPtr* obj_t = _gvn.type(obj)->isa_aryptr();
-    if (obj_t == nullptr || obj_t->elem() == Type::BOTTOM ) {
-      return false; // failed input validation
-    }
     Node* obj_adr = make_unsafe_address(obj, offset);
 
     // create the pivotIndices array of type int and size = 2
@@ -5531,31 +5587,29 @@ bool LibraryCallKit::inline_array_partition() {
 
 //------------------------------inline_array_sort-----------------------
 bool LibraryCallKit::inline_array_sort() {
+  address stubAddr = StubRoutines::select_arraysort_function();
+  if (stubAddr == nullptr) {
+    return false; // Intrinsic's stub is not implemented on this platform
+  }
+  assert(callee()->signature()->size() == 7, "arraySort has 6 parameters (one long)");
 
-  Node* elementType     = null_check(argument(0));
+  // no receiver because it is a static method
+  Node* elementType     = argument(0);
   Node* obj             = argument(1);
-  Node* offset          = argument(2);
+  Node* offset          = argument(2); // long
   Node* fromIndex       = argument(4);
   Node* toIndex         = argument(5);
+  // SortOperation:       argument(6) is ignored
 
-  const TypeInstPtr* elem_klass = gvn().type(elementType)->isa_instptr();
-  ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
-  BasicType bt = elem_type->basic_type();
-  // Disable the intrinsic if the CPU does not support SIMD sort
-  if (!Matcher::supports_simd_sort(bt)) {
-    return false;
-  }
-  address stubAddr = nullptr;
-  stubAddr = StubRoutines::select_arraysort_function();
-  //stub not loaded
-  if (stubAddr == nullptr) {
+  BasicType bt = T_ILLEGAL;
+
+  if (!check_array_sort_arguments(elementType, obj, bt)) {
     return false;
   }
-
-  // get address of the array
-  const TypeAryPtr* obj_t = _gvn.type(obj)->isa_aryptr();
-  if (obj_t == nullptr || obj_t->elem() == Type::BOTTOM ) {
-    return false; // failed input validation
+  null_check(obj);
+  // If obj is dead, only null-path is taken.
+  if (stopped()) {
+    return true;
   }
   Node* obj_adr = make_unsafe_address(obj, offset);
 
@@ -7554,8 +7608,6 @@ bool LibraryCallKit::inline_intpoly_montgomeryMult_P256() {
                                  OptoRuntime::intpoly_montgomeryMult_P256_Type(),
                                  stubAddr, stubName, TypePtr::BOTTOM,
                                  a_start, b_start, r_start);
-  Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
-  set_result(result);
   return true;
 }
 
@@ -7655,7 +7707,7 @@ bool LibraryCallKit::inline_digestBase_implCompress(vmIntrinsics::ID id) {
     break;
   case vmIntrinsics::_sha3_implCompress:
     assert(UseSHA3Intrinsics, "need SHA3 instruction support");
-    state = get_state_from_digest_object(digestBase_obj, T_BYTE);
+    state = get_state_from_digest_object(digestBase_obj, T_LONG);
     stubAddr = StubRoutines::sha3_implCompress();
     stubName = "sha3_implCompress";
     block_size = get_block_size_from_digest_object(digestBase_obj);
@@ -7755,7 +7807,7 @@ bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) {
       klass_digestBase_name = "sun/security/provider/SHA3";
       stub_name = "sha3_implCompressMB";
       stub_addr = StubRoutines::sha3_implCompressMB();
-      elem_type = T_BYTE;
+      elem_type = T_LONG;
     }
     break;
   default:
diff --git a/src/hotspot/share/opto/library_call.hpp b/src/hotspot/share/opto/library_call.hpp
index 941282ce2e7..313e8c39544 100644
--- a/src/hotspot/share/opto/library_call.hpp
+++ b/src/hotspot/share/opto/library_call.hpp
@@ -279,6 +279,7 @@ class LibraryCallKit : public GraphKit {
   JVMState* arraycopy_restore_alloc_state(AllocateArrayNode* alloc, int& saved_reexecute_sp);
   void arraycopy_move_allocation_here(AllocateArrayNode* alloc, Node* dest, JVMState* saved_jvms_before_guards, int saved_reexecute_sp,
                                       uint new_idx);
+  bool check_array_sort_arguments(Node* elementType, Node* obj, BasicType& bt);
   bool inline_array_sort();
   bool inline_array_partition();
   typedef enum { LS_get_add, LS_get_set, LS_cmp_swap, LS_cmp_swap_weak, LS_cmp_exchange } LoadStoreKind;
diff --git a/src/hotspot/share/opto/locknode.cpp b/src/hotspot/share/opto/locknode.cpp
index 17d26d620e5..917d9d2bada 100644
--- a/src/hotspot/share/opto/locknode.cpp
+++ b/src/hotspot/share/opto/locknode.cpp
@@ -194,22 +194,6 @@ bool FastUnlockNode::cmp( const Node &n ) const {
   return (&n == this);                // Always fail except on self
 }
 
-void FastLockNode::create_rtm_lock_counter(JVMState* state) {
-#if INCLUDE_RTM_OPT
-  Compile* C = Compile::current();
-  if (C->profile_rtm() || (PrintPreciseRTMLockingStatistics && C->use_rtm())) {
-    RTMLockingNamedCounter* rlnc = (RTMLockingNamedCounter*)
-           OptoRuntime::new_named_counter(state, NamedCounter::RTMLockingCounter);
-    _rtm_counters = rlnc->counters();
-    if (UseRTMForStackLocks) {
-      rlnc = (RTMLockingNamedCounter*)
-           OptoRuntime::new_named_counter(state, NamedCounter::RTMLockingCounter);
-      _stack_rtm_counters = rlnc->counters();
-    }
-  }
-#endif
-}
-
 //=============================================================================
 //------------------------------do_monitor_enter-------------------------------
 void Parse::do_monitor_enter() {
diff --git a/src/hotspot/share/opto/locknode.hpp b/src/hotspot/share/opto/locknode.hpp
index fcc8da0eb34..229dcb73292 100644
--- a/src/hotspot/share/opto/locknode.hpp
+++ b/src/hotspot/share/opto/locknode.hpp
@@ -29,8 +29,6 @@
 #include "opto/opcodes.hpp"
 #include "opto/subnode.hpp"
 
-class RTMLockingCounters;
-
 //------------------------------BoxLockNode------------------------------------
 class BoxLockNode : public Node {
 private:
@@ -46,7 +44,7 @@ class BoxLockNode : public Node {
     Eliminated         // All lock/unlock in region were eliminated
   } _kind;
 
-#ifdef ASSERT
+#ifndef PRODUCT
   const char* _kind_name[6] = {
    "Regular",
    "Local",
@@ -124,22 +122,18 @@ class BoxLockNode : public Node {
 
 #ifndef PRODUCT
   virtual void format( PhaseRegAlloc *, outputStream *st ) const;
-  virtual void dump_spec(outputStream *st) const { st->print("  Lock %d",_slot); }
+  virtual void dump_spec(outputStream *st) const {
+    st->print("  Lock slot: %d, Kind: %s", _slot, _kind_name[(int)_kind]);
+  }
 #endif
 };
 
 //------------------------------FastLockNode-----------------------------------
 class FastLockNode: public CmpNode {
-private:
-  RTMLockingCounters*       _rtm_counters; // RTM lock counters for inflated locks
-  RTMLockingCounters* _stack_rtm_counters; // RTM lock counters for stack locks
-
 public:
   FastLockNode(Node *ctrl, Node *oop, Node *box) : CmpNode(oop,box) {
     init_req(0,ctrl);
     init_class_id(Class_FastLock);
-    _rtm_counters = nullptr;
-    _stack_rtm_counters = nullptr;
   }
   Node* obj_node() const { return in(1); }
   Node* box_node() const { return in(2); }
@@ -153,10 +147,6 @@ class FastLockNode: public CmpNode {
   virtual int Opcode() const;
   virtual const Type* Value(PhaseGVN* phase) const { return TypeInt::CC; }
   const Type *sub(const Type *t1, const Type *t2) const { return TypeInt::CC;}
-
-  void create_rtm_lock_counter(JVMState* state);
-  RTMLockingCounters*       rtm_counters() const { return _rtm_counters; }
-  RTMLockingCounters* stack_rtm_counters() const { return _stack_rtm_counters; }
 };
 
 
diff --git a/src/hotspot/share/opto/loopPredicate.cpp b/src/hotspot/share/opto/loopPredicate.cpp
index e23da54f765..f8d3fa0b6d9 100644
--- a/src/hotspot/share/opto/loopPredicate.cpp
+++ b/src/hotspot/share/opto/loopPredicate.cpp
@@ -101,7 +101,8 @@ void PhaseIdealLoop::register_control(Node* n, IdealLoopTree *loop, Node* pred,
 // is an IfTrue projection. This code is also used to clone predicates to cloned loops.
 IfTrueNode* PhaseIdealLoop::create_new_if_for_predicate(ParsePredicateSuccessProj* parse_predicate_success_proj,
                                                         Node* new_entry, const Deoptimization::DeoptReason reason,
-                                                        const int opcode, const bool rewire_uncommon_proj_phi_inputs) {
+                                                        const int opcode, const bool rewire_uncommon_proj_phi_inputs
+                                                        NOT_PRODUCT (COMMA AssertionPredicateType assertion_predicate_type)) {
   assert(parse_predicate_success_proj->is_uncommon_trap_if_pattern(reason), "must be a uct if pattern!");
   ParsePredicateNode* parse_predicate = parse_predicate_success_proj->in(0)->as_ParsePredicate();
   ParsePredicateUncommonProj* uncommon_proj = parse_predicate->uncommon_proj();
@@ -143,10 +144,12 @@ IfTrueNode* PhaseIdealLoop::create_new_if_for_predicate(ParsePredicateSuccessPro
   IfNode* new_iff = nullptr;
   switch (opcode) {
     case Op_If:
-      new_iff = new IfNode(entry, parse_predicate->in(1), parse_predicate->_prob, parse_predicate->_fcnt);
+      new_iff = new IfNode(entry, parse_predicate->in(1), parse_predicate->_prob, parse_predicate->_fcnt
+                           NOT_PRODUCT(COMMA assertion_predicate_type));
       break;
     case Op_RangeCheck:
-      new_iff = new RangeCheckNode(entry, parse_predicate->in(1), parse_predicate->_prob, parse_predicate->_fcnt);
+      new_iff = new RangeCheckNode(entry, parse_predicate->in(1), parse_predicate->_prob, parse_predicate->_fcnt
+                                   NOT_PRODUCT(COMMA assertion_predicate_type));
       break;
     case Op_ParsePredicate:
       new_iff = new ParsePredicateNode(entry, reason, &_igvn);
@@ -373,7 +376,7 @@ IfProjNode* PhaseIdealLoop::clone_assertion_predicate_for_unswitched_loops(IfNod
                                                                            ParsePredicateSuccessProj* parse_predicate_proj) {
   TemplateAssertionPredicateExpression template_assertion_predicate_expression(
       template_assertion_predicate->in(1)->as_Opaque4());
-  Opaque4Node* cloned_opaque4_node = template_assertion_predicate_expression.clone(parse_predicate_proj, this);
+  Opaque4Node* cloned_opaque4_node = template_assertion_predicate_expression.clone(parse_predicate_proj->in(0)->in(0), this);
   IfProjNode* if_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, template_assertion_predicate->Opcode(), false);
   _igvn.replace_input_of(if_proj->in(0), 1, cloned_opaque4_node);
   _igvn.replace_input_of(parse_predicate_proj->in(0), 0, if_proj);
@@ -1152,7 +1155,6 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod
                                                   ParsePredicateSuccessProj* parse_predicate_proj, CountedLoopNode* cl,
                                                   ConNode* zero, Invariance& invar, Deoptimization::DeoptReason reason) {
   // Following are changed to nonnull when a predicate can be hoisted
-  IfProjNode* new_predicate_proj = nullptr;
   IfNode*   iff  = if_success_proj->in(0)->as_If();
   Node*     test = iff->in(1);
   if (!test->is_Bool()) { //Conv2B, ...
@@ -1163,10 +1165,9 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod
   if (invar.is_invariant(bol)) {
     C->print_method(PHASE_BEFORE_LOOP_PREDICATION_IC, 4, iff);
     // Invariant test
-    new_predicate_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr,
-                                                     reason,
-                                                     iff->Opcode());
-    Node* ctrl = new_predicate_proj->in(0)->as_If()->in(0);
+    IfProjNode* hoisted_check_predicate_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason,
+                                                                           iff->Opcode());
+    Node* ctrl = hoisted_check_predicate_proj->in(0)->as_If()->in(0);
     BoolNode* hoisted_check_predicate_bool = invar.clone(bol, ctrl)->as_Bool();
 
     // Negate test if necessary (Parse Predicates always have IfTrue as success projection and IfFalse as uncommon trap)
@@ -1177,11 +1178,16 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod
       register_new_node(hoisted_check_predicate_bool, ctrl);
       negated = true;
     }
-    IfNode* new_predicate_iff = new_predicate_proj->in(0)->as_If();
+    IfNode* new_predicate_iff = hoisted_check_predicate_proj->in(0)->as_If();
     _igvn.hash_delete(new_predicate_iff);
     new_predicate_iff->set_req(1, hoisted_check_predicate_bool);
 
-    C->print_method(PHASE_AFTER_LOOP_PREDICATION_IC, 4, new_predicate_proj->in(0));
+    invar.map_ctrl(if_success_proj, hoisted_check_predicate_proj); // Mark hoisted check as invariant
+
+    // Eliminate the old If in the loop body.
+    dominated_by(hoisted_check_predicate_proj, iff, negated);
+
+    C->print_method(PHASE_AFTER_LOOP_PREDICATION_IC, 4, hoisted_check_predicate_proj->in(0));
 
 #ifndef PRODUCT
     if (TraceLoopPredicate) {
@@ -1193,10 +1199,10 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod
     }
 #endif
   } else if (cl != nullptr && loop->is_range_check_if(if_success_proj, this, invar DEBUG_ONLY(COMMA parse_predicate_proj))) {
-    range_check_predicate = true;
     C->print_method(PHASE_BEFORE_LOOP_PREDICATION_RC, 4, iff);
     // Range check for counted loops
     assert(if_success_proj->is_IfTrue(), "trap must be on false projection for a range check");
+    IfTrueNode* hoisted_check_proj = if_success_proj->as_IfTrue();
     const Node*    cmp    = bol->in(1)->as_Cmp();
     Node*          idx    = cmp->in(1);
     assert(!invar.is_invariant(idx), "index is variant");
@@ -1265,10 +1271,18 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod
     // Fall through into rest of the cleanup code which will move any dependent nodes to the skeleton predicates of the
     // upper bound test. We always need to create skeleton predicates in order to properly remove dead loops when later
     // splitting the predicated loop into (unreachable) sub-loops (i.e. done by unrolling, peeling, pre/main/post etc.).
-    new_predicate_proj = add_template_assertion_predicate(iff, loop, if_success_proj, parse_predicate_proj, upper_bound_proj, scale,
-                                                          offset, init, limit, stride, rng, overflow, reason);
+    IfTrueNode* template_assertion_predicate_proj =
+        add_template_assertion_predicate(iff, loop, hoisted_check_proj, parse_predicate_proj, upper_bound_proj, scale,
+                                         offset, init, limit, stride, rng, overflow, reason);
+
+    // Eliminate the old range check in the loop body.
+    // When a range check is eliminated, data dependent nodes (Load and range check CastII nodes) are now dependent on 2
+    // Hoisted Check Predicates (one for the start of the loop, one for the end) but we can only keep track of one control
+    // dependency: pin the data dependent nodes.
+    eliminate_hoisted_range_check(hoisted_check_proj, template_assertion_predicate_proj);
+    invar.map_ctrl(hoisted_check_proj, template_assertion_predicate_proj); // Mark hoisted check as invariant
 
-    C->print_method(PHASE_AFTER_LOOP_PREDICATION_RC, 4, new_predicate_proj->in(0));
+    C->print_method(PHASE_AFTER_LOOP_PREDICATION_RC, 4, template_assertion_predicate_proj->in(0));
 
 #ifndef PRODUCT
     if (TraceLoopOpts && !TraceLoopPredicate) {
@@ -1281,24 +1295,21 @@ bool PhaseIdealLoop::loop_predication_impl_helper(IdealLoopTree* loop, IfProjNod
     // with uncommon trap.
     return false;
   }
-  assert(new_predicate_proj != nullptr, "sanity");
-  // Success - attach condition (new_predicate_bol) to predicate if
-  invar.map_ctrl(if_success_proj, new_predicate_proj); // so that invariance test can be appropriate
-
-  // Eliminate the old If in the loop body
-  // If a range check is eliminated, data dependent nodes (Load and range check CastII nodes) are now dependent on 2
-  // Hoisted Check Predicates (one for the start of the loop, one for the end) but we can only keep track of one control
-  // dependency: pin the data dependent nodes.
-  dominated_by(new_predicate_proj, iff, if_success_proj->_con != new_predicate_proj->_con, range_check_predicate);
 
   C->set_major_progress();
   return true;
 }
 
+void PhaseIdealLoop::eliminate_hoisted_range_check(IfTrueNode* hoisted_check_proj,
+                                                   IfTrueNode* template_assertion_predicate_proj) {
+  _igvn.replace_input_of(hoisted_check_proj->in(0), 1, _igvn.intcon(1));
+  rewire_safe_outputs_to_dominator(hoisted_check_proj, template_assertion_predicate_proj, true);
+}
+
 // Each newly created Hoisted Check Predicate is accompanied by two Template Assertion Predicates. Later, we initialize
 // them by making a copy of them when splitting a loop into sub loops. The Assertion Predicates ensure that dead sub
 // loops are removed properly.
-IfProjNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealLoopTree* loop, IfProjNode* if_proj,
+IfTrueNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealLoopTree* loop, IfProjNode* if_proj,
                                                              ParsePredicateSuccessProj* parse_predicate_proj,
                                                              IfProjNode* upper_bound_proj, const int scale, Node* offset,
                                                              Node* init, Node* limit, const jint stride,
@@ -1312,7 +1323,8 @@ IfProjNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealL
   Node* opaque_bol = new Opaque4Node(C, bol, _igvn.intcon(1)); // This will go away once loop opts are over
   C->add_template_assertion_predicate_opaq(opaque_bol);
   register_new_node(opaque_bol, upper_bound_proj);
-  IfProjNode* new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode());
+  IfTrueNode* new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode(),
+                                                     false NOT_PRODUCT(COMMA AssertionPredicateType::Init_value));
   _igvn.replace_input_of(new_proj->in(0), 1, opaque_bol);
   assert(opaque_init->outcnt() > 0, "should be used");
 
@@ -1337,7 +1349,8 @@ IfProjNode* PhaseIdealLoop::add_template_assertion_predicate(IfNode* iff, IdealL
   opaque_bol = new Opaque4Node(C, bol, _igvn.intcon(1));
   C->add_template_assertion_predicate_opaq(opaque_bol);
   register_new_node(opaque_bol, new_proj);
-  new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode());
+  new_proj = create_new_if_for_predicate(parse_predicate_proj, nullptr, reason, overflow ? Op_If : iff->Opcode(),
+                                         false NOT_PRODUCT(COMMA AssertionPredicateType::Last_value));
   _igvn.replace_input_of(new_proj->in(0), 1, opaque_bol);
   assert(max_value->outcnt() > 0, "should be used");
   assert(assertion_predicate_has_loop_opaque_node(new_proj->in(0)->as_If()), "unexpected");
diff --git a/src/hotspot/share/opto/loopTransform.cpp b/src/hotspot/share/opto/loopTransform.cpp
index b4faced574d..1b29d31ba68 100644
--- a/src/hotspot/share/opto/loopTransform.cpp
+++ b/src/hotspot/share/opto/loopTransform.cpp
@@ -901,15 +901,6 @@ bool IdealLoopTree::policy_maximally_unroll(PhaseIdealLoop* phase) const {
       case Op_CountPositives: {
         return false;
       }
-#if INCLUDE_RTM_OPT
-      case Op_FastLock:
-      case Op_FastUnlock: {
-        // Don't unroll RTM locking code because it is large.
-        if (UseRTMLocking) {
-          return false;
-        }
-      }
-#endif
     } // switch
   }
 
@@ -1074,15 +1065,6 @@ bool IdealLoopTree::policy_unroll(PhaseIdealLoop *phase) {
         // String intrinsics are large and have loops.
         return false;
       }
-#if INCLUDE_RTM_OPT
-      case Op_FastLock:
-      case Op_FastUnlock: {
-        // Don't unroll RTM locking code because it is large.
-        if (UseRTMLocking) {
-          return false;
-        }
-      }
-#endif
     } // switch
   }
 
@@ -2787,10 +2769,9 @@ bool PhaseIdealLoop::is_scaled_iv_plus_extra_offset(Node* exp1, Node* offset3, N
 
 // Same as PhaseIdealLoop::duplicate_predicates() but for range checks
 // eliminated by iteration splitting.
-Node* PhaseIdealLoop::add_range_check_elimination_assertion_predicate(IdealLoopTree* loop, Node* ctrl,
-                                                                      const int scale_con, Node* offset, Node* limit,
-                                                                      jint stride_con, Node* value,
-                                                                      const bool is_template) {
+Node* PhaseIdealLoop::add_range_check_elimination_assertion_predicate(
+    IdealLoopTree* loop, Node* ctrl, const int scale_con, Node* offset, Node* limit, jint stride_con, Node* value,
+    const bool is_template NOT_PRODUCT(COMMA AssertionPredicateType assertion_predicate_type)) {
   bool overflow = false;
   BoolNode* bol = rc_predicate(ctrl, scale_con, offset, value, nullptr, stride_con,
                                limit, (stride_con > 0) != (scale_con > 0), overflow);
@@ -3011,8 +2992,9 @@ void PhaseIdealLoop::do_range_check(IdealLoopTree *loop, Node_List &old_new) {
 
           // Add two Template Assertion Predicates to create new Initialized Assertion Predicates from when either
           // unrolling or splitting this main-loop further.
-          loop_entry = add_range_check_elimination_assertion_predicate(loop, loop_entry, scale_con, int_offset,
-                                                                       int_limit, stride_con, opaque_init, true);
+          loop_entry = add_range_check_elimination_assertion_predicate(
+              loop, loop_entry, scale_con, int_offset, int_limit, stride_con, opaque_init, true
+              NOT_PRODUCT(COMMA AssertionPredicateType::Init_value));
           assert(assertion_predicate_has_loop_opaque_node(loop_entry->in(0)->as_If()), "unexpected");
 
           Node* opaque_stride = new OpaqueLoopStrideNode(C, cl->stride());
@@ -3024,8 +3006,9 @@ void PhaseIdealLoop::do_range_check(IdealLoopTree *loop, Node_List &old_new) {
           // init + (current stride - initial stride) is within the loop so narrow its type by leveraging the type of the iv Phi
           max_value = new CastIINode(max_value, loop->_head->as_CountedLoop()->phi()->bottom_type());
           register_new_node(max_value, loop_entry);
-          loop_entry = add_range_check_elimination_assertion_predicate(loop, loop_entry, scale_con, int_offset,
-                                                                       int_limit, stride_con, max_value, true);
+          loop_entry = add_range_check_elimination_assertion_predicate(
+              loop, loop_entry, scale_con, int_offset, int_limit, stride_con, max_value, true
+              NOT_PRODUCT(COMMA AssertionPredicateType::Last_value));
           assert(assertion_predicate_has_loop_opaque_node(loop_entry->in(0)->as_If()), "unexpected");
 
         } else {
diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp
index d58be510516..6c16d7cc6a4 100644
--- a/src/hotspot/share/opto/loopnode.cpp
+++ b/src/hotspot/share/opto/loopnode.cpp
@@ -169,10 +169,10 @@ Node *PhaseIdealLoop::get_early_ctrl_for_expensive(Node *n, Node* earliest) {
     return earliest;
   }
 
-  while (1) {
-    Node *next = ctl;
-    // Moving the node out of a loop on the projection of a If
-    // confuses loop predication. So once we hit a Loop in a If branch
+  while (true) {
+    Node* next = ctl;
+    // Moving the node out of a loop on the projection of an If
+    // confuses Loop Predication. So, once we hit a loop in an If branch
     // that doesn't branch to an UNC, we stop. The code that process
     // expensive nodes will notice the loop and skip over it to try to
     // move the node further up.
@@ -6081,20 +6081,27 @@ Node* PhaseIdealLoop::get_late_ctrl_with_anti_dep(LoadNode* n, Node* early, Node
   return LCA;
 }
 
-// true if CFG node d dominates CFG node n
-bool PhaseIdealLoop::is_dominator(Node *d, Node *n) {
-  if (d == n)
+// Is CFG node 'dominator' dominating node 'n'?
+bool PhaseIdealLoop::is_dominator(Node* dominator, Node* n) {
+  if (dominator == n) {
     return true;
-  assert(d->is_CFG() && n->is_CFG(), "must have CFG nodes");
-  uint dd = dom_depth(d);
+  }
+  assert(dominator->is_CFG() && n->is_CFG(), "must have CFG nodes");
+  uint dd = dom_depth(dominator);
   while (dom_depth(n) >= dd) {
-    if (n == d)
+    if (n == dominator) {
       return true;
+    }
     n = idom(n);
   }
   return false;
 }
 
+// Is CFG node 'dominator' strictly dominating node 'n'?
+bool PhaseIdealLoop::is_strict_dominator(Node* dominator, Node* n) {
+  return dominator != n && is_dominator(dominator, n);
+}
+
 //------------------------------dom_lca_for_get_late_ctrl_internal-------------
 // Pair-wise LCA with tags.
 // Tag each index with the node 'tag' currently being processed
@@ -6377,31 +6384,16 @@ void PhaseIdealLoop::build_loop_late_post_work(Node *n, bool pinned) {
 
   if (least != early) {
     // Move the node above predicates as far up as possible so a
-    // following pass of loop predication doesn't hoist a predicate
+    // following pass of Loop Predication doesn't hoist a predicate
     // that depends on it above that node.
-    Node* new_ctrl = least;
-    for (;;) {
-      if (!new_ctrl->is_Proj()) {
-        break;
-      }
-      CallStaticJavaNode* call = new_ctrl->as_Proj()->is_uncommon_trap_if_pattern();
-      if (call == nullptr) {
-        break;
-      }
-      int req = call->uncommon_trap_request();
-      Deoptimization::DeoptReason trap_reason = Deoptimization::trap_request_reason(req);
-      if (trap_reason != Deoptimization::Reason_loop_limit_check &&
-          trap_reason != Deoptimization::Reason_predicate &&
-          trap_reason != Deoptimization::Reason_profile_predicate) {
-        break;
-      }
-      Node* c = new_ctrl->in(0)->in(0);
-      if (is_dominator(c, early) && c != early) {
+    PredicateEntryIterator predicate_iterator(least);
+    while (predicate_iterator.has_next()) {
+      Node* next_predicate_entry = predicate_iterator.next_entry();
+      if (is_strict_dominator(next_predicate_entry, early)) {
         break;
       }
-      new_ctrl = c;
+      least = next_predicate_entry;
     }
-    least = new_ctrl;
   }
   // Try not to place code on a loop entry projection
   // which can inhibit range check elimination.
diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp
index ad603439e59..7d78bf5021c 100644
--- a/src/hotspot/share/opto/loopnode.hpp
+++ b/src/hotspot/share/opto/loopnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -514,7 +514,7 @@ inline jlong BaseCountedLoopNode::stride_con() const {
 class LoopLimitNode : public Node {
   enum { Init=1, Limit=2, Stride=3 };
  public:
-  LoopLimitNode( Compile* C, Node *init, Node *limit, Node *stride ) : Node(0,init,limit,stride) {
+  LoopLimitNode( Compile* C, Node *init, Node *limit, Node *stride ) : Node(nullptr,init,limit,stride) {
     // Put it on the Macro nodes list to optimize during macro nodes expansion.
     init_flags(Flag_is_macro);
     C->add_macro_node(this);
@@ -607,7 +607,7 @@ class IdealLoopTree : public ResourceObj {
   bool  _allow_optimizations;   // Allow loop optimizations
 
   IdealLoopTree( PhaseIdealLoop* phase, Node *head, Node *tail )
-    : _parent(0), _next(0), _child(0),
+    : _parent(nullptr), _next(nullptr), _child(nullptr),
       _head(head), _tail(tail),
       _phase(phase),
       _local_loop_unroll_limit(0), _local_loop_unroll_factor(0),
@@ -1011,8 +1011,10 @@ class PhaseIdealLoop : public PhaseTransform {
     assert(n == find_non_split_ctrl(n), "must return legal ctrl" );
     return n;
   }
-  // true if CFG node d dominates CFG node n
-  bool is_dominator(Node *d, Node *n);
+
+  bool is_dominator(Node* dominator, Node* n);
+  bool is_strict_dominator(Node* dominator, Node* n);
+
   // return get_ctrl for a data node and self(n) for a CFG node
   Node* ctrl_or_self(Node* n) {
     if (has_ctrl(n))
@@ -1337,9 +1339,10 @@ class PhaseIdealLoop : public PhaseTransform {
                                       bool* p_short_scale, int depth);
 
   // Create a new if above the uncommon_trap_if_pattern for the predicate to be promoted
-  IfTrueNode* create_new_if_for_predicate(ParsePredicateSuccessProj* parse_predicate_proj, Node* new_entry,
-                                          Deoptimization::DeoptReason reason, int opcode,
-                                          bool rewire_uncommon_proj_phi_inputs = false);
+  IfTrueNode* create_new_if_for_predicate(
+      ParsePredicateSuccessProj* parse_predicate_proj, Node* new_entry, Deoptimization::DeoptReason reason, int opcode,
+      bool rewire_uncommon_proj_phi_inputs = false
+      NOT_PRODUCT (COMMA AssertionPredicateType assertion_predicate_type = AssertionPredicateType::None));
 
  private:
   // Helper functions for create_new_if_for_predicate()
@@ -1375,13 +1378,14 @@ class PhaseIdealLoop : public PhaseTransform {
   void loop_predication_follow_branches(Node *c, IdealLoopTree *loop, float loop_trip_cnt,
                                         PathFrequency& pf, Node_Stack& stack, VectorSet& seen,
                                         Node_List& if_proj_list);
-  IfProjNode* add_template_assertion_predicate(IfNode* iff, IdealLoopTree* loop, IfProjNode* if_proj,
+  IfTrueNode* add_template_assertion_predicate(IfNode* iff, IdealLoopTree* loop, IfProjNode* if_proj,
                                                ParsePredicateSuccessProj* parse_predicate_proj,
                                                IfProjNode* upper_bound_proj, int scale, Node* offset, Node* init, Node* limit,
                                                jint stride, Node* rng, bool& overflow, Deoptimization::DeoptReason reason);
-  Node* add_range_check_elimination_assertion_predicate(IdealLoopTree* loop, Node* predicate_proj, int scale_con,
-                                                        Node* offset, Node* limit, int stride_con, Node* value,
-                                                        bool is_template);
+  void eliminate_hoisted_range_check(IfTrueNode* hoisted_check_proj, IfTrueNode* template_assertion_predicate_proj);
+  Node* add_range_check_elimination_assertion_predicate(
+      IdealLoopTree* loop, Node* predicate_proj, int scale_con, Node* offset, Node* limit, int stride_con, Node* value,
+      bool is_template NOT_PRODUCT(COMMA AssertionPredicateType assertion_predicate_type = AssertionPredicateType::None));
 
   // Helper function to collect predicate for eliminating the useless ones
   void eliminate_useless_predicates();
@@ -1460,7 +1464,7 @@ class PhaseIdealLoop : public PhaseTransform {
   };
   AutoVectorizeStatus auto_vectorize(IdealLoopTree* lpt, VSharedData &vshared);
 
-  // Move UnorderedReduction out of loop if possible
+  // Move an unordered Reduction out of loop if possible
   void move_unordered_reduction_out_of_loop(IdealLoopTree* loop);
 
   // Create a scheduled list of nodes control dependent on ctrl set.
@@ -1533,6 +1537,7 @@ class PhaseIdealLoop : public PhaseTransform {
   // Mark an IfNode as being dominated by a prior test,
   // without actually altering the CFG (and hence IDOM info).
   void dominated_by(IfProjNode* prevdom, IfNode* iff, bool flip = false, bool pin_array_access_nodes = false);
+  void rewire_safe_outputs_to_dominator(Node* source, Node* dominator, bool pin_array_access_nodes);
 
   // Split Node 'n' through merge point
   RegionNode* split_thru_region(Node* n, RegionNode* region);
diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp
index a3227d47832..ba0ce344122 100644
--- a/src/hotspot/share/opto/loopopts.cpp
+++ b/src/hotspot/share/opto/loopopts.cpp
@@ -340,24 +340,31 @@ void PhaseIdealLoop::dominated_by(IfProjNode* prevdom, IfNode* iff, bool flip, b
   // I can assume this path reaches an infinite loop.  In this case it's not
   // important to optimize the data Nodes - either the whole compilation will
   // be tossed or this path (and all data Nodes) will go dead.
-  if (iff->outcnt() != 2) return;
+  if (iff->outcnt() != 2) {
+    return;
+  }
 
   // Make control-dependent data Nodes on the live path (path that will remain
   // once the dominated IF is removed) become control-dependent on the
   // dominating projection.
   Node* dp = iff->proj_out_or_null(pop == Op_IfTrue);
 
-  if (dp == nullptr)
+  if (dp == nullptr) {
     return;
+  }
+
+  rewire_safe_outputs_to_dominator(dp, prevdom, pin_array_access_nodes);
+}
 
-  IdealLoopTree* old_loop = get_loop(dp);
+void PhaseIdealLoop::rewire_safe_outputs_to_dominator(Node* source, Node* dominator, const bool pin_array_access_nodes) {
+  IdealLoopTree* old_loop = get_loop(source);
 
-  for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) {
-    Node* cd = dp->fast_out(i); // Control-dependent node
+  for (DUIterator_Fast imax, i = source->fast_outs(imax); i < imax; i++) {
+    Node* out = source->fast_out(i); // Control-dependent node
     // Do not rewire Div and Mod nodes which could have a zero divisor to avoid skipping their zero check.
-    if (cd->depends_only_on_test() && _igvn.no_dependent_zero_check(cd)) {
-      assert(cd->in(0) == dp, "");
-      _igvn.replace_input_of(cd, 0, prevdom);
+    if (out->depends_only_on_test() && _igvn.no_dependent_zero_check(out)) {
+      assert(out->in(0) == source, "must be control dependent on source");
+      _igvn.replace_input_of(out, 0, dominator);
       if (pin_array_access_nodes) {
         // Because of Loop Predication, Loads and range check Cast nodes that are control dependent on this range
         // check (that is about to be removed) now depend on multiple dominating Hoisted Check Predicates. After the
@@ -365,21 +372,21 @@ void PhaseIdealLoop::dominated_by(IfProjNode* prevdom, IfNode* iff, bool flip, b
         // in the graph. To ensure that these Loads/Casts do not float above any of the dominating checks (even when the
         // lowest dominating check is later replaced by yet another dominating check), we need to pin them at the lowest
         // dominating check.
-        Node* clone = cd->pin_array_access_node();
+        Node* clone = out->pin_array_access_node();
         if (clone != nullptr) {
-          clone = _igvn.register_new_node_with_optimizer(clone, cd);
-          _igvn.replace_node(cd, clone);
-          cd = clone;
+          clone = _igvn.register_new_node_with_optimizer(clone, out);
+          _igvn.replace_node(out, clone);
+          out = clone;
         }
       }
-      set_early_ctrl(cd, false);
-      IdealLoopTree* new_loop = get_loop(get_ctrl(cd));
+      set_early_ctrl(out, false);
+      IdealLoopTree* new_loop = get_loop(get_ctrl(out));
       if (old_loop != new_loop) {
         if (!old_loop->_child) {
-          old_loop->_body.yank(cd);
+          old_loop->_body.yank(out);
         }
         if (!new_loop->_child) {
-          new_loop->_body.push(cd);
+          new_loop->_body.push(out);
         }
       }
       --i;
@@ -795,18 +802,25 @@ Node *PhaseIdealLoop::conditional_move( Node *region ) {
   // Avoid duplicated float compare.
   if (phis > 1 && (cmp_op == Op_CmpF || cmp_op == Op_CmpD)) return nullptr;
 
-  // Ignore cost if CMOVE can be moved outside the loop.
-  if (used_inside_loop && cost >= ConditionalMoveLimit) {
-    return nullptr;
+  float infrequent_prob = PROB_UNLIKELY_MAG(3);
+  // Ignore cost and blocks frequency if CMOVE can be moved outside the loop.
+  if (used_inside_loop) {
+    if (cost >= ConditionalMoveLimit) return nullptr; // Too much goo
+
+    // BlockLayoutByFrequency optimization moves infrequent branch
+    // from hot path. No point in CMOV'ing in such case (110 is used
+    // instead of 100 to take into account not exactness of float value).
+    if (BlockLayoutByFrequency) {
+      infrequent_prob = MAX2(infrequent_prob, (float)BlockLayoutMinDiamondPercentage/110.0f);
+    }
   }
   // Check for highly predictable branch.  No point in CMOV'ing if
   // we are going to predict accurately all the time.
-  constexpr float infrequent_prob = PROB_UNLIKELY_MAG(2);
   if (C->use_cmove() && (cmp_op == Op_CmpF || cmp_op == Op_CmpD)) {
     //keep going
-  } else if (iff->_prob < infrequent_prob || iff->_prob > (1.0f - infrequent_prob)) {
+  } else if (iff->_prob < infrequent_prob ||
+      iff->_prob > (1.0f - infrequent_prob))
     return nullptr;
-  }
 
   // --------------
   // Now replace all Phis with CMOV's
@@ -2987,52 +3001,101 @@ RegionNode* PhaseIdealLoop::insert_region_before_proj(ProjNode* proj) {
   return reg;
 }
 
-//------------------------------ insert_cmpi_loop_exit -------------------------------------
-// Clone a signed compare loop exit from an unsigned compare and
-// insert it before the unsigned cmp on the stay-in-loop path.
-// All new nodes inserted in the dominator tree between the original
-// if and it's projections.  The original if test is replaced with
-// a constant to force the stay-in-loop path.
+// Idea
+// ----
+// Partial Peeling tries to rotate the loop in such a way that it can later be turned into a counted loop. Counted loops
+// require a signed loop exit test. When calling this method, we've only found a suitable unsigned test to partial peel
+// with. Therefore, we try to split off a signed loop exit test from the unsigned test such that it can be used as new
+// loop exit while keeping the unsigned test unchanged and preserving the same behavior as if we've used the unsigned
+// test alone instead:
 //
-// This is done to make sure that the original if and it's projections
-// still dominate the same set of control nodes, that the ctrl() relation
-// from data nodes to them is preserved, and that their loop nesting is
-// preserved.
+// Before Partial Peeling:
+//   Loop:
+//     <peeled section>
+//     Split off signed loop exit test
+//     <-- CUT HERE -->
+//     Unchanged unsigned loop exit test
+//     <rest of unpeeled section>
+//     goto Loop
 //
-// before
-//          if(i <u limit)    unsigned compare loop exit
+// After Partial Peeling:
+//   <cloned peeled section>
+//   Cloned split off signed loop exit test
+//   Loop:
+//     Unchanged unsigned loop exit test
+//     <rest of unpeeled section>
+//     <peeled section>
+//     Split off signed loop exit test
+//     goto Loop
+//
+// Details
+// -------
+// Before:
+//          if (i <u limit)    Unsigned loop exit condition
 //         /       |
 //        v        v
 //   exit-proj   stay-in-loop-proj
 //
-// after
-//          if(stay-in-loop-const)  original if
-//         /       |
-//        /        v
-//       /  if(i <  limit)    new signed test
+// Split off a signed loop exit test (i.e. with CmpI) from an unsigned loop exit test (i.e. with CmpU) and insert it
+// before the CmpU on the stay-in-loop path and keep both tests:
+//
+//          if (i <u limit)    Signed loop exit test
+//        /        |
+//       /  if (i <u limit)    Unsigned loop exit test
 //      /  /       |
-//     /  /        v
-//    /  /  if(i <u limit)    new cloned unsigned test
-//   /  /   /      |
-//   v  v  v       |
-//    region       |
-//        |        |
-//      dum-if     |
-//     /  |        |
-// ether  |        |
-//        v        v
+//     v  v        v
+//  exit-region  stay-in-loop-proj
+//
+// Implementation
+// --------------
+// We need to make sure that the new signed loop exit test is properly inserted into the graph such that the unsigned
+// loop exit test still dominates the same set of control nodes, the ctrl() relation from data nodes to both loop
+// exit tests is preserved, and their loop nesting is correct.
+//
+// To achieve that, we clone the unsigned loop exit test completely (leave it unchanged), insert the signed loop exit
+// test above it and kill the original unsigned loop exit test by setting it's condition to a constant
+// (i.e. stay-in-loop-const in graph below) such that IGVN can fold it later:
+//
+//           if (stay-in-loop-const)  Killed original unsigned loop exit test
+//          /       |
+//         /        v
+//        /  if (i <  limit)          Split off signed loop exit test
+//       /  /       |
+//      /  /        v
+//     /  /  if (i <u limit)          Cloned unsigned loop exit test
+//    /  /   /      |
+//   v  v  v        |
+//  exit-region     |
+//        |         |
+//    dummy-if      |
+//     /  |         |
+// dead   |         |
+//        v         v
 //   exit-proj   stay-in-loop-proj
 //
-IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *loop) {
+// Note: The dummy-if is inserted to create a region to merge the loop exits between the original to be killed unsigned
+//       loop exit test and its exit projection while keeping the exit projection (also see insert_region_before_proj()).
+//
+// Requirements
+// ------------
+// Note that we can only split off a signed loop exit test from the unsigned loop exit test when the behavior is exactly
+// the same as before with only a single unsigned test. This is only possible if certain requirements are met.
+// Otherwise, we need to bail out (see comments in the code below).
+IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree* loop) {
   const bool Signed   = true;
   const bool Unsigned = false;
 
   BoolNode* bol = if_cmpu->in(1)->as_Bool();
-  if (bol->_test._test != BoolTest::lt) return nullptr;
+  if (bol->_test._test != BoolTest::lt) {
+    return nullptr;
+  }
   CmpNode* cmpu = bol->in(1)->as_Cmp();
-  if (cmpu->Opcode() != Op_CmpU) return nullptr;
+  assert(cmpu->Opcode() == Op_CmpU, "must be unsigned comparison");
+
   int stride = stride_of_possible_iv(if_cmpu);
-  if (stride == 0) return nullptr;
+  if (stride == 0) {
+    return nullptr;
+  }
 
   Node* lp_proj = stay_in_loop(if_cmpu, loop);
   guarantee(lp_proj != nullptr, "null loop node");
@@ -3044,14 +3107,93 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo
     // We therefore can't add a single exit condition.
     return nullptr;
   }
-  // The loop exit condition is !(i <u limit) ==> (i < 0 || i >= limit).
-  // Split out the exit condition (i < 0) for stride < 0 or (i >= limit) for stride > 0.
-  Node* limit = nullptr;
+  // The unsigned loop exit condition is
+  //   !(i <u  limit)
+  // =   i >=u limit
+  //
+  // First, we note that for any x for which
+  //   0 <= x <= INT_MAX
+  // we can convert x to an unsigned int and still get the same guarantee:
+  //   0 <=  (uint) x <=  INT_MAX = (uint) INT_MAX
+  //   0 <=u (uint) x <=u INT_MAX = (uint) INT_MAX   (LEMMA)
+  //
+  // With that in mind, if
+  //   limit >= 0             (COND)
+  // then the unsigned loop exit condition
+  //   i >=u limit            (ULE)
+  // is equivalent to
+  //   i < 0 || i >= limit    (SLE-full)
+  // because either i is negative and therefore always greater than MAX_INT when converting to unsigned
+  //   (uint) i >=u MAX_INT >= limit >= 0
+  // or otherwise
+  //   i >= limit >= 0
+  // holds due to (LEMMA).
+  //
+  // For completeness, a counterexample with limit < 0:
+  // Assume i = -3 and limit = -2:
+  //   i  < 0
+  //   -2 < 0
+  // is true and thus also "i < 0 || i >= limit". But
+  //   i  >=u limit
+  //   -3 >=u -2
+  // is false.
+  Node* limit = cmpu->in(2);
+  const TypeInt* type_limit = _igvn.type(limit)->is_int();
+  if (type_limit->_lo < 0) {
+    return nullptr;
+  }
+
+  // We prove below that we can extract a single signed loop exit condition from (SLE-full), depending on the stride:
+  //   stride < 0:
+  //     i < 0        (SLE = SLE-negative)
+  //   stride > 0:
+  //     i >= limit   (SLE = SLE-positive)
+  // such that we have the following graph before Partial Peeling with stride > 0 (similar for stride < 0):
+  //
+  // Loop:
+  //   <peeled section>
+  //   i >= limit    (SLE-positive)
+  //   <-- CUT HERE -->
+  //   i >=u limit   (ULE)
+  //   <rest of unpeeled section>
+  //   goto Loop
+  //
+  // We exit the loop if:
+  //   (SLE) is true OR (ULE) is true
+  // However, if (SLE) is true then (ULE) also needs to be true to ensure the exact same behavior. Otherwise, we wrongly
+  // exit a loop that should not have been exited if we did not apply Partial Peeling. More formally, we need to ensure:
+  //   (SLE) IMPLIES (ULE)
+  // This indeed holds when (COND) is given:
+  // - stride > 0:
+  //       i >=  limit             // (SLE = SLE-positive)
+  //       i >=  limit >= 0        // (COND)
+  //       i >=u limit >= 0        // (LEMMA)
+  //     which is the unsigned loop exit condition (ULE).
+  // - stride < 0:
+  //       i        <  0           // (SLE = SLE-negative)
+  //       (uint) i >u MAX_INT     // (NEG) all negative values are greater than MAX_INT when converted to unsigned
+  //       MAX_INT >= limit >= 0   // (COND)
+  //       MAX_INT >=u limit >= 0  // (LEMMA)
+  //     and thus from (NEG) and (LEMMA):
+  //       i >=u limit
+  //     which is the unsigned loop exit condition (ULE).
+  //
+  //
+  // After Partial Peeling, we have the following structure for stride > 0 (similar for stride < 0):
+  //   <cloned peeled section>
+  //   i >= limit (SLE-positive)
+  //   Loop:
+  //     i >=u limit (ULE)
+  //     <rest of unpeeled section>
+  //     <peeled section>
+  //     i >= limit (SLE-positive)
+  //     goto Loop
+  Node* rhs_cmpi;
   if (stride > 0) {
-    limit = cmpu->in(2);
+    rhs_cmpi = limit; // For i >= limit
   } else {
-    limit = _igvn.makecon(TypeInt::ZERO);
-    set_ctrl(limit, C->root());
+    rhs_cmpi = _igvn.makecon(TypeInt::ZERO); // For i < 0
+    set_ctrl(rhs_cmpi, C->root());
   }
   // Create a new region on the exit path
   RegionNode* reg = insert_region_before_proj(lp_exit);
@@ -3059,7 +3201,7 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo
 
   // Clone the if-cmpu-true-false using a signed compare
   BoolTest::mask rel_i = stride > 0 ? bol->_test._test : BoolTest::ge;
-  ProjNode* cmpi_exit = insert_if_before_proj(cmpu->in(1), Signed, rel_i, limit, lp_continue);
+  ProjNode* cmpi_exit = insert_if_before_proj(cmpu->in(1), Signed, rel_i, rhs_cmpi, lp_continue);
   reg->add_req(cmpi_exit);
 
   // Clone the if-cmpu-true-false
@@ -4166,7 +4308,7 @@ bool PhaseIdealLoop::duplicate_loop_backedge(IdealLoopTree *loop, Node_List &old
     } else {
       wq.push(c->in(0));
     }
-    assert(!is_dominator(c, region) || c == region, "shouldn't go above region");
+    assert(!is_strict_dominator(c, region), "shouldn't go above region");
   }
 
   Node* region_dom = idom(region);
@@ -4310,11 +4452,19 @@ PhaseIdealLoop::auto_vectorize(IdealLoopTree* lpt, VSharedData &vshared) {
   return AutoVectorizeStatus::Success;
 }
 
+// Returns true if the Reduction node is unordered.
+static bool is_unordered_reduction(Node* n) {
+  return n->is_Reduction() && !n->as_Reduction()->requires_strict_order();
+}
+
 // Having ReductionNodes in the loop is expensive. They need to recursively
 // fold together the vector values, for every vectorized loop iteration. If
 // we encounter the following pattern, we can vector accumulate the values
 // inside the loop, and only have a single UnorderedReduction after the loop.
 //
+// Note: UnorderedReduction represents a ReductionNode which does not require
+// calculating in strict order.
+//
 // CountedLoop     init
 //          |        |
 //          +------+ | +-----------------------+
@@ -4354,21 +4504,24 @@ PhaseIdealLoop::auto_vectorize(IdealLoopTree* lpt, VSharedData &vshared) {
 // wise. This is a single operation per vector_accumulator, rather than many
 // for a UnorderedReduction. We can then reduce the last vector_accumulator
 // after the loop, and also reduce the init value into it.
+//
 // We can not do this with all reductions. Some reductions do not allow the
-// reordering of operations (for example float addition).
+// reordering of operations (for example float addition/multiplication require
+// strict order).
 void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) {
   assert(!C->major_progress() && loop->is_counted() && loop->is_innermost(), "sanity");
 
-  // Find all Phi nodes with UnorderedReduction on backedge.
+  // Find all Phi nodes with an unordered Reduction on backedge.
   CountedLoopNode* cl = loop->_head->as_CountedLoop();
   for (DUIterator_Fast jmax, j = cl->fast_outs(jmax); j < jmax; j++) {
     Node* phi = cl->fast_out(j);
-    // We have a phi with a single use, and a UnorderedReduction on the backedge.
-    if (!phi->is_Phi() || phi->outcnt() != 1 || !phi->in(2)->is_UnorderedReduction()) {
+    // We have a phi with a single use, and an unordered Reduction on the backedge.
+    if (!phi->is_Phi() || phi->outcnt() != 1 || !is_unordered_reduction(phi->in(2))) {
       continue;
     }
 
-    UnorderedReductionNode* last_ur = phi->in(2)->as_UnorderedReduction();
+    ReductionNode* last_ur = phi->in(2)->as_Reduction();
+    assert(!last_ur->requires_strict_order(), "must be");
 
     // Determine types
     const TypeVect* vec_t = last_ur->vect_type();
@@ -4385,14 +4538,14 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) {
         continue; // not implemented -> fails
     }
 
-    // Traverse up the chain of UnorderedReductions, checking that it loops back to
-    // the phi. Check that all UnorderedReductions only have a single use, except for
+    // Traverse up the chain of unordered Reductions, checking that it loops back to
+    // the phi. Check that all unordered Reductions only have a single use, except for
     // the last (last_ur), which only has phi as a use in the loop, and all other uses
     // are outside the loop.
-    UnorderedReductionNode* current = last_ur;
-    UnorderedReductionNode* first_ur = nullptr;
+    ReductionNode* current = last_ur;
+    ReductionNode* first_ur = nullptr;
     while (true) {
-      assert(current->is_UnorderedReduction(), "sanity");
+      assert(!current->requires_strict_order(), "sanity");
 
       // Expect no ctrl and a vector_input from within the loop.
       Node* ctrl = current->in(0);
@@ -4409,7 +4562,7 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) {
         break; // Chain traversal fails.
       }
 
-      // Expect single use of UnorderedReduction, except for last_ur.
+      // Expect single use of an unordered Reduction, except for last_ur.
       if (current == last_ur) {
         // Expect all uses to be outside the loop, except phi.
         for (DUIterator_Fast kmax, k = current->fast_outs(kmax); k < kmax; k++) {
@@ -4427,12 +4580,13 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) {
         }
       }
 
-      // Expect another UnorderedReduction or phi as the scalar input.
+      // Expect another unordered Reduction or phi as the scalar input.
       Node* scalar_input = current->in(1);
-      if (scalar_input->is_UnorderedReduction() &&
+      if (is_unordered_reduction(scalar_input) &&
           scalar_input->Opcode() == current->Opcode()) {
-        // Move up the UnorderedReduction chain.
-        current = scalar_input->as_UnorderedReduction();
+        // Move up the unordered Reduction chain.
+        current = scalar_input->as_Reduction();
+        assert(!current->requires_strict_order(), "must be");
       } else if (scalar_input == phi) {
         // Chain terminates at phi.
         first_ur = current;
@@ -4456,7 +4610,7 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) {
     VectorNode* identity_vector = VectorNode::scalar2vector(identity_scalar, vector_length, bt_t);
     register_new_node(identity_vector, C->root());
     assert(vec_t == identity_vector->vect_type(), "matching vector type");
-    VectorNode::trace_new_vector(identity_vector, "UnorderedReduction");
+    VectorNode::trace_new_vector(identity_vector, "Unordered Reduction");
 
     // Turn the scalar phi into a vector phi.
     _igvn.rehash_node_delayed(phi);
@@ -4465,7 +4619,7 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) {
     phi->as_Type()->set_type(vec_t);
     _igvn.set_type(phi, vec_t);
 
-    // Traverse down the chain of UnorderedReductions, and replace them with vector_accumulators.
+    // Traverse down the chain of unordered Reductions, and replace them with vector_accumulators.
     current = first_ur;
     while (true) {
       // Create vector_accumulator to replace current.
@@ -4474,11 +4628,12 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) {
       VectorNode* vector_accumulator = VectorNode::make(vopc, last_vector_accumulator, vector_input, vec_t);
       register_new_node(vector_accumulator, cl);
       _igvn.replace_node(current, vector_accumulator);
-      VectorNode::trace_new_vector(vector_accumulator, "UnorderedReduction");
+      VectorNode::trace_new_vector(vector_accumulator, "Unordered Reduction");
       if (current == last_ur) {
         break;
       }
-      current = vector_accumulator->unique_out()->as_UnorderedReduction();
+      current = vector_accumulator->unique_out()->as_Reduction();
+      assert(!current->requires_strict_order(), "must be");
     }
 
     // Create post-loop reduction.
@@ -4495,7 +4650,7 @@ void PhaseIdealLoop::move_unordered_reduction_out_of_loop(IdealLoopTree* loop) {
       }
     }
     register_new_node(post_loop_reduction, get_late_ctrl(post_loop_reduction, cl));
-    VectorNode::trace_new_vector(post_loop_reduction, "UnorderedReduction");
+    VectorNode::trace_new_vector(post_loop_reduction, "Unordered Reduction");
 
     assert(last_accumulator->outcnt() == 2, "last_accumulator has 2 uses: phi and post_loop_reduction");
     assert(post_loop_reduction->outcnt() > 0, "should have taken over all non loop uses of last_accumulator");
diff --git a/src/hotspot/share/opto/machnode.hpp b/src/hotspot/share/opto/machnode.hpp
index 677e1bcd1d1..4d7b9c62aaa 100644
--- a/src/hotspot/share/opto/machnode.hpp
+++ b/src/hotspot/share/opto/machnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -54,7 +54,6 @@ class MachSpillCopyNode;
 class Matcher;
 class PhaseRegAlloc;
 class RegMask;
-class RTMLockingCounters;
 class State;
 
 //---------------------------MachOper------------------------------------------
@@ -802,8 +801,6 @@ class MachGotoNode : public MachBranchNode {
 class MachFastLockNode : public MachNode {
   virtual uint size_of() const { return sizeof(*this); } // Size is bigger
 public:
-  RTMLockingCounters*       _rtm_counters; // RTM lock counters for inflated locks
-  RTMLockingCounters* _stack_rtm_counters; // RTM lock counters for stack locks
   MachFastLockNode() : MachNode() {}
 };
 
@@ -1087,7 +1084,7 @@ class labelOper : public MachOper {
 
   uint _block_num;
 
-  labelOper() : _label(0), _block_num(0) {}
+  labelOper() : _label(nullptr), _block_num(0) {}
 
   labelOper(Label* label, uint block_num) : _label(label), _block_num(block_num) {}
 
diff --git a/src/hotspot/share/opto/macro.cpp b/src/hotspot/share/opto/macro.cpp
index ce1a8a61134..de804457a26 100644
--- a/src/hotspot/share/opto/macro.cpp
+++ b/src/hotspot/share/opto/macro.cpp
@@ -2045,7 +2045,7 @@ void PhaseMacroExpand::mark_eliminated_box(Node* box, Node* obj) {
 
 //-----------------------mark_eliminated_locking_nodes-----------------------
 void PhaseMacroExpand::mark_eliminated_locking_nodes(AbstractLockNode *alock) {
-  if (alock->box_node()->as_BoxLock()->is_unbalanced()) {
+  if (!alock->is_balanced()) {
     return; // Can't do any more elimination for this locking region
   }
   if (EliminateNestedLocks) {
@@ -2428,7 +2428,6 @@ void PhaseMacroExpand::eliminate_macro_nodes() {
         break;
       default:
         assert(n->Opcode() == Op_LoopLimit ||
-               n->Opcode() == Op_Opaque3   ||
                n->is_Opaque4()             ||
                n->is_OpaqueInitializedAssertionPredicate() ||
                n->Opcode() == Op_MaxL      ||
@@ -2481,30 +2480,6 @@ bool PhaseMacroExpand::expand_macro_nodes() {
       } else if (n->is_Opaque1()) {
         _igvn.replace_node(n, n->in(1));
         success = true;
-#if INCLUDE_RTM_OPT
-      } else if ((n->Opcode() == Op_Opaque3) && ((Opaque3Node*)n)->rtm_opt()) {
-        assert(C->profile_rtm(), "should be used only in rtm deoptimization code");
-        assert((n->outcnt() == 1) && n->unique_out()->is_Cmp(), "");
-        Node* cmp = n->unique_out();
-#ifdef ASSERT
-        // Validate graph.
-        assert((cmp->outcnt() == 1) && cmp->unique_out()->is_Bool(), "");
-        BoolNode* bol = cmp->unique_out()->as_Bool();
-        assert((bol->outcnt() == 1) && bol->unique_out()->is_If() &&
-               (bol->_test._test == BoolTest::ne), "");
-        IfNode* ifn = bol->unique_out()->as_If();
-        assert((ifn->outcnt() == 2) &&
-               ifn->proj_out(1)->is_uncommon_trap_proj(Deoptimization::Reason_rtm_state_change) != nullptr, "");
-#endif
-        Node* repl = n->in(1);
-        if (!_has_locks) {
-          // Remove RTM state check if there are no locks in the code.
-          // Replace input to compare the same value.
-          repl = (cmp->in(1) == n) ? cmp->in(2) : cmp->in(1);
-        }
-        _igvn.replace_node(n, repl);
-        success = true;
-#endif
       } else if (n->is_Opaque4()) {
         // With Opaque4 nodes, the expectation is that the test of input 1
         // is always equal to the constant value of input 2. So we can
diff --git a/src/hotspot/share/opto/memnode.cpp b/src/hotspot/share/opto/memnode.cpp
index b8da06af5d6..ad3a948793f 100644
--- a/src/hotspot/share/opto/memnode.cpp
+++ b/src/hotspot/share/opto/memnode.cpp
@@ -2881,14 +2881,14 @@ class ArrayPointer {
 //
 //   RangeCheck[i+0]           RangeCheck[i+0]
 //   StoreB[i+0]
-//   RangeCheck[i+1]           RangeCheck[i+1]
+//   RangeCheck[i+3]           RangeCheck[i+3]
 //   StoreB[i+1]         -->   pass:             fail:
 //   StoreB[i+2]               StoreI[i+0]       StoreB[i+0]
 //   StoreB[i+3]
 //
 // The 4 StoreB are merged into a single StoreI node. We have to be careful with RangeCheck[i+1]: before
 // the optimization, if this RangeCheck[i+1] fails, then we execute only StoreB[i+0], and then trap. After
-// the optimization, the new StoreI[i+0] is on the passing path of RangeCheck[i+1], and StoreB[i+0] on the
+// the optimization, the new StoreI[i+0] is on the passing path of RangeCheck[i+3], and StoreB[i+0] on the
 // failing path.
 //
 // Note: For normal array stores, every store at first has a RangeCheck. But they can be removed with:
@@ -2900,11 +2900,11 @@ class ArrayPointer {
 //                              RangeCheck[i+0]                         RangeCheck[i+0] <- before first store
 //                              StoreB[i+0]                             StoreB[i+0]     <- first store
 //                              RangeCheck[i+1]     --> smeared -->     RangeCheck[i+3] <- only RC between first and last store
-//                              StoreB[i+0]                             StoreB[i+1]     <- second store
+//                              StoreB[i+1]                             StoreB[i+1]     <- second store
 //                              RangeCheck[i+2]     --> removed
-//                              StoreB[i+0]                             StoreB[i+2]
+//                              StoreB[i+2]                             StoreB[i+2]
 //                              RangeCheck[i+3]     --> removed
-//                              StoreB[i+0]                             StoreB[i+3]     <- last store
+//                              StoreB[i+3]                             StoreB[i+3]     <- last store
 //
 //                              Thus, it is a common pattern that between the first and last store in a chain
 //                              of adjacent stores there remains exactly one RangeCheck, located between the
@@ -2984,6 +2984,9 @@ StoreNode* MergePrimitiveArrayStores::run() {
       type2aelembytes(bt) != _store->memory_size()) {
     return nullptr;
   }
+  if (_store->is_unsafe_access()) {
+    return nullptr;
+  }
 
   // The _store must be the "last" store in a chain. If we find a use we could merge with
   // then that use or a store further down is the "last" store.
@@ -3017,11 +3020,13 @@ bool MergePrimitiveArrayStores::is_compatible_store(const StoreNode* other_store
   int opc = _store->Opcode();
   assert(opc == Op_StoreB || opc == Op_StoreC || opc == Op_StoreI, "precondition");
   assert(_store->adr_type()->isa_aryptr() != nullptr, "must be array store");
+  assert(!_store->is_unsafe_access(), "no unsafe accesses");
 
   if (other_store == nullptr ||
       _store->Opcode() != other_store->Opcode() ||
       other_store->adr_type() == nullptr ||
-      other_store->adr_type()->isa_aryptr() == nullptr) {
+      other_store->adr_type()->isa_aryptr() == nullptr ||
+      other_store->is_unsafe_access()) {
     return false;
   }
 
@@ -3067,6 +3072,11 @@ bool MergePrimitiveArrayStores::is_adjacent_input_pair(const Node* n1, const Nod
   }
 
   // Pattern: [n1 = base >> shift, n2 = base >> (shift + memory_size)]
+#ifndef VM_LITTLE_ENDIAN
+  // Pattern: [n1 = base >> (shift + memory_size), n2 = base >> shift]
+  // Swapping n1 with n2 gives same pattern as on little endian platforms.
+  swap(n1, n2);
+#endif // !VM_LITTLE_ENDIAN
   Node const* base_n2;
   jint shift_n2;
   if (!is_con_RShift(n2, base_n2, shift_n2)) {
@@ -3281,8 +3291,13 @@ Node* MergePrimitiveArrayStores::make_merged_input_value(const Node_List& merge_
     jlong mask = (((jlong)1) << bits_per_store) - 1;
     for (uint i = 0; i < merge_list.size(); i++) {
       jlong con_i = merge_list.at(i)->in(MemNode::ValueIn)->get_int();
+#ifdef VM_LITTLE_ENDIAN
       con = con << bits_per_store;
       con = con | (mask & con_i);
+#else // VM_LITTLE_ENDIAN
+      con_i = (mask & con_i) << (i * bits_per_store);
+      con = con | con_i;
+#endif // VM_LITTLE_ENDIAN
     }
     merged_input_value = _phase->longcon(con);
   } else {
@@ -3290,16 +3305,22 @@ Node* MergePrimitiveArrayStores::make_merged_input_value(const Node_List& merge_
     //             |                                  |
     //           _store                             first
     //
-    merged_input_value = first->in(MemNode::ValueIn);
-    Node const* base_last;
-    jint shift_last;
-    bool is_true = is_con_RShift(_store->in(MemNode::ValueIn), base_last, shift_last);
+    Node* hi = _store->in(MemNode::ValueIn);
+    Node* lo = first->in(MemNode::ValueIn);
+#ifndef VM_LITTLE_ENDIAN
+    // `_store` and `first` are swapped in the diagram above
+    swap(hi, lo);
+#endif // !VM_LITTLE_ENDIAN
+    Node const* hi_base;
+    jint hi_shift;
+    merged_input_value = lo;
+    bool is_true = is_con_RShift(hi, hi_base, hi_shift);
     assert(is_true, "must detect con RShift");
-    if (merged_input_value != base_last && merged_input_value->Opcode() == Op_ConvL2I) {
+    if (merged_input_value != hi_base && merged_input_value->Opcode() == Op_ConvL2I) {
       // look through
       merged_input_value = merged_input_value->in(1);
     }
-    if (merged_input_value != base_last) {
+    if (merged_input_value != hi_base) {
       // merged_input_value is not the base
       return nullptr;
     }
@@ -3473,7 +3494,6 @@ Node *StoreNode::Ideal(PhaseGVN *phase, bool can_reshape) {
     }
   }
 
-#ifdef VM_LITTLE_ENDIAN
   if (MergeStores && UseUnalignedAccesses) {
     if (phase->C->post_loop_opts_phase()) {
       MergePrimitiveArrayStores merge(phase, this);
@@ -3483,7 +3503,6 @@ Node *StoreNode::Ideal(PhaseGVN *phase, bool can_reshape) {
       phase->C->record_for_post_loop_opts_igvn(this);
     }
   }
-#endif
 
   return nullptr;                  // No further progress
 }
diff --git a/src/hotspot/share/opto/memnode.hpp b/src/hotspot/share/opto/memnode.hpp
index e0f5a437413..1b65585f1a0 100644
--- a/src/hotspot/share/opto/memnode.hpp
+++ b/src/hotspot/share/opto/memnode.hpp
@@ -1681,7 +1681,7 @@ class CacheWBPostSyncNode : public Node {
 // Allocation prefetch which may fault, TLAB size have to be adjusted.
 class PrefetchAllocationNode : public Node {
 public:
-  PrefetchAllocationNode(Node *mem, Node *adr) : Node(0,mem,adr) {}
+  PrefetchAllocationNode(Node *mem, Node *adr) : Node(nullptr,mem,adr) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return NotAMachineReg; }
   virtual uint match_edge(uint idx) const { return idx==2; }
diff --git a/src/hotspot/share/opto/movenode.hpp b/src/hotspot/share/opto/movenode.hpp
index ae1e8563da3..02db0c73079 100644
--- a/src/hotspot/share/opto/movenode.hpp
+++ b/src/hotspot/share/opto/movenode.hpp
@@ -158,7 +158,7 @@ class MoveD2LNode : public MoveNode {
 //     (CMove (Binary bol cmp) (Binary src1 src2))
 class BinaryNode : public Node {
   public:
-  BinaryNode( Node *n1, Node *n2 ) : Node(0,n1,n2) { }
+  BinaryNode( Node *n1, Node *n2 ) : Node(nullptr,n1,n2) { }
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return 0; }
 };
diff --git a/src/hotspot/share/opto/mulnode.hpp b/src/hotspot/share/opto/mulnode.hpp
index 10ef442299d..4c5e3e33248 100644
--- a/src/hotspot/share/opto/mulnode.hpp
+++ b/src/hotspot/share/opto/mulnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -167,7 +167,7 @@ const Type* MulHiValue(const Type *t1, const Type *t2, const Type *bot);
 // Upper 64 bits of a 64 bit by 64 bit multiply
 class MulHiLNode : public Node {
 public:
-  MulHiLNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {}
+  MulHiLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {}
   virtual int Opcode() const;
   virtual const Type* Value(PhaseGVN* phase) const;
   const Type *bottom_type() const { return TypeLong::LONG; }
@@ -178,7 +178,7 @@ class MulHiLNode : public Node {
 // Upper 64 bits of a 64 bit by 64 bit unsigned multiply
 class UMulHiLNode : public Node {
 public:
-  UMulHiLNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {}
+  UMulHiLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {}
   virtual int Opcode() const;
   virtual const Type* Value(PhaseGVN* phase) const;
   const Type *bottom_type() const { return TypeLong::LONG; }
@@ -291,7 +291,7 @@ class RotateRightNode : public TypeNode {
 // Signed shift right
 class RShiftINode : public Node {
 public:
-  RShiftINode( Node *in1, Node *in2 ) : Node(0,in1,in2) {}
+  RShiftINode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {}
   virtual int Opcode() const;
   virtual Node* Identity(PhaseGVN* phase);
   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -304,7 +304,7 @@ class RShiftINode : public Node {
 // Signed shift right
 class RShiftLNode : public Node {
 public:
-  RShiftLNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {}
+  RShiftLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {}
   virtual int Opcode() const;
   virtual Node* Identity(PhaseGVN* phase);
   virtual const Type* Value(PhaseGVN* phase) const;
@@ -316,7 +316,7 @@ class RShiftLNode : public Node {
 // Logical shift right
 class URShiftBNode : public Node {
 public:
-  URShiftBNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {
+  URShiftBNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {
     ShouldNotReachHere(); // only vector variant is used
   }
   virtual int Opcode() const;
@@ -326,7 +326,7 @@ class URShiftBNode : public Node {
 // Logical shift right
 class URShiftSNode : public Node {
 public:
-  URShiftSNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {
+  URShiftSNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {
     ShouldNotReachHere(); // only vector variant is used
   }
   virtual int Opcode() const;
@@ -336,7 +336,7 @@ class URShiftSNode : public Node {
 // Logical shift right
 class URShiftINode : public Node {
 public:
-  URShiftINode( Node *in1, Node *in2 ) : Node(0,in1,in2) {}
+  URShiftINode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {}
   virtual int Opcode() const;
   virtual Node* Identity(PhaseGVN* phase);
   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -349,7 +349,7 @@ class URShiftINode : public Node {
 // Logical shift right
 class URShiftLNode : public Node {
 public:
-  URShiftLNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {}
+  URShiftLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {}
   virtual int Opcode() const;
   virtual Node* Identity(PhaseGVN* phase);
   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -396,7 +396,7 @@ class FmaFNode : public FmaNode {
 class MulAddS2INode : public Node {
   virtual uint hash() const;
 public:
-  MulAddS2INode(Node* in1, Node *in2, Node *in3, Node* in4) : Node(0, in1, in2, in3, in4) {}
+  MulAddS2INode(Node* in1, Node *in2, Node *in3, Node* in4) : Node(nullptr, in1, in2, in3, in4) {}
   virtual int Opcode() const;
   const Type *bottom_type() const { return TypeInt::INT; }
   virtual uint ideal_reg() const { return Op_RegI; }
diff --git a/src/hotspot/share/opto/node.hpp b/src/hotspot/share/opto/node.hpp
index dc9dc6654b5..ae379c4833a 100644
--- a/src/hotspot/share/opto/node.hpp
+++ b/src/hotspot/share/opto/node.hpp
@@ -175,7 +175,6 @@ class SubTypeCheckNode;
 class Type;
 class TypeNode;
 class UnlockNode;
-class UnorderedReductionNode;
 class VectorNode;
 class LoadVectorNode;
 class LoadVectorMaskedNode;
@@ -739,7 +738,6 @@ class Node {
         DEFINE_CLASS_ID(ExpandV, Vector, 5)
         DEFINE_CLASS_ID(CompressM, Vector, 6)
         DEFINE_CLASS_ID(Reduction, Vector, 7)
-          DEFINE_CLASS_ID(UnorderedReduction, Reduction, 0)
         DEFINE_CLASS_ID(NegV, Vector, 8)
       DEFINE_CLASS_ID(Con, Type, 8)
           DEFINE_CLASS_ID(ConI, Con, 0)
@@ -991,7 +989,6 @@ class Node {
   DEFINE_CLASS_QUERY(Sub)
   DEFINE_CLASS_QUERY(SubTypeCheck)
   DEFINE_CLASS_QUERY(Type)
-  DEFINE_CLASS_QUERY(UnorderedReduction)
   DEFINE_CLASS_QUERY(Vector)
   DEFINE_CLASS_QUERY(VectorMaskCmp)
   DEFINE_CLASS_QUERY(VectorUnbox)
diff --git a/src/hotspot/share/opto/opaquenode.cpp b/src/hotspot/share/opto/opaquenode.cpp
index 0abc6f86ed0..14fd0d5f1a7 100644
--- a/src/hotspot/share/opto/opaquenode.cpp
+++ b/src/hotspot/share/opto/opaquenode.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -45,16 +45,6 @@ Node* Opaque1Node::Identity(PhaseGVN* phase) {
   return this;
 }
 
-// Do NOT remove the opaque node until no more loop opts can happen.
-Node* Opaque3Node::Identity(PhaseGVN* phase) {
-  if (phase->C->post_loop_opts_phase()) {
-    return in(1);
-  } else {
-    phase->C->record_for_post_loop_opts_igvn(this);
-  }
-  return this;
-}
-
 #ifdef ASSERT
 CountedLoopNode* OpaqueZeroTripGuardNode::guarded_loop() const {
   Node* iff = if_node();
@@ -92,12 +82,6 @@ IfNode* OpaqueZeroTripGuardNode::if_node() const {
   return iff->as_If();
 }
 
-// Do not allow value-numbering
-uint Opaque3Node::hash() const { return NO_HASH; }
-bool Opaque3Node::cmp(const Node &n) const {
-  return (&n == this);          // Always fail except on self
-}
-
 const Type* Opaque4Node::Value(PhaseGVN* phase) const {
   return phase->type(in(1));
 }
diff --git a/src/hotspot/share/opto/opaquenode.hpp b/src/hotspot/share/opto/opaquenode.hpp
index 2337989e974..9c775408cc0 100644
--- a/src/hotspot/share/opto/opaquenode.hpp
+++ b/src/hotspot/share/opto/opaquenode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -91,26 +91,6 @@ class OpaqueZeroTripGuardNode : public Opaque1Node {
   IfNode* if_node() const;
 };
 
-//------------------------------Opaque3Node------------------------------------
-// A node to prevent unwanted optimizations. Will be optimized only during
-// macro nodes expansion.
-class Opaque3Node : public Node {
-  int _opt; // what optimization it was used for
-  virtual uint hash() const;
-  virtual bool cmp(const Node &n) const;
-  public:
-  enum { RTM_OPT };
-  Opaque3Node(Compile* C, Node* n, int opt) : Node(0, n), _opt(opt) {
-    // Put it on the Macro nodes list to removed during macro nodes expansion.
-    init_flags(Flag_is_macro);
-    C->add_macro_node(this);
-  }
-  virtual int Opcode() const;
-  virtual const Type* bottom_type() const { return TypeInt::INT; }
-  virtual Node* Identity(PhaseGVN* phase);
-  bool rtm_opt() const { return (_opt == RTM_OPT); }
-};
-
 // Input 1 is a check that we know implicitly is always true or false
 // but the compiler has no way to prove. If during optimizations, that
 // check becomes true or false, the Opaque4 node is replaced by that
@@ -160,7 +140,7 @@ class ProfileBooleanNode : public Node {
   virtual uint hash() const ;                  // { return NO_HASH; }
   virtual bool cmp( const Node &n ) const;
   public:
-  ProfileBooleanNode(Node *n, uint false_cnt, uint true_cnt) : Node(0, n),
+  ProfileBooleanNode(Node *n, uint false_cnt, uint true_cnt) : Node(nullptr, n),
           _false_cnt(false_cnt), _true_cnt(true_cnt), _consumed(false), _delay_removal(true) {}
 
   uint false_count() const { return _false_cnt; }
diff --git a/src/hotspot/share/opto/output.cpp b/src/hotspot/share/opto/output.cpp
index 0ad56184d4d..8ea456d3417 100644
--- a/src/hotspot/share/opto/output.cpp
+++ b/src/hotspot/share/opto/output.cpp
@@ -1321,7 +1321,7 @@ CodeBuffer* PhaseOutput::init_buffer() {
   int code_req  = _buf_sizes._code;
   int const_req = _buf_sizes._const;
 
-  int pad_req   = NativeCall::instruction_size;
+  int pad_req   = NativeCall::byte_size();
 
   BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
   stub_req += bs->estimate_stub_size();
@@ -3388,8 +3388,7 @@ void PhaseOutput::install() {
                  C->entry_bci(),
                  CompileBroker::compiler2(),
                  C->has_unsafe_access(),
-                 SharedRuntime::is_wide_vector(C->max_vector_size()),
-                 C->rtm_state());
+                 SharedRuntime::is_wide_vector(C->max_vector_size()));
   }
 }
 
@@ -3397,8 +3396,7 @@ void PhaseOutput::install_code(ciMethod*         target,
                                int               entry_bci,
                                AbstractCompiler* compiler,
                                bool              has_unsafe_access,
-                               bool              has_wide_vectors,
-                               RTMState          rtm_state) {
+                               bool              has_wide_vectors) {
   // Check if we want to skip execution of all compiled code.
   {
 #ifndef PRODUCT
@@ -3436,8 +3434,7 @@ void PhaseOutput::install_code(ciMethod*         target,
                                      has_unsafe_access,
                                      SharedRuntime::is_wide_vector(C->max_vector_size()),
                                      C->has_monitors(),
-                                     0,
-                                     C->rtm_state());
+                                     0);
 
     if (C->log() != nullptr) { // Print code cache state into compiler log
       C->log()->code_cache_state();
diff --git a/src/hotspot/share/opto/output.hpp b/src/hotspot/share/opto/output.hpp
index 17179553602..9431ef3d508 100644
--- a/src/hotspot/share/opto/output.hpp
+++ b/src/hotspot/share/opto/output.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, 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
@@ -121,8 +121,7 @@ class PhaseOutput : public Phase {
                     int               entry_bci,
                     AbstractCompiler* compiler,
                     bool              has_unsafe_access,
-                    bool              has_wide_vectors,
-                    RTMState          rtm_state);
+                    bool              has_wide_vectors);
 
   void install_stub(const char* stub_name);
 
diff --git a/src/hotspot/share/opto/parse.hpp b/src/hotspot/share/opto/parse.hpp
index d5f12c8bc81..a55c9cb0cb1 100644
--- a/src/hotspot/share/opto/parse.hpp
+++ b/src/hotspot/share/opto/parse.hpp
@@ -501,8 +501,6 @@ class Parse : public GraphKit {
 
   void clinit_deopt();
 
-  void rtm_deopt();
-
   // Pass current map to exits
   void return_current(Node* value);
 
diff --git a/src/hotspot/share/opto/parse1.cpp b/src/hotspot/share/opto/parse1.cpp
index 80cb6721fce..3989020451e 100644
--- a/src/hotspot/share/opto/parse1.cpp
+++ b/src/hotspot/share/opto/parse1.cpp
@@ -597,12 +597,9 @@ Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
       // Add check to deoptimize the nmethod once the holder class is fully initialized
       clinit_deopt();
     }
-
-    // Add check to deoptimize the nmethod if RTM state was changed
-    rtm_deopt();
   }
 
-  // Check for bailouts during method entry or RTM state check setup.
+  // Check for bailouts during method entry.
   if (failing()) {
     if (log)  log->done("parse");
     C->set_default_node_notes(caller_nn);
@@ -1060,16 +1057,6 @@ void Parse::do_exits() {
       // loading.  It could also be due to an error, so mark this method as not compilable because
       // otherwise this could lead to an infinite compile loop.
       // In any case, this code path is rarely (and never in my testing) reached.
-#ifdef ASSERT
-      tty->print_cr("# Can't determine return type.");
-      tty->print_cr("# exit control");
-      _exits.control()->dump(2);
-      tty->print_cr("# ret phi type");
-      _gvn.type(ret_phi)->dump();
-      tty->print_cr("# ret phi");
-      ret_phi->dump(2);
-#endif // ASSERT
-      assert(false, "Can't determine return type.");
       C->record_method_not_compilable("Can't determine return type.");
       return;
     }
@@ -2201,42 +2188,6 @@ void Parse::clinit_deopt() {
   guard_klass_being_initialized(holder);
 }
 
-// Add check to deoptimize if RTM state is not ProfileRTM
-void Parse::rtm_deopt() {
-#if INCLUDE_RTM_OPT
-  if (C->profile_rtm()) {
-    assert(C->has_method(), "only for normal compilations");
-    assert(!C->method()->method_data()->is_empty(), "MDO is needed to record RTM state");
-    assert(depth() == 1, "generate check only for main compiled method");
-
-    // Set starting bci for uncommon trap.
-    set_parse_bci(is_osr_parse() ? osr_bci() : 0);
-
-    // Load the rtm_state from the MethodData.
-    const TypePtr* adr_type = TypeMetadataPtr::make(C->method()->method_data());
-    Node* mdo = makecon(adr_type);
-    int offset = in_bytes(MethodData::rtm_state_offset());
-    Node* adr_node = basic_plus_adr(mdo, mdo, offset);
-    Node* rtm_state = make_load(control(), adr_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
-
-    // Separate Load from Cmp by Opaque.
-    // In expand_macro_nodes() it will be replaced either
-    // with this load when there are locks in the code
-    // or with ProfileRTM (cmp->in(2)) otherwise so that
-    // the check will fold.
-    Node* profile_state = makecon(TypeInt::make(ProfileRTM));
-    Node* opq   = _gvn.transform( new Opaque3Node(C, rtm_state, Opaque3Node::RTM_OPT) );
-    Node* chk   = _gvn.transform( new CmpINode(opq, profile_state) );
-    Node* tst   = _gvn.transform( new BoolNode(chk, BoolTest::eq) );
-    // Branch to failure if state was changed
-    { BuildCutout unless(this, tst, PROB_ALWAYS);
-      uncommon_trap(Deoptimization::Reason_rtm_state_change,
-                    Deoptimization::Action_make_not_entrant);
-    }
-  }
-#endif
-}
-
 //------------------------------return_current---------------------------------
 // Append current _map to _exit_return
 void Parse::return_current(Node* value) {
diff --git a/src/hotspot/share/opto/phaseX.hpp b/src/hotspot/share/opto/phaseX.hpp
index 0025f4dca46..7843bd39aea 100644
--- a/src/hotspot/share/opto/phaseX.hpp
+++ b/src/hotspot/share/opto/phaseX.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -125,7 +125,7 @@ class Type_Array : public AnyObj {
   const Type **_types;
   void grow( uint i );          // Grow array node to fit
 public:
-  Type_Array(Arena *a) : _a(a), _max(0), _types(0) {}
+  Type_Array(Arena *a) : _a(a), _max(0), _types(nullptr) {}
   const Type *operator[] ( uint i ) const // Lookup, or null for not mapped
   { return (i<_max) ? _types[i] : (Type*)nullptr; }
   const Type *fast_lookup(uint i) const{assert(i<_max,"oob");return _types[i];}
diff --git a/src/hotspot/share/opto/phasetype.hpp b/src/hotspot/share/opto/phasetype.hpp
index 6448b8331cc..7a83f8c7f27 100644
--- a/src/hotspot/share/opto/phasetype.hpp
+++ b/src/hotspot/share/opto/phasetype.hpp
@@ -68,9 +68,10 @@
   flags(AFTER_RANGE_CHECK_ELIMINATION,  "After Range Check Elimination") \
   flags(BEFORE_PRE_MAIN_POST,           "Before Pre/Main/Post Loops") \
   flags(AFTER_PRE_MAIN_POST,            "After Pre/Main/Post Loops") \
-  flags(SUPERWORD1_BEFORE_SCHEDULE,     "Superword 1, Before Schedule") \
-  flags(SUPERWORD2_BEFORE_OUTPUT,       "Superword 2, Before Output") \
-  flags(SUPERWORD3_AFTER_OUTPUT,        "Superword 3, After Output") \
+  flags(AUTO_VECTORIZATION1_BEFORE_APPLY,       "AutoVectorization 1, Before Apply") \
+  flags(AUTO_VECTORIZATION2_AFTER_REORDER,      "AutoVectorization 2, After Apply Memop Reordering") \
+  flags(AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, "AutoVectorization 3, After Adjusting Pre-Loop Limit") \
+  flags(AUTO_VECTORIZATION4_AFTER_APPLY,        "AutoVectorization 4, After Apply") \
   flags(BEFORE_CLOOPS,                  "Before CountedLoop") \
   flags(AFTER_CLOOPS,                   "After CountedLoop") \
   flags(PHASEIDEAL_BEFORE_EA,           "PhaseIdealLoop before EA") \
diff --git a/src/hotspot/share/opto/predicates.cpp b/src/hotspot/share/opto/predicates.cpp
index 9f782f34bdb..5b0de2e02d5 100644
--- a/src/hotspot/share/opto/predicates.cpp
+++ b/src/hotspot/share/opto/predicates.cpp
@@ -32,29 +32,29 @@
 // (i.e. not belonging to an Initialized Assertion Predicate anymore)
 Node* AssertionPredicatesWithHalt::find_entry(Node* start_proj) {
   Node* entry = start_proj;
-  while (is_assertion_predicate_success_proj(entry)) {
+  while (AssertionPredicateWithHalt::is_predicate(entry)) {
     entry = entry->in(0)->in(0);
   }
   return entry;
 }
 
-bool AssertionPredicatesWithHalt::is_assertion_predicate_success_proj(const Node* predicate_proj) {
-  if (predicate_proj == nullptr || !predicate_proj->is_IfProj() || !predicate_proj->in(0)->is_If()) {
+bool AssertionPredicateWithHalt::is_predicate(const Node* maybe_success_proj) {
+  if (maybe_success_proj == nullptr || !maybe_success_proj->is_IfProj() || !maybe_success_proj->in(0)->is_If()) {
     return false;
   }
-  return has_assertion_predicate_opaque(predicate_proj) && has_halt(predicate_proj);
+  return has_assertion_predicate_opaque(maybe_success_proj) && has_halt(maybe_success_proj);
 }
 
 // Check if the If node of `predicate_proj` has an Opaque4 (Template Assertion Predicate) or an
 // OpaqueInitializedAssertionPredicate (Initialized Assertion Predicate) node as input.
-bool AssertionPredicatesWithHalt::has_assertion_predicate_opaque(const Node* predicate_proj) {
+bool AssertionPredicateWithHalt::has_assertion_predicate_opaque(const Node* predicate_proj) {
   IfNode* iff = predicate_proj->in(0)->as_If();
   Node* bol = iff->in(1);
   return bol->is_Opaque4() || bol->is_OpaqueInitializedAssertionPredicate();
 }
 
 // Check if the other projection (UCT projection) of `success_proj` has a Halt node as output.
-bool AssertionPredicatesWithHalt::has_halt(const Node* success_proj) {
+bool AssertionPredicateWithHalt::has_halt(const Node* success_proj) {
   ProjNode* other_proj = success_proj->as_IfProj()->other_if_proj();
   return other_proj->outcnt() == 1 && other_proj->unique_out()->Opcode() == Op_Halt;
 }
@@ -72,7 +72,15 @@ ParsePredicateNode* ParsePredicate::init_parse_predicate(Node* parse_predicate_p
   return nullptr;
 }
 
-Deoptimization::DeoptReason RuntimePredicate::uncommon_trap_reason(IfProjNode* if_proj) {
+bool ParsePredicate::is_predicate(Node* maybe_success_proj) {
+  if (!maybe_success_proj->is_IfProj()) {
+    return false;
+  }
+  IfNode* if_node = maybe_success_proj->in(0)->as_If();
+  return if_node->is_ParsePredicate();
+}
+
+Deoptimization::DeoptReason RegularPredicateWithUCT::uncommon_trap_reason(IfProjNode* if_proj) {
     CallStaticJavaNode* uct_call = if_proj->is_uncommon_trap_if_pattern();
     if (uct_call == nullptr) {
       return Deoptimization::Reason_none;
@@ -80,8 +88,20 @@ Deoptimization::DeoptReason RuntimePredicate::uncommon_trap_reason(IfProjNode* i
     return Deoptimization::trap_request_reason(uct_call->uncommon_trap_request());
 }
 
-bool RuntimePredicate::is_success_proj(Node* node, Deoptimization::DeoptReason deopt_reason) {
-  if (may_be_runtime_predicate_if(node)) {
+bool RegularPredicateWithUCT::is_predicate(Node* maybe_success_proj) {
+  if (may_be_predicate_if(maybe_success_proj)) {
+    IfProjNode* success_proj = maybe_success_proj->as_IfProj();
+    const Deoptimization::DeoptReason deopt_reason = uncommon_trap_reason(success_proj);
+    return (deopt_reason == Deoptimization::Reason_loop_limit_check ||
+            deopt_reason == Deoptimization::Reason_predicate ||
+            deopt_reason == Deoptimization::Reason_profile_predicate);
+  } else {
+    return false;
+  }
+}
+
+bool RegularPredicateWithUCT::is_predicate(Node* node, Deoptimization::DeoptReason deopt_reason) {
+  if (may_be_predicate_if(node)) {
     return deopt_reason == uncommon_trap_reason(node->as_IfProj());
   } else {
     return false;
@@ -89,7 +109,7 @@ bool RuntimePredicate::is_success_proj(Node* node, Deoptimization::DeoptReason d
 }
 
 // A Runtime Predicate must have an If or a RangeCheck node, while the If should not be a zero trip guard check.
-bool RuntimePredicate::may_be_runtime_predicate_if(Node* node) {
+bool RegularPredicateWithUCT::may_be_predicate_if(Node* node) {
   if (node->is_IfProj()) {
     const IfNode* if_node = node->in(0)->as_If();
     const int opcode_if = if_node->Opcode();
@@ -101,6 +121,10 @@ bool RuntimePredicate::may_be_runtime_predicate_if(Node* node) {
   return false;
 }
 
+bool RuntimePredicate::is_success_proj(Node* node, Deoptimization::DeoptReason deopt_reason) {
+  return RegularPredicateWithUCT::is_predicate(node, deopt_reason);
+}
+
 ParsePredicateIterator::ParsePredicateIterator(const Predicates& predicates) : _current_index(0) {
   const PredicateBlock* loop_limit_check_predicate_block = predicates.loop_limit_check_predicate_block();
   if (loop_limit_check_predicate_block->has_parse_predicate()) {
@@ -356,3 +380,18 @@ bool TemplateAssertionPredicateExpressionNode::is_in_expression(Node* node) {
 bool TemplateAssertionPredicateExpressionNode::is_template_assertion_predicate(Node* node) {
   return node->is_If() && node->in(1)->is_Opaque4();
 }
+
+// Is current node pointed to by iterator a predicate?
+bool PredicateEntryIterator::has_next() const {
+    return ParsePredicate::is_predicate(_current) ||
+           RegularPredicateWithUCT::is_predicate(_current) ||
+           AssertionPredicateWithHalt::is_predicate(_current);
+}
+
+// Skip the current predicate pointed to by iterator by returning the input into the predicate. This could possibly be
+// a non-predicate node.
+Node* PredicateEntryIterator::next_entry() {
+  assert(has_next(), "current must be predicate");
+  _current = _current->in(0)->in(0);
+  return _current;
+}
diff --git a/src/hotspot/share/opto/predicates.hpp b/src/hotspot/share/opto/predicates.hpp
index bf12aeb6a51..08aa64f03e5 100644
--- a/src/hotspot/share/opto/predicates.hpp
+++ b/src/hotspot/share/opto/predicates.hpp
@@ -26,6 +26,7 @@
 #define SHARE_OPTO_PREDICATES_HPP
 
 #include "opto/cfgnode.hpp"
+#include "opto/connode.hpp"
 #include "opto/opaquenode.hpp"
 
 /*
@@ -192,6 +193,15 @@
  * Main Loop Head
  */
 
+#ifndef PRODUCT
+// Assertion Predicates are either emitted to check the initial value of a range check in the first iteration or the last
+// value of a range check in the last iteration of a loop.
+enum class AssertionPredicateType {
+  None, // Not an Assertion Predicate
+  Init_value,
+  Last_value
+};
+#endif // NOT PRODUCT
 
 // Class to represent Assertion Predicates with a HaltNode instead of an UCT (i.e. either an Initialized Assertion
 // Predicate or a Template Assertion Predicate created after the initial one at Loop Predication).
@@ -199,9 +209,6 @@ class AssertionPredicatesWithHalt : public StackObj {
   Node* _entry;
 
   static Node* find_entry(Node* start_proj);
-  static bool has_assertion_predicate_opaque(const Node* predicate_proj);
-  static bool has_halt(const Node* success_proj);
-  static bool is_assertion_predicate_success_proj(const Node* predicate_proj);
 
  public:
   AssertionPredicatesWithHalt(Node* assertion_predicate_proj) : _entry(find_entry(assertion_predicate_proj)) {}
@@ -213,13 +220,37 @@ class AssertionPredicatesWithHalt : public StackObj {
   }
 };
 
+// Class to represent a single Assertion Predicate with a HaltNode. This could either be:
+// - A Template Assertion Predicate.
+// - An Initialized Assertion Predicate.
+// Note that all other Regular Predicates have an UCT node.
+class AssertionPredicateWithHalt : public StackObj {
+  static bool has_assertion_predicate_opaque(const Node* predicate_proj);
+  static bool has_halt(const Node* success_proj);
+ public:
+  static bool is_predicate(const Node* maybe_success_proj);
+};
+
+// Class to represent a single Regular Predicate with an UCT. This could either be:
+// - A Runtime Predicate
+// - A Template Assertion Predicate
+// Note that all other Regular Predicates have a Halt node.
+class RegularPredicateWithUCT : public StackObj {
+  static Deoptimization::DeoptReason uncommon_trap_reason(IfProjNode* if_proj);
+  static bool may_be_predicate_if(Node* node);
+
+ public:
+  static bool is_predicate(Node* maybe_success_proj);
+  static bool is_predicate(Node* node, Deoptimization::DeoptReason deopt_reason);
+};
+
 // Class to represent a Parse Predicate.
 class ParsePredicate : public StackObj {
   ParsePredicateSuccessProj* _success_proj;
   ParsePredicateNode* _parse_predicate_node;
   Node* _entry;
 
-  IfTrueNode* init_success_proj(const Node* parse_predicate_proj) const {
+  static IfTrueNode* init_success_proj(const Node* parse_predicate_proj) {
     assert(parse_predicate_proj != nullptr, "must not be null");
     return parse_predicate_proj->isa_IfTrue();
   }
@@ -253,13 +284,12 @@ class ParsePredicate : public StackObj {
     assert(is_valid(), "must be valid");
     return _success_proj;
   }
+
+  static bool is_predicate(Node* maybe_success_proj);
 };
 
 // Utility class for queries on Runtime Predicates.
 class RuntimePredicate : public StackObj {
-  static Deoptimization::DeoptReason uncommon_trap_reason(IfProjNode* if_proj);
-  static bool may_be_runtime_predicate_if(Node* node);
-
  public:
   static bool is_success_proj(Node* node, Deoptimization::DeoptReason deopt_reason);
 };
@@ -473,4 +503,17 @@ class ParsePredicateIterator : public StackObj {
 
   ParsePredicateNode* next();
 };
+
+// Special predicate iterator that can be used to walk through predicate entries, regardless of whether the predicate
+// belongs to the same loop or not (i.e. leftovers from already folded nodes). The iterator returns the next entry
+// to a predicate.
+class PredicateEntryIterator : public StackObj {
+  Node* _current;
+
+ public:
+  explicit PredicateEntryIterator(Node* start) : _current(start) {};
+
+  bool has_next() const;
+  Node* next_entry();
+};
 #endif // SHARE_OPTO_PREDICATES_HPP
diff --git a/src/hotspot/share/opto/rootnode.hpp b/src/hotspot/share/opto/rootnode.hpp
index 40e812023c1..3838578b4db 100644
--- a/src/hotspot/share/opto/rootnode.hpp
+++ b/src/hotspot/share/opto/rootnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,7 +34,7 @@
 // procedure start.
 class RootNode : public LoopNode {
 public:
-  RootNode( ) : LoopNode(0,0) {
+  RootNode( ) : LoopNode(nullptr, nullptr) {
     init_class_id(Class_Root);
     del_req(2);
     del_req(1);
diff --git a/src/hotspot/share/opto/runtime.cpp b/src/hotspot/share/opto/runtime.cpp
index d8e5cdbab04..465404bb469 100644
--- a/src/hotspot/share/opto/runtime.cpp
+++ b/src/hotspot/share/opto/runtime.cpp
@@ -1357,6 +1357,27 @@ const TypeFunc* OptoRuntime::base64_encodeBlock_Type() {
   const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields);
   return TypeFunc::make(domain, range);
 }
+
+// String IndexOf function
+const TypeFunc* OptoRuntime::string_IndexOf_Type() {
+  int argcnt = 4;
+
+  const Type** fields = TypeTuple::fields(argcnt);
+  int argp = TypeFunc::Parms;
+  fields[argp++] = TypePtr::NOTNULL;    // haystack array
+  fields[argp++] = TypeInt::INT;        // haystack length
+  fields[argp++] = TypePtr::NOTNULL;    // needle array
+  fields[argp++] = TypeInt::INT;        // needle length
+  assert(argp == TypeFunc::Parms + argcnt, "correct decoding");
+  const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
+
+  // result type needed
+  fields = TypeTuple::fields(1);
+  fields[TypeFunc::Parms + 0] = TypeInt::INT; // Index of needle in haystack
+  const TypeTuple* range = TypeTuple::make(TypeFunc::Parms + 1, fields);
+  return TypeFunc::make(domain, range);
+}
+
 // Base64 decode function
 const TypeFunc* OptoRuntime::base64_decodeBlock_Type() {
   int argcnt = 7;
@@ -1414,8 +1435,8 @@ const TypeFunc* OptoRuntime::intpoly_montgomeryMult_P256_Type() {
 
   // result type needed
   fields = TypeTuple::fields(1);
-  fields[TypeFunc::Parms + 0] = TypeInt::INT; // carry bits in output
-  const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+1, fields);
+  fields[TypeFunc::Parms + 0] = nullptr; // void
+  const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields);
   return TypeFunc::make(domain, range);
 }
 
@@ -1434,7 +1455,7 @@ const TypeFunc* OptoRuntime::intpoly_assign_Type() {
 
   // result type needed
   fields = TypeTuple::fields(1);
-  fields[TypeFunc::Parms + 0] = NULL; // void
+  fields[TypeFunc::Parms + 0] = nullptr; // void
   const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields);
   return TypeFunc::make(domain, range);
 }
@@ -1835,14 +1856,6 @@ void OptoRuntime::print_named_counters() {
           eliminated_lock_count += count;
         }
       }
-#if INCLUDE_RTM_OPT
-    } else if (c->tag() == NamedCounter::RTMLockingCounter) {
-      RTMLockingCounters* rlc = ((RTMLockingNamedCounter*)c)->counters();
-      if (rlc->nonzero()) {
-        tty->print_cr("%s", c->name());
-        rlc->print_on(tty);
-      }
-#endif
     }
     c = c->next();
   }
@@ -1884,12 +1897,7 @@ NamedCounter* OptoRuntime::new_named_counter(JVMState* youngest_jvms, NamedCount
     st.print("@%d", bci);
     // To print linenumbers instead of bci use: m->line_number_from_bci(bci)
   }
-  NamedCounter* c;
-  if (tag == NamedCounter::RTMLockingCounter) {
-    c = new RTMLockingNamedCounter(st.freeze());
-  } else {
-    c = new NamedCounter(st.freeze(), tag);
-  }
+  NamedCounter* c = new NamedCounter(st.freeze(), tag);
 
   // atomically add the new counter to the head of the list.  We only
   // add counters so this is safe.
diff --git a/src/hotspot/share/opto/runtime.hpp b/src/hotspot/share/opto/runtime.hpp
index e4cbdf2f0d0..6aadab97122 100644
--- a/src/hotspot/share/opto/runtime.hpp
+++ b/src/hotspot/share/opto/runtime.hpp
@@ -29,7 +29,6 @@
 #include "opto/machnode.hpp"
 #include "opto/optoreg.hpp"
 #include "opto/type.hpp"
-#include "runtime/rtmLocking.hpp"
 #include "runtime/deoptimization.hpp"
 #include "runtime/vframe.hpp"
 
@@ -61,8 +60,7 @@ class NamedCounter : public CHeapObj<mtCompiler> {
     enum CounterTag {
     NoTag,
     LockCounter,
-    EliminatedLockCounter,
-    RTMLockingCounter
+    EliminatedLockCounter
   };
 
 private:
@@ -98,17 +96,6 @@ class NamedCounter : public CHeapObj<mtCompiler> {
 
 };
 
-class RTMLockingNamedCounter : public NamedCounter {
- private:
- RTMLockingCounters _counters;
-
- public:
-  RTMLockingNamedCounter(const char *n) :
-    NamedCounter(n, RTMLockingCounter), _counters() {}
-
-  RTMLockingCounters* counters() { return &_counters; }
-};
-
 typedef const TypeFunc*(*TypeFunc_generator)();
 
 class OptoRuntime : public AllStatic {
@@ -297,6 +284,7 @@ class OptoRuntime : public AllStatic {
   static const TypeFunc* chacha20Block_Type();
   static const TypeFunc* base64_encodeBlock_Type();
   static const TypeFunc* base64_decodeBlock_Type();
+  static const TypeFunc* string_IndexOf_Type();
   static const TypeFunc* poly1305_processBlocks_Type();
   static const TypeFunc* intpoly_montgomeryMult_P256_Type();
   static const TypeFunc* intpoly_assign_Type();
diff --git a/src/hotspot/share/opto/subnode.hpp b/src/hotspot/share/opto/subnode.hpp
index f424e258db2..a0c052645c6 100644
--- a/src/hotspot/share/opto/subnode.hpp
+++ b/src/hotspot/share/opto/subnode.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -39,7 +39,7 @@
 // are compressed into -1, and all positive answers compressed to 1.
 class SubNode : public Node {
 public:
-  SubNode( Node *in1, Node *in2 ) : Node(0,in1,in2) {
+  SubNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {
     init_class_id(Class_Sub);
   }
 
@@ -363,7 +363,7 @@ class BoolNode : public Node {
 // for finding this pattern in the graph.
 class AbsNode : public Node {
 public:
-  AbsNode( Node *value ) : Node(0,value) {}
+  AbsNode( Node *value ) : Node(nullptr,value) {}
   virtual Node* Identity(PhaseGVN* phase);
   virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
   virtual const Type* Value(PhaseGVN* phase) const;
@@ -420,7 +420,7 @@ class AbsDNode : public AbsNode {
 // If p < q, return -1 else return 0.  Nice for flow-free idioms.
 class CmpLTMaskNode : public Node {
 public:
-  CmpLTMaskNode( Node *p, Node *q ) : Node(0, p, q) {}
+  CmpLTMaskNode( Node *p, Node *q ) : Node(nullptr, p, q) {}
   virtual int Opcode() const;
   const Type *bottom_type() const { return TypeInt::INT; }
   virtual uint ideal_reg() const { return Op_RegI; }
@@ -430,7 +430,7 @@ class CmpLTMaskNode : public Node {
 //------------------------------NegNode----------------------------------------
 class NegNode : public Node {
 public:
-  NegNode(Node* in1) : Node(0, in1) {
+  NegNode(Node* in1) : Node(nullptr, in1) {
     init_class_id(Class_Neg);
   }
 };
diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp
index 0b940a13c54..5721f7bcd54 100644
--- a/src/hotspot/share/opto/superword.cpp
+++ b/src/hotspot/share/opto/superword.cpp
@@ -22,28 +22,18 @@
  */
 
 #include "precompiled.hpp"
-#include "libadt/vectset.hpp"
-#include "memory/allocation.inline.hpp"
-#include "memory/resourceArea.hpp"
 #include "opto/addnode.hpp"
-#include "opto/c2compiler.hpp"
 #include "opto/castnode.hpp"
 #include "opto/convertnode.hpp"
-#include "opto/matcher.hpp"
-#include "opto/memnode.hpp"
-#include "opto/opcodes.hpp"
-#include "opto/opaquenode.hpp"
-#include "opto/rootnode.hpp"
 #include "opto/superword.hpp"
+#include "opto/superwordVTransformBuilder.hpp"
 #include "opto/vectornode.hpp"
 #include "opto/movenode.hpp"
-#include "utilities/powerOfTwo.hpp"
 
 SuperWord::SuperWord(const VLoopAnalyzer &vloop_analyzer) :
   _vloop_analyzer(vloop_analyzer),
   _vloop(vloop_analyzer.vloop()),
   _arena(mtCompiler),
-  _node_info(arena(), _vloop.estimated_body_length(), 0, SWNodeInfo::initial), // info needed per node
   _clone_map(phase()->C->clone_map()),                      // map of nodes created in cloning
   _pairset(&_arena, _vloop_analyzer),
   _packset(&_arena, _vloop_analyzer
@@ -453,11 +443,8 @@ bool SuperWord::transform_loop() {
 bool SuperWord::SLP_extract() {
   assert(cl()->is_main_loop(), "SLP should only work on main loops");
 
-  // Ensure extra info is allocated.
-  initialize_node_info();
-
-  // Attempt vectorization
-  find_adjacent_refs();
+  // Find "seed" pairs.
+  create_adjacent_memop_pairs();
 
   if (_pairset.is_empty()) {
 #ifndef PRODUCT
@@ -485,251 +472,138 @@ bool SuperWord::SLP_extract() {
   filter_packs_for_profitable();
 
   DEBUG_ONLY(verify_packs();)
+  DEBUG_ONLY(verify_no_extract());
 
-  schedule();
-
-  return output();
+  return schedule_and_apply();
 }
 
-//------------------------------find_adjacent_refs---------------------------
-// Find the adjacent memory references and create pack pairs for them.
-// We can find adjacent memory references by comparing their relative
-// alignment. Whether the final vectors can be aligned is determined later
-// once all vectors are extended and combined.
-void SuperWord::find_adjacent_refs() {
-  // Get list of memory operations
-  Node_List memops;
-  for (int i = 0; i < body().length(); i++) {
-    Node* n = body().at(i);
-    if (n->is_Mem() && !n->is_LoadStore() && in_bb(n) &&
-        is_java_primitive(n->as_Mem()->memory_type())) {
-      int align = memory_alignment(n->as_Mem(), 0);
-      if (align != bottom_align) {
-        memops.push(n);
-      }
-    }
-  }
+// Find the "seed" memops pairs. These are pairs that we strongly suspect would lead to vectorization.
+void SuperWord::create_adjacent_memop_pairs() {
+  ResourceMark rm;
+  GrowableArray<const VPointer*> vpointers;
+
+  collect_valid_vpointers(vpointers);
+
+  // Sort the VPointers. This does 2 things:
+  //  - Separate the VPointer into groups: all memops that have the same opcode and the same
+  //    VPointer, except for the offset. Adjacent memops must have the same opcode and the
+  //    same VPointer, except for a shift in the offset. Thus, two memops can only be adjacent
+  //    if they are in the same group. This decreases the work.
+  //  - Sort by offset inside the groups. This decreases the work needed to determine adjacent
+  //    memops inside a group.
+  vpointers.sort(VPointer::cmp_for_sort);
+
 #ifndef PRODUCT
   if (is_trace_superword_adjacent_memops()) {
-    tty->print_cr("\nfind_adjacent_refs found %d memops", memops.size());
+    tty->print_cr("\nSuperWord::create_adjacent_memop_pairs:");
   }
 #endif
 
-  int max_idx;
-
-  while (memops.size() != 0) {
-    // Find a memory reference to align to.
-    MemNode* mem_ref = find_align_to_ref(memops, max_idx);
-    if (mem_ref == nullptr) break;
-    int iv_adjustment = get_iv_adjustment(mem_ref);
-
-    const VPointer& align_to_ref_p = vpointer(mem_ref);
-    // Set alignment relative to "align_to_ref" for all related memory operations.
-    for (int i = memops.size() - 1; i >= 0; i--) {
-      MemNode* s = memops.at(i)->as_Mem();
-      if (isomorphic(s, mem_ref) &&
-           (!_do_vector_loop || same_origin_idx(s, mem_ref))) {
-        const VPointer& p2 = vpointer(s);
-        if (p2.comparable(align_to_ref_p)) {
-          int align = memory_alignment(s, iv_adjustment);
-          set_alignment(s, align);
-        }
-      }
-    }
-
-    // Create initial pack pairs of memory operations for which alignment was set.
-    for (uint i = 0; i < memops.size(); i++) {
-      Node* s1 = memops.at(i);
-      int align = alignment(s1);
-      if (align == top_align) continue;
-      for (uint j = 0; j < memops.size(); j++) {
-        Node* s2 = memops.at(j);
-        if (alignment(s2) == top_align) continue;
-        if (s1 != s2 && are_adjacent_refs(s1, s2)) {
-          if (stmts_can_pack(s1, s2, align)) {
-            if (!_do_vector_loop || same_origin_idx(s1, s2)) {
-              _pairset.add_pair(s1, s2);
-            }
-          }
-        }
-      }
-    }
-
-    // Remove used mem nodes.
-    for (int i = memops.size() - 1; i >= 0; i--) {
-      MemNode* m = memops.at(i)->as_Mem();
-      if (alignment(m) != top_align) {
-        memops.remove(i);
-      }
-    }
-  } // while (memops.size() != 0)
+  create_adjacent_memop_pairs_in_all_groups(vpointers);
 
 #ifndef PRODUCT
   if (is_trace_superword_packset()) {
-    tty->print_cr("\nAfter Superword::find_adjacent_refs");
+    tty->print_cr("\nAfter Superword::create_adjacent_memop_pairs");
     _pairset.print();
   }
 #endif
 }
 
-//------------------------------find_align_to_ref---------------------------
-// Find a memory reference to align the loop induction variable to.
-// Looks first at stores then at loads, looking for a memory reference
-// with the largest number of references similar to it.
-MemNode* SuperWord::find_align_to_ref(Node_List &memops, int &idx) {
-  GrowableArray<int> cmp_ct(arena(), memops.size(), memops.size(), 0);
-
-  // Count number of comparable memory ops
-  for (uint i = 0; i < memops.size(); i++) {
-    MemNode* s1 = memops.at(i)->as_Mem();
-    const VPointer& p1 = vpointer(s1);
-    for (uint j = i+1; j < memops.size(); j++) {
-      MemNode* s2 = memops.at(j)->as_Mem();
-      if (isomorphic(s1, s2)) {
-        const VPointer& p2 = vpointer(s2);
-        if (p1.comparable(p2)) {
-          (*cmp_ct.adr_at(i))++;
-          (*cmp_ct.adr_at(j))++;
-        }
-      }
+// Collect all memops vpointers that could potentially be vectorized.
+void SuperWord::collect_valid_vpointers(GrowableArray<const VPointer*>& vpointers) {
+  for_each_mem([&] (const MemNode* mem, int bb_idx) {
+    const VPointer& p = vpointer(mem);
+    if (p.valid() &&
+        !mem->is_LoadStore() &&
+        is_java_primitive(mem->memory_type())) {
+      vpointers.append(&p);
     }
-  }
+  });
+}
 
-  // Find Store (or Load) with the greatest number of "comparable" references,
-  // biggest vector size, smallest data size and smallest iv offset.
-  int max_ct        = 0;
-  int max_vw        = 0;
-  int max_idx       = -1;
-  int min_size      = max_jint;
-  int min_iv_offset = max_jint;
-  for (uint j = 0; j < memops.size(); j++) {
-    MemNode* s = memops.at(j)->as_Mem();
-    if (s->is_Store()) {
-      int vw = vector_width_in_bytes(s);
-      assert(vw > 1, "sanity");
-      const VPointer& p = vpointer(s);
-      if ( cmp_ct.at(j) >  max_ct ||
-          (cmp_ct.at(j) == max_ct &&
-            ( vw >  max_vw ||
-             (vw == max_vw &&
-              ( data_size(s) <  min_size ||
-               (data_size(s) == min_size &&
-                p.offset_in_bytes() < min_iv_offset)))))) {
-        max_ct = cmp_ct.at(j);
-        max_vw = vw;
-        max_idx = j;
-        min_size = data_size(s);
-        min_iv_offset = p.offset_in_bytes();
-      }
-    }
+// For each group, find the adjacent memops.
+void SuperWord::create_adjacent_memop_pairs_in_all_groups(const GrowableArray<const VPointer*> &vpointers) {
+  int group_start = 0;
+  while (group_start < vpointers.length()) {
+    int group_end = find_group_end(vpointers, group_start);
+    create_adjacent_memop_pairs_in_one_group(vpointers, group_start, group_end);
+    group_start = group_end;
   }
-  // If no stores, look at loads
-  if (max_ct == 0) {
-    for (uint j = 0; j < memops.size(); j++) {
-      MemNode* s = memops.at(j)->as_Mem();
-      if (s->is_Load()) {
-        int vw = vector_width_in_bytes(s);
-        assert(vw > 1, "sanity");
-        const VPointer& p = vpointer(s);
-        if ( cmp_ct.at(j) >  max_ct ||
-            (cmp_ct.at(j) == max_ct &&
-              ( vw >  max_vw ||
-               (vw == max_vw &&
-                ( data_size(s) <  min_size ||
-                 (data_size(s) == min_size &&
-                  p.offset_in_bytes() < min_iv_offset)))))) {
-          max_ct = cmp_ct.at(j);
-          max_vw = vw;
-          max_idx = j;
-          min_size = data_size(s);
-          min_iv_offset = p.offset_in_bytes();
-        }
-      }
-    }
+}
+
+// Step forward until we find a VPointer of another group, or we reach the end of the array.
+int SuperWord::find_group_end(const GrowableArray<const VPointer*>& vpointers, int group_start) {
+  int group_end = group_start + 1;
+  while (group_end < vpointers.length() &&
+         VPointer::cmp_for_sort_by_group(
+           vpointers.adr_at(group_start),
+           vpointers.adr_at(group_end)
+         ) == 0) {
+    group_end++;
   }
+  return group_end;
+}
 
+// Find adjacent memops for a single group, e.g. for all LoadI of the same base, invar, etc.
+// Create pairs and add them to the pairset.
+void SuperWord::create_adjacent_memop_pairs_in_one_group(const GrowableArray<const VPointer*>& vpointers, const int group_start, const int group_end) {
 #ifndef PRODUCT
-  if (is_trace_superword_verbose()) {
-    tty->print_cr("\nVector memops after find_align_to_ref");
-    for (uint i = 0; i < memops.size(); i++) {
-      MemNode* s = memops.at(i)->as_Mem();
-      s->dump();
+  if (is_trace_superword_adjacent_memops()) {
+    tty->print_cr(" group:");
+    for (int i = group_start; i < group_end; i++) {
+      const VPointer* p = vpointers.at(i);
+      tty->print("  ");
+      p->print();
     }
   }
 #endif
 
-  idx = max_idx;
-  if (max_ct > 0) {
-#ifndef PRODUCT
-    if (is_trace_superword_adjacent_memops()) {
-      tty->print("SuperWord::find_align_to_ref: ");
-      memops.at(max_idx)->as_Mem()->dump();
-    }
-#endif
-    return memops.at(max_idx)->as_Mem();
-  }
-  return nullptr;
-}
+  MemNode* first = vpointers.at(group_start)->mem();
+  int element_size = data_size(first);
 
-//---------------------------get_vw_bytes_special------------------------
-int SuperWord::get_vw_bytes_special(MemNode* s) {
-  // Get the vector width in bytes.
-  int vw = vector_width_in_bytes(s);
+  // For each ref in group: find others that can be paired:
+  for (int i = group_start; i < group_end; i++) {
+    const VPointer* p1 = vpointers.at(i);
+    MemNode* mem1 = p1->mem();
 
-  // Check for special case where there is an MulAddS2I usage where short vectors are going to need combined.
-  BasicType btype = velt_basic_type(s);
-  if (type2aelembytes(btype) == 2) {
-    bool should_combine_adjacent = true;
-    for (DUIterator_Fast imax, i = s->fast_outs(imax); i < imax; i++) {
-      Node* user = s->fast_out(i);
-      if (!VectorNode::is_muladds2i(user)) {
-        should_combine_adjacent = false;
-      }
-    }
-    if (should_combine_adjacent) {
-      vw = MIN2(Matcher::max_vector_size_auto_vectorization(btype)*type2aelembytes(btype), vw * 2);
-    }
-  }
+    bool found = false;
+    // For each ref in group with larger or equal offset:
+    for (int j = i + 1; j < group_end; j++) {
+      const VPointer* p2 = vpointers.at(j);
+      MemNode* mem2 = p2->mem();
+      assert(mem1 != mem2, "look only at pair of different memops");
 
-  // Check for special case where there is a type conversion between different data size.
-  int vectsize = max_vector_size_in_def_use_chain(s);
-  if (vectsize < Matcher::max_vector_size_auto_vectorization(btype)) {
-    vw = MIN2(vectsize * type2aelembytes(btype), vw);
-  }
+      // Check for correct distance.
+      assert(data_size(mem1) == element_size, "all nodes in group must have the same element size");
+      assert(data_size(mem2) == element_size, "all nodes in group must have the same element size");
+      assert(p1->offset_in_bytes() <= p2->offset_in_bytes(), "must be sorted by offset");
+      if (p1->offset_in_bytes() + element_size > p2->offset_in_bytes()) { continue; }
+      if (p1->offset_in_bytes() + element_size < p2->offset_in_bytes()) { break; }
 
-  return vw;
-}
+      // Only allow nodes from same origin idx to be packed (see CompileCommand Option Vectorize)
+      if (_do_vector_loop && !same_origin_idx(mem1, mem2)) { continue; }
 
-//---------------------------get_iv_adjustment---------------------------
-// Calculate loop's iv adjustment for this memory ops.
-int SuperWord::get_iv_adjustment(MemNode* mem_ref) {
-  const VPointer& align_to_ref_p = vpointer(mem_ref);
-  int offset = align_to_ref_p.offset_in_bytes();
-  int scale  = align_to_ref_p.scale_in_bytes();
-  int elt_size = align_to_ref_p.memory_size();
-  int vw       = get_vw_bytes_special(mem_ref);
-  assert(vw > 1, "sanity");
-  int iv_adjustment;
-  if (scale != 0) {
-    int stride_sign = (scale * iv_stride()) > 0 ? 1 : -1;
-    // At least one iteration is executed in pre-loop by default. As result
-    // several iterations are needed to align memory operations in main-loop even
-    // if offset is 0.
-    int iv_adjustment_in_bytes = (stride_sign * vw - (offset % vw));
-    iv_adjustment = iv_adjustment_in_bytes/elt_size;
-  } else {
-    // This memory op is not dependent on iv (scale == 0)
-    iv_adjustment = 0;
-  }
+      if (!can_pack_into_pair(mem1, mem2)) { continue; }
 
 #ifndef PRODUCT
-  if (is_trace_superword_alignment()) {
-    tty->print("SuperWord::get_iv_adjustment: n = %d, noffset = %d iv_adjust = %d elt_size = %d scale = %d iv_stride = %d vect_size %d: ",
-      mem_ref->_idx, offset, iv_adjustment, elt_size, scale, iv_stride(), vw);
-    mem_ref->dump();
-  }
+      if (is_trace_superword_adjacent_memops()) {
+        if (found) {
+          tty->print_cr(" WARNING: multiple pairs with the same node. Ignored pairing:");
+        } else {
+          tty->print_cr(" pair:");
+        }
+        tty->print("  ");
+        p1->print();
+        tty->print("  ");
+        p2->print();
+      }
 #endif
-  return iv_adjustment;
+
+      if (!found) {
+        _pairset.add_pair(mem1, mem2);
+      }
+    }
+  }
 }
 
 void VLoopMemorySlices::find_memory_slices() {
@@ -809,10 +683,8 @@ void VLoopMemorySlices::get_slice_in_reverse_order(PhiNode* head, MemNode* tail,
 #endif
 }
 
-//------------------------------stmts_can_pack---------------------------
-// Can s1 and s2 be in a pack with s1 immediately preceding s2 and
-// s1 aligned at "align"
-bool SuperWord::stmts_can_pack(Node* s1, Node* s2, int align) {
+// Check if two nodes can be packed into a pair.
+bool SuperWord::can_pack_into_pair(Node* s1, Node* s2) {
 
   // Do not use superword for non-primitives
   BasicType bt1 = velt_basic_type(s1);
@@ -826,18 +698,12 @@ bool SuperWord::stmts_can_pack(Node* s1, Node* s2, int align) {
   }
 
   // Forbid anything that looks like a PopulateIndex to be packed. It does not need to be packed,
-  // and will still be vectorized by SuperWord::vector_opd.
+  // and will still be vectorized by SuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_index.
   if (isomorphic(s1, s2) && !is_populate_index(s1, s2)) {
     if ((independent(s1, s2) && have_similar_inputs(s1, s2)) || reduction(s1, s2)) {
       if (!_pairset.is_left(s1) && !_pairset.is_right(s2)) {
         if (!s1->is_Mem() || are_adjacent_refs(s1, s2)) {
-          int s1_align = alignment(s1);
-          int s2_align = alignment(s2);
-          if (s1_align == top_align || s1_align == align) {
-            if (s2_align == top_align || s2_align == align + data_size(s1)) {
-              return true;
-            }
-          }
+          return true;
         }
       }
     }
@@ -894,8 +760,9 @@ bool SuperWord::isomorphic(Node* s1, Node* s2) {
   }
 }
 
-// Look for pattern n1 = (iv + c) and n2 = (iv + c + 1), which may lead to PopulateIndex vector node.
-// We skip the pack creation of these nodes. They will be vectorized by SuperWord::vector_opd.
+// Look for pattern n1 = (iv + c) and n2 = (iv + c + 1), which may lead to
+// PopulateIndex vector node. We skip the pack creation of these nodes. They
+// will be vectorized by SuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_index.
 bool SuperWord::is_populate_index(const Node* n1, const Node* n2) const {
   return n1->is_Add() &&
          n2->is_Add() &&
@@ -1013,16 +880,6 @@ bool VLoopReductions::is_marked_reduction_pair(const Node* s1, const Node* s2) c
   return false;
 }
 
-//------------------------------set_alignment---------------------------
-void SuperWord::set_alignment(Node* s1, Node* s2, int align) {
-  set_alignment(s1, align);
-  if (align == top_align || align == bottom_align) {
-    set_alignment(s2, align);
-  } else {
-    set_alignment(s2, align + data_size(s1));
-  }
-}
-
 // Extend pairset by following use->def and def->use links from pair members.
 void SuperWord::extend_pairset_with_more_pairs_by_following_use_and_def() {
   bool changed;
@@ -1058,57 +915,25 @@ void SuperWord::extend_pairset_with_more_pairs_by_following_use_and_def() {
 #endif
 }
 
-//------------------------------adjust_alignment_for_type_conversion---------------------------------
-// Adjust the target alignment if conversion between different data size exists in def-use nodes.
-int SuperWord::adjust_alignment_for_type_conversion(Node* s, Node* t, int align) {
-  // Do not use superword for non-primitives
-  BasicType bt1 = velt_basic_type(s);
-  BasicType bt2 = velt_basic_type(t);
-  if (!is_java_primitive(bt1) || !is_java_primitive(bt2)) {
-    return align;
-  }
-  if (longer_type_for_conversion(s) != T_ILLEGAL ||
-      longer_type_for_conversion(t) != T_ILLEGAL) {
-    align = align / data_size(s) * data_size(t);
-  }
-  return align;
-}
-
 bool SuperWord::extend_pairset_with_more_pairs_by_following_def(Node* s1, Node* s2) {
   assert(_pairset.is_pair(s1, s2), "(s1, s2) must be a pair");
   assert(s1->req() == s2->req(), "just checking");
-  assert(alignment(s1) + data_size(s1) == alignment(s2), "just checking");
 
   if (s1->is_Load()) return false;
 
-#ifndef PRODUCT
-  if (is_trace_superword_alignment()) {
-    tty->print_cr("SuperWord::extend_pairset_with_more_pairs_by_following_def: s1 %d, align %d",
-                  s1->_idx, alignment(s1));
-  }
-#endif
   bool changed = false;
   int start = s1->is_Store() ? MemNode::ValueIn   : 1;
   int end   = s1->is_Store() ? MemNode::ValueIn+1 : s1->req();
   for (int j = start; j < end; j++) {
-    int align = alignment(s1);
     Node* t1 = s1->in(j);
     Node* t2 = s2->in(j);
     if (!in_bb(t1) || !in_bb(t2) || t1->is_Mem() || t2->is_Mem())  {
       // Only follow non-memory nodes in block - we do not want to resurrect misaligned packs.
       continue;
     }
-    align = adjust_alignment_for_type_conversion(s1, t1, align);
-    if (stmts_can_pack(t1, t2, align)) {
+    if (can_pack_into_pair(t1, t2)) {
       if (estimate_cost_savings_when_packing_as_pair(t1, t2) >= 0) {
         _pairset.add_pair(t1, t2);
-#ifndef PRODUCT
-        if (is_trace_superword_alignment()) {
-          tty->print_cr("SuperWord::extend_pairset_with_more_pairs_by_following_def: set_alignment(%d, %d, %d)",
-                        t1->_idx, t2->_idx, align);
-        }
-#endif
-        set_alignment(t1, t2, align);
         changed = true;
       }
     }
@@ -1122,17 +947,9 @@ bool SuperWord::extend_pairset_with_more_pairs_by_following_def(Node* s1, Node*
 bool SuperWord::extend_pairset_with_more_pairs_by_following_use(Node* s1, Node* s2) {
   assert(_pairset.is_pair(s1, s2), "(s1, s2) must be a pair");
   assert(s1->req() == s2->req(), "just checking");
-  assert(alignment(s1) + data_size(s1) == alignment(s2), "just checking");
 
   if (s1->is_Store()) return false;
 
-  int align = alignment(s1);
-#ifndef PRODUCT
-  if (is_trace_superword_alignment()) {
-    tty->print_cr("SuperWord::extend_pairset_with_more_pairs_by_following_use: s1 %d, align %d",
-                  s1->_idx, align);
-  }
-#endif
   int savings = -1;
   Node* u1 = nullptr;
   Node* u2 = nullptr;
@@ -1150,28 +967,18 @@ bool SuperWord::extend_pairset_with_more_pairs_by_following_use(Node* s1, Node*
       }
       if (t2->Opcode() == Op_AddI && t2 == cl()->incr()) continue; // don't mess with the iv
       if (order_inputs_of_uses_to_match_def_pair(s1, s2, t1, t2) != PairOrderStatus::Ordered) { continue; }
-      int adjusted_align = alignment(s1);
-      adjusted_align = adjust_alignment_for_type_conversion(s1, t1, adjusted_align);
-      if (stmts_can_pack(t1, t2, adjusted_align)) {
+      if (can_pack_into_pair(t1, t2)) {
         int my_savings = estimate_cost_savings_when_packing_as_pair(t1, t2);
         if (my_savings > savings) {
           savings = my_savings;
           u1 = t1;
           u2 = t2;
-          align = adjusted_align;
         }
       }
     }
   }
   if (savings >= 0) {
     _pairset.add_pair(u1, u2);
-#ifndef PRODUCT
-    if (is_trace_superword_alignment()) {
-      tty->print_cr("SuperWord::extend_pairset_with_more_pairs_by_following_use: set_alignment(%d, %d, %d)",
-                    u1->_idx, u2->_idx, align);
-    }
-#endif
-    set_alignment(u1, u2, align);
     return true; // changed
   }
   return false; // no change
@@ -1650,7 +1457,7 @@ const AlignmentSolution* SuperWord::pack_alignment_solution(const Node_List* pac
 // that the packs impose. Remove packs that do not have a compatible solution.
 void SuperWord::filter_packs_for_alignment() {
   // We do not need to filter if no alignment is required.
-  if (!vectors_should_be_aligned()) {
+  if (!VLoop::vectors_should_be_aligned()) {
     return;
   }
 
@@ -1776,20 +1583,12 @@ bool SuperWord::implemented(const Node_List* pack, const uint size) const {
     } else if (p0->is_Cmp()) {
       // Cmp -> Bool -> Cmove
       retValue = UseVectorCmov;
-    } else if (requires_long_to_int_conversion(opc)) {
-      // Java API for Long.bitCount/numberOfLeadingZeros/numberOfTrailingZeros
-      // returns int type, but Vector API for them returns long type. To unify
-      // the implementation in backend, superword splits the vector implementation
-      // for Java API into an execution node with long type plus another node
-      // converting long to int.
+    } else if (VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(opc)) {
+      // Requires extra vector long -> int conversion.
       retValue = VectorNode::implemented(opc, size, T_LONG) &&
                  VectorCastNode::implemented(Op_ConvL2I, size, T_LONG, T_INT);
     } else {
-      // Vector unsigned right shift for signed subword types behaves differently
-      // from Java Spec. But when the shift amount is a constant not greater than
-      // the number of sign extended bits, the unsigned right shift can be
-      // vectorized to a signed right shift.
-      if (VectorNode::can_transform_shift_op(p0, velt_basic_type(p0))) {
+      if (VectorNode::can_use_RShiftI_instead_of_URShiftI(p0, velt_basic_type(p0))) {
         opc = Op_RShiftI;
       }
       retValue = VectorNode::implemented(opc, size, velt_basic_type(p0));
@@ -1814,31 +1613,87 @@ uint SuperWord::max_implemented_size(const Node_List* pack) {
   }
 }
 
-bool SuperWord::requires_long_to_int_conversion(int opc) {
-  switch(opc) {
-    case Op_PopCountL:
-    case Op_CountLeadingZerosL:
-    case Op_CountTrailingZerosL:
-      return true;
-    default:
-      return false;
+// If the j-th input for all nodes in the pack is the same input: return it, else nullptr.
+Node* PackSet::same_inputs_at_index_or_null(const Node_List* pack, const int index) const {
+  Node* p0_in = pack->at(0)->in(index);
+  for (uint i = 1; i < pack->size(); i++) {
+    if (pack->at(i)->in(index) != p0_in) {
+      return nullptr; // not same
+    }
   }
+  return p0_in;
 }
 
-//------------------------------same_inputs--------------------------
-// For pack p, are all idx operands the same?
-bool SuperWord::same_inputs(const Node_List* p, int idx) const {
-  Node* p0 = p->at(0);
-  uint vlen = p->size();
-  Node* p0_def = p0->in(idx);
-  for (uint i = 1; i < vlen; i++) {
-    Node* pi = p->at(i);
-    Node* pi_def = pi->in(idx);
-    if (p0_def != pi_def) {
-      return false;
+VTransformBoolTest PackSet::get_bool_test(const Node_List* bool_pack) const {
+  BoolNode* bol = bool_pack->at(0)->as_Bool();
+  BoolTest::mask mask = bol->_test._test;
+  bool is_negated = false;
+  assert(mask == BoolTest::eq ||
+         mask == BoolTest::ne ||
+         mask == BoolTest::ge ||
+         mask == BoolTest::gt ||
+         mask == BoolTest::lt ||
+         mask == BoolTest::le,
+         "Bool should be one of: eq, ne, ge, gt, lt, le");
+
+#ifdef ASSERT
+  for (uint j = 0; j < bool_pack->size(); j++) {
+    Node* m = bool_pack->at(j);
+    assert(m->as_Bool()->_test._test == mask,
+           "all bool nodes must have same test");
+  }
+#endif
+
+  CmpNode* cmp0 = bol->in(1)->as_Cmp();
+  assert(get_pack(cmp0) != nullptr, "Bool must have matching Cmp pack");
+
+  if (cmp0->Opcode() == Op_CmpF || cmp0->Opcode() == Op_CmpD) {
+    // If we have a Float or Double comparison, we must be careful with
+    // handling NaN's correctly. CmpF and CmpD have a return code, as
+    // they are based on the java bytecodes fcmpl/dcmpl:
+    // -1: cmp_in1 <  cmp_in2, or at least one of the two is a NaN
+    //  0: cmp_in1 == cmp_in2  (no NaN)
+    //  1: cmp_in1 >  cmp_in2  (no NaN)
+    //
+    // The "mask" selects which of the [-1, 0, 1] cases lead to "true".
+    //
+    // Note: ordered   (O) comparison returns "false" if either input is NaN.
+    //       unordered (U) comparison returns "true"  if either input is NaN.
+    //
+    // The VectorMaskCmpNode does a comparison directly on in1 and in2, in the java
+    // standard way (all comparisons are ordered, except NEQ is unordered).
+    //
+    // In the following, "mask" already matches the cmp code for VectorMaskCmpNode:
+    //   BoolTest::eq:  Case 0     -> EQ_O
+    //   BoolTest::ne:  Case -1, 1 -> NEQ_U
+    //   BoolTest::ge:  Case 0, 1  -> GE_O
+    //   BoolTest::gt:  Case 1     -> GT_O
+    //
+    // But the lt and le comparisons must be converted from unordered to ordered:
+    //   BoolTest::lt:  Case -1    -> LT_U -> VectorMaskCmp would interpret lt as LT_O
+    //   BoolTest::le:  Case -1, 0 -> LE_U -> VectorMaskCmp would interpret le as LE_O
+    //
+    if (mask == BoolTest::lt || mask == BoolTest::le) {
+      // Negating the mask gives us the negated result, since all non-NaN cases are
+      // negated, and the unordered (U) comparisons are turned into ordered (O) comparisons.
+      //          VectorMaskCmp(LT_U, in1_cmp, in2_cmp)
+      // <==> NOT VectorMaskCmp(GE_O, in1_cmp, in2_cmp)
+      //          VectorMaskCmp(LE_U, in1_cmp, in2_cmp)
+      // <==> NOT VectorMaskCmp(GT_O, in1_cmp, in2_cmp)
+      //
+      // When a VectorBlend uses the negated mask, it can simply swap its blend-inputs:
+      //      VectorBlend(    VectorMaskCmp(LT_U, in1_cmp, in2_cmp), in1_blend, in2_blend)
+      // <==> VectorBlend(NOT VectorMaskCmp(GE_O, in1_cmp, in2_cmp), in1_blend, in2_blend)
+      // <==> VectorBlend(    VectorMaskCmp(GE_O, in1_cmp, in2_cmp), in2_blend, in1_blend)
+      //      VectorBlend(    VectorMaskCmp(LE_U, in1_cmp, in2_cmp), in1_blend, in2_blend)
+      // <==> VectorBlend(NOT VectorMaskCmp(GT_O, in1_cmp, in2_cmp), in1_blend, in2_blend)
+      // <==> VectorBlend(    VectorMaskCmp(GT_O, in1_cmp, in2_cmp), in2_blend, in1_blend)
+      mask = bol->_test.negate();
+      is_negated = true;
     }
   }
-  return true;
+
+  return VTransformBoolTest(mask, is_negated);
 }
 
 //------------------------------profitable---------------------------
@@ -1875,10 +1730,9 @@ bool SuperWord::profitable(const Node_List* p) const {
     // case (different shift counts) because it is not supported yet.
     Node* cnt = p0->in(2);
     Node_List* cnt_pk = get_pack(cnt);
-    if (cnt_pk != nullptr)
-      return false;
-    if (!same_inputs(p, 2))
+    if (cnt_pk != nullptr || _packset.same_inputs_at_index_or_null(p, 2) == nullptr) {
       return false;
+    }
   }
   if (!p0->is_Store()) {
     // For now, return false if not all uses are vector.
@@ -1996,291 +1850,74 @@ void PackSet::verify() const {
 }
 #endif
 
-// The PacksetGraph combines the dependency graph with the packset. In the PackSet
-// graph, we have two kinds of nodes:
-//  (1) pack-node:   Represents all nodes of some pack p in a single node, which
-//                   shall later become a vector node.
-//  (2) scalar-node: Represents a node that is not in any pack.
-// For any edge (n1, n2) in the dependency graph, we add an edge to the PacksetGraph for
-// the PacksetGraph nodes corresponding to n1 and n2.
-// We work from the dependency graph, because it gives us all the data-dependencies,
-// as well as more refined memory-dependencies than the C2 graph. The dependency graph
-// does not have cycles. But packing nodes can introduce cyclic dependencies. Example:
-//
-//                                                       +--------+
-//  A -> X                                               |        v
-//                     Pack [A,B] and [X,Y]             [A,B]    [X,Y]
-//  Y -> B                                                 ^        |
-//                                                         +--------+
-//
-class PacksetGraph {
-private:
-  // pid: packset graph node id.
-  GrowableArray<int> _pid;                 // bb_idx(n) -> pid
-  GrowableArray<Node*> _pid_to_node;       // one node per pid, find rest via _packset.pack
-  GrowableArray<GrowableArray<int>> _out;  // out-edges
-  GrowableArray<int> _incnt;               // number of (implicit) in-edges
-  int _max_pid = 0;
-
-  bool _schedule_success;
-
-  SuperWord* _slp;
-public:
-  PacksetGraph(SuperWord* slp)
-  : _pid(8, 0, /* default */ 0), _slp(slp) {
-  }
-  // Get pid, if there is a packset node that n belongs to. Else return 0.
-  int get_pid_or_zero(const Node* n) const {
-    if (!_slp->in_bb(n)) {
-      return 0;
-    }
-    int idx = _slp->bb_idx(n);
-    if (idx >= _pid.length()) {
-      return 0;
-    } else {
-      return _pid.at(idx);
-    }
-  }
-  int get_pid(const Node* n) {
-    int poz = get_pid_or_zero(n);
-    assert(poz != 0, "pid should not be zero");
-    return poz;
-  }
-  void set_pid(Node* n, int pid) {
-    assert(n != nullptr && pid > 0, "sane inputs");
-    assert(_slp->in_bb(n), "must be");
-    int idx = _slp->bb_idx(n);
-    _pid.at_put_grow(idx, pid);
-    _pid_to_node.at_put_grow(pid - 1, n, nullptr);
-  }
-  Node* get_node(int pid) {
-    assert(pid > 0 && pid <= _pid_to_node.length(), "pid must be mapped");
-    Node* n = _pid_to_node.at(pid - 1);
-    assert(n != nullptr, "sanity");
-    return n;
-  }
-  int new_pid() {
-    _incnt.push(0);
-    _out.push(GrowableArray<int>());
-    return ++_max_pid;
-  }
-  int incnt(int pid) { return _incnt.at(pid - 1); }
-  void incnt_set(int pid, int cnt) { return _incnt.at_put(pid - 1, cnt); }
-  GrowableArray<int>& out(int pid) { return _out.at(pid - 1); }
-  bool schedule_success() const { return _schedule_success; }
-
-  // Create nodes (from packs and scalar-nodes), and add edges, based on the dependency graph.
-  void build() {
-    const PackSet& packset = _slp->packset();
-    const GrowableArray<Node*>& body = _slp->body();
-    // Map nodes in packsets
-    for (int i = 0; i < packset.length(); i++) {
-      Node_List* p = packset.at(i);
-      int pid = new_pid();
-      for (uint k = 0; k < p->size(); k++) {
-        Node* n = p->at(k);
-        set_pid(n, pid);
-        assert(packset.get_pack(n) == p, "matching packset");
-      }
-    }
+bool SuperWord::schedule_and_apply() const {
+  if (_packset.is_empty()) { return false; }
 
-    int max_pid_packset = _max_pid;
-
-    // Map nodes not in packset
-    for (int i = 0; i < body.length(); i++) {
-      Node* n = body.at(i);
-      if (n->is_Phi() || n->is_CFG()) {
-        continue; // ignore control flow
-      }
-      int pid = get_pid_or_zero(n);
-      if (pid == 0) {
-        pid = new_pid();
-        set_pid(n, pid);
-        assert(packset.get_pack(n) == nullptr, "no packset");
-      }
-    }
-
-    // Map edges for packset nodes
-    VectorSet set;
-    for (int i = 0; i < packset.length(); i++) {
-      Node_List* p = packset.at(i);
-      set.clear();
-      int pid = get_pid(p->at(0));
-      for (uint k = 0; k < p->size(); k++) {
-        Node* n = p->at(k);
-        assert(pid == get_pid(n), "all nodes in pack have same pid");
-        for (VLoopDependencyGraph::PredsIterator preds(_slp->dependency_graph(), n); !preds.done(); preds.next()) {
-          Node* pred = preds.current();
-          int pred_pid = get_pid_or_zero(pred);
-          if (pred_pid == pid && _slp->is_marked_reduction(n)) {
-            continue; // reduction -> self-cycle is not a cyclic dependency
-          }
-          // Only add edges once, and only for mapped nodes (in body)
-          if (pred_pid > 0 && !set.test_set(pred_pid)) {
-            incnt_set(pid, incnt(pid) + 1); // increment
-            out(pred_pid).push(pid);
-          }
-        }
-      }
-    }
+  // Make an empty transform.
+#ifndef PRODUCT
+  VTransformTrace trace(_vloop.vtrace(),
+                        is_trace_superword_rejections(),
+                        is_trace_align_vector(),
+                        is_trace_superword_info());
+#endif
+  VTransform vtransform(_vloop_analyzer,
+                        _mem_ref_for_main_loop_alignment,
+                        _aw_for_main_loop_alignment
+                        NOT_PRODUCT(COMMA trace)
+                        );
 
-    // Map edges for nodes not in packset
-    for (int i = 0; i < body.length(); i++) {
-      Node* n = body.at(i);
-      int pid = get_pid_or_zero(n); // zero for Phi or CFG
-      if (pid <= max_pid_packset) {
-        continue; // Only scalar-nodes
-      }
-      for (VLoopDependencyGraph::PredsIterator preds(_slp->dependency_graph(), n); !preds.done(); preds.next()) {
-        Node* pred = preds.current();
-        int pred_pid = get_pid_or_zero(pred);
-        // Only add edges for mapped nodes (in body)
-        if (pred_pid > 0) {
-          incnt_set(pid, incnt(pid) + 1); // increment
-          out(pred_pid).push(pid);
-        }
-      }
-    }
+  // Build the transform from the packset.
+  {
+    ResourceMark rm;
+    SuperWordVTransformBuilder builder(_packset, vtransform);
   }
 
-  // Schedule nodes of PacksetGraph to worklist, using topsort: schedule a node
-  // that has zero incnt. If a PacksetGraph node corresponds to memops, then add
-  // those to the memops_schedule. At the end, we return the memops_schedule, and
-  // note if topsort was successful.
-  Node_List schedule() {
-    Node_List memops_schedule;
-    GrowableArray<int> worklist;
-    // Directly schedule all nodes without precedence
-    for (int pid = 1; pid <= _max_pid; pid++) {
-      if (incnt(pid) == 0) {
-        worklist.push(pid);
-      }
-    }
-    // Continue scheduling via topological sort
-    for (int i = 0; i < worklist.length(); i++) {
-      int pid = worklist.at(i);
-
-      // Add memops to memops_schedule
-      Node* n = get_node(pid);
-      Node_List* p = _slp->packset().get_pack(n);
-      if (n->is_Mem()) {
-        if (p == nullptr) {
-          memops_schedule.push(n);
-        } else {
-          for (uint k = 0; k < p->size(); k++) {
-            memops_schedule.push(p->at(k));
-            assert(p->at(k)->is_Mem(), "only schedule memops");
-          }
-        }
-      }
-
-      // Decrement incnt for all successors
-      for (int j = 0; j < out(pid).length(); j++){
-        int pid_use = out(pid).at(j);
-        int incnt_use = incnt(pid_use) - 1;
-        incnt_set(pid_use, incnt_use);
-        // Did use lose its last input?
-        if (incnt_use == 0) {
-          worklist.push(pid_use);
-        }
-      }
-    }
-
-    // Was every pid scheduled? If not, we found some cycles in the PacksetGraph.
-    _schedule_success = (worklist.length() == _max_pid);
-    return memops_schedule;
-  }
+  if (!vtransform.schedule()) { return false; }
+  vtransform.apply();
+  return true;
+}
 
-  // Print the PacksetGraph.
-  // print_nodes = true: print all C2 nodes beloning to PacksetGrahp node.
-  // print_zero_incnt = false: do not print nodes that have no in-edges (any more).
-  void print(bool print_nodes, bool print_zero_incnt) {
-    const GrowableArray<Node*> &body = _slp->body();
-    tty->print_cr("PacksetGraph");
-    for (int pid = 1; pid <= _max_pid; pid++) {
-      if (incnt(pid) == 0 && !print_zero_incnt) {
-        continue;
-      }
-      tty->print("Node %d. incnt %d [", pid, incnt(pid));
-      for (int j = 0; j < out(pid).length(); j++) {
-        tty->print("%d ", out(pid).at(j));
-      }
-      tty->print_cr("]");
+// Apply the vectorization, i.e. we irreversibly edit the C2 graph. At this point, all
+// correctness and profitability checks have passed, and the graph was successfully scheduled.
+void VTransform::apply() {
 #ifndef PRODUCT
-      if (print_nodes) {
-        for (int i = 0; i < body.length(); i++) {
-          Node* n = body.at(i);
-          if (get_pid_or_zero(n) == pid) {
-            tty->print("    ");
-            n->dump();
-          }
-        }
-      }
-#endif
-    }
+  if (_trace._info || TraceLoopOpts) {
+    tty->print_cr("\nVTransform::apply:");
+    lpt()->dump_head();
+    lpt()->head()->dump();
   }
-};
+  assert(cl()->is_main_loop(), "auto vectorization only for main loops");
+  assert(_graph.is_scheduled(), "must already be scheduled");
+#endif
 
-// The C2 graph (specifically the memory graph), needs to be re-ordered.
-// (1) Build the PacksetGraph. It combines the dependency graph with the
-//     packset. The PacksetGraph gives us the dependencies that must be
-//     respected after scheduling.
-// (2) Schedule the PacksetGraph to the memops_schedule, which represents
-//     a linear order of all memops in the body. The order respects the
-//     dependencies of the PacksetGraph.
-// (3) If the PacksetGraph has cycles, we cannot schedule. Abort.
-// (4) Use the memops_schedule to re-order the memops in all slices.
-void SuperWord::schedule() {
-  if (_packset.length() == 0) {
-    return; // empty packset
-  }
-  ResourceMark rm;
+  Compile* C = phase()->C;
+  C->print_method(PHASE_AUTO_VECTORIZATION1_BEFORE_APPLY, 4, cl());
 
-  // (1) Build the PacksetGraph.
-  PacksetGraph graph(this);
-  graph.build();
+  _graph.apply_memops_reordering_with_schedule();
+  C->print_method(PHASE_AUTO_VECTORIZATION2_AFTER_REORDER, 4, cl());
 
-  // (2) Schedule the PacksetGraph.
-  Node_List memops_schedule = graph.schedule();
+  adjust_pre_loop_limit_to_align_main_loop_vectors();
+  C->print_method(PHASE_AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, 4, cl());
 
-  // (3) Check if the PacksetGraph schedule succeeded (had no cycles).
-  // We now know that we only have independent packs, see verify_packs.
-  // This is a necessary but not a sufficient condition for an acyclic
-  // graph (DAG) after scheduling. Thus, we must check if the packs have
-  // introduced a cycle. The SuperWord paper mentions the need for this
-  // in "3.7 Scheduling".
-  if (!graph.schedule_success()) {
-#ifndef PRODUCT
-    if (is_trace_superword_rejections()) {
-      tty->print_cr("SuperWord::schedule found cycle in PacksetGraph:");
-      graph.print(true, false);
-      tty->print_cr("removing all packs from packset.");
-    }
-#endif
-    _packset.clear();
-    return;
-  }
+  apply_vectorization();
+  C->print_method(PHASE_AUTO_VECTORIZATION4_AFTER_APPLY, 4, cl());
+}
 
+// We prepare the memory graph for the replacement of scalar memops with vector memops.
+// We reorder all slices in parallel, ensuring that the memops inside each slice are
+// ordered according to the _schedule. This means that all packed memops are consecutive
+// in the memory graph after the reordering.
+void VTransformGraph::apply_memops_reordering_with_schedule() const {
 #ifndef PRODUCT
-  if (is_trace_superword_info()) {
-    tty->print_cr("SuperWord::schedule: memops_schedule:");
-    memops_schedule.dump();
+  assert(is_scheduled(), "must be already scheduled");
+  if (_trace._info) {
+    print_memops_schedule();
   }
 #endif
 
-  CountedLoopNode* cl = lpt()->_head->as_CountedLoop();
-  phase()->C->print_method(PHASE_SUPERWORD1_BEFORE_SCHEDULE, 4, cl);
-
-  // (4) Use the memops_schedule to re-order the memops in all slices.
-  schedule_reorder_memops(memops_schedule);
-}
-
-
-// Reorder the memory graph for all slices in parallel. We walk over the schedule once,
-// and track the current memory state of each slice.
-void SuperWord::schedule_reorder_memops(Node_List &memops_schedule) {
+  ResourceMark rm;
   int max_slices = phase()->C->num_alias_types();
-  // When iterating over the memops_schedule, we keep track of the current memory state,
+  // When iterating over the schedule, we keep track of the current memory state,
   // which is the Phi or a store in the loop.
   GrowableArray<Node*> current_state_in_slice(max_slices, max_slices, nullptr);
   // The memory state after the loop is the last store inside the loop. If we reorder the
@@ -2301,10 +1938,9 @@ void SuperWord::schedule_reorder_memops(Node_List &memops_schedule) {
     old_last_store_in_slice.at_put(alias_idx, last_store);
   }
 
-  // (2) Walk over memops_schedule, append memops to the current state
+  // (2) Walk over schedule, append memops to the current state
   //     of that slice. If it is a Store, we take it as the new state.
-  for (uint i = 0; i < memops_schedule.size(); i++) {
-    MemNode* n = memops_schedule.at(i)->as_Mem();
+  for_each_memop_in_schedule([&] (MemNode* n) {
     assert(n->is_Load() || n->is_Store(), "only loads or stores");
     int alias_idx = phase()->C->get_alias_index(n->adr_type());
     Node* current_state = current_state_in_slice.at(alias_idx);
@@ -2320,12 +1956,12 @@ void SuperWord::schedule_reorder_memops(Node_List &memops_schedule) {
         current_state_in_slice.at_put(alias_idx, n);
       }
     }
-  }
+  });
 
   // (3) For each slice, we add the current state to the backedge
   //     in the Phi. Further, we replace uses of the old last store
   //     with uses of the new last store (current_state).
-  Node_List uses_after_loop;
+  GrowableArray<Node*> uses_after_loop;
   for (int i = 0; i < mem_slice_head.length(); i++) {
     Node* phi  = mem_slice_head.at(i);
     int alias_idx = phase()->C->get_alias_index(phi->adr_type());
@@ -2347,7 +1983,7 @@ void SuperWord::schedule_reorder_memops(Node_List &memops_schedule) {
         uses_after_loop.push(use);
       }
     }
-    for (uint k = 0; k < uses_after_loop.size(); k++) {
+    for (int k = 0; k < uses_after_loop.length(); k++) {
       Node* use = uses_after_loop.at(k);
       for (uint j = 0; j < use->req(); j++) {
         Node* def = use->in(j);
@@ -2359,470 +1995,65 @@ void SuperWord::schedule_reorder_memops(Node_List &memops_schedule) {
   }
 }
 
-//------------------------------output---------------------------
-// Convert packs into vector node operations
-// At this point, all correctness and profitability checks have passed.
-// We start the irreversible process of editing the C2 graph. Should
-// there be an unexpected situation (assert fails), then we can only
-// bail out of the compilation, as the graph has already been partially
-// modified. We bail out, and retry without SuperWord.
-bool SuperWord::output() {
-  CountedLoopNode *cl = lpt()->_head->as_CountedLoop();
-  assert(cl->is_main_loop(), "SLP should only work on main loops");
-  Compile* C = phase()->C;
-  if (_packset.is_empty()) {
-    return false;
+void VTransformGraph::apply_vectorization_for_each_vtnode(uint& max_vector_length, uint& max_vector_width) const {
+  ResourceMark rm;
+  // We keep track of the resulting Nodes from every "VTransformNode::apply" call.
+  // Since "apply" is called on defs before uses, this allows us to find the
+  // generated def (input) nodes when we are generating the use nodes in "apply".
+  int length = _vtnodes.length();
+  GrowableArray<Node*> vtnode_idx_to_transformed_node(length, length, nullptr);
+
+  for (int i = 0; i < _schedule.length(); i++) {
+    VTransformNode* vtn = _schedule.at(i);
+    VTransformApplyResult result = vtn->apply(_vloop_analyzer,
+                                              vtnode_idx_to_transformed_node);
+    NOT_PRODUCT( if (_trace._verbose) { result.trace(vtn); } )
+
+    vtnode_idx_to_transformed_node.at_put(vtn->_idx, result.node());
+    max_vector_length = MAX2(max_vector_length, result.vector_length());
+    max_vector_width  = MAX2(max_vector_width,  result.vector_width());
   }
+}
 
+// We call "apply" on every VTransformNode, which replaces the packed scalar nodes with vector nodes.
+void VTransform::apply_vectorization() const {
+  Compile* C = phase()->C;
 #ifndef PRODUCT
-  if (TraceLoopOpts) {
-    tty->print("SuperWord::output    ");
-    lpt()->dump_head();
+  if (_trace._verbose) {
+    tty->print_cr("\nVTransform::apply_vectorization:");
   }
 #endif
-  phase()->C->print_method(PHASE_SUPERWORD2_BEFORE_OUTPUT, 4, cl);
 
-  adjust_pre_loop_limit_to_align_main_loop_vectors();
+  uint max_vector_length = 0; // number of elements
+  uint max_vector_width  = 0; // total width in bytes
+  _graph.apply_vectorization_for_each_vtnode(max_vector_length, max_vector_width);
 
-  DEBUG_ONLY(verify_no_extract());
-
-  uint max_vlen_in_bytes = 0;
-  uint max_vlen = 0;
-
-  for (int i = 0; i < body().length(); i++) {
-    Node* n = body().at(i);
-    Node_List* p = get_pack(n);
-    if (p != nullptr && n == p->at(p->size()-1)) {
-      // After schedule_reorder_memops, we know that the memops have the same order in the pack
-      // as in the memory slice. Hence, "first" is the first memop in the slice from the pack,
-      // and "n" is the last node in the slice from the pack.
-      Node* first = p->at(0);
-      uint vlen = p->size();
-      uint vlen_in_bytes = 0;
-      Node* vn = nullptr;
-      int   opc = n->Opcode();
-      if (n->is_Load()) {
-        Node* ctl = n->in(MemNode::Control);
-        Node* mem = first->in(MemNode::Memory);
-        // Set the memory dependency of the LoadVector as early as possible.
-        // Walk up the memory chain, and ignore any StoreVector that provably
-        // does not have any memory dependency.
-        while (mem->is_StoreVector()) {
-          VPointer p_store(mem->as_Mem(), _vloop);
-          if (p_store.overlap_possible_with_any_in(p)) {
-            break;
-          } else {
-            mem = mem->in(MemNode::Memory);
-          }
-        }
-        Node* adr = first->in(MemNode::Address);
-        const TypePtr* atyp = n->adr_type();
-        vn = LoadVectorNode::make(opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n), control_dependency(p));
-        vlen_in_bytes = vn->as_LoadVector()->memory_size();
-      } else if (n->is_Store()) {
-        // Promote value to be stored to vector
-        Node* val = vector_opd(p, MemNode::ValueIn);
-        if (val == nullptr) {
-          assert(false, "input to vector store was not created");
-          C->record_failure(C2Compiler::retry_no_superword());
-          return false; // bailout
-        }
+  assert(max_vector_length > 0 && max_vector_width > 0, "must have vectorized");
+  cl()->mark_loop_vectorized();
 
-        Node* ctl = n->in(MemNode::Control);
-        Node* mem = first->in(MemNode::Memory);
-        Node* adr = first->in(MemNode::Address);
-        const TypePtr* atyp = n->adr_type();
-        vn = StoreVectorNode::make(opc, ctl, mem, adr, atyp, val, vlen);
-        vlen_in_bytes = vn->as_StoreVector()->memory_size();
-      } else if (VectorNode::is_scalar_rotate(n)) {
-        Node* in1 = vector_opd(p, 1);
-        Node* in2 = first->in(2);
-        // If rotation count is non-constant or greater than 8bit value create a vector.
-        if (!in2->is_Con() || !Matcher::supports_vector_constant_rotates(in2->get_int())) {
-          in2 =  vector_opd(p, 2);
-        }
-        vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n));
-        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-      } else if (VectorNode::is_roundopD(n)) {
-        Node* in1 = vector_opd(p, 1);
-        Node* in2 = first->in(2);
-        assert(in2->is_Con(), "Constant rounding mode expected.");
-        vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n));
-        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-      } else if (VectorNode::is_muladds2i(n)) {
-        assert(n->req() == 5u, "MulAddS2I should have 4 operands.");
-        Node* in1 = vector_opd(p, 1);
-        Node* in2 = vector_opd(p, 2);
-        vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n));
-        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-      } else if (opc == Op_SignumF || opc == Op_SignumD) {
-        assert(n->req() == 4, "four inputs expected");
-        Node* in = vector_opd(p, 1);
-        Node* zero = vector_opd(p, 2);
-        Node* one = vector_opd(p, 3);
-        vn = VectorNode::make(opc, in, zero, one, vlen, velt_basic_type(n));
-        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-      } else if (n->is_Cmp()) {
-        // Bool + Cmp + CMove -> VectorMaskCmp + VectorBlend
-        continue;
-      } else if (n->is_Bool()) {
-        // Bool + Cmp + CMove -> VectorMaskCmp + VectorBlend
-        continue;
-      } else if (n->is_CMove()) {
-        // Bool + Cmp + CMove -> VectorMaskCmp + VectorBlend
-
-        BoolNode* bol = n->in(1)->as_Bool();
-        assert(bol != nullptr, "must have Bool above CMove");
-        BoolTest::mask bol_test = bol->_test._test;
-        assert(bol_test == BoolTest::eq ||
-               bol_test == BoolTest::ne ||
-               bol_test == BoolTest::ge ||
-               bol_test == BoolTest::gt ||
-               bol_test == BoolTest::lt ||
-               bol_test == BoolTest::le,
-               "CMove bool should be one of: eq,ne,ge,ge,lt,le");
-        Node_List* p_bol = get_pack(bol);
-        assert(p_bol != nullptr, "CMove must have matching Bool pack");
-
-#ifdef ASSERT
-        for (uint j = 0; j < p_bol->size(); j++) {
-          Node* m = p_bol->at(j);
-          assert(m->as_Bool()->_test._test == bol_test,
-                 "all bool nodes must have same test");
-        }
-#endif
-
-        CmpNode* cmp = bol->in(1)->as_Cmp();
-        assert(cmp != nullptr, "must have cmp above CMove");
-        Node_List* p_cmp = get_pack(cmp);
-        assert(p_cmp != nullptr, "Bool must have matching Cmp pack");
-
-        Node* cmp_in1 = vector_opd(p_cmp, 1);
-        Node* cmp_in2 = vector_opd(p_cmp, 2);
-
-        Node* blend_in1 = vector_opd(p, 2);
-        Node* blend_in2 = vector_opd(p, 3);
-
-        if (cmp->Opcode() == Op_CmpF || cmp->Opcode() == Op_CmpD) {
-          // If we have a Float or Double comparison, we must be careful with
-          // handling NaN's correctly. CmpF and CmpD have a return code, as
-          // they are based on the java bytecodes fcmpl/dcmpl:
-          // -1: cmp_in1 <  cmp_in2, or at least one of the two is a NaN
-          //  0: cmp_in1 == cmp_in2  (no NaN)
-          //  1: cmp_in1 >  cmp_in2  (no NaN)
-          //
-          // The "bol_test" selects which of the [-1, 0, 1] cases lead to "true".
-          //
-          // Note: ordered   (O) comparison returns "false" if either input is NaN.
-          //       unordered (U) comparison returns "true"  if either input is NaN.
-          //
-          // The VectorMaskCmpNode does a comparison directly on in1 and in2, in the java
-          // standard way (all comparisons are ordered, except NEQ is unordered).
-          //
-          // In the following, "bol_test" already matches the cmp code for VectorMaskCmpNode:
-          //   BoolTest::eq:  Case 0     -> EQ_O
-          //   BoolTest::ne:  Case -1, 1 -> NEQ_U
-          //   BoolTest::ge:  Case 0, 1  -> GE_O
-          //   BoolTest::gt:  Case 1     -> GT_O
-          //
-          // But the lt and le comparisons must be converted from unordered to ordered:
-          //   BoolTest::lt:  Case -1    -> LT_U -> VectorMaskCmp would interpret lt as LT_O
-          //   BoolTest::le:  Case -1, 0 -> LE_U -> VectorMaskCmp would interpret le as LE_O
-          //
-          if (bol_test == BoolTest::lt || bol_test == BoolTest::le) {
-            // Negating the bol_test and swapping the blend-inputs leaves all non-NaN cases equal,
-            // but converts the unordered (U) to an ordered (O) comparison.
-            //      VectorBlend(VectorMaskCmp(LT_U, in1_cmp, in2_cmp), in1_blend, in2_blend)
-            // <==> VectorBlend(VectorMaskCmp(GE_O, in1_cmp, in2_cmp), in2_blend, in1_blend)
-            //      VectorBlend(VectorMaskCmp(LE_U, in1_cmp, in2_cmp), in1_blend, in2_blend)
-            // <==> VectorBlend(VectorMaskCmp(GT_O, in1_cmp, in2_cmp), in2_blend, in1_blend)
-            bol_test = bol->_test.negate();
-            swap(blend_in1, blend_in2);
-          }
-        }
-
-        // VectorMaskCmp
-        ConINode* bol_test_node  = igvn().intcon((int)bol_test);
-        BasicType bt = velt_basic_type(cmp);
-        const TypeVect* vt = TypeVect::make(bt, vlen);
-        VectorNode* mask = new VectorMaskCmpNode(bol_test, cmp_in1, cmp_in2, bol_test_node, vt);
-        phase()->register_new_node_with_ctrl_of(mask, p->at(0));
-        igvn()._worklist.push(mask);
-
-        // VectorBlend
-        vn = new VectorBlendNode(blend_in1, blend_in2, mask);
-      } else if (n->req() == 3) {
-        // Promote operands to vector
-        Node* in1 = nullptr;
-        bool node_isa_reduction = is_marked_reduction(n);
-        if (node_isa_reduction) {
-          // the input to the first reduction operation is retained
-          in1 = first->in(1);
-        } else {
-          in1 = vector_opd(p, 1);
-          if (in1 == nullptr) {
-            assert(false, "input in1 to vector operand was not created");
-            C->record_failure(C2Compiler::retry_no_superword());
-            return false; // bailout
-          }
-        }
-        Node* in2 = vector_opd(p, 2);
-        if (in2 == nullptr) {
-          assert(false, "input in2 to vector operand was not created");
-          C->record_failure(C2Compiler::retry_no_superword());
-          return false; // bailout
-        }
-        if (in1->Opcode() == Op_Replicate && (node_isa_reduction == false) && (n->is_Add() || n->is_Mul())) {
-          // Move invariant vector input into second position to avoid register spilling.
-          Node* tmp = in1;
-          in1 = in2;
-          in2 = tmp;
-        }
-        if (node_isa_reduction) {
-          const Type *arith_type = n->bottom_type();
-          vn = ReductionNode::make(opc, nullptr, in1, in2, arith_type->basic_type());
-          if (in2->is_Load()) {
-            vlen_in_bytes = in2->as_LoadVector()->memory_size();
-          } else {
-            vlen_in_bytes = in2->as_Vector()->length_in_bytes();
-          }
-        } else {
-          // Vector unsigned right shift for signed subword types behaves differently
-          // from Java Spec. But when the shift amount is a constant not greater than
-          // the number of sign extended bits, the unsigned right shift can be
-          // vectorized to a signed right shift.
-          if (VectorNode::can_transform_shift_op(n, velt_basic_type(n))) {
-            opc = Op_RShiftI;
-          }
-          vn = VectorNode::make(opc, in1, in2, vlen, velt_basic_type(n));
-          vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-        }
-      } else if (opc == Op_SqrtF || opc == Op_SqrtD ||
-                 opc == Op_AbsF || opc == Op_AbsD ||
-                 opc == Op_AbsI || opc == Op_AbsL ||
-                 opc == Op_NegF || opc == Op_NegD ||
-                 opc == Op_RoundF || opc == Op_RoundD ||
-                 opc == Op_ReverseBytesI || opc == Op_ReverseBytesL ||
-                 opc == Op_ReverseBytesUS || opc == Op_ReverseBytesS ||
-                 opc == Op_ReverseI || opc == Op_ReverseL ||
-                 opc == Op_PopCountI || opc == Op_CountLeadingZerosI ||
-                 opc == Op_CountTrailingZerosI) {
-        assert(n->req() == 2, "only one input expected");
-        Node* in = vector_opd(p, 1);
-        vn = VectorNode::make(opc, in, nullptr, vlen, velt_basic_type(n));
-        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-      } else if (requires_long_to_int_conversion(opc)) {
-        // Java API for Long.bitCount/numberOfLeadingZeros/numberOfTrailingZeros
-        // returns int type, but Vector API for them returns long type. To unify
-        // the implementation in backend, superword splits the vector implementation
-        // for Java API into an execution node with long type plus another node
-        // converting long to int.
-        assert(n->req() == 2, "only one input expected");
-        Node* in = vector_opd(p, 1);
-        Node* longval = VectorNode::make(opc, in, nullptr, vlen, T_LONG);
-        phase()->register_new_node_with_ctrl_of(longval, first);
-        vn = VectorCastNode::make(Op_VectorCastL2X, longval, T_INT, vlen);
-        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-      } else if (VectorNode::is_convert_opcode(opc)) {
-        assert(n->req() == 2, "only one input expected");
-        BasicType bt = velt_basic_type(n);
-        Node* in = vector_opd(p, 1);
-        int vopc = VectorCastNode::opcode(opc, in->bottom_type()->is_vect()->element_basic_type());
-        vn = VectorCastNode::make(vopc, in, bt, vlen);
-        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-      } else if (opc == Op_FmaD || opc == Op_FmaF) {
-        // Promote operands to vector
-        Node* in1 = vector_opd(p, 1);
-        Node* in2 = vector_opd(p, 2);
-        Node* in3 = vector_opd(p, 3);
-        vn = VectorNode::make(opc, in1, in2, in3, vlen, velt_basic_type(n));
-        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
-      } else {
-        assert(false, "Unhandled scalar opcode (%s)", NodeClassNames[opc]);
-        C->record_failure(C2Compiler::retry_no_superword());
-        return false; // bailout
-      }
-
-      if (vn == nullptr) {
-        assert(false, "got null node instead of vector node");
-        C->record_failure(C2Compiler::retry_no_superword());
-        return false; // bailout
-      }
-
-#ifdef ASSERT
-      // Mark Load/Store Vector for alignment verification
-      if (VerifyAlignVector) {
-        if (vn->Opcode() == Op_LoadVector) {
-          vn->as_LoadVector()->set_must_verify_alignment();
-        } else if (vn->Opcode() == Op_StoreVector) {
-          vn->as_StoreVector()->set_must_verify_alignment();
-        }
-      }
-#endif
-
-      phase()->register_new_node_with_ctrl_of(vn, first);
-      for (uint j = 0; j < p->size(); j++) {
-        Node* pm = p->at(j);
-        igvn().replace_node(pm, vn);
-      }
-      igvn()._worklist.push(vn);
-
-      if (vlen > max_vlen) {
-        max_vlen = vlen;
-      }
-      if (vlen_in_bytes > max_vlen_in_bytes) {
-        max_vlen_in_bytes = vlen_in_bytes;
-      }
-      VectorNode::trace_new_vector(vn, "SuperWord");
-    }
-  }//for (int i = 0; i < body().length(); i++)
-
-  if (max_vlen_in_bytes > C->max_vector_size()) {
-    C->set_max_vector_size(max_vlen_in_bytes);
-  }
-  if (max_vlen_in_bytes > 0) {
-    cl->mark_loop_vectorized();
+  if (max_vector_width > C->max_vector_size()) {
+    C->set_max_vector_size(max_vector_width);
   }
 
   if (SuperWordLoopUnrollAnalysis) {
-    if (cl->has_passed_slp()) {
-      uint slp_max_unroll_factor = cl->slp_max_unroll();
-      if (slp_max_unroll_factor == max_vlen) {
+    if (cl()->has_passed_slp()) {
+      uint slp_max_unroll_factor = cl()->slp_max_unroll();
+      if (slp_max_unroll_factor == max_vector_length) {
 #ifndef PRODUCT
         if (TraceSuperWordLoopUnrollAnalysis) {
-          tty->print_cr("vector loop(unroll=%d, len=%d)\n", max_vlen, max_vlen_in_bytes*BitsPerByte);
+          tty->print_cr("vector loop(unroll=%d, len=%d)\n", max_vector_length, max_vector_width * BitsPerByte);
         }
 #endif
         // For atomic unrolled loops which are vector mapped, instigate more unrolling
-        cl->set_notpassed_slp();
+        cl()->set_notpassed_slp();
         // if vector resources are limited, do not allow additional unrolling
         if (Matcher::float_pressure_limit() > 8) {
           C->set_major_progress();
-          cl->mark_do_unroll_only();
+          cl()->mark_do_unroll_only();
         }
       }
     }
   }
-
-  phase()->C->print_method(PHASE_SUPERWORD3_AFTER_OUTPUT, 4, cl);
-
-  return true;
-}
-
-//------------------------------vector_opd---------------------------
-// Create a vector operand for the nodes in pack p for operand: in(opd_idx)
-Node* SuperWord::vector_opd(Node_List* p, int opd_idx) {
-  Node* p0 = p->at(0);
-  uint vlen = p->size();
-  Node* opd = p0->in(opd_idx);
-  CountedLoopNode *cl = lpt()->_head->as_CountedLoop();
-  bool have_same_inputs = same_inputs(p, opd_idx);
-
-  // Insert index population operation to create a vector of increasing
-  // indices starting from the iv value. In some special unrolled loops
-  // (see JDK-8286125), we need scalar replications of the iv value if
-  // all inputs are the same iv, so we do a same inputs check here.
-  if (opd == iv() && !have_same_inputs) {
-    BasicType p0_bt = velt_basic_type(p0);
-    BasicType iv_bt = is_subword_type(p0_bt) ? p0_bt : T_INT;
-    assert(VectorNode::is_populate_index_supported(iv_bt), "Should support");
-    const TypeVect* vt = TypeVect::make(iv_bt, vlen);
-    Node* vn = new PopulateIndexNode(iv(), igvn().intcon(1), vt);
-    VectorNode::trace_new_vector(vn, "SuperWord");
-    phase()->register_new_node_with_ctrl_of(vn, opd);
-    return vn;
-  }
-
-  if (have_same_inputs) {
-    if (opd->is_Vector() || opd->is_LoadVector()) {
-      if (opd_idx == 2 && VectorNode::is_shift(p0)) {
-        assert(false, "shift's count can't be vector");
-        return nullptr;
-      }
-      return opd; // input is matching vector
-    }
-    if ((opd_idx == 2) && VectorNode::is_shift(p0)) {
-      Node* cnt = opd;
-      // Vector instructions do not mask shift count, do it here.
-      juint mask = (p0->bottom_type() == TypeInt::INT) ? (BitsPerInt - 1) : (BitsPerLong - 1);
-      const TypeInt* t = opd->find_int_type();
-      if (t != nullptr && t->is_con()) {
-        juint shift = t->get_con();
-        if (shift > mask) { // Unsigned cmp
-          cnt = igvn().intcon(shift & mask);
-          phase()->set_ctrl(cnt, phase()->C->root());
-        }
-      } else {
-        if (t == nullptr || t->_lo < 0 || t->_hi > (int)mask) {
-          cnt = igvn().intcon(mask);
-          cnt = new AndINode(opd, cnt);
-          phase()->register_new_node_with_ctrl_of(cnt, opd);
-        }
-        if (!opd->bottom_type()->isa_int()) {
-          assert(false, "int type only");
-          return nullptr;
-        }
-      }
-      // Move shift count into vector register.
-      cnt = VectorNode::shift_count(p0->Opcode(), cnt, vlen, velt_basic_type(p0));
-      phase()->register_new_node_with_ctrl_of(cnt, opd);
-      return cnt;
-    }
-    if (opd->is_StoreVector()) {
-      assert(false, "StoreVector is not expected here");
-      return nullptr;
-    }
-    // Convert scalar input to vector with the same number of elements as
-    // p0's vector. Use p0's type because size of operand's container in
-    // vector should match p0's size regardless operand's size.
-    const Type* p0_t = nullptr;
-    VectorNode* vn = nullptr;
-    if (opd_idx == 2 && VectorNode::is_scalar_rotate(p0)) {
-       Node* conv = opd;
-       p0_t =  TypeInt::INT;
-       if (p0->bottom_type()->isa_long()) {
-         p0_t = TypeLong::LONG;
-         conv = new ConvI2LNode(opd);
-         phase()->register_new_node_with_ctrl_of(conv, opd);
-       }
-       vn = VectorNode::scalar2vector(conv, vlen, p0_t);
-    } else {
-       p0_t =  velt_type(p0);
-       vn = VectorNode::scalar2vector(opd, vlen, p0_t);
-    }
-
-    phase()->register_new_node_with_ctrl_of(vn, opd);
-    VectorNode::trace_new_vector(vn, "SuperWord");
-    return vn;
-  }
-
-  // Insert pack operation
-  BasicType bt = velt_basic_type(p0);
-  PackNode* pk = PackNode::make(opd, vlen, bt);
-  DEBUG_ONLY( const BasicType opd_bt = opd->bottom_type()->basic_type(); )
-
-  for (uint i = 1; i < vlen; i++) {
-    Node* pi = p->at(i);
-    Node* in = pi->in(opd_idx);
-    if (get_pack(in) != nullptr) {
-      assert(false, "Should already have been unpacked");
-      return nullptr;
-    }
-    assert(opd_bt == in->bottom_type()->basic_type(), "all same type");
-    pk->add_opd(in);
-    if (VectorNode::is_muladds2i(pi)) {
-      Node* in2 = pi->in(opd_idx + 2);
-      if (get_pack(in2) != nullptr) {
-        assert(false, "Should already have been unpacked");
-        return nullptr;
-      }
-      assert(opd_bt == in2->bottom_type()->basic_type(), "all same type");
-      pk->add_opd(in2);
-    }
-  }
-  phase()->register_new_node_with_ctrl_of(pk, opd);
-  VectorNode::trace_new_vector(pk, "SuperWord");
-  return pk;
 }
 
 #ifdef ASSERT
@@ -2948,7 +2179,17 @@ uint SuperWord::find_use_def_boundary(const Node_List* pack) const {
 bool SuperWord::is_vector_use(Node* use, int u_idx) const {
   Node_List* u_pk = get_pack(use);
   if (u_pk == nullptr) return false;
-  if (is_marked_reduction(use)) return true;
+
+  // Reduction: first input is internal connection.
+  if (is_marked_reduction(use) && u_idx == 1) {
+    for (uint i = 1; i < u_pk->size(); i++) {
+      if (u_pk->at(i - 1) != u_pk->at(i)->in(1)) {
+        return false; // not internally connected
+      }
+    }
+    return true;
+  }
+
   Node* def = use->in(u_idx);
   Node_List* d_pk = get_pack(def);
   if (d_pk == nullptr) {
@@ -2975,49 +2216,100 @@ bool SuperWord::is_vector_use(Node* use, int u_idx) const {
     return true;
   }
 
+  if (!is_velt_basic_type_compatible_use_def(use, def)) {
+    return false;
+  }
+
   if (VectorNode::is_muladds2i(use)) {
-    // MulAddS2I takes shorts and produces ints - hence the special checks
-    // on alignment and size.
-    if (u_pk->size() * 2 != d_pk->size()) {
-      return false;
-    }
-    for (uint i = 0; i < MIN2(d_pk->size(), u_pk->size()); i++) {
-      Node* ui = u_pk->at(i);
-      Node* di = d_pk->at(i);
-      if (alignment(ui) != alignment(di) * 2) {
-        return false;
-      }
-    }
-    return true;
+    return _packset.is_muladds2i_pack_with_pack_inputs(u_pk);
   }
 
-  if (u_pk->size() != d_pk->size())
-    return false;
+  return _packset.pack_input_at_index_or_null(u_pk, u_idx) != nullptr;
+}
 
-  if (longer_type_for_conversion(use) != T_ILLEGAL) {
-    // These opcodes take a type of a kind of size and produce a type of
-    // another size - hence the special checks on alignment and size.
-    for (uint i = 0; i < u_pk->size(); i++) {
-      Node* ui = u_pk->at(i);
-      Node* di = d_pk->at(i);
-      if (ui->in(u_idx) != di) {
-        return false;
-      }
-      if (alignment(ui) / type2aelembytes(velt_basic_type(ui)) !=
-          alignment(di) / type2aelembytes(velt_basic_type(di))) {
-        return false;
-      }
+// MulAddS2I takes 4 shorts and produces an int. We can reinterpret
+// the 4 shorts as two ints: a = (a0, a1) and b = (b0, b1).
+//
+// Inputs:                 1    2    3    4
+// Offsets:                0    0    1    1
+//   v = MulAddS2I(a, b) = a0 * b0 + a1 * b1
+//
+// But permutations are possible, because add and mul are commutative. For
+// simplicity, the first input is always either a0 or a1. These are all
+// the possible permutations:
+//
+//   v = MulAddS2I(a, b) = a0 * b0 + a1 * b1     (case 1)
+//   v = MulAddS2I(a, b) = a0 * b0 + b1 * a1     (case 2)
+//   v = MulAddS2I(a, b) = a1 * b1 + a0 * b0     (case 3)
+//   v = MulAddS2I(a, b) = a1 * b1 + b0 * a0     (case 4)
+//
+// To vectorize, we expect (a0, a1) to be consecutive in one input pack,
+// and (b0, b1) in the other input pack. Thus, both a and b are strided,
+// with stride = 2. Further, a0 and b0 have offset 0, whereas a1 and b1
+// have offset 1.
+bool PackSet::is_muladds2i_pack_with_pack_inputs(const Node_List* pack) const {
+  assert(VectorNode::is_muladds2i(pack->at(0)), "must be MulAddS2I");
+
+  bool pack1_has_offset_0 = (strided_pack_input_at_index_or_null(pack, 1, 2, 0) != nullptr);
+  Node_List* pack1 = strided_pack_input_at_index_or_null(pack, 1, 2, pack1_has_offset_0 ? 0 : 1);
+  Node_List* pack2 = strided_pack_input_at_index_or_null(pack, 2, 2, pack1_has_offset_0 ? 0 : 1);
+  Node_List* pack3 = strided_pack_input_at_index_or_null(pack, 3, 2, pack1_has_offset_0 ? 1 : 0);
+  Node_List* pack4 = strided_pack_input_at_index_or_null(pack, 4, 2, pack1_has_offset_0 ? 1 : 0);
+
+  return pack1 != nullptr &&
+         pack2 != nullptr &&
+         pack3 != nullptr &&
+         pack4 != nullptr &&
+         ((pack1 == pack3 && pack2 == pack4) || // case 1 or 3
+          (pack1 == pack4 && pack2 == pack3));  // case 2 or 4
+}
+
+Node_List* PackSet::strided_pack_input_at_index_or_null(const Node_List* pack, const int index, const int stride, const int offset) const {
+  Node* def0 = pack->at(0)->in(index);
+
+  Node_List* pack_in = get_pack(def0);
+  if (pack_in == nullptr || pack->size() * stride != pack_in->size()) {
+    return nullptr; // size mismatch
+  }
+
+  for (uint i = 1; i < pack->size(); i++) {
+    if (pack->at(i)->in(index) != pack_in->at(i * stride + offset)) {
+      return nullptr; // use-def mismatch
     }
+  }
+  return pack_in;
+}
+
+// Check if the output type of def is compatible with the input type of use, i.e. if the
+// types have the same size.
+bool SuperWord::is_velt_basic_type_compatible_use_def(Node* use, Node* def) const {
+  assert(in_bb(def) && in_bb(use), "both use and def are in loop");
+
+  // Conversions are trivially compatible.
+  if (VectorNode::is_convert_opcode(use->Opcode())) {
     return true;
   }
 
-  for (uint i = 0; i < u_pk->size(); i++) {
-    Node* ui = u_pk->at(i);
-    Node* di = d_pk->at(i);
-    if (ui->in(u_idx) != di || alignment(ui) != alignment(di))
-      return false;
+  BasicType use_bt = velt_basic_type(use);
+  BasicType def_bt = velt_basic_type(def);
+
+  assert(is_java_primitive(use_bt), "sanity %s", type2name(use_bt));
+  assert(is_java_primitive(def_bt), "sanity %s", type2name(def_bt));
+
+  // Nodes like Long.bitCount: expect long input, and int output.
+  if (VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(use->Opcode())) {
+    return type2aelembytes(def_bt) == 8 &&
+           type2aelembytes(use_bt) == 4;
   }
-  return true;
+
+  // MulAddS2I: expect short input, and int output.
+  if (VectorNode::is_muladds2i(use)) {
+    return type2aelembytes(def_bt) == 2 &&
+           type2aelembytes(use_bt) == 4;
+  }
+
+  // Default case: input size of use equals output size of def.
+  return type2aelembytes(use_bt) == type2aelembytes(def_bt);
 }
 
 // Return nullptr if success, else failure message
@@ -3150,15 +2442,9 @@ VStatus VLoopBody::construct() {
   return VStatus::make_success();
 }
 
-// Initialize per node info
-void SuperWord::initialize_node_info() {
-  Node* last = body().at(body().length() - 1);
-  grow_node_info(bb_idx(last));
-}
-
 BasicType SuperWord::longer_type_for_conversion(Node* n) const {
   if (!(VectorNode::is_convert_opcode(n->Opcode()) ||
-        requires_long_to_int_conversion(n->Opcode())) ||
+        VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(n->Opcode())) ||
       !in_bb(n->in(1))) {
     return T_ILLEGAL;
   }
@@ -3177,34 +2463,6 @@ BasicType SuperWord::longer_type_for_conversion(Node* n) const {
                               : (src_size > dst_size ? src_t : dst_t);
 }
 
-int SuperWord::max_vector_size_in_def_use_chain(Node* n) {
-  BasicType bt = velt_basic_type(n);
-  BasicType vt = bt;
-
-  // find the longest type among def nodes.
-  uint start, end;
-  VectorNode::vector_operands(n, &start, &end);
-  for (uint i = start; i < end; ++i) {
-    Node* input = n->in(i);
-    if (!in_bb(input)) continue;
-    BasicType newt = longer_type_for_conversion(input);
-    vt = (newt == T_ILLEGAL) ? vt : newt;
-  }
-
-  // find the longest type among use nodes.
-  for (uint i = 0; i < n->outcnt(); ++i) {
-    Node* output = n->raw_out(i);
-    if (!in_bb(output)) continue;
-    BasicType newt = longer_type_for_conversion(output);
-    vt = (newt == T_ILLEGAL) ? vt : newt;
-  }
-
-  int max = Matcher::max_vector_size_auto_vectorization(vt);
-  // If now there is no vectors for the longest type, the nodes with the longest
-  // type in the def-use chain are not packed in SuperWord::stmts_can_pack.
-  return max < 2 ? Matcher::max_vector_size_auto_vectorization(bt) : max;
-}
-
 void VLoopTypes::compute_vector_element_type() {
 #ifndef PRODUCT
   if (_vloop.is_trace_vector_element_type()) {
@@ -3308,36 +2566,6 @@ void VLoopTypes::compute_vector_element_type() {
 #endif
 }
 
-//------------------------------memory_alignment---------------------------
-// Alignment within a vector memory reference
-int SuperWord::memory_alignment(MemNode* s, int iv_adjust) {
-#ifndef PRODUCT
-  if (is_trace_superword_alignment()) {
-    tty->print("SuperWord::memory_alignment within a vector memory reference for %d:  ", s->_idx); s->dump();
-  }
-#endif
-  const VPointer& p = vpointer(s);
-  if (!p.valid()) {
-    NOT_PRODUCT(if(is_trace_superword_alignment()) tty->print_cr("SuperWord::memory_alignment: VPointer p invalid, return bottom_align");)
-    return bottom_align;
-  }
-  int vw = get_vw_bytes_special(s);
-  if (vw < 2) {
-    NOT_PRODUCT(if(is_trace_superword_alignment()) tty->print_cr("SuperWord::memory_alignment: vector_width_in_bytes < 2, return bottom_align");)
-    return bottom_align; // No vectors for this type
-  }
-  int offset  = p.offset_in_bytes();
-  offset     += iv_adjust*p.memory_size();
-  int off_rem = offset % vw;
-  int off_mod = off_rem >= 0 ? off_rem : off_rem + vw;
-#ifndef PRODUCT
-  if (is_trace_superword_alignment()) {
-    tty->print_cr("SuperWord::memory_alignment: off_rem = %d, off_mod = %d (offset = %d)", off_rem, off_mod, offset);
-  }
-#endif
-  return off_mod;
-}
-
 // Smallest type containing range of values
 const Type* VLoopTypes::container_type(Node* n) const {
   if (n->is_Mem()) {
@@ -3358,6 +2586,12 @@ const Type* VLoopTypes::container_type(Node* n) const {
   }
   const Type* t = _vloop.phase()->igvn().type(n);
   if (t->basic_type() == T_INT) {
+    // Float to half float conversion may be succeeded by a conversion from
+    // half float to float, in such a case back propagation of narrow type (SHORT)
+    // may not be possible.
+    if (n->Opcode() == Op_ConvF2HF) {
+      return TypeInt::SHORT;
+    }
     // A narrow type of arithmetic operations will be determined by
     // propagating the type of memory operations.
     return TypeInt::INT;
@@ -3370,10 +2604,10 @@ bool VLoopMemorySlices::same_memory_slice(MemNode* m1, MemNode* m2) const {
          _vloop.phase()->C->get_alias_index(m2->adr_type());
 }
 
-LoadNode::ControlDependency SuperWord::control_dependency(Node_List* p) {
+LoadNode::ControlDependency VTransformLoadVectorNode::control_dependency() const {
   LoadNode::ControlDependency dep = LoadNode::DependsOnlyOnTest;
-  for (uint i = 0; i < p->size(); i++) {
-    Node* n = p->at(i);
+  for (int i = 0; i < nodes().length(); i++) {
+    Node* n = nodes().at(i);
     assert(n->is_Load(), "only meaningful for loads");
     if (!n->depends_only_on_test()) {
       if (n->as_Load()->has_unknown_control_dependency() &&
@@ -3390,24 +2624,27 @@ LoadNode::ControlDependency SuperWord::control_dependency(Node_List* p) {
 }
 
 // Find the memop pack with the maximum vector width, unless they were already
-// determined by SuperWord::filter_packs_for_alignment().
-void SuperWord::determine_mem_ref_and_aw_for_main_loop_alignment() {
+// determined (e.g. by SuperWord::filter_packs_for_alignment()).
+void VTransform::determine_mem_ref_and_aw_for_main_loop_alignment() {
   if (_mem_ref_for_main_loop_alignment != nullptr) {
-    assert(vectors_should_be_aligned(), "mem_ref only set if filtered for alignment");
+    assert(VLoop::vectors_should_be_aligned(), "mem_ref only set if filtered for alignment");
     return;
   }
 
   MemNode const* mem_ref = nullptr;
   int max_aw = 0;
-  for (int i = 0; i < _packset.length(); i++) {
-    Node_List* pack = _packset.at(i);
-    MemNode* first = pack->at(0)->isa_Mem();
-    if (first == nullptr) { continue; }
 
-    int vw = first->memory_size() * pack->size();
+  const GrowableArray<VTransformNode*>& vtnodes = _graph.vtnodes();
+  for (int i = 0; i < vtnodes.length(); i++) {
+    VTransformVectorNode* vtn = vtnodes.at(i)->isa_Vector();
+    if (vtn == nullptr) { continue; }
+    MemNode* p0 = vtn->nodes().at(0)->isa_Mem();
+    if (p0 == nullptr) { continue; }
+
+    int vw = p0->memory_size() * vtn->nodes().length();
     if (vw > max_aw) {
       max_aw = vw;
-      mem_ref = first;
+      mem_ref = p0;
     }
   }
   assert(mem_ref != nullptr && max_aw > 0, "found mem_ref and aw");
@@ -3417,7 +2654,7 @@ void SuperWord::determine_mem_ref_and_aw_for_main_loop_alignment() {
 
 #define TRACE_ALIGN_VECTOR_NODE(node) { \
   DEBUG_ONLY(                           \
-    if (is_trace_align_vector()) {      \
+    if (_trace._align_vector) {         \
       tty->print("  " #node ": ");      \
       node->dump();                     \
     }                                   \
@@ -3428,7 +2665,7 @@ void SuperWord::determine_mem_ref_and_aw_for_main_loop_alignment() {
 // the address of "_mem_ref_for_main_loop_alignment" to "_aw_for_main_loop_alignment", which is a
 // sufficiently large alignment width. We adjust the pre-loop iteration count by adjusting the
 // pre-loop limit.
-void SuperWord::adjust_pre_loop_limit_to_align_main_loop_vectors() {
+void VTransform::adjust_pre_loop_limit_to_align_main_loop_vectors() {
   determine_mem_ref_and_aw_for_main_loop_alignment();
   const MemNode* align_to_ref = _mem_ref_for_main_loop_alignment;
   const int aw                = _aw_for_main_loop_alignment;
@@ -3585,8 +2822,8 @@ void SuperWord::adjust_pre_loop_limit_to_align_main_loop_vectors() {
   Node* invar        = align_to_ref_p.invar();
 
 #ifdef ASSERT
-  if (is_trace_align_vector()) {
-    tty->print_cr("\nadjust_pre_loop_limit_to_align_main_loop_vectors:");
+  if (_trace._align_vector) {
+    tty->print_cr("\nVTransform::adjust_pre_loop_limit_to_align_main_loop_vectors:");
     tty->print("  align_to_ref:");
     align_to_ref->dump();
     tty->print_cr("  aw:       %d", aw);
@@ -3612,7 +2849,7 @@ void SuperWord::adjust_pre_loop_limit_to_align_main_loop_vectors() {
       scale  == 0 || !is_power_of_2(abs(scale))  ||
       abs(scale) >= aw) {
 #ifdef ASSERT
-    if (is_trace_align_vector()) {
+    if (_trace._align_vector) {
       tty->print_cr(" Alignment cannot be affected by changing pre-loop limit because");
       tty->print_cr(" stride or scale are not power of 2, or abs(scale) >= aw.");
     }
@@ -3628,7 +2865,7 @@ void SuperWord::adjust_pre_loop_limit_to_align_main_loop_vectors() {
   const int AW = aw / abs(scale);
 
 #ifdef ASSERT
-  if (is_trace_align_vector()) {
+  if (_trace._align_vector) {
     tty->print_cr("  AW = aw(%d) / abs(scale(%d)) = %d", aw, scale, AW);
   }
 #endif
@@ -3783,10 +3020,10 @@ void PackSet::print_pack(Node_List* pack) {
 
 #ifndef PRODUCT
 void VLoopBody::print() const {
-  tty->print_cr("\nBlock");
+  tty->print_cr("\nVLoopBody::print");
   for (int i = 0; i < body().length(); i++) {
     Node* n = body().at(i);
-    tty->print("%d ", i);
+    tty->print("%4d ", i);
     if (n != nullptr) {
       n->dump();
     }
@@ -3794,10 +3031,6 @@ void VLoopBody::print() const {
 }
 #endif
 
-// ========================= SWNodeInfo =====================
-
-const SWNodeInfo SWNodeInfo::initial;
-
 //
 // --------------------------------- vectorization/simd -----------------------------------
 //
@@ -3807,3 +3040,4 @@ bool SuperWord::same_origin_idx(Node* a, Node* b) const {
 bool SuperWord::same_generation(Node* a, Node* b) const {
   return a != nullptr && b != nullptr && _clone_map.same_gen(a->_idx, b->_idx);
 }
+
diff --git a/src/hotspot/share/opto/superword.hpp b/src/hotspot/share/opto/superword.hpp
index 159032d94b9..65f87082525 100644
--- a/src/hotspot/share/opto/superword.hpp
+++ b/src/hotspot/share/opto/superword.hpp
@@ -25,6 +25,7 @@
 #define SHARE_OPTO_SUPERWORD_HPP
 
 #include "opto/vectorization.hpp"
+#include "opto/vtransform.hpp"
 #include "utilities/growableArray.hpp"
 
 //
@@ -362,6 +363,15 @@ class PackSet : public StackObj {
     }
   }
 
+  Node_List* strided_pack_input_at_index_or_null(const Node_List* pack, const int index, const int stride, const int offset) const;
+  bool is_muladds2i_pack_with_pack_inputs(const Node_List* pack) const;
+  Node* same_inputs_at_index_or_null(const Node_List* pack, const int index) const;
+  VTransformBoolTest get_bool_test(const Node_List* bool_pack) const;
+
+  Node_List* pack_input_at_index_or_null(const Node_List* pack, const int index) const {
+    return strided_pack_input_at_index_or_null(pack, index, 1, 0);
+  }
+
 private:
   SplitStatus split_pack(const char* split_name, Node_List* pack, SplitTask task);
 public:
@@ -384,18 +394,6 @@ class PackSet : public StackObj {
   NOT_PRODUCT(static void print_pack(Node_List* pack);)
 };
 
-// ========================= SuperWord =====================
-
-// -----------------------------SWNodeInfo---------------------------------
-// Per node info needed by SuperWord
-class SWNodeInfo {
- public:
-  int         _alignment; // memory alignment for a node
-
-  SWNodeInfo() : _alignment(-1) {}
-  static const SWNodeInfo initial;
-};
-
 // -----------------------------SuperWord---------------------------------
 // Transforms scalar operations into packed (superword) operations.
 class SuperWord : public ResourceObj {
@@ -407,9 +405,6 @@ class SuperWord : public ResourceObj {
   // VSharedData, and reused over many AutoVectorizations.
   Arena _arena;
 
-  enum consts { top_align = -1, bottom_align = -666 };
-
-  GrowableArray<SWNodeInfo> _node_info;  // Info needed per node
   CloneMap&            _clone_map;       // map of nodes created in cloning
 
   PairSet _pairset;
@@ -461,6 +456,11 @@ class SuperWord : public ResourceObj {
     return _vloop_analyzer.body().bb_idx(n);
   }
 
+  template<typename Callback>
+  void for_each_mem(Callback callback) const {
+    return _vloop_analyzer.body().for_each_mem(callback);
+  }
+
   // VLoopTypes accessors
   const Type* velt_type(Node* n) const {
     return _vloop_analyzer.types().velt_type(n);
@@ -506,11 +506,6 @@ class SuperWord : public ResourceObj {
 
 #ifndef PRODUCT
   // TraceAutoVectorization and TraceSuperWord
-  bool is_trace_superword_alignment() const {
-    // Too verbose for TraceSuperWord
-    return _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_ALIGNMENT);
-  }
-
   bool is_trace_superword_adjacent_memops() const {
     return TraceSuperWord ||
            _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_ADJACENT_MEMOPS);
@@ -531,15 +526,9 @@ class SuperWord : public ResourceObj {
            _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_INFO);
   }
 
-  bool is_trace_superword_verbose() const {
-    // Too verbose for TraceSuperWord
-    return _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_VERBOSE);
-  }
-
   bool is_trace_superword_any() const {
     return TraceSuperWord ||
            is_trace_align_vector() ||
-           _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_ALIGNMENT) ||
            _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_ADJACENT_MEMOPS) ||
            _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_REJECTIONS) ||
            _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_PACKSET) ||
@@ -549,7 +538,7 @@ class SuperWord : public ResourceObj {
 
   bool is_trace_align_vector() const {
     return _vloop.vtrace().is_trace(TraceAutoVectorizationTag::ALIGN_VECTOR) ||
-           is_trace_superword_verbose();
+           _vloop.vtrace().is_trace(TraceAutoVectorizationTag::SW_VERBOSE);
   }
 #endif
 
@@ -566,37 +555,22 @@ class SuperWord : public ResourceObj {
   // Accessors
   Arena* arena()                   { return &_arena; }
 
-  int get_vw_bytes_special(MemNode* s);
-
-  // Ensure node_info contains element "i"
-  void grow_node_info(int i) { if (i >= _node_info.length()) _node_info.at_put_grow(i, SWNodeInfo::initial); }
-
-  // should we align vector memory references on this platform?
-  bool vectors_should_be_aligned() { return !Matcher::misaligned_vectors_ok() || AlignVector; }
-
-  // memory alignment for a node
-  int alignment(Node* n) const               { return _node_info.adr_at(bb_idx(n))->_alignment; }
-  void set_alignment(Node* n, int a)         { int i = bb_idx(n); grow_node_info(i); _node_info.adr_at(i)->_alignment = a; }
-
-  // is pack good for converting into one vector node replacing bunches of Cmp, Bool, CMov nodes.
-  static bool requires_long_to_int_conversion(int opc);
-  // For pack p, are all idx operands the same?
-  bool same_inputs(const Node_List* p, int idx) const;
   // CloneMap utilities
   bool same_origin_idx(Node* a, Node* b) const;
   bool same_generation(Node* a, Node* b) const;
 
 private:
   bool SLP_extract();
-  // Find the adjacent memory references and create pack pairs for them.
-  void find_adjacent_refs();
-  // Find a memory reference to align the loop induction variable to.
-  MemNode* find_align_to_ref(Node_List &memops, int &idx);
-  // Calculate loop's iv adjustment for this memory ops.
-  int get_iv_adjustment(MemNode* mem);
-
-  // Can s1 and s2 be in a pack with s1 immediately preceding s2 and  s1 aligned at "align"
-  bool stmts_can_pack(Node* s1, Node* s2, int align);
+
+  // Find the "seed" memops pairs. These are pairs that we strongly suspect would lead to vectorization.
+  void create_adjacent_memop_pairs();
+  void collect_valid_vpointers(GrowableArray<const VPointer*>& vpointers);
+  void create_adjacent_memop_pairs_in_all_groups(const GrowableArray<const VPointer*>& vpointers);
+  static int find_group_end(const GrowableArray<const VPointer*>& vpointers, int group_start);
+  void create_adjacent_memop_pairs_in_one_group(const GrowableArray<const VPointer*>& vpointers, const int group_start, int group_end);
+
+  // Various methods to check if we can pack two nodes.
+  bool can_pack_into_pair(Node* s1, Node* s2);
   // Is s1 immediately before s2 in memory?
   bool are_adjacent_refs(Node* s1, Node* s2) const;
   // Are s1 and s2 similar?
@@ -606,8 +580,6 @@ class SuperWord : public ResourceObj {
   // For a node pair (s1, s2) which is isomorphic and independent,
   // do s1 and s2 have similar input edges?
   bool have_similar_inputs(Node* s1, Node* s2);
-  void set_alignment(Node* s1, Node* s2, int align);
-  int adjust_alignment_for_type_conversion(Node* s, Node* t, int align);
 
   void extend_pairset_with_more_pairs_by_following_use_and_def();
   bool extend_pairset_with_more_pairs_by_following_def(Node* s1, Node* s2);
@@ -632,16 +604,6 @@ class SuperWord : public ResourceObj {
 
   DEBUG_ONLY(void verify_packs() const;)
 
-  // Adjust the memory graph for the packed operations
-  void schedule();
-  // Helper function for schedule, that reorders all memops, slice by slice, according to the schedule
-  void schedule_reorder_memops(Node_List &memops_schedule);
-
-  // Convert packs into vector node operations
-  bool output();
-  // Create a vector operand for the nodes in pack p for operand: in(opd_idx)
-  Node* vector_opd(Node_List* p, int opd_idx);
-
   // Can code be generated for the pack, restricted to size nodes?
   bool implemented(const Node_List* pack, const uint size) const;
   // Find the maximal implemented size smaller or equal to the packs size
@@ -661,19 +623,12 @@ class SuperWord : public ResourceObj {
   // Is use->in(u_idx) a vector use?
   bool is_vector_use(Node* use, int u_idx) const;
 
-  // Initialize per node info
-  void initialize_node_info();
   // Return the longer type for vectorizable type-conversion node or illegal type for other nodes.
   BasicType longer_type_for_conversion(Node* n) const;
-  // Find the longest type in def-use chain for packed nodes, and then compute the max vector size.
-  int max_vector_size_in_def_use_chain(Node* n);
-
-  static LoadNode::ControlDependency control_dependency(Node_List* p);
-  // Alignment within a vector memory reference
-  int memory_alignment(MemNode* s, int iv_adjust);
-  // Ensure that the main loop vectors are aligned by adjusting the pre loop limit.
-  void determine_mem_ref_and_aw_for_main_loop_alignment();
-  void adjust_pre_loop_limit_to_align_main_loop_vectors();
+
+  bool is_velt_basic_type_compatible_use_def(Node* use, Node* def) const;
+
+  bool schedule_and_apply() const;
 };
 
 #endif // SHARE_OPTO_SUPERWORD_HPP
diff --git a/src/hotspot/share/opto/superwordVTransformBuilder.cpp b/src/hotspot/share/opto/superwordVTransformBuilder.cpp
new file mode 100644
index 00000000000..b0a0c97cb16
--- /dev/null
+++ b/src/hotspot/share/opto/superwordVTransformBuilder.cpp
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) 2024, 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.
+ */
+
+#include "precompiled.hpp"
+#include "opto/superwordVTransformBuilder.hpp"
+#include "opto/vectornode.hpp"
+
+void SuperWordVTransformBuilder::build() {
+  assert(!_packset.is_empty(), "must have non-empty packset");
+  assert(!_vtransform.has_graph(), "start with empty vtransform");
+
+  // Create vtnodes for all nodes in the loop.
+  build_vector_vtnodes_for_packed_nodes();
+  build_scalar_vtnodes_for_non_packed_nodes();
+
+  // Connect all vtnodes with their inputs. Possibly create vtnodes for input
+  // nodes that are outside the loop.
+  VectorSet vtn_dependencies; // Shared, but cleared for every vtnode.
+  build_inputs_for_vector_vtnodes(vtn_dependencies);
+  build_inputs_for_scalar_vtnodes(vtn_dependencies);
+}
+
+void SuperWordVTransformBuilder::build_vector_vtnodes_for_packed_nodes() {
+  for (int i = 0; i < _packset.length(); i++) {
+    Node_List* pack = _packset.at(i);
+    VTransformVectorNode* vtn = make_vector_vtnode_for_pack(pack);
+    for (uint k = 0; k < pack->size(); k++) {
+      map_node_to_vtnode(pack->at(k), vtn);
+    }
+  }
+}
+
+void SuperWordVTransformBuilder::build_scalar_vtnodes_for_non_packed_nodes() {
+  for (int i = 0; i < _vloop_analyzer.body().body().length(); i++) {
+    Node* n = _vloop_analyzer.body().body().at(i);
+    if (_packset.get_pack(n) != nullptr) { continue; }
+    VTransformScalarNode* vtn = new (_vtransform.arena()) VTransformScalarNode(_vtransform, n);
+    map_node_to_vtnode(n, vtn);
+  }
+}
+
+void SuperWordVTransformBuilder::build_inputs_for_vector_vtnodes(VectorSet& vtn_dependencies) {
+  for (int i = 0; i < _packset.length(); i++) {
+    Node_List* pack = _packset.at(i);
+    Node* p0 = pack->at(0);
+
+    VTransformVectorNode* vtn = get_vtnode(p0)->isa_Vector();
+    assert(vtn != nullptr, "all packs must have vector vtnodes");
+    vtn_dependencies.clear(); // Add every dependency only once per vtn.
+
+    if (p0->is_Load()) {
+      set_req_with_scalar(p0,   vtn, vtn_dependencies, MemNode::Address);
+    } else if (p0->is_Store()) {
+      set_req_with_scalar(p0,   vtn, vtn_dependencies, MemNode::Address);
+      set_req_with_vector(pack, vtn, vtn_dependencies, MemNode::ValueIn);
+    } else if (vtn->isa_ReductionVector() != nullptr) {
+      set_req_with_scalar(p0,   vtn, vtn_dependencies, 1); // scalar init
+      set_req_with_vector(pack, vtn, vtn_dependencies, 2); // vector
+    } else {
+      assert(vtn->isa_ElementWiseVector() != nullptr, "all other vtnodes are handled above");
+      if (VectorNode::is_scalar_rotate(p0) &&
+          p0->in(2)->is_Con() &&
+          Matcher::supports_vector_constant_rotates(p0->in(2)->get_int())) {
+        set_req_with_vector(pack, vtn, vtn_dependencies, 1);
+        set_req_with_scalar(p0,   vtn, vtn_dependencies, 2); // constant rotation
+      } else if (VectorNode::is_roundopD(p0)) {
+        set_req_with_vector(pack, vtn, vtn_dependencies, 1);
+        set_req_with_scalar(p0,   vtn, vtn_dependencies, 2); // constant rounding mode
+      } else if (p0->is_CMove()) {
+        // Cmp + Bool + CMove -> VectorMaskCmp + VectorBlend.
+        set_all_req_with_vectors(pack, vtn, vtn_dependencies);
+        VTransformBoolVectorNode* vtn_mask_cmp = vtn->in(1)->isa_BoolVector();
+        if (vtn_mask_cmp->test()._is_negated) {
+          vtn->swap_req(2, 3); // swap if test was negated.
+        }
+      } else {
+        set_all_req_with_vectors(pack, vtn, vtn_dependencies);
+      }
+    }
+
+    for (uint k = 0; k < pack->size(); k++) {
+      add_dependencies_of_node_to_vtnode(pack->at(k), vtn, vtn_dependencies);
+    }
+  }
+}
+
+void SuperWordVTransformBuilder::build_inputs_for_scalar_vtnodes(VectorSet& vtn_dependencies) {
+  for (int i = 0; i < _vloop_analyzer.body().body().length(); i++) {
+    Node* n = _vloop_analyzer.body().body().at(i);
+    VTransformScalarNode* vtn = get_vtnode(n)->isa_Scalar();
+    if (vtn == nullptr) { continue; }
+    vtn_dependencies.clear(); // Add every dependency only once per vtn.
+
+    if (n->is_Load()) {
+      set_req_with_scalar(n, vtn, vtn_dependencies, MemNode::Address);
+    } else if (n->is_Store()) {
+      set_req_with_scalar(n, vtn, vtn_dependencies, MemNode::Address);
+      set_req_with_scalar(n, vtn, vtn_dependencies, MemNode::ValueIn);
+    } else if (n->is_CountedLoop()) {
+      continue; // Is "root", has no dependency.
+    } else if (n->is_Phi()) {
+      // CountedLoop Phi's: ignore backedge (and entry value).
+      assert(n->in(0) == _vloop.cl(), "only Phi's from the CountedLoop allowed");
+      set_req_with_scalar(n, vtn, vtn_dependencies, 0);
+      continue;
+    } else {
+      set_all_req_with_scalars(n, vtn, vtn_dependencies);
+    }
+
+    add_dependencies_of_node_to_vtnode(n, vtn, vtn_dependencies);
+  }
+}
+
+// Create a vtnode for each pack. No in/out edges set yet.
+VTransformVectorNode* SuperWordVTransformBuilder::make_vector_vtnode_for_pack(const Node_List* pack) const {
+  uint pack_size = pack->size();
+  Node* p0 = pack->at(0);
+  int opc = p0->Opcode();
+  VTransformVectorNode* vtn = nullptr;
+
+  if (p0->is_Load()) {
+    vtn = new (_vtransform.arena()) VTransformLoadVectorNode(_vtransform, pack_size);
+  } else if (p0->is_Store()) {
+    vtn = new (_vtransform.arena()) VTransformStoreVectorNode(_vtransform, pack_size);
+  } else if (p0->is_Bool()) {
+    VTransformBoolTest kind = _packset.get_bool_test(pack);
+    vtn = new (_vtransform.arena()) VTransformBoolVectorNode(_vtransform, pack_size, kind);
+  } else if (_vloop_analyzer.reductions().is_marked_reduction(p0)) {
+    vtn = new (_vtransform.arena()) VTransformReductionVectorNode(_vtransform, pack_size);
+  } else if (VectorNode::is_muladds2i(p0)) {
+    // A special kind of binary element-wise vector op: the inputs are "ints" a and b,
+    // but reinterpreted as two "shorts" [a0, a1] and [b0, b1]:
+    //   v = MulAddS2I(a, b) = a0 * b0 + a1 + b1
+    assert(p0->req() == 5, "MulAddS2I should have 4 operands");
+    vtn = new (_vtransform.arena()) VTransformElementWiseVectorNode(_vtransform, 3, pack_size);
+  } else {
+    assert(p0->req() == 3 ||
+           p0->is_CMove() ||
+           VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(opc) ||
+           VectorNode::is_convert_opcode(opc) ||
+           VectorNode::is_scalar_unary_op_with_equal_input_and_output_types(opc) ||
+           opc == Op_FmaD ||
+           opc == Op_FmaF ||
+           opc == Op_SignumF ||
+           opc == Op_SignumD,
+           "pack type must be in this list");
+    vtn = new (_vtransform.arena()) VTransformElementWiseVectorNode(_vtransform, p0->req(), pack_size);
+  }
+  vtn->set_nodes(pack);
+  return vtn;
+}
+
+void SuperWordVTransformBuilder::set_req_with_scalar(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies, const int index) {
+  VTransformNode* req = get_vtnode_or_wrap_as_input_scalar(n->in(index));
+  vtn->set_req(index, req);
+  vtn_dependencies.set(req->_idx);
+}
+
+// Either get the existing vtnode vector input (when input is a pack), or else make a
+// new vector vtnode for the input (e.g. for Replicate or PopulateIndex).
+VTransformNode* SuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_index(const Node_List* pack, const int index) {
+  Node* p0 = pack->at(0);
+
+  Node_List* pack_in = _packset.pack_input_at_index_or_null(pack, index);
+  if (pack_in != nullptr) {
+    // Input is a matching pack -> vtnode already exists.
+    assert(index != 2 || !VectorNode::is_shift(p0), "shift's count cannot be vector");
+    return get_vtnode(pack_in->at(0));
+  }
+
+  if (VectorNode::is_muladds2i(p0)) {
+    assert(_packset.is_muladds2i_pack_with_pack_inputs(pack), "inputs must all be packs");
+    // All inputs are strided (stride = 2), either with offset 0 or 1.
+    Node_List* pack_in0 = _packset.strided_pack_input_at_index_or_null(pack, index, 2, 0);
+    if (pack_in0 != nullptr) {
+      return get_vtnode(pack_in0->at(0));
+    }
+    Node_List* pack_in1 = _packset.strided_pack_input_at_index_or_null(pack, index, 2, 1);
+    if (pack_in1 != nullptr) {
+      return get_vtnode(pack_in1->at(0));
+    }
+  }
+
+  Node* same_input = _packset.same_inputs_at_index_or_null(pack, index);
+  if (same_input == nullptr && p0->in(index) == _vloop.iv()) {
+    // PopulateIndex: [iv+0, iv+1, iv+2, ...]
+    VTransformNode* iv_vtn = get_vtnode_or_wrap_as_input_scalar(_vloop.iv());
+    BasicType p0_bt = _vloop_analyzer.types().velt_basic_type(p0);
+    // If we have subword type, take that type directly. If p0 is some ConvI2L/F/D,
+    // then the p0_bt can also be L/F/D but we need to produce ints for the input of
+    // the ConvI2L/F/D.
+    BasicType element_bt = is_subword_type(p0_bt) ? p0_bt : T_INT;
+    VTransformNode* populate_index = new (_vtransform.arena()) VTransformPopulateIndexNode(_vtransform, pack->size(), element_bt);
+    populate_index->set_req(1, iv_vtn);
+    return populate_index;
+  }
+
+  if (same_input != nullptr) {
+    VTransformNode* same_input_vtn = get_vtnode_or_wrap_as_input_scalar(same_input);
+    if (index == 2 && VectorNode::is_shift(p0)) {
+      // Scalar shift count for vector shift operation: vec2 = shiftV(vec1, scalar_count)
+      // Scalar shift operations masks the shift count, but the vector shift does not, so
+      // create a special ShiftCount node.
+      BasicType element_bt = _vloop_analyzer.types().velt_basic_type(p0);
+      juint mask = (p0->bottom_type() == TypeInt::INT) ? (BitsPerInt - 1) : (BitsPerLong - 1);
+      VTransformNode* shift_count = new (_vtransform.arena()) VTransformShiftCountNode(_vtransform, pack->size(), element_bt, mask, p0->Opcode());
+      shift_count->set_req(1, same_input_vtn);
+      return shift_count;
+    } else {
+      // Replicate the scalar same_input to every vector element.
+      const Type* element_type = _vloop_analyzer.types().velt_type(p0);
+      if (index == 2 && VectorNode::is_scalar_rotate(p0) && element_type->isa_long()) {
+        // Scalar rotate has int rotation value, but the scalar rotate expects longs.
+        assert(same_input->bottom_type()->isa_int(), "scalar rotate expects int rotation");
+        VTransformNode* conv = new (_vtransform.arena()) VTransformConvI2LNode(_vtransform);
+        conv->set_req(1, same_input_vtn);
+        same_input_vtn = conv;
+      }
+      VTransformNode* replicate = new (_vtransform.arena()) VTransformReplicateNode(_vtransform, pack->size(), element_type);
+      replicate->set_req(1, same_input_vtn);
+      return replicate;
+    }
+  }
+
+  // The input is neither a pack not a same_input node. SuperWord::profitable does not allow
+  // any other case. In the future, we could insert a PackNode.
+#ifdef ASSERT
+  tty->print_cr("\nSuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_index: index=%d", index);
+  pack->dump();
+  assert(false, "Pack input was neither a pack nor a same_input node");
+#endif
+  ShouldNotReachHere();
+}
+
+VTransformNode* SuperWordVTransformBuilder::get_vtnode_or_wrap_as_input_scalar(Node* n) {
+  VTransformNode* vtn = get_vtnode_or_null(n);
+  if (vtn != nullptr) { return vtn; }
+
+  assert(!_vloop.in_bb(n), "only nodes outside the loop can be input nodes to the loop");
+  vtn = new (_vtransform.arena()) VTransformInputScalarNode(_vtransform, n);
+  map_node_to_vtnode(n, vtn);
+  return vtn;
+}
+
+void SuperWordVTransformBuilder::set_req_with_vector(const Node_List* pack, VTransformNode* vtn, VectorSet& vtn_dependencies, int j) {
+  VTransformNode* req = get_or_make_vtnode_vector_input_at_index(pack, j);
+  vtn->set_req(j, req);
+  vtn_dependencies.set(req->_idx);
+}
+
+void SuperWordVTransformBuilder::set_all_req_with_scalars(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies) {
+  assert(vtn->req() == n->req(), "scalars must have same number of reqs");
+  for (uint j = 0; j < n->req(); j++) {
+    Node* def = n->in(j);
+    if (def == nullptr) { continue; }
+    set_req_with_scalar(n, vtn, vtn_dependencies, j);
+  }
+}
+
+void SuperWordVTransformBuilder::set_all_req_with_vectors(const Node_List* pack, VTransformNode* vtn, VectorSet& vtn_dependencies) {
+  Node* p0 = pack->at(0);
+  assert(vtn->req() <= p0->req(), "must have at at most as many reqs");
+  // Vectors have no ctrl, so ignore it.
+  for (uint j = 1; j < vtn->req(); j++) {
+    Node* def = p0->in(j);
+    if (def == nullptr) { continue; }
+    set_req_with_vector(pack, vtn, vtn_dependencies, j);
+  }
+}
+
+void SuperWordVTransformBuilder::add_dependencies_of_node_to_vtnode(Node*n, VTransformNode* vtn, VectorSet& vtn_dependencies) {
+  for (VLoopDependencyGraph::PredsIterator preds(_vloop_analyzer.dependency_graph(), n); !preds.done(); preds.next()) {
+    Node* pred = preds.current();
+    if (!_vloop.in_bb(pred)) { continue; }
+
+    // Only add memory dependencies to memory nodes. All others are taken care of with the req.
+    if (n->is_Mem() && !pred->is_Mem()) { continue; }
+
+    VTransformNode* dependency = get_vtnode(pred);
+
+    // Reduction self-cycle?
+    if (vtn == dependency && _vloop_analyzer.reductions().is_marked_reduction(n)) { continue; }
+
+    if (vtn_dependencies.test_set(dependency->_idx)) { continue; }
+    vtn->add_dependency(dependency); // Add every dependency only once per vtn.
+  }
+}
+
diff --git a/src/hotspot/share/opto/superwordVTransformBuilder.hpp b/src/hotspot/share/opto/superwordVTransformBuilder.hpp
new file mode 100644
index 00000000000..847f870bef6
--- /dev/null
+++ b/src/hotspot/share/opto/superwordVTransformBuilder.hpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2024, 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.
+ */
+
+#include "opto/vtransform.hpp"
+#include "opto/superword.hpp"
+
+#ifndef SHARE_OPTO_SUPERWORD_VTRANSFORM_BUILDER_HPP
+#define SHARE_OPTO_SUPERWORD_VTRANSFORM_BUILDER_HPP
+
+// Facility class that builds a VTransform from a SuperWord PackSet.
+class SuperWordVTransformBuilder : public StackObj {
+private:
+  const VLoopAnalyzer& _vloop_analyzer;
+  const VLoop& _vloop;
+  const PackSet& _packset;
+  VTransform& _vtransform;
+
+  ResourceHashtable</* Node::_idx*/ int, VTransformNode* /* or null*/> _idx_to_vtnode;
+
+public:
+  SuperWordVTransformBuilder(const PackSet& packset,
+                             VTransform& vtransform) :
+      _vloop_analyzer(vtransform.vloop_analyzer()),
+      _vloop(_vloop_analyzer.vloop()),
+      _packset(packset),
+      _vtransform(vtransform)
+  {
+    assert(!_vtransform.has_graph(), "constructor is passed an empty vtransform");
+    build();
+    assert(_vtransform.has_graph(), "vtransform must contain some vtnodes now");
+  }
+
+private:
+  void build();
+  void build_vector_vtnodes_for_packed_nodes();
+  void build_scalar_vtnodes_for_non_packed_nodes();
+  void build_inputs_for_vector_vtnodes(VectorSet& vtn_dependencies);
+  void build_inputs_for_scalar_vtnodes(VectorSet& vtn_dependencies);
+
+  // Helper methods for building VTransform.
+  VTransformNode* get_vtnode_or_null(Node* n) const {
+    VTransformNode** ptr = _idx_to_vtnode.get(n->_idx);
+    return (ptr == nullptr) ? nullptr : *ptr;
+  }
+
+  VTransformNode* get_vtnode(Node* n) const {
+    VTransformNode* vtn = get_vtnode_or_null(n);
+    assert(vtn != nullptr, "expect non-null vtnode");
+    return vtn;
+  }
+
+  void map_node_to_vtnode(Node* n, VTransformNode* vtn) {
+    assert(vtn != nullptr, "only set non-null vtnodes");
+    _idx_to_vtnode.put_when_absent(n->_idx, vtn);
+  }
+
+  VTransformVectorNode* make_vector_vtnode_for_pack(const Node_List* pack) const;
+  VTransformNode* get_or_make_vtnode_vector_input_at_index(const Node_List* pack, const int index);
+  VTransformNode* get_vtnode_or_wrap_as_input_scalar(Node* n);
+  void set_req_with_scalar(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies, const int index);
+  void set_req_with_vector(const Node_List* pack, VTransformNode* vtn, VectorSet& vtn_dependencies, const int index);
+  void set_all_req_with_scalars(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies);
+  void set_all_req_with_vectors(const Node_List* pack, VTransformNode* vtn, VectorSet& vtn_dependencies);
+  void add_dependencies_of_node_to_vtnode(Node* n, VTransformNode* vtn, VectorSet& vtn_dependencies);
+};
+
+#endif // SHARE_OPTO_SUPERWORD_VTRANSFORM_BUILDER_HPP
diff --git a/src/hotspot/share/opto/traceAutoVectorizationTag.hpp b/src/hotspot/share/opto/traceAutoVectorizationTag.hpp
index b5e818efae3..038e04fe0c5 100644
--- a/src/hotspot/share/opto/traceAutoVectorizationTag.hpp
+++ b/src/hotspot/share/opto/traceAutoVectorizationTag.hpp
@@ -37,13 +37,13 @@
   flags(TYPES,                "Trace VLoopTypes") \
   flags(POINTERS,             "Trace VLoopPointers") \
   flags(DEPENDENCY_GRAPH,     "Trace VLoopDependencyGraph") \
-  flags(SW_ALIGNMENT,         "Trace SuperWord alignment analysis") \
-  flags(SW_ADJACENT_MEMOPS,   "Trace SuperWord::find_adjacent_refs") \
+  flags(SW_ADJACENT_MEMOPS,   "Trace SuperWord::find_adjacent_memop_pairs") \
   flags(SW_REJECTIONS,        "Trace SuperWord rejections (non vectorizations)") \
   flags(SW_PACKSET,           "Trace SuperWord packset at different stages") \
   flags(SW_INFO,              "Trace SuperWord info (equivalent to TraceSuperWord)") \
   flags(SW_VERBOSE,           "Trace SuperWord verbose (all SW tags enabled)") \
   flags(ALIGN_VECTOR,         "Trace AlignVector") \
+  flags(VTRANSFORM,           "Trace VTransform Graph") \
   flags(ALL,                  "Trace everything (very verbose)")
 
 #define table_entry(name, description) name,
@@ -115,7 +115,6 @@ class TraceAutoVectorizationTagValidator {
       } else if (ALL == tag) {
         _tags.set_range(0, TRACE_AUTO_VECTORIZATION_TAG_NUM);
       } else if (SW_VERBOSE == tag) {
-        _tags.at_put(SW_ALIGNMENT, set_bit);
         _tags.at_put(SW_ADJACENT_MEMOPS, set_bit);
         _tags.at_put(SW_REJECTIONS, set_bit);
         _tags.at_put(SW_PACKSET, set_bit);
diff --git a/src/hotspot/share/opto/vectorIntrinsics.cpp b/src/hotspot/share/opto/vectorIntrinsics.cpp
index 3ef6ae02534..b31f6ace5a6 100644
--- a/src/hotspot/share/opto/vectorIntrinsics.cpp
+++ b/src/hotspot/share/opto/vectorIntrinsics.cpp
@@ -1616,21 +1616,23 @@ bool LibraryCallKit::inline_vector_reduction() {
   }
 
   Node* init = ReductionNode::make_identity_con_scalar(gvn(), opc, elem_bt);
-  Node* value = nullptr;
-  if (mask == nullptr) {
-    assert(!is_masked_op, "Masked op needs the mask value never null");
-    value = ReductionNode::make(opc, nullptr, init, opd, elem_bt);
-  } else {
-    if (use_predicate) {
-      value = ReductionNode::make(opc, nullptr, init, opd, elem_bt);
-      value->add_req(mask);
-      value->add_flag(Node::Flag_is_predicated_vector);
-    } else {
-      Node* reduce_identity = gvn().transform(VectorNode::scalar2vector(init, num_elem, Type::get_const_basic_type(elem_bt)));
-      value = gvn().transform(new VectorBlendNode(reduce_identity, opd, mask));
-      value = ReductionNode::make(opc, nullptr, init, value, elem_bt);
-    }
+  Node* value = opd;
+
+  assert(mask != nullptr || !is_masked_op, "Masked op needs the mask value never null");
+  if (mask != nullptr && !use_predicate) {
+    Node* reduce_identity = gvn().transform(VectorNode::scalar2vector(init, num_elem, Type::get_const_basic_type(elem_bt)));
+    value = gvn().transform(new VectorBlendNode(reduce_identity, value, mask));
   }
+
+  // Make an unordered Reduction node. This affects only AddReductionVF/VD and MulReductionVF/VD,
+  // as these operations are allowed to be associative (not requiring strict order) in VectorAPI.
+  value = ReductionNode::make(opc, nullptr, init, value, elem_bt, /* requires_strict_order */ false);
+
+  if (mask != nullptr && use_predicate) {
+    value->add_req(mask);
+    value->add_flag(Node::Flag_is_predicated_vector);
+  }
+
   value = gvn().transform(value);
 
   Node* bits = nullptr;
diff --git a/src/hotspot/share/opto/vectorization.cpp b/src/hotspot/share/opto/vectorization.cpp
index 9e6bc7e5939..8d2d3868fe6 100644
--- a/src/hotspot/share/opto/vectorization.cpp
+++ b/src/hotspot/share/opto/vectorization.cpp
@@ -26,7 +26,6 @@
 #include "opto/addnode.hpp"
 #include "opto/connode.hpp"
 #include "opto/convertnode.hpp"
-#include "opto/matcher.hpp"
 #include "opto/mulnode.hpp"
 #include "opto/rootnode.hpp"
 #include "opto/vectorization.hpp"
@@ -202,7 +201,7 @@ void VLoopVPointers::allocate_vpointers_array() {
 
 void VLoopVPointers::compute_and_cache_vpointers() {
   int pointers_idx = 0;
-  _body.for_each_mem([&] (const MemNode* mem, int bb_idx) {
+  _body.for_each_mem([&] (MemNode* const mem, int bb_idx) {
     // Placement new: construct directly into the array.
     ::new (&_vpointers[pointers_idx]) VPointer(mem, _vloop);
     _bb_idx_to_vpointer.at_put(bb_idx, pointers_idx);
@@ -410,7 +409,7 @@ void VLoopDependencyGraph::PredsIterator::next() {
 int VPointer::Tracer::_depth = 0;
 #endif
 
-VPointer::VPointer(const MemNode* mem, const VLoop& vloop,
+VPointer::VPointer(MemNode* const mem, const VLoop& vloop,
                    Node_Stack* nstack, bool analyze_only) :
   _mem(mem), _vloop(vloop),
   _base(nullptr), _adr(nullptr), _scale(0), _offset(0), _invar(nullptr),
@@ -807,10 +806,51 @@ void VPointer::maybe_add_to_invar(Node* new_invar, bool negate) {
   _invar = register_if_new(add);
 }
 
+// We use two comparisons, because a subtraction could underflow.
+#define RETURN_CMP_VALUE_IF_NOT_EQUAL(a, b) \
+  if (a < b) { return -1; }                 \
+  if (a > b) { return  1; }
+
+// To be in the same group, two VPointers must be the same,
+// except for the offset.
+int VPointer::cmp_for_sort_by_group(const VPointer** p1, const VPointer** p2) {
+  const VPointer* a = *p1;
+  const VPointer* b = *p2;
+
+  RETURN_CMP_VALUE_IF_NOT_EQUAL(a->base()->_idx,     b->base()->_idx);
+  RETURN_CMP_VALUE_IF_NOT_EQUAL(a->mem()->Opcode(),  b->mem()->Opcode());
+  RETURN_CMP_VALUE_IF_NOT_EQUAL(a->scale_in_bytes(), b->scale_in_bytes());
+
+  int a_inva_idx = a->invar() == nullptr ? 0 : a->invar()->_idx;
+  int b_inva_idx = b->invar() == nullptr ? 0 : b->invar()->_idx;
+  RETURN_CMP_VALUE_IF_NOT_EQUAL(a_inva_idx,          b_inva_idx);
+
+  return 0; // equal
+}
+
+// We compare by group, then by offset, and finally by node idx.
+int VPointer::cmp_for_sort(const VPointer** p1, const VPointer** p2) {
+  int cmp_group = cmp_for_sort_by_group(p1, p2);
+  if (cmp_group != 0) { return cmp_group; }
+
+  const VPointer* a = *p1;
+  const VPointer* b = *p2;
+
+  RETURN_CMP_VALUE_IF_NOT_EQUAL(a->offset_in_bytes(), b->offset_in_bytes());
+  RETURN_CMP_VALUE_IF_NOT_EQUAL(a->mem()->_idx,       b->mem()->_idx);
+  return 0; // equal
+}
+
 #ifndef PRODUCT
 // Function for printing the fields of a VPointer
 void VPointer::print() const {
   tty->print("VPointer[mem: %4d %10s, ", _mem->_idx, _mem->Name());
+
+  if (!valid()) {
+    tty->print_cr("invalid]");
+    return;
+  }
+
   tty->print("base: %4d, ", _base != nullptr ? _base->_idx : 0);
   tty->print("adr: %4d, ", _adr != nullptr ? _adr->_idx : 0);
 
diff --git a/src/hotspot/share/opto/vectorization.hpp b/src/hotspot/share/opto/vectorization.hpp
index 6840b01bb93..3984407c565 100644
--- a/src/hotspot/share/opto/vectorization.hpp
+++ b/src/hotspot/share/opto/vectorization.hpp
@@ -25,7 +25,7 @@
 #ifndef SHARE_OPTO_VECTORIZATION_HPP
 #define SHARE_OPTO_VECTORIZATION_HPP
 
-#include "opto/node.hpp"
+#include "opto/matcher.hpp"
 #include "opto/loopnode.hpp"
 #include "opto/traceAutoVectorizationTag.hpp"
 #include "utilities/pair.hpp"
@@ -129,6 +129,9 @@ class VLoop : public StackObj {
   int estimated_body_length() const { return lpt()->_body.size(); };
   int estimated_node_count()  const { return (int)(1.10 * phase()->C->unique()); };
 
+  // Should we align vector memory references on this platform?
+  static bool vectors_should_be_aligned() { return !Matcher::misaligned_vectors_ok() || AlignVector; }
+
 #ifndef PRODUCT
   const VTrace& vtrace()      const { return _vtrace; }
 
@@ -669,7 +672,7 @@ class VLoopAnalyzer : StackObj {
 // operation in a counted loop for vectorizable analysis.
 class VPointer : public ArenaObj {
  protected:
-  const MemNode*  _mem;      // My memory reference node
+  MemNode* const  _mem;      // My memory reference node
   const VLoop&    _vloop;
 
   Node* _base;               // null if unsafe nonheap reference
@@ -711,12 +714,12 @@ class VPointer : public ArenaObj {
     NotComparable = (Less | Greater | Equal)
   };
 
-  VPointer(const MemNode* mem, const VLoop& vloop) :
+  VPointer(MemNode* const mem, const VLoop& vloop) :
     VPointer(mem, vloop, nullptr, false) {}
-  VPointer(const MemNode* mem, const VLoop& vloop, Node_Stack* nstack) :
+  VPointer(MemNode* const mem, const VLoop& vloop, Node_Stack* nstack) :
     VPointer(mem, vloop, nstack, true) {}
  private:
-  VPointer(const MemNode* mem, const VLoop& vloop,
+  VPointer(MemNode* const mem, const VLoop& vloop,
            Node_Stack* nstack, bool analyze_only);
   // Following is used to create a temporary object during
   // the pattern match of an address expression.
@@ -729,7 +732,7 @@ class VPointer : public ArenaObj {
 
   Node* base()             const { return _base; }
   Node* adr()              const { return _adr; }
-  const MemNode* mem()     const { return _mem; }
+  MemNode* mem()           const { return _mem; }
   int   scale_in_bytes()   const { return _scale; }
   Node* invar()            const { return _invar; }
   int   offset_in_bytes()  const { return _offset; }
@@ -760,9 +763,9 @@ class VPointer : public ArenaObj {
     }
   }
 
-  bool overlap_possible_with_any_in(const Node_List* p) const {
-    for (uint k = 0; k < p->size(); k++) {
-      MemNode* mem = p->at(k)->as_Mem();
+  bool overlap_possible_with_any_in(const GrowableArray<Node*>& nodes) const {
+    for (int i = 0; i < nodes.length(); i++) {
+      MemNode* mem = nodes.at(i)->as_Mem();
       VPointer p_mem(mem, _vloop);
       // Only if we know that we have Less or Greater can we
       // be sure that there can never be an overlap between
@@ -781,6 +784,11 @@ class VPointer : public ArenaObj {
   static bool equal(int cmp)      { return cmp == Equal; }
   static bool comparable(int cmp) { return cmp < NotComparable; }
 
+  // We need to be able to sort the VPointer to efficiently group the
+  // memops into groups, and to find adjacent memops.
+  static int cmp_for_sort_by_group(const VPointer** p1, const VPointer** p2);
+  static int cmp_for_sort(const VPointer** p1, const VPointer** p2);
+
   NOT_PRODUCT( void print() const; )
 
 #ifndef PRODUCT
diff --git a/src/hotspot/share/opto/vectornode.cpp b/src/hotspot/share/opto/vectornode.cpp
index 600795bbc73..72b49c043b6 100644
--- a/src/hotspot/share/opto/vectornode.cpp
+++ b/src/hotspot/share/opto/vectornode.cpp
@@ -172,7 +172,7 @@ int VectorNode::opcode(int sopc, BasicType bt) {
     return (is_integral_type(bt) ? Op_ReverseV : 0);
   case Op_ReverseBytesS:
   case Op_ReverseBytesUS:
-    // Subword operations in superword usually don't have precise info
+    // Subword operations in auto vectorization usually don't have precise info
     // about signedness. But the behavior of reverseBytes for short and
     // char are exactly the same.
     return ((bt == T_SHORT || bt == T_CHAR) ? Op_ReverseBytesV : 0);
@@ -388,7 +388,7 @@ int VectorNode::scalar_opcode(int sopc, BasicType bt) {
 }
 
 // Limits on vector size (number of elements) for auto-vectorization.
-bool VectorNode::vector_size_supported_superword(const BasicType bt, int size) {
+bool VectorNode::vector_size_supported_auto_vectorization(const BasicType bt, int size) {
   return Matcher::max_vector_size_auto_vectorization(bt) >= size &&
          Matcher::min_vector_size(bt) <= size;
 }
@@ -398,7 +398,7 @@ bool VectorNode::vector_size_supported_superword(const BasicType bt, int size) {
 bool VectorNode::implemented(int opc, uint vlen, BasicType bt) {
   if (is_java_primitive(bt) &&
       (vlen > 1) && is_power_of_2(vlen) &&
-      vector_size_supported_superword(bt, vlen)) {
+      vector_size_supported_auto_vectorization(bt, vlen)) {
     int vopc = VectorNode::opcode(opc, bt);
     // For rotate operation we will do a lazy de-generation into
     // OrV/LShiftV/URShiftV pattern if the target does not support
@@ -414,14 +414,6 @@ bool VectorNode::implemented(int opc, uint vlen, BasicType bt) {
   return false;
 }
 
-bool VectorNode::is_type_transition_short_to_int(Node* n) {
-  return n->Opcode() == Op_MulAddS2I;
-}
-
-bool VectorNode::is_type_transition_to_int(Node* n) {
-  return is_type_transition_short_to_int(n);
-}
-
 bool VectorNode::is_muladds2i(const Node* n) {
   return n->Opcode() == Op_MulAddS2I;
 }
@@ -515,7 +507,11 @@ bool VectorNode::is_shift_opcode(int opc) {
   }
 }
 
-bool VectorNode::can_transform_shift_op(Node* n, BasicType bt) {
+// Vector unsigned right shift for signed subword types behaves differently
+// from Java Spec. But when the shift amount is a constant not greater than
+// the number of sign extended bits, the unsigned right shift can be
+// vectorized to a signed right shift.
+bool VectorNode::can_use_RShiftI_instead_of_URShiftI(Node* n, BasicType bt) {
   if (n->Opcode() != Op_URShiftI) {
     return false;
   }
@@ -928,6 +924,50 @@ bool VectorNode::is_vector_bitwise_not_pattern(Node* n) {
   return false;
 }
 
+bool VectorNode::is_scalar_unary_op_with_equal_input_and_output_types(int opc) {
+  switch (opc) {
+    case Op_SqrtF:
+    case Op_SqrtD:
+    case Op_AbsF:
+    case Op_AbsD:
+    case Op_AbsI:
+    case Op_AbsL:
+    case Op_NegF:
+    case Op_NegD:
+    case Op_RoundF:
+    case Op_RoundD:
+    case Op_ReverseBytesI:
+    case Op_ReverseBytesL:
+    case Op_ReverseBytesUS:
+    case Op_ReverseBytesS:
+    case Op_ReverseI:
+    case Op_ReverseL:
+    case Op_PopCountI:
+    case Op_CountLeadingZerosI:
+    case Op_CountTrailingZerosI:
+      return true;
+    default:
+      return false;
+  }
+}
+
+// Java API for Long.bitCount/numberOfLeadingZeros/numberOfTrailingZeros
+// returns int type, but Vector API for them returns long type. To unify
+// the implementation in backend, AutoVectorization splits the vector
+// implementation for Java API into an execution node with long type plus
+// another node converting long to int.
+bool VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(int opc) {
+  switch (opc) {
+    case Op_PopCountL:
+    case Op_CountLeadingZerosL:
+    case Op_CountTrailingZerosL:
+      return true;
+    default:
+      return false;
+  }
+}
+
+
 Node* VectorNode::try_to_gen_masked_vector(PhaseGVN* gvn, Node* node, const TypeVect* vt) {
   int vopc = node->Opcode();
   uint vlen = vt->length();
@@ -1304,7 +1344,8 @@ int ReductionNode::opcode(int opc, BasicType bt) {
 }
 
 // Return the appropriate reduction node.
-ReductionNode* ReductionNode::make(int opc, Node *ctrl, Node* n1, Node* n2, BasicType bt) {
+ReductionNode* ReductionNode::make(int opc, Node* ctrl, Node* n1, Node* n2, BasicType bt,
+                                   bool requires_strict_order) {
 
   int vopc = opcode(opc, bt);
 
@@ -1314,17 +1355,17 @@ ReductionNode* ReductionNode::make(int opc, Node *ctrl, Node* n1, Node* n2, Basi
   switch (vopc) {
   case Op_AddReductionVI: return new AddReductionVINode(ctrl, n1, n2);
   case Op_AddReductionVL: return new AddReductionVLNode(ctrl, n1, n2);
-  case Op_AddReductionVF: return new AddReductionVFNode(ctrl, n1, n2);
-  case Op_AddReductionVD: return new AddReductionVDNode(ctrl, n1, n2);
+  case Op_AddReductionVF: return new AddReductionVFNode(ctrl, n1, n2, requires_strict_order);
+  case Op_AddReductionVD: return new AddReductionVDNode(ctrl, n1, n2, requires_strict_order);
   case Op_MulReductionVI: return new MulReductionVINode(ctrl, n1, n2);
   case Op_MulReductionVL: return new MulReductionVLNode(ctrl, n1, n2);
-  case Op_MulReductionVF: return new MulReductionVFNode(ctrl, n1, n2);
-  case Op_MulReductionVD: return new MulReductionVDNode(ctrl, n1, n2);
-  case Op_MinReductionV:  return new MinReductionVNode(ctrl, n1, n2);
-  case Op_MaxReductionV:  return new MaxReductionVNode(ctrl, n1, n2);
-  case Op_AndReductionV:  return new AndReductionVNode(ctrl, n1, n2);
-  case Op_OrReductionV:   return new OrReductionVNode(ctrl, n1, n2);
-  case Op_XorReductionV:  return new XorReductionVNode(ctrl, n1, n2);
+  case Op_MulReductionVF: return new MulReductionVFNode(ctrl, n1, n2, requires_strict_order);
+  case Op_MulReductionVD: return new MulReductionVDNode(ctrl, n1, n2, requires_strict_order);
+  case Op_MinReductionV:  return new MinReductionVNode (ctrl, n1, n2);
+  case Op_MaxReductionV:  return new MaxReductionVNode (ctrl, n1, n2);
+  case Op_AndReductionV:  return new AndReductionVNode (ctrl, n1, n2);
+  case Op_OrReductionV:   return new OrReductionVNode  (ctrl, n1, n2);
+  case Op_XorReductionV:  return new XorReductionVNode (ctrl, n1, n2);
   default:
     assert(false, "unknown node: %s", NodeClassNames[vopc]);
     return nullptr;
@@ -1419,7 +1460,7 @@ bool VectorCastNode::implemented(int opc, uint vlen, BasicType src_type, BasicTy
   if (is_java_primitive(dst_type) &&
       is_java_primitive(src_type) &&
       (vlen > 1) && is_power_of_2(vlen) &&
-      VectorNode::vector_size_supported_superword(dst_type, vlen)) {
+      VectorNode::vector_size_supported_auto_vectorization(dst_type, vlen)) {
     int vopc = VectorCastNode::opcode(opc, src_type);
     return vopc > 0 && Matcher::match_rule_supported_auto_vectorization(vopc, vlen, dst_type);
   }
@@ -1513,7 +1554,7 @@ Node* ReductionNode::make_identity_con_scalar(PhaseGVN& gvn, int sopc, BasicType
 bool ReductionNode::implemented(int opc, uint vlen, BasicType bt) {
   if (is_java_primitive(bt) &&
       (vlen > 1) && is_power_of_2(vlen) &&
-      VectorNode::vector_size_supported_superword(bt, vlen)) {
+      VectorNode::vector_size_supported_auto_vectorization(bt, vlen)) {
     int vopc = ReductionNode::opcode(opc, bt);
     return vopc != opc && Matcher::match_rule_supported_auto_vectorization(vopc, vlen, bt);
   }
diff --git a/src/hotspot/share/opto/vectornode.hpp b/src/hotspot/share/opto/vectornode.hpp
index a9ded1bfa2d..23ddebaf338 100644
--- a/src/hotspot/share/opto/vectornode.hpp
+++ b/src/hotspot/share/opto/vectornode.hpp
@@ -84,7 +84,7 @@ class VectorNode : public TypeNode {
   static VectorNode* make_mask_node(int vopc, Node* n1, Node* n2, uint vlen, BasicType bt);
 
   static bool is_shift_opcode(int opc);
-  static bool can_transform_shift_op(Node* n, BasicType bt);
+  static bool can_use_RShiftI_instead_of_URShiftI(Node* n, BasicType bt);
   static bool is_convert_opcode(int opc);
   static bool is_minmax_opcode(int opc);
 
@@ -96,12 +96,10 @@ class VectorNode : public TypeNode {
   static int scalar_opcode(int vopc, BasicType bt);  // vector_opc -> scalar_opc
 
   // Limits on vector size (number of elements) for auto-vectorization.
-  static bool vector_size_supported_superword(const BasicType bt, int size);
+  static bool vector_size_supported_auto_vectorization(const BasicType bt, int size);
   static bool implemented(int opc, uint vlen, BasicType bt);
   static bool is_shift(Node* n);
   static bool is_vshift_cnt(Node* n);
-  static bool is_type_transition_short_to_int(Node* n);
-  static bool is_type_transition_to_int(Node* n);
   static bool is_muladds2i(const Node* n);
   static bool is_roundopD(Node* n);
   static bool is_scalar_rotate(Node* n);
@@ -132,6 +130,9 @@ class VectorNode : public TypeNode {
     return is_vector_shift_count(n->Opcode());
   }
 
+  static bool is_scalar_unary_op_with_equal_input_and_output_types(int opc);
+  static bool is_scalar_op_that_returns_int_but_vector_op_returns_long(int opc);
+
   static void trace_new_vector(Node* n, const char* context) {
 #ifdef ASSERT
     if (TraceNewVectors) {
@@ -205,7 +206,9 @@ class ReductionNode : public Node {
     init_class_id(Class_Reduction);
   }
 
-  static ReductionNode* make(int opc, Node* ctrl, Node* in1, Node* in2, BasicType bt);
+  static ReductionNode* make(int opc, Node* ctrl, Node* in1, Node* in2, BasicType bt,
+                             // This only effects floating-point add and mul reductions.
+                             bool requires_strict_order = true);
   static int  opcode(int opc, BasicType bt);
   static bool implemented(int opc, uint vlen, BasicType bt);
   // Make an identity scalar (zero for add, one for mul, etc) for scalar opc.
@@ -227,47 +230,97 @@ class ReductionNode : public Node {
 
   // Needed for proper cloning.
   virtual uint size_of() const { return sizeof(*this); }
-};
 
-//---------------------------UnorderedReductionNode-------------------------------------
-// Order of reduction does not matter. Example int add. Not true for float add.
-class UnorderedReductionNode : public ReductionNode {
-public:
-  UnorderedReductionNode(Node * ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {
-    init_class_id(Class_UnorderedReduction);
+  // Floating-point addition and multiplication are non-associative, so
+  // AddReductionVF/D and MulReductionVF/D require strict ordering
+  // in auto-vectorization. Vector API can generate AddReductionVF/D
+  // and MulReductionVF/VD without strict ordering, which can benefit
+  // some platforms.
+  //
+  // Other reductions don't need strict ordering.
+  virtual bool requires_strict_order() const {
+    return false;
   }
+
+#ifndef PRODUCT
+  void dump_spec(outputStream* st) const {
+    if (requires_strict_order()) {
+      st->print("requires_strict_order");
+    } else {
+      st->print("no_strict_order");
+    }
+  }
+#endif
 };
 
 //------------------------------AddReductionVINode--------------------------------------
 // Vector add byte, short and int as a reduction
-class AddReductionVINode : public UnorderedReductionNode {
+class AddReductionVINode : public ReductionNode {
 public:
-  AddReductionVINode(Node * ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  AddReductionVINode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
 //------------------------------AddReductionVLNode--------------------------------------
 // Vector add long as a reduction
-class AddReductionVLNode : public UnorderedReductionNode {
+class AddReductionVLNode : public ReductionNode {
 public:
-  AddReductionVLNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  AddReductionVLNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
 //------------------------------AddReductionVFNode--------------------------------------
 // Vector add float as a reduction
 class AddReductionVFNode : public ReductionNode {
+private:
+  // True if add reduction operation for floats requires strict ordering.
+  // As an example - The value is true when add reduction for floats is auto-vectorized
+  // as auto-vectorization mandates strict ordering but the value is false when this node
+  // is generated through VectorAPI as VectorAPI does not impose any such rules on ordering.
+  const bool _requires_strict_order;
 public:
-  AddReductionVFNode(Node *ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
+  //_requires_strict_order is set to true by default as mandated by auto-vectorization
+  AddReductionVFNode(Node* ctrl, Node* in1, Node* in2, bool requires_strict_order = true) :
+    ReductionNode(ctrl, in1, in2), _requires_strict_order(requires_strict_order) {}
+
   virtual int Opcode() const;
+
+  virtual bool requires_strict_order() const { return _requires_strict_order; }
+
+  virtual uint hash() const { return Node::hash() + _requires_strict_order; }
+
+  virtual bool cmp(const Node& n) const {
+    return Node::cmp(n) && _requires_strict_order == ((ReductionNode&)n).requires_strict_order();
+  }
+
+  virtual uint size_of() const { return sizeof(*this); }
 };
 
 //------------------------------AddReductionVDNode--------------------------------------
 // Vector add double as a reduction
 class AddReductionVDNode : public ReductionNode {
+private:
+  // True if add reduction operation for doubles requires strict ordering.
+  // As an example - The value is true when add reduction for doubles is auto-vectorized
+  // as auto-vectorization mandates strict ordering but the value is false when this node
+  // is generated through VectorAPI as VectorAPI does not impose any such rules on ordering.
+  const bool _requires_strict_order;
 public:
-  AddReductionVDNode(Node *ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
+  //_requires_strict_order is set to true by default as mandated by auto-vectorization
+  AddReductionVDNode(Node* ctrl, Node* in1, Node* in2, bool requires_strict_order = true) :
+    ReductionNode(ctrl, in1, in2), _requires_strict_order(requires_strict_order) {}
+
   virtual int Opcode() const;
+
+  virtual bool requires_strict_order() const { return _requires_strict_order; }
+
+  virtual uint hash() const { return Node::hash() + _requires_strict_order; }
+
+  virtual bool cmp(const Node& n) const {
+    return Node::cmp(n) && _requires_strict_order == ((ReductionNode&)n).requires_strict_order();
+  }
+
+  virtual uint size_of() const { return sizeof(*this); }
 };
 
 //------------------------------SubVBNode--------------------------------------
@@ -402,34 +455,70 @@ class FmaVFNode : public FmaVNode {
 
 //------------------------------MulReductionVINode--------------------------------------
 // Vector multiply byte, short and int as a reduction
-class MulReductionVINode : public UnorderedReductionNode {
+class MulReductionVINode : public ReductionNode {
 public:
-  MulReductionVINode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  MulReductionVINode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
 //------------------------------MulReductionVLNode--------------------------------------
 // Vector multiply int as a reduction
-class MulReductionVLNode : public UnorderedReductionNode {
+class MulReductionVLNode : public ReductionNode {
 public:
-  MulReductionVLNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  MulReductionVLNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
 //------------------------------MulReductionVFNode--------------------------------------
 // Vector multiply float as a reduction
 class MulReductionVFNode : public ReductionNode {
+  // True if mul reduction operation for floats requires strict ordering.
+  // As an example - The value is true when mul reduction for floats is auto-vectorized
+  // as auto-vectorization mandates strict ordering but the value is false when this node
+  // is generated through VectorAPI as VectorAPI does not impose any such rules on ordering.
+  const bool _requires_strict_order;
 public:
-  MulReductionVFNode(Node *ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
+  //_requires_strict_order is set to true by default as mandated by auto-vectorization
+  MulReductionVFNode(Node* ctrl, Node* in1, Node* in2, bool requires_strict_order = true) :
+    ReductionNode(ctrl, in1, in2), _requires_strict_order(requires_strict_order) {}
+
   virtual int Opcode() const;
+
+  virtual bool requires_strict_order() const { return _requires_strict_order; }
+
+  virtual uint hash() const { return Node::hash() + _requires_strict_order; }
+
+  virtual bool cmp(const Node& n) const {
+    return Node::cmp(n) && _requires_strict_order == ((ReductionNode&)n).requires_strict_order();
+  }
+
+  virtual uint size_of() const { return sizeof(*this); }
 };
 
 //------------------------------MulReductionVDNode--------------------------------------
 // Vector multiply double as a reduction
 class MulReductionVDNode : public ReductionNode {
+  // True if mul reduction operation for doubles requires strict ordering.
+  // As an example - The value is true when mul reduction for doubles is auto-vectorized
+  // as auto-vectorization mandates strict ordering but the value is false when this node
+  // is generated through VectorAPI as VectorAPI does not impose any such rules on ordering.
+  const bool _requires_strict_order;
 public:
-  MulReductionVDNode(Node *ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
+  //_requires_strict_order is set to true by default as mandated by auto-vectorization
+  MulReductionVDNode(Node* ctrl, Node* in1, Node* in2, bool requires_strict_order = true) :
+    ReductionNode(ctrl, in1, in2), _requires_strict_order(requires_strict_order) {}
+
   virtual int Opcode() const;
+
+  virtual bool requires_strict_order() const { return _requires_strict_order; }
+
+  virtual uint hash() const { return Node::hash() + _requires_strict_order; }
+
+  virtual bool cmp(const Node& n) const {
+    return Node::cmp(n) && _requires_strict_order == ((ReductionNode&)n).requires_strict_order();
+  }
+
+  virtual uint size_of() const { return sizeof(*this); }
 };
 
 //------------------------------DivVFNode--------------------------------------
@@ -755,9 +844,9 @@ class AndVNode : public VectorNode {
 
 //------------------------------AndReductionVNode--------------------------------------
 // Vector and byte, short, int, long as a reduction
-class AndReductionVNode : public UnorderedReductionNode {
+class AndReductionVNode : public ReductionNode {
  public:
-  AndReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  AndReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
@@ -772,9 +861,9 @@ class OrVNode : public VectorNode {
 
 //------------------------------OrReductionVNode--------------------------------------
 // Vector xor byte, short, int, long as a reduction
-class OrReductionVNode : public UnorderedReductionNode {
+class OrReductionVNode : public ReductionNode {
  public:
-  OrReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  OrReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
@@ -789,25 +878,25 @@ class XorVNode : public VectorNode {
 
 //------------------------------XorReductionVNode--------------------------------------
 // Vector and int, long as a reduction
-class XorReductionVNode : public UnorderedReductionNode {
+class XorReductionVNode : public ReductionNode {
  public:
-  XorReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  XorReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
 //------------------------------MinReductionVNode--------------------------------------
 // Vector min byte, short, int, long, float, double as a reduction
-class MinReductionVNode : public UnorderedReductionNode {
+class MinReductionVNode : public ReductionNode {
 public:
-  MinReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  MinReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
 //------------------------------MaxReductionVNode--------------------------------------
 // Vector min byte, short, int, long, float, double as a reduction
-class MaxReductionVNode : public UnorderedReductionNode {
+class MaxReductionVNode : public ReductionNode {
 public:
-  MaxReductionVNode(Node *ctrl, Node* in1, Node* in2) : UnorderedReductionNode(ctrl, in1, in2) {}
+  MaxReductionVNode(Node* ctrl, Node* in1, Node* in2) : ReductionNode(ctrl, in1, in2) {}
   virtual int Opcode() const;
 };
 
diff --git a/src/hotspot/share/opto/vtransform.cpp b/src/hotspot/share/opto/vtransform.cpp
new file mode 100644
index 00000000000..e40157caa36
--- /dev/null
+++ b/src/hotspot/share/opto/vtransform.cpp
@@ -0,0 +1,450 @@
+/*
+ * Copyright (c) 2024, 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.
+ */
+
+#include "precompiled.hpp"
+#include "opto/vtransform.hpp"
+#include "opto/vectornode.hpp"
+#include "opto/convertnode.hpp"
+
+void VTransformGraph::add_vtnode(VTransformNode* vtnode) {
+  assert(vtnode->_idx == _vtnodes.length(), "position must match idx");
+  _vtnodes.push(vtnode);
+}
+
+// Compute a linearization of the graph. We do this with a reverse-post-order of a DFS.
+// This only works if the graph is a directed acyclic graph (DAG). The C2 graph, and
+// the VLoopDependencyGraph are both DAGs, but after introduction of vectors/packs, the
+// graph has additional constraints which can introduce cycles. Example:
+//
+//                                                       +--------+
+//  A -> X                                               |        v
+//                     Pack [A,B] and [X,Y]             [A,B]    [X,Y]
+//  Y -> B                                                 ^        |
+//                                                         +--------+
+//
+// We return "true" IFF we find no cycle, i.e. if the linearization succeeds.
+bool VTransformGraph::schedule() {
+  assert(!is_scheduled(), "not yet scheduled");
+
+#ifndef PRODUCT
+  if (_trace._verbose) {
+    print_vtnodes();
+  }
+#endif
+
+  ResourceMark rm;
+  GrowableArray<VTransformNode*> stack;
+  VectorSet pre_visited;
+  VectorSet post_visited;
+
+  collect_nodes_without_req_or_dependency(stack);
+
+  // We create a reverse-post-visit order. This gives us a linearization, if there are
+  // no cycles. Then, we simply reverse the order, and we have a schedule.
+  int rpo_idx = _vtnodes.length() - 1;
+  while (!stack.is_empty()) {
+    VTransformNode* vtn = stack.top();
+    if (!pre_visited.test_set(vtn->_idx)) {
+      // Forward arc in graph (pre-visit).
+    } else if (!post_visited.test(vtn->_idx)) {
+      // Forward arc in graph. Check if all uses were already visited:
+      //   Yes -> post-visit.
+      //   No  -> we are mid-visit.
+      bool all_uses_already_visited = true;
+
+      for (int i = 0; i < vtn->outs(); i++) {
+        VTransformNode* use = vtn->out(i);
+        if (post_visited.test(use->_idx)) { continue; }
+        if (pre_visited.test(use->_idx)) {
+          // Cycle detected!
+          // The nodes that are pre_visited but not yet post_visited form a path from
+          // the "root" to the current vtn. Now, we are looking at an edge (vtn, use),
+          // and discover that use is also pre_visited but not post_visited. Thus, use
+          // lies on that path from "root" to vtn, and the edge (vtn, use) closes a
+          // cycle.
+          NOT_PRODUCT(if (_trace._rejections) { trace_schedule_cycle(stack, pre_visited, post_visited); } )
+          return false;
+        }
+        stack.push(use);
+        all_uses_already_visited = false;
+      }
+
+      if (all_uses_already_visited) {
+        stack.pop();
+        post_visited.set(vtn->_idx);           // post-visit
+        _schedule.at_put_grow(rpo_idx--, vtn); // assign rpo_idx
+      }
+    } else {
+      stack.pop(); // Already post-visited. Ignore secondary edge.
+    }
+  }
+
+#ifndef PRODUCT
+  if (_trace._verbose) {
+    print_schedule();
+  }
+#endif
+
+  assert(rpo_idx == -1, "used up all rpo_idx, rpo_idx=%d", rpo_idx);
+  return true;
+}
+
+// Push all "root" nodes, i.e. those that have no inputs (req or dependency):
+void VTransformGraph::collect_nodes_without_req_or_dependency(GrowableArray<VTransformNode*>& stack) const {
+  for (int i = 0; i < _vtnodes.length(); i++) {
+    VTransformNode* vtn = _vtnodes.at(i);
+    if (!vtn->has_req_or_dependency()) {
+      stack.push(vtn);
+    }
+  }
+}
+
+#ifndef PRODUCT
+void VTransformGraph::trace_schedule_cycle(const GrowableArray<VTransformNode*>& stack,
+                                           const VectorSet& pre_visited,
+                                           const VectorSet& post_visited) const {
+  tty->print_cr("\nVTransform::schedule found a cycle on path (P), vectorization attempt fails.");
+  for (int j = 0; j < stack.length(); j++) {
+    VTransformNode* n = stack.at(j);
+    bool on_path = pre_visited.test(n->_idx) && !post_visited.test(n->_idx);
+    tty->print("  %s ", on_path ? "P" : "_");
+    n->print();
+  }
+}
+
+void VTransformApplyResult::trace(VTransformNode* vtnode) const {
+  tty->print("  apply: ");
+  vtnode->print();
+  tty->print("    ->   ");
+  if (_node == nullptr) {
+    tty->print_cr("nullptr");
+  } else {
+    _node->dump();
+  }
+}
+#endif
+
+Node* VTransformNode::find_transformed_input(int i, const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  Node* n = vnode_idx_to_transformed_node.at(in(i)->_idx);
+  assert(n != nullptr, "must find input IR node");
+  return n;
+}
+
+VTransformApplyResult VTransformScalarNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                  const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  // This was just wrapped. Now we simply unwap without touching the inputs.
+  return VTransformApplyResult::make_scalar(_node);
+}
+
+VTransformApplyResult VTransformReplicateNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                     const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  Node* val = find_transformed_input(1, vnode_idx_to_transformed_node);
+  VectorNode* vn = VectorNode::scalar2vector(val, _vlen, _element_type);
+  register_new_node_from_vectorization(vloop_analyzer, vn, val);
+  return VTransformApplyResult::make_vector(vn, _vlen, vn->length_in_bytes());
+}
+
+VTransformApplyResult VTransformConvI2LNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                   const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  Node* val = find_transformed_input(1, vnode_idx_to_transformed_node);
+  Node* n = new ConvI2LNode(val);
+  register_new_node_from_vectorization(vloop_analyzer, n, val);
+  return VTransformApplyResult::make_scalar(n);
+}
+
+VTransformApplyResult VTransformShiftCountNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  PhaseIdealLoop* phase = vloop_analyzer.vloop().phase();
+  Node* shift_count_in = find_transformed_input(1, vnode_idx_to_transformed_node);
+  assert(shift_count_in->bottom_type()->isa_int(), "int type only for shift count");
+  // The shift_count_in would be automatically truncated to the lowest _mask
+  // bits in a scalar shift operation. But vector shift does not truncate, so
+  // we must apply the mask now.
+  Node* shift_count_masked = new AndINode(shift_count_in, phase->igvn().intcon(_mask));
+  register_new_node_from_vectorization(vloop_analyzer, shift_count_masked, shift_count_in);
+  // Now that masked value is "boadcast" (some platforms only set the lowest element).
+  VectorNode* vn = VectorNode::shift_count(_shift_opcode, shift_count_masked, _vlen, _element_bt);
+  register_new_node_from_vectorization(vloop_analyzer, vn, shift_count_in);
+  return VTransformApplyResult::make_vector(vn, _vlen, vn->length_in_bytes());
+}
+
+
+VTransformApplyResult VTransformPopulateIndexNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                         const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  PhaseIdealLoop* phase = vloop_analyzer.vloop().phase();
+  Node* val = find_transformed_input(1, vnode_idx_to_transformed_node);
+  assert(val->is_Phi(), "expected to be iv");
+  assert(VectorNode::is_populate_index_supported(_element_bt), "should support");
+  const TypeVect* vt = TypeVect::make(_element_bt, _vlen);
+  VectorNode* vn = new PopulateIndexNode(val, phase->igvn().intcon(1), vt);
+  register_new_node_from_vectorization(vloop_analyzer, vn, val);
+  return VTransformApplyResult::make_vector(vn, _vlen, vn->length_in_bytes());
+}
+
+VTransformApplyResult VTransformElementWiseVectorNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                             const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  Node* first = nodes().at(0);
+  uint  vlen = nodes().length();
+  int   opc  = first->Opcode();
+  BasicType bt = vloop_analyzer.types().velt_basic_type(first);
+
+  if (first->is_Cmp()) {
+    // Cmp + Bool -> VectorMaskCmp
+    // Handled by Bool / VTransformBoolVectorNode, so we do not generate any nodes here.
+    return VTransformApplyResult::make_empty();
+  }
+
+  assert(2 <= req() && req() <= 4, "Must have 1-3 inputs");
+  VectorNode* vn = nullptr;
+  Node* in1 =                find_transformed_input(1, vnode_idx_to_transformed_node);
+  Node* in2 = (req() >= 3) ? find_transformed_input(2, vnode_idx_to_transformed_node) : nullptr;
+  Node* in3 = (req() >= 4) ? find_transformed_input(3, vnode_idx_to_transformed_node) : nullptr;
+
+  if (first->is_CMove()) {
+    assert(req() == 4, "three inputs expected: mask, blend1, blend2");
+    vn = new VectorBlendNode(/* blend1 */ in2, /* blend2 */ in3, /* mask */ in1);
+  } else if (VectorNode::is_convert_opcode(opc)) {
+    assert(first->req() == 2 && req() == 2, "only one input expected");
+    int vopc = VectorCastNode::opcode(opc, in1->bottom_type()->is_vect()->element_basic_type());
+    vn = VectorCastNode::make(vopc, in1, bt, vlen);
+  } else if (VectorNode::can_use_RShiftI_instead_of_URShiftI(first, bt)) {
+    opc = Op_RShiftI;
+    vn = VectorNode::make(opc, in1, in2, vlen, bt);
+  } else if (VectorNode::is_scalar_op_that_returns_int_but_vector_op_returns_long(opc)) {
+    // The scalar operation was a long -> int operation.
+    // However, the vector operation is long -> long.
+    VectorNode* long_vn = VectorNode::make(opc, in1, nullptr, vlen, T_LONG);
+    register_new_node_from_vectorization(vloop_analyzer, long_vn, first);
+    // Cast long -> int, to mimic the scalar long -> int operation.
+    vn = VectorCastNode::make(Op_VectorCastL2X, long_vn, T_INT, vlen);
+  } else if (req() == 3 ||
+             VectorNode::is_scalar_unary_op_with_equal_input_and_output_types(opc)) {
+    assert(!VectorNode::is_roundopD(first) || in2->is_Con(), "rounding mode must be constant");
+    vn = VectorNode::make(opc, in1, in2, vlen, bt); // unary and binary
+  } else {
+    assert(req() == 4, "three inputs expected");
+    assert(opc == Op_FmaD ||
+           opc == Op_FmaF ||
+           opc == Op_SignumF ||
+           opc == Op_SignumD,
+           "element wise operation must be from this list");
+    vn = VectorNode::make(opc, in1, in2, in3, vlen, bt); // ternary
+  }
+
+  register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn);
+  return VTransformApplyResult::make_vector(vn, vlen, vn->length_in_bytes());
+}
+
+VTransformApplyResult VTransformBoolVectorNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  BoolNode* first = nodes().at(0)->as_Bool();
+  uint  vlen = nodes().length();
+  BasicType bt = vloop_analyzer.types().velt_basic_type(first);
+
+  // Cmp + Bool -> VectorMaskCmp
+  VTransformElementWiseVectorNode* vtn_cmp = in(1)->isa_ElementWiseVector();
+  assert(vtn_cmp != nullptr && vtn_cmp->nodes().at(0)->is_Cmp(),
+         "bool vtn expects cmp vtn as input");
+
+  Node* cmp_in1 = vtn_cmp->find_transformed_input(1, vnode_idx_to_transformed_node);
+  Node* cmp_in2 = vtn_cmp->find_transformed_input(2, vnode_idx_to_transformed_node);
+  BoolTest::mask mask = test()._mask;
+
+  PhaseIdealLoop* phase = vloop_analyzer.vloop().phase();
+  ConINode* mask_node  = phase->igvn().intcon((int)mask);
+  const TypeVect* vt = TypeVect::make(bt, vlen);
+  VectorNode* vn = new VectorMaskCmpNode(mask, cmp_in1, cmp_in2, mask_node, vt);
+  register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn);
+  return VTransformApplyResult::make_vector(vn, vlen, vn->vect_type()->length_in_bytes());
+}
+
+VTransformApplyResult VTransformReductionVectorNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                           const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  Node* first = nodes().at(0);
+  uint  vlen = nodes().length();
+  int   opc  = first->Opcode();
+  BasicType bt = first->bottom_type()->basic_type();
+
+  Node* init = find_transformed_input(1, vnode_idx_to_transformed_node);
+  Node* vec  = find_transformed_input(2, vnode_idx_to_transformed_node);
+
+  ReductionNode* vn = ReductionNode::make(opc, nullptr, init, vec, bt);
+  register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn);
+  return VTransformApplyResult::make_vector(vn, vlen, vn->vect_type()->length_in_bytes());
+}
+
+VTransformApplyResult VTransformLoadVectorNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  LoadNode* first = nodes().at(0)->as_Load();
+  uint  vlen = nodes().length();
+  Node* ctrl = first->in(MemNode::Control);
+  Node* mem  = first->in(MemNode::Memory);
+  Node* adr  = first->in(MemNode::Address);
+  int   opc  = first->Opcode();
+  const TypePtr* adr_type = first->adr_type();
+  BasicType bt = vloop_analyzer.types().velt_basic_type(first);
+
+  // Set the memory dependency of the LoadVector as early as possible.
+  // Walk up the memory chain, and ignore any StoreVector that provably
+  // does not have any memory dependency.
+  while (mem->is_StoreVector()) {
+    VPointer p_store(mem->as_Mem(), vloop_analyzer.vloop());
+    if (p_store.overlap_possible_with_any_in(nodes())) {
+      break;
+    } else {
+      mem = mem->in(MemNode::Memory);
+    }
+  }
+
+  LoadVectorNode* vn = LoadVectorNode::make(opc, ctrl, mem, adr, adr_type, vlen, bt,
+                                            control_dependency());
+  DEBUG_ONLY( if (VerifyAlignVector) { vn->set_must_verify_alignment(); } )
+  register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn);
+  return VTransformApplyResult::make_vector(vn, vlen, vn->memory_size());
+}
+
+VTransformApplyResult VTransformStoreVectorNode::apply(const VLoopAnalyzer& vloop_analyzer,
+                                                       const GrowableArray<Node*>& vnode_idx_to_transformed_node) const {
+  StoreNode* first = nodes().at(0)->as_Store();
+  uint  vlen = nodes().length();
+  Node* ctrl = first->in(MemNode::Control);
+  Node* mem  = first->in(MemNode::Memory);
+  Node* adr  = first->in(MemNode::Address);
+  int   opc  = first->Opcode();
+  const TypePtr* adr_type = first->adr_type();
+
+  Node* value = find_transformed_input(MemNode::ValueIn, vnode_idx_to_transformed_node);
+  StoreVectorNode* vn = StoreVectorNode::make(opc, ctrl, mem, adr, adr_type, value, vlen);
+  DEBUG_ONLY( if (VerifyAlignVector) { vn->set_must_verify_alignment(); } )
+  register_new_node_from_vectorization_and_replace_scalar_nodes(vloop_analyzer, vn);
+  return VTransformApplyResult::make_vector(vn, vlen, vn->memory_size());
+}
+
+void VTransformVectorNode::register_new_node_from_vectorization_and_replace_scalar_nodes(const VLoopAnalyzer& vloop_analyzer, Node* vn) const {
+  PhaseIdealLoop* phase = vloop_analyzer.vloop().phase();
+  Node* first = nodes().at(0);
+
+  register_new_node_from_vectorization(vloop_analyzer, vn, first);
+
+  for (int i = 0; i < _nodes.length(); i++) {
+    Node* n = _nodes.at(i);
+    phase->igvn().replace_node(n, vn);
+  }
+}
+
+void VTransformNode::register_new_node_from_vectorization(const VLoopAnalyzer& vloop_analyzer, Node* vn, Node* old_node) const {
+  PhaseIdealLoop* phase = vloop_analyzer.vloop().phase();
+  phase->register_new_node_with_ctrl_of(vn, old_node);
+  phase->igvn()._worklist.push(vn);
+  VectorNode::trace_new_vector(vn, "AutoVectorization");
+}
+
+#ifndef PRODUCT
+void VTransformGraph::print_vtnodes() const {
+  tty->print_cr("\nVTransformGraph::print_vtnodes:");
+  for (int i = 0; i < _vtnodes.length(); i++) {
+    _vtnodes.at(i)->print();
+  }
+}
+
+void VTransformGraph::print_schedule() const {
+  tty->print_cr("\nVTransformGraph::print_schedule:");
+  for (int i = 0; i < _schedule.length(); i++) {
+    tty->print(" %3d: ", i);
+    VTransformNode* vtn = _schedule.at(i);
+    if (vtn == nullptr) {
+      tty->print_cr("nullptr");
+    } else {
+      vtn->print();
+    }
+  }
+}
+
+void VTransformGraph::print_memops_schedule() const {
+  tty->print_cr("\nVTransformGraph::print_memops_schedule:");
+  int i = 0;
+  for_each_memop_in_schedule([&] (MemNode* mem) {
+    tty->print(" %3d: ", i++);
+    mem->dump();
+  });
+}
+
+void VTransformNode::print() const {
+  tty->print("%3d %s (", _idx, name());
+  for (uint i = 0; i < _req; i++) {
+    print_node_idx(_in.at(i));
+  }
+  if ((uint)_in.length() > _req) {
+    tty->print(" |");
+    for (int i = _req; i < _in.length(); i++) {
+      print_node_idx(_in.at(i));
+    }
+  }
+  tty->print(") [");
+  for (int i = 0; i < _out.length(); i++) {
+    print_node_idx(_out.at(i));
+  }
+  tty->print("] ");
+  print_spec();
+  tty->cr();
+}
+
+void VTransformNode::print_node_idx(const VTransformNode* vtn) {
+  if (vtn == nullptr) {
+    tty->print(" _");
+  } else {
+    tty->print(" %d", vtn->_idx);
+  }
+}
+
+void VTransformScalarNode::print_spec() const {
+  tty->print("node[%d %s]", _node->_idx, _node->Name());
+}
+
+void VTransformReplicateNode::print_spec() const {
+  tty->print("vlen=%d element_type=", _vlen);
+  _element_type->dump();
+}
+
+void VTransformShiftCountNode::print_spec() const {
+  tty->print("vlen=%d element_bt=%s mask=%d shift_opcode=%s",
+             _vlen, type2name(_element_bt), _mask,
+             NodeClassNames[_shift_opcode]);
+}
+
+void VTransformPopulateIndexNode::print_spec() const {
+  tty->print("vlen=%d element_bt=%s", _vlen, type2name(_element_bt));
+}
+
+void VTransformVectorNode::print_spec() const {
+  tty->print("%d-pack[", _nodes.length());
+  for (int i = 0; i < _nodes.length(); i++) {
+    Node* n = _nodes.at(i);
+    if (i > 0) {
+      tty->print(", ");
+    }
+    tty->print("%d %s", n->_idx, n->Name());
+  }
+  tty->print("]");
+}
+#endif
diff --git a/src/hotspot/share/opto/vtransform.hpp b/src/hotspot/share/opto/vtransform.hpp
new file mode 100644
index 00000000000..071674533a7
--- /dev/null
+++ b/src/hotspot/share/opto/vtransform.hpp
@@ -0,0 +1,515 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef SHARE_OPTO_VTRANSFORM_HPP
+#define SHARE_OPTO_VTRANSFORM_HPP
+
+#include "opto/node.hpp"
+#include "opto/vectorization.hpp"
+
+// VTransform:
+// - Models the transformation of the scalar loop to vectorized loop:
+//   It is a "C2 subgraph" -> "C2 subgraph" mapping.
+// - The VTransform contains a graph (VTransformGraph), which consists of
+//   many vtnodes (VTransformNode).
+// - Each vtnode models a part of the transformation, and is supposed
+//   to represent the output C2 nodes after the vectorization as closely
+//   as possible.
+//
+// This is the life-cycle of a VTransform:
+// - Construction:
+//   - From SuperWord, with the SuperWordVTransformBuilder.
+//
+// - Future Plans: optimize, if-conversion, etc.
+//
+// - Schedule:
+//   - Compute linearization of the VTransformGraph, into an order that respects
+//     all edges in the graph (bailout if cycle detected).
+//
+// - Apply:
+//   - Changes to the C2 IR are only made once the "apply" method is called.
+//   - Each vtnode generates its corresponding scalar and vector C2 nodes,
+//     possibly replacing old scalar C2 nodes.
+//
+// Future Plans with VTransform:
+// - Cost model: estimate if vectorization is profitable.
+// - Optimizations: moving unordered reductions out of the loop, whih decreases cost.
+// - Pack/Unpack/Shuffle: introduce additional nodes not present in the scalar loop.
+//                        This is difficult to do with the SuperWord packset approach.
+// - If-conversion: convert predicated nodes into CFG.
+
+typedef int VTransformNodeIDX;
+class VTransformNode;
+class VTransformScalarNode;
+class VTransformInputScalarNode;
+class VTransformVectorNode;
+class VTransformElementWiseVectorNode;
+class VTransformBoolVectorNode;
+class VTransformReductionVectorNode;
+
+// Result from VTransformNode::apply
+class VTransformApplyResult {
+private:
+  Node* const _node;
+  const uint _vector_length; // number of elements
+  const uint _vector_width;  // total width in bytes
+
+  VTransformApplyResult(Node* n, uint vector_length, uint vector_width) :
+    _node(n),
+    _vector_length(vector_length),
+    _vector_width(vector_width) {}
+
+public:
+  static VTransformApplyResult make_scalar(Node* n) {
+    return VTransformApplyResult(n, 0, 0);
+  }
+
+  static VTransformApplyResult make_vector(Node* n, uint vector_length, uint vector_width) {
+    assert(vector_length > 0 && vector_width > 0, "must have nonzero size");
+    return VTransformApplyResult(n, vector_length, vector_width);
+  }
+
+  static VTransformApplyResult make_empty() {
+    return VTransformApplyResult(nullptr, 0, 0);
+  }
+
+  Node* node() const { return _node; }
+  uint vector_length() const { return _vector_length; }
+  uint vector_width() const { return _vector_width; }
+  NOT_PRODUCT( void trace(VTransformNode* vtnode) const; )
+};
+
+#ifndef PRODUCT
+// Convenience class for tracing flags.
+class VTransformTrace {
+public:
+  const bool _verbose;
+  const bool _rejections;
+  const bool _align_vector;
+  const bool _info;
+
+  VTransformTrace(const VTrace& vtrace,
+                  const bool is_trace_rejections,
+                  const bool is_trace_align_vector,
+                  const bool is_trace_info) :
+    _verbose     (vtrace.is_trace(TraceAutoVectorizationTag::ALL)),
+    _rejections  (_verbose | is_trace_vtransform(vtrace) | is_trace_rejections),
+    _align_vector(_verbose | is_trace_vtransform(vtrace) | is_trace_align_vector),
+    _info        (_verbose | is_trace_vtransform(vtrace) | is_trace_info) {}
+
+  static bool is_trace_vtransform(const VTrace& vtrace) {
+    return vtrace.is_trace(TraceAutoVectorizationTag::VTRANSFORM);
+  }
+};
+#endif
+
+// VTransformGraph: component of VTransform
+// See description at top of this file.
+class VTransformGraph : public StackObj {
+private:
+  const VLoopAnalyzer& _vloop_analyzer;
+  const VLoop& _vloop;
+
+  NOT_PRODUCT(const VTransformTrace _trace;)
+
+  VTransformNodeIDX _next_idx;
+  GrowableArray<VTransformNode*> _vtnodes;
+
+  // Schedule (linearization) of the graph. We use this to reorder the memory graph
+  // before inserting vector operations.
+  GrowableArray<VTransformNode*> _schedule;
+
+public:
+  VTransformGraph(const VLoopAnalyzer& vloop_analyzer,
+                  Arena& arena
+                  NOT_PRODUCT( COMMA const VTransformTrace trace)) :
+    _vloop_analyzer(vloop_analyzer),
+    _vloop(vloop_analyzer.vloop()),
+    NOT_PRODUCT(_trace(trace) COMMA)
+    _next_idx(0),
+    _vtnodes(&arena, _vloop.estimated_body_length(), 0, nullptr),
+    _schedule(&arena, _vloop.estimated_body_length(), 0, nullptr) {}
+
+  VTransformNodeIDX new_idx() { return _next_idx++; }
+  void add_vtnode(VTransformNode* vtnode);
+  DEBUG_ONLY( bool is_empty() const { return _vtnodes.is_empty(); } )
+  DEBUG_ONLY( bool is_scheduled() const { return _schedule.is_nonempty(); } )
+  const GrowableArray<VTransformNode*>& vtnodes() const { return _vtnodes; }
+
+  bool schedule();
+  void apply_memops_reordering_with_schedule() const;
+  void apply_vectorization_for_each_vtnode(uint& max_vector_length, uint& max_vector_width) const;
+
+private:
+  // VLoop accessors
+  PhaseIdealLoop* phase()     const { return _vloop.phase(); }
+  PhaseIterGVN& igvn()        const { return _vloop.phase()->igvn(); }
+  bool in_bb(const Node* n)   const { return _vloop.in_bb(n); }
+
+  void collect_nodes_without_req_or_dependency(GrowableArray<VTransformNode*>& stack) const;
+
+  template<typename Callback>
+  void for_each_memop_in_schedule(Callback callback) const;
+
+#ifndef PRODUCT
+  void print_vtnodes() const;
+  void print_schedule() const;
+  void print_memops_schedule() const;
+  void trace_schedule_cycle(const GrowableArray<VTransformNode*>& stack,
+                            const VectorSet& pre_visited,
+                            const VectorSet& post_visited) const;
+#endif
+};
+
+// VTransform: models the transformation of the scalar loop to vectorized loop.
+// It is a "C2 subgraph" to "C2 subgraph" mapping.
+// See description at top of this file.
+class VTransform : public StackObj {
+private:
+  const VLoopAnalyzer& _vloop_analyzer;
+  const VLoop& _vloop;
+
+  NOT_PRODUCT(const VTransformTrace _trace;)
+
+  // Everything in the vtransform is allocated from this arena, including all vtnodes.
+  Arena _arena;
+
+  VTransformGraph _graph;
+
+  // Memory reference, and the alignment width (aw) for which we align the main-loop,
+  // by adjusting the pre-loop limit.
+  MemNode const* _mem_ref_for_main_loop_alignment;
+  int _aw_for_main_loop_alignment;
+
+public:
+  VTransform(const VLoopAnalyzer& vloop_analyzer,
+             MemNode const* mem_ref_for_main_loop_alignment,
+             int aw_for_main_loop_alignment
+             NOT_PRODUCT( COMMA const VTransformTrace trace)
+             ) :
+    _vloop_analyzer(vloop_analyzer),
+    _vloop(vloop_analyzer.vloop()),
+    NOT_PRODUCT(_trace(trace) COMMA)
+    _arena(mtCompiler),
+    _graph(_vloop_analyzer, _arena NOT_PRODUCT(COMMA _trace)),
+    _mem_ref_for_main_loop_alignment(mem_ref_for_main_loop_alignment),
+    _aw_for_main_loop_alignment(aw_for_main_loop_alignment) {}
+
+  const VLoopAnalyzer& vloop_analyzer() const { return _vloop_analyzer; }
+  Arena* arena() { return &_arena; }
+  DEBUG_ONLY( bool has_graph() const { return !_graph.is_empty(); } )
+  VTransformGraph& graph() { return _graph; }
+
+  bool schedule() { return _graph.schedule(); }
+  void apply();
+
+private:
+  // VLoop accessors
+  PhaseIdealLoop* phase()     const { return _vloop.phase(); }
+  PhaseIterGVN& igvn()        const { return _vloop.phase()->igvn(); }
+  IdealLoopTree* lpt()        const { return _vloop.lpt(); }
+  CountedLoopNode* cl()       const { return _vloop.cl(); }
+  int iv_stride()             const { return cl()->stride_con(); }
+
+  // VLoopVPointers accessors
+  const VPointer& vpointer(const MemNode* mem) const {
+    return _vloop_analyzer.vpointers().vpointer(mem);
+  }
+
+  // Ensure that the main loop vectors are aligned by adjusting the pre loop limit.
+  void determine_mem_ref_and_aw_for_main_loop_alignment();
+  void adjust_pre_loop_limit_to_align_main_loop_vectors();
+
+  void apply_vectorization() const;
+};
+
+// The vtnodes (VTransformNode) resemble the C2 IR Nodes, and model a part of the
+// VTransform. Many such vtnodes make up the VTransformGraph. The vtnodes represent
+// the resulting scalar and vector nodes as closely as possible.
+// See description at top of this file.
+class VTransformNode : public ArenaObj {
+public:
+  const VTransformNodeIDX _idx;
+
+private:
+  // _in is split into required inputs (_req), and additional dependencies.
+  const uint _req;
+  GrowableArray<VTransformNode*> _in;
+  GrowableArray<VTransformNode*> _out;
+
+public:
+  VTransformNode(VTransform& vtransform, const uint req) :
+    _idx(vtransform.graph().new_idx()),
+    _req(req),
+    _in(vtransform.arena(),  req, req, nullptr),
+    _out(vtransform.arena(), 4, 0, nullptr)
+  {
+    vtransform.graph().add_vtnode(this);
+  }
+
+  void set_req(uint i, VTransformNode* n) {
+    assert(i < _req, "must be a req");
+    assert(_in.at(i) == nullptr && n != nullptr, "only set once");
+    _in.at_put(i, n);
+    n->add_out(this);
+  }
+
+  void swap_req(uint i, uint j) {
+    assert(i < _req, "must be a req");
+    assert(j < _req, "must be a req");
+    VTransformNode* tmp = _in.at(i);
+    _in.at_put(i, _in.at(j));
+    _in.at_put(j, tmp);
+  }
+
+  void add_dependency(VTransformNode* n) {
+    assert(n != nullptr, "no need to add nullptr");
+    _in.push(n);
+    n->add_out(this);
+  }
+
+  void add_out(VTransformNode* n) {
+    _out.push(n);
+  }
+
+  uint req() const { return _req; }
+  VTransformNode* in(int i) const { return _in.at(i); }
+  int outs() const { return _out.length(); }
+  VTransformNode* out(int i) const { return _out.at(i); }
+
+  bool has_req_or_dependency() const {
+    for (int i = 0; i < _in.length(); i++) {
+      if (_in.at(i) != nullptr) { return true; }
+    }
+    return false;
+  }
+
+  virtual VTransformScalarNode* isa_Scalar() { return nullptr; }
+  virtual VTransformInputScalarNode* isa_InputScalar() { return nullptr; }
+  virtual VTransformVectorNode* isa_Vector() { return nullptr; }
+  virtual VTransformElementWiseVectorNode* isa_ElementWiseVector() { return nullptr; }
+  virtual VTransformBoolVectorNode* isa_BoolVector() { return nullptr; }
+  virtual VTransformReductionVectorNode* isa_ReductionVector() { return nullptr; }
+
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const = 0;
+
+  Node* find_transformed_input(int i, const GrowableArray<Node*>& vnode_idx_to_transformed_node) const;
+
+  void register_new_node_from_vectorization(const VLoopAnalyzer& vloop_analyzer, Node* vn, Node* old_node) const;
+
+  NOT_PRODUCT(virtual const char* name() const = 0;)
+  NOT_PRODUCT(void print() const;)
+  NOT_PRODUCT(virtual void print_spec() const {};)
+  NOT_PRODUCT(static void print_node_idx(const VTransformNode* vtn);)
+};
+
+// Identity transform for scalar nodes.
+class VTransformScalarNode : public VTransformNode {
+private:
+  Node* _node;
+public:
+  VTransformScalarNode(VTransform& vtransform, Node* n) :
+    VTransformNode(vtransform, n->req()), _node(n) {}
+  Node* node() const { return _node; }
+  virtual VTransformScalarNode* isa_Scalar() override { return this; }
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "Scalar"; };)
+  NOT_PRODUCT(virtual void print_spec() const override;)
+};
+
+// Wrapper node for nodes outside the loop that are inputs to nodes in the loop.
+// Since we want the loop-internal nodes to be able to reference all inputs as vtnodes,
+// we must wrap the inputs that are outside the loop into special vtnodes, too.
+class VTransformInputScalarNode : public VTransformScalarNode {
+public:
+  VTransformInputScalarNode(VTransform& vtransform, Node* n) :
+    VTransformScalarNode(vtransform, n) {}
+  virtual VTransformInputScalarNode* isa_InputScalar() override { return this; }
+  NOT_PRODUCT(virtual const char* name() const override { return "InputScalar"; };)
+};
+
+// Transform produces a ReplicateNode, replicating the input to all vector lanes.
+class VTransformReplicateNode : public VTransformNode {
+private:
+  int _vlen;
+  const Type* _element_type;
+public:
+  VTransformReplicateNode(VTransform& vtransform, int vlen, const Type* element_type) :
+    VTransformNode(vtransform, 2), _vlen(vlen), _element_type(element_type) {}
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "Replicate"; };)
+  NOT_PRODUCT(virtual void print_spec() const override;)
+};
+
+// Transform introduces a scalar ConvI2LNode that was not previously in the C2 graph.
+class VTransformConvI2LNode : public VTransformNode {
+public:
+  VTransformConvI2LNode(VTransform& vtransform) : VTransformNode(vtransform, 2) {}
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "ConvI2L"; };)
+};
+
+// Transform introduces a shift-count node that truncates the shift count for a vector shift.
+class VTransformShiftCountNode : public VTransformNode {
+private:
+  int _vlen;
+  const BasicType _element_bt;
+  juint _mask;
+  int _shift_opcode;
+public:
+  VTransformShiftCountNode(VTransform& vtransform, int vlen, BasicType element_bt, juint mask, int shift_opcode) :
+    VTransformNode(vtransform, 2), _vlen(vlen), _element_bt(element_bt), _mask(mask), _shift_opcode(shift_opcode) {}
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "ShiftCount"; };)
+  NOT_PRODUCT(virtual void print_spec() const override;)
+};
+
+// Transform introduces a PopulateIndex node: [phi, phi+1, phi+2, phi+3, ...].
+class VTransformPopulateIndexNode : public VTransformNode {
+private:
+  int _vlen;
+  const BasicType _element_bt;
+public:
+  VTransformPopulateIndexNode(VTransform& vtransform, int vlen, const BasicType element_bt) :
+    VTransformNode(vtransform, 2), _vlen(vlen), _element_bt(element_bt) {}
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "PopulateIndex"; };)
+  NOT_PRODUCT(virtual void print_spec() const override;)
+};
+
+// Base class for all vector vtnodes.
+class VTransformVectorNode : public VTransformNode {
+private:
+  GrowableArray<Node*> _nodes;
+public:
+  VTransformVectorNode(VTransform& vtransform, const uint req, const uint number_of_nodes) :
+    VTransformNode(vtransform, req), _nodes(vtransform.arena(), number_of_nodes, number_of_nodes, nullptr) {}
+
+  void set_nodes(const Node_List* pack) {
+    for (uint k = 0; k < pack->size(); k++) {
+      _nodes.at_put(k, pack->at(k));
+    }
+  }
+
+  const GrowableArray<Node*>& nodes() const { return _nodes; }
+  virtual VTransformVectorNode* isa_Vector() override { return this; }
+  void register_new_node_from_vectorization_and_replace_scalar_nodes(const VLoopAnalyzer& vloop_analyzer, Node* vn) const;
+  NOT_PRODUCT(virtual void print_spec() const override;)
+};
+
+// Catch all for all element-wise vector operations.
+class VTransformElementWiseVectorNode : public VTransformVectorNode {
+public:
+  VTransformElementWiseVectorNode(VTransform& vtransform, uint req, uint number_of_nodes) :
+    VTransformVectorNode(vtransform, req, number_of_nodes) {}
+  virtual VTransformElementWiseVectorNode* isa_ElementWiseVector() override { return this; }
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "ElementWiseVector"; };)
+};
+
+struct VTransformBoolTest {
+  const BoolTest::mask _mask;
+  const bool _is_negated;
+
+  VTransformBoolTest(const BoolTest::mask mask, bool is_negated) :
+    _mask(mask), _is_negated(is_negated) {}
+};
+
+class VTransformBoolVectorNode : public VTransformElementWiseVectorNode {
+private:
+  const VTransformBoolTest _test;
+public:
+  VTransformBoolVectorNode(VTransform& vtransform, uint number_of_nodes, VTransformBoolTest test) :
+    VTransformElementWiseVectorNode(vtransform, 2, number_of_nodes), _test(test) {}
+  VTransformBoolTest test() const { return _test; }
+  virtual VTransformBoolVectorNode* isa_BoolVector() override { return this; }
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "BoolVector"; };)
+};
+
+class VTransformReductionVectorNode : public VTransformVectorNode {
+public:
+  // req = 3 -> [ctrl, scalar init, vector]
+  VTransformReductionVectorNode(VTransform& vtransform, uint number_of_nodes) :
+    VTransformVectorNode(vtransform, 3, number_of_nodes) {}
+  virtual VTransformReductionVectorNode* isa_ReductionVector() override { return this; }
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "ReductionVector"; };)
+};
+
+class VTransformLoadVectorNode : public VTransformVectorNode {
+public:
+  // req = 3 -> [ctrl, mem, adr]
+  VTransformLoadVectorNode(VTransform& vtransform, uint number_of_nodes) :
+    VTransformVectorNode(vtransform, 3, number_of_nodes) {}
+  LoadNode::ControlDependency control_dependency() const;
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "LoadVector"; };)
+};
+
+class VTransformStoreVectorNode : public VTransformVectorNode {
+public:
+  // req = 4 -> [ctrl, mem, adr, val]
+  VTransformStoreVectorNode(VTransform& vtransform, uint number_of_nodes) :
+    VTransformVectorNode(vtransform, 4, number_of_nodes) {}
+  virtual VTransformApplyResult apply(const VLoopAnalyzer& vloop_analyzer,
+                                      const GrowableArray<Node*>& vnode_idx_to_transformed_node) const override;
+  NOT_PRODUCT(virtual const char* name() const override { return "StoreVector"; };)
+};
+
+// Invoke callback on all memops, in the order of the schedule.
+template<typename Callback>
+void VTransformGraph::for_each_memop_in_schedule(Callback callback) const {
+  assert(_schedule.length() == _vtnodes.length(), "schedule was computed");
+
+  for (int i = 0; i < _schedule.length(); i++) {
+    VTransformNode* vtn = _schedule.at(i);
+
+    // We can ignore input nodes, they are outside the loop.
+    if (vtn->isa_InputScalar() != nullptr) { continue; }
+
+    VTransformScalarNode* scalar = vtn->isa_Scalar();
+    if (scalar != nullptr && scalar->node()->is_Mem()) {
+      callback(scalar->node()->as_Mem());
+    }
+
+    VTransformVectorNode* vector = vtn->isa_Vector();
+    if (vector != nullptr && vector->nodes().at(0)->is_Mem()) {
+      for (int j = 0; j < vector->nodes().length(); j++) {
+        callback(vector->nodes().at(j)->as_Mem());
+      }
+    }
+  }
+}
+
+#endif // SHARE_OPTO_VTRANSFORM_HPP
diff --git a/src/hotspot/share/prims/jni.cpp b/src/hotspot/share/prims/jni.cpp
index b6a4443a8c7..ae040d66138 100644
--- a/src/hotspot/share/prims/jni.cpp
+++ b/src/hotspot/share/prims/jni.cpp
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012 Red Hat, Inc.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024 Red Hat, Inc.
  * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -3775,7 +3775,7 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae
 
   // Create a thread and mark it as attaching so it will be skipped by the
   // ThreadsListEnumerator - see CR 6404306
-  JavaThread* thread = new JavaThread(true);
+  JavaThread* thread = JavaThread::create_attaching_thread();
 
   // Set correct safepoint info. The thread is going to call into Java when
   // initializing the Java level thread object. Hence, the correct state must
diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp
index 500036febab..d55c8a6be65 100644
--- a/src/hotspot/share/prims/jvm.cpp
+++ b/src/hotspot/share/prims/jvm.cpp
@@ -113,6 +113,9 @@
 #if INCLUDE_MANAGEMENT
 #include "services/finalizerService.hpp"
 #endif
+#ifdef LINUX
+#include "osContainer_linux.hpp"
+#endif
 
 #include <errno.h>
 
@@ -496,6 +499,15 @@ JVM_LEAF(jboolean, JVM_IsUseContainerSupport(void))
   return JNI_FALSE;
 JVM_END
 
+JVM_LEAF(jboolean, JVM_IsContainerized(void))
+#ifdef LINUX
+  if (OSContainer::is_containerized()) {
+    return JNI_TRUE;
+  }
+#endif
+  return JNI_FALSE;
+JVM_END
+
 // java.lang.Throwable //////////////////////////////////////////////////////
 
 JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
@@ -3729,7 +3741,7 @@ JVM_ENTRY(void, JVM_LogLambdaFormInvoker(JNIEnv *env, jstring line))
     }
     if (ClassListWriter::is_enabled()) {
       ClassListWriter w;
-      w.stream()->print_cr("%s %s", LAMBDA_FORM_TAG, c_line);
+      w.stream()->print_cr("%s %s", ClassListParser::lambda_form_tag(), c_line);
     }
   }
 #endif // INCLUDE_CDS
diff --git a/src/hotspot/share/prims/jvmtiEnvBase.cpp b/src/hotspot/share/prims/jvmtiEnvBase.cpp
index dc02e8e5cf0..1a6aec4e438 100644
--- a/src/hotspot/share/prims/jvmtiEnvBase.cpp
+++ b/src/hotspot/share/prims/jvmtiEnvBase.cpp
@@ -2339,7 +2339,7 @@ JvmtiModuleClosure::get_all_modules(JvmtiEnv* env, jint* module_count_ptr, jobje
   }
 
   // Iterate over all the modules loaded to the system.
-  ClassLoaderDataGraph::modules_do(&do_module);
+  ClassLoaderDataGraph::modules_do_keepalive(&do_module);
 
   jint len = _tbl->length();
   guarantee(len > 0, "at least one module must be present");
diff --git a/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp b/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
index 8d6a0736afe..c2e970bae73 100644
--- a/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
+++ b/src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
@@ -105,7 +105,7 @@ JvmtiGetLoadedClasses::getLoadedClasses(JvmtiEnv *env, jint* classCountPtr, jcla
     // Iterate through all classes in ClassLoaderDataGraph
     // and collect them using the LoadedClassesClosure
     MutexLocker mcld(ClassLoaderDataGraph_lock);
-    ClassLoaderDataGraph::loaded_classes_do(&closure);
+    ClassLoaderDataGraph::loaded_classes_do_keepalive(&closure);
   }
 
   return closure.get_result(env, classCountPtr, classesPtr);
diff --git a/src/hotspot/share/prims/unsafe.cpp b/src/hotspot/share/prims/unsafe.cpp
index 880f1f6ab5d..942d9100c29 100644
--- a/src/hotspot/share/prims/unsafe.cpp
+++ b/src/hotspot/share/prims/unsafe.cpp
@@ -55,6 +55,7 @@
 #include "runtime/threadSMR.hpp"
 #include "runtime/vmOperations.hpp"
 #include "runtime/vm_version.hpp"
+#include "sanitizers/ub.hpp"
 #include "services/threadService.hpp"
 #include "utilities/align.hpp"
 #include "utilities/copy.hpp"
@@ -242,6 +243,9 @@ class MemoryAccess : StackObj {
     return normalize_for_read(*addr());
   }
 
+  // we use this method at some places for writing to 0 e.g. to cause a crash;
+  // ubsan does not know that this is the desired behavior
+  ATTRIBUTE_NO_UBSAN
   void put(T x) {
     GuardUnsafeAccess guard(_thread);
     *addr() = normalize_for_write(x);
diff --git a/src/hotspot/share/prims/upcallLinker.cpp b/src/hotspot/share/prims/upcallLinker.cpp
index 4b924b5302d..b02746911a8 100644
--- a/src/hotspot/share/prims/upcallLinker.cpp
+++ b/src/hotspot/share/prims/upcallLinker.cpp
@@ -48,7 +48,6 @@ extern struct JavaVM_ main_vm;
 struct UpcallContext {
   Thread* attachedThread;
 
-  UpcallContext() {} // Explicit constructor to address XL C compiler bug.
   ~UpcallContext() {
     if (attachedThread != nullptr) {
       JavaVM_ *vm = (JavaVM *)(&main_vm);
diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp
index a45be186aa4..a799d5b5de4 100644
--- a/src/hotspot/share/prims/whitebox.cpp
+++ b/src/hotspot/share/prims/whitebox.cpp
@@ -29,6 +29,7 @@
 #include "cds/filemap.hpp"
 #include "cds/heapShared.hpp"
 #include "cds/metaspaceShared.hpp"
+#include "classfile/classLoader.hpp"
 #include "classfile/classLoaderDataGraph.hpp"
 #include "classfile/classLoaderStats.hpp"
 #include "classfile/classPrinter.hpp"
@@ -607,7 +608,7 @@ WB_ENTRY(jintArray, WB_G1MemoryNodeIds(JNIEnv* env, jobject o))
   THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1MemoryNodeIds: G1 GC is not enabled");
 WB_END
 
-class OldRegionsLivenessClosure: public HeapRegionClosure {
+class OldRegionsLivenessClosure: public G1HeapRegionClosure {
 
  private:
   const int _liveness;
@@ -1114,6 +1115,10 @@ bool WhiteBox::compile_method(Method* method, int comp_level, int bci, JavaThrea
   return false;
 }
 
+size_t WhiteBox::get_in_use_monitor_count() {
+  return ObjectSynchronizer::_in_use_list.count();
+}
+
 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
@@ -1849,6 +1854,10 @@ WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj))
   return (jboolean) obj_oop->mark().has_monitor();
 WB_END
 
+WB_ENTRY(jlong, WB_getInUseMonitorCount(JNIEnv* env, jobject wb))
+  return (jlong) WhiteBox::get_in_use_monitor_count();
+WB_END
+
 WB_ENTRY(jint, WB_getLockStackCapacity(JNIEnv* env))
   return (jint) LockStack::CAPACITY;
 WB_END
@@ -2115,7 +2124,10 @@ WB_END
 
 WB_ENTRY(jboolean, WB_IsCDSIncluded(JNIEnv* env))
 #if INCLUDE_CDS
-  return true;
+  // An exploded build inhibits use of CDS. Therefore, for the
+  // purpose of testing, the JVM can be treated as not having CDS
+  // built in at all.
+  return ClassLoader::has_jrt_entry();
 #else
   return false;
 #endif // INCLUDE_CDS
@@ -2653,6 +2665,11 @@ WB_ENTRY(void, WB_CleanMetaspaces(JNIEnv* env, jobject target))
   ClassLoaderDataGraph::safepoint_and_clean_metaspaces();
 WB_END
 
+// Reports resident set size (RSS) in bytes
+WB_ENTRY(jlong, WB_Rss(JNIEnv* env, jobject o))
+  return os::rss();
+WB_END
+
 #define CC (char*)
 
 static JNINativeMethod methods[] = {
@@ -2835,6 +2852,7 @@ static JNINativeMethod methods[] = {
                                                       (void*)&WB_AddModuleExportsToAll },
   {CC"deflateIdleMonitors", CC"()Z",                  (void*)&WB_DeflateIdleMonitors },
   {CC"isMonitorInflated0", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated  },
+  {CC"getInUseMonitorCount", CC"()J", (void*)&WB_getInUseMonitorCount  },
   {CC"getLockStackCapacity", CC"()I",                 (void*)&WB_getLockStackCapacity },
   {CC"supportsRecursiveLightweightLocking", CC"()Z",  (void*)&WB_supportsRecursiveLightweightLocking },
   {CC"forceSafepoint",     CC"()V",                   (void*)&WB_ForceSafepoint     },
@@ -2940,6 +2958,7 @@ static JNINativeMethod methods[] = {
   {CC"setVirtualThreadsNotifyJvmtiMode", CC"(Z)Z",    (void*)&WB_SetVirtualThreadsNotifyJvmtiMode},
   {CC"preTouchMemory",  CC"(JJ)V",                    (void*)&WB_PreTouchMemory},
   {CC"cleanMetaspaces", CC"()V",                      (void*)&WB_CleanMetaspaces},
+  {CC"rss", CC"()J",                                  (void*)&WB_Rss},
 };
 
 
diff --git a/src/hotspot/share/prims/whitebox.hpp b/src/hotspot/share/prims/whitebox.hpp
index a88f8d21843..c5072b97d4f 100644
--- a/src/hotspot/share/prims/whitebox.hpp
+++ b/src/hotspot/share/prims/whitebox.hpp
@@ -68,6 +68,7 @@ class WhiteBox : public AllStatic {
     JNINativeMethod* method_array, int method_count);
   static void register_extended(JNIEnv* env, jclass wbclass, JavaThread* thread);
   static bool compile_method(Method* method, int comp_level, int bci, JavaThread* THREAD);
+  static size_t get_in_use_monitor_count();
 #ifdef LINUX
   static bool validate_cgroup(const char* proc_cgroups, const char* proc_self_cgroup, const char* proc_self_mountinfo, u1* cg_flags);
 #endif
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
index 6c98f379db0..d353c5a162a 100644
--- a/src/hotspot/share/runtime/arguments.cpp
+++ b/src/hotspot/share/runtime/arguments.cpp
@@ -34,6 +34,7 @@
 #include "compiler/compilerDefinitions.hpp"
 #include "gc/shared/gcArguments.hpp"
 #include "gc/shared/gcConfig.hpp"
+#include "gc/shared/genArguments.hpp"
 #include "gc/shared/stringdedup/stringDedup.hpp"
 #include "gc/shared/tlab_globals.hpp"
 #include "jvm.h"
@@ -501,17 +502,10 @@ static SpecialFlag const special_jvm_flags[] = {
   { "DynamicDumpSharedSpaces",      JDK_Version::jdk(18), JDK_Version::jdk(19), JDK_Version::undefined() },
   { "RequireSharedSpaces",          JDK_Version::jdk(18), JDK_Version::jdk(19), JDK_Version::undefined() },
   { "UseSharedSpaces",              JDK_Version::jdk(18), JDK_Version::jdk(19), JDK_Version::undefined() },
-  { "RegisterFinalizersAtInit",     JDK_Version::jdk(22), JDK_Version::jdk(23), JDK_Version::jdk(24) },
   { "DontYieldALot",                JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
-  { "OldSize",                      JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
   { "PreserveAllAnnotations",       JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
   { "UseNotificationThread",        JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
-  { "UseEmptySlotsInSupers",        JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
-#if defined(X86)
-  { "UseRTMLocking",                JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
-  { "UseRTMDeopt",                  JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
-  { "RTMRetryCount",                JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
-#endif // X86
+  { "LockingMode",                  JDK_Version::jdk(24), JDK_Version::jdk(26), JDK_Version::jdk(27) },
   // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in:
   { "CreateMinidumpOnCrash",        JDK_Version::jdk(9),  JDK_Version::undefined(), JDK_Version::undefined() },
 
@@ -519,32 +513,16 @@ static SpecialFlag const special_jvm_flags[] = {
 
   { "MetaspaceReclaimPolicy",       JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::undefined() },
 
-  { "G1ConcRefinementGreenZone",    JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) },
-  { "G1ConcRefinementYellowZone",   JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) },
-  { "G1ConcRefinementRedZone",      JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) },
-  { "G1ConcRefinementThresholdStep", JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) },
-  { "G1UseAdaptiveConcRefinement",  JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) },
-  { "G1ConcRefinementServiceIntervalMillis", JDK_Version::undefined(), JDK_Version::jdk(20), JDK_Version::jdk(24) },
-
-  { "G1ConcRSLogCacheSize",         JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::jdk(24) },
-  { "G1ConcRSHotCardLimit",         JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::jdk(24) },
-  { "RefDiscoveryPolicy",           JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::jdk(24) },
-
-  { "AdaptiveSizePolicyCollectionCostMargin",   JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "MaxGCMinorPauseMillis",        JDK_Version::jdk(8), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "MaxRAMFraction",               JDK_Version::jdk(10),  JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "MinRAMFraction",               JDK_Version::jdk(10),  JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "InitialRAMFraction",           JDK_Version::jdk(10),  JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "DefaultMaxRAMFraction",        JDK_Version::jdk(8),  JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "TLABStats",                    JDK_Version::jdk(12), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "GCLockerEdenExpansionPercent", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "NUMAPageScanRate",             JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "ProcessDistributionStride",    JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-
-  { "ParallelOldDeadWoodLimiterMean",   JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "ParallelOldDeadWoodLimiterStdDev", JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "UseNeon",                      JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) },
-  { "ScavengeBeforeFullGC",         JDK_Version::undefined(), JDK_Version::jdk(23), JDK_Version::jdk(24) },
+  { "UseEmptySlotsInSupers",        JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
+  { "OldSize",                      JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
+#if defined(X86)
+  { "UseRTMLocking",                JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
+  { "UseRTMDeopt",                  JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
+  { "RTMRetryCount",                JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::jdk(25) },
+#endif // X86
+
+  { "HeapFirstMaximumCompactionCount", JDK_Version::undefined(), JDK_Version::jdk(24), JDK_Version::jdk(25) },
+  { "UseVtableBasedCHA",               JDK_Version::undefined(), JDK_Version::jdk(24), JDK_Version::jdk(25) },
 #ifdef ASSERT
   { "DummyObsoleteTestFlag",        JDK_Version::undefined(), JDK_Version::jdk(18), JDK_Version::undefined() },
 #endif
@@ -775,7 +753,7 @@ static bool set_bool_flag(JVMFlag* flag, bool value, JVMFlagOrigin origin) {
 
 static bool set_fp_numeric_flag(JVMFlag* flag, const char* value, JVMFlagOrigin origin) {
   // strtod allows leading whitespace, but our flag format does not.
-  if (*value == '\0' || isspace(*value)) {
+  if (*value == '\0' || isspace((unsigned char) *value)) {
     return false;
   }
   char* end;
@@ -1205,13 +1183,13 @@ bool Arguments::process_settings_file(const char* file_name, bool should_exist,
         if (c == '\n') in_comment = false;
       } else {
         if (c == '#') in_comment = true;
-        else if (!isspace(c)) {
+        else if (!isspace((unsigned char) c)) {
           in_white_space = false;
           token[pos++] = checked_cast<char>(c);
         }
       }
     } else {
-      if (c == '\n' || (!in_quote && isspace(c))) {
+      if (c == '\n' || (!in_quote && isspace((unsigned char) c))) {
         // token ends at newline, or at unquoted whitespace
         // this allows a way to include spaces in string-valued options
         token[pos] = '\0';
@@ -1847,14 +1825,6 @@ bool Arguments::check_vm_args_consistency() {
                 "LockingMode == 0 (LM_MONITOR) is not fully implemented on this architecture\n");
     return false;
   }
-#endif
-#if defined(X86) && !defined(ZERO)
-  if (LockingMode == LM_MONITOR && UseRTMForStackLocks) {
-    jio_fprintf(defaultStream::error_stream(),
-                "LockingMode == 0 (LM_MONITOR) and -XX:+UseRTMForStackLocks are mutually exclusive\n");
-
-    return false;
-  }
 #endif
   if (VerifyHeavyMonitors && LockingMode != LM_MONITOR) {
     jio_fprintf(defaultStream::error_stream(),
@@ -3176,7 +3146,7 @@ jint Arguments::parse_options_buffer(const char* name, char* buffer, const size_
   // parse all options
   while (rd < buffer_end) {
     // skip leading white space from the input string
-    while (rd < buffer_end && isspace(*rd)) {
+    while (rd < buffer_end && isspace((unsigned char) *rd)) {
       rd++;
     }
 
@@ -3189,7 +3159,7 @@ jint Arguments::parse_options_buffer(const char* name, char* buffer, const size_
 
     // Tokens are strings of non white space characters separated
     // by one or more white spaces.
-    while (rd < buffer_end && !isspace(*rd)) {
+    while (rd < buffer_end && !isspace((unsigned char) *rd)) {
       if (*rd == '\'' || *rd == '"') {      // handle a quoted string
         int quote = *rd;                    // matching quote to look for
         rd++;                               // don't copy open quote
@@ -3764,6 +3734,13 @@ jint Arguments::apply_ergo() {
   }
 #endif // COMPILER2_OR_JVMCI
 
+  if (log_is_enabled(Info, perf, class, link)) {
+    if (!UsePerfData) {
+      warning("Disabling -Xlog:perf+class+link since UsePerfData is turned off.");
+      LogConfiguration::configure_stdout(LogLevel::Off, false, LOG_TAGS(perf, class, link));
+    }
+  }
+
   if (FLAG_IS_CMDLINE(DiagnoseSyncOnValueBasedClasses)) {
     if (DiagnoseSyncOnValueBasedClasses == ObjectSynchronizer::LOG_WARNING && !log_is_enabled(Info, valuebasedclasses)) {
       LogConfiguration::configure_stdout(LogLevel::Info, true, LOG_TAGS(valuebasedclasses));
diff --git a/src/hotspot/share/runtime/deoptimization.cpp b/src/hotspot/share/runtime/deoptimization.cpp
index 17487688445..cf82ad7c027 100644
--- a/src/hotspot/share/runtime/deoptimization.cpp
+++ b/src/hotspot/share/runtime/deoptimization.cpp
@@ -2076,8 +2076,7 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* current, jint tr
     gather_statistics(reason, action, trap_bc);
 
     // Ensure that we can record deopt. history:
-    // Need MDO to record RTM code generation state.
-    bool create_if_missing = ProfileTraps RTM_OPT_ONLY( || UseRTMLocking );
+    bool create_if_missing = ProfileTraps;
 
     methodHandle profiled_method;
 #if INCLUDE_JVMCI
@@ -2425,16 +2424,6 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* current, jint tr
           pdata->set_trap_state(tstate1);
       }
 
-#if INCLUDE_RTM_OPT
-      // Restart collecting RTM locking abort statistic if the method
-      // is recompiled for a reason other than RTM state change.
-      // Assume that in new recompiled code the statistic could be different,
-      // for example, due to different inlining.
-      if ((reason != Reason_rtm_state_change) && (trap_mdo != nullptr) &&
-          UseRTMDeopt && (nm->rtm_state() != ProfileRTM)) {
-        trap_mdo->atomic_set_rtm_state(ProfileRTM);
-      }
-#endif
       // For code aging we count traps separately here, using make_not_entrant()
       // as a guard against simultaneous deopts in multiple threads.
       if (reason == Reason_tenured && trap_mdo != nullptr) {
@@ -2724,7 +2713,6 @@ const char* Deoptimization::_trap_reason_name[] = {
   "speculate_class_check",
   "speculate_null_check",
   "speculate_null_assert",
-  "rtm_state_change",
   "unstable_if",
   "unstable_fused_if",
   "receiver_constraint",
diff --git a/src/hotspot/share/runtime/deoptimization.hpp b/src/hotspot/share/runtime/deoptimization.hpp
index 61e85d19fd7..0a2bafb3830 100644
--- a/src/hotspot/share/runtime/deoptimization.hpp
+++ b/src/hotspot/share/runtime/deoptimization.hpp
@@ -113,7 +113,6 @@ class Deoptimization : AllStatic {
     Reason_speculate_class_check, // saw unexpected object class from type speculation
     Reason_speculate_null_check,  // saw unexpected null from type speculation
     Reason_speculate_null_assert, // saw unexpected null from type speculation
-    Reason_rtm_state_change,      // rtm state change detected
     Reason_unstable_if,           // a branch predicted always false was taken
     Reason_unstable_fused_if,     // fused two ifs that had each one untaken branch. One is now taken.
     Reason_receiver_constraint,   // receiver subtype check failed
diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp
index 2cd7371909d..ad2e755e698 100644
--- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp
+++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp
@@ -378,20 +378,6 @@ JVMFlag::Error NodeLimitFudgeFactorConstraintFunc(intx value, bool verbose) {
 }
 #endif // COMPILER2
 
-JVMFlag::Error RTMTotalCountIncrRateConstraintFunc(int value, bool verbose) {
-#if INCLUDE_RTM_OPT
-  if (UseRTMLocking && !is_power_of_2(RTMTotalCountIncrRate)) {
-    JVMFlag::printError(verbose,
-                        "RTMTotalCountIncrRate (%d) must be "
-                        "a power of 2, resetting it to 64\n",
-                        RTMTotalCountIncrRate);
-    FLAG_SET_DEFAULT(RTMTotalCountIncrRate, 64);
-  }
-#endif
-
-  return JVMFlag::SUCCESS;
-}
-
 #ifdef COMPILER2
 JVMFlag::Error LoopStripMiningIterConstraintFunc(uintx value, bool verbose) {
   if (UseCountedLoopSafepoints && LoopStripMiningIter == 0) {
diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.hpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.hpp
index 60adf4903a3..cfca8ecf8ee 100644
--- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.hpp
+++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.hpp
@@ -49,7 +49,6 @@
   f(uint,  TypeProfileLevelConstraintFunc)              \
   f(uint,  VerifyIterativeGVNConstraintFunc)            \
   f(intx,  InitArrayShortSizeConstraintFunc)            \
-  f(int ,  RTMTotalCountIncrRateConstraintFunc)         \
   f(ccstrlist, DisableIntrinsicConstraintFunc)          \
   f(ccstrlist, ControlIntrinsicConstraintFunc)          \
 COMPILER2_PRESENT(                                      \
diff --git a/src/hotspot/share/runtime/frame.cpp b/src/hotspot/share/runtime/frame.cpp
index 8f5d2ad4acb..1aed46d5880 100644
--- a/src/hotspot/share/runtime/frame.cpp
+++ b/src/hotspot/share/runtime/frame.cpp
@@ -947,7 +947,6 @@ void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool quer
   InterpreterFrameClosure blk(this, max_locals, m->max_stack(), f);
 
   // process locals & expression stack
-  ResourceMark rm(thread);
   InterpreterOopMap mask;
   if (query_oop_map_cache) {
     m->mask_for(m, bci, &mask);
diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
index 6f66a349595..cbd161d86eb 100644
--- a/src/hotspot/share/runtime/globals.hpp
+++ b/src/hotspot/share/runtime/globals.hpp
@@ -968,9 +968,6 @@ const int ObjectAlignmentInBytes = 8;
   develop(bool, UseCHA, true,                                               \
           "Enable CHA")                                                     \
                                                                             \
-  product(bool, UseVtableBasedCHA, true,  DIAGNOSTIC,                       \
-          "Use vtable information during CHA")                              \
-                                                                            \
   product(bool, UseTypeProfile, true,                                       \
           "Check interpreter profile for historically monomorphic calls")   \
                                                                             \
@@ -1411,9 +1408,6 @@ const int ObjectAlignmentInBytes = 8;
   product(bool, PrintMetaspaceStatisticsAtExit, false, DIAGNOSTIC,          \
           "Print metaspace statistics upon VM exit.")                       \
                                                                             \
-  develop(bool, MetaspaceGuardAllocations, false,                           \
-          "Metapace allocations are guarded.")                              \
-                                                                            \
   product(uintx, MinHeapFreeRatio, 40, MANAGEABLE,                          \
           "The minimum percentage of heap free after GC to avoid expansion."\
           " For most GCs this applies to the old generation. In G1 and"     \
@@ -1948,10 +1942,6 @@ const int ObjectAlignmentInBytes = 8;
   product(bool, UseFastUnorderedTimeStamps, false, EXPERIMENTAL,            \
           "Use platform unstable time where supported for timestamps only") \
                                                                             \
-  product(bool, UseEmptySlotsInSupers, true,                                \
-          "(Deprecated) Allow allocating fields in empty slots of "         \
-          "super-classes")                                                  \
-                                                                            \
   product(bool, DeoptimizeNMethodBarriersALot, false, DIAGNOSTIC,           \
                 "Make nmethod barriers deoptimise a lot.")                  \
                                                                             \
@@ -1961,9 +1951,9 @@ const int ObjectAlignmentInBytes = 8;
              "fence. Add cleanliness checks.")                              \
                                                                             \
   product(int, LockingMode, LM_LIGHTWEIGHT,                                 \
-          "Select locking mode: "                                           \
-          "0: monitors only (LM_MONITOR), "                                 \
-          "1: monitors & legacy stack-locking (LM_LEGACY), "                \
+          "(Deprecated) Select locking mode: "                              \
+          "0: (Deprecated) monitors only (LM_MONITOR), "                    \
+          "1: (Deprecated) monitors & legacy stack-locking (LM_LEGACY), "   \
           "2: monitors & new lightweight locking (LM_LIGHTWEIGHT, default)") \
           range(0, 2)                                                       \
                                                                             \
diff --git a/src/hotspot/share/runtime/handles.hpp b/src/hotspot/share/runtime/handles.hpp
index 7865d32bef2..39e59cc1ef0 100644
--- a/src/hotspot/share/runtime/handles.hpp
+++ b/src/hotspot/share/runtime/handles.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -187,7 +187,7 @@ class HandleArea: public Arena {
   HandleArea* _prev;          // link to outer (older) area
  public:
   // Constructor
-  HandleArea(HandleArea* prev) : Arena(mtThread, Tag::tag_ha, Chunk::tiny_size) {
+  HandleArea(MEMFLAGS flags, HandleArea* prev) : Arena(flags, Tag::tag_ha, Chunk::tiny_size) {
     debug_only(_handle_mark_nesting    = 0);
     debug_only(_no_handle_mark_nesting = 0);
     _prev = prev;
diff --git a/src/hotspot/share/runtime/init.cpp b/src/hotspot/share/runtime/init.cpp
index d37ae99b418..368f4e62c76 100644
--- a/src/hotspot/share/runtime/init.cpp
+++ b/src/hotspot/share/runtime/init.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -57,6 +57,7 @@ void mutex_init();
 void universe_oopstorage_init();
 void perfMemory_init();
 void SuspendibleThreadSet_init();
+void ExternalsRecorder_init(); // After mutex_init() and before CodeCache_init
 
 // Initialization done by Java thread in init_globals()
 void management_init();
@@ -107,6 +108,7 @@ void vm_init_globals() {
   universe_oopstorage_init();
   perfMemory_init();
   SuspendibleThreadSet_init();
+  ExternalsRecorder_init(); // After mutex_init() and before CodeCache_init
 }
 
 
diff --git a/src/hotspot/share/runtime/java.cpp b/src/hotspot/share/runtime/java.cpp
index d78e35c4e68..7ffe56d9715 100644
--- a/src/hotspot/share/runtime/java.cpp
+++ b/src/hotspot/share/runtime/java.cpp
@@ -24,7 +24,9 @@
 
 #include "precompiled.hpp"
 #include "cds/cds_globals.hpp"
+#include "cds/classListWriter.hpp"
 #include "cds/dynamicArchive.hpp"
+#include "classfile/classLoader.hpp"
 #include "classfile/classLoaderDataGraph.hpp"
 #include "classfile/javaClasses.hpp"
 #include "classfile/stringTable.hpp"
@@ -46,6 +48,7 @@
 #include "memory/oopFactory.hpp"
 #include "memory/resourceArea.hpp"
 #include "memory/universe.hpp"
+#include "nmt/memMapPrinter.hpp"
 #include "nmt/memTracker.hpp"
 #include "oops/constantPool.hpp"
 #include "oops/generateOopMap.hpp"
@@ -156,7 +159,6 @@ static void print_method_profiling_data() {
   }
 }
 
-
 #ifndef PRODUCT
 
 // Statistics printing (method invocation histogram)
@@ -265,7 +267,7 @@ void print_statistics() {
 #endif //COMPILER1
   }
 
-  if (PrintLockStatistics || PrintPreciseRTMLockingStatistics) {
+  if (PrintLockStatistics) {
     OptoRuntime::print_named_counters();
   }
 #ifdef ASSERT
@@ -356,6 +358,8 @@ void print_statistics() {
   }
 
   ThreadsSMRSupport::log_statistics();
+
+  ClassLoader::print_counters(tty);
 }
 
 // Note: before_exit() can be executed only once, if more than one threads
@@ -431,6 +435,10 @@ void before_exit(JavaThread* thread, bool halt) {
   }
 #endif
 
+#if INCLUDE_CDS
+  ClassListWriter::write_resolved_constants();
+#endif
+
   // Hang forever on exit if we're reporting an error.
   if (ShowMessageBoxOnError && VMError::is_error_reported()) {
     os::infinite_sleep();
@@ -478,6 +486,9 @@ void before_exit(JavaThread* thread, bool halt) {
   if (DumpPerfMapAtExit) {
     CodeCache::write_perf_map();
   }
+  if (PrintMemoryMapAtExit) {
+    MemMapPrinter::print_all_mappings(tty);
+  }
 #endif
 
   if (JvmtiExport::should_post_thread_life()) {
diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp
index 70bb47c213c..a3eef07ba0a 100644
--- a/src/hotspot/share/runtime/javaThread.cpp
+++ b/src/hotspot/share/runtime/javaThread.cpp
@@ -409,9 +409,9 @@ void JavaThread::check_for_valid_safepoint_state() {
 
 // A JavaThread is a normal Java thread
 
-JavaThread::JavaThread() :
+JavaThread::JavaThread(MEMFLAGS flags) :
+  Thread(flags),
   // Initialize fields
-
   _on_thread_list(false),
   DEBUG_ONLY(_java_call_counter(0) COMMA)
   _entry_point(nullptr),
@@ -525,13 +525,12 @@ JavaThread::JavaThread() :
   assert(deferred_card_mark().is_empty(), "Default MemRegion ctor");
 }
 
-JavaThread::JavaThread(bool is_attaching_via_jni) : JavaThread() {
-  if (is_attaching_via_jni) {
-    _jni_attach_state = _attaching_via_jni;
-  }
+JavaThread* JavaThread::create_attaching_thread() {
+  JavaThread* jt = new JavaThread();
+  jt->_jni_attach_state = _attaching_via_jni;
+  return jt;
 }
 
-
 // interrupt support
 
 void JavaThread::interrupt() {
@@ -634,8 +633,7 @@ void JavaThread::block_if_vm_exited() {
   }
 }
 
-JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : JavaThread() {
-  _jni_attach_state = _not_attaching_via_jni;
+JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz, MEMFLAGS flags) : JavaThread(flags) {
   set_entry_point(entry_point);
   // Create the native thread itself.
   // %note runtime_23
diff --git a/src/hotspot/share/runtime/javaThread.hpp b/src/hotspot/share/runtime/javaThread.hpp
index 2541aaded00..755a8268864 100644
--- a/src/hotspot/share/runtime/javaThread.hpp
+++ b/src/hotspot/share/runtime/javaThread.hpp
@@ -478,11 +478,13 @@ class JavaThread: public Thread {
 
  public:
   // Constructor
-  JavaThread();                            // delegating constructor
-  JavaThread(bool is_attaching_via_jni);   // for main thread and JNI attached threads
-  JavaThread(ThreadFunction entry_point, size_t stack_size = 0);
+  JavaThread(MEMFLAGS flags = mtThread);   // delegating constructor
+  JavaThread(ThreadFunction entry_point, size_t stack_size = 0, MEMFLAGS flags = mtThread);
   ~JavaThread();
 
+  // Factory method to create a new JavaThread whose attach state is "is attaching"
+  static JavaThread* create_attaching_thread();
+
 #ifdef ASSERT
   // verify this JavaThread hasn't be published in the Threads::list yet
   void verify_not_published();
diff --git a/src/hotspot/share/runtime/javaThread.inline.hpp b/src/hotspot/share/runtime/javaThread.inline.hpp
index 7b1ad7e17e1..a51a30ae577 100644
--- a/src/hotspot/share/runtime/javaThread.inline.hpp
+++ b/src/hotspot/share/runtime/javaThread.inline.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
diff --git a/src/hotspot/share/runtime/mutexLocker.cpp b/src/hotspot/share/runtime/mutexLocker.cpp
index 2587375c52e..add47738db0 100644
--- a/src/hotspot/share/runtime/mutexLocker.cpp
+++ b/src/hotspot/share/runtime/mutexLocker.cpp
@@ -123,6 +123,8 @@ Monitor* JfrThreadSampler_lock        = nullptr;
 
 Mutex*   CodeHeapStateAnalytics_lock  = nullptr;
 
+Mutex*   ExternalsRecorder_lock       = nullptr;
+
 Monitor* ContinuationRelativize_lock  = nullptr;
 
 Mutex*   Metaspace_lock               = nullptr;
@@ -328,6 +330,9 @@ void mutex_init() {
   MUTEX_DEFL(CodeCache_lock                 , PaddedMonitor, VtableStubs_lock);
   MUTEX_DEFL(NMethodState_lock              , PaddedMutex  , CodeCache_lock);
 
+  // tty_lock is held when printing nmethod and its relocations which use this lock.
+  MUTEX_DEFL(ExternalsRecorder_lock         , PaddedMutex  , tty_lock);
+
   MUTEX_DEFL(Threads_lock                   , PaddedMonitor, CompileThread_lock, true);
   MUTEX_DEFL(Compile_lock                   , PaddedMutex  , MethodCompileQueue_lock);
   MUTEX_DEFL(Heap_lock                      , PaddedMonitor, AdapterHandlerLibrary_lock);
diff --git a/src/hotspot/share/runtime/mutexLocker.hpp b/src/hotspot/share/runtime/mutexLocker.hpp
index 91310364b8f..160e6c97db0 100644
--- a/src/hotspot/share/runtime/mutexLocker.hpp
+++ b/src/hotspot/share/runtime/mutexLocker.hpp
@@ -142,6 +142,8 @@ extern Mutex*   ClassLoaderDataGraph_lock;       // protects CLDG list, needed f
 extern Mutex*   CodeHeapStateAnalytics_lock;     // lock print functions against concurrent analyze functions.
                                                  // Only used locally in PrintCodeCacheLayout processing.
 
+extern Mutex*   ExternalsRecorder_lock;          // used to guard access to the external addresses table
+
 extern Monitor* ContinuationRelativize_lock;
 
 #if INCLUDE_JVMCI
diff --git a/src/hotspot/share/runtime/objectMonitor.cpp b/src/hotspot/share/runtime/objectMonitor.cpp
index 178f3e97d71..c509ed691cd 100644
--- a/src/hotspot/share/runtime/objectMonitor.cpp
+++ b/src/hotspot/share/runtime/objectMonitor.cpp
@@ -1442,7 +1442,7 @@ bool ObjectMonitor::check_owner(TRAPS) {
 static inline bool is_excluded(const Klass* monitor_klass) {
   assert(monitor_klass != nullptr, "invariant");
   NOT_JFR_RETURN_(false);
-  JFR_ONLY(return vmSymbols::jfr_chunk_rotation_monitor() == monitor_klass->name();)
+  JFR_ONLY(return vmSymbols::jdk_jfr_internal_management_HiddenWait() == monitor_klass->name();)
 }
 
 static void post_monitor_wait_event(EventJavaMonitorWait* event,
diff --git a/src/hotspot/share/runtime/os.cpp b/src/hotspot/share/runtime/os.cpp
index bdf93e1d3b4..490a04aa6f1 100644
--- a/src/hotspot/share/runtime/os.cpp
+++ b/src/hotspot/share/runtime/os.cpp
@@ -78,6 +78,10 @@
 #include "utilities/macros.hpp"
 #include "utilities/powerOfTwo.hpp"
 
+#ifdef LINUX
+#include "osContainer_linux.hpp"
+#endif
+
 #ifndef _WINDOWS
 # include <poll.h>
 #endif
@@ -272,13 +276,6 @@ bool os::dll_build_name(char* buffer, size_t size, const char* fname) {
   return (n != -1);
 }
 
-#if !defined(LINUX) && !defined(_WINDOWS)
-bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) {
-  committed_start = start;
-  committed_size = size;
-  return true;
-}
-#endif
 
 // Helper for dll_locate_lib.
 // Pass buffer and printbuffer as we already printed the path to buffer
@@ -941,56 +938,73 @@ bool os::print_function_and_library_name(outputStream* st,
   return have_function_name || have_library_name;
 }
 
-ATTRIBUTE_NO_ASAN static bool read_safely_from(intptr_t* p, intptr_t* result) {
-  const intptr_t errval = 0x1717;
-  intptr_t i = SafeFetchN(p, errval);
+ATTRIBUTE_NO_ASAN static bool read_safely_from(const uintptr_t* p, uintptr_t* result) {
+  DEBUG_ONLY(*result = 0xAAAA;)
+  const uintptr_t errval = 0x1717;
+  uintptr_t i = (uintptr_t)SafeFetchN((intptr_t*)p, errval);
   if (i == errval) {
-    i = SafeFetchN(p, ~errval);
+    i = (uintptr_t)SafeFetchN((intptr_t*)p, ~errval);
     if (i == ~errval) {
       return false;
     }
   }
-  (*result) = i;
+  (*result) = (uintptr_t)i;
   return true;
 }
 
-static void print_hex_location(outputStream* st, address p, int unitsize) {
+// Helper for os::print_hex_dump
+static void print_ascii_form(stringStream& ascii_form, uint64_t value, int unitsize) {
+  union {
+    uint64_t v;
+    uint8_t c[sizeof(v)];
+  } u = { value };
+  for (int i = 0; i < unitsize; i++) {
+    const int idx = LITTLE_ENDIAN_ONLY(i) BIG_ENDIAN_ONLY(sizeof(u.v) - unitsize + i);
+    const uint8_t c = u.c[idx];
+    ascii_form.put(isprint(c) && isascii(c) ? c : '.');
+  }
+}
+
+// Helper for os::print_hex_dump
+static void print_hex_location(outputStream* st, const_address p, int unitsize, stringStream& ascii_form) {
   assert(is_aligned(p, unitsize), "Unaligned");
-  address pa = align_down(p, sizeof(intptr_t));
+  const uintptr_t* pa = (const uintptr_t*) align_down(p, sizeof(intptr_t));
 #ifndef _LP64
   // Special handling for printing qwords on 32-bit platforms
   if (unitsize == 8) {
-    intptr_t i1, i2;
-    if (read_safely_from((intptr_t*)pa, &i1) &&
-        read_safely_from((intptr_t*)pa + 1, &i2)) {
+    uintptr_t i1 = 0, i2 = 0;
+    if (read_safely_from(pa, &i1) &&
+        read_safely_from(pa + 1, &i2)) {
       const uint64_t value =
         LITTLE_ENDIAN_ONLY((((uint64_t)i2) << 32) | i1)
         BIG_ENDIAN_ONLY((((uint64_t)i1) << 32) | i2);
       st->print("%016" FORMAT64_MODIFIER "x", value);
+      print_ascii_form(ascii_form, value, unitsize);
     } else {
       st->print_raw("????????????????");
     }
     return;
   }
 #endif // 32-bit, qwords
-  intptr_t i = 0;
-  if (read_safely_from((intptr_t*)pa, &i)) {
+  uintptr_t i = 0;
+  if (read_safely_from(pa, &i)) {
     // bytes:   CA FE BA BE DE AD C0 DE
     // bytoff:   0  1  2  3  4  5  6  7
     // LE bits:  0  8 16 24 32 40 48 56
     // BE bits: 56 48 40 32 24 16  8  0
-    const int offset = (int)(p - (address)pa);
+    const int offset = (int)(p - (const_address)pa);
     const int bitoffset =
       LITTLE_ENDIAN_ONLY(offset * BitsPerByte)
       BIG_ENDIAN_ONLY((int)((sizeof(intptr_t) - unitsize - offset) * BitsPerByte));
     const int bitfieldsize = unitsize * BitsPerByte;
-    intptr_t value = bitfield(i, bitoffset, bitfieldsize);
+    uintptr_t value = bitfield(i, bitoffset, bitfieldsize);
     switch (unitsize) {
       case 1: st->print("%02x", (u1)value); break;
       case 2: st->print("%04x", (u2)value); break;
       case 4: st->print("%08x", (u4)value); break;
       case 8: st->print("%016" FORMAT64_MODIFIER "x", (u8)value); break;
     }
+    print_ascii_form(ascii_form, value, unitsize);
   } else {
     switch (unitsize) {
       case 1: st->print_raw("??"); break;
@@ -1001,36 +1015,56 @@ static void print_hex_location(outputStream* st, address p, int unitsize) {
   }
 }
 
-void os::print_hex_dump(outputStream* st, address start, address end, int unitsize,
-                        int bytes_per_line, address logical_start) {
+void os::print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize,
+                        bool print_ascii, int bytes_per_line, const_address logical_start) {
+  constexpr int max_bytes_per_line = 64;
   assert(unitsize == 1 || unitsize == 2 || unitsize == 4 || unitsize == 8, "just checking");
+  assert(bytes_per_line > 0 && bytes_per_line <= max_bytes_per_line &&
+         is_power_of_2(bytes_per_line), "invalid bytes_per_line");
 
   start = align_down(start, unitsize);
   logical_start = align_down(logical_start, unitsize);
   bytes_per_line = align_up(bytes_per_line, 8);
 
   int cols = 0;
-  int cols_per_line = bytes_per_line / unitsize;
+  const int cols_per_line = bytes_per_line / unitsize;
+
+  const_address p = start;
+  const_address logical_p = logical_start;
 
-  address p = start;
-  address logical_p = logical_start;
+  stringStream ascii_form;
 
   // Print out the addresses as if we were starting from logical_start.
-  st->print(PTR_FORMAT ":   ", p2i(logical_p));
   while (p < end) {
-    print_hex_location(st, p, unitsize);
+    if (cols == 0) {
+      st->print(PTR_FORMAT ":   ", p2i(logical_p));
+    }
+    print_hex_location(st, p, unitsize, ascii_form);
     p += unitsize;
     logical_p += unitsize;
     cols++;
-    if (cols >= cols_per_line && p < end) {
-       cols = 0;
+    if (cols >= cols_per_line) {
+       if (print_ascii && !ascii_form.is_empty()) {
+         st->print("   %s", ascii_form.base());
+       }
+       ascii_form.reset();
        st->cr();
-       st->print(PTR_FORMAT ":   ", p2i(logical_p));
+       cols = 0;
     } else {
        st->print(" ");
     }
   }
-  st->cr();
+
+  if (cols > 0) { // did not print a full line
+    if (print_ascii) {
+      // indent last ascii part to match that of full lines
+      const int size_of_printed_unit = unitsize * 2;
+      const int space_left = (cols_per_line - cols) * (size_of_printed_unit + 1);
+      st->sp(space_left);
+      st->print("  %s", ascii_form.base());
+    }
+    st->cr();
+  }
 }
 
 void os::print_dhm(outputStream* st, const char* startStr, long sec) {
@@ -1048,7 +1082,7 @@ void os::print_tos(outputStream* st, address sp) {
 
 void os::print_instructions(outputStream* st, address pc, int unitsize) {
   st->print_cr("Instructions: (pc=" PTR_FORMAT ")", p2i(pc));
-  print_hex_dump(st, pc - 256, pc + 256, unitsize);
+  print_hex_dump(st, pc - 256, pc + 256, unitsize, /* print_ascii=*/false);
 }
 
 void os::print_environment_variables(outputStream* st, const char** env_list) {
@@ -1924,8 +1958,7 @@ char* os::attempt_reserve_memory_between(char* min, char* max, size_t bytes, siz
   // This is not reflected by os_allocation_granularity().
   // The logic here is dual to the one in pd_reserve_memory in os_aix.cpp
   const size_t system_allocation_granularity =
-    AIX_ONLY(os::vm_page_size() == 4*K ? 4*K : 256*M)
-    NOT_AIX(os::vm_allocation_granularity());
+    AIX_ONLY((!os::Aix::supports_64K_mmap_pages() && os::vm_page_size() == 64*K) ? 256*M : ) os::vm_allocation_granularity();
 
   const size_t alignment_adjusted = MAX2(alignment, system_allocation_granularity);
 
@@ -2064,6 +2097,19 @@ static void assert_nonempty_range(const char* addr, size_t bytes) {
          p2i(addr), p2i(addr) + bytes);
 }
 
+julong os::used_memory() {
+#ifdef LINUX
+  if (OSContainer::is_containerized()) {
+    jlong mem_usage = OSContainer::memory_usage_in_bytes();
+    if (mem_usage > 0) {
+      return mem_usage;
+    }
+  }
+#endif
+  return os::physical_memory() - os::available_memory();
+}
+
+
 bool os::commit_memory(char* addr, size_t bytes, bool executable) {
   assert_nonempty_range(addr, bytes);
   bool res = pd_commit_memory(addr, bytes, executable);
diff --git a/src/hotspot/share/runtime/os.hpp b/src/hotspot/share/runtime/os.hpp
index a6626c1389f..af8eb8c8b9a 100644
--- a/src/hotspot/share/runtime/os.hpp
+++ b/src/hotspot/share/runtime/os.hpp
@@ -336,6 +336,7 @@ class os: AllStatic {
   // than "free" memory (`MemFree` in `/proc/meminfo`) because Linux can free memory
   // aggressively (e.g. clear caches) so that it becomes available.
   static julong available_memory();
+  static julong used_memory();
   static julong free_memory();
 
   static jlong total_swap_space();
@@ -344,6 +345,7 @@ class os: AllStatic {
   static julong physical_memory();
   static bool has_allocatable_memory_limit(size_t* limit);
   static bool is_server_class_machine();
+  static size_t rss();
 
   // Returns the id of the processor on which the calling thread is currently executing.
   // The returned value is guaranteed to be between 0 and (os::processor_count() - 1).
@@ -854,10 +856,10 @@ class os: AllStatic {
   // return current frame. pc() and sp() are set to null on failure.
   static frame      current_frame();
 
-  static void print_hex_dump(outputStream* st, address start, address end, int unitsize,
-                             int bytes_per_line, address logical_start);
-  static void print_hex_dump(outputStream* st, address start, address end, int unitsize) {
-    print_hex_dump(st, start, end, unitsize, /*bytes_per_line=*/16, /*logical_start=*/start);
+  static void print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize, bool print_ascii,
+                             int bytes_per_line, const_address logical_start);
+  static void print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize, bool print_ascii = true) {
+    print_hex_dump(st, start, end, unitsize, print_ascii, /*bytes_per_line=*/16, /*logical_start=*/start);
   }
 
   // returns a string to describe the exception/signal;
diff --git a/src/hotspot/share/runtime/perfData.cpp b/src/hotspot/share/runtime/perfData.cpp
index b195274dc01..5e78baad3ab 100644
--- a/src/hotspot/share/runtime/perfData.cpp
+++ b/src/hotspot/share/runtime/perfData.cpp
@@ -296,7 +296,7 @@ void PerfDataManager::add_item(PerfData* p, bool sampled) {
     _has_PerfData = true;
   }
 
-  assert(!_all->contains(p->name()), "duplicate name added");
+  assert(!_all->contains(p->name()), "duplicate name added: %s", p->name());
 
   // add to the list of all perf data items
   _all->append(p);
@@ -527,8 +527,3 @@ PerfDataList* PerfDataList::clone() {
   return copy;
 }
 
-PerfTraceTime::~PerfTraceTime() {
-  if (!UsePerfData) return;
-  _t.stop();
-  _timerp->inc(_t.ticks());
-}
diff --git a/src/hotspot/share/runtime/perfData.hpp b/src/hotspot/share/runtime/perfData.hpp
index 103e2698d9b..1f75560715a 100644
--- a/src/hotspot/share/runtime/perfData.hpp
+++ b/src/hotspot/share/runtime/perfData.hpp
@@ -831,11 +831,20 @@ class PerfTraceTime : public StackObj {
 
   public:
     inline PerfTraceTime(PerfLongCounter* timerp) : _timerp(timerp) {
-      if (!UsePerfData) return;
+      if (!UsePerfData || timerp == nullptr) { return; }
       _t.start();
     }
 
-    ~PerfTraceTime();
+    const char* name() const {
+      assert(_timerp != nullptr, "sanity");
+      return _timerp->name();
+    }
+
+    ~PerfTraceTime() {
+      if (!UsePerfData || !_t.is_active()) { return; }
+      _t.stop();
+      _timerp->inc(_t.ticks());
+    }
 };
 
 /* The PerfTraceTimedEvent class is responsible for counting the
@@ -864,7 +873,7 @@ class PerfTraceTimedEvent : public PerfTraceTime {
 
   public:
     inline PerfTraceTimedEvent(PerfLongCounter* timerp, PerfLongCounter* eventp): PerfTraceTime(timerp), _eventp(eventp) {
-      if (!UsePerfData) return;
+      if (!UsePerfData || timerp == nullptr) { return; }
       _eventp->inc();
     }
 
diff --git a/src/hotspot/share/runtime/rtmLocking.cpp b/src/hotspot/share/runtime/rtmLocking.cpp
deleted file mode 100644
index c3752882423..00000000000
--- a/src/hotspot/share/runtime/rtmLocking.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, 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.
- *
- */
-
-#include "precompiled.hpp"
-#include "compiler/compilerDefinitions.hpp"
-
-#if INCLUDE_RTM_OPT
-
-#include "memory/allocation.inline.hpp"
-#include "runtime/task.hpp"
-#include "runtime/rtmLocking.hpp"
-
-
-// One-shot PeriodicTask subclass for enabling RTM locking
-uintx RTMLockingCounters::_calculation_flag = 0;
-
-class RTMLockingCalculationTask : public PeriodicTask {
- public:
-  RTMLockingCalculationTask(size_t interval_time) : PeriodicTask(interval_time){  }
-
-  virtual void task() {
-    RTMLockingCounters::_calculation_flag = 1;
-    // Reclaim our storage and disenroll ourself
-    delete this;
-  }
-};
-
-void RTMLockingCounters::init() {
-  if (UseRTMLocking && RTMLockingCalculationDelay > 0) {
-    RTMLockingCalculationTask* task = new RTMLockingCalculationTask(RTMLockingCalculationDelay);
-    task->enroll();
-  } else {
-    _calculation_flag = 1;
-  }
-}
-
-const char* RTMLockingCounters::_abortX_desc[ABORT_STATUS_LIMIT] = {
-  "abort instruction   ",
-  "may succeed on retry",
-  "thread conflict     ",
-  "buffer overflow     ",
-  "debug or trap hit   ",
-  "maximum nested depth"
-};
-
-//------------------------------print_on-------------------------------
-void RTMLockingCounters::print_on(outputStream* st) const {
-  tty->print_cr("# rtm locks total (estimated): " UINTX_FORMAT, _total_count * RTMTotalCountIncrRate);
-  tty->print_cr("# rtm lock aborts (total): " UINTX_FORMAT, _abort_count);
-  for (int i = 0; i < ABORT_STATUS_LIMIT; i++) {
-    tty->print_cr("# rtm lock aborts %d (%s): " UINTX_FORMAT, i, _abortX_desc[i], _abortX_count[i]);
-  }
-}
-void RTMLockingCounters::print() const { print_on(tty); }
-
-#endif
diff --git a/src/hotspot/share/runtime/rtmLocking.hpp b/src/hotspot/share/runtime/rtmLocking.hpp
deleted file mode 100644
index db9678b17b1..00000000000
--- a/src/hotspot/share/runtime/rtmLocking.hpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef SHARE_RUNTIME_RTMLOCKING_HPP
-#define SHARE_RUNTIME_RTMLOCKING_HPP
-
-// Generate RTM (Restricted Transactional Memory) locking code for all inflated
-// locks when "UseRTMLocking" option is on with normal locking mechanism as fall back
-// handler.
-//
-// On abort/lock busy the lock will be retried a fixed number of times under RTM
-// as specified by "RTMRetryCount" option. The locks which abort too often
-// can be auto tuned or manually tuned.
-//
-// Auto-tuning can be done on an option like UseRTMDeopt and it will need abort
-// ratio calculation for each lock. The abort ratio will be calculated after
-// "RTMAbortThreshold" number of aborts is reached. The formulas are:
-//
-//     Aborted transactions = abort_count * 100
-//     All transactions = total_count *  RTMTotalCountIncrRate
-//
-//     Aborted transactions >= All transactions * RTMAbortRatio
-//
-// If "UseRTMDeopt" is on and the aborts ratio reaches "RTMAbortRatio"
-// the method containing the lock will be deoptimized and recompiled with
-// all locks as normal locks. If the abort ratio continues to remain low after
-// "RTMLockingThreshold" locks are attempted, then the method will be deoptimized
-// and recompiled with all locks as RTM locks without abort ratio calculation code.
-// The abort ratio calculation can be delayed by specifying flag
-// -XX:RTMLockingCalculationDelay in millisecond.
-//
-// For manual tuning the abort statistics for each lock needs to be provided
-// to the user on some JVM option like "PrintPreciseRTMLockingStatistics".
-// Based on the abort statistics users can create a .hotspot_compiler file
-// or use -XX:CompileCommand=option,class::method,NoRTMLockEliding
-// to specify for which methods to disable RTM locking.
-//
-// When UseRTMForStackLocks option is enabled along with UseRTMLocking option,
-// the RTM locking code is generated for stack locks too.
-// The retries, auto-tuning support and rtm locking statistics are all
-// supported for stack locks just like inflated locks.
-
-// RTM locking counters
-class RTMLockingCounters {
- private:
-  uintx _total_count; // Total RTM locks count
-  uintx _abort_count; // Total aborts count
-
- public:
-  enum { ABORT_STATUS_LIMIT = 6 };
-  // Counters per RTM Abort Status. Incremented with +PrintPreciseRTMLockingStatistics
-  // RTM uses the EAX register to communicate abort status to software.
-  // Following an RTM abort the EAX register has the following definition.
-  //
-  //   EAX register bit position   Meaning
-  //     0     Set if abort caused by XABORT instruction.
-  //     1     If set, the transaction may succeed on a retry. This bit is always clear if bit 0 is set.
-  //     2     Set if another logical processor conflicted with a memory address that was part of the transaction that aborted.
-  //     3     Set if an internal buffer overflowed.
-  //     4     Set if a debug breakpoint was hit.
-  //     5     Set if an abort occurred during execution of a nested transaction.
- private:
-  uintx _abortX_count[ABORT_STATUS_LIMIT];
-  static const char* _abortX_desc[ABORT_STATUS_LIMIT];
-
- public:
-  static uintx _calculation_flag;
-  static uintx* rtm_calculation_flag_addr() { return &_calculation_flag; }
-
-  static void init();
-
-  RTMLockingCounters() : _total_count(0), _abort_count(0) {
-    for (int i = 0; i < ABORT_STATUS_LIMIT; i++) {
-      _abortX_count[i] = 0;
-    }
-  }
-
-  uintx* total_count_addr()               { return &_total_count; }
-
-  static int total_count_offset()         { return (int)offset_of(RTMLockingCounters, _total_count); }
-  static int abort_count_offset()         { return (int)offset_of(RTMLockingCounters, _abort_count); }
-  static int abortX_count_offset()        { return (int)offset_of(RTMLockingCounters, _abortX_count[0]); }
-
-
-  bool nonzero() {  return (_abort_count + _total_count) > 0; }
-
-  void print_on(outputStream* st) const;
-  void print() const;
-};
-
-#endif // SHARE_RUNTIME_RTMLOCKING_HPP
diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp
index 0a7f5c54676..0e6d367586b 100644
--- a/src/hotspot/share/runtime/sharedRuntime.cpp
+++ b/src/hotspot/share/runtime/sharedRuntime.cpp
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "classfile/classLoader.hpp"
 #include "classfile/javaClasses.inline.hpp"
 #include "classfile/stringTable.hpp"
 #include "classfile/vmClasses.hpp"
@@ -55,6 +56,7 @@
 #include "prims/jvmtiThreadState.hpp"
 #include "prims/methodHandles.hpp"
 #include "prims/nativeLookup.hpp"
+#include "runtime/arguments.hpp"
 #include "runtime/atomic.hpp"
 #include "runtime/frame.inline.hpp"
 #include "runtime/handles.inline.hpp"
@@ -63,6 +65,7 @@
 #include "runtime/java.hpp"
 #include "runtime/javaCalls.hpp"
 #include "runtime/jniHandles.inline.hpp"
+#include "runtime/perfData.hpp"
 #include "runtime/sharedRuntime.hpp"
 #include "runtime/stackWatermarkSet.hpp"
 #include "runtime/stubRoutines.hpp"
@@ -1333,7 +1336,7 @@ methodHandle SharedRuntime::resolve_helper(bool is_virtual, bool is_optimized, T
 
   if (invoke_code == Bytecodes::_invokestatic) {
     assert(callee_method->method_holder()->is_initialized() ||
-           callee_method->method_holder()->is_init_thread(current),
+           callee_method->method_holder()->is_reentrant_initialization(current),
            "invalid class initialization state for invoke_static");
     if (!VM_Version::supports_fast_class_init_checks() && callee_method->needs_clinit_barrier()) {
       // In order to keep class initialization check, do not patch call
@@ -2570,6 +2573,9 @@ AdapterHandlerEntry* AdapterHandlerLibrary::create_adapter(AdapterBlob*& new_ada
                                                            int total_args_passed,
                                                            BasicType* sig_bt,
                                                            bool allocate_code_blob) {
+  if (log_is_enabled(Info, perf, class, link)) {
+    ClassLoader::perf_method_adapters_count()->inc();
+  }
 
   // StubRoutines::_final_stubs_code is initialized after this function can be called. As a result,
   // VerifyAdapterCalls and VerifyAdapterSharing can fail if we re-use code that generated prior
diff --git a/src/hotspot/share/runtime/statSampler.cpp b/src/hotspot/share/runtime/statSampler.cpp
index 5d2e102ada4..5fd038bf845 100644
--- a/src/hotspot/share/runtime/statSampler.cpp
+++ b/src/hotspot/share/runtime/statSampler.cpp
@@ -228,6 +228,19 @@ void StatSampler::add_property_constant(CounterNS name_space, const char* name,
   add_property_constant(name_space, name, Arguments::get_property(name), CHECK);
 }
 
+/*
+ * Adds a string constant of the given property. Retrieves the value via
+ * Arguments::get_property() and asserts the value for the does not differ from
+ * the value retrievable from System.getProperty()
+ */
+void StatSampler::add_optional_property_constant(CounterNS name_space, const char* name, TRAPS) {
+  const char* value = Arguments::get_property(name);
+
+  if (value != nullptr) {
+    add_property_constant(name_space, name, value, CHECK);
+  }
+}
+
 /*
  * Method to create PerfStringConstants containing the values of various
  * system properties. Constants are created from information known to HotSpot,
@@ -260,6 +273,10 @@ void StatSampler::create_system_property_instrumentation(TRAPS) {
   add_property_constant(JAVA_PROPERTY, "java.library.path", CHECK);
   add_property_constant(JAVA_PROPERTY, "java.class.path", CHECK);
   add_property_constant(JAVA_PROPERTY, "java.home", CHECK);
+
+  add_optional_property_constant(JAVA_PROPERTY, "jdk.module.path", CHECK);
+  add_optional_property_constant(JAVA_PROPERTY, "jdk.module.upgrade.path", CHECK);
+  add_optional_property_constant(JAVA_PROPERTY, "jdk.module.main", CHECK);
 }
 
 /*
diff --git a/src/hotspot/share/runtime/statSampler.hpp b/src/hotspot/share/runtime/statSampler.hpp
index a26f9743e0c..00daa5d95c0 100644
--- a/src/hotspot/share/runtime/statSampler.hpp
+++ b/src/hotspot/share/runtime/statSampler.hpp
@@ -53,6 +53,7 @@ class StatSampler : AllStatic {
     static void sample_data(PerfDataList* list);
     static void assert_system_property(const char* name, const char* value, TRAPS);
     static void add_property_constant(CounterNS name_space, const char* name, TRAPS);
+    static void add_optional_property_constant(CounterNS name_space, const char* name, TRAPS);
     static void add_property_constant(CounterNS name_space, const char* name, const char* value, TRAPS);
     static void create_system_property_instrumentation(TRAPS);
 
diff --git a/src/hotspot/share/runtime/stubRoutines.cpp b/src/hotspot/share/runtime/stubRoutines.cpp
index 74286a4ac98..773f8031e15 100644
--- a/src/hotspot/share/runtime/stubRoutines.cpp
+++ b/src/hotspot/share/runtime/stubRoutines.cpp
@@ -149,6 +149,8 @@ address StubRoutines::_sha3_implCompressMB   = nullptr;
 address StubRoutines::_updateBytesCRC32 = nullptr;
 address StubRoutines::_crc_table_adr =    nullptr;
 
+address StubRoutines::_string_indexof_array[4]   =    { nullptr };
+
 address StubRoutines::_crc32c_table_addr = nullptr;
 address StubRoutines::_updateBytesCRC32C = nullptr;
 address StubRoutines::_updateBytesAdler32 = nullptr;
diff --git a/src/hotspot/share/runtime/stubRoutines.hpp b/src/hotspot/share/runtime/stubRoutines.hpp
index 65b0c0d2f26..762a6edf590 100644
--- a/src/hotspot/share/runtime/stubRoutines.hpp
+++ b/src/hotspot/share/runtime/stubRoutines.hpp
@@ -232,6 +232,8 @@ class StubRoutines: AllStatic {
   static address _updateBytesCRC32;
   static address _crc_table_adr;
 
+  static address _string_indexof_array[4];
+
   static address _crc32c_table_addr;
   static address _updateBytesCRC32C;
   static address _updateBytesAdler32;
diff --git a/src/hotspot/share/runtime/synchronizer.cpp b/src/hotspot/share/runtime/synchronizer.cpp
index 27b4163238a..047f6703b54 100644
--- a/src/hotspot/share/runtime/synchronizer.cpp
+++ b/src/hotspot/share/runtime/synchronizer.cpp
@@ -821,6 +821,16 @@ int ObjectSynchronizer::wait(Handle obj, jlong millis, TRAPS) {
   return ret_code;
 }
 
+void ObjectSynchronizer::waitUninterruptibly(Handle obj, jlong millis, TRAPS) {
+  if (millis < 0) {
+    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
+  }
+  ObjectSynchronizer::inflate(THREAD,
+                              obj(),
+                              inflate_cause_wait)->wait(millis, false, THREAD);
+}
+
+
 void ObjectSynchronizer::notify(Handle obj, TRAPS) {
   JavaThread* current = THREAD;
 
diff --git a/src/hotspot/share/runtime/synchronizer.hpp b/src/hotspot/share/runtime/synchronizer.hpp
index 786defcbca4..493303df661 100644
--- a/src/hotspot/share/runtime/synchronizer.hpp
+++ b/src/hotspot/share/runtime/synchronizer.hpp
@@ -69,6 +69,7 @@ class MonitorList::Iterator {
 class ObjectSynchronizer : AllStatic {
   friend class VMStructs;
   friend class ObjectMonitorDeflationLogging;
+  friend class WhiteBox;
 
  public:
   typedef enum {
@@ -119,6 +120,11 @@ class ObjectSynchronizer : AllStatic {
   static bool quick_notify(oopDesc* obj, JavaThread* current, bool All);
   static bool quick_enter(oop obj, JavaThread* current, BasicLock* Lock);
 
+  // Special internal-use-only method for use by JVM infrastructure
+  // that needs to wait() on a java-level object but that can't risk
+  // throwing unexpected InterruptedExecutionExceptions.
+  static void waitUninterruptibly(Handle obj, jlong Millis, TRAPS);
+
   // Inflate light weight monitor to heavy weight monitor
   static ObjectMonitor* inflate(Thread* current, oop obj, const InflateCause cause);
   // Used to inflate a monitor as if it was done from the thread JavaThread.
@@ -225,6 +231,7 @@ class ObjectLocker : public StackObj {
 
   // Monitor behavior
   void wait(TRAPS)  { ObjectSynchronizer::wait(_obj, 0, CHECK); } // wait forever
+  void wait_uninterruptibly(TRAPS)  { ObjectSynchronizer::waitUninterruptibly(_obj, 0, CHECK); } // wait forever
   void notify_all(TRAPS)  { ObjectSynchronizer::notifyall(_obj, CHECK); }
 };
 
diff --git a/src/hotspot/share/runtime/thread.cpp b/src/hotspot/share/runtime/thread.cpp
index d98fcf6f664..e72077adabf 100644
--- a/src/hotspot/share/runtime/thread.cpp
+++ b/src/hotspot/share/runtime/thread.cpp
@@ -64,7 +64,7 @@ THREAD_LOCAL Thread* Thread::_thr_current = nullptr;
 
 DEBUG_ONLY(Thread* Thread::_starting_thread = nullptr;)
 
-Thread::Thread() {
+Thread::Thread(MEMFLAGS flags) {
 
   DEBUG_ONLY(_run_state = PRE_CALL_RUN;)
 
@@ -78,9 +78,9 @@ Thread::Thread() {
 
   // allocated data structures
   set_osthread(nullptr);
-  set_resource_area(new (mtThread)ResourceArea());
+  set_resource_area(new (flags) ResourceArea(flags));
   DEBUG_ONLY(_current_resource_mark = nullptr;)
-  set_handle_area(new (mtThread) HandleArea(nullptr));
+  set_handle_area(new (flags) HandleArea(flags, nullptr));
   set_metadata_handles(new (mtClass) GrowableArray<Metadata*>(30, mtClass));
   set_last_handle_mark(nullptr);
   DEBUG_ONLY(_missed_ic_stub_refill_verifier = nullptr);
diff --git a/src/hotspot/share/runtime/thread.hpp b/src/hotspot/share/runtime/thread.hpp
index 44c845986f3..e9fee4d113a 100644
--- a/src/hotspot/share/runtime/thread.hpp
+++ b/src/hotspot/share/runtime/thread.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -277,7 +277,7 @@ class Thread: public ThreadShadow {
                                                  // is waiting to lock
  public:
   // Constructor
-  Thread();
+  Thread(MEMFLAGS flag = mtThread);
   virtual ~Thread() = 0;        // Thread is abstract.
 
   // Manage Thread::current()
diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp
index 051c2901fa0..ea18ff3a006 100644
--- a/src/hotspot/share/runtime/threads.cpp
+++ b/src/hotspot/share/runtime/threads.cpp
@@ -109,9 +109,6 @@
 #ifdef COMPILER2
 #include "opto/idealGraphPrinter.hpp"
 #endif
-#if INCLUDE_RTM_OPT
-#include "runtime/rtmLocking.hpp"
-#endif
 #if INCLUDE_JFR
 #include "jfr/jfr.hpp"
 #endif
@@ -802,10 +799,6 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
   StatSampler::engage();
   if (CheckJNICalls)                  JniPeriodicChecker::engage();
 
-#if INCLUDE_RTM_OPT
-  RTMLockingCounters::init();
-#endif
-
   call_postVMInitHook(THREAD);
   // The Java side of PostVMInitHook.run must deal with all
   // exceptions and provide means of diagnosis.
@@ -825,7 +818,13 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
 #endif
 
   if (CDSConfig::is_dumping_static_archive()) {
-    MetaspaceShared::preload_and_dump();
+    MetaspaceShared::preload_and_dump(CHECK_JNI_ERR);
+  }
+
+  if (log_is_enabled(Info, perf, class, link)) {
+    LogStreamHandle(Info, perf, class, link) log;
+    log.print_cr("At VM initialization completion:");
+    ClassLoader::print_counters(&log);
   }
 
   return JNI_OK;
@@ -1328,6 +1327,18 @@ void Threads::print_on(outputStream* st, bool print_stacks,
         p->trace_stack();
       } else {
         p->print_stack_on(st);
+        const oop thread_oop = p->threadObj();
+        if (thread_oop != nullptr) {
+          if (p->is_vthread_mounted()) {
+            const oop vt = p->vthread();
+            assert(vt != nullptr, "vthread should not be null when vthread is mounted");
+            // JavaThread._vthread can refer to the carrier thread. Print only if _vthread refers to a virtual thread.
+            if (vt != thread_oop) {
+              st->print_cr("   Mounted virtual thread #" INT64_FORMAT, (int64_t)java_lang_Thread::thread_id(vt));
+              p->print_vthread_stack_on(st);
+            }
+          }
+        }
       }
     }
     st->cr();
diff --git a/src/hotspot/share/runtime/vframe.cpp b/src/hotspot/share/runtime/vframe.cpp
index ccb90c427b0..be2e275bf7f 100644
--- a/src/hotspot/share/runtime/vframe.cpp
+++ b/src/hotspot/share/runtime/vframe.cpp
@@ -205,8 +205,9 @@ void javaVFrame::print_lock_info_on(outputStream* st, int frame_count) {
       Klass* k = obj->klass();
       st->print_cr("\t- %s <" INTPTR_FORMAT "> (a %s)", "parking to wait for ", p2i(obj), k->external_name());
     }
-    else if (thread()->osthread()->get_state() == CONDVAR_WAIT) {
-      // We are waiting on the native class initialization monitor.
+    else if (thread()->osthread()->get_state() == OBJECT_WAIT) {
+      // We are waiting on an Object monitor but Object.wait() isn't the
+      // top-frame, so we should be waiting on a Class initialization monitor.
       InstanceKlass* k = thread()->class_to_be_initialized();
       if (k != nullptr) {
         st->print_cr("\t- waiting on the Class initialization monitor for %s", k->external_name());
diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp
index 4381bb973bb..4b6381bd05e 100644
--- a/src/hotspot/share/runtime/vmStructs.cpp
+++ b/src/hotspot/share/runtime/vmStructs.cpp
@@ -246,6 +246,7 @@
   nonstatic_field(InstanceKlass,               _nonstatic_oop_map_size,                       int)                                   \
   volatile_nonstatic_field(InstanceKlass,      _init_state,                                   InstanceKlass::ClassState)             \
   volatile_nonstatic_field(InstanceKlass,      _init_thread,                                  JavaThread*)                           \
+  nonstatic_field(InstanceKlass,               _is_marked_dependent,                          bool)                                  \
   nonstatic_field(InstanceKlass,               _itable_len,                                   int)                                   \
   nonstatic_field(InstanceKlass,               _nest_host_index,                              u2)                                    \
   nonstatic_field(InstanceKlass,               _reference_type,                               u1)                                    \
@@ -2163,7 +2164,6 @@
                                                                           \
   declare_constant(InstanceKlass::allocated)                              \
   declare_constant(InstanceKlass::loaded)                                 \
-  declare_constant(InstanceKlass::being_linked)                           \
   declare_constant(InstanceKlass::linked)                                 \
   declare_constant(InstanceKlass::being_initialized)                      \
   declare_constant(InstanceKlass::fully_initialized)                      \
@@ -2259,7 +2259,6 @@
   declare_constant(Deoptimization::Reason_speculate_class_check)          \
   declare_constant(Deoptimization::Reason_speculate_null_check)           \
   declare_constant(Deoptimization::Reason_speculate_null_assert)          \
-  declare_constant(Deoptimization::Reason_rtm_state_change)               \
   declare_constant(Deoptimization::Reason_unstable_if)                    \
   declare_constant(Deoptimization::Reason_unstable_fused_if)              \
   declare_constant(Deoptimization::Reason_receiver_constraint)            \
diff --git a/src/hotspot/share/sanitizers/ub.hpp b/src/hotspot/share/sanitizers/ub.hpp
new file mode 100644
index 00000000000..66cd014c35c
--- /dev/null
+++ b/src/hotspot/share/sanitizers/ub.hpp
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024 SAP SE. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_SANITIZERS_UB_HPP
+#define SHARE_SANITIZERS_UB_HPP
+
+// ATTRIBUTE_NO_UBSAN
+//
+// Function attribute which informs the compiler to disable UBSan checks in the
+// following function or method.
+// Useful if the function or method is known to do something special or even 'dangerous', for
+// example causing desired signals/crashes.
+#ifdef UNDEFINED_BEHAVIOR_SANITIZER
+#if defined(__clang__) || defined(__GNUC__)
+#define ATTRIBUTE_NO_UBSAN __attribute__((no_sanitize("undefined")))
+#endif
+#endif
+
+#ifndef ATTRIBUTE_NO_UBSAN
+#define ATTRIBUTE_NO_UBSAN
+#endif
+
+#endif // SHARE_SANITIZERS_UB_HPP
diff --git a/src/hotspot/share/services/attachListener.cpp b/src/hotspot/share/services/attachListener.cpp
index d1531e1ec01..36931531a4e 100644
--- a/src/hotspot/share/services/attachListener.cpp
+++ b/src/hotspot/share/services/attachListener.cpp
@@ -395,7 +395,13 @@ void AttachListenerThread::thread_entry(JavaThread* thread, TRAPS) {
     }
 
     ResourceMark rm;
-    bufferedStream st;
+    // jcmd output can get lengthy. As long as we miss jcmd continuous streaming output
+    // and instead just send the output in bulk, make sure large command output does not
+    // cause asserts. We still retain a max cap, but dimensioned in a way that makes it
+    // highly unlikely we should ever hit it under normal conditions.
+    constexpr size_t initial_size = 1 * M;
+    constexpr size_t max_size = 3 * G;
+    bufferedStream st(initial_size, max_size);
     jint res = JNI_OK;
 
     // handle special detachall operation
diff --git a/src/hotspot/share/services/diagnosticCommand.cpp b/src/hotspot/share/services/diagnosticCommand.cpp
index b440a6cbb5e..7d2325c16b6 100644
--- a/src/hotspot/share/services/diagnosticCommand.cpp
+++ b/src/hotspot/share/services/diagnosticCommand.cpp
@@ -992,7 +992,7 @@ class VM_PrintClasses : public VM_Operation {
 };
 
 void ClassesDCmd::execute(DCmdSource source, TRAPS) {
-  VM_PrintClasses vmop(output(), _verbose.is_set());
+  VM_PrintClasses vmop(output(), _verbose.value());
   VMThread::execute(&vmop);
 }
 
@@ -1180,34 +1180,35 @@ void CompilationMemoryStatisticDCmd::execute(DCmdSource source, TRAPS) {
 
 #ifdef LINUX
 
-SystemMapDCmd::SystemMapDCmd(outputStream* output, bool heap) :
-    DCmdWithParser(output, heap),
-  _human_readable("-H", "Human readable format", "BOOLEAN", false, "false") {
-  _dcmdparser.add_dcmd_option(&_human_readable);
-}
+SystemMapDCmd::SystemMapDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
 
 void SystemMapDCmd::execute(DCmdSource source, TRAPS) {
-  MemMapPrinter::print_all_mappings(output(), _human_readable.value());
+  MemMapPrinter::print_all_mappings(output());
 }
 
+static constexpr char default_filename[] = "vm_memory_map_<pid>.txt";
+
 SystemDumpMapDCmd::SystemDumpMapDCmd(outputStream* output, bool heap) :
-    DCmdWithParser(output, heap),
-  _human_readable("-H", "Human readable format", "BOOLEAN", false, "false"),
-  _filename("-F", "file path (defaults: \"vm_memory_map_<pid>.txt\")", "STRING", false) {
-  _dcmdparser.add_dcmd_option(&_human_readable);
+  DCmdWithParser(output, heap),
+  _filename("-F", "file path", "STRING", false, default_filename) {
   _dcmdparser.add_dcmd_option(&_filename);
 }
 
 void SystemDumpMapDCmd::execute(DCmdSource source, TRAPS) {
-  stringStream default_name;
-  default_name.print("vm_memory_map_%d.txt", os::current_process_id());
-  const char* name = _filename.is_set() ? _filename.value() : default_name.base();
+  stringStream defaultname;
+  const char* name = nullptr;
+  if (_filename.is_set()) {
+    name = _filename.value();
+  } else {
+    defaultname.print("vm_memory_map_%d.txt", os::current_process_id());
+    name = defaultname.base();
+  }
   fileStream fs(name);
   if (fs.is_open()) {
     if (!MemTracker::enabled()) {
       output()->print_cr("(NMT is disabled, will not annotate mappings).");
     }
-    MemMapPrinter::print_all_mappings(&fs, _human_readable.value());
+    MemMapPrinter::print_all_mappings(&fs);
     // For the readers convenience, resolve path name.
     char tmp[JVM_MAXPATHLEN];
     const char* absname = os::Posix::realpath(name, tmp, sizeof(tmp));
diff --git a/src/hotspot/share/services/diagnosticCommand.hpp b/src/hotspot/share/services/diagnosticCommand.hpp
index 88a48970810..ec3469c8d15 100644
--- a/src/hotspot/share/services/diagnosticCommand.hpp
+++ b/src/hotspot/share/services/diagnosticCommand.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -983,16 +983,14 @@ class CompilationMemoryStatisticDCmd: public DCmdWithParser {
 
 #ifdef LINUX
 
-class SystemMapDCmd : public DCmdWithParser {
-  DCmdArgument<bool> _human_readable;
+class SystemMapDCmd : public DCmd {
 public:
-  static int num_arguments() { return 1; }
   SystemMapDCmd(outputStream* output, bool heap);
   static const char* name() { return "System.map"; }
   static const char* description() {
     return "Prints an annotated process memory map of the VM process (linux only).";
   }
-  static const char* impact() { return "Low"; }
+  static const char* impact() { return "Medium; can be high for very large java heaps."; }
   static const JavaPermission permission() {
     JavaPermission p = {"java.lang.management.ManagementPermission",
                         "control", nullptr};
@@ -1002,16 +1000,15 @@ class SystemMapDCmd : public DCmdWithParser {
 };
 
 class SystemDumpMapDCmd : public DCmdWithParser {
-  DCmdArgument<bool> _human_readable;
   DCmdArgument<char*> _filename;
 public:
-  static int num_arguments() { return 2; }
+  static int num_arguments() { return 1; }
   SystemDumpMapDCmd(outputStream* output, bool heap);
   static const char* name() { return "System.dump_map"; }
   static const char* description() {
     return "Dumps an annotated process memory map to an output file (linux only).";
   }
-  static const char* impact() { return "Low"; }
+  static const char* impact() { return "Medium; can be high for very large java heaps."; }
   static const JavaPermission permission() {
     JavaPermission p = {"java.lang.management.ManagementPermission",
                         "control", nullptr};
diff --git a/src/hotspot/share/services/diagnosticFramework.cpp b/src/hotspot/share/services/diagnosticFramework.cpp
index 006c08cb63f..73aa80a950f 100644
--- a/src/hotspot/share/services/diagnosticFramework.cpp
+++ b/src/hotspot/share/services/diagnosticFramework.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -45,7 +45,7 @@ CmdLine::CmdLine(const char* line, size_t len, bool no_command_name)
   line_end = &line[len];
 
   // Skip whitespace in the beginning of the line.
-  while (_cmd < line_end && isspace((int) _cmd[0])) {
+  while (_cmd < line_end && isspace((unsigned char) _cmd[0])) {
     _cmd++;
   }
   cmd_end = _cmd;
@@ -55,7 +55,7 @@ CmdLine::CmdLine(const char* line, size_t len, bool no_command_name)
     _cmd_len = 0;
   } else {
     // Look for end of the command name
-    while (cmd_end < line_end && !isspace((int) cmd_end[0])) {
+    while (cmd_end < line_end && !isspace((unsigned char) cmd_end[0])) {
       cmd_end++;
     }
     _cmd_len = cmd_end - _cmd;
@@ -400,7 +400,15 @@ void DCmd::parse_and_execute(DCmdSource source, outputStream* out,
       break;
     }
     if (line.is_executable()) {
+      // Allow for "<cmd> -h|-help|--help" to enable the help diagnostic command.
+      // Ignores any additional arguments.
       ResourceMark rm;
+      stringStream updated_line;
+      if (reorder_help_cmd(line, updated_line)) {
+        CmdLine updated_cmd(updated_line.base(), updated_line.size(), false);
+        line = updated_cmd;
+      }
+
       DCmd* command = DCmdFactory::create_local_DCmd(source, line, out, CHECK);
       assert(command != nullptr, "command error must be handled before this line");
       DCmdMark mark(command);
@@ -411,6 +419,25 @@ void DCmd::parse_and_execute(DCmdSource source, outputStream* out,
   }
 }
 
+bool DCmd::reorder_help_cmd(CmdLine line, stringStream &updated_line) {
+  stringStream args;
+  args.print("%s", line.args_addr());
+  char* rest = args.as_string();
+  char* token = strtok_r(rest, " ", &rest);
+  while (token != NULL) {
+    if (strcmp(token, "-h") == 0 || strcmp(token, "--help") == 0 ||
+        strcmp(token, "-help") == 0) {
+      updated_line.print("%s", "help ");
+      updated_line.write(line.cmd_addr(), line.cmd_len());
+      updated_line.write("\0", 1);
+      return true;
+    }
+    token = strtok_r(rest, " ", &rest);
+  }
+
+  return false;
+}
+
 void DCmdWithParser::parse(CmdLine* line, char delim, TRAPS) {
   _dcmdparser.parse(line, delim, CHECK);
 }
diff --git a/src/hotspot/share/services/diagnosticFramework.hpp b/src/hotspot/share/services/diagnosticFramework.hpp
index 898f29274ea..e8881c23646 100644
--- a/src/hotspot/share/services/diagnosticFramework.hpp
+++ b/src/hotspot/share/services/diagnosticFramework.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -312,6 +312,9 @@ class DCmd : public AnyObj {
   // management.cpp every time.
   static void register_dcmds();
 
+  // Helper method to substitute help options "<cmd> -h|-help|--help"
+  // for "help <cmd>".
+  static bool reorder_help_cmd(CmdLine line, stringStream& updated_line);
 };
 
 class DCmdWithParser : public DCmd {
diff --git a/src/hotspot/share/services/heapDumper.cpp b/src/hotspot/share/services/heapDumper.cpp
index 6f113cfca95..5b3749381a0 100644
--- a/src/hotspot/share/services/heapDumper.cpp
+++ b/src/hotspot/share/services/heapDumper.cpp
@@ -1089,6 +1089,14 @@ u4 DumperSupport::get_static_fields_size(InstanceKlass* ik, u2& field_count) {
     }
   }
 
+  // Also provide a pointer to the init_lock if present, so there aren't unreferenced int[0]
+  // arrays.
+  oop init_lock = ik->init_lock();
+  if (init_lock != nullptr) {
+    field_count++;
+    size += sizeof(address);
+  }
+
   // We write the value itself plus a name and a one byte type tag per field.
   return checked_cast<u4>(size + field_count * (sizeof(address) + 1));
 }
@@ -1126,6 +1134,14 @@ void DumperSupport::dump_static_fields(AbstractDumpWriter* writer, Klass* k) {
       prev = prev->previous_versions();
     }
   }
+
+  // Add init lock to the end if the class is not yet initialized
+  oop init_lock = ik->init_lock();
+  if (init_lock != nullptr) {
+    writer->write_symbolID(vmSymbols::init_lock_name());         // name
+    writer->write_u1(sig2tag(vmSymbols::int_array_signature())); // type
+    writer->write_objectID(init_lock);
+  }
 }
 
 // dump the raw values of the instance fields of the given object
diff --git a/src/hotspot/share/utilities/concurrentHashTable.hpp b/src/hotspot/share/utilities/concurrentHashTable.hpp
index c7d5832048c..991ea9fe3c6 100644
--- a/src/hotspot/share/utilities/concurrentHashTable.hpp
+++ b/src/hotspot/share/utilities/concurrentHashTable.hpp
@@ -91,6 +91,13 @@ class ConcurrentHashTable : public CHeapObj<F> {
 
     void print_on(outputStream* st) const {};
     void print_value_on(outputStream* st) const {};
+
+    static bool is_dynamic_sized_value_compatible() {
+      // To support dynamically sized Value types, where part of the payload is
+      // allocated beyond the end of the object, it must be that the _value
+      // field ends where the Node object ends. (No end padding).
+      return offset_of(Node, _value) + sizeof(_value) == sizeof(Node);
+    }
   };
 
   // Only constructed with placement new from an array allocated with MEMFLAGS
@@ -419,6 +426,7 @@ class ConcurrentHashTable : public CHeapObj<F> {
 
   size_t get_size_log2(Thread* thread);
   static size_t get_node_size() { return sizeof(Node); }
+  static size_t get_dynamic_node_size(size_t value_size);
   bool is_max_size_reached() { return _size_limit_reached; }
 
   // This means no paused bucket resize operation is going to resume
diff --git a/src/hotspot/share/utilities/concurrentHashTable.inline.hpp b/src/hotspot/share/utilities/concurrentHashTable.inline.hpp
index 2b30e664109..78c7e148bbb 100644
--- a/src/hotspot/share/utilities/concurrentHashTable.inline.hpp
+++ b/src/hotspot/share/utilities/concurrentHashTable.inline.hpp
@@ -318,7 +318,7 @@ inline bool ConcurrentHashTable<CONFIG, F>::
   } else {
     return false;
   }
-  _invisible_epoch = 0;
+  _invisible_epoch = nullptr;
   _resize_lock_owner = locker;
   return true;
 }
@@ -345,14 +345,14 @@ inline void ConcurrentHashTable<CONFIG, F>::
     }
   } while(true);
   _resize_lock_owner = locker;
-  _invisible_epoch = 0;
+  _invisible_epoch = nullptr;
 }
 
 template <typename CONFIG, MEMFLAGS F>
 inline void ConcurrentHashTable<CONFIG, F>::
   unlock_resize_lock(Thread* locker)
 {
-  _invisible_epoch = 0;
+  _invisible_epoch = nullptr;
   assert(locker == _resize_lock_owner, "Not unlocked by locker.");
   _resize_lock_owner = nullptr;
   _resize_lock->unlock();
@@ -1016,7 +1016,7 @@ ConcurrentHashTable(size_t log2size, size_t log2size_limit, size_t grow_hint, bo
     : _context(context), _new_table(nullptr), _log2_size_limit(log2size_limit),
       _log2_start_size(log2size), _grow_hint(grow_hint),
       _size_limit_reached(false), _resize_lock_owner(nullptr),
-      _invisible_epoch(0)
+      _invisible_epoch(nullptr)
 {
   if (enable_statistics) {
     _stats_rate = new TableRateStatistics();
@@ -1055,6 +1055,15 @@ inline size_t ConcurrentHashTable<CONFIG, F>::
   return _table->_log2_size;
 }
 
+template <typename CONFIG, MEMFLAGS F>
+inline size_t ConcurrentHashTable<CONFIG, F>::
+  get_dynamic_node_size(size_t value_size)
+{
+  assert(Node::is_dynamic_sized_value_compatible(), "VALUE must be compatible");
+  assert(value_size >= sizeof(VALUE), "must include the VALUE");
+  return sizeof(Node) - sizeof(VALUE) + value_size;
+}
+
 template <typename CONFIG, MEMFLAGS F>
 inline bool ConcurrentHashTable<CONFIG, F>::
   shrink(Thread* thread, size_t size_limit_log2)
diff --git a/src/hotspot/share/utilities/globalDefinitions.hpp b/src/hotspot/share/utilities/globalDefinitions.hpp
index a15a4de3e93..74817a35e77 100644
--- a/src/hotspot/share/utilities/globalDefinitions.hpp
+++ b/src/hotspot/share/utilities/globalDefinitions.hpp
@@ -455,6 +455,7 @@ typedef unsigned int uint;   NEEDS_CLEANUP
 typedef   signed char s_char;
 typedef unsigned char u_char;
 typedef u_char*       address;
+typedef const u_char* const_address;
 
 // Pointer subtraction.
 // The idea here is to avoid ptrdiff_t, which is signed and so doesn't have
diff --git a/src/hotspot/share/utilities/nativeCallStack.cpp b/src/hotspot/share/utilities/nativeCallStack.cpp
index 3ddf296506c..cc4796f54d3 100644
--- a/src/hotspot/share/utilities/nativeCallStack.cpp
+++ b/src/hotspot/share/utilities/nativeCallStack.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -71,51 +71,49 @@ int NativeCallStack::frames() const {
   return index;
 }
 
-void NativeCallStack::print_on(outputStream* out) const {
-  print_on(out, 0);
-}
-
 // Decode and print this call path
-void NativeCallStack::print_on(outputStream* out, int indent) const {
-  DEBUG_ONLY(assert_not_fake();)
-  address pc;
+
+void NativeCallStack::print_frame(outputStream* out, address pc) const {
   char    buf[1024];
   int     offset;
-  if (is_empty()) {
-    out->fill_to(indent);
-    out->print("[BOOTSTRAP]");
-  } else {
-    for (int frame = 0; frame < NMT_TrackingStackDepth; frame ++) {
-      pc = get_frame(frame);
-      if (pc == nullptr) break;
-      out->fill_to(indent);
-      out->print("[" PTR_FORMAT "]", p2i(pc));
-      // Print function and library; shorten library name to just its last component
-      // for brevity, and omit it completely for libjvm.so
-      bool function_printed = false;
-      if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) {
-        out->print("%s+0x%x", buf, offset);
-        function_printed = true;
-      }
-      if ((!function_printed || !os::address_is_in_vm(pc)) &&
-          os::dll_address_to_library_name(pc, buf, sizeof(buf), &offset)) {
-        const char* libname = strrchr(buf, os::file_separator()[0]);
-        if (libname != nullptr) {
-          libname++;
-        } else {
-          libname = buf;
-        }
-        out->print(" in %s", libname);
-        if (!function_printed) {
-          out->print("+0x%x", offset);
-        }
+  int     line;
+  const bool pc_in_VM = os::address_is_in_vm(pc);
+  out->print("[" PTR_FORMAT "]", p2i(pc));
+  // Print function and library; shorten library name to just its last component
+  // for brevity, and omit it completely for libjvm.so
+  bool function_printed = false;
+  if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) {
+    out->print("%s+0x%x", buf, offset);
+    function_printed = true;
+    if (Decoder::get_source_info(pc, buf, sizeof(buf), &line, false)) {
+      // For intra-vm functions, we omit the full path
+      const char* s = buf;
+      if (pc_in_VM) {
+        s = strrchr(s, os::file_separator()[0]);
+        s = (s != nullptr) ? s + 1 : buf;
       }
-
-      // Note: we deliberately omit printing source information here. NativeCallStack::print_on()
-      // can be called thousands of times as part of NMT detail reporting, and source printing
-      // can slow down reporting by a factor of 5 or more depending on platform (see JDK-8296931).
-
-      out->cr();
+      out->print("   (%s:%d)", s, line);
     }
   }
+  if ((!function_printed || !pc_in_VM) &&
+      os::dll_address_to_library_name(pc, buf, sizeof(buf), &offset)) {
+    const char* libname = strrchr(buf, os::file_separator()[0]);
+    if (libname != nullptr) {
+      libname++;
+    } else {
+      libname = buf;
+    }
+    out->print(" in %s", libname);
+    if (!function_printed) {
+      out->print("+0x%x", offset);
+    }
+  }
+}
+
+void NativeCallStack::print_on(outputStream* out) const {
+  DEBUG_ONLY(assert_not_fake();)
+  for (int i = 0; i < NMT_TrackingStackDepth && _stack[i] != nullptr; i++) {
+    print_frame(out, _stack[i]);
+  }
+  out->cr();
 }
diff --git a/src/hotspot/share/utilities/nativeCallStack.hpp b/src/hotspot/share/utilities/nativeCallStack.hpp
index 43e90512b52..3ab72d67eca 100644
--- a/src/hotspot/share/utilities/nativeCallStack.hpp
+++ b/src/hotspot/share/utilities/nativeCallStack.hpp
@@ -28,6 +28,7 @@
 #include "memory/allocation.hpp"
 #include "nmt/nmtCommon.hpp"
 #include "utilities/ostream.hpp"
+#include "utilities/resourceHash.hpp"
 
 /*
  * This class represents a native call path (does not include Java frame)
@@ -123,8 +124,8 @@ class NativeCallStack : public StackObj {
     return (unsigned int)hash;
   }
 
+  void print_frame(outputStream* out, address pc) const;
   void print_on(outputStream* out) const;
-  void print_on(outputStream* out, int indent) const;
 };
 
 #define FAKE_CALLSTACK NativeCallStack(NativeCallStack::FakeMarker::its_fake)
diff --git a/src/hotspot/share/utilities/ostream.cpp b/src/hotspot/share/utilities/ostream.cpp
index 858f6798e28..b8f27fbd413 100644
--- a/src/hotspot/share/utilities/ostream.cpp
+++ b/src/hotspot/share/utilities/ostream.cpp
@@ -44,18 +44,11 @@
 extern "C" void jio_print(const char* s, size_t len);
 extern "C" int jio_printf(const char *fmt, ...);
 
-outputStream::outputStream() {
-  _position    = 0;
-  _precount    = 0;
-  _indentation = 0;
-  _scratch     = nullptr;
-  _scratch_len = 0;
-}
-
 outputStream::outputStream(bool has_time_stamps) {
   _position    = 0;
   _precount    = 0;
   _indentation = 0;
+  _autoindent  = false;
   _scratch     = nullptr;
   _scratch_len = 0;
   if (has_time_stamps)  _stamp.update();
@@ -159,6 +152,9 @@ void outputStream::do_vsnprintf_and_write_with_scratch_buffer(const char* format
 }
 
 void outputStream::do_vsnprintf_and_write(const char* format, va_list ap, bool add_cr) {
+  if (_autoindent && _position == 0) {
+    indent();
+  }
   if (_scratch) {
     do_vsnprintf_and_write_with_scratch_buffer(format, ap, add_cr);
   } else {
@@ -188,9 +184,17 @@ void outputStream::vprint_cr(const char* format, va_list argptr) {
   do_vsnprintf_and_write(format, argptr, true);
 }
 
-void outputStream::fill_to(int col) {
-  int need_fill = col - position();
+void outputStream::print_raw(const char* str, size_t len) {
+  if (_autoindent && _position == 0) {
+    indent();
+  }
+  write(str, len);
+}
+
+int outputStream::fill_to(int col) {
+  const int need_fill = MAX2(col - position(), 0);
   sp(need_fill);
+  return need_fill;
 }
 
 void outputStream::move_to(int col, int slop, int min_space) {
@@ -274,6 +278,12 @@ outputStream& outputStream::indent() {
   return *this;
 }
 
+bool outputStream::set_autoindent(bool value) {
+  const bool old = _autoindent;
+  _autoindent = value;
+  return old;
+}
+
 void outputStream::print_jlong(jlong value) {
   print(JLONG_FORMAT, value);
 }
@@ -976,7 +986,7 @@ void ostream_exit() {
   ClassListWriter::delete_classlist();
   // Make sure tty works after VM exit by assigning an always-on functioning fdStream.
   outputStream* tmp = tty;
-  tty = DisplayVMOutputToStderr ? fdStream::stdout_stream() : fdStream::stderr_stream();
+  tty = DisplayVMOutputToStderr ? fdStream::stderr_stream() : fdStream::stdout_stream();
   if (tmp != &tty_preinit_stream && tmp != defaultStream::instance) {
     delete tmp;
   }
@@ -1028,7 +1038,7 @@ void bufferedStream::write(const char* s, size_t len) {
     const size_t reasonable_cap = MAX2(100 * M, buffer_max * 2);
     if (end > reasonable_cap) {
       // In debug VM, assert right away.
-      assert(false, "Exceeded max buffer size for this string.");
+      assert(false, "Exceeded max buffer size for this string (\"%.200s...\").", buffer);
       // Release VM: silently truncate. We do this since these kind of errors
       // are both difficult to predict with testing (depending on logging content)
       // and usually not serious enough to kill a production VM for it.
diff --git a/src/hotspot/share/utilities/ostream.hpp b/src/hotspot/share/utilities/ostream.hpp
index 98ea9f54a34..9faaf32fb6b 100644
--- a/src/hotspot/share/utilities/ostream.hpp
+++ b/src/hotspot/share/utilities/ostream.hpp
@@ -46,9 +46,10 @@ DEBUG_ONLY(class ResourceMark;)
 class outputStream : public CHeapObjBase {
  private:
    NONCOPYABLE(outputStream);
+   int _indentation; // current indentation
+   bool _autoindent; // if true, every line starts with indentation
 
  protected:
-   int _indentation; // current indentation
    int _position;    // visual position on the current line
    uint64_t _precount; // number of chars output, less than _position
    TimeStamp _stamp; // for time stamps
@@ -90,8 +91,7 @@ class outputStream : public CHeapObjBase {
    class TestSupport;  // Unit test support
 
    // creation
-   outputStream();
-   outputStream(bool has_time_stamps);
+   outputStream(bool has_time_stamps = false);
 
    // indentation
    outputStream& indent();
@@ -101,9 +101,17 @@ class outputStream : public CHeapObjBase {
    void dec(int n) { _indentation -= n; };
    int  indentation() const    { return _indentation; }
    void set_indentation(int i) { _indentation = i;    }
-   void fill_to(int col);
+   int fill_to(int col);
    void move_to(int col, int slop = 6, int min_space = 2);
 
+   // Automatic indentation:
+   // If autoindent mode is on, the following APIs will automatically indent
+   // line starts depending on the current indentation level:
+   // print(), print_cr(), print_raw(), print_raw_cr()
+   // Other APIs are unaffected
+   // Returns old autoindent state.
+   bool set_autoindent(bool value);
+
    // sizing
    int position() const { return _position; }
    julong count() const { return _precount + _position; }
@@ -119,10 +127,10 @@ class outputStream : public CHeapObjBase {
    void print_cr(const char* format, ...) ATTRIBUTE_PRINTF(2, 3);
    void vprint(const char *format, va_list argptr) ATTRIBUTE_PRINTF(2, 0);
    void vprint_cr(const char* format, va_list argptr) ATTRIBUTE_PRINTF(2, 0);
-   void print_raw(const char* str) { write(str, strlen(str)); }
-   void print_raw(const char* str, size_t len) { write(str, len); }
-   void print_raw_cr(const char* str) { write(str, strlen(str)); cr(); }
-   void print_raw_cr(const char* str, size_t len){ write(str, len); cr(); }
+   void print_raw(const char* str)                { print_raw(str, strlen(str)); }
+   void print_raw(const char* str, size_t len);
+   void print_raw_cr(const char* str)             { print_raw(str); cr(); }
+   void print_raw_cr(const char* str, size_t len) { print_raw(str, len); cr(); }
    void print_data(void* data, size_t len, bool with_ascii, bool rel_addr=true);
    void put(char ch);
    void sp(int count = 1);
@@ -168,17 +176,26 @@ class outputStream : public CHeapObjBase {
 extern outputStream* tty;           // tty output
 
 class streamIndentor : public StackObj {
- private:
-  outputStream* _str;
-  int _amount;
-
- public:
+  outputStream* const _str;
+  const int _amount;
+  NONCOPYABLE(streamIndentor);
+public:
   streamIndentor(outputStream* str, int amt = 2) : _str(str), _amount(amt) {
     _str->inc(_amount);
   }
   ~streamIndentor() { _str->dec(_amount); }
 };
 
+class StreamAutoIndentor : public StackObj {
+  outputStream* const _os;
+  const bool _old;
+  NONCOPYABLE(StreamAutoIndentor);
+ public:
+  StreamAutoIndentor(outputStream* os) :
+    _os(os), _old(os->set_autoindent(true)) {}
+  ~StreamAutoIndentor() { _os->set_autoindent(_old); }
+};
+
 // advisory locking for the shared tty stream:
 class ttyLocker: StackObj {
   friend class ttyUnlocker;
@@ -250,6 +267,7 @@ class stringStream : public outputStream {
     return _buffer;
   };
   void  reset();
+  bool is_empty() const { return _buffer[0] == '\0'; }
   // Copy to a resource, or C-heap, array as requested
   char* as_string(bool c_heap = false) const;
 };
diff --git a/src/hotspot/share/utilities/quickSort.hpp b/src/hotspot/share/utilities/quickSort.hpp
index 7134463f387..e434a59da35 100644
--- a/src/hotspot/share/utilities/quickSort.hpp
+++ b/src/hotspot/share/utilities/quickSort.hpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,25 +26,23 @@
 #define SHARE_UTILITIES_QUICKSORT_HPP
 
 #include "memory/allStatic.hpp"
-#include "runtime/globals.hpp"
 #include "utilities/debug.hpp"
+#include "utilities/globalDefinitions.hpp"
 
 class QuickSort : AllStatic {
 
  private:
   template<class T>
-  static void swap(T* array, size_t x, size_t y) {
-    T tmp = array[x];
-    array[x] = array[y];
-    array[y] = tmp;
+  static void swap_elements(T* array, size_t x, size_t y) {
+    swap(array[x], array[y]);
   }
 
   // As pivot we use the median of the first, last and middle elements.
-  // We swap in these three values at the right place in the array. This
-  // means that this method not only returns the index of the pivot
-  // element. It also alters the array so that:
+  // We swap these three values as needed so that
   //     array[first] <= array[middle] <= array[last]
-  // A side effect of this is that arrays of length <= 3 are sorted.
+  // As a result, the first and last elements are placed in the proper
+  // partition, and arrays of length <= 3 are sorted.
+  // The middle index is returned, designating that element as the pivot.
   template<class T, class C>
   static size_t find_pivot(T* array, size_t length, C comparator) {
     assert(length > 1, "length of array must be > 0");
@@ -53,20 +51,20 @@ class QuickSort : AllStatic {
     size_t last_index = length - 1;
 
     if (comparator(array[0], array[middle_index]) > 0) {
-      swap(array, 0, middle_index);
+      swap_elements(array, 0, middle_index);
     }
     if (comparator(array[0], array[last_index]) > 0) {
-      swap(array, 0, last_index);
+      swap_elements(array, 0, last_index);
     }
     if (comparator(array[middle_index], array[last_index]) > 0) {
-      swap(array, middle_index, last_index);
+      swap_elements(array, middle_index, last_index);
     }
     // Now the value in the middle of the array is the median
-    // of the fist, last and middle values. Use this as pivot.
+    // of the first, last and middle values. Use this as pivot.
     return middle_index;
   }
 
-  template<bool idempotent, class T, class C>
+  template<class T, class C>
   static size_t partition(T* array, size_t pivot, size_t length, C comparator) {
     size_t left_index = 0;
     size_t right_index = length - 1;
@@ -74,27 +72,22 @@ class QuickSort : AllStatic {
 
     for ( ; true; ++left_index, --right_index) {
       for ( ; comparator(array[left_index], pivot_val) < 0; ++left_index) {
-        assert(left_index < length, "reached end of partition");
+        assert(left_index < (length - 1), "reached end of partition");
       }
       for ( ; comparator(array[right_index], pivot_val) > 0; --right_index) {
         assert(right_index > 0, "reached start of partition");
       }
-
       if (left_index < right_index) {
-        if (!idempotent || comparator(array[left_index], array[right_index]) != 0) {
-          swap(array, left_index, right_index);
-        }
+        swap_elements(array, left_index, right_index);
       } else {
         return right_index;
       }
     }
-
-    ShouldNotReachHere();
-    return 0;
   }
 
-  template<bool idempotent, class T, class C>
-  static void inner_sort(T* array, size_t length, C comparator) {
+ public:
+  template<class T, class C>
+  static void sort(T* array, size_t length, C comparator) {
     if (length < 2) {
       return;
     }
@@ -103,28 +96,11 @@ class QuickSort : AllStatic {
       // arrays up to length 3 will be sorted after finding the pivot
       return;
     }
-    size_t split = partition<idempotent>(array, pivot, length, comparator);
+    size_t split = partition(array, pivot, length, comparator);
     size_t first_part_length = split + 1;
-    inner_sort<idempotent>(array, first_part_length, comparator);
-    inner_sort<idempotent>(&array[first_part_length], length - first_part_length, comparator);
-  }
-
- public:
-  // The idempotent parameter prevents the sort from
-  // reordering a previous valid sort by not swapping
-  // fields that compare as equal. This requires extra
-  // calls to the comparator, so the performance
-  // impact depends on the comparator.
-  template<class T, class C>
-  static void sort(T* array, size_t length, C comparator, bool idempotent) {
-    // Switch "idempotent" from function parameter to template parameter
-    if (idempotent) {
-      inner_sort<true>(array, length, comparator);
-    } else {
-      inner_sort<false>(array, length, comparator);
-    }
+    sort(array, first_part_length, comparator);
+    sort(&array[first_part_length], length - first_part_length, comparator);
   }
 };
 
-
 #endif // SHARE_UTILITIES_QUICKSORT_HPP
diff --git a/src/hotspot/share/utilities/vmError.cpp b/src/hotspot/share/utilities/vmError.cpp
index 656fe9403fe..0b3ccf9c747 100644
--- a/src/hotspot/share/utilities/vmError.cpp
+++ b/src/hotspot/share/utilities/vmError.cpp
@@ -60,6 +60,7 @@
 #include "runtime/vmOperations.hpp"
 #include "runtime/vmThread.hpp"
 #include "runtime/vm_version.hpp"
+#include "sanitizers/ub.hpp"
 #include "utilities/debug.hpp"
 #include "utilities/decoder.hpp"
 #include "utilities/defaultStream.hpp"
@@ -2086,9 +2087,7 @@ typedef void (*voidfun_t)();
 // compared to one generated with raise (asynchronous vs synchronous). See JDK-8065895.
 volatile int sigfpe_int = 0;
 
-#if defined(__clang__) || defined(__GNUC__)
-__attribute__((no_sanitize("undefined")))
-#endif
+ATTRIBUTE_NO_UBSAN
 static void ALWAYSINLINE crash_with_sigfpe() {
 
   // generate a native synchronous SIGFPE where possible;
diff --git a/src/java.base/linux/classes/jdk/internal/platform/CgroupMetrics.java b/src/java.base/linux/classes/jdk/internal/platform/CgroupMetrics.java
index 8797711bf4b..af551a07b1e 100644
--- a/src/java.base/linux/classes/jdk/internal/platform/CgroupMetrics.java
+++ b/src/java.base/linux/classes/jdk/internal/platform/CgroupMetrics.java
@@ -35,6 +35,11 @@ public class CgroupMetrics implements Metrics {
         this.subsystem = Objects.requireNonNull(subsystem);
     }
 
+    @Override
+    public boolean isContainerized() {
+        return isContainerized0();
+    }
+
     @Override
     public String getProvider() {
         return subsystem.getProvider();
@@ -194,6 +199,7 @@ public static Metrics getInstance() {
     }
 
     private static native boolean isUseContainerSupport();
+    private static native boolean isContainerized0();
     private static native long getTotalMemorySize0();
     private static native long getTotalSwapSize0();
 
diff --git a/src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystem.java b/src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystem.java
index 952de13e9f2..7df86d03ff4 100644
--- a/src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystem.java
+++ b/src/java.base/linux/classes/jdk/internal/platform/CgroupSubsystem.java
@@ -31,6 +31,11 @@
  */
 public interface CgroupSubsystem extends Metrics {
 
+
+    default boolean isContainerized() {
+        return false; // This default impl is never used
+    }
+
     /**
      * Returned for metrics of type long if the underlying implementation
      * has determined that no limit is being imposed.
diff --git a/src/java.base/linux/native/libjava/CgroupMetrics.c b/src/java.base/linux/native/libjava/CgroupMetrics.c
index a5e41167bc3..e2f98633459 100644
--- a/src/java.base/linux/native/libjava/CgroupMetrics.c
+++ b/src/java.base/linux/native/libjava/CgroupMetrics.c
@@ -36,6 +36,12 @@ Java_jdk_internal_platform_CgroupMetrics_isUseContainerSupport(JNIEnv *env, jcla
     return JVM_IsUseContainerSupport();
 }
 
+JNIEXPORT jboolean JNICALL
+Java_jdk_internal_platform_CgroupMetrics_isContainerized0(JNIEnv *env, jclass ignored)
+{
+    return JVM_IsContainerized();
+}
+
 JNIEXPORT jlong JNICALL
 Java_jdk_internal_platform_CgroupMetrics_getTotalMemorySize0
   (JNIEnv *env, jclass ignored)
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java
index 2672807aadd..51671fdf25d 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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,19 +25,19 @@
 
 package com.sun.crypto.provider;
 
-import java.security.SecureRandom;
-import java.security.InvalidParameterException;
 import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
+import java.security.InvalidParameterException;
+import java.security.SecureRandom;
 import java.security.spec.AlgorithmParameterSpec;
 import java.util.Arrays;
 import javax.crypto.KeyGeneratorSpi;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+
 import sun.security.util.SecurityProviderConstants;
 
 /**
- * This class generates a AES key.
+ * This class generates an AES key.
  *
  * @author Valerie Peng
  *
@@ -105,7 +105,7 @@ protected void engineInit(int keysize, SecureRandom random) {
      * @return the new AES key
      */
     protected SecretKey engineGenerateKey() {
-        SecretKeySpec aesKey = null;
+        SecretKeySpec aesKey;
 
         if (this.random == null) {
             this.random = SunJCE.getRandom();
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java
index 9cb33899640..7fad0b84d07 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, 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,11 +25,11 @@
 
 package com.sun.crypto.provider;
 
-import java.util.Arrays;
-import java.security.*;
-import java.security.spec.*;
-import javax.crypto.*;
-import javax.crypto.spec.*;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import javax.crypto.IllegalBlockSizeException;
+
 import static com.sun.crypto.provider.KWUtil.*;
 
 /**
@@ -66,7 +66,7 @@ String getFeedback() {
     @Override
     void save() {
         throw new UnsupportedOperationException("save not supported");
-    };
+    }
 
     /**
      * Restores the content of this cipher to the previous saved one.
@@ -74,7 +74,7 @@ void save() {
     @Override
     void restore() {
         throw new UnsupportedOperationException("restore not supported");
-    };
+    }
 
     /**
      * Initializes the cipher in the specified mode with the given key
@@ -112,20 +112,20 @@ void init(boolean decrypting, String algorithm, byte[] key, byte[] iv)
     @Override
     void reset() {
         throw new UnsupportedOperationException("reset not supported");
-    };
+    }
 
 
-    // no support for multi-part encryption
+    // no support for multipart encryption
     @Override
     int encrypt(byte[] pt, int ptOfs, int ptLen, byte[] ct, int ctOfs) {
-        throw new UnsupportedOperationException("multi-part not supported");
-    };
+        throw new UnsupportedOperationException("multipart not supported");
+    }
 
-    // no support for multi-part decryption
+    // no support for multipart decryption
     @Override
     int decrypt(byte[] ct, int ctOfs, int ctLen, byte[] pt, int ptOfs) {
-        throw new UnsupportedOperationException("multi-part not supported");
-    };
+        throw new UnsupportedOperationException("multipart not supported");
+    }
 
     /**
      * Performs single-part encryption operation.
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java
index 4ae96acbca8..1e4e7236c8c 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, 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,12 +25,12 @@
 
 package com.sun.crypto.provider;
 
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
 import java.util.Arrays;
 import java.util.HexFormat;
-import java.security.*;
-import java.security.spec.*;
-import javax.crypto.*;
-import javax.crypto.spec.*;
+import javax.crypto.IllegalBlockSizeException;
+
 import static com.sun.crypto.provider.KWUtil.*;
 
 /**
@@ -49,7 +49,7 @@ class AESKeyWrapPadded extends FeedbackCipher {
 
     private static final byte[] PAD_BLK = new byte[SEMI_BLKSIZE - 1];
 
-    // set the first semiblock of dest with iv and inLen
+    // set the first semi-block of dest with iv and inLen
     private static void setIvAndLen(byte[] dest, byte[] iv, int inLen) {
         assert(dest.length >= SEMI_BLKSIZE) : "buffer needs at least 8 bytes";
 
@@ -60,7 +60,7 @@ private static void setIvAndLen(byte[] dest, byte[] iv, int inLen) {
         dest[7] = (byte) (inLen & 0xFF);
     }
 
-    // validate the recovered internal ivAndLen semiblock against iv and
+    // validate the recovered internal ivAndLen semi-block against iv and
     // return the recovered input length
     private static int validateIV(byte[] ivAndLen, byte[] iv)
             throws IllegalBlockSizeException {
@@ -103,7 +103,7 @@ String getFeedback() {
     @Override
     void save() {
         throw new UnsupportedOperationException("save not supported");
-    };
+    }
 
     /**
      * Restores the content of this cipher to the previous saved one.
@@ -111,7 +111,7 @@ void save() {
     @Override
     void restore() {
         throw new UnsupportedOperationException("restore not supported");
-    };
+    }
 
     /**
      * Initializes the cipher in the specified mode with the given key
@@ -151,19 +151,19 @@ void init(boolean decrypting, String algorithm, byte[] key, byte[] iv)
     @Override
     void reset() {
         throw new UnsupportedOperationException("reset not supported");
-    };
+    }
 
-    // no support for multi-part encryption
+    // no support for multipart encryption
     @Override
     int encrypt(byte[] pt, int ptOfs, int ptLen, byte[] ct, int ctOfs) {
-        throw new UnsupportedOperationException("multi-part not supported");
-    };
+        throw new UnsupportedOperationException("multipart not supported");
+    }
 
-    // no support for multi-part decryption
+    // no support for multipart decryption
     @Override
     int decrypt(byte[] ct, int ctOfs, int ctLen, byte[] pt, int ptOfs) {
-        throw new UnsupportedOperationException("multi-part not supported");
-    };
+        throw new UnsupportedOperationException("multipart not supported");
+    }
 
     /**
      * Performs single-part encryption operation.
@@ -199,7 +199,7 @@ int encryptFinal(byte[] pt, int dummy1, int ptLen, byte[] dummy2,
         }
 
         if (ptLen <= BLKSIZE) {
-            // overwrite the first semiblock with iv and input length
+            // overwrite the first semi-block with iv and input length
             setIvAndLen(pt, iv, actualLen);
             embeddedCipher.encryptBlock(pt, 0, pt, 0);
         } else {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ARCFOURCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/ARCFOURCipher.java
index 09d5a8cddeb..d7c0f3dd35d 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/ARCFOURCipher.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/ARCFOURCipher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -114,7 +114,7 @@ private void crypt(byte[] in, int inOfs, int inLen, byte[] out,
     // Modes do not make sense with stream ciphers, but allow ECB
     // see JCE spec.
     protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
-        if (mode.equalsIgnoreCase("ECB") == false) {
+        if (!mode.equalsIgnoreCase("ECB")) {
             throw new NoSuchAlgorithmException("Unsupported mode " + mode);
         }
     }
@@ -123,7 +123,7 @@ protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
     // see JCE spec.
     protected void engineSetPadding(String padding)
             throws NoSuchPaddingException {
-        if (padding.equalsIgnoreCase("NoPadding") == false) {
+        if (!padding.equalsIgnoreCase("NoPadding")) {
             throw new NoSuchPaddingException("Padding must be NoPadding");
         }
     }
@@ -201,7 +201,7 @@ private static byte[] getEncodedKey(Key key) throws InvalidKeyException {
         if (!keyAlg.equals("RC4") && !keyAlg.equals("ARCFOUR")) {
             throw new InvalidKeyException("Not an ARCFOUR key: " + keyAlg);
         }
-        if ("RAW".equals(key.getFormat()) == false) {
+        if (!"RAW".equals(key.getFormat())) {
             throw new InvalidKeyException("Key encoding format must be RAW");
         }
         byte[] encodedKey = key.getEncoded();
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java
index ed2fda5bf00..fc39b4ed634 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -156,7 +156,7 @@ protected ChaCha20Cipher() { }
      */
     @Override
     protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
-        if (mode.equalsIgnoreCase("None") == false) {
+        if (!mode.equalsIgnoreCase("None")) {
             throw new NoSuchAlgorithmException("Mode must be None");
         }
     }
@@ -174,7 +174,7 @@ protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
     @Override
     protected void engineSetPadding(String padding)
             throws NoSuchPaddingException {
-        if (padding.equalsIgnoreCase("NoPadding") == false) {
+        if (!padding.equalsIgnoreCase("NoPadding")) {
             throw new NoSuchPaddingException("Padding must be NoPadding");
         }
     }
@@ -326,7 +326,7 @@ protected void engineInit(int opmode, Key key,
 
         // We will ignore the secure random implementation and use the nonce
         // from the AlgorithmParameterSpec instead.
-        byte[] newNonce = null;
+        byte[] newNonce;
         switch (mode) {
             case MODE_NONE:
                 if (!(params instanceof ChaCha20ParameterSpec)) {
@@ -360,7 +360,7 @@ protected void engineInit(int opmode, Key key,
 
     /**
      * Initialize the engine using the {@code AlgorithmParameter} initialization
-     * format.  This cipher does supports initialization with
+     * format.  This cipher supports initialization with
      * {@code AlgorithmParameter} objects for ChaCha20-Poly1305 but not for
      * ChaCha20 as a simple stream cipher.  In the latter case, it will throw
      * an {@code InvalidAlgorithmParameterException} if the value is non-null.
@@ -618,7 +618,7 @@ private void checkKeyAndNonce(byte[] newKeyBytes, byte[] newNonce)
      *      or if the key encoding format is not {@code RAW}.
      */
     private static byte[] getEncodedKey(Key key) throws InvalidKeyException {
-        if ("RAW".equals(key.getFormat()) == false) {
+        if (!"RAW".equals(key.getFormat())) {
             throw new InvalidKeyException("Key encoding format must be RAW");
         }
         byte[] encodedKey = key.getEncoded();
@@ -675,7 +675,7 @@ protected byte[] engineUpdate(byte[] in, int inOfs, int inLen) {
     @Override
     protected int engineUpdate(byte[] in, int inOfs, int inLen,
             byte[] out, int outOfs) throws ShortBufferException {
-        int bytesUpdated = 0;
+        int bytesUpdated;
         try {
             bytesUpdated = engine.doUpdate(in, inOfs, inLen, out, outOfs);
         } catch (KeyException ke) {
@@ -691,10 +691,10 @@ protected int engineUpdate(byte[] in, int inOfs, int inLen,
      * @param output ByteBuffer that will hold the resulting data.  This
      *      must be large enough to hold the resulting data.
      *
-     * @return the length in bytes of the data written into the {@code out}
+     * @return the length in bytes of the data written into the {@code output}
      *      buffer.
      *
-     * @throws ShortBufferException if the buffer {@code out} does not have
+     * @throws ShortBufferException if the buffer {@code output} does not have
      *      enough space to hold the resulting data.
      */
     @Override
@@ -763,7 +763,7 @@ protected byte[] engineDoFinal(byte[] in, int inOfs, int inLen)
     protected int engineDoFinal(byte[] in, int inOfs, int inLen, byte[] out,
             int outOfs) throws ShortBufferException, AEADBadTagException {
 
-        int bytesUpdated = 0;
+        int bytesUpdated;
         try {
             bytesUpdated = engine.doFinal(in, inOfs, inLen, out, outOfs);
         } catch (KeyException ke) {
@@ -785,6 +785,9 @@ protected int engineDoFinal(byte[] in, int inOfs, int inLen, byte[] out,
      *
      * @return the resulting plaintext or ciphertext bytes.
      *
+     * @throws ShortBufferException if the buffer {@code output} does not have
+     *      enough space to hold the resulting data.
+     *
      * @throws AEADBadTagException if, during decryption, the provided tag
      *      does not match the calculated tag.
      */
@@ -947,12 +950,8 @@ protected int engineGetKeySize(Key key) throws InvalidKeyException {
      * key and nonce into their proper locations.  The counter field is not
      * set here.
      *
-     * @throws IllegalArgumentException if the key or nonce are not in
-     *      their proper lengths (32 bytes for the key, 12 bytes for the
-     *      nonce).
-     * @throws InvalidKeyException if the key does not support an encoded form.
      */
-    private void setInitialState() throws InvalidKeyException {
+    private void setInitialState() {
         // Apply constants to first 4 words
         startState[0] = STATE_CONST_0;
         startState[1] = STATE_CONST_1;
@@ -1257,11 +1256,11 @@ private int authUpdate(byte[] data, int offset, int length) {
      * @param out the array to write the resulting tag into
      * @param outOff the offset to begin writing the data.
      *
-     * @throws ShortBufferException if there is insufficient room to
+     * @throws ProviderException if there is insufficient room to
      *      write the tag.
      */
     private void authFinalizeData(byte[] data, int dataOff, int length,
-            byte[] out, int outOff) throws ShortBufferException {
+            byte[] out, int outOff) {
         // Update with the final chunk of ciphertext, then pad to a
         // multiple of 16.
         if (data != null) {
@@ -1300,7 +1299,7 @@ private void authPad16(long dataLen) {
      * @param dLen the length of the application data.
      * @param buf the buffer to write the two lengths into.
      *
-     * @note it is the caller's responsibility to provide an array large
+     * @implNote it is the caller's responsibility to provide an array large
      *      enough to hold the two longs.
      */
     private void authWriteLengths(long aLen, long dLen, byte[] buf) {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Poly1305Parameters.java b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Poly1305Parameters.java
index 762827d0152..ab9d4a23e60 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Poly1305Parameters.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Poly1305Parameters.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, 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
@@ -206,8 +206,7 @@ protected byte[] engineGetEncoded(String encodingMethod)
     protected String engineToString() {
         String LINE_SEP = System.lineSeparator();
         HexDumpEncoder encoder = new HexDumpEncoder();
-        StringBuilder sb = new StringBuilder(LINE_SEP + "nonce:" +
-                LINE_SEP + "[" + encoder.encodeBuffer(nonce) + "]");
-        return sb.toString();
+        return LINE_SEP + "nonce:" +
+                LINE_SEP + "[" + encoder.encodeBuffer(nonce) + "]";
     }
 }
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/CipherBlockChaining.java b/src/java.base/share/classes/com/sun/crypto/provider/CipherBlockChaining.java
index 5d756e26847..4bd7faea722 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/CipherBlockChaining.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/CipherBlockChaining.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -180,7 +180,7 @@ private int implEncrypt(byte[] plain, int plainOffset, int plainLen,
      *
      * <p>It is also the application's responsibility to make sure that
      * <code>init</code> has been called before this method is called.
-     * (This check is omitted here, to avoid double checking.)
+     * (This check is omitted here, to avoid double-checking.)
      *
      * @param cipher the buffer with the input data to be decrypted
      * @param cipherOffset the offset in <code>cipherOffset</code>
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java b/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java
index 2555448e3c0..c808756fa1d 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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 @@ final class CipherCore {
     /*
      * unit size (number of input bytes that can be processed at a time)
      */
-    private int unitBytes = 0;
+    private int unitBytes;
 
     /*
      * index of the content size left in the buffer
@@ -91,17 +91,17 @@ final class CipherCore {
      * input bytes that are processed at a time is different from the block
      * size)
      */
-    private int diffBlocksize = 0;
+    private int diffBlocksize;
 
     /*
      * padding class
      */
-    private Padding padding = null;
+    private Padding padding;
 
     /*
      * internal cipher engine
      */
-    private FeedbackCipher cipher = null;
+    private FeedbackCipher cipher;
 
     /*
      * the cipher mode
@@ -136,7 +136,7 @@ final class CipherCore {
         /*
          * The buffer should be usable for all cipher mode and padding
          * schemes. Thus, it has to be at least (blockSize+1) for CTS.
-         * In decryption mode, it also hold the possible padding block.
+         * In decryption mode, it also holds the possible padding block.
          */
         buffer = new byte[blockSize*2];
 
@@ -334,7 +334,7 @@ AlgorithmParameters getParameters(String algName) {
         if (cipherMode == ECB_MODE) {
             return null;
         }
-        AlgorithmParameters params = null;
+        AlgorithmParameters params;
         AlgorithmParameterSpec spec;
         byte[] iv = getIV();
         if (iv == null) {
@@ -545,7 +545,7 @@ static byte[] getKeyBytes(Key key) throws InvalidKeyException {
      */
     byte[] update(byte[] input, int inputOffset, int inputLen) {
 
-        byte[] output = null;
+        byte[] output;
         try {
             output = new byte[getOutputSizeByOperation(inputLen, false)];
             int len = update(input, inputOffset, inputLen, output,
@@ -930,8 +930,7 @@ private byte[] prepareInputBuffer(byte[] input, int inputOffset,
 
     private int fillOutputBuffer(byte[] finalBuf, int finalOffset,
         byte[] output, int outOfs, int finalBufLen, byte[] input)
-        throws ShortBufferException, BadPaddingException,
-        IllegalBlockSizeException {
+        throws BadPaddingException, IllegalBlockSizeException {
 
         int len;
         try {
@@ -967,7 +966,7 @@ private int checkOutputCapacity(byte[] output, int outputOffset,
 
     private int finalNoPadding(byte[] in, int inOfs, byte[] out, int outOfs,
                                int len)
-        throws IllegalBlockSizeException, ShortBufferException {
+        throws IllegalBlockSizeException {
 
         if (in == null || len == 0) {
             return 0;
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/CipherTextStealing.java b/src/java.base/share/classes/com/sun/crypto/provider/CipherTextStealing.java
index 630f8707fde..da46f220825 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/CipherTextStealing.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/CipherTextStealing.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,6 @@
 package com.sun.crypto.provider;
 
 import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.ShortBufferException;
 
 /**
  * This class represents ciphers in cipher text stealing (CTS) mode.
@@ -153,7 +152,7 @@ int encryptFinal(byte[] plain, int plainOffset, int plainLen,
      *
      * <p>It is also the application's responsibility to make sure that
      * <code>init</code> has been called before this method is called.
-     * (This check is omitted here, to avoid double checking.)
+     * (This check is omitted here, to avoid double-checking.)
      *
      * @param cipher the buffer with the input data to be decrypted
      * @param cipherOffset the offset in <code>cipherOffset</code>
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java b/src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java
index e8375d1eb81..2019104941e 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/ConstructKeys.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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
@@ -54,7 +54,7 @@ final class ConstructKeys {
     private static final PublicKey constructPublicKey(byte[] encodedKey,
             int ofs, int len, String encodedKeyAlgorithm)
             throws InvalidKeyException, NoSuchAlgorithmException {
-        PublicKey key = null;
+        PublicKey key;
         byte[] keyBytes = (ofs == 0 && encodedKey.length == len)
                 ? encodedKey : Arrays.copyOfRange(encodedKey, ofs, ofs + len);
         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
@@ -88,7 +88,7 @@ private static final PublicKey constructPublicKey(byte[] encodedKey,
     private static final PrivateKey constructPrivateKey(byte[] encodedKey,
             int ofs, int len, String encodedKeyAlgorithm)
             throws InvalidKeyException, NoSuchAlgorithmException {
-        PrivateKey key = null;
+        PrivateKey key;
         byte[] keyBytes = (ofs == 0 && encodedKey.length == len)
                 ? encodedKey : Arrays.copyOfRange(encodedKey, ofs, ofs + len);
         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESCrypt.java b/src/java.base/share/classes/com/sun/crypto/provider/DESCrypt.java
index acbde75cd84..29a5ba25408 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/DESCrypt.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/DESCrypt.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -40,7 +40,7 @@
  */
 
 class DESCrypt extends SymmetricCipher implements DESConstants {
-    private static final int s0p[] = {
+    private static final int[] s0p = {
         0x00410100, 0x00010000, 0x40400000, 0x40410100, 0x00400000,
         0x40010100, 0x40010000, 0x40400000, 0x40010100, 0x00410100,
         0x00410000, 0x40000100, 0x40400100, 0x00400000, 0x00000000,
@@ -56,7 +56,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
         0x40000000, 0x40410000, 0x00000100, 0x40010100,
     };
 
-    private static final int s1p[] = {
+    private static final int[] s1p = {
         0x08021002, 0x00000000, 0x00021000, 0x08020000, 0x08000002,
         0x00001002, 0x08001000, 0x00021000, 0x00001000, 0x08020002,
         0x00000002, 0x08001000, 0x00020002, 0x08021000, 0x08020000,
@@ -72,7 +72,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
         0x08001002, 0x00000002, 0x08020000, 0x00021000,
     };
 
-    private static final int s2p[] = {
+    private static final int[] s2p = {
         0x20800000, 0x00808020, 0x00000020, 0x20800020, 0x20008000,
         0x00800000, 0x20800020, 0x00008020, 0x00800020, 0x00008000,
         0x00808000, 0x20000000, 0x20808020, 0x20000020, 0x20000000,
@@ -88,7 +88,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
         0x20800000, 0x20008020, 0x00000020, 0x00808000,
     };
 
-    private static final int s3p[] = {
+    private static final int[] s3p = {
         0x00080201, 0x02000200, 0x00000001, 0x02080201, 0x00000000,
         0x02080000, 0x02000201, 0x00080001, 0x02080200, 0x02000001,
         0x02000000, 0x00000201, 0x02000001, 0x00080201, 0x00080000,
@@ -104,7 +104,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
         0x00000201, 0x02000000, 0x02000001, 0x02080200,
     };
 
-    private static final int s4p[] = {
+    private static final int[] s4p = {
         0x01000000, 0x00002000, 0x00000080, 0x01002084, 0x01002004,
         0x01000080, 0x00002084, 0x01002000, 0x00002000, 0x00000004,
         0x01000004, 0x00002080, 0x01000084, 0x01002004, 0x01002080,
@@ -120,7 +120,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
         0x00000004, 0x00002084, 0x01002000, 0x01000004,
     };
 
-    private static final int s5p[] = {
+    private static final int[] s5p = {
         0x10000008, 0x00040008, 0x00000000, 0x10040400, 0x00040008,
         0x00000400, 0x10000408, 0x00040000, 0x00000408, 0x10040408,
         0x00040400, 0x10000000, 0x10000400, 0x10000008, 0x10040000,
@@ -136,7 +136,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
         0x10040000, 0x00000408, 0x00000008, 0x10040008,
     };
 
-    private static final int s6p[] = {
+    private static final int[] s6p = {
         0x00000800, 0x00000040, 0x00200040, 0x80200000, 0x80200840,
         0x80000800, 0x00000840, 0x00000000, 0x00200000, 0x80200040,
         0x80000040, 0x00200800, 0x80000000, 0x00200840, 0x00200800,
@@ -152,7 +152,7 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
         0x80200000, 0x00200840, 0x00200800, 0x80000800,
     };
 
-    private static final int s7p[] = {
+    private static final int[] s7p = {
         0x04100010, 0x04104000, 0x00004010, 0x00000000, 0x04004000,
         0x00100010, 0x04100000, 0x04104010, 0x00000010, 0x04000000,
         0x00104000, 0x00004010, 0x00104010, 0x04004010, 0x04000010,
@@ -168,112 +168,112 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
         0x04000000, 0x04100010, 0x00004000, 0x00104010,
     };
 
-    private static final int permRight0[] = {
+    private static final int[] permRight0 = {
         0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000,
         0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,
         0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040,
         0x40404040,
     };
 
-    private static final int permLeft1[] = {
+    private static final int[] permLeft1 = {
         0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000,
         0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,
         0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040,
         0x40404040,
     };
 
-    private static final int permRight2[] = {
+    private static final int[] permRight2 = {
         0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000,
         0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,
         0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010,
         0x10101010,
     };
 
-    private static final int permLeft3[] = {
+    private static final int[] permLeft3 = {
         0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000,
         0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,
         0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010,
         0x10101010,
     };
 
-    private static final int permRight4[] = {
+    private static final int[] permRight4 = {
         0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400,
         0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,
         0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404,
         0x04040404,
     };
 
-    private static final int permLeft5[] = {
+    private static final int[] permLeft5 = {
         0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400,
         0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,
         0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404,
         0x04040404,
     };
 
-    private static final int permRight6[] = {
+    private static final int[] permRight6 = {
         0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100,
         0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,
         0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101,
         0x01010101,
     };
 
-    private static final int permLeft7[] = {
+    private static final int[] permLeft7 = {
         0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100,
         0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,
         0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101,
         0x01010101,
     };
 
-    private static final int permRight8[] = {
+    private static final int[] permRight8 = {
         0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000,
         0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,
         0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080,
         0x80808080,
     };
 
-    private static final int permLeft9[] = {
+    private static final int[] permLeft9 = {
         0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000,
         0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,
         0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080,
         0x80808080,
     };
 
-    private static final int permRightA[] = {
+    private static final int[] permRightA = {
         0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000,
         0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,
         0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020,
         0x20202020,
     };
 
-    private static final int permLeftB[] = {
+    private static final int[] permLeftB = {
         0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000,
         0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,
         0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020,
         0x20202020,
     };
 
-    private static final int permRightC[] = {
+    private static final int[] permRightC = {
         0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800,
         0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,
         0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808,
         0x08080808,
     };
 
-    private static final int permLeftD[] = {
+    private static final int[] permLeftD = {
         0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800,
         0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,
         0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808,
         0x08080808,
     };
 
-    private static final int permRightE[] = {
+    private static final int[] permRightE = {
         0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200,
         0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,
         0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202,
         0x02020202,
     };
 
-    private static final int permLeftF[] = {
+    private static final int[] permLeftF = {
         0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200,
         0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,
         0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202,
@@ -283,224 +283,224 @@ class DESCrypt extends SymmetricCipher implements DESConstants {
     /*
      *        Initial Permutation
      */
-    private static final int initPermLeft0[] = {
+    private static final int[] initPermLeft0 = {
        0x00000000, 0x00008000, 0x00000000, 0x00008000, 0x00000080,
        0x00008080, 0x00000080, 0x00008080, 0x00000000, 0x00008000,
        0x00000000, 0x00008000, 0x00000080, 0x00008080, 0x00000080,
        0x00008080,
     };
 
-    private static final int initPermRight0[] = {
+    private static final int[] initPermRight0 = {
        0x00000000, 0x00000000, 0x00008000, 0x00008000, 0x00000000,
        0x00000000, 0x00008000, 0x00008000, 0x00000080, 0x00000080,
        0x00008080, 0x00008080, 0x00000080, 0x00000080, 0x00008080,
        0x00008080,
     };
 
-    private static final int initPermLeft1[] = {
+    private static final int[] initPermLeft1 = {
        0x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00800000,
        0x80800000, 0x00800000, 0x80800000, 0x00000000, 0x80000000,
        0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00800000,
        0x80800000,
     };
 
-    private static final int initPermRight1[] = {
+    private static final int[] initPermRight1 = {
        0x00000000, 0x00000000, 0x80000000, 0x80000000, 0x00000000,
        0x00000000, 0x80000000, 0x80000000, 0x00800000, 0x00800000,
        0x80800000, 0x80800000, 0x00800000, 0x00800000, 0x80800000,
        0x80800000,
     };
 
-    private static final int initPermLeft2[] = {
+    private static final int[] initPermLeft2 = {
        0x00000000, 0x00004000, 0x00000000, 0x00004000, 0x00000040,
        0x00004040, 0x00000040, 0x00004040, 0x00000000, 0x00004000,
        0x00000000, 0x00004000, 0x00000040, 0x00004040, 0x00000040,
        0x00004040,
     };
 
-    private static final int initPermRight2[] = {
+    private static final int[] initPermRight2 = {
        0x00000000, 0x00000000, 0x00004000, 0x00004000, 0x00000000,
        0x00000000, 0x00004000, 0x00004000, 0x00000040, 0x00000040,
        0x00004040, 0x00004040, 0x00000040, 0x00000040, 0x00004040,
        0x00004040,
     };
 
-    private static final int initPermLeft3[] = {
+    private static final int[] initPermLeft3 = {
        0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00400000,
        0x40400000, 0x00400000, 0x40400000, 0x00000000, 0x40000000,
        0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00400000,
        0x40400000,
     };
 
-    private static final int initPermRight3[] = {
+    private static final int[] initPermRight3 = {
        0x00000000, 0x00000000, 0x40000000, 0x40000000, 0x00000000,
        0x00000000, 0x40000000, 0x40000000, 0x00400000, 0x00400000,
        0x40400000, 0x40400000, 0x00400000, 0x00400000, 0x40400000,
        0x40400000,
     };
 
-    private static final int initPermLeft4[] = {
+    private static final int[] initPermLeft4 = {
        0x00000000, 0x00002000, 0x00000000, 0x00002000, 0x00000020,
        0x00002020, 0x00000020, 0x00002020, 0x00000000, 0x00002000,
        0x00000000, 0x00002000, 0x00000020, 0x00002020, 0x00000020,
        0x00002020,
     };
 
-    private static final int initPermRight4[] = {
+    private static final int[] initPermRight4 = {
        0x00000000, 0x00000000, 0x00002000, 0x00002000, 0x00000000,
        0x00000000, 0x00002000, 0x00002000, 0x00000020, 0x00000020,
        0x00002020, 0x00002020, 0x00000020, 0x00000020, 0x00002020,
        0x00002020,
     };
 
-    private static final int initPermLeft5[] = {
+    private static final int[] initPermLeft5 = {
        0x00000000, 0x20000000, 0x00000000, 0x20000000, 0x00200000,
        0x20200000, 0x00200000, 0x20200000, 0x00000000, 0x20000000,
        0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00200000,
        0x20200000,
     };
 
-    private static final int initPermRight5[] = {
+    private static final int[] initPermRight5 = {
        0x00000000, 0x00000000, 0x20000000, 0x20000000, 0x00000000,
        0x00000000, 0x20000000, 0x20000000, 0x00200000, 0x00200000,
        0x20200000, 0x20200000, 0x00200000, 0x00200000, 0x20200000,
        0x20200000,
     };
 
-    private static final int initPermLeft6[] = {
+    private static final int[] initPermLeft6 = {
        0x00000000, 0x00001000, 0x00000000, 0x00001000, 0x00000010,
        0x00001010, 0x00000010, 0x00001010, 0x00000000, 0x00001000,
        0x00000000, 0x00001000, 0x00000010, 0x00001010, 0x00000010,
        0x00001010,
     };
 
-    private static final int initPermRight6[] = {
+    private static final int[] initPermRight6 = {
        0x00000000, 0x00000000, 0x00001000, 0x00001000, 0x00000000,
        0x00000000, 0x00001000, 0x00001000, 0x00000010, 0x00000010,
        0x00001010, 0x00001010, 0x00000010, 0x00000010, 0x00001010,
        0x00001010,
     };
 
-    private static final int initPermLeft7[] = {
+    private static final int[] initPermLeft7 = {
        0x00000000, 0x10000000, 0x00000000, 0x10000000, 0x00100000,
        0x10100000, 0x00100000, 0x10100000, 0x00000000, 0x10000000,
        0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00100000,
        0x10100000,
     };
 
-    private static final int initPermRight7[] = {
+    private static final int[] initPermRight7 = {
        0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000,
        0x00000000, 0x10000000, 0x10000000, 0x00100000, 0x00100000,
        0x10100000, 0x10100000, 0x00100000, 0x00100000, 0x10100000,
        0x10100000,
     };
 
-    private static final int initPermLeft8[] = {
+    private static final int[] initPermLeft8 = {
        0x00000000, 0x00000800, 0x00000000, 0x00000800, 0x00000008,
        0x00000808, 0x00000008, 0x00000808, 0x00000000, 0x00000800,
        0x00000000, 0x00000800, 0x00000008, 0x00000808, 0x00000008,
        0x00000808,
     };
 
-    private static final int initPermRight8[] = {
+    private static final int[] initPermRight8 = {
        0x00000000, 0x00000000, 0x00000800, 0x00000800, 0x00000000,
        0x00000000, 0x00000800, 0x00000800, 0x00000008, 0x00000008,
        0x00000808, 0x00000808, 0x00000008, 0x00000008, 0x00000808,
        0x00000808,
     };
 
-    private static final int initPermLeft9[] = {
+    private static final int[] initPermLeft9 = {
        0x00000000, 0x08000000, 0x00000000, 0x08000000, 0x00080000,
        0x08080000, 0x00080000, 0x08080000, 0x00000000, 0x08000000,
        0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00080000,
        0x08080000,
     };
 
-    private static final int initPermRight9[] = {
+    private static final int[] initPermRight9 = {
        0x00000000, 0x00000000, 0x08000000, 0x08000000, 0x00000000,
        0x00000000, 0x08000000, 0x08000000, 0x00080000, 0x00080000,
        0x08080000, 0x08080000, 0x00080000, 0x00080000, 0x08080000,
        0x08080000,
     };
 
-    private static final int initPermLeftA[] = {
+    private static final int[] initPermLeftA = {
        0x00000000, 0x00000400, 0x00000000, 0x00000400, 0x00000004,
        0x00000404, 0x00000004, 0x00000404, 0x00000000, 0x00000400,
        0x00000000, 0x00000400, 0x00000004, 0x00000404, 0x00000004,
        0x00000404,
     };
 
-    private static final int initPermRightA[] = {
+    private static final int[] initPermRightA = {
        0x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000000,
        0x00000000, 0x00000400, 0x00000400, 0x00000004, 0x00000004,
        0x00000404, 0x00000404, 0x00000004, 0x00000004, 0x00000404,
        0x00000404,
     };
 
-    private static final int initPermLeftB[] = {
+    private static final int[] initPermLeftB = {
        0x00000000, 0x04000000, 0x00000000, 0x04000000, 0x00040000,
        0x04040000, 0x00040000, 0x04040000, 0x00000000, 0x04000000,
        0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00040000,
        0x04040000,
     };
 
-    private static final int initPermRightB[] = {
+    private static final int[] initPermRightB = {
        0x00000000, 0x00000000, 0x04000000, 0x04000000, 0x00000000,
        0x00000000, 0x04000000, 0x04000000, 0x00040000, 0x00040000,
        0x04040000, 0x04040000, 0x00040000, 0x00040000, 0x04040000,
        0x04040000,
     };
 
-    private static final int initPermLeftC[] = {
+    private static final int[] initPermLeftC = {
        0x00000000, 0x00000200, 0x00000000, 0x00000200, 0x00000002,
        0x00000202, 0x00000002, 0x00000202, 0x00000000, 0x00000200,
        0x00000000, 0x00000200, 0x00000002, 0x00000202, 0x00000002,
        0x00000202,
     };
 
-    private static final int initPermRightC[] = {
+    private static final int[] initPermRightC = {
        0x00000000, 0x00000000, 0x00000200, 0x00000200, 0x00000000,
        0x00000000, 0x00000200, 0x00000200, 0x00000002, 0x00000002,
        0x00000202, 0x00000202, 0x00000002, 0x00000002, 0x00000202,
        0x00000202,
     };
 
-    private static final int initPermLeftD[] = {
+    private static final int[] initPermLeftD = {
        0x00000000, 0x02000000, 0x00000000, 0x02000000, 0x00020000,
        0x02020000, 0x00020000, 0x02020000, 0x00000000, 0x02000000,
        0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00020000,
        0x02020000,
     };
 
-    private static final int initPermRightD[] = {
+    private static final int[] initPermRightD = {
        0x00000000, 0x00000000, 0x02000000, 0x02000000, 0x00000000,
        0x00000000, 0x02000000, 0x02000000, 0x00020000, 0x00020000,
        0x02020000, 0x02020000, 0x00020000, 0x00020000, 0x02020000,
        0x02020000,
     };
 
-    private static final int initPermLeftE[] = {
+    private static final int[] initPermLeftE = {
        0x00000000, 0x00000100, 0x00000000, 0x00000100, 0x00000001,
        0x00000101, 0x00000001, 0x00000101, 0x00000000, 0x00000100,
        0x00000000, 0x00000100, 0x00000001, 0x00000101, 0x00000001,
        0x00000101,
     };
 
-    private static final int initPermRightE[] = {
+    private static final int[] initPermRightE = {
        0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000000,
        0x00000000, 0x00000100, 0x00000100, 0x00000001, 0x00000001,
        0x00000101, 0x00000101, 0x00000001, 0x00000001, 0x00000101,
        0x00000101,
     };
 
-    private static final int initPermLeftF[] = {
+    private static final int[] initPermLeftF = {
        0x00000000, 0x01000000, 0x00000000, 0x01000000, 0x00010000,
        0x01010000, 0x00010000, 0x01010000, 0x00000000, 0x01000000,
        0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00010000,
        0x01010000,
     };
 
-    private static final int initPermRightF[] = {
+    private static final int[] initPermRightF = {
        0x00000000, 0x00000000, 0x01000000, 0x01000000, 0x00000000,
        0x00000000, 0x01000000, 0x01000000, 0x00010000, 0x00010000,
        0x01010000, 0x01010000, 0x00010000, 0x00010000, 0x01010000,
@@ -586,7 +586,7 @@ void decryptBlock(byte[] cipher, int cipherOffset,
 
 
     void cipherBlock(byte[] in, int inOffset, byte[] out, int outOffset) {
-        byte key[];
+        byte[] key;
         int temp;
         int i, j;
         int offset;
@@ -638,7 +638,7 @@ void cipherBlock(byte[] in, int inOffset, byte[] out, int outOffset) {
     }
 
     private static void perm(int left, int right,
-                             byte out[], int offset) {
+                             byte[] out, int offset) {
         int low, high, temp;
 
         temp = left;
@@ -687,7 +687,7 @@ private static void perm(int left, int right,
 
     }
 
-    private static int initialPermutationLeft(byte block[], int offset) {
+    private static int initialPermutationLeft(byte[] block, int offset) {
         int l;
 
         l  = initPermLeft1[block[offset] & 0xf];
@@ -709,7 +709,7 @@ private static int initialPermutationLeft(byte block[], int offset) {
         return l;
     }
 
-    private static int initialPermutationRight(byte block[], int offset) {
+    private static int initialPermutationRight(byte[] block, int offset) {
         int l;
 
         l  = initPermRight1[block[offset] & 0xf];
@@ -731,9 +731,9 @@ private static int initialPermutationRight(byte block[], int offset) {
         return l;
     }
 
-    void expandKey(byte key[]) {
+    void expandKey(byte[] key) {
         int octet;
-        byte ek[] = new byte[128];
+        byte[] ek = new byte[128];
 
         octet = key[0];
         if ((octet & 0x80) != 0) {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESKeyFactory.java b/src/java.base/share/classes/com/sun/crypto/provider/DESKeyFactory.java
index fa06797abc2..fd3320b070d 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/DESKeyFactory.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/DESKeyFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -104,7 +104,7 @@ protected KeySpec engineGetKeySpec(SecretKey key, Class<?> keySpec)
 
         try {
 
-            if ((key instanceof SecretKey)
+            if ((key != null)
                 && (key.getAlgorithm().equalsIgnoreCase("DES"))
                 && (key.getFormat().equalsIgnoreCase("RAW"))) {
 
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java
index fd20415bb2d..b769aab417b 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -103,7 +103,7 @@ protected KeySpec engineGetKeySpec(SecretKey key, Class<?> keySpec)
         throws InvalidKeySpecException {
 
         try {
-            if ((key instanceof SecretKey)
+            if ((key != null)
                 && (key.getAlgorithm().equalsIgnoreCase("DESede"))
                 && (key.getFormat().equalsIgnoreCase("RAW"))) {
 
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyGenerator.java
index 28684b0f9e7..325c0588777 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyGenerator.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKeyGenerator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -130,7 +130,7 @@ protected SecretKey engineGenerateKey() {
             java.util.Arrays.fill(tmpkey, (byte)0x00);
         }
 
-        DESedeKey desEdeKey = null;
+        DESedeKey desEdeKey;
         try {
             desEdeKey = new DESedeKey(rawkey);
         } catch (InvalidKeyException ike) {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DESedeWrapCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/DESedeWrapCipher.java
index 92d25b57a7e..f9281ae9295 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/DESedeWrapCipher.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/DESedeWrapCipher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2024, 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
@@ -137,13 +137,13 @@ protected int engineGetBlockSize() {
      */
     protected int engineGetOutputSize(int inputLen) {
         // can only return an upper-limit if not initialized yet.
-        int result = 0;
+        int result;
         if (decrypting) {
             result = inputLen - 16; // CHECKSUM_LEN + IV_LEN;
         } else {
             result = Math.addExact(inputLen, 16);
         }
-        return (result < 0? 0:result);
+        return (Math.max(result, 0));
     }
 
     /**
@@ -210,7 +210,7 @@ protected void engineInit(int opmode, Key key,
                               AlgorithmParameterSpec params,
                               SecureRandom random)
         throws InvalidKeyException, InvalidAlgorithmParameterException {
-        byte[] currIv = null;
+        byte[] currIv;
         if (opmode == Cipher.WRAP_MODE) {
             decrypting = false;
             if (params == null) {
@@ -380,7 +380,7 @@ protected int engineDoFinal(byte[] input, int inputOffset, int inputLen,
     /**
      * Returns the parameters used with this cipher.
      * Note that null maybe returned if this cipher does not use any
-     * parameters or when it has not be set, e.g. initialized with
+     * parameters or when it has not been set, e.g. initialized with
      * UNWRAP_MODE but wrapped key data has not been given.
      *
      * @return the parameters used with this cipher; can be null.
@@ -556,9 +556,8 @@ protected Key engineUnwrap(byte[] wrappedKey,
                     buffer2, 0);
             int keyValLen = buffer2.length - CHECKSUM_LEN;
             byte[] cks = getChecksum(buffer2, 0, keyValLen);
-            int offset = keyValLen;
             for (int i = 0; i < CHECKSUM_LEN; i++) {
-                if (buffer2[offset + i] != cks[i]) {
+                if (buffer2[keyValLen + i] != cks[i]) {
                     throw new InvalidKeyException("Checksum comparison failed");
                 }
             }
@@ -588,7 +587,7 @@ private static final byte[] getChecksum(byte[] in) {
         return getChecksum(in, 0, in.length);
     }
     private static final byte[] getChecksum(byte[] in, int offset, int len) {
-        MessageDigest md = null;
+        MessageDigest md;
         try {
             md = MessageDigest.getInstance("SHA1");
         } catch (NoSuchAlgorithmException nsae) {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java b/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java
index bd1c3f7c380..3fa6b14762a 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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,21 +24,23 @@
  */
 package com.sun.crypto.provider;
 
-import sun.security.jca.JCAUtil;
-import sun.security.ssl.HKDF;
-import sun.security.util.*;
-
-import javax.crypto.*;
-import javax.crypto.spec.SecretKeySpec;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigInteger;
-import java.nio.charset.StandardCharsets;
 import java.security.*;
-import java.security.interfaces.*;
+import java.security.interfaces.ECKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.XECKey;
+import java.security.interfaces.XECPublicKey;
 import java.security.spec.*;
 import java.util.Arrays;
 import java.util.Objects;
+import javax.crypto.*;
+import javax.crypto.spec.SecretKeySpec;
+
+import sun.security.jca.JCAUtil;
+import sun.security.ssl.HKDF;
+import sun.security.util.*;
 
 // Implementing DHKEM defined inside https://www.rfc-editor.org/rfc/rfc9180.html,
 // without the AuthEncap and AuthDecap functions
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java
index 01f978fff61..5eebf98acc3 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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,23 +25,15 @@
 
 package com.sun.crypto.provider;
 
-import java.util.*;
-import java.lang.*;
 import java.math.BigInteger;
-import java.security.AccessController;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.PrivilegedAction;
-import java.security.ProviderException;
+import java.security.*;
 import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
 import javax.crypto.KeyAgreementSpi;
-import javax.crypto.ShortBufferException;
 import javax.crypto.SecretKey;
-import javax.crypto.spec.*;
+import javax.crypto.ShortBufferException;
+import javax.crypto.spec.DHParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
 
 import sun.security.util.KeyUtil;
 
@@ -180,7 +172,7 @@ protected void engineInit(Key key, AlgorithmParameterSpec params,
      * @param key the key for this phase. For example, in the case of
      * Diffie-Hellman between 2 parties, this would be the other party's
      * Diffie-Hellman public key.
-     * @param lastPhase flag which indicates whether or not this is the last
+     * @param lastPhase flag which indicates if this is the last
      * phase of this key agreement.
      *
      * @return the (intermediate) key resulting from this phase, or null if
@@ -227,7 +219,7 @@ protected Key engineDoPhase(Key key, boolean lastPhase)
         // intermediate secret, in which case we wrap it into a
         // Diffie-Hellman public key object and return it.
         generateSecret = true;
-        if (lastPhase == false) {
+        if (!lastPhase) {
             byte[] intermediate = engineGenerateSecret();
             return new DHPublicKey(new BigInteger(1, intermediate),
                                    init_p, init_g);
@@ -293,7 +285,7 @@ protected byte[] engineGenerateSecret()
     protected int engineGenerateSecret(byte[] sharedSecret, int offset)
         throws IllegalStateException, ShortBufferException
     {
-        if (generateSecret == false) {
+        if (!generateSecret) {
             throw new IllegalStateException
                 ("Key agreement has not been completed yet");
         }
@@ -413,9 +405,7 @@ protected SecretKey engineGenerateSecret(String algorithm)
             int keysize = secret.length;
             if (keysize >= BlowfishConstants.BLOWFISH_MAX_KEYSIZE)
                 keysize = BlowfishConstants.BLOWFISH_MAX_KEYSIZE;
-            SecretKeySpec skey = new SecretKeySpec(secret, 0, keysize,
-                                                   "Blowfish");
-            return skey;
+            return new SecretKeySpec(secret, 0, keysize, "Blowfish");
         } else if (algorithm.equalsIgnoreCase("AES")) {
             // AES
             int keysize = secret.length;
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java
index 4cc979cb29a..89d4fcfc402 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,11 +28,10 @@
 import java.math.BigInteger;
 import java.security.*;
 import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
 import javax.crypto.spec.DHParameterSpec;
-import javax.crypto.spec.DHGenParameterSpec;
 
 import sun.security.provider.ParameterCache;
+
 import static sun.security.util.SecurityProviderConstants.DEF_DH_KEY_SIZE;
 import static sun.security.util.SecurityProviderConstants.getDefDHPrivateExpSize;
 
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ElectronicCodeBook.java b/src/java.base/share/classes/com/sun/crypto/provider/ElectronicCodeBook.java
index c2085816453..ba8a564be11 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/ElectronicCodeBook.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/ElectronicCodeBook.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,9 +27,9 @@
 
 import java.security.InvalidKeyException;
 import java.security.ProviderException;
-import sun.security.util.ArrayUtil;
-import java.util.Objects;
+
 import jdk.internal.vm.annotation.IntrinsicCandidate;
+import sun.security.util.ArrayUtil;
 
 /**
  * This class represents ciphers in electronic codebook (ECB) mode.
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/FeedbackCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/FeedbackCipher.java
index 6c0e10eb6d0..985c1b81f43 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/FeedbackCipher.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/FeedbackCipher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -157,7 +157,7 @@ abstract int encrypt(byte[] plain, int plainOffset, int plainLen,
      */
      int encryptFinal(byte[] plain, int plainOffset, int plainLen,
                       byte[] cipher, int cipherOffset)
-         throws IllegalBlockSizeException, ShortBufferException {
+         throws IllegalBlockSizeException {
          return encrypt(plain, plainOffset, plainLen, cipher, cipherOffset);
     }
     /**
@@ -199,7 +199,7 @@ abstract int decrypt(byte[] cipher, int cipherOffset, int cipherLen,
      */
      int decryptFinal(byte[] cipher, int cipherOffset, int cipherLen,
                       byte[] plain, int plainOffset)
-         throws IllegalBlockSizeException, ShortBufferException {
+         throws IllegalBlockSizeException {
          return decrypt(cipher, cipherOffset, cipherLen, plain, plainOffset);
      }
 }
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java b/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java
index 7aaec3d6c1a..926a56c140b 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -79,8 +79,7 @@ private long blocksUntilRollover() {
         ByteBuffer buf = ByteBuffer.wrap(counter, counter.length - 4, 4);
         buf.order(ByteOrder.BIG_ENDIAN);
         long ctr32 = 0xFFFFFFFFL & buf.getInt();
-        long blocksLeft = (1L << 32) - ctr32;
-        return blocksLeft;
+        return (1L << 32) - ctr32;
     }
 
     private void checkBlock() {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/GHASH.java b/src/java.base/share/classes/com/sun/crypto/provider/GHASH.java
index b7aaf6059d5..6b8c2e9c1a9 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/GHASH.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/GHASH.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -190,9 +190,8 @@ int update(ByteBuffer ct, int inLen) {
 
         // If ct is a direct bytebuffer, send it directly to the intrinsic
         if (ct.isDirect()) {
-            int processed = inLen;
             processBlocksDirect(ct, inLen);
-            return processed;
+            return inLen;
         } else if (!ct.isReadOnly()) {
             // If a non-read only heap bytebuffer, use the array update method
             int processed = update(ct.array(),
@@ -273,7 +272,7 @@ private static void ghashRangeCheck(byte[] in, int inOfs, int inLen,
     /*
      * This is an intrinsified method.  The method's argument list must match
      * the hotspot signature.  This method and methods called by it, cannot
-     * throw exceptions or allocate arrays as it will breaking intrinsics
+     * throw exceptions or allocate arrays as it will break intrinsics.
      */
     @IntrinsicCandidate
     private static void processBlocks(byte[] data, int inOfs, int blocks,
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java b/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java
index 8cfd7d13f12..44cfb76d162 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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,38 +25,24 @@
 
 package com.sun.crypto.provider;
 
-import jdk.internal.access.JavaNioAccess;
-import jdk.internal.access.SharedSecrets;
-import jdk.internal.misc.Unsafe;
-import sun.nio.ch.DirectBuffer;
-import sun.security.jca.JCAUtil;
-import sun.security.util.ArrayUtil;
-
-import javax.crypto.AEADBadTagException;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.CipherSpi;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.ShortBufferException;
-import javax.crypto.spec.GCMParameterSpec;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.VarHandle;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import java.security.AlgorithmParameters;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.ProviderException;
-import java.security.SecureRandom;
+import java.security.*;
 import java.security.spec.AlgorithmParameterSpec;
 import java.security.spec.InvalidParameterSpecException;
 import java.util.Arrays;
+import javax.crypto.*;
+import javax.crypto.spec.GCMParameterSpec;
 
+import jdk.internal.access.JavaNioAccess;
+import jdk.internal.access.SharedSecrets;
+import jdk.internal.misc.Unsafe;
 import jdk.internal.vm.annotation.IntrinsicCandidate;
+import sun.nio.ch.DirectBuffer;
+import sun.security.jca.JCAUtil;
+import sun.security.util.ArrayUtil;
 
 /**
  * This class represents ciphers in GaloisCounter (GCM) mode.
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java
index fecc30a5a08..c6707fb9941 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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,16 +25,12 @@
 
 package com.sun.crypto.provider;
 
-import java.util.Arrays;
-
 import java.nio.ByteBuffer;
-
+import java.security.*;
+import java.security.spec.AlgorithmParameterSpec;
+import java.util.Arrays;
 import javax.crypto.MacSpi;
 import javax.crypto.SecretKey;
-import java.security.*;
-import java.security.spec.*;
-
-import sun.security.x509.AlgorithmId;
 
 /**
  * This class constitutes the core of HMAC-<MD> algorithms, where
@@ -87,8 +83,7 @@ abstract class HmacCore extends MacSpi implements Cloneable {
                                 break;
                             }
                         }
-                    } catch (NoSuchAlgorithmException nsae) {
-                        continue;
+                    } catch (NoSuchAlgorithmException ignored) {
                     }
                 }
                 if (md == null) {
@@ -169,7 +164,7 @@ protected void engineInit(Key key, AlgorithmParameterSpec params)
      * @param input the input byte to be processed.
      */
     protected void engineUpdate(byte input) {
-        if (first == true) {
+        if (first) {
             // compute digest for 1st pass; start with inner pad
             md.update(k_ipad);
             first = false;
@@ -187,8 +182,8 @@ protected void engineUpdate(byte input) {
      * @param offset the offset in <code>input</code> where the input starts.
      * @param len the number of bytes to process.
      */
-    protected void engineUpdate(byte input[], int offset, int len) {
-        if (first == true) {
+    protected void engineUpdate(byte[] input, int offset, int len) {
+        if (first) {
             // compute digest for 1st pass; start with inner pad
             md.update(k_ipad);
             first = false;
@@ -205,7 +200,7 @@ protected void engineUpdate(byte input[], int offset, int len) {
      * @param input the input byte buffer.
      */
     protected void engineUpdate(ByteBuffer input) {
-        if (first == true) {
+        if (first) {
             // compute digest for 1st pass; start with inner pad
             md.update(k_ipad);
             first = false;
@@ -221,7 +216,7 @@ protected void engineUpdate(ByteBuffer input) {
      * @return the HMAC result.
      */
     protected byte[] engineDoFinal() {
-        if (first == true) {
+        if (first) {
             // compute digest for 1st pass; start with inner pad
             md.update(k_ipad);
         } else {
@@ -250,7 +245,7 @@ protected byte[] engineDoFinal() {
      * HMAC was initialized with.
      */
     protected void engineReset() {
-        if (first == false) {
+        if (!first) {
             md.reset();
             first = true;
         }
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5.java
index ccf85561db9..3e85ad51bb3 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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,12 +25,7 @@
 
 package com.sun.crypto.provider;
 
-import java.nio.ByteBuffer;
-
-import javax.crypto.MacSpi;
-import javax.crypto.SecretKey;
-import java.security.*;
-import java.security.spec.*;
+import java.security.NoSuchAlgorithmException;
 
 /**
  * This is an implementation of the HMAC-MD5 algorithm.
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5KeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5KeyGenerator.java
index ba29e3c7479..2634128dd28 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5KeyGenerator.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacMD5KeyGenerator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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,9 +25,8 @@
 
 package com.sun.crypto.provider;
 
-import java.security.SecureRandom;
-import java.security.InvalidParameterException;
 import java.security.InvalidAlgorithmParameterException;
+import java.security.SecureRandom;
 import java.security.spec.AlgorithmParameterSpec;
 import java.util.Arrays;
 import javax.crypto.KeyGeneratorSpi;
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1.java
index b79dc9d9658..0a17cad0ea3 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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,12 +25,7 @@
 
 package com.sun.crypto.provider;
 
-import java.nio.ByteBuffer;
-
-import javax.crypto.MacSpi;
-import javax.crypto.SecretKey;
-import java.security.*;
-import java.security.spec.*;
+import java.security.NoSuchAlgorithmException;
 
 /**
  * This is an implementation of the HMAC-SHA1 algorithm.
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1KeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1KeyGenerator.java
index 9d92d60ae36..19977777503 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1KeyGenerator.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacSHA1KeyGenerator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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,9 +25,8 @@
 
 package com.sun.crypto.provider;
 
-import java.security.SecureRandom;
-import java.security.InvalidParameterException;
 import java.security.InvalidAlgorithmParameterException;
+import java.security.SecureRandom;
 import java.security.spec.AlgorithmParameterSpec;
 import java.util.Arrays;
 import javax.crypto.KeyGeneratorSpi;
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/ISO10126Padding.java b/src/java.base/share/classes/com/sun/crypto/provider/ISO10126Padding.java
index a86f313e2c9..43f15342284 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/ISO10126Padding.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/ISO10126Padding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -119,7 +119,6 @@ public int unpad(byte[] in, int off, int len) {
      * @return the length of the padding
      */
     public int padLength(int len) {
-        int paddingOctet = blockSize - (len % blockSize);
-        return paddingOctet;
+        return blockSize - (len % blockSize);
     }
 }
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java b/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java
index fcc450387af..ab8f2d7097b 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/JceKeyStore.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -75,7 +75,7 @@ private static final class PrivateKeyEntry {
         Date date; // the creation date of this entry
         byte[] protectedKey;
         Certificate[] chain;
-    };
+    }
 
     // Secret key
     private static final class SecretKeyEntry {
@@ -93,7 +93,7 @@ private static final class SecretKeyEntry {
     private static final class TrustedCertEntry {
         Date date; // the creation date of this entry
         Certificate cert;
-    };
+    }
 
     /**
      * Private keys and certificates are stored in a hashtable.
@@ -119,7 +119,7 @@ private static final class TrustedCertEntry {
     public Key engineGetKey(String alias, char[] password)
         throws NoSuchAlgorithmException, UnrecoverableKeyException
     {
-        Key key = null;
+        Key key;
 
         Object entry = entries.get(alias.toLowerCase(Locale.ENGLISH));
 
@@ -652,7 +652,7 @@ public void engineStore(OutputStream stream, char[] password)
                  * the keystore (such as deleting or modifying key or
                  * certificate entries).
                  */
-                byte digest[] = md.digest();
+                byte[] digest = md.digest();
 
                 dos.write(digest);
                 dos.flush();
@@ -691,8 +691,8 @@ public void engineLoad(InputStream stream, char[] password)
             MessageDigest md = null;
             CertificateFactory cf = null;
             Hashtable<String, CertificateFactory> cfs = null;
-            ByteArrayInputStream bais = null;
-            byte[] encoded = null;
+            ByteArrayInputStream bais;
+            byte[] encoded;
             int trustedKeyCount = 0, privateKeyCount = 0, secretKeyCount = 0;
 
             if (stream == null)
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/KWUtil.java b/src/java.base/share/classes/com/sun/crypto/provider/KWUtil.java
index 7892ca198a8..e5dc8920326 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/KWUtil.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/KWUtil.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,10 +26,6 @@
 package com.sun.crypto.provider;
 
 import java.util.Arrays;
-import java.security.*;
-import java.security.spec.*;
-import javax.crypto.*;
-import javax.crypto.spec.*;
 
 /**
  * This class acts as the base class for AES KeyWrap algorithms as defined
@@ -58,7 +54,7 @@ static final int W(byte[] icvIn, byte[] in, int inLen,
                 ("Invalid data length for W: " + inLen);
         assert(icvIn.length == SEMI_BLKSIZE) : "Invalid ICV buffer size";
 
-        // overwrite the first block of in with the icv semiblock
+        // overwrite the first block of in with the icv semi-block
         System.arraycopy(icvIn, 0, in, 0, SEMI_BLKSIZE);
 
         int n = inLen / SEMI_BLKSIZE - 1;
@@ -93,7 +89,7 @@ static final int W(byte[] icvIn, byte[] in, int inLen,
      *   data until the initial value and padding bytes are verified.
      * @param in input bytes, i.e. the to-be-processed data
      * @param inLen length of the to-be-processed bytes
-     * @param ivOut buffer for holding the recovered ICV semiblock
+     * @param ivOut buffer for holding the recovered ICV semi-block
      * @param cipher the initialized cipher object used
      * @return the recovered data length, i.e. {@code (inLen - icvOut.length)}
      */
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/KeyProtector.java b/src/java.base/share/classes/com/sun/crypto/provider/KeyProtector.java
index eadc032b36a..f2d3efd685c 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/KeyProtector.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/KeyProtector.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -98,7 +98,7 @@ final class KeyProtector {
                         iterationCount > MAX_ITERATION_COUNT) {
                     iterationCount = DEFAULT_ITERATION_COUNT;
                 }
-            } catch (NumberFormatException e) {}
+            } catch (NumberFormatException ignored) {}
         }
         ITERATION_COUNT = iterationCount;
     }
@@ -369,7 +369,7 @@ Key unseal(SealedObject so, int maxLength)
             sKey = new PBEKey(pbeKeySpec, "PBEWithMD5AndTripleDES");
             pbeKeySpec.clearPassword();
 
-            SealedObjectForKeyProtector soForKeyProtector = null;
+            SealedObjectForKeyProtector soForKeyProtector;
             if (!(so instanceof SealedObjectForKeyProtector)) {
                 soForKeyProtector = new SealedObjectForKeyProtector(so);
             } else {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java
index dfd2ec2b04b..fb69a27c62d 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2024, 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
@@ -285,7 +285,7 @@ protected int engineGetOutputSize(int inLen) {
                     padLen = SEMI_BLKSIZE - n;
                 }
             }
-            // then add the first semiblock and padLen to result
+            // then add the first semi-block and padLen to result
             result = Math.addExact(result, SEMI_BLKSIZE + padLen);
         } else {
             result = inLen - SEMI_BLKSIZE;
@@ -339,7 +339,7 @@ private void implInit(int opmode, Key key, byte[] iv, SecureRandom random)
     protected void engineInit(int opmode, Key key, SecureRandom random)
         throws InvalidKeyException {
         try {
-            implInit(opmode, key, (byte[])null, random);
+            implInit(opmode, key, null, random);
         } catch (InvalidAlgorithmParameterException iae) {
             // should never happen
             throw new AssertionError(iae);
@@ -394,9 +394,9 @@ protected void engineInit(int opmode, Key key, AlgorithmParameters params,
         byte[] iv = null;
         if (params != null) {
             try {
-                AlgorithmParameterSpec spec =
+                IvParameterSpec spec =
                         params.getParameterSpec(IvParameterSpec.class);
-                iv = ((IvParameterSpec)spec).getIV();
+                iv = spec.getIV();
             } catch (InvalidParameterSpecException ispe) {
                 throw new InvalidAlgorithmParameterException(
                     "Only IvParameterSpec is accepted");
@@ -462,7 +462,7 @@ private void implUpdate(byte[] in, int inOfs, int inLen) {
         if (inLen <= 0) return;
 
         if (opmode == Cipher.ENCRYPT_MODE && dataIdx == 0) {
-            // the first semiblock is for iv, store data after it
+            // the first semi-block is for iv, store data after it
             dataIdx = SEMI_BLKSIZE;
         }
         store(in, inOfs, inLen);
@@ -595,8 +595,8 @@ private int implDoFinal(byte[] in, int inOfs, int inLen, byte[] out)
     }
 
     // helper routine for in-place encryption.
-    // 'inBuf' = semiblock | plain text | extra bytes if padding is used
-    // 'inLen' = semiblock length + plain text length
+    // 'inBuf' = semi-block | plain text | extra bytes if padding is used
+    // 'inLen' = semi-block length + plain text length
     private int helperEncrypt(byte[] inBuf, int inLen)
             throws IllegalBlockSizeException, ShortBufferException {
 
@@ -646,7 +646,7 @@ private int helperDecrypt(byte[] inBuf, int inLen)
      */
     @Override
     protected AlgorithmParameters engineGetParameters() {
-        AlgorithmParameters params = null;
+        AlgorithmParameters params;
 
         byte[] iv = cipher.getIV();
         if (iv == null) {
@@ -711,7 +711,7 @@ protected byte[] engineWrap(Key key)
         // output size is known, allocate output buffer
         byte[] out = new byte[engineGetOutputSize(encoded.length)];
 
-        // reserve the first semiblock and do not write data
+        // reserve the first semi-block and do not write data
         int len = SEMI_BLKSIZE;
         System.arraycopy(encoded, 0, out, len, encoded.length);
         len += encoded.length;
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/OAEPParameters.java b/src/java.base/share/classes/com/sun/crypto/provider/OAEPParameters.java
index 9d724728893..3b826aa38f2 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/OAEPParameters.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/OAEPParameters.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -225,11 +225,9 @@ protected byte[] engineGetEncoded(String encodingMethod)
     }
 
     protected String engineToString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("MD: " + mdName + "\n");
-        sb.append("MGF: MGF1" + mgfSpec.getDigestAlgorithm() + "\n");
-        sb.append("PSource: PSpecified " +
-            (p.length==0? "":Debug.toHexString(new BigInteger(p))) + "\n");
-        return sb.toString();
+        return "MD: " + mdName + "\n" +
+                "MGF: MGF1" + mgfSpec.getDigestAlgorithm() + "\n" +
+                "PSource: PSpecified " +
+                (p.length == 0 ? "" : Debug.toHexString(new BigInteger(p))) + "\n";
     }
 }
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/OutputFeedback.java b/src/java.base/share/classes/com/sun/crypto/provider/OutputFeedback.java
index aa56144f090..414659fcf3d 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/OutputFeedback.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/OutputFeedback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -53,7 +53,7 @@ final class OutputFeedback extends FeedbackCipher {
     private final byte[] register;
 
     /*
-     * number of bytes for each stream unit, defaults to the blocksize
+     * number of bytes for each stream unit, defaults to the block size
      * of the embedded cipher
      */
     private final int numBytes;
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBEKeyFactory.java b/src/java.base/share/classes/com/sun/crypto/provider/PBEKeyFactory.java
index 02451e536c6..da73d0bc7ce 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/PBEKeyFactory.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/PBEKeyFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -261,7 +261,7 @@ protected SecretKey engineGenerateSecret(KeySpec keySpec)
      */
     protected KeySpec engineGetKeySpec(SecretKey key, Class<?> keySpecCl)
         throws InvalidKeySpecException {
-        if ((key instanceof SecretKey)
+        if ((key != null)
             && (validTypes.contains(key.getAlgorithm().toUpperCase(Locale.ENGLISH)))
             && (key.getFormat().equalsIgnoreCase("RAW"))) {
 
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java b/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java
index 68b1771d7d9..e10b0b1a7cf 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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
@@ -161,7 +161,7 @@ byte[] getIV() {
      * does not use any parameters.
      */
     AlgorithmParameters getParameters() {
-        AlgorithmParameters params = null;
+        AlgorithmParameters params;
         if (salt == null) {
             salt = new byte[8];
             SunJCE.getRandom().nextBytes(salt);
@@ -303,7 +303,7 @@ private byte[] deriveCipherKey(byte[] passwdBytes) {
             // Concatenate the output from each digest round with the
             // password, and use the result as the input to the next digest
             // operation.
-            byte[] toBeHashed = null;
+            byte[] toBeHashed;
             result = new byte[DESedeKeySpec.DES_EDE_KEY_LEN +
                               DESConstants.DES_BLOCK_SIZE];
             for (i = 0; i < 2; i++) {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java b/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java
index fb3dfa00148..d6b7d00d360 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -131,8 +131,8 @@ abstract class PBES2Parameters extends AlgorithmParametersSpi {
 
     PBES2Parameters(String pbes2AlgorithmName) throws NoSuchAlgorithmException {
         int and;
-        String kdfAlgo = null;
-        String cipherAlgo = null;
+        String kdfAlgo;
+        String cipherAlgo;
 
         // Extract the KDF and encryption algorithm names
         this.pbes2AlgorithmName = pbes2AlgorithmName;
@@ -210,9 +210,6 @@ protected void engineInit(AlgorithmParameterSpec paramSpec)
     protected void engineInit(byte[] encoded)
         throws IOException
     {
-        String kdfAlgo = null;
-        String cipherAlgo = null;
-
         DerValue pBES2_params = new DerValue(encoded);
         if (pBES2_params.tag != DerValue.tag_Sequence) {
             throw new IOException("PBE parameter parsing error: "
@@ -231,16 +228,15 @@ protected void engineInit(byte[] encoded)
             kdf = pBES2_params.data.getDerValue();
         }
 
-        kdfAlgo = parseKDF(kdf);
+        String kdfAlgo = parseKDF(kdf);
 
         if (pBES2_params.tag != DerValue.tag_Sequence) {
             throw new IOException("PBE parameter parsing error: "
                 + "not an ASN.1 SEQUENCE tag");
         }
-        cipherAlgo = parseES(pBES2_params.data.getDerValue());
+        String cipherAlgo = parseES(pBES2_params.data.getDerValue());
 
-        this.pbes2AlgorithmName = new StringBuilder().append("PBEWith")
-            .append(kdfAlgo).append("And").append(cipherAlgo).toString();
+        this.pbes2AlgorithmName = "PBEWith" + kdfAlgo + "And" + cipherAlgo;
     }
 
     @SuppressWarnings("deprecation")
@@ -305,7 +301,7 @@ private String parseKDF(DerValue keyDerivationFunc) throws IOException {
 
     @SuppressWarnings("deprecation")
     private String parseES(DerValue encryptionScheme) throws IOException {
-        String cipherAlgo = null;
+        String cipherAlgo;
 
         cipherAlgo_OID = encryptionScheme.data.getOID();
         if (aes128CBC_OID.equals(cipherAlgo_OID)) {
@@ -399,7 +395,7 @@ protected byte[] engineGetEncoded(String encodingMethod)
     /*
      * Returns a formatted string describing the parameters.
      *
-     * The algorithn name pattern is: "PBEWith<prf>And<encryption>"
+     * The algorithm name pattern is: "PBEWith<prf>And<encryption>"
      * where <prf> is one of: HmacSHA1, HmacSHA224, HmacSHA256, HmacSHA384,
      * HmacSHA512, HmacSHA512/224, or HmacSHA512/256 and <encryption> is
      * AES with a keysize suffix.
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java b/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java
index a02ce2d1551..c8b9c392a4b 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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,26 +25,29 @@
 
 package com.sun.crypto.provider;
 
-import java.io.*;
-import java.lang.ref.Reference;
+import java.io.IOException;
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
 import java.lang.ref.Cleaner;
+import java.lang.ref.Reference;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
-import java.util.Arrays;
-import java.util.Locale;
-import java.security.MessageDigest;
-import java.security.KeyRep;
 import java.security.GeneralSecurityException;
+import java.security.KeyRep;
+import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Locale;
 import javax.crypto.Mac;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.PBEKeySpec;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
-
 import jdk.internal.ref.CleanerFactory;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 /**
  * This class represents a PBE key derived using PBKDF2 defined
  * in PKCS#5 v2.0. meaning that
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Core.java b/src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Core.java
index 56059a89264..146999e35ce 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Core.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Core.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -61,7 +61,7 @@ abstract class PBMAC1Core extends HmacCore {
     }
 
     private static PBKDF2Core getKDFImpl(String algo) {
-        PBKDF2Core kdf = null;
+        PBKDF2Core kdf;
         switch(algo) {
         case "HmacSHA1":
                 kdf = new PBKDF2Core.HmacSHA1();
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PKCS5Padding.java b/src/java.base/share/classes/com/sun/crypto/provider/PKCS5Padding.java
index af072c6f5d7..a8ba711d658 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/PKCS5Padding.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/PKCS5Padding.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -120,7 +120,6 @@ public int unpad(byte[] in, int off, int len) {
      * @return the length of the padding
      */
     public int padLength(int len) {
-        int paddingOctet = blockSize - (len % blockSize);
-        return paddingOctet;
+        return blockSize - (len % blockSize);
     }
 }
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/Poly1305.java b/src/java.base/share/classes/com/sun/crypto/provider/Poly1305.java
index 1752bb8dddd..1473cf4aba1 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/Poly1305.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/Poly1305.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,16 +26,18 @@
 package com.sun.crypto.provider;
 
 import java.nio.ByteBuffer;
-import java.security.Key;
 import java.security.InvalidKeyException;
+import java.security.Key;
 import java.security.spec.AlgorithmParameterSpec;
 import java.util.Arrays;
 import java.util.Objects;
 
-import sun.security.util.math.*;
-import sun.security.util.math.intpoly.*;
-import jdk.internal.vm.annotation.IntrinsicCandidate;
 import jdk.internal.vm.annotation.ForceInline;
+import jdk.internal.vm.annotation.IntrinsicCandidate;
+import sun.security.util.math.IntegerFieldModuloP;
+import sun.security.util.math.IntegerModuloP;
+import sun.security.util.math.MutableIntegerModuloP;
+import sun.security.util.math.intpoly.IntegerPolynomial1305;
 
 /**
  * This class represents the Poly1305 function defined in RFC 7539.
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java b/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java
index aa3100c1b7d..78f25f33b2d 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -108,7 +108,7 @@ void initEffectiveKeyBits(int effectiveKeyBits) {
 
     static void checkKey(String algorithm, int keyLength)
             throws InvalidKeyException {
-        if (algorithm.equals("RC2") == false) {
+        if (!algorithm.equals("RC2")) {
             throw new InvalidKeyException("Key algorithm must be RC2");
         }
         if ((keyLength < 5) || (keyLength > 128)) {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/RSACipher.java b/src/java.base/share/classes/com/sun/crypto/provider/RSACipher.java
index df76f78bfb5..b48917e7557 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/RSACipher.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/RSACipher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -33,6 +33,7 @@
 import java.security.spec.AlgorithmParameterSpec;
 import java.security.spec.InvalidParameterSpecException;
 import java.security.spec.MGF1ParameterSpec;
+import java.util.Objects;
 
 import javax.crypto.*;
 import javax.crypto.spec.PSource;
@@ -126,7 +127,7 @@ public RSACipher() {
     // modes do not make sense for RSA, but allow ECB
     // see JCE spec
     protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
-        if (mode.equalsIgnoreCase("ECB") == false) {
+        if (!mode.equalsIgnoreCase("ECB")) {
             throw new NoSuchAlgorithmException("Unsupported mode " + mode);
         }
     }
@@ -468,7 +469,7 @@ protected Key engineUnwrap(byte[] wrappedKey, String algorithm,
 
         boolean isTlsRsaPremasterSecret =
                 algorithm.equals("TlsRsaPremasterSecret");
-        byte[] encoded = null;
+        byte[] encoded;
 
         update(wrappedKey, 0, wrappedKey.length);
         try {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/SslMacCore.java b/src/java.base/share/classes/com/sun/crypto/provider/SslMacCore.java
index 057c139b594..0d25c0064c4 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/SslMacCore.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/SslMacCore.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,11 +26,10 @@
 package com.sun.crypto.provider;
 
 import java.nio.ByteBuffer;
-
-import javax.crypto.MacSpi;
-import javax.crypto.SecretKey;
 import java.security.*;
 import java.security.spec.AlgorithmParameterSpec;
+import javax.crypto.MacSpi;
+import javax.crypto.SecretKey;
 
 import static com.sun.crypto.provider.TlsPrfGenerator.genPad;
 
@@ -109,7 +108,7 @@ void init(Key key, AlgorithmParameterSpec params)
      * @param input the input byte to be processed.
      */
     void update(byte input) {
-        if (first == true) {
+        if (first) {
             // compute digest for 1st pass; start with inner pad
             md.update(secret);
             md.update(pad1);
@@ -128,8 +127,8 @@ void update(byte input) {
      * @param offset the offset in <code>input</code> where the input starts.
      * @param len the number of bytes to process.
      */
-    void update(byte input[], int offset, int len) {
-        if (first == true) {
+    void update(byte[] input, int offset, int len) {
+        if (first) {
             // compute digest for 1st pass; start with inner pad
             md.update(secret);
             md.update(pad1);
@@ -141,7 +140,7 @@ void update(byte input[], int offset, int len) {
     }
 
     void update(ByteBuffer input) {
-        if (first == true) {
+        if (first) {
             // compute digest for 1st pass; start with inner pad
             md.update(secret);
             md.update(pad1);
@@ -158,7 +157,7 @@ void update(ByteBuffer input) {
      * @return the Mac result.
      */
     byte[] doFinal() {
-        if (first == true) {
+        if (first) {
             // compute digest for 1st pass; start with inner pad
             md.update(secret);
             md.update(pad1);
@@ -189,7 +188,7 @@ byte[] doFinal() {
      * Mac was initialized with.
      */
     void reset() {
-        if (first == false) {
+        if (!first) {
             md.reset();
             first = true;
         }
@@ -211,7 +210,7 @@ protected void engineInit(Key key, AlgorithmParameterSpec params)
         protected void engineUpdate(byte input) {
             core.update(input);
         }
-        protected void engineUpdate(byte input[], int offset, int len) {
+        protected void engineUpdate(byte[] input, int offset, int len) {
             core.update(input, offset, len);
         }
         protected void engineUpdate(ByteBuffer input) {
@@ -244,7 +243,7 @@ protected void engineInit(Key key, AlgorithmParameterSpec params)
         protected void engineUpdate(byte input) {
             core.update(input);
         }
-        protected void engineUpdate(byte input[], int offset, int len) {
+        protected void engineUpdate(byte[] input, int offset, int len) {
             core.update(input, offset, len);
         }
         protected void engineUpdate(ByteBuffer input) {
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/TlsKeyMaterialGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/TlsKeyMaterialGenerator.java
index 56e4dd97663..2440b45a2ae 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/TlsKeyMaterialGenerator.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/TlsKeyMaterialGenerator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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
@@ -62,11 +62,11 @@ protected void engineInit(SecureRandom random) {
     @SuppressWarnings("deprecation")
     protected void engineInit(AlgorithmParameterSpec params,
             SecureRandom random) throws InvalidAlgorithmParameterException {
-        if (params instanceof TlsKeyMaterialParameterSpec == false) {
+        if (!(params instanceof TlsKeyMaterialParameterSpec)) {
             throw new InvalidAlgorithmParameterException(MSG);
         }
         this.spec = (TlsKeyMaterialParameterSpec)params;
-        if ("RAW".equals(spec.getMasterSecret().getFormat()) == false) {
+        if (!"RAW".equals(spec.getMasterSecret().getFormat())) {
             throw new InvalidAlgorithmParameterException(
                 "Key format must be RAW");
         }
@@ -105,8 +105,6 @@ private SecretKey engineGenerateKey0(byte[] masterSecret) throws GeneralSecurity
 
         SecretKey clientMacKey = null;
         SecretKey serverMacKey = null;
-        SecretKey clientCipherKey = null;
-        SecretKey serverCipherKey = null;
         IvParameterSpec clientIv = null;
         IvParameterSpec serverIv = null;
 
@@ -194,8 +192,10 @@ private SecretKey engineGenerateKey0(byte[] masterSecret) throws GeneralSecurity
         System.arraycopy(keyBlock, ofs, serverKeyBytes, 0, keyLength);
         ofs += keyLength;
 
+        SecretKey clientCipherKey;
+        SecretKey serverCipherKey;
         try {
-            if (isExportable == false) {
+            if (!isExportable) {
                 // cipher keys
                 clientCipherKey = new SecretKeySpec(clientKeyBytes, alg);
                 serverCipherKey = new SecretKeySpec(serverKeyBytes, alg);
diff --git a/src/java.base/share/classes/com/sun/crypto/provider/TlsPrfGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/TlsPrfGenerator.java
index 1102f4b94ee..f8f733b6d2f 100644
--- a/src/java.base/share/classes/com/sun/crypto/provider/TlsPrfGenerator.java
+++ b/src/java.base/share/classes/com/sun/crypto/provider/TlsPrfGenerator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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
@@ -132,12 +132,12 @@ protected void engineInit(SecureRandom random) {
     @SuppressWarnings("deprecation")
     protected void engineInit(AlgorithmParameterSpec params,
             SecureRandom random) throws InvalidAlgorithmParameterException {
-        if (params instanceof TlsPrfParameterSpec == false) {
+        if (!(params instanceof TlsPrfParameterSpec)) {
             throw new InvalidAlgorithmParameterException(MSG);
         }
         this.spec = (TlsPrfParameterSpec)params;
         SecretKey key = spec.getSecret();
-        if ((key != null) && ("RAW".equals(key.getFormat()) == false)) {
+        if ((key != null) && (!"RAW".equals(key.getFormat()))) {
             throw new InvalidAlgorithmParameterException(
                 "Key encoding format must be RAW");
         }
@@ -378,7 +378,7 @@ private static void expand(MessageDigest digest, int hmacSize,
      * TLS 1.2 uses a different hash algorithm than 1.0/1.1 for the PRF
      * calculations.  As of 2010, there is no PKCS11-level support for TLS
      * 1.2 PRF calculations, and no known OS's have an internal variant
-     * we could use.  Therefore for TLS 1.2, we are updating JSSE to request
+     * we could use.  Therefore, for TLS 1.2, we are updating JSSE to request
      * a different provider algorithm:  "SunTls12Prf".  If we reused the
      * name "SunTlsPrf", the PKCS11 provider would need be updated to
      * fail correctly when presented with the wrong version number
diff --git a/src/java.base/share/classes/java/io/FileInputStream.java b/src/java.base/share/classes/java/io/FileInputStream.java
index 20bf57a56c7..27507108237 100644
--- a/src/java.base/share/classes/java/io/FileInputStream.java
+++ b/src/java.base/share/classes/java/io/FileInputStream.java
@@ -371,6 +371,9 @@ public byte[] readAllBytes() throws IOException {
         return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
     }
 
+    /**
+     * @since 11
+     */
     @Override
     public byte[] readNBytes(int len) throws IOException {
         if (len < 0)
diff --git a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
index 187e041e674..7e5056a539b 100644
--- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
+++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -885,13 +885,10 @@ public AbstractStringBuilder append(long l) {
      * @return  a reference to this object.
      */
     public AbstractStringBuilder append(float f) {
-        try {
-            FloatToDecimal.appendTo(f, this);
-        } catch (IOException e) {
-            throw new AssertionError(e);
-        }
+        ensureCapacityInternal(count + FloatToDecimal.MAX_CHARS);
+        FloatToDecimal toDecimal = isLatin1() ? FloatToDecimal.LATIN1 : FloatToDecimal.UTF16;
+        count = toDecimal.putDecimal(value, count, f);
         return this;
-
     }
 
     /**
@@ -907,11 +904,9 @@ public AbstractStringBuilder append(float f) {
      * @return  a reference to this object.
      */
     public AbstractStringBuilder append(double d) {
-        try {
-            DoubleToDecimal.appendTo(d, this);
-        } catch (IOException e) {
-            throw new AssertionError(e);
-        }
+        ensureCapacityInternal(count + DoubleToDecimal.MAX_CHARS);
+        DoubleToDecimal toDecimal = isLatin1() ? DoubleToDecimal.LATIN1 : DoubleToDecimal.UTF16;
+        count = toDecimal.putDecimal(value, count, d);
         return this;
     }
 
diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java
index 4573a6dc690..5b378077d56 100644
--- a/src/java.base/share/classes/java/lang/Class.java
+++ b/src/java.base/share/classes/java/lang/Class.java
@@ -70,6 +70,7 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import jdk.internal.constant.ConstantUtils;
 import jdk.internal.javac.PreviewFeature;
 import jdk.internal.loader.BootLoader;
 import jdk.internal.loader.BuiltinClassLoader;
@@ -4709,7 +4710,7 @@ public Class<?> arrayType() {
     public Optional<ClassDesc> describeConstable() {
         Class<?> c = isArray() ? elementType() : this;
         return c.isHidden() ? Optional.empty()
-                            : Optional.of(ClassDesc.ofDescriptor(descriptorString()));
+                            : Optional.of(ConstantUtils.classDesc(this));
    }
 
     /**
@@ -4719,6 +4720,7 @@ public Optional<ClassDesc> describeConstable() {
      *
      * @since 15
      * @see MethodHandles.Lookup#defineHiddenClass
+     * @see Class##hiddenClasses Hidden Classes
      */
     @IntrinsicCandidate
     public native boolean isHidden();
diff --git a/src/java.base/share/classes/java/lang/Double.java b/src/java.base/share/classes/java/lang/Double.java
index c472f5c3fcf..277e1c14480 100644
--- a/src/java.base/share/classes/java/lang/Double.java
+++ b/src/java.base/share/classes/java/lang/Double.java
@@ -411,41 +411,43 @@ public final class Double extends Number
     public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
 
     /**
-     * The number of bits used to represent a {@code double} value.
+     * The number of bits used to represent a {@code double} value,
+     * {@value}.
      *
      * @since 1.5
      */
     public static final int SIZE = 64;
 
     /**
-     * The number of bits in the significand of a {@code double} value.
-     * This is the parameter N in section {@jls 4.2.3} of
-     * <cite>The Java Language Specification</cite>.
+     * The number of bits in the significand of a {@code double}
+     * value, {@value}.  This is the parameter N in section {@jls
+     * 4.2.3} of <cite>The Java Language Specification</cite>.
      *
      * @since 19
      */
     public static final int PRECISION = 53;
 
     /**
-     * Maximum exponent a finite {@code double} variable may have.
-     * It is equal to the value returned by
-     * {@code Math.getExponent(Double.MAX_VALUE)}.
+     * Maximum exponent a finite {@code double} variable may have,
+     * {@value}.  It is equal to the value returned by {@code
+     * Math.getExponent(Double.MAX_VALUE)}.
      *
      * @since 1.6
      */
     public static final int MAX_EXPONENT = (1 << (SIZE - PRECISION - 1)) - 1; // 1023
 
     /**
-     * Minimum exponent a normalized {@code double} variable may
-     * have.  It is equal to the value returned by
-     * {@code Math.getExponent(Double.MIN_NORMAL)}.
+     * Minimum exponent a normalized {@code double} variable may have,
+     * {@value}.  It is equal to the value returned by {@code
+     * Math.getExponent(Double.MIN_NORMAL)}.
      *
      * @since 1.6
      */
     public static final int MIN_EXPONENT = 1 - MAX_EXPONENT; // -1022
 
     /**
-     * The number of bytes used to represent a {@code double} value.
+     * The number of bytes used to represent a {@code double} value,
+     * {@value}.
      *
      * @since 1.8
      */
diff --git a/src/java.base/share/classes/java/lang/Float.java b/src/java.base/share/classes/java/lang/Float.java
index fab92d5c4c9..63a4cc0fab2 100644
--- a/src/java.base/share/classes/java/lang/Float.java
+++ b/src/java.base/share/classes/java/lang/Float.java
@@ -127,15 +127,16 @@ public final class Float extends Number
     public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
 
     /**
-     * The number of bits used to represent a {@code float} value.
+     * The number of bits used to represent a {@code float} value,
+     * {@value}.
      *
      * @since 1.5
      */
     public static final int SIZE = 32;
 
     /**
-     * The number of bits in the significand of a {@code float} value.
-     * This is the parameter N in section {@jls 4.2.3} of
+     * The number of bits in the significand of a {@code float} value,
+     * {@value}.  This is the parameter N in section {@jls 4.2.3} of
      * <cite>The Java Language Specification</cite>.
      *
      * @since 19
@@ -143,8 +144,8 @@ public final class Float extends Number
     public static final int PRECISION = 24;
 
     /**
-     * Maximum exponent a finite {@code float} variable may have.  It
-     * is equal to the value returned by {@code
+     * Maximum exponent a finite {@code float} variable may have,
+     * {@value}.  It is equal to the value returned by {@code
      * Math.getExponent(Float.MAX_VALUE)}.
      *
      * @since 1.6
@@ -152,8 +153,8 @@ public final class Float extends Number
     public static final int MAX_EXPONENT = (1 << (SIZE - PRECISION - 1)) - 1; // 127
 
     /**
-     * Minimum exponent a normalized {@code float} variable may have.
-     * It is equal to the value returned by {@code
+     * Minimum exponent a normalized {@code float} variable may have,
+     * {@value}.  It is equal to the value returned by {@code
      * Math.getExponent(Float.MIN_NORMAL)}.
      *
      * @since 1.6
@@ -161,7 +162,8 @@ public final class Float extends Number
     public static final int MIN_EXPONENT = 1 - MAX_EXPONENT; // -126
 
     /**
-     * The number of bytes used to represent a {@code float} value.
+     * The number of bytes used to represent a {@code float} value,
+     * {@value}.
      *
      * @since 1.8
      */
diff --git a/src/java.base/share/classes/java/lang/Module.java b/src/java.base/share/classes/java/lang/Module.java
index 82dae27efa0..d7a70818618 100644
--- a/src/java.base/share/classes/java/lang/Module.java
+++ b/src/java.base/share/classes/java/lang/Module.java
@@ -54,13 +54,9 @@
 import java.util.stream.Stream;
 import java.lang.classfile.AccessFlags;
 import java.lang.classfile.Attribute;
-import java.lang.classfile.ClassModel;
-import java.lang.classfile.ClassTransform;
 import java.lang.classfile.ClassFile;
-import java.lang.classfile.attribute.ModuleAttribute;
 import java.lang.classfile.attribute.RuntimeVisibleAnnotationsAttribute;
 
-import jdk.internal.javac.PreviewFeature;
 import jdk.internal.loader.BuiltinClassLoader;
 import jdk.internal.loader.BootLoader;
 import jdk.internal.loader.ClassLoaders;
@@ -1588,7 +1584,7 @@ private Class<?> loadModuleInfoClass() {
     private Class<?> loadModuleInfoClass(InputStream in) throws IOException {
         final String MODULE_INFO = "module-info";
         var cc = ClassFile.of(ClassFile.ConstantPoolSharingOption.NEW_POOL);
-        byte[] bytes = cc.transform(cc.parse(in.readAllBytes()), (clb, cle) -> {
+        byte[] bytes = cc.transformClass(cc.parse(in.readAllBytes()), (clb, cle) -> {
             switch (cle) {
                 case AccessFlags af -> clb.withFlags(AccessFlag.INTERFACE,
                         AccessFlag.ABSTRACT, AccessFlag.SYNTHETIC);
diff --git a/src/java.base/share/classes/java/lang/Object.java b/src/java.base/share/classes/java/lang/Object.java
index b8bfdc3e3f9..d9813df57a4 100644
--- a/src/java.base/share/classes/java/lang/Object.java
+++ b/src/java.base/share/classes/java/lang/Object.java
@@ -237,6 +237,10 @@ public boolean equals(Object obj) {
 
     /**
      * {@return a string representation of the object}
+     *
+     * Satisfying this method's contract implies a non-{@code null}
+     * result must be returned.
+     *
      * @apiNote
      * In general, the
      * {@code toString} method returns a string that
diff --git a/src/java.base/share/classes/java/lang/classfile/ClassFile.java b/src/java.base/share/classes/java/lang/classfile/ClassFile.java
index eb93a8c6a31..08745f7e1ba 100644
--- a/src/java.base/share/classes/java/lang/classfile/ClassFile.java
+++ b/src/java.base/share/classes/java/lang/classfile/ClassFile.java
@@ -32,7 +32,6 @@
 import java.util.function.Function;
 
 import java.lang.classfile.attribute.ModuleAttribute;
-import java.lang.classfile.attribute.UnknownAttribute;
 import java.lang.classfile.constantpool.ClassEntry;
 import java.lang.classfile.constantpool.ConstantPoolBuilder;
 import java.lang.classfile.constantpool.Utf8Entry;
@@ -45,6 +44,7 @@
 import java.lang.classfile.instruction.ExceptionCatch;
 import java.util.List;
 import static java.util.Objects.requireNonNull;
+import static jdk.internal.constant.ConstantUtils.CD_module_info;
 import jdk.internal.javac.PreviewFeature;
 
 /**
@@ -392,7 +392,7 @@ default byte[] buildModule(ModuleAttribute moduleAttribute) {
      */
     default byte[] buildModule(ModuleAttribute moduleAttribute,
                                      Consumer<? super ClassBuilder> handler) {
-        return build(ClassDesc.of("module-info"), clb -> {
+        return build(CD_module_info, clb -> {
             clb.withFlags(AccessFlag.MODULE);
             clb.with(moduleAttribute);
             handler.accept(clb);
@@ -434,15 +434,15 @@ default void buildModuleTo(Path path,
      * This method behaves as if:
      * {@snippet lang=java :
      *     this.build(model.thisClass(), ConstantPoolBuilder.of(model),
-     *                     b -> b.transform(model, transform));
+     *                     clb -> clb.transform(model, transform));
      * }
      *
      * @param model the class model to transform
      * @param transform the transform
      * @return the bytes of the new class
      */
-    default byte[] transform(ClassModel model, ClassTransform transform) {
-        return transform(model, model.thisClass(), transform);
+    default byte[] transformClass(ClassModel model, ClassTransform transform) {
+        return transformClass(model, model.thisClass(), transform);
     }
 
     /**
@@ -457,8 +457,8 @@ default byte[] transform(ClassModel model, ClassTransform transform) {
      * @param transform the transform
      * @return the bytes of the new class
      */
-    default byte[] transform(ClassModel model, ClassDesc newClassName, ClassTransform transform) {
-        return transform(model, TemporaryConstantPool.INSTANCE.classEntry(newClassName), transform);
+    default byte[] transformClass(ClassModel model, ClassDesc newClassName, ClassTransform transform) {
+        return transformClass(model, TemporaryConstantPool.INSTANCE.classEntry(newClassName), transform);
     }
 
     /**
@@ -472,7 +472,7 @@ default byte[] transform(ClassModel model, ClassDesc newClassName, ClassTransfor
      * This method behaves as if:
      * {@snippet lang=java :
      *     this.build(newClassName, ConstantPoolBuilder.of(model),
-     *                     b -> b.transform(model, transform));
+     *                     clb -> clb.transform(model, transform));
      * }
      *
      * @param model the class model to transform
@@ -480,7 +480,7 @@ default byte[] transform(ClassModel model, ClassDesc newClassName, ClassTransfor
      * @param transform the transform
      * @return the bytes of the new class
      */
-    byte[] transform(ClassModel model, ClassEntry newClassName, ClassTransform transform);
+    byte[] transformClass(ClassModel model, ClassEntry newClassName, ClassTransform transform);
 
     /**
      * Verify a classfile.  Any verification errors found will be returned.
diff --git a/src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java b/src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java
index 677478ec650..f67da06a36d 100644
--- a/src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java
+++ b/src/java.base/share/classes/java/lang/classfile/ClassFileTransform.java
@@ -33,7 +33,7 @@
 /**
  * A transformation on streams of elements. Transforms are used during
  * transformation of classfile entities; a transform is provided to a method like
- * {@link ClassFile#transform(ClassModel, ClassTransform)}, and the elements of the class,
+ * {@link ClassFile#transformClass(ClassModel, ClassTransform)}, and the elements of the class,
  * along with a builder, are presented to the transform.
  *
  * <p>The subtypes of {@linkplain
diff --git a/src/java.base/share/classes/java/lang/classfile/ClassReader.java b/src/java.base/share/classes/java/lang/classfile/ClassReader.java
index 7b181180c6f..ef4a36729e6 100644
--- a/src/java.base/share/classes/java/lang/classfile/ClassReader.java
+++ b/src/java.base/share/classes/java/lang/classfile/ClassReader.java
@@ -27,10 +27,6 @@
 import java.lang.classfile.constantpool.ClassEntry;
 import java.lang.classfile.constantpool.ConstantPool;
 import java.lang.classfile.constantpool.ConstantPoolException;
-import java.lang.classfile.constantpool.MethodHandleEntry;
-import java.lang.classfile.constantpool.ModuleEntry;
-import java.lang.classfile.constantpool.NameAndTypeEntry;
-import java.lang.classfile.constantpool.PackageEntry;
 import java.lang.classfile.constantpool.PoolEntry;
 import java.lang.classfile.constantpool.Utf8Entry;
 import jdk.internal.classfile.impl.ClassReaderImpl;
@@ -130,77 +126,6 @@ public sealed interface ClassReader extends ConstantPool
      */
     <T extends PoolEntry> T readEntryOrNull(int offset, Class<T> cls);
 
-    /**
-     * {@return the UTF8 entry whose index is given at the specified
-     * offset within the classfile}
-     * @param offset the offset of the index within the classfile
-     * @throws ConstantPoolException if the index is out of range of the
-     *         constant pool size, or zero, or the index does not correspond to
-     *         a UTF8 entry
-     */
-    Utf8Entry readUtf8Entry(int offset);
-
-    /**
-     * {@return the UTF8 entry whose index is given at the specified
-     * offset within the classfile, or null if the index at the specified
-     * offset is zero}
-     * @param offset the offset of the index within the classfile
-     * @throws ConstantPoolException if the index is out of range of the
-     *         constant pool size, or the index does not correspond to
-     *         a UTF8 entry
-     */
-    Utf8Entry readUtf8EntryOrNull(int offset);
-
-    /**
-     * {@return the module entry whose index is given at the specified
-     * offset within the classfile}
-     * @param offset the offset of the index within the classfile
-     * @throws ConstantPoolException if the index is out of range of the
-     *         constant pool size, or zero, or the index does not correspond to
-     *         a module entry
-     */
-    ModuleEntry readModuleEntry(int offset);
-
-    /**
-     * {@return the package entry whose index is given at the specified
-     * offset within the classfile}
-     * @param offset the offset of the index within the classfile
-     * @throws ConstantPoolException if the index is out of range of the
-     *         constant pool size, or zero, or the index does not correspond to
-     *         a package entry
-     */
-    PackageEntry readPackageEntry(int offset);
-
-    /**
-     * {@return the class entry whose index is given at the specified
-     * offset within the classfile}
-     * @param offset the offset of the index within the classfile
-     * @throws ConstantPoolException if the index is out of range of the
-     *         constant pool size, or zero, or the index does not correspond to
-     *         a class entry
-     */
-    ClassEntry readClassEntry(int offset);
-
-    /**
-     * {@return the name-and-type entry whose index is given at the specified
-     * offset within the classfile}
-     * @param offset the offset of the index within the classfile
-     * @throws ConstantPoolException if the index is out of range of the
-     *         constant pool size, or zero, or the index does not correspond to
-     *         a name-and-type entry
-     */
-    NameAndTypeEntry readNameAndTypeEntry(int offset);
-
-    /**
-     * {@return the method handle entry whose index is given at the specified
-     * offset within the classfile}
-     * @param offset the offset of the index within the classfile
-     * @throws ConstantPoolException if the index is out of range of the
-     *         constant pool size, or zero, or the index does not correspond to
-     *         a method handle entry
-     */
-    MethodHandleEntry readMethodHandleEntry(int offset);
-
     /**
      * {@return the unsigned byte at the specified offset within the classfile}
      * @param offset the offset within the classfile
diff --git a/src/java.base/share/classes/java/lang/classfile/ClassSignature.java b/src/java.base/share/classes/java/lang/classfile/ClassSignature.java
index b3050b78a85..852d5f9baf4 100644
--- a/src/java.base/share/classes/java/lang/classfile/ClassSignature.java
+++ b/src/java.base/share/classes/java/lang/classfile/ClassSignature.java
@@ -41,7 +41,11 @@ public sealed interface ClassSignature
     /** {@return the type parameters of this class} */
     List<Signature.TypeParam> typeParameters();
 
-    /** {@return the instantiation of the superclass in this signature} */
+    /**
+     * {@return the instantiation of the superclass in this signature}
+     *
+     * @since 23
+     */
     Signature.ClassTypeSig superclassSignature();
 
     /** {@return the instantiation of the interfaces in this signature} */
diff --git a/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java b/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java
index e954be079fa..a1666375091 100644
--- a/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java
+++ b/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -86,7 +86,7 @@
 
 import static java.util.Objects.requireNonNull;
 import static jdk.internal.classfile.impl.BytecodeHelpers.handleDescToHandleInfo;
-import jdk.internal.classfile.impl.TransformingCodeBuilder;
+
 import jdk.internal.javac.PreviewFeature;
 
 /**
@@ -97,6 +97,27 @@
  * #with(ClassFileElement)} or concretely by calling the various {@code withXxx}
  * methods.
  *
+ * <h2>Instruction Factories</h2>
+ * {@code CodeBuilder} provides convenience methods to create instructions (See
+ * JVMS {@jvms 6.5} Instructions) by their mnemonic, taking necessary operands.
+ * <ul>
+ * <li>Instructions that encode their operands in their opcode, such as {@code
+ * aload_<n>}, share their factories with their generic version like {@link
+ * #aload aload}. Note that some constant instructions, such as {@link #iconst_1
+ * iconst_1}, do not have generic versions, and thus have their own factories.
+ * <li>Instructions that accept wide operands, such as {@code ldc2_w} or {@code
+ * wide}, share their factories with their regular version like {@link #ldc}. Note
+ * that {@link #goto_w goto_w} has its own factory to avoid {@linkplain
+ * ClassFile.ShortJumpsOption short jumps}.
+ * <li>The {@code goto}, {@code instanceof}, {@code new}, and {@code return}
+ * instructions' factories are named {@link #goto_ goto_}, {@link #instanceOf
+ * instanceOf}, {@link #new_ new_}, and {@link #return_() return_} respectively,
+ * due to clashes with keywords in the Java programming language.
+ * <li>Factories are not provided for instructions {@code jsr}, {@code jsr_w},
+ * {@code ret}, and {@code wide ret}, which cannot appear in class files with
+ * major version {@value ClassFile#JAVA_7_VERSION} or higher. (JVMS {@jvms 4.9.1})
+ * </ul>
+ *
  * @see CodeTransform
  *
  * @since 22
@@ -130,7 +151,7 @@ public sealed interface CodeBuilder
     /**
      * {@return the local variable slot associated with the receiver}.
      *
-     * @throws IllegalStateException if this is not a static method
+     * @throws IllegalStateException if this is a static method
      */
     int receiverSlot();
 
@@ -171,7 +192,7 @@ public sealed interface CodeBuilder
     default CodeBuilder transforming(CodeTransform transform, Consumer<CodeBuilder> handler) {
         var resolved = transform.resolve(this);
         resolved.startHandler().run();
-        handler.accept(new TransformingCodeBuilder(this, resolved.consumer()));
+        handler.accept(new ChainedCodeBuilder(this, resolved.consumer()));
         resolved.endHandler().run();
         return this;
     }
@@ -699,7 +720,7 @@ default CodeBuilder lineNumber(int line) {
      * @return this builder
      */
     default CodeBuilder exceptionCatch(Label start, Label end, Label handler, ClassEntry catchType) {
-        return with(ExceptionCatch.of(handler, start, end, Optional.of(catchType)));
+        return with(ExceptionCatch.of(handler, start, end, Optional.ofNullable(catchType)));
     }
 
     /**
@@ -837,6 +858,10 @@ default CodeBuilder aastore() {
 
     /**
      * Generate an instruction to load a reference from a local variable
+     *
+     * <p>This may also generate {@code aload_<N>} and
+     * {@code wide aload} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -881,6 +906,10 @@ default CodeBuilder arraylength() {
 
     /**
      * Generate an instruction to store a reference into a local variable
+     *
+     * <p>This may also generate {@code astore_<N>} and
+     * {@code wide astore} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -1046,6 +1075,10 @@ default CodeBuilder ddiv() {
 
     /**
      * Generate an instruction to load a double from a local variable
+     *
+     * <p>This may also generate {@code dload_<N>} and
+     * {@code wide dload} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -1087,6 +1120,10 @@ default CodeBuilder dreturn() {
 
     /**
      * Generate an instruction to store a double into a local variable
+     *
+     * <p>This may also generate {@code dstore_<N>} and
+     * {@code wide dstore} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -1250,6 +1287,10 @@ default CodeBuilder fdiv() {
 
     /**
      * Generate an instruction to load a float from a local variable
+     *
+     * <p>This may also generate {@code fload_<N>} and
+     * {@code wide fload} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -1291,6 +1332,10 @@ default CodeBuilder freturn() {
 
     /**
      * Generate an instruction to store a float into a local variable
+     *
+     * <p>This may also generate {@code fstore_<N>} and
+     * {@code wide fstore} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -1350,6 +1395,15 @@ default CodeBuilder getstatic(ClassDesc owner, String name, ClassDesc type) {
 
     /**
      * Generate an instruction to branch always
+     *
+     * <p>This may also generate {@code goto_w} instructions if the {@link
+     * ClassFile.ShortJumpsOption#FIX_SHORT_JUMPS FIX_SHORT_JUMPS} option
+     * is set.
+     *
+     * @apiNote The instruction's name is {@code goto}, which coincides with a
+     * reserved keyword of the Java programming language, thus this method is
+     * named with an extra {@code _} suffix instead.
+     *
      * @param target the branch target
      * @return this builder
      */
@@ -1587,7 +1641,7 @@ default CodeBuilder if_icmpne(Label target) {
      * @param target the branch target
      * @return this builder
      */
-    default CodeBuilder if_nonnull(Label target) {
+    default CodeBuilder ifnonnull(Label target) {
         return branch(Opcode.IFNONNULL, target);
     }
 
@@ -1596,7 +1650,7 @@ default CodeBuilder if_nonnull(Label target) {
      * @param target the branch target
      * @return this builder
      */
-    default CodeBuilder if_null(Label target) {
+    default CodeBuilder ifnull(Label target) {
         return branch(Opcode.IFNULL, target);
     }
 
@@ -1666,6 +1720,10 @@ default CodeBuilder iinc(int slot, int val) {
 
     /**
      * Generate an instruction to load an int from a local variable
+     *
+     * <p>This may also generate {@code iload_<N>} and
+     * {@code wide iload} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -1691,6 +1749,11 @@ default CodeBuilder ineg() {
 
     /**
      * Generate an instruction to determine if an object is of the given type
+     *
+     * @apiNote The instruction's name is {@code instanceof}, which coincides with a
+     * reserved keyword of the Java programming language, thus this method is
+     * named with camel case instead.
+     *
      * @param target the target type
      * @return this builder
      * @since 23
@@ -1701,6 +1764,11 @@ default CodeBuilder instanceOf(ClassEntry target) {
 
     /**
      * Generate an instruction to determine if an object is of the given type
+     *
+     * @apiNote The instruction's name is {@code instanceof}, which coincides with a
+     * reserved keyword of the Java programming language, thus this method is
+     * named with camel case instead.
+     *
      * @param target the target type
      * @return this builder
      * @throws IllegalArgumentException if {@code target} represents a primitive type
@@ -1910,6 +1978,10 @@ default CodeBuilder ishr() {
 
     /**
      * Generate an instruction to store an int into a local variable
+     *
+     * <p>This may also generate {@code istore_<N>} and
+     * {@code wide istore} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -2033,6 +2105,12 @@ default CodeBuilder lconst_1() {
 
     /**
      * Generate an instruction pushing an item from the run-time constant pool onto the operand stack
+     *
+     * <p>This may also generate {@code ldc_w} and {@code ldc2_w} instructions.
+     *
+     * @apiNote {@link #loadConstant(ConstantDesc) loadConstant} generates more optimal instructions
+     * and should be used for general constants if an {@code ldc} instruction is not strictly required.
+     *
      * @param value the constant value
      * @return this builder
      */
@@ -2042,6 +2120,9 @@ default CodeBuilder ldc(ConstantDesc value) {
 
     /**
      * Generate an instruction pushing an item from the run-time constant pool onto the operand stack
+     *
+     * <p>This may also generate {@code ldc_w} and {@code ldc2_w} instructions.
+     *
      * @param entry the constant value
      * @return this builder
      */
@@ -2062,6 +2143,10 @@ default CodeBuilder ldiv() {
 
     /**
      * Generate an instruction to load a long from a local variable
+     *
+     * <p>This may also generate {@code lload_<N>} and
+     * {@code wide lload} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -2127,6 +2212,10 @@ default CodeBuilder lshr() {
 
     /**
      * Generate an instruction to store a long into a local variable
+     *
+     * <p>This may also generate {@code lstore_<N>} and
+     * {@code wide lstore} instructions.
+     *
      * @param slot the local variable slot
      * @return this builder
      */
@@ -2197,6 +2286,11 @@ default CodeBuilder multianewarray(ClassDesc array, int dims) {
 
     /**
      * Generate an instruction to create a new object
+     *
+     * @apiNote The instruction's name is {@code new}, which coincides with a
+     * reserved keyword of the Java programming language, thus this method is
+     * named with an extra {@code _} suffix instead.
+     *
      * @param clazz the new class type
      * @return this builder
      */
@@ -2206,6 +2300,11 @@ default CodeBuilder new_(ClassEntry clazz) {
 
     /**
      * Generate an instruction to create a new object
+     *
+     * @apiNote The instruction's name is {@code new}, which coincides with a
+     * reserved keyword of the Java programming language, thus this method is
+     * named with an extra {@code _} suffix instead.
+     *
      * @param clazz the new class type
      * @return this builder
      * @throws IllegalArgumentException if {@code clazz} represents a primitive type
@@ -2283,6 +2382,11 @@ default CodeBuilder putstatic(ClassDesc owner, String name, ClassDesc type) {
 
     /**
      * Generate an instruction to return void from the method
+     *
+     * @apiNote The instruction's name is {@code return}, which coincides with a
+     * reserved keyword of the Java programming language, thus this method is
+     * named with an extra {@code _} suffix instead.
+     *
      * @return this builder
      */
     default CodeBuilder return_() {
diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java b/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java
index 1a57cf4f37f..02cbcee810f 100644
--- a/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java
+++ b/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -58,9 +58,9 @@ public sealed interface CodeAttribute extends Attribute<CodeAttribute>, CodeMode
     byte[] codeArray();
 
     /**
-     * {@return the position of the {@code Label} in the {@code codeArray}
-     * or -1 if the {@code Label} does not point to the {@code codeArray}}
+     * {@return the position of the {@code label} in the {@link #codeArray codeArray}}
      * @param label a marker for a position within this {@code CodeAttribute}
+     * @throws IllegalArgumentException if the {@code label} is not from this attribute
      */
     int labelToBci(Label label);
 }
diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/ModuleAttribute.java b/src/java.base/share/classes/java/lang/classfile/attribute/ModuleAttribute.java
index 721719d2851..9a4c58478ad 100644
--- a/src/java.base/share/classes/java/lang/classfile/attribute/ModuleAttribute.java
+++ b/src/java.base/share/classes/java/lang/classfile/attribute/ModuleAttribute.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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 @@ static ModuleAttribute of(ModuleDesc moduleName,
                               Consumer<ModuleAttributeBuilder> attrHandler) {
         var mb = new ModuleAttributeBuilderImpl(moduleName);
         attrHandler.accept(mb);
-        return  mb.build();
+        return mb.build();
     }
 
     /**
@@ -166,7 +166,7 @@ static ModuleAttribute of(ModuleEntry moduleName,
                               Consumer<ModuleAttributeBuilder> attrHandler) {
         var mb = new ModuleAttributeBuilderImpl(moduleName);
         attrHandler.accept(mb);
-        return  mb.build();
+        return mb.build();
     }
 
     /**
@@ -319,11 +319,5 @@ default ModuleAttributeBuilder opens(PackageDesc pkge, Collection<AccessFlag> op
          * @return this builder
          */
         ModuleAttributeBuilder provides(ModuleProvideInfo provides);
-
-        /**
-         * Builds module attribute.
-         * @return the module attribute
-         */
-        ModuleAttribute build();
     }
 }
diff --git a/src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java b/src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java
index c69806b18c4..d3ae180dde5 100644
--- a/src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java
+++ b/src/java.base/share/classes/java/lang/classfile/components/ClassRemapper.java
@@ -107,6 +107,6 @@ static ClassRemapper of(Function<ClassDesc, ClassDesc> mapFunction) {
      * @return re-mapped class file bytes
      */
     default byte[] remapClass(ClassFile context, ClassModel clm) {
-        return context.transform(clm, map(clm.thisClass().asSymbol()), this);
+        return context.transformClass(clm, map(clm.thisClass().asSymbol()), this);
     }
 }
diff --git a/src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java b/src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java
index a0ef4d4de9c..ca5ad90389c 100644
--- a/src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java
+++ b/src/java.base/share/classes/java/lang/classfile/components/CodeRelabeler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -74,12 +74,4 @@ static CodeRelabeler of(Map<Label, Label> map) {
     static CodeRelabeler of(BiFunction<Label, CodeBuilder, Label> mapFunction) {
         return new CodeRelabelerImpl(mapFunction);
     }
-
-    /**
-     * Access method to internal re-labeling function.
-     * @param label source label
-     * @param codeBuilder builder to create new labels
-     * @return target label
-     */
-    Label relabel(Label label, CodeBuilder codeBuilder);
 }
diff --git a/src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java b/src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java
index f96be4e0cdf..b53e9213813 100644
--- a/src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java
+++ b/src/java.base/share/classes/java/lang/classfile/components/snippet-files/PackageSnippets.java
@@ -130,7 +130,7 @@ void allPackageRemap(ClassModel... allMyClasses) {
 
     void codeLocalsShifting(ClassModel classModel) {
         // @start region="codeLocalsShifting"
-        byte[] newBytes = ClassFile.of().transform(
+        byte[] newBytes = ClassFile.of().transformClass(
                 classModel,
                 (classBuilder, classElement) -> {
                     if (classElement instanceof MethodModel method)
@@ -145,7 +145,7 @@ void codeLocalsShifting(ClassModel classModel) {
 
     void codeRelabeling(ClassModel classModel) {
         // @start region="codeRelabeling"
-        byte[] newBytes = ClassFile.of().transform(
+        byte[] newBytes = ClassFile.of().transformClass(
                 classModel,
                 ClassTransform.transformingMethodBodies(
                         CodeTransform.ofStateful(CodeRelabeler::of)));
@@ -160,7 +160,7 @@ byte[] classInstrumentation(ClassModel target, ClassModel instrumentor, Predicat
         var targetFieldNames = target.fields().stream().map(f -> f.fieldName().stringValue()).collect(Collectors.toSet());
         var targetMethods = target.methods().stream().map(m -> m.methodName().stringValue() + m.methodType().stringValue()).collect(Collectors.toSet());
         var instrumentorClassRemapper = ClassRemapper.of(Map.of(instrumentor.thisClass().asSymbol(), target.thisClass().asSymbol()));
-        return ClassFile.of().transform(target,
+        return ClassFile.of().transformClass(target,
                 ClassTransform.transformingMethods(
                         instrumentedMethodsFilter,
                         (mb, me) -> {
@@ -191,7 +191,7 @@ byte[] classInstrumentation(ClassModel target, ClassModel instrumentor, Predicat
 
                                                 //inlined target locals must be shifted based on the actual instrumentor locals
                                                 codeBuilder.block(inlinedBlockBuilder -> inlinedBlockBuilder
-                                                        .transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol())
+                                                    .transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol())
                                                         .andThen(CodeRelabeler.of())
                                                         .andThen((innerBuilder, shiftedTargetCode) -> {
                                                             //returns must be replaced with jump to the end of the inlined method
diff --git a/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java b/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java
index db388c1c73b..a43e6f102ed 100644
--- a/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java
+++ b/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -92,14 +92,6 @@ static ConstantPoolBuilder of() {
      */
     boolean canWriteDirect(ConstantPool constantPool);
 
-    /**
-     * Writes associated bootstrap method entries to the specified writer
-     *
-     * @param buf the writer
-     * @return false when no bootstrap method entry has been written
-     */
-    boolean writeBootstrapMethods(BufWriter buf);
-
     /**
      * {@return A {@link Utf8Entry} describing the provided {@linkplain String}}
      * If a UTF8 entry in the pool already describes this string, it is returned;
diff --git a/src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java b/src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java
index 5073e108465..b80c1c83284 100644
--- a/src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java
+++ b/src/java.base/share/classes/java/lang/classfile/snippet-files/PackageSnippets.java
@@ -195,7 +195,7 @@ void stripDebugMethods2(byte[] bytes) {
                 builder.with(element);
         };
         var cc = ClassFile.of();
-        byte[] newBytes = cc.transform(cc.parse(bytes), ct);
+        byte[] newBytes = cc.transformClass(cc.parse(bytes), ct);
         // @end
     }
 
@@ -346,7 +346,7 @@ void fooToBarUnrolled(ClassModel classModel) {
 
     void codeRelabeling(ClassModel classModel) {
         // @start region="codeRelabeling"
-        byte[] newBytes = ClassFile.of().transform(classModel,
+        byte[] newBytes = ClassFile.of().transformClass(classModel,
                 ClassTransform.transformingMethodBodies(
                         CodeTransform.ofStateful(CodeRelabeler::of)));
         // @end
@@ -360,7 +360,7 @@ byte[] classInstrumentation(ClassModel target, ClassModel instrumentor, Predicat
         var targetFieldNames = target.fields().stream().map(f -> f.fieldName().stringValue()).collect(Collectors.toSet());
         var targetMethods = target.methods().stream().map(m -> m.methodName().stringValue() + m.methodType().stringValue()).collect(Collectors.toSet());
         var instrumentorClassRemapper = ClassRemapper.of(Map.of(instrumentor.thisClass().asSymbol(), target.thisClass().asSymbol()));
-        return ClassFile.of().transform(target,
+        return ClassFile.of().transformClass(target,
                 ClassTransform.transformingMethods(
                         instrumentedMethodsFilter,
                         (mb, me) -> {
diff --git a/src/java.base/share/classes/java/lang/constant/ClassDesc.java b/src/java.base/share/classes/java/lang/constant/ClassDesc.java
index 130a81420b6..d2da4ec5c85 100644
--- a/src/java.base/share/classes/java/lang/constant/ClassDesc.java
+++ b/src/java.base/share/classes/java/lang/constant/ClassDesc.java
@@ -36,7 +36,6 @@
 import static jdk.internal.constant.ConstantUtils.MAX_ARRAY_TYPE_DESC_DIMENSIONS;
 import static jdk.internal.constant.ConstantUtils.arrayDepth;
 import static jdk.internal.constant.ConstantUtils.binaryToInternal;
-import static jdk.internal.constant.ConstantUtils.dropFirstAndLastChar;
 import static jdk.internal.constant.ConstantUtils.internalToBinary;
 import static jdk.internal.constant.ConstantUtils.validateBinaryClassName;
 import static jdk.internal.constant.ConstantUtils.validateInternalClassName;
@@ -165,7 +164,7 @@ static ClassDesc of(String packageName, String className) {
     static ClassDesc ofDescriptor(String descriptor) {
         // implicit null-check
         return (descriptor.length() == 1)
-               ? Wrapper.forPrimitiveType(descriptor.charAt(0)).classDescriptor()
+               ? Wrapper.forPrimitiveType(descriptor.charAt(0)).basicClassDescriptor()
                // will throw IAE on descriptor.length == 0 or if array dimensions too long
                : ReferenceClassDescImpl.of(descriptor);
     }
@@ -315,7 +314,7 @@ default ClassDesc componentType() {
         if (isArray()) {
             String desc = descriptorString();
             if (desc.length() == 2) {
-                return Wrapper.forBasicType(desc.charAt(1)).classDescriptor();
+                return Wrapper.forBasicType(desc.charAt(1)).basicClassDescriptor();
             } else {
                 return ReferenceClassDescImpl.ofValidated(desc.substring(1));
             }
@@ -375,6 +374,9 @@ else if (isArray()) {
      */
     String descriptorString();
 
+    /**
+     * @since 21
+     */
     @Override
     Class<?> resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException;
 
diff --git a/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java b/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java
index 616c5b67365..6a3541bf5e9 100644
--- a/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java
+++ b/src/java.base/share/classes/java/lang/constant/MethodHandleDesc.java
@@ -207,6 +207,9 @@ default MethodHandleDesc asType(MethodTypeDesc type) {
      */
     MethodTypeDesc invocationType();
 
+    /**
+     * @since 21
+     */
     @Override
     MethodHandle resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException;
 
diff --git a/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java b/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java
index 19bce254d49..fb90b1f15c5 100644
--- a/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java
+++ b/src/java.base/share/classes/java/lang/constant/MethodTypeDesc.java
@@ -222,6 +222,8 @@ default String displayDescriptor() {
      * @apiNote {@linkplain MethodTypeDesc} can represent method type descriptors
      * that are not representable by {@linkplain MethodType}, such as methods with
      * more than 255 parameter slots, so attempts to resolve these may result in errors.
+     *
+     * @since 21
      */
     @Override
     MethodType resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException;
diff --git a/src/java.base/share/classes/java/lang/foreign/Linker.java b/src/java.base/share/classes/java/lang/foreign/Linker.java
index 545a83984f8..fd6e820d016 100644
--- a/src/java.base/share/classes/java/lang/foreign/Linker.java
+++ b/src/java.base/share/classes/java/lang/foreign/Linker.java
@@ -222,7 +222,7 @@
  * <pre>
  * MemoryLayout.structLayout(
  *     ValueLayout.JAVA_INT.withName("x"),
- *     MemoryLayout.paddingLayout(32),
+ *     MemoryLayout.paddingLayout(4),
  *     ValueLayout.JAVA_LONG.withName("y")
  * );
  * </pre>
diff --git a/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java b/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java
index 372b10aab13..989fc134a26 100644
--- a/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java
+++ b/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java
@@ -369,7 +369,7 @@
  * int size = ...
  * MemorySegment points = ...
  * for (int i = 0 ; i < size ; i++) {
- *     ... POINT_ARR_X.get(segment, 0L, (long)i) ...
+ *     ... POINT_ARR_X.get(points, 0L, (long)i) ...
  * }
  * }
  *
diff --git a/src/java.base/share/classes/java/lang/foreign/MemorySegment.java b/src/java.base/share/classes/java/lang/foreign/MemorySegment.java
index 6c75c0385fa..83a8b09f9d4 100644
--- a/src/java.base/share/classes/java/lang/foreign/MemorySegment.java
+++ b/src/java.base/share/classes/java/lang/foreign/MemorySegment.java
@@ -618,6 +618,8 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl {
      *     // Take action (e.g. throw an Exception)
      * }
      * }
+     *
+     * @since 23
      */
     long maxByteAlignment();
 
@@ -630,6 +632,12 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl {
      * {@snippet lang=java :
      * asSlice(offset, newSize, 1);
      * }
+     * <p>
+     * If this segment is {@linkplain MemorySegment#isReadOnly() read-only},
+     * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}.
+     * <p>
+     * The returned memory segment shares a region of backing memory with this segment.
+     * Hence, no memory will be allocated or freed by this method.
      *
      * @see #asSlice(long, long, long)
      *
@@ -646,6 +654,12 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl {
      * Returns a slice of this memory segment, at the given offset, with the provided
      * alignment constraint. The returned segment's address is the address of this
      * segment plus the given offset; its size is specified by the given argument.
+     * <p>
+     * If this segment is {@linkplain MemorySegment#isReadOnly() read-only},
+     * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}.
+     * <p>
+     * The returned memory segment shares a region of backing memory with this segment.
+     * Hence, no memory will be allocated or freed by this method.
      *
      * @param offset The new segment base offset (relative to the address of this segment),
      *               specified in bytes
@@ -670,6 +684,12 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl {
      * {@snippet lang=java :
      * asSlice(offset, layout.byteSize(), layout.byteAlignment());
      * }
+     * <p>
+     * If this segment is {@linkplain MemorySegment#isReadOnly() read-only},
+     * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}.
+     * <p>
+     * The returned memory segment shares a region of backing memory with this segment.
+     * Hence, no memory will be allocated or freed by this method.
      *
      * @see #asSlice(long, long, long)
      *
@@ -693,6 +713,12 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl {
      * {@snippet lang=java :
      * asSlice(offset, byteSize() - offset);
      * }
+     * <p>
+     * If this segment is {@linkplain MemorySegment#isReadOnly() read-only},
+     * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}.
+     * <p>
+     * The returned memory segment shares a region of backing memory with this segment.
+     * Hence, no memory will be allocated or freed by this method.
      *
      * @see #asSlice(long, long)
      *
@@ -706,6 +732,12 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl {
     /**
      * Returns a new memory segment that has the same address and scope as this segment,
      * but with the provided size.
+     * <p>
+     * If this segment is {@linkplain MemorySegment#isReadOnly() read-only},
+     * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}.
+     * <p>
+     * The returned memory segment shares a region of backing memory with this segment.
+     * Hence, no memory will be allocated or freed by this method.
      *
      * @param newSize the size of the returned segment
      * @return a new memory segment that has the same address and scope as
@@ -741,6 +773,12 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl {
      * That is, the cleanup action receives a segment that is associated with the global
      * scope, and is accessible from any thread. The size of the segment accepted by the
      * cleanup action is {@link #byteSize()}.
+     * <p>
+     * If this segment is {@linkplain MemorySegment#isReadOnly() read-only},
+     * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}.
+     * <p>
+     * The returned memory segment shares a region of backing memory with this segment.
+     * Hence, no memory will be allocated or freed by this method.
      *
      * @apiNote The cleanup action (if present) should take care not to leak the received
      *          segment to external clients that might access the segment after its
@@ -786,6 +824,12 @@ public sealed interface MemorySegment permits AbstractMemorySegmentImpl {
      * That is, the cleanup action receives a segment that is associated with the global
      * scope, and is accessible from any thread. The size of the segment accepted by the
      * cleanup action is {@code newSize}.
+     * <p>
+     * If this segment is {@linkplain MemorySegment#isReadOnly() read-only},
+     * the returned segment is also {@linkplain MemorySegment#isReadOnly() read-only}.
+     * <p>
+     * The returned memory segment shares a region of backing memory with this segment.
+     * Hence, no memory will be allocated or freed by this method.
      *
      * @apiNote The cleanup action (if present) should take care not to leak the received
      *          segment to external clients that might access the segment after its
diff --git a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java
index a5eb681fb88..1df3b3c6628 100644
--- a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java
+++ b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java
@@ -25,13 +25,13 @@
 
 package java.lang.invoke;
 
-import jdk.internal.loader.BootLoader;
-import jdk.internal.org.objectweb.asm.ClassWriter;
-import jdk.internal.org.objectweb.asm.FieldVisitor;
-import jdk.internal.org.objectweb.asm.MethodVisitor;
-import jdk.internal.vm.annotation.Stable;
-import sun.invoke.util.BytecodeName;
-
+import java.lang.classfile.*;
+import java.lang.classfile.attribute.ExceptionsAttribute;
+import java.lang.classfile.attribute.SourceFileAttribute;
+import java.lang.constant.ClassDesc;
+import java.lang.constant.MethodTypeDesc;
+import java.lang.invoke.LambdaForm.BasicType;
+import java.lang.invoke.InnerClassLambdaMetafactory.MethodBody;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
@@ -40,14 +40,22 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Consumer;
 import java.util.function.Function;
 
-import static java.lang.invoke.LambdaForm.*;
+import jdk.internal.constant.MethodTypeDescImpl;
+import jdk.internal.constant.ReferenceClassDescImpl;
+import jdk.internal.loader.BootLoader;
+import jdk.internal.vm.annotation.Stable;
+import sun.invoke.util.BytecodeName;
+import sun.invoke.util.Wrapper;
+
+import static java.lang.classfile.ClassFile.*;
+import static java.lang.constant.ConstantDescs.*;
 import static java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic;
 import static java.lang.invoke.MethodHandleNatives.Constants.REF_putStatic;
 import static java.lang.invoke.MethodHandleStatics.*;
 import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
-import static jdk.internal.org.objectweb.asm.Opcodes.*;
 
 /**
  * Class specialization code.
@@ -57,6 +65,12 @@
  */
 /*non-public*/
 abstract class ClassSpecializer<T,K,S extends ClassSpecializer<T,K,S>.SpeciesData> {
+
+    private static final ClassDesc CD_LambdaForm = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm;");
+    private static final ClassDesc CD_BoundMethodHandle = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/BoundMethodHandle;");
+    private static final Consumer<FieldBuilder> STATIC_FIELD_FLAGS = new InnerClassLambdaMetafactory.FieldFlags(ACC_STATIC);
+    private static final Consumer<FieldBuilder> FINAL_FIELD_FLAGS = new InnerClassLambdaMetafactory.FieldFlags(ACC_FINAL);
+
     private final Class<T> topClass;
     private final Class<K> keyType;
     private final Class<S> metaType;
@@ -404,7 +418,7 @@ protected String deriveTypeString() {
                     buf.append(basicType.basicTypeChar());
                 } else {
                     buf.append('V');
-                    end.append(classSig(type));
+                    end.append(type.descriptorString());
                 }
             }
             String typeString;
@@ -572,8 +586,9 @@ Class<? extends T> generateConcreteSpeciesCode(String className, ClassSpecialize
         }
 
         // These are named like constants because there is only one per specialization scheme:
-        private final String SPECIES_DATA = classBCName(metaType);
-        private final String SPECIES_DATA_SIG = classSig(SPECIES_DATA);
+
+        private final ClassDesc CD_SPECIES_DATA = classDesc(metaType);
+        private final MethodTypeDesc MTD_SPECIES_DATA = MethodTypeDescImpl.ofValidated(CD_SPECIES_DATA);
         private final String SPECIES_DATA_NAME = sdAccessor.getName();
         private final int SPECIES_DATA_MODS = sdAccessor.getModifiers();
         private final List<String> TRANSFORM_NAMES;  // derived from transformMethods
@@ -595,268 +610,229 @@ Class<? extends T> generateConcreteSpeciesCode(String className, ClassSpecialize
             TRANSFORM_TYPES = List.of(tts.toArray(new MethodType[0]));
             TRANSFORM_MODS = List.of(tms.toArray(new Integer[0]));
         }
+        private static final MethodTypeDesc MTD_TRANFORM_HELPER = MethodTypeDescImpl.ofValidated(CD_MethodHandle, CD_int);
         private static final int ACC_PPP = ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED;
 
         /*non-public*/
         byte[] generateConcreteSpeciesCodeFile(String className0, ClassSpecializer<T,K,S>.SpeciesData speciesData) {
-            final String className = classBCName(className0);
-            final String superClassName = classBCName(speciesData.deriveSuperClass());
-
-            final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
-            final int NOT_ACC_PUBLIC = 0;  // not ACC_PUBLIC
-            cw.visit(CLASSFILE_VERSION, NOT_ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, superClassName, null);
-
-            final String sourceFile = className.substring(className.lastIndexOf('.')+1);
-            cw.visitSource(sourceFile, null);
-
-            // emit static types and BMH_SPECIES fields
-            FieldVisitor fw = cw.visitField(NOT_ACC_PUBLIC + ACC_STATIC, sdFieldName, SPECIES_DATA_SIG, null, null);
-            fw.visitAnnotation(STABLE_SIG, true);
-            fw.visitEnd();
-
-            // handy holder for dealing with groups of typed values (ctor arguments and fields)
-            class Var {
-                final int index;
-                final String name;
-                final Class<?> type;
-                final String desc;
-                final BasicType basicType;
-                final int slotIndex;
-                Var(int index, int slotIndex) {
-                    this.index = index;
-                    this.slotIndex = slotIndex;
-                    name = null; type = null; desc = null;
-                    basicType = BasicType.V_TYPE;
-                }
-                Var(String name, Class<?> type, Var prev) {
-                    int slotIndex = prev.nextSlotIndex();
-                    int index = prev.nextIndex();
-                    if (name == null)  name = "x";
-                    if (name.endsWith("#"))
-                        name = name.substring(0, name.length()-1) + index;
-                    assert(!type.equals(void.class));
-                    String desc = classSig(type);
-                    BasicType basicType = BasicType.basicType(type);
-                    this.index = index;
-                    this.name = name;
-                    this.type = type;
-                    this.desc = desc;
-                    this.basicType = basicType;
-                    this.slotIndex = slotIndex;
-                }
-                Var lastOf(List<Var> vars) {
-                    int n = vars.size();
-                    return (n == 0 ? this : vars.get(n-1));
-                }
-                <X> List<Var> fromTypes(List<X> types) {
-                    Var prev = this;
-                    ArrayList<Var> result = new ArrayList<>(types.size());
-                    int i = 0;
-                    for (X x : types) {
-                        String vn = name;
-                        Class<?> vt;
-                        if (x instanceof Class<?> cl) {
-                            vt = cl;
-                            // make the names friendlier if debugging
-                            assert((vn = vn + "_" + (i++)) != null);
-                        } else {
-                            @SuppressWarnings("unchecked")
-                            Var v = (Var) x;
-                            vn = v.name;
-                            vt = v.type;
+            final ClassDesc classDesc = ClassDesc.of(className0);
+            final ClassDesc superClassDesc = classDesc(speciesData.deriveSuperClass());
+            return ClassFile.of().build(classDesc, new Consumer<ClassBuilder>() {
+                @Override
+                public void accept(ClassBuilder clb) {
+                    clb.withFlags(ACC_FINAL | ACC_SUPER)
+                       .withSuperclass(superClassDesc)
+                       .with(SourceFileAttribute.of(classDesc.displayName()))
+
+                    // emit static types and BMH_SPECIES fields
+                       .withField(sdFieldName, CD_SPECIES_DATA, STATIC_FIELD_FLAGS);
+
+                    // handy holder for dealing with groups of typed values (ctor arguments and fields)
+                    class Var {
+                        final int index;
+                        final String name;
+                        final Class<?> type;
+                        final ClassDesc desc;
+                        final BasicType basicType;
+                        final int slotIndex;
+                        Var(int index, int slotIndex) {
+                            this.index = index;
+                            this.slotIndex = slotIndex;
+                            name = null; type = null; desc = null;
+                            basicType = BasicType.V_TYPE;
+                        }
+                        Var(String name, Class<?> type, Var prev) {
+                            int slotIndex = prev.nextSlotIndex();
+                            int index = prev.nextIndex();
+                            if (name == null)  name = "x";
+                            if (name.endsWith("#"))
+                                name = name.substring(0, name.length()-1) + index;
+                            assert(!type.equals(void.class));
+                            this.index = index;
+                            this.name = name;
+                            this.type = type;
+                            this.desc = classDesc(type);
+                            this.basicType = BasicType.basicType(type);
+                            this.slotIndex = slotIndex;
+                        }
+                        Var lastOf(List<Var> vars) {
+                            int n = vars.size();
+                            return (n == 0 ? this : vars.get(n-1));
+                        }
+                        <X> List<Var> fromTypes(List<X> types) {
+                            Var prev = this;
+                            ArrayList<Var> result = new ArrayList<>(types.size());
+                            int i = 0;
+                            for (X x : types) {
+                                String vn = name;
+                                Class<?> vt;
+                                if (x instanceof Class<?> cl) {
+                                    vt = cl;
+                                    // make the names friendlier if debugging
+                                    assert((vn = vn + "_" + (i++)) != null);
+                                } else {
+                                    @SuppressWarnings("unchecked")
+                                    Var v = (Var) x;
+                                    vn = v.name;
+                                    vt = v.type;
+                                }
+                                prev = new Var(vn, vt, prev);
+                                result.add(prev);
+                            }
+                            return result;
                         }
-                        prev = new Var(vn, vt, prev);
-                        result.add(prev);
-                    }
-                    return result;
-                }
-
-                int slotSize() { return basicType.basicTypeSlots(); }
-                int nextIndex() { return index + (slotSize() == 0 ? 0 : 1); }
-                int nextSlotIndex() { return slotIndex >= 0 ? slotIndex + slotSize() : slotIndex; }
-                boolean isInHeap() { return slotIndex < 0; }
-                void emitVarInstruction(int asmop, MethodVisitor mv) {
-                    if (asmop == ALOAD)
-                        asmop = typeLoadOp(basicType.basicTypeChar());
-                    else
-                        throw new AssertionError("bad op="+asmop+" for desc="+desc);
-                    mv.visitVarInsn(asmop, slotIndex);
-                }
-                public void emitFieldInsn(int asmop, MethodVisitor mv) {
-                    mv.visitFieldInsn(asmop, className, name, desc);
-                }
-            }
-
-            final Var NO_THIS = new Var(0, 0),
-                    AFTER_THIS = new Var(0, 1),
-                    IN_HEAP = new Var(0, -1);
-
-            // figure out the field types
-            final List<Class<?>> fieldTypes = speciesData.fieldTypes();
-            final List<Var> fields = new ArrayList<>(fieldTypes.size());
-            {
-                Var nextF = IN_HEAP;
-                for (Class<?> ft : fieldTypes) {
-                    String fn = chooseFieldName(ft, nextF.nextIndex());
-                    nextF = new Var(fn, ft, nextF);
-                    fields.add(nextF);
-                }
-            }
-
-            // emit bound argument fields
-            for (Var field : fields) {
-                cw.visitField(ACC_FINAL, field.name, field.desc, null, null).visitEnd();
-            }
-
-            MethodVisitor mv;
-
-            // emit implementation of speciesData()
-            mv = cw.visitMethod((SPECIES_DATA_MODS & ACC_PPP) + ACC_FINAL,
-                    SPECIES_DATA_NAME, "()" + SPECIES_DATA_SIG, null, null);
-            mv.visitCode();
-            mv.visitFieldInsn(GETSTATIC, className, sdFieldName, SPECIES_DATA_SIG);
-            mv.visitInsn(ARETURN);
-            mv.visitMaxs(0, 0);
-            mv.visitEnd();
-
-            // figure out the constructor arguments
-            MethodType superCtorType = ClassSpecializer.this.baseConstructorType();
-            MethodType thisCtorType = superCtorType.appendParameterTypes(fieldTypes);
-
-            // emit constructor
-            {
-                mv = cw.visitMethod(ACC_PRIVATE,
-                        "<init>", methodSig(thisCtorType), null, null);
-                mv.visitCode();
-                mv.visitVarInsn(ALOAD, 0); // this
-
-                final List<Var> ctorArgs = AFTER_THIS.fromTypes(superCtorType.parameterList());
-                for (Var ca : ctorArgs) {
-                    ca.emitVarInstruction(ALOAD, mv);
-                }
-
-                // super(ca...)
-                mv.visitMethodInsn(INVOKESPECIAL, superClassName,
-                        "<init>", methodSig(superCtorType), false);
-
-                // store down fields
-                Var lastFV = AFTER_THIS.lastOf(ctorArgs);
-                for (Var f : fields) {
-                    // this.argL1 = argL1
-                    mv.visitVarInsn(ALOAD, 0);  // this
-                    lastFV = new Var(f.name, f.type, lastFV);
-                    lastFV.emitVarInstruction(ALOAD, mv);
-                    f.emitFieldInsn(PUTFIELD, mv);
-                }
-
-                mv.visitInsn(RETURN);
-                mv.visitMaxs(0, 0);
-                mv.visitEnd();
-            }
 
-            // emit make()  ...factory method wrapping constructor
-            {
-                MethodType ftryType = thisCtorType.changeReturnType(topClass());
-                mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_STATIC,
-                        "make", methodSig(ftryType), null, null);
-                mv.visitCode();
-                // make instance
-                mv.visitTypeInsn(NEW, className);
-                mv.visitInsn(DUP);
-                // load factory method arguments:  ctarg... and arg...
-                for (Var v : NO_THIS.fromTypes(ftryType.parameterList())) {
-                    v.emitVarInstruction(ALOAD, mv);
-                }
+                        int slotSize() { return basicType.basicTypeSlots(); }
+                        int nextIndex() { return index + (slotSize() == 0 ? 0 : 1); }
+                        int nextSlotIndex() { return slotIndex >= 0 ? slotIndex + slotSize() : slotIndex; }
+                        boolean isInHeap() { return slotIndex < 0; }
+                        void emitLoadInstruction(CodeBuilder cob) {
+                            cob.loadLocal(basicType.btKind, slotIndex);
+                        }
+                    }
 
-                // finally, invoke the constructor and return
-                mv.visitMethodInsn(INVOKESPECIAL, className,
-                        "<init>", methodSig(thisCtorType), false);
-                mv.visitInsn(ARETURN);
-                mv.visitMaxs(0, 0);
-                mv.visitEnd();
-            }
+                    final Var NO_THIS = new Var(0, 0),
+                            AFTER_THIS = new Var(0, 1),
+                            IN_HEAP = new Var(0, -1);
+
+                    // figure out the field types
+                    final List<Class<?>> fieldTypes = speciesData.fieldTypes();
+                    final List<Var> fields = new ArrayList<>(fieldTypes.size());
+                    {
+                        Var nextF = IN_HEAP;
+                        for (Class<?> ft : fieldTypes) {
+                            String fn = chooseFieldName(ft, nextF.nextIndex());
+                            nextF = new Var(fn, ft, nextF);
+                            fields.add(nextF);
+                        }
+                    }
 
-            // For each transform, emit the customized override of the transform method.
-            // This method mixes together some incoming arguments (from the transform's
-            // static type signature) with the field types themselves, and passes
-            // the resulting mish-mosh of values to a method handle produced by
-            // the species itself.  (Typically this method handle is the factory
-            // method of this species or a related one.)
-            for (int whichtm = 0; whichtm < TRANSFORM_NAMES.size(); whichtm++) {
-                final String     TNAME = TRANSFORM_NAMES.get(whichtm);
-                final MethodType TTYPE = TRANSFORM_TYPES.get(whichtm);
-                final int        TMODS = TRANSFORM_MODS.get(whichtm);
-                mv = cw.visitMethod((TMODS & ACC_PPP) | ACC_FINAL,
-                        TNAME, TTYPE.toMethodDescriptorString(), null, E_THROWABLE);
-                mv.visitCode();
-                // return a call to the corresponding "transform helper", something like this:
-                //   MY_SPECIES.transformHelper(whichtm).invokeBasic(ctarg, ..., argL0, ..., xarg)
-                mv.visitFieldInsn(GETSTATIC, className,
-                        sdFieldName, SPECIES_DATA_SIG);
-                emitIntConstant(whichtm, mv);
-                mv.visitMethodInsn(INVOKEVIRTUAL, SPECIES_DATA,
-                        "transformHelper", "(I)" + MH_SIG, false);
-
-                List<Var> targs = AFTER_THIS.fromTypes(TTYPE.parameterList());
-                List<Var> tfields = new ArrayList<>(fields);
-                // mix them up and load them for the transform helper:
-                List<Var> helperArgs = speciesData.deriveTransformHelperArguments(transformMethods.get(whichtm), whichtm, targs, tfields);
-                List<Class<?>> helperTypes = new ArrayList<>(helperArgs.size());
-                for (Var ha : helperArgs) {
-                    helperTypes.add(ha.basicType.basicTypeClass());
-                    if (ha.isInHeap()) {
-                        assert(tfields.contains(ha));
-                        mv.visitVarInsn(ALOAD, 0);
-                        ha.emitFieldInsn(GETFIELD, mv);
-                    } else {
-                        assert(targs.contains(ha));
-                        ha.emitVarInstruction(ALOAD, mv);
+                    // emit bound argument fields
+                    for (Var field : fields) {
+                        clb.withField(field.name, field.desc, FINAL_FIELD_FLAGS);
                     }
-                }
 
-                // jump into the helper (which is probably a factory method)
-                final Class<?> rtype = TTYPE.returnType();
-                final BasicType rbt = BasicType.basicType(rtype);
-                MethodType invokeBasicType = MethodType.methodType(rbt.basicTypeClass(), helperTypes);
-                mv.visitMethodInsn(INVOKEVIRTUAL, MH,
-                        "invokeBasic", methodSig(invokeBasicType), false);
-                if (rbt == BasicType.L_TYPE) {
-                    mv.visitTypeInsn(CHECKCAST, classBCName(rtype));
-                    mv.visitInsn(ARETURN);
-                } else {
-                    throw newInternalError("NYI: transform of type "+rtype);
+                    // emit implementation of speciesData()
+                    clb.withMethod(SPECIES_DATA_NAME, MTD_SPECIES_DATA, (SPECIES_DATA_MODS & ACC_PPP) | ACC_FINAL,
+                            new MethodBody(new Consumer<CodeBuilder>() {
+                                @Override
+                                public void accept(CodeBuilder cob) {
+                                    cob.getstatic(classDesc, sdFieldName, CD_SPECIES_DATA)
+                                            .areturn();
+                                }
+                            }));
+
+                    // figure out the constructor arguments
+                    MethodType superCtorType = ClassSpecializer.this.baseConstructorType();
+                    MethodType thisCtorType = superCtorType.appendParameterTypes(fieldTypes);
+
+                    // emit constructor
+                    clb.withMethod(INIT_NAME, methodDesc(thisCtorType), ACC_PRIVATE,
+                            new MethodBody(new Consumer<CodeBuilder>() {
+                                @Override
+                                public void accept(CodeBuilder cob) {
+                                    cob.aload(0); // this
+
+                                    final List<Var> ctorArgs = AFTER_THIS.fromTypes(superCtorType.parameterList());
+                                    for (Var ca : ctorArgs) {
+                                        ca.emitLoadInstruction(cob);
+                                    }
+
+                                    // super(ca...)
+                                    cob.invokespecial(superClassDesc, INIT_NAME, methodDesc(superCtorType));
+
+                                    // store down fields
+                                    Var lastFV = AFTER_THIS.lastOf(ctorArgs);
+                                    for (Var f : fields) {
+                                        // this.argL1 = argL1
+                                        cob.aload(0);  // this
+                                        lastFV = new Var(f.name, f.type, lastFV);
+                                        lastFV.emitLoadInstruction(cob);
+                                        cob.putfield(classDesc, f.name, f.desc);
+                                    }
+
+                                    cob.return_();
+                                }
+                            }));
+
+                    // emit make()  ...factory method wrapping constructor
+                    MethodType ftryType = thisCtorType.changeReturnType(topClass());
+                    clb.withMethod("make", methodDesc(ftryType), ACC_STATIC,
+                            new MethodBody(new Consumer<CodeBuilder>() {
+                                @Override
+                                public void accept(CodeBuilder cob) {
+                                    // make instance
+                                    cob.new_(classDesc)
+                                            .dup();
+                                    // load factory method arguments:  ctarg... and arg...
+                                    for (Var v : NO_THIS.fromTypes(ftryType.parameterList())) {
+                                        v.emitLoadInstruction(cob);
+                                    }
+
+                                    // finally, invoke the constructor and return
+                                    cob.invokespecial(classDesc, INIT_NAME, methodDesc(thisCtorType))
+                                            .areturn();
+                                }
+                            }));
+
+                    // For each transform, emit the customized override of the transform method.
+                    // This method mixes together some incoming arguments (from the transform's
+                    // static type signature) with the field types themselves, and passes
+                    // the resulting mish-mosh of values to a method handle produced by
+                    // the species itself.  (Typically this method handle is the factory
+                    // method of this species or a related one.)
+                    for (int i = 0; i < TRANSFORM_NAMES.size(); i++) {
+                        final int whichtm = i;
+                        final String     TNAME = TRANSFORM_NAMES.get(whichtm);
+                        final MethodType TTYPE = TRANSFORM_TYPES.get(whichtm);
+                        final int        TMODS = TRANSFORM_MODS.get(whichtm);
+                        clb.withMethod(TNAME, methodDesc(TTYPE), (TMODS & ACC_PPP) | ACC_FINAL, new Consumer<MethodBuilder>() {
+                            @Override
+                            public void accept(MethodBuilder mb) {
+                                mb.with(ExceptionsAttribute.ofSymbols(CD_Throwable))
+                                  .withCode(new Consumer<CodeBuilder>() {
+                                    @Override
+                                    public void accept(CodeBuilder cob) {
+                                        // return a call to the corresponding "transform helper", something like this:
+                                        //   MY_SPECIES.transformHelper(whichtm).invokeBasic(ctarg, ..., argL0, ..., xarg)
+                                        cob.getstatic(classDesc, sdFieldName, CD_SPECIES_DATA)
+                                                .loadConstant(whichtm)
+                                                .invokevirtual(CD_SPECIES_DATA, "transformHelper", MTD_TRANFORM_HELPER);
+
+                                        List<Var> targs = AFTER_THIS.fromTypes(TTYPE.parameterList());
+                                        List<Var> tfields = new ArrayList<>(fields);
+                                        // mix them up and load them for the transform helper:
+                                        List<Var> helperArgs = speciesData.deriveTransformHelperArguments(transformMethods.get(whichtm), whichtm, targs, tfields);
+                                        ClassDesc[] helperTypes = new ClassDesc[helperArgs.size()];
+                                        for (int hi = 0; hi < helperTypes.length; hi++) {
+                                            Var ha = helperArgs.get(hi);
+                                            helperTypes[hi] = ha.basicType.basicTypeWrapper().basicClassDescriptor();
+                                            if (ha.isInHeap()) {
+                                                assert(tfields.contains(ha));
+                                                cob.aload(0);
+                                                cob.getfield(classDesc, ha.name, ha.desc);
+                                            } else {
+                                                assert(targs.contains(ha));
+                                                ha.emitLoadInstruction(cob);
+                                            }
+                                        }
+
+                                        // jump into the helper (which is probably a factory method)
+                                        final Class<?> rtype = TTYPE.returnType();
+                                        if (!rtype.isPrimitive()) {
+                                            cob.invokevirtual(CD_MethodHandle, "invokeBasic", MethodTypeDescImpl.ofValidated(CD_Object, helperTypes))
+                                                    .checkcast(classDesc(rtype))
+                                                    .areturn();
+                                        } else {
+                                            throw newInternalError("NYI: transform of type "+rtype);
+                                        }
+                                    }
+                                });
+                            }
+                        });
+                    }
                 }
-                mv.visitMaxs(0, 0);
-                mv.visitEnd();
-            }
-
-            cw.visitEnd();
-
-            return cw.toByteArray();
-        }
-
-        private int typeLoadOp(char t) {
-            return switch (t) {
-                case 'L' -> ALOAD;
-                case 'I' -> ILOAD;
-                case 'J' -> LLOAD;
-                case 'F' -> FLOAD;
-                case 'D' -> DLOAD;
-                default -> throw newInternalError("unrecognized type " + t);
-            };
-        }
-
-        private void emitIntConstant(int con, MethodVisitor mv) {
-            if (ICONST_M1 - ICONST_0 <= con && con <= ICONST_5 - ICONST_0)
-                mv.visitInsn(ICONST_0 + con);
-            else if (con == (byte) con)
-                mv.visitIntInsn(BIPUSH, con);
-            else if (con == (short) con)
-                mv.visitIntInsn(SIPUSH, con);
-            else {
-                mv.visitLdcInsn(con);
-            }
-
+            });
         }
 
         //
@@ -990,39 +966,25 @@ protected Factory makeFactory() {
 
 
     // Other misc helpers:
-    private static final String MH = "java/lang/invoke/MethodHandle";
-    private static final String MH_SIG = "L" + MH + ";";
-    private static final String STABLE = "jdk/internal/vm/annotation/Stable";
-    private static final String STABLE_SIG = "L" + STABLE + ";";
-    private static final String[] E_THROWABLE = new String[] { "java/lang/Throwable" };
-    static {
-        assert(MH_SIG.equals(classSig(MethodHandle.class)));
-        assert(MH.equals(classBCName(MethodHandle.class)));
-    }
-
-    static String methodSig(MethodType mt) {
-        return mt.toMethodDescriptorString();
-    }
-    static String classSig(Class<?> cls) {
-        if (cls.isPrimitive() || cls.isArray())
-            return MethodType.methodType(cls).toMethodDescriptorString().substring(2);
-        return classSig(classBCName(cls));
-    }
-    static String classSig(String bcName) {
-        assert(bcName.indexOf('.') < 0);
-        assert(!bcName.endsWith(";"));
-        assert(!bcName.startsWith("["));
-        return "L" + bcName + ";";
-    }
-    static String classBCName(Class<?> cls) {
-        return classBCName(className(cls));
-    }
     static String classBCName(String str) {
         assert(str.indexOf('/') < 0) : str;
         return str.replace('.', '/');
     }
-    static String className(Class<?> cls) {
-        assert(!cls.isArray() && !cls.isPrimitive());
-        return cls.getName();
+
+    static ClassDesc classDesc(Class<?> cls) {
+        return cls.isPrimitive() ? Wrapper.forPrimitiveType(cls).basicClassDescriptor()
+             : cls == Object.class ? CD_Object
+             : cls == MethodType.class ? CD_MethodType
+             : cls == LambdaForm.class ? CD_LambdaForm
+             : cls == BoundMethodHandle.class ? CD_BoundMethodHandle
+             : ReferenceClassDescImpl.ofValidated(cls.descriptorString());
+    }
+
+    static MethodTypeDesc methodDesc(MethodType mt) {
+        var params = new ClassDesc[mt.parameterCount()];
+        for (int i = 0; i < params.length; i++) {
+            params[i] = classDesc(mt.parameterType(i));
+        }
+        return MethodTypeDescImpl.ofValidated(classDesc(mt.returnType()), params);
     }
 }
diff --git a/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java b/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java
index 46eeb67de54..1e3f465f97d 100644
--- a/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java
+++ b/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java
@@ -25,10 +25,11 @@
 
 package java.lang.invoke;
 
-import jdk.internal.org.objectweb.asm.ClassWriter;
-import jdk.internal.org.objectweb.asm.Opcodes;
 import sun.invoke.util.Wrapper;
 
+import java.lang.classfile.ClassFile;
+import java.lang.classfile.attribute.SourceFileAttribute;
+import java.lang.constant.ClassDesc;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Map;
@@ -38,10 +39,10 @@
 import java.util.TreeSet;
 import java.util.stream.Stream;
 
+import static java.lang.classfile.ClassFile.*;
 import static java.lang.invoke.LambdaForm.BasicType.*;
-import static java.lang.invoke.MethodHandleStatics.CLASSFILE_VERSION;
-import static java.lang.invoke.MethodTypeForm.*;
 import static java.lang.invoke.LambdaForm.Kind.*;
+import static java.lang.invoke.MethodTypeForm.*;
 
 /**
  * Helper class to assist the GenerateJLIClassesPlugin to get access to
@@ -557,19 +558,14 @@ static byte[] generateInvokersHolderClassBytes(String className,
      * a class with a specified name.
      */
     private static byte[] generateCodeBytesForLFs(String className, String[] names, LambdaForm[] forms) {
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
-        cw.visit(CLASSFILE_VERSION, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
-                className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null);
-        cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null);
-
-        for (int i = 0; i < forms.length; i++) {
-            InvokerBytecodeGenerator g
-                = new InvokerBytecodeGenerator(className, names[i], forms[i], forms[i].methodType());
-            g.setClassWriter(cw);
-            g.addMethod();
-        }
-
-        return cw.toByteArray();
+        return ClassFile.of().build(ClassDesc.ofInternalName(className), clb -> {
+            clb.withFlags(ACC_PRIVATE | ACC_FINAL | ACC_SUPER)
+               .withSuperclass(InvokerBytecodeGenerator.INVOKER_SUPER_DESC)
+               .with(SourceFileAttribute.of(className.substring(className.lastIndexOf('/') + 1)));
+            for (int i = 0; i < forms.length; i++) {
+                new InvokerBytecodeGenerator(className, names[i], forms[i], forms[i].methodType()).addMethod(clb);
+            }
+        });
     }
 
     private static LambdaForm makeReinvokerFor(MethodType type) {
diff --git a/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java b/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
index b4afbc098c9..ce2547710a5 100644
--- a/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
+++ b/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
@@ -26,23 +26,40 @@
 package java.lang.invoke;
 
 import jdk.internal.misc.CDS;
-import jdk.internal.org.objectweb.asm.*;
 import jdk.internal.util.ClassFileDumper;
-import sun.invoke.util.BytecodeDescriptor;
 import sun.invoke.util.VerifyAccess;
 import sun.security.action.GetBooleanAction;
 
 import java.io.Serializable;
-import java.lang.constant.ConstantDescs;
+import java.lang.classfile.ClassBuilder;
+import java.lang.classfile.ClassFile;
+import java.lang.classfile.CodeBuilder;
+import java.lang.classfile.FieldBuilder;
+import java.lang.classfile.MethodBuilder;
+import java.lang.classfile.Opcode;
+import java.lang.classfile.TypeKind;
+import java.lang.constant.ClassDesc;
+import java.lang.constant.DynamicConstantDesc;
+import java.lang.constant.MethodTypeDesc;
 import java.lang.reflect.Modifier;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
-
-import static java.lang.invoke.MethodHandleStatics.CLASSFILE_VERSION;
+import java.util.function.Consumer;
+
+import static java.lang.classfile.ClassFile.*;
+import java.lang.classfile.attribute.ExceptionsAttribute;
+import java.lang.classfile.constantpool.ClassEntry;
+import java.lang.classfile.constantpool.ConstantPoolBuilder;
+import java.lang.classfile.constantpool.MethodRefEntry;
+import static java.lang.constant.ConstantDescs.*;
 import static java.lang.invoke.MethodHandles.Lookup.ClassOption.NESTMATE;
 import static java.lang.invoke.MethodHandles.Lookup.ClassOption.STRONG;
 import static java.lang.invoke.MethodType.methodType;
-import static jdk.internal.org.objectweb.asm.Opcodes.*;
+import jdk.internal.constant.ConstantUtils;
+import jdk.internal.constant.MethodTypeDescImpl;
+import jdk.internal.constant.ReferenceClassDescImpl;
+import sun.invoke.util.Wrapper;
 
 /**
  * Lambda metafactory implementation which dynamically creates an
@@ -51,42 +68,29 @@
  * @see LambdaMetafactory
  */
 /* package */ final class InnerClassLambdaMetafactory extends AbstractValidatingLambdaMetafactory {
-    private static final String METHOD_DESCRIPTOR_VOID = Type.getMethodDescriptor(Type.VOID_TYPE);
-    private static final String JAVA_LANG_OBJECT = "java/lang/Object";
-    private static final String NAME_CTOR = "<init>";
     private static final String LAMBDA_INSTANCE_FIELD = "LAMBDA_INSTANCE$";
-
-    //Serialization support
-    private static final String NAME_SERIALIZED_LAMBDA = "java/lang/invoke/SerializedLambda";
-    private static final String NAME_NOT_SERIALIZABLE_EXCEPTION = "java/io/NotSerializableException";
-    private static final String DESCR_METHOD_WRITE_REPLACE = "()Ljava/lang/Object;";
-    private static final String DESCR_METHOD_WRITE_OBJECT = "(Ljava/io/ObjectOutputStream;)V";
-    private static final String DESCR_METHOD_READ_OBJECT = "(Ljava/io/ObjectInputStream;)V";
-
-    private static final String NAME_METHOD_WRITE_REPLACE = "writeReplace";
-    private static final String NAME_METHOD_READ_OBJECT = "readObject";
-    private static final String NAME_METHOD_WRITE_OBJECT = "writeObject";
-
-    private static final String DESCR_CLASS = "Ljava/lang/Class;";
-    private static final String DESCR_STRING = "Ljava/lang/String;";
-    private static final String DESCR_OBJECT = "Ljava/lang/Object;";
-    private static final String DESCR_CTOR_SERIALIZED_LAMBDA
-            = "(" + DESCR_CLASS + DESCR_STRING + DESCR_STRING + DESCR_STRING + "I"
-            + DESCR_STRING + DESCR_STRING + DESCR_STRING + DESCR_STRING + "[" + DESCR_OBJECT + ")V";
-
-    private static final String DESCR_CTOR_NOT_SERIALIZABLE_EXCEPTION = "(Ljava/lang/String;)V";
-    private static final String[] SER_HOSTILE_EXCEPTIONS = new String[] {NAME_NOT_SERIALIZABLE_EXCEPTION};
-
     private static final String[] EMPTY_STRING_ARRAY = new String[0];
+    private static final ClassDesc[] EMPTY_CLASSDESC_ARRAY = ConstantUtils.EMPTY_CLASSDESC;
+
+    // Static builders to avoid lambdas
+    record FieldFlags(int flags) implements Consumer<FieldBuilder> {
+        @Override
+        public void accept(FieldBuilder fb) {
+            fb.withFlags(flags);
+        }
+    };
+    record MethodBody(Consumer<CodeBuilder> code) implements Consumer<MethodBuilder> {
+        @Override
+        public void accept(MethodBuilder mb) {
+            mb.withCode(code);
+        }
+    };
 
     // For dumping generated classes to disk, for debugging purposes
     private static final ClassFileDumper lambdaProxyClassFileDumper;
 
     private static final boolean disableEagerInitialization;
 
-    // condy to load implMethod from class data
-    private static final ConstantDynamic implMethodCondy;
-
     static {
         // To dump the lambda proxy classes, set this system property:
         //    -Djdk.invoke.LambdaMetafactory.dumpProxyClassFiles
@@ -96,23 +100,18 @@
 
         final String disableEagerInitializationKey = "jdk.internal.lambda.disableEagerInitialization";
         disableEagerInitialization = GetBooleanAction.privilegedGetProperty(disableEagerInitializationKey);
-
-        // condy to load implMethod from class data
-        MethodType classDataMType = methodType(Object.class, MethodHandles.Lookup.class, String.class, Class.class);
-        Handle classDataBsm = new Handle(H_INVOKESTATIC, Type.getInternalName(MethodHandles.class), "classData",
-                                         classDataMType.descriptorString(), false);
-        implMethodCondy = new ConstantDynamic(ConstantDescs.DEFAULT_NAME, MethodHandle.class.descriptorString(), classDataBsm);
     }
 
     // See context values in AbstractValidatingLambdaMetafactory
-    private final String implMethodClassName;        // Name of type containing implementation "CC"
+    private final ClassDesc implMethodClassDesc;     // Name of type containing implementation "CC"
     private final String implMethodName;             // Name of implementation method "impl"
-    private final String implMethodDesc;             // Type descriptor for implementation methods "(I)Ljava/lang/String;"
+    private final MethodTypeDesc implMethodDesc;     // Type descriptor for implementation methods "(I)Ljava/lang/String;"
     private final MethodType constructorType;        // Generated class constructor type "(CC)void"
-    private final ClassWriter cw;                    // ASM class writer
+    private final MethodTypeDesc constructorTypeDesc;// Type descriptor for the generated class constructor type "(CC)void"
     private final String[] argNames;                 // Generated names for the constructor arguments
-    private final String[] argDescs;                 // Type descriptors for the constructor arguments
-    private final String lambdaClassName;            // Generated name for the generated class "X$$Lambda"
+    private final ClassDesc[] argDescs;              // Type descriptors for the constructor arguments
+    private final String lambdaClassName;            // Generated name for the generated class "X$$Lambda$1"
+    private final ClassDesc lambdaClassDesc;         // Type descriptor for the generated class "X$$Lambda$1"
     private final boolean useImplMethodHandle;       // use MethodHandle invocation instead of symbolic bytecode invocation
 
     /**
@@ -168,11 +167,13 @@ public InnerClassLambdaMetafactory(MethodHandles.Lookup caller,
         super(caller, factoryType, interfaceMethodName, interfaceMethodType,
               implementation, dynamicMethodType,
               isSerializable, altInterfaces, altMethods);
-        implMethodClassName = implClass.getName().replace('.', '/');
+        implMethodClassDesc = implClassDesc(implClass);
         implMethodName = implInfo.getName();
-        implMethodDesc = implInfo.getMethodType().toMethodDescriptorString();
+        implMethodDesc = methodDesc(implInfo.getMethodType());
         constructorType = factoryType.changeReturnType(Void.TYPE);
+        constructorTypeDesc = methodDesc(constructorType);
         lambdaClassName = lambdaClassName(targetClass);
+        lambdaClassDesc = ClassDesc.ofInternalName(lambdaClassName);
         // If the target class invokes a protected method inherited from a
         // superclass in a different package, or does 'invokespecial', the
         // lambda class has no access to the resolved method, or does
@@ -182,19 +183,19 @@ public InnerClassLambdaMetafactory(MethodHandles.Lookup caller,
         // situation by generating bridges in the target class)
         useImplMethodHandle = (Modifier.isProtected(implInfo.getModifiers()) &&
                                !VerifyAccess.isSamePackage(targetClass, implInfo.getDeclaringClass())) ||
-                               implKind == H_INVOKESPECIAL ||
-                               implKind == H_INVOKESTATIC && implClass.isHidden();
-        cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+                               implKind == MethodHandleInfo.REF_invokeSpecial ||
+                               implKind == MethodHandleInfo.REF_invokeStatic && implClass.isHidden();
         int parameterCount = factoryType.parameterCount();
         if (parameterCount > 0) {
             argNames = new String[parameterCount];
-            argDescs = new String[parameterCount];
+            argDescs = new ClassDesc[parameterCount];
             for (int i = 0; i < parameterCount; i++) {
                 argNames[i] = "arg$" + (i + 1);
-                argDescs[i] = BytecodeDescriptor.unparse(factoryType.parameterType(i));
+                argDescs[i] = classDesc(factoryType.parameterType(i));
             }
         } else {
-            argNames = argDescs = EMPTY_STRING_ARRAY;
+            argNames = EMPTY_STRING_ARRAY;
+            argDescs = EMPTY_CLASSDESC_ARRAY;
         }
     }
 
@@ -300,65 +301,63 @@ private Class<?> spinInnerClass() throws LambdaConversionException {
      * is not found
      */
     private Class<?> generateInnerClass() throws LambdaConversionException {
-        String[] interfaceNames;
-        String interfaceName = interfaceClass.getName().replace('.', '/');
+        List<ClassDesc> interfaces;
+        ClassDesc interfaceDesc = classDesc(interfaceClass);
         boolean accidentallySerializable = !isSerializable && Serializable.class.isAssignableFrom(interfaceClass);
         if (altInterfaces.length == 0) {
-            interfaceNames = new String[]{interfaceName};
+            interfaces = List.of(interfaceDesc);
         } else {
             // Assure no duplicate interfaces (ClassFormatError)
-            Set<String> itfs = LinkedHashSet.newLinkedHashSet(altInterfaces.length + 1);
-            itfs.add(interfaceName);
+            Set<ClassDesc> itfs = LinkedHashSet.newLinkedHashSet(altInterfaces.length + 1);
+            itfs.add(interfaceDesc);
             for (Class<?> i : altInterfaces) {
-                itfs.add(i.getName().replace('.', '/'));
+                itfs.add(classDesc(i));
                 accidentallySerializable |= !isSerializable && Serializable.class.isAssignableFrom(i);
             }
-            interfaceNames = itfs.toArray(new String[itfs.size()]);
+            interfaces = List.copyOf(itfs);
         }
+        final boolean finalAccidentallySerializable = accidentallySerializable;
+        final byte[] classBytes = ClassFile.of().build(lambdaClassDesc, new Consumer<ClassBuilder>() {
+            @Override
+            public void accept(ClassBuilder clb) {
+                clb.withFlags(ACC_SUPER | ACC_FINAL | ACC_SYNTHETIC)
+                   .withInterfaceSymbols(interfaces);
+                // Generate final fields to be filled in by constructor
+                for (int i = 0; i < argDescs.length; i++) {
+                    clb.withField(argNames[i], argDescs[i], new FieldFlags(ACC_PRIVATE | ACC_FINAL));
+                }
 
-        cw.visit(CLASSFILE_VERSION, ACC_SUPER + ACC_FINAL + ACC_SYNTHETIC,
-                 lambdaClassName, null,
-                 JAVA_LANG_OBJECT, interfaceNames);
-
-        // Generate final fields to be filled in by constructor
-        for (int i = 0; i < argDescs.length; i++) {
-            FieldVisitor fv = cw.visitField(ACC_PRIVATE + ACC_FINAL,
-                                            argNames[i],
-                                            argDescs[i],
-                                            null, null);
-            fv.visitEnd();
-        }
+                generateConstructor(clb);
 
-        generateConstructor();
+                if (factoryType.parameterCount() == 0 && disableEagerInitialization) {
+                    generateClassInitializer(clb);
+                }
 
-        if (factoryType.parameterCount() == 0 && disableEagerInitialization) {
-            generateClassInitializer();
-        }
+                // Forward the SAM method
+                clb.withMethod(interfaceMethodName,
+                        methodDesc(interfaceMethodType),
+                        ACC_PUBLIC,
+                        forwardingMethod(interfaceMethodType));
+
+                // Forward the bridges
+                if (altMethods != null) {
+                    for (MethodType mt : altMethods) {
+                        clb.withMethod(interfaceMethodName,
+                                methodDesc(mt),
+                                ACC_PUBLIC | ACC_BRIDGE,
+                                forwardingMethod(mt));
+                    }
+                }
 
-        // Forward the SAM method
-        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, interfaceMethodName,
-                                          interfaceMethodType.toMethodDescriptorString(), null, null);
-        new ForwardingMethodGenerator(mv).generate(interfaceMethodType);
-
-        // Forward the altMethods
-        if (altMethods != null) {
-            for (MethodType mt : altMethods) {
-                mv = cw.visitMethod(ACC_PUBLIC, interfaceMethodName,
-                                    mt.toMethodDescriptorString(), null, null);
-                new ForwardingMethodGenerator(mv).generate(mt);
+                if (isSerializable)
+                    generateSerializationFriendlyMethods(clb);
+                else if (finalAccidentallySerializable)
+                    generateSerializationHostileMethods(clb);
             }
-        }
-
-        if (isSerializable)
-            generateSerializationFriendlyMethods();
-        else if (accidentallySerializable)
-            generateSerializationHostileMethods();
-
-        cw.visitEnd();
+        });
 
         // Define the generated class in this VM.
 
-        final byte[] classBytes = cw.toByteArray();
         try {
             // this class is linked at the indy callsite; so define a hidden nestmate
             var classdata = useImplMethodHandle? implementation : null;
@@ -373,237 +372,214 @@ else if (accidentallySerializable)
     /**
      * Generate a static field and a static initializer that sets this field to an instance of the lambda
      */
-    private void generateClassInitializer() {
-        String lambdaTypeDescriptor = factoryType.returnType().descriptorString();
+    private void generateClassInitializer(ClassBuilder clb) {
+        ClassDesc lambdaTypeDescriptor = classDesc(factoryType.returnType());
 
         // Generate the static final field that holds the lambda singleton
-        FieldVisitor fv = cw.visitField(ACC_PRIVATE | ACC_STATIC | ACC_FINAL,
-                LAMBDA_INSTANCE_FIELD, lambdaTypeDescriptor, null, null);
-        fv.visitEnd();
+        clb.withField(LAMBDA_INSTANCE_FIELD, lambdaTypeDescriptor, new FieldFlags(ACC_PRIVATE | ACC_STATIC | ACC_FINAL));
 
         // Instantiate the lambda and store it to the static final field
-        MethodVisitor clinit = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
-        clinit.visitCode();
-
-        clinit.visitTypeInsn(NEW, lambdaClassName);
-        clinit.visitInsn(Opcodes.DUP);
-        assert factoryType.parameterCount() == 0;
-        clinit.visitMethodInsn(INVOKESPECIAL, lambdaClassName, NAME_CTOR, constructorType.toMethodDescriptorString(), false);
-        clinit.visitFieldInsn(PUTSTATIC, lambdaClassName, LAMBDA_INSTANCE_FIELD, lambdaTypeDescriptor);
-
-        clinit.visitInsn(RETURN);
-        clinit.visitMaxs(-1, -1);
-        clinit.visitEnd();
+        clb.withMethod(CLASS_INIT_NAME, MTD_void, ACC_STATIC, new MethodBody(new Consumer<CodeBuilder>() {
+            @Override
+            public void accept(CodeBuilder cob) {
+                assert factoryType.parameterCount() == 0;
+                cob.new_(lambdaClassDesc)
+                   .dup()
+                   .invokespecial(lambdaClassDesc, INIT_NAME, constructorTypeDesc)
+                   .putstatic(lambdaClassDesc, LAMBDA_INSTANCE_FIELD, lambdaTypeDescriptor)
+                   .return_();
+            }
+        }));
     }
 
     /**
      * Generate the constructor for the class
      */
-    private void generateConstructor() {
+    private void generateConstructor(ClassBuilder clb) {
         // Generate constructor
-        MethodVisitor ctor = cw.visitMethod(ACC_PRIVATE, NAME_CTOR,
-                                            constructorType.toMethodDescriptorString(), null, null);
-        ctor.visitCode();
-        ctor.visitVarInsn(ALOAD, 0);
-        ctor.visitMethodInsn(INVOKESPECIAL, JAVA_LANG_OBJECT, NAME_CTOR,
-                             METHOD_DESCRIPTOR_VOID, false);
-        int parameterCount = factoryType.parameterCount();
-        for (int i = 0, lvIndex = 0; i < parameterCount; i++) {
-            ctor.visitVarInsn(ALOAD, 0);
-            Class<?> argType = factoryType.parameterType(i);
-            ctor.visitVarInsn(getLoadOpcode(argType), lvIndex + 1);
-            lvIndex += getParameterSize(argType);
-            ctor.visitFieldInsn(PUTFIELD, lambdaClassName, argNames[i], argDescs[i]);
-        }
-        ctor.visitInsn(RETURN);
-        // Maxs computed by ClassWriter.COMPUTE_MAXS, these arguments ignored
-        ctor.visitMaxs(-1, -1);
-        ctor.visitEnd();
+        clb.withMethod(INIT_NAME, constructorTypeDesc, ACC_PRIVATE,
+                new MethodBody(new Consumer<CodeBuilder>() {
+                    @Override
+                    public void accept(CodeBuilder cob) {
+                        cob.aload(0)
+                           .invokespecial(CD_Object, INIT_NAME, MTD_void);
+                        int parameterCount = factoryType.parameterCount();
+                        for (int i = 0; i < parameterCount; i++) {
+                            cob.aload(0);
+                            Class<?> argType = factoryType.parameterType(i);
+                            cob.loadLocal(TypeKind.from(argType), cob.parameterSlot(i));
+                            cob.putfield(lambdaClassDesc, argNames[i], argDescs[i]);
+                        }
+                        cob.return_();
+                    }
+                }));
+    }
+
+    private static class SerializationSupport {
+        // Serialization support
+        private static final ClassDesc CD_SerializedLambda = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/SerializedLambda;");
+        private static final ClassDesc CD_ObjectOutputStream = ReferenceClassDescImpl.ofValidated("Ljava/io/ObjectOutputStream;");
+        private static final ClassDesc CD_ObjectInputStream = ReferenceClassDescImpl.ofValidated("Ljava/io/ObjectInputStream;");
+        private static final MethodTypeDesc MTD_Object = MethodTypeDescImpl.ofValidated(CD_Object);
+        private static final MethodTypeDesc MTD_void_ObjectOutputStream = MethodTypeDescImpl.ofValidated(CD_void, CD_ObjectOutputStream);
+        private static final MethodTypeDesc MTD_void_ObjectInputStream = MethodTypeDescImpl.ofValidated(CD_void, CD_ObjectInputStream);
+
+        private static final String NAME_METHOD_WRITE_REPLACE = "writeReplace";
+        private static final String NAME_METHOD_READ_OBJECT = "readObject";
+        private static final String NAME_METHOD_WRITE_OBJECT = "writeObject";
+
+        static final ClassDesc CD_NotSerializableException = ReferenceClassDescImpl.ofValidated("Ljava/io/NotSerializableException;");
+        static final MethodTypeDesc MTD_CTOR_NOT_SERIALIZABLE_EXCEPTION = MethodTypeDescImpl.ofValidated(CD_void, CD_String);
+        static final MethodTypeDesc MTD_CTOR_SERIALIZED_LAMBDA = MethodTypeDescImpl.ofValidated(CD_void,
+                CD_Class, CD_String, CD_String, CD_String, CD_int, CD_String, CD_String, CD_String, CD_String, ReferenceClassDescImpl.ofValidated("[Ljava/lang/Object;"));
+
     }
 
     /**
      * Generate a writeReplace method that supports serialization
      */
-    private void generateSerializationFriendlyMethods() {
-        TypeConvertingMethodAdapter mv
-                = new TypeConvertingMethodAdapter(
-                    cw.visitMethod(ACC_PRIVATE + ACC_FINAL,
-                    NAME_METHOD_WRITE_REPLACE, DESCR_METHOD_WRITE_REPLACE,
-                    null, null));
-
-        mv.visitCode();
-        mv.visitTypeInsn(NEW, NAME_SERIALIZED_LAMBDA);
-        mv.visitInsn(DUP);
-        mv.visitLdcInsn(Type.getType(targetClass));
-        mv.visitLdcInsn(factoryType.returnType().getName().replace('.', '/'));
-        mv.visitLdcInsn(interfaceMethodName);
-        mv.visitLdcInsn(interfaceMethodType.toMethodDescriptorString());
-        mv.visitLdcInsn(implInfo.getReferenceKind());
-        mv.visitLdcInsn(implInfo.getDeclaringClass().getName().replace('.', '/'));
-        mv.visitLdcInsn(implInfo.getName());
-        mv.visitLdcInsn(implInfo.getMethodType().toMethodDescriptorString());
-        mv.visitLdcInsn(dynamicMethodType.toMethodDescriptorString());
-        mv.iconst(argDescs.length);
-        mv.visitTypeInsn(ANEWARRAY, JAVA_LANG_OBJECT);
-        for (int i = 0; i < argDescs.length; i++) {
-            mv.visitInsn(DUP);
-            mv.iconst(i);
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitFieldInsn(GETFIELD, lambdaClassName, argNames[i], argDescs[i]);
-            mv.boxIfTypePrimitive(Type.getType(argDescs[i]));
-            mv.visitInsn(AASTORE);
-        }
-        mv.visitMethodInsn(INVOKESPECIAL, NAME_SERIALIZED_LAMBDA, NAME_CTOR,
-                DESCR_CTOR_SERIALIZED_LAMBDA, false);
-        mv.visitInsn(ARETURN);
-        // Maxs computed by ClassWriter.COMPUTE_MAXS, these arguments ignored
-        mv.visitMaxs(-1, -1);
-        mv.visitEnd();
+    private void generateSerializationFriendlyMethods(ClassBuilder clb) {
+        clb.withMethod(SerializationSupport.NAME_METHOD_WRITE_REPLACE, SerializationSupport.MTD_Object, ACC_PRIVATE | ACC_FINAL,
+                new MethodBody(new Consumer<CodeBuilder>() {
+                    @Override
+                    public void accept(CodeBuilder cob) {
+                        cob.new_(SerializationSupport.CD_SerializedLambda)
+                           .dup()
+                           .ldc(classDesc(targetClass))
+                           .ldc(factoryType.returnType().getName().replace('.', '/'))
+                           .ldc(interfaceMethodName)
+                           .ldc(interfaceMethodType.toMethodDescriptorString())
+                           .ldc(implInfo.getReferenceKind())
+                           .ldc(implInfo.getDeclaringClass().getName().replace('.', '/'))
+                           .ldc(implInfo.getName())
+                           .ldc(implInfo.getMethodType().toMethodDescriptorString())
+                           .ldc(dynamicMethodType.toMethodDescriptorString())
+                           .loadConstant(argDescs.length)
+                           .anewarray(CD_Object);
+                        for (int i = 0; i < argDescs.length; i++) {
+                            cob.dup()
+                               .loadConstant(i)
+                               .aload(0)
+                               .getfield(lambdaClassDesc, argNames[i], argDescs[i]);
+                            TypeConvertingMethodAdapter.boxIfTypePrimitive(cob, TypeKind.from(argDescs[i]));
+                            cob.aastore();
+                        }
+                        cob.invokespecial(SerializationSupport.CD_SerializedLambda, INIT_NAME,
+                                          SerializationSupport.MTD_CTOR_SERIALIZED_LAMBDA)
+                           .areturn();
+                    }
+                }));
     }
 
     /**
      * Generate a readObject/writeObject method that is hostile to serialization
      */
-    private void generateSerializationHostileMethods() {
-        MethodVisitor mv = cw.visitMethod(ACC_PRIVATE + ACC_FINAL,
-                                          NAME_METHOD_WRITE_OBJECT, DESCR_METHOD_WRITE_OBJECT,
-                                          null, SER_HOSTILE_EXCEPTIONS);
-        mv.visitCode();
-        mv.visitTypeInsn(NEW, NAME_NOT_SERIALIZABLE_EXCEPTION);
-        mv.visitInsn(DUP);
-        mv.visitLdcInsn("Non-serializable lambda");
-        mv.visitMethodInsn(INVOKESPECIAL, NAME_NOT_SERIALIZABLE_EXCEPTION, NAME_CTOR,
-                           DESCR_CTOR_NOT_SERIALIZABLE_EXCEPTION, false);
-        mv.visitInsn(ATHROW);
-        mv.visitMaxs(-1, -1);
-        mv.visitEnd();
-
-        mv = cw.visitMethod(ACC_PRIVATE + ACC_FINAL,
-                            NAME_METHOD_READ_OBJECT, DESCR_METHOD_READ_OBJECT,
-                            null, SER_HOSTILE_EXCEPTIONS);
-        mv.visitCode();
-        mv.visitTypeInsn(NEW, NAME_NOT_SERIALIZABLE_EXCEPTION);
-        mv.visitInsn(DUP);
-        mv.visitLdcInsn("Non-serializable lambda");
-        mv.visitMethodInsn(INVOKESPECIAL, NAME_NOT_SERIALIZABLE_EXCEPTION, NAME_CTOR,
-                           DESCR_CTOR_NOT_SERIALIZABLE_EXCEPTION, false);
-        mv.visitInsn(ATHROW);
-        mv.visitMaxs(-1, -1);
-        mv.visitEnd();
+    private void generateSerializationHostileMethods(ClassBuilder clb) {
+        var hostileMethod = new Consumer<MethodBuilder>() {
+            @Override
+            public void accept(MethodBuilder mb) {
+                ConstantPoolBuilder cp = mb.constantPool();
+                ClassEntry nseCE = cp.classEntry(SerializationSupport.CD_NotSerializableException);
+                mb.with(ExceptionsAttribute.of(nseCE))
+                        .withCode(new Consumer<CodeBuilder>() {
+                            @Override
+                            public void accept(CodeBuilder cob) {
+                                cob.new_(nseCE)
+                                        .dup()
+                                        .ldc("Non-serializable lambda")
+                                        .invokespecial(cp.methodRefEntry(nseCE, cp.nameAndTypeEntry(INIT_NAME,
+                                                SerializationSupport.MTD_CTOR_NOT_SERIALIZABLE_EXCEPTION)))
+                                        .athrow();
+                            }
+                        });
+            }
+        };
+        clb.withMethod(SerializationSupport.NAME_METHOD_WRITE_OBJECT, SerializationSupport.MTD_void_ObjectOutputStream,
+                ACC_PRIVATE + ACC_FINAL, hostileMethod);
+        clb.withMethod(SerializationSupport.NAME_METHOD_READ_OBJECT, SerializationSupport.MTD_void_ObjectInputStream,
+                ACC_PRIVATE + ACC_FINAL, hostileMethod);
     }
 
     /**
-     * This class generates a method body which calls the lambda implementation
+     * This method generates a method body which calls the lambda implementation
      * method, converting arguments, as needed.
      */
-    private class ForwardingMethodGenerator extends TypeConvertingMethodAdapter {
-
-        ForwardingMethodGenerator(MethodVisitor mv) {
-            super(mv);
-        }
-
-        void generate(MethodType methodType) {
-            visitCode();
-
-            if (implKind == MethodHandleInfo.REF_newInvokeSpecial) {
-                visitTypeInsn(NEW, implMethodClassName);
-                visitInsn(DUP);
-            }
-            if (useImplMethodHandle) {
-                visitLdcInsn(implMethodCondy);
-            }
-            for (int i = 0; i < argNames.length; i++) {
-                visitVarInsn(ALOAD, 0);
-                visitFieldInsn(GETFIELD, lambdaClassName, argNames[i], argDescs[i]);
-            }
+    Consumer<MethodBuilder> forwardingMethod(MethodType methodType) {
+        return new MethodBody(new Consumer<CodeBuilder>() {
+            @Override
+            public void accept(CodeBuilder cob) {
+                if (implKind == MethodHandleInfo.REF_newInvokeSpecial) {
+                    cob.new_(implMethodClassDesc)
+                       .dup();
+                }
+                if (useImplMethodHandle) {
+                    ConstantPoolBuilder cp = cob.constantPool();
+                    cob.ldc(cp.constantDynamicEntry(cp.bsmEntry(cp.methodHandleEntry(BSM_CLASS_DATA), List.of()),
+                                                    cp.nameAndTypeEntry(DEFAULT_NAME, CD_MethodHandle)));
+                }
+                for (int i = 0; i < argNames.length; i++) {
+                    cob.aload(0)
+                       .getfield(lambdaClassDesc, argNames[i], argDescs[i]);
+                }
 
-            convertArgumentTypes(methodType);
+                convertArgumentTypes(cob, methodType);
 
-            if (useImplMethodHandle) {
-                MethodType mtype = implInfo.getMethodType();
-                if (implKind != MethodHandleInfo.REF_invokeStatic) {
-                    mtype = mtype.insertParameterTypes(0, implClass);
+                if (useImplMethodHandle) {
+                    MethodType mtype = implInfo.getMethodType();
+                    if (implKind != MethodHandleInfo.REF_invokeStatic) {
+                        mtype = mtype.insertParameterTypes(0, implClass);
+                    }
+                    cob.invokevirtual(CD_MethodHandle, "invokeExact", methodDesc(mtype));
+                } else {
+                    // Invoke the method we want to forward to
+                    cob.invoke(invocationOpcode(), implMethodClassDesc, implMethodName, implMethodDesc, implClass.isInterface());
                 }
-                visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle",
-                                "invokeExact", mtype.descriptorString(), false);
-            } else {
-                // Invoke the method we want to forward to
-                visitMethodInsn(invocationOpcode(), implMethodClassName,
-                                implMethodName, implMethodDesc,
-                                implClass.isInterface());
+                // Convert the return value (if any) and return it
+                // Note: if adapting from non-void to void, the 'return'
+                // instruction will pop the unneeded result
+                Class<?> implReturnClass = implMethodType.returnType();
+                Class<?> samReturnClass = methodType.returnType();
+                TypeConvertingMethodAdapter.convertType(cob, implReturnClass, samReturnClass, samReturnClass);
+                cob.return_(TypeKind.from(samReturnClass));
             }
-            // Convert the return value (if any) and return it
-            // Note: if adapting from non-void to void, the 'return'
-            // instruction will pop the unneeded result
-            Class<?> implReturnClass = implMethodType.returnType();
-            Class<?> samReturnClass = methodType.returnType();
-            convertType(implReturnClass, samReturnClass, samReturnClass);
-            visitInsn(getReturnOpcode(samReturnClass));
-            // Maxs computed by ClassWriter.COMPUTE_MAXS,these arguments ignored
-            visitMaxs(-1, -1);
-            visitEnd();
-        }
-
-        private void convertArgumentTypes(MethodType samType) {
-            int lvIndex = 0;
-            int samParametersLength = samType.parameterCount();
-            int captureArity = factoryType.parameterCount();
-            for (int i = 0; i < samParametersLength; i++) {
-                Class<?> argType = samType.parameterType(i);
-                visitVarInsn(getLoadOpcode(argType), lvIndex + 1);
-                lvIndex += getParameterSize(argType);
-                convertType(argType, implMethodType.parameterType(captureArity + i), dynamicMethodType.parameterType(i));
-            }
-        }
+        });
+    }
 
-        private int invocationOpcode() throws InternalError {
-            return switch (implKind) {
-                case MethodHandleInfo.REF_invokeStatic     -> INVOKESTATIC;
-                case MethodHandleInfo.REF_newInvokeSpecial -> INVOKESPECIAL;
-                case MethodHandleInfo.REF_invokeVirtual    -> INVOKEVIRTUAL;
-                case MethodHandleInfo.REF_invokeInterface  -> INVOKEINTERFACE;
-                case MethodHandleInfo.REF_invokeSpecial    -> INVOKESPECIAL;
-                default -> throw new InternalError("Unexpected invocation kind: " + implKind);
-            };
+    private void convertArgumentTypes(CodeBuilder cob, MethodType samType) {
+        int samParametersLength = samType.parameterCount();
+        int captureArity = factoryType.parameterCount();
+        for (int i = 0; i < samParametersLength; i++) {
+            Class<?> argType = samType.parameterType(i);
+            cob.loadLocal(TypeKind.from(argType), cob.parameterSlot(i));
+            TypeConvertingMethodAdapter.convertType(cob, argType, implMethodType.parameterType(captureArity + i), dynamicMethodType.parameterType(i));
         }
     }
 
-    static int getParameterSize(Class<?> c) {
-        if (c == Void.TYPE) {
-            return 0;
-        } else if (c == Long.TYPE || c == Double.TYPE) {
-            return 2;
-        }
-        return 1;
+    private Opcode invocationOpcode() throws InternalError {
+        return switch (implKind) {
+            case MethodHandleInfo.REF_invokeStatic     -> Opcode.INVOKESTATIC;
+            case MethodHandleInfo.REF_newInvokeSpecial -> Opcode.INVOKESPECIAL;
+            case MethodHandleInfo.REF_invokeVirtual    -> Opcode.INVOKEVIRTUAL;
+            case MethodHandleInfo.REF_invokeInterface  -> Opcode.INVOKEINTERFACE;
+            case MethodHandleInfo.REF_invokeSpecial    -> Opcode.INVOKESPECIAL;
+            default -> throw new InternalError("Unexpected invocation kind: " + implKind);
+        };
     }
 
-    static int getLoadOpcode(Class<?> c) {
-        if(c == Void.TYPE) {
-            throw new InternalError("Unexpected void type of load opcode");
-        }
-        return ILOAD + getOpcodeOffset(c);
+    static ClassDesc implClassDesc(Class<?> cls) {
+        return cls.isHidden() ? null : ReferenceClassDescImpl.ofValidated(cls.descriptorString());
     }
 
-    static int getReturnOpcode(Class<?> c) {
-        if(c == Void.TYPE) {
-            return RETURN;
-        }
-        return IRETURN + getOpcodeOffset(c);
+    static ClassDesc classDesc(Class<?> cls) {
+        return cls.isPrimitive() ? Wrapper.forPrimitiveType(cls).basicClassDescriptor()
+                                 : ReferenceClassDescImpl.ofValidated(cls.descriptorString());
     }
 
-    private static int getOpcodeOffset(Class<?> c) {
-        if (c.isPrimitive()) {
-            if (c == Long.TYPE) {
-                return 1;
-            } else if (c == Float.TYPE) {
-                return 2;
-            } else if (c == Double.TYPE) {
-                return 3;
-            }
-            return 0;
-        } else {
-            return 4;
+    static MethodTypeDesc methodDesc(MethodType mt) {
+        var params = new ClassDesc[mt.parameterCount()];
+        for (int i = 0; i < params.length; i++) {
+            params[i] = classDesc(mt.parameterType(i));
         }
+        return MethodTypeDescImpl.ofValidated(classDesc(mt.returnType()), params);
     }
-
 }
diff --git a/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
index 4e3ebb3834d..6d71296c134 100644
--- a/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
+++ b/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
@@ -25,30 +25,38 @@
 
 package java.lang.invoke;
 
-import jdk.internal.org.objectweb.asm.ClassWriter;
-import jdk.internal.org.objectweb.asm.FieldVisitor;
-import jdk.internal.org.objectweb.asm.Label;
-import jdk.internal.org.objectweb.asm.MethodVisitor;
-import jdk.internal.org.objectweb.asm.Opcodes;
-import jdk.internal.org.objectweb.asm.Type;
 import sun.invoke.util.VerifyAccess;
 import sun.invoke.util.VerifyType;
 import sun.invoke.util.Wrapper;
 
+import java.lang.classfile.*;
+import java.lang.classfile.attribute.RuntimeVisibleAnnotationsAttribute;
+import java.lang.classfile.attribute.SourceFileAttribute;
+import java.lang.classfile.instruction.SwitchCase;
+import java.lang.constant.ClassDesc;
+import java.lang.constant.ConstantDesc;
+import java.lang.constant.MethodTypeDesc;
+import java.lang.invoke.LambdaForm.BasicType;
+import java.lang.invoke.LambdaForm.Name;
+import java.lang.invoke.LambdaForm.NamedFunction;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Consumer;
 import java.util.stream.Stream;
+import jdk.internal.constant.MethodTypeDescImpl;
+import jdk.internal.constant.ReferenceClassDescImpl;
 
-import static java.lang.invoke.LambdaForm.BasicType;
-import static java.lang.invoke.LambdaForm.BasicType.*;
+import static java.lang.classfile.ClassFile.*;
+import static java.lang.constant.ConstantDescs.*;
 import static java.lang.invoke.LambdaForm.*;
+import static java.lang.invoke.LambdaForm.BasicType.*;
 import static java.lang.invoke.MethodHandleNatives.Constants.*;
 import static java.lang.invoke.MethodHandleStatics.*;
-import static java.lang.invoke.MethodHandles.Lookup.*;
+import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
 
 /**
  * Code generation backend for LambdaForm.
@@ -57,32 +65,46 @@
  */
 class InvokerBytecodeGenerator {
     /** Define class names for convenience. */
-    private static final String MH      = "java/lang/invoke/MethodHandle";
-    private static final String MHI     = "java/lang/invoke/MethodHandleImpl";
-    private static final String LF      = "java/lang/invoke/LambdaForm";
-    private static final String LFN     = "java/lang/invoke/LambdaForm$Name";
-    private static final String CLS     = "java/lang/Class";
-    private static final String OBJ     = "java/lang/Object";
-    private static final String OBJARY  = "[Ljava/lang/Object;";
-
-    private static final String LOOP_CLAUSES = MHI + "$LoopClauses";
-    private static final String MHARY2       = "[[L" + MH + ";";
-    private static final String MH_SIG       = "L" + MH + ";";
-
-
-    private static final String LF_SIG  = "L" + LF + ";";
-    private static final String LFN_SIG = "L" + LFN + ";";
-    private static final String LL_SIG  = "(L" + OBJ + ";)L" + OBJ + ";";
-    private static final String LLV_SIG = "(L" + OBJ + ";L" + OBJ + ";)V";
-    private static final String CLASS_PREFIX = LF + "$";
+    private static final ClassDesc CD_CasesHolder = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/MethodHandleImpl$CasesHolder;");
+    private static final ClassDesc CD_DirectMethodHandle = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/DirectMethodHandle;");
+    private static final ClassDesc CD_MethodHandleImpl = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/MethodHandleImpl;");
+    private static final ClassDesc CD_LambdaForm = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm;");
+    private static final ClassDesc CD_LambdaForm_Name = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm$Name;");
+    private static final ClassDesc CD_LoopClauses = ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/MethodHandleImpl$LoopClauses;");
+    private static final ClassDesc CD_Object_array  = ReferenceClassDescImpl.ofValidated("[Ljava/lang/Object;");
+    private static final ClassDesc CD_MethodHandle_array = ReferenceClassDescImpl.ofValidated("[Ljava/lang/invoke/MethodHandle;");
+    private static final ClassDesc CD_MethodHandle_array2 = ReferenceClassDescImpl.ofValidated("[[Ljava/lang/invoke/MethodHandle;");
+
+    private static final MethodTypeDesc MTD_boolean_Object = MethodTypeDescImpl.ofValidated(CD_boolean, CD_Object);
+    private static final MethodTypeDesc MTD_Object_int = MethodTypeDescImpl.ofValidated(CD_Object, CD_int);
+    private static final MethodTypeDesc MTD_Object_Class = MethodTypeDescImpl.ofValidated(CD_Object, CD_Class);
+    private static final MethodTypeDesc MTD_Object_Object = MethodTypeDescImpl.ofValidated(CD_Object, CD_Object);
+
+    private static final String CLASS_PREFIX = "java/lang/invoke/LambdaForm$";
     private static final String SOURCE_PREFIX = "LambdaForm$";
 
+    // Static builders to avoid lambdas
+    private static final Consumer<FieldBuilder> STATIC_FINAL_FIELD = new Consumer<FieldBuilder>() {
+        @Override
+        public void accept(FieldBuilder fb) {
+            fb.withFlags(ACC_STATIC | ACC_FINAL);
+        }
+    };
+
+    record MethodBody(Consumer<CodeBuilder> code) implements Consumer<MethodBuilder> {
+        @Override
+        public void accept(MethodBuilder mb) {
+            mb.withCode(code);
+        }
+    };
+
     /** Name of its super class*/
-    static final String INVOKER_SUPER_NAME = OBJ;
+    static final ClassDesc INVOKER_SUPER_DESC = CD_Object;
 
     /** Name of new class */
     private final String name;
     private final String className;
+    private final ClassDesc classDesc;
 
     private final LambdaForm lambdaForm;
     private final String     invokerName;
@@ -92,15 +114,8 @@ class InvokerBytecodeGenerator {
     private int[]       localsMap;    // index
     private Class<?>[]  localClasses; // type
 
-    /** ASM bytecode generation. */
-    private ClassWriter cw;
-    private MethodVisitor mv;
     private final List<ClassData> classData = new ArrayList<>();
 
-    /** Single element internal class name lookup cache. */
-    private Class<?> lastClass;
-    private String lastInternalName;
-
     private static final MemberName.Factory MEMBERNAME_FACTORY = MemberName.getFactory();
     private static final Class<?> HOST_CLASS = LambdaForm.class;
     private static final MethodHandles.Lookup LOOKUP = lookup();
@@ -126,6 +141,7 @@ private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize,
         }
         this.name = name;
         this.className = CLASS_PREFIX + name;
+        this.classDesc = ClassDesc.ofInternalName(className);
         this.lambdaForm = lambdaForm;
         this.invokerName = invokerName;
         this.invokerType = invokerType;
@@ -188,10 +204,10 @@ private static String makeDumpableClassName(String className) {
 
     static class ClassData {
         final String name;
-        final String desc;
+        final ClassDesc desc;
         final Object value;
 
-        ClassData(String name, String desc, Object value) {
+        ClassData(String name, ClassDesc desc, Object value) {
             this.name = name;
             this.desc = desc;
             this.value = value;
@@ -204,15 +220,15 @@ public String toString() {
     }
 
     String classData(Object arg) {
-        String desc;
+        ClassDesc desc;
         if (arg instanceof Class) {
-            desc = "Ljava/lang/Class;";
+            desc = CD_Class;
         } else if (arg instanceof MethodHandle) {
-            desc = MH_SIG;
+            desc = CD_MethodHandle;
         } else if (arg instanceof LambdaForm) {
-            desc = LF_SIG;
+            desc = CD_LambdaForm;
         } else {
-            desc = "Ljava/lang/Object;";
+            desc = CD_Object;
         }
 
         // unique static variable name
@@ -231,16 +247,6 @@ String classData(Object arg) {
         return name;
     }
 
-    private static String debugString(Object arg) {
-        if (arg instanceof MethodHandle mh) {
-            MemberName member = mh.internalMemberName();
-            if (member != null)
-                return member.toString();
-            return mh.debugString();
-        }
-        return arg.toString();
-    }
-
     /**
      * Extract the MemberName of a newly-defined method.
      */
@@ -265,27 +271,25 @@ private static MemberName resolveInvokerMember(Class<?> invokerClass, String nam
     /**
      * Set up class file generation.
      */
-    private ClassWriter classFilePrologue() {
-        final int NOT_ACC_PUBLIC = 0;  // not ACC_PUBLIC
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
-        setClassWriter(cw);
-        cw.visit(CLASSFILE_VERSION, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
-                className, null, INVOKER_SUPER_NAME, null);
-        cw.visitSource(SOURCE_PREFIX + name, null);
-        return cw;
-    }
-
-    private void methodPrologue() {
-        String invokerDesc = invokerType.toMethodDescriptorString();
-        mv = cw.visitMethod(Opcodes.ACC_STATIC, invokerName, invokerDesc, null, null);
+    private byte[] classFileSetup(Consumer<? super ClassBuilder> config) {
+        try {
+            return ClassFile.of().build(classDesc, new Consumer<>() {
+                @Override
+                public void accept(ClassBuilder clb) {
+                    clb.withFlags(ACC_FINAL | ACC_SUPER)
+                       .withSuperclass(INVOKER_SUPER_DESC)
+                       .with(SourceFileAttribute.of(clb.constantPool().utf8Entry(SOURCE_PREFIX + name)));
+                    config.accept(clb);
+                }
+            });
+        } catch (RuntimeException e) {
+            throw new BytecodeGenerationException(e);
+        }
     }
 
-    /**
-     * Tear down class file generation.
-     */
-    private void methodEpilogue() {
-        mv.visitMaxs(0, 0);
-        mv.visitEnd();
+    private void methodSetup(ClassBuilder clb, Consumer<? super MethodBuilder> config) {
+        var invokerDesc = methodDesc(invokerType);
+        clb.withMethod(invokerName, invokerDesc, ACC_STATIC, config);
     }
 
     /**
@@ -318,202 +322,49 @@ private Object classDataValues() {
      * <clinit> to initialize the static final fields with the live class data
      * LambdaForms can't use condy due to bootstrapping issue.
      */
-    static void clinit(ClassWriter cw, String className, List<ClassData> classData) {
+    static void clinit(ClassBuilder clb, ClassDesc classDesc, List<ClassData> classData) {
         if (classData.isEmpty())
             return;
 
         for (ClassData p : classData) {
             // add the static field
-            FieldVisitor fv = cw.visitField(Opcodes.ACC_STATIC|Opcodes.ACC_FINAL, p.name, p.desc, null, null);
-            fv.visitEnd();
-        }
-
-        MethodVisitor mv = cw.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null);
-        mv.visitCode();
-        mv.visitLdcInsn(Type.getType("L" + className + ";"));
-        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/invoke/MethodHandles",
-                           "classData", "(Ljava/lang/Class;)Ljava/lang/Object;", false);
-        if (classData.size() == 1) {
-            ClassData p = classData.get(0);
-            mv.visitTypeInsn(Opcodes.CHECKCAST, p.desc.substring(1, p.desc.length()-1));
-            mv.visitFieldInsn(Opcodes.PUTSTATIC, className, p.name, p.desc);
-        } else {
-            mv.visitTypeInsn(Opcodes.CHECKCAST, "java/util/List");
-            mv.visitVarInsn(Opcodes.ASTORE, 0);
-            int index = 0;
-            for (ClassData p : classData) {
-                // initialize the static field
-                mv.visitVarInsn(Opcodes.ALOAD, 0);
-                emitIconstInsn(mv, index++);
-                mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List",
-                                   "get", "(I)Ljava/lang/Object;", true);
-                mv.visitTypeInsn(Opcodes.CHECKCAST, p.desc.substring(1, p.desc.length()-1));
-                mv.visitFieldInsn(Opcodes.PUTSTATIC, className, p.name, p.desc);
-            }
-        }
-        mv.visitInsn(Opcodes.RETURN);
-        mv.visitMaxs(2, 1);
-        mv.visitEnd();
-    }
-
-    /*
-     * Low-level emit helpers.
-     */
-    private void emitConst(Object con) {
-        if (con == null) {
-            mv.visitInsn(Opcodes.ACONST_NULL);
-            return;
-        }
-        if (con instanceof Integer) {
-            emitIconstInsn((int) con);
-            return;
-        }
-        if (con instanceof Byte) {
-            emitIconstInsn((byte)con);
-            return;
-        }
-        if (con instanceof Short) {
-            emitIconstInsn((short)con);
-            return;
-        }
-        if (con instanceof Character) {
-            emitIconstInsn((char)con);
-            return;
-        }
-        if (con instanceof Long) {
-            long x = (long) con;
-            short sx = (short)x;
-            if (x == sx) {
-                if (sx >= 0 && sx <= 1) {
-                    mv.visitInsn(Opcodes.LCONST_0 + (int) sx);
-                } else {
-                    emitIconstInsn((int) x);
-                    mv.visitInsn(Opcodes.I2L);
-                }
-                return;
-            }
-        }
-        if (con instanceof Float) {
-            float x = (float) con;
-            short sx = (short)x;
-            if (x == sx) {
-                if (sx >= 0 && sx <= 2) {
-                    mv.visitInsn(Opcodes.FCONST_0 + (int) sx);
+            clb.withField(p.name, p.desc, STATIC_FINAL_FIELD);
+        }
+
+        clb.withMethod(CLASS_INIT_NAME, MTD_void, ACC_STATIC, new MethodBody(new Consumer<CodeBuilder>() {
+            @Override
+            public void accept(CodeBuilder cob) {
+                cob.loadConstant(classDesc)
+                   .invokestatic(CD_MethodHandles, "classData", MTD_Object_Class);
+                if (classData.size() == 1) {
+                    ClassData p = classData.get(0);
+                    cob.checkcast(p.desc)
+                       .putstatic(classDesc, p.name, p.desc);
                 } else {
-                    emitIconstInsn((int) x);
-                    mv.visitInsn(Opcodes.I2F);
-                }
-                return;
-            }
-        }
-        if (con instanceof Double) {
-            double x = (double) con;
-            short sx = (short)x;
-            if (x == sx) {
-                if (sx >= 0 && sx <= 1) {
-                    mv.visitInsn(Opcodes.DCONST_0 + (int) sx);
-                } else {
-                    emitIconstInsn((int) x);
-                    mv.visitInsn(Opcodes.I2D);
+                    cob.checkcast(CD_List)
+                       .astore(0);
+                    int index = 0;
+                    var listGet = cob.constantPool().interfaceMethodRefEntry(CD_List, "get", MTD_Object_int);
+                    for (ClassData p : classData) {
+                        // initialize the static field
+                        cob.aload(0)
+                           .loadConstant(index++)
+                           .invokeinterface(listGet)
+                           .checkcast(p.desc)
+                           .putstatic(classDesc, p.name, p.desc);
+                    }
                 }
-                return;
+                cob.return_();
             }
-        }
-        if (con instanceof Boolean) {
-            emitIconstInsn((boolean) con ? 1 : 0);
-            return;
-        }
-        // fall through:
-        mv.visitLdcInsn(con);
-    }
-
-    private void emitIconstInsn(final int cst) {
-        emitIconstInsn(mv, cst);
-    }
-
-    private static void emitIconstInsn(MethodVisitor mv, int cst) {
-        if (cst >= -1 && cst <= 5) {
-            mv.visitInsn(Opcodes.ICONST_0 + cst);
-        } else if (cst >= Byte.MIN_VALUE && cst <= Byte.MAX_VALUE) {
-            mv.visitIntInsn(Opcodes.BIPUSH, cst);
-        } else if (cst >= Short.MIN_VALUE && cst <= Short.MAX_VALUE) {
-            mv.visitIntInsn(Opcodes.SIPUSH, cst);
-        } else {
-            mv.visitLdcInsn(cst);
-        }
-    }
-
-    /*
-     * NOTE: These load/store methods use the localsMap to find the correct index!
-     */
-    private void emitLoadInsn(BasicType type, int index) {
-        int opcode = loadInsnOpcode(type);
-        mv.visitVarInsn(opcode, localsMap[index]);
+        }));
     }
 
-    private int loadInsnOpcode(BasicType type) throws InternalError {
-        return switch (type) {
-            case I_TYPE -> Opcodes.ILOAD;
-            case J_TYPE -> Opcodes.LLOAD;
-            case F_TYPE -> Opcodes.FLOAD;
-            case D_TYPE -> Opcodes.DLOAD;
-            case L_TYPE -> Opcodes.ALOAD;
-            default -> throw new InternalError("unknown type: " + type);
-        };
-    }
-    private void emitAloadInsn(int index) {
-        emitLoadInsn(L_TYPE, index);
+    private void emitLoadInsn(CodeBuilder cob, TypeKind type, int index) {
+        cob.loadLocal(type, localsMap[index]);
     }
 
-    private void emitStoreInsn(BasicType type, int index) {
-        int opcode = storeInsnOpcode(type);
-        mv.visitVarInsn(opcode, localsMap[index]);
-    }
-
-    private int storeInsnOpcode(BasicType type) throws InternalError {
-        return switch (type) {
-            case I_TYPE -> Opcodes.ISTORE;
-            case J_TYPE -> Opcodes.LSTORE;
-            case F_TYPE -> Opcodes.FSTORE;
-            case D_TYPE -> Opcodes.DSTORE;
-            case L_TYPE -> Opcodes.ASTORE;
-            default -> throw new InternalError("unknown type: " + type);
-        };
-    }
-    private void emitAstoreInsn(int index) {
-        emitStoreInsn(L_TYPE, index);
-    }
-
-    private byte arrayTypeCode(Wrapper elementType) {
-        return (byte) switch (elementType) {
-            case BOOLEAN -> Opcodes.T_BOOLEAN;
-            case BYTE    -> Opcodes.T_BYTE;
-            case CHAR    -> Opcodes.T_CHAR;
-            case SHORT   -> Opcodes.T_SHORT;
-            case INT     -> Opcodes.T_INT;
-            case LONG    -> Opcodes.T_LONG;
-            case FLOAT   -> Opcodes.T_FLOAT;
-            case DOUBLE  -> Opcodes.T_DOUBLE;
-            case OBJECT  -> 0; // in place of Opcodes.T_OBJECT
-            default -> throw new InternalError();
-        };
-    }
-
-    private int arrayInsnOpcode(byte tcode, int aaop) throws InternalError {
-        assert(aaop == Opcodes.AASTORE || aaop == Opcodes.AALOAD);
-        int xas = switch (tcode) {
-            case Opcodes.T_BOOLEAN -> Opcodes.BASTORE;
-            case Opcodes.T_BYTE    -> Opcodes.BASTORE;
-            case Opcodes.T_CHAR    -> Opcodes.CASTORE;
-            case Opcodes.T_SHORT   -> Opcodes.SASTORE;
-            case Opcodes.T_INT     -> Opcodes.IASTORE;
-            case Opcodes.T_LONG    -> Opcodes.LASTORE;
-            case Opcodes.T_FLOAT   -> Opcodes.FASTORE;
-            case Opcodes.T_DOUBLE  -> Opcodes.DASTORE;
-            case 0                 -> Opcodes.AASTORE;
-            default -> throw new InternalError();
-        };
-        return xas - Opcodes.AASTORE + aaop;
+    private void emitStoreInsn(CodeBuilder cob, TypeKind type, int index) {
+        cob.storeLocal(type, localsMap[index]);
     }
 
     /**
@@ -521,11 +372,8 @@ private int arrayInsnOpcode(byte tcode, int aaop) throws InternalError {
      *
      * @param wrapper primitive type class to box.
      */
-    private void emitBoxing(Wrapper wrapper) {
-        String owner = "java/lang/" + wrapper.wrapperType().getSimpleName();
-        String name  = "valueOf";
-        String desc  = "(" + wrapper.basicTypeChar() + ")L" + owner + ";";
-        mv.visitMethodInsn(Opcodes.INVOKESTATIC, owner, name, desc, false);
+    private void emitBoxing(CodeBuilder cob, TypeKind tk) {
+        TypeConvertingMethodAdapter.box(cob, tk);
     }
 
     /**
@@ -533,12 +381,15 @@ private void emitBoxing(Wrapper wrapper) {
      *
      * @param wrapper wrapper type class to unbox.
      */
-    private void emitUnboxing(Wrapper wrapper) {
-        String owner = "java/lang/" + wrapper.wrapperType().getSimpleName();
-        String name  = wrapper.primitiveSimpleName() + "Value";
-        String desc  = "()" + wrapper.basicTypeChar();
-        emitReferenceCast(wrapper.wrapperType(), null);
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, owner, name, desc, false);
+    private void emitUnboxing(CodeBuilder cob, TypeKind target) {
+        switch (target) {
+            case BooleanType -> emitReferenceCast(cob, Boolean.class, null);
+            case CharType -> emitReferenceCast(cob, Character.class, null);
+            case ByteType, DoubleType, FloatType, IntType, LongType, ShortType ->
+                emitReferenceCast(cob, Number.class, null);
+            default -> {}
+        }
+        TypeConvertingMethodAdapter.unbox(cob, target);
     }
 
     /**
@@ -549,7 +400,7 @@ private void emitUnboxing(Wrapper wrapper) {
      * @param pclass type of value required on stack
      * @param arg compile-time representation of value on stack (Node, constant) or null if none
      */
-    private void emitImplicitConversion(BasicType ptype, Class<?> pclass, Object arg) {
+    private void emitImplicitConversion(CodeBuilder cob, BasicType ptype, Class<?> pclass, Object arg) {
         assert(basicType(pclass) == ptype);  // boxing/unboxing handled by caller
         if (pclass == ptype.basicTypeClass() && ptype != L_TYPE)
             return;   // nothing to do
@@ -557,14 +408,14 @@ private void emitImplicitConversion(BasicType ptype, Class<?> pclass, Object arg
             case L_TYPE:
                 if (VerifyType.isNullConversion(Object.class, pclass, false)) {
                     if (PROFILE_LEVEL > 0)
-                        emitReferenceCast(Object.class, arg);
+                        emitReferenceCast(cob, Object.class, arg);
                     return;
                 }
-                emitReferenceCast(pclass, arg);
+                emitReferenceCast(cob, pclass, arg);
                 return;
             case I_TYPE:
                 if (!VerifyType.isNullConversion(int.class, pclass, false))
-                    emitPrimCast(ptype.basicTypeWrapper(), Wrapper.forPrimitiveType(pclass));
+                    emitPrimCast(cob, ptype.basicTypeKind(), TypeKind.from(pclass));
                 return;
         }
         throw newInternalError("bad implicit conversion: tc="+ptype+": "+pclass);
@@ -582,7 +433,7 @@ private boolean assertStaticType(Class<?> cls, Name n) {
         return false;
     }
 
-    private void emitReferenceCast(Class<?> cls, Object arg) {
+    private void emitReferenceCast(CodeBuilder cob, Class<?> cls, Object arg) {
         Name writeBack = null;  // local to write back result
         if (arg instanceof Name n) {
             if (lambdaForm.useCount(n) > 1) {
@@ -594,53 +445,23 @@ private void emitReferenceCast(Class<?> cls, Object arg) {
             }
         }
         if (isStaticallyNameable(cls)) {
-            String sig = getInternalName(cls);
-            mv.visitTypeInsn(Opcodes.CHECKCAST, sig);
+            ClassDesc sig = classDesc(cls);
+            cob.checkcast(sig);
         } else {
-            mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(cls), "Ljava/lang/Class;");
-            mv.visitInsn(Opcodes.SWAP);
-            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, CLS, "cast", LL_SIG, false);
+            cob.getstatic(classDesc, classData(cls), CD_Class)
+               .swap()
+               .invokevirtual(CD_Class, "cast", MTD_Object_Object);
             if (Object[].class.isAssignableFrom(cls))
-                mv.visitTypeInsn(Opcodes.CHECKCAST, OBJARY);
+                cob.checkcast(CD_Object_array);
             else if (PROFILE_LEVEL > 0)
-                mv.visitTypeInsn(Opcodes.CHECKCAST, OBJ);
+                cob.checkcast(CD_Object);
         }
         if (writeBack != null) {
-            mv.visitInsn(Opcodes.DUP);
-            emitAstoreInsn(writeBack.index());
+            cob.dup();
+            emitStoreInsn(cob, TypeKind.ReferenceType, writeBack.index());
         }
     }
 
-    /**
-     * Emits an actual return instruction conforming to the given return type.
-     */
-    private void emitReturnInsn(BasicType type) {
-        int opcode = switch (type) {
-            case I_TYPE -> Opcodes.IRETURN;
-            case J_TYPE -> Opcodes.LRETURN;
-            case F_TYPE -> Opcodes.FRETURN;
-            case D_TYPE -> Opcodes.DRETURN;
-            case L_TYPE -> Opcodes.ARETURN;
-            case V_TYPE -> Opcodes.RETURN;
-            default -> throw new InternalError("unknown return type: " + type);
-        };
-        mv.visitInsn(opcode);
-    }
-
-    private String getInternalName(Class<?> c) {
-        if (c == Object.class)             return OBJ;
-        else if (c == Object[].class)      return OBJARY;
-        else if (c == Class.class)         return CLS;
-        else if (c == MethodHandle.class)  return MH;
-        assert(VerifyAccess.ensureTypeVisible(c, Object.class)) : c.getName();
-
-        if (c == lastClass) {
-            return lastInternalName;
-        }
-        lastClass = c;
-        return lastInternalName = c.getName().replace('.', '/');
-    }
-
     private static MemberName resolveFrom(String name, MethodType type, Class<?> holder) {
         assert(!UNSAFE.shouldBeInitialized(holder)) : holder + "not initialized";
         MemberName member = new MemberName(holder, name, type, REF_invokeStatic);
@@ -713,173 +534,151 @@ static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType
     }
 
     /** Generates code to check that actual receiver and LambdaForm matches */
-    private boolean checkActualReceiver() {
+    private boolean checkActualReceiver(CodeBuilder cob) {
         // Expects MethodHandle on the stack and actual receiver MethodHandle in slot #0
-        mv.visitInsn(Opcodes.DUP);
-        mv.visitVarInsn(Opcodes.ALOAD, localsMap[0]);
-        mv.visitMethodInsn(Opcodes.INVOKESTATIC, MHI, "assertSame", LLV_SIG, false);
+        cob.dup()
+           .aload(0)
+           .invokestatic(CD_MethodHandleImpl, "assertSame", MethodTypeDescImpl.ofValidated(CD_void, CD_Object, CD_Object));
         return true;
     }
 
-    static String className(String cn) {
-        assert checkClassName(cn): "Class not found: " + cn;
-        return cn;
-    }
-
-    static boolean checkClassName(String cn) {
-        Type tp = Type.getType(cn);
-        // additional sanity so only valid "L;" descriptors work
-        if (tp.getSort() != Type.OBJECT) {
-            return false;
-        }
-        try {
-            Class<?> c = Class.forName(tp.getClassName(), false, null);
-            return true;
-        } catch (ClassNotFoundException e) {
-            return false;
-        }
-    }
-
-    static final String      DONTINLINE_SIG = className("Ljdk/internal/vm/annotation/DontInline;");
-    static final String     FORCEINLINE_SIG = className("Ljdk/internal/vm/annotation/ForceInline;");
-    static final String          HIDDEN_SIG = className("Ljdk/internal/vm/annotation/Hidden;");
-    static final String INJECTEDPROFILE_SIG = className("Ljava/lang/invoke/InjectedProfile;");
-    static final String     LF_COMPILED_SIG = className("Ljava/lang/invoke/LambdaForm$Compiled;");
+    static final Annotation DONTINLINE      = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljdk/internal/vm/annotation/DontInline;"));
+    static final Annotation FORCEINLINE     = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljdk/internal/vm/annotation/ForceInline;"));
+    static final Annotation HIDDEN          = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljdk/internal/vm/annotation/Hidden;"));
+    static final Annotation INJECTEDPROFILE = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/InjectedProfile;"));
+    static final Annotation LF_COMPILED     = Annotation.of(ReferenceClassDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm$Compiled;"));
 
     /**
      * Generate an invoker method for the passed {@link LambdaForm}.
      */
     private byte[] generateCustomizedCodeBytes() {
-        classFilePrologue();
-        addMethod();
-        clinit(cw, className, classData);
-        bogusMethod(lambdaForm);
-
-        return toByteArray();
+        final byte[] classFile = classFileSetup(new Consumer<ClassBuilder>() {
+            @Override
+            public void accept(ClassBuilder clb) {
+                addMethod(clb);
+                clinit(clb, classDesc, classData);
+                bogusMethod(clb, lambdaForm);
+            }
+        });
+        return classFile;
     }
 
-    void setClassWriter(ClassWriter cw) {
-        this.cw = cw;
-    }
+    void addMethod(ClassBuilder clb) {
+        methodSetup(clb, new Consumer<MethodBuilder>() {
+            @Override
+            public void accept(MethodBuilder mb) {
 
-    void addMethod() {
-        methodPrologue();
+                List<Annotation> annotations = new ArrayList<>(3);
 
-        // Suppress this method in backtraces displayed to the user.
-        mv.visitAnnotation(HIDDEN_SIG, true);
+                // Suppress this method in backtraces displayed to the user.
+                annotations.add(HIDDEN);
 
-        // Mark this method as a compiled LambdaForm
-        mv.visitAnnotation(LF_COMPILED_SIG, true);
+                // Mark this method as a compiled LambdaForm
+                annotations.add(LF_COMPILED);
 
-        if (lambdaForm.forceInline) {
-            // Force inlining of this invoker method.
-            mv.visitAnnotation(FORCEINLINE_SIG, true);
-        } else {
-            mv.visitAnnotation(DONTINLINE_SIG, true);
-        }
+                if (lambdaForm.forceInline) {
+                    // Force inlining of this invoker method.
+                    annotations.add(FORCEINLINE);
+                } else {
+                    annotations.add(DONTINLINE);
+                }
+                mb.accept(RuntimeVisibleAnnotationsAttribute.of(annotations));
+
+                classData(lambdaForm); // keep LambdaForm instance & its compiled form lifetime tightly coupled.
+
+                mb.withCode(new Consumer<CodeBuilder>() {
+                    @Override
+                    public void accept(CodeBuilder cob) {
+                        if (lambdaForm.customized != null) {
+                            // Since LambdaForm is customized for a particular MethodHandle, it's safe to substitute
+                            // receiver MethodHandle (at slot #0) with an embedded constant and use it instead.
+                            // It enables more efficient code generation in some situations, since embedded constants
+                            // are compile-time constants for JIT compiler.
+                            cob.getstatic(classDesc, classData(lambdaForm.customized), CD_MethodHandle)
+                               .checkcast(CD_MethodHandle);
+                            assert(checkActualReceiver(cob)); // expects MethodHandle on top of the stack
+                            cob.astore(0);
+                        }
 
-        classData(lambdaForm); // keep LambdaForm instance & its compiled form lifetime tightly coupled.
-
-        if (lambdaForm.customized != null) {
-            // Since LambdaForm is customized for a particular MethodHandle, it's safe to substitute
-            // receiver MethodHandle (at slot #0) with an embedded constant and use it instead.
-            // It enables more efficient code generation in some situations, since embedded constants
-            // are compile-time constants for JIT compiler.
-            mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(lambdaForm.customized), MH_SIG);
-            mv.visitTypeInsn(Opcodes.CHECKCAST, MH);
-            assert(checkActualReceiver()); // expects MethodHandle on top of the stack
-            mv.visitVarInsn(Opcodes.ASTORE, localsMap[0]);
-        }
+                        // iterate over the form's names, generating bytecode instructions for each
+                        // start iterating at the first name following the arguments
+                        Name onStack = null;
+                        for (int i = lambdaForm.arity; i < lambdaForm.names.length; i++) {
+                            Name name = lambdaForm.names[i];
+
+                            emitStoreResult(cob, onStack);
+                            onStack = name;  // unless otherwise modified below
+                            MethodHandleImpl.Intrinsic intr = name.function.intrinsicName();
+                            switch (intr) {
+                                case SELECT_ALTERNATIVE:
+                                    assert lambdaForm.isSelectAlternative(i);
+                                    if (PROFILE_GWT) {
+                                        assert(name.arguments[0] instanceof Name n &&
+                                                n.refersTo(MethodHandleImpl.class, "profileBoolean"));
+                                        mb.with(RuntimeVisibleAnnotationsAttribute.of(List.of(INJECTEDPROFILE)));
+                                    }
+                                    onStack = emitSelectAlternative(cob, name, lambdaForm.names[i+1]);
+                                    i++;  // skip MH.invokeBasic of the selectAlternative result
+                                    continue;
+                                case GUARD_WITH_CATCH:
+                                    assert lambdaForm.isGuardWithCatch(i);
+                                    onStack = emitGuardWithCatch(cob, i);
+                                    i += 2; // jump to the end of GWC idiom
+                                    continue;
+                                case TRY_FINALLY:
+                                    assert lambdaForm.isTryFinally(i);
+                                    onStack = emitTryFinally(cob, i);
+                                    i += 2; // jump to the end of the TF idiom
+                                    continue;
+                                case TABLE_SWITCH:
+                                    assert lambdaForm.isTableSwitch(i);
+                                    int numCases = (Integer) name.function.intrinsicData();
+                                    onStack = emitTableSwitch(cob, i, numCases);
+                                    i += 2; // jump to the end of the TS idiom
+                                    continue;
+                                case LOOP:
+                                    assert lambdaForm.isLoop(i);
+                                    onStack = emitLoop(cob, i);
+                                    i += 2; // jump to the end of the LOOP idiom
+                                    continue;
+                                case ARRAY_LOAD:
+                                    emitArrayLoad(cob, name);
+                                    continue;
+                                case ARRAY_STORE:
+                                    emitArrayStore(cob, name);
+                                    continue;
+                                case ARRAY_LENGTH:
+                                    emitArrayLength(cob, name);
+                                    continue;
+                                case IDENTITY:
+                                    assert(name.arguments.length == 1);
+                                    emitPushArguments(cob, name, 0);
+                                    continue;
+                                case ZERO:
+                                    assert(name.arguments.length == 0);
+                                    cob.loadConstant((ConstantDesc)name.type.basicTypeWrapper().zero());
+                                    continue;
+                                case NONE:
+                                    // no intrinsic associated
+                                    break;
+                                default:
+                                    throw newInternalError("Unknown intrinsic: "+intr);
+                            }
+
+                            MemberName member = name.function.member();
+                            if (isStaticallyInvocable(member)) {
+                                emitStaticInvoke(cob, member, name);
+                            } else {
+                                emitInvoke(cob, name);
+                            }
+                        }
 
-        // iterate over the form's names, generating bytecode instructions for each
-        // start iterating at the first name following the arguments
-        Name onStack = null;
-        for (int i = lambdaForm.arity; i < lambdaForm.names.length; i++) {
-            Name name = lambdaForm.names[i];
-
-            emitStoreResult(onStack);
-            onStack = name;  // unless otherwise modified below
-            MethodHandleImpl.Intrinsic intr = name.function.intrinsicName();
-            switch (intr) {
-                case SELECT_ALTERNATIVE:
-                    assert lambdaForm.isSelectAlternative(i);
-                    if (PROFILE_GWT) {
-                        assert(name.arguments[0] instanceof Name n &&
-                                n.refersTo(MethodHandleImpl.class, "profileBoolean"));
-                        mv.visitAnnotation(INJECTEDPROFILE_SIG, true);
+                        // return statement
+                        emitReturn(cob, onStack);
                     }
-                    onStack = emitSelectAlternative(name, lambdaForm.names[i+1]);
-                    i++;  // skip MH.invokeBasic of the selectAlternative result
-                    continue;
-                case GUARD_WITH_CATCH:
-                    assert lambdaForm.isGuardWithCatch(i);
-                    onStack = emitGuardWithCatch(i);
-                    i += 2; // jump to the end of GWC idiom
-                    continue;
-                case TRY_FINALLY:
-                    assert lambdaForm.isTryFinally(i);
-                    onStack = emitTryFinally(i);
-                    i += 2; // jump to the end of the TF idiom
-                    continue;
-                case TABLE_SWITCH:
-                    assert lambdaForm.isTableSwitch(i);
-                    int numCases = (Integer) name.function.intrinsicData();
-                    onStack = emitTableSwitch(i, numCases);
-                    i += 2; // jump to the end of the TS idiom
-                    continue;
-                case LOOP:
-                    assert lambdaForm.isLoop(i);
-                    onStack = emitLoop(i);
-                    i += 2; // jump to the end of the LOOP idiom
-                    continue;
-                case ARRAY_LOAD:
-                    emitArrayLoad(name);
-                    continue;
-                case ARRAY_STORE:
-                    emitArrayStore(name);
-                    continue;
-                case ARRAY_LENGTH:
-                    emitArrayLength(name);
-                    continue;
-                case IDENTITY:
-                    assert(name.arguments.length == 1);
-                    emitPushArguments(name, 0);
-                    continue;
-                case ZERO:
-                    assert(name.arguments.length == 0);
-                    emitConst(name.type.basicTypeWrapper().zero());
-                    continue;
-                case NONE:
-                    // no intrinsic associated
-                    break;
-                default:
-                    throw newInternalError("Unknown intrinsic: "+intr);
-            }
-
-            MemberName member = name.function.member();
-            if (isStaticallyInvocable(member)) {
-                emitStaticInvoke(member, name);
-            } else {
-                emitInvoke(name);
+                });
             }
-        }
-
-        // return statement
-        emitReturn(onStack);
-
-        methodEpilogue();
-    }
-
-    /*
-     * @throws BytecodeGenerationException if something goes wrong when
-     *         generating the byte code
-     */
-    private byte[] toByteArray() {
-        try {
-            return cw.toByteArray();
-        } catch (RuntimeException e) {
-            throw new BytecodeGenerationException(e);
-        }
+        });
     }
 
     /**
@@ -892,48 +691,60 @@ static final class BytecodeGenerationException extends RuntimeException {
         }
     }
 
-    void emitArrayLoad(Name name)   { emitArrayOp(name, Opcodes.AALOAD);      }
-    void emitArrayStore(Name name)  { emitArrayOp(name, Opcodes.AASTORE);     }
-    void emitArrayLength(Name name) { emitArrayOp(name, Opcodes.ARRAYLENGTH); }
+    void emitArrayLoad(CodeBuilder cob, Name name)   {
+        Class<?> elementType = name.function.methodType().parameterType(0).getComponentType();
+        assert elementType != null;
+        emitPushArguments(cob, name, 0);
+        if (elementType.isPrimitive()) {
+            cob.arrayLoad(TypeKind.from(elementType));
+        } else {
+            cob.aaload();
+        }
+    }
 
-    void emitArrayOp(Name name, int arrayOpcode) {
-        assert arrayOpcode == Opcodes.AALOAD || arrayOpcode == Opcodes.AASTORE || arrayOpcode == Opcodes.ARRAYLENGTH;
+    void emitArrayStore(CodeBuilder cob, Name name)  {
         Class<?> elementType = name.function.methodType().parameterType(0).getComponentType();
         assert elementType != null;
-        emitPushArguments(name, 0);
-        if (arrayOpcode != Opcodes.ARRAYLENGTH && elementType.isPrimitive()) {
-            Wrapper w = Wrapper.forPrimitiveType(elementType);
-            arrayOpcode = arrayInsnOpcode(arrayTypeCode(w), arrayOpcode);
+        emitPushArguments(cob, name, 0);
+        if (elementType.isPrimitive()) {
+            cob.arrayStore(TypeKind.from(elementType));
+        } else {
+            cob.aastore();
         }
-        mv.visitInsn(arrayOpcode);
+    }
+
+    void emitArrayLength(CodeBuilder cob, Name name) {
+        assert name.function.methodType().parameterType(0).isArray();
+        emitPushArguments(cob, name, 0);
+        cob.arraylength();
     }
 
     /**
      * Emit an invoke for the given name.
      */
-    void emitInvoke(Name name) {
+    void emitInvoke(CodeBuilder cob, Name name) {
         assert(!name.isLinkerMethodInvoke());  // should use the static path for these
         if (true) {
             // push receiver
             MethodHandle target = name.function.resolvedHandle();
             assert(target != null) : name.exprString();
-            mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(target), MH_SIG);
-            emitReferenceCast(MethodHandle.class, target);
+            cob.getstatic(classDesc, classData(target), CD_MethodHandle);
+            emitReferenceCast(cob, MethodHandle.class, target);
         } else {
             // load receiver
-            emitAloadInsn(0);
-            emitReferenceCast(MethodHandle.class, null);
-            mv.visitFieldInsn(Opcodes.GETFIELD, MH, "form", LF_SIG);
-            mv.visitFieldInsn(Opcodes.GETFIELD, LF, "names", LFN_SIG);
+            cob.aload(0);
+            emitReferenceCast(cob, MethodHandle.class, null);
+            cob.getfield(CD_MethodHandle, "form", CD_LambdaForm)
+               .getfield(CD_LambdaForm, "names", CD_LambdaForm_Name);
             // TODO more to come
         }
 
         // push arguments
-        emitPushArguments(name, 0);
+        emitPushArguments(cob, name, 0);
 
         // invocation
         MethodType type = name.function.methodType();
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false);
+        cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(type.basicType()));
     }
 
     private static final Class<?>[] STATICALLY_INVOCABLE_PACKAGES = {
@@ -1020,19 +831,18 @@ static boolean isStaticallyNameable(Class<?> cls) {
         return false;
     }
 
-    void emitStaticInvoke(Name name) {
-        emitStaticInvoke(name.function.member(), name);
+    void emitStaticInvoke(CodeBuilder cob, Name name) {
+        emitStaticInvoke(cob, name.function.member(), name);
     }
 
     /**
      * Emit an invoke for the given name, using the MemberName directly.
      */
-    void emitStaticInvoke(MemberName member, Name name) {
+    void emitStaticInvoke(CodeBuilder cob, MemberName member, Name name) {
         assert(member.equals(name.function.member()));
         Class<?> defc = member.getDeclaringClass();
-        String cname = getInternalName(defc);
+        ClassDesc cdesc = classDesc(defc);
         String mname = member.getName();
-        String mtype;
         byte refKind = member.getReferenceKind();
         if (refKind == REF_invokeSpecial) {
             // in order to pass the verifier, we need to convert this to invokevirtual in all cases
@@ -1043,16 +853,16 @@ void emitStaticInvoke(MemberName member, Name name) {
         assert(!(member.getDeclaringClass().isInterface() && refKind == REF_invokeVirtual));
 
         // push arguments
-        emitPushArguments(name, 0);
+        emitPushArguments(cob, name, 0);
 
         // invocation
         if (member.isMethod()) {
-            mtype = member.getMethodType().toMethodDescriptorString();
-            mv.visitMethodInsn(refKindOpcode(refKind), cname, mname, mtype,
-                               member.getDeclaringClass().isInterface());
+            var methodTypeDesc = methodDesc(member.getMethodType());
+            cob.invoke(refKindOpcode(refKind), cdesc, mname, methodTypeDesc,
+                                  member.getDeclaringClass().isInterface());
         } else {
-            mtype = MethodType.toFieldDescriptorString(member.getFieldType());
-            mv.visitFieldInsn(refKindOpcode(refKind), cname, mname, mtype);
+            var fieldTypeDesc = classDesc(member.getFieldType());
+            cob.fieldAccess(refKindOpcode(refKind), cdesc, mname, fieldTypeDesc);
         }
         // Issue a type assertion for the result, so we can avoid casts later.
         if (name.type == L_TYPE) {
@@ -1064,16 +874,16 @@ void emitStaticInvoke(MemberName member, Name name) {
         }
     }
 
-    int refKindOpcode(byte refKind) {
+    Opcode refKindOpcode(byte refKind) {
         switch (refKind) {
-        case REF_invokeVirtual:      return Opcodes.INVOKEVIRTUAL;
-        case REF_invokeStatic:       return Opcodes.INVOKESTATIC;
-        case REF_invokeSpecial:      return Opcodes.INVOKESPECIAL;
-        case REF_invokeInterface:    return Opcodes.INVOKEINTERFACE;
-        case REF_getField:           return Opcodes.GETFIELD;
-        case REF_putField:           return Opcodes.PUTFIELD;
-        case REF_getStatic:          return Opcodes.GETSTATIC;
-        case REF_putStatic:          return Opcodes.PUTSTATIC;
+        case REF_invokeVirtual:      return Opcode.INVOKEVIRTUAL;
+        case REF_invokeStatic:       return Opcode.INVOKESTATIC;
+        case REF_invokeSpecial:      return Opcode.INVOKESPECIAL;
+        case REF_invokeInterface:    return Opcode.INVOKEINTERFACE;
+        case REF_getField:           return Opcode.GETFIELD;
+        case REF_putField:           return Opcode.PUTFIELD;
+        case REF_getStatic:          return Opcode.GETSTATIC;
+        case REF_putStatic:          return Opcode.PUTSTATIC;
         }
         throw new InternalError("refKind="+refKind);
     }
@@ -1089,40 +899,40 @@ int refKindOpcode(byte refKind) {
      *     t4:I=MethodHandle.invokeBasic(t3:L,a1:I);t4:I}
      * }</pre></blockquote>
      */
-    private Name emitSelectAlternative(Name selectAlternativeName, Name invokeBasicName) {
+    private Name emitSelectAlternative(CodeBuilder cob, Name selectAlternativeName, Name invokeBasicName) {
         assert isStaticallyInvocable(invokeBasicName);
 
         Name receiver = (Name) invokeBasicName.arguments[0];
 
-        Label L_fallback = new Label();
-        Label L_done     = new Label();
+        Label L_fallback = cob.newLabel();
+        Label L_done     = cob.newLabel();
 
         // load test result
-        emitPushArgument(selectAlternativeName, 0);
+        emitPushArgument(cob, selectAlternativeName, 0);
 
         // if_icmpne L_fallback
-        mv.visitJumpInsn(Opcodes.IFEQ, L_fallback);
+        cob.ifeq(L_fallback);
 
         // invoke selectAlternativeName.arguments[1]
         Class<?>[] preForkClasses = localClasses.clone();
-        emitPushArgument(selectAlternativeName, 1);  // get 2nd argument of selectAlternative
-        emitAstoreInsn(receiver.index());  // store the MH in the receiver slot
-        emitStaticInvoke(invokeBasicName);
+        emitPushArgument(cob, selectAlternativeName, 1);  // get 2nd argument of selectAlternative
+        emitStoreInsn(cob, TypeKind.ReferenceType, receiver.index());  // store the MH in the receiver slot
+        emitStaticInvoke(cob, invokeBasicName);
 
         // goto L_done
-        mv.visitJumpInsn(Opcodes.GOTO, L_done);
+        cob.goto_w(L_done);
 
         // L_fallback:
-        mv.visitLabel(L_fallback);
+        cob.labelBinding(L_fallback);
 
         // invoke selectAlternativeName.arguments[2]
         System.arraycopy(preForkClasses, 0, localClasses, 0, preForkClasses.length);
-        emitPushArgument(selectAlternativeName, 2);  // get 3rd argument of selectAlternative
-        emitAstoreInsn(receiver.index());  // store the MH in the receiver slot
-        emitStaticInvoke(invokeBasicName);
+        emitPushArgument(cob, selectAlternativeName, 2);  // get 3rd argument of selectAlternative
+        emitStoreInsn(cob, TypeKind.ReferenceType, receiver.index());  // store the MH in the receiver slot
+        emitStaticInvoke(cob, invokeBasicName);
 
         // L_done:
-        mv.visitLabel(L_done);
+        cob.labelBinding(L_done);
         // for now do not bother to merge typestate; just reset to the dominator state
         System.arraycopy(preForkClasses, 0, localClasses, 0, preForkClasses.length);
 
@@ -1149,57 +959,57 @@ private Name emitSelectAlternative(Name selectAlternativeName, Name invokeBasicN
      *      return a3.invokeBasic(ex, a6, a7);
      *  }}</pre></blockquote>
      */
-    private Name emitGuardWithCatch(int pos) {
+    private Name emitGuardWithCatch(CodeBuilder cob, int pos) {
         Name args    = lambdaForm.names[pos];
         Name invoker = lambdaForm.names[pos+1];
         Name result  = lambdaForm.names[pos+2];
 
-        Label L_startBlock = new Label();
-        Label L_endBlock = new Label();
-        Label L_handler = new Label();
-        Label L_done = new Label();
+        Label L_startBlock = cob.newLabel();
+        Label L_endBlock = cob.newLabel();
+        Label L_handler = cob.newLabel();
+        Label L_done = cob.newLabel();
 
         Class<?> returnType = result.function.resolvedHandle().type().returnType();
         MethodType type = args.function.resolvedHandle().type()
                               .dropParameterTypes(0,1)
                               .changeReturnType(returnType);
 
-        mv.visitTryCatchBlock(L_startBlock, L_endBlock, L_handler, "java/lang/Throwable");
+        cob.exceptionCatch(L_startBlock, L_endBlock, L_handler, CD_Throwable);
 
         // Normal case
-        mv.visitLabel(L_startBlock);
+        cob.labelBinding(L_startBlock);
         // load target
-        emitPushArgument(invoker, 0);
-        emitPushArguments(args, 1); // skip 1st argument: method handle
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false);
-        mv.visitLabel(L_endBlock);
-        mv.visitJumpInsn(Opcodes.GOTO, L_done);
+        emitPushArgument(cob, invoker, 0);
+        emitPushArguments(cob, args, 1); // skip 1st argument: method handle
+        cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(type.basicType()));
+        cob.labelBinding(L_endBlock);
+        cob.goto_w(L_done);
 
         // Exceptional case
-        mv.visitLabel(L_handler);
+        cob.labelBinding(L_handler);
 
         // Check exception's type
-        mv.visitInsn(Opcodes.DUP);
+        cob.dup();
         // load exception class
-        emitPushArgument(invoker, 1);
-        mv.visitInsn(Opcodes.SWAP);
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "isInstance", "(Ljava/lang/Object;)Z", false);
-        Label L_rethrow = new Label();
-        mv.visitJumpInsn(Opcodes.IFEQ, L_rethrow);
+        emitPushArgument(cob, invoker, 1);
+        cob.swap();
+        cob.invokevirtual(CD_Class, "isInstance", MTD_boolean_Object);
+        Label L_rethrow = cob.newLabel();
+        cob.ifeq(L_rethrow);
 
         // Invoke catcher
         // load catcher
-        emitPushArgument(invoker, 2);
-        mv.visitInsn(Opcodes.SWAP);
-        emitPushArguments(args, 1); // skip 1st argument: method handle
+        emitPushArgument(cob, invoker, 2);
+        cob.swap();
+        emitPushArguments(cob, args, 1); // skip 1st argument: method handle
         MethodType catcherType = type.insertParameterTypes(0, Throwable.class);
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", catcherType.basicType().toMethodDescriptorString(), false);
-        mv.visitJumpInsn(Opcodes.GOTO, L_done);
+        cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(catcherType.basicType()));
+        cob.goto_w(L_done);
 
-        mv.visitLabel(L_rethrow);
-        mv.visitInsn(Opcodes.ATHROW);
+        cob.labelBinding(L_rethrow);
+        cob.athrow();
 
-        mv.visitLabel(L_done);
+        cob.labelBinding(L_done);
 
         return result;
     }
@@ -1264,15 +1074,15 @@ private Name emitGuardWithCatch(int pos) {
      * }</pre></blockquote>
      * * = depends on whether the return type takes up 2 stack slots.
      */
-    private Name emitTryFinally(int pos) {
+    private Name emitTryFinally(CodeBuilder cob, int pos) {
         Name args    = lambdaForm.names[pos];
         Name invoker = lambdaForm.names[pos+1];
         Name result  = lambdaForm.names[pos+2];
 
-        Label lFrom = new Label();
-        Label lTo = new Label();
-        Label lCatch = new Label();
-        Label lDone = new Label();
+        Label lFrom = cob.newLabel();
+        Label lTo = cob.newLabel();
+        Label lCatch = cob.newLabel();
+        Label lDone = cob.newLabel();
 
         Class<?> returnType = result.function.resolvedHandle().type().returnType();
         BasicType basicReturnType = BasicType.basicType(returnType);
@@ -1285,68 +1095,64 @@ private Name emitTryFinally(int pos) {
         if (isNonVoid) {
             cleanupType = cleanupType.insertParameterTypes(1, returnType);
         }
-        String cleanupDesc = cleanupType.basicType().toMethodDescriptorString();
+        MethodTypeDesc cleanupDesc = methodDesc(cleanupType.basicType());
 
         // exception handler table
-        mv.visitTryCatchBlock(lFrom, lTo, lCatch, "java/lang/Throwable");
+        cob.exceptionCatch(lFrom, lTo, lCatch, CD_Throwable);
 
         // TRY:
-        mv.visitLabel(lFrom);
-        emitPushArgument(invoker, 0); // load target
-        emitPushArguments(args, 1); // load args (skip 0: method handle)
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false);
-        mv.visitLabel(lTo);
+        cob.labelBinding(lFrom);
+        emitPushArgument(cob, invoker, 0); // load target
+        emitPushArguments(cob, args, 1); // load args (skip 0: method handle)
+        cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(type.basicType()));
+        cob.labelBinding(lTo);
 
         // FINALLY_NORMAL:
         int index = extendLocalsMap(new Class<?>[]{ returnType });
         if (isNonVoid) {
-            emitStoreInsn(basicReturnType, index);
+            emitStoreInsn(cob, basicReturnType.basicTypeKind(), index);
         }
-        emitPushArgument(invoker, 1); // load cleanup
-        mv.visitInsn(Opcodes.ACONST_NULL);
+        emitPushArgument(cob, invoker, 1); // load cleanup
+        cob.loadConstant(null);
         if (isNonVoid) {
-            emitLoadInsn(basicReturnType, index);
+            emitLoadInsn(cob, basicReturnType.basicTypeKind(), index);
         }
-        emitPushArguments(args, 1); // load args (skip 0: method handle)
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", cleanupDesc, false);
-        mv.visitJumpInsn(Opcodes.GOTO, lDone);
+        emitPushArguments(cob, args, 1); // load args (skip 0: method handle)
+        cob.invokevirtual(CD_MethodHandle, "invokeBasic", cleanupDesc);
+        cob.goto_w(lDone);
 
         // CATCH:
-        mv.visitLabel(lCatch);
-        mv.visitInsn(Opcodes.DUP);
+        cob.labelBinding(lCatch);
+        cob.dup();
 
         // FINALLY_EXCEPTIONAL:
-        emitPushArgument(invoker, 1); // load cleanup
-        mv.visitInsn(Opcodes.SWAP);
+        emitPushArgument(cob, invoker, 1); // load cleanup
+        cob.swap();
         if (isNonVoid) {
-            emitZero(BasicType.basicType(returnType)); // load default for result
+            emitZero(cob, BasicType.basicType(returnType)); // load default for result
         }
-        emitPushArguments(args, 1); // load args (skip 0: method handle)
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", cleanupDesc, false);
+        emitPushArguments(cob, args, 1); // load args (skip 0: method handle)
+        cob.invokevirtual(CD_MethodHandle, "invokeBasic", cleanupDesc);
         if (isNonVoid) {
-            emitPopInsn(basicReturnType);
+            emitPopInsn(cob, basicReturnType);
         }
-        mv.visitInsn(Opcodes.ATHROW);
+        cob.athrow();
 
         // DONE:
-        mv.visitLabel(lDone);
+        cob.labelBinding(lDone);
 
         return result;
     }
 
-    private void emitPopInsn(BasicType type) {
-        mv.visitInsn(popInsnOpcode(type));
-    }
-
-    private static int popInsnOpcode(BasicType type) {
-        return switch (type) {
-            case I_TYPE, F_TYPE, L_TYPE -> Opcodes.POP;
-            case J_TYPE, D_TYPE         -> Opcodes.POP2;
+    private void emitPopInsn(CodeBuilder cob, BasicType type) {
+        switch (type) {
+            case I_TYPE, F_TYPE, L_TYPE -> cob.pop();
+            case J_TYPE, D_TYPE -> cob.pop2();
             default -> throw new InternalError("unknown type: " + type);
-        };
+        }
     }
 
-    private Name emitTableSwitch(int pos, int numCases) {
+    private Name emitTableSwitch(CodeBuilder cob, int pos, int numCases) {
         Name args    = lambdaForm.names[pos];
         Name invoker = lambdaForm.names[pos + 1];
         Name result  = lambdaForm.names[pos + 2];
@@ -1355,45 +1161,44 @@ private Name emitTableSwitch(int pos, int numCases) {
         MethodType caseType = args.function.resolvedHandle().type()
             .dropParameterTypes(0, 1) // drop collector
             .changeReturnType(returnType);
-        String caseDescriptor = caseType.basicType().toMethodDescriptorString();
+        MethodTypeDesc caseDescriptor = methodDesc(caseType.basicType());
 
-        emitPushArgument(invoker, 2); // push cases
-        mv.visitFieldInsn(Opcodes.GETFIELD, "java/lang/invoke/MethodHandleImpl$CasesHolder", "cases",
-            "[Ljava/lang/invoke/MethodHandle;");
+        emitPushArgument(cob, invoker, 2); // push cases
+        cob.getfield(CD_CasesHolder, "cases", CD_MethodHandle_array);
         int casesLocal = extendLocalsMap(new Class<?>[] { MethodHandle[].class });
-        emitStoreInsn(L_TYPE, casesLocal);
+        emitStoreInsn(cob, TypeKind.ReferenceType, casesLocal);
 
-        Label endLabel = new Label();
-        Label defaultLabel = new Label();
-        Label[] caseLabels = new Label[numCases];
-        for (int i = 0; i < caseLabels.length; i++) {
-            caseLabels[i] = new Label();
+        Label endLabel = cob.newLabel();
+        Label defaultLabel = cob.newLabel();
+        List<SwitchCase> cases = new ArrayList<>(numCases);
+        for (int i = 0; i < numCases; i++) {
+            cases.add(SwitchCase.of(i, cob.newLabel()));
         }
 
-        emitPushArgument(invoker, 0); // push switch input
-        mv.visitTableSwitchInsn(0, numCases - 1, defaultLabel, caseLabels);
+        emitPushArgument(cob, invoker, 0); // push switch input
+        cob.tableswitch(0, numCases - 1, defaultLabel, cases);
 
-        mv.visitLabel(defaultLabel);
-        emitPushArgument(invoker, 1); // push default handle
-        emitPushArguments(args, 1); // again, skip collector
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", caseDescriptor, false);
-        mv.visitJumpInsn(Opcodes.GOTO, endLabel);
+        cob.labelBinding(defaultLabel);
+        emitPushArgument(cob, invoker, 1); // push default handle
+        emitPushArguments(cob, args, 1); // again, skip collector
+        cob.invokevirtual(CD_MethodHandle, "invokeBasic", caseDescriptor);
+        cob.goto_(endLabel);
 
         for (int i = 0; i < numCases; i++) {
-            mv.visitLabel(caseLabels[i]);
+            cob.labelBinding(cases.get(i).target());
             // Load the particular case:
-            emitLoadInsn(L_TYPE, casesLocal);
-            emitIconstInsn(i);
-            mv.visitInsn(Opcodes.AALOAD);
+            emitLoadInsn(cob, TypeKind.ReferenceType, casesLocal);
+            cob.loadConstant(i);
+            cob.aaload();
 
             // invoke it:
-            emitPushArguments(args, 1); // again, skip collector
-            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", caseDescriptor, false);
+            emitPushArguments(cob, args, 1); // again, skip collector
+            cob.invokevirtual(CD_MethodHandle, "invokeBasic", caseDescriptor);
 
-            mv.visitJumpInsn(Opcodes.GOTO, endLabel);
+            cob.goto_(endLabel);
         }
 
-        mv.visitLabel(endLabel);
+        cob.labelBinding(endLabel);
 
         return result;
     }
@@ -1480,7 +1285,7 @@ private Name emitTableSwitch(int pos, int numCases) {
      *              GOTO DONE           // jump beyond end of clauses to return from loop
      * }</pre></blockquote>
      */
-    private Name emitLoop(int pos) {
+    private Name emitLoop(CodeBuilder cob, int pos) {
         Name args    = lambdaForm.names[pos];
         Name invoker = lambdaForm.names[pos+1];
         Name result  = lambdaForm.names[pos+2];
@@ -1488,8 +1293,9 @@ private Name emitLoop(int pos) {
         // extract clause and loop-local state types
         // find the type info in the loop invocation
         BasicType[] loopClauseTypes = (BasicType[]) invoker.arguments[0];
-        Class<?>[] loopLocalStateTypes = Stream.of(loopClauseTypes).
-                filter(bt -> bt != BasicType.V_TYPE).map(BasicType::basicTypeClass).toArray(Class<?>[]::new);
+        Class<?>[] loopLocalStateTypes = Stream.of(loopClauseTypes)
+                .filter(bt -> bt != BasicType.V_TYPE)
+                .map(BasicType::basicTypeClass).toArray(Class<?>[]::new);
         Class<?>[] localTypes = new Class<?>[loopLocalStateTypes.length + 1];
         localTypes[0] = MethodHandleImpl.LoopClauses.class;
         System.arraycopy(loopLocalStateTypes, 0, localTypes, 1, loopLocalStateTypes.length);
@@ -1513,61 +1319,61 @@ private Name emitLoop(int pos) {
         final int preds = 3;
         final int finis = 4;
 
-        Label lLoop = new Label();
-        Label lDone = new Label();
+        Label lLoop = cob.newLabel();
+        Label lDone = cob.newLabel();
         Label lNext;
 
         // PREINIT:
-        emitPushArgument(MethodHandleImpl.LoopClauses.class, invoker.arguments[1]);
-        mv.visitFieldInsn(Opcodes.GETFIELD, LOOP_CLAUSES, "clauses", MHARY2);
-        emitAstoreInsn(clauseDataIndex);
+        emitPushArgument(cob, MethodHandleImpl.LoopClauses.class, invoker.arguments[1]);
+        cob.getfield(CD_LoopClauses, "clauses", CD_MethodHandle_array2);
+        emitStoreInsn(cob, TypeKind.ReferenceType, clauseDataIndex);
 
         // INIT:
         for (int c = 0, state = 0; c < nClauses; ++c) {
             MethodType cInitType = loopType.changeReturnType(loopClauseTypes[c].basicTypeClass());
-            emitLoopHandleInvoke(invoker, inits, c, args, false, cInitType, loopLocalStateTypes, clauseDataIndex,
+            emitLoopHandleInvoke(cob, invoker, inits, c, args, false, cInitType, loopLocalStateTypes, clauseDataIndex,
                     firstLoopStateIndex);
             if (cInitType.returnType() != void.class) {
-                emitStoreInsn(BasicType.basicType(cInitType.returnType()), firstLoopStateIndex + state);
+                emitStoreInsn(cob, BasicType.basicType(cInitType.returnType()).basicTypeKind(), firstLoopStateIndex + state);
                 ++state;
             }
         }
 
         // LOOP:
-        mv.visitLabel(lLoop);
+        cob.labelBinding(lLoop);
 
         for (int c = 0, state = 0; c < nClauses; ++c) {
-            lNext = new Label();
+            lNext = cob.newLabel();
 
             MethodType stepType = loopHandleType.changeReturnType(loopClauseTypes[c].basicTypeClass());
             boolean isVoid = stepType.returnType() == void.class;
 
             // invoke loop step
-            emitLoopHandleInvoke(invoker, steps, c, args, true, stepType, loopLocalStateTypes, clauseDataIndex,
+            emitLoopHandleInvoke(cob, invoker, steps, c, args, true, stepType, loopLocalStateTypes, clauseDataIndex,
                     firstLoopStateIndex);
             if (!isVoid) {
-                emitStoreInsn(BasicType.basicType(stepType.returnType()), firstLoopStateIndex + state);
+                emitStoreInsn(cob, BasicType.basicType(stepType.returnType()).basicTypeKind(), firstLoopStateIndex + state);
                 ++state;
             }
 
             // invoke loop predicate
-            emitLoopHandleInvoke(invoker, preds, c, args, true, predType, loopLocalStateTypes, clauseDataIndex,
+            emitLoopHandleInvoke(cob, invoker, preds, c, args, true, predType, loopLocalStateTypes, clauseDataIndex,
                     firstLoopStateIndex);
-            mv.visitJumpInsn(Opcodes.IFNE, lNext);
+            cob.ifne(lNext);
 
             // invoke fini
-            emitLoopHandleInvoke(invoker, finis, c, args, true, finiType, loopLocalStateTypes, clauseDataIndex,
+            emitLoopHandleInvoke(cob, invoker, finis, c, args, true, finiType, loopLocalStateTypes, clauseDataIndex,
                     firstLoopStateIndex);
-            mv.visitJumpInsn(Opcodes.GOTO, lDone);
+            cob.goto_w(lDone);
 
             // this is the beginning of the next loop clause
-            mv.visitLabel(lNext);
+            cob.labelBinding(lNext);
         }
 
-        mv.visitJumpInsn(Opcodes.GOTO, lLoop);
+        cob.goto_w(lLoop);
 
         // DONE:
-        mv.visitLabel(lDone);
+        cob.labelBinding(lDone);
 
         return result;
     }
@@ -1588,69 +1394,67 @@ private int extendLocalsMap(Class<?>[] types) {
         return firstSlot;
     }
 
-    private void emitLoopHandleInvoke(Name holder, int handles, int clause, Name args, boolean pushLocalState,
+    private void emitLoopHandleInvoke(CodeBuilder cob, Name holder, int handles, int clause, Name args, boolean pushLocalState,
                                       MethodType type, Class<?>[] loopLocalStateTypes, int clauseDataSlot,
                                       int firstLoopStateSlot) {
         // load handle for clause
-        emitPushClauseArray(clauseDataSlot, handles);
-        emitIconstInsn(clause);
-        mv.visitInsn(Opcodes.AALOAD);
+        emitPushClauseArray(cob, clauseDataSlot, handles);
+        cob.loadConstant(clause);
+        cob.aaload();
         // load loop state (preceding the other arguments)
         if (pushLocalState) {
             for (int s = 0; s < loopLocalStateTypes.length; ++s) {
-                emitLoadInsn(BasicType.basicType(loopLocalStateTypes[s]), firstLoopStateSlot + s);
+                emitLoadInsn(cob, BasicType.basicType(loopLocalStateTypes[s]).basicTypeKind(), firstLoopStateSlot + s);
             }
         }
         // load loop args (skip 0: method handle)
-        emitPushArguments(args, 1);
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.toMethodDescriptorString(), false);
+        emitPushArguments(cob, args, 1);
+        cob.invokevirtual(CD_MethodHandle, "invokeBasic", methodDesc(type));
     }
 
-    private void emitPushClauseArray(int clauseDataSlot, int which) {
-        emitAloadInsn(clauseDataSlot);
-        emitIconstInsn(which - 1);
-        mv.visitInsn(Opcodes.AALOAD);
+    private void emitPushClauseArray(CodeBuilder cob, int clauseDataSlot, int which) {
+        emitLoadInsn(cob, TypeKind.ReferenceType, clauseDataSlot);
+        cob.loadConstant(which - 1);
+        cob.aaload();
     }
 
-    private void emitZero(BasicType type) {
-        mv.visitInsn(switch (type) {
-            case I_TYPE -> Opcodes.ICONST_0;
-            case J_TYPE -> Opcodes.LCONST_0;
-            case F_TYPE -> Opcodes.FCONST_0;
-            case D_TYPE -> Opcodes.DCONST_0;
-            case L_TYPE -> Opcodes.ACONST_NULL;
+    private void emitZero(CodeBuilder cob, BasicType type) {
+        switch (type) {
+            case I_TYPE -> cob.iconst_0();
+            case J_TYPE -> cob.lconst_0();
+            case F_TYPE -> cob.fconst_0();
+            case D_TYPE -> cob.dconst_0();
+            case L_TYPE -> cob.aconst_null();
             default -> throw new InternalError("unknown type: " + type);
-        });
+        };
     }
 
-    private void emitPushArguments(Name args, int start) {
+    private void emitPushArguments(CodeBuilder cob, Name args, int start) {
         MethodType type = args.function.methodType();
         for (int i = start; i < args.arguments.length; i++) {
-            emitPushArgument(type.parameterType(i), args.arguments[i]);
+            emitPushArgument(cob, type.parameterType(i), args.arguments[i]);
         }
     }
 
-    private void emitPushArgument(Name name, int paramIndex) {
+    private void emitPushArgument(CodeBuilder cob, Name name, int paramIndex) {
         Object arg = name.arguments[paramIndex];
         Class<?> ptype = name.function.methodType().parameterType(paramIndex);
-        emitPushArgument(ptype, arg);
+        emitPushArgument(cob, ptype, arg);
     }
 
-    private void emitPushArgument(Class<?> ptype, Object arg) {
+    private void emitPushArgument(CodeBuilder cob, Class<?> ptype, Object arg) {
         BasicType bptype = basicType(ptype);
         if (arg instanceof Name n) {
-            emitLoadInsn(n.type, n.index());
-            emitImplicitConversion(n.type, ptype, n);
-        } else if (arg == null && bptype == L_TYPE) {
-            mv.visitInsn(Opcodes.ACONST_NULL);
-        } else if (arg instanceof String && bptype == L_TYPE) {
-            mv.visitLdcInsn(arg);
+            emitLoadInsn(cob, n.type.basicTypeKind(), n.index());
+            emitImplicitConversion(cob, n.type, ptype, n);
+        } else if ((arg == null || arg instanceof String) && bptype == L_TYPE) {
+            cob.loadConstant((ConstantDesc)arg);
         } else {
             if (Wrapper.isWrapperType(arg.getClass()) && bptype != L_TYPE) {
-                emitConst(arg);
+                cob.loadConstant((ConstantDesc)arg);
             } else {
-                mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(arg), "Ljava/lang/Object;");
-                emitImplicitConversion(L_TYPE, ptype, arg);
+                cob.getstatic(classDesc, classData(arg), CD_Object);
+                emitImplicitConversion(cob, L_TYPE, ptype, arg);
             }
         }
     }
@@ -1658,44 +1462,44 @@ private void emitPushArgument(Class<?> ptype, Object arg) {
     /**
      * Store the name to its local, if necessary.
      */
-    private void emitStoreResult(Name name) {
+    private void emitStoreResult(CodeBuilder cob, Name name) {
         if (name != null && name.type != V_TYPE) {
             // non-void: actually assign
-            emitStoreInsn(name.type, name.index());
+            emitStoreInsn(cob, name.type.basicTypeKind(), name.index());
         }
     }
 
     /**
      * Emits a return statement from a LF invoker. If required, the result type is cast to the correct return type.
      */
-    private void emitReturn(Name onStack) {
+    private void emitReturn(CodeBuilder cob, Name onStack) {
         // return statement
         Class<?> rclass = invokerType.returnType();
         BasicType rtype = lambdaForm.returnType();
         assert(rtype == basicType(rclass));  // must agree
         if (rtype == V_TYPE) {
             // void
-            mv.visitInsn(Opcodes.RETURN);
+            cob.return_();
             // it doesn't matter what rclass is; the JVM will discard any value
         } else {
             LambdaForm.Name rn = lambdaForm.names[lambdaForm.result];
 
             // put return value on the stack if it is not already there
             if (rn != onStack) {
-                emitLoadInsn(rtype, lambdaForm.result);
+                emitLoadInsn(cob, rtype.basicTypeKind(), lambdaForm.result);
             }
 
-            emitImplicitConversion(rtype, rclass, rn);
+            emitImplicitConversion(cob, rtype, rclass, rn);
 
             // generate actual return statement
-            emitReturnInsn(rtype);
+            cob.return_(rtype.basicTypeKind());
         }
     }
 
     /**
      * Emit a type conversion bytecode casting from "from" to "to".
      */
-    private void emitPrimCast(Wrapper from, Wrapper to) {
+    private void emitPrimCast(CodeBuilder cob, TypeKind from, TypeKind to) {
         // Here's how.
         // -   indicates forbidden
         // <-> indicates implicit
@@ -1708,80 +1512,10 @@ private void emitPrimCast(Wrapper from, Wrapper to) {
         //      long        -     l2i,i2b   l2i,i2s  l2i,i2c    l2i      <->      l2f      l2d
         //      float       -     f2i,i2b   f2i,i2s  f2i,i2c    f2i      f2l      <->      f2d
         //      double      -     d2i,i2b   d2i,i2s  d2i,i2c    d2i      d2l      d2f      <->
-        if (from == to) {
-            // no cast required, should be dead code anyway
-            return;
-        }
-        if (from.isSubwordOrInt()) {
-            // cast from {byte,short,char,int} to anything
-            emitI2X(to);
-        } else {
-            // cast from {long,float,double} to anything
-            if (to.isSubwordOrInt()) {
-                // cast to {byte,short,char,int}
-                emitX2I(from);
-                if (to.bitWidth() < 32) {
-                    // targets other than int require another conversion
-                    emitI2X(to);
-                }
-            } else {
-                // cast to {long,float,double} - this is verbose
-                boolean error = false;
-                switch (from) {
-                    case LONG -> {
-                        switch (to) {
-                            case FLOAT  -> mv.visitInsn(Opcodes.L2F);
-                            case DOUBLE -> mv.visitInsn(Opcodes.L2D);
-                            default -> error = true;
-                        }
-                    }
-                    case FLOAT -> {
-                        switch (to) {
-                            case LONG   -> mv.visitInsn(Opcodes.F2L);
-                            case DOUBLE -> mv.visitInsn(Opcodes.F2D);
-                            default -> error = true;
-                        }
-                    }
-                    case DOUBLE -> {
-                        switch (to) {
-                            case LONG  -> mv.visitInsn(Opcodes.D2L);
-                            case FLOAT -> mv.visitInsn(Opcodes.D2F);
-                            default -> error = true;
-                        }
-                    }
-                    default -> error = true;
-                }
-                if (error) {
-                    throw new IllegalStateException("unhandled prim cast: " + from + "2" + to);
-                }
-            }
-        }
-    }
-
-    private void emitI2X(Wrapper type) {
-        switch (type) {
-        case BYTE:    mv.visitInsn(Opcodes.I2B);  break;
-        case SHORT:   mv.visitInsn(Opcodes.I2S);  break;
-        case CHAR:    mv.visitInsn(Opcodes.I2C);  break;
-        case INT:     /* naught */                break;
-        case LONG:    mv.visitInsn(Opcodes.I2L);  break;
-        case FLOAT:   mv.visitInsn(Opcodes.I2F);  break;
-        case DOUBLE:  mv.visitInsn(Opcodes.I2D);  break;
-        case BOOLEAN:
-            // For compatibility with ValueConversions and explicitCastArguments:
-            mv.visitInsn(Opcodes.ICONST_1);
-            mv.visitInsn(Opcodes.IAND);
-            break;
-        default:   throw new InternalError("unknown type: " + type);
-        }
-    }
-
-    private void emitX2I(Wrapper type) {
-        switch (type) {
-            case LONG -> mv.visitInsn(Opcodes.L2I);
-            case FLOAT -> mv.visitInsn(Opcodes.F2I);
-            case DOUBLE -> mv.visitInsn(Opcodes.D2I);
-            default -> throw new InternalError("unknown type: " + type);
+        if (from != to && from != TypeKind.BooleanType) try {
+            cob.conversion(from, to);
+        } catch (IllegalArgumentException e) {
+            throw new IllegalStateException("unhandled prim cast: " + from + "2" + to);
         }
     }
 
@@ -1798,51 +1532,61 @@ static MemberName generateLambdaFormInterpreterEntryPoint(MethodType mt) {
     }
 
     private byte[] generateLambdaFormInterpreterEntryPointBytes() {
-        classFilePrologue();
-        methodPrologue();
-
-        // Suppress this method in backtraces displayed to the user.
-        mv.visitAnnotation(HIDDEN_SIG, true);
-
-        // Don't inline the interpreter entry.
-        mv.visitAnnotation(DONTINLINE_SIG, true);
-
-        // create parameter array
-        emitIconstInsn(invokerType.parameterCount());
-        mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
-
-        // fill parameter array
-        for (int i = 0; i < invokerType.parameterCount(); i++) {
-            Class<?> ptype = invokerType.parameterType(i);
-            mv.visitInsn(Opcodes.DUP);
-            emitIconstInsn(i);
-            emitLoadInsn(basicType(ptype), i);
-            // box if primitive type
-            if (ptype.isPrimitive()) {
-                emitBoxing(Wrapper.forPrimitiveType(ptype));
+        final byte[] classFile = classFileSetup(new Consumer<ClassBuilder>() {
+            @Override
+            public void accept(ClassBuilder clb) {
+                methodSetup(clb, new Consumer<MethodBuilder>() {
+                    @Override
+                    public void accept(MethodBuilder mb) {
+
+                        mb.with(RuntimeVisibleAnnotationsAttribute.of(List.of(
+                                HIDDEN,    // Suppress this method in backtraces displayed to the user.
+                                DONTINLINE // Don't inline the interpreter entry.
+                        )));
+
+                        mb.withCode(new Consumer<CodeBuilder>() {
+                            @Override
+                            public void accept(CodeBuilder cob) {
+                                // create parameter array
+                                cob.loadConstant(invokerType.parameterCount());
+                                cob.anewarray(CD_Object);
+
+                                // fill parameter array
+                                for (int i = 0; i < invokerType.parameterCount(); i++) {
+                                    Class<?> ptype = invokerType.parameterType(i);
+                                    cob.dup();
+                                    cob.loadConstant(i);
+                                    emitLoadInsn(cob, basicType(ptype).basicTypeKind(), i);
+                                    // box if primitive type
+                                    if (ptype.isPrimitive()) {
+                                        emitBoxing(cob, TypeKind.from(ptype));
+                                    }
+                                    cob.aastore();
+                                }
+                                // invoke
+                                cob.aload(0);
+                                cob.getfield(CD_MethodHandle, "form", CD_LambdaForm);
+                                cob.swap();  // swap form and array; avoid local variable
+                                cob.invokevirtual(CD_LambdaForm, "interpretWithArguments", MethodTypeDescImpl.ofValidated(CD_Object, CD_Object_array));
+
+                                // maybe unbox
+                                Class<?> rtype = invokerType.returnType();
+                                TypeKind rtypeK = TypeKind.from(rtype);
+                                if (rtype.isPrimitive() && rtype != void.class) {
+                                    emitUnboxing(cob, rtypeK);
+                                }
+
+                                // return statement
+                                cob.return_(rtypeK);
+                            }
+                        });
+                    }
+                });
+                clinit(clb, classDesc, classData);
+                bogusMethod(clb, invokerType);
             }
-            mv.visitInsn(Opcodes.AASTORE);
-        }
-        // invoke
-        emitAloadInsn(0);
-        mv.visitFieldInsn(Opcodes.GETFIELD, MH, "form", "Ljava/lang/invoke/LambdaForm;");
-        mv.visitInsn(Opcodes.SWAP);  // swap form and array; avoid local variable
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, LF, "interpretWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false);
-
-        // maybe unbox
-        Class<?> rtype = invokerType.returnType();
-        if (rtype.isPrimitive() && rtype != void.class) {
-            emitUnboxing(Wrapper.forPrimitiveType(rtype));
-        }
-
-        // return statement
-        emitReturnInsn(basicType(rtype));
-
-        methodEpilogue();
-        clinit(cw, className, classData);
-        bogusMethod(invokerType);
-
-        return cw.toByteArray();
+        });
+        return classFile;
     }
 
     /**
@@ -1857,73 +1601,101 @@ static MemberName generateNamedFunctionInvoker(MethodTypeForm typeForm) {
 
     private byte[] generateNamedFunctionInvokerImpl(MethodTypeForm typeForm) {
         MethodType dstType = typeForm.erasedType();
-        classFilePrologue();
-        methodPrologue();
-
-        // Suppress this method in backtraces displayed to the user.
-        mv.visitAnnotation(HIDDEN_SIG, true);
-
-        // Force inlining of this invoker method.
-        mv.visitAnnotation(FORCEINLINE_SIG, true);
-
-        // Load receiver
-        emitAloadInsn(0);
-
-        // Load arguments from array
-        for (int i = 0; i < dstType.parameterCount(); i++) {
-            emitAloadInsn(1);
-            emitIconstInsn(i);
-            mv.visitInsn(Opcodes.AALOAD);
-
-            // Maybe unbox
-            Class<?> dptype = dstType.parameterType(i);
-            if (dptype.isPrimitive()) {
-                Wrapper dstWrapper = Wrapper.forBasicType(dptype);
-                Wrapper srcWrapper = dstWrapper.isSubwordOrInt() ? Wrapper.INT : dstWrapper;  // narrow subword from int
-                emitUnboxing(srcWrapper);
-                emitPrimCast(srcWrapper, dstWrapper);
+        final byte[] classFile = classFileSetup(new Consumer<ClassBuilder>() {
+            @Override
+            public void accept(ClassBuilder clb) {
+                methodSetup(clb, new Consumer<MethodBuilder>() {
+                    @Override
+                    public void accept(MethodBuilder mb) {
+
+                        mb.with(RuntimeVisibleAnnotationsAttribute.of(List.of(
+                                HIDDEN,    // Suppress this method in backtraces displayed to the user.
+                                FORCEINLINE // Force inlining of this invoker method.
+                        )));
+
+                        mb.withCode(new Consumer<CodeBuilder>() {
+                            @Override
+                            public void accept(CodeBuilder cob) {
+                                // Load receiver
+                                cob.aload(0);
+
+                                // Load arguments from array
+                                for (int i = 0; i < dstType.parameterCount(); i++) {
+                                    cob.aload(1);
+                                    cob.loadConstant(i);
+                                    cob.aaload();
+
+                                    // Maybe unbox
+                                    Class<?> dptype = dstType.parameterType(i);
+                                    if (dptype.isPrimitive()) {
+                                        TypeKind dstTK = TypeKind.from(dptype);
+                                        TypeKind srcTK = dstTK.asLoadable();
+                                        emitUnboxing(cob, srcTK);
+                                        emitPrimCast(cob, srcTK, dstTK);
+                                    }
+                                }
+
+                                // Invoke
+                                MethodTypeDesc targetDesc = methodDesc(dstType.basicType());
+                                cob.invokevirtual(CD_MethodHandle, "invokeBasic", targetDesc);
+
+                                // Box primitive types
+                                Class<?> rtype = dstType.returnType();
+                                if (rtype != void.class && rtype.isPrimitive()) {
+                                    TypeKind srcTK = TypeKind.from(rtype);
+                                    TypeKind dstTK = srcTK.asLoadable();
+                                    // boolean casts not allowed
+                                    emitPrimCast(cob, srcTK, dstTK);
+                                    emitBoxing(cob, dstTK);
+                                }
+
+                                // If the return type is void we return a null reference.
+                                if (rtype == void.class) {
+                                    cob.aconst_null();
+                                }
+                               cob.areturn();  // NOTE: NamedFunction invokers always return a reference value.
+                            }
+                        });
+                    }
+                });
+                clinit(clb, classDesc, classData);
+                bogusMethod(clb, dstType);
             }
-        }
-
-        // Invoke
-        String targetDesc = dstType.basicType().toMethodDescriptorString();
-        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", targetDesc, false);
-
-        // Box primitive types
-        Class<?> rtype = dstType.returnType();
-        if (rtype != void.class && rtype.isPrimitive()) {
-            Wrapper srcWrapper = Wrapper.forBasicType(rtype);
-            Wrapper dstWrapper = srcWrapper.isSubwordOrInt() ? Wrapper.INT : srcWrapper;  // widen subword to int
-            // boolean casts not allowed
-            emitPrimCast(srcWrapper, dstWrapper);
-            emitBoxing(dstWrapper);
-        }
-
-        // If the return type is void we return a null reference.
-        if (rtype == void.class) {
-            mv.visitInsn(Opcodes.ACONST_NULL);
-        }
-        emitReturnInsn(L_TYPE);  // NOTE: NamedFunction invokers always return a reference value.
-
-        methodEpilogue();
-        clinit(cw, className, classData);
-        bogusMethod(dstType);
-
-        return cw.toByteArray();
+        });
+        return classFile;
     }
 
     /**
      * Emit a bogus method that just loads some string constants. This is to get the constants into the constant pool
      * for debugging purposes.
      */
-    private void bogusMethod(Object os) {
+    private void bogusMethod(ClassBuilder clb, Object os) {
         if (dumper().isEnabled()) {
-            mv = cw.visitMethod(Opcodes.ACC_STATIC, "dummy", "()V", null, null);
-            mv.visitLdcInsn(os.toString());
-            mv.visitInsn(Opcodes.POP);
-            mv.visitInsn(Opcodes.RETURN);
-            mv.visitMaxs(0, 0);
-            mv.visitEnd();
+            clb.withMethod("dummy", MTD_void, ACC_STATIC, new MethodBody(new Consumer<CodeBuilder>() {
+                @Override
+                public void accept(CodeBuilder cob) {
+                    cob.loadConstant(os.toString());
+                    cob.pop();
+                    cob.return_();
+                }
+            }));
+        }
+    }
+
+    static ClassDesc classDesc(Class<?> cls) {
+//        assert(VerifyAccess.isTypeVisible(cls, Object.class)) : cls.getName();
+        return cls.isPrimitive() ? Wrapper.forPrimitiveType(cls).basicClassDescriptor()
+             : cls == MethodHandle.class ? CD_MethodHandle
+             : cls == DirectMethodHandle.class ? CD_DirectMethodHandle
+             : cls == Object.class ? CD_Object
+             : ReferenceClassDescImpl.ofValidated(cls.descriptorString());
+    }
+
+    static MethodTypeDesc methodDesc(MethodType mt) {
+        var params = new ClassDesc[mt.parameterCount()];
+        for (int i = 0; i < params.length; i++) {
+            params[i] = classDesc(mt.parameterType(i));
         }
+        return MethodTypeDescImpl.ofValidated(classDesc(mt.returnType()), params);
     }
 }
diff --git a/src/java.base/share/classes/java/lang/invoke/LambdaForm.java b/src/java.base/share/classes/java/lang/invoke/LambdaForm.java
index 823f527b6c4..09ea5df4a23 100644
--- a/src/java.base/share/classes/java/lang/invoke/LambdaForm.java
+++ b/src/java.base/share/classes/java/lang/invoke/LambdaForm.java
@@ -25,6 +25,7 @@
 
 package java.lang.invoke;
 
+import java.lang.classfile.TypeKind;
 import jdk.internal.perf.PerfCounter;
 import jdk.internal.vm.annotation.DontInline;
 import jdk.internal.vm.annotation.Hidden;
@@ -137,12 +138,12 @@ class LambdaForm {
     public static final int VOID_RESULT = -1, LAST_RESULT = -2;
 
     enum BasicType {
-        L_TYPE('L', Object.class, Wrapper.OBJECT),  // all reference types
-        I_TYPE('I', int.class,    Wrapper.INT),
-        J_TYPE('J', long.class,   Wrapper.LONG),
-        F_TYPE('F', float.class,  Wrapper.FLOAT),
-        D_TYPE('D', double.class, Wrapper.DOUBLE),  // all primitive types
-        V_TYPE('V', void.class,   Wrapper.VOID);    // not valid in all contexts
+        L_TYPE('L', Object.class, Wrapper.OBJECT, TypeKind.ReferenceType), // all reference types
+        I_TYPE('I', int.class,    Wrapper.INT,    TypeKind.IntType),
+        J_TYPE('J', long.class,   Wrapper.LONG,   TypeKind.LongType),
+        F_TYPE('F', float.class,  Wrapper.FLOAT,  TypeKind.FloatType),
+        D_TYPE('D', double.class, Wrapper.DOUBLE, TypeKind.DoubleType),  // all primitive types
+        V_TYPE('V', void.class,   Wrapper.VOID,   TypeKind.VoidType);    // not valid in all contexts
 
         static final @Stable BasicType[] ALL_TYPES = BasicType.values();
         static final @Stable BasicType[] ARG_TYPES = Arrays.copyOf(ALL_TYPES, ALL_TYPES.length-1);
@@ -153,11 +154,13 @@ enum BasicType {
         final char btChar;
         final Class<?> btClass;
         final Wrapper btWrapper;
+        final TypeKind btKind;
 
-        private BasicType(char btChar, Class<?> btClass, Wrapper wrapper) {
+        private BasicType(char btChar, Class<?> btClass, Wrapper wrapper, TypeKind typeKind) {
             this.btChar = btChar;
             this.btClass = btClass;
             this.btWrapper = wrapper;
+            this.btKind = typeKind;
         }
 
         char basicTypeChar() {
@@ -169,6 +172,9 @@ Class<?> basicTypeClass() {
         Wrapper basicTypeWrapper() {
             return btWrapper;
         }
+        TypeKind basicTypeKind() {
+            return btKind;
+        }
         int basicTypeSlots() {
             return btWrapper.stackSlots();
         }
diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java
index e79c8463d30..57446c9b2fd 100644
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java
@@ -27,8 +27,9 @@
 
 import jdk.internal.access.JavaLangInvokeAccess;
 import jdk.internal.access.SharedSecrets;
+import jdk.internal.constant.MethodTypeDescImpl;
+import jdk.internal.constant.ReferenceClassDescImpl;
 import jdk.internal.foreign.abi.NativeEntryPoint;
-import jdk.internal.org.objectweb.asm.ClassWriter;
 import jdk.internal.reflect.CallerSensitive;
 import jdk.internal.reflect.Reflection;
 import jdk.internal.vm.annotation.ForceInline;
@@ -39,6 +40,8 @@
 import sun.invoke.util.VerifyType;
 import sun.invoke.util.Wrapper;
 
+import java.lang.classfile.ClassFile;
+import java.lang.constant.ClassDesc;
 import java.lang.invoke.MethodHandles.Lookup;
 import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
@@ -56,13 +59,14 @@
 import java.util.function.Function;
 import java.util.stream.Stream;
 
+import static java.lang.classfile.ClassFile.*;
+import static java.lang.constant.ConstantDescs.*;
 import static java.lang.invoke.LambdaForm.*;
 import static java.lang.invoke.MethodHandleNatives.Constants.MN_CALLER_SENSITIVE;
 import static java.lang.invoke.MethodHandleNatives.Constants.MN_HIDDEN_MEMBER;
 import static java.lang.invoke.MethodHandleStatics.*;
 import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
 import static java.lang.invoke.MethodHandles.Lookup.ClassOption.NESTMATE;
-import static jdk.internal.org.objectweb.asm.Opcodes.*;
 
 /**
  * Trusted implementation code for MethodHandle.
@@ -1035,8 +1039,10 @@ static MethodHandle bindCaller(MethodHandle mh, Class<?> hostClass) {
     // Put the whole mess into its own nested class.
     // That way we can lazily load the code and set up the constants.
     private static class BindCaller {
-        private static MethodType INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object[].class);
-        private static MethodType REFLECT_INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object.class, Object[].class);
+
+        private static final ClassDesc CD_Object_array = ReferenceClassDescImpl.ofValidated("[Ljava/lang/Object;");
+        private static final MethodType INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object[].class);
+        private static final MethodType REFLECT_INVOKER_MT = MethodType.methodType(Object.class, MethodHandle.class, Object.class, Object[].class);
 
         static MethodHandle bindCaller(MethodHandle mh, Class<?> hostClass) {
             // Code in the boot layer should now be careful while creating method handles or
@@ -1250,8 +1256,6 @@ private static boolean checkCallerClass(Class<?> expected) {
 
         /** Produces byte code for a class that is used as an injected invoker. */
         private static byte[] generateInvokerTemplate() {
-            ClassWriter cw = new ClassWriter(0);
-
             // private static class InjectedInvoker {
             //     /* this is used to wrap DMH(s) of caller-sensitive methods */
             //     @Hidden
@@ -1265,39 +1269,25 @@ private static byte[] generateInvokerTemplate() {
             //     }
             // }
             // }
-            cw.visit(CLASSFILE_VERSION, ACC_PRIVATE | ACC_SUPER, "InjectedInvoker", null, "java/lang/Object", null);
-            {
-                var mv = cw.visitMethod(ACC_STATIC, "invoke_V",
-                        "(Ljava/lang/invoke/MethodHandle;[Ljava/lang/Object;)Ljava/lang/Object;",
-                        null, null);
-
-                mv.visitCode();
-                mv.visitVarInsn(ALOAD, 0);
-                mv.visitVarInsn(ALOAD, 1);
-                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeExact",
-                        "([Ljava/lang/Object;)Ljava/lang/Object;", false);
-                mv.visitInsn(ARETURN);
-                mv.visitMaxs(2, 2);
-                mv.visitEnd();
-
-                cw.visitEnd();
-            }
-
-            {
-                var mv = cw.visitMethod(ACC_STATIC, "reflect_invoke_V",
-                        "(Ljava/lang/invoke/MethodHandle;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;",
-                        null, null);
-                mv.visitCode();
-                mv.visitVarInsn(ALOAD, 0);
-                mv.visitVarInsn(ALOAD, 1);
-                mv.visitVarInsn(ALOAD, 2);
-                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeExact",
-                        "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", false);
-                mv.visitInsn(ARETURN);
-                mv.visitMaxs(3, 3);
-                mv.visitEnd();
-            }
-            return cw.toByteArray();
+            return ClassFile.of().build(ReferenceClassDescImpl.ofValidated("LInjectedInvoker;"), clb -> clb
+                    .withFlags(ACC_PRIVATE | ACC_SUPER)
+                    .withMethodBody(
+                        "invoke_V",
+                        MethodTypeDescImpl.ofValidated(CD_Object, CD_MethodHandle, CD_Object_array),
+                        ACC_STATIC,
+                        cob -> cob.aload(0)
+                                  .aload(1)
+                                  .invokevirtual(CD_MethodHandle, "invokeExact", MethodTypeDescImpl.ofValidated(CD_Object, CD_Object_array))
+                                  .areturn())
+                    .withMethodBody(
+                        "reflect_invoke_V",
+                        MethodTypeDescImpl.ofValidated(CD_Object, CD_MethodHandle, CD_Object, CD_Object_array),
+                        ACC_STATIC,
+                        cob -> cob.aload(0)
+                                  .aload(1)
+                                  .aload(2)
+                                  .invokevirtual(CD_MethodHandle, "invokeExact", MethodTypeDescImpl.ofValidated(CD_Object, CD_Object, CD_Object_array))
+                                  .areturn()));
         }
     }
 
diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java b/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java
index 5ca45e3fe52..8f0f355a980 100644
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, 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
@@ -52,6 +52,8 @@
 import java.lang.classfile.ClassFile;
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.TypeKind;
+
+import jdk.internal.constant.ConstantUtils;
 import jdk.internal.module.Modules;
 import jdk.internal.reflect.CallerSensitive;
 import jdk.internal.reflect.Reflection;
@@ -63,6 +65,7 @@
 import static java.lang.invoke.MethodType.methodType;
 import static java.lang.module.ModuleDescriptor.Modifier.SYNTHETIC;
 import static java.lang.classfile.ClassFile.*;
+import static jdk.internal.constant.ConstantUtils.*;
 
 /**
  * This class consists exclusively of static methods that help adapt
@@ -249,14 +252,14 @@ private static Class<?> newProxyClass(Class<?> intfc) {
 
             // the field name holding the method handle for this method
             String fieldName = "m" + count++;
-            var mt = methodType(m.getReturnType(), JLRA.getExecutableSharedParameterTypes(m), true);
+            var md = methodTypeDesc(m.getReturnType(), JLRA.getExecutableSharedParameterTypes(m));
             var thrown = JLRA.getExecutableSharedExceptionTypes(m);
             var exceptionTypeDescs =
                     thrown.length == 0 ? DEFAULT_RETHROWS
                                        : Stream.concat(DEFAULT_RETHROWS.stream(),
-                                                       Arrays.stream(thrown).map(MethodHandleProxies::desc))
+                                                       Arrays.stream(thrown).map(ConstantUtils::referenceClassDesc))
                                                .distinct().toList();
-            methods.add(new MethodInfo(desc(mt), exceptionTypeDescs, fieldName));
+            methods.add(new MethodInfo(md, exceptionTypeDescs, fieldName));
 
             // find the types referenced by this method
             addElementType(referencedTypes, m.getReturnType());
@@ -279,7 +282,8 @@ private static Class<?> newProxyClass(Class<?> intfc) {
         int i = intfcName.lastIndexOf('.');
         // jdk.MHProxy#.Interface
         String className = packageName + "." + (i > 0 ? intfcName.substring(i + 1) : intfcName);
-        byte[] template = createTemplate(loader, ClassDesc.of(className), desc(intfc), uniqueName, methods);
+        byte[] template = createTemplate(loader, binaryNameToDesc(className),
+                referenceClassDesc(intfc), uniqueName, methods);
         // define the dynamic module to the class loader of the interface
         var definer = new Lookup(intfc).makeHiddenClassDefiner(className, template, Set.of(), DUMPER);
 
@@ -335,17 +339,17 @@ private static Class<?> getProxyClass(Class<?> intfc) {
         }
     }
 
-    private static final List<ClassDesc> DEFAULT_RETHROWS = List.of(desc(RuntimeException.class), desc(Error.class));
-    private static final ClassDesc CD_UndeclaredThrowableException = desc(UndeclaredThrowableException.class);
-    private static final ClassDesc CD_IllegalAccessException = desc(IllegalAccessException.class);
+    private static final List<ClassDesc> DEFAULT_RETHROWS = List.of(referenceClassDesc(RuntimeException.class), referenceClassDesc(Error.class));
+    private static final ClassDesc CD_UndeclaredThrowableException = referenceClassDesc(UndeclaredThrowableException.class);
+    private static final ClassDesc CD_IllegalAccessException = referenceClassDesc(IllegalAccessException.class);
     private static final MethodTypeDesc MTD_void_Throwable = MethodTypeDesc.of(CD_void, CD_Throwable);
     private static final MethodType MT_void_Lookup_MethodHandle_MethodHandle =
             methodType(void.class, Lookup.class, MethodHandle.class, MethodHandle.class);
     private static final MethodType MT_Object_Lookup_MethodHandle_MethodHandle =
             MT_void_Lookup_MethodHandle_MethodHandle.changeReturnType(Object.class);
     private static final MethodType MT_MethodHandle_Object = methodType(MethodHandle.class, Object.class);
-    private static final MethodTypeDesc MTD_void_Lookup_MethodHandle_MethodHandle =
-            desc(MT_void_Lookup_MethodHandle_MethodHandle);
+    private static final MethodTypeDesc MTD_void_Lookup_MethodHandle_MethodHandle
+            = methodTypeDesc(MT_void_Lookup_MethodHandle_MethodHandle);
     private static final MethodTypeDesc MTD_void_Lookup = MethodTypeDesc.of(CD_void, CD_MethodHandles_Lookup);
     private static final MethodTypeDesc MTD_MethodHandle_MethodType = MethodTypeDesc.of(CD_MethodHandle, CD_MethodType);
     private static final MethodTypeDesc MTD_Class = MethodTypeDesc.of(CD_Class);
@@ -531,16 +535,6 @@ public static Class<?> wrapperInstanceType(Object x) {
         }
     }
 
-    private static ClassDesc desc(Class<?> cl) {
-        return cl.describeConstable().orElseThrow(() -> newInternalError("Cannot convert class "
-                + cl.getName() + " to a constant"));
-    }
-
-    private static MethodTypeDesc desc(MethodType mt) {
-        return mt.describeConstable().orElseThrow(() -> newInternalError("Cannot convert method type "
-                + mt + " to a constant"));
-    }
-
     private static final JavaLangReflectAccess JLRA = SharedSecrets.getJavaLangReflectAccess();
     private static final AtomicInteger counter = new AtomicInteger();
 
diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
index 9ac8e42a2f0..0cb77f632b3 100644
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
@@ -28,9 +28,6 @@
 import jdk.internal.access.SharedSecrets;
 import jdk.internal.misc.Unsafe;
 import jdk.internal.misc.VM;
-import jdk.internal.org.objectweb.asm.ClassReader;
-import jdk.internal.org.objectweb.asm.Opcodes;
-import jdk.internal.org.objectweb.asm.Type;
 import jdk.internal.reflect.CallerSensitive;
 import jdk.internal.reflect.CallerSensitiveAdapter;
 import jdk.internal.reflect.Reflection;
@@ -42,8 +39,10 @@
 import sun.reflect.misc.ReflectUtil;
 import sun.security.util.SecurityConstants;
 
+import java.lang.classfile.ClassModel;
 import java.lang.constant.ConstantDescs;
 import java.lang.invoke.LambdaForm.BasicType;
+import java.lang.invoke.MethodHandleImpl.Intrinsic;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Member;
@@ -62,8 +61,8 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Stream;
 
+import static java.lang.classfile.ClassFile.*;
 import static java.lang.invoke.LambdaForm.BasicType.V_TYPE;
-import static java.lang.invoke.MethodHandleImpl.Intrinsic;
 import static java.lang.invoke.MethodHandleNatives.Constants.*;
 import static java.lang.invoke.MethodHandleStatics.UNSAFE;
 import static java.lang.invoke.MethodHandleStatics.newIllegalArgumentException;
@@ -2288,27 +2287,16 @@ private static ClassFile readClassFile(byte[] bytes) {
                 String name;
                 int accessFlags;
                 try {
-                    ClassReader reader = new ClassReader(bytes);
-                    // ClassReader does not check if `this_class` is CONSTANT_Class_info
-                    // workaround to read `this_class` using readConst and validate the value
-                    int thisClass = reader.readUnsignedShort(reader.header + 2);
-                    Object constant = reader.readConst(thisClass, new char[reader.getMaxStringLength()]);
-                    if (!(constant instanceof Type type)) {
-                        throw new ClassFormatError("this_class item: #" + thisClass + " not a CONSTANT_Class_info");
-                    }
-                    if (!type.getDescriptor().startsWith("L")) {
-                        throw new ClassFormatError("this_class item: #" + thisClass + " not a CONSTANT_Class_info");
-                    }
-                    name = type.getInternalName();
-                    accessFlags = reader.readUnsignedShort(reader.header);
-                } catch (RuntimeException e) {
-                    // ASM exceptions are poorly specified
+                    ClassModel cm = java.lang.classfile.ClassFile.of().parse(bytes);
+                    name = cm.thisClass().asInternalName();
+                    accessFlags = cm.flags().flagsMask();
+                } catch (IllegalArgumentException e) {
                     ClassFormatError cfe = new ClassFormatError();
                     cfe.initCause(e);
                     throw cfe;
                 }
                 // must be a class or interface
-                if ((accessFlags & Opcodes.ACC_MODULE) != 0) {
+                if ((accessFlags & ACC_MODULE) != 0) {
                     throw newIllegalArgumentException("Not a class or interface: ACC_MODULE flag is set");
                 }
                 return new ClassFile(name, accessFlags, bytes);
diff --git a/src/java.base/share/classes/java/lang/invoke/MethodType.java b/src/java.base/share/classes/java/lang/invoke/MethodType.java
index 29a338261e9..faf8302206e 100644
--- a/src/java.base/share/classes/java/lang/invoke/MethodType.java
+++ b/src/java.base/share/classes/java/lang/invoke/MethodType.java
@@ -1291,15 +1291,21 @@ static String toFieldDescriptorString(Class<?> cls) {
      */
     @Override
     public Optional<MethodTypeDesc> describeConstable() {
-        try {
-            return Optional.of(MethodTypeDesc.of(returnType().describeConstable().orElseThrow(),
-                                                 Stream.of(parameterArray())
-                                                      .map(p -> p.describeConstable().orElseThrow())
-                                                      .toArray(ClassDesc[]::new)));
-        }
-        catch (NoSuchElementException e) {
+        var retDesc = returnType().describeConstable();
+        if (retDesc.isEmpty())
             return Optional.empty();
+
+        if (parameterCount() == 0)
+            return Optional.of(MethodTypeDesc.of(retDesc.get()));
+
+        var params = new ClassDesc[parameterCount()];
+        for (int i = 0; i < params.length; i++) {
+            var paramDesc = parameterType(i).describeConstable();
+            if (paramDesc.isEmpty())
+                return Optional.empty();
+            params[i] = paramDesc.get();
         }
+        return Optional.of(MethodTypeDesc.of(retDesc.get(), params));
     }
 
     //--- Serialization.
diff --git a/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java b/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java
index 3499fd83525..29896fd8f93 100644
--- a/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java
+++ b/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java
@@ -27,6 +27,7 @@
 
 import jdk.internal.access.JavaLangAccess;
 import jdk.internal.access.SharedSecrets;
+import jdk.internal.constant.ConstantUtils;
 import jdk.internal.misc.VM;
 import jdk.internal.util.ClassFileDumper;
 import jdk.internal.vm.annotation.Stable;
@@ -1090,13 +1091,13 @@ private SimpleStringBuilderStrategy() {
         private static MethodHandle generate(Lookup lookup, MethodType args, String[] constants) throws Exception {
             String className = getClassName(lookup.lookupClass());
 
-            byte[] classBytes = ClassFile.of().build(ClassDesc.of(className),
+            byte[] classBytes = ClassFile.of().build(ConstantUtils.binaryNameToDesc(className),
                     new Consumer<ClassBuilder>() {
                         @Override
                         public void accept(ClassBuilder clb) {
                             clb.withFlags(AccessFlag.FINAL, AccessFlag.SUPER, AccessFlag.SYNTHETIC)
                                 .withMethodBody(METHOD_NAME,
-                                        MethodTypeDesc.ofDescriptor(args.toMethodDescriptorString()),
+                                        ConstantUtils.methodTypeDesc(args),
                                         ClassFile.ACC_FINAL | ClassFile.ACC_PRIVATE | ClassFile.ACC_STATIC,
                                         generateMethod(constants, args));
                     }});
diff --git a/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java b/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java
index e49094073c3..7a1419f03b1 100644
--- a/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java
+++ b/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java
@@ -25,176 +25,103 @@
 
 package java.lang.invoke;
 
-import jdk.internal.org.objectweb.asm.MethodVisitor;
-import jdk.internal.org.objectweb.asm.Opcodes;
-import jdk.internal.org.objectweb.asm.Type;
-import sun.invoke.util.BytecodeDescriptor;
+import java.lang.constant.ClassDesc;
+import java.lang.classfile.CodeBuilder;
+import java.lang.classfile.TypeKind;
+import java.lang.classfile.constantpool.ConstantPoolBuilder;
+import java.lang.classfile.constantpool.MethodRefEntry;
+import jdk.internal.constant.MethodTypeDescImpl;
+import jdk.internal.constant.ReferenceClassDescImpl;
 import sun.invoke.util.Wrapper;
-import static sun.invoke.util.Wrapper.*;
 
-class TypeConvertingMethodAdapter extends MethodVisitor {
+import static java.lang.constant.ConstantDescs.*;
 
-    TypeConvertingMethodAdapter(MethodVisitor mv) {
-        super(Opcodes.ASM7, mv);
-    }
-
-    private static final int NUM_WRAPPERS = Wrapper.COUNT;
-
-    private static final String NAME_OBJECT = "java/lang/Object";
-    private static final String WRAPPER_PREFIX = "Ljava/lang/";
-
-    // Same for all primitives; name of the boxing method
-    private static final String NAME_BOX_METHOD = "valueOf";
-
-    // Table of opcodes for widening primitive conversions; NOP = no conversion
-    private static final int[][] wideningOpcodes = new int[NUM_WRAPPERS][NUM_WRAPPERS];
-
-    private static final Wrapper[] FROM_WRAPPER_NAME = new Wrapper[16];
-
-    // Table of wrappers for primitives, indexed by ASM type sorts
-    private static final Wrapper[] FROM_TYPE_SORT = new Wrapper[12];
-
-    static {
-        for (Wrapper w : Wrapper.values()) {
-            if (w.basicTypeChar() != 'L') {
-                int wi = hashWrapperName(w.wrapperSimpleName());
-                assert (FROM_WRAPPER_NAME[wi] == null);
-                FROM_WRAPPER_NAME[wi] = w;
-            }
-        }
-
-        // wideningOpcodes[][] will be NOP-initialized by default
-        assert(Opcodes.NOP == 0);
+class TypeConvertingMethodAdapter {
 
-        initWidening(LONG,   Opcodes.I2L, BYTE, SHORT, INT, CHAR);
-        initWidening(LONG,   Opcodes.F2L, FLOAT);
-        initWidening(FLOAT,  Opcodes.I2F, BYTE, SHORT, INT, CHAR);
-        initWidening(FLOAT,  Opcodes.L2F, LONG);
-        initWidening(DOUBLE, Opcodes.I2D, BYTE, SHORT, INT, CHAR);
-        initWidening(DOUBLE, Opcodes.F2D, FLOAT);
-        initWidening(DOUBLE, Opcodes.L2D, LONG);
+    private static class BoxHolder {
+        private static final ConstantPoolBuilder CP = ConstantPoolBuilder.of();
 
-        FROM_TYPE_SORT[Type.BYTE] = Wrapper.BYTE;
-        FROM_TYPE_SORT[Type.SHORT] = Wrapper.SHORT;
-        FROM_TYPE_SORT[Type.INT] = Wrapper.INT;
-        FROM_TYPE_SORT[Type.LONG] = Wrapper.LONG;
-        FROM_TYPE_SORT[Type.CHAR] = Wrapper.CHAR;
-        FROM_TYPE_SORT[Type.FLOAT] = Wrapper.FLOAT;
-        FROM_TYPE_SORT[Type.DOUBLE] = Wrapper.DOUBLE;
-        FROM_TYPE_SORT[Type.BOOLEAN] = Wrapper.BOOLEAN;
-    }
-
-    private static void initWidening(Wrapper to, int opcode, Wrapper... from) {
-        for (Wrapper f : from) {
-            wideningOpcodes[f.ordinal()][to.ordinal()] = opcode;
+        private static MethodRefEntry box(ClassDesc primitive, ClassDesc target) {
+            return CP.methodRefEntry(target, "valueOf", MethodTypeDescImpl.ofValidated(target, primitive));
         }
-    }
 
-    /**
-     * Class name to Wrapper hash, derived from Wrapper.hashWrap()
-     * @param xn
-     * @return The hash code 0-15
-     */
-    private static int hashWrapperName(String xn) {
-        if (xn.length() < 3) {
-            return 0;
+        private static final MethodRefEntry BOX_BOOLEAN = box(CD_boolean, CD_Boolean),
+                                            BOX_BYTE    = box(CD_byte, CD_Byte),
+                                            BOX_SHORT   = box(CD_short, CD_Short),
+                                            BOX_CHAR    = box(CD_char, CD_Character),
+                                            BOX_INT     = box(CD_int, CD_Integer),
+                                            BOX_LONG    = box(CD_long, CD_Long),
+                                            BOX_FLOAT   = box(CD_float, CD_Float),
+                                            BOX_DOUBLE  = box(CD_double, CD_Double);
+
+        private static MethodRefEntry unbox(ClassDesc owner, String methodName, ClassDesc primitiveTarget) {
+            return CP.methodRefEntry(owner, methodName, MethodTypeDescImpl.ofValidated(primitiveTarget));
         }
-        return (3 * xn.charAt(1) + xn.charAt(2)) % 16;
-    }
-
-    private Wrapper wrapperOrNullFromDescriptor(String desc) {
-        if (!desc.startsWith(WRAPPER_PREFIX)) {
-            // Not a class type (array or method), so not a boxed type
-            // or not in the right package
-            return null;
-        }
-        // Pare it down to the simple class name
-        String cname = desc.substring(WRAPPER_PREFIX.length(), desc.length() - 1);
-        // Hash to a Wrapper
-        Wrapper w = FROM_WRAPPER_NAME[hashWrapperName(cname)];
-        if (w == null || w.wrapperSimpleName().equals(cname)) {
-            return w;
-        } else {
-            return null;
-        }
-    }
 
-    private static String wrapperName(Wrapper w) {
-        return "java/lang/" + w.wrapperSimpleName();
+        private static final MethodRefEntry UNBOX_BOOLEAN = unbox(CD_Boolean, "booleanValue", CD_boolean),
+                                            UNBOX_BYTE    = unbox(CD_Number, "byteValue", CD_byte),
+                                            UNBOX_SHORT   = unbox(CD_Number, "shortValue", CD_short),
+                                            UNBOX_CHAR    = unbox(CD_Character, "charValue", CD_char),
+                                            UNBOX_INT     = unbox(CD_Number, "intValue", CD_int),
+                                            UNBOX_LONG    = unbox(CD_Number, "longValue", CD_long),
+                                            UNBOX_FLOAT   = unbox(CD_Number, "floatValue", CD_float),
+                                            UNBOX_DOUBLE  = unbox(CD_Number, "doubleValue", CD_double);
     }
 
-    private static String unboxMethod(Wrapper w) {
-        return w.primitiveSimpleName() + "Value";
+    private static TypeKind primitiveTypeKindFromClass(Class<?> type) {
+        if (type == Integer.class)   return TypeKind.IntType;
+        if (type == Long.class)      return TypeKind.LongType;
+        if (type == Boolean.class)   return TypeKind.BooleanType;
+        if (type == Short.class)     return TypeKind.ShortType;
+        if (type == Byte.class)      return TypeKind.ByteType;
+        if (type == Character.class) return TypeKind.CharType;
+        if (type == Float.class)     return TypeKind.FloatType;
+        if (type == Double.class)    return TypeKind.DoubleType;
+        return null;
     }
 
-    private static String boxingDescriptor(Wrapper w) {
-        return "(" + w.basicTypeChar() + ")L" + wrapperName(w) + ";";
+    static void boxIfTypePrimitive(CodeBuilder cob, TypeKind tk) {
+        box(cob, tk);
     }
 
-    private static String unboxingDescriptor(Wrapper w) {
-        return "()" + w.basicTypeChar();
-    }
-
-    void boxIfTypePrimitive(Type t) {
-        Wrapper w = FROM_TYPE_SORT[t.getSort()];
-        if (w != null) {
-            box(w);
-        }
-    }
-
-    void widen(Wrapper ws, Wrapper wt) {
+    static void widen(CodeBuilder cob, TypeKind ws, TypeKind wt) {
+        ws = ws.asLoadable();
+        wt = wt.asLoadable();
         if (ws != wt) {
-            int opcode = wideningOpcodes[ws.ordinal()][wt.ordinal()];
-            if (opcode != Opcodes.NOP) {
-                visitInsn(opcode);
-            }
+            cob.conversion(ws, wt);
         }
     }
 
-    void box(Wrapper w) {
-        visitMethodInsn(Opcodes.INVOKESTATIC,
-                wrapperName(w),
-                NAME_BOX_METHOD,
-                boxingDescriptor(w), false);
-    }
-
-    /**
-     * Convert types by unboxing. The source type is known to be a primitive wrapper.
-     * @param sname A primitive wrapper corresponding to wrapped reference source type
-     * @param wt A primitive wrapper being converted to
-     */
-    void unbox(String sname, Wrapper wt) {
-        visitMethodInsn(Opcodes.INVOKEVIRTUAL,
-                sname,
-                unboxMethod(wt),
-                unboxingDescriptor(wt), false);
-    }
-
-    private String descriptorToName(String desc) {
-        int last = desc.length() - 1;
-        if (desc.charAt(0) == 'L' && desc.charAt(last) == ';') {
-            // In descriptor form
-            return desc.substring(1, last);
-        } else {
-            // Already in internal name form
-            return desc;
+    static void box(CodeBuilder cob, TypeKind tk) {
+        switch (tk) {
+            case BooleanType -> cob.invokestatic(BoxHolder.BOX_BOOLEAN);
+            case ByteType    -> cob.invokestatic(BoxHolder.BOX_BYTE);
+            case CharType    -> cob.invokestatic(BoxHolder.BOX_CHAR);
+            case DoubleType  -> cob.invokestatic(BoxHolder.BOX_DOUBLE);
+            case FloatType   -> cob.invokestatic(BoxHolder.BOX_FLOAT);
+            case IntType     -> cob.invokestatic(BoxHolder.BOX_INT);
+            case LongType    -> cob.invokestatic(BoxHolder.BOX_LONG);
+            case ShortType   -> cob.invokestatic(BoxHolder.BOX_SHORT);
         }
     }
 
-    void cast(String ds, String dt) {
-        String ns = descriptorToName(ds);
-        String nt = descriptorToName(dt);
-        if (!nt.equals(ns) && !nt.equals(NAME_OBJECT)) {
-            visitTypeInsn(Opcodes.CHECKCAST, nt);
+    static void unbox(CodeBuilder cob, TypeKind to) {
+        switch (to) {
+            case BooleanType -> cob.invokevirtual(BoxHolder.UNBOX_BOOLEAN);
+            case ByteType    -> cob.invokevirtual(BoxHolder.UNBOX_BYTE);
+            case CharType    -> cob.invokevirtual(BoxHolder.UNBOX_CHAR);
+            case DoubleType  -> cob.invokevirtual(BoxHolder.UNBOX_DOUBLE);
+            case FloatType   -> cob.invokevirtual(BoxHolder.UNBOX_FLOAT);
+            case IntType     -> cob.invokevirtual(BoxHolder.UNBOX_INT);
+            case LongType    -> cob.invokevirtual(BoxHolder.UNBOX_LONG);
+            case ShortType   -> cob.invokevirtual(BoxHolder.UNBOX_SHORT);
         }
     }
 
-    private Wrapper toWrapper(String desc) {
-        char first = desc.charAt(0);
-        if (first == '[' || first == '(') {
-            first = 'L';
+    static void cast(CodeBuilder cob, ClassDesc dt) {
+        if (!dt.equals(CD_Object)) {
+            cob.checkcast(dt);
         }
-        return Wrapper.forBasicType(first);
     }
 
     /**
@@ -204,7 +131,7 @@ private Wrapper toWrapper(String desc) {
      * @param target
      * @param functional
      */
-    void convertType(Class<?> arg, Class<?> target, Class<?> functional) {
+    static void convertType(CodeBuilder cob, Class<?> arg, Class<?> target, Class<?> functional) {
         if (arg.equals(target) && arg.equals(functional)) {
             return;
         }
@@ -212,84 +139,69 @@ void convertType(Class<?> arg, Class<?> target, Class<?> functional) {
             return;
         }
         if (arg.isPrimitive()) {
-            Wrapper wArg = Wrapper.forPrimitiveType(arg);
             if (target.isPrimitive()) {
                 // Both primitives: widening
-                widen(wArg, Wrapper.forPrimitiveType(target));
+                widen(cob, TypeKind.from(arg), TypeKind.from(target));
             } else {
                 // Primitive argument to reference target
-                String dTarget = BytecodeDescriptor.unparse(target);
-                Wrapper wPrimTarget = wrapperOrNullFromDescriptor(dTarget);
-                if (wPrimTarget != null) {
+                TypeKind wPrimTk = primitiveTypeKindFromClass(target);
+                if (wPrimTk != null) {
                     // The target is a boxed primitive type, widen to get there before boxing
-                    widen(wArg, wPrimTarget);
-                    box(wPrimTarget);
+                    widen(cob, TypeKind.from(arg), wPrimTk);
+                    box(cob, wPrimTk);
                 } else {
                     // Otherwise, box and cast
-                    box(wArg);
-                    cast(wrapperName(wArg), dTarget);
+                    box(cob, TypeKind.from(arg));
+                    cast(cob, classDesc(target));
                 }
             }
         } else {
-            String dArg = BytecodeDescriptor.unparse(arg);
-            String dSrc;
-            if (functional.isPrimitive()) {
-                dSrc = dArg;
+            Class<?> src;
+            if (arg == functional || functional.isPrimitive()) {
+                src = arg;
             } else {
                 // Cast to convert to possibly more specific type, and generate CCE for invalid arg
-                dSrc = BytecodeDescriptor.unparse(functional);
-                cast(dArg, dSrc);
+                src = functional;
+                cast(cob, classDesc(functional));
             }
-            String dTarget = BytecodeDescriptor.unparse(target);
             if (target.isPrimitive()) {
-                Wrapper wTarget = toWrapper(dTarget);
                 // Reference argument to primitive target
-                Wrapper wps = wrapperOrNullFromDescriptor(dSrc);
+                TypeKind wps = primitiveTypeKindFromClass(src);
                 if (wps != null) {
-                    if (wps.isSigned() || wps.isFloating()) {
+                    if (src != Character.class && src != Boolean.class) {
                         // Boxed number to primitive
-                        unbox(wrapperName(wps), wTarget);
+                        unbox(cob, TypeKind.from(target));
                     } else {
                         // Character or Boolean
-                        unbox(wrapperName(wps), wps);
-                        widen(wps, wTarget);
+                        unbox(cob, wps);
+                        widen(cob, wps, TypeKind.from(target));
                     }
                 } else {
                     // Source type is reference type, but not boxed type,
                     // assume it is super type of target type
-                    String intermediate;
-                    if (wTarget.isSigned() || wTarget.isFloating()) {
-                        // Boxed number to primitive
-                        intermediate = "java/lang/Number";
+                    if (target == char.class) {
+                        cast(cob, CD_Character);
+                    } else if (target == boolean.class) {
+                        cast(cob, CD_Boolean);
                     } else {
-                        // Character or Boolean
-                        intermediate = wrapperName(wTarget);
+                        // Boxed number to primitive
+                        cast(cob, CD_Number);
                     }
-                    cast(dSrc, intermediate);
-                    unbox(intermediate, wTarget);
+                    unbox(cob, TypeKind.from(target));
                 }
             } else {
                 // Both reference types: just case to target type
-                cast(dSrc, dTarget);
+                if (src != target) {
+                    cast(cob, classDesc(target));
+                }
             }
         }
     }
 
-    /**
-     * The following method is copied from
-     * org.objectweb.asm.commons.InstructionAdapter. Part of ASM: a very small
-     * and fast Java bytecode manipulation framework.
-     * Copyright (c) 2000-2005 INRIA, France Telecom All rights reserved.
-     */
-    void iconst(final int cst) {
-        if (cst >= -1 && cst <= 5) {
-            mv.visitInsn(Opcodes.ICONST_0 + cst);
-        } else if (cst >= Byte.MIN_VALUE && cst <= Byte.MAX_VALUE) {
-            mv.visitIntInsn(Opcodes.BIPUSH, cst);
-        } else if (cst >= Short.MIN_VALUE && cst <= Short.MAX_VALUE) {
-            mv.visitIntInsn(Opcodes.SIPUSH, cst);
-        } else {
-            mv.visitLdcInsn(cst);
-        }
+    static ClassDesc classDesc(Class<?> cls) {
+        return cls.isPrimitive() ? Wrapper.forPrimitiveType(cls).basicClassDescriptor()
+             : cls == Object.class ? CD_Object
+             : cls == String.class ? CD_String
+             : ReferenceClassDescImpl.ofValidated(cls.descriptorString());
     }
 }
diff --git a/src/java.base/share/classes/java/lang/invoke/VarHandles.java b/src/java.base/share/classes/java/lang/invoke/VarHandles.java
index bd608619e58..95b5a01550f 100644
--- a/src/java.base/share/classes/java/lang/invoke/VarHandles.java
+++ b/src/java.base/share/classes/java/lang/invoke/VarHandles.java
@@ -25,7 +25,6 @@
 
 package java.lang.invoke;
 
-import jdk.internal.foreign.Utils;
 import sun.invoke.util.Wrapper;
 
 import java.lang.reflect.Constructor;
@@ -36,8 +35,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import java.util.stream.Stream;
 
 import static java.lang.invoke.MethodHandleStatics.UNSAFE;
@@ -47,13 +44,6 @@
 
 final class VarHandles {
 
-    static ClassValue<ConcurrentMap<Integer, MethodHandle>> ADDRESS_FACTORIES = new ClassValue<>() {
-        @Override
-        protected ConcurrentMap<Integer, MethodHandle> computeValue(Class<?> type) {
-            return new ConcurrentHashMap<>();
-        }
-    };
-
     static VarHandle makeFieldHandle(MemberName f, Class<?> refc, boolean isWriteAllowedOnFinalFields) {
         if (!f.isStatic()) {
             long foffset = MethodHandleNatives.objectFieldOffset(f);
diff --git a/src/java.base/share/classes/java/lang/ref/Reference.java b/src/java.base/share/classes/java/lang/ref/Reference.java
index f29a293ce02..747aa64902f 100644
--- a/src/java.base/share/classes/java/lang/ref/Reference.java
+++ b/src/java.base/share/classes/java/lang/ref/Reference.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -521,8 +521,6 @@ public boolean enqueue() {
      *
      * @return never returns normally
      * @throws  CloneNotSupportedException always
-     *
-     * @since 11
      */
     @Override
     protected Object clone() throws CloneNotSupportedException {
diff --git a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java
index 776f5df4e5a..2e56d03c6ad 100644
--- a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java
+++ b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java
@@ -47,10 +47,9 @@
 import static java.lang.classfile.ClassFile.*;
 import java.lang.classfile.attribute.StackMapFrameInfo;
 import java.lang.classfile.attribute.StackMapTableAttribute;
-import java.lang.constant.ConstantDescs;
+
 import static java.lang.constant.ConstantDescs.*;
-import java.lang.constant.DirectMethodHandleDesc;
-import java.lang.constant.DynamicConstantDesc;
+import static jdk.internal.constant.ConstantUtils.*;
 
 /**
  * ProxyGenerator contains the code to generate a dynamic proxy class
@@ -65,7 +64,10 @@ final class ProxyGenerator {
             ClassFile.of(ClassFile.StackMapsOption.DROP_STACK_MAPS);
 
     private static final ClassDesc
+            CD_ClassLoader = ReferenceClassDescImpl.ofValidated("Ljava/lang/ClassLoader;"),
             CD_Class_array = ReferenceClassDescImpl.ofValidated("[Ljava/lang/Class;"),
+            CD_ClassNotFoundException = ReferenceClassDescImpl.ofValidated("Ljava/lang/ClassNotFoundException;"),
+            CD_NoClassDefFoundError = ReferenceClassDescImpl.ofValidated("Ljava/lang/NoClassDefFoundError;"),
             CD_IllegalAccessException = ReferenceClassDescImpl.ofValidated("Ljava/lang/IllegalAccessException;"),
             CD_InvocationHandler = ReferenceClassDescImpl.ofValidated("Ljava/lang/reflect/InvocationHandler;"),
             CD_Method = ReferenceClassDescImpl.ofValidated("Ljava/lang/reflect/Method;"),
@@ -81,8 +83,9 @@ final class ProxyGenerator {
             MTD_void_String = MethodTypeDescImpl.ofValidated(CD_void, CD_String),
             MTD_void_Throwable = MethodTypeDescImpl.ofValidated(CD_void, CD_Throwable),
             MTD_Class = MethodTypeDescImpl.ofValidated(CD_Class),
-            MTD_Class_array = MethodTypeDescImpl.ofValidated(CD_Class_array),
-            MTD_Method_String_Class_array = MethodTypeDescImpl.ofValidated(CD_Method, ConstantDescs.CD_String, CD_Class_array),
+            MTD_Class_String_boolean_ClassLoader = MethodTypeDescImpl.ofValidated(CD_Class, CD_String, CD_boolean, CD_ClassLoader),
+            MTD_ClassLoader = MethodTypeDescImpl.ofValidated(CD_ClassLoader),
+            MTD_Method_String_Class_array = MethodTypeDescImpl.ofValidated(CD_Method, CD_String, CD_Class_array),
             MTD_MethodHandles$Lookup = MethodTypeDescImpl.ofValidated(CD_MethodHandles_Lookup),
             MTD_MethodHandles$Lookup_MethodHandles$Lookup = MethodTypeDescImpl.ofValidated(CD_MethodHandles_Lookup, CD_MethodHandles_Lookup),
             MTD_Object_Object_Method_ObjectArray = MethodTypeDescImpl.ofValidated(CD_Object, CD_Object, CD_Method, CD_Object_array),
@@ -107,34 +110,33 @@ final class ProxyGenerator {
                             "jdk.proxy.ProxyGenerator.saveGeneratedFiles"));
 
     /* Preloaded ProxyMethod objects for methods in java.lang.Object */
-    private static final ProxyMethod HASH_CODE_METHOD;
-    private static final ProxyMethod EQUALS_METHOD;
-    private static final ProxyMethod TO_STRING_METHOD;
+    private static final Method OBJECT_HASH_CODE_METHOD;
+    private static final Method OBJECT_EQUALS_METHOD;
+    private static final Method OBJECT_TO_STRING_METHOD;
 
     static {
         try {
-            HASH_CODE_METHOD = new ProxyMethod(Object.class.getMethod("hashCode"));
-            EQUALS_METHOD = new ProxyMethod(Object.class.getMethod("equals", Object.class));
-            TO_STRING_METHOD = new ProxyMethod(Object.class.getMethod("toString"));
+            OBJECT_HASH_CODE_METHOD = Object.class.getMethod("hashCode");
+            OBJECT_EQUALS_METHOD = Object.class.getMethod("equals", Object.class);
+            OBJECT_TO_STRING_METHOD = Object.class.getMethod("toString");
         } catch (NoSuchMethodException e) {
             throw new NoSuchMethodError(e.getMessage());
         }
     }
 
     private final ConstantPoolBuilder cp;
-    private final List<StackMapFrameInfo.VerificationTypeInfo> throwableStack;
+    private final List<StackMapFrameInfo.VerificationTypeInfo> classLoaderLocal, throwableStack;
     private final NameAndTypeEntry exInit;
-    private final ClassEntry object, proxy, ute;
+    private final ClassEntry objectCE, proxyCE, uteCE, classCE;
     private final FieldRefEntry handlerField;
-    private final InterfaceMethodRefEntry invoke;
-    private final MethodRefEntry uteInit;
-    private final DirectMethodHandleDesc bsm;
+    private final InterfaceMethodRefEntry invocationHandlerInvoke;
+    private final MethodRefEntry uteInit, classGetMethod, classForName, throwableGetMessage;
 
 
     /**
-     * Name of proxy class
+     * ClassEntry for this proxy class
      */
-    private ClassEntry classEntry;
+    private final ClassEntry thisClassCE;
 
     /**
      * Proxy interfaces
@@ -153,6 +155,12 @@ final class ProxyGenerator {
      */
     private final Map<String, List<ProxyMethod>> proxyMethods = new LinkedHashMap<>();
 
+    /**
+     * Ordinal of next ProxyMethod object added to proxyMethods.
+     * Indexes are reserved for hashcode(0), equals(1), toString(2).
+     */
+    private int proxyMethodCount = 3;
+
     /**
      * Construct a ProxyGenerator to generate a proxy class with the
      * specified name and for the given interfaces.
@@ -160,21 +168,26 @@ final class ProxyGenerator {
      * A ProxyGenerator object contains the state for the ongoing
      * generation of a particular proxy class.
      */
-    private ProxyGenerator(ClassLoader loader, String className, List<Class<?>> interfaces,
+    private ProxyGenerator(String className, List<Class<?>> interfaces,
                            int accessFlags) {
         this.cp = ConstantPoolBuilder.of();
-        this.classEntry = cp.classEntry(ReferenceClassDescImpl.ofValidatedBinaryName(className));
+        this.thisClassCE = cp.classEntry(ConstantUtils.binaryNameToDesc(className));
         this.interfaces = interfaces;
         this.accessFlags = accessFlags;
-        this.throwableStack = List.of(StackMapFrameInfo.ObjectVerificationTypeInfo.of(cp.classEntry(CD_Throwable)));
+        var throwable = cp.classEntry(CD_Throwable);
+        this.classLoaderLocal = List.of(StackMapFrameInfo.ObjectVerificationTypeInfo.of(cp.classEntry(CD_ClassLoader)));
+        this.throwableStack = List.of(StackMapFrameInfo.ObjectVerificationTypeInfo.of(throwable));
         this.exInit = cp.nameAndTypeEntry(INIT_NAME, MTD_void_String);
-        this.object = cp.classEntry(CD_Object);
-        this.proxy = cp.classEntry(CD_Proxy);
-        this.handlerField = cp.fieldRefEntry(proxy, cp.nameAndTypeEntry(NAME_HANDLER_FIELD, CD_InvocationHandler));
-        this.invoke = cp.interfaceMethodRefEntry(CD_InvocationHandler, "invoke", MTD_Object_Object_Method_ObjectArray);
-        this.ute = cp.classEntry(CD_UndeclaredThrowableException);
-        this.uteInit = cp.methodRefEntry(ute, cp.nameAndTypeEntry(INIT_NAME, MTD_void_Throwable));
-        this.bsm = ConstantDescs.ofConstantBootstrap(classEntry.asSymbol(), "$getMethod", CD_Method, CD_Class, CD_String, CD_MethodType);
+        this.objectCE = cp.classEntry(CD_Object);
+        this.proxyCE = cp.classEntry(CD_Proxy);
+        this.classCE = cp.classEntry(CD_Class);
+        this.handlerField = cp.fieldRefEntry(proxyCE, cp.nameAndTypeEntry(NAME_HANDLER_FIELD, CD_InvocationHandler));
+        this.invocationHandlerInvoke = cp.interfaceMethodRefEntry(CD_InvocationHandler, "invoke", MTD_Object_Object_Method_ObjectArray);
+        this.uteCE = cp.classEntry(CD_UndeclaredThrowableException);
+        this.uteInit = cp.methodRefEntry(uteCE, cp.nameAndTypeEntry(INIT_NAME, MTD_void_Throwable));
+        this.classGetMethod = cp.methodRefEntry(classCE, cp.nameAndTypeEntry("getMethod", MTD_Method_String_Class_array));
+        this.classForName = cp.methodRefEntry(classCE, cp.nameAndTypeEntry("forName", MTD_Class_String_boolean_ClassLoader));
+        this.throwableGetMessage = cp.methodRefEntry(throwable, cp.nameAndTypeEntry("getMessage", MTD_String));
     }
 
     /**
@@ -190,7 +203,7 @@ static byte[] generateProxyClass(ClassLoader loader,
                                      List<Class<?>> interfaces,
                                      int accessFlags) {
         Objects.requireNonNull(interfaces);
-        ProxyGenerator gen = new ProxyGenerator(loader, name, interfaces, accessFlags);
+        ProxyGenerator gen = new ProxyGenerator(name, interfaces, accessFlags);
         final byte[] classFile = gen.generateClassFile();
 
         if (SAVE_GENERATED_FILES) {
@@ -227,18 +240,10 @@ public Void run() {
     private static List<ClassEntry> toClassEntries(ConstantPoolBuilder cp, List<Class<?>> types) {
         var ces = new ArrayList<ClassEntry>(types.size());
         for (var t : types)
-            ces.add(cp.classEntry(ReferenceClassDescImpl.ofValidatedBinaryName(t.getName())));
+            ces.add(cp.classEntry(ConstantUtils.binaryNameToDesc(t.getName())));
         return ces;
     }
 
-    /**
-     * {@return the {@code ClassDesc} of the given type}
-     * @param type the {@code Class} object
-     */
-    private static ClassDesc toClassDesc(Class<?> type) {
-        return ClassDesc.ofDescriptor(type.descriptorString());
-    }
-
     /**
      * For a given set of proxy methods with the same signature, check
      * that their return types are compatible according to the Proxy
@@ -325,7 +330,7 @@ private static void checkReturnTypes(List<ProxyMethod> methods) {
          * not assignable from any of the others.
          */
         if (uncoveredReturnTypes.size() > 1) {
-            ProxyMethod pm = methods.get(0);
+            ProxyMethod pm = methods.getFirst();
             throw new IllegalArgumentException(
                     "methods with same signature " +
                             pm.shortSignature +
@@ -441,9 +446,9 @@ private byte[] generateClassFile() {
          * java.lang.Object take precedence over duplicate methods in the
          * proxy interfaces.
          */
-        addProxyMethod(HASH_CODE_METHOD);
-        addProxyMethod(EQUALS_METHOD);
-        addProxyMethod(TO_STRING_METHOD);
+        addProxyMethod(new ProxyMethod(OBJECT_HASH_CODE_METHOD, "m0"));
+        addProxyMethod(new ProxyMethod(OBJECT_EQUALS_METHOD, "m1"));
+        addProxyMethod(new ProxyMethod(OBJECT_TO_STRING_METHOD, "m2"));
 
         /*
          * Accumulate all of the methods from the proxy interfaces.
@@ -464,20 +469,23 @@ private byte[] generateClassFile() {
             checkReturnTypes(sigmethods);
         }
 
-        return CF_CONTEXT.build(classEntry, cp, clb -> {
-            clb.withSuperclass(proxy);
+        return CF_CONTEXT.build(thisClassCE, cp, clb -> {
+            clb.withSuperclass(proxyCE);
             clb.withFlags(accessFlags);
             clb.withInterfaces(toClassEntries(cp, interfaces));
             generateConstructor(clb);
 
             for (List<ProxyMethod> sigmethods : proxyMethods.values()) {
                 for (ProxyMethod pm : sigmethods) {
+                    // add static field for the Method object
+                    clb.withField(pm.methodFieldName, CD_Method, ACC_PRIVATE | ACC_STATIC | ACC_FINAL);
+
                     // Generate code for proxy method
-                    pm.generateMethod(this, clb);
+                    pm.generateMethod(clb);
                 }
             }
 
-            generateBootstrapMethod(clb);
+            generateStaticInitializer(clb);
             generateLookupAccessor(clb);
         });
     }
@@ -500,8 +508,7 @@ private void addProxyMethod(Method m, Class<?> fromClass) {
         Class<?>[] exceptionTypes = m.getSharedExceptionTypes();
 
         String sig = m.toShortSignature();
-        List<ProxyMethod> sigmethods = proxyMethods.computeIfAbsent(sig,
-                (f) -> new ArrayList<>(3));
+        List<ProxyMethod> sigmethods = proxyMethodsFor(sig);
         for (ProxyMethod pm : sigmethods) {
             if (returnType == pm.returnType) {
                 /*
@@ -520,7 +527,11 @@ private void addProxyMethod(Method m, Class<?> fromClass) {
             }
         }
         sigmethods.add(new ProxyMethod(m, sig, m.getSharedParameterTypes(), returnType,
-                exceptionTypes, fromClass));
+                exceptionTypes, fromClass, "m" + proxyMethodCount++));
+    }
+
+    private List<ProxyMethod> proxyMethodsFor(String sig) {
+        return proxyMethods.computeIfAbsent(sig, _ -> new ArrayList<>(3));
     }
 
     /**
@@ -529,10 +540,7 @@ private void addProxyMethod(Method m, Class<?> fromClass) {
      * @param pm an existing ProxyMethod
      */
     private void addProxyMethod(ProxyMethod pm) {
-        String sig = pm.shortSignature;
-        List<ProxyMethod> sigmethods = proxyMethods.computeIfAbsent(sig,
-                (f) -> new ArrayList<>(3));
-        sigmethods.add(pm);
+        proxyMethodsFor(pm.shortSignature).add(pm);
     }
 
     /**
@@ -542,32 +550,56 @@ private void generateConstructor(ClassBuilder clb) {
         clb.withMethodBody(INIT_NAME, MTD_void_InvocationHandler, ACC_PUBLIC, cob -> cob
                .aload(0)
                .aload(1)
-               .invokespecial(cp.methodRefEntry(proxy, cp.nameAndTypeEntry(INIT_NAME, MTD_void_InvocationHandler)))
+               .invokespecial(cp.methodRefEntry(proxyCE,
+                   cp.nameAndTypeEntry(INIT_NAME, MTD_void_InvocationHandler)))
                .return_());
     }
 
     /**
-     * Generate CONDY bootstrap method for the proxy class to retrieve {@link Method} instances.
+     * Generate the class initializer.
+     * Discussion: Currently, for Proxy to work with SecurityManager,
+     * we rely on the parameter classes of the methods to be computed
+     * from Proxy instead of via user code paths like bootstrap method
+     * lazy evaluation. That might change if we can pass in the live
+     * Method objects directly..
      */
-    private void generateBootstrapMethod(ClassBuilder clb) {
-        clb.withMethodBody(bsm.methodName(), bsm.invocationType(), ClassFile.ACC_PRIVATE | ClassFile.ACC_STATIC, cob -> {
-            cob.aload(3) //interface Class
-               .aload(4) //interface method name String
-               .aload(5) //interface MethodType
-               .invokevirtual(CD_MethodType, "parameterArray", MTD_Class_array)
-               .invokevirtual(ConstantDescs.CD_Class, "getMethod", MTD_Method_String_Class_array)
-               .areturn();
-            Label failLabel = cob.newBoundLabel();
-            ClassEntry nsme = cp.classEntry(CD_NoSuchMethodError);
-            cob.exceptionCatch(cob.startLabel(), failLabel, failLabel, CD_NoSuchMethodException)
-               .new_(nsme)
+    private void generateStaticInitializer(ClassBuilder clb) {
+        clb.withMethodBody(CLASS_INIT_NAME, MTD_void, ACC_STATIC, cob -> {
+            // Put ClassLoader at local variable index 0, used by
+            // Class.forName(String, boolean, ClassLoader) calls
+            cob.ldc(thisClassCE)
+               .invokevirtual(cp.methodRefEntry(classCE,
+                       cp.nameAndTypeEntry("getClassLoader", MTD_ClassLoader)))
+               .astore(0);
+            var ts = cob.newBoundLabel();
+            for (List<ProxyMethod> sigmethods : proxyMethods.values()) {
+                for (ProxyMethod pm : sigmethods) {
+                    pm.codeFieldInitialization(cob);
+                }
+            }
+            cob.return_();
+            var c1 = cob.newBoundLabel();
+            var nsmError = cp.classEntry(CD_NoSuchMethodError);
+            cob.exceptionCatch(ts, c1, c1, CD_NoSuchMethodException)
+               .new_(nsmError)
+               .dup_x1()
+               .swap()
+               .invokevirtual(throwableGetMessage)
+               .invokespecial(cp.methodRefEntry(nsmError, exInit))
+               .athrow();
+            var c2 = cob.newBoundLabel();
+            var ncdfError = cp.classEntry(CD_NoClassDefFoundError);
+            cob.exceptionCatch(ts, c1, c2, CD_ClassNotFoundException)
+               .new_(ncdfError)
                .dup_x1()
                .swap()
-               .invokevirtual(cp.methodRefEntry(CD_Throwable, "getMessage", MTD_String))
-               .invokespecial(cp.methodRefEntry(nsme, exInit))
-               .athrow()
-               .with(StackMapTableAttribute.of(List.of(
-                       StackMapFrameInfo.of(failLabel, List.of(), throwableStack))));
+               .invokevirtual(throwableGetMessage)
+               .invokespecial(cp.methodRefEntry(ncdfError, exInit))
+               .athrow();
+            cob.with(StackMapTableAttribute.of(List.of(
+                       StackMapFrameInfo.of(c1, classLoaderLocal, throwableStack),
+                       StackMapFrameInfo.of(c2, classLoaderLocal, throwableStack))));
+
         });
     }
 
@@ -587,7 +619,7 @@ private void generateLookupAccessor(ClassBuilder clb) {
                             ClassEntry iae = cp.classEntry(CD_IllegalAccessException);
                             cob.aload(cob.parameterSlot(0))
                                .invokevirtual(cp.methodRefEntry(mhl, cp.nameAndTypeEntry("lookupClass", MTD_Class)))
-                               .ldc(proxy)
+                               .ldc(proxyCE)
                                .if_acmpne(failLabel)
                                .aload(cob.parameterSlot(0))
                                .invokevirtual(cp.methodRefEntry(mhl, cp.nameAndTypeEntry("hasFullPrivilegeAccess", MTD_boolean)))
@@ -613,65 +645,61 @@ private void generateLookupAccessor(ClassBuilder clb) {
      * being generated: a method whose implementation will encode and
      * dispatch invocations to the proxy instance's invocation handler.
      */
-    private static class ProxyMethod {
+    private class ProxyMethod {
 
         private final Method method;
         private final String shortSignature;
         private final Class<?> fromClass;
         private final Class<?>[] parameterTypes;
         private final Class<?> returnType;
+        private final String methodFieldName;
         private Class<?>[] exceptionTypes;
+        private final FieldRefEntry methodField;
 
         private ProxyMethod(Method method, String sig, Class<?>[] parameterTypes,
                             Class<?> returnType, Class<?>[] exceptionTypes,
-                            Class<?> fromClass) {
+                            Class<?> fromClass, String methodFieldName) {
             this.method = method;
             this.shortSignature = sig;
             this.parameterTypes = parameterTypes;
             this.returnType = returnType;
             this.exceptionTypes = exceptionTypes;
             this.fromClass = fromClass;
+            this.methodFieldName = methodFieldName;
+            this.methodField = cp.fieldRefEntry(thisClassCE,
+                cp.nameAndTypeEntry(methodFieldName, CD_Method));
         }
 
         /**
          * Create a new specific ProxyMethod with a specific field name
          *
          * @param method          The method for which to create a proxy
-         * @param methodFieldName the fieldName to generate
          */
-        private ProxyMethod(Method method) {
+        private ProxyMethod(Method method, String methodFieldName) {
             this(method, method.toShortSignature(),
                  method.getSharedParameterTypes(), method.getReturnType(),
-                 method.getSharedExceptionTypes(), method.getDeclaringClass());
+                 method.getSharedExceptionTypes(), method.getDeclaringClass(), methodFieldName);
         }
 
         /**
          * Generate this method, including the code and exception table entry.
          */
-        private void generateMethod(ProxyGenerator pg, ClassBuilder clb) {
-            var cp = pg.cp;
-            var pTypes = new ClassDesc[parameterTypes.length];
-            for (int i = 0; i < pTypes.length; i++) {
-                pTypes[i] = toClassDesc(parameterTypes[i]);
-            }
-            MethodTypeDesc desc = MethodTypeDescImpl.ofTrusted(toClassDesc(returnType), pTypes);
+        private void generateMethod(ClassBuilder clb) {
+            var desc = methodTypeDesc(returnType, parameterTypes);
             int accessFlags = (method.isVarArgs()) ? ACC_VARARGS | ACC_PUBLIC | ACC_FINAL
                                                    : ACC_PUBLIC | ACC_FINAL;
             var catchList = computeUniqueCatchList(exceptionTypes);
             clb.withMethod(method.getName(), desc, accessFlags, mb ->
                   mb.with(ExceptionsAttribute.of(toClassEntries(cp, List.of(exceptionTypes))))
                     .withCode(cob -> {
-                        cob.aload(0)
-                           .getfield(pg.handlerField)
-                           .aload(0)
-                           .ldc(DynamicConstantDesc.of(pg.bsm,
-                                toClassDesc(fromClass),
-                                method.getName(),
-                                desc));
+                        cob.aload(cob.receiverSlot())
+                           .getfield(handlerField)
+                           .aload(cob.receiverSlot())
+                           .getstatic(methodField);
                         if (parameterTypes.length > 0) {
                             // Create an array and fill with the parameters converting primitives to wrappers
                             cob.loadConstant(parameterTypes.length)
-                               .anewarray(pg.object);
+                               .anewarray(objectCE);
                             for (int i = 0; i < parameterTypes.length; i++) {
                                 cob.dup()
                                    .loadConstant(i);
@@ -682,7 +710,7 @@ private void generateMethod(ProxyGenerator pg, ClassBuilder clb) {
                             cob.aconst_null();
                         }
 
-                        cob.invokeinterface(pg.invoke);
+                        cob.invokeinterface(invocationHandlerInvoke);
 
                         if (returnType == void.class) {
                             cob.pop()
@@ -693,19 +721,19 @@ private void generateMethod(ProxyGenerator pg, ClassBuilder clb) {
                         if (!catchList.isEmpty()) {
                             var c1 = cob.newBoundLabel();
                             for (var exc : catchList) {
-                                cob.exceptionCatch(cob.startLabel(), c1, c1, toClassDesc(exc));
+                                cob.exceptionCatch(cob.startLabel(), c1, c1, referenceClassDesc(exc));
                             }
                             cob.athrow();   // just rethrow the exception
                             var c2 = cob.newBoundLabel();
                             cob.exceptionCatchAll(cob.startLabel(), c1, c2)
-                               .new_(pg.ute)
+                               .new_(uteCE)
                                .dup_x1()
                                .swap()
-                               .invokespecial(pg.uteInit)
+                               .invokespecial(uteInit)
                                .athrow()
                                .with(StackMapTableAttribute.of(List.of(
-                                       StackMapFrameInfo.of(c1, List.of(), pg.throwableStack),
-                                       StackMapFrameInfo.of(c2, List.of(), pg.throwableStack))));
+                                    StackMapFrameInfo.of(c1, List.of(), throwableStack),
+                                    StackMapFrameInfo.of(c2, List.of(), throwableStack))));
                         }
                     }));
         }
@@ -720,7 +748,7 @@ private void codeWrapArgument(CodeBuilder cob, Class<?> type, int slot) {
             if (type.isPrimitive()) {
                 cob.loadLocal(TypeKind.from(type).asLoadable(), slot);
                 PrimitiveTypeInfo prim = PrimitiveTypeInfo.get(type);
-                cob.invokestatic(prim.wrapperMethodRef(cob.constantPool()));
+                cob.invokestatic(prim.wrapperMethodRef(cp));
             } else {
                 cob.aload(slot);
             }
@@ -736,14 +764,65 @@ private void codeUnwrapReturnValue(CodeBuilder cob, Class<?> type) {
                 PrimitiveTypeInfo prim = PrimitiveTypeInfo.get(type);
 
                 cob.checkcast(prim.wrapperClass)
-                   .invokevirtual(prim.unwrapMethodRef(cob.constantPool()))
+                   .invokevirtual(prim.unwrapMethodRef(cp))
                    .return_(TypeKind.from(type).asLoadable());
             } else {
-                cob.checkcast(toClassDesc(type))
+                cob.checkcast(referenceClassDesc(type))
                    .areturn();
             }
         }
 
+        /**
+         * Generate code for initializing the static field that stores
+         * the Method object for this proxy method. A class loader is
+         * anticipated at local variable index 0.
+         * The generated code must be run in an AccessController.doPrivileged
+         * block if a SecurityManager is present, as otherwise the code
+         * cannot pass {@code null} ClassLoader to forName.
+         */
+        private void codeFieldInitialization(CodeBuilder cob) {
+            var cp = cob.constantPool();
+            codeClassForName(cob, fromClass);
+
+            cob.ldc(method.getName())
+               .loadConstant(parameterTypes.length)
+               .anewarray(classCE);
+
+            // Construct an array with the parameter types mapping primitives to Wrapper types
+            for (int i = 0; i < parameterTypes.length; i++) {
+                cob.dup()
+                   .loadConstant(i);
+                if (parameterTypes[i].isPrimitive()) {
+                    PrimitiveTypeInfo prim = PrimitiveTypeInfo.get(parameterTypes[i]);
+                    cob.getstatic(prim.typeFieldRef(cp));
+                } else {
+                    codeClassForName(cob, parameterTypes[i]);
+                }
+                cob.aastore();
+            }
+            // lookup the method
+            cob.invokevirtual(classGetMethod)
+               .putstatic(methodField);
+        }
+
+        /*
+         * =============== Code Generation Utility Methods ===============
+         */
+
+        /**
+         * Generate code to invoke the Class.forName with the name of the given
+         * class to get its Class object at runtime.  The code is written to
+         * the supplied stream.  Note that the code generated by this method
+         * may cause the checked ClassNotFoundException to be thrown. A class
+         * loader is anticipated at local variable index 0.
+         */
+        private void codeClassForName(CodeBuilder cob, Class<?> cl) {
+            cob.ldc(cl.getName())
+               .iconst_0() // false
+               .aload(0)// classLoader
+               .invokestatic(classForName);
+        }
+
         @Override
         public String toString() {
             return method.toShortString();
@@ -810,5 +889,9 @@ public MethodRefEntry wrapperMethodRef(ConstantPoolBuilder cp) {
         public MethodRefEntry unwrapMethodRef(ConstantPoolBuilder cp) {
             return cp.methodRefEntry(wrapperClass, unwrapMethodName, unwrapMethodType);
         }
+
+        public FieldRefEntry typeFieldRef(ConstantPoolBuilder cp) {
+            return cp.fieldRefEntry(wrapperClass, "TYPE", CD_Class);
+        }
     }
 }
diff --git a/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java b/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java
index c564b7b69f6..ccb33a0e4db 100644
--- a/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java
+++ b/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java
@@ -26,7 +26,6 @@
 package java.lang.runtime;
 
 import java.lang.Enum.EnumDesc;
-import java.lang.classfile.ClassBuilder;
 import java.lang.classfile.CodeBuilder;
 import java.lang.constant.ClassDesc;
 import java.lang.constant.ConstantDesc;
@@ -50,6 +49,7 @@
 import java.lang.classfile.Label;
 import java.lang.classfile.instruction.SwitchCase;
 
+import jdk.internal.constant.ConstantUtils;
 import jdk.internal.constant.ReferenceClassDescImpl;
 import jdk.internal.misc.PreviewFeatures;
 import jdk.internal.vm.annotation.Stable;
@@ -59,6 +59,9 @@
 import java.util.HashMap;
 import java.util.Map;
 import static java.util.Objects.requireNonNull;
+import static jdk.internal.constant.ConstantUtils.classDesc;
+import static jdk.internal.constant.ConstantUtils.referenceClassDesc;
+
 import sun.invoke.util.Wrapper;
 
 /**
@@ -321,7 +324,7 @@ private static <E extends Enum<E>> Object convertEnumConstants(MethodHandles.Loo
             }
             return label;
         } else if (labelClass == String.class) {
-            return EnumDesc.of(enumClassTemplate.describeConstable().orElseThrow(), (String) label);
+            return EnumDesc.of(referenceClassDesc(enumClassTemplate), (String) label);
         } else {
             throw new IllegalArgumentException("label with illegal type found: " + labelClass +
                                                ", expected label of type either String or Class");
@@ -355,7 +358,7 @@ private static final class ResolvedEnumLabels implements BiPredicate<Integer, Ob
         private final MethodHandles.Lookup lookup;
         private final EnumDesc<?>[] enumDescs;
         @Stable
-        private Object[] resolvedEnum;
+        private final Object[] resolvedEnum;
 
         public ResolvedEnumLabels(MethodHandles.Lookup lookup, EnumDesc<?>[] enumDescs) {
             this.lookup = lookup;
@@ -419,7 +422,7 @@ private static Consumer<CodeBuilder> generateTypeSwitchSkeleton(Class<?> selecto
             cb.pop();
             cb.aload(SELECTOR_OBJ);
             Label nonNullLabel = cb.newLabel();
-            cb.if_nonnull(nonNullLabel);
+            cb.ifnonnull(nonNullLabel);
             cb.iconst_m1();
             cb.ireturn();
             cb.labelBinding(nonNullLabel);
@@ -464,10 +467,7 @@ record Element(Label target, Label next, Object caseLabel) { }
                             // Object o = ...
                             // o instanceof Wrapped(float)
                             cb.aload(SELECTOR_OBJ);
-                            cb.instanceOf(Wrapper.forBasicType(classLabel)
-                                    .wrapperType()
-                                    .describeConstable()
-                                    .orElseThrow());
+                            cb.instanceOf(Wrapper.forBasicType(classLabel).wrapperClassDescriptor());
                             cb.ifeq(next);
                         } else if (!unconditionalExactnessCheck(Wrapper.asPrimitiveType(selectorType), classLabel)) {
                             // Integer i = ... or int i = ...
@@ -515,9 +515,9 @@ record Element(Label target, Label next, Object caseLabel) { }
 
                             TypePairs typePair = TypePairs.of(Wrapper.asPrimitiveType(selectorType), classLabel);
                             String methodName = TypePairs.typePairToName.get(typePair);
-                            cb.invokestatic(ExactConversionsSupport.class.describeConstable().orElseThrow(),
+                            cb.invokestatic(referenceClassDesc(ExactConversionsSupport.class),
                                     methodName,
-                                    MethodTypeDesc.of(ConstantDescs.CD_boolean, typePair.from.describeConstable().orElseThrow()));
+                                    MethodTypeDesc.of(ConstantDescs.CD_boolean, classDesc(typePair.from)));
                             cb.ifeq(next);
                         }
                     } else {
@@ -553,7 +553,7 @@ record Element(Label target, Label next, Object caseLabel) { }
                             MethodTypeDesc.of(ConstantDescs.CD_Integer,
                                     ConstantDescs.CD_int));
                     cb.aload(SELECTOR_OBJ);
-                    cb.invokeinterface(BiPredicate.class.describeConstable().orElseThrow(),
+                    cb.invokeinterface(referenceClassDesc(BiPredicate.class),
                             "test",
                             MethodTypeDesc.of(ConstantDescs.CD_boolean,
                                     ConstantDescs.CD_Object,
@@ -601,10 +601,11 @@ record Element(Label target, Label next, Object caseLabel) { }
                     } else {
                         cb.loadConstant((ConstantDesc) element.caseLabel());
                     }
-                    cb.invokestatic(element.caseLabel().getClass().describeConstable().orElseThrow(),
+                    var caseLabelWrapper = Wrapper.forWrapperType(element.caseLabel().getClass());
+                    cb.invokestatic(caseLabelWrapper.wrapperClassDescriptor(),
                             "valueOf",
-                            MethodTypeDesc.of(element.caseLabel().getClass().describeConstable().orElseThrow(),
-                                    Wrapper.asPrimitiveType(element.caseLabel().getClass()).describeConstable().orElseThrow()));
+                            MethodTypeDesc.of(caseLabelWrapper.wrapperClassDescriptor(),
+                                    caseLabelWrapper.basicClassDescriptor()));
                     cb.aload(SELECTOR_OBJ);
                     cb.invokevirtual(ConstantDescs.CD_Object,
                             "equals",
@@ -631,7 +632,7 @@ private static MethodHandle generateTypeSwitch(MethodHandles.Lookup caller, Clas
         List<EnumDesc<?>> enumDescs = new ArrayList<>();
         List<Class<?>> extraClassLabels = new ArrayList<>();
 
-        byte[] classBytes = ClassFile.of().build(ReferenceClassDescImpl.ofValidatedBinaryName(typeSwitchClassName(caller.lookupClass())),
+        byte[] classBytes = ClassFile.of().build(ConstantUtils.binaryNameToDesc(typeSwitchClassName(caller.lookupClass())),
                 clb -> {
                     clb.withFlags(AccessFlag.FINAL, AccessFlag.SUPER, AccessFlag.SYNTHETIC)
                        .withMethodBody("typeSwitch",
diff --git a/src/java.base/share/classes/java/security/spec/ECGenParameterSpec.java b/src/java.base/share/classes/java/security/spec/ECGenParameterSpec.java
index 522c7ff7331..4d506726c9f 100644
--- a/src/java.base/share/classes/java/security/spec/ECGenParameterSpec.java
+++ b/src/java.base/share/classes/java/security/spec/ECGenParameterSpec.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -45,9 +45,9 @@ public class ECGenParameterSpec extends NamedParameterSpec {
      * of the provider whose implementation will be used.
      *
      * @param stdName the standard name of the to-be-generated EC
-     *        domain parameters. See the ParameterSpec Names section in the
+     *        domain parameters. See the ECGenParameterSpec section in the
      *        <a href=
-     *        "{@docRoot}/../specs/security/standard-names.html#parameterspec-names">
+     *        "{@docRoot}/../specs/security/standard-names.html#ecgenparameterspec">
      *        Java Security Standard Algorithm Names Specification</a> for
      *        information about standard names.
      * @throws NullPointerException if {@code stdName} is null.
diff --git a/src/java.base/share/classes/java/security/spec/NamedParameterSpec.java b/src/java.base/share/classes/java/security/spec/NamedParameterSpec.java
index ab716d54c30..296d353449b 100644
--- a/src/java.base/share/classes/java/security/spec/NamedParameterSpec.java
+++ b/src/java.base/share/classes/java/security/spec/NamedParameterSpec.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, 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,10 +30,10 @@
  * This class is used to specify any algorithm parameters that are determined
  * by a standard name. This class also holds constants for standard parameter
  * set names. The names of these constants exactly match the corresponding
- * parameter set name. For example, NamedParameterSpec.X25519 represents the
- * parameter set identified by the string "X25519". These strings are defined
- * in the <a href=
- * "{@docRoot}/../specs/security/standard-names.html#parameterspec-names">
+ * parameter set name. For example, {@code NamedParameterSpec.X25519}
+ * represents the parameter set identified by the string "X25519". These
+ * strings are defined in the <a href=
+ * "{@docRoot}/../specs/security/standard-names.html#namedparameterspec">
  *          Java Security Standard Algorithm Names Specification</a>.
  *
  * @since 11
@@ -77,9 +77,9 @@ public class NamedParameterSpec implements AlgorithmParameterSpec {
      * of the provider whose implementation will be used.
      *
      * @param stdName the standard name of the algorithm parameters. See the
-     *        ParameterSpec Names section in the
+     *        NamedParameterSpec section in the
      *        <a href=
-     *        "{@docRoot}/../specs/security/standard-names.html#parameterspec-names">
+     *        "{@docRoot}/../specs/security/standard-names.html#namedparameterspec">
      *        Java Security Standard Algorithm Names Specification</a> for
      *        information about standard names.
      *
diff --git a/src/java.base/share/classes/java/security/spec/PSSParameterSpec.java b/src/java.base/share/classes/java/security/spec/PSSParameterSpec.java
index d6f05199599..5c77089f1ca 100644
--- a/src/java.base/share/classes/java/security/spec/PSSParameterSpec.java
+++ b/src/java.base/share/classes/java/security/spec/PSSParameterSpec.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -118,8 +118,19 @@ public class PSSParameterSpec implements AlgorithmParameterSpec {
      * mask generation function, parameters for mask generation
      * function, salt length, and trailer field values.
      *
-     * @param mdName       the algorithm name of the hash function
-     * @param mgfName      the algorithm name of the mask generation function
+     * @param mdName       the algorithm name of the hash function. See the
+     *         PSSParameterSpec section of the
+     *         <a href=
+     *        "{@docRoot}/../specs/security/standard-names.html#pssparameterspec">
+     *         Java Security Standard Algorithm Names Specification</a>
+     *         for information about standard names for the hash function.
+     * @param mgfName      the algorithm name of the mask generation function.
+     *         See the PSSParameterSpec section of the
+     *         <a href=
+     *        "{@docRoot}/../specs/security/standard-names.html#pssparameterspec">
+     *         Java Security Standard Algorithm Names Specification</a>
+     *         for information about standard names for the mask generation
+     *         function.
      * @param mgfSpec      the parameters for the mask generation function.
      *         If null is specified, null will be returned by
      *         getMGFParameters().
diff --git a/src/java.base/share/classes/java/text/ChoiceFormat.java b/src/java.base/share/classes/java/text/ChoiceFormat.java
index 5d71d9d7262..ccb6cc4a04f 100644
--- a/src/java.base/share/classes/java/text/ChoiceFormat.java
+++ b/src/java.base/share/classes/java/text/ChoiceFormat.java
@@ -586,12 +586,18 @@ public Number parse(String text, ParsePosition status) {
         return Double.valueOf(bestNumber);
     }
 
+    /**
+     * @since 23
+     */
     @Override
     public boolean isStrict() {
         throw new UnsupportedOperationException(
                 "ChoiceFormat does not utilize leniency when parsing");
     }
 
+    /**
+     * @since 23
+     */
     @Override
     public void setStrict(boolean strict) {
         throw new UnsupportedOperationException(
diff --git a/src/java.base/share/classes/java/text/CompactNumberFormat.java b/src/java.base/share/classes/java/text/CompactNumberFormat.java
index cb1a9546b12..25fd9923b06 100644
--- a/src/java.base/share/classes/java/text/CompactNumberFormat.java
+++ b/src/java.base/share/classes/java/text/CompactNumberFormat.java
@@ -1724,7 +1724,7 @@ public Number parse(String text, ParsePosition pos) {
         // Call DecimalFormat.subparseNumber() method to parse the
         // number part of the input text
         position = decimalFormat.subparseNumber(text, position,
-                digitList, false, false, status);
+                digitList, false, false, status).fullPos();
 
         if (position == -1) {
             // Unable to parse the number successfully
@@ -1732,26 +1732,6 @@ public Number parse(String text, ParsePosition pos) {
             pos.errorIndex = oldStart;
             return null;
         }
-
-        // If parse integer only is true and the parsing is broken at
-        // decimal point, then pass/ignore all digits and move pointer
-        // at the start of suffix, to process the suffix part
-        if (isParseIntegerOnly() && position < text.length()
-                && text.charAt(position) == symbols.getDecimalSeparator()) {
-            position++; // Pass decimal character
-            for (; position < text.length(); ++position) {
-                char ch = text.charAt(position);
-                int digit = ch - symbols.getZeroDigit();
-                if (digit < 0 || digit > 9) {
-                    digit = Character.digit(ch, 10);
-                    // Parse all digit characters
-                    if (!(digit >= 0 && digit <= 9)) {
-                        break;
-                    }
-                }
-            }
-        }
-
         // Number parsed successfully; match prefix and
         // suffix to obtain multiplier
         pos.index = position;
@@ -2372,6 +2352,8 @@ public void setGroupingUsed(boolean newValue) {
      * parsed as the value {@code 1234000} (1234 (integer part) * 1000
      * (thousand)) and the fractional part would be skipped.
      * The exact format accepted by the parse operation is locale dependent.
+     * @implSpec This implementation does not set the {@code ParsePosition} index
+     * to the position of the decimal symbol, but rather the end of the string.
      *
      * @return {@code true} if compact numbers should be parsed as integers
      *         only; {@code false} otherwise
diff --git a/src/java.base/share/classes/java/text/DecimalFormat.java b/src/java.base/share/classes/java/text/DecimalFormat.java
index f575e86eced..1f249888a28 100644
--- a/src/java.base/share/classes/java/text/DecimalFormat.java
+++ b/src/java.base/share/classes/java/text/DecimalFormat.java
@@ -2150,10 +2150,7 @@ private void append(StringBuffer result, String string,
      *   #getGroupingSize()} is not adhered to
      *   <li> {@link #isGroupingUsed()} returns {@code false}, and the grouping
      *   symbol is found
-     *   <li> {@link #isParseIntegerOnly()} returns {@code true}, and the decimal
-     *   separator is found
-     *   <li> {@link #isGroupingUsed()} returns {@code true} and {@link
-     *   #isParseIntegerOnly()} returns {@code false}, and the grouping
+     *   <li> {@link #isGroupingUsed()} returns {@code true} and the grouping
      *   symbol occurs after the decimal separator
      *   <li> Any other characters are found, that are not the expected symbols,
      *   and are not digits that occur within the numerical portion
@@ -2379,7 +2376,8 @@ private final boolean subparse(String text, ParsePosition parsePosition,
 
         // position will serve as new index when success, otherwise it will
         // serve as errorIndex when failure
-        position = subparseNumber(text, position, digits, true, isExponent, status);
+        NumericPosition pos = subparseNumber(text, position, digits, true, isExponent, status);
+        position = pos.fullPos;
 
         // First character after the prefix was un-parseable, should
         // fail regardless if lenient or strict.
@@ -2422,9 +2420,15 @@ private final boolean subparse(String text, ParsePosition parsePosition,
                 return false;
             }
 
-            // No failures, thus increment the index by the suffix
-            parsePosition.index = position +
-                    (gotPositive ? positiveSuffix.length() : negativeSuffix.length());
+            // When parsing integer only, index should be int pos
+            // If intPos is 0, the entire value was integer
+            if (isParseIntegerOnly() && pos.intPos > 0) {
+                parsePosition.index = pos.intPos;
+            } else {
+                // increment the index by the suffix
+                parsePosition.index = position +
+                        (gotPositive ? positiveSuffix.length() : negativeSuffix.length());
+            }
         } else {
             parsePosition.index = position;
         }
@@ -2437,6 +2441,19 @@ private final boolean subparse(String text, ParsePosition parsePosition,
         return true;
     }
 
+    /**
+     * NumericPosition is a helper record class that stores two indices of interest.
+     * {@code fullPos} is either the first unparseable character or -1 in case
+     * of no valid number parsed. {@code intPos} reflects the position of
+     * a parsed decimal symbol, if one exists. When parsing with {@code isParseIntegerOnly()},
+     * {@code fullPos} is used to match the suffix, and reset the {@code ParsePosition}
+     * index to {@code intPos}.
+     *
+     * @param fullPos an index that reflects the full traversal of the numerical String
+     * @param intPos an index that reflects the position of a parsed decimal symbol.
+     */
+    record NumericPosition(int fullPos, int intPos) {}
+
     /**
      * Parses a number from the given {@code text}. The text is parsed
      * beginning at {@code position}, until an unparseable character is seen.
@@ -2449,14 +2466,15 @@ private final boolean subparse(String text, ParsePosition parsePosition,
      * @param status upon return contains boolean status flags indicating
      *               whether the value is infinite and whether it is
      *               positive
-     * @return returns the position of the first unparseable character or
-     *         -1 in case of no valid number parsed
+     * @return returns a {@code NumericPosition} that stores both a full
+     *         traversal index, and an int only index.
      */
-    int subparseNumber(String text, int position,
-                       DigitList digits, boolean checkExponent,
-                       boolean isExponent, boolean[] status) {
+    NumericPosition subparseNumber(String text, int position,
+                                   DigitList digits, boolean checkExponent,
+                                   boolean isExponent, boolean[] status) {
         // process digits or Inf, find decimal position
         status[STATUS_INFINITE] = false;
+        int intIndex = 0;
         if (!isExponent && text.regionMatches(position, symbols.getInfinity(), 0,
                 symbols.getInfinity().length())) {
             position += symbols.getInfinity().length();
@@ -2516,7 +2534,7 @@ int subparseNumber(String text, int position,
                 if (parseStrict && isGroupingUsed() && position == startPos + groupingSize
                         && prevSeparatorIndex == -groupingSize && !sawDecimal
                         && digit >= 0 && digit <= 9) {
-                    return position;
+                    return new NumericPosition(position, intIndex);
                 }
 
                 if (digit == 0) {
@@ -2538,37 +2556,44 @@ int subparseNumber(String text, int position,
                         --digits.decimalAt;
                     } else {
                         ++digitCount;
-                        digits.append((char)(digit + '0'));
+                        if (!sawDecimal || !isParseIntegerOnly()) {
+                            digits.append((char)(digit + '0'));
+                        }
                     }
                 } else if (digit > 0 && digit <= 9) { // [sic] digit==0 handled above
                     sawDigit = true;
                     ++digitCount;
-                    digits.append((char)(digit + '0'));
+                    if (!sawDecimal || !isParseIntegerOnly()) {
+                        digits.append((char) (digit + '0'));
+                    }
 
                     // Cancel out backup setting (see grouping handler below)
                     backup = -1;
                 } else if (!isExponent && ch == decimal) {
                     // Check grouping size on decimal separator
                     if (parseStrict && isGroupingViolation(position, prevSeparatorIndex)) {
-                        return groupingViolationIndex(position, prevSeparatorIndex);
+                        return new NumericPosition(
+                                groupingViolationIndex(position, prevSeparatorIndex), intIndex);
                     }
                     // If we're only parsing integers, or if we ALREADY saw the
                     // decimal, then don't parse this one.
-                    if (isParseIntegerOnly() || sawDecimal) {
+                    if (sawDecimal) {
                         break;
                     }
+                    intIndex = position;
                     digits.decimalAt = digitCount; // Not digits.count!
                     sawDecimal = true;
                 } else if (!isExponent && ch == grouping && isGroupingUsed()) {
                     if (parseStrict) {
                         // text should not start with grouping when strict
                         if (position == startPos) {
-                            return startPos;
+                            return new NumericPosition(startPos, intIndex);
                         }
                         // when strict, fail if grouping occurs after decimal OR
                         // current group violates grouping size
                         if (sawDecimal || (isGroupingViolation(position, prevSeparatorIndex))) {
-                            return groupingViolationIndex(position, prevSeparatorIndex);
+                            return new NumericPosition(
+                                    groupingViolationIndex(position, prevSeparatorIndex), intIndex);
                         }
                         prevSeparatorIndex = position; // track previous
                     } else {
@@ -2621,7 +2646,8 @@ int subparseNumber(String text, int position,
                     // "1,234%" and "1,234" both end with pos = 5, since '%' breaks
                     // the loop before incrementing position. In both cases, check
                     // should be done at pos = 4
-                    return groupingViolationIndex(position - 1, prevSeparatorIndex);
+                    return new NumericPosition(
+                            groupingViolationIndex(position - 1, prevSeparatorIndex), intIndex);
                 }
             }
 
@@ -2636,8 +2662,9 @@ int subparseNumber(String text, int position,
                 digits.decimalAt = digitCount; // Not digits.count!
             }
 
-            // Adjust for exponent, if any
-            if (exponent != 0) {
+            // If parsing integer only, adjust exponent if it occurs
+            // in integer portion, otherwise ignore it
+            if (!sawDecimal || !isParseIntegerOnly()) {
                 digits.decimalAt = shiftDecimalAt(digits.decimalAt, exponent);
             }
 
@@ -2646,10 +2673,10 @@ int subparseNumber(String text, int position,
             // parse "$" with pattern "$#0.00". (return index 0 and error
             // index 1).
             if (!sawDigit && digitCount == 0) {
-                return -1;
+                return new NumericPosition(-1, intIndex);
             }
         }
-        return position;
+        return new NumericPosition(position, intIndex);
     }
 
     // Calculate the final decimal position based off the exponent value
@@ -2917,7 +2944,8 @@ public int getMultiplier () {
      * have '{@code U+2030}'.
      *
      * <P>Example: with multiplier 100, 1.23 is formatted as "123", and
-     * "123" is parsed into 1.23.
+     * "123" is parsed into 1.23. If {@code isParseIntegerOnly()} returns {@code true},
+     * "123" is parsed into 1.
      *
      * @param newValue the new multiplier
      * @see #getMultiplier
diff --git a/src/java.base/share/classes/java/text/NumberFormat.java b/src/java.base/share/classes/java/text/NumberFormat.java
index 0409efc2da0..28f116042e9 100644
--- a/src/java.base/share/classes/java/text/NumberFormat.java
+++ b/src/java.base/share/classes/java/text/NumberFormat.java
@@ -468,12 +468,11 @@ public Number parse(String source) throws ParseException {
     }
 
     /**
-     * Returns true if this format will parse numbers as integers only.
+     * Returns {@code true} if this format will parse numbers as integers only.
+     * The {@code ParsePosition} index will be set to the position of the decimal
+     * symbol. The exact format accepted by the parse operation is locale dependent.
      * For example in the English locale, with ParseIntegerOnly true, the
-     * string "1234." would be parsed as the integer value 1234 and parsing
-     * would stop at the "." character.  Of course, the exact format accepted
-     * by the parse operation is locale dependent and determined by sub-classes
-     * of NumberFormat.
+     * string "123.45" would be parsed as the integer value 123.
      *
      * @return {@code true} if numbers should be parsed as integers only;
      *         {@code false} otherwise
diff --git a/src/java.base/share/classes/java/util/Formatter.java b/src/java.base/share/classes/java/util/Formatter.java
index a7d95ee5780..dfdb77cc6ac 100644
--- a/src/java.base/share/classes/java/util/Formatter.java
+++ b/src/java.base/share/classes/java/util/Formatter.java
@@ -4249,8 +4249,8 @@ private int adjustWidth(int width, int flags, boolean neg) {
 
         // Add trailing zeros
         private void trailingZeros(StringBuilder sb, int nzeros) {
-            for (int i = 0; i < nzeros; i++) {
-                sb.append('0');
+            if (nzeros > 0) {
+                sb.repeat('0', nzeros);
             }
         }
 
@@ -4967,9 +4967,9 @@ static boolean isValid(char c) {
                      DECIMAL_FLOAT,
                      HEXADECIMAL_FLOAT,
                      HEXADECIMAL_FLOAT_UPPER,
-                     LINE_SEPARATOR,
-                     PERCENT_SIGN -> true;
-                default -> false;
+                     LINE_SEPARATOR -> true;
+                // Don't put PERCENT_SIGN inside switch, as that will make the method size exceed 325 and cannot be inlined.
+                default -> c == PERCENT_SIGN;
             };
         }
 
diff --git a/src/java.base/share/classes/java/util/Spliterators.java b/src/java.base/share/classes/java/util/Spliterators.java
index c047d96ab49..6cc9146a3cf 100644
--- a/src/java.base/share/classes/java/util/Spliterators.java
+++ b/src/java.base/share/classes/java/util/Spliterators.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -57,12 +57,9 @@ private Spliterators() {}
      */
     @SuppressWarnings("unchecked")
     public static <T> Spliterator<T> emptySpliterator() {
-        return (Spliterator<T>) EMPTY_SPLITERATOR;
+        return (Spliterator<T>) EmptySpliterator.OfRef.EMPTY_SPLITERATOR;
     }
 
-    private static final Spliterator<Object> EMPTY_SPLITERATOR =
-            new EmptySpliterator.OfRef<>();
-
     /**
      * Creates an empty {@code Spliterator.OfInt}
      *
@@ -73,12 +70,9 @@ public static <T> Spliterator<T> emptySpliterator() {
      * @return An empty spliterator
      */
     public static Spliterator.OfInt emptyIntSpliterator() {
-        return EMPTY_INT_SPLITERATOR;
+        return EmptySpliterator.OfInt.EMPTY_INT_SPLITERATOR;
     }
 
-    private static final Spliterator.OfInt EMPTY_INT_SPLITERATOR =
-            new EmptySpliterator.OfInt();
-
     /**
      * Creates an empty {@code Spliterator.OfLong}
      *
@@ -89,12 +83,9 @@ public static Spliterator.OfInt emptyIntSpliterator() {
      * @return An empty spliterator
      */
     public static Spliterator.OfLong emptyLongSpliterator() {
-        return EMPTY_LONG_SPLITERATOR;
+        return EmptySpliterator.OfLong.EMPTY_LONG_SPLITERATOR;
     }
 
-    private static final Spliterator.OfLong EMPTY_LONG_SPLITERATOR =
-            new EmptySpliterator.OfLong();
-
     /**
      * Creates an empty {@code Spliterator.OfDouble}
      *
@@ -105,12 +96,9 @@ public static Spliterator.OfLong emptyLongSpliterator() {
      * @return An empty spliterator
      */
     public static Spliterator.OfDouble emptyDoubleSpliterator() {
-        return EMPTY_DOUBLE_SPLITERATOR;
+        return EmptySpliterator.OfDouble.EMPTY_DOUBLE_SPLITERATOR;
     }
 
-    private static final Spliterator.OfDouble EMPTY_DOUBLE_SPLITERATOR =
-            new EmptySpliterator.OfDouble();
-
     // Array-based spliterators
 
     /**
@@ -905,28 +893,40 @@ public int characteristics() {
         private static final class OfRef<T>
                 extends EmptySpliterator<T, Spliterator<T>, Consumer<? super T>>
                 implements Spliterator<T> {
-            OfRef() { }
+            static final Spliterator<Object> EMPTY_SPLITERATOR =
+                    new EmptySpliterator.OfRef<>();
+
+            private OfRef() { }
         }
 
         @SuppressWarnings("overloads")
         private static final class OfInt
                 extends EmptySpliterator<Integer, Spliterator.OfInt, IntConsumer>
                 implements Spliterator.OfInt {
-            OfInt() { }
+            static final Spliterator.OfInt EMPTY_INT_SPLITERATOR =
+                    new EmptySpliterator.OfInt();
+
+            private OfInt() { }
         }
 
         @SuppressWarnings("overloads")
         private static final class OfLong
                 extends EmptySpliterator<Long, Spliterator.OfLong, LongConsumer>
                 implements Spliterator.OfLong {
-            OfLong() { }
+            static final Spliterator.OfLong EMPTY_LONG_SPLITERATOR =
+                    new EmptySpliterator.OfLong();
+
+            private OfLong() { }
         }
 
         @SuppressWarnings("overloads")
         private static final class OfDouble
                 extends EmptySpliterator<Double, Spliterator.OfDouble, DoubleConsumer>
                 implements Spliterator.OfDouble {
-            OfDouble() { }
+            static final Spliterator.OfDouble EMPTY_DOUBLE_SPLITERATOR =
+                    new EmptySpliterator.OfDouble();
+
+            private OfDouble() { }
         }
     }
 
diff --git a/src/java.base/share/classes/java/util/UUID.java b/src/java.base/share/classes/java/util/UUID.java
index a82f523a66f..e334f7263e4 100644
--- a/src/java.base/share/classes/java/util/UUID.java
+++ b/src/java.base/share/classes/java/util/UUID.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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,7 +31,6 @@
 
 import jdk.internal.access.JavaLangAccess;
 import jdk.internal.access.SharedSecrets;
-import jdk.internal.util.ByteArrayLittleEndian;
 import jdk.internal.util.HexDigits;
 
 /**
@@ -467,38 +466,24 @@ public long node() {
      */
     @Override
     public String toString() {
-        long lsb = leastSigBits;
-        long msb = mostSigBits;
+        int i0 = (int) (mostSigBits >> 32);
+        int i1 = (int) mostSigBits;
+        int i2 = (int) (leastSigBits >> 32);
+        int i3 = (int) leastSigBits;
+
         byte[] buf = new byte[36];
-        ByteArrayLittleEndian.setLong(
-                buf,
-                0,
-                HexDigits.packDigits((int) (msb >> 56), (int) (msb >> 48), (int) (msb >> 40), (int) (msb >> 32)));
+        HexDigits.put4(buf, 0, i0 >> 16);
+        HexDigits.put4(buf, 4, i0);
         buf[8] = '-';
-        ByteArrayLittleEndian.setInt(
-                buf,
-                9,
-                HexDigits.packDigits(((int) msb) >> 24, ((int) msb) >> 16));
+        HexDigits.put4(buf, 9, i1 >> 16);
         buf[13] = '-';
-        ByteArrayLittleEndian.setInt(
-                buf,
-                14,
-                HexDigits.packDigits(((int) msb) >> 8, (int) msb));
+        HexDigits.put4(buf, 14, i1);
         buf[18] = '-';
-        ByteArrayLittleEndian.setInt(
-                buf,
-                19,
-                HexDigits.packDigits((int) (lsb >> 56), (int) (lsb >> 48)));
+        HexDigits.put4(buf, 19, i2 >> 16);
         buf[23] = '-';
-        ByteArrayLittleEndian.setLong(
-                buf,
-                24,
-                HexDigits.packDigits((int) (lsb >> 40), (int) (lsb >> 32), ((int) lsb) >> 24, ((int) lsb) >> 16));
-        ByteArrayLittleEndian.setInt(
-                buf,
-                32,
-                HexDigits.packDigits(((int) lsb) >> 8, (int) lsb));
-
+        HexDigits.put4(buf, 24, i2);
+        HexDigits.put4(buf, 28, i3 >> 16);
+        HexDigits.put4(buf, 32, i3);
         try {
             return jla.newStringNoRepl(buf, StandardCharsets.ISO_8859_1);
         } catch (CharacterCodingException cce) {
diff --git a/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java b/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java
index 32545155b53..1a43b29d798 100644
--- a/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java
+++ b/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java
@@ -2178,6 +2178,9 @@ public T getNow(T valueIfAbsent) {
         return ((r = result) == null) ? valueIfAbsent : (T) reportJoin(r, "getNow");
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public T resultNow() {
         Object r = result;
@@ -2193,6 +2196,9 @@ public T resultNow() {
         throw new IllegalStateException();
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public Throwable exceptionNow() {
         Object r = result;
@@ -2440,26 +2446,41 @@ public CompletableFuture<T> exceptionally(
         return uniExceptionallyStage(null, fn);
     }
 
+    /**
+     * @since 12
+     */
     public CompletableFuture<T> exceptionallyAsync(
         Function<Throwable, ? extends T> fn) {
         return uniExceptionallyStage(defaultExecutor(), fn);
     }
 
+    /**
+     * @since 12
+     */
     public CompletableFuture<T> exceptionallyAsync(
         Function<Throwable, ? extends T> fn, Executor executor) {
         return uniExceptionallyStage(screenExecutor(executor), fn);
     }
 
+    /**
+     * @since 12
+     */
     public CompletableFuture<T> exceptionallyCompose(
         Function<Throwable, ? extends CompletionStage<T>> fn) {
         return uniComposeExceptionallyStage(null, fn);
     }
 
+    /**
+     * @since 12
+     */
     public CompletableFuture<T> exceptionallyComposeAsync(
         Function<Throwable, ? extends CompletionStage<T>> fn) {
         return uniComposeExceptionallyStage(defaultExecutor(), fn);
     }
 
+    /**
+     * @since 12
+     */
     public CompletableFuture<T> exceptionallyComposeAsync(
         Function<Throwable, ? extends CompletionStage<T>> fn,
         Executor executor) {
@@ -2585,6 +2606,9 @@ public boolean isCompletedExceptionally() {
         return ((r = result) instanceof AltResult) && r != NIL;
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public State state() {
         Object r = result;
diff --git a/src/java.base/share/classes/java/util/concurrent/DelayQueue.java b/src/java.base/share/classes/java/util/concurrent/DelayQueue.java
index c53a02ddf71..abd14142da5 100644
--- a/src/java.base/share/classes/java/util/concurrent/DelayQueue.java
+++ b/src/java.base/share/classes/java/util/concurrent/DelayQueue.java
@@ -327,6 +327,8 @@ public E poll(long timeout, TimeUnit unit) throws InterruptedException {
      * @return the <em>expired head</em> of this queue
      * @throws NoSuchElementException if this queue has no elements with an
      *         expired delay
+     *
+     * @since 21
      */
     public E remove() {
         return super.remove();
diff --git a/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java b/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java
index e58af0b0fa5..8ca52dc5cb2 100644
--- a/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java
+++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java
@@ -887,6 +887,9 @@ public final boolean isCompletedNormally() {
         return (status & (DONE | ABNORMAL)) == DONE;
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public State state() {
         int s = status;
@@ -896,6 +899,9 @@ public State state() {
             State.CANCELLED;
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public V resultNow() {
         int s = status;
@@ -910,6 +916,9 @@ public V resultNow() {
         return getRawResult();
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public Throwable exceptionNow() {
         Throwable ex;
diff --git a/src/java.base/share/classes/java/util/concurrent/FutureTask.java b/src/java.base/share/classes/java/util/concurrent/FutureTask.java
index 371055d2c11..627e69559c8 100644
--- a/src/java.base/share/classes/java/util/concurrent/FutureTask.java
+++ b/src/java.base/share/classes/java/util/concurrent/FutureTask.java
@@ -205,6 +205,9 @@ public V get(long timeout, TimeUnit unit)
         return report(s);
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public V resultNow() {
         switch (state()) {    // Future.State
@@ -221,6 +224,9 @@ public V resultNow() {
         }
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public Throwable exceptionNow() {
         switch (state()) {    // Future.State
@@ -236,6 +242,9 @@ public Throwable exceptionNow() {
         }
     }
 
+    /**
+     * @since 19
+     */
     @Override
     public State state() {
         int s = state;
diff --git a/src/java.base/share/classes/java/util/regex/Pattern.java b/src/java.base/share/classes/java/util/regex/Pattern.java
index 62ef125fdee..0e87bebdcbf 100644
--- a/src/java.base/share/classes/java/util/regex/Pattern.java
+++ b/src/java.base/share/classes/java/util/regex/Pattern.java
@@ -160,7 +160,7 @@
  *     <td headers="matches predef any">Any character (may or may not match <a href="#lt">line terminators</a>)</td></tr>
  * <tr><th style="vertical-align:top; font-weight:normal" id="digit">{@code \d}</th>
  *     <td headers="matches predef digit">A digit: {@code [0-9]} if <a href="#UNICODE_CHARACTER_CLASS">
- *  *         UNICODE_CHARACTER_CLASS</a> is not set. See <a href="#unicodesupport">Unicode Support</a>.</td></tr>
+ *          UNICODE_CHARACTER_CLASS</a> is not set. See <a href="#unicodesupport">Unicode Support</a>.</td></tr>
  * <tr><th style="vertical-align:top; font-weight:normal" id="non_digit">{@code \D}</th>
  *     <td headers="matches predef non_digit">A non-digit: {@code [^0-9]}</td></tr>
  * <tr><th style="vertical-align:top; font-weight:normal" id="horiz_white">{@code \h}</th>
@@ -251,8 +251,9 @@
  * <tr><th style="vertical-align:top; font-weight:normal" id="end_line">{@code $}</th>
  *     <td headers="matches bounds end_line">The end of a line</td></tr>
  * <tr><th style="vertical-align:top; font-weight:normal" id="word_boundary">{@code \b}</th>
- *     <td headers="matches bounds word_boundary">A word boundary: {@code (?:(?<=\w)(?=\W)|(?<=\W)(?=\w))} (the location
- *     where a non-word character abuts a word character)</td></tr>
+ *     <td headers="matches bounds word_boundary">A word boundary:
+ *     at the beginning or at the end of a line if a word character ({@code \w}) appears there;
+ *     or between a word ({@code \w}) and a non-word character ({@code \W}), in either order.</td></tr>
  * <tr><th style="vertical-align:top; font-weight:normal" id="grapheme_cluster_boundary">{@code \b{g}}</th>
  *     <td headers="matches bounds grapheme_cluster_boundary">A Unicode extended grapheme cluster boundary</td></tr>
  * <tr><th style="vertical-align:top; font-weight:normal" id="non_word_boundary">{@code \B}</th>
diff --git a/src/java.base/share/classes/java/util/stream/Gatherer.java b/src/java.base/share/classes/java/util/stream/Gatherer.java
index ced746cd673..40c3c682e73 100644
--- a/src/java.base/share/classes/java/util/stream/Gatherer.java
+++ b/src/java.base/share/classes/java/util/stream/Gatherer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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,7 +293,7 @@ static <A> Supplier<A> defaultInitializer() {
      *
      * @implSpec This method always returns the same instance.
      *
-     * @see Gatherer#finisher()
+     * @see Gatherer#combiner()
      * @return the instance of the default combiner
      * @param <A> the type of the state of the returned combiner
      */
diff --git a/src/java.base/share/classes/java/util/zip/ZipEntry.java b/src/java.base/share/classes/java/util/zip/ZipEntry.java
index 85bd6155fa8..d97760d950a 100644
--- a/src/java.base/share/classes/java/util/zip/ZipEntry.java
+++ b/src/java.base/share/classes/java/util/zip/ZipEntry.java
@@ -59,7 +59,7 @@ public class ZipEntry implements ZipConstants, Cloneable {
     int flag = 0;       // general purpose flag
     byte[] extra;       // optional extra field data for entry
     String comment;     // optional comment string for entry
-    int extraAttributes = -1; // e.g. POSIX permissions, sym links.
+    int externalFileAttributes = -1; // File type, setuid, setgid, sticky, POSIX permissions
     /**
      * Compression method for uncompressed entries.
      */
@@ -134,7 +134,7 @@ public ZipEntry(ZipEntry e) {
         flag = e.flag;
         extra = e.extra;
         comment = e.comment;
-        extraAttributes = e.extraAttributes;
+        externalFileAttributes = e.externalFileAttributes;
     }
 
     /**
diff --git a/src/java.base/share/classes/java/util/zip/ZipFile.java b/src/java.base/share/classes/java/util/zip/ZipFile.java
index 4f4c410a83e..da8ab730873 100644
--- a/src/java.base/share/classes/java/util/zip/ZipFile.java
+++ b/src/java.base/share/classes/java/util/zip/ZipFile.java
@@ -697,7 +697,7 @@ private ZipEntry getZipEntry(String name, int pos) {
         e.method = CENHOW(cen, pos);
         if (CENVEM_FA(cen, pos) == FILE_ATTRIBUTES_UNIX) {
             // read all bits in this field, including sym link attributes
-            e.extraAttributes = CENATX_PERMS(cen, pos) & 0xFFFF;
+            e.externalFileAttributes = CENATX_PERMS(cen, pos) & 0xFFFF;
         }
 
         if (elen != 0) {
@@ -1165,12 +1165,12 @@ public Stream<String> entryNameStream(ZipFile zip) {
                     return zip.entryNameStream();
                 }
                 @Override
-                public int getExtraAttributes(ZipEntry ze) {
-                    return ze.extraAttributes;
+                public int getExternalFileAttributes(ZipEntry ze) {
+                    return ze.externalFileAttributes;
                 }
                 @Override
-                public void setExtraAttributes(ZipEntry ze, int extraAttrs) {
-                    ze.extraAttributes = extraAttrs;
+                public void setExternalFileAttributes(ZipEntry ze, int externalFileAttributes) {
+                    ze.externalFileAttributes = externalFileAttributes;
                 }
 
              }
diff --git a/src/java.base/share/classes/java/util/zip/ZipOutputStream.java b/src/java.base/share/classes/java/util/zip/ZipOutputStream.java
index e1d40355860..231e6629a54 100644
--- a/src/java.base/share/classes/java/util/zip/ZipOutputStream.java
+++ b/src/java.base/share/classes/java/util/zip/ZipOutputStream.java
@@ -541,7 +541,7 @@ private void writeEXT(ZipEntry e) throws IOException {
      * to a version value.
      */
     private int versionMadeBy(ZipEntry e, int version) {
-        return (e.extraAttributes < 0) ? version :
+        return (e.externalFileAttributes < 0) ? version :
                 VERSION_MADE_BY_BASE_UNIX | (version & 0xff);
     }
 
@@ -637,7 +637,7 @@ private void writeCEN(XEntry xentry) throws IOException {
         writeShort(0);              // starting disk number
         writeShort(0);              // internal file attributes (unused)
         // extra file attributes, used for storing posix permissions etc.
-        writeInt(e.extraAttributes > 0 ? e.extraAttributes << 16 : 0);
+        writeInt(e.externalFileAttributes > 0 ? e.externalFileAttributes << 16 : 0);
         writeInt(offset);           // relative offset of local header
         writeBytes(nameBytes, 0, nameBytes.length);
 
diff --git a/src/java.base/share/classes/javax/crypto/spec/RC5ParameterSpec.java b/src/java.base/share/classes/javax/crypto/spec/RC5ParameterSpec.java
index 7e4aab20e68..67daf8bb19a 100644
--- a/src/java.base/share/classes/javax/crypto/spec/RC5ParameterSpec.java
+++ b/src/java.base/share/classes/javax/crypto/spec/RC5ParameterSpec.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -37,9 +37,7 @@
  * size, and optionally an initialization vector (IV) (only in feedback mode).
  *
  * <p> This class can be used to initialize a {@code Cipher} object that
- * implements the <i>RC5</i> algorithm as supplied by
- * <a href="http://www.rsa.com">RSA Security LLC</a>,
- * or any parties authorized by RSA Security.
+ * implements the <i>RC5</i> algorithm.
  *
  * @author Jan Luehe
  *
diff --git a/src/java.base/share/classes/jdk/internal/access/JavaUtilZipFileAccess.java b/src/java.base/share/classes/jdk/internal/access/JavaUtilZipFileAccess.java
index 3728a6c70d4..2c9d904005d 100644
--- a/src/java.base/share/classes/jdk/internal/access/JavaUtilZipFileAccess.java
+++ b/src/java.base/share/classes/jdk/internal/access/JavaUtilZipFileAccess.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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,7 +42,7 @@ public interface JavaUtilZipFileAccess {
     public Enumeration<JarEntry> entries(ZipFile zip);
     public Stream<JarEntry> stream(ZipFile zip);
     public Stream<String> entryNameStream(ZipFile zip);
-    public void setExtraAttributes(ZipEntry ze, int extraAttrs);
-    public int getExtraAttributes(ZipEntry ze);
+    public void setExternalFileAttributes(ZipEntry ze, int externalFileAttributes);
+    public int getExternalFileAttributes(ZipEntry ze);
 }
 
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractInstruction.java b/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractInstruction.java
index 0e528cd01fd..48e1f0990b2 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractInstruction.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractInstruction.java
@@ -529,7 +529,7 @@ public static final class BoundNewObjectInstruction
         @Override
         public ClassEntry className() {
             if (classEntry == null)
-                classEntry = code.classReader.readClassEntry(pos + 1);
+                classEntry = code.classReader.readEntry(pos + 1, ClassEntry.class);
             return classEntry;
         }
 
@@ -576,7 +576,7 @@ public BoundNewReferenceArrayInstruction(Opcode op, CodeImpl code, int pos) {
 
         @Override
         public ClassEntry componentType() {
-            return code.classReader.readClassEntry(pos + 1);
+            return code.classReader.readEntry(pos + 1, ClassEntry.class);
         }
 
         @Override
@@ -607,7 +607,7 @@ public int dimensions() {
 
         @Override
         public ClassEntry arrayType() {
-            return code.classReader.readClassEntry(pos + 1);
+            return code.classReader.readEntry(pos + 1, ClassEntry.class);
         }
 
         @Override
@@ -636,7 +636,7 @@ public BoundTypeCheckInstruction(Opcode op, CodeImpl code, int pos) {
         @Override
         public ClassEntry type() {
             if (typeEntry == null)
-                typeEntry = code.classReader.readClassEntry(pos + 1);
+                typeEntry = code.classReader.readEntry(pos + 1, ClassEntry.class);
             return typeEntry;
         }
 
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/AnnotationReader.java b/src/java.base/share/classes/jdk/internal/classfile/impl/AnnotationReader.java
index c082878abd4..7b5920b3e78 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/AnnotationReader.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/AnnotationReader.java
@@ -66,9 +66,10 @@ public static AnnotationValue readElementValue(ClassReader classReader, int p) {
             case AEV_LONG -> new AnnotationImpl.OfLongImpl(classReader.readEntry(p, LongEntry.class));
             case AEV_SHORT -> new AnnotationImpl.OfShortImpl(classReader.readEntry(p, IntegerEntry.class));
             case AEV_BOOLEAN -> new AnnotationImpl.OfBooleanImpl(classReader.readEntry(p, IntegerEntry.class));
-            case AEV_STRING -> new AnnotationImpl.OfStringImpl(classReader.readUtf8Entry(p));
-            case AEV_ENUM -> new AnnotationImpl.OfEnumImpl(classReader.readUtf8Entry(p), classReader.readUtf8Entry(p + 2));
-            case AEV_CLASS -> new AnnotationImpl.OfClassImpl(classReader.readUtf8Entry(p));
+            case AEV_STRING -> new AnnotationImpl.OfStringImpl(classReader.readEntry(p, Utf8Entry.class));
+            case AEV_ENUM -> new AnnotationImpl.OfEnumImpl(classReader.readEntry(p, Utf8Entry.class),
+                    classReader.readEntry(p + 2, Utf8Entry.class));
+            case AEV_CLASS -> new AnnotationImpl.OfClassImpl(classReader.readEntry(p, Utf8Entry.class));
             case AEV_ANNOTATION -> new AnnotationImpl.OfAnnotationImpl(readAnnotation(classReader, p));
             case AEV_ARRAY -> {
                 int numValues = classReader.readU2(p);
@@ -127,7 +128,7 @@ private static int skipElementValue(ClassReader classReader, int p) {
     }
 
     private static Annotation readAnnotation(ClassReader classReader, int p) {
-        Utf8Entry annotationClass = classReader.entryByIndex(classReader.readU2(p), Utf8Entry.class);
+        Utf8Entry annotationClass = classReader.readEntry(p, Utf8Entry.class);
         p += 2;
         List<AnnotationElement> elems = readAnnotationElementValuePairs(classReader, p);
         return new AnnotationImpl(annotationClass, elems);
@@ -150,7 +151,7 @@ private static List<AnnotationElement> readAnnotationElementValuePairs(ClassRead
         p += 2;
         var annotationElements = new Object[numElementValuePairs];
         for (int i = 0; i < numElementValuePairs; ++i) {
-            Utf8Entry elementName = classReader.readUtf8Entry(p);
+            Utf8Entry elementName = classReader.readEntry(p, Utf8Entry.class);
             p += 2;
             AnnotationValue value = readElementValue(classReader, p);
             annotationElements[i] = new AnnotationImpl.AnnotationElementImpl(elementName, value);
@@ -239,7 +240,7 @@ private static TypeAnnotation readTypeAnnotation(ClassReader classReader, int p,
             };
         }
         // the annotation info for this annotation
-        Utf8Entry type = classReader.readUtf8Entry(p);
+        Utf8Entry type = classReader.readEntry(p, Utf8Entry.class);
         p += 2;
         return TypeAnnotation.of(targetInfo, List.of(typePath), type,
                                  readAnnotationElementValuePairs(classReader, p));
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java
index ffe1a2bd616..66e974b4a51 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -51,13 +51,13 @@ public BlockCodeBuilderImpl(CodeBuilder parent, Label breakLabel) {
 
     public void start() {
         topLocal = topLocal(parent);
-        terminalMaxLocals = topLocal(terminal);
-        terminal.with((LabelTarget) startLabel);
+        terminalMaxLocals = terminal.curTopLocal();
+        parent.with((LabelTarget) startLabel);
     }
 
     public void end() {
-        terminal.with((LabelTarget) endLabel);
-        if (terminalMaxLocals != topLocal(terminal)) {
+        parent.with((LabelTarget) endLabel);
+        if (terminalMaxLocals != terminal.curTopLocal()) {
             throw new IllegalStateException("Interference in local variable slot management");
         }
     }
@@ -73,10 +73,8 @@ public boolean isEmpty() {
     private int topLocal(CodeBuilder parent) {
         return switch (parent) {
             case BlockCodeBuilderImpl b -> b.topLocal;
-            case ChainedCodeBuilder b -> topLocal(b.terminal);
-            case DirectCodeBuilder b -> b.curTopLocal();
-            case BufferedCodeBuilder b -> b.curTopLocal();
-            case TransformingCodeBuilder b -> topLocal(b.delegate);
+            case ChainedCodeBuilder b -> b.terminal.curTopLocal();
+            case TerminalCodeBuilder b -> b.curTopLocal();
         };
     }
 
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java
index 45e0c092c3e..21a01becec2 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundAttribute.java
@@ -135,7 +135,7 @@ public static List<Attribute<?>> readAttributes(AttributedElement enclosing, Cla
         int cfLen = reader.classfileLength();
         var apo = ((ClassReaderImpl)reader).context().attributesProcessingOption();
         for (int i = 0; i < size; ++i) {
-            Utf8Entry name = reader.readUtf8Entry(p);
+            Utf8Entry name = reader.readEntry(p, Utf8Entry.class);
             int len = reader.readInt(p + 2);
             p += 6;
             if (len < 0 || len > cfLen - p) {
@@ -347,7 +347,7 @@ public List<MethodParameterInfo> parameters() {
                 int p = payloadStart + 1;
                 int pEnd = p + (cnt * 4);
                 for (int i = 0; p < pEnd; p += 4, i++) {
-                    Utf8Entry name = classReader.readUtf8EntryOrNull(p);
+                    Utf8Entry name = classReader.readEntryOrNull(p, Utf8Entry.class);
                     int accessFlags = classReader.readU2(p + 2);
                     elements[i] = MethodParameterInfo.of(Optional.ofNullable(name), accessFlags);
                 }
@@ -367,7 +367,7 @@ public BoundModuleHashesAttribute(ClassReader cf, AttributeMapper<ModuleHashesAt
 
         @Override
         public Utf8Entry algorithm() {
-            return classReader.readUtf8Entry(payloadStart);
+            return classReader.readEntry(payloadStart, Utf8Entry.class);
         }
 
         @Override
@@ -378,7 +378,7 @@ public List<ModuleHashInfo> hashes() {
                 int p = payloadStart + 4;
                 //System.err.printf("%5d: ModuleHashesAttr alg = %s, cnt = %d%n", pos, algorithm(), cnt);
                 for (int i = 0; i < cnt; ++i) {
-                    ModuleEntry module = classReader.readModuleEntry(p);
+                    ModuleEntry module = classReader.readEntry(p, ModuleEntry.class);
                     int hashLength = classReader.readU2(p + 2);
                     //System.err.printf("%5d:     [%d] module = %s, hashLength = %d%n", p, i, module, hashLength);
                     p += 4;
@@ -430,7 +430,7 @@ public BoundSignatureAttribute(ClassReader cf, AttributeMapper<SignatureAttribut
 
         @Override
         public Utf8Entry signature() {
-            return classReader.readUtf8Entry(payloadStart);
+            return classReader.readEntry(payloadStart, Utf8Entry.class);
         }
     }
 
@@ -442,7 +442,7 @@ public BoundSourceFileAttribute(ClassReader cf, AttributeMapper<SourceFileAttrib
 
         @Override
         public Utf8Entry sourceFile() {
-            return classReader.readUtf8Entry(payloadStart);
+            return classReader.readEntry(payloadStart, Utf8Entry.class);
         }
 
     }
@@ -454,7 +454,7 @@ public BoundModuleMainClassAttribute(ClassReader cf, AttributeMapper<ModuleMainC
 
         @Override
         public ClassEntry mainClass() {
-            return classReader.readClassEntry(payloadStart);
+            return classReader.readEntry(payloadStart, ClassEntry.class);
         }
     }
 
@@ -466,7 +466,7 @@ public BoundNestHostAttribute(ClassReader cf, AttributeMapper<NestHostAttribute>
 
         @Override
         public ClassEntry nestHost() {
-            return classReader.readClassEntry(payloadStart);
+            return classReader.readEntry(payloadStart, ClassEntry.class);
         }
     }
 
@@ -498,7 +498,7 @@ public BoundModuleTargetAttribute(ClassReader cf, AttributeMapper<ModuleTargetAt
 
         @Override
         public Utf8Entry targetPlatform() {
-            return classReader.readUtf8Entry(payloadStart);
+            return classReader.readEntry(payloadStart, Utf8Entry.class);
         }
     }
 
@@ -510,7 +510,7 @@ public BoundCompilationIDAttribute(ClassReader cf, AttributeMapper<CompilationID
 
         @Override
         public Utf8Entry compilationId() {
-            return classReader.readUtf8Entry(payloadStart);
+            return classReader.readEntry(payloadStart, Utf8Entry.class);
         }
     }
 
@@ -522,7 +522,7 @@ public BoundSourceIDAttribute(ClassReader cf, AttributeMapper<SourceIDAttribute>
 
         @Override
         public Utf8Entry sourceId() {
-            return classReader.readUtf8Entry(payloadStart);
+            return classReader.readEntry(payloadStart, Utf8Entry.class);
         }
     }
 
@@ -569,7 +569,7 @@ public BoundModuleAttribute(ClassReader cf, AttributeMapper<ModuleAttribute> map
 
         @Override
         public ModuleEntry moduleName() {
-            return classReader.readModuleEntry(payloadStart);
+            return classReader.readEntry(payloadStart, ModuleEntry.class);
         }
 
         @Override
@@ -579,7 +579,7 @@ public int moduleFlagsMask() {
 
         @Override
         public Optional<Utf8Entry> moduleVersion() {
-            return Optional.ofNullable(classReader.readUtf8EntryOrNull(payloadStart + 4));
+            return Optional.ofNullable(classReader.readEntryOrNull(payloadStart + 4, Utf8Entry.class));
         }
 
         @Override
@@ -630,7 +630,7 @@ private void structure() {
                 ModuleRequireInfo[] elements = new ModuleRequireInfo[cnt];
                 int end = p + (cnt * 6);
                 for (int i = 0; p < end; p += 6, i++) {
-                    elements[i] = ModuleRequireInfo.of(classReader.readModuleEntry(p),
+                    elements[i] = ModuleRequireInfo.of(classReader.readEntry(p, ModuleEntry.class),
                             classReader.readU2(p + 2),
                             classReader.readEntryOrNull(p + 4, Utf8Entry.class));
                 }
@@ -642,7 +642,7 @@ private void structure() {
                 p += 2;
                 ModuleExportInfo[] elements = new ModuleExportInfo[cnt];
                 for (int i = 0; i < cnt; i++) {
-                    PackageEntry pe = classReader.readPackageEntry(p);
+                    PackageEntry pe = classReader.readEntry(p, PackageEntry.class);
                     int exportFlags = classReader.readU2(p + 2);
                     p += 4;
                     List<ModuleEntry> exportsTo = readEntryList(p);
@@ -657,7 +657,7 @@ private void structure() {
                 p += 2;
                 ModuleOpenInfo[] elements = new ModuleOpenInfo[cnt];
                 for (int i = 0; i < cnt; i++) {
-                    PackageEntry po = classReader.readPackageEntry(p);
+                    PackageEntry po = classReader.readEntry(p, PackageEntry.class);
                     int opensFlags = classReader.readU2(p + 2);
                     p += 4;
                     List<ModuleEntry> opensTo = readEntryList(p);
@@ -675,7 +675,7 @@ private void structure() {
                 ModuleProvideInfo[] elements = new ModuleProvideInfo[cnt];
                 provides = new ArrayList<>(cnt);
                 for (int i = 0; i < cnt; i++) {
-                    ClassEntry c = classReader.readClassEntry(p);
+                    ClassEntry c = classReader.readEntry(p, ClassEntry.class);
                     p += 2;
                     List<ClassEntry> providesWith = readEntryList(p);
                     p += 2 + providesWith.size() * 2;
@@ -743,8 +743,7 @@ public List<BootstrapMethodEntry> bootstrapMethods() {
                 BootstrapMethodEntry[] bs = new BootstrapMethodEntry[size];
                 int p = payloadStart + 2;
                 for (int i = 0; i < size; ++i) {
-                    final AbstractPoolEntry.MethodHandleEntryImpl handle
-                            = (AbstractPoolEntry.MethodHandleEntryImpl) classReader.readMethodHandleEntry(p);
+                    final var handle = classReader.readEntry(p, AbstractPoolEntry.MethodHandleEntryImpl.class);
                     final List<LoadableConstantEntry> args = readEntryList(p + 2);
                     p += 4 + args.size() * 2;
                     int hash = BootstrapMethodEntryImpl.computeHashCode(handle, args);
@@ -771,7 +770,7 @@ public List<InnerClassInfo> classes() {
                 int p = payloadStart + 2;
                 InnerClassInfo[] elements = new InnerClassInfo[cnt];
                 for (int i = 0; i < cnt; i++) {
-                    ClassEntry innerClass = classReader.readClassEntry(p);
+                    ClassEntry innerClass = classReader.readEntry(p, ClassEntry.class);
                     var outerClass = classReader.readEntryOrNull(p + 2, ClassEntry.class);
                     var innerName = classReader.readEntryOrNull(p + 4, Utf8Entry.class);
                     int flags = classReader.readU2(p + 6);
@@ -792,7 +791,7 @@ public BoundEnclosingMethodAttribute(ClassReader cf, AttributeMapper<EnclosingMe
 
         @Override
         public ClassEntry enclosingClass() {
-            return classReader.readClassEntry(payloadStart);
+            return classReader.readEntry(payloadStart, ClassEntry.class);
         }
 
         @Override
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundRecordComponentInfo.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundRecordComponentInfo.java
index d2e0dc07378..fd96b245af1 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundRecordComponentInfo.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundRecordComponentInfo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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,12 +46,12 @@ public BoundRecordComponentInfo(ClassReader reader, int startPos) {
 
     @Override
     public Utf8Entry name() {
-        return reader.readUtf8Entry(startPos);
+        return reader.readEntry(startPos, Utf8Entry.class);
     }
 
     @Override
     public Utf8Entry descriptor() {
-        return reader.readUtf8Entry(startPos + 2);
+        return reader.readEntry(startPos + 2, Utf8Entry.class);
     }
 
     @Override
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedCodeBuilder.java
index 60e73cdd987..8603c77ab8b 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedCodeBuilder.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedCodeBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -43,7 +43,7 @@
 import java.util.function.Consumer;
 
 public final class BufferedCodeBuilder
-        implements TerminalCodeBuilder, LabelContext {
+        implements TerminalCodeBuilder {
     private final SplitConstantPool constantPool;
     private final ClassFileImpl context;
     private final List<CodeElement> elements = new ArrayList<>();
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java
index cc19bf9d31c..b33d192f9b3 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -33,13 +33,11 @@
 
 public final class ChainedClassBuilder
         implements ClassBuilder, Consumer<ClassElement> {
-    private final ClassBuilder downstream;
     private final DirectClassBuilder terminal;
     private final Consumer<ClassElement> consumer;
 
     public ChainedClassBuilder(ClassBuilder downstream,
                                Consumer<ClassElement> consumer) {
-        this.downstream = downstream;
         this.consumer = consumer;
         this.terminal = switch (downstream) {
             case ChainedClassBuilder cb -> cb.terminal;
@@ -60,10 +58,11 @@ public Optional<ClassModel> original() {
 
     @Override
     public ClassBuilder withField(Utf8Entry name, Utf8Entry descriptor, Consumer<? super FieldBuilder> handler) {
-        return downstream.with(new BufferedFieldBuilder(terminal.constantPool, terminal.context,
+        consumer.accept(new BufferedFieldBuilder(terminal.constantPool, terminal.context,
                                                         name, descriptor, null)
                                        .run(handler)
                                        .toModel());
+        return this;
     }
 
     @Override
@@ -72,16 +71,18 @@ public ClassBuilder transformField(FieldModel field, FieldTransform transform) {
                                                                 field.fieldName(), field.fieldType(),
                                                                 field);
         builder.transform(field, transform);
-        return downstream.with(builder.toModel());
+        consumer.accept(builder.toModel());
+        return this;
     }
 
     @Override
     public ClassBuilder withMethod(Utf8Entry name, Utf8Entry descriptor, int flags,
                                    Consumer<? super MethodBuilder> handler) {
-        return downstream.with(new BufferedMethodBuilder(terminal.constantPool, terminal.context,
+        consumer.accept(new BufferedMethodBuilder(terminal.constantPool, terminal.context,
                                                          name, descriptor, null)
                                        .run(handler)
                                        .toModel());
+        return this;
     }
 
     @Override
@@ -89,7 +90,8 @@ public ClassBuilder transformMethod(MethodModel method, MethodTransform transfor
         BufferedMethodBuilder builder = new BufferedMethodBuilder(terminal.constantPool, terminal.context,
                                                                   method.methodName(), method.methodType(), method);
         builder.transform(method, transform);
-        return downstream.with(builder.toModel());
+        consumer.accept(builder.toModel());
+        return this;
     }
 
     @Override
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java
index 38850aec109..866dda2c5bc 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -36,13 +36,11 @@
 import java.lang.classfile.constantpool.ConstantPoolBuilder;
 
 public final class ChainedMethodBuilder implements MethodBuilder {
-    final MethodBuilder downstream;
     final TerminalMethodBuilder terminal;
     final Consumer<MethodElement> consumer;
 
     public ChainedMethodBuilder(MethodBuilder downstream,
                                 Consumer<MethodElement> consumer) {
-        this.downstream = downstream;
         this.consumer = consumer;
         this.terminal = switch (downstream) {
             case ChainedMethodBuilder cb -> cb.terminal;
@@ -58,16 +56,18 @@ public MethodBuilder with(MethodElement element) {
 
     @Override
     public MethodBuilder withCode(Consumer<? super CodeBuilder> handler) {
-        return downstream.with(terminal.bufferedCodeBuilder(null)
+        consumer.accept(terminal.bufferedCodeBuilder(null)
                                        .run(handler)
                                        .toModel());
+        return this;
     }
 
     @Override
     public MethodBuilder transformCode(CodeModel code, CodeTransform transform) {
         BufferedCodeBuilder builder = terminal.bufferedCodeBuilder(code);
         builder.transform(code, transform);
-        return downstream.with(builder.toModel());
+        consumer.accept(builder.toModel());
+        return this;
     }
 
     @Override
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassFileImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassFileImpl.java
index 8bffbd6de4f..e4408d6c7b2 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassFileImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassFileImpl.java
@@ -115,7 +115,7 @@ public byte[] build(ClassEntry thisClassEntry,
     }
 
     @Override
-    public byte[] transform(ClassModel model, ClassEntry newClassName, ClassTransform transform) {
+    public byte[] transformClass(ClassModel model, ClassEntry newClassName, ClassTransform transform) {
         ConstantPoolBuilder constantPool = constantPoolSharingOption() == ConstantPoolSharingOption.SHARED_POOL
                                                                      ? ConstantPoolBuilder.of(model)
                                                                      : ConstantPoolBuilder.of();
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassHierarchyImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassHierarchyImpl.java
index 1154b038dee..6765bdee3bd 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassHierarchyImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassHierarchyImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -41,6 +41,7 @@
 import static java.lang.constant.ConstantDescs.CD_Object;
 import static java.lang.classfile.ClassFile.*;
 import static java.util.Objects.requireNonNull;
+import static jdk.internal.constant.ConstantUtils.referenceClassDesc;
 
 /**
  * Class hierarchy resolution framework is answering questions about classes assignability, common classes ancestor and whether the class represents an interface.
@@ -245,7 +246,7 @@ public ClassHierarchyInfo getClassInfo(ClassDesc cd) {
             }
 
             return cl.isInterface() ? ClassHierarchyInfo.ofInterface()
-                    : ClassHierarchyInfo.ofClass(cl.getSuperclass().describeConstable().orElseThrow());
+                    : ClassHierarchyInfo.ofClass(referenceClassDesc(cl.getSuperclass()));
         }
     }
 }
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassImpl.java
index 35075cb774a..907a5cc5351 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassImpl.java
@@ -137,7 +137,7 @@ public List<ClassEntry> interfaces() {
             pos += 2;
             var arr = new Object[cnt];
             for (int i = 0; i < cnt; ++i) {
-                arr[i] = reader.readClassEntry(pos);
+                arr[i] = reader.readEntry(pos, ClassEntry.class);
                 pos += 2;
             }
             this.interfaces = SharedSecrets.getJavaUtilCollectionAccess().listFromTrustedArray(arr);
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassReaderImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassReaderImpl.java
index b8a262ce41c..25d4e2e68e8 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/ClassReaderImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ClassReaderImpl.java
@@ -151,7 +151,7 @@ public int flags() {
     @Override
     public ClassEntry thisClassEntry() {
         if (thisClass == null) {
-            thisClass = readClassEntry(thisClassPos);
+            thisClass = readEntry(thisClassPos, ClassEntry.class);
         }
         return thisClass;
     }
@@ -395,23 +395,23 @@ public <T extends PoolEntry> T entryByIndex(int index, Class<T> cls) {
                 case TAG_FLOAT -> new AbstractPoolEntry.FloatEntryImpl(this, index, readFloat(q));
                 case TAG_LONG -> new AbstractPoolEntry.LongEntryImpl(this, index, readLong(q));
                 case TAG_DOUBLE -> new AbstractPoolEntry.DoubleEntryImpl(this, index, readDouble(q));
-                case TAG_CLASS -> new AbstractPoolEntry.ClassEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q));
-                case TAG_STRING -> new AbstractPoolEntry.StringEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q));
-                case TAG_FIELDREF -> new AbstractPoolEntry.FieldRefEntryImpl(this, index, (AbstractPoolEntry.ClassEntryImpl) readClassEntry(q),
-                                                                             (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2));
-                case TAG_METHODREF -> new AbstractPoolEntry.MethodRefEntryImpl(this, index, (AbstractPoolEntry.ClassEntryImpl) readClassEntry(q),
-                                                                               (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2));
-                case TAG_INTERFACEMETHODREF -> new AbstractPoolEntry.InterfaceMethodRefEntryImpl(this, index, (AbstractPoolEntry.ClassEntryImpl) readClassEntry(q),
-                                                                                                 (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2));
-                case TAG_NAMEANDTYPE -> new AbstractPoolEntry.NameAndTypeEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q),
-                                                                                   (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q + 2));
+                case TAG_CLASS -> new AbstractPoolEntry.ClassEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class));
+                case TAG_STRING -> new AbstractPoolEntry.StringEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class));
+                case TAG_FIELDREF -> new AbstractPoolEntry.FieldRefEntryImpl(this, index, readEntry(q, AbstractPoolEntry.ClassEntryImpl.class),
+                        readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class));
+                case TAG_METHODREF -> new AbstractPoolEntry.MethodRefEntryImpl(this, index, readEntry(q, AbstractPoolEntry.ClassEntryImpl.class),
+                        readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class));
+                case TAG_INTERFACEMETHODREF -> new AbstractPoolEntry.InterfaceMethodRefEntryImpl(this, index, readEntry(q, AbstractPoolEntry.ClassEntryImpl.class),
+                        readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class));
+                case TAG_NAMEANDTYPE -> new AbstractPoolEntry.NameAndTypeEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class),
+                        readEntry(q + 2, AbstractPoolEntry.Utf8EntryImpl.class));
                 case TAG_METHODHANDLE -> new AbstractPoolEntry.MethodHandleEntryImpl(this, index, readU1(q),
                                                                                      readEntry(q + 1, AbstractPoolEntry.AbstractMemberRefEntry.class));
-                case TAG_METHODTYPE -> new AbstractPoolEntry.MethodTypeEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q));
-                case TAG_CONSTANTDYNAMIC -> new AbstractPoolEntry.ConstantDynamicEntryImpl(this, index, readU2(q), (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2));
-                case TAG_INVOKEDYNAMIC -> new AbstractPoolEntry.InvokeDynamicEntryImpl(this, index, readU2(q), (AbstractPoolEntry.NameAndTypeEntryImpl) readNameAndTypeEntry(q + 2));
-                case TAG_MODULE -> new AbstractPoolEntry.ModuleEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q));
-                case TAG_PACKAGE -> new AbstractPoolEntry.PackageEntryImpl(this, index, (AbstractPoolEntry.Utf8EntryImpl) readUtf8Entry(q));
+                case TAG_METHODTYPE -> new AbstractPoolEntry.MethodTypeEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class));
+                case TAG_CONSTANTDYNAMIC -> new AbstractPoolEntry.ConstantDynamicEntryImpl(this, index, readU2(q), readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class));
+                case TAG_INVOKEDYNAMIC -> new AbstractPoolEntry.InvokeDynamicEntryImpl(this, index, readU2(q), readEntry(q + 2, AbstractPoolEntry.NameAndTypeEntryImpl.class));
+                case TAG_MODULE -> new AbstractPoolEntry.ModuleEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class));
+                case TAG_PACKAGE -> new AbstractPoolEntry.PackageEntryImpl(this, index, readEntry(q, AbstractPoolEntry.Utf8EntryImpl.class));
                 default -> throw new ConstantPoolException(
                         "Bad tag (" + tag + ") at index (" + index + ") position (" + offset + ")");
             };
@@ -428,7 +428,7 @@ public int skipAttributeHolder(int offset) {
             int len = readInt(p + 2);
             p += 6;
             if (len < 0 || len > classfileLength - p) {
-                throw new IllegalArgumentException("attribute " + readUtf8Entry(p - 6).stringValue() + " too big to handle");
+                throw new IllegalArgumentException("attribute " + readEntry(p - 6, Utf8Entry.class).stringValue() + " too big to handle");
             }
             p += len;
         }
@@ -465,41 +465,6 @@ public <T extends PoolEntry> T readEntryOrNull(int offset, Class<T> cls) {
         return entryByIndex(index, cls);
     }
 
-    @Override
-    public Utf8Entry readUtf8Entry(int pos) {
-        return readEntry(pos, Utf8Entry.class);
-    }
-
-    @Override
-    public Utf8Entry readUtf8EntryOrNull(int pos) {
-        return readEntryOrNull(pos, Utf8Entry.class);
-    }
-
-    @Override
-    public ModuleEntry readModuleEntry(int pos) {
-        return readEntry(pos, ModuleEntry.class);
-    }
-
-    @Override
-    public PackageEntry readPackageEntry(int pos) {
-        return readEntry(pos, PackageEntry.class);
-    }
-
-    @Override
-    public ClassEntry readClassEntry(int pos) {
-        return readEntry(pos, ClassEntry.class);
-    }
-
-    @Override
-    public NameAndTypeEntry readNameAndTypeEntry(int pos) {
-        return readEntry(pos, NameAndTypeEntry.class);
-    }
-
-    @Override
-    public MethodHandleEntry readMethodHandleEntry(int pos) {
-        return readEntry(pos, MethodHandleEntry.class);
-    }
-
     @Override
     public boolean compare(BufWriter bufWriter,
                            int bufWriterOffset,
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java
index f191cbf3c1f..e60a906e189 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/CodeRelabelerImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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,7 +42,6 @@
 
 public record CodeRelabelerImpl(BiFunction<Label, CodeBuilder, Label> mapFunction) implements CodeRelabeler {
 
-    @Override
     public Label relabel(Label label, CodeBuilder cob) {
         return mapFunction.apply(label, cob);
     }
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectCodeBuilder.java
index b961a12031f..0b6549a82da 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectCodeBuilder.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectCodeBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -75,7 +75,7 @@
 
 public final class DirectCodeBuilder
         extends AbstractDirectBuilder<CodeModel>
-        implements TerminalCodeBuilder, LabelContext {
+        implements TerminalCodeBuilder {
     private final List<CharacterRange> characterRanges = new ArrayList<>();
     final List<AbstractPseudoInstruction.ExceptionCatchImpl> handlers = new ArrayList<>();
     private final List<LocalVariable> localVariables = new ArrayList<>();
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/FieldImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/FieldImpl.java
index 6645ddb9396..fb072ae5638 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/FieldImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/FieldImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -61,12 +61,12 @@ public Optional<ClassModel> parent() {
 
     @Override
     public Utf8Entry fieldName() {
-        return reader.readUtf8Entry(startPos + 2);
+        return reader.readEntry(startPos + 2, Utf8Entry.class);
     }
 
     @Override
     public Utf8Entry fieldType() {
-        return reader.readUtf8Entry(startPos + 4);
+        return reader.readEntry(startPos + 4, Utf8Entry.class);
     }
 
     @Override
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/LabelContext.java b/src/java.base/share/classes/jdk/internal/classfile/impl/LabelContext.java
index e17adcbcf12..749abbed23b 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/LabelContext.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/LabelContext.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,7 @@
 import java.lang.classfile.Label;
 
 public sealed interface LabelContext
-        permits BufferedCodeBuilder, CodeImpl, DirectCodeBuilder {
+        permits TerminalCodeBuilder, CodeImpl {
     Label newLabel();
     Label getLabel(int bci);
     void setLabelTarget(Label label, int bci);
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/LabelImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/LabelImpl.java
index b316c5a6dd1..2aaf5f033c0 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/LabelImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/LabelImpl.java
@@ -51,7 +51,7 @@ public final class LabelImpl
     private final LabelContext labelContext;
     private int bci;
 
-        public LabelImpl(LabelContext labelContext, int bci) {
+    public LabelImpl(LabelContext labelContext, int bci) {
         this.labelContext = Objects.requireNonNull(labelContext);
         this.bci = bci;
     }
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java
index 9a96e586c55..3bc811634ee 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -64,12 +64,12 @@ public Optional<ClassModel> parent() {
 
     @Override
     public Utf8Entry methodName() {
-        return reader.readUtf8Entry(startPos + 2);
+        return reader.readEntry(startPos + 2, Utf8Entry.class);
     }
 
     @Override
     public Utf8Entry methodType() {
-        return reader.readUtf8Entry(startPos + 4);
+        return reader.readEntry(startPos + 4, Utf8Entry.class);
     }
 
     @Override
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ModuleAttributeBuilderImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ModuleAttributeBuilderImpl.java
index 1aad47cfd86..873b32e4ad6 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/ModuleAttributeBuilderImpl.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ModuleAttributeBuilderImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -58,7 +58,6 @@ public ModuleAttributeBuilderImpl(ModuleDesc moduleName) {
         this(TemporaryConstantPool.INSTANCE.moduleEntry(TemporaryConstantPool.INSTANCE.utf8Entry(moduleName.name())));
     }
 
-    @Override
     public ModuleAttribute build() {
         return new UnboundAttribute.UnboundModuleAttribute(moduleEntry, moduleFlags, moduleVersion,
                                                             requires, exports, opens, uses, provides);
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java b/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java
index b034328fdcc..6c5a8a266c0 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java
@@ -135,7 +135,6 @@ public boolean canWriteDirect(ConstantPool other) {
         return this == other || parent == other;
     }
 
-    @Override
     public boolean writeBootstrapMethods(BufWriter buf) {
         if (bsmSize == 0)
             return false;
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java b/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java
index ba032c7b0c2..5b103a21f8a 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/StackMapGenerator.java
@@ -25,17 +25,19 @@
  */
 package jdk.internal.classfile.impl;
 
-import java.lang.classfile.constantpool.InvokeDynamicEntry;
-import java.lang.classfile.constantpool.NameAndTypeEntry;
-import java.lang.constant.ClassDesc;
-import static java.lang.constant.ConstantDescs.*;
-import java.lang.constant.MethodTypeDesc;
+import java.lang.classfile.Attribute;
+import java.lang.classfile.Attributes;
+import java.lang.classfile.BufWriter;
 import java.lang.classfile.ClassFile;
+import java.lang.classfile.Label;
+import java.lang.classfile.attribute.StackMapTableAttribute;
 import java.lang.classfile.constantpool.ClassEntry;
 import java.lang.classfile.constantpool.ConstantDynamicEntry;
-import java.lang.classfile.constantpool.DynamicConstantPoolEntry;
-import java.lang.classfile.constantpool.MemberRefEntry;
 import java.lang.classfile.constantpool.ConstantPoolBuilder;
+import java.lang.classfile.constantpool.InvokeDynamicEntry;
+import java.lang.classfile.constantpool.MemberRefEntry;
+import java.lang.constant.ClassDesc;
+import java.lang.constant.MethodTypeDesc;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -43,13 +45,10 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
-import java.lang.classfile.Attribute;
+import jdk.internal.constant.ReferenceClassDescImpl;
 
 import static java.lang.classfile.ClassFile.*;
-import java.lang.classfile.BufWriter;
-import java.lang.classfile.Label;
-import java.lang.classfile.attribute.StackMapTableAttribute;
-import java.lang.classfile.Attributes;
+import static java.lang.constant.ConstantDescs.*;
 
 /**
  * StackMapGenerator is responsible for stack map frames generation.
@@ -1047,7 +1046,7 @@ private void setLocalRawInternal(int index, Type type) {
         void setLocalsFromArg(String name, MethodTypeDesc methodDesc, boolean isStatic, Type thisKlass) {
             int localsSize = 0;
             // Pre-emptively create a locals array that encompass all parameter slots
-            checkLocal(methodDesc.parameterCount() + (isStatic ? 0 : -1));
+            checkLocal(methodDesc.parameterCount() + (isStatic ? -1 : 0));
             if (!isStatic) {
                 localsSize++;
                 if (OBJECT_INITIALIZER_NAME.equals(name) && !CD_Object.equals(thisKlass.sym)) {
@@ -1249,14 +1248,14 @@ private static record Type(int tag, ClassDesc sym, int bci) {
         //frequently used types to reduce footprint
         static final Type OBJECT_TYPE = referenceType(CD_Object),
             THROWABLE_TYPE = referenceType(CD_Throwable),
-            INT_ARRAY_TYPE = referenceType(CD_int.arrayType()),
-            BOOLEAN_ARRAY_TYPE = referenceType(CD_boolean.arrayType()),
-            BYTE_ARRAY_TYPE = referenceType(CD_byte.arrayType()),
-            CHAR_ARRAY_TYPE = referenceType(CD_char.arrayType()),
-            SHORT_ARRAY_TYPE = referenceType(CD_short.arrayType()),
-            LONG_ARRAY_TYPE = referenceType(CD_long.arrayType()),
-            DOUBLE_ARRAY_TYPE = referenceType(CD_double.arrayType()),
-            FLOAT_ARRAY_TYPE = referenceType(CD_float.arrayType()),
+            INT_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[I")),
+            BOOLEAN_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[Z")),
+            BYTE_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[B")),
+            CHAR_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[C")),
+            SHORT_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[S")),
+            LONG_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[J")),
+            DOUBLE_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[D")),
+            FLOAT_ARRAY_TYPE = referenceType(ReferenceClassDescImpl.ofValidated("[F")),
             STRING_TYPE = referenceType(CD_String),
             CLASS_TYPE = referenceType(CD_Class),
             METHOD_HANDLE_TYPE = referenceType(CD_MethodHandle),
@@ -1321,8 +1320,8 @@ Type mergeComponentFrom(Type from, ClassHierarchyImpl context) {
             }
         }
 
-        private static final ClassDesc CD_Cloneable = ClassDesc.of("java.lang.Cloneable");
-        private static final ClassDesc CD_Serializable = ClassDesc.of("java.io.Serializable");
+        private static final ClassDesc CD_Cloneable = ReferenceClassDescImpl.ofValidated("Ljava/lang/Cloneable;");
+        private static final ClassDesc CD_Serializable = ReferenceClassDescImpl.ofValidated("Ljava/io/Serializable;");
 
         private Type mergeReferenceFrom(Type from, ClassHierarchyImpl context) {
             if (from == NULL_TYPE) {
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/TemporaryConstantPool.java b/src/java.base/share/classes/jdk/internal/classfile/impl/TemporaryConstantPool.java
index 7b15489ace7..e5f7d9cca79 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/TemporaryConstantPool.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/TemporaryConstantPool.java
@@ -190,11 +190,6 @@ public boolean canWriteDirect(ConstantPool constantPool) {
         return false;
     }
 
-    @Override
-    public boolean writeBootstrapMethods(BufWriter buf) {
-        throw new UnsupportedOperationException();
-    }
-
     @Override
     public void writeTo(BufWriter buf) {
         throw new UnsupportedOperationException();
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/TerminalCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/TerminalCodeBuilder.java
index e13b09b0a4d..6e3ca516bf4 100644
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/TerminalCodeBuilder.java
+++ b/src/java.base/share/classes/jdk/internal/classfile/impl/TerminalCodeBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@
 
 import java.lang.classfile.CodeBuilder;
 
-public sealed interface TerminalCodeBuilder extends CodeBuilder
-        permits DirectCodeBuilder, BufferedCodeBuilder, TransformingCodeBuilder {
-
+public sealed interface TerminalCodeBuilder extends CodeBuilder, LabelContext
+        permits DirectCodeBuilder, BufferedCodeBuilder {
+    int curTopLocal();
 }
diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/TransformingCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/TransformingCodeBuilder.java
deleted file mode 100644
index 4ffc75d3edc..00000000000
--- a/src/java.base/share/classes/jdk/internal/classfile/impl/TransformingCodeBuilder.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2022, 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 jdk.internal.classfile.impl;
-
-import java.lang.classfile.CodeBuilder;
-import java.lang.classfile.CodeModel;
-import java.util.Optional;
-import java.util.function.Consumer;
-import java.lang.classfile.CodeElement;
-import java.lang.classfile.Label;
-import java.lang.classfile.TypeKind;
-import java.lang.classfile.constantpool.ConstantPoolBuilder;
-
-public final class TransformingCodeBuilder implements TerminalCodeBuilder {
-
-    final CodeBuilder delegate;
-    final Consumer<CodeElement> consumer;
-
-    public TransformingCodeBuilder(CodeBuilder delegate, Consumer<CodeElement> consumer) {
-        this.delegate = delegate;
-        this.consumer = consumer;
-    }
-
-    @Override
-    public CodeBuilder with(CodeElement e) {
-        consumer.accept(e);
-        return this;
-    }
-
-    @Override
-    public Optional<CodeModel> original() {
-        return delegate.original();
-    }
-
-    @Override
-    public Label newLabel() {
-        return delegate.newLabel();
-    }
-
-    @Override
-    public Label startLabel() {
-        return delegate.startLabel();
-    }
-
-    @Override
-    public Label endLabel() {
-        return delegate.endLabel();
-    }
-
-    @Override
-    public int receiverSlot() {
-        return delegate.receiverSlot();
-    }
-
-    @Override
-    public int parameterSlot(int paramNo) {
-        return delegate.parameterSlot(paramNo);
-    }
-
-    @Override
-    public int allocateLocal(TypeKind typeKind) {
-        return delegate.allocateLocal(typeKind);
-    }
-
-    @Override
-    public ConstantPoolBuilder constantPool() {
-        return delegate.constantPool();
-    }
-}
diff --git a/src/java.base/share/classes/jdk/internal/constant/ConstantUtils.java b/src/java.base/share/classes/jdk/internal/constant/ConstantUtils.java
index 7c676a44b99..da90f373eb5 100644
--- a/src/java.base/share/classes/jdk/internal/constant/ConstantUtils.java
+++ b/src/java.base/share/classes/jdk/internal/constant/ConstantUtils.java
@@ -29,6 +29,8 @@
 import java.lang.constant.ClassDesc;
 import java.lang.constant.ConstantDesc;
 import java.lang.constant.ConstantDescs;
+import java.lang.constant.MethodTypeDesc;
+import java.lang.invoke.MethodType;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -41,12 +43,85 @@ public final class ConstantUtils {
     public static final ConstantDesc[] EMPTY_CONSTANTDESC = new ConstantDesc[0];
     public static final ClassDesc[] EMPTY_CLASSDESC = new ClassDesc[0];
     public static final int MAX_ARRAY_TYPE_DESC_DIMENSIONS = 255;
+    public static final ClassDesc CD_module_info = binaryNameToDesc("module-info");
 
     private static final Set<String> pointyNames = Set.of(ConstantDescs.INIT_NAME, ConstantDescs.CLASS_INIT_NAME);
 
     /** No instantiation */
     private ConstantUtils() {}
 
+    // Note:
+    // Non-JDK users should create their own utilities that wrap
+    // {@code .describeConstable().orElseThrow()} calls;
+    // these xxDesc methods has undefined and unsafe exceptional
+    // behavior, so they are not suitable as public APIs.
+
+    /**
+     * Creates a {@linkplain ClassDesc} from a pre-validated binary name
+     * for a class or interface type. Validated version of {@link
+     * ClassDesc#of(String)}.
+     *
+     * @param binaryName a binary name
+     */
+    public static ClassDesc binaryNameToDesc(String binaryName) {
+        return ReferenceClassDescImpl.ofValidated("L" + binaryToInternal(binaryName) + ";");
+    }
+
+    /**
+     * Creates a ClassDesc from a Class object, requires that this class
+     * can always be described nominally, i.e. this class is not a
+     * hidden class or interface or an array with a hidden component
+     * type.
+     */
+    public static ClassDesc classDesc(Class<?> type) {
+        if (type.isPrimitive()) {
+            return Wrapper.forPrimitiveType(type).basicClassDescriptor();
+        }
+        return referenceClassDesc(type);
+    }
+
+    /**
+     * Creates a ClassDesc from a Class object representing a non-hidden
+     * class or interface or an array type with a non-hidden component type.
+     */
+    public static ClassDesc referenceClassDesc(Class<?> type) {
+        return ReferenceClassDescImpl.ofValidated(type.descriptorString());
+    }
+
+    /**
+     * Creates a MethodTypeDesc from a MethodType object, requires that
+     * the type can be described nominally, i.e. all of its return
+     * type and parameter types can be described nominally.
+     */
+    public static MethodTypeDesc methodTypeDesc(MethodType type) {
+        var returnDesc = classDesc(type.returnType());
+        if (type.parameterCount() == 0) {
+            return MethodTypeDescImpl.ofValidated(returnDesc, EMPTY_CLASSDESC);
+        }
+        var paramDescs = new ClassDesc[type.parameterCount()];
+        for (int i = 0; i < type.parameterCount(); i++) {
+            paramDescs[i] = classDesc(type.parameterType(i));
+        }
+        return MethodTypeDescImpl.ofValidated(returnDesc, paramDescs);
+    }
+
+    /**
+     * Creates a MethodTypeDesc from return class and parameter
+     * class objects, requires that all of them can be described nominally.
+     * This version is mainly useful for working with Method objects.
+     */
+    public static MethodTypeDesc methodTypeDesc(Class<?> returnType, Class<?>[] parameterTypes) {
+        var returnDesc = classDesc(returnType);
+        if (parameterTypes.length == 0) {
+            return MethodTypeDescImpl.ofValidated(returnDesc, EMPTY_CLASSDESC);
+        }
+        var paramDescs = new ClassDesc[parameterTypes.length];
+        for (int i = 0; i < parameterTypes.length; i++) {
+            paramDescs[i] = classDesc(parameterTypes[i]);
+        }
+        return MethodTypeDescImpl.ofValidated(returnDesc, paramDescs);
+    }
+
     /**
      * Validates the correctness of a binary class name. In particular checks for the presence of
      * invalid characters in the name.
@@ -231,7 +306,7 @@ public static List<ClassDesc> parseMethodDescriptor(String descriptor) {
 
     private static ClassDesc resolveClassDesc(String descriptor, int start, int len) {
         if (len == 1) {
-            return Wrapper.forPrimitiveType(descriptor.charAt(start)).classDescriptor();
+            return Wrapper.forPrimitiveType(descriptor.charAt(start)).basicClassDescriptor();
         }
         // Pre-verified in parseMethodDescriptor; avoid redundant verification
         return ReferenceClassDescImpl.ofValidated(descriptor.substring(start, start + len));
diff --git a/src/java.base/share/classes/jdk/internal/constant/ReferenceClassDescImpl.java b/src/java.base/share/classes/jdk/internal/constant/ReferenceClassDescImpl.java
index b4ec9c13de5..71473b87e18 100644
--- a/src/java.base/share/classes/jdk/internal/constant/ReferenceClassDescImpl.java
+++ b/src/java.base/share/classes/jdk/internal/constant/ReferenceClassDescImpl.java
@@ -66,20 +66,11 @@ public static ReferenceClassDescImpl of(String descriptor) {
      * @jvms 4.3.2 Field Descriptors
      */
     public static ReferenceClassDescImpl ofValidated(String descriptor) {
+        assert ConstantUtils.skipOverFieldSignature(descriptor, 0, descriptor.length(), false)
+                == descriptor.length() : descriptor;
         return new ReferenceClassDescImpl(descriptor);
     }
 
-    /**
-     * Creates a {@linkplain ClassDesc} from a pre-validated descriptor string
-     * for a class or interface type or an array type.
-     *
-     * @param descriptor a field descriptor string for a class or interface type
-     * @jvms 4.3.2 Field Descriptors
-     */
-    public static ClassDesc ofValidatedBinaryName(String typeSwitchClassName) {
-        return ofValidated("L" + binaryToInternal(typeSwitchClassName) + ";");
-    }
-
     @Override
     public String descriptorString() {
         return descriptor;
diff --git a/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java b/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java
index f9f6ac2022a..325dbe1093f 100644
--- a/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java
+++ b/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java
@@ -159,7 +159,7 @@ public MemorySegment reinterpretInternal(Class<?> callerClass, long newSize, Sco
                 () -> cleanup.accept(SegmentFactories.makeNativeSegmentUnchecked(address(), newSize)) :
                 null;
         return SegmentFactories.makeNativeSegmentUnchecked(address(), newSize,
-                (MemorySessionImpl)scope, action);
+                (MemorySessionImpl)scope, readOnly, action);
     }
 
     private AbstractMemorySegmentImpl asSliceNoCheck(long offset, long newSize) {
diff --git a/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java b/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java
index 17f141b4e8c..133631e2aa4 100644
--- a/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java
+++ b/src/java.base/share/classes/jdk/internal/foreign/SegmentFactories.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -57,14 +57,18 @@ public class SegmentFactories {
     // associated with MemorySegment::ofAddress.
 
     @ForceInline
-    public static MemorySegment makeNativeSegmentUnchecked(long min, long byteSize, MemorySessionImpl sessionImpl, Runnable action) {
+    public static MemorySegment makeNativeSegmentUnchecked(long min,
+                                                           long byteSize,
+                                                           MemorySessionImpl sessionImpl,
+                                                           boolean readOnly,
+                                                           Runnable action) {
         ensureInitialized();
         if (action == null) {
             sessionImpl.checkValidState();
         } else {
             sessionImpl.addCloseAction(action);
         }
-        return new NativeMemorySegmentImpl(min, byteSize, false, sessionImpl);
+        return new NativeMemorySegmentImpl(min, byteSize, readOnly, sessionImpl);
     }
 
     @ForceInline
diff --git a/src/java.base/share/classes/jdk/internal/foreign/abi/BindingSpecializer.java b/src/java.base/share/classes/jdk/internal/foreign/abi/BindingSpecializer.java
index 7f5ef54bdca..6109f59f2d8 100644
--- a/src/java.base/share/classes/jdk/internal/foreign/abi/BindingSpecializer.java
+++ b/src/java.base/share/classes/jdk/internal/foreign/abi/BindingSpecializer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -29,6 +29,7 @@
 import java.lang.classfile.Label;
 import java.lang.classfile.Opcode;
 import java.lang.classfile.TypeKind;
+
 import jdk.internal.foreign.AbstractMemorySegmentImpl;
 import jdk.internal.foreign.MemorySessionImpl;
 import jdk.internal.foreign.Utils;
@@ -50,7 +51,6 @@
 
 import java.io.IOException;
 import java.lang.constant.ClassDesc;
-import java.lang.constant.Constable;
 import java.lang.constant.ConstantDesc;
 import java.lang.constant.DynamicConstantDesc;
 import java.lang.constant.MethodTypeDesc;
@@ -70,6 +70,7 @@
 import static java.lang.constant.ConstantDescs.*;
 import static java.lang.classfile.ClassFile.*;
 import static java.lang.classfile.TypeKind.*;
+import static jdk.internal.constant.ConstantUtils.*;
 
 public class BindingSpecializer {
     private static final String DUMP_CLASSES_DIR
@@ -80,24 +81,24 @@ public class BindingSpecializer {
     // Bunch of helper constants
     private static final int CLASSFILE_VERSION = ClassFileFormatVersion.latest().major();
 
-    private static final ClassDesc CD_Arena = desc(Arena.class);
-    private static final ClassDesc CD_MemorySegment = desc(MemorySegment.class);
-    private static final ClassDesc CD_MemorySegment_Scope = desc(MemorySegment.Scope.class);
-    private static final ClassDesc CD_SharedUtils = desc(SharedUtils.class);
-    private static final ClassDesc CD_AbstractMemorySegmentImpl = desc(AbstractMemorySegmentImpl.class);
-    private static final ClassDesc CD_MemorySessionImpl = desc(MemorySessionImpl.class);
-    private static final ClassDesc CD_Utils = desc(Utils.class);
-    private static final ClassDesc CD_SegmentAllocator = desc(SegmentAllocator.class);
-    private static final ClassDesc CD_ValueLayout = desc(ValueLayout.class);
-    private static final ClassDesc CD_ValueLayout_OfBoolean = desc(ValueLayout.OfBoolean.class);
-    private static final ClassDesc CD_ValueLayout_OfByte = desc(ValueLayout.OfByte.class);
-    private static final ClassDesc CD_ValueLayout_OfShort = desc(ValueLayout.OfShort.class);
-    private static final ClassDesc CD_ValueLayout_OfChar = desc(ValueLayout.OfChar.class);
-    private static final ClassDesc CD_ValueLayout_OfInt = desc(ValueLayout.OfInt.class);
-    private static final ClassDesc CD_ValueLayout_OfLong = desc(ValueLayout.OfLong.class);
-    private static final ClassDesc CD_ValueLayout_OfFloat = desc(ValueLayout.OfFloat.class);
-    private static final ClassDesc CD_ValueLayout_OfDouble = desc(ValueLayout.OfDouble.class);
-    private static final ClassDesc CD_AddressLayout = desc(AddressLayout.class);
+    private static final ClassDesc CD_Arena = referenceClassDesc(Arena.class);
+    private static final ClassDesc CD_MemorySegment = referenceClassDesc(MemorySegment.class);
+    private static final ClassDesc CD_MemorySegment_Scope = referenceClassDesc(MemorySegment.Scope.class);
+    private static final ClassDesc CD_SharedUtils = referenceClassDesc(SharedUtils.class);
+    private static final ClassDesc CD_AbstractMemorySegmentImpl = referenceClassDesc(AbstractMemorySegmentImpl.class);
+    private static final ClassDesc CD_MemorySessionImpl = referenceClassDesc(MemorySessionImpl.class);
+    private static final ClassDesc CD_Utils = referenceClassDesc(Utils.class);
+    private static final ClassDesc CD_SegmentAllocator = referenceClassDesc(SegmentAllocator.class);
+    private static final ClassDesc CD_ValueLayout = referenceClassDesc(ValueLayout.class);
+    private static final ClassDesc CD_ValueLayout_OfBoolean = referenceClassDesc(ValueLayout.OfBoolean.class);
+    private static final ClassDesc CD_ValueLayout_OfByte = referenceClassDesc(ValueLayout.OfByte.class);
+    private static final ClassDesc CD_ValueLayout_OfShort = referenceClassDesc(ValueLayout.OfShort.class);
+    private static final ClassDesc CD_ValueLayout_OfChar = referenceClassDesc(ValueLayout.OfChar.class);
+    private static final ClassDesc CD_ValueLayout_OfInt = referenceClassDesc(ValueLayout.OfInt.class);
+    private static final ClassDesc CD_ValueLayout_OfLong = referenceClassDesc(ValueLayout.OfLong.class);
+    private static final ClassDesc CD_ValueLayout_OfFloat = referenceClassDesc(ValueLayout.OfFloat.class);
+    private static final ClassDesc CD_ValueLayout_OfDouble = referenceClassDesc(ValueLayout.OfDouble.class);
+    private static final ClassDesc CD_AddressLayout = referenceClassDesc(AddressLayout.class);
 
     private static final MethodTypeDesc MTD_NEW_BOUNDED_ARENA = MethodTypeDesc.of(CD_Arena, CD_long);
     private static final MethodTypeDesc MTD_NEW_EMPTY_ARENA = MethodTypeDesc.of(CD_Arena);
@@ -196,7 +197,7 @@ private static byte[] specializeHelper(MethodType leafType, MethodType callerMet
             clb.withSuperclass(CD_Object);
             clb.withVersion(CLASSFILE_VERSION, 0);
 
-            clb.withMethodBody(METHOD_NAME, desc(callerMethodType), ACC_PUBLIC | ACC_STATIC,
+            clb.withMethodBody(METHOD_NAME, methodTypeDesc(callerMethodType), ACC_PUBLIC | ACC_STATIC,
                     cb -> new BindingSpecializer(cb, callerMethodType, callingSequence, abi, leafType).specialize());
         });
 
@@ -362,7 +363,7 @@ private void specialize() {
             cb.loadLocal(TypeKind.from(leafArgTypes.get(i)), leafArgSlots[i]);
         }
         // call leaf MH
-        cb.invokevirtual(CD_MethodHandle, "invokeExact", desc(leafType));
+        cb.invokevirtual(CD_MethodHandle, "invokeExact", methodTypeDesc(leafType));
 
         // for downcalls, store the result of the leaf handle call away, until
         // it is requested by a VM_LOAD in the return recipe.
@@ -466,9 +467,9 @@ private void doBindings(List<Binding> bindings) {
                 case Copy copy                   -> emitCopyBuffer(copy);
                 case Allocate allocate           -> emitAllocBuffer(allocate);
                 case BoxAddress boxAddress       -> emitBoxAddress(boxAddress);
-                case SegmentBase unused          -> emitSegmentBase();
+                case SegmentBase _               -> emitSegmentBase();
                 case SegmentOffset segmentOffset -> emitSegmentOffset(segmentOffset);
-                case Dup unused                  -> emitDupBinding();
+                case Dup _                       -> emitDupBinding();
                 case ShiftLeft shiftLeft         -> emitShiftLeft(shiftLeft);
                 case ShiftRight shiftRight       -> emitShiftRight(shiftRight);
                 case Cast cast                   -> emitCast(cast);
@@ -608,7 +609,7 @@ private void emitBufferStore(BufferStore bufferStore) {
             ClassDesc valueLayoutType = emitLoadLayoutConstant(storeType);
             cb.loadConstant(offset);
             cb.loadLocal(storeTypeKind, valueIdx);
-            MethodTypeDesc descriptor = MethodTypeDesc.of(CD_void, valueLayoutType, CD_long, desc(storeType));
+            MethodTypeDesc descriptor = MethodTypeDesc.of(CD_void, valueLayoutType, CD_long, classDesc(storeType));
             cb.invokeinterface(CD_MemorySegment, "set", descriptor);
         } else {
             // long longValue = ((Number) value).longValue();
@@ -666,7 +667,7 @@ private void emitBufferStore(BufferStore bufferStore) {
                 long writeOffset = offset + SharedUtils.pickChunkOffset(chunkOffset, byteWidth, chunkSize);
                 cb.loadConstant(writeOffset);
                 cb.loadLocal(chunkStoreTypeKind, chunkIdx);
-                MethodTypeDesc descriptor = MethodTypeDesc.of(CD_void, valueLayoutType, CD_long, desc(chunkStoreType));
+                MethodTypeDesc descriptor = MethodTypeDesc.of(CD_void, valueLayoutType, CD_long, classDesc(chunkStoreType));
                 cb.invokeinterface(CD_MemorySegment, "set", descriptor);
 
                 remaining -= chunkSize;
@@ -697,7 +698,7 @@ private void emitVMStore(VMStore vmStore) {
                 ClassDesc valueLayoutType = emitLoadLayoutConstant(storeType);
                 cb.loadConstant(retBufOffset);
                 cb.loadLocal(storeTypeKind, valueIdx);
-                MethodTypeDesc descriptor = MethodTypeDesc.of(CD_void, valueLayoutType, CD_long, desc(storeType));
+                MethodTypeDesc descriptor = MethodTypeDesc.of(CD_void, valueLayoutType, CD_long, classDesc(storeType));
                 cb.invokeinterface(CD_MemorySegment, "set", descriptor);
                 retBufOffset += abi.arch.typeSize(vmStore.storage().type());
             }
@@ -716,7 +717,7 @@ private void emitVMLoad(VMLoad vmLoad) {
                 cb.loadLocal(ReferenceType, returnBufferIdx);
                 ClassDesc valueLayoutType = emitLoadLayoutConstant(loadType);
                 cb.loadConstant(retBufOffset);
-                MethodTypeDesc descriptor = MethodTypeDesc.of(desc(loadType), valueLayoutType, CD_long);
+                MethodTypeDesc descriptor = MethodTypeDesc.of(classDesc(loadType), valueLayoutType, CD_long);
                 cb.invokeinterface(CD_MemorySegment, "get", descriptor);
                 retBufOffset += abi.arch.typeSize(vmLoad.storage().type());
                 pushType(loadType);
@@ -809,7 +810,7 @@ private void emitBufferLoad(BufferLoad bufferLoad) {
         if (SharedUtils.isPowerOfTwo(byteWidth)) {
             ClassDesc valueLayoutType = emitLoadLayoutConstant(loadType);
             cb.loadConstant(offset);
-            MethodTypeDesc descriptor = MethodTypeDesc.of(desc(loadType), valueLayoutType, CD_long);
+            MethodTypeDesc descriptor = MethodTypeDesc.of(classDesc(loadType), valueLayoutType, CD_long);
             cb.invokeinterface(CD_MemorySegment, "get", descriptor);
         } else {
             // chunked
@@ -849,7 +850,7 @@ private void emitBufferLoad(BufferLoad bufferLoad) {
                 // read from segment
                 cb.loadLocal(ReferenceType, readAddrIdx);
                 ClassDesc valueLayoutType = emitLoadLayoutConstant(chunkType);
-                MethodTypeDesc descriptor = MethodTypeDesc.of(desc(chunkType), valueLayoutType, CD_long);
+                MethodTypeDesc descriptor = MethodTypeDesc.of(classDesc(chunkType), valueLayoutType, CD_long);
                 long readOffset = offset + SharedUtils.pickChunkOffset(chunkOffset, byteWidth, chunkSize);
                 cb.loadConstant(readOffset);
                 cb.invokeinterface(CD_MemorySegment, "get", descriptor);
@@ -988,9 +989,4 @@ private void emitConstZero(TypeKind kind) {
             case ReferenceType -> cb.aconst_null();
         }
     }
-
-    @SuppressWarnings("unchecked")
-    private static <T> T desc(Constable c) {
-        return (T) c.describeConstable().orElseThrow();
-    }
 }
diff --git a/src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java b/src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java
index e3472d559b2..441137db486 100644
--- a/src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java
+++ b/src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java
@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Alibaba Group Holding Limited. 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
@@ -32,10 +33,24 @@
 import static java.lang.Math.multiplyHigh;
 import static jdk.internal.math.MathUtils.*;
 
+import sun.nio.cs.ISO_8859_1;
+
 /**
  * This class exposes a method to render a {@code double} as a string.
  */
-public final class DoubleToDecimal {
+public final class DoubleToDecimal extends ToDecimal {
+    /**
+     * Use LATIN1 encoding to process the in-out byte[] str
+     *
+     */
+    public static final DoubleToDecimal LATIN1 = new DoubleToDecimal(true);
+
+    /**
+     * Use UTF16 encoding to process the in-out byte[] str
+     *
+     */
+    public static final DoubleToDecimal UTF16  = new DoubleToDecimal(false);
+
     /*
      * For full details about this code see the following references:
      *
@@ -91,16 +106,6 @@ public final class DoubleToDecimal {
     /* Used in rop() */
     private static final long MASK_63 = (1L << 63) - 1;
 
-    /* Used for left-to-tight digit extraction */
-    private static final int MASK_28 = (1 << 28) - 1;
-
-    private static final int NON_SPECIAL    = 0;
-    private static final int PLUS_ZERO      = 1;
-    private static final int MINUS_ZERO     = 2;
-    private static final int PLUS_INF       = 3;
-    private static final int MINUS_INF      = 4;
-    private static final int NAN            = 5;
-
     /*
      * Room for the longer of the forms
      *     -ddddd.dddddddddddd         H + 2 characters
@@ -110,13 +115,8 @@ public final class DoubleToDecimal {
      */
     public static final int MAX_CHARS = H + 7;
 
-    private final byte[] bytes;
-
-    /* Index into bytes of rightmost valid character */
-    private int index;
-
-    private DoubleToDecimal(boolean noChars) {
-        bytes = noChars ? null : new byte[MAX_CHARS];
+    private DoubleToDecimal(boolean latin1) {
+        super(latin1);
     }
 
     /**
@@ -128,7 +128,14 @@ private DoubleToDecimal(boolean noChars) {
      * @see Double#toString(double)
      */
     public static String toString(double v) {
-        return new DoubleToDecimal(false).toDecimalString(v);
+        byte[] str = new byte[MAX_CHARS];
+        int pair = LATIN1.toDecimal(str, 0, v, null);
+        int type = pair & 0xFF00;
+        if (type == NON_SPECIAL) {
+            int size = pair & 0xFF;
+            return new String(str, 0, size, ISO_8859_1.INSTANCE);
+        }
+        return special(type);
     }
 
     /**
@@ -149,71 +156,42 @@ public static String toString(double v) {
      * @param fd    the object that will carry <i>f</i>, <i>e</i>, and <i>n</i>.
      */
     public static void split(double v, FormattedFPDecimal fd) {
-        new DoubleToDecimal(true).toDecimal(v, fd);
+        byte[] str = new byte[MAX_CHARS];
+        LATIN1.toDecimal(str, 0, v, fd);
     }
 
     /**
-     * Appends the rendering of the {@code v} to {@code app}.
+     * Appends the rendering of the {@code v} to {@code str}.
      *
      * <p>The outcome is the same as if {@code v} were first
      * {@link #toString(double) rendered} and the resulting string were then
-     * {@link Appendable#append(CharSequence) appended} to {@code app}.
      *
-     * @param v the {@code double} whose rendering is appended.
-     * @param app the {@link Appendable} to append to.
+     * @param str the String byte array to append to
+     * @param index the index into str
+     * @param v the {@code double} whose rendering is into str.
      * @throws IOException If an I/O error occurs
      */
-    public static Appendable appendTo(double v, Appendable app)
-            throws IOException {
-        return new DoubleToDecimal(false).appendDecimalTo(v, app);
-    }
+    public int putDecimal(byte[] str, int index, double v) {
+        assert 0 <= index && index <= length(str) - MAX_CHARS : "Trusted caller missed bounds check";
 
-    private String toDecimalString(double v) {
-        return switch (toDecimal(v, null)) {
-            case NON_SPECIAL -> charsToString();
-            case PLUS_ZERO -> "0.0";
-            case MINUS_ZERO -> "-0.0";
-            case PLUS_INF -> "Infinity";
-            case MINUS_INF -> "-Infinity";
-            default -> "NaN";
-        };
-    }
-
-    private Appendable appendDecimalTo(double v, Appendable app)
-            throws IOException {
-        switch (toDecimal(v, null)) {
-            case NON_SPECIAL:
-                char[] chars = new char[index + 1];
-                for (int i = 0; i < chars.length; ++i) {
-                    chars[i] = (char) bytes[i];
-                }
-                if (app instanceof StringBuilder builder) {
-                    return builder.append(chars);
-                }
-                if (app instanceof StringBuffer buffer) {
-                    return buffer.append(chars);
-                }
-                for (char c : chars) {
-                    app.append(c);
-                }
-                return app;
-            case PLUS_ZERO: return app.append("0.0");
-            case MINUS_ZERO: return app.append("-0.0");
-            case PLUS_INF: return app.append("Infinity");
-            case MINUS_INF: return app.append("-Infinity");
-            default: return app.append("NaN");
+        int pair = toDecimal(str, index, v, null);
+        int type = pair & 0xFF00;
+        if (type == NON_SPECIAL) {
+            return index + (pair & 0xFF);
         }
+        return putSpecial(str, index, type);
     }
 
     /*
-     * Returns
+     * Returns size in the lower byte, type in the high byte, where type is
      *     PLUS_ZERO       iff v is 0.0
      *     MINUS_ZERO      iff v is -0.0
      *     PLUS_INF        iff v is POSITIVE_INFINITY
      *     MINUS_INF       iff v is NEGATIVE_INFINITY
      *     NAN             iff v is NaN
+     *     otherwise NON_SPECIAL
      */
-    private int toDecimal(double v, FormattedFPDecimal fd) {
+    private int toDecimal(byte[] str, int index, double v, FormattedFPDecimal fd) {
         /*
          * For full details see references [2] and [1].
          *
@@ -227,13 +205,13 @@ private int toDecimal(double v, FormattedFPDecimal fd) {
         long t = bits & T_MASK;
         int bq = (int) (bits >>> P - 1) & BQ_MASK;
         if (bq < BQ_MASK) {
-            index = -1;
+            int start = index;
             if (bits < 0) {
                 /*
-                 * fd != null implies bytes == null and bits >= 0
+                 * fd != null implies str == null and bits >= 0
                  * Thus, when fd != null, control never reaches here.
                  */
-                append('-');
+                index = putChar(str, index, '-');
             }
             if (bq != 0) {
                 /* normal value. Here mq = -q */
@@ -243,16 +221,16 @@ private int toDecimal(double v, FormattedFPDecimal fd) {
                 if (0 < mq & mq < P) {
                     long f = c >> mq;
                     if (f << mq == c) {
-                        return toChars(f, 0, fd);
+                        return toChars(str, index, f, 0, fd) - start;
                     }
                 }
-                return toDecimal(-mq, c, 0, fd);
+                return toDecimal(str, index, -mq, c, 0, fd) - start;
             }
             if (t != 0) {
                 /* subnormal value */
-                return t < C_TINY
-                       ? toDecimal(Q_MIN, 10 * t, -1, fd)
-                       : toDecimal(Q_MIN, t, 0, fd);
+                return (t < C_TINY
+                        ? toDecimal(str, index, Q_MIN, 10 * t, -1, fd)
+                        : toDecimal(str, index, Q_MIN, t, 0, fd)) - start;
             }
             return bits == 0 ? PLUS_ZERO : MINUS_ZERO;
         }
@@ -262,7 +240,7 @@ private int toDecimal(double v, FormattedFPDecimal fd) {
         return bits > 0 ? PLUS_INF : MINUS_INF;
     }
 
-    private int toDecimal(int q, long c, int dk, FormattedFPDecimal fd) {
+    private int toDecimal(byte[] str, int index, int q, long c, int dk, FormattedFPDecimal fd) {
         /*
          * The skeleton corresponds to figure 7 of [1].
          * The efficient computations are those summarized in figure 9.
@@ -327,7 +305,7 @@ private int toDecimal(int q, long c, int dk, FormattedFPDecimal fd) {
             boolean upin = vbl + out <= sp10 << 2;
             boolean wpin = (tp10 << 2) + out <= vbr;
             if (upin != wpin) {
-                return toChars(upin ? sp10 : tp10, k, fd);
+                return toChars(str, index, upin ? sp10 : tp10, k, fd);
             }
         }
 
@@ -342,14 +320,14 @@ private int toDecimal(int q, long c, int dk, FormattedFPDecimal fd) {
         boolean win = (t << 2) + out <= vbr;
         if (uin != win) {
             /* Exactly one of u or w lies in Rv */
-            return toChars(uin ? s : t, k + dk, fd);
+            return toChars(str, index, uin ? s : t, k + dk, fd);
         }
         /*
          * Both u and w lie in Rv: determine the one closest to v.
          * See section 9.3 of [1].
          */
         long cmp = vb - (s + t << 1);
-        return toChars(cmp < 0 || cmp == 0 && (s & 0x1) == 0 ? s : t, k + dk, fd);
+        return toChars(str, index, cmp < 0 || cmp == 0 && (s & 0x1) == 0 ? s : t, k + dk, fd);
     }
 
     /*
@@ -368,7 +346,7 @@ private static long rop(long g1, long g0, long cp) {
     /*
      * Formats the decimal f 10^e.
      */
-    private int toChars(long f, int e, FormattedFPDecimal fd) {
+    private int toChars(byte[] str, int index, long f, int e, FormattedFPDecimal fd) {
         /*
          * For details not discussed here see section 10 of [1].
          *
@@ -381,7 +359,7 @@ private int toChars(long f, int e, FormattedFPDecimal fd) {
         }
         if (fd != null) {
             fd.set(f, e, len);
-            return NON_SPECIAL;
+            return index;
         }
 
         /*
@@ -413,115 +391,74 @@ private int toChars(long f, int e, FormattedFPDecimal fd) {
         int m = (int) (hm - 100_000_000 * h);
 
         if (0 < e && e <= 7) {
-            return toChars1(h, m, l, e);
+            return toChars1(str, index, h, m, l, e);
         }
         if (-3 < e && e <= 0) {
-            return toChars2(h, m, l, e);
+            return toChars2(str, index, h, m, l, e);
         }
-        return toChars3(h, m, l, e);
+        return toChars3(str, index, h, m, l, e);
     }
 
-    private int toChars1(int h, int m, int l, int e) {
+    private int toChars1(byte[] str, int index, int h, int m, int l, int e) {
         /*
          * 0 < e <= 7: plain format without leading zeroes.
          * Left-to-right digits extraction:
          * algorithm 1 in [3], with b = 10, k = 8, n = 28.
          */
-        appendDigit(h);
+        index = putDigit(str, index, h);
         int y = y(m);
         int t;
         int i = 1;
         for (; i < e; ++i) {
             t = 10 * y;
-            appendDigit(t >>> 28);
+            index = putDigit(str, index, t >>> 28);
             y = t & MASK_28;
         }
-        append('.');
+        index = putChar(str, index, '.');
         for (; i <= 8; ++i) {
             t = 10 * y;
-            appendDigit(t >>> 28);
+            index = putDigit(str, index, t >>> 28);
             y = t & MASK_28;
         }
-        lowDigits(l);
-        return NON_SPECIAL;
+        return lowDigits(str, index, l);
     }
 
-    private int toChars2(int h, int m, int l, int e) {
+    private int toChars2(byte[] str, int index, int h, int m, int l, int e) {
         /* -3 < e <= 0: plain format with leading zeroes */
-        appendDigit(0);
-        append('.');
+        index = putDigit(str, index, 0);
+        index = putChar(str, index, '.');
         for (; e < 0; ++e) {
-            appendDigit(0);
+            index = putDigit(str, index, 0);
         }
-        appendDigit(h);
-        append8Digits(m);
-        lowDigits(l);
-        return NON_SPECIAL;
+        index = putDigit(str, index, h);
+        index = put8Digits(str, index, m);
+        return lowDigits(str, index, l);
     }
 
-    private int toChars3(int h, int m, int l, int e) {
+    private int toChars3(byte[] str, int index, int h, int m, int l, int e) {
         /* -3 >= e | e > 7: computerized scientific notation */
-        appendDigit(h);
-        append('.');
-        append8Digits(m);
-        lowDigits(l);
-        exponent(e - 1);
-        return NON_SPECIAL;
+        index = putDigit(str, index, h);
+        index = putChar(str, index, '.');
+        index = put8Digits(str, index, m);
+        index = lowDigits(str, index, l);
+        return exponent(str, index, e - 1);
     }
 
-    private void lowDigits(int l) {
+    private int lowDigits(byte[] str, int index, int l) {
         if (l != 0) {
-            append8Digits(l);
+            index = put8Digits(str, index, l);
         }
-        removeTrailingZeroes();
+        return removeTrailingZeroes(str, index);
     }
 
-    private void append8Digits(int m) {
-        /*
-         * Left-to-right digits extraction:
-         * algorithm 1 in [3], with b = 10, k = 8, n = 28.
-         */
-        int y = y(m);
-        for (int i = 0; i < 8; ++i) {
-            int t = 10 * y;
-            appendDigit(t >>> 28);
-            y = t & MASK_28;
-        }
-    }
-
-    private void removeTrailingZeroes() {
-        while (bytes[index] == '0') {
-            --index;
-        }
-        /* ... but do not remove the one directly to the right of '.' */
-        if (bytes[index] == '.') {
-            ++index;
-        }
-    }
-
-    private int y(int a) {
-        /*
-         * Algorithm 1 in [3] needs computation of
-         *     floor((a + 1) 2^n / b^k) - 1
-         * with a < 10^8, b = 10, k = 8, n = 28.
-         * Noting that
-         *     (a + 1) 2^n <= 10^8 2^28 < 10^17
-         * For n = 17, m = 8 the table in section 10 of [1] leads to:
-         */
-        return (int) (multiplyHigh(
-                (long) (a + 1) << 28,
-                193_428_131_138_340_668L) >>> 20) - 1;
-    }
-
-    private void exponent(int e) {
-        append('E');
+    private int exponent(byte[] str, int index, int e) {
+        index = putChar(str, index, 'E');
         if (e < 0) {
-            append('-');
+            index = putChar(str, index, '-');
             e = -e;
         }
         if (e < 10) {
-            appendDigit(e);
-            return;
+            return putDigit(str, index, e);
         }
         int d;
         if (e >= 100) {
@@ -530,7 +467,7 @@ private void exponent(int e) {
              *     floor(e / 100) = floor(1_311 e / 2^17)
              */
             d = e * 1_311 >>> 17;
-            appendDigit(d);
+            index = putDigit(str, index, d);
             e -= 100 * d;
         }
         /*
@@ -538,22 +475,7 @@ private void exponent(int e) {
          *     floor(e / 10) = floor(103 e / 2^10)
          */
         d = e * 103 >>> 10;
-        appendDigit(d);
-        appendDigit(e - 10 * d);
-    }
-
-    private void append(int c) {
-        bytes[++index] = (byte) c;
+        index = putDigit(str, index, d);
+        return putDigit(str, index, e - 10 * d);
     }
-
-    private void appendDigit(int d) {
-        bytes[++index] = (byte) ('0' + d);
-    }
-
-    /* Using the deprecated constructor enhances performance */
-    @SuppressWarnings("deprecation")
-    private String charsToString() {
-        return new String(bytes, 0, 0, index + 1);
-    }
-
 }
diff --git a/src/java.base/share/classes/jdk/internal/math/FloatToDecimal.java b/src/java.base/share/classes/jdk/internal/math/FloatToDecimal.java
index 56382767f75..1ca68a000d9 100644
--- a/src/java.base/share/classes/jdk/internal/math/FloatToDecimal.java
+++ b/src/java.base/share/classes/jdk/internal/math/FloatToDecimal.java
@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Alibaba Group Holding Limited. 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
@@ -32,10 +33,24 @@
 import static java.lang.Math.multiplyHigh;
 import static jdk.internal.math.MathUtils.*;
 
+import sun.nio.cs.ISO_8859_1;
+
 /**
  * This class exposes a method to render a {@code float} as a string.
  */
-public final class FloatToDecimal {
+public final class FloatToDecimal extends ToDecimal {
+    /**
+     * Use LATIN1 encoding to process the in-out byte[] str
+     *
+     */
+    public static final FloatToDecimal LATIN1 = new FloatToDecimal(true);
+
+    /**
+     * Use UTF16 encoding to process the in-out byte[] str
+     *
+     */
+    public static final FloatToDecimal UTF16  = new FloatToDecimal(false);
+
     /*
      * For full details about this code see the following references:
      *
@@ -91,16 +106,6 @@ public final class FloatToDecimal {
     /* Used in rop() */
     private static final long MASK_32 = (1L << 32) - 1;
 
-    /* Used for left-to-tight digit extraction */
-    private static final int MASK_28 = (1 << 28) - 1;
-
-    private static final int NON_SPECIAL    = 0;
-    private static final int PLUS_ZERO      = 1;
-    private static final int MINUS_ZERO     = 2;
-    private static final int PLUS_INF       = 3;
-    private static final int MINUS_INF      = 4;
-    private static final int NAN            = 5;
-
     /*
      * Room for the longer of the forms
      *     -ddddd.dddd         H + 2 characters
@@ -110,12 +115,8 @@ public final class FloatToDecimal {
      */
     public static final int MAX_CHARS = H + 6;
 
-    private final byte[] bytes = new byte[MAX_CHARS];
-
-    /* Index into bytes of rightmost valid character */
-    private int index;
-
-    private FloatToDecimal() {
+    private FloatToDecimal(boolean latin1) {
+        super(latin1);
     }
 
     /**
@@ -127,71 +128,49 @@ private FloatToDecimal() {
      * @see Float#toString(float)
      */
     public static String toString(float v) {
-        return new FloatToDecimal().toDecimalString(v);
+        byte[] str = new byte[MAX_CHARS];
+        int pair = LATIN1.toDecimal(str, 0, v);
+        int type = pair & 0xFF00;
+        if (type == NON_SPECIAL) {
+            int size = pair & 0xFF;
+            return new String(str, 0, size, ISO_8859_1.INSTANCE);
+        }
+        return special(type);
     }
 
     /**
-     * Appends the rendering of the {@code v} to {@code app}.
+     * Appends the rendering of the {@code v} to {@code str}.
      *
      * <p>The outcome is the same as if {@code v} were first
-     * {@link #toString(float) rendered} and the resulting string were then
-     * {@link Appendable#append(CharSequence) appended} to {@code app}.
+     * {@link #toString(double) rendered} and the resulting string were then
      *
-     * @param v the {@code float} whose rendering is appended.
-     * @param app the {@link Appendable} to append to.
+     * @param str the String byte array to append to
+     * @param index the index into str
+     * @param v the {@code float} whose rendering is into str.
      * @throws IOException If an I/O error occurs
      */
-    public static Appendable appendTo(float v, Appendable app)
-            throws IOException {
-        return new FloatToDecimal().appendDecimalTo(v, app);
-    }
+    public int putDecimal(byte[] str, int index, float v) {
+        assert 0 <= index && index <= length(str) - MAX_CHARS : "Trusted caller missed bounds check";
 
-    private String toDecimalString(float v) {
-        return switch (toDecimal(v)) {
-            case NON_SPECIAL -> charsToString();
-            case PLUS_ZERO -> "0.0";
-            case MINUS_ZERO -> "-0.0";
-            case PLUS_INF -> "Infinity";
-            case MINUS_INF -> "-Infinity";
-            default -> "NaN";
-        };
-    }
-
-    private Appendable appendDecimalTo(float v, Appendable app)
-            throws IOException {
-        switch (toDecimal(v)) {
-            case NON_SPECIAL:
-                char[] chars = new char[index + 1];
-                for (int i = 0; i < chars.length; ++i) {
-                    chars[i] = (char) bytes[i];
-                }
-                if (app instanceof StringBuilder builder) {
-                    return builder.append(chars);
-                }
-                if (app instanceof StringBuffer buffer) {
-                    return buffer.append(chars);
-                }
-                for (char c : chars) {
-                    app.append(c);
-                }
-                return app;
-            case PLUS_ZERO: return app.append("0.0");
-            case MINUS_ZERO: return app.append("-0.0");
-            case PLUS_INF: return app.append("Infinity");
-            case MINUS_INF: return app.append("-Infinity");
-            default: return app.append("NaN");
+        int pair = toDecimal(str, index, v);
+        int type = pair & 0xFF00;
+        if (type == NON_SPECIAL) {
+            return index + (pair & 0xFF);
         }
+        return putSpecial(str, index, type);
     }
 
     /*
      * Returns
+     *     Combine type and size, the first byte is size, the second byte is type
+     *
      *     PLUS_ZERO       iff v is 0.0
      *     MINUS_ZERO      iff v is -0.0
      *     PLUS_INF        iff v is POSITIVE_INFINITY
      *     MINUS_INF       iff v is NEGATIVE_INFINITY
      *     NAN             iff v is NaN
      */
-    private int toDecimal(float v) {
+    private int toDecimal(byte[] str, int index, float v) {
         /*
          * For full details see references [2] and [1].
          *
@@ -205,9 +184,9 @@ private int toDecimal(float v) {
         int t = bits & T_MASK;
         int bq = (bits >>> P - 1) & BQ_MASK;
         if (bq < BQ_MASK) {
-            index = -1;
+            int start = index;
             if (bits < 0) {
-                append('-');
+                index = putChar(str, index, '-');
             }
             if (bq != 0) {
                 /* normal value. Here mq = -q */
@@ -217,16 +196,16 @@ private int toDecimal(float v) {
                 if (0 < mq & mq < P) {
                     int f = c >> mq;
                     if (f << mq == c) {
-                        return toChars(f, 0);
+                        return toChars(str, index, f, 0) - start;
                     }
                 }
-                return toDecimal(-mq, c, 0);
+                return toDecimal(str, index, -mq, c, 0) - start;
             }
             if (t != 0) {
                 /* subnormal value */
-                return t < C_TINY
-                       ? toDecimal(Q_MIN, 10 * t, -1)
-                       : toDecimal(Q_MIN, t, 0);
+                return (t < C_TINY
+                        ? toDecimal(str, index, Q_MIN, 10 * t, -1)
+                        : toDecimal(str, index, Q_MIN, t, 0)) - start;
             }
             return bits == 0 ? PLUS_ZERO : MINUS_ZERO;
         }
@@ -236,7 +215,7 @@ private int toDecimal(float v) {
         return bits > 0 ? PLUS_INF : MINUS_INF;
     }
 
-    private int toDecimal(int q, int c, int dk) {
+    private int toDecimal(byte[] str, int index, int q, int c, int dk) {
         /*
          * The skeleton corresponds to figure 7 of [1].
          * The efficient computations are those summarized in figure 9.
@@ -300,7 +279,7 @@ private int toDecimal(int q, int c, int dk) {
             boolean upin = vbl + out <= sp10 << 2;
             boolean wpin = (tp10 << 2) + out <= vbr;
             if (upin != wpin) {
-                return toChars(upin ? sp10 : tp10, k);
+                return toChars(str, index, upin ? sp10 : tp10, k);
             }
         }
 
@@ -315,14 +294,14 @@ private int toDecimal(int q, int c, int dk) {
         boolean win = (t << 2) + out <= vbr;
         if (uin != win) {
             /* Exactly one of u or w lies in Rv */
-            return toChars(uin ? s : t, k + dk);
+            return toChars(str, index, uin ? s : t, k + dk);
         }
         /*
          * Both u and w lie in Rv: determine the one closest to v.
          * See section 9.3 of [1].
          */
         int cmp = vb - (s + t << 1);
-        return toChars(cmp < 0 || cmp == 0 && (s & 0x1) == 0 ? s : t, k + dk);
+        return toChars(str, index, cmp < 0 || cmp == 0 && (s & 0x1) == 0 ? s : t, k + dk);
     }
 
     /*
@@ -338,7 +317,7 @@ private static int rop(long g, long cp) {
     /*
      * Formats the decimal f 10^e.
      */
-    private int toChars(int f, int e) {
+    private int toChars(byte[] str, int index, int f, int e) {
         /*
          * For details not discussed here see section 10 of [1].
          *
@@ -373,130 +352,74 @@ private int toChars(int f, int e) {
         int l = f - 100_000_000 * h;
 
         if (0 < e && e <= 7) {
-            return toChars1(h, l, e);
+            return toChars1(str, index, h, l, e);
         }
         if (-3 < e && e <= 0) {
-            return toChars2(h, l, e);
+            return toChars2(str, index, h, l, e);
         }
-        return toChars3(h, l, e);
+        return toChars3(str, index, h, l, e);
     }
 
-    private int toChars1(int h, int l, int e) {
+    private int toChars1(byte[] str, int index, int h, int l, int e) {
         /*
          * 0 < e <= 7: plain format without leading zeroes.
          * Left-to-right digits extraction:
          * algorithm 1 in [3], with b = 10, k = 8, n = 28.
          */
-        appendDigit(h);
+        index = putDigit(str, index, h);
         int y = y(l);
         int t;
         int i = 1;
         for (; i < e; ++i) {
             t = 10 * y;
-            appendDigit(t >>> 28);
+            index = putDigit(str, index, t >>> 28);
             y = t & MASK_28;
         }
-        append('.');
+        index = putChar(str, index, '.');
         for (; i <= 8; ++i) {
             t = 10 * y;
-            appendDigit(t >>> 28);
+            index = putDigit(str, index, t >>> 28);
             y = t & MASK_28;
         }
-        removeTrailingZeroes();
-        return NON_SPECIAL;
+        return removeTrailingZeroes(str, index);
     }
 
-    private int toChars2(int h, int l, int e) {
+    private int toChars2(byte[] str, int index, int h, int l, int e) {
         /* -3 < e <= 0: plain format with leading zeroes */
-        appendDigit(0);
-        append('.');
+        index = putDigit(str, index, 0);
+        index = putChar(str, index, '.');
         for (; e < 0; ++e) {
-          appendDigit(0);
+            index = putDigit(str, index, 0);
         }
-        appendDigit(h);
-        append8Digits(l);
-        removeTrailingZeroes();
-        return NON_SPECIAL;
+        index = putDigit(str, index, h);
+        index = put8Digits(str, index, l);
+        return removeTrailingZeroes(str, index);
     }
 
-    private int toChars3(int h, int l, int e) {
+    private int toChars3(byte[] str, int index, int h, int l, int e) {
         /* -3 >= e | e > 7: computerized scientific notation */
-        appendDigit(h);
-        append('.');
-        append8Digits(l);
-        removeTrailingZeroes();
-        exponent(e - 1);
-        return NON_SPECIAL;
+        index = putDigit(str, index, h);
+        index = putChar(str, index, '.');
+        index = put8Digits(str, index, l);
+        index = removeTrailingZeroes(str, index);
+        return exponent(str, index, e - 1);
     }
 
-    private void append8Digits(int m) {
-        /*
-         * Left-to-right digits extraction:
-         * algorithm 1 in [3], with b = 10, k = 8, n = 28.
-         */
-        int y = y(m);
-        for (int i = 0; i < 8; ++i) {
-            int t = 10 * y;
-            appendDigit(t >>> 28);
-            y = t & MASK_28;
-        }
-    }
-
-    private void removeTrailingZeroes() {
-        while (bytes[index] == '0') {
-            --index;
-        }
-        /* ... but do not remove the one directly to the right of '.' */
-        if (bytes[index] == '.') {
-            ++index;
-        }
-    }
-
-    private int y(int a) {
-        /*
-         * Algorithm 1 in [3] needs computation of
-         *     floor((a + 1) 2^n / b^k) - 1
-         * with a < 10^8, b = 10, k = 8, n = 28.
-         * Noting that
-         *     (a + 1) 2^n <= 10^8 2^28 < 10^17
-         * For n = 17, m = 8 the table in section 10 of [1] leads to:
-         */
-        return (int) (multiplyHigh(
-                (long) (a + 1) << 28,
-                193_428_131_138_340_668L) >>> 20) - 1;
-    }
-
-    private void exponent(int e) {
-        append('E');
+    private int exponent(byte[] str, int index, int e) {
+        index = putChar(str, index, 'E');
         if (e < 0) {
-            append('-');
+            index = putChar(str, index, '-');
             e = -e;
         }
         if (e < 10) {
-            appendDigit(e);
-            return;
+            return putDigit(str, index, e);
         }
         /*
          * For n = 2, m = 1 the table in section 10 of [1] shows
          *     floor(e / 10) = floor(103 e / 2^10)
          */
         int d = e * 103 >>> 10;
-        appendDigit(d);
-        appendDigit(e - 10 * d);
-    }
-
-    private void append(int c) {
-        bytes[++index] = (byte) c;
+        index = putDigit(str, index, d);
+        return putDigit(str, index, e - 10 * d);
     }
-
-    private void appendDigit(int d) {
-        bytes[++index] = (byte) ('0' + d);
-    }
-
-    /* Using the deprecated constructor enhances performance */
-    @SuppressWarnings("deprecation")
-    private String charsToString() {
-        return new String(bytes, 0, 0, index + 1);
-    }
-
 }
diff --git a/src/java.base/share/classes/jdk/internal/math/ToDecimal.java b/src/java.base/share/classes/jdk/internal/math/ToDecimal.java
new file mode 100644
index 00000000000..45d4da25323
--- /dev/null
+++ b/src/java.base/share/classes/jdk/internal/math/ToDecimal.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Alibaba Group Holding Limited. 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 jdk.internal.math;
+
+import jdk.internal.access.JavaLangAccess;
+import jdk.internal.access.SharedSecrets;
+
+import static java.lang.Math.multiplyHigh;
+
+abstract sealed class ToDecimal permits DoubleToDecimal, FloatToDecimal {
+    private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
+
+    /* Used for left-to-tight digit extraction */
+    static final int MASK_28 = (1 << 28) - 1;
+
+    static final int NON_SPECIAL = 0 << 8;
+    static final int PLUS_ZERO   = 1 << 8;
+    static final int MINUS_ZERO  = 2 << 8;
+    static final int PLUS_INF    = 3 << 8;
+    static final int MINUS_INF   = 4 << 8;
+    static final int NAN         = 5 << 8;
+
+    /**
+     * The identifier of the encoding used to encode the bytes. If latin1 is true, the encoding is LATIN1, false is UTF16
+     *
+     */
+    private final boolean latin1;
+
+    ToDecimal(boolean latin1) {
+        this.latin1 = latin1;
+    }
+
+    final int putChar(byte[] str, int index, int c) {
+        if (latin1) {
+            str[index] = (byte) c;
+        } else {
+            JLA.putCharUTF16(str, index, (char) c);
+        }
+        return index + 1;
+    }
+
+    final int putDigit(byte[] str, int index, int d) {
+        return putChar(str, index, (byte) ('0' + d));
+    }
+
+    final int put8Digits(byte[] str, int index, int m) {
+        /*
+         * Left-to-right digits extraction:
+         * algorithm 1 in [3], with b = 10, k = 8, n = 28.
+         */
+        if (latin1) {
+            put8DigitsLatin1(str, index, m);
+        } else {
+            put8DigitsUTF16 (str, index, m);
+        }
+        return index + 8;
+    }
+
+    private static void put8DigitsLatin1(byte[] str, int index, int m) {
+        int y = y(m);
+        for (int i = 0; i < 8; ++i) {
+            int t = 10 * y;
+            str[index + i] = (byte) ('0' + (t >>> 28));
+            y = t & MASK_28;
+        }
+    }
+
+    private static void put8DigitsUTF16(byte[] str, int index, int m) {
+        int y = y(m);
+        for (int i = 0; i < 8; ++i) {
+            int t = 10 * y;
+            JLA.putCharUTF16(str, index + i, '0' + (t >>> 28));
+            y = t & MASK_28;
+        }
+    }
+
+    static int y(int a) {
+        /*
+         * Algorithm 1 in [3] needs computation of
+         *     floor((a + 1) 2^n / b^k) - 1
+         * with a < 10^8, b = 10, k = 8, n = 28.
+         * Noting that
+         *     (a + 1) 2^n <= 10^8 2^28 < 10^17
+         * For n = 17, m = 8 the table in section 10 of [1] leads to:
+         */
+        return (int) (multiplyHigh(
+                (long) (a + 1) << 28,
+                193_428_131_138_340_668L) >>> 20) - 1;
+    }
+
+    final int removeTrailingZeroes(byte[] str, int index) {
+        if (latin1) {
+            while (str[index - 1] == '0') {
+                --index;
+            }
+            /* ... but do not remove the one directly to the right of '.' */
+            if (str[index - 1] == '.') {
+                ++index;
+            }
+        } else {
+            while (JLA.getUTF16Char(str, index - 1) == '0') {
+                --index;
+            }
+            /* ... but do not remove the one directly to the right of '.' */
+            if (JLA.getUTF16Char(str, index - 1) == '.') {
+                ++index;
+            }
+        }
+        return index;
+    }
+
+    @SuppressWarnings("deprecation")
+    final int putSpecial(byte[] str, int index, int type) {
+        String s = special(type);
+        int length = s.length();
+        if (latin1) {
+            s.getBytes(0, length, str, index);
+        } else {
+            for (int i = 0; i < length; ++i) {
+                putChar(str, index + i, s.charAt(i));
+            }
+        }
+        return index + length;
+    }
+
+    final int length(byte[] str) {
+        return str.length >> (latin1 ? 0 : 1);
+    }
+
+    static String special(int type) {
+        return switch (type) {
+            case PLUS_ZERO  -> "0.0";
+            case MINUS_ZERO -> "-0.0";
+            case PLUS_INF   -> "Infinity";
+            case MINUS_INF  -> "-Infinity";
+            default         -> "NaN";
+        };
+    }
+}
diff --git a/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java b/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java
index c9d3fd0adb6..6bc32d54a30 100644
--- a/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java
+++ b/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java
@@ -153,7 +153,7 @@ public byte[] toByteArray() throws IOException {
         var cc = ClassFile.of();
         var cm = cc.parse(in.readAllBytes());
         Version v = ModuleInfoExtender.this.version;
-        return cc.transform(cm, ClassTransform.endHandler(clb -> {
+        return cc.transformClass(cm, ClassTransform.endHandler(clb -> {
             // ModuleMainClass attribute
             if (mainClass != null) {
                 clb.with(ModuleMainClassAttribute.of(ClassDesc.of(mainClass)));
diff --git a/src/java.base/share/classes/jdk/internal/platform/Metrics.java b/src/java.base/share/classes/jdk/internal/platform/Metrics.java
index 50523d137ef..07d60f7f9fe 100644
--- a/src/java.base/share/classes/jdk/internal/platform/Metrics.java
+++ b/src/java.base/share/classes/jdk/internal/platform/Metrics.java
@@ -71,6 +71,23 @@ public static Metrics systemMetrics() {
      */
     public String getProvider();
 
+    /**
+     * Determines whether or not the underlying system
+     * has useful metrics (a.k.a. is containerized).
+     *
+     * @implNote
+     * Note that Metrics on some systems aren't useful.
+     * For example on a regular Linux system with cgroups
+     * present, with no limits enforced and not running in
+     * a container, Metric aren't useful. This can be used
+     * in order to determine if the system is containerized.
+     *
+     * @return true when the JVM runs in containerized mode.
+     *         false otherwise.
+     *
+     */
+    public boolean isContainerized();
+
 
     /* ***************************************************************
      * CPU Accounting Subsystem
diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java
index 075443571e1..c08db4f5b48 100644
--- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java
+++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 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
@@ -114,24 +114,19 @@ public static short digitPair(int i, boolean ucase) {
     }
 
     /**
-     * Return a little-endian packed integer for the 4 ASCII bytes for an input unsigned 2-byte integer.
-     * {@code b0} is the most significant byte and {@code b1} is the least significant byte.
-     * The integer is passed byte-wise to allow reordering of execution.
+     * Insert the unsigned 2-byte integer into the buffer as 4 hexadecimal digit ASCII bytes,
+     * only least significant 16 bits of {@code value} are used.
+     * @param buffer byte buffer to copy into
+     * @param index insert point
+     * @param value to convert
      */
-    public static int packDigits(int b0, int b1) {
-        return DIGITS[b0 & 0xff] | (DIGITS[b1 & 0xff] << 16);
-    }
-
-    /**
-     * Return a little-endian packed long for the 8 ASCII bytes for an input unsigned 4-byte integer.
-     * {@code b0} is the most significant byte and {@code b3} is the least significant byte.
-     * The integer is passed byte-wise to allow reordering of execution.
-     */
-    public static long packDigits(int b0, int b1, int b2, int b3) {
-        return DIGITS[b0 & 0xff]
-                | (DIGITS[b1 & 0xff] << 16)
-                | (((long) DIGITS[b2 & 0xff]) << 32)
-                | (((long) DIGITS[b3 & 0xff]) << 48);
+    public static void put4(byte[] buffer, int index, int value) {
+        // Prepare an int value so C2 generates a 4-byte write instead of two 2-byte writes
+        int v = (DIGITS[value & 0xff] << 16) | DIGITS[(value >> 8) & 0xff];
+        buffer[index]     = (byte)  v;
+        buffer[index + 1] = (byte) (v >> 8);
+        buffer[index + 2] = (byte) (v >> 16);
+        buffer[index + 3] = (byte) (v >> 24);
     }
 
     /**
diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java
index a8b0a0c992c..52c1029dd3d 100644
--- a/src/java.base/share/classes/module-info.java
+++ b/src/java.base/share/classes/module-info.java
@@ -165,6 +165,7 @@
         java.desktop,
         java.logging,
         java.management,
+        java.management.rmi,
         java.naming,
         java.rmi,
         jdk.charsets,
diff --git a/src/java.base/share/classes/sun/invoke/util/Wrapper.java b/src/java.base/share/classes/sun/invoke/util/Wrapper.java
index 5f2e9ba2841..5d0849cd93d 100644
--- a/src/java.base/share/classes/sun/invoke/util/Wrapper.java
+++ b/src/java.base/share/classes/sun/invoke/util/Wrapper.java
@@ -32,20 +32,31 @@
 import java.lang.constant.ConstantDescs;
 
 public enum Wrapper {
-    //        wrapperType      simple     primitiveType  simple     char  emptyArray     format               numericClass  superClass  classDescriptor
-    BOOLEAN(  Boolean.class,   "Boolean", boolean.class, "boolean", 'Z', new boolean[0], Format.unsigned( 1), 0, 0, ConstantDescs.CD_boolean),
+    //        wrapperType      simple     primitiveType  simple     char  emptyArray     format               numericClass  superClass
+    //        basicClassDescriptor    wrapperClassDescriptor
+    BOOLEAN(  Boolean.class,   "Boolean", boolean.class, "boolean", 'Z', new boolean[0], Format.unsigned( 1), 0, 0,
+            ConstantDescs.CD_boolean, ConstantDescs.CD_Boolean),
     // These must be in the order defined for widening primitive conversions in JLS 5.1.2
     // Avoid boxing integral types here to defer initialization of internal caches
-    BYTE   (     Byte.class,      "Byte",    byte.class,    "byte", 'B', new    byte[0], Format.signed(   8), BYTE_CLASS, BYTE_SUPERCLASSES, ConstantDescs.CD_byte),
-    SHORT  (    Short.class,     "Short",   short.class,   "short", 'S', new   short[0], Format.signed(  16), SHORT_CLASS, SHORT_SUPERCLASSES, ConstantDescs.CD_short),
-    CHAR   (Character.class, "Character",    char.class,    "char", 'C', new    char[0], Format.unsigned(16), CHAR_CLASS, CHAR_SUPERCLASSES, ConstantDescs.CD_char),
-    INT    (  Integer.class,   "Integer",     int.class,     "int", 'I', new     int[0], Format.signed(  32), INT_CLASS, INT_SUPERCLASSES, ConstantDescs.CD_int),
-    LONG   (     Long.class,      "Long",    long.class,    "long", 'J', new    long[0], Format.signed(  64), LONG_CLASS, LONG_SUPERCLASSES, ConstantDescs.CD_long),
-    FLOAT  (    Float.class,     "Float",   float.class,   "float", 'F', new   float[0], Format.floating(32), FLOAT_CLASS, FLOAT_SUPERCLASSES, ConstantDescs.CD_float),
-    DOUBLE (   Double.class,    "Double",  double.class,  "double", 'D', new  double[0], Format.floating(64), DOUBLE_CLASS, DOUBLE_CLASS, ConstantDescs.CD_double),
-    OBJECT (   Object.class,    "Object",  Object.class,  "Object", 'L', new  Object[0], Format.other(    1), 0, 0, ConstantDescs.CD_Object),
+    BYTE   (     Byte.class,      "Byte",    byte.class,    "byte", 'B', new    byte[0], Format.signed(   8), BYTE_CLASS, BYTE_SUPERCLASSES,
+            ConstantDescs.CD_byte, ConstantDescs.CD_Byte),
+    SHORT  (    Short.class,     "Short",   short.class,   "short", 'S', new   short[0], Format.signed(  16), SHORT_CLASS, SHORT_SUPERCLASSES,
+            ConstantDescs.CD_short, ConstantDescs.CD_Short),
+    CHAR   (Character.class, "Character",    char.class,    "char", 'C', new    char[0], Format.unsigned(16), CHAR_CLASS, CHAR_SUPERCLASSES,
+            ConstantDescs.CD_char, ConstantDescs.CD_Character),
+    INT    (  Integer.class,   "Integer",     int.class,     "int", 'I', new     int[0], Format.signed(  32), INT_CLASS, INT_SUPERCLASSES,
+            ConstantDescs.CD_int, ConstantDescs.CD_Integer),
+    LONG   (     Long.class,      "Long",    long.class,    "long", 'J', new    long[0], Format.signed(  64), LONG_CLASS, LONG_SUPERCLASSES,
+            ConstantDescs.CD_long, ConstantDescs.CD_Long),
+    FLOAT  (    Float.class,     "Float",   float.class,   "float", 'F', new   float[0], Format.floating(32), FLOAT_CLASS, FLOAT_SUPERCLASSES,
+            ConstantDescs.CD_float, ConstantDescs.CD_Float),
+    DOUBLE (   Double.class,    "Double",  double.class,  "double", 'D', new  double[0], Format.floating(64), DOUBLE_CLASS, DOUBLE_CLASS,
+            ConstantDescs.CD_double, ConstantDescs.CD_Double),
+    OBJECT (   Object.class,    "Object",  Object.class,  "Object", 'L', new  Object[0], Format.other(    1), 0, 0,
+            ConstantDescs.CD_Object, ConstantDescs.CD_Object),
     // VOID must be the last type, since it is "assignable" from any other type:
-    VOID   (     Void.class,      "Void",    void.class,    "void", 'V',           null, Format.other(    0), 0, 0, ConstantDescs.CD_void),
+    VOID   (     Void.class,      "Void",    void.class,    "void", 'V',           null, Format.other(    0), 0, 0,
+            ConstantDescs.CD_void, ConstantDescs.CD_Void),
     ;
 
     public static final int COUNT = 10;
@@ -60,18 +71,20 @@ public enum Wrapper {
     private final int      superClasses;
     private final String   wrapperSimpleName;
     private final String   primitiveSimpleName;
-    private final ClassDesc classDesc;
-
-    private Wrapper(Class<?> wtype,
-                    String wtypeName,
-                    Class<?> ptype,
-                    String ptypeName,
-                    char tchar,
-                    Object emptyArray,
-                    int format,
-                    int numericClass,
-                    int superClasses,
-                    ClassDesc classDesc) {
+    private final ClassDesc basicClassDesc;
+    private final ClassDesc wrapperClassDesc;
+
+    Wrapper(Class<?> wtype,
+            String wtypeName,
+            Class<?> ptype,
+            String ptypeName,
+            char tchar,
+            Object emptyArray,
+            int format,
+            int numericClass,
+            int superClasses,
+            ClassDesc basicClassDesc,
+            ClassDesc wrapperClassDesc) {
         this.wrapperType = wtype;
         this.primitiveType = ptype;
         this.basicTypeChar = tchar;
@@ -82,7 +95,8 @@ private Wrapper(Class<?> wtype,
         this.superClasses = superClasses;
         this.wrapperSimpleName = wtypeName;
         this.primitiveSimpleName = ptypeName;
-        this.classDesc = classDesc;
+        this.basicClassDesc = basicClassDesc;
+        this.wrapperClassDesc = wrapperClassDesc;
     }
 
     /** For debugging, give the details of this wrapper. */
@@ -390,7 +404,10 @@ public static Wrapper forBasicType(Class<?> type) {
     }
 
     /** A nominal descriptor of the wrapped type */
-    public ClassDesc classDescriptor() { return classDesc; }
+    public ClassDesc basicClassDescriptor() { return basicClassDesc; }
+
+    /** A nominal descriptor of the wrapper type */
+    public ClassDesc wrapperClassDescriptor() { return wrapperClassDesc; }
 
     /** What is the primitive type wrapped by this wrapper? */
     public Class<?> primitiveType() { return primitiveType; }
diff --git a/src/java.base/share/classes/sun/launcher/LauncherHelper.java b/src/java.base/share/classes/sun/launcher/LauncherHelper.java
index 60115526027..ccb82c84c92 100644
--- a/src/java.base/share/classes/sun/launcher/LauncherHelper.java
+++ b/src/java.base/share/classes/sun/launcher/LauncherHelper.java
@@ -370,6 +370,10 @@ private static void printSystemMetrics() {
         final long longRetvalNotSupported = -2;
 
         ostream.println(INDENT + "Provider: " + c.getProvider());
+        if (!c.isContainerized()) {
+            ostream.println(INDENT + "System not containerized.");
+            return;
+        }
         ostream.println(INDENT + "Effective CPU Count: " + c.getEffectiveCpuCount());
         ostream.println(formatCpuVal(c.getCpuPeriod(), INDENT + "CPU Period: ", longRetvalNotSupported));
         ostream.println(formatCpuVal(c.getCpuQuota(), INDENT + "CPU Quota: ", longRetvalNotSupported));
diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher_de.properties b/src/java.base/share/classes/sun/launcher/resources/launcher_de.properties
index 5da8b4bea5c..12ab942f91f 100644
--- a/src/java.base/share/classes/sun/launcher/resources/launcher_de.properties
+++ b/src/java.base/share/classes/sun/launcher/resources/launcher_de.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, 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
@@ -35,7 +35,7 @@ native Agent Library <libname>. Beispiel: -agentlib:jdwp\n                  sieh
 
 # Translators please note do not translate the options themselves
 java.launcher.X.usage=\n    -Xbatch           Deaktiviert die Hintergrundkompilierung\n    -Xbootclasspath/a:<durch {0} getrennte Verzeichnisse und ZIP-/JAR-Dateien>\n                      An das Ende des Bootstrap Classpaths anhängen\n    -Xcheck:jni       Führt zusätzliche Prüfungen für JNI-Funktionen aus\n    -Xcomp            Erzwingt die Kompilierung von Methoden beim ersten Aufruf\n    -Xdebug           Führt keine Aktion aus. Ist veraltet und wird in einem zukünftigen Release entfernt.\n    -Xdiag            Zeigt zusätzliche Diagnosemeldungen an\n    -Xfuture          Aktiviert strengste Prüfungen, als möglicher zukünftiger Standardwert erwartet.\n                      Diese Option ist veraltet und kann in einem\n                      zukünftigen Release entfernt werden.\n    -Xint             Nur Ausführung im interpretierten Modus\n    -Xinternalversion\n                      Zeigt detailliertere JVM-Versionsinformationen an als die\n                      Option -version\n    -Xlog:<Optionen>      Konfiguriert oder aktiviert Logging mit dem einheitlichen Java Virtual\n                      Machine-(JVM-)Logging-Framework. Verwenden Sie -Xlog:help\n                      für weitere Einzelheiten.\n    -Xloggc:<Datei>    Protokolliert den GC-Status in einer Datei mit Zeitstempeln.\n                      Diese Option ist veraltet und kann in einem\n                      zukünftigen Release entfernt werden. Wird durch -Xlog:gc:<Datei> ersetzt.\n    -Xmixed           Ausführung im gemischten Modus (Standard)\n    -Xmn<Größe>        Legt die anfängliche und maximale Größe (in Byte) des Heaps\n                      für die Young Generation (Nursery) fest\n    -Xms<Größe>        Legt die anfängliche Java-Heap-Größe fest\n    -Xmx<Größe>        Legt die maximale Java-Heap-Größe fest\n    -Xnoclassgc       Deaktiviert die Klassen-Garbage Collection\n    -Xrs               Reduziert die Verwendung von BS-Signalen durch Java/VM (siehe Dokumentation)\n    -Xshare:auto      Verwendet freigegebene Klassendaten, wenn möglich (Standard)\n    -Xshare:off       Versucht nicht, freigegebene Klassendaten zu verwenden\n    -Xshare:on        Erfordert die Verwendung freigegebener Klassendaten, verläuft sonst nicht erfolgreich.\n                      Diese Testoption kann zeitweise zu\n                      Fehlern führen. Sie darf nicht in Produktionsumgebungen verwendet werden.\n    -XshowSettings    Zeigt alle Einstellungen an und fährt fort\n    -XshowSettings:all\n                      Zeigt alle Einstellungen als Verbose-Ausgabe an und fährt fort\n    -XshowSettings:locale\n                      Zeigt alle gebietsschemabezogenen Einstellungen an und fährt fort\n    -XshowSettings:properties\n                      Zeigt alle Eigenschaftseinstellungen an und fährt fort\n    -XshowSettings:vm\n                      Zeigt alle VM-bezogenen Einstellungen an und fährt fort\n    -XshowSettings:security\n                      Zeigt alle Sicherheitseinstellungen an und fährt fort\n    -XshowSettings:security:all\n                      Zeigt alle Sicherheitseinstellungen an und fährt fort\n    -XshowSettings:security:properties\n                      Zeigt Sicherheitseigenschaften an und fährt fort\n    -XshowSettings:security:providers\n                      Zeigt statische Sicherheitsprovidereinstellungen an und fährt fort\n    -XshowSettings:security:tls\n                      Zeigt TLS-bezogene Sicherheitseinstellungen an und fährt fort\n    -XshowSettings:system\n                      (Nur Linux) Zeigt die Konfiguration des Hostsystems oder Containers an\n                      und fährt fort\n    -Xss<Größe>        Legt die Stackgröße des Java-Threads fest\n                      Die tatsächliche \
-Größe kann auf ein Vielfaches der\n                      Systemseitengröße aufgerundet werden, wenn für das Betriebssystem erforderlich.\n    -Xverify          Legt den Modus der Bytecodeverifizierung fest\n                      Beachten Sie, dass die Option -Xverify:none veraltet ist und\n                      in einem zukünftigen Release entfernt werden kann.\n    --add-reads <Modul>=<Zielmodul>(,<Zielmodul>)*\n                      Aktualisiert <Modul>, damit <Zielmodul> gelesen wird, ungeachtet\n                      der Moduldeklaration. \n                      <Zielmodul> kann ALL-UNNAMED sein, um alle unbenannten\n                      Module zu lesen.\n    --add-exports <Modul>/<Package>=<Zielmodul>(,<Zielmodul>)*\n                      Aktualisiert <Modul>, um <Package> in <Zielmodul> zu exportieren,\n                      ungeachtet der Moduldeklaration.\n                      <Zielmodul> kann ALL-UNNAMED sein, um in alle\n                      unbenannten Module zu exportieren.\n    --add-opens <Modul>/<Package>=<Zielmodul>(,<Zielmodul>)*\n                      Aktualisiert <Modul>, um <Package> in\n                      <Zielmodul> zu öffnen, ungeachtet der Moduldeklaration.\n    --limit-modules <Modulname>[,<Modulname>...]\n                      Grenzt die Gesamtmenge der beobachtbaren Module ein\n    --patch-module <Modul>=<Datei>({0}<Datei>)*\n                      Überschreibt oder erweitert ein Modul mit Klassen und Ressourcen\n                      in JAR-Dateien oder Verzeichnissen.\n    --source <Version>\n                      Legt die Version der Quelle im Quelldateimodus fest.\n    --finalization=<Wert>\n                      Steuert, ob die JVM Objekte finalisiert.\n                      Dabei ist <Wert> entweder "enabled" oder "disabled".\n                      Die Finalisierung ist standardmäßig aktiviert.\n\nDiese zusätzlichen Optionen können jederzeit ohne vorherige Ankündigung geändert werden.\n
+Größe kann auf ein Vielfaches der\n                      Systemseitengröße aufgerundet werden, wenn für das Betriebssystem erforderlich.\n    -Xverify          Legt den Modus der Bytecodeverifizierung fest\n                      Beachten Sie, dass die Option -Xverify:none veraltet ist und\n                      in einem zukünftigen Release entfernt werden kann.\n    --add-reads <Modul>=<Zielmodul>(,<Zielmodul>)*\n                      Aktualisiert <Modul>, damit <Zielmodul> gelesen wird, ungeachtet\n                      der Moduldeklaration. \n                      <Zielmodul> kann ALL-UNNAMED sein, um alle unbenannten\n                      Module zu lesen.\n    --add-exports <Modul>/<Package>=<Zielmodul>(,<Zielmodul>)*\n                      Aktualisiert <Modul>, um <Package> in <Zielmodul> zu exportieren,\n                      ungeachtet der Moduldeklaration.\n                      <Zielmodul> kann ALL-UNNAMED sein, um in alle\n                      unbenannten Module zu exportieren.\n    --add-opens <Modul>/<Package>=<Zielmodul>(,<Zielmodul>)*\n                      Aktualisiert <Modul>, um <Package> in\n                      <Zielmodul> zu öffnen, ungeachtet der Moduldeklaration.\n    --limit-modules <Modulname>[,<Modulname>...]\n                      Grenzt die Gesamtmenge der beobachtbaren Module ein\n    --patch-module <Modul>=<Datei>({0}<Datei>)*\n                      Überschreibt oder erweitert ein Modul mit Klassen und Ressourcen\n                      in JAR-Dateien oder Verzeichnissen.\n    --source <Version>\n                      Legt die Version der Quelle im Quelldateimodus fest.\n    --finalization=<Wert>\n                      Steuert, ob die JVM Objekte finalisiert.\n                      Dabei ist <Wert> entweder "enabled" oder "disabled".\n                      Die Finalisierung ist standardmäßig aktiviert.\n    --sun-misc-unsafe-memory-access=<value>\n                      Verwendung der nicht unterstützten API sun.misc.Unsafe zulassen oder verweigern\n                      <value> ist "allow", "warn", "debug" oder "deny".\n                      Der Standardwert ist "allow".\n\nDiese zusätzlichen Optionen können jederzeit ohne vorherige Ankündigung geändert werden.\n
 
 # Translators please note do not translate the options themselves
 java.launcher.X.macosx.usage=\nDie folgenden Optionen sind für macOS spezifisch:\n    -XstartOnFirstThread\n                      Führt die main()-Methode für den ersten (AppKit-)Thread aus\n    -Xdock:name=<Anwendungsname>\n                      Setzt den im Dock angezeigten Standardanwendungsnamen außer Kraft\n    -Xdock:icon=<Pfad zu Symboldatei>\n                      Setzt das im Dock angezeigte Standardsymbol außer Kraft\n\n
@@ -52,6 +52,7 @@ java.launcher.jar.error1=Fehler: Beim Versuch, Datei {0} zu öffnen, ist ein une
 java.launcher.jar.error2=Manifest in {0} nicht gefunden
 java.launcher.jar.error3=kein Hauptmanifestattribut, in {0}
 java.launcher.jar.error4=Fehler beim Laden des Java-Agents in {0}
+java.launcher.jar.error5=Fehler: Beim Versuch, Datei {0} zu schließen, ist ein unerwarteter Fehler aufgetreten
 java.launcher.jar.error.illegal.ena.value=Fehler: Ungültiger Wert "{0}" für das Manifestattribut "Enable-Native-Access". Nur ''ALL-UNNAMED'' ist zulässig
 java.launcher.init.error=Initialisierungsfehler
 java.launcher.javafx.error1=Fehler: Die JavaFX-Methode launchApplication hat die falsche Signatur, sie\nmuss als statisch deklariert werden und einen Wert vom Typ VOID zurückgeben
diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties b/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties
index 4455b2f8020..5d5223d49c6 100644
--- a/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties
+++ b/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, 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
@@ -37,7 +37,7 @@ java.launcher.opt.footer = \    -cp <ディレクトリおよびzip/jarファイ
 # Translators please note do not translate the options themselves
 java.launcher.X.usage=\n    -Xbatch           バックグラウンド・コンパイルを無効にします\n    -Xbootclasspath/a:<directories and zip/jar files separated by {0}>\n                      ブートストラップ・クラス・パスの最後に追加します\n    -Xcheck:jni       JNI関数に対する追加のチェックを実行します\n    -Xcomp            初回呼出し時にメソッドのコンパイルを強制します\n    -Xdebug           何も実行されません。将来のリリースで削除されるため、非推奨になりました。\n    -Xdiag            追加の診断メッセージを表示します\n    -Xfuture          将来のデフォルトを見越して、最も厳密なチェックを有効にします\n                      このオプションは非推奨であり、将来のリリースで削除される\n                      可能性があります。\n    -Xint             インタプリタ・モードの実行のみ\n    -Xinternalversion\n                      -versionオプションより詳細なJVMバージョン情報を\n                      表示します\n    -Xlog:<opts>      Java Virtual Machine (JVM)統合ロギング・フレームワークでの\n                      ロギングを構成または有効化します。詳細は、-Xlog:helpを\n                      使用してください。\n    -Xloggc:<file>    タイムスタンプが付いたファイルにGCステータスのログを記録します\n                      このオプションは非推奨であり、将来のリリースで削除される\n                      可能性があります。-Xlog:gc:<file>で置換されています。\n    -Xmixed           混合モードの実行(デフォルト)\n    -Xmn<size>        若い世代(ナーサリ)のヒープの初期サイズおよび最大サイズ\n                      (バイト単位)を設定します\n    -Xms<size>        Javaの初期ヒープ・サイズを設定します\n    -Xmx<size>        Javaの最大ヒープ・サイズを設定します\n    -Xnoclassgc       クラスのガベージ・コレクションを無効にします\n    -Xrs              Java/VMによるOSシグナルの使用を削減します(ドキュメントを参照)\n    -Xshare:auto      可能であれば共有クラス・データを使用します(デフォルト)\n    -Xshare:off       \
 共有クラス・データの使用を試みません\n    -Xshare:on        共有クラス・データの使用を必須にし、できなければ失敗します。\n                      これはテスト・オプションであり、断続的な失敗につながる\n                      可能性があります。本番環境では使用しないでください。\n    -XshowSettings    すべての設定を表示して続行します\n    -XshowSettings:all\n                      すべての設定を詳細に表示して続行します\n    -XshowSettings:locale\n                      すべてのロケール関連の設定を表示して続行します\n    -XshowSettings:properties\n                      すべてのプロパティ設定を表示して続行します\n    -XshowSettings:vm\n                      すべてのVM関連の設定を表示して続行します\n    -XshowSettings:security\n                      すべてのセキュリティ設定を表示して続行します\n    -XshowSettings:security:all\n                      すべてのセキュリティ設定を表示して続行します\n    -XshowSettings:security:properties\n                      セキュリティ・プロパティを表示して続行します\n    -XshowSettings:security:providers\n                      静的セキュリティ・プロバイダ設定を表示して続行します\n    -XshowSettings:security:tls\n                      TLS関連のセキュリティ設定を表示して続行します\n    -XshowSettings:system\n                      (Linuxのみ)ホスト・システムまたはコンテナを表示します\n                      構成して続行します\n    -Xss<size>        javaスレッドのスタック・サイズを設定します\n                      実際のサイズは、次の倍数に切り上げられる場合があります: \n                      オペレーティング・システムの要件に応じたシステム・ページ・サイズ。\n    -Xverify          バイトコード・ベリファイアのモードを設定します\n                      オプション-Xverify:noneは非推奨になり、\n                      将来のリリースで削除される可能性があります。\n    --add-reads <module>=<target-module>(,<target-module>)*\n                      モジュール宣言に関係なく、<module>を更新して<target-module>を\n                      \
-読み取ります。 \n                      <target-module>をALL-UNNAMEDに設定すると、すべての名前のないモジュールを\n                      読み取ることができます。\n    --add-exports <module>/<package>=<target-module>(,<target-module>)*\n                      モジュール宣言に関係なく、<module>を更新して<package>を<target-module>に\n                      エクスポートします。\n                      <target-module>をALL-UNNAMEDに設定すると、すべての名前のないモジュールに\n                      エクスポートできます。\n    --add-opens <module>/<package>=<target-module>(,<target-module>)*\n                      モジュール宣言に関係なく、<module>を更新して<package>を\n                      <target-module>に開きます。\n    --limit-modules <module name>[,<module name>...]\n                      参照可能なモジュールの領域を制限します\n    --patch-module <module>=<file>({0}<file>)*\n                      JARファイルまたはディレクトリのクラスおよびリソースで\n                      モジュールをオーバーライドまたは拡張します。\n    --source <version>\n                      ソースファイル・モードでソースのバージョンを設定します。\n    --finalization=<value>\n                      JVMがオブジェクトのファイナライズを実行するかどうかを制御します\n                      <value>は"enabled"または"disabled"のいずれかです。\n                      ファイナライズはデフォルトで有効になっています。\n\nこの追加オプションは予告なしに変更されることがあります。\n
+読み取ります。 \n                      <target-module>をALL-UNNAMEDに設定すると、すべての名前のないモジュールを\n                      読み取ることができます。\n    --add-exports <module>/<package>=<target-module>(,<target-module>)*\n                      モジュール宣言に関係なく、<module>を更新して<package>を<target-module>に\n                      エクスポートします。\n                      <target-module>をALL-UNNAMEDに設定すると、すべての名前のないモジュールに\n                      エクスポートできます。\n    --add-opens <module>/<package>=<target-module>(,<target-module>)*\n                      モジュール宣言に関係なく、<module>を更新して<package>を\n                      <target-module>に開きます。\n    --limit-modules <module name>[,<module name>...]\n                      参照可能なモジュールの領域を制限します\n    --patch-module <module>=<file>({0}<file>)*\n                      JARファイルまたはディレクトリのクラスおよびリソースで\n                      モジュールをオーバーライドまたは拡張します。\n    --source <version>\n                      ソースファイル・モードでソースのバージョンを設定します。\n    --finalization=<value>\n                      JVMがオブジェクトのファイナライズを実行するかどうかを制御します\n                      <value>は"enabled"または"disabled"のいずれかです。\n                      ファイナライズはデフォルトで有効になっています。\n    --sun-misc-unsafe-memory-access=<value>\n                      サポートされていないAPI sun.misc.Unsafeの使用を許可または拒否します\n                      <value>は"allow"、"warn"、"debug"または"deny"のいずれかです。\n                      デフォルト値は、"allow"です。\n\nこの追加オプションは予告なしに変更されることがあります。\n
 
 # Translators please note do not translate the options themselves
 java.launcher.X.macosx.usage=\n次のオプションはmacOS固有です:\n    -XstartOnFirstThread\n                      main()メソッドを最初(AppKit)のスレッドで実行する\n    -Xdock:name=<application name>\n                      Dockに表示されるデフォルト・アプリケーション名をオーバーライドする\n    -Xdock:icon=<path to icon file>\n                      Dockに表示されるデフォルト・アイコンをオーバーライドする\n\n
@@ -54,6 +54,7 @@ java.launcher.jar.error1=エラー: ファイル{0}を開こうとしている
 java.launcher.jar.error2={0}にマニフェストが見つかりません
 java.launcher.jar.error3={0}にメイン・マニフェスト属性がありません
 java.launcher.jar.error4={0}内のJavaエージェントのロード中にエラーが発生しました
+java.launcher.jar.error5=エラー: ファイル{0}を閉じるときに、予期しないエラーが発生しました
 java.launcher.jar.error.illegal.ena.value=エラー: Enable-Native-Accessマニフェスト属性の値"{0}"が不正です。''ALL-UNNAMED''のみ許可されます
 java.launcher.init.error=初期化エラー
 java.launcher.javafx.error1=エラー: JavaFX launchApplicationメソッドに誤ったシグネチャがあり、\nstaticを宣言してvoid型の値を返す必要があります
diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties b/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties
index d497402042a..c156e234cef 100644
--- a/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties
+++ b/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2024, 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
@@ -35,7 +35,7 @@ java.launcher.opt.footer = \    -cp <目录和 zip/jar 文件的类搜索路径>
 
 # Translators please note do not translate the options themselves
 java.launcher.X.usage=\n    -Xbatch           禁用后台编译\n    -Xbootclasspath/a:<以 {0} 分隔的目录和 zip/jar 文件>\n                      附加在引导类路径末尾\n    -Xcheck:jni       对 JNI 函数执行其他检查\n    -Xcomp            强制在首次调用时编译方法\n    -Xdebug           不执行任何操作;已过时,将在未来发行版中删除。\n    -Xdiag            显示附加诊断消息\n    -Xfuture          启用最严格的检查,预期将来的默认值。\n                      此选项已过时,可能会在\n                      未来发行版中删除。\n    -Xint             仅解释模式执行\n    -Xinternalversion\n                      显示比 -version 选项更详细的\n                      JVM 版本信息\n    -Xlog:<opts>      配置或启用采用 Java 虚拟\n                      机 (Java Virtual Machine, JVM) 统一记录框架进行事件记录。使用 -Xlog:help\n                      可了解详细信息。\n    -Xloggc:<file>    将 GC 状态记录在文件中(带时间戳)。\n                      此选项已过时,可能会在\n                      将来的发行版中删除。它将替换为 -Xlog:gc:<file>。\n    -Xmixed           混合模式执行(默认值)\n    -Xmn<size>        为年轻代(新生代)设置初始和最大堆大小\n                      (以字节为单位)\n    -Xms<size>        设置初始 Java 堆大小\n    -Xmx<size>        设置最大 Java 堆大小\n    -Xnoclassgc       禁用类垃圾收集\n    -Xrs              减少 Java/VM 对操作系统信号的使用(请参见文档)\n    -Xshare:auto      在可能的情况下使用共享类数据(默认值)\n    -Xshare:off       不尝试使用共享类数据\n    -Xshare:on        要求使用共享类数据,否则将失败。\n                      这是一个测试选项,可能导致间歇性\n                      故障。不应在生产环境中使用它。\n    -XshowSettings    显示所有设置并继续\n    -XshowSettings:all\n                      详细显示所有设置并继续\n    -XshowSettings:locale\n                      显示所有与区域设置相关的设置并继续\n    -XshowSettings:properties\n                      显示所有属性设置并继续\n    -XshowSettings:vm\n                      显示所有与 vm 相关的设置并继续\n    -XshowSettings:security\n                      显示所有安全设置并继续\n    -XshowSettings:security:all\n                      显示所有安全设置并继续\n    -XshowSettings:security:properties\n                     \
- 显示安全属性并继续\n    -XshowSettings:security:providers\n                      显示静态安全提供方设置并继续\n    -XshowSettings:security:tls\n                      显示与 TLS 相关的安全设置并继续\n    -XshowSettings:system\n                      (仅 Linux)显示主机系统或容器\n                      配置并继续\n    -Xss<size>        设置 Java 线程堆栈大小\n                      实际大小可以舍入到\n                      操作系统要求的系统页面大小的倍数。\n    -Xverify          设置字节码验证器的模式\n                      请注意,选项 -Xverify:none 已过时,\n                      可能会在未来发行版中删除。\n    --add-reads <module>=<target-module>(,<target-module>)*\n                      更新 <module> 以读取 <target-module>,而无论\n                      模块如何声明。 \n                      <target-module> 可以是 ALL-UNNAMED,将读取所有未命名\n                      模块。\n    --add-exports <module>/<package>=<target-module>(,<target-module>)*\n                      更新 <module> 以将 <package> 导出到 <target-module>,\n                      而无论模块如何声明。\n                      <target-module> 可以是 ALL-UNNAMED,将导出到所有\n                      未命名模块。\n    --add-opens <module>/<package>=<target-module>(,<target-module>)*\n                      更新 <module> 以在 <target-module> 中打开\n                      <package>,而无论模块如何声明。\n    --limit-modules <module name>[,<module name>...]\n                      限制可观察模块的领域\n    --patch-module <module>=<file>({0}<file>)*\n                      使用 JAR 文件或目录中的类和资源\n                      覆盖或增强模块。\n    --source <version>\n                      设置源文件模式中源的版本。\n    --finalization=<value>\n                      控制 JVM 是否执行对象最终处理,\n                      其中 <value> 为 "enabled" 或 "disabled" 之一。\n                      默认情况下,最终处理处于启用状态。\n\n这些额外选项如有更改, 恕不另行通知。\n
+ 显示安全属性并继续\n    -XshowSettings:security:providers\n                      显示静态安全提供方设置并继续\n    -XshowSettings:security:tls\n                      显示与 TLS 相关的安全设置并继续\n    -XshowSettings:system\n                      (仅 Linux)显示主机系统或容器\n                      配置并继续\n    -Xss<size>        设置 Java 线程堆栈大小\n                      实际大小可以舍入到\n                      操作系统要求的系统页面大小的倍数。\n    -Xverify          设置字节码验证器的模式\n                      请注意,选项 -Xverify:none 已过时,\n                      可能会在未来发行版中删除。\n    --add-reads <module>=<target-module>(,<target-module>)*\n                      更新 <module> 以读取 <target-module>,而无论\n                      模块如何声明。 \n                      <target-module> 可以是 ALL-UNNAMED,将读取所有未命名\n                      模块。\n    --add-exports <module>/<package>=<target-module>(,<target-module>)*\n                      更新 <module> 以将 <package> 导出到 <target-module>,\n                      而无论模块如何声明。\n                      <target-module> 可以是 ALL-UNNAMED,将导出到所有\n                      未命名模块。\n    --add-opens <module>/<package>=<target-module>(,<target-module>)*\n                      更新 <module> 以在 <target-module> 中打开\n                      <package>,而无论模块如何声明。\n    --limit-modules <module name>[,<module name>...]\n                      限制可观察模块的领域\n    --patch-module <module>=<file>({0}<file>)*\n                      使用 JAR 文件或目录中的类和资源\n                      覆盖或增强模块。\n    --source <version>\n                      设置源文件模式中源的版本。\n    --finalization=<value>\n                      控制 JVM 是否执行对象最终处理,\n                      其中 <value> 为 "enabled" 或 "disabled" 之一。\n                      默认情况下,最终处理处于启用状态。\n    --sun-misc-unsafe-memory-access=<value>\n                      允许或拒绝使用不受支持的 API sun.misc.Unsafe\n                      <value> 为 "allow"、"warn"、"debug" 或 "deny" 之一。\n                      默认值为 "allow"。\n\n这些额外选项如有更改, 恕不另行通知。\n
 
 # Translators please note do not translate the options themselves
 java.launcher.X.macosx.usage=\n以下选项是特定于 macOS 的选项:\n    -XstartOnFirstThread\n                      在第一个 (AppKit) 线程上运行 main() 方法\n    -Xdock:name=<application name>\n                      覆盖停靠栏中显示的默认应用程序名称\n    -Xdock:icon=<path to icon file>\n                     覆盖停靠栏中显示的默认图标\n\n
@@ -52,6 +52,7 @@ java.launcher.jar.error1=错误: 尝试打开文件{0}时出现意外错误
 java.launcher.jar.error2=在{0}中找不到清单
 java.launcher.jar.error3={0}中没有主清单属性
 java.launcher.jar.error4=在 {0} 中加载 Java 代理时出错
+java.launcher.jar.error5=错误:尝试关闭文件 {0} 时出现意外错误
 java.launcher.jar.error.illegal.ena.value=错误:Enable-Native-Access 清单属性的值 "{0}" 非法。仅允许使用 ''ALL-UNNAMED''
 java.launcher.init.error=初始化错误
 java.launcher.javafx.error1=错误: JavaFX launchApplication 方法具有错误的签名, 必须\n将方法声明为静态方法并返回空类型的值
diff --git a/src/java.base/share/classes/sun/net/www/MeteredStream.java b/src/java.base/share/classes/sun/net/www/MeteredStream.java
index d12389416fc..eaa93bba56c 100644
--- a/src/java.base/share/classes/sun/net/www/MeteredStream.java
+++ b/src/java.base/share/classes/sun/net/www/MeteredStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2024, 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
@@ -54,6 +54,9 @@ private final void justRead(long n) throws IOException {
         assert isLockHeldByCurrentThread();
 
         if (n == -1) {
+            if (expected > count) {
+                throw new IOException("Premature EOF");
+            }
 
             /*
              * don't close automatically when mark is set and is valid;
diff --git a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java
index 4790ee75dd9..5c06ac7d9be 100644
--- a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java
+++ b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java
@@ -806,14 +806,19 @@ private int receive(ByteBuffer dst, boolean connected) throws IOException {
         }
     }
 
+    /**
+     * Receives a datagram into a direct buffer.
+     */
     private int receiveIntoNativeBuffer(ByteBuffer bb, int rem, int pos,
                                         boolean connected)
         throws IOException
     {
         NIO_ACCESS.acquireSession(bb);
         try {
+            long bufAddress = NIO_ACCESS.getBufferAddress(bb);
             int n = receive0(fd,
-                             ((DirectBuffer)bb).address() + pos, rem,
+                             bufAddress + pos,
+                             rem,
                              sourceSockAddr.address(),
                              connected);
             if (n > 0)
@@ -991,6 +996,9 @@ private int send(FileDescriptor fd, ByteBuffer src, InetSocketAddress target)
         }
     }
 
+    /**
+     * Send a datagram contained in a direct buffer.
+     */
     private int sendFromNativeBuffer(FileDescriptor fd, ByteBuffer bb,
                                      InetSocketAddress target)
         throws IOException
@@ -1003,9 +1011,13 @@ private int sendFromNativeBuffer(FileDescriptor fd, ByteBuffer bb,
         int written;
         NIO_ACCESS.acquireSession(bb);
         try {
+            long bufAddress = NIO_ACCESS.getBufferAddress(bb);
             int addressLen = targetSocketAddress(target);
-            written = send0(fd, ((DirectBuffer)bb).address() + pos, rem,
-                            targetSockAddr.address(), addressLen);
+            written = send0(fd,
+                            bufAddress + pos,
+                            rem,
+                            targetSockAddr.address(),
+                            addressLen);
         } catch (PortUnreachableException pue) {
             if (isConnected())
                 throw pue;
@@ -1933,6 +1945,11 @@ protected void implCloseSelectableChannel() throws IOException {
 
     @Override
     public void kill() {
+        // wait for any read/write operations to complete before trying to close
+        readLock.lock();
+        readLock.unlock();
+        writeLock.lock();
+        writeLock.unlock();
         synchronized (stateLock) {
             if (state == ST_CLOSING) {
                 tryFinishClose();
diff --git a/src/java.base/share/classes/sun/nio/ch/Poller.java b/src/java.base/share/classes/sun/nio/ch/Poller.java
index a24b0cf924a..9d3a0e7d32c 100644
--- a/src/java.base/share/classes/sun/nio/ch/Poller.java
+++ b/src/java.base/share/classes/sun/nio/ch/Poller.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -190,7 +190,12 @@ private void poll(int fdVal, long nanos, BooleanSupplier supplier) throws IOExce
     private void register(int fdVal) throws IOException {
         Thread previous = map.put(fdVal, Thread.currentThread());
         assert previous == null;
-        implRegister(fdVal);
+        try {
+            implRegister(fdVal);
+        } catch (Throwable t) {
+            map.remove(fdVal);
+            throw t;
+        }
     }
 
     /**
diff --git a/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java
index c6ddad2a05c..0bd72bacf0b 100644
--- a/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java
+++ b/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java
@@ -654,6 +654,9 @@ protected void implCloseSelectableChannel() throws IOException {
 
     @Override
     public void kill() {
+        // wait for any accept operation to complete before trying to close
+        acceptLock.lock();
+        acceptLock.unlock();
         synchronized (stateLock) {
             if (state == ST_CLOSING) {
                 tryFinishClose();
diff --git a/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java
index f23a0aa0152..ebbf55acd97 100644
--- a/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java
+++ b/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java
@@ -1216,6 +1216,11 @@ protected void implCloseSelectableChannel() throws IOException {
 
     @Override
     public void kill() {
+        // wait for any read/write operations to complete before trying to close
+        readLock.lock();
+        readLock.unlock();
+        writeLock.lock();
+        writeLock.unlock();
         synchronized (stateLock) {
             if (state == ST_CLOSING) {
                 tryFinishClose();
diff --git a/src/java.base/share/classes/sun/security/provider/DigestBase.java b/src/java.base/share/classes/sun/security/provider/DigestBase.java
index dbe59396ac0..2aaf0a2fac6 100644
--- a/src/java.base/share/classes/sun/security/provider/DigestBase.java
+++ b/src/java.base/share/classes/sun/security/provider/DigestBase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -61,7 +61,7 @@ abstract class DigestBase extends MessageDigestSpi implements Cloneable {
     private final int digestLength;
 
     // size of the input to the compression function in bytes
-    private final int blockSize;
+    protected final int blockSize;
     // buffer to store partial blocks, blockSize bytes large
     // Subclasses should not access this array directly except possibly in their
     // implDigest() method. See MD5.java as an example.
diff --git a/src/java.base/share/classes/sun/security/provider/SHA3.java b/src/java.base/share/classes/sun/security/provider/SHA3.java
index 2b8bf8afbed..eaccf2a88e9 100644
--- a/src/java.base/share/classes/sun/security/provider/SHA3.java
+++ b/src/java.base/share/classes/sun/security/provider/SHA3.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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,13 +25,14 @@
 
 package sun.security.provider;
 
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.nio.ByteOrder;
 import java.security.ProviderException;
 import java.util.Arrays;
 import java.util.Objects;
 
 import jdk.internal.vm.annotation.IntrinsicCandidate;
-import static sun.security.provider.ByteArrayAccess.b2lLittle;
-import static sun.security.provider.ByteArrayAccess.l2bLittle;
 
 /**
  * This class implements the Secure Hash Algorithm SHA-3 developed by
@@ -48,7 +49,7 @@
 abstract class SHA3 extends DigestBase {
 
     private static final int WIDTH = 200; // in bytes, e.g. 1600 bits
-    private static final int DM = 5; // dimension of lanes
+    private static final int DM = 5; // dimension of state matrix
 
     private static final int NR = 24; // number of rounds
 
@@ -65,8 +66,11 @@ abstract class SHA3 extends DigestBase {
     };
 
     private final byte suffix;
-    private byte[] state = new byte[WIDTH];
-    private long[] lanes = new long[DM*DM];
+    private long[] state = new long[DM*DM];
+
+    static final VarHandle asLittleEndian
+            = MethodHandles.byteArrayViewVarHandle(long[].class,
+            ByteOrder.LITTLE_ENDIAN).withInvokeExactBehavior();
 
     /**
      * Creates a new SHA-3 object.
@@ -91,10 +95,12 @@ void implCompress(byte[] b, int ofs) {
 
     @IntrinsicCandidate
     private void implCompress0(byte[] b, int ofs) {
-       for (int i = 0; i < buffer.length; i++) {
-           state[i] ^= b[ofs++];
-       }
-       keccak();
+        for (int i = 0; i < blockSize / 8; i++) {
+            state[i] ^= (long) asLittleEndian.get(b, ofs);
+            ofs += 8;
+        }
+
+        keccak();
     }
 
     /**
@@ -102,29 +108,43 @@ private void implCompress0(byte[] b, int ofs) {
      * DigestBase calls implReset() when necessary.
      */
     void implDigest(byte[] out, int ofs) {
+        byte[] byteState = new byte[8];
         int numOfPadding =
-            setPaddingBytes(suffix, buffer, (int)(bytesProcessed % buffer.length));
+            setPaddingBytes(suffix, buffer, (int)(bytesProcessed % blockSize));
         if (numOfPadding < 1) {
             throw new ProviderException("Incorrect pad size: " + numOfPadding);
         }
         implCompress(buffer, 0);
-        int availableBytes = buffer.length;
+        int availableBytes = blockSize; // i.e. buffer.length
         int numBytes = engineGetDigestLength();
         while (numBytes > availableBytes) {
-            System.arraycopy(state, 0, out, ofs, availableBytes);
+            for (int i = 0; i < availableBytes / 8 ; i++) {
+                asLittleEndian.set(out, ofs, state[i]);
+                ofs += 8;
+            }
             numBytes -= availableBytes;
-            ofs += availableBytes;
             keccak();
         }
-        System.arraycopy(state, 0, out, ofs, numBytes);
+        int numLongs = (numBytes + 7) / 8;
+
+        for (int i = 0; i < numLongs - 1; i++) {
+            asLittleEndian.set(out, ofs, state[i]);
+            ofs += 8;
+        }
+        if (numBytes == numLongs * 8) {
+            asLittleEndian.set(out, ofs, state[numLongs - 1]);
+        } else {
+            asLittleEndian.set(byteState, 0, state[numLongs - 1]);
+            System.arraycopy(byteState, 0,
+                    out, ofs, numBytes - (numLongs - 1) * 8);
+        }
     }
 
     /**
      * Resets the internal state to start a new hash.
      */
     void implReset() {
-        Arrays.fill(state, (byte)0);
-        Arrays.fill(lanes, 0L);
+        Arrays.fill(state, 0L);
     }
 
     /**
@@ -144,46 +164,19 @@ private static int setPaddingBytes(byte suffix, byte[] in, int len) {
         return (in.length - len);
     }
 
-    /**
-     * Utility function for transforming the specified byte array 's'
-     * into array of lanes 'm' as defined in section 3.1.2.
-     */
-    private static void bytes2Lanes(byte[] s, long[] m) {
-        int sOfs = 0;
-        // Conversion traverses along x-axis before y-axis
-        for (int y = 0; y < DM; y++, sOfs += 40) {
-            b2lLittle(s, sOfs, m, DM*y, 40);
-        }
-    }
-
-    /**
-     * Utility function for transforming the specified array of
-     * lanes 'm' into a byte array 's' as defined in section 3.1.3.
-     */
-    private static void lanes2Bytes(long[] m, byte[] s) {
-        int sOfs = 0;
-        // Conversion traverses along x-axis before y-axis
-        for (int y = 0; y < DM; y++, sOfs += 40) {
-            l2bLittle(m, DM*y, s, sOfs, 40);
-        }
-    }
-
     /**
      * The function Keccak as defined in section 5.2 with
      * rate r = 1600 and capacity c.
      */
     private void keccak() {
-        // convert the 200-byte state into 25 lanes
-        bytes2Lanes(state, lanes);
-
         long a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
         long a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24;
         // move data into local variables
-        a0 = lanes[0]; a1 = lanes[1]; a2 = lanes[2]; a3 = lanes[3]; a4 = lanes[4];
-        a5 = lanes[5]; a6 = lanes[6]; a7 = lanes[7]; a8 = lanes[8]; a9 = lanes[9];
-        a10 = lanes[10]; a11 = lanes[11]; a12 = lanes[12]; a13 = lanes[13]; a14 = lanes[14];
-        a15 = lanes[15]; a16 = lanes[16]; a17 = lanes[17]; a18 = lanes[18]; a19 = lanes[19];
-        a20 = lanes[20]; a21 = lanes[21]; a22 = lanes[22]; a23 = lanes[23]; a24 = lanes[24];
+        a0 = state[0]; a1 = state[1]; a2 = state[2]; a3 = state[3]; a4 = state[4];
+        a5 = state[5]; a6 = state[6]; a7 = state[7]; a8 = state[8]; a9 = state[9];
+        a10 = state[10]; a11 = state[11]; a12 = state[12]; a13 = state[13]; a14 = state[14];
+        a15 = state[15]; a16 = state[16]; a17 = state[17]; a18 = state[18]; a19 = state[19];
+        a20 = state[20]; a21 = state[21]; a22 = state[22]; a23 = state[23]; a24 = state[24];
 
         // process the lanes through step mappings
         for (int ir = 0; ir < NR; ir++) {
@@ -287,20 +280,16 @@ private void keccak() {
             a0 ^= RC_CONSTANTS[ir];
         }
 
-        lanes[0] = a0; lanes[1] = a1; lanes[2] = a2; lanes[3] = a3; lanes[4] = a4;
-        lanes[5] = a5; lanes[6] = a6; lanes[7] = a7; lanes[8] = a8; lanes[9] = a9;
-        lanes[10] = a10; lanes[11] = a11; lanes[12] = a12; lanes[13] = a13; lanes[14] = a14;
-        lanes[15] = a15; lanes[16] = a16; lanes[17] = a17; lanes[18] = a18; lanes[19] = a19;
-        lanes[20] = a20; lanes[21] = a21; lanes[22] = a22; lanes[23] = a23; lanes[24] = a24;
-
-        // convert the resulting 25 lanes back into 200-byte state
-        lanes2Bytes(lanes, state);
+        state[0] = a0; state[1] = a1; state[2] = a2; state[3] = a3; state[4] = a4;
+        state[5] = a5; state[6] = a6; state[7] = a7; state[8] = a8; state[9] = a9;
+        state[10] = a10; state[11] = a11; state[12] = a12; state[13] = a13; state[14] = a14;
+        state[15] = a15; state[16] = a16; state[17] = a17; state[18] = a18; state[19] = a19;
+        state[20] = a20; state[21] = a21; state[22] = a22; state[23] = a23; state[24] = a24;
     }
 
     public Object clone() throws CloneNotSupportedException {
         SHA3 copy = (SHA3) super.clone();
         copy.state = copy.state.clone();
-        copy.lanes = new long[DM*DM];
         return copy;
     }
 
diff --git a/src/java.base/share/classes/sun/security/ssl/ClientHello.java b/src/java.base/share/classes/sun/security/ssl/ClientHello.java
index 091bfa8986e..babf2bb452d 100644
--- a/src/java.base/share/classes/sun/security/ssl/ClientHello.java
+++ b/src/java.base/share/classes/sun/security/ssl/ClientHello.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -903,8 +903,8 @@ private ProtocolVersion negotiateProtocol(
             throw context.conContext.fatal(Alert.PROTOCOL_VERSION,
                 "The client supported protocol versions " + Arrays.toString(
                     ProtocolVersion.toStringArray(clientSupportedVersions)) +
-                " are not accepted by server preferences " +
-                context.activeProtocols);
+                " are not accepted by server preferences " + Arrays.toString(
+                ProtocolVersion.toStringArray(context.activeProtocols)));
         }
     }
 
diff --git a/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java b/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java
index 3b0473d4eb0..a7809754ed0 100644
--- a/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java
+++ b/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2024, 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
@@ -168,12 +168,12 @@ void encodeHandshake(byte[] source,
 
             for (int limit = (offset + length); offset < limit;) {
 
-                int remains = (limit - offset) + (count - position);
-                int fragLen = Math.min(fragLimit, remains);
+                int remains = (limit - offset);
+                int fragLen = Math.min(fragLimit - count + position, remains);
 
                 // use the buf of ByteArrayOutputStream
                 write(source, offset, fragLen);
-                if (remains < fragLimit) {
+                if (remains < fragLen) {
                     return;
                 }
 
diff --git a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java
index bb8d727ba98..404c0dbd469 100644
--- a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java
+++ b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial.java
@@ -90,12 +90,11 @@ public abstract sealed class IntegerPolynomial implements IntegerFieldModuloP
      * store the result in an IntegerPolynomial representation in a. Requires
      * that a.length == numLimbs.
      */
-    protected int multByInt(long[] a, long b) {
+    protected void multByInt(long[] a, long b) {
         for (int i = 0; i < a.length; i++) {
             a[i] *= b;
         }
         reduce(a);
-        return 0;
     }
 
     /**
@@ -104,7 +103,7 @@ protected int multByInt(long[] a, long b) {
      * a.length == b.length == r.length == numLimbs. It is allowed for a and r
      * to be the same array.
      */
-    protected abstract int mult(long[] a, long[] b, long[] r);
+    protected abstract void mult(long[] a, long[] b, long[] r);
 
     /**
      * Multiply an IntegerPolynomial representation (a) with itself and store
@@ -112,7 +111,7 @@ protected int multByInt(long[] a, long b) {
      * a.length == r.length == numLimbs. It is allowed for a and r
      * to be the same array.
      */
-    protected abstract int square(long[] a, long[] r);
+    protected abstract void square(long[] a, long[] r);
 
     IntegerPolynomial(int bitsPerLimb,
                       int numLimbs,
@@ -622,8 +621,8 @@ public ImmutableElement multiply(IntegerModuloP genB) {
             }
 
             long[] newLimbs = new long[limbs.length];
-            int numAdds = mult(limbs, b.limbs, newLimbs);
-            return new ImmutableElement(newLimbs, numAdds);
+            mult(limbs, b.limbs, newLimbs);
+            return new ImmutableElement(newLimbs, 0);
         }
 
         @Override
@@ -635,8 +634,8 @@ public ImmutableElement square() {
             }
 
             long[] newLimbs = new long[limbs.length];
-            int numAdds = IntegerPolynomial.this.square(limbs, newLimbs);
-            return new ImmutableElement(newLimbs, numAdds);
+            IntegerPolynomial.this.square(limbs, newLimbs);
+            return new ImmutableElement(newLimbs, 0);
         }
 
         public void addModPowerTwo(IntegerModuloP arg, byte[] result) {
@@ -751,7 +750,8 @@ public MutableElement setProduct(IntegerModuloP genB) {
                 b.numAdds = 0;
             }
 
-            numAdds = mult(limbs, b.limbs, limbs);
+            mult(limbs, b.limbs, limbs);
+            numAdds = 0;
             return this;
         }
 
@@ -764,7 +764,8 @@ public MutableElement setProduct(SmallValue v) {
             }
 
             int value = ((Limb)v).value;
-            numAdds += multByInt(limbs, value);
+            multByInt(limbs, value);
+            numAdds = 0;
             return this;
         }
 
@@ -824,7 +825,8 @@ public MutableElement setSquare() {
                 numAdds = 0;
             }
 
-            numAdds = IntegerPolynomial.this.square(limbs, limbs);
+            IntegerPolynomial.this.square(limbs, limbs);
+            numAdds = 0;
             return this;
         }
 
diff --git a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial1305.java b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial1305.java
index 706651330d3..c4cd6b9da7d 100644
--- a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial1305.java
+++ b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomial1305.java
@@ -50,7 +50,7 @@ private IntegerPolynomial1305() {
         super(BITS_PER_LIMB, NUM_LIMBS, 1, MODULUS);
     }
 
-    protected int mult(long[] a, long[] b, long[] r) {
+    protected void mult(long[] a, long[] b, long[] r) {
 
         // Use grade-school multiplication into primitives to avoid the
         // temporary array allocation. This is equivalent to the following
@@ -73,7 +73,6 @@ protected int mult(long[] a, long[] b, long[] r) {
         long c8 = (a[4] * b[4]);
 
         carryReduce(r, c0, c1, c2, c3, c4, c5, c6, c7, c8);
-        return 0;
     }
 
     private void carryReduce(long[] r, long c0, long c1, long c2, long c3,
@@ -100,7 +99,7 @@ private void carryReduce(long[] r, long c0, long c1, long c2, long c3,
     }
 
     @Override
-    protected int square(long[] a, long[] r) {
+    protected void square(long[] a, long[] r) {
         // Use grade-school multiplication with a simple squaring optimization.
         // Multiply into primitives to avoid the temporary array allocation.
         // This is equivalent to the following code:
@@ -123,7 +122,6 @@ protected int square(long[] a, long[] r) {
         long c8 = (a[4] * a[4]);
 
         carryReduce(r, c0, c1, c2, c3, c4, c5, c6, c7, c8);
-        return 0;
     }
 
     @Override
diff --git a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomialModBinP.java b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomialModBinP.java
index e57316ed964..3e9b191ddce 100644
--- a/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomialModBinP.java
+++ b/src/java.base/share/classes/sun/security/util/math/intpoly/IntegerPolynomialModBinP.java
@@ -131,12 +131,11 @@ private void multOnly(long[] a, long[] b, long[] c) {
     }
 
     @Override
-    protected int mult(long[] a, long[] b, long[] r) {
+    protected void mult(long[] a, long[] b, long[] r) {
 
         long[] c = new long[2 * numLimbs];
         multOnly(a, b, c);
         carryReduce(c, r);
-        return 0;
     }
 
     private void modReduceInBits(long[] limbs, int index, int bits, long x) {
@@ -189,7 +188,7 @@ protected void reduce(long[] a) {
     }
 
     @Override
-    protected int square(long[] a, long[] r) {
+    protected void square(long[] a, long[] r) {
 
         long[] c = new long[2 * numLimbs];
         for (int i = 0; i < numLimbs; i++) {
@@ -200,7 +199,6 @@ protected int square(long[] a, long[] r) {
         }
 
         carryReduce(c, r);
-        return 0;
     }
 
     /**
diff --git a/src/java.base/share/classes/sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256.java b/src/java.base/share/classes/sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256.java
index 3a84b5f5088..e50890bd976 100644
--- a/src/java.base/share/classes/sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256.java
+++ b/src/java.base/share/classes/sun/security/util/math/intpoly/MontgomeryIntegerPolynomialP256.java
@@ -31,6 +31,7 @@
 import sun.security.util.math.IntegerFieldModuloP;
 import java.math.BigInteger;
 import jdk.internal.vm.annotation.IntrinsicCandidate;
+import jdk.internal.vm.annotation.ForceInline;
 
 // Reference:
 // - [1] Shay Gueron and Vlad Krasnov "Fast Prime Field Elliptic Curve
@@ -103,8 +104,8 @@ public ImmutableElement getElement(BigInteger v) {
         setLimbsValuePositive(v, vLimbs);
 
         // Convert to Montgomery domain
-        int numAdds = mult(vLimbs, h, montLimbs);
-        return new ImmutableElement(montLimbs, numAdds);
+        mult(vLimbs, h, montLimbs);
+        return new ImmutableElement(montLimbs, 0);
     }
 
     @Override
@@ -114,24 +115,6 @@ public SmallValue getSmallValue(int value) {
         return super.getSmallValue(value);
     }
 
-    /*
-     * This function is used by IntegerPolynomial.setProduct(SmallValue v) to
-     * multiply by a small constant (i.e. (int) 1,2,3,4). Instead of doing a
-     * montgomery conversion followed by a montgomery multiplication, just use
-     * the spare top (64-BITS_PER_LIMB) bits to multiply by a constant. (See [1]
-     * Section 4 )
-     *
-     * Will return an unreduced value
-     */
-    @Override
-    protected int multByInt(long[] a, long b) {
-        assert (b < (1 << BITS_PER_LIMB));
-        for (int i = 0; i < a.length; i++) {
-            a[i] *= b;
-        }
-        return (int) (b - 1);
-    }
-
     @Override
     public ImmutableIntegerModuloP fromMontgomery(ImmutableIntegerModuloP n) {
         assert n.getField() == MontgomeryIntegerPolynomialP256.ONE;
@@ -163,10 +146,11 @@ private void halfLimbs(long[] a, long[] r) {
     }
 
     @Override
-    protected int square(long[] a, long[] r) {
-        return mult(a, a, r);
+    protected void square(long[] a, long[] r) {
+        mult(a, a, r);
     }
 
+
     /**
      * Unrolled Word-by-Word Montgomery Multiplication r = a * b * 2^-260 (mod P)
      *
@@ -174,8 +158,15 @@ protected int square(long[] a, long[] r) {
      * for a Montgomery Friendly modulus p". Note: Step 6. Skipped; Instead use
      * numAdds to reuse existing overflow logic.
      */
+    @Override
+    protected void mult(long[] a, long[] b, long[] r) {
+        multImpl(a, b, r);
+        reducePositive(r);
+    }
+
+    @ForceInline
     @IntrinsicCandidate
-    protected int mult(long[] a, long[] b, long[] r) {
+    private void multImpl(long[] a, long[] b, long[] r) {
         long aa0 = a[0];
         long aa1 = a[1];
         long aa2 = a[2];
@@ -408,36 +399,16 @@ protected int mult(long[] a, long[] b, long[] r) {
         d4 += n4 & LIMB_MASK;
 
         c5 += d1 + dd0 + (d0 >>> BITS_PER_LIMB);
-        c6 += d2 + dd1 + (c5 >>> BITS_PER_LIMB);
-        c7 += d3 + dd2 + (c6 >>> BITS_PER_LIMB);
-        c8 += d4 + dd3 + (c7 >>> BITS_PER_LIMB);
-        c9 = dd4 + (c8 >>> BITS_PER_LIMB);
-
-        c5 &= LIMB_MASK;
-        c6 &= LIMB_MASK;
-        c7 &= LIMB_MASK;
-        c8 &= LIMB_MASK;
-
-        // At this point, the result could overflow by one modulus.
-        c0 = c5 - modulus[0];
-        c1 = c6 - modulus[1] + (c0 >> BITS_PER_LIMB);
-        c0 &= LIMB_MASK;
-        c2 = c7 - modulus[2] + (c1 >> BITS_PER_LIMB);
-        c1 &= LIMB_MASK;
-        c3 = c8 - modulus[3] + (c2 >> BITS_PER_LIMB);
-        c2 &= LIMB_MASK;
-        c4 = c9 - modulus[4] + (c3 >> BITS_PER_LIMB);
-        c3 &= LIMB_MASK;
-
-        long mask = c4 >> BITS_PER_LIMB; // Signed shift!
-
-        r[0] = ((c5 & mask) | (c0 & ~mask));
-        r[1] = ((c6 & mask) | (c1 & ~mask));
-        r[2] = ((c7 & mask) | (c2 & ~mask));
-        r[3] = ((c8 & mask) | (c3 & ~mask));
-        r[4] = ((c9 & mask) | (c4 & ~mask));
-
-        return 0;
+        c6 += d2 + dd1;
+        c7 += d3 + dd2;
+        c8 += d4 + dd3;
+        c9 = dd4;
+
+        r[0] = c5;
+        r[1] = c6;
+        r[2] = c7;
+        r[3] = c8;
+        r[4] = c9;
     }
 
     @Override
@@ -516,8 +487,8 @@ public ImmutableElement getElement(byte[] v, int offset, int length,
         super.encode(v, offset, length, highByte, vLimbs);
 
         // Convert to Montgomery domain
-        int numAdds = mult(vLimbs, h, montLimbs);
-        return new ImmutableElement(montLimbs, numAdds);
+        mult(vLimbs, h, montLimbs);
+        return new ImmutableElement(montLimbs, 0);
     }
 
     /*
@@ -556,4 +527,27 @@ protected void reduceIn(long[] limbs, long v, int i) {
         limbs[i - 5] += (v << 4) & LIMB_MASK;
         limbs[i - 4] += v >> 48;
     }
+
+    // Used when limbs a could overflow by one modulus.
+    @ForceInline
+    protected void reducePositive(long[] a) {
+        long aa0 = a[0];
+        long aa1 = a[1] + (aa0>>BITS_PER_LIMB);
+        long aa2 = a[2] + (aa1>>BITS_PER_LIMB);
+        long aa3 = a[3] + (aa2>>BITS_PER_LIMB);
+        long aa4 = a[4] + (aa3>>BITS_PER_LIMB);
+
+        long c0 = a[0] - modulus[0];
+        long c1 = a[1] - modulus[1] + (c0 >> BITS_PER_LIMB);
+        long c2 = a[2] - modulus[2] + (c1 >> BITS_PER_LIMB);
+        long c3 = a[3] - modulus[3] + (c2 >> BITS_PER_LIMB);
+        long c4 = a[4] - modulus[4] + (c3 >> BITS_PER_LIMB);
+        long mask = c4 >> BITS_PER_LIMB; // Signed shift!
+
+        a[0] = ((aa0 & mask) | (c0 & ~mask)) & LIMB_MASK;
+        a[1] = ((aa1 & mask) | (c1 & ~mask)) & LIMB_MASK;
+        a[2] = ((aa2 & mask) | (c2 & ~mask)) & LIMB_MASK;
+        a[3] = ((aa3 & mask) | (c3 & ~mask)) & LIMB_MASK;
+        a[4] = ((aa4 & mask) | (c4 & ~mask));
+    }
 }
diff --git a/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties b/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties
index 3cbbf15ed02..7e6acccf6e5 100644
--- a/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties
+++ b/src/java.base/share/classes/sun/util/resources/CurrencyNames.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2024, 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
@@ -287,6 +287,7 @@ ZAR=ZAR
 ZMK=ZMK
 ZMW=ZMW
 ZWD=ZWD
+ZWG=ZWG
 ZWL=ZWL
 ZWN=ZWN
 ZWR=ZWR
@@ -512,5 +513,6 @@ yum=Yugoslavian New Dinar (1994-2002)
 zar=South African Rand
 zmk=Zambian Kwacha
 zwd=Zimbabwean Dollar (1980-2008)
+zwg=Zimbabwe Gold
 zwl=Zimbabwean Dollar (2009)
 zwr=Zimbabwean Dollar (2008)
diff --git a/src/java.base/share/data/currency/CurrencyData.properties b/src/java.base/share/data/currency/CurrencyData.properties
index 1661b4cccba..5a28abccd00 100644
--- a/src/java.base/share/data/currency/CurrencyData.properties
+++ b/src/java.base/share/data/currency/CurrencyData.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2000, 2024, 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
@@ -32,7 +32,7 @@ formatVersion=3
 # Version of the currency code information in this class.
 # It is a serial number that accompanies with each amendment.
 
-dataVersion=176
+dataVersion=177
 
 # List of all valid ISO 4217 currency codes.
 # To ensure compatibility, do not remove codes.
@@ -56,8 +56,8 @@ all=ADP020-AED784-AFA004-AFN971-ALL008-AMD051-ANG532-AOA973-ARS032-ATS040-AUD036
     TPE626-TRL792-TRY949-TTD780-TWD901-TZS834-UAH980-UGX800-USD840-USN997-USS998-UYI940-\
     UYU858-UZS860-VEB862-VED926-VEF937-VES928-VND704-VUV548-WST882-XAF950-XAG961-XAU959-XBA955-\
     XBB956-XBC957-XBD958-XCD951-XCG532-XDR960-XFO000-XFU000-XOF952-XPD964-XPF953-\
-    XPT962-XSU994-XTS963-XUA965-XXX999-YER886-YUM891-ZAR710-ZMK894-ZMW967-ZWD716-ZWL932-\
-    ZWN942-ZWR935
+    XPT962-XSU994-XTS963-XUA965-XXX999-YER886-YUM891-ZAR710-ZMK894-ZMW967-ZWD716-ZWG924-\
+    ZWL932-ZWN942-ZWR935
 
 
 # Mappings from ISO 3166 country codes to ISO 4217 currency codes.
@@ -582,7 +582,7 @@ YE=YER
 # ZAMBIA
 ZM=ZMW
 # ZIMBABWE
-ZW=ZWL
+ZW=ZWG
 
 
 # List of currencies with non-2digit decimals for minor units,
diff --git a/src/java.base/share/data/lsrdata/language-subtag-registry.txt b/src/java.base/share/data/lsrdata/language-subtag-registry.txt
index 512134311e4..3079d77ed8b 100644
--- a/src/java.base/share/data/lsrdata/language-subtag-registry.txt
+++ b/src/java.base/share/data/lsrdata/language-subtag-registry.txt
@@ -1,4 +1,4 @@
-File-Date: 2024-05-16
+File-Date: 2024-06-14
 %%
 Type: language
 Subtag: aa
@@ -48009,7 +48009,9 @@ Type: variant
 Subtag: laukika
 Description: Classical Sanskrit
 Added: 2010-07-28
+Deprecated: 2024-06-08
 Prefix: sa
+Comments: Preferred tag is cls
 %%
 Type: variant
 Subtag: lemosin
@@ -48385,9 +48387,11 @@ Type: variant
 Subtag: vaidika
 Description: Vedic Sanskrit
 Added: 2010-07-28
+Deprecated: 2024-06-08
 Prefix: sa
 Comments: The most ancient dialect of Sanskrit used in verse and prose
   composed until about the 4th century B.C.E.
+Comments: Preferred tag is vsn
 %%
 Type: variant
 Subtag: valbadia
diff --git a/src/java.base/share/man/java.1 b/src/java.base/share/man/java.1
index 6cef707d19a..133710abc25 100644
--- a/src/java.base/share/man/java.1
+++ b/src/java.base/share/man/java.1
@@ -36,7 +36,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JAVA" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JAVA" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
@@ -186,7 +186,7 @@ with new values added and old values removed.
 You\[aq]ll get an error message if you use a value of \f[I]N\f[R] that
 is no longer supported.
 The supported values of \f[I]N\f[R] are the current Java SE release
-(\f[V]23\f[R]) and a limited number of previous releases, detailed in
+(\f[V]24\f[R]) and a limited number of previous releases, detailed in
 the command-line help for \f[V]javac\f[R], under the \f[V]--source\f[R]
 and \f[V]--release\f[R] options.
 .RE
@@ -1195,7 +1195,7 @@ or directories.
 \f[V]--source\f[R] \f[I]version\f[R]
 Sets the version of the source in source-file mode.
 .TP
-\f[V]--sun-misc-unsafe-memory-acces=\f[R] \f[I]value\f[R]
+\f[V]--sun-misc-unsafe-memory-access=\f[R] \f[I]value\f[R]
 Allow or deny usage of unsupported API \f[V]sun.misc.Unsafe\f[R].
 \f[I]value\f[R] is one of:
 .RS
@@ -1710,10 +1710,12 @@ This prevents the JVM from exiting and keeps the process active so that
 you can attach a debugger to it to investigate the cause of the error.
 By default, this option is disabled.
 .TP
-\f[V]-XX:StartFlightRecording=\f[R]\f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R]
+\f[V]-XX:StartFlightRecording:\f[R]\f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R]
 Starts a JFR recording for the Java application.
 This option is equivalent to the \f[V]JFR.start\f[R] diagnostic command
 that starts a recording during runtime.
+\f[V]-XX:StartFlightRecording:help\f[R] prints available options and
+example command lines.
 You can set the following \f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R]
 entries when starting a JFR recording:
 .RS
@@ -1760,6 +1762,8 @@ written when the recording is stopped, for example:
 .PP
 If %p and/or %t is specified in the filename, it expands to the
 JVM\[aq]s PID and the current timestamp, respectively.
+The filename may also be a directory in which case, the filename is
+generated from the PID and the current date in the specified directory.
 .RE
 .TP
 \f[V]name=\f[R]\f[I]identifier\f[R]
@@ -1840,6 +1844,9 @@ The whitespace delimiter can be omitted for timespan values, i.e.
 20ms.
 For more information about the settings syntax, see Javadoc of the
 jdk.jfr package.
+.PP
+To only see warnings and errors from JFR during startup set
+-Xlog:jfr+startup=warning.
 .RE
 .TP
 \f[V]-XX:ThreadStackSize=\f[R]\f[I]size\f[R]
@@ -3484,16 +3491,6 @@ By default, this option is disabled.
 Enables printing of information about adaptive-generation sizing.
 By default, this option is disabled.
 .TP
-\f[V]-XX:+ScavengeBeforeFullGC\f[R]
-Enables GC of the young generation before each full GC.
-This option is enabled by default.
-It is recommended that you \f[I]don\[aq]t\f[R] disable it, because
-scavenging the young generation before a full GC can reduce the number
-of objects reachable from the old generation space into the young
-generation space.
-To disable GC of the young generation before each full GC, specify the
-option \f[V]-XX:-ScavengeBeforeFullGC\f[R].
-.TP
 \f[V]-XX:SoftRefLRUPolicyMSPerMB=\f[R]\f[I]time\f[R]
 Sets the amount of time (in milliseconds) a softly reachable object is
 kept active on the heap after the last time it was referenced.
@@ -3747,45 +3744,18 @@ Example:
 Enables the use of Java Flight Recorder (JFR) during the runtime of the
 application.
 Since JDK 8u40 this option has not been required to use JFR.
-.TP
-\f[V]-XX:InitialRAMFraction=\f[R]\f[I]ratio\f[R]
-Sets the initial amount of memory that the JVM may use for the Java heap
-before applying ergonomics heuristics as a ratio of the maximum amount
-determined as described in the \f[V]-XX:MaxRAM\f[R] option.
-The default value is 64.
-.RS
-.PP
-Use the option \f[V]-XX:InitialRAMPercentage\f[R] instead.
-.RE
-.TP
-\f[V]-XX:MaxRAMFraction=\f[R]\f[I]ratio\f[R]
-Sets the maximum amount of memory that the JVM may use for the Java heap
-before applying ergonomics heuristics as a fraction of the maximum
-amount determined as described in the \f[V]-XX:MaxRAM\f[R] option.
-The default value is 4.
-.RS
-.PP
-Specifying this option disables automatic use of compressed oops if the
-combined result of this and other options influencing the maximum amount
-of memory is larger than the range of memory addressable by compressed
-oops.
-See \f[V]-XX:UseCompressedOops\f[R] for further information about
-compressed oops.
+.SH OBSOLETE JAVA OPTIONS
 .PP
-Use the option \f[V]-XX:MaxRAMPercentage\f[R] instead.
-.RE
+These \f[V]java\f[R] options are still accepted but ignored, and a
+warning is issued when they\[aq]re used.
 .TP
-\f[V]-XX:MinRAMFraction=\f[R]\f[I]ratio\f[R]
-Sets the maximum amount of memory that the JVM may use for the Java heap
-before applying ergonomics heuristics as a fraction of the maximum
-amount determined as described in the \f[V]-XX:MaxRAM\f[R] option for
-small heaps.
-A small heap is a heap of approximately 125 MB.
-The default value is 2.
-.RS
-.PP
-Use the option \f[V]-XX:MinRAMPercentage\f[R] instead.
-.RE
+\f[V]--illegal-access=\f[R]\f[I]parameter\f[R]
+Controlled \f[I]relaxed strong encapsulation\f[R], as defined in
+\f[B]JEP 261\f[R]
+[https://openjdk.org/jeps/261#Relaxed-strong-encapsulation].
+This option was deprecated in JDK 16 by \f[B]JEP 396\f[R]
+[https://openjdk.org/jeps/396] and made obsolete in JDK 17 by \f[B]JEP
+403\f[R] [https://openjdk.org/jeps/403].
 .TP
 \f[V]-XX:RTMAbortRatio=\f[R]\f[I]abort_ratio\f[R]
 Specifies the RTM abort ratio is specified as a percentage (%) of all
@@ -3863,43 +3833,70 @@ As a result, the processors repeatedly invalidate the cache lines of
 other processors, which forces them to read from main memory instead of
 their cache.
 .RE
-.SH OBSOLETE JAVA OPTIONS
-.PP
-These \f[V]java\f[R] options are still accepted but ignored, and a
-warning is issued when they\[aq]re used.
-.TP
-\f[V]--illegal-access=\f[R]\f[I]parameter\f[R]
-Controlled \f[I]relaxed strong encapsulation\f[R], as defined in
-\f[B]JEP 261\f[R]
-[https://openjdk.org/jeps/261#Relaxed-strong-encapsulation].
-This option was deprecated in JDK 16 by \f[B]JEP 396\f[R]
-[https://openjdk.org/jeps/396] and made obsolete in JDK 17 by \f[B]JEP
-403\f[R] [https://openjdk.org/jeps/403].
 .SH REMOVED JAVA OPTIONS
 .PP
-These \f[V]java\f[R] options have been removed in JDK 23 and using them
+These \f[V]java\f[R] options have been removed in JDK 24 and using them
 results in an error of:
 .RS
 .PP
 \f[V]Unrecognized VM option\f[R] \f[I]option-name\f[R]
 .RE
 .TP
-\f[V]-XX:+UseHugeTLBFS\f[R]
-\f[B]Linux only:\f[R] This option is the equivalent of specifying
-\f[V]-XX:+UseLargePages\f[R].
-This option is disabled by default.
-This option pre-allocates all large pages up-front, when memory is
-reserved; consequently the JVM can\[aq]t dynamically grow or shrink
-large pages memory areas; see \f[V]-XX:UseTransparentHugePages\f[R] if
-you want this behavior.
+\f[V]-XX:InitialRAMFraction=\f[R]\f[I]ratio\f[R]
+Sets the initial amount of memory that the JVM may use for the Java heap
+before applying ergonomics heuristics as a ratio of the maximum amount
+determined as described in the \f[V]-XX:MaxRAM\f[R] option.
+The default value is 64.
+.RS
+.PP
+Use the option \f[V]-XX:InitialRAMPercentage\f[R] instead.
+.RE
 .TP
-\f[V]-XX:+UseSHM\f[R]
-\f[B]Linux only:\f[R] Enables the JVM to use shared memory to set up
-large pages.
+\f[V]-XX:MaxRAMFraction=\f[R]\f[I]ratio\f[R]
+Sets the maximum amount of memory that the JVM may use for the Java heap
+before applying ergonomics heuristics as a fraction of the maximum
+amount determined as described in the \f[V]-XX:MaxRAM\f[R] option.
+The default value is 4.
+.RS
+.PP
+Specifying this option disables automatic use of compressed oops if the
+combined result of this and other options influencing the maximum amount
+of memory is larger than the range of memory addressable by compressed
+oops.
+See \f[V]-XX:UseCompressedOops\f[R] for further information about
+compressed oops.
+.PP
+Use the option \f[V]-XX:MaxRAMPercentage\f[R] instead.
+.RE
+.TP
+\f[V]-XX:MinRAMFraction=\f[R]\f[I]ratio\f[R]
+Sets the maximum amount of memory that the JVM may use for the Java heap
+before applying ergonomics heuristics as a fraction of the maximum
+amount determined as described in the \f[V]-XX:MaxRAM\f[R] option for
+small heaps.
+A small heap is a heap of approximately 125 MB.
+The default value is 2.
+.RS
+.PP
+Use the option \f[V]-XX:MinRAMPercentage\f[R] instead.
+.RE
+.TP
+\f[V]-XX:+ScavengeBeforeFullGC\f[R]
+Enables GC of the young generation before each full GC.
+This option is enabled by default.
+It is recommended that you \f[I]don\[aq]t\f[R] disable it, because
+scavenging the young generation before a full GC can reduce the number
+of objects reachable from the old generation space into the young
+generation space.
+To disable GC of the young generation before each full GC, specify the
+option \f[V]-XX:-ScavengeBeforeFullGC\f[R].
 .PP
 For the lists and descriptions of options removed in previous releases
 see the \f[I]Removed Java Options\f[R] section in:
 .IP \[bu] 2
+\f[B]The \f[VB]java\f[B] Command, Release 23\f[R]
+[https://docs.oracle.com/en/java/javase/23/docs/specs/man/java.html]
+.IP \[bu] 2
 \f[B]The \f[VB]java\f[B] Command, Release 22\f[R]
 [https://docs.oracle.com/en/java/javase/22/docs/specs/man/java.html]
 .IP \[bu] 2
diff --git a/src/java.base/share/man/keytool.1 b/src/java.base/share/man/keytool.1
index a61095d4504..63a134eb932 100644
--- a/src/java.base/share/man/keytool.1
+++ b/src/java.base/share/man/keytool.1
@@ -1,4 +1,4 @@
-.\" Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved.
+.\" Copyright (c) 1998, 2024, 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
@@ -36,7 +36,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "KEYTOOL" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "KEYTOOL" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
@@ -1747,7 +1747,7 @@ risk.
 The \f[V]keytool\f[R] command supports these named extensions.
 The names aren\[aq]t case-sensitive.
 .TP
-\f[V]BC\f[R] or \f[V]BasicContraints\f[R]
+\f[V]BC\f[R] or \f[V]BasicConstraints\f[R]
 Values:
 .RS
 .PP
diff --git a/src/java.base/share/native/libjli/args.c b/src/java.base/share/native/libjli/args.c
index 379291fe8ec..1e9b48730a9 100644
--- a/src/java.base/share/native/libjli/args.c
+++ b/src/java.base/share/native/libjli/args.c
@@ -501,7 +501,7 @@ static jboolean expand(JLI_List args, const char *str, const char *var_name) {
     // This is retained until the process terminates as it is saved as the args
     p = JLI_MemAlloc(JLI_StrLen(str) + 1);
     while (*str != '\0') {
-        while (*str != '\0' && isspace(*str)) {
+        while (*str != '\0' && isspace((unsigned char) *str)) {
             str++;
         }
 
@@ -511,7 +511,7 @@ static jboolean expand(JLI_List args, const char *str, const char *var_name) {
         }
 
         arg = p;
-        while (*str != '\0' && !isspace(*str)) {
+        while (*str != '\0' && !isspace((unsigned char) *str)) {
             if (inEnvVar && (*str == '"' || *str == '\'')) {
                 quote = *str++;
                 while (*str != quote && *str != '\0') {
@@ -577,7 +577,7 @@ static jboolean expand(JLI_List args, const char *str, const char *var_name) {
             exit(1);
         }
 
-        assert (*str == '\0' || isspace(*str));
+        assert (*str == '\0' || isspace((unsigned char) *str));
     }
 
     return JNI_TRUE;
diff --git a/src/java.base/share/native/libjli/java.c b/src/java.base/share/native/libjli/java.c
index 1d506c3a6df..1b4ece834d6 100644
--- a/src/java.base/share/native/libjli/java.c
+++ b/src/java.base/share/native/libjli/java.c
@@ -387,73 +387,92 @@ JLI_Launch(int argc, char ** argv,              /* main argc, argv */
         } \
     } while (JNI_FALSE)
 
-#define CHECK_EXCEPTION_NULL_FAIL(obj) \
-    do { \
-        if ((*env)->ExceptionOccurred(env)) { \
-            return 0; \
-        } else if (obj == NULL) { \
-            return 0; \
-        } \
-    } while (JNI_FALSE)
-
 /*
- * Invoke a static main with arguments. Returns 1 (true) if successful otherwise
- * processes the pending exception from GetStaticMethodID and returns 0 (false).
+ * Invokes static main(String[]) method if found.
+ * Returns 0 with a pending exception if not found. Returns 1 if invoked, maybe
+ * a pending exception if the method threw.
  */
 int
 invokeStaticMainWithArgs(JNIEnv *env, jclass mainClass, jobjectArray mainArgs) {
     jmethodID mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                                   "([Ljava/lang/String;)V");
-    CHECK_EXCEPTION_NULL_FAIL(mainID);
+    if (mainID == NULL) {
+        // static main(String[]) not found
+        return 0;
+    }
     (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
-    return 1;
+    return 1; // method was invoked
 }
 
 /*
- * Invoke an instance main with arguments. Returns 1 (true) if successful otherwise
- * processes the pending exception from GetMethodID and returns 0 (false).
+ * Invokes instance main(String[]) method if found.
+ * Returns 0 with a pending exception if not found. Returns 1 if invoked, maybe
+ * a pending exception if the method threw.
  */
 int
 invokeInstanceMainWithArgs(JNIEnv *env, jclass mainClass, jobjectArray mainArgs) {
     jmethodID constructor = (*env)->GetMethodID(env, mainClass, "<init>", "()V");
-    CHECK_EXCEPTION_NULL_FAIL(constructor);
+    if (constructor == NULL) {
+        // main class' no-arg constructor not found
+        return 0;
+    }
     jobject mainObject = (*env)->NewObject(env, mainClass, constructor);
-    CHECK_EXCEPTION_NULL_FAIL(mainObject);
+    if (mainObject == NULL) {
+        // main class instance couldn't be constructed
+        return 0;
+    }
     jmethodID mainID =
         (*env)->GetMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
-    CHECK_EXCEPTION_NULL_FAIL(mainID);
+    if (mainID == NULL) {
+        // instance method main(String[]) method not found
+        return 0;
+    }
     (*env)->CallVoidMethod(env, mainObject, mainID, mainArgs);
-    return 1;
+    return 1; // method was invoked
 }
 
 /*
- * Invoke a static main without arguments. Returns 1 (true) if successful otherwise
- * processes the pending exception from GetStaticMethodID and returns 0 (false).
+ * Invokes no-arg static main() method if found.
+ * Returns 0 with a pending exception if not found. Returns 1 if invoked, maybe
+ * a pending exception if the method threw.
  */
 int
 invokeStaticMainWithoutArgs(JNIEnv *env, jclass mainClass) {
     jmethodID mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                                        "()V");
-    CHECK_EXCEPTION_NULL_FAIL(mainID);
+    if (mainID == NULL) {
+        // static main() method couldn't be located
+        return 0;
+    }
     (*env)->CallStaticVoidMethod(env, mainClass, mainID);
-    return 1;
+    return 1; // method was invoked
 }
 
 /*
- * Invoke an instance main without arguments. Returns 1 (true) if successful otherwise
- * processes the pending exception from GetMethodID and returns 0 (false).
+ * Invokes no-arg instance main() method if found.
+ * Returns 0 with a pending exception if not found. Returns 1 if invoked, maybe
+ * a pending exception if the method threw.
  */
 int
 invokeInstanceMainWithoutArgs(JNIEnv *env, jclass mainClass) {
     jmethodID constructor = (*env)->GetMethodID(env, mainClass, "<init>", "()V");
-    CHECK_EXCEPTION_NULL_FAIL(constructor);
+    if (constructor == NULL) {
+        // main class' no-arg constructor not found
+        return 0;
+    }
     jobject mainObject = (*env)->NewObject(env, mainClass, constructor);
-    CHECK_EXCEPTION_NULL_FAIL(mainObject);
+    if (mainObject == NULL) {
+        // couldn't create instance of main class
+        return 0;
+    }
     jmethodID mainID = (*env)->GetMethodID(env, mainClass, "main",
                                  "()V");
-    CHECK_EXCEPTION_NULL_FAIL(mainID);
+    if (mainID == NULL) {
+        // instance method main() not found
+        return 0;
+    }
     (*env)->CallVoidMethod(env, mainObject, mainID);
-    return 1;
+    return 1; // method was invoked
 }
 
 int
@@ -639,6 +658,8 @@ JavaMain(void* _args)
         }
     }
     if (!ret) {
+        // An appropriate main method couldn't be located, check and report
+        // any exception and LEAVE()
         CHECK_EXCEPTION_LEAVE(1);
     }
 
@@ -646,8 +667,15 @@ JavaMain(void* _args)
      * The launcher's exit code (in the absence of calls to
      * System.exit) will be non-zero if main threw an exception.
      */
-    ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;
-
+    if (ret && (*env)->ExceptionOccurred(env) == NULL) {
+        // main method was invoked and no exception was thrown from it,
+        // return success.
+        ret = 0;
+    } else {
+        // Either the main method couldn't be located or an exception occurred
+        // in the invoked main method, return failure.
+        ret = 1;
+    }
     LEAVE();
 }
 
diff --git a/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java b/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java
index 491e0104765..bc15d8d156b 100644
--- a/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java
+++ b/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java
@@ -201,6 +201,9 @@ protected void implCloseSelectableChannel() throws IOException {
 
     @Override
     public void kill() {
+        // wait for any write operation to complete before trying to close
+        writeLock.lock();
+        writeLock.unlock();
         synchronized (stateLock) {
             if (state == ST_CLOSING) {
                 tryFinishClose();
diff --git a/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java b/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java
index 102041dd294..2990d35b516 100644
--- a/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java
+++ b/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java
@@ -200,6 +200,9 @@ protected void implCloseSelectableChannel() throws IOException {
     }
     @Override
     public void kill() {
+        // wait for any read operation to complete before trying to close
+        readLock.lock();
+        readLock.unlock();
         synchronized (stateLock) {
             assert !isOpen();
             if (state == ST_CLOSING) {
diff --git a/src/java.base/windows/classes/java/lang/ProcessImpl.java b/src/java.base/windows/classes/java/lang/ProcessImpl.java
index d6fb51c4494..fd0d5b03b0c 100644
--- a/src/java.base/windows/classes/java/lang/ProcessImpl.java
+++ b/src/java.base/windows/classes/java/lang/ProcessImpl.java
@@ -557,8 +557,14 @@ public InputStream getErrorStream() {
 
     public int exitValue() {
         int exitCode = getExitCodeProcess(handle);
-        if (exitCode == STILL_ACTIVE)
-            throw new IllegalThreadStateException("process has not exited");
+        if (exitCode == STILL_ACTIVE) {
+            // STILL_ACTIVE (259) might be the real exit code
+            if (isProcessAlive(handle)) {
+                throw new IllegalThreadStateException("process has not exited");
+            }
+            // call again, in case the process just exited
+            return getExitCodeProcess(handle);
+        }
         return exitCode;
     }
     private static native int getExitCodeProcess(long handle);
@@ -582,7 +588,7 @@ public boolean waitFor(long timeout, TimeUnit unit)
         throws InterruptedException
     {
         long remainingNanos = unit.toNanos(timeout);    // throw NPE before other conditions
-        if (getExitCodeProcess(handle) != STILL_ACTIVE) return true;
+        if (!isProcessAlive(handle)) return true;
         if (timeout <= 0) return false;
 
         long deadline = System.nanoTime() + remainingNanos;
@@ -601,13 +607,13 @@ public boolean waitFor(long timeout, TimeUnit unit)
             }
             if (Thread.interrupted())
                 throw new InterruptedException();
-            if (getExitCodeProcess(handle) != STILL_ACTIVE) {
+            if (!isProcessAlive(handle)) {
                 return true;
             }
             remainingNanos = deadline - System.nanoTime();
         } while (remainingNanos > 0);
 
-        return (getExitCodeProcess(handle) != STILL_ACTIVE);
+        return !isProcessAlive(handle);
     }
 
     private static native void waitForTimeoutInterruptibly(
diff --git a/src/java.base/windows/native/libjava/ProcessHandleImpl_win.c b/src/java.base/windows/native/libjava/ProcessHandleImpl_win.c
index 0bc036b7236..0064113729a 100644
--- a/src/java.base/windows/native/libjava/ProcessHandleImpl_win.c
+++ b/src/java.base/windows/native/libjava/ProcessHandleImpl_win.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -109,27 +109,19 @@ Java_java_lang_ProcessHandleImpl_waitForProcessExit0(JNIEnv* env,
     if (handle == NULL) {
         return exitValue;          // No process with that pid is alive
     }
-    do {
-        if (!GetExitCodeProcess(handle, &exitValue)) {
+    if (!GetExitCodeProcess(handle, &exitValue)) {
+        JNU_ThrowByNameWithLastError(env,
+            "java/lang/RuntimeException", "GetExitCodeProcess");
+    } else if (exitValue == STILL_ACTIVE) {
+        if (WaitForSingleObject(handle, INFINITE) /* Wait forever */
+            == WAIT_FAILED) {
+            JNU_ThrowByNameWithLastError(env,
+                "java/lang/RuntimeException", "WaitForSingleObjects");
+        } else if (!GetExitCodeProcess(handle, &exitValue)) {
             JNU_ThrowByNameWithLastError(env,
                 "java/lang/RuntimeException", "GetExitCodeProcess");
-            break;
-        }
-        if (exitValue == STILL_ACTIVE) {
-            HANDLE events[2];
-            events[0] = handle;
-            events[1] = JVM_GetThreadInterruptEvent();
-
-            if (WaitForMultipleObjects(sizeof(events)/sizeof(events[0]), events,
-                                       FALSE,    /* Wait for ANY event */
-                                       INFINITE) /* Wait forever */
-                == WAIT_FAILED) {
-                JNU_ThrowByNameWithLastError(env,
-                    "java/lang/RuntimeException", "WaitForMultipleObjects");
-                break;
-            }
         }
-    } while (exitValue == STILL_ACTIVE);
+    }
     CloseHandle(handle);         // Ignore return code
     return exitValue;
 }
diff --git a/src/java.base/windows/native/libjava/ProcessImpl_md.c b/src/java.base/windows/native/libjava/ProcessImpl_md.c
index a1890578888..127c27981ba 100644
--- a/src/java.base/windows/native/libjava/ProcessImpl_md.c
+++ b/src/java.base/windows/native/libjava/ProcessImpl_md.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -467,9 +467,8 @@ Java_java_lang_ProcessImpl_terminateProcess(JNIEnv *env, jclass ignored, jlong h
 JNIEXPORT jboolean JNICALL
 Java_java_lang_ProcessImpl_isProcessAlive(JNIEnv *env, jclass ignored, jlong handle)
 {
-    DWORD dwExitStatus;
-    GetExitCodeProcess((HANDLE) handle, &dwExitStatus);
-    return dwExitStatus == STILL_ACTIVE;
+    return WaitForSingleObject((HANDLE) handle, 0) /* don't wait */
+                       == WAIT_TIMEOUT;
 }
 
 JNIEXPORT jboolean JNICALL
diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java
index f14c7b40cba..0501bbfab03 100644
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -87,7 +87,7 @@ void handleMouseEvent(int eventType, int modifierFlags, int buttonNumber,
             jmodifiers |= MouseEvent.getMaskForButton(jbuttonNumber);
         }
 
-        boolean jpopupTrigger = NSEvent.isPopupTrigger(jmodifiers);
+        boolean jpopupTrigger = NSEvent.isPopupTrigger(jmodifiers, jeventType);
 
         eventNotifier.notifyMouseEvent(jeventType, System.currentTimeMillis(), jbuttonNumber,
                 x, y, absX, absY, jmodifiers, jclickCount,
diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java
index 1be76db3acd..1bf77f5ee69 100644
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -64,6 +64,7 @@
 import sun.awt.AWTAccessor.ComponentAccessor;
 import sun.awt.AWTAccessor.WindowAccessor;
 import sun.java2d.SurfaceData;
+import sun.lwawt.LWKeyboardFocusManagerPeer;
 import sun.lwawt.LWLightweightFramePeer;
 import sun.lwawt.LWToolkit;
 import sun.lwawt.LWWindowPeer;
@@ -1056,6 +1057,11 @@ public void setModalBlocked(boolean blocked) {
         }
 
         execute(ptr -> nativeSetEnabled(ptr, !blocked));
+
+        Window currFocus = LWKeyboardFocusManagerPeer.getInstance().getCurrentFocusedWindow();
+        if (!blocked && (target == currFocus)) {
+            requestWindowFocus();
+        }
         checkBlockingAndOrder();
     }
 
diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java
index d0b9288aeae..7d35f859a7a 100644
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java
@@ -253,7 +253,7 @@ private void handleMouseEvent(NSEvent nsEvent) {
 
         int jmodifiers = NSEvent.nsToJavaModifiers(
                 nsEvent.getModifierFlags());
-        boolean isPopupTrigger = NSEvent.isPopupTrigger(jmodifiers);
+        boolean isPopupTrigger = NSEvent.isPopupTrigger(jmodifiers, jeventType);
 
         int eventButtonMask = (jbuttonNumber > 0)?
                 MouseEvent.getMaskForButton(jbuttonNumber) : 0;
diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java
index ca3d9ad5da7..f3fcfdfb43c 100644
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/NSEvent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -269,7 +269,12 @@ static int nsToJavaEventType(int nsEventType) {
      */
     static native char nsToJavaChar(char nsChar, int modifierFlags, boolean spaceKeyTyped);
 
-    static boolean isPopupTrigger(int jmodifiers) {
+    static boolean isPopupTrigger(int jmodifiers, int jeventType) {
+        if (jeventType != MouseEvent.MOUSE_PRESSED
+                && jeventType != MouseEvent.MOUSE_RELEASED) {
+            return false;
+        }
+
         final boolean isRightButtonDown = ((jmodifiers & InputEvent.BUTTON3_DOWN_MASK) != 0);
         final boolean isLeftButtonDown = ((jmodifiers & InputEvent.BUTTON1_DOWN_MASK) != 0);
         final boolean isControlDown = ((jmodifiers & InputEvent.CTRL_DOWN_MASK) != 0);
diff --git a/src/java.desktop/macosx/native/libjawt/jawt.m b/src/java.desktop/macosx/native/libjawt/jawt.m
index f5dc048a482..36d4e897f60 100644
--- a/src/java.desktop/macosx/native/libjawt/jawt.m
+++ b/src/java.desktop/macosx/native/libjawt/jawt.m
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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
@@ -55,15 +55,14 @@
 
     awt->GetDrawingSurface = awt_GetDrawingSurface;
     awt->FreeDrawingSurface = awt_FreeDrawingSurface;
-    if (awt->version >= JAWT_VERSION_1_4) {
-        awt->Lock = awt_Lock;
-        awt->Unlock = awt_Unlock;
-        awt->GetComponent = awt_GetComponent;
-        if (awt->version >= JAWT_VERSION_9) {
-            awt->CreateEmbeddedFrame = awt_CreateEmbeddedFrame;
-            awt->SetBounds = awt_SetBounds;
-            awt->SynthesizeWindowActivation = awt_SynthesizeWindowActivation;
-        }
+
+    awt->Lock = awt_Lock;
+    awt->Unlock = awt_Unlock;
+    awt->GetComponent = awt_GetComponent;
+    if (awt->version >= JAWT_VERSION_9) {
+        awt->CreateEmbeddedFrame = awt_CreateEmbeddedFrame;
+        awt->SetBounds = awt_SetBounds;
+        awt->SynthesizeWindowActivation = awt_SynthesizeWindowActivation;
     }
 
     return JNI_TRUE;
diff --git a/src/java.desktop/share/classes/java/awt/geom/Path2D.java b/src/java.desktop/share/classes/java/awt/geom/Path2D.java
index ad91b44911e..8b14846b117 100644
--- a/src/java.desktop/share/classes/java/awt/geom/Path2D.java
+++ b/src/java.desktop/share/classes/java/awt/geom/Path2D.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2024, 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
@@ -292,6 +292,9 @@ public Float(Shape s, AffineTransform at) {
             }
         }
 
+        /**
+         * @since 10
+         */
         @Override
         public final void trimToSize() {
             // trim arrays:
@@ -1178,6 +1181,9 @@ public Double(Shape s, AffineTransform at) {
             }
         }
 
+        /**
+         * @since 10
+         */
         @Override
         public final void trimToSize() {
             // trim arrays:
diff --git a/src/java.desktop/share/classes/java/awt/image/BufferedImage.java b/src/java.desktop/share/classes/java/awt/image/BufferedImage.java
index 43f0959158d..cfbebd68710 100644
--- a/src/java.desktop/share/classes/java/awt/image/BufferedImage.java
+++ b/src/java.desktop/share/classes/java/awt/image/BufferedImage.java
@@ -899,7 +899,7 @@ public WritableRaster getAlphaRaster() {
      *
      * <p>
      *
-     * An {@code ArrayOutOfBoundsException} may be thrown
+     * An {@code ArrayIndexOutOfBoundsException} may be thrown
      * if the coordinates are not in bounds.
      * However, explicit bounds checking is not guaranteed.
      *
@@ -933,7 +933,7 @@ public int getRGB(int x, int y) {
      *
      * <p>
      *
-     * An {@code ArrayOutOfBoundsException} may be thrown
+     * An {@code ArrayIndexOutOfBoundsException} may be thrown
      * if the region is not in bounds.
      * However, explicit bounds checking is not guaranteed.
      *
@@ -1003,7 +1003,7 @@ public int[] getRGB(int startX, int startY, int w, int h,
      *
      * <p>
      *
-     * An {@code ArrayOutOfBoundsException} may be thrown
+     * An {@code ArrayIndexOutOfBoundsException} may be thrown
      * if the coordinates are not in bounds.
      * However, explicit bounds checking is not guaranteed.
      *
@@ -1033,7 +1033,7 @@ public void setRGB(int x, int y, int rgb) {
      *
      * <p>
      *
-     * An {@code ArrayOutOfBoundsException} may be thrown
+     * An {@code ArrayIndexOutOfBoundsException} may be thrown
      * if the region is not in bounds.
      * However, explicit bounds checking is not guaranteed.
      *
diff --git a/src/java.desktop/share/classes/java/beans/package-info.java b/src/java.desktop/share/classes/java/beans/package-info.java
index fefe400e6bf..dfa226f7014 100644
--- a/src/java.desktop/share/classes/java/beans/package-info.java
+++ b/src/java.desktop/share/classes/java/beans/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -108,5 +108,7 @@
  *         Long-Term Persistence</a>, an article in
  *         <em>The Swing Connection</em>.</li>
  * </ul>
+ *
+ * @since 1.1
  */
 package java.beans;
diff --git a/src/java.desktop/share/classes/javax/print/attribute/standard/OutputBin.java b/src/java.desktop/share/classes/javax/print/attribute/standard/OutputBin.java
index 3f817fe6c9b..af6113ad638 100644
--- a/src/java.desktop/share/classes/javax/print/attribute/standard/OutputBin.java
+++ b/src/java.desktop/share/classes/javax/print/attribute/standard/OutputBin.java
@@ -49,6 +49,8 @@
  * IPP attribute name. The enumeration's integer value is the IPP enum value.
  * The {@code toString()} method returns the IPP string representation of the
  * attribute value.
+ *
+ * @since 23
  */
 public sealed class OutputBin extends EnumSyntax implements PrintRequestAttribute, PrintJobAttribute permits CustomOutputBin {
 
diff --git a/src/java.desktop/share/classes/javax/swing/DefaultComboBoxModel.java b/src/java.desktop/share/classes/javax/swing/DefaultComboBoxModel.java
index 382eba1946f..e2257abf704 100644
--- a/src/java.desktop/share/classes/javax/swing/DefaultComboBoxModel.java
+++ b/src/java.desktop/share/classes/javax/swing/DefaultComboBoxModel.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -183,6 +183,8 @@ public void removeAllElements() {
      *
      * @param c the collection which contains the elements to add
      * @throws NullPointerException if {@code c} is null
+     *
+     * @since 11
      */
     public void addAll(Collection<? extends E> c) {
         if (c.isEmpty()) {
@@ -205,6 +207,8 @@ public void addAll(Collection<? extends E> c) {
      * @throws ArrayIndexOutOfBoundsException if {@code index} does not
      * fall within the range of number of elements currently held
      * @throws NullPointerException if {@code c} is null
+     *
+     * @since 11
      */
     public void addAll(int index, Collection<? extends E> c) {
         if (index < 0 || index > getSize()) {
diff --git a/src/java.desktop/share/classes/javax/swing/DefaultListModel.java b/src/java.desktop/share/classes/javax/swing/DefaultListModel.java
index 9d519927b67..c66f0f0f7b2 100644
--- a/src/java.desktop/share/classes/javax/swing/DefaultListModel.java
+++ b/src/java.desktop/share/classes/javax/swing/DefaultListModel.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -530,6 +530,8 @@ public void removeRange(int fromIndex, int toIndex) {
      *
      * @param c the collection which contains the elements to add
      * @throws NullPointerException if {@code c} is null
+     *
+     * @since 11
      */
     public void addAll(Collection<? extends E> c) {
         if (c.isEmpty()) {
@@ -552,6 +554,8 @@ public void addAll(Collection<? extends E> c) {
      * @throws ArrayIndexOutOfBoundsException if {@code index} does not
      * fall within the range of number of elements currently held
      * @throws NullPointerException if {@code c} is null
+     *
+     * @since 11
      */
     public void addAll(int index, Collection<? extends E> c) {
         if (index < 0 || index > getSize()) {
diff --git a/src/java.desktop/share/classes/javax/swing/JSlider.java b/src/java.desktop/share/classes/javax/swing/JSlider.java
index a9c9cbe887b..a61f7fe851b 100644
--- a/src/java.desktop/share/classes/javax/swing/JSlider.java
+++ b/src/java.desktop/share/classes/javax/swing/JSlider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -1461,6 +1461,8 @@ public AccessibleStateSet getAccessibleStateSet() {
          *
          * @param e  a {@code ChangeEvent} object. Must not be {@code null}
          * @throws NullPointerException if the parameter is {@code null}
+         *
+         * @since 16
          */
         public void stateChanged(ChangeEvent e) {
             if (e == null) {
@@ -1561,6 +1563,8 @@ public AccessibleAction getAccessibleAction() {
          * which decrements the slider value
          *
          * @return the zero-based number of Actions in this object
+         *
+         * @since 17
          */
         public int getAccessibleActionCount() {
             return 2;
@@ -1572,6 +1576,8 @@ public int getAccessibleActionCount() {
          * @param i zero-based index of the actions
          * @return a String description of the action
          * @see #getAccessibleActionCount
+         *
+         * @since 17
          */
         public String getAccessibleActionDescription(int i) {
             if (i == 0) {
@@ -1590,6 +1596,8 @@ public String getAccessibleActionDescription(int i) {
          * action (index 1) is AccessibleAction.DECREMENT.
          * @return true if the action was performed, otherwise false
          * @see #getAccessibleActionCount
+         *
+         * @since 17
          */
         public boolean doAccessibleAction(int i) {
             if (i < 0 || i > 1) {
diff --git a/src/java.desktop/share/classes/javax/swing/JSplitPane.java b/src/java.desktop/share/classes/javax/swing/JSplitPane.java
index 14f62565d40..7d4482af07e 100644
--- a/src/java.desktop/share/classes/javax/swing/JSplitPane.java
+++ b/src/java.desktop/share/classes/javax/swing/JSplitPane.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -41,6 +41,7 @@
 import javax.accessibility.AccessibleStateSet;
 import javax.accessibility.AccessibleValue;
 import javax.swing.plaf.SplitPaneUI;
+import javax.swing.plaf.basic.BasicSplitPaneUI;
 
 /**
  * <code>JSplitPane</code> is used to divide two (and only two)
@@ -361,6 +362,17 @@ public JSplitPane(int newOrientation,
 
     }
 
+    /**
+     * {@inheritDoc}
+     * @param enabled {@inheritDoc}
+     */
+    @Override
+    public void setEnabled(boolean enabled) {
+        super.setEnabled(enabled);
+        if (this.getUI() instanceof BasicSplitPaneUI) {
+            ((BasicSplitPaneUI)(this.getUI())).getDivider().setEnabled(enabled);
+        }
+    }
 
     /**
      * Sets the L&amp;F object that renders this component.
diff --git a/src/java.desktop/share/classes/javax/swing/package-info.java b/src/java.desktop/share/classes/javax/swing/package-info.java
index 95be24d606f..3723c5a66e9 100644
--- a/src/java.desktop/share/classes/javax/swing/package-info.java
+++ b/src/java.desktop/share/classes/javax/swing/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2024, 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
@@ -149,5 +149,7 @@
  * </ul>
  *
  * @serial exclude
+ *
+ * @since 1.2
  */
 package javax.swing;
diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java
index 7b94bedea0d..f945f7eac63 100644
--- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java
+++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSliderUI.java
@@ -150,7 +150,12 @@ public class BasicSliderUI extends SliderUI{
 
     /**
      * Constructs a {@code BasicSliderUI}.
+     *
+     * @since 16
+     * @deprecated This constructor was exposed erroneously and will be removed in a future release.
+     *             Use {@link #BasicSliderUI(JSlider)} instead.
      */
+    @Deprecated(since = "23", forRemoval = true)
     public BasicSliderUI() {}
 
     /**
diff --git a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneDivider.java b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneDivider.java
index 3018de4fd93..188e6753887 100644
--- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneDivider.java
+++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicSplitPaneDivider.java
@@ -360,6 +360,20 @@ else if (e.getPropertyName() == JSplitPane.
         }
     }
 
+    /**
+     * {@inheritDoc}
+     * @param enabled {@inheritDoc}
+     */
+    @Override
+    public void setEnabled(boolean enabled) {
+        if (splitPane.isOneTouchExpandable() &&
+                rightButton != null &&
+                leftButton != null) {
+
+            rightButton.setEnabled(enabled);
+            leftButton.setEnabled(enabled);
+        }
+    }
 
     /**
      * Paints the divider.
@@ -472,6 +486,7 @@ public boolean isFocusTraversable() {
         b.setFocusPainted(false);
         b.setBorderPainted(false);
         b.setRequestFocusEnabled(false);
+        b.setEnabled(splitPane.isEnabled());
         return b;
     }
 
@@ -529,6 +544,7 @@ public boolean isFocusTraversable() {
         b.setFocusPainted(false);
         b.setBorderPainted(false);
         b.setRequestFocusEnabled(false);
+        b.setEnabled(splitPane.isEnabled());
         return b;
     }
 
diff --git a/src/java.desktop/share/classes/javax/swing/plaf/synth/package-info.java b/src/java.desktop/share/classes/javax/swing/plaf/synth/package-info.java
index 41cb2398915..10b03fa83d7 100644
--- a/src/java.desktop/share/classes/javax/swing/plaf/synth/package-info.java
+++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -139,5 +139,7 @@
  *   <bind style="style" type="region" key="Table"/>
  *   <bind style="style" type="region" key="List"/>
  * }</pre>
+ *
+ * @since 1.5
  */
 package javax.swing.plaf.synth;
diff --git a/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java b/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java
index 6424846d3d0..6372d6bc4ab 100644
--- a/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java
+++ b/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java
@@ -951,7 +951,7 @@ public AccessibleContext getAccessibleContext() {
             private AccessibleContext getCurrentAccessibleContext() {
                 TableColumnModel tcm = table.getColumnModel();
                 if (tcm != null) {
-                    // Fixes 4772355 - ArrayOutOfBoundsException in
+                    // Fixes 4772355 - ArrayIndexOutOfBoundsException in
                     // JTableHeader
                     if (column < 0 || column >= tcm.getColumnCount()) {
                         return null;
@@ -979,7 +979,7 @@ private AccessibleContext getCurrentAccessibleContext() {
             private Component getCurrentComponent() {
                 TableColumnModel tcm = table.getColumnModel();
                 if (tcm != null) {
-                    // Fixes 4772355 - ArrayOutOfBoundsException in
+                    // Fixes 4772355 - ArrayIndexOutOfBoundsException in
                     // JTableHeader
                     if (column < 0 || column >= tcm.getColumnCount()) {
                         return null;
diff --git a/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java b/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java
index b71d30656db..33fe7300df9 100644
--- a/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java
+++ b/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -648,6 +648,8 @@ public void write(Writer out, Document doc, int pos, int len)
      * beginning of the previous line if the caret is
      * already at the beginning of the line.
      * @see #getActions
+     *
+     * @since 20
      */
     public static final String beginLineUpAction = "caret-begin-line-and-up";
 
@@ -657,6 +659,8 @@ public void write(Writer out, Document doc, int pos, int len)
      * end of the next line if the caret is already
      * at the end of the line.
      * @see #getActions
+     *
+     * @since 20
      */
     public static final String endLineDownAction = "caret-end-line-and-down";
 
diff --git a/src/java.desktop/share/classes/sun/font/Type1Font.java b/src/java.desktop/share/classes/sun/font/Type1Font.java
index 1cd046eadd1..cc36c193de0 100644
--- a/src/java.desktop/share/classes/sun/font/Type1Font.java
+++ b/src/java.desktop/share/classes/sun/font/Type1Font.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -187,7 +187,9 @@ public Type1Font(String platname, Object nativeNames, boolean createdCopy)
     private synchronized ByteBuffer getBuffer() throws FontFormatException {
         ByteBuffer bbuf = bufferRef.get();
         if (bbuf == null) {
-          //System.out.println("open T1 " + platName);
+            if (FontUtilities.isLogging()) {
+                FontUtilities.logInfo("open Type 1 font: " + platName);
+            }
             try {
                 @SuppressWarnings("removal")
                 RandomAccessFile raf = (RandomAccessFile)
@@ -229,6 +231,9 @@ protected void close() {
     void readFile(ByteBuffer buffer) {
         RandomAccessFile raf = null;
         FileChannel fc;
+        if (FontUtilities.isLogging()) {
+            FontUtilities.logInfo("open Type 1 font: " + platName);
+        }
         try {
             raf = (RandomAccessFile)
                 java.security.AccessController.doPrivileged(
diff --git a/src/java.desktop/share/classes/sun/print/resources/serviceui_zh_CN.properties b/src/java.desktop/share/classes/sun/print/resources/serviceui_zh_CN.properties
index f4a1982f056..cdc2bb5541f 100644
--- a/src/java.desktop/share/classes/sun/print/resources/serviceui_zh_CN.properties
+++ b/src/java.desktop/share/classes/sun/print/resources/serviceui_zh_CN.properties
@@ -29,7 +29,7 @@ border.chromaticity=颜色外观
 border.copies=份数
 border.jobattributes=作业属性
 border.media=介质
-border.output=出纸
+border.output=输出
 border.orientation=方向
 border.printrange=打印区域
 border.printservice=打印服务
@@ -63,7 +63,7 @@ label.pstype=类型:
 label.rangeto=至
 label.size=大小(&Z):
 label.source=来源(&C):
-label.outputbins=出纸托盘(&P):
+label.outputbins=输出托盘(&P):
 label.status=状态:
 label.username=用户名(&U):
 label.millimetres=(毫米)
diff --git a/src/java.desktop/share/classes/sun/swing/FilePane.java b/src/java.desktop/share/classes/sun/swing/FilePane.java
index ffefbb60416..e97dcb3b881 100644
--- a/src/java.desktop/share/classes/sun/swing/FilePane.java
+++ b/src/java.desktop/share/classes/sun/swing/FilePane.java
@@ -1317,13 +1317,6 @@ public void tableChanged(TableModelEvent e) {
             detailsTable.addFocusListener(repaintListener);
         }
 
-        // TAB/SHIFT-TAB should transfer focus and ENTER should select an item.
-        // We don't want them to navigate within the table
-        ActionMap am = SwingUtilities.getUIActionMap(detailsTable);
-        am.remove("selectNextRowCell");
-        am.remove("selectPreviousRowCell");
-        am.remove("selectNextColumnCell");
-        am.remove("selectPreviousColumnCell");
         detailsTable.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
                      null);
         detailsTable.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,
diff --git a/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c b/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c
index a643b9c111c..a6f4cfdd36e 100644
--- a/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c
+++ b/src/java.desktop/share/native/libmlib_image/mlib_ImageScanPoly.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, 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
@@ -289,13 +289,15 @@ mlib_status mlib_AffineEdges(mlib_affine_param *param,
     mlib_d64 dX1 = coords[(topIdx - i) & 0x3][0];
     mlib_d64 dY2 = coords[(topIdx - i - 1) & 0x3][1];
     mlib_d64 dX2 = coords[(topIdx - i - 1) & 0x3][0];
-    mlib_d64 x = dX1, slope = (dX2 - dX1) / (dY2 - dY1);
+    mlib_d64 x = dX1, slope;
     mlib_s32 y1;
     mlib_s32 y2;
 
     if (dY1 == dY2)
       continue;
 
+    slope = (dX2 - dX1) / (dY2 - dY1);
+
     if (!(IS_FINITE(slope))) {
       continue;
     }
@@ -330,13 +332,15 @@ mlib_status mlib_AffineEdges(mlib_affine_param *param,
     mlib_d64 dX1 = coords[(topIdx + i) & 0x3][0];
     mlib_d64 dY2 = coords[(topIdx + i + 1) & 0x3][1];
     mlib_d64 dX2 = coords[(topIdx + i + 1) & 0x3][0];
-    mlib_d64 x = dX1, slope = (dX2 - dX1) / (dY2 - dY1);
+    mlib_d64 x = dX1, slope;
     mlib_s32 y1;
     mlib_s32 y2;
 
     if (dY1 == dY2)
       continue;
 
+    slope = (dX2 - dX1) / (dY2 - dY1);
+
     if (!(IS_FINITE(slope))) {
       continue;
     }
diff --git a/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp b/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp
index c7615336218..9f126bded94 100644
--- a/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp
+++ b/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp
@@ -522,6 +522,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
     AwtComponent *awtParent = (parent != NULL) ? (AwtComponent *)JNI_GET_PDATA(parent) : NULL;
     HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL;
 
+    jboolean doIt = JNI_FALSE;
     PAGESETUPDLG setup;
     memset(&setup, 0, sizeof(setup));
 
@@ -577,7 +578,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
          */
         if ((setup.hDevMode == NULL) && (setup.hDevNames == NULL)) {
             CLEANUP_SHOW;
-            return JNI_FALSE;
+            return doIt;
         }
     } else {
         int measure = PSD_INTHOUSANDTHSOFINCHES;
@@ -605,7 +606,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
     pageFormatToSetup(env, self, page, &setup, AwtPrintControl::getPrintDC(env, self));
     if (env->ExceptionCheck()) {
         CLEANUP_SHOW;
-        return JNI_FALSE;
+        return doIt;
     }
 
     setup.lpfnPageSetupHook = reinterpret_cast<LPPAGESETUPHOOK>(pageDlgHook);
@@ -619,7 +620,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
         jobject paper = getPaper(env, page);
         if (paper == NULL) {
             CLEANUP_SHOW;
-            return JNI_FALSE;
+            return doIt;
         }
         int units = setup.Flags & PSD_INTHOUSANDTHSOFINCHES ?
                                                 MM_HIENGLISH :
@@ -661,7 +662,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
         setPaperValues(env, paper, &paperSize, &margins, units);
         if (env->ExceptionCheck()) {
             CLEANUP_SHOW;
-            return JNI_FALSE;
+            return doIt;
          }
         /*
          * Put the updated Paper instance and the orientation into
@@ -670,7 +671,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
         setPaper(env, page, paper);
         if (env->ExceptionCheck()) {
             CLEANUP_SHOW;
-            return JNI_FALSE;
+            return doIt;
         }
         setPageFormatOrientation(env, page, orientation);
         if (env->ExceptionCheck()) {
@@ -684,12 +685,13 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
                     jboolean err = setPrintPaperSize(env, self, devmode->dmPaperSize);
                     if (err) {
                         CLEANUP_SHOW;
-                        return JNI_FALSE;
+                        return doIt;
                     }
                 }
             }
             ::GlobalUnlock(setup.hDevMode);
         }
+        doIt = JNI_TRUE;
     }
 
     AwtDialog::CheckUninstallModalHook();
@@ -708,7 +710,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
 
     CLEANUP_SHOW;
 
-    return JNI_TRUE;
+    return doIt;
 
     CATCH_BAD_ALLOC_RET(0);
 }
diff --git a/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java b/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java
index 289bc8f3822..047863d34ef 100644
--- a/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java
+++ b/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java
@@ -46,6 +46,7 @@
 import javax.management.remote.JMXServerErrorException;
 import javax.management.remote.NotificationResult;
 import javax.security.auth.Subject;
+import jdk.internal.access.SharedSecrets;
 import sun.reflect.misc.ReflectUtil;
 
 import static javax.management.remote.rmi.RMIConnector.Util.cast;
@@ -108,14 +109,19 @@ public RMIConnectionImpl(RMIServerImpl rmiServer,
         this.rmiServer = rmiServer;
         this.connectionId = connectionId;
         this.defaultClassLoader = defaultClassLoader;
-
         this.subject = subject;
+
         if (subject == null) {
             this.acc = null;
         } else {
             // An authenticated Subject was provided.
             // Subject Delegation has been removed.
-            this.acc = JMXSubjectDomainCombiner.getContext(subject);
+            if (SharedSecrets.getJavaLangAccess().allowSecurityManager()) {
+                // SM is allowed.  Will use ACC created with Subject:
+                this.acc = JMXSubjectDomainCombiner.getContext(subject);
+            } else {
+                this.acc = null;
+            }
         }
         this.mbeanServer = rmiServer.getMBeanServer();
 
@@ -1292,10 +1298,21 @@ public NotificationResult run() {
                         return getServerNotifFwd().fetchNotifs(csn, t, mn);
                     }
             };
-            if (acc == null)
-                return action.run();
-            else
-                return AccessController.doPrivileged(action, acc);
+            if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) {
+                // Modern case
+                if (subject == null) {
+                    return action.run();
+                } else {
+                    return Subject.doAs(subject, action);
+                }
+            } else {
+                // SM permitted
+                if (acc == null) {
+                    return action.run(); // No Subject or ACC
+                } else {
+                    return AccessController.doPrivileged(action, acc);
+                }
+            }
         } finally {
             serverCommunicatorAdmin.rspOutgoing();
         }
@@ -1411,16 +1428,36 @@ private Object doPrivilegedOperation(final int operation,
         serverCommunicatorAdmin.reqIncoming();
         try {
             PrivilegedOperation op = new PrivilegedOperation(operation, params);
-            if (acc == null) {
-                try {
-                    return op.run();
-                } catch (Exception e) {
-                    if (e instanceof RuntimeException)
-                        throw (RuntimeException) e;
-                    throw new PrivilegedActionException(e);
+            if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) {
+                // Modern case
+                if (subject == null) {
+                    try {
+                        return op.run();
+                    } catch (Exception e) {
+                        if (e instanceof RuntimeException) {
+                            throw (RuntimeException) e;
+                        } else {
+                            throw new PrivilegedActionException(e);
+                        }
+                    }
+                } else {
+                    return Subject.doAs(subject, op);
                 }
             } else {
-                return AccessController.doPrivileged(op, acc);
+                // SM permitted
+                if (acc == null) {
+                    try {
+                        return op.run();
+                    } catch (Exception e) {
+                        if (e instanceof RuntimeException) {
+                            throw (RuntimeException) e;
+                        } else {
+                            throw new PrivilegedActionException(e);
+                        }
+                    }
+                } else {
+                    return AccessController.doPrivileged(op, acc);
+                }
             }
         } catch (Error e) {
             throw new JMXServerErrorException(e.toString(),e);
@@ -1585,15 +1622,25 @@ private <T> T unwrap(final MarshalledObject<?> mo,
         }
         try {
             final ClassLoader old = AccessController.doPrivileged(new SetCcl(cl));
-            try{
-                if (acc != null) {
-                    return AccessController.doPrivileged(
-                            (PrivilegedExceptionAction<T>) () ->
-                                    wrappedClass.cast(mo.get()), acc);
-                }else{
-                    return wrappedClass.cast(mo.get());
+            try {
+                if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) {
+                    // Modern case
+                    if (subject != null) {
+                        return Subject.doAs(subject, (PrivilegedExceptionAction<T>) () -> wrappedClass.cast(mo.get()));
+                    } else {
+                        return wrappedClass.cast(mo.get());
+                    }
+                } else {
+                    // SM permitted
+                    if (acc != null) {
+                        return AccessController.doPrivileged(
+                                (PrivilegedExceptionAction<T>) () ->
+                                        wrappedClass.cast(mo.get()), acc);
+                    } else {
+                        return wrappedClass.cast(mo.get());
+                    }
                 }
-            }finally{
+            } finally {
                 AccessController.doPrivileged(new SetCcl(old));
             }
         } catch (PrivilegedActionException pe) {
diff --git a/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java b/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java
index e04a375c998..7ea1e485869 100644
--- a/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java
+++ b/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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
@@ -343,10 +343,9 @@ public void terminate() {
     //----------------
     // PRIVATE METHODS
     //----------------
-
     @SuppressWarnings("removal")
     private Subject getSubject() {
-        return Subject.getSubject(AccessController.getContext());
+        return Subject.current();
     }
 
     private void checkState() throws IOException {
diff --git a/src/java.management/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java b/src/java.management/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java
index d694d9cce31..bc14b6ad3f2 100644
--- a/src/java.management/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java
+++ b/src/java.management/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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 javax.management.MBeanServer;
 import javax.management.ObjectName;
 import javax.security.auth.Subject;
+import jdk.internal.access.SharedSecrets;
 
 /**
  * <p>An object of this class implements the MBeanServerAccessController
@@ -300,16 +301,19 @@ private static Properties propertiesFromFile(String fname)
         }
     }
 
+    @SuppressWarnings("removal")
     private synchronized void checkAccess(AccessType requiredAccess, String arg) {
-        @SuppressWarnings("removal")
-        final AccessControlContext acc = AccessController.getContext();
-        @SuppressWarnings("removal")
-        final Subject s =
-            AccessController.doPrivileged(new PrivilegedAction<>() {
-                    public Subject run() {
-                        return Subject.getSubject(acc);
-                    }
+        Subject s = null;
+        if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) {
+            s = Subject.current();
+        } else {
+            final AccessControlContext acc = AccessController.getContext();
+            s = AccessController.doPrivileged(new PrivilegedAction<>() {
+                        public Subject run() {
+                            return Subject.getSubject(acc);
+                        }
                 });
+        }
         if (s == null) return; /* security has not been enabled */
         final Set<Principal> principals = s.getPrincipals();
         String newPropertyValue = null;
diff --git a/src/java.management/share/classes/javax/management/monitor/Monitor.java b/src/java.management/share/classes/javax/management/monitor/Monitor.java
index aa6ec14ab63..2ccb96b8db6 100644
--- a/src/java.management/share/classes/javax/management/monitor/Monitor.java
+++ b/src/java.management/share/classes/javax/management/monitor/Monitor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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
@@ -60,6 +60,8 @@
 import javax.management.NotificationBroadcasterSupport;
 import javax.management.ObjectName;
 import javax.management.ReflectionException;
+import javax.security.auth.Subject;
+import jdk.internal.access.SharedSecrets;
 import static javax.management.monitor.MonitorNotification.*;
 
 /**
@@ -169,8 +171,9 @@ public final synchronized void setDerivedGaugeTimeStamp(
         new CopyOnWriteArrayList<>();
 
     /**
-     * AccessControlContext of the Monitor.start() caller.
+     * Subject and possibly AccessControlContext of the Monitor.start() caller.
      */
+    private volatile Subject subject;
     @SuppressWarnings("removal")
     private static final AccessControlContext noPermissionsACC =
             new AccessControlContext(
@@ -713,10 +716,14 @@ void doStart() {
             //
             cleanupIsComplexTypeAttribute();
 
-            // Cache the AccessControlContext of the Monitor.start() caller.
+            // Cache the Subject or AccessControlContext of the Monitor.start() caller.
             // The monitor tasks will be executed within this context.
             //
-            acc = AccessController.getContext();
+            if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) {
+                subject = Subject.current();
+            } else {
+                acc = AccessController.getContext();
+            }
 
             // Start the scheduler.
             //
@@ -747,8 +754,9 @@ void doStop() {
             //
             cleanupFutures();
 
-            // Reset the AccessControlContext.
+            // Reset the Subject and AccessControlContext.
             //
+            subject = null;
             acc = noPermissionsACC;
 
             // Reset the complex type attribute information
@@ -1512,9 +1520,11 @@ public Future<?> submit() {
         @SuppressWarnings("removal")
         public void run() {
             final ScheduledFuture<?> sf;
+            final Subject s;
             final AccessControlContext ac;
             synchronized (Monitor.this) {
                 sf = Monitor.this.schedulerFuture;
+                s  = Monitor.this.subject;
                 ac = Monitor.this.acc;
             }
             PrivilegedAction<Void> action = new PrivilegedAction<>() {
@@ -1531,10 +1541,20 @@ public Void run() {
                     return null;
                 }
             };
-            if (ac == null) {
-                throw new SecurityException("AccessControlContext cannot be null");
+            if (!SharedSecrets.getJavaLangAccess().allowSecurityManager()) {
+                // No SecurityManager permitted:
+                if (s == null) {
+                    action.run();
+                } else {
+                    Subject.doAs(s, action);
+                }
+            } else {
+                if (ac == null) {
+                    throw new SecurityException("AccessControlContext cannot be null");
+                }
+                // ACC means SM is permitted.
+                AccessController.doPrivileged(action, ac);
             }
-            AccessController.doPrivileged(action, ac);
             synchronized (Monitor.this) {
                 if (Monitor.this.isActive() &&
                     Monitor.this.schedulerFuture == sf) {
diff --git a/src/java.naming/share/classes/javax/naming/directory/package-info.java b/src/java.naming/share/classes/javax/naming/directory/package-info.java
new file mode 100644
index 00000000000..3f32a95c31e
--- /dev/null
+++ b/src/java.naming/share/classes/javax/naming/directory/package-info.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999, 2024, 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.
+ */
+
+/**
+ *
+ * Extends the {@code javax.naming} package to provide functionality
+ * for accessing directory services.
+ *
+ * <p>
+ * This package defines the directory operations of the Java Naming and
+ * Directory Interface (JNDI). &nbsp;
+ * JNDI provides naming and directory functionality to applications
+ * written in the Java programming language. It is designed to be
+ * independent of any specific naming or directory service
+ * implementation. Thus a variety of services--new, emerging, and
+ * already deployed ones--can be accessed in a common way.
+ *
+ * <p>
+ * This package allows applications to retrieve and update attributes
+ * associated with objects stored in a directory, and to search for
+ * objects using specified attributes.
+ *
+ * <h2>The Directory Context</h2>
+ *
+ * The {@code DirContext}
+ * interface represents a <em>directory context</em>.
+ * It defines methods for examining and updating attributes associated with a
+ * <em>directory object</em>, or <em>directory entry</em> as it is sometimes
+ * called.
+ * <p>
+ * You use {@code getAttributes()} to retrieve the attributes
+ * associated with a directory object (for which you supply the name).
+ * Attributes are modified using {@code modifyAttributes()}.
+ * You can add, replace, or remove attributes and/or attribute values
+ * using this operation.
+ * <p>
+ * {@code DirContext} also behaves as a naming context
+ * by extending the {@code Context} interface in the {@code javax.naming} package.
+ * This means that any directory object can also provide
+ * a naming context.
+ * For example, the directory object for a person might contain
+ * the attributes of that person, and at the same time provide
+ * a context for naming objects relative to that person
+ * such as his printers and home directory.
+ *
+ * <h3>Searches</h3>
+ * {@code DirContext} contains methods for
+ * performing content-based searching of the directory.
+ * In the simplest and most common form of usage, the application
+ * specifies a set of attributes--possibly with specific
+ * values--to match, and submits this attribute set, to the
+ * {@code search()} method.
+ * There are other overloaded forms of {@code search()}
+ * that support more sophisticated <em>search filters</em>.
+ *
+ *
+ * <h2>Package Specification</h2>
+ *
+ * The JNDI API Specification and related documents can be found in the
+ * {@extLink jndi_overview JNDI documentation}.
+ *
+ * @since 1.3
+ */
+package javax.naming.directory;
diff --git a/src/java.naming/share/classes/javax/naming/directory/package.html b/src/java.naming/share/classes/javax/naming/directory/package.html
deleted file mode 100644
index ff4a83b4ce0..00000000000
--- a/src/java.naming/share/classes/javax/naming/directory/package.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-Copyright (c) 1999, 2019, 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.
--->
-</head>
-<body bgcolor="white">
-
-Extends the <code>javax.naming</code> package to provide functionality
-for accessing directory services.
-
-<p>
-This package defines the directory operations of the Java Naming and
-Directory Interface (JNDI). &nbsp;
-JNDI provides naming and directory functionality to applications
-written in the Java programming language.  It is designed to be
-independent of any specific naming or directory service
-implementation.  Thus a variety of services--new, emerging, and
-already deployed ones--can be accessed in a common way.
-
-<p>
-This package allows applications to retrieve and update attributes
-associated with objects stored in a directory, and to search for
-objects using specified attributes.
-
-<h2>The Directory Context</h2>
-
-The <code>DirContext</code>
-interface represents a <em>directory context</em>.
-It defines methods for examining and updating attributes associated with a
-<em>directory object</em>, or <em>directory entry</em> as it is sometimes
-called.
-<p>
-You use	<code>getAttributes()</code> to retrieve the attributes
-associated with a directory object (for which you supply the name).
-Attributes are modified using <code>modifyAttributes()</code>.
-You can add, replace, or remove attributes and/or attribute values
-using this operation.
-<p>
-<code>DirContext</code> also behaves as a naming context
-by extending the <code>Context</code> interface in the <code>javax.naming</code> package.
-This means that any directory object can also provide
-a naming context. 
-For example, the directory object for a person might contain
-the attributes of that person, and at the same time provide
-a context for naming objects relative to that person
-such as his printers and home directory.
-
-<h3>Searches</h3>
-<code>DirContext</code> contains methods for
-performing content-based searching of the directory.
-In the simplest and most common form of usage, the application
-specifies a set of attributes--possibly with specific
-values--to match, and submits this attribute set, to the
-<code>search()</code> method.
-There are other overloaded forms of <code>search()</code>
-that support more sophisticated <em>search filters</em>.
-
-
-<h2>Package Specification</h2>
-
-The JNDI API Specification and related documents can be found in the
-{@extLink jndi_overview JNDI documentation}.
-
-@since 1.3
-
-</body>
-</html>
diff --git a/src/java.naming/share/classes/javax/naming/event/package-info.java b/src/java.naming/share/classes/javax/naming/event/package-info.java
new file mode 100644
index 00000000000..4214ee85973
--- /dev/null
+++ b/src/java.naming/share/classes/javax/naming/event/package-info.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 1999, 2024, 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.
+ */
+
+/**
+ *
+ * Provides support for event notification when accessing naming and
+ * directory services.
+ *
+ * <p>
+ * This package defines the event notification operations of the Java Naming
+ * and Directory Interface (JNDI). &nbsp;
+ * JNDI provides naming and directory functionality to applications
+ * written in the Java programming language. It is designed to be
+ * independent of any specific naming or directory service
+ * implementation. Thus a variety of services--new, emerging, and
+ * already deployed ones--can be accessed in a common way.
+ *
+ * <h2>Naming Events</h2>
+ * <p>
+ * This package defines a {@code NamingEvent} class to represent an event
+ * that is generated by a naming/directory service.
+ * It also defines subinterfaces of {@code Context} and {@code DirContext},
+ * called {@code EventContext} and {@code EventDirContext},
+ * through which applications can register their interest in events
+ * fired by the context.
+ * <p>
+ * {@code NamingEvent} represents an event that occurs in a
+ * naming or directory service. There are two categories of naming events:
+ * <ul>
+ * <li>Those that affect the namespace (add/remove/rename an object)
+ * <li>Those that affect the objects' contents.
+ * </ul>
+ * Each category of events is handled by a corresponding listener:
+ * {@code NamespaceChangeListener}, {@code ObjectChangeListener}.
+ * <p>
+ * An application, for example, can register its interest in changes to
+ * objects in a context as follows:
+ * {@snippet :
+ * EventContext src =
+ *     (EventContext)(new InitialContext()).lookup("o=wiz,c=us");
+ * src.addNamingListener("ou=users", EventContext.ONELEVEL_SCOPE,
+ *     new ChangeHandler());
+ * ...
+ * class ChangeHandler implements ObjectChangeListener {
+ *     public void objectChanged(NamingEvent evt) {
+ *         System.out.println(evt.getNewBinding());
+ *     }
+ *     public void namingExceptionThrown(NamingExceptionEvent evt) {
+ *         System.out.println(evt.getException());
+ *     }
+ * }
+ * }
+ *
+ * <a id=THREADING></a>
+ * <h3>Threading Issues</h3>
+ *
+ * When an event is dispatched to a listener, the listener method (such
+ * as {@code objectChanged()}) may be executed in a thread other than the
+ * one in which the call to {@code addNamingListener()} was executed.
+ * The choice of which thread to use is made by the service provider.
+ * When an event is dispatched to multiple listeners, the service provider
+ * may choose (and is generally encouraged) to execute the listener methods
+ * concurrently in separate threads.
+ * <p>
+ * When a listener instance invokes {@code NamingEvent.getEventContext()},
+ * it must take into account the possibility that other threads will be
+ * working with that context concurrently. Likewise, when a listener is
+ * registered via {@code addNamingListener()}, the registering thread
+ * must take into account the likely possibility that the service provider
+ * will later invoke the listeners in newly-created threads. As {@code Context}
+ * instances are not guaranteed to be thread-safe in general, all context
+ * operations must be synchronized as needed.
+ *
+ * <h3>Exception Handling</h3>
+ *
+ * When a listener registers for events with a context, the context might
+ * need to do some internal processing in order to collect information
+ * required to generate the events. The context, for example, might need
+ * to make a request to the server to register interest in changes
+ * on the server that will eventually be translated into events.
+ * If an exception occurs that prevents information about the events from
+ * being collected, the listener will never be notified of the events.
+ * When such an exception occurs, a {@code NamingExceptionEvent} is
+ * fired to notify the listener. The listener's
+ * {@code namingExceptionThrown()} method is invoked, as shown in the
+ * sample code above,
+ * and the listener is automatically deregistered.
+ *
+ * <h2>Package Specification</h2>
+ *
+ * The JNDI API Specification and related documents can be found in the
+ * {@extLink jndi_overview JNDI documentation}.
+ *
+ * @since 1.3
+ */
+package javax.naming.event;
diff --git a/src/java.naming/share/classes/javax/naming/event/package.html b/src/java.naming/share/classes/javax/naming/event/package.html
deleted file mode 100644
index 087e7c869a4..00000000000
--- a/src/java.naming/share/classes/javax/naming/event/package.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-Copyright (c) 1999, 2019, 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.
--->
-</head>
-<body bgcolor="white">
-
-Provides support for event notification when accessing naming and
-directory services.
-
-<p>
-This package defines the event notification operations of the Java Naming
-and Directory Interface (JNDI). &nbsp;
-JNDI provides naming and directory functionality to applications
-written in the Java programming language.  It is designed to be
-independent of any specific naming or directory service
-implementation.  Thus a variety of services--new, emerging, and
-already deployed ones--can be accessed in a common way.
-
-<h2>Naming Events</h2>
-<p>
-This package defines a <code>NamingEvent</code> class to represent an event
-that is generated by a naming/directory service.
-It also defines subinterfaces of <code>Context</code> and <code>DirContext</code>,
-called <code>EventContext</code> and <code>EventDirContext</code>,
-through which applications can register their interest in events
-fired by the context.
-<p>
-<code>NamingEvent</code> represents an event that occurs in a 
-naming or directory service. There are two categories of naming events:
-<ul>
-<li>Those that affect the namespace (add/remove/rename an object)
-<li>Those that affect the objects' contents.
-</ul>
-Each category of events is handled by a corresponding listener:
-<code>NamespaceChangeListener</code>, <code>ObjectChangeListener</code>.
-<p>
-An application, for example, can register its interest in changes to
-objects in a context as follows:
-<blockquote>
-<pre>
-EventContext src = 
-    (EventContext)(new InitialContext()).lookup("o=wiz,c=us");
-src.addNamingListener("ou=users", EventContext.ONELEVEL_SCOPE,
-    new ChangeHandler());
-...
-class ChangeHandler implements ObjectChangeListener {
-    public void objectChanged(NamingEvent evt) {
-        System.out.println(evt.getNewBinding());
-    }
-    public void namingExceptionThrown(NamingExceptionEvent evt) {
-        System.out.println(evt.getException());
-    }
-}
-</pre>
-</blockquote>
-
-<a id=THREADING></a>
-<h3>Threading Issues</h3>
-
-When an event is dispatched to a listener, the listener method (such
-as <code>objectChanged()</code>) may be executed in a thread other than the
-one in which the call to <code>addNamingListener()</code> was executed.
-The choice of which thread to use is made by the service provider.
-When an event is dispatched to multiple listeners, the service provider
-may choose (and is generally encouraged) to execute the listener methods
-concurrently in separate threads.
-<p>
-When a listener instance invokes <code>NamingEvent.getEventContext()</code>,
-it must take into account the possibility that other threads will be
-working with that context concurrently.  Likewise, when a listener is
-registered via <code>addNamingListener()</code>, the registering thread
-must take into account the likely possibility that the service provider
-will later invoke the listeners in newly-created threads.  As <code>Context</code>
-instances are not guaranteed to be thread-safe in general, all context
-operations must be synchronized as needed.
-
-<h3>Exception Handling</h3>
-
-When a listener registers for events with a context, the context might
-need to do some internal processing in order to collect information
-required to generate the events.  The context, for example, might need
-to make a request to the server to register interest in changes
-on the server that will eventually be translated into events.
-If an exception occurs that prevents information about the events from
-being collected, the listener will never be notified of the events.
-When such an exception occurs, a <code>NamingExceptionEvent</code> is
-fired to notify the listener. The listener's
-<code>namingExceptionThrown()</code> method is invoked, as shown in the
-sample code above,
-and the listener is automatically deregistered.
-
-<h2>Package Specification</h2>
-
-
-The JNDI API Specification and related documents can be found in the
-{@extLink jndi_overview JNDI documentation}.
-
-@since 1.3
-
-</body>
-</html>
diff --git a/src/java.naming/share/classes/javax/naming/ldap/package-info.java b/src/java.naming/share/classes/javax/naming/ldap/package-info.java
new file mode 100644
index 00000000000..f5ba4906fd7
--- /dev/null
+++ b/src/java.naming/share/classes/javax/naming/ldap/package-info.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 1999, 2024, 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.
+ */
+
+/**
+ *
+ * Provides support for LDAPv3 extended operations and controls.
+ *
+ * <p>
+ * This package extends the directory operations of the Java Naming and
+ * Directory Interface (JNDI). &nbsp;
+ * JNDI provides naming and directory functionality to applications
+ * written in the Java programming language. It is designed to be
+ * independent of any specific naming or directory service
+ * implementation. Thus a variety of services--new, emerging, and
+ * already deployed ones--can be accessed in a common way.
+ *
+ * <p>
+ * This package is for applications and service providers that deal with
+ * LDAPv3 extended operations and controls, as defined by
+ * <a href=http://www.ietf.org/rfc/rfc2251.txt>RFC 2251</a>.
+ * The core interface in this package is {@code LdapContext}, which defines
+ * methods on a context for performing extended operations and handling
+ * controls.
+ *
+ * <h2>Extended Operations</h2>
+ * <p>
+ * This package defines the interface {@code ExtendedRequest}
+ * to represent the argument to an extended operation,
+ * and the interface {@code ExtendedResponse} to represent the result
+ * of the extended operation.
+ * An extended response is always paired with an extended request
+ * but not necessarily vice versa. That is, you can have an extended request
+ * that has no corresponding extended response.
+ * <p>
+ * An application typically does not deal directly with these interfaces.
+ * Instead, it deals with classes that <em>implement</em> these
+ * interfaces.
+ * The application gets these classes either as part of a
+ * repertoire of extended operations standardized through the IETF, or
+ * from directory vendors for vendor-specific extended operations.
+ * The request classes should have constructors that accept
+ * arguments in a type-safe and user-friendly manner, while the
+ * response classes should have access methods for getting the data
+ * of the response in a type-safe and user-friendly manner.
+ * Internally, the request/response classes deal with encoding and decoding
+ * BER values.
+ * <p>
+ * For example, suppose an LDAP server supports a "get time" extended operation.
+ * It would supply classes such as
+ * {@code GetTimeRequest} and {@code GetTimeResponse},
+ * so that applications can use this feature.
+ * An application would use these classes as follows:
+ * {@snippet :
+ * GetTimeResponse resp =
+ *     (GetTimeResponse) ectx.extendedOperation(new GetTimeRequest());
+ * long time = resp.getTime();
+ * }
+ * <p>
+ * The {@code GetTimeRequest} and {@code GetTimeResponse} classes might
+ * be defined as follows:
+ * {@snippet :
+ * public class GetTimeRequest implements ExtendedRequest {
+ *     // User-friendly constructor
+ *     public GetTimeRequest() {
+ *     };
+ *
+ *     // Methods used by service providers
+ *     public String getID() {
+ *         return GETTIME_REQ_OID;
+ *     }
+ *     public byte[] getEncodedValue() {
+ *         return null;  // no value needed for get time request
+ *     }
+ *     public ExtendedResponse createExtendedResponse(
+ *         String id, byte[] berValue, int offset, int length) throws NamingException {
+ *         return new GetTimeResponse(id, berValue, offset, length);
+ *     }
+ * }
+ * public class GetTimeResponse implements ExtendedResponse {
+ *     long time;
+ *     // called by GetTimeRequest.createExtendedResponse()
+ *     public GetTimeResponse(String id, byte[] berValue, int offset, int length)
+ *         throws NamingException {
+ *         // check validity of id
+ *         long time =  ... // decode berValue to get time
+ *     }
+ *
+ *     // Type-safe and User-friendly methods
+ *     public java.util.Date getDate() { return new java.util.Date(time); }
+ *     public long getTime() { return time; }
+ *
+ *     // Low level methods
+ *     public byte[] getEncodedValue() {
+ *         return // berValue saved;
+ *     }
+ *     public String getID() {
+ *         return GETTIME_RESP_OID;
+ *     }
+ * }
+ * }
+ *
+ * <h2>Controls</h2>
+ *
+ * This package defines the interface {@code Control} to represent an LDAPv3
+ * control. It can be a control that is sent to an LDAP server
+ * (<em>request control</em>) or a control returned by an LDAP server
+ * (<em>response control</em>). Unlike extended requests and responses,
+ * there is not necessarily any pairing between request controls and
+ * response controls. You can send request controls and expect no
+ * response controls back, or receive response controls without sending
+ * any request controls.
+ * <p>
+ * An application typically does not deal directly with this interface.
+ * Instead, it deals with classes that <em>implement</em> this interface.
+ * The application gets control classes either as part of a repertoire of
+ * controls standardized through the IETF, or from directory vendors for
+ * vendor-specific controls. The request control classes should have
+ * constructors that accept arguments in a type-safe and user-friendly
+ * manner, while the response control classes should have access methods
+ * for getting the data of the response in a type-safe and user-friendly
+ * manner. Internally, the request/response control classes deal with
+ * encoding and decoding BER values.
+ * <p>
+ * For example, suppose an LDAP server supports a "signed results"
+ * request control, which when sent with a request, asks the
+ * server to digitally sign the results of an operation.
+ * It would supply a class {@code SignedResultsControl} so that applications
+ * can use this feature.
+ * An application would use this class as follows:
+ * {@snippet :
+ * Control[] reqCtls = new Control[] {new SignedResultsControl(Control.CRITICAL)};
+ * ectx.setRequestControls(reqCtls);
+ * NamingEnumeration enum = ectx.search(...);
+ * }
+ * The {@code SignedResultsControl} class might be defined as follows:
+ * {@snippet :
+ * public class SignedResultsControl implements Control {
+ *     // User-friendly constructor
+ *     public SignedResultsControl(boolean criticality) {
+ *  // assemble the components of the request control
+ *     };
+ *
+ *     // Methods used by service providers
+ *     public String getID() {
+ *         return // control's object identifier
+ *     }
+ *     public byte[] getEncodedValue() {
+ *         return // ASN.1 BER encoded control value
+ *     }
+ *     ...
+ * }
+ * }
+ * <p>
+ * When a service provider receives response controls, it uses
+ * the {@code ControlFactory} class to produce specific classes
+ * that implement the {@code Control} interface.
+ * <p>
+ * An LDAP server can send back response controls with an LDAP operation
+ * and also with enumeration results, such as those returned
+ * by a list or search operation.
+ * The {@code LdapContext} provides a method ({@code getResponseControls()})
+ * for getting the response controls sent with an LDAP operation,
+ * while the {@code HasControls} interface is used to retrieve
+ * response controls associated with enumeration results.
+ * <p>
+ * For example, suppose an LDAP server sends back a "change ID" control in response
+ * to a successful modification. It would supply a class {@code ChangeIDControl}
+ * so that the application can use this feature.
+ * An application would perform an update, and then try to get the change ID.
+ * {@snippet :
+ * // Perform update
+ * Context ctx = ectx.createSubsubcontext("cn=newobj");
+ *
+ * // Get response controls
+ * Control[] respCtls = ectx.getResponseControls();
+ * if (respCtls != null) {
+ *     // Find the one we want
+ *     for (int i = 0; i < respCtls.length; i++) {
+ *         if(respCtls[i] instanceof ChangeIDControl) {
+ *      ChangeIDControl cctl = (ChangeIDControl)respCtls[i];
+ *      System.out.println(cctl.getChangeID());
+ *         }
+ *     }
+ * }
+ * }
+ * The vendor might supply the following {@code ChangeIDControl} and
+ * {@code VendorXControlFactory} classes. The {@code VendorXControlFactory}
+ * will be used by the service provider when the provider receives response
+ * controls from the LDAP server.
+ * {@snippet :
+ * public class ChangeIDControl implements Control {
+ *     long id;
+ *
+ *     // Constructor used by ControlFactory
+ *     public ChangeIDControl(String OID, byte[] berVal) throws NamingException {
+ *         // check validity of OID
+ *         id = // extract change ID from berVal
+ *     };
+ *
+ *     // Type-safe and User-friendly method
+ *     public long getChangeID() {
+ *         return id;
+ *     }
+ *
+ *     // Low-level methods
+ *     public String getID() {
+ *         return CHANGEID_OID;
+ *     }
+ *     public byte[] getEncodedValue() {
+ *         return // original berVal
+ *     }
+ *     ...
+ * }
+ * public class VendorXControlFactory extends ControlFactory {
+ *     public VendorXControlFactory () {
+ *     }
+ *
+ *     public Control getControlInstance(Control orig) throws NamingException {
+ *         if (isOneOfMyControls(orig.getID())) {
+ *      ...
+ *
+ *      // determine which of ours it is and call its constructor
+ *      return (new ChangeIDControl(orig.getID(), orig.getEncodedValue()));
+ *  }
+ *         return null;  // not one of ours
+ *     }
+ * }
+ * }
+ *
+ * <h2>Package Specification</h2>
+ *
+ * The JNDI API Specification and related documents can be found in the
+ * {@extLink jndi_overview JNDI documentation}.
+ *
+ * @since 1.3
+ */
+package javax.naming.ldap;
diff --git a/src/java.naming/share/classes/javax/naming/ldap/package.html b/src/java.naming/share/classes/javax/naming/ldap/package.html
deleted file mode 100644
index 6bd2f78e789..00000000000
--- a/src/java.naming/share/classes/javax/naming/ldap/package.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-Copyright (c) 1999, 2019, 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.
- 
--->
-</head>
-<body bgcolor="white">
-
-Provides support for LDAPv3 extended operations and controls.
-
-<p>
-This package extends the directory operations of the Java Naming and
-Directory Interface (JNDI). &nbsp;
-JNDI provides naming and directory functionality to applications
-written in the Java programming language.  It is designed to be
-independent of any specific naming or directory service
-implementation.  Thus a variety of services--new, emerging, and
-already deployed ones--can be accessed in a common way.
-
-<p>
-This package is for applications and service providers that deal with
-LDAPv3 extended operations and controls, as defined by
-<a href=http://www.ietf.org/rfc/rfc2251.txt>RFC 2251</a>.
-The core interface in this package is <code>LdapContext</code>, which defines
-methods on a context for performing extended operations and handling
-controls.
-
-<h2>Extended Operations</h2>
-<p>
-This package defines the interface <code>ExtendedRequest</code>
-to represent the argument to an extended operation,
-and the interface <code>ExtendedResponse</code> to represent the result
-of the extended operation.
-An extended response is always paired with an extended request
-but not necessarily vice versa. That is, you can have an extended request
-that has no corresponding extended response.
-<p>
-An application typically does not deal directly with these interfaces.
-Instead, it deals with classes that <em>implement</em> these
-interfaces.  
-The application gets these classes either as part of a
-repertoire of extended operations standardized through the IETF, or
-from directory vendors for vendor-specific extended operations.
-The request classes should have constructors that accept
-arguments in a type-safe and user-friendly manner, while the
-response classes should have access methods for getting the data
-of the response in a type-safe and user-friendly manner.
-Internally, the request/response classes deal with encoding and decoding
-BER values.
-<p>
-For example, suppose an LDAP server supports a "get time" extended operation.
-It would supply classes such as
-<code>GetTimeRequest</code> and <code>GetTimeResponse</code>,
-so that applications can use this feature.
-An application would use these classes as follows:
-<blockquote><pre>
-GetTimeResponse resp =
-    (GetTimeResponse) ectx.extendedOperation(new GetTimeRequest());
-long time = resp.getTime();
-</pre></blockquote>
-<p>
-The <code>GetTimeRequest</code> and <code>GetTimeResponse</code> classes might
-be defined as follows:
-<blockquote><pre>
-public class GetTimeRequest implements ExtendedRequest {
-    // User-friendly constructor 
-    public GetTimeRequest() {
-    };
-
-    // Methods used by service providers
-    public String getID() {
-        return GETTIME_REQ_OID;
-    }
-    public byte[] getEncodedValue() {
-        return null;  // no value needed for get time request
-    }
-    public ExtendedResponse createExtendedResponse(
-        String id, byte[] berValue, int offset, int length) throws NamingException {
-        return new GetTimeResponse(id, berValue, offset, length);
-    }
-}
-public class GetTimeResponse() implements ExtendedResponse {
-    long time;
-    // called by GetTimeRequest.createExtendedResponse()
-    public GetTimeResponse(String id, byte[] berValue, int offset, int length)
-        throws NamingException {
-        // check validity of id
-        long time =  ... // decode berValue to get time
-    }
-
-    // Type-safe and User-friendly methods
-    public java.util.Date getDate() { return new java.util.Date(time); }
-    public long getTime() { return time; }
-
-    // Low level methods
-    public byte[] getEncodedValue() {
-        return // berValue saved;
-    }
-    public String getID() {
-        return GETTIME_RESP_OID;
-    }
-}
-</pre></blockquote>
-
-<h2>Controls</h2>
-
-This package defines the interface <code>Control</code> to represent an LDAPv3
-control. It can be a control that is sent to an LDAP server
-(<em>request control</em>) or a control returned by an LDAP server
-(<em>response control</em>).  Unlike extended requests and responses,
-there is not necessarily any pairing between request controls and
-response controls.  You can send request controls and expect no
-response controls back, or receive response controls without sending
-any request controls.
-<p>
-An application typically does not deal directly with this interface.
-Instead, it deals with classes that <em>implement</em> this interface.
-The application gets control classes either as part of a repertoire of
-controls standardized through the IETF, or from directory vendors for
-vendor-specific controls.  The request control classes should have
-constructors that accept arguments in a type-safe and user-friendly
-manner, while the response control classes should have access methods
-for getting the data of the response in a type-safe and user-friendly
-manner.  Internally, the request/response control classes deal with
-encoding and decoding BER values.
-<p>
-For example, suppose an LDAP server supports a "signed results"
-request control, which when sent with a request, asks the
-server to digitally sign the results of an operation.
-It would supply a class <code>SignedResultsControl</code>  so that applications
-can use this feature.
-An application  would use this class as follows:
-<blockquote>
-<pre>
-Control[] reqCtls = new Control[] {new SignedResultsControl(Control.CRITICAL)};
-ectx.setRequestControls(reqCtls);
-NamingEnumeration enum = ectx.search(...);
-</pre>
-</blockquote>
-The <code>SignedResultsControl</code> class might be defined as follows:
-<blockquote><pre>
-public class SignedResultsControl implements Control {
-    // User-friendly constructor 
-    public SignedResultsControl(boolean criticality) {
-	// assemble the components of the request control
-    };
-
-    // Methods used by service providers
-    public String getID() {
-        return // control's object identifier
-    }
-    public byte[] getEncodedValue() {
-        return // ASN.1 BER encoded control value
-    }
-    ...
-}
-</pre></blockquote>
-<p>
-When a service provider receives response controls, it uses
-the <code>ControlFactory</code> class to produce specific classes
-that implement the <code>Control</code> interface.
-<p>
-An LDAP server can send back response controls with an LDAP operation
-and also with enumeration results, such as those returned
-by a list or search operation.
-The <code>LdapContext</code> provides a method (<code>getResponseControls()</code>)
-for getting the response controls sent with an LDAP operation,
-while the <code>HasControls</code> interface is used to retrieve
-response controls associated with enumeration results.
-<p>
-For example, suppose an LDAP server sends back a "change ID" control in response
-to a successful modification. It would supply a class <code>ChangeIDControl</code>
-so that the application can use this feature.
-An application would perform an update, and then try to get the change ID.
-<blockquote><pre>
-// Perform update
-Context ctx = ectx.createSubsubcontext("cn=newobj");
-
-// Get response controls
-Control[] respCtls = ectx.getResponseControls();
-if (respCtls != null) {
-    // Find the one we want
-    for (int i = 0; i &lt; respCtls; i++) {
-        if(respCtls[i] instanceof ChangeIDControl) {
-	    ChangeIDControl cctl = (ChangeIDControl)respCtls[i];
-	    System.out.println(cctl.getChangeID());
-        }
-    }
-}
-</pre></blockquote>
-The vendor might supply the following <code>ChangeIDControl</code> and
-<code>VendorXControlFactory</code> classes. The <code>VendorXControlFactory</code>
-will be used by the service provider when the provider receives response
-controls from the LDAP server.
-<blockquote><pre>
-public class ChangeIDControl implements Control {
-    long id;
-
-    // Constructor used by ControlFactory
-    public ChangeIDControl(String OID, byte[] berVal) throws NamingException {
-        // check validity of OID
-        id = // extract change ID from berVal
-    };
-
-    // Type-safe and User-friendly method
-    public long getChangeID() {
-        return id;
-    }
-
-    // Low-level methods
-    public String getID() {
-        return CHANGEID_OID;
-    }
-    public byte[] getEncodedValue() {
-        return // original berVal
-    }
-    ...
-}
-public class VendorXControlFactory extends ControlFactory {
-    public VendorXControlFactory () {
-    }
-
-    public Control getControlInstance(Control orig) throws NamingException {
-        if (isOneOfMyControls(orig.getID())) {
-	    ...
-
-	    // determine which of ours it is and call its constructor
-	    return (new ChangeIDControl(orig.getID(), orig.getEncodedValue()));
-	}
-        return null;  // not one of ours
-    }
-}
-</pre></blockquote>
-
-<h2>Package Specification</h2>
-
-The JNDI API Specification and related documents can be found in the
-{@extLink jndi_overview JNDI documentation}.
-
-@since 1.3
-
-</body>
-</html>
diff --git a/src/java.naming/share/classes/javax/naming/ldap/spi/package-info.java b/src/java.naming/share/classes/javax/naming/ldap/spi/package-info.java
new file mode 100644
index 00000000000..20f3ea258ef
--- /dev/null
+++ b/src/java.naming/share/classes/javax/naming/ldap/spi/package-info.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2024, 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.
+ */
+
+/**
+ *
+ * Provides the Service Provider Interface for DNS lookups when
+ * performing LDAP operations.
+ *
+ * @since 12
+ */
+package javax.naming.ldap.spi;
diff --git a/src/java.naming/share/classes/javax/naming/package-info.java b/src/java.naming/share/classes/javax/naming/package-info.java
new file mode 100644
index 00000000000..edcc76506ef
--- /dev/null
+++ b/src/java.naming/share/classes/javax/naming/package-info.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 1999, 2024, 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.
+ */
+
+/**
+ * Provides the classes and interfaces for accessing naming services.
+ *
+ * <p>
+ * This package defines the naming operations of the Java Naming and
+ * Directory Interface (JNDI). &nbsp;
+ * JNDI provides naming and directory functionality to applications
+ * written in the Java programming language. It is designed to be
+ * independent of any specific naming or directory service
+ * implementation. Thus a variety of services--new, emerging, and
+ * already deployed ones--can be accessed in a common way.
+ *
+ *
+ * <h2>Context</h2>
+ * <p>
+ * This package defines the notion of a <em>context</em>, represented
+ * by the {@code Context} interface.
+ * A context consists of a set of name-to-object <em>bindings</em>.
+ * {@code Context} is the core interface for looking up, binding, unbinding,
+ * and renaming objects, and for creating and destroying subcontexts.
+ * <p>
+ * {@code lookup()} is the most commonly used operation.
+ * You supply {@code lookup()}
+ * the name of the object you want
+ * to look up, and it returns the object bound to that name.
+ * For example, the following code fragment looks up
+ * a printer and sends a document to the printer object
+ * to be printed:
+ *
+ * {@snippet :
+ * Printer printer = (Printer)ctx.lookup("treekiller");
+ * printer.print(report);
+ * }
+ *
+ * <h2>Names</h2>
+ * <p>
+ * Every naming method in the {@code Context}
+ * interface has two
+ * overloads: one that accepts a
+ * {@code Name} argument and one that accepts a string name.
+ * {@code Name} is an interface that represents a generic
+ * name--an ordered sequence of zero of more components.
+ * For these methods, {@code Name} can be used to represent a
+ * <em>composite name</em> ({@code CompositeName})
+ * so that you can name an object using a name which spans multiple namespaces.
+ * <p>
+ * The overloads that accept {@code Name}
+ * are useful for applications that need to manipulate names: composing
+ * them, comparing components, and so on.
+ * The overloads that accept string names are likely to be more useful
+ * for simple applications, such as those that simply read in a name
+ * and look up the corresponding object.
+ *
+ * <h2>Bindings</h2>
+ *
+ * The {@code Binding} class represents a name-to-object binding.
+ * It is a tuple containing the name of the bound object,
+ * the name of the object's class, and the object itself.
+ * <p>
+ * The {@code Binding} class is actually a subclass of
+ * {@code NameClassPair}, which consists
+ * simply of the object's name and the object's class name.
+ * The {@code NameClassPair} is useful when you only want
+ * information about the object's class and do not want to
+ * pay the extra cost of getting the object.
+ *
+ * <h2>References</h2>
+ * Objects are stored in naming and directory services in different ways.
+ * If an object store supports storing Java objects,
+ * it might support storing an object in its serialized form.
+ * However, some naming and directory services do not support the
+ * storing of Java objects. Furthermore, for some
+ * objects in the directory, Java programs are but one group of applications
+ * that access them. In this case, a serialized Java object might
+ * not be the most appropriate representation.
+ * JNDI defines a <em>reference</em>, represented by the {@code Reference}
+ * class, which contains information on how to construct a copy of the object.
+ * JNDI will attempt to turn references looked up from the directory
+ * into the Java objects they represent, so that
+ * JNDI clients have the illusion that what
+ * is stored in the directory are Java objects.
+ *
+ *
+ * <h2>The Initial Context</h2>
+ *
+ * In JNDI, all naming and directory operations are performed relative
+ * to a context. There are no absolute roots.
+ * Therefore JNDI defines an <em>initial context</em>,
+ * {@code InitialContext},
+ * which provides a starting point for naming and directory operations.
+ * Once you have an initial context, you can use it to
+ * look up other contexts and objects.
+ *
+ * <h2>Exceptions</h2>
+ *
+ * JNDI defines a class hierarchy for exceptions that can be thrown in
+ * the course of performing naming and directory operations. The root of
+ * this class hierarchy is {@code NamingException}.
+ * Programs interested in dealing with a particular exception
+ * can catch the corresponding subclass of the exception.
+ * Otherwise, programs should catch {@code NamingException}.
+ *
+ *
+ * <h2>Package Specification</h2>
+ *
+ * The JNDI API Specification and related documents can be found in the
+ * {@extLink jndi_overview JNDI documentation}.
+ *
+ * @since 1.3
+ */
+package javax.naming;
diff --git a/src/java.naming/share/classes/javax/naming/package.html b/src/java.naming/share/classes/javax/naming/package.html
deleted file mode 100644
index 67e046f84c6..00000000000
--- a/src/java.naming/share/classes/javax/naming/package.html
+++ /dev/null
@@ -1,143 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-Copyright (c) 1999, 2019, 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.
--->
-</head>
-<body bgcolor="white">
-
-Provides the classes and interfaces for accessing naming services.
-
-<p>
-This package defines the naming operations of the Java Naming and
-Directory Interface (JNDI). &nbsp;
-JNDI provides naming and directory functionality to applications
-written in the Java programming language.  It is designed to be
-independent of any specific naming or directory service
-implementation.  Thus a variety of services--new, emerging, and
-already deployed ones--can be accessed in a common way.
-
-
-<h2>Context</h2>
-<p>
-This package defines the notion of a <em>context</em>, represented
-by the <code>Context</code> interface.
-A context consists of a set of name-to-object <em>bindings</em>.
-<code>Context</code> is the core interface for looking up, binding, unbinding,
-and renaming objects, and for creating and destroying subcontexts.
-<p>
-<code>lookup()</code> is the most commonly used operation.
-You supply <code>lookup()</code>
-the name of the object you want
-to look up, and it returns the object bound to that name.
-For example, the following code fragment looks up 
-a printer and sends a document to the printer object
-to be printed:
-
-<blockquote>
-<pre>
-Printer printer = (Printer)ctx.lookup("treekiller");
-printer.print(report);
-</pre>
-</blockquote>
-
-<h2>Names</h2>
-<p>
-Every naming method in the <code>Context</code>
-interface has two
-overloads: one that accepts a 
-<code>Name</code> argument and one that accepts a string name.
-<code>Name</code> is an interface that represents a generic 
-name--an ordered sequence of zero of more components.
-For these methods, <code>Name</code> can be used to represent a
-<em>composite name</em> (<code>CompositeName</code>)
-so that you can name an object using a name which spans multiple namespaces.
-<p>
-The overloads that accept <code>Name</code>
-are useful for applications that need to manipulate names: composing
-them, comparing components, and so on.
-The overloads that accept string names are likely to be more useful
-for simple applications, such as those that simply read in a name
-and look up the corresponding object.
-
-<h2>Bindings</h2>
-
-The <code>Binding</code> class represents a name-to-object binding.
-It is a tuple containing the name of the bound object,
-the name of the object's class, and the object itself.
-<p>
-The <code>Binding</code> class is actually a subclass of
-<code>NameClassPair</code>, which consists
-simply of the object's name and the object's class name.
-The <code>NameClassPair</code> is useful when you only want
-information about the object's class and do not want to
-pay the extra cost of getting the object.
-
-<h2>References</h2>
-Objects are stored in naming and directory services in different ways.
-If an object store supports storing Java objects, 
-it might support storing an object in its serialized form.
-However, some naming and directory services do not support the
-storing of Java objects. Furthermore, for some
-objects in the directory, Java programs are but one group of applications 
-that access them. In this case, a serialized Java object might
-not be the most appropriate representation.
-JNDI defines a <em>reference</em>, represented by the <code>Reference</code>
-class, which contains information on how to construct a copy of the object.
-JNDI will attempt to turn references looked up from the directory
-into the Java objects they represent, so that
-JNDI clients have the illusion that what
-is stored in the directory are Java objects. 
-
-
-<h2>The Initial Context</h2>
-
-In JNDI, all naming and directory operations are performed relative
-to a context. There are no absolute roots.
-Therefore JNDI defines an <em>initial context</em>, 
-<code>InitialContext</code>,
-which provides a starting point for naming and directory operations.
-Once you have an initial context, you can use it to
-look up other contexts and objects.
-
-<h2>Exceptions</h2>
-
-JNDI defines a class hierarchy for exceptions that can be thrown in
-the course of performing naming and directory operations.  The root of
-this class hierarchy is <code>NamingException</code>.
-Programs interested in dealing with a particular exception
-can catch the corresponding subclass of the exception.
-Otherwise, programs should catch <code>NamingException</code>.
-
-
-<h2>Package Specification</h2>
-
-The JNDI API Specification and related documents can be found in the
-{@extLink jndi_overview JNDI documentation}.
-
-@since 1.3
-
-</body>
-</html>
diff --git a/src/java.naming/share/classes/javax/naming/spi/package-info.java b/src/java.naming/share/classes/javax/naming/spi/package-info.java
new file mode 100644
index 00000000000..382a35a17e8
--- /dev/null
+++ b/src/java.naming/share/classes/javax/naming/spi/package-info.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 1999, 2024, 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.
+ */
+
+/**
+ * Provides the means for dynamically plugging in support for accessing
+ * naming and directory services through the {@code javax.naming}
+ * and related packages.
+ *
+ * <p>
+ * This package defines the service provider interface (SPI) of the Java Naming
+ * and Directory Interface (JNDI). &nbsp;
+ * JNDI provides naming and directory functionality to applications
+ * written in the Java programming language. It is designed to be
+ * independent of any specific naming or directory service
+ * implementation. Thus a variety of services--new, emerging, and
+ * already deployed ones--can be accessed in a common way.
+ *
+ * <p>
+ * The JNDI SPI provides the means for creating JNDI service providers,
+ * through which JNDI applications access different naming and
+ * directory services.
+ *
+ *
+ * <h2>Plug-in Architecture</h2>
+ *
+ * The service provider package allows different implementations to be plugged in
+ * dynamically.
+ * These different implementations include those for the
+ * <em>initial context</em>,
+ * and implementations for contexts that can be reached
+ * from the initial context.
+ *
+ * <h2>Java Object Support</h2>
+ *
+ * The service provider package provides support
+ * for implementors of the
+ * {@code javax.naming.Context.lookup()}
+ * method and related methods to return Java objects that are natural
+ * and intuitive for the Java programmer.
+ * For example, when looking up a printer name from the directory,
+ * it is natural for you to expect to get
+ * back a printer object on which to operate.
+ *
+ *
+ * <h2>Multiple Naming Systems (Federation)</h2>
+ *
+ * JNDI operations allow applications to supply names that span multiple
+ * naming systems. So in the process of completing
+ * an operation, one service provider might need to interact
+ * with another service provider, for example, to pass on
+ * the operation to be continued in the next naming system.
+ * The service provider package provides support for
+ * different providers to cooperate to complete JNDI operations.
+ *
+ *
+ * <h2>Package Specification</h2>
+ *
+ * The JNDI SPI Specification and related documents can be found in the
+ * {@extLink jndi_overview JNDI documentation}.
+ *
+ * @since 1.3
+ */
+package javax.naming.spi;
diff --git a/src/java.naming/share/classes/javax/naming/spi/package.html b/src/java.naming/share/classes/javax/naming/spi/package.html
deleted file mode 100644
index f523c76deb4..00000000000
--- a/src/java.naming/share/classes/javax/naming/spi/package.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-<!--
-Copyright (c) 1999, 2019, 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.
--->
-</head>
-<body bgcolor="white">
-
-Provides the means for dynamically plugging in support for accessing
-naming and directory services through the <code>javax.naming</code>
-and related packages.
-
-<p>
-This package defines the service provider interface (SPI) of the Java Naming
-and Directory Interface (JNDI). &nbsp;
-JNDI provides naming and directory functionality to applications
-written in the Java programming language.  It is designed to be
-independent of any specific naming or directory service
-implementation.  Thus a variety of services--new, emerging, and
-already deployed ones--can be accessed in a common way.
-
-<p>
-The JNDI SPI provides the means for creating JNDI service providers,
-through which JNDI applications access different naming and
-directory services.
-
-
-<h2>Plug-in Architecture</h2>
-
-The service provider package allows different implementations to be plugged in
-dynamically.
-These different implementations include those for the
-<em>initial context</em>,
-and implementations for contexts that can be reached 
-from the initial context.
-
-<h2>Java Object Support</h2>
-
-The service provider package provides support
-for implementors of the
-<code>javax.naming.Context.lookup()</code>
-method and related methods to return Java objects that are natural
-and intuitive for the Java programmer.
-For example, when looking up a printer name from the directory,
-it is natural for you to expect to get
-back a printer object on which to operate.
-
-
-<h2>Multiple Naming Systems (Federation)</h2>
-
-JNDI operations allow applications to supply names that span multiple
-naming systems.  So in the process of completing
-an operation, one service provider might need to interact
-with another service provider, for example, to pass on
-the operation to be continued in the next naming system.
-The service provider package provides support for
-different providers to cooperate to complete JNDI operations.
-
-
-<h2>Package Specification</h2>
-
-The JNDI SPI Specification and related documents can be found in the
-{@extLink jndi_overview JNDI documentation}.
-
-@since 1.3
-
-</body>
-</html>
diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/ResponseSubscribers.java b/src/java.net.http/share/classes/jdk/internal/net/http/ResponseSubscribers.java
index ed95f815913..09ad87f9205 100644
--- a/src/java.net.http/share/classes/jdk/internal/net/http/ResponseSubscribers.java
+++ b/src/java.net.http/share/classes/jdk/internal/net/http/ResponseSubscribers.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -356,6 +356,7 @@ public void onNext(List<ByteBuffer> items) {
             // incoming buffers are allocated by http client internally,
             // and won't be used anywhere except this place.
             // So it's free simply to store them for further processing.
+            Objects.requireNonNull(items); // ensure NPE is thrown before assert
             assert Utils.hasRemaining(items);
             received.addAll(items);
         }
diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java b/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java
index 9bd7f350286..b2eb570db0c 100644
--- a/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java
+++ b/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java
@@ -746,6 +746,7 @@ public static String stringOf(Collection<?> source) {
     }
 
     public static long remaining(ByteBuffer[] bufs) {
+        if (bufs == null) return 0;
         long remain = 0;
         for (ByteBuffer buf : bufs) {
             remain += buf.remaining();
@@ -754,6 +755,7 @@ public static long remaining(ByteBuffer[] bufs) {
     }
 
     public static boolean hasRemaining(List<ByteBuffer> bufs) {
+        if (bufs == null) return false;
         for (ByteBuffer buf : bufs) {
             if (buf.hasRemaining())
                 return true;
@@ -762,6 +764,7 @@ public static boolean hasRemaining(List<ByteBuffer> bufs) {
     }
 
     public static boolean hasRemaining(ByteBuffer[] bufs) {
+        if (bufs == null) return false;
         for (ByteBuffer buf : bufs) {
             if (buf.hasRemaining())
                 return true;
@@ -770,6 +773,7 @@ public static boolean hasRemaining(ByteBuffer[] bufs) {
     }
 
     public static long remaining(List<ByteBuffer> bufs) {
+        if (bufs == null) return 0L;
         long remain = 0;
         for (ByteBuffer buf : bufs) {
             remain += buf.remaining();
@@ -778,12 +782,14 @@ public static long remaining(List<ByteBuffer> bufs) {
     }
 
     public static long synchronizedRemaining(List<ByteBuffer> bufs) {
+        if (bufs == null) return 0L;
         synchronized (bufs) {
             return remaining(bufs);
         }
     }
 
-    public static int remaining(List<ByteBuffer> bufs, int max) {
+    public static long remaining(List<ByteBuffer> bufs, long max) {
+        if (bufs == null) return 0;
         long remain = 0;
         for (ByteBuffer buf : bufs) {
             remain += buf.remaining();
@@ -794,7 +800,13 @@ public static int remaining(List<ByteBuffer> bufs, int max) {
         return (int) remain;
     }
 
-    public static int remaining(ByteBuffer[] refs, int max) {
+    public static int remaining(List<ByteBuffer> bufs, int max) {
+        // safe cast since max is an int
+        return (int) remaining(bufs, (long) max);
+    }
+
+    public static long remaining(ByteBuffer[] refs, long max) {
+        if (refs == null) return 0;
         long remain = 0;
         for (ByteBuffer b : refs) {
             remain += b.remaining();
@@ -805,6 +817,11 @@ public static int remaining(ByteBuffer[] refs, int max) {
         return (int) remain;
     }
 
+    public static int remaining(ByteBuffer[] refs, int max) {
+        // safe cast since max is an int
+        return (int) remaining(refs, (long) max);
+    }
+
     public static void close(Closeable... closeables) {
         for (Closeable c : closeables) {
             try {
diff --git a/src/java.rmi/share/man/rmiregistry.1 b/src/java.rmi/share/man/rmiregistry.1
index 29a2e2c965a..c168e1482a6 100644
--- a/src/java.rmi/share/man/rmiregistry.1
+++ b/src/java.rmi/share/man/rmiregistry.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "RMIREGISTRY" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "RMIREGISTRY" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/java.scripting/share/man/jrunscript.1 b/src/java.scripting/share/man/jrunscript.1
index 43029582b3e..59389c274d1 100644
--- a/src/java.scripting/share/man/jrunscript.1
+++ b/src/java.scripting/share/man/jrunscript.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JRUNSCRIPT" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JRUNSCRIPT" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties
index 9227a61a608..9f24c42b110 100644
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties
@@ -275,7 +275,7 @@
         RootElementTypeMustMatchDoctypedecl = Document Root-Element "{1}"muss mit DOCTYPE-Root "{0}" übereinstimmen.
         UndeclaredElementInContentSpec = Contentmodell des Elements "{0}" verweist auf das nicht deklarierte Element "{1}".
         UniqueNotationName = Deklaration für die Notation "{0}" ist nicht eindeutig. Ein jeweiliger Name darf nicht in mehreren Notationsdeklarationen deklariert werden.
-        ENTITYFailedInitializeGrammar =  ENTITYDatatype-Validator: Nicht erfolgreich. Initialisierungsmethode muss mit einer gültigen Grammatikreferenz aufgerufen werden. \t
+        ENTITYFailedInitializeGrammar =  ENTITYDatatype-Validator: Nicht erfolgreich. Initialisierungsmethode muss mit einer gültigen Grammatikreferenz aufgerufen werden.
         ENTITYNotUnparsed = ENTITY "{0}" ist geparst.
         ENTITYNotValid = ENTITY "{0}" ist nicht gültig.
         EmptyList = Werte der Typen ENTITIES, IDREFS und NMTOKENS dürfen keine leeren Listen sein.
diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties
index ef0edf1b188..00bced117f6 100644
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties
@@ -275,7 +275,7 @@
         RootElementTypeMustMatchDoctypedecl = ドキュメント・ルート要素"{1}"はDOCTYPEルート"{0}"と一致する必要があります。
         UndeclaredElementInContentSpec = 要素"{0}"のコンテンツ・モデルで未宣言の要素"{1}"が参照されています。
         UniqueNotationName = 表記法"{0}"の宣言が一意ではありません。同じ名前を複数の表記法宣言で宣言しないでください。
-        ENTITYFailedInitializeGrammar =  ENTITYDatatypeバリデータ: 有効な構文参照による初期化メソッドの呼出しに失敗しました。 \t
+        ENTITYFailedInitializeGrammar =  ENTITYDatatypeバリデータ: 有効な構文参照による初期化メソッドの呼出しに失敗しました。
         ENTITYNotUnparsed = ENTITY "{0}"は未解析ではありません。
         ENTITYNotValid = ENTITY "{0}"は有効ではありません。
         EmptyList = タイプENTITIES、IDREFSおよびNMTOKENSの値は空のリストにできません。
diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties
index 0b937ce7623..ffe36a06f35 100644
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties
@@ -275,7 +275,7 @@
         RootElementTypeMustMatchDoctypedecl = 文档根元素 "{1}" 必须匹配 DOCTYPE 根 "{0}"。
         UndeclaredElementInContentSpec = 元素 "{0}" 的内容模型引用未声明的元素 "{1}"。
         UniqueNotationName = 记号 "{0}" 的声明不是唯一的。不能在多个记号声明中声明指定的名称。
-        ENTITYFailedInitializeGrammar =  ENTITYDatatype 验证程序: 未能使用有效的语法引用调用初始化方法。\t
+        ENTITYFailedInitializeGrammar =  ENTITYDatatype 验证程序: 未能使用有效的语法引用调用初始化方法。
         ENTITYNotUnparsed = ENTITY "{0}" 不是未解析的。
         ENTITYNotValid = ENTITY "{0}" 无效。
         EmptyList = 类型为 ENTITIES, IDREFS 和 NMTOKENS 的值不能是空列表。
diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties
index fcd8b9e5a0c..e3f064694d8 100644
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties
@@ -27,7 +27,7 @@ FormatFailed = Beim Formatieren der folgenden Meldung ist ein interner Fehler au
 XPointerProcessingError = XPointerProcessingError: Beim Verarbeiten des XPointer-Ausdrucks ist ein Fehler aufgetreten.
 InvalidXPointerToken = InvalidXPointerToken: XPointer-Ausdruck enthält das ungültige Token "{0}"
 InvalidXPointerExpression = InvalidXPointerExpression: XPointer-Ausdruck "{0}" ist ungültig.
-MultipleShortHandPointers = MultipleShortHandPointers: XPointer-Ausdruck "{0}" ist ungültig. Mehrere ShortHand-Zeiger vorhanden.
+MultipleShortHandPointers = MultipleShortHandPointers: Der XPointer-Ausdruck "{0}" ist ungültig. Er enthält mehrere ShortHand-Zeiger.
 SchemeDataNotFollowedByCloseParenthesis = SchemeDataNotFollowedByCloseParenthesis: XPointer-Ausdruck "{0}" ist ungültig. Auf SchemeData folgte kein ")"-Zeichen.
 SchemeUnsupported = SchemeUnsupported: XPointer-Schema "{0}" wird nicht unterstützt.
 InvalidShortHandPointer = InvalidShortHandPointer: NCName von ShortHand-Zeiger "{0}" ist ungültig.
diff --git a/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp
index 036d0c8b667..32fbcded07e 100644
--- a/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp
+++ b/src/jdk.accessibility/windows/native/libwindowsaccessbridge/WinAccessBridge.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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
@@ -2773,7 +2773,7 @@ WinAccessBridge::getAccessibleTextItems(long vmID,
     if (destABWindow != (HWND) 0) {
         if (sendMemoryPackage(buffer, sizeof(buffer), destABWindow) == TRUE) {
             memcpy(textItems, &(pkg->rTextItemsInfo), sizeof(AccessibleTextItemsInfo));
-            if (pkg->rTextItemsInfo.letter != '/0') {
+            if (pkg->rTextItemsInfo.letter != '\0') {
                 return TRUE;
             }
         }
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
index 533541bd108..f58319496e9 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
@@ -950,7 +950,6 @@ public void visitClassDef(JCClassDecl tree) {
                 Optional.ofNullable(env.info.attributionMode.isSpeculative ?
                         argumentAttr.withLocalCacheContext() : null);
         boolean ctorProloguePrev = env.info.ctorPrologue;
-        env.info.ctorPrologue = false;
         try {
             // Local and anonymous classes have not been entered yet, so we need to
             // do it now.
@@ -995,7 +994,7 @@ public void visitMethodDef(JCMethodDecl tree) {
         Lint lint = env.info.lint.augment(m);
         Lint prevLint = chk.setLint(lint);
         boolean ctorProloguePrev = env.info.ctorPrologue;
-        env.info.ctorPrologue = false;
+        Assert.check(!env.info.ctorPrologue);
         MethodSymbol prevMethod = chk.setMethod(m);
         try {
             deferredLintHandler.flush(tree.pos(), lint);
@@ -4647,9 +4646,6 @@ Type checkIdInternal(JCTree tree,
                      Type pt,
                      Env<AttrContext> env,
                      ResultInfo resultInfo) {
-            if (pt.isErroneous()) {
-                return types.createErrorType(site);
-            }
             Type owntype; // The computed type of this identifier occurrence.
             switch (sym.kind) {
             case TYP:
@@ -4758,6 +4754,10 @@ else if (ownOuter.hasTag(CLASS) && site != ownOuter) {
                 chk.checkPreview(tree.pos(), env.info.scope.owner, sym);
             }
 
+            if (pt.isErroneous()) {
+                owntype = types.createErrorType(owntype);
+            }
+
             // If symbol is a variable, check that its type and
             // kind are compatible with the prototype and protokind.
             return check(tree, owntype, sym.kind.toSelector(), resultInfo);
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/CompileStates.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/CompileStates.java
index b044f956fdf..cbeedfcbade 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/CompileStates.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/CompileStates.java
@@ -60,8 +60,8 @@ public enum CompileState {
         FLOW(5),
         TRANSTYPES(6),
         TRANSPATTERNS(7),
-        UNLAMBDA(8),
-        LOWER(9),
+        LOWER(8),
+        UNLAMBDA(9),
         GENERATE(10);
 
         CompileState(int value) {
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java
index 7478ef1c907..926be3b6e26 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java
@@ -209,6 +209,7 @@ public Env<AttrContext> classEnv(JCClassDecl tree, Env<AttrContext> env) {
         localEnv.info.lint = null; // leave this to be filled in by Attr,
                                    // when annotations have been processed
         localEnv.info.isAnonymousDiamond = TreeInfo.isDiamond(env.tree);
+        localEnv.info.ctorPrologue = false;
         return localEnv;
     }
 
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
index 5b70a376f2a..66d499f54fe 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, 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
@@ -40,20 +40,15 @@
 import com.sun.tools.javac.code.Symbol.ClassSymbol;
 import com.sun.tools.javac.code.Symbol.DynamicMethodSymbol;
 import com.sun.tools.javac.code.Symbol.MethodSymbol;
-import com.sun.tools.javac.code.Symbol.TypeSymbol;
 import com.sun.tools.javac.code.Symbol.VarSymbol;
 import com.sun.tools.javac.code.Symtab;
 import com.sun.tools.javac.code.Type;
 import com.sun.tools.javac.code.Type.MethodType;
-import com.sun.tools.javac.code.Type.TypeVar;
 import com.sun.tools.javac.code.Types;
 import com.sun.tools.javac.comp.LambdaToMethod.LambdaAnalyzerPreprocessor.*;
-import com.sun.tools.javac.comp.Lower.BasicFreeVarCollector;
 import com.sun.tools.javac.resources.CompilerProperties.Notes;
-import com.sun.tools.javac.jvm.*;
 import com.sun.tools.javac.util.*;
 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
-import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
 
 import java.util.EnumMap;
 import java.util.HashMap;
@@ -72,7 +67,6 @@
 import static com.sun.tools.javac.tree.JCTree.Tag.*;
 
 import javax.lang.model.element.ElementKind;
-import javax.lang.model.type.TypeKind;
 
 import com.sun.tools.javac.main.Option;
 
@@ -126,9 +120,6 @@ public class LambdaToMethod extends TreeTranslator {
     /** deduplicate lambda implementation methods */
     private final boolean deduplicateLambdas;
 
-    /** lambda proxy is a dynamic nestmate */
-    private final boolean nestmateLambdas;
-
     /** Flag for alternate metafactories indicating the lambda object is intended to be serializable */
     public static final int FLAG_SERIALIZABLE = 1 << 0;
 
@@ -175,7 +166,6 @@ private LambdaToMethod(Context context) {
         debugLinesOrVars = lineDebugInfo || varDebugInfo;
         verboseDeduplication = options.isSet("debug.dumpLambdaToMethodDeduplication");
         deduplicateLambdas = options.getBoolean("deduplicateLambdas", true);
-        nestmateLambdas = Target.instance(context).runtimeUseNestAccess();
     }
     // </editor-fold>
 
@@ -284,6 +274,7 @@ public JCTree translateTopLevelClass(Env<AttrContext> env, JCTree cdef, TreeMake
         this.attrEnv = env;
         this.context = null;
         this.contextMap = new HashMap<>();
+        cdef = analyzer.analyzeAndPreprocessClass((JCClassDecl) cdef);
         return translate(cdef);
     }
     // </editor-fold>
@@ -297,10 +288,6 @@ public JCTree translateTopLevelClass(Env<AttrContext> env, JCTree cdef, TreeMake
      */
     @Override
     public void visitClassDef(JCClassDecl tree) {
-        if (tree.sym.owner.kind == PCK) {
-            //analyze class
-            tree = analyzer.analyzeAndPreprocessClass(tree);
-        }
         KlassInfo prevKlassInfo = kInfo;
         try {
             kInfo = new KlassInfo(tree);
@@ -418,9 +405,7 @@ public void visitLambda(JCLambda tree) {
 
         ListBuffer<JCExpression> syntheticInits = new ListBuffer<>();
 
-        if (localContext.methodReferenceReceiver != null) {
-            syntheticInits.append(localContext.methodReferenceReceiver);
-        } else if (!sym.isStatic()) {
+        if (!sym.isStatic()) {
             syntheticInits.append(makeThis(
                     sym.owner.enclClass().asType(),
                     localContext.owner.enclClass()));
@@ -433,11 +418,6 @@ public void visitLambda(JCLambda tree) {
                 syntheticInits.append(captured_local);
             }
         }
-        // add captured outer this instances (used only when `this' capture itself is illegal)
-        for (Symbol fv : localContext.getSymbolMap(CAPTURED_OUTER_THIS).keySet()) {
-            JCExpression captured_local = make.QualThis(fv.type);
-            syntheticInits.append(captured_local);
-        }
 
         //then, determine the arguments to the indy call
         List<JCExpression> indy_args = translate(syntheticInits.toList(), localContext.prev);
@@ -553,54 +533,6 @@ public void visitIdent(JCIdent tree) {
         }
     }
 
-    /**
-     * Translate qualified `this' references within a lambda to the mapped identifier
-     * @param tree
-     */
-    @Override
-    public void visitSelect(JCFieldAccess tree) {
-        if (context == null || !analyzer.lambdaFieldAccessFilter(tree)) {
-            super.visitSelect(tree);
-        } else {
-            int prevPos = make.pos;
-            try {
-                make.at(tree);
-
-                LambdaTranslationContext lambdaContext = (LambdaTranslationContext) context;
-                JCTree ltree = lambdaContext.translate(tree);
-                if (ltree != null) {
-                    result = ltree;
-                } else {
-                    super.visitSelect(tree);
-                }
-            } finally {
-                make.at(prevPos);
-            }
-        }
-    }
-
-    /**
-     * Translate instance creation expressions with implicit enclosing instances
-     * @param tree
-     */
-    @Override
-    public void visitNewClass(JCNewClass tree) {
-        if (context == null || !analyzer.lambdaNewClassFilter(context, tree)) {
-            super.visitNewClass(tree);
-        } else {
-            int prevPos = make.pos;
-            try {
-                make.at(tree);
-
-                LambdaTranslationContext lambdaContext = (LambdaTranslationContext) context;
-                tree = lambdaContext.translate(tree);
-                super.visitNewClass(tree);
-            } finally {
-                make.at(prevPos);
-            }
-        }
-    }
-
     @Override
     public void visitVarDef(JCVariableDecl tree) {
         LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context;
@@ -725,7 +657,7 @@ private JCMethodDecl makeDeserializeMethod(Symbol kSym) {
         deser.sym = kInfo.deserMethodSym;
         deser.type = kInfo.deserMethodSym.type;
         //System.err.printf("DESER: '%s'\n", deser);
-        return deser;
+        return lower.translateMethod(attrEnv, deser, make);
     }
 
     /** Make an attributed class instance creation expression.
@@ -857,245 +789,8 @@ private VarSymbol makeSyntheticVar(long flags, Name name, Type type, Symbol owne
         return new VarSymbol(flags | SYNTHETIC, name, type, owner);
     }
 
-    /**
-     * Set varargsElement field on a given tree (must be either a new class tree
-     * or a method call tree)
-     */
-    private void setVarargsIfNeeded(JCTree tree, Type varargsElement) {
-        if (varargsElement != null) {
-            switch (tree.getTag()) {
-                case APPLY: ((JCMethodInvocation)tree).varargsElement = varargsElement; break;
-                case NEWCLASS: ((JCNewClass)tree).varargsElement = varargsElement; break;
-                case TYPECAST: setVarargsIfNeeded(((JCTypeCast) tree).expr, varargsElement); break;
-                default: throw new AssertionError();
-            }
-        }
-    }
-
-    /**
-     * Convert method/constructor arguments by inserting appropriate cast
-     * as required by type-erasure - this is needed when bridging a lambda/method
-     * reference, as the bridged signature might require downcast to be compatible
-     * with the generated signature.
-     */
-    private List<JCExpression> convertArgs(Symbol meth, List<JCExpression> args, Type varargsElement) {
-       Assert.check(meth.kind == MTH);
-       List<Type> formals = types.erasure(meth.type).getParameterTypes();
-       if (varargsElement != null) {
-           Assert.check((meth.flags() & VARARGS) != 0);
-       }
-       return transTypes.translateArgs(args, formals, varargsElement, attrEnv);
-    }
-
     // </editor-fold>
 
-    /**
-     * Converts a method reference which cannot be used directly into a lambda
-     */
-    private class MemberReferenceToLambda {
-
-        private final JCMemberReference tree;
-        private final ReferenceTranslationContext localContext;
-        private final Symbol owner;
-        private final ListBuffer<JCExpression> args = new ListBuffer<>();
-        private final ListBuffer<JCVariableDecl> params = new ListBuffer<>();
-
-        private JCExpression receiverExpression = null;
-
-        MemberReferenceToLambda(JCMemberReference tree, ReferenceTranslationContext localContext, Symbol owner) {
-            this.tree = tree;
-            this.localContext = localContext;
-            this.owner = owner;
-        }
-
-        JCLambda lambda() {
-            int prevPos = make.pos;
-            try {
-                make.at(tree);
-
-                //body generation - this can be either a method call or a
-                //new instance creation expression, depending on the member reference kind
-                VarSymbol rcvr = addParametersReturnReceiver();
-                JCExpression expr = (tree.getMode() == ReferenceMode.INVOKE)
-                        ? expressionInvoke(rcvr)
-                        : expressionNew();
-
-                JCLambda slam = make.Lambda(params.toList(), expr);
-                slam.target = tree.target;
-                slam.type = tree.type;
-                slam.pos = tree.pos;
-                return slam;
-            } finally {
-                make.at(prevPos);
-            }
-        }
-
-        /**
-         * Generate the parameter list for the converted member reference.
-         *
-         * @return The receiver variable symbol, if any
-         */
-        VarSymbol addParametersReturnReceiver() {
-            Type samDesc = localContext.bridgedRefSig();
-            List<Type> samPTypes = samDesc.getParameterTypes();
-            List<Type> descPTypes = tree.getDescriptorType(types).getParameterTypes();
-
-            // Determine the receiver, if any
-            VarSymbol rcvr;
-            switch (tree.kind) {
-                case BOUND:
-                    // The receiver is explicit in the method reference
-                    rcvr = addParameter("rec$", tree.getQualifierExpression().type, false);
-                    receiverExpression = attr.makeNullCheck(tree.getQualifierExpression());
-                    break;
-                case UNBOUND:
-                    // The receiver is the first parameter, extract it and
-                    // adjust the SAM and unerased type lists accordingly
-                    rcvr = addParameter("rec$", samDesc.getParameterTypes().head, false);
-                    samPTypes = samPTypes.tail;
-                    descPTypes = descPTypes.tail;
-                    break;
-                default:
-                    rcvr = null;
-                    break;
-            }
-            List<Type> implPTypes = tree.sym.type.getParameterTypes();
-            int implSize = implPTypes.size();
-            int samSize = samPTypes.size();
-            // Last parameter to copy from referenced method, exclude final var args
-            int last = localContext.needsVarArgsConversion() ? implSize - 1 : implSize;
-
-            // Failsafe -- assure match-up
-            boolean checkForIntersection = tree.varargsElement != null || implSize == descPTypes.size();
-
-            // Use parameter types of the implementation method unless the unerased
-            // SAM parameter type is an intersection type, in that case use the
-            // erased SAM parameter type so that the supertype relationship
-            // the implementation method parameters is not obscured.
-            // Note: in this loop, the lists implPTypes, samPTypes, and descPTypes
-            // are used as pointers to the current parameter type information
-            // and are thus not usable afterwards.
-            for (int i = 0; implPTypes.nonEmpty() && i < last; ++i) {
-                // By default use the implementation method parameter type
-                Type parmType = implPTypes.head;
-                if (checkForIntersection) {
-                    if (descPTypes.head.getKind() == TypeKind.INTERSECTION) {
-                        parmType = samPTypes.head;
-                    }
-                    // If the unerased parameter type is a type variable whose
-                    // bound is an intersection (eg. <T extends A & B>) then
-                    // use the SAM parameter type
-                    if (descPTypes.head.getKind() == TypeKind.TYPEVAR) {
-                        TypeVar tv = (TypeVar) descPTypes.head;
-                        if (tv.getUpperBound().getKind() == TypeKind.INTERSECTION) {
-                            parmType = samPTypes.head;
-                        }
-                    }
-                }
-                addParameter("x$" + i, parmType, true);
-
-                // Advance to the next parameter
-                implPTypes = implPTypes.tail;
-                samPTypes = samPTypes.tail;
-                descPTypes = descPTypes.tail;
-            }
-            // Flatten out the var args
-            for (int i = last; i < samSize; ++i) {
-                addParameter("xva$" + i, tree.varargsElement, true);
-            }
-
-            return rcvr;
-        }
-
-        JCExpression getReceiverExpression() {
-            return receiverExpression;
-        }
-
-        private JCExpression makeReceiver(VarSymbol rcvr) {
-            if (rcvr == null) return null;
-            JCExpression rcvrExpr = make.Ident(rcvr);
-            boolean protAccess =
-                    isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, owner);
-            Type rcvrType = tree.ownerAccessible && !protAccess ? tree.sym.enclClass().type
-                                                                : tree.expr.type;
-            if (rcvrType == syms.arrayClass.type) {
-                // Map the receiver type to the actually type, not just "array"
-                rcvrType = tree.getQualifierExpression().type;
-            }
-            if (!rcvr.type.tsym.isSubClass(rcvrType.tsym, types)) {
-                rcvrExpr = make.TypeCast(make.Type(rcvrType), rcvrExpr).setType(rcvrType);
-            }
-            return rcvrExpr;
-        }
-
-        /**
-         * determine the receiver of the method call - the receiver can
-         * be a type qualifier, the synthetic receiver parameter or 'super'.
-         */
-        private JCExpression expressionInvoke(VarSymbol rcvr) {
-            JCExpression qualifier =
-                    (rcvr != null) ?
-                        makeReceiver(rcvr) :
-                        tree.getQualifierExpression();
-
-            //create the qualifier expression
-            JCFieldAccess select = make.Select(qualifier, tree.sym.name);
-            select.sym = tree.sym;
-            select.type = tree.sym.erasure(types);
-
-            //create the method call expression
-            JCExpression apply = make.Apply(List.nil(), select,
-                    convertArgs(tree.sym, args.toList(), tree.varargsElement)).
-                    setType(tree.sym.erasure(types).getReturnType());
-
-            apply = transTypes.coerce(attrEnv, apply,
-                    types.erasure(localContext.tree.referentType.getReturnType()));
-
-            setVarargsIfNeeded(apply, tree.varargsElement);
-            return apply;
-        }
-
-        /**
-         * Lambda body to use for a 'new'.
-         */
-        private JCExpression expressionNew() {
-            if (tree.kind == ReferenceKind.ARRAY_CTOR) {
-                //create the array creation expression
-                JCNewArray newArr = make.NewArray(
-                        make.Type(types.elemtype(tree.getQualifierExpression().type)),
-                        List.of(make.Ident(params.first())),
-                        null);
-                newArr.type = tree.getQualifierExpression().type;
-                return newArr;
-            } else {
-                //create the instance creation expression
-                //note that method reference syntax does not allow an explicit
-                //enclosing class (so the enclosing class is null)
-                // but this may need to be patched up later with the proxy for the outer this
-                JCNewClass newClass = make.NewClass(null,
-                        List.nil(),
-                        make.Type(tree.getQualifierExpression().type),
-                        convertArgs(tree.sym, args.toList(), tree.varargsElement),
-                        null);
-                newClass.constructor = tree.sym;
-                newClass.constructorType = tree.sym.erasure(types);
-                newClass.type = tree.getQualifierExpression().type;
-                setVarargsIfNeeded(newClass, tree.varargsElement);
-                return newClass;
-            }
-        }
-
-        private VarSymbol addParameter(String name, Type p, boolean genArg) {
-            VarSymbol vsym = new VarSymbol(PARAMETER | SYNTHETIC, names.fromString(name), p, owner);
-            vsym.pos = tree.pos;
-            params.append(make.VarDef(vsym, null));
-            if (genArg) {
-                args.append(make.Ident(vsym));
-            }
-            return vsym;
-        }
-    }
-
     private MethodType typeToMethodType(Type mt) {
         Type type = types.erasure(mt);
         return new MethodType(type.getParameterTypes(),
@@ -1238,11 +933,6 @@ class LambdaAnalyzerPreprocessor extends TreeTranslator {
          */
         private int lambdaCount = 0;
 
-        /**
-         * List of types undergoing construction via explicit constructor chaining.
-         */
-        private List<ClassSymbol> typesUnderConstruction;
-
         /**
          * keep the count of lambda expression defined in given context (used to
          * generate unambiguous names for serializable lambdas)
@@ -1273,35 +963,10 @@ int getIndex(StringBuilder buf) {
 
         private JCClassDecl analyzeAndPreprocessClass(JCClassDecl tree) {
             frameStack = List.nil();
-            typesUnderConstruction = List.nil();
             localClassDefs = new HashMap<>();
             return translate(tree);
         }
 
-        @Override
-        public void visitApply(JCMethodInvocation tree) {
-            List<ClassSymbol> previousNascentTypes = typesUnderConstruction;
-            try {
-                Name methName = TreeInfo.name(tree.meth);
-                if (methName == names._this || methName == names._super) {
-                    typesUnderConstruction = typesUnderConstruction.prepend(currentClass());
-                }
-                super.visitApply(tree);
-            } finally {
-                typesUnderConstruction = previousNascentTypes;
-            }
-        }
-            // where
-            private ClassSymbol currentClass() {
-                for (Frame frame : frameStack) {
-                    if (frame.tree.hasTag(JCTree.Tag.CLASSDEF)) {
-                        JCClassDecl cdef = (JCClassDecl) frame.tree;
-                        return cdef.sym;
-                    }
-                }
-                return null;
-            }
-
         @Override
         public void visitBlock(JCBlock tree) {
             List<Frame> prevStack = frameStack;
@@ -1334,21 +999,6 @@ public void visitClassDef(JCClassDecl tree) {
                 }
                 if (directlyEnclosingLambda() != null) {
                     tree.sym.owner = owner();
-                    if (tree.sym.hasOuterInstance()) {
-                        //if a class is defined within a lambda, the lambda must capture
-                        //its enclosing instance (if any)
-                        TranslationContext<?> localContext = context();
-                        final TypeSymbol outerInstanceSymbol = tree.sym.type.getEnclosingType().tsym;
-                        while (localContext != null && !localContext.owner.isStatic()) {
-                            if (localContext.tree.hasTag(LAMBDA)) {
-                                JCTree block = capturedDecl(localContext.depth, outerInstanceSymbol);
-                                if (block == null) break;
-                                ((LambdaTranslationContext)localContext)
-                                        .addSymbol(outerInstanceSymbol, CAPTURED_THIS);
-                            }
-                            localContext = localContext.prev;
-                        }
-                    }
                 }
                 frameStack = frameStack.prepend(new Frame(tree));
                 super.visitClassDef(tree);
@@ -1403,16 +1053,7 @@ public void visitIdent(JCIdent tree) {
 
         @Override
         public void visitLambda(JCLambda tree) {
-            analyzeLambda(tree, "lambda.stat");
-        }
-
-        private void analyzeLambda(JCLambda tree, JCExpression methodReferenceReceiver) {
-            // Translation of the receiver expression must occur first
-            JCExpression rcvr = translate(methodReferenceReceiver);
-            LambdaTranslationContext context = analyzeLambda(tree, "mref.stat.1");
-            if (rcvr != null) {
-                context.methodReferenceReceiver = rcvr;
-            }
+            analyzeLambda(tree, tree.wasMethodReference ? "mref.stat.1" : "lambda.stat");
         }
 
         private LambdaTranslationContext analyzeLambda(JCLambda tree, String statKey) {
@@ -1449,74 +1090,6 @@ public void visitMethodDef(JCMethodDecl tree) {
             }
         }
 
-        @Override
-        public void visitNewClass(JCNewClass tree) {
-            TypeSymbol def = tree.type.tsym;
-            boolean inReferencedClass = currentlyInClass(def);
-            boolean isLocal = def.isDirectlyOrIndirectlyLocal();
-            if ((inReferencedClass && isLocal || lambdaNewClassFilter(context(), tree))) {
-                TranslationContext<?> localContext = context();
-                final TypeSymbol outerInstanceSymbol = tree.type.getEnclosingType().tsym;
-                while (localContext != null  && !localContext.owner.isStatic()) {
-                    if (localContext.tree.hasTag(LAMBDA)) {
-                        if (outerInstanceSymbol != null) {
-                            JCTree block = capturedDecl(localContext.depth, outerInstanceSymbol);
-                            if (block == null) break;
-                        }
-                        ((LambdaTranslationContext)localContext)
-                                .addSymbol(outerInstanceSymbol, CAPTURED_THIS);
-                    }
-                    localContext = localContext.prev;
-                }
-            }
-            super.visitNewClass(tree);
-            if (context() != null && !inReferencedClass && isLocal) {
-                LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context();
-                captureLocalClassDefs(def, lambdaContext);
-            }
-        }
-        //where
-            void captureLocalClassDefs(Symbol csym, final LambdaTranslationContext lambdaContext) {
-                JCClassDecl localCDef = localClassDefs.get(csym);
-                if (localCDef != null && lambdaContext.freeVarProcessedLocalClasses.add(csym)) {
-                    BasicFreeVarCollector fvc = lower.new BasicFreeVarCollector() {
-                        @Override
-                        void addFreeVars(ClassSymbol c) {
-                            captureLocalClassDefs(c, lambdaContext);
-                        }
-                        @Override
-                        void visitSymbol(Symbol sym) {
-                            if (sym.kind == VAR &&
-                                    sym.owner.kind == MTH &&
-                                    ((VarSymbol)sym).getConstValue() == null) {
-                                TranslationContext<?> localContext = context();
-                                while (localContext != null) {
-                                    if (localContext.tree.getTag() == LAMBDA) {
-                                        JCTree block = capturedDecl(localContext.depth, sym);
-                                        if (block == null) break;
-                                        ((LambdaTranslationContext)localContext).addSymbol(sym, CAPTURED_VAR);
-                                    }
-                                    localContext = localContext.prev;
-                                }
-                            }
-                        }
-                    };
-                    fvc.scan(localCDef);
-                }
-        }
-        //where
-        boolean currentlyInClass(Symbol csym) {
-            for (Frame frame : frameStack) {
-                if (frame.tree.hasTag(JCTree.Tag.CLASSDEF)) {
-                    JCClassDecl cdef = (JCClassDecl) frame.tree;
-                    if (cdef.sym == csym) {
-                        return true;
-                    }
-                }
-            }
-            return false;
-        }
-
         /**
          * Method references to local class constructors, may, if the local
          * class references local variables, have implicit constructor
@@ -1533,15 +1106,9 @@ boolean currentlyInClass(Symbol csym) {
         public void visitReference(JCMemberReference tree) {
             ReferenceTranslationContext rcontext = new ReferenceTranslationContext(tree);
             contextMap.put(tree, rcontext);
-            if (rcontext.needsConversionToLambda()) {
-                 // Convert to a lambda, and process as such
-                MemberReferenceToLambda conv = new MemberReferenceToLambda(tree, rcontext, owner());
-                analyzeLambda(conv.lambda(), conv.getReceiverExpression());
-            } else {
-                super.visitReference(tree);
-                if (dumpLambdaToMethodStats) {
-                    log.note(tree, Notes.MrefStat(rcontext.needsAltMetafactory(), null));
-                }
+            super.visitReference(tree);
+            if (dumpLambdaToMethodStats) {
+                log.note(tree, Notes.MrefStat(rcontext.needsAltMetafactory(), null));
             }
         }
 
@@ -1775,42 +1342,6 @@ private boolean lambdaIdentSymbolFilter(Symbol sym) {
                     && sym.name != names.init;
         }
 
-        /**
-         *  This is used to filter out those select nodes that need to be adjusted
-         *  when translating away lambda expressions - at the moment, this is the
-         *  set of nodes that select `this' (qualified this)
-         */
-        private boolean lambdaFieldAccessFilter(JCFieldAccess fAccess) {
-            return (context instanceof LambdaTranslationContext lambdaContext)
-                    && !fAccess.sym.isStatic()
-                    && fAccess.name == names._this
-                    && (fAccess.sym.owner.kind == TYP)
-                    && !lambdaContext.translatedSymbols.get(CAPTURED_OUTER_THIS).isEmpty();
-        }
-
-        /**
-         * This is used to filter out those new class expressions that need to
-         * be qualified with an enclosing tree
-         */
-        private boolean lambdaNewClassFilter(TranslationContext<?> context, JCNewClass tree) {
-            if (context != null
-                    && tree.encl == null
-                    && tree.def == null
-                    && !tree.type.getEnclosingType().hasTag(NONE)) {
-                Type encl = tree.type.getEnclosingType();
-                Type current = context.owner.enclClass().type;
-                while (!current.hasTag(NONE)) {
-                    if (current.tsym.isSubClass(encl.tsym, types)) {
-                        return true;
-                    }
-                    current = current.getEnclosingType();
-                }
-                return false;
-            } else {
-                return false;
-            }
-        }
-
         private class Frame {
             final JCTree tree;
             List<Symbol> locals;
@@ -1920,18 +1451,6 @@ class LambdaTranslationContext extends TranslationContext<JCLambda> {
 
             List<JCVariableDecl> syntheticParams;
 
-            /**
-             * to prevent recursion, track local classes processed
-             */
-            final Set<Symbol> freeVarProcessedLocalClasses;
-
-            /**
-             * For method references converted to lambdas.  The method
-             * reference receiver expression. Must be treated like a captured
-             * variable.
-             */
-            JCExpression methodReferenceReceiver;
-
             LambdaTranslationContext(JCLambda tree) {
                 super(tree);
                 Frame frame = frameStack.head;
@@ -1962,13 +1481,10 @@ public MethodSymbol originalEnclosingMethod() {
                 }
                 translatedSymbols = new EnumMap<>(LambdaSymbolKind.class);
 
-                translatedSymbols.put(PARAM, new LinkedHashMap<Symbol, Symbol>());
-                translatedSymbols.put(LOCAL_VAR, new LinkedHashMap<Symbol, Symbol>());
-                translatedSymbols.put(CAPTURED_VAR, new LinkedHashMap<Symbol, Symbol>());
-                translatedSymbols.put(CAPTURED_THIS, new LinkedHashMap<Symbol, Symbol>());
-                translatedSymbols.put(CAPTURED_OUTER_THIS, new LinkedHashMap<Symbol, Symbol>());
-
-                freeVarProcessedLocalClasses = new HashSet<>();
+                translatedSymbols.put(PARAM, new LinkedHashMap<>());
+                translatedSymbols.put(LOCAL_VAR, new LinkedHashMap<>());
+                translatedSymbols.put(CAPTURED_VAR, new LinkedHashMap<>());
+                translatedSymbols.put(CAPTURED_THIS, new LinkedHashMap<>());
             }
 
              /**
@@ -2068,16 +1584,6 @@ public Symbol baseSymbol() {
                             }
                         };
                         break;
-                    case CAPTURED_OUTER_THIS:
-                        Name name = names.fromString(sym.flatName().toString().replace('.', '$') + names.dollarThis);
-                        ret = new VarSymbol(SYNTHETIC | FINAL | PARAMETER, name, types.erasure(sym.type), translatedSym) {
-                            @Override
-                            public Symbol baseSymbol() {
-                                //keep mapping with original captured symbol
-                                return sym;
-                            }
-                        };
-                        break;
                     case LOCAL_VAR:
                         ret = new VarSymbol(sym.flags() & FINAL, sym.name, sym.type, translatedSym) {
                             @Override
@@ -2116,14 +1622,6 @@ public Symbol baseSymbol() {
             }
 
             void addSymbol(Symbol sym, LambdaSymbolKind skind) {
-                if (skind == CAPTURED_THIS && sym != null && sym.kind == TYP && !typesUnderConstruction.isEmpty()) {
-                    ClassSymbol currentClass = currentClass();
-                    if (currentClass != null && typesUnderConstruction.contains(currentClass)) {
-                        // reference must be to enclosing outer instance, mutate capture kind.
-                        Assert.check(sym != currentClass); // should have been caught right in Attr
-                        skind = CAPTURED_OUTER_THIS;
-                    }
-                }
                 Map<Symbol, Symbol> transMap = getSymbolMap(skind);
                 if (!transMap.containsKey(sym)) {
                     transMap.put(sym, translate(sym, skind));
@@ -2147,54 +1645,11 @@ JCTree translate(JCIdent lambdaIdent) {
                                 return t;
                             }
                             break;
-                        case CAPTURED_OUTER_THIS:
-                            Optional<Symbol> proxy = m.keySet().stream()
-                                    .filter(out -> lambdaIdent.sym.isMemberOf(out.type.tsym, types))
-                                    .reduce((a, b) -> a.isEnclosedBy((ClassSymbol)b) ? a : b);
-                            if (proxy.isPresent()) {
-                                // Transform outer instance variable references anchoring them to the captured synthetic.
-                                Symbol tSym = m.get(proxy.get());
-                                JCExpression t = make.Ident(tSym).setType(lambdaIdent.sym.owner.type);
-                                t = make.Select(t, lambdaIdent.name);
-                                t.setType(lambdaIdent.type);
-                                TreeInfo.setSymbol(t, lambdaIdent.sym);
-                                return t;
-                            }
-                            break;
                     }
                 }
                 return null;
             }
 
-            /* Translate away qualified this expressions, anchoring them to synthetic parameters that
-               capture the qualified this handle. `fieldAccess' is guaranteed to one such.
-            */
-            public JCTree translate(JCFieldAccess fieldAccess) {
-                Assert.check(fieldAccess.name == names._this);
-                Map<Symbol, Symbol> m = translatedSymbols.get(LambdaSymbolKind.CAPTURED_OUTER_THIS);
-                if (m.containsKey(fieldAccess.sym.owner)) {
-                    Symbol tSym = m.get(fieldAccess.sym.owner);
-                    JCExpression t = make.Ident(tSym).setType(fieldAccess.sym.owner.type);
-                    return t;
-                }
-                return null;
-            }
-
-            /* Translate away naked new instance creation expressions with implicit enclosing instances,
-               anchoring them to synthetic parameters that stand proxy for the qualified outer this handle.
-            */
-            public JCNewClass translate(JCNewClass newClass) {
-                Assert.check(newClass.clazz.type.tsym.hasOuterInstance() && newClass.encl == null);
-                Map<Symbol, Symbol> m = translatedSymbols.get(LambdaSymbolKind.CAPTURED_OUTER_THIS);
-                final Type enclosingType = newClass.clazz.type.getEnclosingType();
-                if (m.containsKey(enclosingType.tsym)) {
-                      Symbol tSym = m.get(enclosingType.tsym);
-                      JCExpression encl = make.Ident(tSym).setType(enclosingType);
-                      newClass.encl = encl;
-                }
-                return newClass;
-            }
-
             /**
              * The translatedSym is not complete/accurate until the analysis is
              * finished.  Once the analysis is finished, the translatedSym is
@@ -2232,10 +1687,6 @@ void complete() {
                     params.append(make.VarDef((VarSymbol) thisSym, null));
                     parameterSymbols.append((VarSymbol) thisSym);
                 }
-                for (Symbol thisSym : getSymbolMap(CAPTURED_OUTER_THIS).values()) {
-                    params.append(make.VarDef((VarSymbol) thisSym, null));
-                    parameterSymbols.append((VarSymbol) thisSym);
-                }
                 for (Symbol thisSym : getSymbolMap(PARAM).values()) {
                     params.append(make.VarDef((VarSymbol) thisSym, null));
                     parameterSymbols.append((VarSymbol) thisSym);
@@ -2261,102 +1712,12 @@ Type generatedLambdaSig() {
         }
 
         /**
-         * This class retains all the useful information about a method reference;
-         * the contents of this class are filled by the LambdaAnalyzer visitor,
-         * and the used by the main translation routines in order to adjust method
-         * references (i.e. in case a bridge is needed)
+         * Simple subclass modelling the translation context of a method reference.
          */
         final class ReferenceTranslationContext extends TranslationContext<JCMemberReference> {
 
-            final boolean isSuper;
-
             ReferenceTranslationContext(JCMemberReference tree) {
                 super(tree);
-                this.isSuper = tree.hasKind(ReferenceKind.SUPER);
-            }
-
-            boolean needsVarArgsConversion() {
-                return tree.varargsElement != null;
-            }
-
-            /**
-             * @return Is this an array operation like clone()
-             */
-            boolean isArrayOp() {
-                return tree.sym.owner == syms.arrayClass;
-            }
-
-            boolean receiverAccessible() {
-                //hack needed to workaround 292 bug (7087658)
-                //when 292 issue is fixed we should remove this and change the backend
-                //code to always generate a method handle to an accessible method
-                return tree.ownerAccessible;
-            }
-
-            /**
-             * This method should be called only when target release <= 14
-             * where LambdaMetaFactory does not spin nestmate classes.
-             *
-             * This method should be removed when --release 14 is not supported.
-             */
-            boolean isPrivateInOtherClass() {
-                assert !nestmateLambdas;
-                return  (tree.sym.flags() & PRIVATE) != 0 &&
-                        !types.isSameType(
-                              types.erasure(tree.sym.enclClass().asType()),
-                              types.erasure(owner.enclClass().asType()));
-            }
-
-            /**
-             * Erasure destroys the implementation parameter subtype
-             * relationship for intersection types.
-             * Have similar problems for union types too.
-             */
-            boolean interfaceParameterIsIntersectionOrUnionType() {
-                List<Type> tl = tree.getDescriptorType(types).getParameterTypes();
-                for (; tl.nonEmpty(); tl = tl.tail) {
-                    Type pt = tl.head;
-                    if (isIntersectionOrUnionType(pt))
-                        return true;
-                }
-                return false;
-            }
-
-            boolean isIntersectionOrUnionType(Type t) {
-                switch (t.getKind()) {
-                    case INTERSECTION:
-                    case UNION:
-                        return true;
-                    case TYPEVAR:
-                        TypeVar tv = (TypeVar) t;
-                        return isIntersectionOrUnionType(tv.getUpperBound());
-                }
-                return false;
-            }
-
-            /**
-             * Does this reference need to be converted to a lambda
-             * (i.e. var args need to be expanded or "super" is used)
-             */
-            final boolean needsConversionToLambda() {
-                return interfaceParameterIsIntersectionOrUnionType() ||
-                        isSuper ||
-                        needsVarArgsConversion() ||
-                        isArrayOp() ||
-                        (!nestmateLambdas && isPrivateInOtherClass()) ||
-                        isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, owner) ||
-                        !receiverAccessible() ||
-                        (tree.getMode() == ReferenceMode.NEW &&
-                          tree.kind != ReferenceKind.ARRAY_CTOR &&
-                          (tree.sym.owner.isDirectlyOrIndirectlyLocal() || tree.sym.owner.isInner()));
-            }
-
-            Type generatedRefSig() {
-                return types.erasure(tree.sym.type);
-            }
-
-            Type bridgedRefSig() {
-                return types.erasure(types.findDescriptorSymbol(tree.target.tsym).type);
             }
         }
     }
@@ -2370,14 +1731,12 @@ enum LambdaSymbolKind {
         PARAM,          // original to translated lambda parameters
         LOCAL_VAR,      // original to translated lambda locals
         CAPTURED_VAR,   // variables in enclosing scope to translated synthetic parameters
-        CAPTURED_THIS,  // class symbols to translated synthetic parameters (for captured member access)
-        CAPTURED_OUTER_THIS; // used when `this' capture is illegal, but outer this capture is legit (JDK-8129740)
+        CAPTURED_THIS;  // class symbols to translated synthetic parameters (for captured member access)
 
         boolean propagateAnnotations() {
             switch (this) {
                 case CAPTURED_VAR:
                 case CAPTURED_THIS:
-                case CAPTURED_OUTER_THIS:
                     return false;
                 default:
                     return true;
@@ -2419,12 +1778,6 @@ private String classSig(Type type) {
         }
     }
 
-    private boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage(Symbol targetReference,
-                                                                          Symbol currentClass) {
-        return ((targetReference.flags() & PROTECTED) != 0 &&
-                targetReference.packge() != currentClass.packge());
-    }
-
     /**
      * Signature Generation
      */
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
index da0e3f9c747..7ab38e86366 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
@@ -28,6 +28,8 @@
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.sun.source.tree.LambdaExpressionTree.BodyKind;
+import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
 import com.sun.tools.javac.code.*;
 import com.sun.tools.javac.code.Kinds.KindSelector;
 import com.sun.tools.javac.code.Scope.WriteableScope;
@@ -35,7 +37,9 @@
 import com.sun.tools.javac.jvm.PoolConstant.LoadableConstant;
 import com.sun.tools.javac.main.Option.PkgInfo;
 import com.sun.tools.javac.resources.CompilerProperties.Fragments;
+import com.sun.tools.javac.resources.CompilerProperties.Notes;
 import com.sun.tools.javac.tree.*;
+import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind;
 import com.sun.tools.javac.util.*;
 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
 import com.sun.tools.javac.util.List;
@@ -62,6 +66,9 @@
 import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
 import static com.sun.tools.javac.tree.JCTree.JCOperatorExpression.OperandPos.LEFT;
 import com.sun.tools.javac.tree.JCTree.JCSwitchExpression;
+
+import javax.lang.model.type.TypeKind;
+
 import static com.sun.tools.javac.tree.JCTree.Tag.*;
 
 /** This pass translates away some syntactic sugar: inner classes,
@@ -103,6 +110,7 @@ public static Lower instance(Context context) {
     private final boolean optimizeOuterThis;
     private final boolean useMatchException;
     private final HashMap<TypePairs, String> typePairToName;
+    private int variableIndex = 0;
 
     @SuppressWarnings("this-escape")
     protected Lower(Context context) {
@@ -170,6 +178,11 @@ protected Lower(Context context) {
      */
     Map<Symbol,Symbol> actualSymbols;
 
+    /**
+     * The current expected return type.
+     */
+    Type currentRestype;
+
     /** The current method definition.
      */
     JCMethodDecl currentMethodDef;
@@ -186,12 +199,6 @@ protected Lower(Context context) {
      */
     JCTree outermostMemberDef;
 
-    /** A map from local variable symbols to their translation (as per LambdaToMethod).
-     * This is required when a capturing local class is created from a lambda (in which
-     * case the captured symbols should be replaced with the translated lambda symbols).
-     */
-    Map<Symbol, Symbol> lambdaTranslationMap = null;
-
     /** A navigator class for assembling a mapping from local class symbols
      *  to class definition trees.
      *  There is only one case; all other cases simply traverse down the tree.
@@ -1233,14 +1240,10 @@ JCExpression access(Symbol sym, JCExpression tree, JCExpression enclOp, boolean
                 make.at(tree.pos);
                 return makeLit(sym.type, cv);
             }
-            if (lambdaTranslationMap != null && lambdaTranslationMap.get(sym) != null) {
-                return make.at(tree.pos).Ident(lambdaTranslationMap.get(sym));
-            } else {
-                // Otherwise replace the variable by its proxy.
-                sym = proxies.get(sym);
-                Assert.check(sym != null && (sym.flags_field & FINAL) != 0);
-                tree = make.at(tree.pos).Ident(sym);
-            }
+            // Otherwise replace the variable by its proxy.
+            sym = proxies.get(sym);
+            Assert.check(sym != null && (sym.flags_field & FINAL) != 0);
+            tree = make.at(tree.pos).Ident(sym);
         }
         JCExpression base = (tree.hasTag(SELECT)) ? ((JCFieldAccess) tree).selected : null;
         switch (sym.kind) {
@@ -1325,14 +1328,6 @@ JCExpression access(Symbol sym, JCExpression tree, JCExpression enclOp, boolean
                             accessBase(tree.pos(), sym), sym).setType(tree.type);
                     }
                 }
-            } else if (sym.owner.kind == MTH && lambdaTranslationMap != null) {
-                //sym is a local variable - check the lambda translation map to
-                //see if sym has been translated to something else in the current
-                //scope (by LambdaToMethod)
-                Symbol translatedSym = lambdaTranslationMap.get(sym.baseSymbol());
-                if (translatedSym != null) {
-                    tree = make.at(tree.pos).Ident(translatedSym);
-                }
             }
         }
         return tree;
@@ -2779,15 +2774,21 @@ public void visitMethodDef(JCMethodDecl tree) {
                 syms.methodClass);
         }
 
+        Type prevRestype = currentRestype;
         JCMethodDecl prevMethodDef = currentMethodDef;
         MethodSymbol prevMethodSym = currentMethodSym;
+        int prevVariableIndex = variableIndex;
         try {
+            currentRestype = types.erasure(tree.type.getReturnType());
             currentMethodDef = tree;
             currentMethodSym = tree.sym;
+            variableIndex = 0;
             visitMethodDefInternal(tree);
         } finally {
+            currentRestype = prevRestype;
             currentMethodDef = prevMethodDef;
             currentMethodSym = prevMethodSym;
+            variableIndex = prevVariableIndex;
         }
     }
 
@@ -2866,16 +2867,7 @@ private void visitMethodDefInternal(JCMethodDecl tree) {
 
             outerThisStack = prevOuterThisStack;
         } else {
-            Map<Symbol, Symbol> prevLambdaTranslationMap =
-                    lambdaTranslationMap;
-            try {
-                lambdaTranslationMap = (tree.sym.flags() & SYNTHETIC) != 0 &&
-                        tree.sym.name.startsWith(names.lambda) ?
-                        makeTranslationMap(tree) : null;
-                super.visitMethodDef(tree);
-            } finally {
-                lambdaTranslationMap = prevLambdaTranslationMap;
-            }
+            super.visitMethodDef(tree);
         }
         if (tree.name == names.init && ((tree.sym.flags_field & Flags.COMPACT_RECORD_CONSTRUCTOR) != 0 ||
                 (tree.sym.flags_field & (GENERATEDCONSTR | RECORD)) == (GENERATEDCONSTR | RECORD))) {
@@ -2901,17 +2893,6 @@ private void visitMethodDefInternal(JCMethodDecl tree) {
         }
         result = tree;
     }
-    //where
-        private Map<Symbol, Symbol> makeTranslationMap(JCMethodDecl tree) {
-            Map<Symbol, Symbol> translationMap = new HashMap<>();
-            for (JCVariableDecl vd : tree.params) {
-                Symbol p = vd.sym;
-                if (p != p.baseSymbol()) {
-                    translationMap.put(p.baseSymbol(), p);
-                }
-            }
-            return translationMap;
-        }
 
     public void visitTypeCast(JCTypeCast tree) {
         tree.clazz = translate(tree.clazz);
@@ -2973,7 +2954,7 @@ public void visitTypeTest(JCInstanceOf tree) {
 
             // preserving the side effects of the value
             VarSymbol dollar_s = new VarSymbol(FINAL | SYNTHETIC,
-                    names.fromString("tmp" + tree.pos + this.target.syntheticNameChar()),
+                    names.fromString("tmp" + variableIndex++ + this.target.syntheticNameChar()),
                     types.erasure(tree.expr.type),
                     currentMethodSym);
             JCStatement var = make.at(tree.pos())
@@ -3132,13 +3113,7 @@ public void visitNewClass(JCNewClass tree) {
         // If we have an anonymous class, create its flat version, rather
         // than the class or interface following new.
         if (tree.def != null) {
-            Map<Symbol, Symbol> prevLambdaTranslationMap = lambdaTranslationMap;
-            try {
-                lambdaTranslationMap = null;
-                translate(tree.def);
-            } finally {
-                lambdaTranslationMap = prevLambdaTranslationMap;
-            }
+            translate(tree.def);
 
             tree.clazz = access(make_at(tree.clazz.pos()).Ident(tree.def.sym));
             tree.def = null;
@@ -3358,6 +3333,9 @@ public void visitApply(JCMethodInvocation tree) {
                 return;
             }
         }
+        if (tree.args.stream().anyMatch(c -> c == null)) {
+            throw new AssertionError("Whooops before: " + tree);
+        }
         result = tree;
     }
 
@@ -3845,6 +3823,7 @@ private void visitIterableForeachLoop(JCEnhancedForLoop tree) {
 
     public void visitVarDef(JCVariableDecl tree) {
         MethodSymbol oldMethodSym = currentMethodSym;
+        int prevVariableIndex = variableIndex;
         tree.mods = translate(tree.mods);
         tree.vartype = translate(tree.vartype);
         if (currentMethodSym == null) {
@@ -3854,9 +3833,13 @@ public void visitVarDef(JCVariableDecl tree) {
                                  names.empty, null,
                                  currentClass);
         }
-        if (tree.init != null) tree.init = translate(tree.init, tree.type);
-        result = tree;
-        currentMethodSym = oldMethodSym;
+        try {
+            if (tree.init != null) tree.init = translate(tree.init, tree.type);
+            result = tree;
+        } finally {
+            currentMethodSym = oldMethodSym;
+            variableIndex = prevVariableIndex;
+        }
     }
 
     public void visitBlock(JCBlock tree) {
@@ -3868,8 +3851,14 @@ public void visitBlock(JCBlock tree) {
                                  names.empty, null,
                                  currentClass);
         }
-        super.visitBlock(tree);
-        currentMethodSym = oldMethodSym;
+        int prevVariableIndex = variableIndex;
+        try {
+            variableIndex = 0;
+            super.visitBlock(tree);
+        } finally {
+            currentMethodSym = oldMethodSym;
+            variableIndex = prevVariableIndex;
+        }
     }
 
     public void visitDoLoop(JCDoWhileLoop tree) {
@@ -3896,11 +3885,355 @@ public void visitForLoop(JCForLoop tree) {
     public void visitReturn(JCReturn tree) {
         if (tree.expr != null)
             tree.expr = translate(tree.expr,
-                                  types.erasure(currentMethodDef
-                                                .restype.type));
+                                  currentRestype);
         result = tree;
     }
 
+    @Override
+    public void visitLambda(JCLambda tree) {
+        Type prevRestype = currentRestype;
+        try {
+            currentRestype = types.erasure(tree.getDescriptorType(types)).getReturnType();
+            tree.body = tree.getBodyKind() == BodyKind.EXPRESSION ?
+                    translate((JCExpression) tree.body, currentRestype) :
+                    translate(tree.body);
+        } finally {
+            currentRestype = prevRestype;
+        }
+        result = tree;
+    }
+
+    @Override
+    public void visitReference(JCMemberReference tree) {
+        if (needsConversionToLambda(tree)) {
+            // Convert to a lambda, and process as such
+            MemberReferenceToLambda conv = new MemberReferenceToLambda(tree);
+            result = translate(conv.lambda());
+        } else {
+            super.visitReference(tree);
+        }
+    }
+    // where
+        boolean needsVarArgsConversion(JCMemberReference tree) {
+            return tree.varargsElement != null;
+        }
+
+        /**
+         * @return Is this an array operation like clone()
+         */
+        boolean isArrayOp(JCMemberReference tree) {
+            return tree.sym.owner == syms.arrayClass;
+        }
+
+        boolean receiverAccessible(JCMemberReference tree) {
+            //hack needed to workaround 292 bug (7087658)
+            //when 292 issue is fixed we should remove this and change the backend
+            //code to always generate a method handle to an accessible method
+            return tree.ownerAccessible;
+        }
+
+        /**
+         * Erasure destroys the implementation parameter subtype
+         * relationship for intersection types.
+         * Have similar problems for union types too.
+         */
+        boolean interfaceParameterIsIntersectionOrUnionType(JCMemberReference tree) {
+            List<Type> tl = tree.getDescriptorType(types).getParameterTypes();
+            for (; tl.nonEmpty(); tl = tl.tail) {
+                Type pt = tl.head;
+                if (isIntersectionOrUnionType(pt))
+                    return true;
+            }
+            return false;
+        }
+
+        boolean isIntersectionOrUnionType(Type t) {
+            switch (t.getKind()) {
+                case INTERSECTION:
+                case UNION:
+                    return true;
+                case TYPEVAR:
+                    TypeVar tv = (TypeVar) t;
+                    return isIntersectionOrUnionType(tv.getUpperBound());
+            }
+            return false;
+        }
+
+        private boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage(Symbol targetReference,
+                                                                              Symbol currentClass) {
+            return ((targetReference.flags() & PROTECTED) != 0 &&
+                    targetReference.packge() != currentClass.packge());
+        }
+
+        /**
+         * This method should be called only when target release <= 14
+         * where LambdaMetaFactory does not spin nestmate classes.
+         *
+         * This method should be removed when --release 14 is not supported.
+         */
+        boolean isPrivateInOtherClass(JCMemberReference tree) {
+            assert !target.runtimeUseNestAccess();
+            return  (tree.sym.flags() & PRIVATE) != 0 &&
+                    !types.isSameType(
+                            types.erasure(tree.sym.enclClass().asType()),
+                            types.erasure(currentClass.asType()));
+        }
+
+        /**
+         * Does this reference need to be converted to a lambda
+         * (i.e. var args need to be expanded or "super" is used)
+         */
+        boolean needsConversionToLambda(JCMemberReference tree) {
+            return interfaceParameterIsIntersectionOrUnionType(tree) ||
+                    tree.hasKind(ReferenceKind.SUPER) ||
+                    needsVarArgsConversion(tree) ||
+                    isArrayOp(tree) ||
+                    (!target.runtimeUseNestAccess() && isPrivateInOtherClass(tree)) ||
+                    isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, currentClass) ||
+                    !receiverAccessible(tree) ||
+                    (tree.getMode() == ReferenceMode.NEW &&
+                            tree.kind != ReferenceKind.ARRAY_CTOR &&
+                            (tree.sym.owner.isDirectlyOrIndirectlyLocal() || tree.sym.owner.isInner()));
+        }
+
+    /**
+     * Converts a method reference which cannot be used directly into a lambda
+     */
+    private class MemberReferenceToLambda {
+
+        private final JCMemberReference tree;
+        private final ListBuffer<JCExpression> args = new ListBuffer<>();
+        private final ListBuffer<JCVariableDecl> params = new ListBuffer<>();
+        private final MethodSymbol owner = new MethodSymbol(0, names.empty, Type.noType, currentClass);
+
+        private JCExpression receiverExpression = null;
+
+        MemberReferenceToLambda(JCMemberReference tree) {
+            this.tree = tree;
+        }
+
+        JCExpression lambda() {
+            int prevPos = make.pos;
+            try {
+                make.at(tree);
+
+                //body generation - this can be either a method call or a
+                //new instance creation expression, depending on the member reference kind
+                VarSymbol rcvr = addParametersReturnReceiver();
+                JCExpression expr = (tree.getMode() == ReferenceMode.INVOKE)
+                        ? expressionInvoke(rcvr)
+                        : expressionNew();
+
+                JCLambda slam = make.Lambda(params.toList(), expr);
+                slam.target = tree.target;
+                slam.type = tree.type;
+                slam.pos = tree.pos;
+                slam.wasMethodReference = true;
+                if (receiverExpression != null) {
+                    // use a let expression so that the receiver expression is evaluated eagerly
+                    return make.at(tree.pos).LetExpr(
+                            make.VarDef(rcvr, translate(receiverExpression)), slam).setType(tree.type);
+                } else {
+                    return slam;
+                }
+            } finally {
+                make.at(prevPos);
+            }
+        }
+
+        /**
+         * Generate the parameter list for the converted member reference.
+         *
+         * @return The receiver variable symbol, if any
+         */
+        VarSymbol addParametersReturnReceiver() {
+            Type samDesc = types.erasure(types.findDescriptorSymbol(tree.target.tsym).type);
+            List<Type> samPTypes = samDesc.getParameterTypes();
+            List<Type> descPTypes = tree.getDescriptorType(types).getParameterTypes();
+
+            // Determine the receiver, if any
+            VarSymbol rcvr;
+            switch (tree.kind) {
+                case BOUND:
+                    // The receiver is explicit in the method reference
+                    rcvr = new VarSymbol(SYNTHETIC, names.fromString("rec$"), tree.getQualifierExpression().type, owner);
+                    rcvr.pos = tree.pos;
+                    receiverExpression = attr.makeNullCheck(tree.getQualifierExpression());
+                    break;
+                case UNBOUND:
+                    // The receiver is the first parameter, extract it and
+                    // adjust the SAM and unerased type lists accordingly
+                    rcvr = addParameter("rec$", samDesc.getParameterTypes().head, false);
+                    samPTypes = samPTypes.tail;
+                    descPTypes = descPTypes.tail;
+                    break;
+                default:
+                    rcvr = null;
+                    break;
+            }
+            List<Type> implPTypes = tree.sym.type.getParameterTypes();
+            int implSize = implPTypes.size();
+            int samSize = samPTypes.size();
+            // Last parameter to copy from referenced method, exclude final var args
+            int last = needsVarArgsConversion(tree) ? implSize - 1 : implSize;
+
+            // Failsafe -- assure match-up
+            boolean checkForIntersection = tree.varargsElement != null || implSize == descPTypes.size();
+
+            // Use parameter types of the implementation method unless the unerased
+            // SAM parameter type is an intersection type, in that case use the
+            // erased SAM parameter type so that the supertype relationship
+            // the implementation method parameters is not obscured.
+            // Note: in this loop, the lists implPTypes, samPTypes, and descPTypes
+            // are used as pointers to the current parameter type information
+            // and are thus not usable afterwards.
+            for (int i = 0; implPTypes.nonEmpty() && i < last; ++i) {
+                // By default use the implementation method parameter type
+                Type parmType = implPTypes.head;
+                if (checkForIntersection) {
+                    if (descPTypes.head.getKind() == TypeKind.INTERSECTION) {
+                        parmType = samPTypes.head;
+                    }
+                    // If the unerased parameter type is a type variable whose
+                    // bound is an intersection (eg. <T extends A & B>) then
+                    // use the SAM parameter type
+                    if (descPTypes.head.getKind() == TypeKind.TYPEVAR) {
+                        TypeVar tv = (TypeVar) descPTypes.head;
+                        if (tv.getUpperBound().getKind() == TypeKind.INTERSECTION) {
+                            parmType = samPTypes.head;
+                        }
+                    }
+                }
+                addParameter("x$" + i, parmType, true);
+
+                // Advance to the next parameter
+                implPTypes = implPTypes.tail;
+                samPTypes = samPTypes.tail;
+                descPTypes = descPTypes.tail;
+            }
+            // Flatten out the var args
+            for (int i = last; i < samSize; ++i) {
+                addParameter("xva$" + i, tree.varargsElement, true);
+            }
+
+            return rcvr;
+        }
+
+        private JCExpression makeReceiver(VarSymbol rcvr) {
+            if (rcvr == null) return null;
+            JCExpression rcvrExpr = make.Ident(rcvr);
+            boolean protAccess =
+                    isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, currentClass);
+            Type rcvrType = tree.ownerAccessible && !protAccess ? tree.sym.enclClass().type
+                    : tree.expr.type;
+            if (rcvrType == syms.arrayClass.type) {
+                // Map the receiver type to the actually type, not just "array"
+                rcvrType = tree.getQualifierExpression().type;
+            }
+            if (!rcvr.type.tsym.isSubClass(rcvrType.tsym, types)) {
+                rcvrExpr = make.TypeCast(make.Type(rcvrType), rcvrExpr).setType(rcvrType);
+            }
+            return rcvrExpr;
+        }
+
+        /**
+         * determine the receiver of the method call - the receiver can
+         * be a type qualifier, the synthetic receiver parameter or 'super'.
+         */
+        private JCExpression expressionInvoke(VarSymbol rcvr) {
+            JCExpression qualifier =
+                    (rcvr != null) ?
+                            makeReceiver(rcvr) :
+                            tree.getQualifierExpression();
+
+            //create the qualifier expression
+            JCFieldAccess select = make.Select(qualifier, tree.sym.name);
+            select.sym = tree.sym;
+            select.type = tree.sym.erasure(types);
+
+            //create the method call expression
+            JCExpression apply = make.Apply(List.nil(), select,
+                            convertArgs(tree.sym, args.toList(), tree.varargsElement)).
+                    setType(tree.sym.erasure(types).getReturnType());
+
+            apply = transTypes.coerce(attrEnv, apply,
+                    types.erasure(tree.referentType.getReturnType()));
+
+            setVarargsIfNeeded(apply, tree.varargsElement);
+            return apply;
+        }
+
+        /**
+         * Lambda body to use for a 'new'.
+         */
+        private JCExpression expressionNew() {
+            if (tree.kind == ReferenceKind.ARRAY_CTOR) {
+                //create the array creation expression
+                JCNewArray newArr = make.NewArray(
+                        make.Type(types.elemtype(tree.getQualifierExpression().type)),
+                        List.of(make.Ident(params.first())),
+                        null);
+                newArr.type = tree.getQualifierExpression().type;
+                return newArr;
+            } else {
+                //create the instance creation expression
+                //note that method reference syntax does not allow an explicit
+                //enclosing class (so the enclosing class is null)
+                // but this may need to be patched up later with the proxy for the outer this
+                JCNewClass newClass = make.NewClass(null,
+                        List.nil(),
+                        make.Type(tree.getQualifierExpression().type),
+                        convertArgs(tree.sym, args.toList(), tree.varargsElement),
+                        null);
+                newClass.constructor = tree.sym;
+                newClass.constructorType = tree.sym.erasure(types);
+                newClass.type = tree.getQualifierExpression().type;
+                setVarargsIfNeeded(newClass, tree.varargsElement);
+                return newClass;
+            }
+        }
+
+        private VarSymbol addParameter(String name, Type p, boolean genArg) {
+            VarSymbol vsym = new VarSymbol(PARAMETER | SYNTHETIC, names.fromString(name), p, owner);
+            vsym.pos = tree.pos;
+            params.append(make.VarDef(vsym, null));
+            if (genArg) {
+                args.append(make.Ident(vsym));
+            }
+            return vsym;
+        }
+    }
+
+    /**
+     * Convert method/constructor arguments by inserting appropriate cast
+     * as required by type-erasure - this is needed when bridging a lambda/method
+     * reference, as the bridged signature might require downcast to be compatible
+     * with the generated signature.
+     */
+    private List<JCExpression> convertArgs(Symbol meth, List<JCExpression> args, Type varargsElement) {
+        Assert.check(meth.kind == MTH);
+        List<Type> formals = types.erasure(meth.type).getParameterTypes();
+        if (varargsElement != null) {
+            Assert.check((meth.flags() & VARARGS) != 0);
+        }
+        return transTypes.translateArgs(args, formals, varargsElement, attrEnv);
+    }
+
+    /**
+     * Set varargsElement field on a given tree (must be either a new class tree
+     * or a method call tree)
+     */
+    private void setVarargsIfNeeded(JCTree tree, Type varargsElement) {
+        if (varargsElement != null) {
+            switch (tree.getTag()) {
+                case APPLY: ((JCMethodInvocation)tree).varargsElement = varargsElement; break;
+                case NEWCLASS: ((JCNewClass)tree).varargsElement = varargsElement; break;
+                case TYPECAST: setVarargsIfNeeded(((JCTypeCast) tree).expr, varargsElement); break;
+                default: throw new AssertionError();
+            }
+        }
+    }
+
     public void visitSwitch(JCSwitch tree) {
         List<JCCase> cases = tree.patternSwitch ? addDefaultIfNeeded(tree.patternSwitch,
                                                                      tree.wasEnumSelector,
@@ -4018,7 +4351,7 @@ public JCTree visitEnumSwitch(JCTree tree, JCExpression selector, List<JCCase> c
             //switch ($selector != null ? $mapVar[$selector.ordinal()] : -1) {...}
             //replacing case null with case -1:
             VarSymbol dollar_s = new VarSymbol(FINAL|SYNTHETIC,
-                                               names.fromString("s" + tree.pos + this.target.syntheticNameChar()),
+                                               names.fromString("s" + variableIndex++ + this.target.syntheticNameChar()),
                                                selector.type,
                                                currentMethodSym);
             JCStatement var = make.at(tree.pos()).VarDef(dollar_s, selector).setType(dollar_s.type);
@@ -4175,13 +4508,13 @@ public JCTree visitStringSwitch(JCTree tree, JCExpression selector, List<JCCase>
              */
 
             VarSymbol dollar_s = new VarSymbol(FINAL|SYNTHETIC,
-                                               names.fromString("s" + tree.pos + target.syntheticNameChar()),
+                                               names.fromString("s" + variableIndex++ + target.syntheticNameChar()),
                                                syms.stringType,
                                                currentMethodSym);
             stmtList.append(make.at(tree.pos()).VarDef(dollar_s, selector).setType(dollar_s.type));
 
             VarSymbol dollar_tmp = new VarSymbol(SYNTHETIC,
-                                                 names.fromString("tmp" + tree.pos + target.syntheticNameChar()),
+                                                 names.fromString("tmp" + variableIndex++ + target.syntheticNameChar()),
                                                  syms.intType,
                                                  currentMethodSym);
             JCVariableDecl dollar_tmp_def =
@@ -4323,7 +4656,7 @@ private JCTree visitBoxedPrimitiveSwitch(JCTree tree, JCExpression selector, Lis
             while (constants.contains(replacementValue)) replacementValue++;
 
             VarSymbol dollar_s = new VarSymbol(FINAL|SYNTHETIC,
-                                               names.fromString("s" + tree.pos + this.target.syntheticNameChar()),
+                                               names.fromString("s" + variableIndex++ + this.target.syntheticNameChar()),
                                                selector.type,
                                                currentMethodSym);
             JCStatement var = make.at(tree.pos()).VarDef(dollar_s, selector).setType(dollar_s.type);
@@ -4381,7 +4714,7 @@ public void visitSelect(JCFieldAccess tree) {
             TreeInfo.name(tree.selected) == names._super &&
             !types.isDirectSuperInterface(((JCFieldAccess)tree.selected).selected.type.tsym, currentClass);
         tree.selected = translate(tree.selected);
-        if (tree.name == names._class) {
+        if (tree.name == names._class && tree.selected.type.isPrimitiveOrVoid()) {
             result = classOf(tree.selected);
         }
         else if (tree.name == names._super &&
@@ -4457,6 +4790,7 @@ public List<JCTree> translateTopLevelClass(Env<AttrContext> env, JCTree cdef, Tr
             this.make = make;
             endPosTable = env.toplevel.endPositions;
             currentClass = null;
+            currentRestype = null;
             currentMethodDef = null;
             outermostClassDef = (cdef.hasTag(CLASSDEF)) ? (JCClassDecl)cdef : null;
             outermostMemberDef = null;
@@ -4486,6 +4820,7 @@ public List<JCTree> translateTopLevelClass(Env<AttrContext> env, JCTree cdef, Tr
             this.make = null;
             endPosTable = null;
             currentClass = null;
+            currentRestype = null;
             currentMethodDef = null;
             outermostClassDef = null;
             outermostMemberDef = null;
@@ -4505,4 +4840,23 @@ public List<JCTree> translateTopLevelClass(Env<AttrContext> env, JCTree cdef, Tr
         }
         return translated.toList();
     }
+
+    // needed for the lambda deserialization method, which is expressed as a big switch on strings
+    public JCMethodDecl translateMethod(Env<AttrContext> env, JCMethodDecl methodDecl, TreeMaker make) {
+        try {
+            this.attrEnv = env;
+            this.make = make;
+            this.currentClass = methodDecl.sym.enclClass();
+            proxies = new HashMap<>();
+            return translate(methodDecl);
+        } finally {
+            this.attrEnv = null;
+            this.make = null;
+            this.currentClass = null;
+            // the two fields below are set when visiting the method
+            this.currentMethodSym = null;
+            this.currentMethodDef = null;
+            this.proxies = null;
+        }
+    }
 }
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java
index ac8374a9a55..643bb22c853 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2024, 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
@@ -100,6 +100,7 @@ public class Resolve {
     DeferredAttr deferredAttr;
     Check chk;
     Infer infer;
+    Preview preview;
     ClassFinder finder;
     ModuleFinder moduleFinder;
     Types types;
@@ -135,7 +136,7 @@ protected Resolve(Context context) {
         moduleFinder = ModuleFinder.instance(context);
         types = Types.instance(context);
         diags = JCDiagnostic.Factory.instance(context);
-        Preview preview = Preview.instance(context);
+        preview = Preview.instance(context);
         Source source = Source.instance(context);
         Options options = Options.instance(context);
         compactMethodDiags = options.isSet(Option.XDIAGS, "compact") ||
@@ -1480,10 +1481,11 @@ else throw new FatalError(
 
     /** Find unqualified variable or field with given name.
      *  Synthetic fields always skipped.
+     *  @param pos       The position to use for error reporting.
      *  @param env     The current environment.
      *  @param name    The name of the variable or field.
      */
-    Symbol findVar(Env<AttrContext> env, Name name) {
+    Symbol findVar(DiagnosticPosition pos, Env<AttrContext> env, Name name) {
         Symbol bestSoFar = varNotFound;
         Env<AttrContext> env1 = env;
         boolean staticOnly = false;
@@ -1508,7 +1510,7 @@ Symbol findVar(Env<AttrContext> env, Name name) {
                         (sym.flags() & STATIC) == 0) {
                     if (staticOnly)
                         return new StaticError(sym);
-                    if (env1.info.ctorPrologue && !isAllowedEarlyReference(env1, (VarSymbol)sym))
+                    if (env1.info.ctorPrologue && !isAllowedEarlyReference(pos, env1, (VarSymbol)sym))
                         return new RefBeforeCtorCalledError(sym);
                 }
                 return sym;
@@ -2421,15 +2423,22 @@ Symbol findType(Env<AttrContext> env, Name name) {
      *                   (a subset of VAL, TYP, PCK).
      */
     Symbol findIdent(DiagnosticPosition pos, Env<AttrContext> env, Name name, KindSelector kind) {
-        return checkNonExistentType(checkRestrictedType(pos, findIdentInternal(env, name, kind), name));
+        try {
+            return checkNonExistentType(checkRestrictedType(pos, findIdentInternal(pos, env, name, kind), name));
+        } catch (ClassFinder.BadClassFile err) {
+            return new BadClassFileError(err);
+        } catch (CompletionFailure cf) {
+            chk.completionError(pos, cf);
+            return typeNotFound;
+        }
     }
 
-    Symbol findIdentInternal(Env<AttrContext> env, Name name, KindSelector kind) {
+    Symbol findIdentInternal(DiagnosticPosition pos, Env<AttrContext> env, Name name, KindSelector kind) {
         Symbol bestSoFar = typeNotFound;
         Symbol sym;
 
         if (kind.contains(KindSelector.VAL)) {
-            sym = findVar(env, name);
+            sym = findVar(pos, env, name);
             if (sym.exists()) return sym;
             else bestSoFar = bestOf(bestSoFar, sym);
         }
@@ -2493,7 +2502,14 @@ Symbol findIdentInPackageInternal(Env<AttrContext> env, TypeSymbol pck,
     Symbol findIdentInType(DiagnosticPosition pos,
                            Env<AttrContext> env, Type site,
                            Name name, KindSelector kind) {
-        return checkNonExistentType(checkRestrictedType(pos, findIdentInTypeInternal(env, site, name, kind), name));
+        try {
+            return checkNonExistentType(checkRestrictedType(pos, findIdentInTypeInternal(env, site, name, kind), name));
+        } catch (ClassFinder.BadClassFile err) {
+            return new BadClassFileError(err);
+        } catch (CompletionFailure cf) {
+            chk.completionError(pos, cf);
+            return typeNotFound;
+        }
     }
 
     private Symbol checkNonExistentType(Symbol symbol) {
@@ -3776,7 +3792,7 @@ Symbol resolveSelf(DiagnosticPosition pos,
                 if (sym != null) {
                     if (staticOnly)
                         sym = new StaticError(sym);
-                    else if (env1.info.ctorPrologue && !isAllowedEarlyReference(env1, (VarSymbol)sym))
+                    else if (env1.info.ctorPrologue && !isAllowedEarlyReference(pos, env1, (VarSymbol)sym))
                         sym = new RefBeforeCtorCalledError(sym);
                     return accessBase(sym, pos, env.enclClass.sym.type,
                                   name, true);
@@ -3845,7 +3861,7 @@ private List<Type> pruneInterfaces(Type t) {
      * We also don't verify that the field has no initializer, which is required.
      * To catch those cases, we rely on similar logic in Attr.checkAssignable().
      */
-    private boolean isAllowedEarlyReference(Env<AttrContext> env, VarSymbol v) {
+    private boolean isAllowedEarlyReference(DiagnosticPosition pos, Env<AttrContext> env, VarSymbol v) {
 
         // Check assumptions
         Assert.check(env.info.ctorPrologue);
@@ -3861,12 +3877,28 @@ private boolean isAllowedEarlyReference(Env<AttrContext> env, VarSymbol v) {
 
         // Get the symbol's qualifier, if any
         JCExpression lhs = TreeInfo.skipParens(assign.lhs);
-        JCExpression base = lhs instanceof JCFieldAccess select ? select.selected : null;
+        JCExpression base;
+        switch (lhs.getTag()) {
+        case IDENT:
+            base = null;
+            break;
+        case SELECT:
+            JCFieldAccess select = (JCFieldAccess)lhs;
+            base = select.selected;
+            if (!TreeInfo.isExplicitThisReference(types, (ClassType)env.enclClass.type, base))
+                return false;
+            break;
+        default:
+            return false;
+        }
 
         // If an early reference, the field must not be declared in a superclass
         if (isEarlyReference(env, base, v) && v.owner != env.enclClass.sym)
             return false;
 
+        // The flexible constructors feature must be enabled
+        preview.checkSourceLevel(pos, Feature.FLEXIBLE_CONSTRUCTORS);
+
         // OK
         return true;
     }
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java
index a12271c7904..9600e4f6e4f 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java
@@ -1618,14 +1618,6 @@ public void visitSwitchExpression(JCSwitchExpression tree) {
 
             compileStates.put(env, CompileState.TRANSPATTERNS);
 
-            if (scanner.hasLambdas) {
-                if (shouldStop(CompileState.UNLAMBDA))
-                    return;
-
-                env.tree = LambdaToMethod.instance(context).translateTopLevelClass(env, env.tree, localMake);
-                compileStates.put(env, CompileState.UNLAMBDA);
-            }
-
             if (shouldStop(CompileState.LOWER))
                 return;
 
@@ -1647,6 +1639,16 @@ public void visitSwitchExpression(JCSwitchExpression tree) {
             if (shouldStop(CompileState.LOWER))
                 return;
 
+            if (scanner.hasLambdas) {
+                if (shouldStop(CompileState.UNLAMBDA))
+                    return;
+
+                for (JCTree def : cdefs) {
+                    LambdaToMethod.instance(context).translateTopLevelClass(env, def, localMake);
+                }
+                compileStates.put(env, CompileState.UNLAMBDA);
+            }
+
             //generate code for each class
             for (List<JCTree> l = cdefs; l.nonEmpty(); l = l.tail) {
                 JCClassDecl cdef = (JCClassDecl)l.head;
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
index ce484e14b05..f570ad54c58 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java
@@ -2920,7 +2920,7 @@ List<JCStatement> blockStatement() {
                     case PLUS: case SUB: case STRINGLITERAL: case CHARLITERAL:
                     case STRINGFRAGMENT:
                     case INTLITERAL: case LONGLITERAL: case FLOATLITERAL: case DOUBLELITERAL:
-                    case NULL: case IDENTIFIER: case TRUE: case FALSE:
+                    case NULL: case IDENTIFIER: case UNDERSCORE: case TRUE: case FALSE:
                     case NEW: case SWITCH: case THIS: case SUPER:
                     case BYTE, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE, VOID, BOOLEAN:
                         isYieldStatement = true;
@@ -3436,7 +3436,15 @@ PatternResult analyzePattern(int lookahead) {
                                 : PatternResult.PATTERN;
                     }
                     parenDepth++; break;
-                case RPAREN: parenDepth--; break;
+                case RPAREN:
+                    parenDepth--;
+                    if (parenDepth == 0 &&
+                        typeDepth == 0 &&
+                        peekToken(lookahead, TokenKind.IDENTIFIER) &&
+                        S.token(lookahead + 1).name() == names.when) {
+                        return PatternResult.PATTERN;
+                    }
+                    break;
                 case ARROW: return parenDepth > 0 ? PatternResult.EXPRESSION
                                                    : pendingResult;
                 case FINAL:
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java
index 487fe969f97..4c24f9892a6 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -83,7 +83,14 @@ public Iterable<String> getSupportedPlatformNames() {
     }
 
     @Override
-    public PlatformDescription getPlatform(String platformName, String options) {
+    public PlatformDescription getPlatform(String platformName, String options) throws PlatformNotSupported {
+        if (!SUPPORTED_JAVA_PLATFORM_VERSIONS.contains(platformName)) {
+            throw new PlatformNotSupported();
+        }
+        return getPlatformTrusted(platformName);
+    }
+
+    public PlatformDescription getPlatformTrusted(String platformName) {
         return new PlatformDescriptionImpl(platformName);
     }
 
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_de.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_de.properties
index 566eff4c0d5..dfbeb0fd0b7 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_de.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_de.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2024, 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
@@ -294,6 +294,9 @@ compiler.err.cant.inherit.from.final=Erben aus finalem {0}-Element nicht möglic
 # 0: symbol or name
 compiler.err.cant.ref.before.ctor.called={0} kann nicht referenziert werden, bevor der Supertypkonstruktor aufgerufen wurde
 
+# 0: symbol or name
+compiler.err.cant.assign.initialized.before.ctor.called=Initialisiertes Feld "{0}" kann nicht zugewiesen werden, bevor der Supertypkonstruktor aufgerufen wurde
+
 compiler.err.cant.select.static.class.from.param.type=Statische Klasse kann nicht aus einem parametrisierten Typ ausgewählt werden
 
 # 0: symbol, 1: string, 2: string
@@ -403,6 +406,10 @@ compiler.err.duplicate.unconditional.pattern=Doppeltes nicht bedingtes Muster
 
 compiler.err.unconditional.pattern.and.default=Switch umfasst sowohl ein nicht bedingtes Muster als auch ein Standardlabel
 
+compiler.err.unconditional.pattern.and.both.boolean.values=Switch umfasst sowohl boolesche Werte als auch ein nicht bedingtes Muster
+
+compiler.err.default.and.both.boolean.values=Switch umfasst sowohl boolesche Werte als auch ein Standardlabel
+
 compiler.err.guard.not.allowed=Guards sind nur für CASE-Anweisungen mit einem Muster zulässig
 
 compiler.err.guard.has.constant.expression.false=Dieses CASE-Label hat einen Guard, der ein konstanter Ausdruck mit dem Wert ''false'' ist
@@ -413,12 +420,9 @@ compiler.err.cannot.assign.not.declared.guard=Zuweisen zu {0} nicht möglich, da
 # 0: type, 1: type
 compiler.err.constant.label.not.compatible=Konstantes Label des Typs {0} ist nicht mit Switch-Selektortyp {1} kompatibel
 
-# 0: type
-compiler.err.selector.type.not.allowed=Selektortyp {0} ist nicht zulässig
-
-compiler.err.flows.through.to.pattern=Ungültiger Fallthrough zu einem Muster
+compiler.err.flows.through.to.pattern=Unzulässiger Fallthrough auf ein Muster\n(im vorherigen CASE-Label fehlt ein Break)
 
-compiler.err.flows.through.from.pattern=Ungültiger Fallthrough von einem Muster
+compiler.err.flows.through.from.pattern=Unzulässiger Fallthrough von einem Muster\n(im aktuellen CASE-Label fehlt ein Break)
 
 compiler.err.invalid.case.label.combination=ungültige Case-Label-Kombination
 
@@ -533,6 +537,10 @@ compiler.err.illegal.underscore=Unzulässiger Unterstrich
 
 compiler.err.illegal.dot="." unzulässig
 
+compiler.err.illegal.digit.in.binary.literal=Unzulässige Ziffer in einem binären Literal
+
+compiler.err.illegal.digit.in.octal.literal=Unzulässige Ziffer in einem oktalen Literal
+
 # 0: symbol
 compiler.err.illegal.qual.not.icls=Unzulässiger Qualifier. {0} ist keine innere Klasse
 
@@ -961,15 +969,6 @@ compiler.err.unclosed.str.lit=Nicht geschlossenes Zeichenfolgenliteral
 
 compiler.err.unclosed.text.block=Nicht geschlossener Textblock
 
-compiler.err.string.template.is.not.well.formed=Zeichenfolgenvorlage ist nicht wohlgeformt
-
-compiler.err.text.block.template.is.not.well.formed=Textblockvorlage ist nicht wohlgeformt
-
-compiler.err.processor.missing.from.string.template.expression=Prozessor fehlt in Zeichenfolgenvorlagen-Ausdruck
-
-# 0: symbol
-compiler.err.not.a.processor.type=Kein Prozessortyp: {0}
-
 # 0: string
 compiler.err.unsupported.encoding=Nicht unterstützte Codierung: {0}
 
@@ -1339,6 +1338,8 @@ compiler.warn.lintOption=[{0}]\u0020
 # 0: symbol
 compiler.warn.constant.SVUID=serialVersionUID muss Konstante in Klasse {0} sein
 
+compiler.warn.dangling.doc.comment=Dokumentationskommentar ist an keine Deklaration angehängt
+
 # 0: path
 compiler.warn.dir.path.element.not.found=Ungültiges Pfadelement "{0}": Verzeichnis nicht vorhanden
 
@@ -1901,9 +1902,6 @@ compiler.warn.prob.found.req={0}\nErforderlich: {2}\nErmittelt:    {1}
 # 0: type, 1: type
 compiler.misc.inconvertible.types={0} kann nicht in {1} konvertiert werden
 
-# 0: type, 1: type
-compiler.misc.not.applicable.types=Muster des Typs {1} ist bei {0} nicht anwendbar
-
 # 0: type, 1: type
 compiler.misc.possible.loss.of.precision=Möglicher Verlust bei Konvertierung von {0} in {1}
 
@@ -2270,6 +2268,8 @@ compiler.misc.feature.deconstruction.patterns=Dekonstruktionsmuster
 
 compiler.misc.feature.unnamed.variables=Unbenannte Variablen
 
+compiler.misc.feature.primitive.patterns=Primitive Muster
+
 compiler.misc.feature.records=Datensätze
 
 compiler.misc.feature.sealed.classes=Verschlüsselte Klassen
@@ -2278,13 +2278,13 @@ compiler.misc.feature.case.null=Null in Switch Cases
 
 compiler.misc.feature.pattern.switch=Muster in Switch-Anweisungen
 
-compiler.misc.feature.string.templates=Zeichenfolgenvorlagen
-
 compiler.misc.feature.unconditional.patterns.in.instanceof=Nicht bedingte Muster in instanceof
 
 compiler.misc.feature.implicit.classes=Implizit deklarierte Klassen
 
-compiler.misc.feature.super.init=Anweisungen vor super()
+compiler.misc.feature.flexible.constructors=Flexible Konstruktoren
+
+compiler.misc.feature.module.imports=Modulimporte
 
 compiler.warn.underscore.as.identifier=Ab Release 9 ist "_" ein Schlüsselwort und kann nicht als ID verwendet werden
 
@@ -2502,6 +2502,15 @@ compiler.err.module.not.found=Modul nicht gefunden: {0}
 # 0: symbol
 compiler.warn.module.not.found=Modul nicht gefunden: {0}
 
+# 0: name
+compiler.err.import.module.not.found=Importiertes Modul nicht gefunden: {0}
+
+# 0: symbol
+compiler.err.import.module.does.not.read.unnamed=Unbenanntes Modul kann Folgendes nicht lesen: {0}
+
+# 0: symbol, 1: symbol
+compiler.err.import.module.does.not.read=Modul {0} kann Folgendes nicht lesen: {1}
+
 compiler.err.too.many.modules=Zu viele Moduldeklarationen gefunden
 
 compiler.err.module.not.found.on.module.source.path=Modul nicht in Modulquellpfad gefunden
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties
index 01844578905..4d98e4cabcc 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_ja.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2024, 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
@@ -294,6 +294,9 @@ compiler.err.cant.inherit.from.final=final {0}からは継承できません
 # 0: symbol or name
 compiler.err.cant.ref.before.ctor.called=スーパータイプのコンストラクタの呼出し前は{0}を参照できません
 
+# 0: symbol or name
+compiler.err.cant.assign.initialized.before.ctor.called=スーパータイプのコンストラクタの呼出し前は、初期化されたフィールド''{0}''を割り当てられません
+
 compiler.err.cant.select.static.class.from.param.type=パラメータにされた型からstaticクラスを選択することはできません
 
 # 0: symbol, 1: string, 2: string
@@ -403,6 +406,10 @@ compiler.err.duplicate.unconditional.pattern=無条件パターンが重複し
 
 compiler.err.unconditional.pattern.and.default=switchに無条件パターンとdefaultラベルの両方があります
 
+compiler.err.unconditional.pattern.and.both.boolean.values=switchに、ブール値と無条件パターンの両方があります
+
+compiler.err.default.and.both.boolean.values=switchに、ブール値とdefaultラベルの両方があります
+
 compiler.err.guard.not.allowed=ガードはパターンのあるcaseでのみ許可されます
 
 compiler.err.guard.has.constant.expression.false=このcaseラベルには、値が''false''の定数式であるガードがあります
@@ -413,12 +420,9 @@ compiler.err.cannot.assign.not.declared.guard=ガード内で宣言されてい
 # 0: type, 1: type
 compiler.err.constant.label.not.compatible=タイプ{0}の定数ラベルがswitchセレクタ・タイプ{1}と互換性がありません
 
-# 0: type
-compiler.err.selector.type.not.allowed=セレクタ・タイプ{0}は許可されません
-
-compiler.err.flows.through.to.pattern=パターンに対して不正なfall-through
+compiler.err.flows.through.to.pattern=パターンに対して不正なfall-through\n(前のcaseラベルにbreakがありません)
 
-compiler.err.flows.through.from.pattern=パターンからの不正なfall-through
+compiler.err.flows.through.from.pattern=パターンに対して不正なfall-through\n(現在のcaseラベルにbreakがありません)
 
 compiler.err.invalid.case.label.combination=caseラベルの組合せが無効です
 
@@ -533,6 +537,10 @@ compiler.err.illegal.underscore=不正なアンダースコアです
 
 compiler.err.illegal.dot=不正な''.''です
 
+compiler.err.illegal.digit.in.binary.literal=2進数リテラルの数字が正しくありません
+
+compiler.err.illegal.digit.in.octal.literal=8進数リテラルの数字が正しくありません
+
 # 0: symbol
 compiler.err.illegal.qual.not.icls=修飾子が不正です。{0}は内部クラスではありません
 
@@ -961,15 +969,6 @@ compiler.err.unclosed.str.lit=文字列リテラルが閉じられていませ
 
 compiler.err.unclosed.text.block=閉じられていないテキスト・ブロック
 
-compiler.err.string.template.is.not.well.formed=文字列テンプレートが整形式ではありません
-
-compiler.err.text.block.template.is.not.well.formed=テキスト・ブロック・テンプレートが整形式ではありません
-
-compiler.err.processor.missing.from.string.template.expression=プロセッサが文字列テンプレート式にありません
-
-# 0: symbol
-compiler.err.not.a.processor.type=プロセッサ・タイプではありません: {0}
-
 # 0: string
 compiler.err.unsupported.encoding=サポートされていないエンコーディングです: {0}
 
@@ -1339,6 +1338,8 @@ compiler.warn.lintOption=[{0}]\u0020
 # 0: symbol
 compiler.warn.constant.SVUID=serialVersionUIDはクラス{0}の定数である必要があります
 
+compiler.warn.dangling.doc.comment=どの宣言にもドキュメンテーション・コメントが添付されていません
+
 # 0: path
 compiler.warn.dir.path.element.not.found=不正なパス要素"{0}": そのディレクトリは存在しません
 
@@ -1901,9 +1902,6 @@ compiler.warn.prob.found.req={0}\n期待値: {2}\n検出値:    {1}
 # 0: type, 1: type
 compiler.misc.inconvertible.types={0}を{1}に変換できません:
 
-# 0: type, 1: type
-compiler.misc.not.applicable.types=型{1}のパターンは{0}では適用できません
-
 # 0: type, 1: type
 compiler.misc.possible.loss.of.precision=精度が失われる可能性がある{0}から{1}への変換
 
@@ -2270,6 +2268,8 @@ compiler.misc.feature.deconstruction.patterns=デコンストラクション・
 
 compiler.misc.feature.unnamed.variables=無名変数
 
+compiler.misc.feature.primitive.patterns=プリミティブ・パターン
+
 compiler.misc.feature.records=レコード
 
 compiler.misc.feature.sealed.classes=シール・クラス
@@ -2278,13 +2278,13 @@ compiler.misc.feature.case.null=switch caseのnull
 
 compiler.misc.feature.pattern.switch=switch文のパターン
 
-compiler.misc.feature.string.templates=文字列テンプレート
-
 compiler.misc.feature.unconditional.patterns.in.instanceof=instanceofでの無条件パターン
 
 compiler.misc.feature.implicit.classes=暗黙的に宣言されたクラス
 
-compiler.misc.feature.super.init=super()の前の文
+compiler.misc.feature.flexible.constructors=柔軟なコンストラクタ
+
+compiler.misc.feature.module.imports=モジュール・インポート
 
 compiler.warn.underscore.as.identifier=リリース9から''_''はキーワードなので識別子として使用することはできません
 
@@ -2502,6 +2502,15 @@ compiler.err.module.not.found=モジュールが見つかりません: {0}
 # 0: symbol
 compiler.warn.module.not.found=モジュールが見つかりません: {0}
 
+# 0: name
+compiler.err.import.module.not.found=インポートされたモジュールが見つかりません: {0}
+
+# 0: symbol
+compiler.err.import.module.does.not.read.unnamed=名前のないモジュールでは読取りは行われません: {0}
+
+# 0: symbol, 1: symbol
+compiler.err.import.module.does.not.read=モジュール{0}では読取りは行われません: {1}
+
 compiler.err.too.many.modules=検出されたモジュール宣言が多すぎます
 
 compiler.err.module.not.found.on.module.source.path=モジュール・ソース・パスにモジュールが見つかりません
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties
index 99c5df09fc1..81452f23a0d 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2024, 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
@@ -294,6 +294,9 @@ compiler.err.cant.inherit.from.final=无法从最终{0}进行继承
 # 0: symbol or name
 compiler.err.cant.ref.before.ctor.called=无法在调用超类型构造器之前引用{0}
 
+# 0: symbol or name
+compiler.err.cant.assign.initialized.before.ctor.called=无法在调用超类型构造器之前分配初始化字段 ''{0}''
+
 compiler.err.cant.select.static.class.from.param.type=无法从参数化的类型中选择静态类
 
 # 0: symbol, 1: string, 2: string
@@ -403,6 +406,10 @@ compiler.err.duplicate.unconditional.pattern=无条件模式重复
 
 compiler.err.unconditional.pattern.and.default=switch 有一个无条件模式和一个 default 标签
 
+compiler.err.unconditional.pattern.and.both.boolean.values=switch 有布尔值和一个无条件模式
+
+compiler.err.default.and.both.boolean.values=switch 有布尔值和一个 default 标签
+
 compiler.err.guard.not.allowed=只有包含模式的 case 允许使用卫士
 
 compiler.err.guard.has.constant.expression.false=此 case 标签有一个卫士,它是值为 ''false'' 的常量表达式
@@ -413,16 +420,13 @@ compiler.err.cannot.assign.not.declared.guard=无法分配给 {0},因为未在
 # 0: type, 1: type
 compiler.err.constant.label.not.compatible={0} 类型的常量标签与 switch 选择器类型 {1} 不兼容
 
-# 0: type
-compiler.err.selector.type.not.allowed=不允许使用选择器类型 {0}
-
-compiler.err.flows.through.to.pattern=贯穿 (fall-through) 到模式非法
+compiler.err.flows.through.to.pattern=贯穿 (fall-through) 到模式非法\n(上一个 case 标签缺少中断)
 
-compiler.err.flows.through.from.pattern=从模式贯穿 (fall-through) 非法
+compiler.err.flows.through.from.pattern=从模式贯穿 (fall-through) 非法\n(当前 case 标签缺少中断)
 
 compiler.err.invalid.case.label.combination=case 标签组合无效
 
-compiler.err.default.label.not.allowed=此处不允许使用默认标签
+compiler.err.default.label.not.allowed=此处不允许使用 default 标签
 
 compiler.err.pattern.type.cannot.infer=无法推断模式类型
 
@@ -533,6 +537,10 @@ compiler.err.illegal.underscore=非法下划线
 
 compiler.err.illegal.dot=非法 ''.''
 
+compiler.err.illegal.digit.in.binary.literal=二进制文字中的数字非法
+
+compiler.err.illegal.digit.in.octal.literal=八进制文字中的数字非法
+
 # 0: symbol
 compiler.err.illegal.qual.not.icls=非法限定符; {0}不是内部类
 
@@ -961,15 +969,6 @@ compiler.err.unclosed.str.lit=未结束的字符串文字
 
 compiler.err.unclosed.text.block=文本块未闭合
 
-compiler.err.string.template.is.not.well.formed=字符串模板格式不正确
-
-compiler.err.text.block.template.is.not.well.formed=文本块模板格式不正确
-
-compiler.err.processor.missing.from.string.template.expression=字符串模板表达式缺少处理程序
-
-# 0: symbol
-compiler.err.not.a.processor.type=不是处理程序类型:{0}
-
 # 0: string
 compiler.err.unsupported.encoding=不支持的编码: {0}
 
@@ -1339,6 +1338,8 @@ compiler.warn.lintOption=[{0}]\u0020
 # 0: symbol
 compiler.warn.constant.SVUID=serialVersionUID 在类{0}中必须是常量
 
+compiler.warn.dangling.doc.comment=文档注释未附加到任何声明
+
 # 0: path
 compiler.warn.dir.path.element.not.found=错误的路径元素 "{0}": 没有这种目录
 
@@ -1901,9 +1902,6 @@ compiler.warn.prob.found.req={0}\n需要: {2}\n找到:    {1}
 # 0: type, 1: type
 compiler.misc.inconvertible.types={0}无法转换为{1}
 
-# 0: type, 1: type
-compiler.misc.not.applicable.types=类型为 {1} 的模式不适用于 {0}
-
 # 0: type, 1: type
 compiler.misc.possible.loss.of.precision=从{0}转换到{1}可能会有损失
 
@@ -2270,6 +2268,8 @@ compiler.misc.feature.deconstruction.patterns=解构模式
 
 compiler.misc.feature.unnamed.variables=未命名变量
 
+compiler.misc.feature.primitive.patterns=基元模式
+
 compiler.misc.feature.records=记录
 
 compiler.misc.feature.sealed.classes=密封类
@@ -2278,13 +2278,13 @@ compiler.misc.feature.case.null=switch case 中的空值
 
 compiler.misc.feature.pattern.switch=switch 语句中的模式
 
-compiler.misc.feature.string.templates=字符串模板
-
 compiler.misc.feature.unconditional.patterns.in.instanceof=instanceof 中的无条件模式
 
 compiler.misc.feature.implicit.classes=隐式声明的类
 
-compiler.misc.feature.super.init=super() 之前的语句
+compiler.misc.feature.flexible.constructors=灵活构造器
+
+compiler.misc.feature.module.imports=模块导入
 
 compiler.warn.underscore.as.identifier=从发行版 9 开始, ''_'' 为关键字, 不能用作标识符
 
@@ -2502,6 +2502,15 @@ compiler.err.module.not.found=找不到模块: {0}
 # 0: symbol
 compiler.warn.module.not.found=找不到模块: {0}
 
+# 0: name
+compiler.err.import.module.not.found=找不到导入的模块:{0}
+
+# 0: symbol
+compiler.err.import.module.does.not.read.unnamed=未命名模块未读取:{0}
+
+# 0: symbol, 1: symbol
+compiler.err.import.module.does.not.read=模块 {0} 未读取:{1}
+
 compiler.err.too.many.modules=找到太多的模块声明
 
 compiler.err.module.not.found.on.module.source.path=在模块源路径中找不到模块
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_de.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_de.properties
index cc3bea6c763..00b64b1f099 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_de.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_de.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2024, 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
@@ -109,6 +109,8 @@ javac.opt.Xlint.desc.cast=Warnt vor unnötigen Umwandlungen mit Cast.
 
 javac.opt.Xlint.desc.classfile=Warnt vor Problemen im Zusammenhang mit Klassendateiinhalten.
 
+javac.opt.Xlint.desc.dangling-doc-comments=Warnt vor Dokumentationskommentaren, die an keine Deklaration angehängt sind.
+
 javac.opt.Xlint.desc.missing-explicit-ctor=Warnt vor fehlenden expliziten Konstruktoren in öffentlichen und geschützten Klassen in exportierten Packages.
 
 javac.opt.Xlint.desc.deprecation=Warnt vor der Verwendung veralteter Elemente.
@@ -214,6 +216,7 @@ javac.opt.module.version=Gibt die Version der Module an, die kompiliert werden
 javac.opt.arg.module.version=<Version>
 javac.opt.inherit_runtime_environment=Vererbt Modulsystemkonfigurationsoptionen aus der Laufzeitumgebung.
 javac.opt.default.module.for.created.files=Fallback-Zielmodul für Dateien, die von Annotationsprozessoren erstellt werden,\nfalls keines angegeben ist oder abgeleitet werden kann.
+javac.opt.lineDocComments=Unterstützung für Dokumentationskommentare mit Zeilen, die mit "///" beginnen, deaktivieren
 
 ## messages
 
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties
index f33c2c54cea..4eb259b23cc 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_ja.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2024, 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
@@ -109,6 +109,8 @@ javac.opt.Xlint.desc.cast=不要なキャストの使用について警告しま
 
 javac.opt.Xlint.desc.classfile=クラス・ファイルの内容に関連した問題について警告します。
 
+javac.opt.Xlint.desc.dangling-doc-comments=どの宣言にも添付されていないドキュメンテーション・コメントについて警告します。
+
 javac.opt.Xlint.desc.missing-explicit-ctor=エクスポートされたパッケージのpublicおよびprotectedのクラスに明示的なコンストラクタがないことを警告します。
 
 javac.opt.Xlint.desc.deprecation=非推奨項目の使用について警告します。
@@ -214,6 +216,7 @@ javac.opt.module.version=コンパイルするモジュールのバージョン
 javac.opt.arg.module.version=<バージョン>
 javac.opt.inherit_runtime_environment=実行時環境からモジュール・システム構成オプションを継承します。
 javac.opt.default.module.for.created.files=何も指定されていないか、推定型の場合、注釈プロセッサによって作成されるファイルのターゲット・モジュールをフォールバックします。
+javac.opt.lineDocComments='///'で行を開始すると、ドキュメンテーション・コメントのサポートが無効化されます
 
 ## messages
 
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties
index 64e031ed381..8cbddae86f6 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2024, 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
@@ -109,6 +109,8 @@ javac.opt.Xlint.desc.cast=有关使用了不必要转换的警告。
 
 javac.opt.Xlint.desc.classfile=有关与类文件内容相关的问题的警告。
 
+javac.opt.Xlint.desc.dangling-doc-comments=有关未附加到任何声明的悬挂文档注释的警告。
+
 javac.opt.Xlint.desc.missing-explicit-ctor=有关导出的程序包中的公共和受保护类中缺少显式构造器的警告。
 
 javac.opt.Xlint.desc.deprecation=有关使用了已过时项的警告。
@@ -214,6 +216,7 @@ javac.opt.module.version=指定正在编译的模块版本
 javac.opt.arg.module.version=<版本>
 javac.opt.inherit_runtime_environment=从运行时环境继承模块系统配置选项。
 javac.opt.default.module.for.created.files=由批注处理程序创建的文件的备用目标模块 (如果未指定或推断任何模块)。
+javac.opt.lineDocComments=禁用对带有以 '///' 开头的行的文档注释的支持
 
 ## messages
 
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_de.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_de.properties
index b59b227ddcb..efcc594ca6c 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_de.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_de.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2018, 2024, 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
@@ -122,8 +122,6 @@ launcher.err.no.value.for.option=kein Wert angegeben für Option: {0}
 # 0: string
 launcher.err.invalid.value.for.source=ungültiger Wert für Option --source: {0}
 
-launcher.err.enable.preview.requires.source=--enable-preview muss mit --source verwendet werden
-
 launcher.err.unnamed.pkg.not.allowed.named.modules=Unbenanntes Package ist in benannten Modulen nicht zulässig
 
 # 0: string, 1: path
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_ja.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_ja.properties
index 8bb25907bcd..72e2478bff3 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_ja.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_ja.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2018, 2024, 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
@@ -122,8 +122,6 @@ launcher.err.no.value.for.option=オプションに値が指定されていま
 # 0: string
 launcher.err.invalid.value.for.source=--sourceオプションの値が無効です: {0}
 
-launcher.err.enable.preview.requires.source=--enable-previewは--sourceとともに使用する必要があります
-
 launcher.err.unnamed.pkg.not.allowed.named.modules=名前のないパッケージは名前付きモジュールでは許可されません
 
 # 0: string, 1: path
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_zh_CN.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_zh_CN.properties
index 81976d40b86..ee666cc02c1 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_zh_CN.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher_zh_CN.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2018, 2024, 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
@@ -122,8 +122,6 @@ launcher.err.no.value.for.option=没有为选项 {0} 指定值
 # 0: string
 launcher.err.invalid.value.for.source=--source 选项的值无效:{0}\n
 
-launcher.err.enable.preview.requires.source=--enable-preview 必须与 --source 一起使用
-
 launcher.err.unnamed.pkg.not.allowed.named.modules=命名模块中不允许未命名程序包
 
 # 0: string, 1: path
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java
index 5af482516b4..6f3b8b5d8aa 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java
@@ -2013,6 +2013,7 @@ public enum ParameterKind {
         public JCTree body;
         public boolean canCompleteNormally = true;
         public ParameterKind paramKind;
+        public boolean wasMethodReference;
 
         public JCLambda(List<JCVariableDecl> params,
                         JCTree body) {
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java
index f2edd5c97e9..5e3b043fb11 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java
@@ -344,11 +344,13 @@ public void visitExec(JCExpressionStatement stat) {
         @Override
         public void visitClassDef(JCClassDecl tree) {
             // don't descend any further
+            result = tree;
         }
 
         @Override
         public void visitLambda(JCLambda tree) {
             // don't descend any further
+            result = tree;
         }
     }
 
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java
index e1faa02bd38..3bc5c671bfd 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java
@@ -184,6 +184,9 @@ protected void preprocessArgument(Object arg) {
         if (arg instanceof Type type) {
             preprocessType(type);
         }
+        else if (arg instanceof JCDiagnostic.AnnotatedType type) {
+            preprocessType(type.type());
+        }
         else if (arg instanceof Symbol symbol) {
             preprocessSymbol(symbol);
         }
diff --git a/src/jdk.compiler/share/data/symbols/java.base-N.sym.txt b/src/jdk.compiler/share/data/symbols/java.base-N.sym.txt
index 905a0db8b73..8fab1f56765 100644
--- a/src/jdk.compiler/share/data/symbols/java.base-N.sym.txt
+++ b/src/jdk.compiler/share/data/symbols/java.base-N.sym.txt
@@ -34,6 +34,7 @@ class name java/io/ByteArrayOutputStream
 method name writeTo descriptor (Ljava/io/OutputStream;)V thrownTypes java/io/IOException flags 1
 
 class name java/io/Console
+header extends java/lang/Object implements java/io/Flushable sealed true permittedSubclasses java/io/ProxyingConsole flags 21
 method name format descriptor (Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/Console; flags 81
 method name printf descriptor (Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/Console; flags 81
 method name readLine descriptor (Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; flags 81
@@ -63,6 +64,27 @@ method name println descriptor (Ljava/lang/Object;)Ljava/io/Console; flags 1
 method name print descriptor (Ljava/lang/Object;)Ljava/io/Console; flags 1
 method name readln descriptor (Ljava/lang/String;)Ljava/lang/String; flags 1
 
+class name java/lang/ScopedValue
+header extends java/lang/Object nestMembers java/lang/ScopedValue$CallableOp,java/lang/ScopedValue$Carrier flags 31 signature <T:Ljava/lang/Object;>Ljava/lang/Object; classAnnotations @Ljdk/internal/javac/PreviewFeature;(feature=eLjdk/internal/javac/PreviewFeature$Feature;SCOPED_VALUES;)
+innerclass innerClass java/lang/ScopedValue$Carrier outerClass java/lang/ScopedValue innerClassName Carrier flags 19
+innerclass innerClass java/lang/ScopedValue$CallableOp outerClass java/lang/ScopedValue innerClassName CallableOp flags 609
+-method name callWhere descriptor (Ljava/lang/ScopedValue;Ljava/lang/Object;Ljava/util/concurrent/Callable;)Ljava/lang/Object;
+-method name getWhere descriptor (Ljava/lang/ScopedValue;Ljava/lang/Object;Ljava/util/function/Supplier;)Ljava/lang/Object;
+method name callWhere descriptor (Ljava/lang/ScopedValue;Ljava/lang/Object;Ljava/lang/ScopedValue$CallableOp;)Ljava/lang/Object; thrownTypes java/lang/Throwable flags 9 signature <T:Ljava/lang/Object;R:Ljava/lang/Object;X:Ljava/lang/Throwable;>(Ljava/lang/ScopedValue<TT;>;TT;Ljava/lang/ScopedValue$CallableOp<+TR;TX;>;)TR;^TX;
+
+class name java/lang/ScopedValue$CallableOp
+header extends java/lang/Object nestHost java/lang/ScopedValue flags 601 signature <T:Ljava/lang/Object;X:Ljava/lang/Throwable;>Ljava/lang/Object; classAnnotations @Ljdk/internal/javac/PreviewFeature;(feature=eLjdk/internal/javac/PreviewFeature$Feature;SCOPED_VALUES;) runtimeAnnotations @Ljava/lang/FunctionalInterface;
+innerclass innerClass java/lang/ScopedValue$CallableOp outerClass java/lang/ScopedValue innerClassName CallableOp flags 609
+method name call descriptor ()Ljava/lang/Object; thrownTypes java/lang/Throwable flags 401 signature ()TT;^TX;
+
+class name java/lang/ScopedValue$Carrier
+header extends java/lang/Object nestHost java/lang/ScopedValue flags 31 classAnnotations @Ljdk/internal/javac/PreviewFeature;(feature=eLjdk/internal/javac/PreviewFeature$Feature;SCOPED_VALUES;)
+innerclass innerClass java/lang/ScopedValue$Carrier outerClass java/lang/ScopedValue innerClassName Carrier flags 19
+innerclass innerClass java/lang/ScopedValue$CallableOp outerClass java/lang/ScopedValue innerClassName CallableOp flags 609
+-method name call descriptor (Ljava/util/concurrent/Callable;)Ljava/lang/Object;
+-method name get descriptor (Ljava/util/function/Supplier;)Ljava/lang/Object;
+method name call descriptor (Ljava/lang/ScopedValue$CallableOp;)Ljava/lang/Object; thrownTypes java/lang/Throwable flags 1 signature <R:Ljava/lang/Object;X:Ljava/lang/Throwable;>(Ljava/lang/ScopedValue$CallableOp<+TR;TX;>;)TR;^TX;
+
 -class name java/lang/StringTemplate
 
 -class name java/lang/StringTemplate$Processor
@@ -175,6 +197,12 @@ innerclass innerClass java/lang/classfile/ClassFile$ShortJumpsOption outerClass
 innerclass innerClass java/lang/classfile/ClassFile$StackMapsOption outerClass java/lang/classfile/ClassFile innerClassName StackMapsOption flags 4019
 innerclass innerClass java/lang/classfile/ClassFile$AttributesProcessingOption outerClass java/lang/classfile/ClassFile innerClassName AttributesProcessingOption flags 4019
 
+class name java/lang/classfile/ClassReader
+-method name thisClassPos descriptor ()I
+-method name skipAttributeHolder descriptor (I)I
+-method name utf8EntryByIndex descriptor (I)Ljava/lang/classfile/constantpool/Utf8Entry;
+method name readEntryOrNull descriptor (ILjava/lang/Class;)Ljava/lang/classfile/constantpool/PoolEntry; flags 401 signature <T::Ljava/lang/classfile/constantpool/PoolEntry;>(ILjava/lang/Class<TT;>;)TT;
+
 class name java/lang/classfile/ClassSignature
 header extends java/lang/Object sealed true permittedSubclasses jdk/internal/classfile/impl/SignaturesImpl$ClassSignatureImpl flags 601 classAnnotations @Ljdk/internal/javac/PreviewFeature;(feature=eLjdk/internal/javac/PreviewFeature$Feature;CLASSFILE_API;)
 innerclass innerClass java/lang/classfile/Signature$ClassTypeSig outerClass java/lang/classfile/Signature innerClassName ClassTypeSig flags 609
@@ -311,6 +339,12 @@ class name java/lang/classfile/TypeKind
 method name newarrayCode descriptor ()I flags 1
 method name fromNewarrayCode descriptor (I)Ljava/lang/classfile/TypeKind; flags 9
 
+class name java/lang/classfile/components/ClassPrinter$ListNode
+header extends java/lang/Object implements java/lang/classfile/components/ClassPrinter$Node,java/util/List nestHost java/lang/classfile/components/ClassPrinter sealed true permittedSubclasses jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl flags 601 signature Ljava/lang/Object;Ljava/lang/classfile/components/ClassPrinter$Node;Ljava/util/List<Ljava/lang/classfile/components/ClassPrinter$Node;>; classAnnotations @Ljdk/internal/javac/PreviewFeature;(feature=eLjdk/internal/javac/PreviewFeature$Feature;CLASSFILE_API;)
+innerclass innerClass java/lang/classfile/components/ClassPrinter$ListNode outerClass java/lang/classfile/components/ClassPrinter innerClassName ListNode flags 609
+innerclass innerClass java/lang/classfile/components/ClassPrinter$Node outerClass java/lang/classfile/components/ClassPrinter innerClassName Node flags 609
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName ListNodeImpl flags 9
+
 class name java/lang/classfile/components/ClassPrinter$Node
 header extends java/lang/Object nestHost java/lang/classfile/components/ClassPrinter sealed true permittedSubclasses java/lang/classfile/components/ClassPrinter$LeafNode,java/lang/classfile/components/ClassPrinter$ListNode,java/lang/classfile/components/ClassPrinter$MapNode flags 601 classAnnotations @Ljdk/internal/javac/PreviewFeature;(feature=eLjdk/internal/javac/PreviewFeature$Feature;CLASSFILE_API;)
 innerclass innerClass java/lang/classfile/components/ClassPrinter$Node outerClass java/lang/classfile/components/ClassPrinter innerClassName Node flags 609
@@ -318,6 +352,9 @@ innerclass innerClass java/lang/classfile/components/ClassPrinter$LeafNode outer
 innerclass innerClass java/lang/classfile/components/ClassPrinter$ListNode outerClass java/lang/classfile/components/ClassPrinter innerClassName ListNode flags 609
 innerclass innerClass java/lang/classfile/components/ClassPrinter$MapNode outerClass java/lang/classfile/components/ClassPrinter innerClassName MapNode flags 609
 
+class name java/lang/classfile/constantpool/ConstantPool
+method name entryByIndex descriptor (ILjava/lang/Class;)Ljava/lang/classfile/constantpool/PoolEntry; flags 401 signature <T::Ljava/lang/classfile/constantpool/PoolEntry;>(ILjava/lang/Class<TT;>;)TT;
+
 class name java/lang/constant/ClassDesc
 header extends java/lang/Object implements java/lang/constant/ConstantDesc,java/lang/invoke/TypeDescriptor$OfField sealed true permittedSubclasses jdk/internal/constant/PrimitiveClassDescImpl,jdk/internal/constant/ReferenceClassDescImpl flags 601 signature Ljava/lang/Object;Ljava/lang/constant/ConstantDesc;Ljava/lang/invoke/TypeDescriptor$OfField<Ljava/lang/constant/ClassDesc;>;
 innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
@@ -419,6 +456,12 @@ method name setTTL descriptor (B)V thrownTypes java/io/IOException flags 1 depre
 method name getTTL descriptor ()B thrownTypes java/io/IOException flags 1 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="1.2")
 method name send descriptor (Ljava/net/DatagramPacket;B)V thrownTypes java/io/IOException flags 1 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="1.4")
 
+class name java/net/Socket
+-method name <init> descriptor (Ljava/lang/String;IZ)V
+-method name <init> descriptor (Ljava/net/InetAddress;IZ)V
+method name <init> descriptor (Ljava/lang/String;IZ)V thrownTypes java/io/IOException flags 1 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="1.1")
+method name <init> descriptor (Ljava/net/InetAddress;IZ)V thrownTypes java/io/IOException flags 1 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="1.1")
+
 class name java/nio/HeapByteBuffer
 method name hashCode descriptor ()I flags 1
 
@@ -461,6 +504,10 @@ method name isStrict descriptor ()Z flags 1
 method name setStrict descriptor (Z)V flags 1
 method name toString descriptor ()Ljava/lang/String; flags 1
 
+class name java/text/DecimalFormatSymbols
+header extends java/lang/Object implements java/lang/Cloneable,java/io/Serializable flags 21
+innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
+
 class name java/text/MessageFormat
 header extends java/text/Format nestMembers java/text/MessageFormat$Field flags 21
 innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
@@ -521,6 +568,12 @@ method name getTotalOut descriptor ()I flags 1 deprecated true runtimeAnnotation
 class name java/util/zip/ZipFile
 method name toString descriptor ()Ljava/lang/String; flags 1
 
+class name javax/security/auth/Subject
+header extends java/lang/Object implements java/io/Serializable flags 31
+innerclass innerClass java/lang/ScopedValue$CallableOp outerClass java/lang/ScopedValue innerClassName CallableOp flags 609
+innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
+innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
+
 class name jdk/internal/classfile/impl/AbstractInstruction
 header extends jdk/internal/classfile/impl/AbstractElement implements java/lang/classfile/Instruction nestMembers jdk/internal/classfile/impl/AbstractInstruction$UnboundRetInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundJsrInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundNopInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundMonitorInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundLoadConstantInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundArgumentConstantInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundIntrinsicConstantInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundOperatorInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundConvertInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundStackInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundTypeCheckInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundArrayStoreInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundArrayLoadInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundNewMultidimensionalArrayInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundNewReferenceArrayInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundNewPrimitiveArrayInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundNewObjectInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundInvokeDynamicInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundInvokeInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundFieldInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundThrowInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundReturnInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundTableSwitchInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundLookupSwitchInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundBranchInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundIncrementInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundStoreInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundLoadInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundRetInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundJsrInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundLoadConstantInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundArgumentConstantInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundTypeCheckInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundNewMultidimensionalArrayInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundNewReferenceArrayInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundNewPrimitiveArrayInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundNewObjectInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundInvokeDynamicInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundInvokeInterfaceInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundInvokeInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundFieldInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundTableSwitchInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundLookupSwitchInstruction,jdk/internal/classfile/impl/AbstractInstruction$SwitchCaseImpl,jdk/internal/classfile/impl/AbstractInstruction$BoundBranchInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundIncrementInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundStoreInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundLoadInstruction,jdk/internal/classfile/impl/AbstractInstruction$BoundInstruction sealed true permittedSubclasses jdk/internal/classfile/impl/AbstractInstruction$BoundInstruction,jdk/internal/classfile/impl/AbstractInstruction$UnboundInstruction flags 421
 innerclass innerClass jdk/internal/classfile/impl/AbstractInstruction$UnboundRetInstruction outerClass jdk/internal/classfile/impl/AbstractInstruction innerClassName UnboundRetInstruction flags 19
@@ -747,10 +800,10 @@ innerclass innerClass jdk/internal/classfile/impl/BoundAttribute$BoundStackMapTa
 method name standardAttribute descriptor (Ljava/lang/classfile/constantpool/Utf8Entry;)Ljava/lang/classfile/AttributeMapper; flags 9 signature (Ljava/lang/classfile/constantpool/Utf8Entry;)Ljava/lang/classfile/AttributeMapper<*>;
 
 class name jdk/internal/classfile/impl/ClassPrinterImpl
-header extends java/lang/Object nestMembers jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl,jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl,jdk/internal/classfile/impl/ClassPrinterImpl$LeafNodeImpl flags 31
+header extends java/lang/Object nestMembers jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl,jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl$PrivateListNodeImpl,jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl,jdk/internal/classfile/impl/ClassPrinterImpl$LeafNodeImpl flags 31
 innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$LeafNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName LeafNodeImpl flags 19
 innerclass innerClass java/lang/classfile/components/ClassPrinter$Node outerClass java/lang/classfile/components/ClassPrinter innerClassName Node flags 609
-innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName ListNodeImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName ListNodeImpl flags 9
 innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName MapNodeImpl flags 19
 innerclass innerClass java/lang/classfile/components/ClassPrinter$LeafNode outerClass java/lang/classfile/components/ClassPrinter innerClassName LeafNode flags 609
 innerclass innerClass java/lang/classfile/AnnotationValue$OfString outerClass java/lang/classfile/AnnotationValue innerClassName OfString flags 609
@@ -781,8 +834,63 @@ innerclass innerClass java/lang/classfile/attribute/StackMapFrameInfo$Verificati
 innerclass innerClass java/lang/classfile/attribute/StackMapFrameInfo$SimpleVerificationTypeInfo outerClass java/lang/classfile/attribute/StackMapFrameInfo innerClassName SimpleVerificationTypeInfo flags 4019
 innerclass innerClass java/lang/classfile/attribute/StackMapFrameInfo$ObjectVerificationTypeInfo outerClass java/lang/classfile/attribute/StackMapFrameInfo innerClassName ObjectVerificationTypeInfo flags 609
 innerclass innerClass java/lang/classfile/attribute/StackMapFrameInfo$UninitializedVerificationTypeInfo outerClass java/lang/classfile/attribute/StackMapFrameInfo innerClassName UninitializedVerificationTypeInfo flags 609
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl$PrivateListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl innerClassName PrivateListNodeImpl flags 1a
 innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
 
+class name jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl
+header extends java/util/AbstractList implements java/lang/classfile/components/ClassPrinter$ListNode nestHost jdk/internal/classfile/impl/ClassPrinterImpl sealed true permittedSubclasses jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl$PrivateListNodeImpl flags 21 signature Ljava/util/AbstractList<Ljava/lang/classfile/components/ClassPrinter$Node;>;Ljava/lang/classfile/components/ClassPrinter$ListNode;
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName ListNodeImpl flags 9
+innerclass innerClass java/lang/classfile/components/ClassPrinter$Node outerClass java/lang/classfile/components/ClassPrinter innerClassName Node flags 609
+innerclass innerClass java/lang/classfile/components/ClassPrinter$ListNode outerClass java/lang/classfile/components/ClassPrinter innerClassName ListNode flags 609
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName MapNodeImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl$PrivateListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl innerClassName PrivateListNodeImpl flags 1a
+innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
+field name nodes descriptor Ljava/util/List; flags 14 signature Ljava/util/List<Ljava/lang/classfile/components/ClassPrinter$Node;>;
+method name <init> descriptor (Ljdk/internal/classfile/impl/ClassPrinterImpl$Style;Ljava/lang/constant/ConstantDesc;Ljava/util/List;)V flags 4 signature (Ljdk/internal/classfile/impl/ClassPrinterImpl$Style;Ljava/lang/constant/ConstantDesc;Ljava/util/List<Ljava/lang/classfile/components/ClassPrinter$Node;>;)V
+
+class name jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl
+header extends java/lang/Object implements java/lang/classfile/components/ClassPrinter$MapNode nestHost jdk/internal/classfile/impl/ClassPrinterImpl flags 31
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName MapNodeImpl flags 19
+innerclass innerClass java/lang/classfile/components/ClassPrinter$Node outerClass java/lang/classfile/components/ClassPrinter innerClassName Node flags 609
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl$PrivateListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl innerClassName PrivateListNodeImpl flags 1a
+innerclass innerClass java/lang/classfile/components/ClassPrinter$MapNode outerClass java/lang/classfile/components/ClassPrinter innerClassName MapNode flags 609
+innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
+innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
+
+class name jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl$PrivateListNodeImpl
+header extends jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl nestHost jdk/internal/classfile/impl/ClassPrinterImpl flags 30
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$ListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName ListNodeImpl flags 9
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl innerClassName MapNodeImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl$PrivateListNodeImpl outerClass jdk/internal/classfile/impl/ClassPrinterImpl$MapNodeImpl innerClassName PrivateListNodeImpl flags 1a
+innerclass innerClass java/lang/classfile/components/ClassPrinter$Node outerClass java/lang/classfile/components/ClassPrinter innerClassName Node flags 609
+
+class name jdk/internal/classfile/impl/ClassReaderImpl
+header extends java/lang/Object implements java/lang/classfile/ClassReader flags 31
+innerclass innerClass java/lang/classfile/ClassFile$AttributeMapperOption outerClass java/lang/classfile/ClassFile innerClassName AttributeMapperOption flags 609
+innerclass innerClass jdk/internal/classfile/impl/UnboundAttribute$EmptyBootstrapAttribute outerClass jdk/internal/classfile/impl/UnboundAttribute innerClassName EmptyBootstrapAttribute flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$MethodHandleEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName MethodHandleEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$Utf8EntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName Utf8EntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$IntegerEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName IntegerEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$FloatEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName FloatEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$LongEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName LongEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$DoubleEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName DoubleEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$ClassEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName ClassEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$StringEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName StringEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$FieldRefEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName FieldRefEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$MethodRefEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName MethodRefEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$InterfaceMethodRefEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName InterfaceMethodRefEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$NameAndTypeEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName NameAndTypeEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$MethodTypeEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName MethodTypeEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$ConstantDynamicEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName ConstantDynamicEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$InvokeDynamicEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName InvokeDynamicEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$ModuleEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName ModuleEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$PackageEntryImpl outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName PackageEntryImpl flags 19
+innerclass innerClass jdk/internal/classfile/impl/AbstractPoolEntry$AbstractMemberRefEntry outerClass jdk/internal/classfile/impl/AbstractPoolEntry innerClassName AbstractMemberRefEntry flags 409
+-method name utf8EntryByIndex descriptor (I)Ljdk/internal/classfile/impl/AbstractPoolEntry$Utf8EntryImpl;
+-method name utf8EntryByIndex descriptor (I)Ljava/lang/classfile/constantpool/Utf8Entry;
+method name entryByIndex descriptor (ILjava/lang/Class;)Ljava/lang/classfile/constantpool/PoolEntry; flags 1 signature <T::Ljava/lang/classfile/constantpool/PoolEntry;>(ILjava/lang/Class<TT;>;)TT;
+method name readEntryOrNull descriptor (ILjava/lang/Class;)Ljava/lang/classfile/constantpool/PoolEntry; flags 1 signature <T::Ljava/lang/classfile/constantpool/PoolEntry;>(ILjava/lang/Class<TT;>;)TT;
+
 class name jdk/internal/classfile/impl/ClassRemapperImpl
 header extends java/lang/Record implements java/lang/classfile/components/ClassRemapper record true flags 31
 recordcomponent name mapFunction descriptor Ljava/util/function/Function; signature Ljava/util/function/Function<Ljava/lang/constant/ClassDesc;Ljava/lang/constant/ClassDesc;>;
@@ -893,6 +1001,22 @@ field name INSTANCE descriptor Ljdk/internal/classfile/impl/SignaturesImpl$Unbou
 method name values descriptor ()[Ljdk/internal/classfile/impl/SignaturesImpl$UnboundedTypeArgImpl; flags 9
 method name valueOf descriptor (Ljava/lang/String;)Ljdk/internal/classfile/impl/SignaturesImpl$UnboundedTypeArgImpl; flags 9 methodParameters 8000:null
 
+class name jdk/internal/classfile/impl/SplitConstantPool
+method name entryByIndex descriptor (ILjava/lang/Class;)Ljava/lang/classfile/constantpool/PoolEntry; flags 1 signature <T::Ljava/lang/classfile/constantpool/PoolEntry;>(ILjava/lang/Class<TT;>;)TT;
+
+class name jdk/internal/classfile/impl/StackMapDecoder$ObjectVerificationTypeInfoImpl
+header extends java/lang/Record implements java/lang/classfile/attribute/StackMapFrameInfo$ObjectVerificationTypeInfo nestHost jdk/internal/classfile/impl/StackMapDecoder record true flags 31
+recordcomponent name className descriptor Ljava/lang/classfile/constantpool/ClassEntry;
+innerclass innerClass jdk/internal/classfile/impl/StackMapDecoder$ObjectVerificationTypeInfoImpl outerClass jdk/internal/classfile/impl/StackMapDecoder innerClassName ObjectVerificationTypeInfoImpl flags 19
+innerclass innerClass java/lang/classfile/attribute/StackMapFrameInfo$ObjectVerificationTypeInfo outerClass java/lang/classfile/attribute/StackMapFrameInfo innerClassName ObjectVerificationTypeInfo flags 609
+-method name hashCode descriptor ()I
+-method name equals descriptor (Ljava/lang/Object;)Z
+method name equals descriptor (Ljava/lang/Object;)Z flags 1
+method name hashCode descriptor ()I flags 1
+
+class name jdk/internal/classfile/impl/TemporaryConstantPool
+method name entryByIndex descriptor (ILjava/lang/Class;)Ljava/lang/classfile/constantpool/PoolEntry; flags 1 signature <T::Ljava/lang/classfile/constantpool/PoolEntry;>(ILjava/lang/Class<TT;>;)TT;
+
 class name jdk/internal/classfile/impl/UnboundAttribute
 header extends jdk/internal/classfile/impl/AbstractElement implements java/lang/classfile/Attribute nestMembers jdk/internal/classfile/impl/UnboundAttribute$EmptyBootstrapAttribute,jdk/internal/classfile/impl/UnboundAttribute$AdHocAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleAttribute,jdk/internal/classfile/impl/UnboundAttribute$TypePathComponentImpl,jdk/internal/classfile/impl/UnboundAttribute$UnboundTypeAnnotation,jdk/internal/classfile/impl/UnboundAttribute$UnboundRecordComponentInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleRequiresInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleProvideInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleOpenInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleHashInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleExportInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundMethodParameterInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundLocalVariableTypeInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundLocalVariableInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundLineNumberInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundInnerClassInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundCharacterRangeInfo,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeInvisibleTypeAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeVisibleTypeAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeInvisibleParameterAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeVisibleParameterAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeInvisibleAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeVisibleAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundLocalVariableTypeTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundLocalVariableTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundLineNumberTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundCharacterRangeTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSourceDebugExtensionAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSourceIDAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundCompilationIDAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundNestHostAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundNestMembersAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundPermittedSubclassesAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleResolutionAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModulePackagesAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleHashesAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleMainClassAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleTargetAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundMethodParametersAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundEnclosingMethodAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRecordAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundInnerClassesAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundStackMapTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSourceFileAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundAnnotationDefaultAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundExceptionsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSignatureAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSyntheticAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundDeprecatedAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundConstantValueAttribute sealed true permittedSubclasses jdk/internal/classfile/impl/UnboundAttribute$UnboundConstantValueAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundDeprecatedAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSyntheticAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSignatureAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundExceptionsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundAnnotationDefaultAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSourceFileAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundStackMapTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundInnerClassesAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRecordAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundEnclosingMethodAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundMethodParametersAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleTargetAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleMainClassAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleHashesAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModulePackagesAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleResolutionAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundPermittedSubclassesAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundNestMembersAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundNestHostAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundCompilationIDAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSourceIDAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundSourceDebugExtensionAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundCharacterRangeTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundLineNumberTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundLocalVariableTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundLocalVariableTypeTableAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeVisibleAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeInvisibleAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeVisibleParameterAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeInvisibleParameterAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeVisibleTypeAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundRuntimeInvisibleTypeAnnotationsAttribute,jdk/internal/classfile/impl/UnboundAttribute$UnboundModuleAttribute,jdk/internal/classfile/impl/UnboundAttribute$AdHocAttribute,jdk/internal/classfile/impl/UnboundAttribute$EmptyBootstrapAttribute flags 421 signature <T::Ljava/lang/classfile/Attribute<TT;>;>Ljdk/internal/classfile/impl/AbstractElement;Ljava/lang/classfile/Attribute<TT;>;
 innerclass innerClass jdk/internal/classfile/impl/UnboundAttribute$EmptyBootstrapAttribute outerClass jdk/internal/classfile/impl/UnboundAttribute innerClassName EmptyBootstrapAttribute flags 19
@@ -970,7 +1094,6 @@ innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang
 innerclass innerClass java/lang/invoke/TypeDescriptor$OfField outerClass java/lang/invoke/TypeDescriptor innerClassName OfField flags 609
 innerclass innerClass java/lang/invoke/TypeDescriptor$OfMethod outerClass java/lang/invoke/TypeDescriptor innerClassName OfMethod flags 609
 method name ofTrusted descriptor (Ljava/lang/constant/ClassDesc;[Ljava/lang/constant/ClassDesc;)Ljdk/internal/constant/MethodTypeDescImpl; flags 9
-method name ofValidated descriptor (Ljava/lang/constant/ClassDesc;[Ljava/lang/constant/ClassDesc;)Ljdk/internal/constant/MethodTypeDescImpl; flags 9
 method name ofDescriptor descriptor (Ljava/lang/String;)Ljdk/internal/constant/MethodTypeDescImpl; flags 9
 method name returnType descriptor ()Ljava/lang/constant/ClassDesc; flags 1
 method name parameterCount descriptor ()I flags 1
@@ -994,6 +1117,7 @@ method name changeReturnType descriptor (Ljava/lang/invoke/TypeDescriptor$OfFiel
 method name parameterArray descriptor ()[Ljava/lang/invoke/TypeDescriptor$OfField; flags 1041
 method name returnType descriptor ()Ljava/lang/invoke/TypeDescriptor$OfField; flags 1041
 method name parameterType descriptor (I)Ljava/lang/invoke/TypeDescriptor$OfField; flags 1041 methodParameters 1000:null
+method name ofValidated descriptor (Ljava/lang/constant/ClassDesc;[Ljava/lang/constant/ClassDesc;)Ljdk/internal/constant/MethodTypeDescImpl; flags 89
 
 class name jdk/internal/constant/ModuleDescImpl
 header extends java/lang/Record implements java/lang/constant/ModuleDesc record true flags 31
diff --git a/src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt b/src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt
index 38cfc456f03..577ff91c7ca 100644
--- a/src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt
+++ b/src/jdk.compiler/share/data/symbols/java.desktop-N.sym.txt
@@ -26,6 +26,9 @@
 # ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
 # ##########################################################
 #
+module name java.desktop
+header exports java/applet,java/awt,java/awt/color,java/awt/desktop,java/awt/dnd,java/awt/event,java/awt/font,java/awt/geom,java/awt/im,java/awt/im/spi,java/awt/image,java/awt/image/renderable,java/awt/print,java/beans,java/beans/beancontext,javax/accessibility,javax/imageio,javax/imageio/event,javax/imageio/metadata,javax/imageio/plugins/bmp,javax/imageio/plugins/jpeg,javax/imageio/plugins/tiff,javax/imageio/spi,javax/imageio/stream,javax/print,javax/print/attribute,javax/print/attribute/standard,javax/print/event,javax/sound/midi,javax/sound/midi/spi,javax/sound/sampled,javax/sound/sampled/spi,javax/swing,javax/swing/border,javax/swing/colorchooser,javax/swing/event,javax/swing/filechooser,javax/swing/plaf,javax/swing/plaf/basic,javax/swing/plaf/metal,javax/swing/plaf/multi,javax/swing/plaf/nimbus,javax/swing/plaf/synth,javax/swing/table,javax/swing/text,javax/swing/text/html,javax/swing/text/html/parser,javax/swing/text/rtf,javax/swing/tree,javax/swing/undo extraModulePackages sun/print requires name\u0020;java.base\u0020;flags\u0020;8000,name\u0020;java.prefs\u0020;flags\u0020;0,name\u0020;java.datatransfer\u0020;flags\u0020;20,name\u0020;java.xml\u0020;flags\u0020;20 uses java/awt/im/spi/InputMethodDescriptor,javax/accessibility/AccessibilityProvider,javax/imageio/spi/ImageInputStreamSpi,javax/imageio/spi/ImageOutputStreamSpi,javax/imageio/spi/ImageReaderSpi,javax/imageio/spi/ImageTranscoderSpi,javax/imageio/spi/ImageWriterSpi,javax/print/PrintServiceLookup,javax/print/StreamPrintServiceFactory,javax/sound/midi/spi/MidiDeviceProvider,javax/sound/midi/spi/MidiFileReader,javax/sound/midi/spi/MidiFileWriter,javax/sound/midi/spi/SoundbankReader,javax/sound/sampled/spi/AudioFileReader,javax/sound/sampled/spi/AudioFileWriter,javax/sound/sampled/spi/FormatConversionProvider,javax/sound/sampled/spi/MixerProvider,sun/swing/InteropProvider provides interface\u0020;sun/datatransfer/DesktopDatatransferService\u0020;impls\u0020;sun/awt/datatransfer/DesktopDatatransferServiceImpl,interface\u0020;java/net/ContentHandlerFactory\u0020;impls\u0020;sun/awt/www/content/MultimediaContentHandlers,interface\u0020;javax/print/PrintServiceLookup\u0020;impls\u0020;sun/print/PrintServiceLookupProvider,interface\u0020;javax/print/StreamPrintServiceFactory\u0020;impls\u0020;sun/print/PSStreamPrinterFactory,interface\u0020;javax/sound/midi/spi/MidiDeviceProvider\u0020;impls\u0020;com/sun/media/sound/MidiInDeviceProvider\u005C;u002C;com/sun/media/sound/MidiOutDeviceProvider\u005C;u002C;com/sun/media/sound/RealTimeSequencerProvider\u005C;u002C;com/sun/media/sound/SoftProvider,interface\u0020;javax/sound/midi/spi/MidiFileReader\u0020;impls\u0020;com/sun/media/sound/StandardMidiFileReader,interface\u0020;javax/sound/midi/spi/MidiFileWriter\u0020;impls\u0020;com/sun/media/sound/StandardMidiFileWriter,interface\u0020;javax/sound/midi/spi/SoundbankReader\u0020;impls\u0020;com/sun/media/sound/AudioFileSoundbankReader\u005C;u002C;com/sun/media/sound/DLSSoundbankReader\u005C;u002C;com/sun/media/sound/JARSoundbankReader\u005C;u002C;com/sun/media/sound/SF2SoundbankReader,interface\u0020;javax/sound/sampled/spi/AudioFileReader\u0020;impls\u0020;com/sun/media/sound/AiffFileReader\u005C;u002C;com/sun/media/sound/AuFileReader\u005C;u002C;com/sun/media/sound/SoftMidiAudioFileReader\u005C;u002C;com/sun/media/sound/WaveFileReader\u005C;u002C;com/sun/media/sound/WaveFloatFileReader\u005C;u002C;com/sun/media/sound/WaveExtensibleFileReader,interface\u0020;javax/sound/sampled/spi/AudioFileWriter\u0020;impls\u0020;com/sun/media/sound/AiffFileWriter\u005C;u002C;com/sun/media/sound/AuFileWriter\u005C;u002C;com/sun/media/sound/WaveFileWriter\u005C;u002C;com/sun/media/sound/WaveFloatFileWriter,interface\u0020;javax/sound/sampled/spi/FormatConversionProvider\u0020;impls\u0020;com/sun/media/sound/AlawCodec\u005C;u002C;com/sun/media/sound/AudioFloatFormatConverter\u005C;u002C;com/sun/media/sound/PCMtoPCMCodec\u005C;u002C;com/sun/media/sound/UlawCodec,interface\u0020;javax/sound/sampled/spi/MixerProvider\u0020;impls\u0020;com/sun/media/sound/DirectAudioDeviceProvider\u005C;u002C;com/sun/media/sound/PortMixerProvider target linux-amd64 flags 8000
+
 class name java/beans/Beans
 -method name instantiate descriptor (Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/beans/beancontext/BeanContext;)Ljava/lang/Object;
 method name instantiate descriptor (Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/beans/beancontext/BeanContext;)Ljava/lang/Object; thrownTypes java/io/IOException,java/lang/ClassNotFoundException flags 9 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="23")
@@ -93,10 +96,43 @@ innerclass innerClass java/beans/beancontext/BeanContextSupport$BCSIterator oute
 innerclass innerClass java/beans/beancontext/BeanContextSupport$BCSChild outerClass java/beans/beancontext/BeanContextSupport innerClassName BCSChild flags 4
 innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
 
+class name javax/print/attribute/standard/OutputBin
+header extends javax/print/attribute/EnumSyntax implements javax/print/attribute/PrintRequestAttribute,javax/print/attribute/PrintJobAttribute sealed true permittedSubclasses sun/print/CustomOutputBin flags 21
+field name TOP descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name MIDDLE descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name BOTTOM descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name SIDE descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name LEFT descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name RIGHT descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name CENTER descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name REAR descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name FACE_UP descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name FACE_DOWN descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+field name LARGE_CAPACITY descriptor Ljavax/print/attribute/standard/OutputBin; flags 19
+method name <init> descriptor (I)V flags 4
+method name getStringTable descriptor ()[Ljava/lang/String; flags 4
+method name getEnumValueTable descriptor ()[Ljavax/print/attribute/EnumSyntax; flags 4
+method name getCategory descriptor ()Ljava/lang/Class; flags 11 signature ()Ljava/lang/Class<+Ljavax/print/attribute/Attribute;>;
+method name getName descriptor ()Ljava/lang/String; flags 11
+
 class name javax/swing/JScrollBar
 method name setMinimumSize descriptor (Ljava/awt/Dimension;)V flags 1
 method name setMaximumSize descriptor (Ljava/awt/Dimension;)V flags 1
 
+class name javax/swing/plaf/basic/BasicSliderUI
+-method name <init> descriptor ()V
+method name <init> descriptor ()V flags 1 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="23")
+
 class name javax/swing/plaf/synth/SynthTreeUI
 method name getCollapsedIcon descriptor ()Ljavax/swing/Icon; flags 1
 
+class name sun/print/CustomOutputBin
+header extends javax/print/attribute/standard/OutputBin flags 31
+method name createOutputBin descriptor (Ljava/lang/String;Ljava/lang/String;)Lsun/print/CustomOutputBin; flags 29
+method name getChoiceName descriptor ()Ljava/lang/String; flags 1
+method name getSuperEnumTable descriptor ()[Ljavax/print/attribute/standard/OutputBin; flags 1
+method name getStringTable descriptor ()[Ljava/lang/String; flags 4
+method name getCustomName descriptor ()Ljava/lang/String; flags 1
+method name getEnumValueTable descriptor ()[Lsun/print/CustomOutputBin; flags 4
+method name getEnumValueTable descriptor ()[Ljavax/print/attribute/EnumSyntax; flags 1044
+
diff --git a/src/jdk.compiler/share/data/symbols/jdk.jshell-N.sym.txt b/src/jdk.compiler/share/data/symbols/jdk.jshell-N.sym.txt
index 5bbe0692944..da0509ee6c0 100644
--- a/src/jdk.compiler/share/data/symbols/jdk.jshell-N.sym.txt
+++ b/src/jdk.compiler/share/data/symbols/jdk.jshell-N.sym.txt
@@ -26,6 +26,9 @@
 # ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
 # ##########################################################
 #
+module name jdk.jshell
+header exports jdk/jshell,jdk/jshell/execution,jdk/jshell/spi,jdk/jshell/tool requires name\u0020;java.base\u0020;flags\u0020;8000,name\u0020;java.logging\u0020;flags\u0020;0,name\u0020;jdk.compiler\u0020;flags\u0020;0,name\u0020;jdk.internal.ed\u0020;flags\u0020;0,name\u0020;jdk.internal.le\u0020;flags\u0020;0,name\u0020;jdk.internal.md\u0020;flags\u0020;0,name\u0020;jdk.internal.opt\u0020;flags\u0020;0,name\u0020;java.compiler\u0020;flags\u0020;20,name\u0020;java.prefs\u0020;flags\u0020;20,name\u0020;jdk.jdi\u0020;flags\u0020;20 uses jdk/jshell/spi/ExecutionControlProvider,jdk/internal/editor/spi/BuildInEditorProvider provides interface\u0020;javax/tools/Tool\u0020;impls\u0020;jdk/internal/jshell/tool/JShellToolProvider,interface\u0020;jdk/jshell/spi/ExecutionControlProvider\u0020;impls\u0020;jdk/jshell/execution/JdiExecutionControlProvider\u005C;u002C;jdk/jshell/execution/LocalExecutionControlProvider\u005C;u002C;jdk/jshell/execution/FailOverExecutionControlProvider,interface\u0020;jdk/internal/io/JdkConsoleProvider\u0020;impls\u0020;jdk/jshell/execution/impl/ConsoleImpl$ConsoleProviderImpl target linux-amd64 moduleMainClass jdk/internal/jshell/tool/JShellToolProvider flags 8000 classAnnotations @Ljdk/internal/javac/ParticipatesInPreview;
+
 class name jdk/jshell/Snippet$SubKind
 field name MODULE_IMPORT_SUBKIND descriptor Ljdk/jshell/Snippet$SubKind; flags 4019 classAnnotations @Ljdk/internal/javac/PreviewFeature;(feature=eLjdk/internal/javac/PreviewFeature$Feature;MODULE_IMPORTS;,reflective=Ztrue)
 
diff --git a/src/jdk.compiler/share/man/javac.1 b/src/jdk.compiler/share/man/javac.1
index de374e7d0c7..ebee0369238 100644
--- a/src/jdk.compiler/share/man/javac.1
+++ b/src/jdk.compiler/share/man/javac.1
@@ -1,4 +1,4 @@
-.\" Copyright (c) 1994, 2024, Oracle and/or its affiliates. All rights reserved.
+.\" Copyright (c) 1994, 2023, 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
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JAVAC" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JAVAC" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.compiler/share/man/serialver.1 b/src/jdk.compiler/share/man/serialver.1
index cd437b7e9bf..bad14872ee6 100644
--- a/src/jdk.compiler/share/man/serialver.1
+++ b/src/jdk.compiler/share/man/serialver.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "SERIALVER" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "SERIALVER" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Config.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Config.java
index 20726bb8d47..18ccda542a0 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Config.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Config.java
@@ -164,6 +164,11 @@ public List<String> run() {
     // Secmod.Module.getProvider() method.
     private String functionList = null;
 
+    // CTS mode variant used by the token, as described in Addendum to NIST
+    // Special Publication 800-38A, "Recommendation for Block Cipher Modes
+    // of Operation: Three Variants of Ciphertext Stealing for CBC Mode".
+    private Token.CTSVariant ctsVariant = null;
+
     // whether to use NSS secmod mode. Implicitly set if nssLibraryDirectory,
     // nssSecmodDirectory, or nssModule is specified.
     private boolean nssUseSecmod;
@@ -321,6 +326,10 @@ String getFunctionList() {
         return functionList;
     }
 
+    Token.CTSVariant getCTSVariant() {
+        return ctsVariant;
+    }
+
     boolean getNssUseSecmod() {
         return nssUseSecmod;
     }
@@ -472,6 +481,8 @@ private void parse() throws IOException {
                 allowSingleThreadedModules = parseBooleanEntry(st.sval);
             case "functionList"->
                 functionList = parseStringEntry(st.sval);
+            case "cipherTextStealingVariant"->
+                ctsVariant = parseEnumEntry(Token.CTSVariant.class, st.sval);
             case "nssUseSecmod"->
                 nssUseSecmod = parseBooleanEntry(st.sval);
             case "nssLibraryDirectory"-> {
@@ -627,6 +638,17 @@ private int parseIntegerEntry(String keyword) throws IOException {
         return value;
     }
 
+    private <E extends Enum<E>> E parseEnumEntry(Class<E> enumClass,
+            String keyword) throws IOException {
+        String value = parseStringEntry(keyword);
+        try {
+            return Enum.valueOf(enumClass, value);
+        } catch (IllegalArgumentException ignored) {
+            throw excToken(keyword + " must be one of " +
+                    Arrays.toString(enumClass.getEnumConstants()) + ", read:");
+        }
+    }
+
     private boolean parseBoolean() throws IOException {
         String val = parseWord();
         return switch (val) {
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java
index c65c2185a3e..faf1aa9237f 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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,7 +46,7 @@
  * Cipher implementation class. This class currently supports
  * DES, DESede, AES, ARCFOUR, and Blowfish.
  *
- * This class is designed to support ECB, CBC, CTR with NoPadding
+ * This class is designed to support ECB, CBC, CTR, CTS with NoPadding
  * and ECB, CBC with PKCS5Padding. It will use its own padding impl
  * if the native mechanism does not support padding.
  *
@@ -60,17 +60,9 @@ final class P11Cipher extends CipherSpi {
 
     private static final JavaNioAccess NIO_ACCESS = SharedSecrets.getJavaNioAccess();
 
-    // mode constant for ECB mode
-    private static final int MODE_ECB = 3;
-    // mode constant for CBC mode
-    private static final int MODE_CBC = 4;
-    // mode constant for CTR mode
-    private static final int MODE_CTR = 5;
-
-    // padding constant for NoPadding
-    private static final int PAD_NONE = 5;
-    // padding constant for PKCS5Padding
-    private static final int PAD_PKCS5 = 6;
+    // mode and padding constants
+    private enum Mode {ECB /* or stream ciphers */, CBC, CTR, CTS}
+    private enum Pad {NONE, PKCS5}
 
     private static interface Padding {
         // ENC: format the specified buffer with padding bytes and return the
@@ -146,14 +138,14 @@ public int unpad(byte[] paddedData, int len)
     // flag indicating encrypt or decrypt mode
     private boolean encrypt;
 
-    // mode, one of MODE_* above (MODE_ECB for stream ciphers)
-    private int blockMode;
+    // mode, Mode.ECB for stream ciphers
+    private final Mode blockMode;
 
     // block size, 0 for stream ciphers
     private final int blockSize;
 
-    // padding type, on of PAD_* above (PAD_NONE for stream ciphers)
-    private int paddingType;
+    // padding type, Pad.NONE for stream ciphers
+    private Pad paddingType;
 
     // when the padding is requested but unsupported by the native mechanism,
     // we use the following to do padding and necessary data buffering.
@@ -163,7 +155,7 @@ public int unpad(byte[] paddedData, int len)
     private byte[] padBuffer;
     private int padBufferLen;
 
-    // original IV, if in MODE_CBC or MODE_CTR
+    // original IV, if in Mode.CBC, Mode.CTR or Mode.CTS
     private byte[] iv;
 
     // number of bytes buffered internally by the native mechanism and padBuffer
@@ -208,8 +200,7 @@ public int unpad(byte[] paddedData, int len)
                 blockSize = 8;
             }
         }
-        this.blockMode =
-            (algoParts.length > 1 ? parseMode(algoParts[1]) : MODE_ECB);
+        blockMode = algoParts.length > 1 ? parseMode(algoParts[1]) : Mode.ECB;
         String defPadding = (blockSize == 0 ? "NoPadding" : "PKCS5Padding");
         String paddingStr =
                 (algoParts.length > 2 ? algoParts[2] : defPadding);
@@ -227,20 +218,19 @@ protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
         throw new NoSuchAlgorithmException("Unsupported mode " + mode);
     }
 
-    private int parseMode(String mode) throws NoSuchAlgorithmException {
+    private Mode parseMode(String mode) throws NoSuchAlgorithmException {
         mode = mode.toUpperCase(Locale.ENGLISH);
-        return switch (mode) {
-            case "ECB" -> MODE_ECB;
-            case "CBC" -> {
-                if (blockSize == 0) {
-                    throw new NoSuchAlgorithmException
-                            ("CBC mode not supported with stream ciphers");
-                }
-                yield MODE_CBC;
-            }
-            case "CTR" -> MODE_CTR;
-            default -> throw new NoSuchAlgorithmException("Unsupported mode " + mode);
-        };
+        Mode result;
+        try {
+            result = Mode.valueOf(mode);
+        } catch (IllegalArgumentException ignored) {
+            throw new NoSuchAlgorithmException("Unsupported mode " + mode);
+        }
+        if (blockSize == 0 && result != Mode.ECB) {
+            throw new NoSuchAlgorithmException(
+                    result + " mode not supported with stream ciphers");
+        }
+        return result;
     }
 
     // see JCE spec
@@ -250,13 +240,22 @@ protected void engineSetPadding(String padding)
         padBuffer = null;
         padding = padding.toUpperCase(Locale.ENGLISH);
         if (padding.equals("NOPADDING")) {
-            paddingType = PAD_NONE;
+            paddingType = Pad.NONE;
+            if (blockMode == Mode.CTS) {
+                // Buffer at least two blocks (where the last one may be
+                // partial). When using NSS, buffer one more block to avoid
+                // NSS Bug 1823875: "AES CTS decryption does not update
+                // its own context's IV on full blocks input"
+                // https://bugzilla.mozilla.org/show_bug.cgi?id=1823875#c2
+                int bufferedBlocks = P11Util.isNSS(token) ? 3 : 2;
+                padBuffer = new byte[bufferedBlocks * blockSize];
+            }
         } else if (padding.equals("PKCS5PADDING")) {
-            if (this.blockMode == MODE_CTR) {
-                throw new NoSuchPaddingException
-                    ("PKCS#5 padding not supported with CTR mode");
+            if (blockMode == Mode.CTR || blockMode == Mode.CTS) {
+                throw new NoSuchPaddingException("PKCS#5 padding not " +
+                        "supported with " + blockMode + " mode");
             }
-            paddingType = PAD_PKCS5;
+            paddingType = Pad.PKCS5;
             if (mechanism != CKM_DES_CBC_PAD && mechanism != CKM_DES3_CBC_PAD &&
                     mechanism != CKM_AES_CBC_PAD) {
                 // no native padding support; use our own padding impl
@@ -371,7 +370,7 @@ private void implInit(int opmode, Key key, byte[] iv,
                 // should never happen; checked by Cipher.init()
                     throw new AssertionError("Unknown mode: " + opmode);
         };
-        if (blockMode == MODE_ECB) { // ECB or stream cipher
+        if (blockMode == Mode.ECB) { // ECB or stream cipher
             if (iv != null) {
                 if (blockSize == 0) {
                     throw new InvalidAlgorithmParameterException
@@ -381,14 +380,12 @@ private void implInit(int opmode, Key key, byte[] iv,
                             ("IV not used in ECB mode");
                 }
             }
-        } else { // MODE_CBC or MODE_CTR
+        } else { // Mode.CBC, Mode.CTR or Mode.CTS
             if (iv == null) {
                 if (!encrypt) {
-                    String exMsg =
-                        (blockMode == MODE_CBC ?
-                         "IV must be specified for decryption in CBC mode" :
-                         "IV must be specified for decryption in CTR mode");
-                    throw new InvalidAlgorithmParameterException(exMsg);
+                    throw new InvalidAlgorithmParameterException(
+                            "IV must be specified for decryption in " +
+                            blockMode + " mode");
                 }
                 // generate random IV
                 if (random == null) {
@@ -433,6 +430,9 @@ private void reset(boolean doCancel) {
             session = token.releaseSession(session);
             bytesBuffered = 0;
             padBufferLen = 0;
+            if (padBuffer != null) {
+                Arrays.fill(padBuffer, (byte) 0);
+            }
         }
     }
 
@@ -487,7 +487,7 @@ private void initialize() throws PKCS11Exception {
             if (session == null) {
                 session = token.getOpSession();
             }
-            CK_MECHANISM mechParams = (blockMode == MODE_CTR ?
+            CK_MECHANISM mechParams = (blockMode == Mode.CTR ?
                     new CK_MECHANISM(mechanism, new CK_AES_CTR_PARAMS(iv)) :
                     new CK_MECHANISM(mechanism, iv));
             if (encrypt) {
@@ -512,7 +512,9 @@ private int updateLength(int inLen) {
         }
 
         int result = inLen + bytesBuffered;
-        if (blockSize != 0 && blockMode != MODE_CTR) {
+        if (blockMode == Mode.CTS) {
+            result -= getCTSMustBeBuffered(result);
+        } else if (blockSize != 0 && blockMode != Mode.CTR) {
             // minus the number of bytes in the last incomplete block.
             result -= (result & (blockSize - 1));
         }
@@ -526,7 +528,7 @@ private int doFinalLength(int inLen) {
         }
 
         int result = inLen + bytesBuffered;
-        if (blockSize != 0 && encrypt && paddingType != PAD_NONE) {
+        if (blockSize != 0 && encrypt && paddingType != Pad.NONE) {
             // add the number of bytes to make the last block complete.
             result += (blockSize - (result & (blockSize - 1)));
         }
@@ -604,7 +606,56 @@ private int implUpdate(byte[] in, int inOfs, int inLen,
             ensureInitialized();
             int k = 0;
             int newPadBufferLen = 0;
-            if (paddingObj != null && (!encrypt || reqBlockUpdates)) {
+            if (blockMode == Mode.CTS) {
+                // decide how to split the total data (totalInLen) between
+                // the token (dataForP11Update) and padBuffer
+                // (newPadBufferLen)
+                int totalInLen = padBufferLen + inLen;
+                newPadBufferLen = getCTSMustBeBuffered(totalInLen);
+                int dataForP11Update = totalInLen - newPadBufferLen;
+                if (dataForP11Update > 0 && padBufferLen > 0) {
+                    // there is data for the token and part of it is in
+                    // padBuffer
+                    int flushFromPadBuffer;
+                    int fillLen = getBytesToCompleteBlock(padBufferLen);
+                    if (dataForP11Update >= padBufferLen + fillLen) {
+                        // flush the whole padBuffer
+                        if (fillLen > 0) {
+                            // complete the last padBuffer block from the
+                            // input
+                            bufferInputBytes(in, inOfs, fillLen);
+                            inOfs += fillLen;
+                            inLen -= fillLen;
+                        }
+                        flushFromPadBuffer = padBufferLen;
+                    } else {
+                        // There is not enough input data available to
+                        // complete the padBuffer to a multiple of block
+                        // size. Flush part of the padBuffer (up to a
+                        // multiple of blockSize) now. Shift the remaining
+                        // padBuffer data and buffer more up to completing
+                        // newPadBufferLen later.
+                        flushFromPadBuffer = dataForP11Update;
+                    }
+                    if (encrypt) {
+                        k = token.p11.C_EncryptUpdate(session.id(),
+                                0, padBuffer, 0, flushFromPadBuffer,
+                                0, out, outOfs, outLen);
+                    } else {
+                        k = token.p11.C_DecryptUpdate(session.id(),
+                                0, padBuffer, 0, flushFromPadBuffer,
+                                0, out, outOfs, outLen);
+                    }
+                    padBufferLen -= flushFromPadBuffer;
+                    if (padBufferLen > 0) {
+                        // shift remaining data to the padBuffer start
+                        System.arraycopy(padBuffer, flushFromPadBuffer,
+                                padBuffer, 0, padBufferLen);
+                    }
+                }
+                newPadBufferLen -= padBufferLen;
+                inLen -= newPadBufferLen;
+            } else if (paddingObj != null && (!encrypt || reqBlockUpdates)) {
                 if (padBufferLen != 0) {
                     if (padBufferLen != padBuffer.length) {
                         int bufCapacity = padBuffer.length - padBufferLen;
@@ -649,7 +700,8 @@ private int implUpdate(byte[] in, int inOfs, int inLen,
                 }
             }
             // update 'padBuffer' if using our own padding impl.
-            if (paddingObj != null && newPadBufferLen > 0) {
+            if ((blockMode == Mode.CTS || paddingObj != null) &&
+                    newPadBufferLen > 0) {
                 bufferInputBytes(in, inOfs + inLen, newPadBufferLen);
             }
             bytesBuffered += (inLen - k);
@@ -715,7 +767,56 @@ private int implUpdate(ByteBuffer inBuffer, ByteBuffer outBuffer)
 
                 int k = 0;
                 int newPadBufferLen = 0;
-                if (paddingObj != null && (!encrypt || reqBlockUpdates)) {
+                if (blockMode == Mode.CTS) {
+                    // decide how to split the total data (totalInLen) between
+                    // the token (dataForP11Update) and padBuffer
+                    // (newPadBufferLen)
+                    int totalInLen = padBufferLen + inLen;
+                    newPadBufferLen = getCTSMustBeBuffered(totalInLen);
+                    int dataForP11Update = totalInLen - newPadBufferLen;
+                    if (dataForP11Update > 0 && padBufferLen > 0) {
+                        // there is data for the token and part of it is in
+                        // padBuffer
+                        int flushFromPadBuffer;
+                        int fillLen = getBytesToCompleteBlock(padBufferLen);
+                        if (dataForP11Update >= padBufferLen + fillLen) {
+                            // flush the whole padBuffer
+                            if (fillLen > 0) {
+                                // complete the last padBuffer block from the
+                                // input
+                                bufferInputBytes(inBuffer, fillLen);
+                                inOfs += fillLen;
+                                inLen -= fillLen;
+                            }
+                            flushFromPadBuffer = padBufferLen;
+                        } else {
+                            // There is not enough input data available to
+                            // complete the padBuffer to a multiple of block
+                            // size. Flush part of the padBuffer (up to a
+                            // multiple of blockSize) now. Shift the remaining
+                            // padBuffer data and buffer more up to completing
+                            // newPadBufferLen later.
+                            flushFromPadBuffer = dataForP11Update;
+                        }
+                        if (encrypt) {
+                            k = token.p11.C_EncryptUpdate(session.id(),
+                                    0, padBuffer, 0, flushFromPadBuffer,
+                                    outAddr, outArray, outOfs, outLen);
+                        } else {
+                            k = token.p11.C_DecryptUpdate(session.id(),
+                                    0, padBuffer, 0, flushFromPadBuffer,
+                                    outAddr, outArray, outOfs, outLen);
+                        }
+                        padBufferLen -= flushFromPadBuffer;
+                        if (padBufferLen > 0) {
+                            // shift remaining data to the padBuffer start
+                            System.arraycopy(padBuffer, flushFromPadBuffer,
+                                    padBuffer, 0, padBufferLen);
+                        }
+                    }
+                    newPadBufferLen -= padBufferLen;
+                    inLen -= newPadBufferLen;
+                } else if (paddingObj != null && (!encrypt || reqBlockUpdates)) {
                     if (padBufferLen != 0) {
                         if (padBufferLen != padBuffer.length) {
                             int bufCapacity = padBuffer.length - padBufferLen;
@@ -768,7 +869,8 @@ private int implUpdate(ByteBuffer inBuffer, ByteBuffer outBuffer)
                     }
                 }
                 // update 'padBuffer' if using our own padding impl.
-                if (paddingObj != null && newPadBufferLen > 0) {
+                if ((blockMode == Mode.CTS || paddingObj != null) &&
+                        newPadBufferLen > 0) {
                     bufferInputBytes(inBuffer, newPadBufferLen);
                 }
                 bytesBuffered += (inLen - k);
@@ -830,6 +932,10 @@ private int implDoFinal(byte[] out, int outOfs, int outLen)
                     k += token.p11.C_EncryptUpdate(session.id(),
                             0, padBuffer, 0, startOff + actualPadLen,
                             0, out, outOfs + k, outLen - k);
+                } else if (blockMode == Mode.CTS) {
+                    k = token.p11.C_EncryptUpdate(session.id(),
+                            0, padBuffer, 0, padBufferLen,
+                            0, out, outOfs, outLen);
                 }
                 // Some implementations such as the NSS Software Token do not
                 // cancel the operation upon a C_EncryptUpdate failure (as
@@ -839,6 +945,9 @@ private int implDoFinal(byte[] out, int outOfs, int outLen)
                 doCancel = false;
                 k += token.p11.C_EncryptFinal(session.id(),
                         0, out, (outOfs + k), (outLen - k));
+                if (blockMode == Mode.CTS) {
+                    convertCTSVariant(null, out, outOfs + k);
+                }
             } else {
                 // Special handling to match SunJCE provider behavior
                 if (bytesBuffered == 0 && padBufferLen == 0) {
@@ -863,8 +972,16 @@ private int implDoFinal(byte[] out, int outOfs, int outLen)
                     k -= actualPadLen;
                     System.arraycopy(padBuffer, 0, out, outOfs, k);
                 } else {
+                    if (blockMode == Mode.CTS) {
+                        convertCTSVariant(null, padBuffer, padBufferLen);
+                        k = token.p11.C_DecryptUpdate(session.id(),
+                                0, padBuffer, 0, padBufferLen,
+                                0, out, outOfs, outLen);
+                        outOfs += k;
+                        outLen -= k;
+                    }
                     doCancel = false;
-                    k = token.p11.C_DecryptFinal(session.id(), 0, out, outOfs,
+                    k += token.p11.C_DecryptFinal(session.id(), 0, out, outOfs,
                             outLen);
                 }
             }
@@ -928,6 +1045,10 @@ private int implDoFinal(ByteBuffer outBuffer)
                         k += token.p11.C_EncryptUpdate(session.id(),
                                 0, padBuffer, 0, startOff + actualPadLen,
                                 outAddr, outArray, outOfs + k, outLen - k);
+                    } else if (blockMode == Mode.CTS) {
+                       k = token.p11.C_EncryptUpdate(session.id(),
+                                0, padBuffer, 0, padBufferLen,
+                                outAddr, outArray, outOfs, outLen);
                     }
                     // Some implementations such as the NSS Software Token do not
                     // cancel the operation upon a C_EncryptUpdate failure (as
@@ -937,12 +1058,14 @@ private int implDoFinal(ByteBuffer outBuffer)
                     doCancel = false;
                     k += token.p11.C_EncryptFinal(session.id(),
                             outAddr, outArray, (outOfs + k), (outLen - k));
+                    if (blockMode == Mode.CTS) {
+                        convertCTSVariant(outBuffer, outArray, outOfs + k);
+                    }
                 } else {
                     // Special handling to match SunJCE provider behavior
                     if (bytesBuffered == 0 && padBufferLen == 0) {
                         return 0;
                     }
-
                     if (paddingObj != null) {
                         if (padBufferLen != 0) {
                             k = token.p11.C_DecryptUpdate(session.id(),
@@ -964,8 +1087,16 @@ private int implDoFinal(ByteBuffer outBuffer)
                         outArray = padBuffer;
                         outOfs = 0;
                     } else {
+                        if (blockMode == Mode.CTS) {
+                            convertCTSVariant(null, padBuffer, padBufferLen);
+                            k = token.p11.C_DecryptUpdate(session.id(),
+                                    0, padBuffer, 0, padBufferLen,
+                                    outAddr, outArray, outOfs, outLen);
+                            outOfs += k;
+                            outLen -= k;
+                        }
                         doCancel = false;
-                        k = token.p11.C_DecryptFinal(session.id(),
+                        k += token.p11.C_DecryptFinal(session.id(),
                                 outAddr, outArray, outOfs, outLen);
                     }
                 }
@@ -988,6 +1119,83 @@ private int implDoFinal(ByteBuffer outBuffer)
         }
     }
 
+    private int getBytesToCompleteBlock(int availableBytes) {
+        int partBlock = availableBytes & (blockSize - 1);
+        return partBlock == 0 ? 0 : blockSize - partBlock;
+    }
+
+    private int getCTSMustBeBuffered(int availableBytes) {
+        return Math.min(availableBytes,
+                padBuffer.length - getBytesToCompleteBlock(availableBytes));
+    }
+
+    /**
+     * The ciphertext ordering for the three variants can be depicted as
+     * follows, where 'p' is the penultimate block (which may be partial
+     * or full), and 'f' the full final block:
+     *
+     *                    'p' is a partial block   'p' is a full block
+     *                   ------------------------ ---------------------
+     *   CS1 (NIST)     |     .... pp ffff       |    .... pppp ffff
+     *   CS2 (Schneier) |     .... ffff pp       |    .... pppp ffff
+     *   CS3 (Kerberos) |     .... ffff pp       |    .... ffff pppp
+     *
+     * After encryption, we get the ciphertext from the token formatted as
+     * specified in the SunPKCS11 'cipherTextStealingVariant' configuration
+     * property. Conversely, before decryption, the ciphertext has to be passed
+     * to the token according to the previous formatting. This method converts
+     * the ciphertext between the format used by the token and the one used by
+     * SunJCE's "AES/CTS/NoPadding" implementation (CS3 as described by RFC
+     * 2040, section 8).
+     */
+    private void convertCTSVariant(ByteBuffer ciphertextBuf,
+            byte[] ciphertextArr, int ciphertextEnd) {
+        if (padBufferLen == blockSize) {
+            // No reordering needed for a single block
+            return;
+        }
+        assert token.ctsVariant != null : "CTS algorithms should not be " +
+                "registered if the CTS variant of the token is unknown";
+        if (token.ctsVariant == Token.CTSVariant.CS3) {
+            // Already CS3
+            return;
+        }
+        int pad = padBufferLen % blockSize;
+        if (token.ctsVariant == Token.CTSVariant.CS2 && pad != 0) {
+            // CS2 and 'p' is a partial block, equal to CS3
+            return;
+        }
+        if (ciphertextArr != null) {
+            ciphertextBuf = ByteBuffer.wrap(ciphertextArr);
+        }
+        if (ciphertextBuf != null) {
+            // No assumptions should be made about the current ciphertextBuf
+            // position. Additionally, if ciphertextBuf was not created here,
+            // the position should not be altered. To ensure this, use offsets
+            // to read and write bytes from the last two blocks (i.e. absolute
+            // ByteBuffer operations). Other blocks should not be modified.
+            pad = pad == 0 ? blockSize : pad;
+            if (encrypt) {
+                // .... pp[pp] ffff -> .... ffff pp[pp]
+                swapLastTwoBlocks(ciphertextBuf, ciphertextEnd, pad, blockSize);
+            } else {
+                // .... ffff pp[pp] -> .... pp[pp] ffff
+                swapLastTwoBlocks(ciphertextBuf, ciphertextEnd, blockSize, pad);
+            }
+        }
+    }
+
+    private static void swapLastTwoBlocks(ByteBuffer ciphertextBuf,
+            int ciphertextEnd, int prevBlockLen, int lastBlockLen) {
+        // .... prevBlock lastBlock -> .... lastBlock prevBlock
+        int prevBlockStart = ciphertextEnd - prevBlockLen - lastBlockLen;
+        byte[] prevBlockBackup = new byte[prevBlockLen];
+        ciphertextBuf.get(prevBlockStart, prevBlockBackup);
+        ciphertextBuf.put(prevBlockStart, ciphertextBuf,
+                ciphertextEnd - lastBlockLen, lastBlockLen);
+        ciphertextBuf.put(ciphertextEnd - prevBlockLen, prevBlockBackup);
+    }
+
     private void handleException(PKCS11Exception e)
             throws ShortBufferException, IllegalBlockSizeException {
         if (e.match(CKR_BUFFER_TOO_SMALL)) {
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java
index 07aaa1037ea..4d10584fa09 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java
@@ -860,6 +860,15 @@ private static void register(Descriptor d) {
         dA(CIP, "AES_256/KWP/NoPadding",        P11KeyWrapCipher,
                 m(CKM_AES_KEY_WRAP_KWP));
 
+        d(CIP, "AES/CTS/NoPadding",             P11Cipher,
+                m(CKM_AES_CTS));
+        d(CIP, "AES_128/CTS/NoPadding",         P11Cipher,
+                m(CKM_AES_CTS));
+        d(CIP, "AES_192/CTS/NoPadding",         P11Cipher,
+                m(CKM_AES_CTS));
+        d(CIP, "AES_256/CTS/NoPadding",         P11Cipher,
+                m(CKM_AES_CTS));
+
         d(CIP, "AES/GCM/NoPadding",             P11AEADCipher,
                 m(CKM_AES_GCM));
         dA(CIP, "AES_128/GCM/NoPadding",        P11AEADCipher,
@@ -1290,7 +1299,13 @@ private void initToken(CK_SLOT_INFO slotInfo) throws PKCS11Exception {
                 }
                 continue;
             }
-
+            if (longMech == CKM_AES_CTS && token.ctsVariant == null) {
+                if (showInfo) {
+                    System.out.println("DISABLED due to an unspecified " +
+                            "cipherTextStealingVariant in configuration");
+                }
+                continue;
+            }
             if (brokenMechanisms.contains(longMech)) {
                 if (showInfo) {
                     System.out.println("DISABLED due to known issue with NSS");
diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Token.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Token.java
index a6f5f0a8764..b9937b7f0b1 100644
--- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Token.java
+++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/Token.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -47,6 +47,7 @@
  * @since   1.5
  */
 final class Token implements Serializable {
+    public enum CTSVariant {CS1, CS2, CS3}
 
     // need to be serializable to allow SecureRandom to be serialized
     @Serial
@@ -65,6 +66,8 @@ final class Token implements Serializable {
     @SuppressWarnings("serial") // Type of field is not Serializable
     final Config config;
 
+    final transient CTSVariant ctsVariant;
+
     @SuppressWarnings("serial") // Type of field is not Serializable
     final CK_TOKEN_INFO tokenInfo;
 
@@ -146,6 +149,7 @@ final class Token implements Serializable {
         config = provider.config;
         tokenInfo = p11.C_GetTokenInfo(provider.slotID);
         writeProtected = (tokenInfo.flags & CKF_WRITE_PROTECTED) != 0;
+        ctsVariant = getCTSVariant();
         // create session manager and open a test session
         SessionManager sessionManager;
         try {
@@ -412,6 +416,19 @@ CK_MECHANISM_INFO getMechanismInfo(long mechanism) throws PKCS11Exception {
         return result;
     }
 
+    private CTSVariant getCTSVariant() {
+        CTSVariant ctsVariant = config.getCTSVariant();
+        if (ctsVariant != null) {
+            return ctsVariant;
+        }
+        // 'cipherTextStealingVariant' needs an explicit value for the
+        // CKM_AES_CTS mechanism to be enabled. In the case of NSS we know
+        // that this value is 'CS1', so we can set it for the user. See:
+        // https://bugzilla.mozilla.org/show_bug.cgi?id=373108#c7
+        // https://github.com/nss-dev/nss/blob/NSS_3_99_RTM/lib/freebl/cts.c#L65
+        return P11Util.isNSS(this) ? CTSVariant.CS1 : null;
+    }
+
     private synchronized byte[] getTokenId() {
         if (tokenId == null) {
             SecureRandom random = JCAUtil.getSecureRandom();
diff --git a/src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c b/src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c
index 3068f475626..41207b5a9df 100644
--- a/src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c
+++ b/src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c
@@ -242,7 +242,7 @@ static bool process_doesnt_exist(pid_t pid) {
       found_state = true;
       state = buf + state_len;
       // Skip the spaces
-      while (isspace(*state)) {
+      while (isspace((unsigned char) *state)) {
         state++;
       }
       // A state value of 'X' indicates that the thread is dead. 'Z'
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java
index 16e91d0a0cd..a68b8b596b4 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java
@@ -30,8 +30,8 @@
 import sun.jvm.hotspot.utilities.Observer;
 
 import sun.jvm.hotspot.debugger.Address;
-import sun.jvm.hotspot.gc.g1.HeapRegionClosure;
-import sun.jvm.hotspot.gc.g1.PrintRegionClosure;
+import sun.jvm.hotspot.gc.g1.G1HeapRegionClosure;
+import sun.jvm.hotspot.gc.g1.G1PrintRegionClosure;
 import sun.jvm.hotspot.gc.shared.CollectedHeap;
 import sun.jvm.hotspot.gc.shared.CollectedHeapName;
 import sun.jvm.hotspot.gc.shared.LiveRegionsClosure;
@@ -47,7 +47,7 @@
 // Mirror class for G1CollectedHeap.
 
 public class G1CollectedHeap extends CollectedHeap {
-    // HeapRegionManager _hrm;
+    // G1HeapRegionManager _hrm;
     private static long hrmFieldOffset;
     // MemRegion _g1_reserved;
     private static long g1ReservedFieldOffset;
@@ -55,9 +55,9 @@ public class G1CollectedHeap extends CollectedHeap {
     private static CIntegerField summaryBytesUsedField;
     // G1MonitoringSupport* _monitoring_support;
     private static AddressField monitoringSupportField;
-    // HeapRegionSet _old_set;
+    // G1HeapRegionSet _old_set;
     private static long oldSetFieldOffset;
-    // HeapRegionSet _humongous_set;
+    // G1HeapRegionSet _humongous_set;
     private static long humongousSetFieldOffset;
 
     static {
@@ -90,9 +90,9 @@ public long n_regions() {
         return hrm().length();
     }
 
-    public HeapRegionManager hrm() {
+    public G1HeapRegionManager hrm() {
         Address hrmAddr = addr.addOffsetTo(hrmFieldOffset);
-        return VMObjectFactory.newObject(HeapRegionManager.class, hrmAddr);
+        return VMObjectFactory.newObject(G1HeapRegionManager.class, hrmAddr);
     }
 
     public G1MonitoringSupport monitoringSupport() {
@@ -100,21 +100,21 @@ public G1MonitoringSupport monitoringSupport() {
         return VMObjectFactory.newObject(G1MonitoringSupport.class, monitoringSupportAddr);
     }
 
-    public HeapRegionSetBase oldSet() {
+    public G1HeapRegionSetBase oldSet() {
         Address oldSetAddr = addr.addOffsetTo(oldSetFieldOffset);
-        return VMObjectFactory.newObject(HeapRegionSetBase.class, oldSetAddr);
+        return VMObjectFactory.newObject(G1HeapRegionSetBase.class, oldSetAddr);
     }
 
-    public HeapRegionSetBase humongousSet() {
+    public G1HeapRegionSetBase humongousSet() {
         Address humongousSetAddr = addr.addOffsetTo(humongousSetFieldOffset);
-        return VMObjectFactory.newObject(HeapRegionSetBase.class, humongousSetAddr);
+        return VMObjectFactory.newObject(G1HeapRegionSetBase.class, humongousSetAddr);
     }
 
     private Iterator<G1HeapRegion> heapRegionIterator() {
         return hrm().heapRegionIterator();
     }
 
-    public void heapRegionIterate(HeapRegionClosure hrcl) {
+    public void heapRegionIterate(G1HeapRegionClosure hrcl) {
         Iterator<G1HeapRegion> iter = heapRegionIterator();
         while (iter.hasNext()) {
             G1HeapRegion hr = iter.next();
@@ -159,7 +159,7 @@ public void printOn(PrintStream tty) {
     }
 
     public void printRegionDetails(PrintStream tty) {
-        PrintRegionClosure prc = new PrintRegionClosure(tty);
+        G1PrintRegionClosure prc = new G1PrintRegionClosure(tty);
         heapRegionIterate(prc);
     }
 
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegion.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegion.java
index ef270ba5671..5cf9b3c3b75 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegion.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegion.java
@@ -55,7 +55,7 @@ public class G1HeapRegion extends ContiguousSpace implements LiveRegionsProvider
     private static long typeFieldOffset;
     private static long pointerSize;
 
-    private HeapRegionType type;
+    private G1HeapRegionType type;
 
     static {
         VM.registerVMInitializedObserver(new Observer() {
@@ -88,7 +88,7 @@ public G1HeapRegion(Address addr) {
         super(addr);
         Address typeAddr = (addr instanceof OopHandle) ? addr.addOffsetToAsOopHandle(typeFieldOffset)
                                                        : addr.addOffsetTo(typeFieldOffset);
-        type = VMObjectFactory.newObject(HeapRegionType.class, typeAddr);
+        type = VMObjectFactory.newObject(G1HeapRegionType.class, typeAddr);
     }
 
     public Address bottom()        { return bottomField.getValue(addr); }
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionClosure.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionClosure.java
similarity index 89%
rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionClosure.java
rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionClosure.java
index d63679d3099..4203e6952f8 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionClosure.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionClosure.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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,6 +24,6 @@
 
 package sun.jvm.hotspot.gc.g1;
 
-public interface HeapRegionClosure {
+public interface G1HeapRegionClosure {
     public void doHeapRegion(G1HeapRegion hr);
 }
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionManager.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionManager.java
similarity index 92%
rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionManager.java
rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionManager.java
index d79723c2c80..d1e2a468731 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionManager.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionManager.java
@@ -37,9 +37,9 @@
 import sun.jvm.hotspot.types.Type;
 import sun.jvm.hotspot.types.TypeDataBase;
 
-// Mirror class for HeapRegionManager.
+// Mirror class for G1HeapRegionManager.
 
-public class HeapRegionManager extends VMObject {
+public class G1HeapRegionManager extends VMObject {
     // G1HeapRegionTable _regions
     private static long regionsFieldOffset;
 
@@ -52,7 +52,7 @@ public void update(Observable o, Object data) {
     }
 
     private static synchronized void initialize(TypeDataBase db) {
-        Type type = db.lookupType("HeapRegionManager");
+        Type type = db.lookupType("G1HeapRegionManager");
 
         regionsFieldOffset = type.getField("_regions").getOffset();
     }
@@ -74,7 +74,7 @@ public Iterator<G1HeapRegion> heapRegionIterator() {
         return regions().heapRegionIterator(length());
     }
 
-    public HeapRegionManager(Address addr) {
+    public G1HeapRegionManager(Address addr) {
         super(addr);
     }
 
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionSetBase.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionSetBase.java
similarity index 90%
rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionSetBase.java
rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionSetBase.java
index 7cfcf938d9e..5d44c46d013 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionSetBase.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionSetBase.java
@@ -37,9 +37,9 @@
 import sun.jvm.hotspot.types.Type;
 import sun.jvm.hotspot.types.TypeDataBase;
 
-// Mirror class for HeapRegionSetBase. Represents a group of regions.
+// Mirror class for G1HeapRegionSetBase. Represents a group of regions.
 
-public class HeapRegionSetBase extends VMObject {
+public class G1HeapRegionSetBase extends VMObject {
 
     // uint _length
     private static CIntegerField lengthField;
@@ -53,7 +53,7 @@ public void update(Observable o, Object data) {
     }
 
     private static synchronized void initialize(TypeDataBase db) {
-        Type type = db.lookupType("HeapRegionSetBase");
+        Type type = db.lookupType("G1HeapRegionSetBase");
 
         lengthField = type.getCIntegerField("_length");
     }
@@ -62,7 +62,7 @@ public long length() {
         return lengthField.getValue(addr);
     }
 
-    public HeapRegionSetBase(Address addr) {
+    public G1HeapRegionSetBase(Address addr) {
         super(addr);
     }
 }
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionType.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionType.java
similarity index 79%
rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionType.java
rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionType.java
index 1e578784900..e5536bbe703 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegionType.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionType.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -33,10 +33,10 @@
 import sun.jvm.hotspot.types.Type;
 import sun.jvm.hotspot.types.TypeDataBase;
 
-// Mirror class for HeapRegionType. Currently we don't actually include
+// Mirror class for G1HeapRegionType. Currently we don't actually include
 // any of its fields but only iterate over it.
 
-public class HeapRegionType extends VMObject {
+public class G1HeapRegionType extends VMObject {
 
     private static int freeTag;
     private static int youngMask;
@@ -58,18 +58,18 @@ public void update(Observable o, Object data) {
     }
 
     private static synchronized void initialize(TypeDataBase db) {
-        Type type = db.lookupType("HeapRegionType");
+        Type type = db.lookupType("G1HeapRegionType");
 
         tagField = type.getCIntegerField("_tag");
 
-        freeTag = db.lookupIntConstant("HeapRegionType::FreeTag");
-        youngMask = db.lookupIntConstant("HeapRegionType::YoungMask");
-        edenTag = db.lookupIntConstant("HeapRegionType::EdenTag");
-        survTag = db.lookupIntConstant("HeapRegionType::SurvTag");
-        startsHumongousTag = db.lookupIntConstant("HeapRegionType::StartsHumongousTag");
-        continuesHumongousTag = db.lookupIntConstant("HeapRegionType::ContinuesHumongousTag");
-        humongousMask = db.lookupIntConstant("HeapRegionType::HumongousMask");
-        oldMask = db.lookupIntConstant("HeapRegionType::OldMask");
+        freeTag = db.lookupIntConstant("G1HeapRegionType::FreeTag");
+        youngMask = db.lookupIntConstant("G1HeapRegionType::YoungMask");
+        edenTag = db.lookupIntConstant("G1HeapRegionType::EdenTag");
+        survTag = db.lookupIntConstant("G1HeapRegionType::SurvTag");
+        startsHumongousTag = db.lookupIntConstant("G1HeapRegionType::StartsHumongousTag");
+        continuesHumongousTag = db.lookupIntConstant("G1HeapRegionType::ContinuesHumongousTag");
+        humongousMask = db.lookupIntConstant("G1HeapRegionType::HumongousMask");
+        oldMask = db.lookupIntConstant("G1HeapRegionType::OldMask");
     }
 
     public boolean isFree() {
@@ -104,7 +104,7 @@ public boolean isOld() {
         return (tagField.getValue(addr) & oldMask) != 0;
     }
 
-    public HeapRegionType(Address addr) {
+    public G1HeapRegionType(Address addr) {
         super(addr);
     }
 
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/PrintRegionClosure.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1PrintRegionClosure.java
similarity index 91%
rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/PrintRegionClosure.java
rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1PrintRegionClosure.java
index fb777f35167..340f40e288d 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/PrintRegionClosure.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1PrintRegionClosure.java
@@ -27,10 +27,10 @@
 import java.io.PrintStream;
 import sun.jvm.hotspot.gc.g1.G1HeapRegion;
 
-public class PrintRegionClosure implements HeapRegionClosure {
+public class G1PrintRegionClosure implements G1HeapRegionClosure {
     private PrintStream tty;
 
-    public PrintRegionClosure(PrintStream tty) {
+    public G1PrintRegionClosure(PrintStream tty) {
         this.tty = tty;
     }
 
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
index b13171745bb..0f05b15af76 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java
@@ -57,7 +57,6 @@ public void update(Observable o, Object data) {
   // ClassState constants
   private static int CLASS_STATE_ALLOCATED;
   private static int CLASS_STATE_LOADED;
-  private static int CLASS_STATE_BEING_LINKED;
   private static int CLASS_STATE_LINKED;
   private static int CLASS_STATE_BEING_INITIALIZED;
   private static int CLASS_STATE_FULLY_INITIALIZED;
@@ -101,7 +100,6 @@ private static synchronized void initialize(TypeDataBase db) throws WrongTypeExc
     // read ClassState constants
     CLASS_STATE_ALLOCATED = db.lookupIntConstant("InstanceKlass::allocated").intValue();
     CLASS_STATE_LOADED = db.lookupIntConstant("InstanceKlass::loaded").intValue();
-    CLASS_STATE_BEING_LINKED = db.lookupIntConstant("InstanceKlass::being_linked").intValue();
     CLASS_STATE_LINKED = db.lookupIntConstant("InstanceKlass::linked").intValue();
     CLASS_STATE_BEING_INITIALIZED = db.lookupIntConstant("InstanceKlass::being_initialized").intValue();
     CLASS_STATE_FULLY_INITIALIZED = db.lookupIntConstant("InstanceKlass::fully_initialized").intValue();
@@ -158,7 +156,6 @@ public InstanceKlass(Address addr) {
   public static class ClassState {
      public static final ClassState ALLOCATED    = new ClassState("allocated");
      public static final ClassState LOADED       = new ClassState("loaded");
-     public static final ClassState BEING_LINKED = new ClassState("beingLinked");
      public static final ClassState LINKED       = new ClassState("linked");
      public static final ClassState BEING_INITIALIZED      = new ClassState("beingInitialized");
      public static final ClassState FULLY_INITIALIZED    = new ClassState("fullyInitialized");
@@ -182,8 +179,6 @@ public ClassState getInitState() {
         return ClassState.ALLOCATED;
      } else if (state == CLASS_STATE_LOADED) {
         return ClassState.LOADED;
-     } else if (state == CLASS_STATE_BEING_LINKED) {
-        return ClassState.BEING_LINKED;
      } else if (state == CLASS_STATE_LINKED) {
         return ClassState.LINKED;
      } else if (state == CLASS_STATE_BEING_INITIALIZED) {
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java
index 7a360942572..60bcb7bb86d 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, 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
@@ -100,7 +100,7 @@ public void printLockInfo(PrintStream tty, int frameCount) {
     // then print out the receiver. Locals are not always available,
     // e.g., compiled native frames have no scope so there are no locals.
     if (frameCount == 0) {
-      if (getMethod().getName().asString().equals("wait") &&
+      if (getMethod().getName().asString().equals("wait0") &&
           getMethod().getMethodHolder().getName().asString().equals("java/lang/Object")) {
         String waitState = "waiting on"; // assume we are waiting
         // If earlier in the output we reported java.lang.Thread.State ==
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
index 41788757e0c..86a1216bbd3 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/HeapSummary.java
@@ -80,7 +80,6 @@ public void run() {
       printValMB("MaxHeapSize              = ", getFlagValue("MaxHeapSize", flagMap));
       printValMB("NewSize                  = ", getFlagValue("NewSize", flagMap));
       printValMB("MaxNewSize               = ", getFlagValue("MaxNewSize", flagMap));
-      printValMB("OldSize                  = ", getFlagValue("OldSize", flagMap));
       printValue("NewRatio                 = ", getFlagValue("NewRatio", flagMap));
       printValue("SurvivorRatio            = ", getFlagValue("SurvivorRatio", flagMap));
       printValMB("MetaspaceSize            = ", getFlagValue("MetaspaceSize", flagMap));
@@ -253,8 +252,8 @@ public void printG1HeapSummary(PrintStream tty, G1CollectedHeap g1h) {
       G1MonitoringSupport monitoringSupport = g1h.monitoringSupport();
       long edenSpaceRegionNum = monitoringSupport.edenSpaceRegionNum();
       long survivorSpaceRegionNum = monitoringSupport.survivorSpaceRegionNum();
-      HeapRegionSetBase oldSet = g1h.oldSet();
-      HeapRegionSetBase humongousSet = g1h.humongousSet();
+      G1HeapRegionSetBase oldSet = g1h.oldSet();
+      G1HeapRegionSetBase humongousSet = g1h.humongousSet();
       long oldGenRegionNum = oldSet.length() + humongousSet.length();
       printG1Space(tty, "G1 Heap:", g1h.n_regions(),
                    g1h.used(), g1h.capacity());
diff --git a/src/jdk.hotspot.agent/share/man/jhsdb.1 b/src/jdk.hotspot.agent/share/man/jhsdb.1
index 30b2d3fe95c..5b65f7eafb4 100644
--- a/src/jdk.hotspot.agent/share/man/jhsdb.1
+++ b/src/jdk.hotspot.agent/share/man/jhsdb.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JHSDB" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JHSDB" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.hotspot.agent/test/libproc/Makefile b/src/jdk.hotspot.agent/test/libproc/Makefile
index 81fadaeb552..c7b171bc633 100644
--- a/src/jdk.hotspot.agent/test/libproc/Makefile
+++ b/src/jdk.hotspot.agent/test/libproc/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2024, 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
@@ -19,7 +19,7 @@
 # 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.
-#  
+#
 #
 
 all:
diff --git a/src/jdk.httpserver/share/man/jwebserver.1 b/src/jdk.httpserver/share/man/jwebserver.1
index 3c48d81fc9c..4fbaf9dd09d 100644
--- a/src/jdk.httpserver/share/man/jwebserver.1
+++ b/src/jdk.httpserver/share/man/jwebserver.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JWEBSERVER" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JWEBSERVER" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java b/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java
index 344d081c124..7fdfb9a028f 100644
--- a/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java
+++ b/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/OSUtils.java
@@ -63,7 +63,7 @@ private static boolean isExecutable(File f) {
         String sttyfopt = null;
         String infocmp = null;
         String test = null;
-        String path = System.getenv("PATH");
+        String path = "/usr/bin" + File.pathSeparator + "/bin";//was: System.getenv("PATH");
         if (path != null) {
             String[] paths = path.split(File.pathSeparator);
             for (String p : paths) {
diff --git a/src/jdk.internal.opt/share/classes/module-info.java b/src/jdk.internal.opt/share/classes/module-info.java
index 67ed1410560..ba6987f1ea9 100644
--- a/src/jdk.internal.opt/share/classes/module-info.java
+++ b/src/jdk.internal.opt/share/classes/module-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,11 +31,13 @@
 module jdk.internal.opt {
     exports jdk.internal.joptsimple to
         jdk.jlink,
-        jdk.jshell;
+        jdk.jshell,
+        jdk.jdeps;
     exports jdk.internal.opt to
         jdk.compiler,
         jdk.jartool,
         jdk.javadoc,
         jdk.jlink,
-        jdk.jpackage;
+        jdk.jpackage,
+        jdk.jdeps;
 }
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java
index 9f611b0dfce..83401fed620 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java
@@ -66,6 +66,24 @@ public class AMD64 extends Architecture {
     public static final Register r14 = new Register(14, 14, "r14", CPU);
     public static final Register r15 = new Register(15, 15, "r15", CPU);
 
+    public static final Register r16 = new Register(16, 16, "r16", CPU);
+    public static final Register r17 = new Register(17, 17, "r17", CPU);
+    public static final Register r18 = new Register(18, 18, "r18", CPU);
+    public static final Register r19 = new Register(19, 19, "r19", CPU);
+    public static final Register r20 = new Register(20, 20, "r20", CPU);
+    public static final Register r21 = new Register(21, 21, "r21", CPU);
+    public static final Register r22 = new Register(22, 22, "r22", CPU);
+    public static final Register r23 = new Register(23, 23, "r23", CPU);
+    public static final Register r24 = new Register(24, 24, "r24", CPU);
+    public static final Register r25 = new Register(25, 25, "r25", CPU);
+    public static final Register r26 = new Register(26, 26, "r26", CPU);
+    public static final Register r27 = new Register(27, 27, "r27", CPU);
+    public static final Register r28 = new Register(28, 28, "r28", CPU);
+    public static final Register r29 = new Register(29, 29, "r29", CPU);
+    public static final Register r30 = new Register(30, 30, "r30", CPU);
+    public static final Register r31 = new Register(31, 31, "r31", CPU);
+
+    // The set of common CPU registers available on all x64 platforms.
     public static final Register[] cpuRegisters = {
         rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
         r8, r9, r10, r11, r12, r13, r14, r15
@@ -74,41 +92,41 @@ public class AMD64 extends Architecture {
     public static final RegisterCategory XMM = new RegisterCategory("XMM");
 
     // XMM registers
-    public static final Register xmm0 = new Register(16, 0, "xmm0", XMM);
-    public static final Register xmm1 = new Register(17, 1, "xmm1", XMM);
-    public static final Register xmm2 = new Register(18, 2, "xmm2", XMM);
-    public static final Register xmm3 = new Register(19, 3, "xmm3", XMM);
-    public static final Register xmm4 = new Register(20, 4, "xmm4", XMM);
-    public static final Register xmm5 = new Register(21, 5, "xmm5", XMM);
-    public static final Register xmm6 = new Register(22, 6, "xmm6", XMM);
-    public static final Register xmm7 = new Register(23, 7, "xmm7", XMM);
-
-    public static final Register xmm8  = new Register(24,  8, "xmm8",  XMM);
-    public static final Register xmm9  = new Register(25,  9, "xmm9",  XMM);
-    public static final Register xmm10 = new Register(26, 10, "xmm10", XMM);
-    public static final Register xmm11 = new Register(27, 11, "xmm11", XMM);
-    public static final Register xmm12 = new Register(28, 12, "xmm12", XMM);
-    public static final Register xmm13 = new Register(29, 13, "xmm13", XMM);
-    public static final Register xmm14 = new Register(30, 14, "xmm14", XMM);
-    public static final Register xmm15 = new Register(31, 15, "xmm15", XMM);
-
-    public static final Register xmm16 = new Register(32, 16, "xmm16", XMM);
-    public static final Register xmm17 = new Register(33, 17, "xmm17", XMM);
-    public static final Register xmm18 = new Register(34, 18, "xmm18", XMM);
-    public static final Register xmm19 = new Register(35, 19, "xmm19", XMM);
-    public static final Register xmm20 = new Register(36, 20, "xmm20", XMM);
-    public static final Register xmm21 = new Register(37, 21, "xmm21", XMM);
-    public static final Register xmm22 = new Register(38, 22, "xmm22", XMM);
-    public static final Register xmm23 = new Register(39, 23, "xmm23", XMM);
-
-    public static final Register xmm24 = new Register(40, 24, "xmm24", XMM);
-    public static final Register xmm25 = new Register(41, 25, "xmm25", XMM);
-    public static final Register xmm26 = new Register(42, 26, "xmm26", XMM);
-    public static final Register xmm27 = new Register(43, 27, "xmm27", XMM);
-    public static final Register xmm28 = new Register(44, 28, "xmm28", XMM);
-    public static final Register xmm29 = new Register(45, 29, "xmm29", XMM);
-    public static final Register xmm30 = new Register(46, 30, "xmm30", XMM);
-    public static final Register xmm31 = new Register(47, 31, "xmm31", XMM);
+    public static final Register xmm0 = new Register(32, 0, "xmm0", XMM);
+    public static final Register xmm1 = new Register(33, 1, "xmm1", XMM);
+    public static final Register xmm2 = new Register(34, 2, "xmm2", XMM);
+    public static final Register xmm3 = new Register(35, 3, "xmm3", XMM);
+    public static final Register xmm4 = new Register(36, 4, "xmm4", XMM);
+    public static final Register xmm5 = new Register(37, 5, "xmm5", XMM);
+    public static final Register xmm6 = new Register(38, 6, "xmm6", XMM);
+    public static final Register xmm7 = new Register(39, 7, "xmm7", XMM);
+
+    public static final Register xmm8  = new Register(40,  8, "xmm8",  XMM);
+    public static final Register xmm9  = new Register(41,  9, "xmm9",  XMM);
+    public static final Register xmm10 = new Register(42, 10, "xmm10", XMM);
+    public static final Register xmm11 = new Register(43, 11, "xmm11", XMM);
+    public static final Register xmm12 = new Register(44, 12, "xmm12", XMM);
+    public static final Register xmm13 = new Register(45, 13, "xmm13", XMM);
+    public static final Register xmm14 = new Register(46, 14, "xmm14", XMM);
+    public static final Register xmm15 = new Register(47, 15, "xmm15", XMM);
+
+    public static final Register xmm16 = new Register(48, 16, "xmm16", XMM);
+    public static final Register xmm17 = new Register(49, 17, "xmm17", XMM);
+    public static final Register xmm18 = new Register(50, 18, "xmm18", XMM);
+    public static final Register xmm19 = new Register(51, 19, "xmm19", XMM);
+    public static final Register xmm20 = new Register(52, 20, "xmm20", XMM);
+    public static final Register xmm21 = new Register(53, 21, "xmm21", XMM);
+    public static final Register xmm22 = new Register(54, 22, "xmm22", XMM);
+    public static final Register xmm23 = new Register(55, 23, "xmm23", XMM);
+
+    public static final Register xmm24 = new Register(56, 24, "xmm24", XMM);
+    public static final Register xmm25 = new Register(57, 25, "xmm25", XMM);
+    public static final Register xmm26 = new Register(58, 26, "xmm26", XMM);
+    public static final Register xmm27 = new Register(59, 27, "xmm27", XMM);
+    public static final Register xmm28 = new Register(60, 28, "xmm28", XMM);
+    public static final Register xmm29 = new Register(61, 29, "xmm29", XMM);
+    public static final Register xmm30 = new Register(62, 30, "xmm30", XMM);
+    public static final Register xmm31 = new Register(63, 31, "xmm31", XMM);
 
     public static final Register[] xmmRegistersSSE = {
         xmm0, xmm1, xmm2,  xmm3,  xmm4,  xmm5,  xmm6,  xmm7,
@@ -124,14 +142,14 @@ public class AMD64 extends Architecture {
 
     public static final RegisterCategory MASK = new RegisterCategory("MASK", false);
 
-    public static final Register k0 = new Register(48, 0, "k0", MASK);
-    public static final Register k1 = new Register(49, 1, "k1", MASK);
-    public static final Register k2 = new Register(50, 2, "k2", MASK);
-    public static final Register k3 = new Register(51, 3, "k3", MASK);
-    public static final Register k4 = new Register(52, 4, "k4", MASK);
-    public static final Register k5 = new Register(53, 5, "k5", MASK);
-    public static final Register k6 = new Register(54, 6, "k6", MASK);
-    public static final Register k7 = new Register(55, 7, "k7", MASK);
+    public static final Register k0 = new Register(64, 0, "k0", MASK);
+    public static final Register k1 = new Register(65, 1, "k1", MASK);
+    public static final Register k2 = new Register(66, 2, "k2", MASK);
+    public static final Register k3 = new Register(67, 3, "k3", MASK);
+    public static final Register k4 = new Register(68, 4, "k4", MASK);
+    public static final Register k5 = new Register(69, 5, "k5", MASK);
+    public static final Register k6 = new Register(70, 6, "k6", MASK);
+    public static final Register k7 = new Register(71, 7, "k7", MASK);
 
     public static final RegisterArray valueRegistersSSE = new RegisterArray(
         rax,  rcx,  rdx,   rbx,   rsp,   rbp,   rsi,   rdi,
@@ -153,11 +171,13 @@ public class AMD64 extends Architecture {
     /**
      * Register used to construct an instruction-relative address.
      */
-    public static final Register rip = new Register(56, -1, "rip", SPECIAL);
+    public static final Register rip = new Register(72, -1, "rip", SPECIAL);
 
     public static final RegisterArray allRegisters = new RegisterArray(
         rax,  rcx,  rdx,   rbx,   rsp,   rbp,   rsi,   rdi,
         r8,   r9,   r10,   r11,   r12,   r13,   r14,   r15,
+        r16,  r17,  r18,   r19,   r20,   r21,   r22,   r23,
+        r24,  r25,  r26,   r27,   r28,   r29,   r30,   r31,
         xmm0, xmm1, xmm2,  xmm3,  xmm4,  xmm5,  xmm6,  xmm7,
         xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
         xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23,
@@ -233,6 +253,7 @@ public enum CPUFeature implements CPUFeatureName {
         CET_SS,
         AVX512_IFMA,
         AVX_IFMA,
+        APX_F,
     }
 
     private final EnumSet<CPUFeature> features;
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java
index 0b00628acea..f14855cd6b9 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java
@@ -26,6 +26,7 @@
 import java.util.Set;
 
 import jdk.vm.ci.code.Register.RegisterCategory;
+import jdk.vm.ci.common.JVMCIError;
 import jdk.vm.ci.meta.JavaKind;
 import jdk.vm.ci.meta.PlatformKind;
 
@@ -81,6 +82,13 @@ public abstract class Architecture {
     protected Architecture(String name, PlatformKind wordKind, ByteOrder byteOrder, boolean unalignedMemoryAccess, RegisterArray registers, int implicitMemoryBarriers,
                     int nativeCallDisplacementOffset,
                     int returnAddressSize) {
+        // registers is expected to mention all registers in order of their encoding.
+        for (int i = 0; i < registers.size(); ++i) {
+            if (registers.get(i).number != i) {
+                Register reg = registers.get(i);
+                throw new JVMCIError("%s: %d != %d", reg, reg.number, i);
+            }
+        }
         this.name = name;
         this.registers = registers;
         this.wordKind = wordKind;
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java
index 21c6fb3dc0e..6ee925cd3a7 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJDKReflection.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, 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
@@ -108,9 +108,6 @@ boolean equals(HotSpotObjectConstantImpl a, HotSpotObjectConstantImpl b) {
         return resolveObject(a) == resolveObject(b) && a.isCompressed() == b.isCompressed();
     }
 
-    // This field is being kept around for compatibility with libgraal
-    @SuppressWarnings("unused") private long oopSizeOffset;
-
     @Override
     ResolvedJavaMethod.Parameter[] getParameters(HotSpotResolvedJavaMethodImpl javaMethod) {
         java.lang.reflect.Parameter[] javaParameters = getMethod(javaMethod).getParameters();
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java
index 87cd10b400f..3dcf855ff23 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -987,6 +987,12 @@ private boolean isGCSupported(int gcIdentifier) {
         return getCompiler().isGCSupported(gcIdentifier);
     }
 
+    @SuppressWarnings("try")
+    @VMEntryPoint
+    private boolean isIntrinsicSupported(int intrinsicIdentifier) {
+        return getCompiler().isIntrinsicSupported(intrinsicIdentifier);
+    }
+
     /**
      * Guard to ensure shut down actions are performed by at most one thread.
      */
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java
index 7e47196a42b..3d3d140b1ca 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotMethodHandleAccessProvider.java
@@ -146,6 +146,8 @@ public static IntrinsicMethod getMethodHandleIntrinsic(int intrinsicId) {
             return IntrinsicMethod.LINK_TO_STATIC;
         } else if (intrinsicId == config.vmIntrinsicLinkToVirtual) {
             return IntrinsicMethod.LINK_TO_VIRTUAL;
+        } else if (intrinsicId == config.vmIntrinsicLinkToNative) {
+            return IntrinsicMethod.LINK_TO_NATIVE;
         }
         return null;
     }
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java
index c49f24efed5..57f9473c902 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfig.java
@@ -342,6 +342,7 @@ final int baseVtableLength() {
     final int vmIntrinsicLinkToStatic = getConstant("vmIntrinsics::_linkToStatic", Integer.class);
     final int vmIntrinsicLinkToSpecial = getConstant("vmIntrinsics::_linkToSpecial", Integer.class);
     final int vmIntrinsicLinkToInterface = getConstant("vmIntrinsics::_linkToInterface", Integer.class);
+    final int vmIntrinsicLinkToNative = getConstant("vmIntrinsics::_linkToNative", Integer.class);
 
     final int codeInstallResultOk = getConstant("JVMCI::ok", Integer.class);
     final int codeInstallResultDependenciesFailed = getConstant("JVMCI::dependencies_failed", Integer.class);
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java
index 0ee69f135c9..c6735cef5f6 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotVMConfigStore.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -82,6 +82,27 @@ public List<VMIntrinsicMethod> getIntrinsics() {
         return Collections.unmodifiableList(vmIntrinsics);
     }
 
+    /**
+     * Gets the VM intrinsic description by its ID.
+     */
+    public VMIntrinsicMethod getIntrinsic(int intrinsicID) {
+        if (intrinsicID >= 1 && intrinsicID <= vmIntrinsics.size()) {
+            // valid intrinsicID starts from 1
+            VMIntrinsicMethod intrinsic = vmIntrinsics.get(intrinsicID - 1);
+            // We speculate that vmIntrinsics are sorted by ID
+            if (intrinsic.id == intrinsicID) {
+                return intrinsic;
+            }
+        }
+        // Assumption failed, fall back to iteration
+        for (VMIntrinsicMethod intrinsic : vmIntrinsics) {
+            if (intrinsic.id == intrinsicID) {
+                return intrinsic;
+            }
+        }
+        return null;
+    }
+
     final HashMap<String, VMField> vmFields;
     final HashMap<String, Long> vmConstants;
     final HashMap<String, Long> vmAddresses;
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java
index f053905b160..eb8b9721d49 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/meta/MethodHandleAccessProvider.java
@@ -45,7 +45,9 @@ enum IntrinsicMethod {
         /** The method {@code MethodHandle.linkToVirtual}. */
         LINK_TO_VIRTUAL,
         /** The method {@code MethodHandle.linkToInterface}. */
-        LINK_TO_INTERFACE
+        LINK_TO_INTERFACE,
+        /** The method {@code MethodHandle.linkToNative}. */
+        LINK_TO_NATIVE
     }
 
     /**
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/runtime/JVMCICompiler.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/runtime/JVMCICompiler.java
index bbb9c79e9f5..accd9e01490 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/runtime/JVMCICompiler.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/runtime/JVMCICompiler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -44,4 +44,15 @@ public interface JVMCICompiler {
     default boolean isGCSupported(int gcIdentifier) {
         return true;
     }
+
+    /**
+     * Determines if this compiler supports the {@code intrinsicIdentifier} intrinsic. The default
+     * implementation of this method returns false as that is the effective answer given by a
+     * {@link JVMCICompiler} before this method was added.
+     *
+     * @param intrinsicIdentifier intrinsic identifier defined in vmIntrinsics.hpp.
+     */
+    default boolean isIntrinsicSupported(int intrinsicIdentifier) {
+        return false;
+    }
 }
diff --git a/src/jdk.jartool/share/classes/jdk/security/jarsigner/JarSigner.java b/src/jdk.jartool/share/classes/jdk/security/jarsigner/JarSigner.java
index 5dbaf6041ee..3ff0f2663a2 100644
--- a/src/jdk.jartool/share/classes/jdk/security/jarsigner/JarSigner.java
+++ b/src/jdk.jartool/share/classes/jdk/security/jarsigner/JarSigner.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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,7 +31,6 @@
 import sun.security.pkcs.PKCS9Attribute;
 import sun.security.pkcs.PKCS9Attributes;
 import sun.security.timestamp.HttpTimestamper;
-import sun.security.tools.PathList;
 import sun.security.util.Event;
 import sun.security.util.ManifestDigester;
 import sun.security.util.SignatureFileVerifier;
@@ -39,11 +38,8 @@
 import sun.security.x509.AlgorithmId;
 
 import java.io.*;
-import java.lang.reflect.InvocationTargetException;
 import java.net.SocketTimeoutException;
 import java.net.URI;
-import java.net.URL;
-import java.net.URLClassLoader;
 import java.security.*;
 import java.security.cert.CertPath;
 import java.security.cert.Certificate;
@@ -492,7 +488,7 @@ public JarSigner build() {
     private final String tSADigestAlg;
     private final boolean sectionsonly; // do not "sign" the whole manifest
     private final boolean internalsf; // include the .SF inside the PKCS7 block
-    private boolean extraAttrsDetected;
+    private boolean externalFileAttributesDetected;
 
     private JarSigner(JarSigner.Builder builder) {
 
@@ -936,12 +932,12 @@ private void writeEntry(ZipFile zf, ZipOutputStream os, ZipEntry ze)
         ze2.setTime(ze.getTime());
         ze2.setComment(ze.getComment());
         ze2.setExtra(ze.getExtra());
-        int extraAttrs = JUZFA.getExtraAttributes(ze);
-        if (!extraAttrsDetected && extraAttrs != -1) {
-            extraAttrsDetected = true;
+        int externalFileAttributes = JUZFA.getExternalFileAttributes(ze);
+        if (!externalFileAttributesDetected && externalFileAttributes != -1) {
+            externalFileAttributesDetected = true;
             Event.report(Event.ReporterCategory.ZIPFILEATTRS, "detected");
         }
-        JUZFA.setExtraAttributes(ze2, extraAttrs);
+        JUZFA.setExternalFileAttributes(ze2, externalFileAttributes);
         if (ze.getMethod() == ZipEntry.STORED) {
             ze2.setSize(ze.getSize());
             ze2.setCrc(ze.getCrc());
diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java
index e011145632d..78a03a4332d 100644
--- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java
+++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -118,7 +118,7 @@ public class Main {
     private static final Set<CryptoPrimitive> SIG_PRIMITIVE_SET = Collections
             .unmodifiableSet(EnumSet.of(CryptoPrimitive.SIGNATURE));
 
-    private static boolean extraAttrsDetected;
+    private static boolean externalFileAttributesDetected;
 
     static final String VERSION = "1.0";
 
@@ -823,8 +823,8 @@ void verifyJar(String jarName)
                     JarEntry je = e.nextElement();
                     String name = je.getName();
 
-                    if (!extraAttrsDetected && JUZFA.getExtraAttributes(je) != -1) {
-                        extraAttrsDetected = true;
+                    if (!externalFileAttributesDetected && JUZFA.getExternalFileAttributes(je) != -1) {
+                        externalFileAttributesDetected = true;
                     }
                     hasSignature |= signatureRelated(name) && SignatureFileVerifier.isBlockOrSF(name);
 
@@ -1311,8 +1311,8 @@ private void displayMessagesAndResult(boolean isSigning) {
             }
         }
 
-        if (extraAttrsDetected) {
-            warnings.add(rb.getString("extra.attributes.detected"));
+        if (externalFileAttributesDetected) {
+            warnings.add(rb.getString("external.file.attributes.detected"));
         }
 
         if ((strict) && (!errors.isEmpty())) {
@@ -1946,7 +1946,7 @@ void signJar(String jarName, String alias)
 
         try {
             Event.setReportListener(Event.ReporterCategory.ZIPFILEATTRS,
-                    (t, o) -> extraAttrsDetected = true);
+                    (t, o) -> externalFileAttributesDetected = true);
             builder.build().sign(zipFile, fos);
         } catch (JarSignerException e) {
             failedCause = e.getCause();
diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java
index d982f618600..6a86b72ad1b 100644
--- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java
+++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, 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
@@ -178,7 +178,7 @@ public class Resources extends java.util.ListResourceBundle {
         {"key.bit.disabled", "%d-bit key (disabled)"},
         {"key.bit.eccurve.disabled", "%1$d-bit %2$s key (disabled)"},
         {"unknown.size", "unknown size"},
-        {"extra.attributes.detected", "POSIX file permission and/or symlink attributes detected. These attributes are ignored when signing and are not protected by the signature."},
+        {"external.file.attributes.detected", "POSIX file permission and/or symlink attributes detected. These attributes are ignored when signing and are not protected by the signature."},
 
         {"jarsigner.", "jarsigner: "},
         {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.",
diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_de.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_de.java
index 06c8a901cd2..b11c491be14 100644
--- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_de.java
+++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_de.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, 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
@@ -178,7 +178,7 @@ public class Resources_de extends java.util.ListResourceBundle {
         {"key.bit.disabled", "%d-Bit-Schl\u00FCssel (deaktiviert)"},
         {"key.bit.eccurve.disabled", "%1$d-Bit-%2$s-Schl\u00FCssel (deaktiviert)"},
         {"unknown.size", "unbekannte Gr\u00F6\u00DFe"},
-        {"extra.attributes.detected", "POSIX-Dateiberechtigung und/oder Symlink-Attribute erkannt. Diese Attribute werden bei der Signatur ignoriert und sind nicht durch die Signatur gesch\u00FCtzt."},
+        {"external.file.attributes.detected", "POSIX-Dateiberechtigung und/oder Symlink-Attribute erkannt. Diese Attribute werden bei der Signatur ignoriert und sind nicht durch die Signatur gesch\u00FCtzt."},
 
         {"jarsigner.", "jarsigner: "},
         {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.",
diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_ja.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_ja.java
index 1d8e7c54a3c..3754d864ce1 100644
--- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_ja.java
+++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_ja.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, 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
@@ -178,7 +178,7 @@ public class Resources_ja extends java.util.ListResourceBundle {
         {"key.bit.disabled", "%d\u30D3\u30C3\u30C8\u30FB\u30AD\u30FC (\u7121\u52B9)"},
         {"key.bit.eccurve.disabled", "%1$d\u30D3\u30C3\u30C8%2$s\u30AD\u30FC(\u7121\u52B9)"},
         {"unknown.size", "\u4E0D\u660E\u30B5\u30A4\u30BA"},
-        {"extra.attributes.detected", "POSIX\u30D5\u30A1\u30A4\u30EB\u6A29\u9650\u307E\u305F\u306Fsymlink(\u3042\u308B\u3044\u306F\u305D\u306E\u4E21\u65B9)\u306E\u5C5E\u6027\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002\u7F72\u540D\u4E2D\u306F\u3053\u308C\u3089\u306E\u5C5E\u6027\u306F\u7121\u8996\u3055\u308C\u3001\u7F72\u540D\u306B\u3088\u3063\u3066\u4FDD\u8B77\u3055\u308C\u307E\u305B\u3093\u3002"},
+        {"external.file.attributes.detected", "POSIX\u30D5\u30A1\u30A4\u30EB\u6A29\u9650\u307E\u305F\u306Fsymlink(\u3042\u308B\u3044\u306F\u305D\u306E\u4E21\u65B9)\u306E\u5C5E\u6027\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002\u7F72\u540D\u4E2D\u306F\u3053\u308C\u3089\u306E\u5C5E\u6027\u306F\u7121\u8996\u3055\u308C\u3001\u7F72\u540D\u306B\u3088\u3063\u3066\u4FDD\u8B77\u3055\u308C\u307E\u305B\u3093\u3002"},
 
         {"jarsigner.", "jarsigner: "},
         {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.",
diff --git a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java
index 2b4059ea877..9e76346fca2 100644
--- a/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java
+++ b/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2024, 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
@@ -178,7 +178,7 @@ public class Resources_zh_CN extends java.util.ListResourceBundle {
         {"key.bit.disabled", "%d \u4F4D\u5BC6\u94A5\uFF08\u7981\u7528\uFF09"},
         {"key.bit.eccurve.disabled", "%1$d \u4F4D %2$s \u5BC6\u94A5\uFF08\u7981\u7528\uFF09"},
         {"unknown.size", "\u672A\u77E5\u5927\u5C0F"},
-        {"extra.attributes.detected", "\u68C0\u6D4B\u5230 POSIX \u6587\u4EF6\u6743\u9650\u548C/\u6216 symlink \u5C5E\u6027\u3002\u8FD9\u4E9B\u5C5E\u6027\u5728\u8FDB\u884C\u7B7E\u540D\u65F6\u4F1A\u88AB\u5FFD\u7565\uFF0C\u4E0D\u53D7\u8BE5\u7B7E\u540D\u7684\u4FDD\u62A4\u3002"},
+        {"external.file.attributes.detected", "\u68C0\u6D4B\u5230 POSIX \u6587\u4EF6\u6743\u9650\u548C/\u6216 symlink \u5C5E\u6027\u3002\u8FD9\u4E9B\u5C5E\u6027\u5728\u8FDB\u884C\u7B7E\u540D\u65F6\u4F1A\u88AB\u5FFD\u7565\uFF0C\u4E0D\u53D7\u8BE5\u7B7E\u540D\u7684\u4FDD\u62A4\u3002"},
 
         {"jarsigner.", "jarsigner: "},
         {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.",
diff --git a/src/jdk.jartool/share/man/jar.1 b/src/jdk.jartool/share/man/jar.1
index 49a028e0f29..2d983eb561e 100644
--- a/src/jdk.jartool/share/man/jar.1
+++ b/src/jdk.jartool/share/man/jar.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JAR" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JAR" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jartool/share/man/jarsigner.1 b/src/jdk.jartool/share/man/jarsigner.1
index ea8f686a4c8..d085efcfcd0 100644
--- a/src/jdk.jartool/share/man/jarsigner.1
+++ b/src/jdk.jartool/share/man/jarsigner.1
@@ -36,7 +36,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JARSIGNER" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JARSIGNER" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_de.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_de.properties
index 1bdbb5d0614..c444f387a65 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_de.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_de.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2024, 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
@@ -116,17 +116,20 @@ doclet.tag.invalid_input=Ungültige Eingabe: "{0}"
 doclet.tag.invalid=ungültiges @{0}
 doclet.Deprecated_API=Veraltete API
 doclet.Deprecated_API_Checkbox_Label=Veraltete API anzeigen in:
+doclet.Deprecated_API_Checkbox_All_Releases=Alle
 doclet.Deprecated_API_Checkbox_Other_Releases=Sonstige
 doclet.Deprecated_Elements=Veraltete {0}
 doclet.Deprecated_Elements_Release_Column_Header=Veraltet in
 doclet.Deprecated_In_Release=Veraltet in {0}
 doclet.New_API=Neue API
 doclet.New_API_Checkbox_Label=Hinzugefügte API anzeigen in:
+doclet.New_API_Checkbox_All_Releases=Alle
 doclet.New_Elements=Neue {0}
 doclet.New_Elements_Release_Column_Header=Hinzugefügt in
 doclet.New_Label=Neu
 doclet.Preview_API=Vorschau-API
 doclet.Preview_API_Checkbox_Label=Vorschau-API anzeigen für:
+doclet.Preview_API_Checkbox_Toggle_All=Alle umschalten
 doclet.Preview_JEP_URL=https://openjdk.org/jeps/{0}
 doclet.Preview_Label=Vorschau
 doclet.Preview_Mark=PREVIEW
@@ -229,7 +232,7 @@ doclet.help.class_interface.property=Eigenschaften sind ein Feature von JavaFX.
 doclet.help.other_files.head=Weitere Dateien
 doclet.help.other_files.body=Packages und Module können Seiten mit weiteren Informationen zu den Deklarationen in der Nähe enthalten.
 doclet.help.use.head=Verwendung
-doclet.help.use.body=Für jedes dokumentierte Package sowie jede Klasse und jede Schnittstelle ist eine eigene Verwendungsseite vorhanden. Auf dieser Seite wird beschrieben, welche Packages, Klassen, Methoden, Konstruktoren und Felder einen Teil der angegebenen Klasse oder des angegebenen Packages verwenden. Bei der Klasse oder Schnittstelle A enthält die Verwendungsseite die Unterklassen von A, als A deklarierte Felder, Methoden, die A zurückgeben, sowie Methoden und Konstruktoren mit Parametern des Typs A. Sie können diese Seite aufrufen, indem Sie zunächst das Package, die Klasse oder die Schnittstelle aufrufen und anschließend in der Navigationsleiste auf den Link "Verwendung" klicken.
+doclet.help.use.body=Für jedes dokumentierte Package sowie jede Klasse oder Schnittstelle ist eine eigene Verwendungsseite vorhanden. Auf dieser Seite werden die Packages, Klassen, Schnittstellen, Methoden, Konstruktoren und Felder aufgelistet, die einen Teil der angegebenen Klasse oder Schnittstelle oder des angegebenen Packages verwenden. Bei der Klasse oder Schnittstelle A enthält die Verwendungsseite die Unterklassen oder Unterschnittstellen von A, als A deklarierte Felder, Methoden, die A zurückgeben, Methoden und Konstruktoren mit Parametern des Typs A und Unterklassen oder Unterschnittstellen mit Parametern des Typs A. Sie können auf diese Seite zugreifen, indem Sie zunächst das Package, die Klasse oder die Schnittstelle aufrufen und anschließend in der Navigationsleiste auf den Link "Verwendung" klicken.
 doclet.help.tree.head=Baum (Klassenhierarchie)
 # 0: link to main Class Hierarchy page;  1: java.lang.Object
 doclet.help.tree.intro=Es gibt eine Seite {0} für alle Packages, und für jedes Package gibt es eine Hierarchie. Jede Hierarchieseite enthält eine Klassen- und eine Schnittstellenliste. Die Klassen sind nach Vererbungsstruktur organisiert, beginnend mit {1}. Die Schnittstellen erben nicht von {1}.
@@ -284,6 +287,9 @@ doclet.ClassUse_Classes.in.0.used.by.1=Von {1} verwendete Klassen in {0}
 doclet.ClassUse_PackageAnnotation=Packages mit Annotationen vom Typ {0}
 doclet.ClassUse_Annotation=Klassen in {1} mit Annotationen vom Typ {0}
 doclet.ClassUse_TypeParameter=Klassen in {1} mit Typparametern vom Typ {0}
+doclet.ClassUse_SubclassTypeParameter=Unterklassen mit Typargumenten vom Typ {0} in {1}
+doclet.ClassUse_SubinterfaceTypeParameter=Unterschnittstellen mit Typargumenten vom Typ {0} in {1}
+doclet.ClassUse_ImplementsTypeParameter=Klassen in {1}, die Schnittstellen mit Typargumenten vom Typ {0} implementieren
 doclet.ClassUse_MethodTypeParameter=Methoden in {1} mit Typparametern vom Typ {0}
 doclet.ClassUse_FieldTypeParameter=Felder in {1} mit Typparametern vom Typ {0}
 doclet.ClassUse_FieldAnnotations=Felder in {1} mit Annotationen vom Typ {0}
@@ -412,6 +418,8 @@ doclet.usage.nocomment.description=Beschreibung und Tags unterdrücken und nur D
 
 doclet.usage.nodeprecated.description=@deprecated-Informationen nicht aufnehmen
 
+doclet.usage.no-fonts.description=Keine Standardwebschriftarten in generierte Dokumentation aufnehmen
+
 doclet.usage.noqualifier.parameters=<name1>,<name2>,...
 doclet.usage.noqualifier.description=Liste der Qualifier aus der Ausgabe ausschließen.\n":" kann überall im Argument als Trennzeichen verwendet werden.
 
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties
index 1764587769b..ce56bc16325 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_ja.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2024, 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
@@ -116,17 +116,20 @@ doclet.tag.invalid_input=入力が無効です: ''{0}''
 doclet.tag.invalid=@{0}が無効です
 doclet.Deprecated_API=推奨されていないAPI
 doclet.Deprecated_API_Checkbox_Label=次で非推奨のAPIを表示:
+doclet.Deprecated_API_Checkbox_All_Releases=すべて
 doclet.Deprecated_API_Checkbox_Other_Releases=その他
 doclet.Deprecated_Elements=推奨されていない{0}
 doclet.Deprecated_Elements_Release_Column_Header=次で非推奨
 doclet.Deprecated_In_Release={0}で非推奨
 doclet.New_API=新規API
 doclet.New_API_Checkbox_Label=次で追加されたAPIを表示:
+doclet.New_API_Checkbox_All_Releases=すべて
 doclet.New_Elements=新規{0}
 doclet.New_Elements_Release_Column_Header=次で追加
 doclet.New_Label=新規
 doclet.Preview_API=プレビューAPI
 doclet.Preview_API_Checkbox_Label=次のプレビューAPIを表示:
+doclet.Preview_API_Checkbox_Toggle_All=すべて設定
 doclet.Preview_JEP_URL=https://openjdk.org/jeps/{0}
 doclet.Preview_Label=プレビュー
 doclet.Preview_Mark=PREVIEW
@@ -229,7 +232,7 @@ doclet.help.class_interface.property=プロパティはJavaFXの機能です。
 doclet.help.other_files.head=その他のファイル
 doclet.help.other_files.body=パッケージおよびモジュールには、周辺の宣言に関連する追加情報が記載されているページが含まれている場合があります。
 doclet.help.use.head=使用
-doclet.help.use.body=各ドキュメント化されたパッケージ、クラスおよびインタフェースにはそれぞれ「使用」ページがあります。このページには、どのようなパッケージ、クラス、メソッド、コンストラクタおよびフィールドが、特定のクラスまたはパッケージの一部を使用しているかが記述されています。たとえば、クラスAまたはインタフェースAの場合、その「使用」ページには、Aのサブクラス、Aとして宣言されるフィールド、Aを返すメソッドと、型Aのパラメータを持つメソッドおよびコンストラクタが含まれます。このページにアクセスするには、まずそのパッケージ、クラスまたはインタフェースに移動し、ナビゲーション・バーの「使用」リンクをクリックしてください。
+doclet.help.use.body=ドキュメント化された各パッケージ、クラスまたはインタフェースには、それぞれに「使用」ページがあります。このページにリストされているパッケージ、クラス、インタフェース、メソッド、コンストラクタおよびフィールドでは、ドキュメント化されたパッケージ、クラスまたはインタフェースの一部が使用されています。たとえば、クラスAまたはインタフェースAの場合、その「使用」ページには、Aのサブクラスまたはインタフェース、Aとして宣言されるフィールド、Aを返すメソッドと、型Aのパラメータが指定されたメソッドとコンストラクタ、および型Aのパラメータが指定されたサブクラスまたはサブインタフェースが含まれます。このページにアクセスするには、まずそのパッケージ、クラスまたはインタフェースに移動し、ナビゲーション・バーの「使用」リンクをクリックしてください。
 doclet.help.tree.head=階層ツリー(クラス階層)
 # 0: link to main Class Hierarchy page;  1: java.lang.Object
 doclet.help.tree.intro=すべてのパッケージには{0}ページがあり、さらに各パッケージの階層があります。各階層ページは、クラスのリストとインタフェースのリストを含みます。クラスは{1}を開始点とする継承構造で編成されます。インタフェースは、{1}からは継承しません。
@@ -284,6 +287,9 @@ doclet.ClassUse_Classes.in.0.used.by.1={1}により使用される{0}のクラ
 doclet.ClassUse_PackageAnnotation={0}型の注釈を持つパッケージ
 doclet.ClassUse_Annotation={0}型の注釈を持つ{1}のメソッド
 doclet.ClassUse_TypeParameter={0}型の型パラメータを持つ{1}のクラス
+doclet.ClassUse_SubclassTypeParameter={0}型の型引数を持つ{1}のサブクラス
+doclet.ClassUse_SubinterfaceTypeParameter={0}型の型引数を持つ{1}のサブインタフェース
+doclet.ClassUse_ImplementsTypeParameter={0}型の型引数を持つインタフェースを実装している{1}のクラス
 doclet.ClassUse_MethodTypeParameter={0}型の型パラメータを持つ{1}のメソッド
 doclet.ClassUse_FieldTypeParameter={0}型の型パラメータを持つ{1}のフィールド
 doclet.ClassUse_FieldAnnotations={0}型の注釈を持つ{1}のフィールド
@@ -412,6 +418,8 @@ doclet.usage.nocomment.description=記述およびタグを抑制して宣言の
 
 doclet.usage.nodeprecated.description=@deprecated情報を除外します
 
+doclet.usage.no-fonts.description=生成されるドキュメントに、標準にwebフォントを使用しないでください
+
 doclet.usage.noqualifier.parameters=<name1>,<name2>,...
 doclet.usage.noqualifier.description=出力から修飾子のリストを除外します。\n':'も、セパレータとして引数の任意の場所に使用できます。
 
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties
index 5dcd3dce996..c109d4c4237 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard_zh_CN.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2024, 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
@@ -116,17 +116,20 @@ doclet.tag.invalid_input=无效输入:''{0}''
 doclet.tag.invalid=@{0} 无效
 doclet.Deprecated_API=已过时的 API
 doclet.Deprecated_API_Checkbox_Label=显示在以下发行版中已过时的 API:
+doclet.Deprecated_API_Checkbox_All_Releases=全部
 doclet.Deprecated_API_Checkbox_Other_Releases=其他
 doclet.Deprecated_Elements=已过时的 {0}
 doclet.Deprecated_Elements_Release_Column_Header=在以下发行版中已过时
 doclet.Deprecated_In_Release=在 {0} 中已过时
 doclet.New_API=新建 API
 doclet.New_API_Checkbox_Label=显示在以下发行版中添加的 API:
+doclet.New_API_Checkbox_All_Releases=全部
 doclet.New_Elements=新建 {0}
 doclet.New_Elements_Release_Column_Header=在以下发行版中已添加
 doclet.New_Label=新建
 doclet.Preview_API=预览 API
 doclet.Preview_API_Checkbox_Label=显示预览 API:
+doclet.Preview_API_Checkbox_Toggle_All=全部切换
 doclet.Preview_JEP_URL=https://openjdk.org/jeps/{0}
 doclet.Preview_Label=预览
 doclet.Preview_Mark=PREVIEW
@@ -229,7 +232,7 @@ doclet.help.class_interface.property=属性是 JavaFX 的一个特性。
 doclet.help.other_files.head=其他文件
 doclet.help.other_files.body=程序包和模块所包含的页面中可能带有与附近声明相关的附加信息。
 doclet.help.use.head=使用
-doclet.help.use.body=每个已文档化的程序包、类和接口都有各自的“使用”页面。此页面介绍了使用给定类或程序包的任何部分的程序包、类、方法、构造器和字段。对于给定的类或接口 A,其“使用”页面包含 A 的子类、声明为 A 的字段、返回 A 的方法,以及带有类型为 A 的参数的方法和构造器。访问此页面的方法是:首先转至程序包、类或接口,然后单击导航栏中的“使用”链接。
+doclet.help.use.body=每个已文档化的程序包、类或接口都有各自的“使用”页面,其中列出了使用该程序包、类或接口的任何部分的程序包、类、接口、方法、构造器和字段。对于给定的类或接口 A,其“使用”页面包含 A 的子类或子接口、声明为 A 的字段、返回 A 的方法、带有类型为 A 的参数的方法和构造器,以及带有类型为 A 的参数的子类或子接口。访问此页面的方法是:首先转至程序包、类或接口,然后单击导航栏中的“使用”链接。
 doclet.help.tree.head=树 (类分层结构)
 # 0: link to main Class Hierarchy page;  1: java.lang.Object
 doclet.help.tree.intro=对于所有程序包,都有一个 {0} 页,以及每个程序包的分层结构。每个分层结构页都包含类的列表和接口的列表。从 {1} 开始,按继承结构对类进行排列。接口不从 {1} 继承。
@@ -284,6 +287,9 @@ doclet.ClassUse_Classes.in.0.used.by.1={1}使用的{0}中的类
 doclet.ClassUse_PackageAnnotation=批注类型为{0}的程序包
 doclet.ClassUse_Annotation=批注类型为{0}的{1}中的类
 doclet.ClassUse_TypeParameter=类型参数类型为{0}的{1}中的类
+doclet.ClassUse_SubclassTypeParameter={1} 中类型参数类型为 {0} 的子类
+doclet.ClassUse_SubinterfaceTypeParameter={1} 中类型参数类型为 {0} 的子接口
+doclet.ClassUse_ImplementsTypeParameter={1} 中实现类型参数类型为 {0} 的接口的类
 doclet.ClassUse_MethodTypeParameter=类型参数类型为{0}的{1}中的方法
 doclet.ClassUse_FieldTypeParameter=类型参数类型为{0}的{1}中的字段
 doclet.ClassUse_FieldAnnotations=批注类型为{0}的{1}中的字段
@@ -412,6 +418,8 @@ doclet.usage.nocomment.description=不生成说明和标记, 只生成声明
 
 doclet.usage.nodeprecated.description=不包含 @deprecated 信息
 
+doclet.usage.no-fonts.description=不要在生成的文档中包含标准 Web 字体
+
 doclet.usage.noqualifier.parameters=<name1>,<name2>,...
 doclet.usage.noqualifier.description=在输出中排除一系列限定符。\n还可以将 ':' 作为分隔符用于参数中的任何位置。
 
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css
index 8086e0d88b3..4e37588f6cd 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css
@@ -348,7 +348,7 @@ body.class-declaration-page .details h3 {
     flex-direction: row;
 }
 .main-grid main {
-    flex: 2.6 1 0;
+    flex: 3 1 0;
     min-width: 240px
 }
 .main-grid nav.toc {
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_de.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_de.properties
index 242be92fc8c..4e84cdc52c7 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_de.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_de.properties
@@ -249,6 +249,7 @@ doclet.linkMismatch_ModuleLinkedtoPackage=Der Code, der dokumentiert wird, verwe
 doclet.urlRedirected=URL {0} wurde umgeleitet an {1} - Aktualisieren Sie die Befehlszeilenoptionen, um diese Warnung zu unterdrücken.
 doclet.unexpectedRedirect=Unerwartete Umleitung für URL {0} zu {1}
 doclet.duplicate.comment.for.property=Doppelter Kommentar für Eigenschaft.\nEntfernen Sie den Kommentar auf dem Eigenschaftsfeld oder in dieser Methode, um diese Warnung zu unterdrücken.
+doclet.contains.diagnostic.markers=Die generierte Dokumentation enthält Diagnosemarker für eine ungültige Eingabe.
 
 #Documentation for Enums
 doclet.enum_values_doc.fullbody=Gibt ein Array mit den Konstanten dieses Enum-Typs in\nder Reihenfolge ihrer Deklaration zurück.
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_ja.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_ja.properties
index 986d3affe1f..515df706272 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_ja.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_ja.properties
@@ -249,6 +249,7 @@ doclet.linkMismatch_ModuleLinkedtoPackage=ドキュメント化しようとし
 doclet.urlRedirected=URL {0}は{1}にリダイレクトされました -- コマンドライン・オプションを更新してこの警告を表示しないようにしてください。
 doclet.unexpectedRedirect=URL {0}から{1}への予期しないリダイレクト
 doclet.duplicate.comment.for.property=プロパティのコメントが重複して\nいます。プロパティ・フィールドまたはこのメソッドのコメントを削除してこの警告を出さないようにしてください。
+doclet.contains.diagnostic.markers=生成されたドキュメンテーションには、無効な入力の診断マーカーがあります。
 
 #Documentation for Enums
 doclet.enum_values_doc.fullbody=この列挙型の定数を含む配列を宣言されている順序で\n返します。
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_zh_CN.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_zh_CN.properties
index 99a31b3eec5..d01d42faa56 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_zh_CN.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets_zh_CN.properties
@@ -249,6 +249,7 @@ doclet.linkMismatch_ModuleLinkedtoPackage=进行文档化的代码使用了模
 doclet.urlRedirected=URL {0} 已重定向到 {1} — 更新命令行选项以隐藏此警告。
 doclet.unexpectedRedirect=URL {0} 意外重定向到 {1}
 doclet.duplicate.comment.for.property=属性注释重复。\n删除属性字段或此方法的注释以隐藏此警告。
+doclet.contains.diagnostic.markers=生成的文档包含无效输入的诊断标记。
 
 #Documentation for Enums
 doclet.enum_values_doc.fullbody=返回包含该枚举类型的常量的数组,\n顺序与声明这些常量的顺序相同
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java
index 8fbdce922fe..d33e4874c00 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/Checker.java
@@ -690,7 +690,9 @@ public Void visitAttribute(AttributeTree tree, Void ignore) {
             }
             // for now, doclint allows all attribute names beginning with "on" as event handler names,
             // without checking the validity or applicability of the name
-            if (!name.toString().startsWith("on")) {
+            // custom "data-*" attributes are also accepted
+            var attrName = name.toString();
+            if (!attrName.startsWith("on") && !attrName.startsWith("data-")) {
                 AttrKind k = currTag.getAttrKind(name);
                 switch (k) {
                     case OK -> { }
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java
index 68495019c16..0c820dae913 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclint/HtmlTag.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, 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
@@ -434,57 +434,76 @@ public enum Flag {
 
     public enum Attr {
         ABBR,
+        ACCESSKEY(true),
         ALIGN,
         ALINK,
         ALT,
-        ARIA_ACTIVEDESCENDANT,
-        ARIA_CONTROLS,
-        ARIA_DESCRIBEDBY,
-        ARIA_EXPANDED,
-        ARIA_LABEL,
-        ARIA_LABELLEDBY,
-        ARIA_LEVEL,
-        ARIA_MULTISELECTABLE,
-        ARIA_OWNS,
-        ARIA_POSINSET,
-        ARIA_SETSIZE,
-        ARIA_READONLY,
-        ARIA_REQUIRED,
-        ARIA_SELECTED,
-        ARIA_SORT,
+        ARIA_ACTIVEDESCENDANT(true),
+        ARIA_CONTROLS(true),
+        ARIA_DESCRIBEDBY(true),
+        ARIA_EXPANDED(true),
+        ARIA_LABEL(true),
+        ARIA_LABELLEDBY(true),
+        ARIA_LEVEL(true),
+        ARIA_MULTISELECTABLE(true),
+        ARIA_OWNS(true),
+        ARIA_POSINSET(true),
+        ARIA_READONLY(true),
+        ARIA_REQUIRED(true),
+        ARIA_SELECTED(true),
+        ARIA_SETSIZE(true),
+        ARIA_SORT(true),
+        AUTOCAPITALIZE(true),
+        AUTOFOCUS(true),
         AXIS,
         BACKGROUND,
         BGCOLOR,
         BORDER,
-        CELLSPACING,
         CELLPADDING,
+        CELLSPACING,
         CHAR,
         CHAROFF,
         CHARSET,
         CITE,
+        CLASS(true),
         CLEAR,
-        CLASS,
         COLOR,
         COLSPAN,
         COMPACT,
+        CONTENTEDITABLE(true),
         COORDS,
         CROSSORIGIN,
         DATETIME,
+        DIR(true),
+        DRAGGABLE(true),
+        ENTERKEYHINT(true),
         FACE,
         FRAME,
         FRAMEBORDER,
         HEADERS,
         HEIGHT,
+        HIDDEN(true),
         HREF,
         HSPACE,
-        ID,
+        ID(true),
+        INERT(true),
+        INPUTMODE(true),
+        IS(true),
+        ITEMID(true),
+        ITEMPROP(true),
+        ITEMREF(true),
+        ITEMSCOPE(true),
+        ITEMTYPE(true),
+        LANG(true),
         LINK,
         LONGDESC,
         MARGINHEIGHT,
         MARGINWIDTH,
         NAME,
+        NONCE(true),
         NOSHADE,
         NOWRAP,
+        POPOVER(true),
         PROFILE,
         REV,
         REVERSED,
@@ -497,24 +516,39 @@ public enum Attr {
         SHAPE,
         SIZE,
         SPACE,
+        SPELLCHECK(true),
         SRC,
         START,
-        STYLE,
+        STYLE(true),
         SUMMARY,
+        TABINDEX(true),
         TARGET,
         TEXT,
+        TITLE(true),
+        TRANSLATE(true),
         TYPE,
         VALIGN,
         VALUE,
         VERSION,
         VLINK,
         VSPACE,
-        WIDTH;
+        WIDTH,
+        WRITINGSUGGESTIONS(true);
 
         private final String name;
+        private final boolean isGlobal;
 
         Attr() {
+            this(false);
+        }
+
+        Attr(boolean flag) {
             name = StringUtils.toLowerCase(name().replace("_", "-"));
+            isGlobal = flag;
+        }
+
+        public boolean isGlobal() {
+            return isGlobal;
         }
 
         public String getText() {
@@ -632,8 +666,13 @@ public Attr getAttr(Name attrName) {
     }
 
     public AttrKind getAttrKind(Name attrName) {
-        AttrKind k = attrs.get(getAttr(attrName)); // null-safe
-        return (k == null) ? AttrKind.INVALID : k;
+        Attr attr = getAttr(attrName);
+        if (attr == null) {
+            return AttrKind.INVALID;
+        }
+        return attr.isGlobal() ?
+                AttrKind.OK :
+                attrs.getOrDefault(attr, AttrKind.INVALID);
     }
 
     private static AttrMap attrs(AttrKind k, Attr... attrs) {
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_de.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_de.properties
index f8c3c086390..2192bfb3395 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_de.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_de.properties
@@ -159,6 +159,8 @@ main.opt.add.reads.desc=Gibt weitere Module an, die als von einem angegebenen Mo
 main.opt.patch.module.arg=<Modul>=<Datei>(:<Datei>)*
 main.opt.patch.module.desc=Setzt ein Modul außer Kraft oder erweitert es mit Klassen\nund Ressourcen in JAR-Dateien oder Verzeichnissen
 
+main.opt.disable.line.doc.comments.desc=Unterstützung für Dokumentationskommentare mit Zeilen,\ndie mit "///" beginnen, deaktivieren
+
 main.Xusage.foot=\nDies sind keine Standardoptionen, und sie können ohne Vorankündigung geändert werden.
 
 main.doclet.usage.header=\nBereitgestellt vom Doclet {0}:
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_ja.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_ja.properties
index 725497fecab..1cafe4d6ad5 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_ja.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_ja.properties
@@ -159,6 +159,8 @@ main.opt.add.reads.desc=指定のモジュールで必須とみなされるよ
 main.opt.patch.module.arg=<module>=<file>(:<file>)*
 main.opt.patch.module.desc=JARファイルまたはディレクトリのクラスおよびリソースでモジュールを\n        オーバーライドまたは拡張します
 
+main.opt.disable.line.doc.comments.desc='///'で行を開始すると、ドキュメンテーション・コメントのサポートが\n無効化されます
+
 main.Xusage.foot=\nこれらは非標準オプションであり予告なしに変更されることがあります。
 
 main.doclet.usage.header=\n{0} docletにより提供されるもの:
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_zh_CN.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_zh_CN.properties
index 41d065f5b1c..4ad91361e06 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_zh_CN.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc_zh_CN.properties
@@ -159,6 +159,8 @@ main.opt.add.reads.desc=指定被视为给定模块需要的其他模块。\n<
 main.opt.patch.module.arg=<模块>=<文件>(:<文件>)*
 main.opt.patch.module.desc=使用\nJAR 文件或目录中的类和资源覆盖\n        或增强模块
 
+main.opt.disable.line.doc.comments.desc=禁用对带有以 '///' 开头的行的文档注释\n的支持
+
 main.Xusage.foot=\n这些选项都是非标准选项, 如有更改, 恕不另行通知。
 
 main.doclet.usage.header=\n由 {0} doclet 提供:
diff --git a/src/jdk.javadoc/share/man/javadoc.1 b/src/jdk.javadoc/share/man/javadoc.1
index 73d12efbf30..4e256a7ce38 100644
--- a/src/jdk.javadoc/share/man/javadoc.1
+++ b/src/jdk.javadoc/share/man/javadoc.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JAVADOC" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JAVADOC" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
@@ -218,7 +218,7 @@ summary is required.
 For more explicit control in any individual documentation comment,
 enclose the contents of the first sentence in a
 \f[V]{\[at]summary ...}\f[R] tag, or when applicable, in a
-\[ga]{\[at]return ...} tag.
+\f[V]{\[at]return ...}\f[R] tag.
 .RE
 .TP
 \f[V]-doclet\f[R] \f[I]class\f[R]
@@ -522,7 +522,8 @@ Allow JavaScript in documentation comments, and options whose value is
 \f[I]html-code\f[R].
 .TP
 \f[V]-author\f[R]
-Includes the \f[V]\[at]author\f[R] text in the generated docs.
+Includes the text of any \f[V]author\f[R] tags in the generated
+documentation.
 .TP
 \f[V]-bottom\f[R] \f[I]html-code\f[R]
 Specifies the text to be placed at the bottom of each generated page.
@@ -986,8 +987,8 @@ is used.
 .RE
 .TP
 \f[V]-nosince\f[R]
-Omits from the generated documents the \f[V]Since\f[R] sections
-associated with the \f[V]\[at]since\f[R] tags.
+Omits from the generated documentation the \f[V]Since\f[R] sections
+derived from any \f[V]since\f[R] tags.
 .TP
 \f[V]-notimestamp\f[R]
 Suppresses the time stamp, which is hidden in an HTML comment in the
@@ -1020,9 +1021,6 @@ to the current working directory.
 .PP
 The file may be an HTML file, with a filename ending in \f[V].html\f[R],
 or a Markdown file, with a filename ending in \f[V].md\f[R].
-.PD 0
-.P
-.PD
 If the file is an HTML file, the content for the overview documentation
 is taken from the \f[V]<main>\f[R] element in the file, if one is
 present, or from the \f[V]<body>\f[R] element is there is no
@@ -1213,10 +1211,11 @@ To access the generated Use page, go to the class or package and click
 the \f[B]USE\f[R] link in the navigation bar.
 .TP
 \f[V]-version\f[R]
-Includes the version text in the generated docs.
+Includes the text of any \f[V]version\f[R] tags in the generated
+documentation.
 This text is omitted by default.
-To find out what version of the \f[V]javadoc\f[R] tool you are using,
-use the \f[V]--version\f[R] option (with two hyphens).
+Note: To find out what version of the \f[V]javadoc\f[R] tool you are
+using, use the \f[V]--version\f[R] option (with two hyphens).
 .TP
 \f[V]-windowtitle\f[R] \f[I]title\f[R]
 Specifies the title to be placed in the HTML \f[V]<title>\f[R] tag.
diff --git a/src/jdk.jcmd/share/man/jcmd.1 b/src/jdk.jcmd/share/man/jcmd.1
index c88d2a22a41..ec87ee3ae47 100644
--- a/src/jdk.jcmd/share/man/jcmd.1
+++ b/src/jdk.jcmd/share/man/jcmd.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JCMD" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JCMD" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
@@ -528,7 +528,7 @@ is not used: \[aq]m\[aq] or \[aq]M\[aq] for megabytes OR \[aq]g\[aq] or
 If no name is given, data from all recordings is dumped.
 (STRING, no default value)
 .IP \[bu] 2
-\f[V]path-to-gc-root\f[R]: (Optional) Flag for saving the path to
+\f[V]path-to-gc-roots\f[R]: (Optional) Flag for saving the path to
 garbage collection (GC) roots at the time the recording data is dumped.
 The path information is useful for finding memory leaks but collecting
 it can cause the application to pause for a short period of time.
@@ -606,7 +606,7 @@ Make note of the generated name that is shown in the response to the
 command so that you can use it with other commands.
 (STRING, system-generated default name)
 .IP \[bu] 2
-\f[V]path-to-gc-root\f[R]: (Optional) Flag for saving the path to
+\f[V]path-to-gc-roots\f[R]: (Optional) Flag for saving the path to
 garbage collection (GC) roots at the end of a recording.
 The path information is useful for finding memory leaks but collecting
 it is time consuming.
@@ -681,6 +681,55 @@ If no path is provided, the data from the recording is discarded.
 value)
 .RE
 .TP
+\f[V]JFR.view\f[R] [\f[I]options\f[R]]
+Display event data in predefined views.
+.RS
+.PP
+Impact: Medium
+.PP
+\f[B]Note:\f[R]
+.PP
+The \f[I]options\f[R] must be specified using either \f[I]key\f[R] or
+\f[I]key\f[R]\f[V]=\f[R]\f[I]value\f[R] syntax.
+If no parameters are entered, then a list of available views are
+displayed.
+.PP
+\f[I]options\f[R]:
+.IP \[bu] 2
+\f[V]cell-height\f[R]: (Optional) Maximum number of rows in a table
+cell.
+(INT, default value depends on the view)
+.IP \[bu] 2
+\f[V]maxage\f[R]: (Optional) Length of time for the view to span.
+(INT followed by \[aq]s\[aq] for seconds \[aq]m\[aq] for minutes or
+\[aq]h\[aq] for hours, default value is 10m)
+.IP \[bu] 2
+\f[V]maxsize\f[R]: (Optional) Maximum size for the view to span in bytes
+if one of the following suffixes is not used: \[aq]m\[aq] or \[aq]M\[aq]
+for megabytes OR \[aq]g\[aq] or \[aq]G\[aq] for gigabytes.
+(STRING, default value is 32MB)
+.IP \[bu] 2
+\f[V]truncate\f[R]: (Optional) Maximum number of rows in a table cell.
+(INT, default value depends on the view)
+.IP \[bu] 2
+\f[V]verbose\f[R]: (Optional) Displays the query that makes up the view.
+(BOOLEAN, default value is false)
+.IP \[bu] 2
+\f[V]width\f[R]: (Optional) The width of the view in characters.
+(INT, default value depends on the view)
+.PP
+\f[I]arguments\f[R]:
+.IP \[bu] 2
+\f[V]view\f[R]: Name of the view or event type to display.
+Use \f[V]help JFR.view\f[R] to see a list of available views.
+(STRING, no default value)
+.PP
+The view parameter can be an event type name.
+Use \f[V]JFR.view types\f[R] to see a list.
+To display all views, use \f[V]JFR.view all-views\f[R].
+To display all events, use \f[V]JFR.view all-events\f[R].
+.RE
+.TP
 \f[V]JVMTI.agent_load\f[R] [\f[I]arguments\f[R]]
 Loads JVMTI native agent.
 .RS
diff --git a/src/jdk.jcmd/share/man/jinfo.1 b/src/jdk.jcmd/share/man/jinfo.1
index fc87807c6fe..49d8a852633 100644
--- a/src/jdk.jcmd/share/man/jinfo.1
+++ b/src/jdk.jcmd/share/man/jinfo.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JINFO" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JINFO" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jcmd/share/man/jmap.1 b/src/jdk.jcmd/share/man/jmap.1
index 4865f43d1c4..42831aa68ac 100644
--- a/src/jdk.jcmd/share/man/jmap.1
+++ b/src/jdk.jcmd/share/man/jmap.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JMAP" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JMAP" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jcmd/share/man/jps.1 b/src/jdk.jcmd/share/man/jps.1
index be506be2e82..cbc69872b60 100644
--- a/src/jdk.jcmd/share/man/jps.1
+++ b/src/jdk.jcmd/share/man/jps.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JPS" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JPS" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jcmd/share/man/jstack.1 b/src/jdk.jcmd/share/man/jstack.1
index 9effcb0902f..933db5fc80d 100644
--- a/src/jdk.jcmd/share/man/jstack.1
+++ b/src/jdk.jcmd/share/man/jstack.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JSTACK" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JSTACK" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jcmd/share/man/jstat.1 b/src/jdk.jcmd/share/man/jstat.1
index dd7d3832908..22e111a812b 100644
--- a/src/jdk.jcmd/share/man/jstat.1
+++ b/src/jdk.jcmd/share/man/jstat.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JSTAT" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JSTAT" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties b/src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties
index b0efddf5ed3..e6859fd8d74 100644
--- a/src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties
+++ b/src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties
@@ -282,7 +282,7 @@ USERNAME_ACCESSIBLE_NAME=Benutzername
 USER_DATA=UserData
 VIRTUAL_MACHINE=Virtuelle Maschine
 VM_ARGUMENTS=VM-Argumente
-VMINTERNAL_FRAME_ACCESSIBLE_DESCRIPTION=Innerer Frame für die Überwachung einer Java Virtual Machine
+VMINTERNAL_FRAME_ACCESSIBLE_DESCRIPTION=Innerer Frame für das Monitoring einer Java Virtual Machine
 VALUE=Wert
 VENDOR=Hersteller
 VERBOSE_OUTPUT=Verbose-Ausgabe
diff --git a/src/jdk.jconsole/share/man/jconsole.1 b/src/jdk.jconsole/share/man/jconsole.1
index ce1f948e6f1..ec70040acf4 100644
--- a/src/jdk.jconsole/share/man/jconsole.1
+++ b/src/jdk.jconsole/share/man/jconsole.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JCONSOLE" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JCONSOLE" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java b/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java
index 839ac2fd041..3b9336c499d 100644
--- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -208,7 +208,7 @@ public void write(Attribute<?> a, CodeAttribute lr) {
                             indent(+1);
                             first = false;
                         }
-                        for (var flag : info.flags()) {
+                        for (var flag : maskToAccessFlagsReportUnknown(access_flags, AccessFlag.Location.INNER_CLASS)) {
                             if (flag.sourceModifier() && (flag != AccessFlag.ABSTRACT
                                     || !info.has(AccessFlag.INTERFACE))) {
                                 print(Modifier.toString(flag.mask()) + " ");
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java b/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java
index 8629957f907..64eecf92082 100644
--- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,12 @@
 package com.sun.tools.javap;
 
 import java.io.PrintWriter;
+import java.lang.classfile.AccessFlags;
+import java.lang.reflect.AccessFlag;
+import java.lang.reflect.Modifier;
+import java.util.EnumMap;
+import java.util.Map;
+import java.util.Set;
 import java.util.function.Supplier;
 
 /*
@@ -38,6 +44,26 @@
  *  deletion without notice.</b>
  */
 public class BasicWriter {
+    private static final Map<AccessFlag.Location, Integer> LOCATION_MASKS;
+
+    static {
+        var map = new EnumMap<AccessFlag.Location, Integer>(AccessFlag.Location.class);
+        for (var loc : AccessFlag.Location.values()) {
+            map.put(loc, 0);
+        }
+
+        for (var flag : AccessFlag.values()) {
+            for (var loc : flag.locations()) {
+                map.compute(loc, (_, v) -> v | flag.mask());
+            }
+        }
+
+        // Peculiarities from AccessFlag.maskToAccessFlag
+        map.compute(AccessFlag.Location.METHOD, (_, v) -> v | Modifier.STRICT);
+
+        LOCATION_MASKS = map;
+    }
+
     protected BasicWriter(Context context) {
         lineWriter = LineWriter.instance(context);
         out = context.get(PrintWriter.class);
@@ -46,6 +72,20 @@ protected BasicWriter(Context context) {
             throw new AssertionError();
     }
 
+    protected Set<AccessFlag> flagsReportUnknown(AccessFlags flags) {
+        return maskToAccessFlagsReportUnknown(flags.flagsMask(), flags.location());
+    }
+
+    protected Set<AccessFlag> maskToAccessFlagsReportUnknown(int mask, AccessFlag.Location location) {
+        try {
+            return AccessFlag.maskToAccessFlags(mask, location);
+        } catch (IllegalArgumentException ex) {
+            mask &= LOCATION_MASKS.get(location);
+            report("Access Flags: " + ex.getMessage());
+            return AccessFlag.maskToAccessFlags(mask, location);
+        }
+    }
+
     protected void print(String s) {
         lineWriter.print(s);
     }
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java
index edf3d803af3..2483e99e49a 100644
--- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java
@@ -417,7 +417,7 @@ protected void writeField(FieldModel f) {
             return;
 
         var flags = AccessFlags.ofField(f.flags().flagsMask());
-        writeModifiers(flags.flags().stream().filter(fl -> fl.sourceModifier())
+        writeModifiers(flagsReportUnknown(flags).stream().filter(fl -> fl.sourceModifier())
                 .map(fl -> Modifier.toString(fl.mask())).toList());
         print(() -> sigPrinter.print(
                 f.findAttribute(Attributes.signature())
@@ -446,7 +446,7 @@ protected void writeField(FieldModel f) {
 
         if (options.verbose)
             writeList(String.format("flags: (0x%04x) ", flags.flagsMask()),
-                    flags.flags().stream().map(fl -> "ACC_" + fl.name()).toList(),
+                    flagsReportUnknown(flags).stream().map(fl -> "ACC_" + fl.name()).toList(),
                     "\n");
 
         if (options.showAllAttrs) {
@@ -478,7 +478,7 @@ protected void writeMethod(MethodModel m) {
         int flags = m.flags().flagsMask();
 
         var modifiers = new ArrayList<String>();
-        for (var f : AccessFlags.ofMethod(flags).flags())
+        for (var f : flagsReportUnknown(m.flags()))
             if (f.sourceModifier()) modifiers.add(Modifier.toString(f.mask()));
 
         String name = "???";
@@ -561,7 +561,7 @@ protected void writeMethod(MethodModel m) {
             StringBuilder sb = new StringBuilder();
             String sep = "";
             sb.append(String.format("flags: (0x%04x) ", flags));
-            for (var f : AccessFlags.ofMethod(flags).flags()) {
+            for (var f : flagsReportUnknown(m.flags())) {
                 sb.append(sep).append("ACC_").append(f.name());
                 sep = ", ";
             }
@@ -794,17 +794,9 @@ else switch (c) {
         }
     }
 
-    private static Set<String> getClassModifiers(int mask) {
-        return getModifiers(AccessFlags.ofClass((mask & ACC_INTERFACE) != 0
-                ? mask & ~ACC_ABSTRACT : mask).flags());
-    }
-
-    private static Set<String> getMethodModifiers(int mask) {
-        return getModifiers(AccessFlags.ofMethod(mask).flags());
-    }
-
-    private static Set<String> getFieldModifiers(int mask) {
-        return getModifiers(AccessFlags.ofField(mask).flags());
+    private Set<String> getClassModifiers(int mask) {
+        return getModifiers(flagsReportUnknown(AccessFlags.ofClass((mask & ACC_INTERFACE) != 0
+                ? mask & ~ACC_ABSTRACT : mask)));
     }
 
     private static Set<String> getModifiers(Set<java.lang.reflect.AccessFlag> flags) {
@@ -814,16 +806,16 @@ private static Set<String> getModifiers(Set<java.lang.reflect.AccessFlag> flags)
         return s;
     }
 
-    private static Set<String> getClassFlags(int mask) {
-        return getFlags(mask, AccessFlags.ofClass(mask).flags());
+    private Set<String> getClassFlags(int mask) {
+        return getFlags(mask, flagsReportUnknown(AccessFlags.ofClass(mask)));
     }
 
-    private static Set<String> getMethodFlags(int mask) {
-        return getFlags(mask, AccessFlags.ofMethod(mask).flags());
+    private Set<String> getMethodFlags(int mask) {
+        return getFlags(mask, flagsReportUnknown(AccessFlags.ofMethod(mask)));
     }
 
-    private static Set<String> getFieldFlags(int mask) {
-        return getFlags(mask, AccessFlags.ofField(mask).flags());
+    private Set<String> getFieldFlags(int mask) {
+        return getFlags(mask, flagsReportUnknown(AccessFlags.ofField(mask)));
     }
 
     private static Set<String> getFlags(int mask, Set<java.lang.reflect.AccessFlag> flags) {
@@ -840,42 +832,6 @@ private static Set<String> getFlags(int mask, Set<java.lang.reflect.AccessFlag>
         return s;
     }
 
-    public static enum AccessFlag {
-        ACC_PUBLIC      (ClassFile.ACC_PUBLIC,       "public",       true,  true,  true,  true ),
-        ACC_PRIVATE     (ClassFile.ACC_PRIVATE,      "private",      false, true,  true,  true ),
-        ACC_PROTECTED   (ClassFile.ACC_PROTECTED,    "protected",    false, true,  true,  true ),
-        ACC_STATIC      (ClassFile.ACC_STATIC,       "static",       false, true,  true,  true ),
-        ACC_FINAL       (ClassFile.ACC_FINAL,        "final",        true,  true,  true,  true ),
-        ACC_SUPER       (ClassFile.ACC_SUPER,        null,           true,  false, false, false),
-        ACC_SYNCHRONIZED(ClassFile.ACC_SYNCHRONIZED, "synchronized", false, false, false, true ),
-        ACC_VOLATILE    (ClassFile.ACC_VOLATILE,     "volatile",     false, false, true,  false),
-        ACC_BRIDGE      (ClassFile.ACC_BRIDGE,       null,           false, false, false, true ),
-        ACC_TRANSIENT   (ClassFile.ACC_TRANSIENT,    "transient",    false, false, true,  false),
-        ACC_VARARGS     (ClassFile.ACC_VARARGS,      null,           false, false, false, true ),
-        ACC_NATIVE      (ClassFile.ACC_NATIVE,       "native",       false, false, false, true ),
-        ACC_INTERFACE   (ClassFile.ACC_INTERFACE,    null,           true,   true, false, false),
-        ACC_ABSTRACT    (ClassFile.ACC_ABSTRACT,     "abstract",     true,   true, false, true ),
-        ACC_STRICT      (ClassFile.ACC_STRICT,       "strictfp",     false, false, false, true ),
-        ACC_SYNTHETIC   (ClassFile.ACC_SYNTHETIC,    null,           true,  true,  true,  true ),
-        ACC_ANNOTATION  (ClassFile.ACC_ANNOTATION,   null,           true,   true, false, false),
-        ACC_ENUM        (ClassFile.ACC_ENUM,         null,           true,   true, true,  false),
-        ACC_MODULE      (ClassFile.ACC_MODULE,       null,           true,  false, false, false);
-
-        public final int flag;
-        public final String modifier;
-        public final boolean isClass, isInnerClass, isField, isMethod;
-
-        AccessFlag(int flag, String modifier, boolean isClass,
-                boolean isInnerClass, boolean isField, boolean isMethod) {
-            this.flag = flag;
-            this.modifier = modifier;
-            this.isClass = isClass;
-            this.isInnerClass = isInnerClass;
-            this.isField = isField;
-            this.isMethod = isMethod;
-        }
-    }
-
     private final Options options;
     private final AttributeWriter attrWriter;
     private final CodeWriter codeWriter;
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java b/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java
index d8fa59c2dd0..b797ef73522 100644
--- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java
@@ -867,7 +867,7 @@ private JavaFileObject getClassFileObject(String className) throws IOException {
             if (moduleLocation != null) {
                 fo = fileManager.getJavaFileForInput(moduleLocation, className, JavaFileObject.Kind.CLASS);
             } else {
-                if (className.indexOf('.') > 0) {
+                if (className.indexOf('.') > 0 || className.indexOf('/') > 0) {
                     //search for classes with a named package in the JDK modules specifed by --system option first
                     try {
                         for (Set<Location> locations: fileManager.listLocationsForModules(StandardLocation.SYSTEM_MODULES)) {
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_de.properties b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_de.properties
index 44265e8a6a5..1c98b4cac6a 100644
--- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_de.properties
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_de.properties
@@ -100,6 +100,8 @@ main.opt.constants=\  -constants                       Zeigt die endgültigen Ko
 
 main.opt.sysinfo=\  -sysinfo                         Zeigt die Systeminformationen (Pfad, Größe, Datum, SHA-256-Hash)\n                                   der Klasse, die verarbeitet wird
 
+main.opt.verify=\  -verify                          Gibt zusätzliche Klassenverifizierungsinformationen aus
+
 main.opt.module=\  --module <Modul>  -m <Modul>   Gibt das Modul an, das die zu disassemblierenden Klassen enthält
 
 main.opt.J=\  -J<vm-option>                    Gibt eine VM-Option an
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties
index 01e587336c5..4cc9e83070d 100644
--- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties
@@ -100,6 +100,8 @@ main.opt.constants=\  -constants                       final定数を表示す
 
 main.opt.sysinfo=\  -sysinfo                         処理しているクラスのシステム情報(パス、サイズ、日付、SHA-256ハッシュ)\n                                   を表示します
 
+main.opt.verify=\  -verify                          クラスの検証情報が追加で出力されます
+
 main.opt.module=\  --module <module>  -m <module>   逆アセンブルされるクラスを含むモジュールを指定する
 
 main.opt.J=\  -J<vm-option>                    VMオプションを指定する
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties
index 57e3e6ac2eb..77c2fdd6b63 100644
--- a/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties
@@ -100,6 +100,8 @@ main.opt.constants=\  -constants                       显示最终常量
 
 main.opt.sysinfo=\  -sysinfo                         显示正在处理的类的\n                                   系统信息(路径、大小、日期、SHA-256 散列)
 
+main.opt.verify=\  -verify                          输出其他类验证信息
+
 main.opt.module=\  --module <module>  -m <module>   指定包含要反汇编的类的模块
 
 main.opt.J=\  -J<vm-option>                    指定 VM 选项
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/Main.java b/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/Main.java
index c67510de441..f77d29a8bfa 100644
--- a/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/Main.java
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeprscan/Main.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -414,7 +414,7 @@ boolean processRelease(String release, Collection<String> classes) throws IOExce
                              .noneMatch(n -> n.equals(release))) {
                 return false;
             }
-            JavaFileManager fm = pp.getPlatform(release, "").getFileManager();
+            JavaFileManager fm = pp.getPlatformTrusted(release).getFileManager();
             List<String> classNames = new ArrayList<>();
             for (JavaFileObject fo : fm.list(StandardLocation.PLATFORM_CLASS_PATH,
                                              "",
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassFileSource.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassFileSource.java
new file mode 100644
index 00000000000..754904c9c7f
--- /dev/null
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassFileSource.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2024, 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 com.sun.tools.jnativescan;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.lang.module.ModuleReader;
+import java.lang.module.ModuleReference;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.jar.JarFile;
+import java.util.stream.Stream;
+import java.util.zip.ZipFile;
+
+sealed interface ClassFileSource {
+    String moduleName();
+    Path path();
+
+    Stream<byte[]> classFiles(Runtime.Version version) throws IOException;
+
+    record Module(ModuleReference reference) implements ClassFileSource {
+        @Override
+        public String moduleName() {
+            return reference.descriptor().name();
+        }
+
+        @Override
+        public Path path() {
+            URI location = reference.location().orElseThrow();
+            return Path.of(location);
+        }
+
+        @Override
+        public Stream<byte[]> classFiles(Runtime.Version version) throws IOException {
+            ModuleReader reader = reference().open();
+            return reader.list()
+                .filter(resourceName -> resourceName.endsWith(".class"))
+                .map(resourceName -> {
+                    try (InputStream stream = reader.open(resourceName).orElseThrow()) {
+                        return stream.readAllBytes();
+                    } catch (IOException e) {
+                        throw new UncheckedIOException(e);
+                    }
+                }).onClose(() -> {
+                    try {
+                        reader.close();
+                    } catch (IOException e) {
+                        throw new UncheckedIOException(e);
+                    }
+                });
+        }
+    }
+
+    record ClassPathJar(Path path) implements ClassFileSource {
+        @Override
+        public String moduleName() {
+            return "ALL-UNNAMED";
+        }
+
+        @Override
+        public Stream<byte[]> classFiles(Runtime.Version version) throws IOException {
+            JarFile jf = new JarFile(path().toFile(), false, ZipFile.OPEN_READ, version);
+            return jf.versionedStream()
+                .filter(je -> je.getName().endsWith(".class"))
+                .map(je -> {
+                    try (InputStream stream = jf.getInputStream(je)){
+                        return stream.readAllBytes();
+                    } catch (IOException e) {
+                        throw new UncheckedIOException(e);
+                    }
+                }).onClose(() -> {
+                    try {
+                        jf.close();
+                    } catch (IOException e) {
+                        throw new UncheckedIOException(e);
+                    }
+                });
+        }
+    }
+
+    record ClassPathDirectory(Path path) implements ClassFileSource {
+        @Override
+        public String moduleName() {
+            return "ALL-UNNAMED";
+        }
+
+        @Override
+        public Stream<byte[]> classFiles(Runtime.Version version) throws IOException {
+            return Files.walk(path)
+                .filter(file -> Files.isRegularFile(file) && file.toString().endsWith(".class"))
+                .map(file -> {
+                    try (InputStream stream = Files.newInputStream(file)){
+                        return stream.readAllBytes();
+                    } catch (IOException e) {
+                        throw new UncheckedIOException(e);
+                    }
+                });
+        }
+    }
+}
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassResolver.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassResolver.java
new file mode 100644
index 00000000000..7a267a58aa5
--- /dev/null
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/ClassResolver.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2024, 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 com.sun.tools.jnativescan;
+
+import com.sun.tools.javac.platform.PlatformDescription;
+import com.sun.tools.javac.platform.PlatformProvider;
+
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardLocation;
+import java.io.IOException;
+import java.lang.classfile.ClassFile;
+import java.lang.classfile.ClassModel;
+import java.lang.constant.ClassDesc;
+import java.lang.module.ModuleDescriptor;
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.stream.Stream;
+
+abstract class ClassResolver implements AutoCloseable {
+
+    static ClassResolver forClassFileSources(List<ClassFileSource> sources, Runtime.Version version) throws IOException {
+        Map<ClassDesc, Info> classMap = new HashMap<>();
+        for (ClassFileSource source : sources) {
+            try (Stream<byte[]> classFiles = source.classFiles(version)) {
+                classFiles.forEach(bytes -> {
+                    ClassModel model = ClassFile.of().parse(bytes);
+                    ClassDesc desc = model.thisClass().asSymbol();
+                    classMap.put(desc, new Info(source, model));
+                });
+            }
+        }
+        return new SimpleClassResolver(classMap);
+    }
+
+    static ClassResolver forSystemModules(Runtime.Version version) {
+        String platformName = String.valueOf(version.feature());
+        PlatformProvider platformProvider = ServiceLoader.load(PlatformProvider.class).findFirst().orElseThrow();
+        PlatformDescription platform;
+        try {
+            platform = platformProvider.getPlatform(platformName, null);
+        } catch (PlatformProvider.PlatformNotSupported e) {
+            throw new JNativeScanFatalError("Release: " + platformName + " not supported", e);
+        }
+        JavaFileManager fm = platform.getFileManager();
+        return new SystemModuleClassResolver(fm);
+    }
+
+    record Info(ClassFileSource source, ClassModel model) {}
+
+    public abstract void forEach(BiConsumer<ClassDesc, ClassResolver.Info> action);
+    public abstract Optional<ClassResolver.Info> lookup(ClassDesc desc);
+
+    @Override
+    public abstract void close() throws IOException;
+
+    private static class SimpleClassResolver extends ClassResolver {
+
+        private final Map<ClassDesc, ClassResolver.Info> classMap;
+
+        public SimpleClassResolver(Map<ClassDesc, Info> classMap) {
+            this.classMap = classMap;
+        }
+
+        public void forEach(BiConsumer<ClassDesc, ClassResolver.Info> action) {
+            classMap.forEach(action);
+        }
+
+        public Optional<ClassResolver.Info> lookup(ClassDesc desc) {
+            return Optional.ofNullable(classMap.get(desc));
+        }
+
+        @Override
+        public void close() {}
+    }
+
+    private static class SystemModuleClassResolver extends ClassResolver {
+
+        private final JavaFileManager platformFileManager;
+        private final Map<String, String> packageToSystemModule;
+        private final Map<ClassDesc, Info> cache = new HashMap<>();
+
+        public SystemModuleClassResolver(JavaFileManager platformFileManager) {
+            this.platformFileManager = platformFileManager;
+            this.packageToSystemModule = packageToSystemModule(platformFileManager);
+        }
+
+        private static Map<String, String> packageToSystemModule(JavaFileManager platformFileManager) {
+            try {
+                Set<JavaFileManager.Location> locations = platformFileManager.listLocationsForModules(
+                        StandardLocation.SYSTEM_MODULES).iterator().next();
+
+                Map<String, String> result = new HashMap<>();
+                for (JavaFileManager.Location loc : locations) {
+                    JavaFileObject jfo = platformFileManager.getJavaFileForInput(loc, "module-info", JavaFileObject.Kind.CLASS);
+                    ModuleDescriptor descriptor = ModuleDescriptor.read(jfo.openInputStream());
+                    for (ModuleDescriptor.Exports export : descriptor.exports()) {
+                        if (!export.isQualified()) {
+                            result.put(export.source(), descriptor.name());
+                        }
+                    }
+                }
+                return result;
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        @Override
+        public void forEach(BiConsumer<ClassDesc, Info> action) {
+            throw new UnsupportedOperationException("NYI");
+        }
+
+        @Override
+        public Optional<Info> lookup(ClassDesc desc) {
+            return Optional.ofNullable(cache.computeIfAbsent(desc, _ -> {
+                String qualName = JNativeScanTask.qualName(desc);
+                String moduleName = packageToSystemModule.get(desc.packageName());
+                if (moduleName != null) {
+                    try {
+                        JavaFileManager.Location loc = platformFileManager.getLocationForModule(StandardLocation.SYSTEM_MODULES, moduleName);
+                        JavaFileObject jfo = platformFileManager.getJavaFileForInput(loc, qualName, JavaFileObject.Kind.CLASS);
+                        if (jfo == null) {
+                            throw new JNativeScanFatalError("System class can not be found: " + qualName);
+                        }
+                        ClassModel model = ClassFile.of().parse(jfo.openInputStream().readAllBytes());
+                        return new Info(null, model);
+                    } catch (IOException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+                return null;
+            }));
+        }
+
+        @Override
+        public void close() throws IOException {
+            platformFileManager.close();
+        }
+    }
+}
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanFatalError.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanFatalError.java
new file mode 100644
index 00000000000..15cf86e03c3
--- /dev/null
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanFatalError.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2024, 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 com.sun.tools.jnativescan;
+
+import java.io.Serial;
+
+// Exception used in case of fatal error that is reasonably expected and handled.
+public class JNativeScanFatalError extends RuntimeException {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    public JNativeScanFatalError(String message) {
+        super(message);
+    }
+
+    public JNativeScanFatalError(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public JNativeScanFatalError(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanTask.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanTask.java
new file mode 100644
index 00000000000..2ff172e9c1b
--- /dev/null
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/JNativeScanTask.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2024, 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 com.sun.tools.jnativescan;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.lang.constant.ClassDesc;
+import java.lang.module.Configuration;
+import java.lang.module.ModuleFinder;
+import java.lang.module.ResolvedModule;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.stream.Collectors;
+import java.util.zip.ZipFile;
+
+class JNativeScanTask {
+
+    private final PrintWriter out;
+    private final List<Path> classPaths;
+    private final List<Path> modulePaths;
+    private final List<String> cmdRootModules;
+    private final Runtime.Version version;
+    private final Action action;
+
+    public JNativeScanTask(PrintWriter out, List<Path> classPaths, List<Path> modulePaths,
+                           List<String> cmdRootModules, Runtime.Version version, Action action) {
+        this.out = out;
+        this.classPaths = classPaths;
+        this.modulePaths = modulePaths;
+        this.version = version;
+        this.action = action;
+        this.cmdRootModules = cmdRootModules;
+    }
+
+    public void run() throws JNativeScanFatalError {
+        List<ClassFileSource> toScan = new ArrayList<>(findAllClassPathJars());
+
+        ModuleFinder moduleFinder = ModuleFinder.of(modulePaths.toArray(Path[]::new));
+        List<String> rootModules = cmdRootModules;
+        if (rootModules.contains("ALL-MODULE-PATH")) {
+            rootModules = allModuleNames(moduleFinder);
+        }
+        Configuration config = systemConfiguration().resolveAndBind(ModuleFinder.of(), moduleFinder, rootModules);
+        for (ResolvedModule m : config.modules()) {
+            toScan.add(new ClassFileSource.Module(m.reference()));
+        }
+
+        SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> allRestrictedMethods;
+        try(ClassResolver classesToScan = ClassResolver.forClassFileSources(toScan, version);
+            ClassResolver systemClassResolver = ClassResolver.forSystemModules(version)) {
+            NativeMethodFinder finder = NativeMethodFinder.create(classesToScan, systemClassResolver);
+            allRestrictedMethods = finder.findAll();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        switch (action) {
+            case PRINT -> printNativeAccess(allRestrictedMethods);
+            case DUMP_ALL -> dumpAll(allRestrictedMethods);
+        }
+    }
+
+    private List<ClassFileSource> findAllClassPathJars() throws JNativeScanFatalError {
+        List<ClassFileSource> result = new ArrayList<>();
+        for (Path path : classPaths) {
+            if (isJarFile(path)) {
+                Deque<Path> jarsToScan  = new ArrayDeque<>();
+                jarsToScan.offer(path);
+
+                // recursively look for all class path jars, starting at the root jars
+                // in this.classPaths, and recursively following all Class-Path manifest
+                // attributes
+                while (!jarsToScan.isEmpty()) {
+                    Path jar = jarsToScan.poll();
+                    String[] classPathAttribute = classPathAttribute(jar);
+                    Path parentDir = jar.getParent();
+                    for (String classPathEntry : classPathAttribute) {
+                        Path otherJar = parentDir != null
+                                ? parentDir.resolve(classPathEntry)
+                                : Path.of(classPathEntry);
+                        if (Files.exists(otherJar)) {
+                            // Class-Path attribute specifies that jars that
+                            // are not found are simply ignored. Do the same here
+                            jarsToScan.offer(otherJar);
+                        }
+                    }
+                    result.add(new ClassFileSource.ClassPathJar(jar));
+                }
+            } else if (Files.isDirectory(path)) {
+                result.add(new ClassFileSource.ClassPathDirectory(path));
+            } else {
+                throw new JNativeScanFatalError(
+                    "Path does not appear to be a jar file, or directory containing classes: " + path);
+            }
+        }
+        return result;
+    }
+
+    private String[] classPathAttribute(Path jar) {
+        try (JarFile jf = new JarFile(jar.toFile(), false, ZipFile.OPEN_READ, version)) {
+           Manifest manifest = jf.getManifest();
+           if (manifest != null) {
+               String attrib = manifest.getMainAttributes().getValue("Class-Path");
+               if (attrib != null) {
+                   return attrib.split("\\s+");
+               }
+           }
+           return new String[0];
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private Configuration systemConfiguration() {
+        ModuleFinder systemFinder = ModuleFinder.ofSystem();
+        Configuration system = Configuration.resolve(systemFinder, List.of(Configuration.empty()), ModuleFinder.of(),
+                allModuleNames(systemFinder)); // resolve all of them
+        return system;
+    }
+
+    private List<String> allModuleNames(ModuleFinder finder) {
+        return finder.findAll().stream().map(mr -> mr.descriptor().name()).toList();
+    }
+
+    private void printNativeAccess(SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> allRestrictedMethods) {
+        String nativeAccess = allRestrictedMethods.keySet().stream()
+                .map(ClassFileSource::moduleName)
+                .distinct()
+                .collect(Collectors.joining(","));
+        out.println(nativeAccess);
+    }
+
+    private void dumpAll(SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> allRestrictedMethods) {
+        if (allRestrictedMethods.isEmpty()) {
+            out.println("  <no restricted methods>");
+        } else {
+            allRestrictedMethods.forEach((module, perClass) -> {
+                out.println(module.path() + " (" + module.moduleName() + "):");
+                perClass.forEach((classDesc, restrictedUses) -> {
+                    out.println("  " + qualName(classDesc) + ":");
+                    restrictedUses.forEach(use -> {
+                        switch (use) {
+                            case RestrictedUse.NativeMethodDecl(MethodRef nmd) ->
+                                out.println("    " + nmd + " is a native method declaration");
+                            case RestrictedUse.RestrictedMethodRefs(MethodRef referent, Set<MethodRef> referees) -> {
+                                out.println("    " + referent + " references restricted methods:");
+                                referees.forEach(referee -> out.println("      " + referee));
+                            }
+                        }
+                    });
+                });
+            });
+        }
+    }
+
+    private static boolean isJarFile(Path path) throws JNativeScanFatalError {
+        return Files.exists(path) && Files.isRegularFile(path) && path.toString().endsWith(".jar");
+    }
+
+    public enum Action {
+        DUMP_ALL,
+        PRINT
+    }
+
+    public static String qualName(ClassDesc desc) {
+        String packagePrefix = desc.packageName().isEmpty() ? "" : desc.packageName() + ".";
+        return packagePrefix + desc.displayName();
+    }
+}
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/Main.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/Main.java
new file mode 100644
index 00000000000..425a106d599
--- /dev/null
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/Main.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (c) 2024, 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 com.sun.tools.jnativescan;
+
+import jdk.internal.joptsimple.*;
+import jdk.internal.opt.CommandLine;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.spi.ToolProvider;
+
+public class Main {
+
+    private static boolean DEBUG = Boolean.getBoolean("com.sun.tools.jnativescan.DEBUG");
+
+    private static final int SUCCESS_CODE = 0;
+    private static final int FATAL_ERROR_CODE = 1;
+
+    private final PrintWriter out;
+    private final PrintWriter err;
+
+    private Main(PrintWriter out, PrintWriter err) {
+        this.out = out;
+        this.err = err;
+    }
+
+    private void printError(String message) {
+        err.println("ERROR: " + message);
+    }
+
+    private void printUsage()  {
+        out.print("""
+            Use 'jnativescan --help' for help
+            """);
+    }
+
+    private void printVersion() {
+        out.println(System.getProperty("java.version"));
+    }
+
+    public int run(String[] args) {
+        if (args.length < 1) {
+            printUsage();
+            return FATAL_ERROR_CODE;
+        }
+
+        try {
+            String[] expandedArgs = expandArgFiles(args);
+            parseOptionsAndRun(expandedArgs);
+        } catch (JNativeScanFatalError fatalError) {
+            printError(fatalError.getMessage());
+            for (Throwable cause = fatalError.getCause();
+                     cause instanceof JNativeScanFatalError jNativeScanFatalError;
+                     cause = jNativeScanFatalError.getCause()) {
+                err.println("CAUSED BY: " + jNativeScanFatalError.getMessage());
+            }
+            if (DEBUG) {
+                fatalError.printStackTrace(err);
+            }
+            return FATAL_ERROR_CODE;
+        } catch (Throwable e) {
+            printError("Unexpected exception encountered");
+            e.printStackTrace(err);
+            return FATAL_ERROR_CODE;
+        }
+
+        return SUCCESS_CODE;
+    }
+
+    private void parseOptionsAndRun(String[] expandedArgs) throws JNativeScanFatalError {
+        OptionParser parser = new OptionParser(false);
+        OptionSpec<Void> helpOpt = parser.acceptsAll(List.of("?", "h", "help"), "help").forHelp();
+        OptionSpec<Void> versionOpt = parser.accepts("version", "Print version information and exit");
+        OptionSpec<Path> classPathOpt = parser.accepts(
+                "class-path",
+                "The class path as used at runtime")
+                .withRequiredArg()
+                .withValuesSeparatedBy(File.pathSeparatorChar)
+                .withValuesConvertedBy(PARSE_PATH);
+        OptionSpec<Path> modulePathOpt = parser.accepts(
+                "module-path",
+                "The module path as used at runtime")
+                .withRequiredArg()
+                .withValuesSeparatedBy(File.pathSeparatorChar)
+                .withValuesConvertedBy(PARSE_PATH);
+        OptionSpec<Runtime.Version> releaseOpt = parser.accepts(
+                "release",
+                "The runtime version that will run the application")
+                .withRequiredArg()
+                .withValuesConvertedBy(PARSE_VERSION);
+        OptionSpec<String> addModulesOpt = parser.accepts(
+                "add-modules",
+                "List of root modules to scan")
+                .requiredIf(modulePathOpt)
+                .withRequiredArg()
+                .withValuesSeparatedBy(',');
+        OptionSpec<Void> printNativeAccessOpt = parser.accepts(
+                "print-native-access",
+                "print a comma separated list of modules that may perform native access operations." +
+                        " ALL-UNNAMED is used to indicate unnamed modules.");
+
+        OptionSet optionSet;
+        try {
+            optionSet = parser.parse(expandedArgs);
+        } catch (OptionException oe) {
+            throw new JNativeScanFatalError("Parsing options failed: " + oe.getMessage(), oe);
+        }
+
+        if (optionSet.nonOptionArguments().size() != 0) {
+            throw new JNativeScanFatalError("jnativescan does not accept positional arguments");
+        }
+
+        if (optionSet.has(helpOpt)) {
+            out.println("""
+                The jnativescan tool can be used to find methods that may access native functionality when
+                run. This includes restricted method calls and 'native' method declarations.
+                """);
+            try {
+                parser.printHelpOn(out);
+                return;
+            } catch (IOException e) {
+                throw new IllegalStateException(e);
+            }
+        }
+
+        if (optionSet.has(versionOpt)) {
+            printVersion();
+            return;
+        }
+
+        List<Path> classPathJars = optionSet.valuesOf(classPathOpt);
+        List<Path> modulePaths = optionSet.valuesOf(modulePathOpt);
+        List<String> rootModules = optionSet.valuesOf(addModulesOpt);
+        Runtime.Version version = Optional.ofNullable(optionSet.valueOf(releaseOpt)).orElse(Runtime.version());
+
+        JNativeScanTask.Action action = JNativeScanTask.Action.DUMP_ALL;
+        if (optionSet.has(printNativeAccessOpt)) {
+            action = JNativeScanTask.Action.PRINT;
+        }
+
+        new JNativeScanTask(out, classPathJars, modulePaths, rootModules, version, action).run();
+    }
+
+    private static String[] expandArgFiles(String[] args) throws JNativeScanFatalError {
+        try {
+            return CommandLine.parse(args);
+        } catch (IOException e) { // file not found
+            throw new JNativeScanFatalError(e.getMessage(), e);
+        }
+    }
+
+    public static void main(String[] args) {
+        System.exit(new Main.Provider().run(System.out, System.err, args));
+    }
+
+    public static class Provider implements ToolProvider {
+
+        @Override
+        public String name() {
+            return "jnativescan";
+        }
+
+        @Override
+        public int run(PrintWriter out, PrintWriter err, String... args) {
+            return new Main(out, err).run(args);
+        }
+    }
+
+    // where
+    private static final ValueConverter<Path> PARSE_PATH = new ValueConverter<>() {
+        @Override
+        public Path convert(String value) {
+            return Path.of(value);
+        }
+
+        @Override
+        public Class<? extends Path> valueType() {
+            return Path.class;
+        }
+
+        @Override
+        public String valuePattern() {
+            return "Path";
+        }
+    };
+
+    private static final ValueConverter<Runtime.Version> PARSE_VERSION = new ValueConverter<>() {
+        @Override
+        public Runtime.Version convert(String value) {
+            try {
+                return Runtime.Version.parse(value);
+            } catch (IllegalArgumentException e) {
+                throw new JNativeScanFatalError("Invalid release: " + value + ": " + e.getMessage());
+            }
+        }
+
+        @Override
+        public Class<? extends Runtime.Version> valueType() {
+            return Runtime.Version.class;
+        }
+
+        @Override
+        public String valuePattern() {
+            return "Version";
+        }
+    };
+}
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/MethodRef.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/MethodRef.java
new file mode 100644
index 00000000000..b19e4e7ec8f
--- /dev/null
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/MethodRef.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2024, 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 com.sun.tools.jnativescan;
+
+import java.lang.classfile.MethodModel;
+import java.lang.classfile.constantpool.MemberRefEntry;
+import java.lang.classfile.instruction.InvokeInstruction;
+import java.lang.constant.ClassDesc;
+import java.lang.constant.MethodTypeDesc;
+
+record MethodRef(ClassDesc owner, String name, MethodTypeDesc type) {
+    public static MethodRef ofModel(MethodModel model) {
+        return new MethodRef(model.parent().orElseThrow().thisClass().asSymbol(),
+                model.methodName().stringValue(), model.methodTypeSymbol());
+    }
+
+    public static MethodRef ofInvokeInstruction(InvokeInstruction instruction) {
+        return new MethodRef(instruction.owner().asSymbol(),
+                instruction.name().stringValue(), instruction.typeSymbol());
+    }
+
+    @Override
+    public String toString() {
+        return JNativeScanTask.qualName(owner) + "::" + name + type.displayDescriptor();
+    }
+}
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/NativeMethodFinder.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/NativeMethodFinder.java
new file mode 100644
index 00000000000..681b954d4cd
--- /dev/null
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/NativeMethodFinder.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2024, 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 com.sun.tools.jnativescan;
+
+import com.sun.tools.jnativescan.RestrictedUse.NativeMethodDecl;
+import com.sun.tools.jnativescan.RestrictedUse.RestrictedMethodRefs;
+
+import java.io.IOException;
+import java.lang.classfile.Attributes;
+import java.lang.classfile.ClassModel;
+import java.lang.classfile.MethodModel;
+import java.lang.classfile.instruction.InvokeInstruction;
+import java.lang.constant.ClassDesc;
+import java.lang.constant.MethodTypeDesc;
+import java.lang.reflect.AccessFlag;
+import java.util.*;
+
+class NativeMethodFinder {
+
+    // ct.sym uses this fake name for the restricted annotation instead
+    // see make/langtools/src/classes/build/tools/symbolgenerator/CreateSymbols.java
+    private static final String RESTRICTED_NAME = "Ljdk/internal/javac/Restricted+Annotation;";
+
+    private final Map<MethodRef, Boolean> cache = new HashMap<>();
+    private final ClassResolver classesToScan;
+    private final ClassResolver systemClassResolver;
+
+    private NativeMethodFinder(ClassResolver classesToScan, ClassResolver systemClassResolver) {
+        this.classesToScan = classesToScan;
+        this.systemClassResolver = systemClassResolver;
+    }
+
+    public static NativeMethodFinder create(ClassResolver classesToScan, ClassResolver systemClassResolver) throws JNativeScanFatalError, IOException {
+        return new NativeMethodFinder(classesToScan, systemClassResolver);
+    }
+
+    public SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> findAll() throws JNativeScanFatalError {
+        SortedMap<ClassFileSource, SortedMap<ClassDesc, List<RestrictedUse>>> restrictedMethods
+                = new TreeMap<>(Comparator.comparing(ClassFileSource::path));
+        classesToScan.forEach((_, info) -> {
+            ClassModel classModel = info.model();
+            List<RestrictedUse> perClass = new ArrayList<>();
+            classModel.methods().forEach(methodModel -> {
+                if (methodModel.flags().has(AccessFlag.NATIVE)) {
+                    perClass.add(new NativeMethodDecl(MethodRef.ofModel(methodModel)));
+                } else {
+                    SortedSet<MethodRef> perMethod = new TreeSet<>(Comparator.comparing(MethodRef::toString));
+                    methodModel.code().ifPresent(code -> {
+                         try {
+                             code.forEach(e -> {
+                                 switch (e) {
+                                     case InvokeInstruction invoke -> {
+                                         MethodRef ref = MethodRef.ofInvokeInstruction(invoke);
+                                         if (isRestrictedMethod(ref)) {
+                                             perMethod.add(ref);
+                                         }
+                                     }
+                                     default -> {
+                                     }
+                                 }
+                             });
+                         } catch (JNativeScanFatalError e) {
+                             throw new JNativeScanFatalError("Error while processing method: " +
+                                     MethodRef.ofModel(methodModel), e);
+                         }
+                    });
+                    if (!perMethod.isEmpty()) {
+                        perClass.add(new RestrictedMethodRefs(MethodRef.ofModel(methodModel), perMethod));
+                    }
+                }
+            });
+            if (!perClass.isEmpty()) {
+                restrictedMethods.computeIfAbsent(info.source(),
+                                _ -> new TreeMap<>(Comparator.comparing(JNativeScanTask::qualName)))
+                        .put(classModel.thisClass().asSymbol(), perClass);
+            }
+        });
+        return restrictedMethods;
+    }
+
+    private boolean isRestrictedMethod(MethodRef ref) throws JNativeScanFatalError {
+        return cache.computeIfAbsent(ref, methodRef -> {
+            if (methodRef.owner().isArray()) {
+                // no restricted methods in arrays atm, and we can't look them up since they have no class file
+                return false;
+            }
+            Optional<ClassResolver.Info> info = systemClassResolver.lookup(methodRef.owner());
+            if (!info.isPresent()) {
+                return false;
+            }
+            ClassModel classModel = info.get().model();
+            Optional<MethodModel> methodModel = findMethod(classModel, methodRef.name(), methodRef.type());
+            if (!methodModel.isPresent()) {
+                // If we are here, the method was referenced through a subclass of the class containing the actual
+                // method declaration. We could implement a method resolver (that needs to be version aware
+                // as well) to find the method model of the declaration, but it's not really worth it.
+                // None of the restricted methods (atm) are exposed through more than 1 public type, so it's not
+                // possible for user code to reference them through a subclass.
+                return false;
+            }
+
+            return hasRestrictedAnnotation(methodModel.get());
+        });
+    }
+
+    private static boolean hasRestrictedAnnotation(MethodModel method) {
+        return method.findAttribute(Attributes.runtimeVisibleAnnotations())
+                .map(rva -> rva.annotations().stream().anyMatch(ann ->
+                        ann.className().stringValue().equals(RESTRICTED_NAME)))
+                .orElse(false);
+    }
+
+    private static Optional<MethodModel> findMethod(ClassModel classModel, String name, MethodTypeDesc type) {
+        return classModel.methods().stream()
+                .filter(m -> m.methodName().stringValue().equals(name)
+                        && m.methodType().stringValue().equals(type.descriptorString()))
+                .findFirst();
+    }
+}
diff --git a/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/RestrictedUse.java b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/RestrictedUse.java
new file mode 100644
index 00000000000..58c5798d33f
--- /dev/null
+++ b/src/jdk.jdeps/share/classes/com/sun/tools/jnativescan/RestrictedUse.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024, 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 com.sun.tools.jnativescan;
+
+import java.util.SortedSet;
+
+sealed interface RestrictedUse {
+    record RestrictedMethodRefs(MethodRef referent, SortedSet<MethodRef> referees) implements RestrictedUse {}
+    record NativeMethodDecl(MethodRef decl) implements RestrictedUse {}
+}
diff --git a/src/jdk.jdeps/share/classes/module-info.java b/src/jdk.jdeps/share/classes/module-info.java
index e8ad319d70c..3fdd3ca32d2 100644
--- a/src/jdk.jdeps/share/classes/module-info.java
+++ b/src/jdk.jdeps/share/classes/module-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,12 +28,13 @@
 /**
  * Defines tools for analysing dependencies in Java libraries and programs,
  * including the <em>{@index jdeps jdeps tool}</em>,
- * <em>{@index javap javap tool}</em>, and
- * <em>{@index jdeprscan jdeprscan tool}</em> tools.
+ * <em>{@index javap javap tool}</em>,
+ * <em>{@index jdeprscan jdeprscan tool}</em>, and
+ * <em>{@index jnativescan jnativescan tool}</em> tools.
  *
  * <p>
  * This module provides the equivalent of command-line access to the
- * <em>javap</em> and <em>jdeps</em> tools via the
+ * <em>javap</em>, <em>jdeps</em>, and <em>jnativescan</em> tools via the
  * {@link java.util.spi.ToolProvider ToolProvider} service provider
  * interface (SPI)</p>
  *
@@ -49,12 +50,14 @@
  * @toolGuide javap
  * @toolGuide jdeprscan
  * @toolGuide jdeps
+ * @toolGuide jnativescan
  *
  * @provides java.util.spi.ToolProvider
- *     Use {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("javap")}
- *     or {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("jdeps")}
+ *     Use {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("javap")},
+ *     {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("jdeps")},
+ *     or {@link java.util.spi.ToolProvider#findFirst ToolProvider.findFirst("jnativescan")}
  *     to obtain an instance of a {@code ToolProvider} that provides the equivalent
- *     of command-line access to the {@code javap} or {@code jdeps} tool.
+ *     of command-line access to the {@code javap}, {@code jdeps}, {@code jnativescan} tool.
  *
  * @moduleGraph
  * @since 9
@@ -63,10 +66,14 @@
 module jdk.jdeps {
     requires java.compiler;
     requires jdk.compiler;
+    requires jdk.internal.opt;
+
+    uses com.sun.tools.javac.platform.PlatformProvider;
 
     exports com.sun.tools.classfile to jdk.jlink;
 
     provides java.util.spi.ToolProvider with
         com.sun.tools.javap.Main.JavapToolProvider,
-        com.sun.tools.jdeps.Main.JDepsToolProvider;
+        com.sun.tools.jdeps.Main.JDepsToolProvider,
+        com.sun.tools.jnativescan.Main.Provider;
 }
diff --git a/src/jdk.jdeps/share/man/javap.1 b/src/jdk.jdeps/share/man/javap.1
index f9ec998e0af..27b0a29d0ba 100644
--- a/src/jdk.jdeps/share/man/javap.1
+++ b/src/jdk.jdeps/share/man/javap.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JAVAP" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JAVAP" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jdeps/share/man/jdeprscan.1 b/src/jdk.jdeps/share/man/jdeprscan.1
index ac850cf78de..fc13f05c449 100644
--- a/src/jdk.jdeps/share/man/jdeprscan.1
+++ b/src/jdk.jdeps/share/man/jdeprscan.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JDEPRSCAN" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JDEPRSCAN" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jdeps/share/man/jdeps.1 b/src/jdk.jdeps/share/man/jdeps.1
index 53891441665..d3dde37e3b9 100644
--- a/src/jdk.jdeps/share/man/jdeps.1
+++ b/src/jdk.jdeps/share/man/jdeps.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JDEPS" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JDEPS" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jdeps/share/man/jnativescan.1 b/src/jdk.jdeps/share/man/jnativescan.1
new file mode 100644
index 00000000000..ff7f18277f2
--- /dev/null
+++ b/src/jdk.jdeps/share/man/jnativescan.1
@@ -0,0 +1,220 @@
+.\" Copyright (c) 2024, 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.
+.\"
+.\" Automatically generated by Pandoc 2.19.2
+.\"
+.\" Define V font for inline verbatim, using C font in formats
+.\" that render this, and otherwise B font.
+.ie "\f[CB]x\f[R]"x" \{\
+. ftr V B
+. ftr VI BI
+. ftr VB B
+. ftr VBI BI
+.\}
+.el \{\
+. ftr V CR
+. ftr VI CI
+. ftr VB CB
+. ftr VBI CBI
+.\}
+.TH "JNATIVESCAN" "1" "2025" "JDK 24-ea" "JDK Commands"
+.hy
+.SH NAME
+.PP
+jnativescan - static analysis tool that scans one or more jar files for
+uses of native functionalities, such as restricted method calls or
+\f[V]native\f[R] method declarations.
+.SH SYNOPSIS
+.PP
+\f[V]jnativescan\f[R] [\f[I]options\f[R]]
+.TP
+\f[I]options\f[R]
+See \f[B]Options for the jnativescan Command\f[R]
+.SH DESCRIPTION
+.PP
+The \f[V]jnative\f[R] tool is a static analysis tool provided by the JDK
+that scans a JAR file for uses of native functionalities, such as
+restricted method calls or \f[V]native\f[R] method declarations.
+.PP
+\f[V]jnativescan\f[R] accepts a runtime class path and module path
+configuration, as well as a set of root modules, and a target release.
+It scans the jars on the class and module paths, and reports uses of
+native functionalities either in a tree like structure, which also
+identifies that calling classes and methods, or as a list of module
+names when the \f[V]--print-native-access\f[R] flag is specified.
+.SH OPTIONS FOR THE JNATIVESCAN COMMAND
+.PP
+The following options are available:
+.TP
+\f[V]--class-path\f[R] \f[I]path\f[R]
+Used to specify a list of paths pointing to jar files to be scanned.
+.PP
+All jar files specified through this list will be scanned.
+If a jar file contains a \f[V]Class-Path\f[R] attribute in its manifest,
+jar files listed there will be scanned as well.
+Jar files listed in the \f[V]Class-Path\f[R] manifest attribute that can
+not be found are ignored.
+All the jar files found are treated as if they belonged to the unnamed
+module.
+.TP
+\f[V]--module-path\f[R] \f[I]path\f[R]
+Used to specify a list of paths pointing to jar files or directories
+containing jar files, that the tool can use to find modules that need to
+be scanned.
+The list of jar files that will be scanned depends on the
+\f[V]--add-modules\f[R] option.
+.RS
+.PP
+For both the \f[V]--class-path\f[R] and \f[V]--module-path\f[R] options,
+\f[I]path\f[R] should be a search path that consists of one or more jar
+files, separated by the system-specific path separator.
+For example:
+.IP \[bu] 2
+\f[B]Linux and macOS:\f[R]
+.RS 2
+.RS
+.PP
+\f[V]--class-path /some/foo.jar:/another/different/bar.jar\f[R]
+.RE
+.RE
+.PP
+\f[B]Note:\f[R]
+.PP
+On Windows, use a semicolon (\f[V];\f[R]) as the separator instead of a
+colon (\f[V]:\f[R]).
+.IP \[bu] 2
+\f[B]Windows:\f[R]
+.RS 2
+.RS
+.PP
+\f[V]--class-path C:\[rs]some\[rs]foo.jar;C:\[rs]another\[rs]different\[rs]bar.jar\f[R]
+.RE
+.RE
+.RE
+.TP
+\f[V]--add-modules\f[R] \f[I]module[,module...]\f[R]
+Used to specify a comma-separated list of module names that indicate the
+root modules to scan.
+All the root modules will be scanned, as well as any modules that they
+depend on.
+This includes dependencies on service implementations specified through
+the \f[V]uses\f[R] directive in a module\[aq]s \f[V]module-info\f[R]
+file.
+All modules found on the module path that provide an implementation of
+such a service will be scanned as well.
+.TP
+\f[V]--release\f[R] \f[I]version\f[R]
+Used to specify the Java SE release that specifies the set of restricted
+methods to scan for.
+For multi-release jar files, this option also indicates the version of
+class file that should be loaded from the jar.
+This option should be set to the version of the runtime under which the
+application is eventually intended to be run.
+If this flag is omitted, the version of \f[V]jnativescan\f[R] is used as
+release version, which is the same as the version of the JDK that the
+tool belongs to.
+.TP
+\f[V]--print-native-access\f[R]
+Print a comma-separated list of module names that use native
+functionalities, instead of the default tree structure.
+.TP
+\f[V]--help\f[R] or \f[V]-h\f[R]
+Prints out a full help message.
+.TP
+\f[V]--version\f[R]
+Prints out the abbreviated version string of the tool.
+.SH EXAMPLE OF \f[V]jnativescan\f[R] USE
+.PP
+\f[V]jnativescan\f[R] accepts a runtime configuration in the form of a
+class path, module path, set of root modules, and a target release
+version.
+For the class path, the tool will scan all jar files, including those
+found recursively through the \f[V]Class-Path\f[R] manifest attribute.
+For the module path, the tool scans all root modules specified through
+\f[V]--add-modules\f[R], and any (transitive) dependence of the root
+modules, including any modules that contain service implementations that
+are used by a scanned module.
+.PP
+By default, the tool prints out which jars, classes, and methods use
+native functionalities, in a tree-like structure.
+The following is an example output:
+.IP
+.nf
+\f[CB]
+$ jnativescan --class-path app.jar
+app.jar (ALL-UNNAMED):
+  foo.Main:
+    foo.Main::main(String[])void references restricted methods:
+      java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment
+    foo.Main::nativeMethod()void is a native method declaration
+\f[R]
+.fi
+.PP
+\f[V]app.jar (ALL-UNNAMED)\f[R] is the path to the jar file, with the
+module name in parentheses behind it.
+Since in this case the jar file appears on the class path,
+\f[V]ALL-UNNAMED\f[R] is printed to indicate the unnamed module.
+The second line of the output, \f[V]foo.Main\f[R], indicates that
+methods using native functionalities were found in the
+\f[V]foo.Main\f[R] class.
+The next line:
+.IP
+.nf
+\f[CB]
+    foo.Main::main(String[])void references restricted methods:
+\f[R]
+.fi
+.PP
+Indicates that the \f[V]main(String[])\f[R] method in the
+\f[V]foo.Main\f[R] class references a restricted method, which is listed
+on the following line as:
+.IP
+.nf
+\f[CB]
+      java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment
+\f[R]
+.fi
+.PP
+Lastly, the text:
+.IP
+.nf
+\f[CB]
+    foo.Main::nativeMethod()void is a native method declaration
+\f[R]
+.fi
+.PP
+Indicates that the \f[V]foo.Main\f[R] class contains a declaration of a
+\f[V]native\f[R] method named \f[V]nativeMethod\f[R].
+.PP
+If we add \f[V]--print-native-access\f[R] to the example command line,
+we instead get a list of the names of modules that contain accesses to
+native functionalities:
+.IP
+.nf
+\f[CB]
+$ jnativescan --class-path app.jar --print-native-access
+ALL-UNNAMED
+\f[R]
+.fi
+.PP
+In this case the output consists of just \f[V]ALL-UNNAMED\f[R], which
+indicates a jar file on the class path, that is, in the unnamed module,
+contains an access to native functionalities.
diff --git a/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTYResources_de.java b/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTYResources_de.java
index ee6449f7605..04ec27a624d 100644
--- a/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTYResources_de.java
+++ b/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTYResources_de.java
@@ -322,7 +322,7 @@ public Object[][] getContents() {
         {"Unable to set", "{0} kann nicht festgelegt werden: {1}"},
         {"Unexpected event type", "Unerwarteter Ereignistyp: {0}"},
         {"unknown", "unbekannt"},
-        {"Unmonitoring", "\u00DCberwachung von {0} aufheben"},
+        {"Unmonitoring", "Monitoring von {0} aufheben"},
         {"Unrecognized command.  Try help...", "Nicht erkannter Befehl: \"{0}\". Rufen Sie \"help\" auf..."},
         {"Usage: catch exception", "Verwendung: catch [uncaught|caught|all] <Klassen-ID>|<Klassenmuster>"},
         {"Usage: ignore exception", "Verwendung: ignore [uncaught|caught|all] <Klassen-ID>|<Klassenmuster>"},
diff --git a/src/jdk.jdi/share/man/jdb.1 b/src/jdk.jdi/share/man/jdb.1
index 530c9bed6a1..88097ffeae4 100644
--- a/src/jdk.jdi/share/man/jdb.1
+++ b/src/jdk.jdi/share/man/jdb.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JDB" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JDB" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c b/src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c
index a694bba93c4..a0f2687a88c 100644
--- a/src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c
+++ b/src/jdk.jdwp.agent/unix/native/libjdwp/exec_md.c
@@ -35,14 +35,14 @@
 #include "error_messages.h"
 
 static char *skipWhitespace(char *p) {
-    while ((*p != '\0') && isspace(*p)) {
+    while ((*p != '\0') && isspace((unsigned char) *p)) {
         p++;
     }
     return p;
 }
 
 static char *skipNonWhitespace(char *p) {
-    while ((*p != '\0') && !isspace(*p)) {
+    while ((*p != '\0') && !isspace((unsigned char) *p)) {
         p++;
     }
     return p;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedClass.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedClass.java
index 8d6b5647f2f..d0ae1e7d297 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedClass.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedClass.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -49,7 +49,7 @@ public final class RecordedClass extends RecordedObject {
      * @see java.lang.reflect.Modifier
      */
     public int getModifiers() {
-        return getTyped("modifiers", Integer.class, -1);
+        return getTyped("modifiers", Integer.class, INTEGER_MINUS_ONE);
     }
 
     /**
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedFrame.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedFrame.java
index 9640330fca2..cdb893274ac 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedFrame.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedFrame.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -65,7 +65,7 @@ public boolean isJavaFrame() {
      * @return byte code index, or {@code -1} if doesn't exist
      */
     public int getBytecodeIndex() {
-        return getTyped("bytecodeIndex", Integer.class, Integer.valueOf(-1));
+        return getTyped("bytecodeIndex", Integer.class, INTEGER_MINUS_ONE);
     }
 
     /**
@@ -75,7 +75,7 @@ public int getBytecodeIndex() {
      * @return the line number, or {@code -1} if doesn't exist
      */
     public int getLineNumber() {
-        return getTyped("lineNumber", Integer.class, Integer.valueOf(-1));
+        return getTyped("lineNumber", Integer.class, INTEGER_MINUS_ONE);
     }
 
     /**
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedMethod.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedMethod.java
index a82b43ffc36..6c8f23aa02a 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedMethod.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedMethod.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -94,7 +94,7 @@ public String getDescriptor() {
      * @see RecordedFrame#isJavaFrame
      */
     public int getModifiers() {
-        return getTyped("modifiers", Integer.class, Integer.valueOf(0));
+        return getTyped("modifiers", Integer.class, INTEGER_ZERO);
     }
 
     /**
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java
index e5825b8ea07..21bd30a8248 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedObject.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -154,6 +154,9 @@ public MetadataEvent newMetadataEvent(List<EventType> previous, List<EventType>
 
     private static final record UnsignedValue(Object value) {
     }
+    static final Integer INTEGER_MINUS_ONE = Integer.valueOf(-1);
+    static final Integer INTEGER_ZERO = Integer.valueOf(0);
+    static final Long LONG_MINUS_ONE = Long.valueOf(-1L);
 
     final Object[] objects;
     final ObjectContext objectContext;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedThread.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedThread.java
index 4031e70d24b..d12d65faf10 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedThread.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordedThread.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -59,7 +59,7 @@ public long getOSThreadId() {
         if (isVirtual()) {
             return -1L;
         }
-        Long l = getTyped("osThreadId", Long.class, -1L);
+        Long l = getTyped("osThreadId", Long.class, LONG_MINUS_ONE);
         return l.longValue();
     }
 
@@ -92,7 +92,7 @@ public String getJavaName() {
      * @see java.lang.Thread#threadId()
      */
     public long getJavaThreadId() {
-        Long l = getTyped("javaThreadId", Long.class, -1L);
+        Long l = getTyped("javaThreadId", Long.class, LONG_MINUS_ONE);
         long id = l.longValue();
         return id == 0 ? -1L : id;
     }
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/AbstractBufferStatisticsEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/AbstractBufferStatisticsEvent.java
index d436b32db83..f7a03c7446e 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/events/AbstractBufferStatisticsEvent.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/events/AbstractBufferStatisticsEvent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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,7 @@
 import jdk.jfr.*;
 
 @Category({ "Java Application", "Statistics" })
-public abstract class AbstractBufferStatisticsEvent extends AbstractPeriodicEvent {
+abstract class AbstractBufferStatisticsEvent extends AbstractPeriodicEvent {
 
     protected AbstractBufferStatisticsEvent(BufferPool bufferPool) {
         count = bufferPool.getCount();
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java
index 352a8b6a073..ffb45caa42c 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveRecordingEvent.java
@@ -29,7 +29,6 @@
 import jdk.jfr.Label;
 import jdk.jfr.DataAmount;
 import jdk.jfr.Name;
-import jdk.jfr.StackTrace;
 import jdk.jfr.Timespan;
 import jdk.jfr.Timestamp;
 import jdk.jfr.internal.RemoveFields;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java
index 3658b06eb14..6aade8e01f5 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ActiveSettingEvent.java
@@ -28,7 +28,6 @@
 import jdk.jfr.Category;
 import jdk.jfr.Label;
 import jdk.jfr.Name;
-import jdk.jfr.StackTrace;
 import jdk.jfr.internal.RemoveFields;
 import jdk.jfr.internal.Type;
 
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java
index 795f618b4e6..0cdd9872271 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/events/ExceptionStatisticsEvent.java
@@ -29,7 +29,6 @@
 import jdk.jfr.Description;
 import jdk.jfr.Label;
 import jdk.jfr.Name;
-import jdk.jfr.StackTrace;
 import jdk.jfr.internal.MirrorEvent;
 import jdk.jfr.internal.RemoveFields;
 import jdk.jfr.internal.Type;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java
index 2a758aa8add..71569c30273 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventControl.java
@@ -46,7 +46,6 @@
 import jdk.jfr.Threshold;
 import jdk.jfr.events.ActiveSettingEvent;
 import jdk.jfr.events.StackFilter;
-import jdk.jfr.internal.JVM;
 import jdk.jfr.internal.settings.CutoffSetting;
 import jdk.jfr.internal.settings.EnabledSetting;
 import jdk.jfr.internal.settings.LevelSetting;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java
index cf7e162a42e..d8f5e689ca1 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventInstrumentation.java
@@ -461,7 +461,7 @@ private void makeInstrumented() {
                     catchAllHandler.dup();
                     // stack: [ex] [EW] [EW]
                     Label rethrow = catchAllHandler.newLabel();
-                    catchAllHandler.if_null(rethrow);
+                    catchAllHandler.ifnull(rethrow);
                     // stack: [ex] [EW]
                     catchAllHandler.dup();
                     // stack: [ex] [EW] [EW]
@@ -486,7 +486,7 @@ private void makeInstrumented() {
             Label fail = codeBuilder.newLabel();
             if (guardEventConfiguration) {
                 getEventConfiguration(codeBuilder);
-                codeBuilder.if_null(fail);
+                codeBuilder.ifnull(fail);
             }
             // if (!eventConfiguration.shouldCommit(duration) goto fail;
             getEventConfiguration(codeBuilder);
@@ -525,7 +525,7 @@ private void makeInstrumented() {
                 if (guardEventConfiguration) {
                     // if (eventConfiguration == null) goto fail;
                     getEventConfiguration(codeBuilder);
-                    codeBuilder.if_null(fail);
+                    codeBuilder.ifnull(fail);
                 }
                 // return eventConfiguration.shouldCommit(duration);
                 getEventConfiguration(codeBuilder);
@@ -738,7 +738,7 @@ private void updateEnabledMethod(MethodDesc method) {
             Label nullLabel = codeBuilder.newLabel();
             if (guardEventConfiguration) {
                 getEventConfiguration(codeBuilder);
-                codeBuilder.if_null(nullLabel);
+                codeBuilder.ifnull(nullLabel);
             }
             getEventConfiguration(codeBuilder);
             invokevirtual(codeBuilder, TYPE_EVENT_CONFIGURATION, METHOD_IS_ENABLED);
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java
index 02edfd1e5ab..cc0ee05a948 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVM.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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,6 +31,7 @@
 import jdk.jfr.Event;
 import jdk.jfr.internal.event.EventConfiguration;
 import jdk.jfr.internal.event.EventWriter;
+import jdk.jfr.internal.management.HiddenWait;
 
 /**
  * Interface against the JVM.
@@ -41,14 +42,10 @@ public final class JVM {
 
     static final long RESERVED_CLASS_ID_LIMIT = 500;
 
-    private static class ChunkRotationMonitor {}
-
     /*
      * The JVM uses the chunk rotation monitor to notify Java that a rotation is warranted.
-     * The monitor type is used to exclude jdk.JavaMonitorWait events from being generated
-     * when Object.wait() is called on this monitor.
      */
-    public static final Object CHUNK_ROTATION_MONITOR = new ChunkRotationMonitor();
+    public static final Object CHUNK_ROTATION_MONITOR = new HiddenWait();
 
     private static volatile boolean nativeOK;
 
@@ -174,6 +171,11 @@ private static class ChunkRotationMonitor {}
      */
     public static native long getTicksFrequency();
 
+    /**
+     * Returns the same clock that sets the start time of a chunk (in nanos).
+     */
+    public static native long nanosNow();
+
     /**
      * Write message to log. Should swallow null or empty message, and be able
      * to handle any Java character and not crash with very large message
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java
index 036d49e6e0e..7fde28a3d21 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/JVMSupport.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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,6 +30,7 @@
 
 import jdk.jfr.Recording;
 import jdk.jfr.internal.event.EventConfiguration;
+import jdk.jfr.internal.management.HiddenWait;
 import jdk.jfr.internal.util.Utils;
 import jdk.jfr.internal.util.ValueFormatter;
 
@@ -103,7 +104,6 @@ static long nanosToTicks(long nanos) {
 
     static long getChunkStartNanos() {
         long nanos = JVM.getChunkStartNanos();
-        // JVM::getChunkStartNanos() may return a bumped timestamp, +1 ns or +2 ns.
         // Spin here to give Instant.now() a chance to catch up.
         awaitUniqueTimestamp();
         return nanos;
@@ -119,11 +119,8 @@ private static void awaitUniqueTimestamp() {
                 lastTimestamp = time;
                 return;
             }
-            try {
-                Thread.sleep(0, 100);
-            } catch (InterruptedException iex) {
-                // ignore
-            }
+            HiddenWait hiddenWait = new HiddenWait();
+            hiddenWait.takeNap(1);
         }
     }
 
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java
index 7031718cb28..49afd0082d8 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/MetadataRepository.java
@@ -44,11 +44,10 @@
 import jdk.jfr.EventType;
 import jdk.jfr.Name;
 import jdk.jfr.Period;
-import jdk.jfr.StackTrace;
-import jdk.jfr.Threshold;
 import jdk.jfr.ValueDescriptor;
 import jdk.jfr.internal.consumer.RepositoryFiles;
 import jdk.jfr.internal.event.EventConfiguration;
+import jdk.jfr.internal.management.HiddenWait;
 import jdk.jfr.internal.periodic.PeriodicEvents;
 import jdk.jfr.internal.util.Utils;
 
@@ -59,11 +58,14 @@ public final class MetadataRepository {
     private final Map<String, EventType> nativeEventTypes = LinkedHashMap.newHashMap(150);
     private final Map<String, EventControl> nativeControls = LinkedHashMap.newHashMap(150);
     private final SettingsManager settingsManager = new SettingsManager();
+    private final HiddenWait threadSleeper = new HiddenWait();
     private Constructor<EventConfiguration> cachedEventConfigurationConstructor;
     private boolean staleMetadata = true;
     private boolean unregistered;
     private long lastUnloaded = -1;
 
+    private long lastMillis;
+
     public MetadataRepository() {
         initializeJVMEventTypes();
     }
@@ -313,11 +315,12 @@ synchronized Instant setOutput(String filename) {
         if (staleMetadata) {
             storeDescriptorInJVM();
         }
+        // Each chunk needs a unique timestamp. If two chunks get the same
+        // timestamp, the parser may stop prematurely at an earlier chunk.
+        // The resolution needs to be measured in milliseconds as this
+        // is what RecordingInfo:getStopTime() returns.
+        awaitEpochMilliShift();
         JVM.setOutput(filename);
-        // Each chunk needs a unique start timestamp and
-        // if the clock resolution is low, two chunks may
-        // get the same timestamp. Utils.getChunkStartNanos()
-        // ensures the timestamp is unique for the next chunk
         long chunkStart = JVMSupport.getChunkStartNanos();
         if (filename != null) {
             RepositoryFiles.notifyNewFile();
@@ -332,6 +335,18 @@ synchronized Instant setOutput(String filename) {
         return Utils.epochNanosToInstant(chunkStart);
     }
 
+    private void awaitEpochMilliShift() {
+        while (true) {
+            long nanos = JVM.nanosNow();
+            long millis = Utils.epochNanosToInstant(nanos).toEpochMilli();
+            if (millis != lastMillis) {
+                lastMillis = millis;
+                return;
+            }
+            threadSleeper.takeNap(1);
+        }
+    }
+
     private void unregisterUnloaded() {
         long unloaded = JVM.getUnloadedEventClassCount();
         if (this.lastUnloaded != unloaded) {
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java
index 5fa9eb709ef..21079fab3a9 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/OldObjectSample.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, 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
@@ -33,7 +33,6 @@
 import jdk.jfr.RecordingState;
 import jdk.jfr.internal.settings.CutoffSetting;
 import jdk.jfr.internal.test.WhiteBox;
-import jdk.jfr.internal.util.Utils;
 
 // The Old Object event could have been implemented as a periodic event, but
 // due to chunk rotations and how settings are calculated when multiple recordings
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/RepositoryChunk.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/RepositoryChunk.java
index 72d3a719452..e46b6020d5d 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/RepositoryChunk.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/RepositoryChunk.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, 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
@@ -29,10 +29,7 @@
 import java.io.RandomAccessFile;
 import java.nio.channels.ReadableByteChannel;
 import java.time.Instant;
-import java.time.Period;
-import java.time.Duration;
 import java.util.Comparator;
-import java.util.Optional;
 
 import jdk.jfr.internal.SecuritySupport.SafePath;
 
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/ShutdownHook.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/ShutdownHook.java
index afd9ec09bd9..8375dab0bcc 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/ShutdownHook.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/ShutdownHook.java
@@ -25,14 +25,12 @@
 
 package jdk.jfr.internal;
 
-import java.io.IOException;
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 
 import jdk.jfr.RecordingState;
-import jdk.jfr.internal.util.Utils;
 
 /**
  * Class responsible for dumping recordings on exit
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/AbstractEventStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/AbstractEventStream.java
index e3b43635e33..cdfc8f017a6 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/AbstractEventStream.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/AbstractEventStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -205,7 +205,7 @@ public final void awaitTermination(Duration timeout) throws InterruptedException
 
     protected abstract void process() throws IOException;
 
-    protected abstract boolean isRecording();
+    protected abstract boolean isRecordingStream();
 
     protected final void closeParser() {
         parserState.close();
@@ -249,7 +249,7 @@ private void startInternal(long startNanos) {
             if (streamConfiguration.started) {
                 throw new IllegalStateException("Event stream can only be started once");
             }
-            if (isRecording() && streamConfiguration.startTime == null) {
+            if (isRecordingStream() && streamConfiguration.startTime == null) {
                 streamConfiguration.setStartNanos(startNanos);
             }
             streamConfiguration.setStarted(true);
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java
index 3ed1c4c8d35..bc9aa7987c3 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -33,9 +33,11 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Consumer;
 
 import jdk.jfr.Configuration;
+import jdk.jfr.RecordingState;
 import jdk.jfr.consumer.RecordedEvent;
 import jdk.jfr.internal.JVM;
 import jdk.jfr.internal.LogLevel;
@@ -59,6 +61,7 @@ public final class EventDirectoryStream extends AbstractEventStream {
     private final FileAccess fileAccess;
     private final PlatformRecording recording;
     private final StreamBarrier barrier = new StreamBarrier();
+    private final AtomicLong streamId = new AtomicLong();
     private ChunkParser currentParser;
     private long currentChunkStartNanos;
     private RecordedEvent[] sortedCache;
@@ -80,6 +83,8 @@ public EventDirectoryStream(
         }
         this.fileAccess = Objects.requireNonNull(fileAccess);
         this.repositoryFiles = new RepositoryFiles(fileAccess, p, allowSubDirectories);
+        this.streamId.incrementAndGet();
+        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Stream " + streamId + " started.");
     }
 
     @Override
@@ -137,13 +142,14 @@ protected void processRecursionSafe() throws IOException {
         Dispatcher lastDisp = null;
         Dispatcher disp = dispatcher();
         Path path;
-        boolean validStartTime = isRecording() || disp.startTime != null;
+        boolean validStartTime = isRecordingStream() || disp.startTime != null;
         if (validStartTime) {
             path = repositoryFiles.firstPath(disp.startNanos, true);
         } else {
             path = repositoryFiles.lastPath(true);
         }
         if (path == null) { // closed
+            logStreamEnd("no first chunk file found.");
             return;
         }
         currentChunkStartNanos = repositoryFiles.getTimestamp(path);
@@ -168,7 +174,10 @@ protected void processRecursionSafe() throws IOException {
                         processUnordered(disp);
                     }
                     currentParser.resetCache();
-                    if (currentParser.getLastFlush() > filterEnd) {
+                    long lastFlush = currentParser.getLastFlush();
+                    if (lastFlush  > filterEnd) {
+                        logStreamEnd("end time at " + filterEnd +
+                                     "ns (epoch), parser at " + lastFlush + "ns (epoch).");
                         return;
                     }
                 }
@@ -177,20 +186,25 @@ protected void processRecursionSafe() throws IOException {
 
                 barrier.check(); // block if recording is being stopped
                 if (barrier.getStreamEnd() <= endMillis) {
+                    String msg = "stopped at " + barrier.getStreamEnd() + "ms (epoch), ";
+                    msg += "parser at " + endMillis + "ms (epoch), " + endNanos + "ns (epoch)";
+                    logStreamEnd(msg);
                     return;
                 }
 
-                if (!barrier.hasStreamEnd() && isLastChunk()) {
-                    // Recording was stopped/closed externally, and no more data to process.
-                    return;
+                if (isRecordingStream()) {
+                    if (recording.getState() == RecordingState.STOPPED && !barrier.used()) {
+                        logStreamEnd("recording stopped externally.");
+                        return;
+                    }
                 }
 
                 if (repositoryFiles.hasFixedPath() && currentParser.isFinalChunk()) {
-                    // JVM process exited/crashed, or repository migrated to an unknown location
+                    logStreamEnd("JVM process exited/crashed, or repository migrated to an unknown location.");
                     return;
                 }
                 if (isClosed()) {
-                    // Stream was closed
+                    logStreamEnd("stream closed.");
                     return;
                 }
                 long durationNanos = currentParser.getChunkDuration();
@@ -205,7 +219,8 @@ protected void processRecursionSafe() throws IOException {
                 }
                 path = repositoryFiles.nextPath(currentChunkStartNanos + durationNanos, true);
                 if (path == null) {
-                    return; // stream closed
+                    logStreamEnd("no more chunk files found.");
+                    return;
                 }
                 currentChunkStartNanos = repositoryFiles.getTimestamp(path);
                 input.setFile(path);
@@ -217,15 +232,12 @@ protected void processRecursionSafe() throws IOException {
         }
     }
 
-
-    private boolean isLastChunk() {
-        if (!isRecording()) {
-            return false;
-        }
-        return recording.getFinalChunkStartNanos() >= currentParser.getStartNanos();
+    private void logStreamEnd(String text) {
+        String msg = "Stream " + streamId + " ended, " + text;
+        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, msg);
     }
 
-    protected boolean isRecording() {
+    protected boolean isRecordingStream() {
         return recording != null;
     }
 
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java
index 9ecaf2a6075..f03e8d8acb4 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -73,7 +73,7 @@ public void close() {
     }
 
     @Override
-    protected boolean isRecording() {
+    protected boolean isRecordingStream() {
         return false;
     }
 
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/OngoingStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/OngoingStream.java
index 1816d00f345..e0dd7fa2ad8 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/OngoingStream.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/OngoingStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -33,6 +33,7 @@
 import jdk.jfr.internal.SecuritySupport;
 import jdk.jfr.internal.SecuritySupport.SafePath;
 import jdk.jfr.internal.management.EventByteStream;
+import jdk.jfr.internal.management.HiddenWait;
 import jdk.jfr.internal.management.ManagementSupport;
 
 public final class OngoingStream extends EventByteStream {
@@ -44,6 +45,7 @@ public final class OngoingStream extends EventByteStream {
 
     private final RepositoryFiles repositoryFiles;
     private final Recording recording;
+    private final HiddenWait threadSleeper = new HiddenWait();
     private final int blockSize;
     private final long endTimeNanos;
     private final byte[] headerBytes = new byte[HEADER_SIZE];
@@ -195,19 +197,13 @@ private byte[] readWithHeader(int size) throws IOException {
                     return bytes;
                 }
             }
-            takeNap();
+            if (!threadSleeper.takeNap(10)) {
+                throw new IOException("Read operation interrupted");
+            }
         }
         return EMPTY_ARRAY;
     }
 
-    private void takeNap() throws IOException {
-        try {
-            Thread.sleep(10);
-        } catch (InterruptedException ie) {
-            throw new IOException("Read operation interrupted", ie);
-        }
-    }
-
     private boolean ensureInput() throws IOException {
         if (input == null) {
             if (SecuritySupport.getFileSize(new SafePath(path)) < HEADER_SIZE) {
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInput.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInput.java
index 90a03130f49..69ec73f57fd 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInput.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RecordingInput.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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,6 +31,8 @@
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.nio.file.Path;
+
+import jdk.jfr.internal.management.HiddenWait;
 import jdk.jfr.internal.util.Utils;
 
 public final class RecordingInput implements DataInput, AutoCloseable {
@@ -67,6 +69,7 @@ public void reset() {
     }
     private final int blockSize;
     private final FileAccess fileAccess;
+    private final HiddenWait threadSleeper = new HiddenWait();
     private long pollCount = 1000;
     private RandomAccessFile file;
     private String filename;
@@ -453,6 +456,6 @@ public void pollWait() throws IOException {
         if (pollCount < 0) {
             throw new IOException("Recording file is stuck in locked stream state.");
         }
-        Utils.takeNap(1);
+        threadSleeper.takeNap(1);
     }
 }
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RepositoryFiles.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RepositoryFiles.java
index 6ef88ecad37..3f0611f9981 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RepositoryFiles.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/RepositoryFiles.java
@@ -46,9 +46,10 @@
 import jdk.jfr.internal.Logger;
 import jdk.jfr.internal.Repository;
 import jdk.jfr.internal.SecuritySupport.SafePath;
+import jdk.jfr.internal.management.HiddenWait;;
 
 public final class RepositoryFiles {
-    private static final Object WAIT_OBJECT = new Object();
+    private static final HiddenWait WAIT_OBJECT = new HiddenWait();
     private static final String DIRECTORY_PATTERN = "DDDD_DD_DD_DD_DD_DD_";
     public static void notifyNewFile() {
         synchronized (WAIT_OBJECT) {
@@ -59,7 +60,7 @@ public static void notifyNewFile() {
     private final FileAccess fileAccess;
     private final NavigableMap<Long, Path> pathSet = new TreeMap<>();
     private final Map<Path, Long> pathLookup = new HashMap<>();
-    private final Object waitObject;
+    private final HiddenWait waitObject;
     private boolean allowSubDirectory;
     private volatile boolean closed;
     private Path repository;
@@ -67,7 +68,7 @@ public static void notifyNewFile() {
     public RepositoryFiles(FileAccess fileAccess, Path repository, boolean allowSubDirectory) {
         this.repository = repository;
         this.fileAccess = fileAccess;
-        this.waitObject = repository == null ? WAIT_OBJECT : new Object();
+        this.waitObject = repository == null ? WAIT_OBJECT : new HiddenWait();
         this.allowSubDirectory = allowSubDirectory;
     }
 
@@ -108,7 +109,7 @@ private boolean updatePaths(boolean wait) {
                 // was accessed. Just ignore, and retry later.
             }
             if (wait) {
-                nap();
+                waitObject.takeNap(1000);
             } else {
                 return pathLookup.size() > beforeSize;
             }
@@ -157,16 +158,6 @@ private Path path(long timestamp, boolean wait) {
         }
     }
 
-    private void nap() {
-        try {
-            synchronized (waitObject) {
-                waitObject.wait(1000);
-            }
-        } catch (InterruptedException e) {
-            // ignore
-        }
-    }
-
     private boolean updatePaths() throws IOException, DirectoryIteratorException {
         boolean foundNew = false;
         Path repoPath = repository;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/filter/ChunkWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/filter/ChunkWriter.java
index 8c22432512a..d38a5872ade 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/filter/ChunkWriter.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/filter/ChunkWriter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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,6 +30,8 @@
 import java.nio.file.Path;
 import java.util.ArrayDeque;
 import java.util.Deque;
+import java.util.Map;
+import java.util.HashMap;
 import java.util.function.Predicate;
 
 import jdk.jfr.consumer.RecordedEvent;
@@ -56,6 +58,7 @@ public final class ChunkWriter implements Closeable {
     private final RecordingInput input;
     private final RecordingOutput output;
     private final Predicate<RecordedEvent> filter;
+    private final Map<String, Long> waste = new HashMap<>();
 
     private long chunkStartPosition;
     private boolean chunkComplete;
@@ -178,6 +181,16 @@ public void endChunk(ChunkHeader header) throws IOException {
         pools = new LongMap<>();
         chunkComplete = true;
         lastCheckpoint = 0;
+        if (Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.DEBUG)) {
+            // Log largest waste first
+            waste.entrySet().stream()
+                 .sorted((a, b) -> b.getValue().compareTo(a.getValue()))
+                 .forEach(entry -> {
+                     String msg = "Total chunk waste by " + entry.getKey() + ": " + entry.getValue() + " bytes.";
+                     Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.DEBUG, msg);
+                 });
+        }
+        waste.clear();
     }
 
     private void writeMetadataEvent(ChunkHeader header) throws IOException {
@@ -216,6 +229,20 @@ private void write(CheckpointEvent event, long delta) throws IOException {
                 }
             }
         }
+        if (Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.DEBUG)) {
+            for (CheckpointPool pool : event.getPools()) {
+                for (PoolEntry pe : pool.getEntries()) {
+                    if (!pe.isTouched()) {
+                        String name = pe.getType().getName();
+                        long amount = pe.getEndPosition() - pe.getStartPosition();
+                        waste.merge(pe.getType().getName(), amount, Long::sum);
+                        String msg = "Unreferenced constant ID " + pe.getId() +
+                                     " of type "+ name + " using " + amount + " bytes.";
+                        Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.TRACE, msg);
+                    }
+                }
+            }
+        }
         long endPosition = output.position();
         long size = endPosition - startPosition;
         output.position(startPosition);
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/QueryRecording.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/QueryRecording.java
index 75fefca0f08..fa60079b522 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/QueryRecording.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/QueryRecording.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,6 @@
 import java.io.IOException;
 import java.time.Duration;
 import java.time.Instant;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.ListIterator;
 
@@ -37,12 +36,8 @@
 import jdk.jfr.internal.PrivateAccess;
 import jdk.jfr.internal.RepositoryChunk;
 import jdk.jfr.internal.query.Configuration;
-import jdk.jfr.internal.query.QueryPrinter;
-import jdk.jfr.internal.query.ViewPrinter;
 import jdk.jfr.internal.query.Configuration.Truncate;
 import jdk.jfr.internal.util.UserDataException;
-import jdk.jfr.internal.util.UserSyntaxException;
-import jdk.jfr.internal.util.Output;
 
 /**
  * Helper class that holds recording chunks alive during a query. It also helps
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java
index 6d7cccfb2a6..0511ce57001 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/JFC.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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,7 +293,7 @@ public static Reader newReader(SafePath sf) throws IOException {
     public static String formatException(String prefix, Exception e, String input) {
         String message = prefix + " " + JFC.exceptionToVerb(e) + " file '" + input + "'";
         String details = e.getMessage();
-        if (e instanceof JFCModelException m) {
+        if (e instanceof JFCModelException) {
             return message +  ". " + details;
         }
         if (e instanceof ParseException && !details.isEmpty()) {
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlSetting.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlSetting.java
index 56f2208ded3..536c5051f54 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlSetting.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/jfc/model/XmlSetting.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, 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
@@ -59,7 +59,7 @@ public void onChange() {
     @Override
     final void setContent(String value) {
         super.setContent(value);
-        if (getParent() instanceof XmlEvent event) {
+        if (getParent() instanceof XmlEvent) {
             SettingsLog.log(this, value);
         }
     }
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/HiddenWait.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/HiddenWait.java
new file mode 100644
index 00000000000..9070faad5a6
--- /dev/null
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/HiddenWait.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2024, 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 jdk.jfr.internal.management;
+
+/**
+ * The HiddenWait class is used to exclude jdk.JavaMonitorWait events
+ * from being generated when Object.wait() is called on an object of this type.
+ */
+public final class HiddenWait {
+
+    public synchronized boolean takeNap(long timeoutMillis) {
+        try {
+            this.wait(timeoutMillis);
+            return true;
+        } catch (InterruptedException e) {
+            // Ok, ignore
+            return false;
+        }
+    }
+}
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java
index ed94a908d47..7f1db163b4e 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/management/StreamBarrier.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -39,40 +39,57 @@
  * processing should not continue.
  */
 public final class StreamBarrier implements Closeable {
-
+    private final HiddenWait lock = new HiddenWait();
     private boolean activated = false;
+    private boolean used = false;
     private long end = Long.MAX_VALUE;
 
     // Blocks thread until barrier is deactivated
-    public synchronized void check() {
-        while (activated) {
-            try {
-                this.wait();
-            } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
+    public void check() {
+        synchronized (lock) {
+            while (activated) {
+                try {
+                    lock.wait();
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                }
             }
         }
     }
 
-    public synchronized void setStreamEnd(long timestamp) {
-        end = timestamp;
-    }
-
-    public synchronized long getStreamEnd() {
-        return end;
+    public void setStreamEnd(long timestamp) {
+        synchronized(lock) {
+            end = timestamp;
+        }
     }
 
-    public synchronized boolean hasStreamEnd() {
-        return end != Long.MAX_VALUE;
+    public long getStreamEnd() {
+        synchronized(lock) {
+            return end;
+        }
     }
 
-    public synchronized void activate() {
-        activated = true;
+    public void activate() {
+        synchronized (lock) {
+            activated = true;
+            used = true;
+        }
     }
 
     @Override
     public synchronized void close() throws IOException {
-        activated = false;
-        this.notifyAll();
+        synchronized (lock) {
+            activated = false;
+            lock.notifyAll();
+        }
+    }
+
+    /**
+     * Returns {@code true) if barrier is, or has been, in active state, {@code false) otherwise.
+     */
+    public boolean used() {
+        synchronized (lock) {
+            return used;
+        }
     }
 }
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java
index da32f86c171..cb54b6b651a 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Row.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -53,6 +53,6 @@ public void putText(int index, String text) {
 
     @Override
     public String toString() {
-        return Arrays.asList(values).toString();
+        return Arrays.toString(values);
     }
 }
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/TableSorter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/TableSorter.java
index 65f664018ba..88695162809 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/TableSorter.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/TableSorter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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,10 +24,7 @@
  */
 package jdk.jfr.internal.query;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Comparator;
-import java.util.List;
 import java.util.function.Predicate;
 
 import jdk.jfr.internal.query.Query.OrderElement;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/LevelSetting.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/LevelSetting.java
index acf67c0aa06..b6aa7500d4b 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/LevelSetting.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/settings/LevelSetting.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -39,7 +39,7 @@
 @MetadataDefinition
 @Label("Level")
 @Name(Type.SETTINGS_PREFIX + "Level")
-public class LevelSetting extends JDKSettingControl {
+public final class LevelSetting extends JDKSettingControl {
     private final PlatformEventType eventType;
     private final List<String> levels;
     private String value;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java
index 06616771cf9..48dd5247568 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Disassemble.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -223,9 +223,9 @@ private void splitFile(Path directory, Path file, List<Long> splitPositions) thr
                 Path p = directory.resolve(formattedFilename);
                 File splittedFile = p.toFile();
                 println("Writing " + splittedFile + " ... " + bytes.length);
-                FileOutputStream fos = new FileOutputStream(splittedFile);
-                fos.write(bytes);
-                fos.close();
+                try (var fos = new FileOutputStream(splittedFile)) {
+                    fos.write(bytes);
+                }
             }
         } catch (IOException ioe) {
             throw new UserDataException("i/o error writing file " + file);
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java
index aec1f18546c..77b3f4d1e8c 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/PrettyWriter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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,6 @@
 import java.time.OffsetDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.StringJoiner;
 
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java
index a22c64c931e..613e315ff13 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/View.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -33,7 +33,6 @@
 import java.util.List;
 
 import jdk.jfr.consumer.EventStream;
-import jdk.jfr.internal.util.Columnizer;
 import jdk.jfr.internal.query.ViewPrinter;
 import jdk.jfr.internal.query.Configuration;
 import jdk.jfr.internal.query.Configuration.Truncate;
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java
index 0049662e9a1..ae83727096a 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/Utils.java
@@ -54,12 +54,13 @@
 import jdk.jfr.internal.MirrorEvent;
 import jdk.jfr.internal.SecuritySupport;
 import jdk.jfr.internal.Type;
+import jdk.jfr.internal.management.HiddenWait;
 import jdk.jfr.internal.settings.PeriodSetting;
 import jdk.jfr.internal.settings.StackTraceSetting;
 import jdk.jfr.internal.settings.ThresholdSetting;
 
 public final class Utils {
-    private static final Object flushObject = new Object();
+    private static final HiddenWait flushObject = new HiddenWait();
     private static final String LEGACY_EVENT_NAME_PREFIX = "com.oracle.jdk.";
 
     /**
@@ -350,14 +351,6 @@ private static boolean isSupportedType(Class<?> type) {
         return Type.isValidJavaFieldType(type.getName());
     }
 
-    public static void takeNap(long millis) {
-        try {
-            Thread.sleep(millis);
-        } catch (InterruptedException e) {
-            // ok
-        }
-    }
-
     public static void notifyFlush() {
         synchronized (flushObject) {
             flushObject.notifyAll();
@@ -365,13 +358,7 @@ public static void notifyFlush() {
     }
 
     public static void waitFlush(long timeOut) {
-        synchronized (flushObject) {
-            try {
-                flushObject.wait(timeOut);
-            } catch (InterruptedException e) {
-                // OK
-            }
-        }
+        flushObject.takeNap(timeOut);
     }
 
     public static Instant epochNanosToInstant(long epochNanos) {
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueParser.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueParser.java
index 1c6561f45c4..730c83daaae 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueParser.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/util/ValueParser.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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,7 +31,7 @@
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
-public class ValueParser {
+public final class ValueParser {
     private static final String INFINITY = "infinity";
 
     public static long parseTimespanWithInfinity(String s) {
diff --git a/src/jdk.jfr/share/man/jfr.1 b/src/jdk.jfr/share/man/jfr.1
index c6a568582c0..71a487f558e 100644
--- a/src/jdk.jfr/share/man/jfr.1
+++ b/src/jdk.jfr/share/man/jfr.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JFR" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JFR" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java
index 536c5100cd8..bbf2bfacd00 100644
--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java
+++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin.java
@@ -67,7 +67,7 @@ public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
                         var clm = newClassReader(path, resource,
                                 ClassFile.DebugElementsOption.DROP_DEBUG,
                                 ClassFile.LineNumbersOption.DROP_LINE_NUMBERS);
-                        byte[] content = ClassFile.of().transform(clm, ClassTransform
+                        byte[] content = ClassFile.of().transformClass(clm, ClassTransform
                                         .dropping(cle -> cle instanceof SourceFileAttribute
                                                             || cle instanceof SourceDebugExtensionAttribute)
                                               .andThen(ClassTransform.transformingMethods(MethodTransform
diff --git a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java
index 973fa4d1268..f9a5463609a 100644
--- a/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java
+++ b/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/VersionPropsPlugin.java
@@ -101,7 +101,7 @@ public void configure(Map<String, String> config) {
 
     @SuppressWarnings("deprecation")
     private byte[] redefine(String path, byte[] classFile) {
-        return ClassFile.of().transform(newClassReader(path, classFile),
+        return ClassFile.of().transformClass(newClassReader(path, classFile),
             ClassTransform.transformingMethodBodies(
                 mm -> mm.methodName().equalsString("<clinit>"),
                 new CodeTransform() {
diff --git a/src/jdk.jlink/share/man/jlink.1 b/src/jdk.jlink/share/man/jlink.1
index 1a0b79a39c1..9f4bf38ffa5 100644
--- a/src/jdk.jlink/share/man/jlink.1
+++ b/src/jdk.jlink/share/man/jlink.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JLINK" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JLINK" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jlink/share/man/jmod.1 b/src/jdk.jlink/share/man/jmod.1
index b26685615ed..4475505e524 100644
--- a/src/jdk.jlink/share/man/jmod.1
+++ b/src/jdk.jlink/share/man/jmod.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JMOD" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JMOD" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_de.properties b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_de.properties
index 3dc883b0728..0d2cfb5b6c0 100644
--- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_de.properties
+++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_de.properties
@@ -94,6 +94,6 @@ message.preparing-distribution-dist=distribution.dist wird vorbereitet: {0}.
 message.signing.pkg=Warnung: Zum Signieren von PKG müssen Sie möglicherweise mit dem Schlüsselbundverwaltungstool die Option "Immer vertrauen" für Ihr Zertifikat festlegen.
 message.setfile.dmg=Das Festlegen des benutzerdefinierten Symbols für die DMG-Datei wurde übersprungen, weil das Utility "SetFile" nicht gefunden wurde. Durch Installieren von Xcode mit Befehlszeilentools sollte dieses Problem behoben werden.
 message.install-dir-ignored=Warnung: "--install-dir" wird von DMG nicht unterstützt. Stattdessen wird standardmäßig /Applications verwendet.
-message.codesign.failed.reason.app.content="codesign" failed and additional application content was supplied via the "--app-content" parameter. Probably the additional content broke the integrity of the application bundle and caused the failure. Ensure content supplied via the "--app-content" parameter does not break the integrity of the application bundle, or add it in the post-processing step.
+message.codesign.failed.reason.app.content="codesign" war nicht erfolgreich, und zusätzlicher Anwendungsinhalt wurde über den Parameter "--app-content" angegeben. Wahrscheinlich hat der zusätzliche Inhalt die Integrität des Anwendungs-Bundles beeinträchtigt und den Fehler verursacht. Stellen Sie sicher, das der über den Parameter "--app-content" angegebene Inhalt nicht die Integrität des Anwendungs-Bundles beeinträchtigt, oder fügen Sie ihn im Nachverarbeitungsschritt hinzu.
 warning.unsigned.app.image=Warnung: Nicht signiertes app-image wird zum Erstellen von signiertem {0} verwendet.
 warning.per.user.app.image.signed=Warnung: Konfiguration der installierten Anwendung pro Benutzer wird nicht unterstützt, da "{0}" im vordefinierten signierten Anwendungsimage fehlt.
diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties
index f1359c0eaaa..08e6dd2b4e8 100644
--- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties
+++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties
@@ -94,6 +94,6 @@ message.preparing-distribution-dist=distribution.distを準備しています: {
 message.signing.pkg=警告: PKGへの署名の場合、「キーチェーン・アクセス」ツールを使用して証明書に「常に信頼する」を設定する必要があります。
 message.setfile.dmg='SetFile'ユーティリティが見つからないため、DMGファイルでのカスタム・アイコンの設定がスキップされました。Xcodeとコマンド・ライン・ツールをインストールすると、この問題は解決されます。
 message.install-dir-ignored=警告: "--install-dir"はDMGでサポートされていません。/Applicationsにデフォルト設定されます。
-message.codesign.failed.reason.app.content="codesign" failed and additional application content was supplied via the "--app-content" parameter. Probably the additional content broke the integrity of the application bundle and caused the failure. Ensure content supplied via the "--app-content" parameter does not break the integrity of the application bundle, or add it in the post-processing step.
+message.codesign.failed.reason.app.content="codesign"が失敗したため、追加のアプリケーション・コンテンツが、"--app-content"パラメータを介して提供されました。追加のコンテンツにより、アプリケーション・バンドルの整合性が損われ、失敗の原因になった可能性があります。"--app-content"パラメータを介して提供されたコンテンツによって、アプリケーション・バンドルの整合性が損われていないことを確認するか、処理後のステップで追加してください。
 warning.unsigned.app.image=警告: 署名されていないapp-imageを使用して署名された{0}を作成します。
 warning.per.user.app.image.signed=警告: 事前定義済の署名付きアプリケーション・イメージに"{0}"がないため、インストール済アプリケーションのユーザーごとの構成はサポートされません。
diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties
index eeb49d6e591..f4e75caa1ef 100644
--- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties
+++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties
@@ -94,6 +94,6 @@ message.preparing-distribution-dist=正在准备 distribution.dist: {0}。
 message.signing.pkg=警告:要对 PKG 进行签名,可能需要使用“密钥链访问”工具为证书设置“始终信任”。
 message.setfile.dmg=由于未找到 'SetFile' 实用程序,跳过了针对 DMG 文件设置定制图标的操作。安装带命令行工具的 Xcode 应能解决此问题。
 message.install-dir-ignored=警告:"--install-dir" 不受 DMG 支持,将默认为 /Applications。
-message.codesign.failed.reason.app.content="codesign" failed and additional application content was supplied via the "--app-content" parameter. Probably the additional content broke the integrity of the application bundle and caused the failure. Ensure content supplied via the "--app-content" parameter does not break the integrity of the application bundle, or add it in the post-processing step.
+message.codesign.failed.reason.app.content="codesign" 失败,并通过 "--app-content" 参数提供了附加应用程序内容。可能是附加内容破坏了应用程序包的完整性,导致了故障。请确保通过 "--app-content" 参数提供的内容不会破坏应用程序包的完整性,或者在后处理步骤中添加该内容。
 warning.unsigned.app.image=警告:使用未签名的 app-image 生成已签名的 {0}。
 warning.per.user.app.image.signed=警告:由于预定义的已签名应用程序映像中缺少 "{0}",不支持对已安装应用程序的每用户配置提供支持。
diff --git a/src/jdk.jpackage/share/man/jpackage.1 b/src/jdk.jpackage/share/man/jpackage.1
index f9848200059..13d9c41c31d 100644
--- a/src/jdk.jpackage/share/man/jpackage.1
+++ b/src/jdk.jpackage/share/man/jpackage.1
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JPACKAGE" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JPACKAGE" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jpackage/share/native/common/ErrorHandling.cpp b/src/jdk.jpackage/share/native/common/ErrorHandling.cpp
index b3f7206bfc1..a3a4c2a9dfe 100644
--- a/src/jdk.jpackage/share/native/common/ErrorHandling.cpp
+++ b/src/jdk.jpackage/share/native/common/ErrorHandling.cpp
@@ -72,7 +72,7 @@ std::string makeMessage(const std::runtime_error& e, const SourceCodePos& pos) {
 namespace {
 
 bool isNotSpace(int chr) {
-    return isspace(chr) == 0;
+    return isspace((unsigned char) chr) == 0;
 }
 
 
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java
index 894d41d7642..c0ae65b3b0b 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, 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 @@
 import static jdk.jpackage.internal.StandardBundlerParam.TEMP_ROOT;
 import static jdk.jpackage.internal.StandardBundlerParam.VENDOR;
 import static jdk.jpackage.internal.StandardBundlerParam.VERSION;
+import jdk.jpackage.internal.WixToolset.WixToolsetType;
 import org.w3c.dom.Document;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
@@ -253,7 +254,7 @@ public String getBundleType() {
     public boolean supported(boolean platformInstaller) {
         try {
             if (wixToolset == null) {
-                wixToolset = WixTool.toolset();
+                wixToolset = WixTool.createToolset();
             }
             return true;
         } catch (ConfigException ce) {
@@ -300,7 +301,7 @@ public boolean validate(Map<String, ? super Object> params)
             appImageBundler.validate(params);
 
             if (wixToolset == null) {
-                wixToolset = WixTool.toolset();
+                wixToolset = WixTool.createToolset();
             }
 
             try {
@@ -309,16 +310,17 @@ public boolean validate(Map<String, ? super Object> params)
                 throw new ConfigException(ex);
             }
 
-            for (var toolInfo: wixToolset.values()) {
+            for (var tool : wixToolset.getType().getTools()) {
                 Log.verbose(MessageFormat.format(I18N.getString(
-                        "message.tool-version"), toolInfo.path.getFileName(),
-                        toolInfo.version));
+                        "message.tool-version"), wixToolset.getToolPath(tool).
+                                getFileName(), wixToolset.getVersion()));
             }
 
-            wixFragments.forEach(wixFragment -> wixFragment.setWixVersion(
-                    wixToolset.get(WixTool.Light).version));
+            wixFragments.forEach(wixFragment -> wixFragment.setWixVersion(wixToolset.getVersion(),
+                    wixToolset.getType()));
 
-            wixFragments.get(0).logWixFeatures();
+            wixFragments.stream().map(WixFragmentBuilder::getLoggableWixFeatures).flatMap(
+                    List::stream).distinct().toList().forEach(Log::verbose);
 
             /********* validate bundle parameters *************/
 
@@ -512,22 +514,6 @@ private Map<String, String> prepareMainProjectFile(
             data.put("JpIsSystemWide", "yes");
         }
 
-        // Copy standard l10n files.
-        for (String loc : Arrays.asList("de", "en", "ja", "zh_CN")) {
-            String fname = "MsiInstallerStrings_" + loc + ".wxl";
-            createResource(fname, params)
-                    .setCategory(I18N.getString("resource.wxl-file"))
-                    .saveToFile(configDir.resolve(fname));
-        }
-
-        createResource("main.wxs", params)
-                .setCategory(I18N.getString("resource.main-wix-file"))
-                .saveToFile(configDir.resolve("main.wxs"));
-
-        createResource("overrides.wxi", params)
-                .setCategory(I18N.getString("resource.overrides-wix-file"))
-                .saveToFile(configDir.resolve("overrides.wxi"));
-
         return data;
     }
 
@@ -542,13 +528,11 @@ private Path buildMSI(Map<String, ? super Object> params,
                         .toString()));
 
         WixPipeline wixPipeline = new WixPipeline()
-        .setToolset(wixToolset.entrySet().stream().collect(
-                Collectors.toMap(
-                        entry -> entry.getKey(),
-                        entry -> entry.getValue().path)))
-        .setWixObjDir(TEMP_ROOT.fetchFrom(params).resolve("wixobj"))
-        .setWorkDir(WIN_APP_IMAGE.fetchFrom(params))
-        .addSource(CONFIG_ROOT.fetchFrom(params).resolve("main.wxs"), wixVars);
+                .setToolset(wixToolset)
+                .setWixObjDir(TEMP_ROOT.fetchFrom(params).resolve("wixobj"))
+                .setWorkDir(WIN_APP_IMAGE.fetchFrom(params))
+                .addSource(CONFIG_ROOT.fetchFrom(params).resolve("main.wxs"),
+                        wixVars);
 
         for (var wixFragment : wixFragments) {
             wixFragment.configureWixPipeline(wixPipeline);
@@ -557,16 +541,46 @@ private Path buildMSI(Map<String, ? super Object> params,
         Log.verbose(MessageFormat.format(I18N.getString(
                 "message.generating-msi"), msiOut.toAbsolutePath().toString()));
 
-        wixPipeline.addLightOptions("-sice:ICE27");
+        switch (wixToolset.getType()) {
+            case Wix3 -> {
+                wixPipeline.addLightOptions("-sice:ICE27");
+
+                if (!MSI_SYSTEM_WIDE.fetchFrom(params)) {
+                    wixPipeline.addLightOptions("-sice:ICE91");
+                }
+            }
+            case Wix4 -> {
+            }
+            default -> {
+                throw new IllegalArgumentException();
+            }
+        }
+
+        final Path configDir = CONFIG_ROOT.fetchFrom(params);
+
+        var primaryWxlFiles = Stream.of("de", "en", "ja", "zh_CN").map(loc -> {
+            return configDir.resolve("MsiInstallerStrings_" + loc + ".wxl");
+        }).toList();
+
+        var wixResources = new WixSourceConverter.ResourceGroup(wixToolset.getType());
 
-        if (!MSI_SYSTEM_WIDE.fetchFrom(params)) {
-            wixPipeline.addLightOptions("-sice:ICE91");
+        // Copy standard l10n files.
+        for (var path : primaryWxlFiles) {
+            var name = path.getFileName().toString();
+            wixResources.addResource(createResource(name, params).setPublicName(name).setCategory(
+                    I18N.getString("resource.wxl-file")), path);
         }
 
+        wixResources.addResource(createResource("main.wxs", params).setPublicName("main.wxs").
+                setCategory(I18N.getString("resource.main-wix-file")), configDir.resolve("main.wxs"));
+
+        wixResources.addResource(createResource("overrides.wxi", params).setPublicName(
+                "overrides.wxi").setCategory(I18N.getString("resource.overrides-wix-file")),
+                configDir.resolve("overrides.wxi"));
+
         // Filter out custom l10n files that were already used to
         // override primary l10n files. Ignore case filename comparison,
         // both lists are expected to be short.
-        List<Path> primaryWxlFiles = getWxlFilesFromDir(params, CONFIG_ROOT);
         List<Path> customWxlFiles = getWxlFilesFromDir(params, RESOURCE_DIR).stream()
                 .filter(custom -> primaryWxlFiles.stream().noneMatch(primary ->
                         primary.getFileName().toString().equalsIgnoreCase(
@@ -577,6 +591,17 @@ private Path buildMSI(Map<String, ? super Object> params,
                                 custom.getFileName().toString())))
                 .toList();
 
+        // Copy custom l10n files.
+        for (var path : customWxlFiles) {
+            var name = path.getFileName().toString();
+            wixResources.addResource(createResource(name, params).setPublicName(name).
+                    setSourceOrder(OverridableResource.Source.ResourceDir).setCategory(I18N.
+                    getString("resource.wxl-file")), configDir.resolve(name));
+        }
+
+        // Save all WiX resources into config dir.
+        wixResources.saveResources();
+
         // All l10n files are supplied to WiX with "-loc", but only
         // Cultures from custom files and a single primary Culture are
         // included into "-cultures" list
@@ -586,6 +611,7 @@ private Path buildMSI(Map<String, ? super Object> params,
 
         List<String> cultures = new ArrayList<>();
         for (var wxl : customWxlFiles) {
+            wxl = configDir.resolve(wxl.getFileName());
             wixPipeline.addLightOptions("-loc", wxl.toAbsolutePath().normalize().toString());
             cultures.add(getCultureFromWxlFile(wxl));
         }
@@ -598,8 +624,20 @@ private Path buildMSI(Map<String, ? super Object> params,
         // Build ordered list of unique cultures.
         Set<String> uniqueCultures = new LinkedHashSet<>();
         uniqueCultures.addAll(cultures);
-        wixPipeline.addLightOptions(uniqueCultures.stream().collect(
-                Collectors.joining(";", "-cultures:", "")));
+        switch (wixToolset.getType()) {
+            case Wix3 -> {
+                wixPipeline.addLightOptions(uniqueCultures.stream().collect(Collectors.joining(";",
+                        "-cultures:", "")));
+            }
+            case Wix4 -> {
+                uniqueCultures.forEach(culture -> {
+                    wixPipeline.addLightOptions("-culture", culture);
+                });
+            }
+            default -> {
+                throw new IllegalArgumentException();
+            }
+        }
 
         wixPipeline.buildMsi(msiOut.toAbsolutePath());
 
@@ -751,7 +789,7 @@ private static OverridableResource initServiceInstallerResource(
     }
 
     private Path installerIcon;
-    private Map<WixTool, WixTool.ToolInfo> wixToolset;
+    private WixToolset wixToolset;
     private AppImageBundler appImageBundler;
     private final List<WixFragmentBuilder> wixFragments;
 }
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java
index cf7338f7d0b..5bc20c1413c 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java
@@ -64,6 +64,7 @@
 import static jdk.jpackage.internal.WinMsiBundler.MSI_SYSTEM_WIDE;
 import static jdk.jpackage.internal.WinMsiBundler.SERVICE_INSTALLER;
 import static jdk.jpackage.internal.WinMsiBundler.WIN_APP_IMAGE;
+import jdk.jpackage.internal.WixToolset.WixToolsetType;
 import org.w3c.dom.NodeList;
 
 /**
@@ -152,6 +153,16 @@ void addFilesToConfigRoot() throws IOException {
         super.addFilesToConfigRoot();
     }
 
+    @Override
+    List<String> getLoggableWixFeatures() {
+        if (isWithWix36Features()) {
+            return List.of(MessageFormat.format(I18N.getString("message.use-wix36-features"),
+                    getWixVersion()));
+        } else {
+            return List.of();
+        }
+    }
+
     @Override
     protected Collection<XmlConsumer> getFragmentWriters() {
         return List.of(
@@ -314,12 +325,25 @@ boolean isFile() {
             return cfg.isFile;
         }
 
-        static void startElement(XMLStreamWriter xml, String componentId,
+        static void startElement(WixToolsetType wixType, XMLStreamWriter xml, String componentId,
                 String componentGuid) throws XMLStreamException, IOException {
             xml.writeStartElement("Component");
-            xml.writeAttribute("Win64", is64Bit() ? "yes" : "no");
+            switch (wixType) {
+                case Wix3 -> {
+                    xml.writeAttribute("Win64", is64Bit() ? "yes" : "no");
+                    xml.writeAttribute("Guid", componentGuid);
+                }
+                case Wix4 -> {
+                    xml.writeAttribute("Bitness", is64Bit() ? "always64" : "always32");
+                    if (!componentGuid.equals("*")) {
+                        xml.writeAttribute("Guid", componentGuid);
+                    }
+                }
+                default -> {
+                    throw new IllegalArgumentException();
+                }
+            }
             xml.writeAttribute("Id", componentId);
-            xml.writeAttribute("Guid", componentGuid);
         }
 
         private static final class Config {
@@ -370,22 +394,31 @@ private String addComponent(XMLStreamWriter xml, Path path,
             directoryRefPath = path;
         }
 
-        xml.writeStartElement("DirectoryRef");
-        xml.writeAttribute("Id", Id.Folder.of(directoryRefPath));
+        startDirectoryElement(xml, "DirectoryRef", directoryRefPath);
 
         final String componentId = "c" + role.idOf(path);
-        Component.startElement(xml, componentId, String.format("{%s}",
-                role.guidOf(path)));
+        Component.startElement(getWixType(), xml, componentId, String.format(
+                "{%s}", role.guidOf(path)));
 
         if (role == Component.Shortcut) {
-            xml.writeStartElement("Condition");
             String property = shortcutFolders.stream().filter(shortcutFolder -> {
                 return path.startsWith(shortcutFolder.root);
             }).map(shortcutFolder -> {
                 return shortcutFolder.property;
             }).findFirst().get();
-            xml.writeCharacters(property);
-            xml.writeEndElement();
+            switch (getWixType()) {
+                case Wix3 -> {
+                    xml.writeStartElement("Condition");
+                    xml.writeCharacters(property);
+                    xml.writeEndElement();
+                }
+                case Wix4 -> {
+                    xml.writeAttribute("Condition", property);
+                }
+                default -> {
+                    throw new IllegalArgumentException();
+                }
+            }
         }
 
         boolean isRegistryKeyPath = !systemWide || role.isRegistryKeyPath();
@@ -442,7 +475,7 @@ private void addFaComponentGroup(XMLStreamWriter xml)
     private void addShortcutComponentGroup(XMLStreamWriter xml) throws
             XMLStreamException, IOException {
         List<String> componentIds = new ArrayList<>();
-        Set<ShortcutsFolder> defineShortcutFolders = new HashSet<>();
+        Set<Path> defineShortcutFolders = new HashSet<>();
         for (var launcher : launchers) {
             for (var folder : shortcutFolders) {
                 Path launcherPath = addExeSuffixToPath(installedAppImage
@@ -457,16 +490,27 @@ private void addShortcutComponentGroup(XMLStreamWriter xml) throws
                             folder);
 
                     if (componentId != null) {
-                        defineShortcutFolders.add(folder);
+                        Path folderPath = folder.getPath(this);
+                        boolean defineFolder;
+                        switch (getWixType()) {
+                            case Wix3 ->
+                                defineFolder = true;
+                            case Wix4 ->
+                                defineFolder = !SYSTEM_DIRS.contains(folderPath);
+                            default ->
+                                throw new IllegalArgumentException();
+                        }
+                        if (defineFolder) {
+                            defineShortcutFolders.add(folderPath);
+                        }
                         componentIds.add(componentId);
                     }
                 }
             }
         }
 
-        for (var folder : defineShortcutFolders) {
-            Path path = folder.getPath(this);
-            componentIds.addAll(addRootBranch(xml, path));
+        for (var folderPath : defineShortcutFolders) {
+            componentIds.addAll(addRootBranch(xml, folderPath));
         }
 
         addComponentGroup(xml, "Shortcuts", componentIds);
@@ -546,13 +590,18 @@ private List<String> addRootBranch(XMLStreamWriter xml, Path path)
             throw throwInvalidPathException(path);
         }
 
-        Function<Path, String> createDirectoryName = dir -> null;
-
         boolean sysDir = true;
-        int levels = 1;
+        int levels;
         var dirIt = path.iterator();
-        xml.writeStartElement("DirectoryRef");
-        xml.writeAttribute("Id", dirIt.next().toString());
+
+        if (getWixType() != WixToolsetType.Wix3 && TARGETDIR.equals(path.getName(0))) {
+            levels = 0;
+            dirIt.next();
+        } else {
+            levels = 1;
+            xml.writeStartElement("DirectoryRef");
+            xml.writeAttribute("Id", dirIt.next().toString());
+        }
 
         path = path.getName(0);
         while (dirIt.hasNext()) {
@@ -562,21 +611,11 @@ private List<String> addRootBranch(XMLStreamWriter xml, Path path)
 
             if (sysDir && !SYSTEM_DIRS.contains(path)) {
                 sysDir = false;
-                createDirectoryName = dir -> dir.getFileName().toString();
             }
 
-            final String directoryId;
-            if (!sysDir && path.equals(installDir)) {
-                directoryId = INSTALLDIR.toString();
-            } else {
-                directoryId = Id.Folder.of(path);
-            }
-            xml.writeStartElement("Directory");
-            xml.writeAttribute("Id", directoryId);
-
-            String directoryName = createDirectoryName.apply(path);
-            if (directoryName != null) {
-                xml.writeAttribute("Name", directoryName);
+            startDirectoryElement(xml, "Directory", path);
+            if (!sysDir) {
+                xml.writeAttribute("Name", path.getFileName().toString());
             }
         }
 
@@ -584,9 +623,37 @@ private List<String> addRootBranch(XMLStreamWriter xml, Path path)
             xml.writeEndElement();
         }
 
-        List<String> componentIds = new ArrayList<>();
+        return List.of();
+    }
 
-        return componentIds;
+    private void startDirectoryElement(XMLStreamWriter xml, String wix3ElementName, Path path) throws XMLStreamException {
+        final String elementName;
+        switch (getWixType()) {
+            case Wix3 -> {
+                elementName = wix3ElementName;
+            }
+            case Wix4 -> {
+                if (SYSTEM_DIRS.contains(path)) {
+                    elementName = "StandardDirectory";
+                } else {
+                    elementName = wix3ElementName;
+                }
+            }
+            default -> {
+                throw new IllegalArgumentException();
+            }
+
+        }
+
+        final String directoryId;
+        if (path.equals(installDir)) {
+            directoryId = INSTALLDIR.toString();
+        } else {
+            directoryId = Id.Folder.of(path);
+        }
+
+        xml.writeStartElement(elementName);
+        xml.writeAttribute("Id", directoryId);
     }
 
     private String addRemoveDirectoryComponent(XMLStreamWriter xml, Path path)
@@ -785,7 +852,7 @@ private void addRegistryKeyPath(XMLStreamWriter xml, Path path,
         xml.writeStartElement("RegistryKey");
         xml.writeAttribute("Root", regRoot);
         xml.writeAttribute("Key", registryKeyPath);
-        if (DottedVersion.compareComponents(getWixVersion(), DottedVersion.lazy("3.6")) < 0) {
+        if (!isWithWix36Features()) {
             xml.writeAttribute("Action", "createAndRemoveOnUninstall");
         }
         xml.writeStartElement("RegistryValue");
@@ -799,7 +866,7 @@ private void addRegistryKeyPath(XMLStreamWriter xml, Path path,
 
     private String addDirectoryCleaner(XMLStreamWriter xml, Path path) throws
             XMLStreamException, IOException {
-        if (DottedVersion.compareComponents(getWixVersion(), DottedVersion.lazy("3.6")) < 0) {
+        if (!isWithWix36Features()) {
             return null;
         }
 
@@ -821,14 +888,13 @@ private String addDirectoryCleaner(XMLStreamWriter xml, Path path) throws
 
         xml.writeStartElement("DirectoryRef");
         xml.writeAttribute("Id", INSTALLDIR.toString());
-        Component.startElement(xml, componentId, "*");
+        Component.startElement(getWixType(), xml, componentId, "*");
 
         addRegistryKeyPath(xml, INSTALLDIR, () -> propertyId, () -> {
             return toWixPath(path);
         });
 
-        xml.writeStartElement(
-                "http://schemas.microsoft.com/wix/UtilExtension",
+        xml.writeStartElement(getWixNamespaces().get(WixNamespace.Util),
                 "RemoveFolderEx");
         xml.writeAttribute("On", "uninstall");
         xml.writeAttribute("Property", propertyId);
@@ -839,6 +905,10 @@ private String addDirectoryCleaner(XMLStreamWriter xml, Path path) throws
         return componentId;
     }
 
+    private boolean isWithWix36Features() {
+        return DottedVersion.compareComponents(getWixVersion(), DottedVersion.greedy("3.6")) >= 0;
+    }
+
     // Does the following conversions:
     //  INSTALLDIR -> [INSTALLDIR]
     //  TARGETDIR/ProgramFiles64Folder/foo/bar -> [ProgramFiles64Folder]foo/bar
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixFragmentBuilder.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixFragmentBuilder.java
index bc98899c659..0276cc96e65 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixFragmentBuilder.java
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixFragmentBuilder.java
@@ -29,31 +29,35 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.nio.file.Path;
-import java.text.MessageFormat;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.xml.stream.XMLStreamWriter;
 import jdk.jpackage.internal.IOUtils.XmlConsumer;
 import jdk.jpackage.internal.OverridableResource.Source;
-import static jdk.jpackage.internal.OverridableResource.createResource;
 import static jdk.jpackage.internal.StandardBundlerParam.CONFIG_ROOT;
 import jdk.internal.util.Architecture;
+import static jdk.jpackage.internal.OverridableResource.createResource;
+import jdk.jpackage.internal.WixSourceConverter.ResourceGroup;
+import jdk.jpackage.internal.WixToolset.WixToolsetType;
 
 /**
  * Creates WiX fragment.
  */
 abstract class WixFragmentBuilder {
 
-    void setWixVersion(DottedVersion v) {
-        wixVersion = v;
+    final void setWixVersion(DottedVersion version, WixToolsetType type) {
+        Objects.requireNonNull(version);
+        Objects.requireNonNull(type);
+        wixVersion = version;
+        wixType = type;
     }
 
-    void setOutputFileName(String v) {
+    final void setOutputFileName(String v) {
         outputFileName = v;
     }
 
@@ -65,11 +69,8 @@ void initFromParams(Map<String, ? super Object> params) {
                 Source.ResourceDir);
     }
 
-    void logWixFeatures() {
-        if (DottedVersion.compareComponents(wixVersion, DottedVersion.lazy("3.6")) >= 0) {
-            Log.verbose(MessageFormat.format(I18N.getString(
-                    "message.use-wix36-features"), wixVersion));
-        }
+    List<String> getLoggableWixFeatures() {
+        return List.of();
     }
 
     void configureWixPipeline(WixPipeline wixPipeline) {
@@ -91,52 +92,84 @@ void addFilesToConfigRoot() throws IOException {
         }
 
         if (additionalResources != null) {
-            for (var resource : additionalResources) {
-                resource.resource.saveToFile(configRoot.resolve(
-                        resource.saveAsName));
-            }
+            additionalResources.saveResources();
         }
     }
 
-    DottedVersion getWixVersion() {
+    final WixToolsetType getWixType() {
+        return wixType;
+    }
+
+    final DottedVersion getWixVersion() {
         return wixVersion;
     }
 
+    protected static enum WixNamespace {
+        Default,
+        Util;
+    }
+
+    final protected Map<WixNamespace, String> getWixNamespaces() {
+        switch (wixType) {
+            case Wix3 -> {
+                return Map.of(WixNamespace.Default,
+                        "http://schemas.microsoft.com/wix/2006/wi",
+                        WixNamespace.Util,
+                        "http://schemas.microsoft.com/wix/UtilExtension");
+            }
+            case Wix4 -> {
+                return Map.of(WixNamespace.Default,
+                        "http://wixtoolset.org/schemas/v4/wxs",
+                        WixNamespace.Util,
+                        "http://wixtoolset.org/schemas/v4/wxs/util");
+            }
+            default -> {
+                throw new IllegalArgumentException();
+            }
+
+        }
+    }
+
     static boolean is64Bit() {
         return Architecture.is64bit();
     }
 
-    protected Path getConfigRoot() {
+    final protected Path getConfigRoot() {
         return configRoot;
     }
 
     protected abstract Collection<XmlConsumer> getFragmentWriters();
 
-    protected void defineWixVariable(String variableName) {
+    final protected void defineWixVariable(String variableName) {
         setWixVariable(variableName, "yes");
     }
 
-    protected void setWixVariable(String variableName, String variableValue) {
+    final protected void setWixVariable(String variableName, String variableValue) {
         if (wixVariables == null) {
             wixVariables = new WixVariables();
         }
         wixVariables.setWixVariable(variableName, variableValue);
     }
 
-    protected void addResource(OverridableResource resource, String saveAsName) {
+    final protected void addResource(OverridableResource resource, String saveAsName) {
         if (additionalResources == null) {
-            additionalResources = new ArrayList<>();
+            additionalResources = new ResourceGroup(getWixType());
         }
-        additionalResources.add(new ResourceWithName(resource, saveAsName));
+        additionalResources.addResource(resource, configRoot.resolve(saveAsName));
     }
 
-    static void createWixSource(Path file, XmlConsumer xmlConsumer)
-            throws IOException {
+    private void createWixSource(Path file, XmlConsumer xmlConsumer) throws IOException {
         IOUtils.createXml(file, xml -> {
             xml.writeStartElement("Wix");
-            xml.writeDefaultNamespace("http://schemas.microsoft.com/wix/2006/wi");
-            xml.writeNamespace("util",
-                    "http://schemas.microsoft.com/wix/UtilExtension");
+            for (var ns : getWixNamespaces().entrySet()) {
+                switch (ns.getKey()) {
+                    case Default ->
+                        xml.writeDefaultNamespace(ns.getValue());
+                    default ->
+                        xml.writeNamespace(ns.getKey().name().toLowerCase(), ns.
+                                getValue());
+                }
+            }
 
             xmlConsumer.accept((XMLStreamWriter) Proxy.newProxyInstance(
                     XMLStreamWriter.class.getClassLoader(), new Class<?>[]{
@@ -146,16 +179,6 @@ static void createWixSource(Path file, XmlConsumer xmlConsumer)
         });
     }
 
-    private static class ResourceWithName {
-
-        ResourceWithName(OverridableResource resource, String saveAsName) {
-            this.resource = resource;
-            this.saveAsName = saveAsName;
-        }
-        private final OverridableResource resource;
-        private final String saveAsName;
-    }
-
     private static class WixPreprocessorEscaper implements InvocationHandler {
 
         WixPreprocessorEscaper(XMLStreamWriter target) {
@@ -208,9 +231,10 @@ private String escape(CharSequence str) {
         private final XMLStreamWriter target;
     }
 
+    private WixToolsetType wixType;
     private DottedVersion wixVersion;
     private WixVariables wixVariables;
-    private List<ResourceWithName> additionalResources;
+    private ResourceGroup additionalResources;
     private OverridableResource fragmentResource;
     private String outputFileName;
     private Path configRoot;
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java
index 58a07b6cbaf..835247ed1de 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -22,18 +22,19 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-
 package jdk.jpackage.internal;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.function.UnaryOperator;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
@@ -45,7 +46,7 @@ public class WixPipeline {
         lightOptions = new ArrayList<>();
     }
 
-    WixPipeline setToolset(Map<WixTool, Path> v) {
+    WixPipeline setToolset(WixToolset v) {
         toolset = v;
         return this;
     }
@@ -79,13 +80,92 @@ WixPipeline addLightOptions(String ... v) {
     }
 
     void buildMsi(Path msi) throws IOException {
+        Objects.requireNonNull(workDir);
+
+        switch (toolset.getType()) {
+            case Wix3 -> buildMsiWix3(msi);
+            case Wix4 -> buildMsiWix4(msi);
+            default -> throw new IllegalArgumentException();
+        }
+    }
+
+    private void addWixVariblesToCommandLine(
+            Map<String, String> otherWixVariables, List<String> cmdline) {
+        Stream.of(wixVariables, Optional.ofNullable(otherWixVariables).
+                orElseGet(Collections::emptyMap)).filter(Objects::nonNull).
+                reduce((a, b) -> {
+                    a.putAll(b);
+                    return a;
+                }).ifPresent(wixVars -> {
+            var entryStream = wixVars.entrySet().stream();
+
+            Stream<String> stream;
+            switch (toolset.getType()) {
+                case Wix3 -> {
+                    stream = entryStream.map(wixVar -> {
+                        return String.format("-d%s=%s", wixVar.getKey(), wixVar.
+                                getValue());
+                    });
+                }
+                case Wix4 -> {
+                    stream = entryStream.map(wixVar -> {
+                        return Stream.of("-d", String.format("%s=%s", wixVar.
+                                getKey(), wixVar.getValue()));
+                    }).flatMap(Function.identity());
+                }
+                default -> {
+                    throw new IllegalArgumentException();
+                }
+            }
+
+            stream.reduce(cmdline, (ctnr, wixVar) -> {
+                ctnr.add(wixVar);
+                return ctnr;
+            }, (x, y) -> {
+                x.addAll(y);
+                return x;
+            });
+        });
+    }
+
+    private void buildMsiWix4(Path msi) throws IOException {
+        var mergedSrcWixVars = sources.stream().map(wixSource -> {
+            return Optional.ofNullable(wixSource.variables).orElseGet(
+                    Collections::emptyMap).entrySet().stream();
+        }).flatMap(Function.identity()).collect(Collectors.toMap(
+                Map.Entry::getKey, Map.Entry::getValue));
+
+        List<String> cmdline = new ArrayList<>(List.of(
+                toolset.getToolPath(WixTool.Wix4).toString(),
+                "build",
+                "-nologo",
+                "-pdbtype", "none",
+                "-intermediatefolder", wixObjDir.toAbsolutePath().toString(),
+                "-ext", "WixToolset.Util.wixext",
+                "-arch", WixFragmentBuilder.is64Bit() ? "x64" : "x86"
+        ));
+
+        cmdline.addAll(lightOptions);
+
+        addWixVariblesToCommandLine(mergedSrcWixVars, cmdline);
+
+        cmdline.addAll(sources.stream().map(wixSource -> {
+            return wixSource.source.toAbsolutePath().toString();
+        }).toList());
+
+        cmdline.addAll(List.of("-out", msi.toString()));
+
+        execute(cmdline);
+    }
+
+    private void buildMsiWix3(Path msi) throws IOException {
         List<Path> wixObjs = new ArrayList<>();
         for (var source : sources) {
-            wixObjs.add(compile(source));
+            wixObjs.add(compileWix3(source));
         }
 
         List<String> lightCmdline = new ArrayList<>(List.of(
-                toolset.get(WixTool.Light).toString(),
+                toolset.getToolPath(WixTool.Light3).toString(),
                 "-nologo",
                 "-spdb",
                 "-ext", "WixUtilExtension",
@@ -99,31 +179,20 @@ void buildMsi(Path msi) throws IOException {
         execute(lightCmdline);
     }
 
-    private Path compile(WixSource wixSource) throws IOException {
-        UnaryOperator<Path> adjustPath = path -> {
-            return workDir != null ? path.toAbsolutePath() : path;
-        };
-
-        Path wixObj = adjustPath.apply(wixObjDir).resolve(IOUtils.replaceSuffix(
+    private Path compileWix3(WixSource wixSource) throws IOException {
+        Path wixObj = wixObjDir.toAbsolutePath().resolve(IOUtils.replaceSuffix(
                 IOUtils.getFileName(wixSource.source), ".wixobj"));
 
         List<String> cmdline = new ArrayList<>(List.of(
-                toolset.get(WixTool.Candle).toString(),
+                toolset.getToolPath(WixTool.Candle3).toString(),
                 "-nologo",
-                adjustPath.apply(wixSource.source).toString(),
+                wixSource.source.toAbsolutePath().toString(),
                 "-ext", "WixUtilExtension",
                 "-arch", WixFragmentBuilder.is64Bit() ? "x64" : "x86",
                 "-out", wixObj.toAbsolutePath().toString()
         ));
 
-        Map<String, String> appliedVaribales = new HashMap<>();
-        Stream.of(wixVariables, wixSource.variables)
-                .filter(Objects::nonNull)
-                .forEachOrdered(appliedVaribales::putAll);
-
-        appliedVaribales.entrySet().stream().map(wixVar -> String.format("-d%s=%s",
-                wixVar.getKey(), wixVar.getValue())).forEachOrdered(
-                cmdline::add);
+        addWixVariblesToCommandLine(wixSource.variables, cmdline);
 
         execute(cmdline);
 
@@ -131,8 +200,8 @@ private Path compile(WixSource wixSource) throws IOException {
     }
 
     private void execute(List<String> cmdline) throws IOException {
-        Executor.of(new ProcessBuilder(cmdline).directory(
-                workDir != null ? workDir.toFile() : null)).executeExpectSuccess();
+        Executor.of(new ProcessBuilder(cmdline).directory(workDir.toFile())).
+                executeExpectSuccess();
     }
 
     private static final class WixSource {
@@ -140,7 +209,7 @@ private static final class WixSource {
         Map<String, String> variables;
     }
 
-    private Map<WixTool, Path> toolset;
+    private WixToolset toolset;
     private Map<String, String> wixVariables;
     private List<String> lightOptions;
     private Path wixObjDir;
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java
new file mode 100644
index 00000000000..7786d64a786
--- /dev/null
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java
@@ -0,0 +1,420 @@
+/*
+ * Copyright (c) 2024, 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 jdk.jpackage.internal;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.util.AbstractMap;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import javax.xml.XMLConstants;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stax.StAXResult;
+import javax.xml.transform.stream.StreamSource;
+import jdk.jpackage.internal.WixToolset.WixToolsetType;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+/**
+ * Converts WiX v3 source file into WiX v4 format.
+ */
+final class WixSourceConverter {
+
+    enum Status {
+        SavedAsIs,
+        SavedAsIsMalfromedXml,
+        Transformed,
+    }
+
+    WixSourceConverter(Path resourceDir) throws IOException {
+        var buf = new ByteArrayOutputStream();
+
+        new OverridableResource("wix3-to-wix4-conv.xsl")
+                .setPublicName("wix-conv.xsl")
+                .setResourceDir(resourceDir)
+                .setCategory(I18N.getString("resource.wix-src-conv"))
+                .saveToStream(buf);
+
+        var xslt = new StreamSource(new ByteArrayInputStream(buf.toByteArray()));
+
+        var tf = TransformerFactory.newInstance();
+        try {
+            this.transformer = tf.newTransformer(xslt);
+        } catch (TransformerException ex) {
+            // Should never happen
+            throw new RuntimeException(ex);
+        }
+
+        this.outputFactory = XMLOutputFactory.newInstance();
+    }
+
+    Status appyTo(OverridableResource resource, Path resourceSaveAsFile) throws IOException {
+        // Save the resource into DOM tree and read xml namespaces from it.
+        // If some namespaces are not recognized by this converter, save the resource as is.
+        // If all detected namespaces are recognized, run transformation of the DOM tree and save
+        // output into destination file.
+
+        var buf = saveResourceInMemory(resource);
+
+        Document inputXmlDom;
+        try {
+            inputXmlDom = IOUtils.initDocumentBuilder().parse(new ByteArrayInputStream(buf));
+        } catch (SAXException ex) {
+            // Malformed XML, don't run converter, save as is.
+            resource.saveToFile(resourceSaveAsFile);
+            return Status.SavedAsIsMalfromedXml;
+        }
+
+        try {
+            var nc = new NamespaceCollector();
+            TransformerFactory.newInstance().newTransformer().
+                    transform(new DOMSource(inputXmlDom), new StAXResult((XMLStreamWriter) Proxy.
+                            newProxyInstance(XMLStreamWriter.class.getClassLoader(),
+                                    new Class<?>[]{XMLStreamWriter.class}, nc)));
+            if (!nc.isOnlyKnownNamespacesUsed()) {
+                // Unsupported namespaces detected in input XML, don't run converter, save as is.
+                resource.saveToFile(resourceSaveAsFile);
+                return Status.SavedAsIs;
+            }
+        } catch (TransformerException ex) {
+            // Should never happen
+            throw new RuntimeException(ex);
+        }
+
+        Supplier<Source> inputXml = () -> {
+            // Should be "new DOMSource(inputXmlDom)", but no transfromation is applied in this case!
+            return new StreamSource(new ByteArrayInputStream(buf));
+        };
+
+        var nc = new NamespaceCollector();
+        try {
+            // Run transfomation to collect namespaces from the output XML.
+            transformer.transform(inputXml.get(), new StAXResult((XMLStreamWriter) Proxy.
+                    newProxyInstance(XMLStreamWriter.class.getClassLoader(),
+                            new Class<?>[]{XMLStreamWriter.class}, nc)));
+        } catch (TransformerException ex) {
+            // Should never happen
+            throw new RuntimeException(ex);
+        }
+
+        try (var outXml = new ByteArrayOutputStream()) {
+            transformer.transform(inputXml.get(), new StAXResult((XMLStreamWriter) Proxy.
+                    newProxyInstance(XMLStreamWriter.class.getClassLoader(),
+                            new Class<?>[]{XMLStreamWriter.class}, new NamespaceCleaner(nc.
+                                    getPrefixToUri(), outputFactory.createXMLStreamWriter(outXml)))));
+            Files.createDirectories(IOUtils.getParent(resourceSaveAsFile));
+            Files.copy(new ByteArrayInputStream(outXml.toByteArray()), resourceSaveAsFile,
+                    StandardCopyOption.REPLACE_EXISTING);
+        } catch (TransformerException | XMLStreamException ex) {
+            // Should never happen
+            throw new RuntimeException(ex);
+        }
+
+        return Status.Transformed;
+    }
+
+    private static byte[] saveResourceInMemory(OverridableResource resource) throws IOException {
+        var buf = new ByteArrayOutputStream();
+        resource.saveToStream(buf);
+        return buf.toByteArray();
+    }
+
+    final static class ResourceGroup {
+
+        ResourceGroup(WixToolsetType wixToolsetType) {
+            this.wixToolsetType = wixToolsetType;
+        }
+
+        void addResource(OverridableResource resource, Path resourceSaveAsFile) {
+            resources.put(resourceSaveAsFile, resource);
+        }
+
+        void saveResources() throws IOException {
+            switch (wixToolsetType) {
+                case Wix3 -> {
+                    for (var e : resources.entrySet()) {
+                        e.getValue().saveToFile(e.getKey());
+                    }
+                }
+                case Wix4 -> {
+                    var resourceDir = resources.values().stream().filter(res -> {
+                        return null != res.getResourceDir();
+                    }).findAny().map(OverridableResource::getResourceDir).orElse(null);
+                    var conv = new WixSourceConverter(resourceDir);
+                    for (var e : resources.entrySet()) {
+                        conv.appyTo(e.getValue(), e.getKey());
+                    }
+                }
+                default -> {
+                    throw new IllegalArgumentException();
+                }
+            }
+        }
+
+        private final Map<Path, OverridableResource> resources = new HashMap<>();
+        private final WixToolsetType wixToolsetType;
+    }
+
+    //
+    //    Default JDK XSLT v1.0 processor is not handling well default namespace mappings.
+    //    Running generic template:
+    //
+    //    <xsl:template match="wix3loc:*">
+    //      <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxl">
+    //        <xsl:apply-templates select="@*|node()"/>
+    //      </xsl:element>
+    //    </xsl:template>
+    //
+    //    produces:
+    //
+    //    <ns0:WixLocalization xmlns:ns0="http://wixtoolset.org/schemas/v4/wxl" Culture="en-us" Codepage="1252">
+    //      <ns1:String xmlns:ns1="http://wixtoolset.org/schemas/v4/wxl" Value="The folder [INSTALLDIR] already exist. Would you like to install to that folder anyway?" Id="message.install.dir.exist"/>
+    //      <ns2:String xmlns:ns2="http://wixtoolset.org/schemas/v4/wxl" Value="Main Feature" Id="MainFeatureTitle"/>
+    //      ...
+    //      <ns12:String xmlns:ns12="http://wixtoolset.org/schemas/v4/wxl" Value="Open with [ProductName]" Id="ContextMenuCommandLabel"/>
+    //    </ns0:WixLocalization>
+    //
+    //    which is conformant XML but WiX4 doesn't like it:
+    //
+    //    wix.exe : error WIX0202: The {http://wixtoolset.org/schemas/v4/wxl}String element contains an unsupported extension attribute '{http://www.w3.org/2000/xmlns/}ns1'. The {http://wixtoolset.org/schemas/v4/wxl}String element does not currently support extension attributes. Is the {http://www.w3.org/2000/xmlns/}ns1 attribute using the correct XML namespace?
+    //    wix.exe : error WIX0202: The {http://wixtoolset.org/schemas/v4/wxl}String element contains an unsupported extension attribute '{http://www.w3.org/2000/xmlns/}ns2'. The {http://wixtoolset.org/schemas/v4/wxl}String element does not currently support extension attributes. Is the {http://www.w3.org/2000/xmlns/}ns2 attribute using the correct XML namespace?
+    //    wix.exe : error WIX0202: The {http://wixtoolset.org/schemas/v4/wxl}String element contains an unsupported extension attribute '{http://www.w3.org/2000/xmlns/}ns3'. The {http://wixtoolset.org/schemas/v4/wxl}String element does not currently support extension attributes. Is the {http://www.w3.org/2000/xmlns/}ns3 attribute using the correct XML namespace?
+    //
+    //    Someone hit this issue long ago - https://stackoverflow.com/questions/26904623/replace-default-namespace-using-xsl and they suggested to use different XSLT processor.
+    //    Two online XSLT processors used in testing produce clean XML with this template indeed:
+    //
+    //    <WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Codepage="1252" Culture="en-us">
+    //      <String Value="The folder [INSTALLDIR] already exist. Would you like to install to that folder anyway?" Id="message.install.dir.exist"/>
+    //      <String Value="Main Feature" Id="MainFeatureTitle"/>
+    //      ...
+    //      <String Value="Open with [ProductName]" Id="ContextMenuCommandLabel"/>
+    //    </WixLocalization>
+    //
+    //    To workaround default JDK's XSLT processor limitations we do additionl postprocessing of output XML with NamespaceCleaner class.
+    //
+    private static class NamespaceCleaner implements InvocationHandler {
+
+        NamespaceCleaner(Map<String, String> prefixToUri, XMLStreamWriter target) {
+            this.uriToPrefix = prefixToUri.entrySet().stream().collect(Collectors.toMap(
+                    Map.Entry::getValue, e -> {
+                        return new Prefix(e.getKey());
+                    }, (x, y) -> x));
+            this.prefixToUri = prefixToUri;
+            this.target = target;
+        }
+
+        @Override
+        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+            switch (method.getName()) {
+                case "writeNamespace" -> {
+                    final String uri = (String) args[1];
+                    var prefixObj = uriToPrefix.get(uri);
+                    if (!prefixObj.written) {
+                        prefixObj.written = true;
+                        target.writeNamespace(prefixObj.name, uri);
+                    }
+                    return null;
+                }
+                case "writeStartElement", "writeEmptyElement" -> {
+                    final String name;
+                    switch (args.length) {
+                        case 1 ->
+                            name = (String) args[0];
+                        case 2, 3 ->
+                            name = (String) args[1];
+                        default ->
+                            throw new IllegalArgumentException();
+                    }
+
+                    final String prefix;
+                    final String localName;
+                    final String[] tokens = name.split(":", 2);
+                    if (tokens.length == 2) {
+                        prefix = tokens[0];
+                        localName = tokens[1];
+                    } else {
+                        localName = name;
+                        switch (args.length) {
+                            case 3 ->
+                                prefix = (String) args[0];
+                            case 2 ->
+                                prefix = uriToPrefix.get((String) args[0]).name;
+                            default ->
+                                prefix = null;
+                        }
+                    }
+
+                    if (prefix != null && !XMLConstants.DEFAULT_NS_PREFIX.equals(prefix)) {
+                        final String uri = prefixToUri.get(prefix);
+                        var prefixObj = uriToPrefix.get(uri);
+                        if (prefixObj.written) {
+                            var writeName = String.join(":", prefixObj.name, localName);
+                            if ("writeStartElement".equals(method.getName())) {
+                                target.writeStartElement(writeName);
+                            } else {
+                                target.writeEmptyElement(writeName);
+                            }
+                            return null;
+                        } else {
+                            prefixObj.written = (args.length > 1);
+                            args = Arrays.copyOf(args, args.length, Object[].class);
+                            if (localName.equals(name)) {
+                                // No prefix in the name
+                                if (args.length == 3) {
+                                    args[0] = prefixObj.name;
+                                }
+                            } else {
+                                var writeName = String.join(":", prefixObj.name, localName);
+                                switch (args.length) {
+                                    case 1 ->
+                                        args[0] = writeName;
+                                    case 2 -> {
+                                        args[0] = uri;
+                                        args[1] = writeName;
+                                    }
+                                    case 3 -> {
+                                        args[0] = prefixObj.name;
+                                        args[1] = writeName;
+                                        args[2] = uri;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            return method.invoke(target, args);
+        }
+
+        static class Prefix {
+
+            Prefix(String name) {
+                this.name = name;
+            }
+
+            private final String name;
+            private boolean written;
+        }
+
+        private final Map<String, Prefix> uriToPrefix;
+        private final Map<String, String> prefixToUri;
+        private final XMLStreamWriter target;
+    }
+
+    private static class NamespaceCollector implements InvocationHandler {
+
+        @Override
+        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+            switch (method.getName()) {
+                case "setPrefix", "writeNamespace" -> {
+                    var prefix = (String) args[0];
+                    var namespace = prefixToUri.computeIfAbsent(prefix, k -> createValue(args[1]));
+                    if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) {
+                        namespace.setValue(true);
+                    }
+                }
+                case "writeStartElement", "writeEmptyElement" -> {
+                    switch (args.length) {
+                        case 3 ->
+                            prefixToUri.computeIfAbsent((String) args[0], k -> createValue(
+                                    (String) args[2])).setValue(true);
+                        case 2 ->
+                            initFromElementName((String) args[1], (String) args[0]);
+                        case 1 ->
+                            initFromElementName((String) args[0], null);
+                    }
+                }
+            }
+            return null;
+        }
+
+        boolean isOnlyKnownNamespacesUsed() {
+            return prefixToUri.values().stream().filter(namespace -> {
+                return namespace.getValue();
+            }).allMatch(namespace -> {
+                if (!namespace.getValue()) {
+                    return true;
+                } else {
+                    return KNOWN_NAMESPACES.contains(namespace.getKey());
+                }
+            });
+        }
+
+        Map<String, String> getPrefixToUri() {
+            return prefixToUri.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,
+                    e -> {
+                        return e.getValue().getKey();
+                    }));
+        }
+
+        private void initFromElementName(String name, String namespace) {
+            final String[] tokens = name.split(":", 2);
+            if (tokens.length == 2) {
+                if (namespace != null) {
+                    prefixToUri.computeIfAbsent(tokens[0], k -> createValue(namespace)).setValue(
+                            true);
+                } else {
+                    prefixToUri.computeIfPresent(tokens[0], (k, v) -> {
+                        v.setValue(true);
+                        return v;
+                    });
+                }
+            }
+        }
+
+        private Map.Entry<String, Boolean> createValue(Object prefix) {
+            return new AbstractMap.SimpleEntry<String, Boolean>((String) prefix, false);
+        }
+
+        private final Map<String, Map.Entry<String, Boolean>> prefixToUri = new HashMap<>();
+    }
+
+    private final Transformer transformer;
+    private final XMLOutputFactory outputFactory;
+
+    // The list of WiX v3 namespaces this converter can handle
+    private final static Set<String> KNOWN_NAMESPACES = Set.of(
+            "http://schemas.microsoft.com/wix/2006/localization",
+            "http://schemas.microsoft.com/wix/2006/wi");
+}
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java
index 68104444b3c..f16b28edf24 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixTool.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -22,7 +22,6 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-
 package jdk.jpackage.internal;
 
 import java.io.IOException;
@@ -32,105 +31,198 @@
 import java.nio.file.Path;
 import java.nio.file.PathMatcher;
 import java.text.MessageFormat;
-import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
-import java.util.function.Supplier;
+import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import jdk.jpackage.internal.WixToolset.WixToolsetType;
 
 /**
  * WiX tool.
  */
 public enum WixTool {
-    Candle, Light;
+    Candle3("candle", DottedVersion.lazy("3.0")),
+    Light3("light", DottedVersion.lazy("3.0")),
+    Wix4("wix", DottedVersion.lazy("4.0.4"));
+
+    WixTool(String commandName, DottedVersion minimalVersion) {
+        this.toolFileName = IOUtils.addSuffix(Path.of(commandName), ".exe");
+        this.minimalVersion = minimalVersion;
+    }
 
     static final class ToolInfo {
+
         ToolInfo(Path path, String version) {
             this.path = path;
-            this.version = new DottedVersion(version);
+            this.version = DottedVersion.lazy(version);
         }
 
         final Path path;
         final DottedVersion version;
     }
 
-    static Map<WixTool, ToolInfo> toolset() throws ConfigException {
-        Map<WixTool, ToolInfo> toolset = new HashMap<>();
-        for (var tool : values()) {
-            toolset.put(tool, tool.find());
-        }
-        return toolset;
-    }
+    static WixToolset createToolset() throws ConfigException {
+        Function<List<ToolLookupResult>, Map<WixTool, ToolInfo>> conv = lookupResults -> {
+            return lookupResults.stream().filter(ToolLookupResult::isValid).collect(Collectors.
+                    groupingBy(lookupResult -> {
+                return lookupResult.getInfo().version.toString();
+            })).values().stream().filter(sameVersionLookupResults -> {
+                Set<WixTool> sameVersionTools = sameVersionLookupResults.stream().map(
+                        ToolLookupResult::getTool).collect(Collectors.toSet());
+                if (sameVersionTools.equals(Set.of(Candle3)) || sameVersionTools.equals(Set.of(
+                        Light3))) {
+                    // There is only one tool from WiX v3 toolset of some version available. Discard it.
+                    return false;
+                } else {
+                    return true;
+                }
+            }).flatMap(List::stream).collect(Collectors.toMap(ToolLookupResult::getTool,
+                    ToolLookupResult::getInfo, (ToolInfo x, ToolInfo y) -> {
+                        return Stream.of(x, y).sorted(Comparator.comparing((ToolInfo toolInfo) -> {
+                            return toolInfo.version.toComponentsString();
+                        }).reversed()).findFirst().get();
+                    }));
+        };
 
-    ToolInfo find() throws ConfigException {
-        final Path toolFileName = IOUtils.addSuffix(
-                Path.of(name().toLowerCase()), ".exe");
+        Function<List<ToolLookupResult>, Optional<WixToolset>> createToolset = lookupResults -> {
+            var tools = conv.apply(lookupResults);
+            // Try to build a toolset found in the PATH and in known locations.
+            return Stream.of(WixToolsetType.values()).map(toolsetType -> {
+                return WixToolset.create(toolsetType.getTools(), tools);
+            }).filter(Objects::nonNull).findFirst();
+        };
 
-        String[] version = new String[1];
-        ConfigException reason = createToolValidator(toolFileName, version).get();
-        if (version[0] != null) {
-            if (reason == null) {
-                // Found in PATH.
-                return new ToolInfo(toolFileName, version[0]);
-            }
+        var toolsInPath = Stream.of(values()).map(tool -> {
+            return new ToolLookupResult(tool, null);
+        }).toList();
 
-            // Found in PATH, but something went wrong.
-            throw reason;
+        // Try to build a toolset from tools in the PATH first.
+        var toolset = createToolset.apply(toolsInPath);
+        if (toolset.isPresent()) {
+            return toolset.get();
         }
 
-        for (var dir : findWixInstallDirs()) {
-            Path path = dir.resolve(toolFileName);
-            if (Files.exists(path)) {
-                reason = createToolValidator(path, version).get();
-                if (reason != null) {
-                    throw reason;
+        // Look up for WiX tools in known locations.
+        var toolsInKnownWiXDirs = findWixInstallDirs().stream().map(dir -> {
+            return Stream.of(values()).map(tool -> {
+                return new ToolLookupResult(tool, dir);
+            });
+        }).flatMap(Function.identity()).toList();
+
+        // Build a toolset found in the PATH and in known locations.
+        var allFoundTools = Stream.of(toolsInPath, toolsInKnownWiXDirs).flatMap(List::stream).filter(
+                ToolLookupResult::isValid).toList();
+        toolset = createToolset.apply(allFoundTools);
+        if (toolset.isPresent()) {
+            return toolset.get();
+        } else if (allFoundTools.isEmpty()) {
+            throw new ConfigException(I18N.getString("error.no-wix-tools"), I18N.getString(
+                    "error.no-wix-tools.advice"));
+        } else {
+            var toolOldVerErr = allFoundTools.stream().map(lookupResult -> {
+                if (lookupResult.versionTooOld) {
+                    return new ConfigException(MessageFormat.format(I18N.getString(
+                            "message.wrong-tool-version"), lookupResult.getInfo().path,
+                            lookupResult.getInfo().version, lookupResult.getTool().minimalVersion),
+                            I18N.getString("error.no-wix-tools.advice"));
+                } else {
+                    return null;
                 }
-                return new ToolInfo(path, version[0]);
+            }).filter(Objects::nonNull).findAny();
+            if (toolOldVerErr.isPresent()) {
+                throw toolOldVerErr.get();
+            } else {
+                throw new ConfigException(I18N.getString("error.no-wix-tools"), I18N.getString(
+                        "error.no-wix-tools.advice"));
             }
         }
-
-        throw reason;
     }
 
-    private static Supplier<ConfigException> createToolValidator(Path toolPath,
-            String[] versionCtnr) {
-        return new ToolValidator(toolPath)
-                .setCommandLine("/?")
-                .setMinimalVersion(MINIMAL_VERSION)
-                .setToolNotFoundErrorHandler(
-                        (name, ex) -> new ConfigException(
-                                I18N.getString("error.no-wix-tools"),
-                                I18N.getString("error.no-wix-tools.advice")))
-                .setToolOldVersionErrorHandler(
-                        (name, version) -> new ConfigException(
-                                MessageFormat.format(I18N.getString(
-                                        "message.wrong-tool-version"), name,
-                                        version, MINIMAL_VERSION),
-                                I18N.getString("error.no-wix-tools.advice")))
-                .setVersionParser(output -> {
-                    versionCtnr[0] = "";
+    private static class ToolLookupResult {
+
+        ToolLookupResult(WixTool tool, Path lookupDir) {
+
+            final Path toolPath = Optional.ofNullable(lookupDir).map(p -> p.resolve(
+                    tool.toolFileName)).orElse(tool.toolFileName);
+
+            final boolean[] tooOld = new boolean[1];
+            final String[] parsedVersion = new String[1];
+
+            final var validator = new ToolValidator(toolPath).setMinimalVersion(tool.minimalVersion).
+                    setToolNotFoundErrorHandler((name, ex) -> {
+                        return new ConfigException("", "");
+                    }).setToolOldVersionErrorHandler((name, version) -> {
+                tooOld[0] = true;
+                return null;
+            });
+
+            final Function<Stream<String>, String> versionParser;
+
+            if (Set.of(Candle3, Light3).contains(tool)) {
+                validator.setCommandLine("/?");
+                versionParser = output -> {
                     String firstLineOfOutput = output.findFirst().orElse("");
                     int separatorIdx = firstLineOfOutput.lastIndexOf(' ');
                     if (separatorIdx == -1) {
                         return null;
                     }
-                    versionCtnr[0] = firstLineOfOutput.substring(separatorIdx + 1);
-                    return versionCtnr[0];
-                })::validate;
-    }
+                    return firstLineOfOutput.substring(separatorIdx + 1);
+                };
+            } else {
+                validator.setCommandLine("--version");
+                versionParser = output -> {
+                    return output.findFirst().orElse("");
+                };
+            }
 
-    private static final DottedVersion MINIMAL_VERSION = DottedVersion.lazy("3.0");
+            validator.setVersionParser(output -> {
+                parsedVersion[0] = versionParser.apply(output);
+                return parsedVersion[0];
+            });
 
-    static Path getSystemDir(String envVar, String knownDir) {
+            this.tool = tool;
+            if (validator.validate() == null) {
+                // Tool found
+                this.versionTooOld = tooOld[0];
+                this.info = new ToolInfo(toolPath, parsedVersion[0]);
+            } else {
+                this.versionTooOld = false;
+                this.info = null;
+            }
+        }
+
+        WixTool getTool() {
+            return tool;
+        }
+
+        ToolInfo getInfo() {
+            return info;
+        }
+
+        boolean isValid() {
+            return info != null && !versionTooOld;
+        }
+
+        boolean isVersionTooOld() {
+            return versionTooOld;
+        }
+
+        private final WixTool tool;
+        private final ToolInfo info;
+        private final boolean versionTooOld;
+    }
+
+    private static Path getSystemDir(String envVar, String knownDir) {
         return Optional
                 .ofNullable(getEnvVariableAsPath(envVar))
                 .orElseGet(() -> Optional
-                        .ofNullable(getEnvVariableAsPath("SystemDrive"))
-                        .orElseGet(() -> Path.of("C:")).resolve(knownDir));
+                .ofNullable(getEnvVariableAsPath("SystemDrive"))
+                .orElseGet(() -> Path.of("C:")).resolve(knownDir));
     }
 
     private static Path getEnvVariableAsPath(String envVar) {
@@ -147,8 +239,22 @@ private static Path getEnvVariableAsPath(String envVar) {
     }
 
     private static List<Path> findWixInstallDirs() {
-        PathMatcher wixInstallDirMatcher = FileSystems.getDefault().getPathMatcher(
-                "glob:WiX Toolset v*");
+        return Stream.of(findWixCurrentInstallDirs(), findWix3InstallDirs()).
+                flatMap(List::stream).toList();
+    }
+
+    private static List<Path> findWixCurrentInstallDirs() {
+        return Stream.of(getEnvVariableAsPath("USERPROFILE"), Optional.ofNullable(System.
+                getProperty("user.home")).map(Path::of).orElse(null)).filter(Objects::nonNull).map(
+                path -> {
+                    return path.resolve(".dotnet/tools");
+                }).filter(Files::isDirectory).distinct().toList();
+    }
+
+    private static List<Path> findWix3InstallDirs() {
+        PathMatcher wixInstallDirMatcher = FileSystems.getDefault().
+                getPathMatcher(
+                        "glob:WiX Toolset v*");
 
         Path programFiles = getSystemDir("ProgramFiles", "\\Program Files");
         Path programFilesX86 = getSystemDir("ProgramFiles(x86)",
@@ -157,18 +263,20 @@ private static List<Path> findWixInstallDirs() {
         // Returns list of WiX install directories ordered by WiX version number.
         // Newer versions go first.
         return Stream.of(programFiles, programFilesX86).map(path -> {
-            List<Path> result;
             try (var paths = Files.walk(path, 1)) {
-                result = paths.toList();
+                return paths.toList();
             } catch (IOException ex) {
                 Log.verbose(ex);
-                result = Collections.emptyList();
+                List<Path> empty = List.of();
+                return empty;
             }
-            return result;
         }).flatMap(List::stream)
-        .filter(path -> wixInstallDirMatcher.matches(path.getFileName()))
-        .sorted(Comparator.comparing(Path::getFileName).reversed())
-        .map(path -> path.resolve("bin"))
-        .toList();
+                .filter(path -> wixInstallDirMatcher.matches(path.getFileName())).
+                sorted(Comparator.comparing(Path::getFileName).reversed())
+                .map(path -> path.resolve("bin"))
+                .toList();
     }
+
+    private final Path toolFileName;
+    private final DottedVersion minimalVersion;
 }
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixToolset.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixToolset.java
new file mode 100644
index 00000000000..ab433616f44
--- /dev/null
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixToolset.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2024, 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 jdk.jpackage.internal;
+
+import java.nio.file.Path;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+final class WixToolset {
+
+    static enum WixToolsetType {
+        // Wix v4+
+        Wix4(WixTool.Wix4),
+        // Wix v3+
+        Wix3(WixTool.Candle3, WixTool.Light3);
+
+        WixToolsetType(WixTool... tools) {
+            this.tools = Set.of(tools);
+        }
+
+        Set<WixTool> getTools() {
+            return tools;
+        }
+
+        private final Set<WixTool> tools;
+    }
+
+    private WixToolset(Map<WixTool, WixTool.ToolInfo> tools) {
+        this.tools = tools;
+    }
+
+    WixToolsetType getType() {
+        return Stream.of(WixToolsetType.values()).filter(toolsetType -> {
+            return toolsetType.getTools().equals(tools.keySet());
+        }).findAny().get();
+    }
+
+    Path getToolPath(WixTool tool) {
+        return tools.get(tool).path;
+    }
+
+    DottedVersion getVersion() {
+        return tools.values().iterator().next().version;
+    }
+
+    static WixToolset create(Set<WixTool> requiredTools, Map<WixTool, WixTool.ToolInfo> allTools) {
+        var filteredTools = allTools.entrySet().stream().filter(e -> {
+            return requiredTools.contains(e.getKey());
+        }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+        if (filteredTools.keySet().equals(requiredTools)) {
+            return new WixToolset(filteredTools);
+        } else {
+            return null;
+        }
+    }
+
+    private final Map<WixTool, WixTool.ToolInfo> tools;
+}
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixUiFragmentBuilder.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixUiFragmentBuilder.java
index 8d20d6432bf..4f39a65e3b6 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixUiFragmentBuilder.java
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixUiFragmentBuilder.java
@@ -43,6 +43,7 @@
 import static jdk.jpackage.internal.OverridableResource.createResource;
 import static jdk.jpackage.internal.StandardBundlerParam.LICENSE_FILE;
 import jdk.jpackage.internal.WixAppImageFragmentBuilder.ShortcutsFolder;
+import jdk.jpackage.internal.WixToolset.WixToolsetType;
 
 /**
  * Creates UI WiX fragment.
@@ -100,7 +101,13 @@ void configureWixPipeline(WixPipeline wixPipeline) {
         super.configureWixPipeline(wixPipeline);
 
         if (withShortcutPromptDlg || withInstallDirChooserDlg || withLicenseDlg) {
-            wixPipeline.addLightOptions("-ext", "WixUIExtension");
+            final String extName;
+            switch (getWixType()) {
+                case Wix3 -> extName = "WixUIExtension";
+                case Wix4 -> extName = "WixToolset.UI.wixext";
+                default -> throw new IllegalArgumentException();
+            }
+            wixPipeline.addLightOptions("-ext", extName);
         }
 
         // Only needed if we using CA dll, so Wix can find it
@@ -148,15 +155,14 @@ private void addUI(XMLStreamWriter xml) throws XMLStreamException,
             xml.writeEndElement(); // WixVariable
         }
 
-        xml.writeStartElement("UI");
-        xml.writeAttribute("Id", "JpUI");
-
         var ui = getUI();
         if (ui != null) {
-            ui.write(this, xml);
+            ui.write(getWixType(), this, xml);
+        } else {
+            xml.writeStartElement("UI");
+            xml.writeAttribute("Id", "JpUI");
+            xml.writeEndElement();
         }
-
-        xml.writeEndElement(); // UI
     }
 
     private UI getUI() {
@@ -187,12 +193,43 @@ private enum UI {
             this.dialogPairsSupplier = dialogPairsSupplier;
         }
 
-        void write(WixUiFragmentBuilder outer, XMLStreamWriter xml) throws
-                XMLStreamException, IOException {
-            xml.writeStartElement("UIRef");
-            xml.writeAttribute("Id", wixUIRef);
-            xml.writeEndElement(); // UIRef
+        void write(WixToolsetType wixType, WixUiFragmentBuilder outer, XMLStreamWriter xml) throws XMLStreamException, IOException {
+            switch (wixType) {
+                case Wix3 -> {}
+                case Wix4 -> {
+                    // https://wixtoolset.org/docs/fourthree/faqs/#converting-custom-wixui-dialog-sets
+                    xml.writeProcessingInstruction("foreach WIXUIARCH in X86;X64;A64");
+                    writeWix4UIRef(xml, wixUIRef, "JpUIInternal_$(WIXUIARCH)");
+                    xml.writeProcessingInstruction("endforeach");
 
+                    writeWix4UIRef(xml, "JpUIInternal", "JpUI");
+                }
+                default -> {
+                    throw new IllegalArgumentException();
+                }
+            }
+
+            xml.writeStartElement("UI");
+            switch (wixType) {
+                case Wix3 -> {
+                    xml.writeAttribute("Id", "JpUI");
+                    xml.writeStartElement("UIRef");
+                    xml.writeAttribute("Id", wixUIRef);
+                    xml.writeEndElement(); // UIRef
+                }
+                case Wix4 -> {
+                    xml.writeAttribute("Id", "JpUIInternal");
+                }
+                default -> {
+                    throw new IllegalArgumentException();
+                }
+            }
+            writeContents(wixType, outer, xml);
+            xml.writeEndElement(); // UI
+        }
+
+        private void writeContents(WixToolsetType wixType, WixUiFragmentBuilder outer,
+                XMLStreamWriter xml) throws XMLStreamException, IOException {
             if (dialogIdsSupplier != null) {
                 List<Dialog> dialogIds = dialogIdsSupplier.apply(outer);
                 Map<DialogPair, List<Publish>> dialogPairs = dialogPairsSupplier.get();
@@ -210,7 +247,7 @@ void write(WixUiFragmentBuilder outer, XMLStreamWriter xml) throws
                     DialogPair pair = new DialogPair(firstId, secondId);
                     for (var curPair : List.of(pair, pair.flip())) {
                         for (var publish : dialogPairs.get(curPair)) {
-                            writePublishDialogPair(xml, publish, curPair);
+                            writePublishDialogPair(wixType, xml, publish, curPair);
                         }
                     }
                     firstId = secondId;
@@ -218,6 +255,17 @@ void write(WixUiFragmentBuilder outer, XMLStreamWriter xml) throws
             }
         }
 
+        private static void writeWix4UIRef(XMLStreamWriter xml, String uiRef, String id) throws XMLStreamException, IOException {
+            // https://wixtoolset.org/docs/fourthree/faqs/#referencing-the-standard-wixui-dialog-sets
+            xml.writeStartElement("UI");
+            xml.writeAttribute("Id", id);
+            xml.writeStartElement("ui:WixUI");
+            xml.writeAttribute("Id", uiRef);
+            xml.writeNamespace("ui", "http://wixtoolset.org/schemas/v4/wxs/ui");
+            xml.writeEndElement(); // UIRef
+            xml.writeEndElement(); // UI
+        }
+
         private final String wixUIRef;
         private final Function<WixUiFragmentBuilder, List<Dialog>> dialogIdsSupplier;
         private final Supplier<Map<DialogPair, List<Publish>>> dialogPairsSupplier;
@@ -441,9 +489,8 @@ private static PublishBuilder buildPublish(Publish publish) {
         return new PublishBuilder(publish);
     }
 
-    private static void writePublishDialogPair(XMLStreamWriter xml,
-            Publish publish, DialogPair dialogPair) throws IOException,
-            XMLStreamException {
+    private static void writePublishDialogPair(WixToolsetType wixType, XMLStreamWriter xml,
+            Publish publish, DialogPair dialogPair) throws IOException, XMLStreamException {
         xml.writeStartElement("Publish");
         xml.writeAttribute("Dialog", dialogPair.firstId);
         xml.writeAttribute("Control", publish.control);
@@ -452,7 +499,11 @@ private static void writePublishDialogPair(XMLStreamWriter xml,
         if (publish.order != 0) {
             xml.writeAttribute("Order", String.valueOf(publish.order));
         }
-        xml.writeCharacters(publish.condition);
+        switch (wixType) {
+            case Wix3 -> xml.writeCharacters(publish.condition);
+            case Wix4 -> xml.writeAttribute("Condition", publish.condition);
+            default -> throw new IllegalArgumentException();
+        }
         xml.writeEndElement();
     }
 
@@ -463,9 +514,8 @@ private final class CustomDialog {
             this.wxsFileName = wxsFileName;
             this.wixVariables = new WixVariables();
 
-            addResource(
-                    createResource(wxsFileName, params).setCategory(category),
-                    wxsFileName);
+            addResource(createResource(wxsFileName, params).setCategory(category).setPublicName(
+                    wxsFileName), wxsFileName);
         }
 
         void addToWixPipeline(WixPipeline wixPipeline) {
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/InstallDirNotEmptyDlg.wxs b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/InstallDirNotEmptyDlg.wxs
index 936984b1fff..755b2a0aab9 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/InstallDirNotEmptyDlg.wxs
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/InstallDirNotEmptyDlg.wxs
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
 /*
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, 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
@@ -41,9 +41,7 @@
         <Control Id="No" Type="PushButton" X="150" Y="55" Width="50" Height="15" Default="yes" Cancel="yes" Text="!(loc.WixUINo)">
           <Publish Event="NewDialog" Value="InstallDirDlg">1</Publish>
         </Control>
-        <Control Id="Text" Type="Text" X="25" Y="15" Width="250" Height="30" TabSkip="no">
-          <Text>!(loc.message.install.dir.exist)</Text>
-        </Control>
+        <Control Id="Text" Type="Text" X="25" Y="15" Width="250" Height="30" TabSkip="no" Text="!(loc.InstallDirNotEmptyDlgInstallDirExistMessage)"/>
       </Dialog>
 
       <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="JpCheckInstallDir" Order="3">1</Publish>
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_de.wxl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_de.wxl
index 94c2696a6ca..31be69aa5d0 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_de.wxl
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_de.wxl
@@ -1,6 +1,5 @@
 <?xml version = '1.0' encoding = 'utf-8'?>
 <WixLocalization Culture="de-de" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="1252">
-  <String Id="message.install.dir.exist">Der Ordner [INSTALLDIR] ist bereits vorhanden. Möchten Sie diesen Ordner trotzdem installieren?</String>
   <String Id="MainFeatureTitle">Hauptfeature</String>
   <String Id="DowngradeErrorMessage">Eine höhere Version von [ProductName] ist bereits installiert. Downgrades sind deaktiviert. Setup wird jetzt beendet.</String>
   <String Id="DisallowUpgradeErrorMessage">Eine niedrigere Version von [ProductName] ist bereits installiert. Upgrades sind deaktiviert. Setup wird jetzt beendet.</String>
@@ -11,6 +10,9 @@
   <String Id="ShortcutPromptDlgDescription">Wählen Sie die zu erstellenden Verknüpfungen aus.</String>
   <String Id="ShortcutPromptDlgDesktopShortcutControlLabel">Desktopverknüpfung(en) erstellen</String>
   <String Id="ShortcutPromptDlgStartMenuShortcutControlLabel">Startmenüverknüpfung(en) erstellen</String>
+
   <String Id="InstallDirNotEmptyDlg_Title">[ProductName]-Setup</String>
+  <String Id="InstallDirNotEmptyDlgInstallDirExistMessage">Der Ordner [INSTALLDIR] ist bereits vorhanden. Möchten Sie diesen Ordner trotzdem installieren?</String>
+
   <String Id="ContextMenuCommandLabel">Mit [ProductName] öffnen</String>
 </WixLocalization>
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_en.wxl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_en.wxl
index bc081fefe5b..070e46621fb 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_en.wxl
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_en.wxl
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="1252">
-  <String Id="message.install.dir.exist">The folder [INSTALLDIR] already exist. Would you like to install to that folder anyway?</String>
   <String Id="MainFeatureTitle">Main Feature</String>
   <String Id="DowngradeErrorMessage">A higher version of [ProductName] is already installed. Downgrades disabled. Setup will now exit.</String>
   <String Id="DisallowUpgradeErrorMessage">A lower version of [ProductName] is already installed. Upgrades disabled. Setup will now exit.</String>
@@ -11,6 +10,9 @@
   <String Id="ShortcutPromptDlgDescription">Select shortcuts to create.</String>
   <String Id="ShortcutPromptDlgDesktopShortcutControlLabel">Create desktop shortcut(s)</String>
   <String Id="ShortcutPromptDlgStartMenuShortcutControlLabel">Create start menu shortcut(s)</String>
+
   <String Id="InstallDirNotEmptyDlg_Title">[ProductName] Setup</String>
+  <String Id="InstallDirNotEmptyDlgInstallDirExistMessage">The folder [INSTALLDIR] already exist. Would you like to install to that folder anyway?</String>
+
   <String Id="ContextMenuCommandLabel">Open with [ProductName]</String>
 </WixLocalization>
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_ja.wxl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_ja.wxl
index 20ee895ae19..32a57433829 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_ja.wxl
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_ja.wxl
@@ -1,6 +1,5 @@
 <?xml version = '1.0' encoding = 'utf-8'?>
 <WixLocalization Culture="ja-jp" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="932">
-  <String Id="message.install.dir.exist">フォルダ[INSTALLDIR]はすでに存在します。そのフォルダにインストールしますか?</String>
   <String Id="MainFeatureTitle">主な機能</String>
   <String Id="DowngradeErrorMessage">[ProductName]のより上位のバージョンがすでにインストールされています。ダウングレードは無効です。セットアップを終了します。</String>
   <String Id="DisallowUpgradeErrorMessage">[ProductName]のより下位のバージョンがすでにインストールされています。アップグレードは無効です。セットアップを終了します。</String>
@@ -11,6 +10,9 @@
   <String Id="ShortcutPromptDlgDescription">作成するショートカットを選択します。</String>
   <String Id="ShortcutPromptDlgDesktopShortcutControlLabel">デスクトップ・ショートカットの作成</String>
   <String Id="ShortcutPromptDlgStartMenuShortcutControlLabel">スタート・メニューのショートカットの作成</String>
+
   <String Id="InstallDirNotEmptyDlg_Title">[ProductName]セットアップ</String>
+  <String Id="InstallDirNotEmptyDlgInstallDirExistMessage">フォルダ[INSTALLDIR]はすでに存在します。そのフォルダにインストールしますか?</String>
+
   <String Id="ContextMenuCommandLabel">[ProductName]で開く</String>
 </WixLocalization>
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_zh_CN.wxl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_zh_CN.wxl
index 138aa856510..978f74a1546 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_zh_CN.wxl
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/MsiInstallerStrings_zh_CN.wxl
@@ -1,6 +1,5 @@
 <?xml version = '1.0' encoding = 'utf-8'?>
 <WixLocalization Culture="zh-cn" xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="936">
-  <String Id="message.install.dir.exist">文件夹 [INSTALLDIR] 已存在。是否仍要安装到该文件夹?</String>
   <String Id="MainFeatureTitle">主要功能</String>
   <String Id="DowngradeErrorMessage">已安装更高版本的 [ProductName]。降级已禁用。现在将退出安装。</String>
   <String Id="DisallowUpgradeErrorMessage">已安装更低版本的 [ProductName]。升级已禁用。现在将退出安装。</String>
@@ -11,6 +10,9 @@
   <String Id="ShortcutPromptDlgDescription">选择要创建的快捷方式。</String>
   <String Id="ShortcutPromptDlgDesktopShortcutControlLabel">创建桌面快捷方式</String>
   <String Id="ShortcutPromptDlgStartMenuShortcutControlLabel">创建开始菜单快捷方式</String>
+
   <String Id="InstallDirNotEmptyDlg_Title">[ProductName] 安装程序</String>
+  <String Id="InstallDirNotEmptyDlgInstallDirExistMessage">文件夹 [INSTALLDIR] 已存在。是否仍要安装到该文件夹?</String>
+
   <String Id="ContextMenuCommandLabel">使用 [ProductName] 打开</String>
 </WixLocalization>
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties
index cdbf04e7464..5843a750ade 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2017, 2024, 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
@@ -41,8 +41,9 @@ resource.overrides-wix-file=Overrides WiX project file
 resource.shortcutpromptdlg-wix-file=Shortcut prompt dialog WiX project file
 resource.installdirnotemptydlg-wix-file=Not empty install directory dialog WiX project file
 resource.launcher-as-service-wix-file=Service installer WiX project file
+resource.wix-src-conv=XSLT stylesheet converting WiX sources from WiX v3 to WiX v4 format
 
-error.no-wix-tools=Can not find WiX tools (light.exe, candle.exe)
+error.no-wix-tools=Can not find WiX tools. Was looking for WiX v3 light.exe and candle.exe or WiX v4/v5 wix.exe and none was found
 error.no-wix-tools.advice=Download WiX 3.0 or later from https://wixtoolset.org and add it to the PATH.
 error.version-string-wrong-format.advice=Set value of --app-version parameter to a valid Windows Installer ProductVersion.
 error.msi-product-version-components=Version string [{0}] must have between 2 and 4 components.
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties
index 6bdb9b06e09..e0c15bfb8fb 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_de.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2017, 2024, 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
@@ -41,8 +41,9 @@ resource.overrides-wix-file=Überschreibt WiX-Projektdatei
 resource.shortcutpromptdlg-wix-file=Dialogfeld für Verknüpfungs-Prompt der WiX-Projektdatei
 resource.installdirnotemptydlg-wix-file=Nicht leeres Installationsverzeichnis in Dialogfeld für WiX-Projektdatei
 resource.launcher-as-service-wix-file=WiX-Projektdatei für Serviceinstallationsprogramm
+resource.wix-src-conv=XSLT stylesheet converting WiX sources from WiX v3 to WiX v4 format
 
-error.no-wix-tools=WiX-Tools (light.exe, candle.exe) nicht gefunden
+error.no-wix-tools=Can not find WiX tools. Was looking for WiX v3 light.exe and candle.exe or WiX v4/v5 wix.exe and none was found
 error.no-wix-tools.advice=Laden Sie WiX 3.0 oder höher von https://wixtoolset.org herunter, und fügen Sie es zu PATH hinzu.
 error.version-string-wrong-format.advice=Setzen Sie den Wert des --app-version-Parameters auf eine gültige ProductVersion des Windows-Installationsprogramms.
 error.msi-product-version-components=Versionszeichenfolge [{0}] muss zwischen 2 und 4 Komponenten aufweisen.
@@ -58,7 +59,7 @@ error.read-wix-l10n-file=Datei {0} konnte nicht geparst werden
 error.extract-culture-from-wix-l10n-file=Kulturwert konnte nicht aus Datei {0} gelesen werden
 
 message.icon-not-ico=Das angegebene Symbol "{0}" ist keine ICO-Datei und wird nicht verwendet. Stattdessen wird das Standardsymbol verwendet.
-message.potential.windows.defender.issue=Warnung: Windows Defender verhindert eventuell die korrekte Ausführung von jpackage. Wenn ein Problem auftritt, deaktivieren Sie die Echtzeitüberwachung, oder fügen Sie einen Ausschluss für das Verzeichnis "{0}" hinzu.
+message.potential.windows.defender.issue=Warnung: Windows Defender verhindert eventuell die korrekte Ausführung von jpackage. Wenn ein Problem auftritt, deaktivieren Sie das Echtzeitmonitoring, oder fügen Sie einen Ausschluss für das Verzeichnis "{0}" hinzu.
 message.outputting-to-location=EXE für Installationsprogramm wird generiert in: {0}.
 message.output-location=Installationsprogramm (.exe) gespeichert in: {0}
 message.tool-version=[{0}]-Version [{1}] erkannt.
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties
index 6a89e8cbf5a..e0bcd18c811 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2017, 2024, 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
@@ -41,8 +41,9 @@ resource.overrides-wix-file=WiXプロジェクト・ファイルのオーバー
 resource.shortcutpromptdlg-wix-file=ショートカット・プロンプト・ダイアログWiXプロジェクト・ファイル
 resource.installdirnotemptydlg-wix-file=インストール・ディレクトリ・ダイアログのWiXプロジェクト・ファイルが空ではありません
 resource.launcher-as-service-wix-file=サービス・インストーラWiXプロジェクト・ファイル
+resource.wix-src-conv=XSLT stylesheet converting WiX sources from WiX v3 to WiX v4 format
 
-error.no-wix-tools=WiXツール(light.exe、candle.exe)が見つかりません
+error.no-wix-tools=Can not find WiX tools. Was looking for WiX v3 light.exe and candle.exe or WiX v4/v5 wix.exe and none was found
 error.no-wix-tools.advice=WiX 3.0以降をhttps://wixtoolset.orgからダウンロードし、PATHに追加します。
 error.version-string-wrong-format.advice=--app-versionパラメータの値を有効なWindows Installer ProductVersionに設定します。
 error.msi-product-version-components=バージョン文字列[{0}]には、2から4つのコンポーネントが含まれている必要があります。
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties
index f786b00155d..e2b8bd37135 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2017, 2024, 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
@@ -41,8 +41,9 @@ resource.overrides-wix-file=覆盖 WiX 项目文件
 resource.shortcutpromptdlg-wix-file=快捷方式提示对话框 WiX 项目文件
 resource.installdirnotemptydlg-wix-file=安装目录对话框 WiX 项目文件非空
 resource.launcher-as-service-wix-file=服务安装程序 WiX 项目文件
+resource.wix-src-conv=XSLT stylesheet converting WiX sources from WiX v3 to WiX v4 format
 
-error.no-wix-tools=找不到 WiX 工具 (light.exe, candle.exe)
+error.no-wix-tools=Can not find WiX tools. Was looking for WiX v3 light.exe and candle.exe or WiX v4/v5 wix.exe and none was found
 error.no-wix-tools.advice=从 https://wixtoolset.org 下载 WiX 3.0 或更高版本,然后将其添加到 PATH。
 error.version-string-wrong-format.advice=将 --app-version 参数的值设置为有效的 Windows Installer ProductVersion。
 error.msi-product-version-components=版本字符串 [{0}] 必须包含 2 到 4 个组成部分。
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/overrides.wxi b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/overrides.wxi
index d8c8f16438f..c2faa850563 100644
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/overrides.wxi
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/overrides.wxi
@@ -28,4 +28,4 @@ to disable (the value doesn't matter).
 Should be defined to enable upgrades and undefined to disable upgrades.
 By default it is defined, use <?undef JpAllowUpgrades?> to disable.
 -->
-<Include/>
+<Include xmlns="http://schemas.microsoft.com/wix/2006/wi"/>
diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/wix3-to-wix4-conv.xsl b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/wix3-to-wix4-conv.xsl
new file mode 100644
index 00000000000..382ed731b5a
--- /dev/null
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/wix3-to-wix4-conv.xsl
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+-->
+
+<!--
+  This stylesheet can be applied to Wix3 .wxl, .wxs, and .wsi source files.
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:wix3loc="http://schemas.microsoft.com/wix/2006/localization"
+                xmlns:wix3="http://schemas.microsoft.com/wix/2006/wi"
+>
+  <!-- Wix4 complains about xml declaration in input files. Turn it off -->
+  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
+
+  <!--
+    Remap xmlns="http://schemas.microsoft.com/wix/2006/localization"
+    to xmlns="http://wixtoolset.org/schemas/v4/wxl"
+  -->
+
+  <xsl:template match="wix3loc:*">
+    <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxl">
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:element>
+  </xsl:template>
+
+  <!--
+    Remap xmlns="http://schemas.microsoft.com/wix/2006/localization"
+    to xmlns="http://wixtoolset.org/schemas/v4/wxs"
+  -->
+
+  <xsl:template match="wix3:*">
+    <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxs">
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:element>
+  </xsl:template>
+
+
+  <!--
+    From <String Id="foo">Bar</String> to <String Id="foo" Value="Bar"/>
+  -->
+  <xsl:template match="wix3loc:WixLocalization/wix3loc:String">
+    <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxl">
+      <xsl:attribute name="Value">
+        <xsl:value-of select="text()"/>
+      </xsl:attribute>
+      <xsl:apply-templates select="@*"/>
+    </xsl:element>
+  </xsl:template>
+
+
+  <!--
+  Wix3 Product (https://wixtoolset.org/docs/v3/xsd/wix/product/):
+    Id
+    Codepage
+    Language
+    Manufacturer
+    Name
+    UpgradeCode
+    Version
+
+  Wix3 Package (https://wixtoolset.org/docs/v3/xsd/wix/package/):
+    AdminImage
+    Comments
+    Compressed
+    Description
+    Id
+    InstallerVersion
+    InstallPrivileges
+    InstallScope
+    Keywords
+    Languages
+    Manufacturer
+    Platform
+    Platforms
+    ReadOnly
+    ShortNames
+    SummaryCodepage
+
+  Wix4 Package (https://wixtoolset.org/docs/schema/wxs/package/):
+    Codepage          <- Wix3:Product/@Codepage
+    Compressed        <- Wix3:@Compressed
+    InstallerVersion  <- Wix3:@InstallerVersion
+    Language          <- Wix3:Product/@Language
+    Manufacturer      <- Wix3:Product/@Manufacturer
+    Name              <- Wix3:Product/@Name
+    ProductCode       <- Wix3:Product/@Id
+    Scope             <- Wix3:@InstallScope
+    ShortNames        <- Wix3:@ShortNames
+    UpgradeCode       <- Wix3:Product/@UpgradeCode
+    UpgradeStrategy   <-
+    Version           <- Wix3:Product/@Version
+
+  Wix4 SummaryInformation (https://wixtoolset.org/docs/schema/wxs/summaryinformation/):
+    Codepage          <- Wix3:Product/@Codepage
+    Comments          <- Wix3:@Comments
+    Description       <- Wix3:@Description
+    Keywords          <- Wix3:@Keywords
+    Manufacturer      <- Wix3:Product/@Manufacturer
+  -->
+
+  <xsl:template match="wix3:Product">
+    <xsl:element name="Package" namespace="http://wixtoolset.org/schemas/v4/wxs">
+      <xsl:apply-templates select="@Codepage|wix3:Package/@Compressed|wix3:Package/@InstallerVersion|@Language|@Manufacturer|@Name|@Id|wix3:Package/@InstallScope|wix3:Package/@ShortNames|@UpgradeCode|@Version"/>
+      <xsl:if test="@Id">
+        <xsl:attribute name="ProductCode">
+          <xsl:value-of select="@Id"/>
+        </xsl:attribute>
+      </xsl:if>
+      <xsl:if test="wix3:Package/@InstallScope">
+        <xsl:attribute name="Scope">
+          <xsl:value-of select="wix3:Package/@InstallScope"/>
+        </xsl:attribute>
+      </xsl:if>
+      <xsl:element name="SummaryInformation" namespace="http://wixtoolset.org/schemas/v4/wxs">
+        <xsl:apply-templates select="@Codepage|wix3:Package/@Comments|wix3:Package/@Description|wix3:Package/@Keywords|@Manufacturer"/>
+      </xsl:element>
+      <xsl:apply-templates select="node()"/>
+    </xsl:element>
+  </xsl:template>
+
+  <xsl:template match="wix3:Package|wix3:Product/@Id|wix3:Package/@InstallScope"/>
+
+
+  <xsl:template match="wix3:CustomAction/@BinaryKey">
+    <xsl:attribute name="BinaryRef">
+      <xsl:value-of select="."/>
+    </xsl:attribute>
+  </xsl:template>
+
+
+  <xsl:template match="wix3:Custom|wix3:Publish">
+    <xsl:element name="{local-name()}" namespace="http://wixtoolset.org/schemas/v4/wxs">
+      <xsl:apply-templates select="@*"/>
+      <xsl:if test="text()">
+        <xsl:attribute name="Condition">
+          <xsl:value-of select="text()"/>
+        </xsl:attribute>
+      </xsl:if>
+      <xsl:apply-templates select="node()"/>
+    </xsl:element>
+  </xsl:template>
+
+  <xsl:template match="wix3:Custom/text()|wix3:Publish/text()"/>
+
+
+  <xsl:template match="wix3:Directory[@Id='TARGETDIR']"/>
+
+
+  <!--
+    Identity transform
+  -->
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java
index 2812dc19695..f4ca58d6af4 100644
--- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java
+++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -121,7 +121,7 @@ class ConsoleIOContext extends IOContext {
     String prefix = "";
 
     ConsoleIOContext(JShellTool repl, InputStream cmdin, PrintStream cmdout,
-                     boolean interactive) throws Exception {
+                     boolean interactive, Size size) throws Exception {
         this.repl = repl;
         Map<String, Object> variables = new HashMap<>();
         this.input = new StopDetectingInputStream(() -> repl.stop(),
@@ -143,7 +143,6 @@ public int readBuffered(byte[] b) throws IOException {
                 terminal = new TestTerminal(nonBlockingInput, cmdout);
                 enableHighlighter = Boolean.getBoolean("test.enable.highlighter");
             } else {
-                Size size = null;
                 terminal = new ProgrammaticInTerminal(nonBlockingInput, cmdout, interactive,
                                                       size);
                 if (!interactive) {
@@ -155,7 +154,12 @@ public int readBuffered(byte[] b) throws IOException {
             setupReader = setupReader.andThen(r -> r.option(Option.DISABLE_HIGHLIGHTER, !enableHighlighter));
             input.setInputStream(cmdin);
         } else {
-            terminal = TerminalBuilder.builder().inputStreamWrapper(in -> {
+            //on platforms which are known to be fully supported by
+            //the FFMTerminalProvider, do not permit the ExecTerminalProvider:
+            boolean allowExecTerminal = !OSUtils.IS_WINDOWS &&
+                                        !OSUtils.IS_LINUX &&
+                                        !OSUtils.IS_OSX;
+            terminal = TerminalBuilder.builder().exec(allowExecTerminal).inputStreamWrapper(in -> {
                 input.setInputStream(in);
                 return nonBlockingInput;
             }).nativeSignals(false).build();
@@ -1312,6 +1316,7 @@ private History getHistory() {
 
     private static class ProgrammaticInTerminal extends LineDisciplineTerminal {
 
+        protected static final int DEFAULT_WIDTH = 80;
         protected static final int DEFAULT_HEIGHT = 24;
 
         private final NonBlockingReader inputReader;
@@ -1320,9 +1325,9 @@ private static class ProgrammaticInTerminal extends LineDisciplineTerminal {
         public ProgrammaticInTerminal(InputStream input, OutputStream output,
                                        boolean interactive, Size size) throws Exception {
             this(input, output, interactive ? "ansi" : "dumb",
-                 size != null ? size : new Size(80, DEFAULT_HEIGHT),
+                 size != null ? size : new Size(DEFAULT_WIDTH, DEFAULT_HEIGHT),
                  size != null ? size
-                              : interactive ? new Size(80, DEFAULT_HEIGHT)
+                              : interactive ? new Size(DEFAULT_WIDTH, DEFAULT_HEIGHT)
                                             : new Size(Integer.MAX_VALUE - 1, DEFAULT_HEIGHT));
         }
 
@@ -1366,7 +1371,7 @@ private static Size computeSize() {
             } catch (Throwable ex) {
                 // ignore
             }
-            return new Size(80, h);
+            return new Size(DEFAULT_WIDTH, h);
         }
         public TestTerminal(InputStream input, OutputStream output) throws Exception {
             this(input, output, computeSize());
diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java
index 0e9b3bf8bfb..2d06ffc529d 100644
--- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java
+++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java
@@ -80,6 +80,7 @@
 
 import jdk.internal.jshell.debug.InternalDebugControl;
 import jdk.internal.jshell.tool.IOContext.InputInterruptedException;
+import jdk.internal.org.jline.terminal.Size;
 import jdk.jshell.DeclarationSnippet;
 import jdk.jshell.Diag;
 import jdk.jshell.EvalException;
@@ -166,6 +167,7 @@ public class JShellTool implements MessageHandler {
     final Map<String, String> envvars;
     final Locale locale;
     final boolean interactiveTerminal;
+    final Size windowSize;
 
     final Feedback feedback = new Feedback();
 
@@ -181,12 +183,13 @@ public class JShellTool implements MessageHandler {
      * @param prefs persistence implementation to use
      * @param envvars environment variable mapping to use
      * @param locale locale to use
+     * @param windowSize window size hint, or null
      */
     JShellTool(InputStream cmdin, PrintStream cmdout, PrintStream cmderr,
             PrintStream console,
             InputStream userin, PrintStream userout, PrintStream usererr,
             PersistentStorage prefs, Map<String, String> envvars, Locale locale,
-            boolean interactiveTerminal) {
+            boolean interactiveTerminal, Size windowSize) {
         this.cmdin = cmdin;
         this.cmdout = cmdout;
         this.cmderr = cmderr;
@@ -203,6 +206,7 @@ public int read() throws IOException {
         this.envvars = envvars;
         this.locale = locale;
         this.interactiveTerminal = interactiveTerminal;
+        this.windowSize = windowSize;
     }
 
     private ResourceBundle versionRB = null;
@@ -998,7 +1002,7 @@ public void run() {
             };
             Runtime.getRuntime().addShutdownHook(shutdownHook);
             // execute from user input
-            try (IOContext in = new ConsoleIOContext(this, cmdin, console, interactiveTerminal)) {
+            try (IOContext in = new ConsoleIOContext(this, cmdin, console, interactiveTerminal, windowSize)) {
                 int indent;
                 try {
                     String indentValue = indent();
diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellToolBuilder.java b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellToolBuilder.java
index 52e042d365a..8c787a6c294 100644
--- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellToolBuilder.java
+++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellToolBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -33,6 +33,7 @@
 import java.util.Set;
 import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
+import jdk.internal.org.jline.terminal.Size;
 import jdk.jshell.tool.JavaShellToolBuilder;
 
 /**
@@ -53,6 +54,7 @@ public class JShellToolBuilder implements JavaShellToolBuilder {
     private Locale locale = Locale.getDefault();
     private boolean interactiveTerminal;
     private boolean capturePrompt = false;
+    private Size windowSize = null;
 
     /**
      * Set the input channels.
@@ -215,6 +217,16 @@ public JavaShellToolBuilder interactiveTerminal(boolean terminal) {
         return this;
     }
 
+    @Override
+    public JavaShellToolBuilder windowSize(int columns, int rows) {
+        if (columns <= 0)
+            throw new IllegalArgumentException("columns = " + columns);
+        if (rows <= 0)
+            throw new IllegalArgumentException("rows = " + rows);
+        this.windowSize = new Size(columns, rows);
+        return this;
+    }
+
     /**
      * Create a tool instance for testing. Not in JavaShellToolBuilder.
      *
@@ -228,7 +240,7 @@ public JShellTool rawTool() {
             vars = System.getenv();
         }
         JShellTool sh = new JShellTool(cmdIn, cmdOut, cmdErr, console, userIn,
-                userOut, userErr, prefs, vars, locale, interactiveTerminal);
+                userOut, userErr, prefs, vars, locale, interactiveTerminal, windowSize);
         sh.testPrompt = capturePrompt;
         return sh;
     }
diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_de.properties b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_de.properties
index 50c7515e9d8..21f30891008 100644
--- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_de.properties
+++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_de.properties
@@ -168,6 +168,7 @@ jshell.console.completion.all.completions = <Erneut Tabulatortaste drücken, um
 jshell.console.no.javadoc = <Keine Dokumentation gefunden>
 jshell.console.do.nothing = Nichts machen
 jshell.console.choice = Auswahl:\u0020
+
 jshell.console.create.variable = Variable erstellen
 jshell.console.create.method = Methode erstellen
 jshell.console.resolvable = \nDie ID kann in diesem Kontext aufgelöst werden.
@@ -179,7 +180,7 @@ jshell.console.empty = \nLeerer Eintrag. Ein einzelner gültiger Ausdruck oder e
 
 jshell.fix.wrong.shortcut =Unerwartetes Zeichen nach Umschalt+Tab.\nVerwenden Sie "I" für automatischen Import, "V" zur Variablenerstellung oder "M" zur Methodenerstellung.\nWeitere Informationen finden Sie unter:\n/help shortcuts
 
-help.usage = Verwendung:   jshell <Option>... <Ladedatei>...\nMögliche Optionen:\n    --class-path <Pfad>   Gibt an, wo die Benutzerklassendateien gespeichert sind\n    --module-path <Pfad>  Gibt an, wo die Anwendungsmodule gespeichert sind\n    --add-modules <Modul>(,<Modul>)*\n                          Gibt aufzulösende Module oder alle Module im\n                            Modulpfad an, wenn <Modul> ALL-MODULE-PATHs lautet\n    --enable-native-access\n                          Ermöglicht Ausführung eingeschränkter nativer Methoden durch Code\n    --enable-preview      Code kann Vorschaufeatures in diesem Release nutzen\n    --startup <Datei>      Ersetzung der Startdefinitionen mit einer Ausführung\n    --no-startup          Startdefinitionen werden nicht ausgeführt\n    --feedback <Modus>     Gibt den anfänglichen Feedbackmodus an. Der Modus kann\n                            vordefiniert (Silent, Concise, Normal oder Verbose) oder\n                            vorab benutzerdefiniert sein\n    -q                    Stilles Feedback. Identisch mit: --feedback concise\n    -s                    Äußerst stilles Feedback. Identisch mit: --feedback silent\n    -v                    Verbose-Feedback. Identisch mit: --feedback verbose\n    -J<Kennzeichen>              Übergibt <Kennzeichen> direkt an das Laufzeitsystem.\n                            Verwenden Sie ein -J pro Laufzeitkennzeichen oder Kennzeichenargument\n    -R<Kennzeichen>              Übergibt <Kennzeichen> an das Remotelaufzeitsystem.\n                            Verwenden Sie ein -R pro Remotekennzeichen oder Kennzeichenargument\n    -C<Kennzeichen>              Übergibt <Kennzeichen> an den Compiler.\n                            Verwenden Sie ein -C pro Compiler-Kennzeichen oder Kennzeichenargument\n    --version             Gibt Versionsinformationen aus und beendet den Vorgang\n    --show-version        Gibt Versionsinformationen aus und setzt den Vorgang fort\n    --help, -?, -h        Gibt diese Zusammenfassung der Standardoptionen aus und beendet den Vorgang\n    --help-extra, -X      Gibt Hilfetext zu Nicht-Standardoptionen aus und beendet den Vorgang\n\nEin Dateiargument kann ein Dateiname oder einer der vordefinierten Dateinamen sein: DEFAULT,\nPRINTING, TOOLING oder JAVASE.\nEine Ladedatei kann auch "-" zur Angabe einer Standardeingabe ohne interaktiven I/O sein.\n\nWeitere Informationen zu den Auswertungskontextoptionen (--class-path,\n--module-path und --add-modules) finden Sie unter:\n\t/help context\n\nEin Pfad listet die zu durchsuchenden Verzeichnisse und Archive auf. Verwenden Sie unter Windows ein\nSemikolon (;), um Elemente im Pfad zu trennen. Verwenden Sie auf anderen Plattformen einen\nDoppelpunkt (:), um Elemente zu trennen.\n
+help.usage = Verwendung:   jshell <Option>... <Ladedatei>...\nMögliche Optionen:\n    --class-path <Pfad>   Gibt an, wo die Benutzerklassendateien gespeichert sind\n    --module-path <Pfad>  Gibt an, wo die Anwendungsmodule gespeichert sind\n    --add-modules <Modul>(,<Modul>)*\n                         Gibt aufzulösende Module oder alle Module im\n                            Modulpfad an, wenn <Modul> ALL-MODULE-PATHs lautet\n    --enable-native-access\n                          Ermöglicht Ausführung eingeschränkter nativer Methoden durch Code\n    --enable-preview      Code kann Vorschaufeatures in diesem Release nutzen\n    --startup <Datei>      Ersetzung der Startdefinitionen mit einer Ausführung\n    --no-startup          Startdefinitionen werden nicht ausgeführt\n    --feedback <Modus>     Gibt den anfänglichen Feedbackmodus an. Der Modus kann\n                            vordefiniert (Silent, Concise, Normal oder Verbose) oder\n                            vorab benutzerdefiniert sein\n    -q                    Stilles Feedback. Identisch mit: --feedback concise\n    -s                    Äußerst stilles Feedback. Identisch mit: --feedback silent\n    -v                    Verbose-Feedback. Identisch mit: --feedback verbose\n    -J<Kennzeichen>              Übergibt <Kennzeichen> an das Laufzeitsystem, hat aber keine Auswirkungen\n                            auf die Ausführung von Code-Snippets. Um Kennzeichen anzugeben,\n                            die die Ausführung von Code-Snippets beeinflussen, verwenden Sie\n                            -R<Kennzeichen>. Verwenden Sie alternativ dazu -J<Kennzeichen> mit\n                            --execution local.\n    -R<Kennzeichen>              Übergibt <Kennzeichen> nur dann an das Laufzeitsystem, wenn\n                            Code-Snippets ausgeführt werden. Beispiel: -R-Dfoo=bar\n                            bedeutet, dass die Ausführung des Snippets\n                            System.getProperty("foo") "bar" zurückgibt.\n    -C<flag>              Übergibt <Kennzeichen> an den Java-Compiler in JShell.\n                            Beispiel: -C-Xlint aktiviert alle empfohlenen\n                            LINT-Warnungen, und -C--release=<N> kompiliert für\n                            Java SE N, wie wenn --release N angegeben wird.\n                            Verwenden Sie ein -C pro Compiler-Kennzeichen oder Kennzeichenargument\n    --version             Gibt Versionsinformationen aus und beendet den Vorgang\n    --show-version        Gibt Versionsinformationen aus und setzt den Vorgang fort\n    --help, -?, -h        Gibt diese Zusammenfassung der Standardoptionen aus und beendet den Vorgang\n    --help-extra, -X      Gibt Hilfetext zu Nicht-Standardoptionen aus und beendet den Vorgang\n\nEin Dateiargument kann ein Dateiname oder einer der vordefinierten Dateinamen sein: DEFAULT,\nPRINTING, TOOLING oder JAVASE.\nEine Ladedatei kann auch "-" zur Angabe einer Standardeingabe ohne interaktiven I/O sein.\n\nWeitere Informationen zu den Auswertungskontextoptionen (--class-path,\n--module-path und --add-modules) finden Sie unter:\n\t/help context\n\nEin Pfad listet die zu durchsuchenden Verzeichnisse und Archive auf. Verwenden Sie unter Windows ein\nSemikolon (;), um Elemente im Pfad zu trennen. Verwenden Sie auf anderen Plattformen einen\nDoppelpunkt (:), um Elemente zu trennen.\n
 help.usage.x = \    --add-exports <Modul>/<Package>   Gibt ein Package an, das als\n                                         Export aus seinem definierenden Modul gelten soll \n    --execution <Spezifikation>                 Gibt eine alternative Ausführungs-Engine an.\n                                         Dabei gilt: <Spezifikation> ist eine ExecutionControl-Spezifikation.\n                                         In der Dokumentation zu dem Package\n                                         jdk.jshell.spi finden Sie Informationen zur Syntax der Spezifikation\n    \nDies sind keine Standardoptionen und können jederzeit ohne vorherige Ankündigung geändert werden.\n
 
 help.list.summary = Listet die eingegebene Quelle auf
diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties
index 8f2029d291f..87533d28371 100644
--- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties
+++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_ja.properties
@@ -168,6 +168,7 @@ jshell.console.completion.all.completions = <使用可能な補完結果をす
 jshell.console.no.javadoc = <ドキュメントが見つかりません>
 jshell.console.do.nothing = 何もしない
 jshell.console.choice = 選択:\u0020
+
 jshell.console.create.variable = 変数の作成
 jshell.console.create.method = メソッドの作成
 jshell.console.resolvable = \n識別子はこのコンテキストで解決できます。
@@ -179,8 +180,8 @@ jshell.console.empty = \n空のエントリ。単一の有効な式または文
 
 jshell.fix.wrong.shortcut =[Shift]+[Tab]の後の文字が予期しない文字です。\n自動インポートには"i"、変数の作成には"v"、メソッドの作成には"m"を使用してください。\n詳細は次を参照してください:\n/help shortcuts
 
-help.usage = 使用方法:   jshell <option>... <load-file>...\n使用可能なオプションには次のものがあります:\n    --class-path <path>   ユーザー・クラス・ファイルのある場所を指定します\n    --module-path <path>  アプリケーション・モジュールのある場所を指定します\n    --add-modules <module>(,<module>)*\n                          解決するモジュール、または<module>がALL-MODULE-PATH\n                            である場合はモジュール・パスのすべてのモジュールを指定します\n    --enable-native-access\n                          コードで制限付きネイティブ・メソッド実行させることができます\n    --enable-preview      コードをこのリリースのプレビュー機能に依存させることができます\n    --startup <file>      起動定義の代替として実行されます\n    --no-startup          起動定義を実行しません\n    --feedback <mode>     初期フィードバック・モードを指定します。モードは\n                            事前に定義されている(silent、concise、normalまたはverbose)か、\n                            事前にユーザーが定義できます\n    -q                    簡潔なフィードバック。--feedback conciseと同じ\n    -s                    非常に簡潔なフィードバック。--feedback silentと同じ\n    -v                    詳細なフィードバック。--feedback verboseと同じ\n    -J<flag>              <flag>を実行時システムに直接渡します。\n                            実行時フラグまたはフラグ引数ごとに1つの-Jを使用します\n    -R<flag>              <flag>をリモート実行時システムに渡します。\n                            リモート・フラグまたはフラグ引数ごとに1つの-Rを使用します\n    -C<flag>              <flag>をコンパイラに渡します。\n                            コンパイラ・フラグまたはフラグ引数ごとに1つの-Cを使用します\n    --version             バージョン情報を出力し終了します\n    --show-version        バージョン情報を出力し続行します\n    --help, -?, -h        標準オプションのこの概要を出力し終了します\n    --help-extra, -X      \
-非標準オプションのヘルプを出力し終了します\n\nファイル引数には、ファイル名か、または事前定義されたファイル名(DEFAULT、\nPRINTING、TOOLINGまたはJAVASE)の1つを指定できます。\nload-fileでも、対話型I/Oを使用せずに、"-"を指定して標準入力を示すことができます。\n\n評価コンテキスト・オプション(--class-path、--module-path、\n--add-modules)の詳細は、次を参照してください:\n\t/help context\n\nパスには、検索するディレクトリとアーカイブがリストされます。Windowsの場合は、\nセミコロン(;)を使用してパスの項目を区切ります。その他のプラットフォームでは、\nコロン(:)を使用して項目を区切ります。\n
+help.usage = 使用方法:   jshell <option>... <load-file>...\n使用可能なオプションには次のものがあります:\n    --class-path <path>   ユーザー・クラス・ファイルのある場所を指定します\n    --module-path <path>  アプリケーション・モジュールのある場所を指定します\n    --add-modules <module>(,<module>)*\n                          解決するモジュール、または<module>がALL-MODULE-PATH\n                            である場合はモジュール・パスのすべてのモジュールを指定します\n    --enable-native-access\n                          コードで制限付きネイティブ・メソッドを実行することができます\n    --enable-preview      コードをこのリリースのプレビュー機能に依存させることができます\n    --startup <file>      起動定義の代替として実行されます\n    --no-startup          起動定義を実行しません\n    --feedback <mode>     初期フィードバック・モードを指定します。モードは\n                            事前に定義されている(silent、concise、normalまたはverbose)か、\n                            事前にユーザーが定義できます\n    -q                    簡潔なフィードバック。--feedback conciseと同じ\n    -s                    非常に簡潔なフィードバック。--feedback silentと同じ\n    -v                    詳細なフィードバック。--feedback verboseと同じ\n    -J<flag>              実行システムに<flag>を渡しますが、コード・スニペットの\n                            実行に影響はありません。コード・スニペットの実行に\n                            影響するフラグを指定するには、-R<flag>を使用します\n                            または、--executionローカルを指定して\n                            -J<flag>を使用します。\n    -R<flag>              コード・スニペットが実行されている場合にのみ、\n                            実行システムに<flag>を渡します。たとえば、\n                            -R-Dfoo=barは、スニペットSystem.getProperty("foo")\n                            の実行により、barが返されることを意味します。\n    -C<flag>              JShell内のJavaコンパイラに<flag>を渡します。たとえば、\n                            \
+-C-Xlintとすると、推奨のlintの警告すべてが有効になり、\n                            -C--release=<N>とすると、--release Nを指定した場合と\n                            同じように、Java SE N用にコンパイルされます。\n                            コンパイラ・フラグまたはフラグ引数ごとに1つの-Cを使用します\n    --version             バージョン情報を出力し終了します\n    --show-version        バージョン情報を出力し続行します\n    --help, -?, -h        標準オプションのこの概要を出力し終了します\n    --help-extra, -X      非標準オプションのヘルプを出力し終了します\n\nファイル引数には、ファイル名か、事前定義されたファイル名(DEFAULT、\nPRINTING、TOOLINGまたはJAVASE)の1つを指定できます。\nload-fileでも、対話型I/Oを使用せずに、"-"を指定して標準入力を示すことができます。\n\n評価コンテキスト・オプション(--class-path、--module-path、\n--add-modules)の詳細は、次を参照してください:\n\t/help context\n\nパスには、検索するディレクトリとアーカイブがリストされます。Windowsの場合は、\nセミコロン(;)を使用してパスの項目を区切ります。その他のプラットフォームでは、\nコロン(:)を使用して項目を区切ります。\n
 help.usage.x = \    --add-exports <module>/<package>   定義モジュールからエクスポートされると\n                                         みなされるパッケージを指定します\n    --execution <spec>                 代替実行エンジンを指定します。\n                                         ここで、<spec>はExecutionControl specです。\n                                         specの構文については、パッケージjdk.jshell.spiの\n                                         ドキュメントを参照してください\n    \nこれらは非標準オプションであり予告なしに変更されることがあります。\n
 
 help.list.summary = 入力したソースをリストします
diff --git a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_zh_CN.properties b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_zh_CN.properties
index 1c7d1848855..d9fe0e492ea 100644
--- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_zh_CN.properties
+++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n_zh_CN.properties
@@ -168,6 +168,7 @@ jshell.console.completion.all.completions = <再次按 Tab 可查看所有可能
 jshell.console.no.javadoc = <找不到文档>
 jshell.console.do.nothing = 不执行任何操作
 jshell.console.choice = 选项:\u0020
+
 jshell.console.create.variable = 创建变量
 jshell.console.create.method = 创建方法
 jshell.console.resolvable = \n标识符可在此上下文中解析。
@@ -179,7 +180,8 @@ jshell.console.empty = \n空条目。Shift+Tab m 前必须为单个有效的表
 
 jshell.fix.wrong.shortcut =Shift+Tab 后出现意外的字符。\n使用 "i" 表示自动导入,使用 "v" 表示变量创建,使用 "i" 表示方法创建。\n有关详细信息,请参阅:\n/help 快捷方式
 
-help.usage = 用法:   jshell <option>... <load-file>...\n其中,可能的选项包括:\n    --class-path <path>   指定用户类文件的查找位置\n    --module-path <path>  指定应用程序模块的查找位置\n    --add-modules <module>(,<module>)*\n                          指定要解析的模块;如果 <module> 为 \n                            ALL-MODULE-PATHs,则为模块路径中的所有模块\n    --enable-native-access\n                          允许代码运行受限的本机方法\n    --enable-preview      允许代码依赖于此发行版的预览功能\n    --startup <file>      对启动定义执行单次替换\n    --no-startup          不运行启动定义\n    --feedback <mode>     指定初始反馈模式。该模式可以是\n                            预定义的(silent、concise、normal 或 verbose),\n                            也可以是用户以前定义的\n    -q                    无提示反馈。等同于:--feedback concise\n    -s                    真正无提示反馈。等同于:--feedback silent\n    -v                    详细反馈。等同于:--feedback verbose\n    -J<flag>              直接将 <flag> 传递到运行时系统。\n                            为每个运行时标记或标记参数使用一个 -J\n    -R<flag>              将 <flag> 传递到远程运行时系统。\n                            为每个远程标记或标记参数使用一个 -R\n    -C<flag>              将 <flag> 传递到编译器。\n                            为每个编译器标记或标记参数使用一个 -C\n    --version             输出版本信息并退出\n    --show-version        输出版本信息并继续\n    --help, -?, -h        输出标准选项的此提要并退出\n    --help-extra, -X      输出非标准选项的帮助并退出\n\n文件参数可以是文件名,或者是预定义的文件名之一:DEFAULT、\nPRINTING、TOOLING 或 JAVASE。\n加载文件还可以是 "-",用于指明标准输入,没有交互式 I/O。\n\n有关评估上下文选项(--class-path、--module-path \n和 --add-modules)的详细信息,请参见:\n\t/help context\n\n路径列出要搜索的目录和档案。对于 Windows,请使用\n分号 (;) 来分隔路径中的项。在其他平台上,请使用\n冒号 (:) 来分隔各项。\n
+help.usage = 用法:   jshell <option>... <load-file>...\n其中,可能的选项包括:\n    --class-path <path>   指定用户类文件的查找位置\n    --module-path <path>  指定应用程序模块的查找位置\n    --add-modules <module>(,<module>)*\n                          指定要解析的模块;如果 <module> 为 \n                            ALL-MODULE-PATHs,则为模块路径中的所有模块\n    --enable-native-access\n                          允许代码运行受限的本机方法\n    --enable-preview      允许代码依赖于此发行版的预览功能\n    --startup <file>      对启动定义执行单次替换\n    --no-startup          不运行启动定义\n    --feedback <mode>     指定初始反馈模式。该模式可以是\n                            预定义的(silent、concise、normal 或 verbose),\n                            也可以是用户以前定义的\n    -q                    无提示反馈。等同于:--feedback concise\n    -s                    真正无提示反馈。等同于:--feedback silent\n    -v                    详细反馈。等同于:--feedback verbose\n    -J<flag>              将 <flag> 传递给运行时系统,但对代码片段的\n                            执行没有影响。要指定\n                            影响代码片段执行的标记,请使用\n                            -R<flag>。或者,将 -J<flag> 与\n                            --execution local 一起使用。\n    -R<flag>              仅当执行代码片段时才将 <flag>\n                            传递给运行时系统。例如,-R-Dfoo=bar\n                            表示执行片段\n                            System.getProperty("foo") 将返回 "bar"。\n    -C<flag>              将 <flag> 传递给 JShell 内的 Java 编译器。\n                            例如,-C-Xlint 启用所有建议的\n                            lint 警告,而 -C--release=<N> 针对\n                            Java SE N 进行编译,如同已指定 --release N。\n                            为每个编译器标记或标记参数使用一个 -C\n    --version             输出版本信息并退出\n    --show-version        输出版本信息并继续\n    --help, -?, -h        输出标准选项的此提要并退出\n    --help-extra, -X      输出非标准选项的帮助并退出\n\n文件参数可以是文件名,或者是预定义的文件名之一:DEFAULT、\nPRINTING、TOOLING 或 JAVASE。\n加载文件还可以是 "-",用于指明标准输入,没有交互式 I/O。\n\n有关评估上下文选项(--class-path、--module-path \n和 \
+--add-modules)的更多信息,请参见:\n\t/help context\n\n路径列出要搜索的目录和档案。对于 Windows,请使用\n分号 (;) 来分隔路径中的项。在其他平台上,请使用\n冒号 (:) 来分隔各项。\n
 help.usage.x = \    --add-exports <模块>/<程序包>      指定要考虑从其定义模块导出\n                                         的程序包\n    --execution <规范>                 指定替代执行引擎。\n                                         其中 <规范> 是 ExecutionControl 规范。\n                                         有关规范的语法,请参阅程序包\n                                         jdk.jshell.spi 的文档\n    \n这些选项是非标准选项,如有更改,恕不另行通知。\n
 
 help.list.summary = 列出您键入的源
diff --git a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java
index a86ea2a863d..b0f20a84ec6 100644
--- a/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java
+++ b/src/jdk.jshell/share/classes/jdk/jshell/Snippet.java
@@ -249,8 +249,8 @@ public enum SubKind {
          * A record declaration.
          * A {@code SubKind} of {@link Kind#TYPE_DECL}.
          * @jls 8.10 Record Types
-         * @since 14
          *
+         * @since 17
          */
         RECORD_SUBKIND(Kind.TYPE_DECL),
 
diff --git a/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java b/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java
index 7a78c04f5a8..99bfd870f37 100644
--- a/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java
+++ b/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysis.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -158,6 +158,8 @@ public abstract class SourceCodeAnalysis {
      * @param input The input String to convert
      * @return usually a singleton list of Snippet, but may be empty or multiple
      * @throws IllegalStateException if the {@code JShell} instance is closed.
+     *
+     * @since 10
      */
     public abstract List<Snippet> sourceToSnippets(String input);
 
diff --git a/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java b/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java
index a89c91d3667..3076c0fa76d 100644
--- a/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java
+++ b/src/jdk.jshell/share/classes/jdk/jshell/execution/LocalExecutionControl.java
@@ -89,7 +89,7 @@ public void load(ClassBytecodes[] cbcs)
 
     private static byte[] instrument(byte[] classFile) {
         var cc = ClassFile.of();
-        return cc.transform(cc.parse(classFile),
+        return cc.transformClass(cc.parse(classFile),
                         ClassTransform.transformingMethodBodies((cob, coe) -> {
                             if (coe instanceof BranchInstruction)
                                 cob.invokestatic(CD_Cancel, "stopCheck", ConstantDescs.MTD_void);
diff --git a/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java b/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java
index c4b4bf66b33..e28a6cefb6a 100644
--- a/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java
+++ b/src/jdk.jshell/share/classes/jdk/jshell/tool/JavaShellToolBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -209,6 +209,24 @@ default JavaShellToolBuilder interactiveTerminal(boolean terminal) {
         return this;
     }
 
+    /**
+     * Provide a hint of the display window's dimensions when using an interactive terminal.
+     *
+     * <p>
+     * When the input stream for this Java Shell is {@code System.in}, this setting is ignored.
+     *
+     * @implSpec Implementations may choose to ignore this method. The default implementation
+     * of this method returns {@code this}.
+     *
+     * @param columns number of displayed columns
+     * @param rows number of displayed rows
+     * @return the {@code JavaShellToolBuilder} instance
+     * @since 24
+     */
+    default JavaShellToolBuilder windowSize(int columns, int rows) {
+        return this;
+    }
+
     /**
      * Run an instance of the Java shell tool as configured by the other methods
      * in this interface.  This call is not destructive, more than one call of
@@ -232,6 +250,8 @@ default JavaShellToolBuilder interactiveTerminal(boolean terminal) {
      * @throws Exception an unexpected fatal exception
      * @return the exit status with which the tool explicitly exited (if any),
      * otherwise 0 for success or 1 for failure
+     *
+     * @since 10
      */
     default int start(String... arguments) throws Exception {
         run(arguments);
diff --git a/src/jdk.jshell/share/man/jshell.1 b/src/jdk.jshell/share/man/jshell.1
index 28160bb49fd..6f478e57442 100644
--- a/src/jdk.jshell/share/man/jshell.1
+++ b/src/jdk.jshell/share/man/jshell.1
@@ -36,7 +36,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JSHELL" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JSHELL" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
diff --git a/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java b/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java
index d3770732bc0..fcc97132a50 100644
--- a/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java
+++ b/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, 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
@@ -33,6 +33,8 @@
  * The classes in this package were initially specified by Netscape, and are the
  * de facto standard mechanism for calling JavaScript from the Java runtime.
  * </p>
+ *
+ * @since 1.5
  */
 
 package netscape.javascript;
diff --git a/src/jdk.jstatd/share/classes/module-info.java b/src/jdk.jstatd/share/classes/module-info.java
index ade59da4248..e9a9521ac73 100644
--- a/src/jdk.jstatd/share/classes/module-info.java
+++ b/src/jdk.jstatd/share/classes/module-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -32,6 +32,7 @@
  * @moduleGraph
  * @since 9
  */
+@Deprecated(since="24", forRemoval=true)
 module jdk.jstatd {
     requires java.rmi;
     requires jdk.internal.jvmstat;
diff --git a/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java b/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java
index 5dc7f1fa2fb..cfd1212a67a 100644
--- a/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java
+++ b/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2024, 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
@@ -80,6 +80,8 @@ public static void main(String[] args) {
         int rmiPort = 0;
         int argc = 0;
 
+        System.err.println("WARNING: jstatd is deprecated and will be removed in a future release.");
+
         for ( ; (argc < args.length) && (args[argc].startsWith("-")); argc++) {
             String arg = args[argc];
 
diff --git a/src/jdk.jstatd/share/man/jstatd.1 b/src/jdk.jstatd/share/man/jstatd.1
index cbbaeaf49f2..f5d2f347b45 100644
--- a/src/jdk.jstatd/share/man/jstatd.1
+++ b/src/jdk.jstatd/share/man/jstatd.1
@@ -1,4 +1,4 @@
-.\" Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
+.\" Copyright (c) 2004, 2024, 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
@@ -35,7 +35,7 @@
 . ftr VB CB
 . ftr VBI CBI
 .\}
-.TH "JSTATD" "1" "2024" "JDK 23-ea" "JDK Commands"
+.TH "JSTATD" "1" "2025" "JDK 24-ea" "JDK Commands"
 .hy
 .SH NAME
 .PP
@@ -43,7 +43,9 @@ jstatd - monitor the creation and termination of instrumented Java
 HotSpot VMs
 .SH SYNOPSIS
 .PP
-\f[B]Note:\f[R] This command is experimental and unsupported.
+\f[B]WARNING:\f[R] This command is experimental, unsupported, and
+deprecated.
+It will be removed in a future release.
 .PP
 \f[V]jstatd\f[R] [\f[I]options\f[R]]
 .TP
diff --git a/src/jdk.management.jfr/share/classes/jdk/management/jfr/DownLoadThread.java b/src/jdk.management.jfr/share/classes/jdk/management/jfr/DownLoadThread.java
index 5ce66692537..05895f0f4a9 100644
--- a/src/jdk.management.jfr/share/classes/jdk/management/jfr/DownLoadThread.java
+++ b/src/jdk.management.jfr/share/classes/jdk/management/jfr/DownLoadThread.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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,12 +30,14 @@
 import java.util.Map;
 
 import jdk.jfr.internal.management.ManagementSupport;
+import jdk.jfr.internal.management.HiddenWait;
 
 final class DownLoadThread extends Thread {
     private final RemoteRecordingStream stream;
     private final Instant startTime;
     private final Instant endTime;
     private final DiskRepository diskRepository;
+    private final HiddenWait threadSleeper = new HiddenWait();
 
     DownLoadThread(RemoteRecordingStream stream, String name) {
         super(name);
@@ -64,7 +66,7 @@ public void run() {
                 if (bytes.length != 0) {
                     diskRepository.write(bytes);
                 } else {
-                    takeNap();
+                    threadSleeper.takeNap(1000);
                 }
             }
         } catch (IOException ioe) {
@@ -73,12 +75,4 @@ public void run() {
            diskRepository.complete();
         }
     }
-
-    private void takeNap() {
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException ie) {
-            // ignore
-        }
-    }
 }
diff --git a/src/jdk.management.jfr/share/classes/jdk/management/jfr/FileDump.java b/src/jdk.management.jfr/share/classes/jdk/management/jfr/FileDump.java
index 7da0fe351c4..37ba2967326 100644
--- a/src/jdk.management.jfr/share/classes/jdk/management/jfr/FileDump.java
+++ b/src/jdk.management.jfr/share/classes/jdk/management/jfr/FileDump.java
@@ -32,8 +32,10 @@
 import java.util.Deque;
 
 import jdk.management.jfr.DiskRepository.DiskChunk;
+import jdk.jfr.internal.management.HiddenWait;
 
 final class FileDump {
+    private final HiddenWait lock = new HiddenWait();
     private final Deque<DiskChunk> chunks = new ArrayDeque<>();
     private final long stopTimeMillis;
     private boolean complete;
@@ -42,45 +44,53 @@ final class FileDump {
         this.stopTimeMillis = stopTimeMillis;
     }
 
-    public synchronized void add(DiskChunk dc) {
-        if (isComplete()) {
-            return;
-        }
-        dc.acquire();
-        chunks.addFirst(dc);
-        long endMillis = dc.endTimeNanos / 1_000_000;
-        if (endMillis >= stopTimeMillis) {
-            setComplete();
+    public void add(DiskChunk dc) {
+        synchronized (lock) {
+            if (isComplete()) {
+                return;
+            }
+            dc.acquire();
+            chunks.addFirst(dc);
+            long endMillis = dc.endTimeNanos / 1_000_000;
+            if (endMillis >= stopTimeMillis) {
+                setComplete();
+            }
         }
     }
 
-    public synchronized boolean isComplete() {
-        return complete;
+    public boolean isComplete() {
+        synchronized (lock) {
+            return complete;
+        }
     }
 
-    public synchronized void setComplete() {
-        complete = true;
-        this.notifyAll();
+    public void setComplete() {
+        synchronized (lock) {
+            complete = true;
+            lock.notifyAll();
+        }
     }
 
-    public synchronized void close() {
-        for (DiskChunk dc : chunks) {
-            dc.release();
+    public void close() {
+        synchronized (lock) {
+            for (DiskChunk dc : chunks) {
+                dc.release();
+            }
+            chunks.clear();
+            complete = true;
         }
-        chunks.clear();
-        complete = true;
     }
 
     private DiskChunk oldestChunk() throws InterruptedException {
         while (true) {
-            synchronized (this) {
+            synchronized (lock) {
                 if (!chunks.isEmpty()) {
                     return chunks.pollLast();
                 }
                 if (complete) {
                     return null;
                 }
-                this.wait();
+                lock.wait();
             }
         }
     }
diff --git a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java
index cecb8b86a2d..5e5b665790f 100644
--- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java
+++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java
@@ -645,12 +645,12 @@ void setPermissions(byte[] path, Set<PosixFilePermission> perms) throws IOExcept
                 e.type = Entry.COPY;     // copy e
             }
             if (perms == null) {
-                e.posixPerms = -1;
-            } else if (e.posixPerms == -1) {
-                e.posixPerms = ZipUtils.permsToFlags(perms);
+                e.externalFileAttributes = -1;
+            } else if (e.externalFileAttributes == -1) {
+                e.externalFileAttributes = ZipUtils.permsToFlags(perms);
             } else {
-                e.posixPerms = ZipUtils.permsToFlags(perms) |
-                        (e.posixPerms & 0xFE00); // Preserve unrelated bits
+                e.externalFileAttributes = ZipUtils.permsToFlags(perms) |
+                        (e.externalFileAttributes & 0xFE00); // Preserve unrelated bits
             }
             update(e);
         } finally {
@@ -2887,7 +2887,7 @@ static class Entry extends IndexNode implements ZipFileAttributes {
         // entry attributes
         int    version;
         int    flag;
-        int    posixPerms = -1; // posix permissions
+        int    externalFileAttributes = -1; // file type, setuid, setgid, sticky, posix permissions
         int    method = -1;    // compression method
         long   mtime  = -1;    // last modification time (in DOS time)
         long   atime  = -1;    // last access time
@@ -2923,7 +2923,7 @@ static class Entry extends IndexNode implements ZipFileAttributes {
             for (FileAttribute<?> attr : attrs) {
                 String attrName = attr.name();
                 if (attrName.equals("posix:permissions")) {
-                    posixPerms = ZipUtils.permsToFlags((Set<PosixFilePermission>)attr.value());
+                    externalFileAttributes = ZipUtils.permsToFlags((Set<PosixFilePermission>)attr.value());
                 }
             }
         }
@@ -2958,7 +2958,7 @@ static class Entry extends IndexNode implements ZipFileAttributes {
             */
             this.locoff    = e.locoff;
             this.comment   = e.comment;
-            this.posixPerms = e.posixPerms;
+            this.externalFileAttributes = e.externalFileAttributes;
             this.type      = type;
         }
 
@@ -2988,7 +2988,7 @@ else if (method == METHOD_STORED)
          * to a version value.
          */
         private int versionMadeBy(int version) {
-            return (posixPerms < 0) ? version :
+            return (externalFileAttributes < 0) ? version :
                 VERSION_MADE_BY_BASE_UNIX | (version & 0xff);
         }
 
@@ -3015,7 +3015,7 @@ private void readCEN(ZipFileSystem zipfs, IndexNode inode) throws IOException {
             attrsEx     = CENATX(cen, pos);
             */
             if (CENVEM_FA(cen, pos) == FILE_ATTRIBUTES_UNIX) {
-                posixPerms = (CENATX_PERMS(cen, pos) & 0xFFFF); // 16 bits for file type, setuid, setgid, sticky + perms
+                externalFileAttributes = (CENATX_PERMS(cen, pos) & 0xFFFF); // 16 bits for file type, setuid, setgid, sticky + perms
             }
             locoff      = CENOFF(cen, pos);
             pos += CENHDR;
@@ -3105,7 +3105,7 @@ private int writeCEN(OutputStream os) throws IOException {
             }
             writeShort(os, 0);              // starting disk number
             writeShort(os, 0);              // internal file attributes (unused)
-            writeInt(os, posixPerms > 0 ? posixPerms << 16 : 0); // external file
+            writeInt(os, externalFileAttributes > 0 ? externalFileAttributes << 16 : 0); // external file
                                             // attributes, used for storing posix
                                             // permissions
             writeInt(os, locoff0);          // relative offset of local header
@@ -3528,10 +3528,10 @@ public byte[] comment() {
         @Override
         public Optional<Set<PosixFilePermission>> storedPermissions() {
             Set<PosixFilePermission> perms = null;
-            if (posixPerms != -1) {
+            if (externalFileAttributes != -1) {
                 perms = HashSet.newHashSet(PosixFilePermission.values().length);
                 for (PosixFilePermission perm : PosixFilePermission.values()) {
-                    if ((posixPerms & ZipUtils.permToFlag(perm)) != 0) {
+                    if ((externalFileAttributes & ZipUtils.permToFlag(perm)) != 0) {
                         perms.add(perm);
                     }
                 }
diff --git a/src/utils/LogCompilation/Makefile b/src/utils/LogCompilation/Makefile
index 5f9ca083842..6ab946abc20 100644
--- a/src/utils/LogCompilation/Makefile
+++ b/src/utils/LogCompilation/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2009, 2024, 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
@@ -19,7 +19,7 @@
 # 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.
-#  
+#
 #
 PKGLIST = \
 com.sun.hotspot.tools.compiler
@@ -49,7 +49,7 @@ SRC_DIR    = src
 BUILD_DIR  = build
 OUTPUT_DIR = $(BUILD_DIR)/classes
 
-# gnumake 3.78.1 does not accept the *s, 
+# gnumake 3.78.1 does not accept the *s,
 # so use the shell to expand them
 ALLFILES := $(patsubst %,$(SRC_DIR)/%,$(FILELIST))
 ALLFILES := $(shell /bin/ls $(ALLFILES))
diff --git a/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionSet.java b/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionSet.java
index d67611697bf..46f1c5bc6f1 100644
--- a/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionSet.java
+++ b/test/failure_handler/src/share/classes/jdk/test/failurehandler/action/ActionSet.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -104,8 +104,11 @@ private List<PatternAction> getPatternActions(PrintWriter log,
 
     private String[] getTools(PrintWriter writer, Properties p, String key) {
         String value = p.getProperty(key);
-        if (value == null || value.isEmpty()) {
-            writer.printf("ERROR: '%s' property is empty%n", key);
+        if (value == null) {
+            writer.printf("ERROR: '%s' property is not set%n", key);
+            return new String[]{};
+        }
+        if (value.isEmpty()) {
             return new String[]{};
         }
         return value.split(" ");
diff --git a/test/failure_handler/src/share/conf/windows.properties b/test/failure_handler/src/share/conf/windows.properties
index e22c1a523d8..6d11553ebbf 100644
--- a/test/failure_handler/src/share/conf/windows.properties
+++ b/test/failure_handler/src/share/conf/windows.properties
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2015, 2024, 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
@@ -59,6 +59,8 @@ native.stack.params.repeat=6
 native.core.app=cdb
 native.core.args=-c ".dump /mA core.%p;qd" -p %p
 native.core.params.timeout=600000
+
+cores=
 ################################################################################
 # environment info to gather
 ################################################################################
diff --git a/test/hotspot/gtest/aarch64/test_assembler_aarch64.cpp b/test/hotspot/gtest/aarch64/test_assembler_aarch64.cpp
index 1d756854755..60999f2bf34 100644
--- a/test/hotspot/gtest/aarch64/test_assembler_aarch64.cpp
+++ b/test/hotspot/gtest/aarch64/test_assembler_aarch64.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2020, Red Hat Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -28,8 +28,10 @@
 
 #include "asm/assembler.hpp"
 #include "asm/assembler.inline.hpp"
+#include "asm/macroAssembler.hpp"
 #include "compiler/disassembler.hpp"
 #include "memory/resourceArea.hpp"
+#include "nativeInst_aarch64.hpp"
 #include "unittest.hpp"
 
 #define __ _masm.
@@ -81,4 +83,376 @@ TEST_VM(AssemblerAArch64, validate) {
   BufferBlob::free(b);
 }
 
+constexpr uint32_t test_encode_dmb_ld = 0xd50339bf;
+constexpr uint32_t test_encode_dmb_st = 0xd5033abf;
+constexpr uint32_t test_encode_dmb    = 0xd5033bbf;
+constexpr uint32_t test_encode_nop    = 0xd503201f;
+
+static void asm_dump(address start, address end) {
+  ResourceMark rm;
+  stringStream ss;
+  ss.print_cr("Insns:");
+  Disassembler::decode(start, end, &ss);
+  printf("%s\n", ss.as_string());
+}
+
+void test_merge_dmb() {
+  BufferBlob* b = BufferBlob::create("aarch64Test", 400);
+  CodeBuffer code(b);
+  MacroAssembler _masm(&code);
+
+  {
+    // merge with same type
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+    __ nop();
+    __ membar(Assembler::Membar_mask_bits::LoadStore);
+    __ membar(Assembler::Membar_mask_bits::LoadStore);
+    __ membar(Assembler::Membar_mask_bits::LoadStore);
+    __ membar(Assembler::Membar_mask_bits::LoadStore);
+    __ nop();
+    // merge with high rank
+    __ membar(Assembler::Membar_mask_bits::LoadStore);
+    __ membar(Assembler::Membar_mask_bits::LoadStore);
+    __ membar(Assembler::Membar_mask_bits::AnyAny);
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+    __ nop();
+    // merge with different type
+    __ membar(Assembler::Membar_mask_bits::LoadStore);
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+    __ membar(Assembler::Membar_mask_bits::LoadStore);
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+  }
+  asm_dump(code.insts()->start(), code.insts()->end());
+  // AlwaysMergeDMB
+  static const unsigned int insns1[] = {
+    test_encode_dmb_st,
+    test_encode_nop,
+    test_encode_dmb_ld,
+    test_encode_nop,
+    test_encode_dmb,
+    test_encode_nop,
+    test_encode_dmb,
+  };
+  // !AlwaysMergeDMB
+  static const unsigned int insns2[] = {
+    test_encode_dmb_st,
+    test_encode_nop,
+    test_encode_dmb_ld,
+    test_encode_nop,
+    test_encode_dmb,
+    test_encode_nop,
+    test_encode_dmb_ld,
+    test_encode_dmb_st,
+  };
+  if (AlwaysMergeDMB) {
+    EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns1));
+    asm_check((const unsigned int *)code.insts()->start(), insns1, sizeof insns1 / sizeof insns1[0]);
+  } else {
+    EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns2));
+    asm_check((const unsigned int *)code.insts()->start(), insns2, sizeof insns2 / sizeof insns2[0]);
+  }
+
+  BufferBlob::free(b);
+}
+
+TEST_VM(AssemblerAArch64, merge_dmb_1) {
+  FlagSetting fs(AlwaysMergeDMB, true);
+  test_merge_dmb();
+}
+
+TEST_VM(AssemblerAArch64, merge_dmb_2) {
+  FlagSetting fs(AlwaysMergeDMB, false);
+  test_merge_dmb();
+}
+
+TEST_VM(AssemblerAArch64, merge_dmb_block_by_label) {
+  BufferBlob* b = BufferBlob::create("aarch64Test", 400);
+  CodeBuffer code(b);
+  MacroAssembler _masm(&code);
+
+  {
+    Label l;
+    // merge can not cross the label
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+    __ bind(l);
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+  }
+  asm_dump(code.insts()->start(), code.insts()->end());
+  static const unsigned int insns[] = {
+    0xd5033abf, // dmb.ishst
+    0xd5033abf, // dmb.ishst
+  };
+  EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns));
+  asm_check((const unsigned int *)code.insts()->start(), insns, sizeof insns / sizeof insns[0]);
+
+  BufferBlob::free(b);
+}
+
+TEST_VM(AssemblerAArch64, merge_dmb_after_expand) {
+  ResourceMark rm;
+  BufferBlob* b = BufferBlob::create("aarch64Test", 400);
+  CodeBuffer code(b);
+  code.set_blob(b);
+  MacroAssembler _masm(&code);
+
+  {
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+    code.insts()->maybe_expand_to_ensure_remaining(50000);
+    __ membar(Assembler::Membar_mask_bits::StoreStore);
+  }
+  asm_dump(code.insts()->start(), code.insts()->end());
+  static const unsigned int insns[] = {
+    0xd5033abf, // dmb.ishst
+  };
+  EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns));
+  asm_check((const unsigned int *)code.insts()->start(), insns, sizeof insns / sizeof insns[0]);
+}
+
+void expect_dmbld(void* addr) {
+  if (*((uint32_t *) addr) != test_encode_dmb_ld) {
+    tty->print_cr("Expected dmb.ld");
+    FAIL();
+  }
+}
+
+void expect_dmbst(void* addr) {
+  if (*((uint32_t *) addr) != test_encode_dmb_st) {
+    tty->print_cr("Expected dmb.st");
+    FAIL();
+  }
+}
+
+void expect_dmb(void* addr) {
+  if (*((uint32_t *) addr) != test_encode_dmb) {
+    tty->print_cr("Expected dmb");
+    FAIL();
+  }
+}
+
+void expect_any_dmb(void* addr) {
+  uint32_t encode = *((uint32_t *) addr);
+  if (encode != test_encode_dmb && encode != test_encode_dmb_ld && encode != test_encode_dmb_st) {
+    tty->print_cr("Expected a dmb.* instruction");
+    FAIL();
+  }
+}
+
+void expect_different_dmb_kind(void* addr) {
+  uint32_t pos1 = *((uint32_t *) addr);
+  uint32_t pos2 = *(((uint32_t *) addr) + 1);
+  if (pos1 == pos2) {
+    tty->print_cr("Expected different dmb kind");
+    FAIL();
+  }
+}
+
+void expect_dmb_at_least_one(void* addr) {
+  uint32_t pos1 = *((uint32_t *) addr);
+  uint32_t pos2 = *(((uint32_t *) addr) + 1);
+  if (pos1 != test_encode_dmb && pos2 != test_encode_dmb) {
+    tty->print_cr("Expected at least one dmb");
+    FAIL();
+  }
+}
+
+void expect_dmb_none(void* addr) {
+  uint32_t pos1 = *((uint32_t *) addr);
+  uint32_t pos2 = *(((uint32_t *) addr) + 1);
+  if (pos1 == test_encode_dmb || pos2 == test_encode_dmb) {
+    tty->print_cr("Expected no dmb");
+    FAIL();
+  }
+}
+
+void test_merge_dmb_all_kinds() {
+  BufferBlob* b = BufferBlob::create("aarch64Test", 20000);
+  CodeBuffer code(b);
+  MacroAssembler _masm(&code);
+
+  constexpr int count = 5;
+  struct {
+    const char* label;
+    Assembler::Membar_mask_bits flavor;
+    // Two groups of two bits describing the ordering, can be OR-ed to figure out composite semantics.
+    // First group describes ops before the barrier. Second group describes ops after the barrier.
+    // "01" means "load", "10" means "store", "100" means "any".
+    int mask;
+  } kind[count] = {
+          {"storestore", Assembler::StoreStore, 0b010010},
+          {"loadstore",  Assembler::LoadStore,  0b001010},
+          {"loadload",   Assembler::LoadLoad,   0b001001},
+          {"storeload",  Assembler::StoreLoad,  0b100100}, // quirk: StoreLoad is as powerful as AnyAny
+          {"anyany",     Assembler::AnyAny,     0b100100},
+  };
+
+  for (int b1 = 0; b1 < count; b1++) {
+    for (int b2 = 0; b2 < count; b2++) {
+      for (int b3 = 0; b3 < count; b3++) {
+        for (int b4 = 0; b4 < count; b4++) {
+          // tty->print_cr("%s + %s + %s + %s", kind[b1].label, kind[b2].label, kind[b3].label, kind[b4].label);
+
+          address start = __ pc();
+          __ membar(kind[b1].flavor);
+          __ membar(kind[b2].flavor);
+          __ membar(kind[b3].flavor);
+          __ membar(kind[b4].flavor);
+          address end = __ pc();
+          __ nop();
+
+          size_t size = pointer_delta(end, start, 1);
+          if (AlwaysMergeDMB) {
+            // Expect only a single barrier.
+            EXPECT_EQ(size, (size_t) NativeMembar::instruction_size);
+          } else {
+            EXPECT_LE(size, (size_t) NativeMembar::instruction_size * 2);
+          }
+
+          // Composite ordering for this group of barriers.
+          int composite_mask = kind[b1].mask | kind[b2].mask | kind[b3].mask | kind[b4].mask;
+
+          if (size == NativeMembar::instruction_size) {
+            // If there is a single barrier, we can easily test its type.
+            switch (composite_mask) {
+              case 0b001001:
+              case 0b001010:
+              case 0b001011:
+              case 0b001101:
+              case 0b001110:
+              case 0b001111:
+                // Any combination of Load(Load|Store|Any) gets dmb.ld
+                expect_dmbld(start);
+                break;
+              case 0b010010:
+                // Only StoreStore gets dmb.st
+                expect_dmbst(start);
+                break;
+              default:
+                // Everything else gets folded into full dmb
+                expect_dmb(start);
+                break;
+            }
+          } else if (size == 2 * NativeMembar::instruction_size) {
+            // There are two barriers. Make a few sanity checks.
+            // They must be different kind
+            expect_any_dmb(start);
+            expect_any_dmb(start + NativeMembar::instruction_size);
+            expect_different_dmb_kind(start);
+            if ((composite_mask & 0b100100) != 0) {
+              // There was "any" barrier in the group, a full dmb is expected
+              expect_dmb_at_least_one(start);
+            } else {
+              // Otherwise expect no full dmb
+              expect_dmb_none(start);
+            }
+          } else {
+            // Merging code does not produce this result.
+            FAIL();
+          }
+        }
+      }
+    }
+  }
+
+  BufferBlob::free(b);
+}
+
+TEST_VM(AssemblerAArch64, merge_dmb_all_kinds_1) {
+  FlagSetting fs(AlwaysMergeDMB, true);
+  test_merge_dmb_all_kinds();
+}
+
+TEST_VM(AssemblerAArch64, merge_dmb_all_kinds_2) {
+  FlagSetting fs(AlwaysMergeDMB, false);
+  test_merge_dmb_all_kinds();
+}
+
+TEST_VM(AssemblerAArch64, merge_ldst) {
+  BufferBlob* b = BufferBlob::create("aarch64Test", 400);
+  CodeBuffer code(b);
+  MacroAssembler _masm(&code);
+
+  {
+    Label l;
+    // merge ld/st into ldp/stp
+    __ ldr(r0, Address(sp, 8));
+    __ ldr(r1, Address(sp, 0));
+    __ nop();
+    __ str(r0, Address(sp, 0));
+    __ str(r1, Address(sp, 8));
+    __ nop();
+    __ ldrw(r0, Address(sp, 0));
+    __ ldrw(r1, Address(sp, 4));
+    __ nop();
+    __ strw(r0, Address(sp, 4));
+    __ strw(r1, Address(sp, 0));
+    __ nop();
+    // can not merge
+    __ ldrw(r0, Address(sp, 4));
+    __ ldr(r1, Address(sp, 8));
+    __ nop();
+    __ ldrw(r0, Address(sp, 0));
+    __ ldrw(r1, Address(sp, 8));
+    __ nop();
+    __ str(r0, Address(sp, 0));
+    __ bind(l);                     // block by label
+    __ str(r1, Address(sp, 8));
+    __ nop();
+  }
+  asm_dump(code.insts()->start(), code.insts()->end());
+  static const unsigned int insns1[] = {
+    0xa94003e1, // ldp x1, x0, [sp]
+    0xd503201f, // nop
+    0xa90007e0, // stp x0, x1, [sp]
+    0xd503201f, // nop
+    0x294007e0, // ldp w0, w1, [sp]
+    0xd503201f, // nop
+    0x290003e1, // stp w1, w0, [sp]
+    0xd503201f, // nop
+    0xb94007e0, // ldr w0, [sp, 4]
+    0xf94007e1, // ldr x1, [sp, 8]
+    0xd503201f, // nop
+    0xb94003e0, // ldr w0, [sp]
+    0xb9400be1, // ldr w1, [sp, 8]
+    0xd503201f, // nop
+    0xf90003e0, // str x0, [sp]
+    0xf90007e1, // str x1, [sp, 8]
+    0xd503201f, // nop
+  };
+  EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns1));
+  asm_check((const unsigned int *)code.insts()->start(), insns1, sizeof insns1 / sizeof insns1[0]);
+
+  BufferBlob::free(b);
+}
+
+TEST_VM(AssemblerAArch64, merge_ldst_after_expand) {
+  ResourceMark rm;
+  BufferBlob* b = BufferBlob::create("aarch64Test", 400);
+  CodeBuffer code(b);
+  code.set_blob(b);
+  MacroAssembler _masm(&code);
+
+  {
+    __ ldr(r0, Address(sp, 8));
+    code.insts()->maybe_expand_to_ensure_remaining(10000);
+    __ ldr(r1, Address(sp, 0));
+    __ nop();
+    __ str(r0, Address(sp, 0));
+    code.insts()->maybe_expand_to_ensure_remaining(100000);
+    __ str(r1, Address(sp, 8));
+    __ nop();
+  }
+  asm_dump(code.insts()->start(), code.insts()->end());
+  static const unsigned int insns[] = {
+    0xa94003e1, // ldp x1, x0, [sp]
+    0xd503201f, // nop
+    0xa90007e0, // stp x0, x1, [sp]
+    0xd503201f, // nop
+  };
+  EXPECT_EQ(code.insts()->size(), (CodeSection::csize_t)(sizeof insns));
+  asm_check((const unsigned int *)code.insts()->start(), insns, sizeof insns / sizeof insns[0]);
+}
+
 #endif  // AARCH64
diff --git a/test/hotspot/gtest/gc/g1/test_freeRegionList.cpp b/test/hotspot/gtest/gc/g1/test_freeRegionList.cpp
index 60ebf3c7208..bc45626deec 100644
--- a/test/hotspot/gtest/gc/g1/test_freeRegionList.cpp
+++ b/test/hotspot/gtest/gc/g1/test_freeRegionList.cpp
@@ -34,12 +34,12 @@
 #include "unittest.hpp"
 
 // @requires UseG1GC
-TEST_OTHER_VM(FreeRegionList, length) {
+TEST_OTHER_VM(G1FreeRegionList, length) {
   if (!UseG1GC) {
     return;
   }
 
-  FreeRegionList l("test");
+  G1FreeRegionList l("test");
   const uint num_regions_in_test = 5;
 
   // Create a fake heap. It does not need to be valid, as the G1HeapRegion constructor
diff --git a/test/hotspot/gtest/gc/g1/test_g1CardSetContainers.cpp b/test/hotspot/gtest/gc/g1/test_g1CardSetContainers.cpp
index 21ae6e9c1da..fcc3053bd85 100644
--- a/test/hotspot/gtest/gc/g1/test_g1CardSetContainers.cpp
+++ b/test/hotspot/gtest/gc/g1/test_g1CardSetContainers.cpp
@@ -236,8 +236,8 @@ void G1CardSetContainersTest::cardset_bitmap_test(uint threshold, uint size_in_b
 }
 
 TEST_VM_F(G1CardSetContainersTest, basic_cardset_inptr_test) {
-  uint const min = (uint)log2i(HeapRegionBounds::min_size());
-  uint const max = (uint)log2i(HeapRegionBounds::max_size());
+  uint const min = (uint)log2i(G1HeapRegionBounds::min_size());
+  uint const max = (uint)log2i(G1HeapRegionBounds::max_size());
 
   for (uint i = min; i <= max; i++) {
     G1CardSetContainersTest::cardset_inlineptr_test(i - CardTable::card_shift());
diff --git a/test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp b/test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp
index feb5f58bbde..f9075f27bd4 100644
--- a/test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp
+++ b/test/hotspot/gtest/gc/g1/test_g1RegionMap.cpp
@@ -62,7 +62,7 @@ static void generate_random_map(G1CommittedRegionMap* map) {
 static void random_deactivate(G1CommittedRegionMap* map) {
   uint current_offset = 0;
   do {
-    HeapRegionRange current = map->next_active_range(current_offset);
+    G1HeapRegionRange current = map->next_active_range(current_offset);
     if (mutate()) {
       if (current.length() < 5) {
         // For short ranges, deactivate whole.
@@ -79,7 +79,7 @@ static void random_deactivate(G1CommittedRegionMap* map) {
 static void random_uncommit_or_reactive(G1CommittedRegionMap* map) {
   uint current_offset = 0;
   do {
-    HeapRegionRange current = map->next_inactive_range(current_offset);
+    G1HeapRegionRange current = map->next_inactive_range(current_offset);
     // Randomly either reactivate or uncommit
     if (mutate()) {
       map->reactivate(current.start(), current.end());
@@ -94,7 +94,7 @@ static void random_uncommit_or_reactive(G1CommittedRegionMap* map) {
 static void random_activate_free(G1CommittedRegionMap* map) {
   uint current_offset = 0;
   do {
-    HeapRegionRange current = map->next_committable_range(current_offset);
+    G1HeapRegionRange current = map->next_committable_range(current_offset);
     // Randomly either reactivate or uncommit
     if (mutate()) {
       if (current.length() < 5) {
diff --git a/test/hotspot/gtest/gc/parallel/test_psParallelCompact.cpp b/test/hotspot/gtest/gc/parallel/test_psParallelCompact.cpp
deleted file mode 100644
index 4820a01cc57..00000000000
--- a/test/hotspot/gtest/gc/parallel/test_psParallelCompact.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * 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.
- */
-
-#include "precompiled.hpp"
-#include "gc/parallel/parMarkBitMap.inline.hpp"
-#include "gc/parallel/psCompactionManager.inline.hpp"
-#include "gc/parallel/psParallelCompact.hpp"
-#include "unittest.hpp"
-
-#ifndef PRODUCT
-
-class PSParallelCompactTest : public ::testing::Test {
- public:
-  static void print_generic_summary_data(ParallelCompactData& summary_data,
-                                         HeapWord* const beg_addr,
-                                         HeapWord* const end_addr) {
-    PSParallelCompact::print_generic_summary_data(summary_data,
-                                                  beg_addr, end_addr);
-  }
-};
-
-// @requires UseParallelGC
-TEST_VM(PSParallelCompact, print_generic_summary_data) {
-  if (!UseParallelGC) {
-    return;
-  }
-  // Check that print_generic_summary_data() does not print the
-  // end region by placing a bad value in the destination of the
-  // end region.  The end region should not be printed because it
-  // corresponds to the space after the end of the heap.
-  ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
-  HeapWord* begin_heap =
-    (HeapWord*) heap->old_gen()->virtual_space()->low_boundary();
-  HeapWord* end_heap =
-    (HeapWord*) heap->young_gen()->virtual_space()->high_boundary();
-
-  PSParallelCompactTest::print_generic_summary_data(PSParallelCompact::summary_data(),
-    begin_heap, end_heap);
-}
-
-#endif
diff --git a/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp b/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp
index 40df20ba964..b38586a8975 100644
--- a/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp
+++ b/test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp
@@ -63,11 +63,9 @@ class TestGenCollectorPolicy {
       AutoSaveRestore<size_t> FLAG_GUARD(MaxNewSize);
       AutoSaveRestore<size_t> FLAG_GUARD(MinHeapDeltaBytes);
       AutoSaveRestore<size_t> FLAG_GUARD(NewSize);
-      AutoSaveRestore<size_t> FLAG_GUARD(OldSize);
 
       MinHeapSize = 40 * M;
       FLAG_SET_ERGO(InitialHeapSize, 100 * M);
-      FLAG_SET_ERGO(OldSize, 4 * M);
       FLAG_SET_ERGO(NewSize, 1 * M);
       FLAG_SET_ERGO(MaxNewSize, 80 * M);
 
@@ -144,14 +142,6 @@ class TestGenCollectorPolicy {
     }
   };
 
-  class SetOldSizeCmd : public UnaryExecutor {
-   public:
-    SetOldSizeCmd(size_t param) : UnaryExecutor(param) { }
-    void execute() {
-      FLAG_SET_CMDLINE(OldSize, param);
-    }
-  };
-
   class SetMaxNewSizeCmd : public BinaryExecutor {
    public:
     SetMaxNewSizeCmd(size_t param1, size_t param2) : BinaryExecutor(param1, param2) { }
@@ -162,49 +152,6 @@ class TestGenCollectorPolicy {
       FLAG_SET_CMDLINE(MaxNewSize, new_size_value);
     }
   };
-
-  class CheckOldMin : public UnaryExecutor {
-   public:
-    CheckOldMin(size_t param) : UnaryExecutor(param) { }
-    void execute() {
-      SerialArguments sa;
-      sa.initialize_heap_sizes();
-      ASSERT_LE(MinOldSize, param);
-    }
-  };
-
-  class CheckOldInitial : public Executor {
-   public:
-    void execute() {
-      size_t heap_alignment = GCArguments::compute_heap_alignment();
-
-      SerialArguments sa;
-      sa.initialize_heap_sizes();
-
-      size_t expected_old_initial = align_up(InitialHeapSize, heap_alignment)
-              - MaxNewSize;
-
-      ASSERT_EQ(expected_old_initial, OldSize);
-    }
-  };
-
-  class CheckOldInitialMaxNewSize : public BinaryExecutor {
-   public:
-    CheckOldInitialMaxNewSize(size_t param1, size_t param2) : BinaryExecutor(param1, param2) { }
-    void execute() {
-      size_t heap_alignment = GCArguments::compute_heap_alignment();
-      size_t new_size_value = align_up(MaxHeapSize, heap_alignment)
-              - param1 + param2;
-
-      SerialArguments sa;
-      sa.initialize_heap_sizes();
-
-      size_t expected_old_initial = align_up(MaxHeapSize, heap_alignment)
-              - new_size_value;
-
-      ASSERT_EQ(expected_old_initial, OldSize);
-    }
-  };
 };
 
 
@@ -212,18 +159,6 @@ class TestGenCollectorPolicy {
 // depends on so many other configurable variables. These tests only try to
 // verify that there are some basic rules for NewSize honored by the policies.
 
-// If NewSize has been ergonomically set, the collector policy
-// should use it for min
-// This test doesn't work with 64k pages. See JDK-8331675.
-#if !defined(PPC)
-TEST_VM(CollectorPolicy, young_min_ergo) {
-  TestGenCollectorPolicy::SetNewSizeErgo setter(20 * M);
-  TestGenCollectorPolicy::CheckYoungMin checker(20 * M);
-
-  TestGenCollectorPolicy::TestWrapper::test(&setter, &checker);
-}
-#endif
-
 // If NewSize has been ergonomically set, the collector policy
 // should use it for min but calculate the initial young size
 // using NewRatio.
@@ -256,29 +191,3 @@ TEST_OTHER_VM(CollectorPolicy, young_cmd) {
   TestGenCollectorPolicy::CheckYoungInitial checker_large(80 * M);
   TestGenCollectorPolicy::TestWrapper::test(&setter_large, &checker_large);
 }
-
-// Since a flag has been set with FLAG_SET_CMDLINE it
-// will be treated as it have been set on the command line for
-// the rest of the VM lifetime. This is an irreversible change and
-// could impact other tests so we use TEST_OTHER_VM
-TEST_OTHER_VM(CollectorPolicy, old_cmd) {
-  // If OldSize is set on the command line, it should be used
-  // for both min and initial old size if less than min heap.
-  TestGenCollectorPolicy::SetOldSizeCmd setter(20 * M);
-
-  TestGenCollectorPolicy::CheckOldMin checker_min(20 * M);
-  TestGenCollectorPolicy::TestWrapper::test(&setter, &checker_min);
-
-  TestGenCollectorPolicy::CheckOldInitial checker_initial;
-  TestGenCollectorPolicy::TestWrapper::test(&setter, &checker_initial);
-
-  // If MaxNewSize is large, the maximum OldSize will be less than
-  // what's requested on the command line and it should be reset
-  // ergonomically.
-  // We intentionally set MaxNewSize + OldSize > MaxHeapSize
-  TestGenCollectorPolicy::SetOldSizeCmd setter_old_size(30 * M);
-  TestGenCollectorPolicy::SetMaxNewSizeCmd setter_max_new_size(30 * M, 20 * M);
-  TestGenCollectorPolicy::CheckOldInitialMaxNewSize checker_large(30 * M, 20 * M);
-
-  TestGenCollectorPolicy::TestWrapper::test(&setter_old_size, &setter_max_new_size, &checker_large);
-}
diff --git a/test/hotspot/gtest/gc/shared/test_oopStorage.cpp b/test/hotspot/gtest/gc/shared/test_oopStorage.cpp
index 6758c61325a..a4ac2fee66b 100644
--- a/test/hotspot/gtest/gc/shared/test_oopStorage.cpp
+++ b/test/hotspot/gtest/gc/shared/test_oopStorage.cpp
@@ -461,7 +461,7 @@ class OopStorageTestBlockRelease : public OopStorageTestWithAllocation {
       *to_release[i] = nullptr;
     }
     if (sorted) {
-      QuickSort::sort(to_release, nrelease, PointerCompare(), false);
+      QuickSort::sort(to_release, nrelease, PointerCompare());
     }
 
     storage().release(to_release, nrelease);
diff --git a/test/hotspot/gtest/metaspace/test_allocationGuard.cpp b/test/hotspot/gtest/metaspace/test_allocationGuard.cpp
deleted file mode 100644
index 9b0eb3d69a5..00000000000
--- a/test/hotspot/gtest/metaspace/test_allocationGuard.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2020 SAP SE. 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.
- *
- */
-
-#include "precompiled.hpp"
-#include "memory/metaspace/metaspaceArena.hpp"
-#include "memory/metaspace/metaspaceSettings.hpp"
-#include "memory/metaspace/testHelpers.hpp"
-#include "utilities/debug.hpp"
-#include "utilities/ostream.hpp"
-
-//#define LOG_PLEASE
-#include "metaspaceGtestCommon.hpp"
-#include "metaspaceGtestContexts.hpp"
-
-#ifdef ASSERT
-
-using metaspace::MetaspaceArena;
-using metaspace::MetaspaceTestArena;
-using metaspace::Settings;
-
-// Test that overwriting memory triggers an assert if allocation guards are enabled.
-//  Note: We use TEST_VM_ASSERT_MSG. However, an assert is only triggered if allocation
-//  guards are enabled; if guards are disabled for the gtests, this test would fail.
-//  So for that case, we trigger a fake assert.
-TEST_VM_ASSERT_MSG(metaspace, test_overwriter, ".*Metaspace corruption.*") {
-
-  if (Settings::use_allocation_guard()) {
-    MetaspaceGtestContext context;
-    MetaspaceTestArena* arena = context.create_arena(Metaspace::StandardMetaspaceType);
-    // We allocate two blocks. We then write over the end of the first block, which
-    //  should corrupt the fence between the two blocks.
-    // Note: there is of course no guarantee that blocks allocated sequentially are neighbors;
-    //  but in this case (clean standard-sized test arena and very small allocations) it can
-    //  be safely assumed).
-    MetaWord* p1 = arena->allocate(8);
-    MetaWord* p2 = arena->allocate(2);
-    p1[8] = (MetaWord)0x9345; // Overwriter
-    // Now we delete the arena (as happens during class unloading); this will check all
-    // block canaries and should trigger an assert (see MetaspaceArena::verify_allocation_guards()).
-    delete arena;
-  } else {
-    assert(false, "Metaspace corruption - please ignore this, fake message to satisfy tests");
-  }
-
-}
-
-#endif // ASSERT
diff --git a/test/hotspot/gtest/metaspace/test_metaspacearena.cpp b/test/hotspot/gtest/metaspace/test_metaspacearena.cpp
index f7474da22c0..aee53ea32aa 100644
--- a/test/hotspot/gtest/metaspace/test_metaspacearena.cpp
+++ b/test/hotspot/gtest/metaspace/test_metaspacearena.cpp
@@ -291,11 +291,6 @@ TEST_VM(metaspace, MetaspaceArena_test_enlarge_in_place_micro_nc) {
 //  Here, we give it an ideal policy which should enable the initial chunk to grow unmolested
 //  until finish.
 TEST_VM(metaspace, MetaspaceArena_test_enlarge_in_place_2) {
-
-  if (Settings::use_allocation_guard()) {
-    return;
-  }
-
   // Note: internally, chunk in-place enlargement is disallowed if growing the chunk
   //  would cause the arena to claim more memory than its growth policy allows. This
   //  is done to prevent the arena to grow too fast.
@@ -337,11 +332,6 @@ TEST_VM(metaspace, MetaspaceArena_test_enlarge_in_place_2) {
 //  test that in place enlargement correctly fails if growing the chunk would bring us
 //  beyond the max. size of a chunk.
 TEST_VM(metaspace, MetaspaceArena_test_failing_to_enlarge_in_place_max_chunk_size) {
-
-  if (Settings::use_allocation_guard()) {
-    return;
-  }
-
   MetaspaceGtestContext context;
 
   for (size_t first_allocation_size = 1; first_allocation_size <= MAX_CHUNK_WORD_SIZE / 2; first_allocation_size *= 2) {
@@ -372,11 +362,6 @@ TEST_VM(metaspace, MetaspaceArena_test_failing_to_enlarge_in_place_max_chunk_siz
 //  test that in place enlargement correctly fails if growing the chunk would cause more
 //  than doubling its size
 TEST_VM(metaspace, MetaspaceArena_test_failing_to_enlarge_in_place_doubling_chunk_size) {
-
-  if (Settings::use_allocation_guard()) {
-    return;
-  }
-
   MetaspaceGtestContext context;
   MetaspaceArenaTestHelper helper(context, Metaspace::StandardMetaspaceType, false);
 
@@ -399,9 +384,6 @@ TEST_VM(metaspace, MetaspaceArena_test_failing_to_enlarge_in_place_doubling_chun
 // Allocate, deallocate, then allocate the same block again. The second allocate should
 // reuse the deallocated block.
 TEST_VM(metaspace, MetaspaceArena_deallocate) {
-  if (Settings::use_allocation_guard()) {
-    return;
-  }
   for (size_t s = 2; s <= MAX_CHUNK_WORD_SIZE; s *= 2) {
     MetaspaceGtestContext context;
     MetaspaceArenaTestHelper helper(context, Metaspace::StandardMetaspaceType, false);
@@ -505,10 +487,6 @@ static void test_controlled_growth(Metaspace::MetaspaceType type, bool is_class,
                                    bool test_in_place_enlargement)
 {
 
-  if (Settings::use_allocation_guard()) {
-    return;
-  }
-
   // From a MetaspaceArena in a clean room allocate tiny amounts;
   // watch it grow. Used/committed/capacity should not grow in
   // large jumps. Also, different types of MetaspaceArena should
diff --git a/test/hotspot/gtest/metaspace/test_metaspacearena_stress.cpp b/test/hotspot/gtest/metaspace/test_metaspacearena_stress.cpp
index 7d3df079802..e94f733e45b 100644
--- a/test/hotspot/gtest/metaspace/test_metaspacearena_stress.cpp
+++ b/test/hotspot/gtest/metaspace/test_metaspacearena_stress.cpp
@@ -106,15 +106,13 @@ class MetaspaceArenaTestBed : public CHeapObj<mtInternal> {
     // - alignment/padding of allocations
     // - inside used counter contains blocks in free list
     // - free block list splinter threshold
-    // - if +MetaspaceGuardAllocations, guard costs
 
     // Since what we deallocated may have been given back to us in a following allocation,
     // we only know fore sure we allocated what we did not give back.
     const size_t at_least_allocated = _alloc_count.total_size() - _dealloc_count.total_size();
 
     // At most we allocated this:
-    const size_t max_word_overhead_per_alloc =
-        4 + (metaspace::Settings::use_allocation_guard() ? 4 : 0);
+    constexpr size_t max_word_overhead_per_alloc = 4;
     const size_t at_most_allocated = _alloc_count.total_size() + max_word_overhead_per_alloc * _alloc_count.count();
 
     ASSERT_LE(at_least_allocated, in_use_stats._used_words - stats._free_blocks_word_size);
diff --git a/test/hotspot/gtest/nmt/test_arrayWithFreeList.cpp b/test/hotspot/gtest/nmt/test_arrayWithFreeList.cpp
new file mode 100644
index 00000000000..a2110e9e22e
--- /dev/null
+++ b/test/hotspot/gtest/nmt/test_arrayWithFreeList.cpp
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2024, 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.
+
+ */
+
+#include "precompiled.hpp"
+#include "unittest.hpp"
+#include "nmt/arrayWithFreeList.hpp"
+
+using A = ArrayWithFreeList<int, mtTest>;
+
+class ArrayWithFreeListTest  : public testing::Test {
+};
+
+// A linked list which sets the allocator itself
+template<typename E>
+struct LL {
+  struct Node;
+  using NodeAllocator = ArrayWithFreeList<Node, mtTest>;
+  using NodePtr = typename NodeAllocator::I;
+  NodeAllocator alloc;
+  struct Node {
+    E e;
+    NodePtr next;
+  };
+
+  NodePtr start;
+  LL()
+  : start{NodeAllocator::nil} {
+  }
+
+  void push(E e) {
+    NodePtr new_element = alloc.allocate(e, NodeAllocator::nil);
+    NodePtr& current = start;
+    if (current == NodeAllocator::nil) {
+      current = new_element;
+      return;
+    }
+    alloc.at(new_element).next = current;
+    current = new_element;
+  };
+
+  E pop() {
+    assert(start != NodeAllocator::nil, "must be");
+    Node& n = alloc.at(start);
+    E e = n.e;
+    NodePtr next_start = n.next;
+    alloc.deallocate(start);
+    start = next_start;
+    return e;
+  }
+};
+
+// A linked list which is capable of having multiple different allocators. This is done through higher-kinded types.
+// That's a very fancy word that means that a templated type like Foo<E> can be passed around like only Foo at first
+// and then be 'applied' to some E. Think of it like passing around a lambda or function pointer, but on a template level,
+// where Foo is a function that can be called on some type with the return type being Foo<E>.
+template<typename E, template<typename, MEMFLAGS> class Allocator>
+struct LL2 {
+  struct Node;
+  using NodeAllocator = Allocator<Node, mtTest>;
+  using NodePtr = typename NodeAllocator::I;
+  NodeAllocator alloc;
+  struct Node {
+    E e;
+    NodePtr next;
+  };
+
+  NodePtr start;
+  LL2()
+    : start(NodeAllocator::nil) {
+  }
+
+  void push(E e) {
+    NodePtr new_element = alloc.allocate(e, NodeAllocator::nil);
+    NodePtr& current = start;
+    if (current == NodeAllocator::nil) {
+      current = new_element;
+      return;
+    }
+    alloc.at(new_element).next = current;
+    current = new_element;
+  };
+
+  E pop() {
+    assert(start != NodeAllocator::nil, "must be");
+    Node& n = alloc.at(start);
+    E e = n.e;
+    NodePtr next_start = n.next;
+    alloc.deallocate(start);
+    start = next_start;
+    return e;
+  }
+};
+
+template<typename List>
+void test_with_list(List& list) {
+  list.push(1);
+  list.push(2);
+  EXPECT_EQ(2, list.pop());
+  EXPECT_EQ(1, list.pop());
+}
+
+TEST_VM_F(ArrayWithFreeListTest, TestLinkedLists) {
+  {
+    LL<int> list;
+    test_with_list(list);
+  }
+  {
+    LL2<int, ArrayWithFreeList> list;
+    test_with_list(list);
+  }
+}
+
+TEST_VM_F(ArrayWithFreeListTest, FreeingShouldReuseMemory) {
+  A alloc;
+  A::I i = alloc.allocate(1);
+  int* x = &alloc.at(i);
+  alloc.deallocate(i);
+  i = alloc.allocate(1);
+  int* y = &alloc.at(i);
+  EXPECT_EQ(x, y);
+}
+
+TEST_VM_F(ArrayWithFreeListTest, FreeingInTheMiddleWorks) {
+  A alloc;
+  A::I i0 = alloc.allocate(0);
+  A::I i1 = alloc.allocate(0);
+  A::I i2 = alloc.allocate(0);
+  int* p1 = &alloc.at(i1);
+  alloc.deallocate(i1);
+  A::I i3 = alloc.allocate(0);
+  EXPECT_EQ(p1, &alloc.at(i3));
+}
diff --git a/test/hotspot/gtest/nmt/test_nmt_memoryfiletracker.cpp b/test/hotspot/gtest/nmt/test_nmt_memoryfiletracker.cpp
index 018b9c49d54..d32c8192f2c 100644
--- a/test/hotspot/gtest/nmt/test_nmt_memoryfiletracker.cpp
+++ b/test/hotspot/gtest/nmt/test_nmt_memoryfiletracker.cpp
@@ -27,7 +27,7 @@
 #include "nmt/memTracker.hpp"
 #include "unittest.hpp"
 
-class MemoryFileTrackerTest : public testing::Test {
+class NMTMemoryFileTrackerTest : public testing::Test {
 public:
   size_t sz(int x) { return (size_t) x; }
   void basics() {
@@ -48,6 +48,6 @@ class MemoryFileTrackerTest : public testing::Test {
   };
 };
 
-TEST_VM_F(MemoryFileTrackerTest, Basics) {
+TEST_VM_F(NMTMemoryFileTrackerTest, Basics) {
   this->basics();
 }
diff --git a/test/hotspot/gtest/nmt/test_nmt_nativecallstackstorage.cpp b/test/hotspot/gtest/nmt/test_nmt_nativecallstackstorage.cpp
index 92c2dde2104..71e924b7b9d 100644
--- a/test/hotspot/gtest/nmt/test_nmt_nativecallstackstorage.cpp
+++ b/test/hotspot/gtest/nmt/test_nmt_nativecallstackstorage.cpp
@@ -29,9 +29,9 @@
 
 using NCSS = NativeCallStackStorage;
 
-class NativeCallStackStorageTest : public testing::Test {};
+class NMTNativeCallStackStorageTest : public testing::Test {};
 
-TEST_VM_F(NativeCallStackStorageTest, DoNotStoreStackIfNotDetailed) {
+TEST_VM_F(NMTNativeCallStackStorageTest, DoNotStoreStackIfNotDetailed) {
   NativeCallStack ncs{};
   NCSS ncss(false);
   NCSS::StackIndex si = ncss.push(ncs);
@@ -40,7 +40,7 @@ TEST_VM_F(NativeCallStackStorageTest, DoNotStoreStackIfNotDetailed) {
   EXPECT_TRUE(ncs_received.is_empty());
 }
 
-TEST_VM_F(NativeCallStackStorageTest, CollisionsReceiveDifferentIndexes) {
+TEST_VM_F(NMTNativeCallStackStorageTest, CollisionsReceiveDifferentIndexes) {
   constexpr const int nr_of_stacks = 10;
   NativeCallStack ncs_arr[nr_of_stacks];
   for (int i = 0; i < nr_of_stacks; i++) {
diff --git a/test/hotspot/gtest/nmt/test_nmt_treap.cpp b/test/hotspot/gtest/nmt/test_nmt_treap.cpp
index 9cd7f36aad6..6e04cfce1a8 100644
--- a/test/hotspot/gtest/nmt/test_nmt_treap.cpp
+++ b/test/hotspot/gtest/nmt/test_nmt_treap.cpp
@@ -28,7 +28,7 @@
 #include "runtime/os.hpp"
 #include "unittest.hpp"
 
-class TreapTest : public testing::Test {
+class NMTTreapTest : public testing::Test {
 public:
   struct Cmp {
     static int cmp(int a, int b) {
@@ -147,15 +147,15 @@ class TreapTest : public testing::Test {
   }
 };
 
-TEST_VM_F(TreapTest, InsertingDuplicatesResultsInOneValue) {
+TEST_VM_F(NMTTreapTest, InsertingDuplicatesResultsInOneValue) {
   this->inserting_duplicates_results_in_one_value();
 }
 
-TEST_VM_F(TreapTest, TreapOughtNotLeak) {
+TEST_VM_F(NMTTreapTest, TreapOughtNotLeak) {
   this->treap_ought_not_leak();
 }
 
-TEST_VM_F(TreapTest, TestVisitors) {
+TEST_VM_F(NMTTreapTest, TestVisitors) {
   { // Tests with 'default' ordering (ascending)
     TreapCHeap<int, int, Cmp> treap;
     using Node = TreapCHeap<int, int, Cmp>::TreapNode;
@@ -259,11 +259,11 @@ TEST_VM_F(TreapTest, TestVisitors) {
   }
 }
 
-TEST_VM_F(TreapTest, TestFind) {
+TEST_VM_F(NMTTreapTest, TestFind) {
   test_find();
 }
 
-TEST_VM_F(TreapTest, TestClosestLeq) {
+TEST_VM_F(NMTTreapTest, TestClosestLeq) {
   using Node = TreapCHeap<int, int, Cmp>::TreapNode;
   {
     TreapCHeap<int, int, Cmp> treap;
@@ -289,7 +289,7 @@ TEST_VM_F(TreapTest, TestClosestLeq) {
 
 #ifdef ASSERT
 
-TEST_VM_F(TreapTest, VerifyItThroughStressTest) {
+TEST_VM_F(NMTTreapTest, VerifyItThroughStressTest) {
   { // Repeatedly verify a treap of moderate size
     TreapCHeap<int, int, Cmp> treap;
     constexpr const int ten_thousand = 10000;
@@ -300,7 +300,9 @@ TEST_VM_F(TreapTest, VerifyItThroughStressTest) {
       } else {
         treap.remove(i);
       }
-      verify_it(treap);
+      if (i % 100 == 0) {
+        verify_it(treap);
+      }
     }
     for (int i = 0; i < ten_thousand; i++) {
       int r = os::random();
@@ -309,14 +311,16 @@ TEST_VM_F(TreapTest, VerifyItThroughStressTest) {
       } else {
         treap.remove(i);
       }
-      verify_it(treap);
+      if (i % 100 == 0) {
+        verify_it(treap);
+      }
     }
   }
   { // Make a very large treap and verify at the end
   struct Nothing {};
     TreapCHeap<int, Nothing, Cmp> treap;
-    constexpr const int five_million = 5000000;
-    for (int i = 0; i < five_million; i++) {
+    constexpr const int one_hundred_thousand = 100000;
+    for (int i = 0; i < one_hundred_thousand; i++) {
       treap.upsert(i, Nothing());
     }
     verify_it(treap);
diff --git a/test/hotspot/gtest/nmt/test_vmatree.cpp b/test/hotspot/gtest/nmt/test_vmatree.cpp
index a56bd08b0e0..1c1bc31b5b4 100644
--- a/test/hotspot/gtest/nmt/test_vmatree.cpp
+++ b/test/hotspot/gtest/nmt/test_vmatree.cpp
@@ -34,14 +34,14 @@ using Tree = VMATree;
 using Node = Tree::TreapNode;
 using NCS = NativeCallStackStorage;
 
-class VMATreeTest : public testing::Test {
+class NMTVMATreeTest : public testing::Test {
 public:
   NCS ncs;
   constexpr static const int si_len = 2;
   NCS::StackIndex si[si_len];
   NativeCallStack stacks[si_len];
 
-  VMATreeTest() : ncs(true) {
+  NMTVMATreeTest() : ncs(true) {
     stacks[0] = make_stack(0xA);
     stacks[1] = make_stack(0xB);
     si[0] = ncs.push(stacks[0]);
@@ -172,7 +172,7 @@ class VMATreeTest : public testing::Test {
 
 
 
-TEST_VM_F(VMATreeTest, OverlappingReservationsResultInTwoNodes) {
+TEST_VM_F(NMTVMATreeTest, OverlappingReservationsResultInTwoNodes) {
   VMATree::RegionData rd{si[0], mtTest};
   Tree tree;
   for (int i = 99; i >= 0; i--) {
@@ -182,7 +182,7 @@ TEST_VM_F(VMATreeTest, OverlappingReservationsResultInTwoNodes) {
 }
 
 // Low-level tests inspecting the state of the tree.
-TEST_VM_F(VMATreeTest, LowLevel) {
+TEST_VM_F(NMTVMATreeTest, LowLevel) {
   adjacent_2_nodes(VMATree::empty_regiondata);
   remove_all_leaves_empty_tree(VMATree::empty_regiondata);
   commit_middle(VMATree::empty_regiondata);
@@ -268,7 +268,7 @@ TEST_VM_F(VMATreeTest, LowLevel) {
 }
 
 // Tests for summary accounting
-TEST_VM_F(VMATreeTest, SummaryAccounting) {
+TEST_VM_F(NMTVMATreeTest, SummaryAccounting) {
   { // Fully enclosed re-reserving works correctly.
     Tree::RegionData rd(NCS::StackIndex(), mtTest);
     Tree::RegionData rd2(NCS::StackIndex(), mtNMT);
@@ -358,7 +358,7 @@ struct SimpleVMATracker : public CHeapObj<mtTest> {
     }
   };
   // Page (4KiB) granular array
-  static constexpr const size_t num_pages = 1024 * 512;
+  static constexpr const size_t num_pages = 1024 * 4;
   Info pages[num_pages];
 
   SimpleVMATracker()
@@ -416,7 +416,7 @@ struct SimpleVMATracker : public CHeapObj<mtTest> {
 
 constexpr const size_t SimpleVMATracker::num_pages;
 
-TEST_VM_F(VMATreeTest, TestConsistencyWithSimpleTracker) {
+TEST_VM_F(NMTVMATreeTest, TestConsistencyWithSimpleTracker) {
   // In this test we use ASSERT macros from gtest instead of EXPECT
   // as any error will propagate and become larger as the test progresses.
   SimpleVMATracker* tr = new SimpleVMATracker();
@@ -434,8 +434,6 @@ TEST_VM_F(VMATreeTest, TestConsistencyWithSimpleTracker) {
   const MEMFLAGS candidate_flags[candidates_len_flags] = {
     mtNMT,
     mtTest,
-    mtGC,
-    mtCompiler
   };
 
   const int operation_count = 100000; // One hundred thousand
diff --git a/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp b/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp
index aa1d2a19b28..0f054a3bd72 100644
--- a/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp
+++ b/test/hotspot/gtest/runtime/test_cgroupSubsystem_linux.cpp
@@ -78,6 +78,9 @@ class TestController : public CgroupController {
   char* subsystem_path() override {
     return _path;
   };
+  bool is_read_only() override {
+    return true; // doesn't matter
+  }
 };
 
 static void fill_file(const char* path, const char* content) {
@@ -436,7 +439,8 @@ TEST(cgroupTest, set_cgroupv1_subsystem_path) {
                             &container_engine };
   for (int i = 0; i < length; i++) {
     CgroupV1Controller* ctrl = new CgroupV1Controller( (char*)testCases[i]->root_path,
-                                                       (char*)testCases[i]->mount_path);
+                                                       (char*)testCases[i]->mount_path,
+                                                       true /* read-only mount */);
     ctrl->set_subsystem_path((char*)testCases[i]->cgroup_path);
     ASSERT_STREQ(testCases[i]->expected_path, ctrl->subsystem_path());
   }
@@ -460,7 +464,8 @@ TEST(cgroupTest, set_cgroupv2_subsystem_path) {
                             &sub_path };
   for (int i = 0; i < length; i++) {
     CgroupV2Controller* ctrl = new CgroupV2Controller( (char*)testCases[i]->mount_path,
-                                                       (char*)testCases[i]->cgroup_path);
+                                                       (char*)testCases[i]->cgroup_path,
+                                                       true /* read-only mount */);
     ASSERT_STREQ(testCases[i]->expected_path, ctrl->subsystem_path());
   }
 }
diff --git a/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp b/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp
index d4959cfa008..2ffef1e211f 100644
--- a/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp
+++ b/test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp
@@ -196,6 +196,42 @@ class CommittedVirtualMemoryTest {
 
     os::release_memory(base, size);
   }
+
+  static void test_committed_in_range(size_t num_pages, size_t pages_to_touch) {
+    bool result;
+    size_t committed_size;
+    address committed_start;
+    size_t index;
+
+    const size_t page_sz = os::vm_page_size();
+    const size_t size = num_pages * page_sz;
+
+    char* base = os::reserve_memory(size, !ExecMem, mtTest);
+    ASSERT_NE(base, (char*)nullptr);
+
+    result = os::commit_memory(base, size, !ExecMem);
+    ASSERT_TRUE(result);
+
+    result = os::committed_in_range((address)base, size, committed_start, committed_size);
+    ASSERT_FALSE(result);
+
+    // Touch pages
+    for (index = 0; index < pages_to_touch; index ++) {
+      base[index * page_sz] = 'a';
+    }
+
+    result = os::committed_in_range((address)base, size, committed_start, committed_size);
+    ASSERT_TRUE(result);
+    ASSERT_EQ(pages_to_touch * page_sz, committed_size);
+    ASSERT_EQ(committed_start, (address)base);
+
+    os::uncommit_memory(base, size, false);
+
+    result = os::committed_in_range((address)base, size, committed_start, committed_size);
+    ASSERT_FALSE(result);
+
+    os::release_memory(base, size);
+  }
 };
 
 TEST_VM(CommittedVirtualMemoryTracker, test_committed_virtualmemory_region) {
@@ -214,3 +250,10 @@ TEST_VM(CommittedVirtualMemoryTracker, test_committed_virtualmemory_region) {
   }
 
 }
+
+#if !defined(_WINDOWS) && !defined(_AIX)
+TEST_VM(CommittedVirtualMemory, test_committed_in_range){
+  CommittedVirtualMemoryTest::test_committed_in_range(1024, 1024);
+  CommittedVirtualMemoryTest::test_committed_in_range(2, 1);
+}
+#endif
diff --git a/test/hotspot/gtest/runtime/test_os.cpp b/test/hotspot/gtest/runtime/test_os.cpp
index 55d30349ee5..70f739ce922 100644
--- a/test/hotspot/gtest/runtime/test_os.cpp
+++ b/test/hotspot/gtest/runtime/test_os.cpp
@@ -167,82 +167,95 @@ TEST_VM_ASSERT_MSG(os, page_size_for_region_with_zero_min_pages,
 }
 #endif
 
-static void do_test_print_hex_dump(address addr, size_t len, int unitsize, const char* expected) {
-  char buf[256];
+#ifndef AIX
+// Test relies on the ability to protect memory allocated with os::reserve_memory. AIX may not be able
+// to do that (mprotect won't work on System V shm).
+static void do_test_print_hex_dump(const_address from, const_address to, int unitsize, int bytes_per_line,
+                                   const_address logical_start, const char* expected) {
+  char buf[2048];
   buf[0] = '\0';
   stringStream ss(buf, sizeof(buf));
-  os::print_hex_dump(&ss, addr, addr + len, unitsize);
-  // tty->print_cr("expected: %s", expected);
-  // tty->print_cr("result: %s", buf);
-  EXPECT_THAT(buf, HasSubstr(expected));
+  os::print_hex_dump(&ss, from, to, unitsize, /* print_ascii=*/true, bytes_per_line, logical_start);
+  EXPECT_STREQ(buf, expected);
 }
 
 TEST_VM(os, test_print_hex_dump) {
-  const char* pattern [4] = {
-#ifdef VM_LITTLE_ENDIAN
-    "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f",
-    "0100 0302 0504 0706 0908 0b0a 0d0c 0f0e",
-    "03020100 07060504 0b0a0908 0f0e0d0c",
-    "0706050403020100 0f0e0d0c0b0a0908"
+
+#ifdef _LP64
+#define ADDRESS1 "0x0000aaaaaaaaaa00"
+#define ADDRESS2 "0x0000aaaaaaaaaa20"
+#define ADDRESS3 "0x0000aaaaaaaaaa40"
 #else
-    "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f",
-    "0001 0203 0405 0607 0809 0a0b 0c0d 0e0f",
-    "00010203 04050607 08090a0b 0c0d0e0f",
-    "0001020304050607 08090a0b0c0d0e0f"
+#define ADDRESS1 "0xaaaaaa00"
+#define ADDRESS2 "0xaaaaaa20"
+#define ADDRESS3 "0xaaaaaa40"
 #endif
-  };
 
-  const char* pattern_not_readable [4] = {
-    "?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??",
-    "???? ???? ???? ???? ???? ???? ???? ????",
-    "???????? ???????? ???????? ????????",
-    "???????????????? ????????????????"
-  };
+#define ASCII_1  "....#.jdk/internal/loader/Native"
+#define ASCII_2  "Libraries......."
+
+#define PAT_1 ADDRESS1 ":   ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??\n" \
+              ADDRESS2 ":   ff ff e0 dc 23 00 6a 64 6b 2f 69 6e 74 65 72 6e 61 6c 2f 6c 6f 61 64 65 72 2f 4e 61 74 69 76 65   " ASCII_1 "\n" \
+              ADDRESS3 ":   4c 69 62 72 61 72 69 65 73 00 00 00 00 00 00 00                                                   " ASCII_2 "\n"
 
-  // On AIX, zero page is readable.
-  address unreadable =
-#ifdef AIX
-    (address) 0xFFFFFFFFFFFF0000ULL;
+#ifdef VM_LITTLE_ENDIAN
+#define PAT_2 ADDRESS1 ":   ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????\n" \
+              ADDRESS2 ":   ffff dce0 0023 646a 2f6b 6e69 6574 6e72 6c61 6c2f 616f 6564 2f72 614e 6974 6576   " ASCII_1 "\n" \
+              ADDRESS3 ":   694c 7262 7261 6569 0073 0000 0000 0000                                           " ASCII_2 "\n"
+
+#define PAT_4 ADDRESS1 ":   ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????\n" \
+              ADDRESS2 ":   dce0ffff 646a0023 6e692f6b 6e726574 6c2f6c61 6564616f 614e2f72 65766974   " ASCII_1 "\n" \
+              ADDRESS3 ":   7262694c 65697261 00000073 00000000                                       " ASCII_2 "\n"
+
+#define PAT_8 ADDRESS1 ":   ???????????????? ???????????????? ???????????????? ????????????????\n" \
+              ADDRESS2 ":   646a0023dce0ffff 6e7265746e692f6b 6564616f6c2f6c61 65766974614e2f72   " ASCII_1 "\n" \
+              ADDRESS3 ":   656972617262694c 0000000000000073                                     " ASCII_2 "\n"
 #else
-    (address) 0
-#endif
-    ;
+#define PAT_2 ADDRESS1 ":   ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????\n" \
+              ADDRESS2 ":   ffff e0dc 2300 6a64 6b2f 696e 7465 726e 616c 2f6c 6f61 6465 722f 4e61 7469 7665   " ASCII_1 "\n" \
+              ADDRESS3 ":   4c69 6272 6172 6965 7300 0000 0000 0000                                           " ASCII_2 "\n"
 
-  ResourceMark rm;
-  char buf[64];
-  stringStream ss(buf, sizeof(buf));
-  outputStream* out = &ss;
-//  outputStream* out = tty; // enable for printout
-
-  // Test dumping unreadable memory
-  // Exclude test for Windows for now, since it needs SEH handling to work which cannot be
-  // guaranteed when we call directly into VM code. (see JDK-8220220)
-#ifndef _WIN32
-  do_test_print_hex_dump(unreadable, 100, 1, pattern_not_readable[0]);
-  do_test_print_hex_dump(unreadable, 100, 2, pattern_not_readable[1]);
-  do_test_print_hex_dump(unreadable, 100, 4, pattern_not_readable[2]);
-  do_test_print_hex_dump(unreadable, 100, 8, pattern_not_readable[3]);
+#define PAT_4 ADDRESS1 ":   ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????\n" \
+              ADDRESS2 ":   ffffe0dc 23006a64 6b2f696e 7465726e 616c2f6c 6f616465 722f4e61 74697665   " ASCII_1 "\n" \
+              ADDRESS3 ":   4c696272 61726965 73000000 00000000                                       " ASCII_2 "\n"
+
+#define PAT_8 ADDRESS1 ":   ???????????????? ???????????????? ???????????????? ????????????????\n" \
+              ADDRESS2 ":   ffffe0dc23006a64 6b2f696e7465726e 616c2f6c6f616465 722f4e6174697665   " ASCII_1 "\n" \
+              ADDRESS3 ":   4c69627261726965 7300000000000000                                     " ASCII_2 "\n"
 #endif
 
-  // Test dumping readable memory
-  address arr = (address)os::malloc(100, mtInternal);
-  for (u1 c = 0; c < 100; c++) {
-    arr[c] = c;
-  }
+  constexpr uint8_t bytes[] = {
+    0xff, 0xff, 0xe0, 0xdc, 0x23, 0x00, 0x6a, 0x64, 0x6b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+    0x61, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65,
+    0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+  // two pages, first one protected.
+  const size_t ps = os::vm_page_size();
+  char* two_pages = os::reserve_memory(ps * 2, false, mtTest);
+  os::commit_memory(two_pages, ps * 2, false);
+  os::protect_memory(two_pages, ps, os::MEM_PROT_NONE, true);
+
+  memcpy(two_pages + ps, bytes, sizeof(bytes));
 
-  // properly aligned
-  do_test_print_hex_dump(arr, 100, 1, pattern[0]);
-  do_test_print_hex_dump(arr, 100, 2, pattern[1]);
-  do_test_print_hex_dump(arr, 100, 4, pattern[2]);
-  do_test_print_hex_dump(arr, 100, 8, pattern[3]);
+  // print
+  const const_address from = (const_address) two_pages + ps - 32;
+  const const_address to = (const_address) from + 32 + sizeof(bytes);
+  const const_address logical_start = (const_address) LP64_ONLY(0xAAAAAAAAAA00ULL) NOT_LP64(0xAAAAAA00ULL);
 
-  // Not properly aligned. Should automatically down-align by unitsize
-  do_test_print_hex_dump(arr + 1, 100, 2, pattern[1]);
-  do_test_print_hex_dump(arr + 1, 100, 4, pattern[2]);
-  do_test_print_hex_dump(arr + 1, 100, 8, pattern[3]);
+  do_test_print_hex_dump(from, to, 1, 32, logical_start, PAT_1);
+  do_test_print_hex_dump(from, to, 2, 32, logical_start, PAT_2);
+  do_test_print_hex_dump(from, to, 4, 32, logical_start, PAT_4);
+  do_test_print_hex_dump(from, to, 8, 32, logical_start, PAT_8);
 
-  os::free(arr);
+  // unaligned printing, should align to next lower unitsize
+  do_test_print_hex_dump(from + 1, to, 2, 32, logical_start, PAT_2);
+  do_test_print_hex_dump(from + 1, to, 4, 32, logical_start, PAT_4);
+  do_test_print_hex_dump(from + 1, to, 8, 32, logical_start, PAT_8);
+
+  os::release_memory(two_pages, ps * 2);
 }
+#endif // not AIX
 
 //////////////////////////////////////////////////////////////////////////////
 // Test os::vsnprintf and friends.
@@ -954,18 +967,6 @@ TEST_VM(os, reserve_at_wish_address_shall_not_replace_mappings_largepages) {
   }
 }
 
-#ifdef AIX
-// On Aix, we should fail attach attempts not aligned to segment boundaries (256m)
-TEST_VM(os, aix_reserve_at_non_shmlba_aligned_address) {
-  if (Use64KPages) {
-    char* p = os::attempt_reserve_memory_at((char*)0x1f00000, M);
-    ASSERT_EQ(p, nullptr); // should have failed
-    p = os::attempt_reserve_memory_at((char*)((64 * G) + M), M);
-    ASSERT_EQ(p, nullptr); // should have failed
-  }
-}
-#endif // AIX
-
 TEST_VM(os, vm_min_address) {
   size_t s = os::vm_min_address();
   ASSERT_GE(s, M);
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/CmdExecutor.java b/test/hotspot/gtest/runtime/test_os_aix.cpp
similarity index 52%
rename from test/hotspot/jtreg/vmTestbase/vm/share/process/CmdExecutor.java
rename to test/hotspot/gtest/runtime/test_os_aix.cpp
index bea1bd8282b..e8b06b3b4bc 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/CmdExecutor.java
+++ b/test/hotspot/gtest/runtime/test_os_aix.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -20,44 +20,27 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.process;
 
-import java.io.IOException;
-import java.util.Collection;
+#include "precompiled.hpp"
 
-public class CmdExecutor extends ProcessExecutor {
-    private final StringBuilder cmd = new StringBuilder();
-    @Override
-    public void clearArgs() {
-        cmd.setLength(0);
-    }
+#ifdef AIX
 
-    @Override
-    public void addArg(String arg) {
-        cmd.append(" " + arg);
-    }
+#include "runtime/os.inline.hpp"
+#include "utilities/debug.hpp"
+#include "utilities/globalDefinitions.hpp"
+#include "unittest.hpp"
 
-    @Override
-    public void addArgs(String[] args) {
-        for (String arg : args) {
-            addArg(arg);
-        }
-    }
-
-    @Override
-    public void addArgs(Collection<String> args) {
-        for (String arg : args) {
-            addArg(arg);
-        }
-    }
-
-    @Override
-    protected Process createProcess() throws IOException {
-        return Runtime.getRuntime().exec(cmd.toString());
-    }
-
-    @Override
-    public String toString() {
-        return cmd.toString();
-    }
+// On Aix, when using shmget() in os::attempt_reserve_memory_at() we should fail with attach
+// attempts not aligned to shmget() segment boundaries (256m)
+// But shmget() is only used in cases we want to have 64K pages and mmap() does not provide it.
+TEST_VM(os_aix, aix_reserve_at_non_shmlba_aligned_address) {
+  if (os::vm_page_size() != 4*K && !os::Aix::supports_64K_mmap_pages()) {
+    // With this condition true shmget() is used inside
+    char* p = os::attempt_reserve_memory_at((char*)0x1f00000, M);
+    ASSERT_EQ(p, nullptr); // should have failed
+    p = os::attempt_reserve_memory_at((char*)((64 * G) + M), M);
+    ASSERT_EQ(p, nullptr); // should have failed
+  }
 }
+
+#endif // AIX
diff --git a/test/hotspot/gtest/utilities/test_ostream.cpp b/test/hotspot/gtest/utilities/test_ostream.cpp
index 270ba59212a..5d25c51f3f9 100644
--- a/test/hotspot/gtest/utilities/test_ostream.cpp
+++ b/test/hotspot/gtest/utilities/test_ostream.cpp
@@ -104,6 +104,56 @@ TEST_VM(ostream, bufferedStream_dynamic_small) {
   }
 }
 
+static void test_autoindent(bool on) {
+  stringStream ss;
+  const bool prior = ss.set_autoindent(on);
+  EXPECT_FALSE(prior);
+  {
+    streamIndentor si(&ss, 5);
+    ss.print("ABC");
+    ss.print("DEF");
+    ss.cr();
+    ss.print_cr("0123");
+    {
+      streamIndentor si(&ss, 5);
+      ss.print_cr("4567");
+      ss.print_raw("89AB");
+      ss.print_raw("CDEXXXX", 3);
+      ss.print_raw_cr("XYZ");
+    }
+    ss.print("%u", 100);
+    ss.print_raw("KB");
+    ss.cr();
+  }
+  ss.print("end");
+
+  if (on) {
+    EXPECT_STREQ(ss.base(),
+        "     ABCDEF\n"
+        "     0123\n"
+        "          4567\n"
+        "          89ABCDEXYZ\n"
+        "     100KB\n"
+        "end"
+    );
+  } else {
+    // no autoindent: calls should work as always without indentation
+    EXPECT_STREQ(ss.base(),
+        "ABCDEF\n"
+        "0123\n"
+        "4567\n"
+        "89ABCDEXYZ\n"
+        "100KB\n"
+        "end"
+    );
+  }
+  bool prior2 = ss.set_autoindent(prior);
+  EXPECT_EQ(prior2, on);
+}
+
+TEST_VM(ostream, autoindent_on)  { test_autoindent(true);  }
+TEST_VM(ostream, autoindent_off) { test_autoindent(false); }
+
 /* Activate to manually test bufferedStream dynamic cap.
 
 TEST_VM(ostream, bufferedStream_dynamic_large) {
diff --git a/test/hotspot/gtest/utilities/test_quicksort.cpp b/test/hotspot/gtest/utilities/test_quicksort.cpp
index 2ce18486e3e..14614110493 100644
--- a/test/hotspot/gtest/utilities/test_quicksort.cpp
+++ b/test/hotspot/gtest/utilities/test_quicksort.cpp
@@ -48,23 +48,11 @@ static bool compare_arrays(int* actual, int* expected, size_t length) {
 }
 
 template <class C>
-static bool sort_and_compare(int* arrayToSort, int* expectedResult, size_t length, C comparator, bool idempotent = false) {
-  QuickSort::sort(arrayToSort, length, comparator, idempotent);
+static bool sort_and_compare(int* arrayToSort, int* expectedResult, size_t length, C comparator) {
+  QuickSort::sort(arrayToSort, length, comparator);
   return compare_arrays(arrayToSort, expectedResult, length);
 }
 
-static int test_even_odd_comparator(int a, int b) {
-  bool a_is_odd = ((a % 2) == 1);
-  bool b_is_odd = ((b % 2) == 1);
-  if (a_is_odd == b_is_odd) {
-    return 0;
-  }
-  if (a_is_odd) {
-    return -1;
-  }
-  return 1;
-}
-
 extern "C" {
   static int test_stdlib_comparator(const void* a, const void* b) {
     int ai = *(int*)a;
@@ -126,50 +114,6 @@ TEST(QuickSort, quicksort) {
     int expected_array[] = {6,7,8,8,9,9,11,11,13,21,22,24,24,25,27,27,28,31,32,39,40,40,40,41,44,46,51,55,56,59,64,64,65,69,71,74,75,75,76,78,81,82};
     EXPECT_TRUE(sort_and_compare(test_array, expected_array, 42, test_comparator));
   }
-  {
-    int test_array[] = {2,8,1,4};
-    int expected_array[] = {1,4,2,8};
-    EXPECT_TRUE(sort_and_compare(test_array, expected_array, 4, test_even_odd_comparator));
-  }
-}
-
-TEST(QuickSort, idempotent) {
-  {
-    // An array of lenght 3 is only sorted by find_pivot. Make sure that it is idempotent.
-    int test_array[] = {1, 4, 8};
-    int expected_array[] = {1, 4, 8};
-    EXPECT_TRUE(sort_and_compare(test_array, expected_array, 3, test_even_odd_comparator, true));
-  }
-  {
-    int test_array[] = {1, 7, 9, 4, 8, 2};
-    int expected_array[] = {1, 7, 9, 4, 8, 2};
-    EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true));
-  }
-  {
-    int test_array[] = {1, 9, 7, 4, 2, 8};
-    int expected_array[] = {1, 9, 7, 4, 2, 8};
-    EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true));
-  }
-  {
-    int test_array[] = {7, 9, 1, 2, 8, 4};
-    int expected_array[] = {7, 9, 1, 2, 8, 4};
-    EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true));
-  }
-  {
-    int test_array[] = {7, 1, 9, 2, 4, 8};
-    int expected_array[] = {7, 1, 9, 2, 4, 8};
-    EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true));
-  }
-  {
-    int test_array[] = {9, 1, 7, 4, 8, 2};
-    int expected_array[] = {9, 1, 7, 4, 8, 2};
-    EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true));
-  }
-  {
-    int test_array[] = {9, 7, 1, 4, 2, 8};
-    int expected_array[] = {9, 7, 1, 4, 2, 8};
-    EXPECT_TRUE(sort_and_compare(test_array, expected_array, 6, test_even_odd_comparator, true));
-  }
 }
 
 TEST(QuickSort, random) {
@@ -186,18 +130,6 @@ TEST(QuickSort, random) {
     // Compare sorting to stdlib::qsort()
     qsort(expected_array, length, sizeof(int), test_stdlib_comparator);
     EXPECT_TRUE(sort_and_compare(test_array, expected_array, length, test_comparator));
-
-    // Make sure sorting is idempotent.
-    // Both test_array and expected_array are sorted by the test_comparator.
-    // Now sort them once with the test_even_odd_comparator. Then sort the
-    // test_array one more time with test_even_odd_comparator and verify that
-    // it is idempotent.
-    QuickSort::sort(expected_array, length, test_even_odd_comparator, true);
-    QuickSort::sort(test_array, length, test_even_odd_comparator, true);
-    EXPECT_TRUE(compare_arrays(test_array, expected_array, length));
-    QuickSort::sort(test_array, length, test_even_odd_comparator, true);
-    EXPECT_TRUE(compare_arrays(test_array, expected_array, length));
-
     FREE_C_HEAP_ARRAY(int, test_array);
     FREE_C_HEAP_ARRAY(int, expected_array);
   }
diff --git a/test/hotspot/jtreg/ProblemList-Virtual.txt b/test/hotspot/jtreg/ProblemList-Virtual.txt
index e7627be7b8c..06110ddcbc1 100644
--- a/test/hotspot/jtreg/ProblemList-Virtual.txt
+++ b/test/hotspot/jtreg/ProblemList-Virtual.txt
@@ -86,6 +86,11 @@ vmTestbase/nsk/jdi/ExceptionEvent/catchLocation/location002/TestDescription.java
 
 vmTestbase/nsk/jdi/VMOutOfMemoryException/VMOutOfMemoryException001/VMOutOfMemoryException001.java 8285417 generic-all
 
+###
+# Fails on Windows because of additional memory allocation.
+
+gc/g1/TestMixedGCLiveThreshold.java#25percent 8334759 windows-x64
+
 ##########
 ## Tests incompatible with  with virtual test thread factory.
 ## There is no goal to run all test with virtual test thread factory.
diff --git a/test/hotspot/jtreg/ProblemList-Xcomp.txt b/test/hotspot/jtreg/ProblemList-Xcomp.txt
index 2364d601cd7..9a52a731039 100644
--- a/test/hotspot/jtreg/ProblemList-Xcomp.txt
+++ b/test/hotspot/jtreg/ProblemList-Xcomp.txt
@@ -28,8 +28,6 @@
 #############################################################################
 
 vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TestDescription.java 8287324 generic-all
-vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java 8205957 generic-all
-vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java 8205957 linux-x64,windows-x64
 vmTestbase/nsk/jvmti/scenarios/sampling/SP07/sp07t002/TestDescription.java 8245680 windows-x64
 
 vmTestbase/vm/mlvm/mixed/stress/regression/b6969574/INDIFY_Test.java 8265295 linux-x64,windows-x64
diff --git a/test/hotspot/jtreg/ProblemList-generational-zgc.txt b/test/hotspot/jtreg/ProblemList-generational-zgc.txt
index 4d5e985c0a6..db8182641ac 100644
--- a/test/hotspot/jtreg/ProblemList-generational-zgc.txt
+++ b/test/hotspot/jtreg/ProblemList-generational-zgc.txt
@@ -115,5 +115,3 @@ serviceability/sa/sadebugd/RunCommandOnServerTest.java        8307393   generic-
 serviceability/sa/sadebugd/SADebugDTest.java                  8307393   generic-all
 
 vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java        8289582   windows-x64
-
-vmTestbase/nsk/sysdict/vm/stress/chain/chain007/chain007.java 8298991 linux-x64
diff --git a/test/hotspot/jtreg/ProblemList-zgc.txt b/test/hotspot/jtreg/ProblemList-zgc.txt
index d7d600aad49..1afe56c99f8 100644
--- a/test/hotspot/jtreg/ProblemList-zgc.txt
+++ b/test/hotspot/jtreg/ProblemList-zgc.txt
@@ -46,5 +46,3 @@ serviceability/sa/TestSysProps.java                           8302055   generic-
 serviceability/sa/TestHeapDumpForInvokeDynamic.java           8315646   generic-all
 
 vmTestbase/gc/gctests/MemoryEaterMT/MemoryEaterMT.java        8289582   windows-x64
-
-vmTestbase/nsk/sysdict/vm/stress/chain/chain007/chain007.java 8298991 linux-x64
diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt
index b6cc0489485..76dc9f6f033 100644
--- a/test/hotspot/jtreg/ProblemList.txt
+++ b/test/hotspot/jtreg/ProblemList.txt
@@ -51,18 +51,6 @@ compiler/cpuflags/TestAESIntrinsicsOnSupportedConfig.java 8190680 generic-all
 compiler/runtime/Test8168712.java 8211769,8211771 generic-ppc64,generic-ppc64le,linux-s390x
 compiler/loopopts/TestUnreachableInnerLoop.java 8288981 linux-s390x
 
-compiler/rtm/locking/TestRTMAbortRatio.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestRTMAbortThreshold.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestRTMLockingCalculationDelay.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestRTMLockingThreshold.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestRTMSpinLoopCount.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestUseRTMDeopt.java 8183263 generic-x64,generic-i586
-compiler/rtm/locking/TestUseRTMXendForLockBusy.java 8183263 generic-x64,generic-i586
-compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java 8183263 generic-x64,generic-i586
-
 compiler/c2/Test8004741.java 8235801 generic-all
 compiler/c2/irTests/TestDuplicateBackedge.java 8318904 generic-all
 
@@ -79,10 +67,10 @@ compiler/floatingpoint/TestSubnormalDouble.java 8317810 generic-i586
 
 compiler/startup/StartupOutput.java 8326615 generic-x64
 
-compiler/rangechecks/TestArrayAccessAboveRCAfterRCCastIIEliminated.java 8332369 generic-all
-
 compiler/codecache/CodeCacheFullCountTest.java 8332954 generic-all
 
+compiler/vectorization/TestFloat16VectorConvChain.java 8335860 generic-all
+
 #############################################################################
 
 # :hotspot_gc
@@ -91,12 +79,18 @@ gc/epsilon/TestMemoryMXBeans.java 8206434 generic-all
 gc/g1/humongousObjects/objectGraphTest/TestObjectGraphAfterGC.java 8156755 generic-all
 gc/g1/logging/TestG1LoggingFailure.java 8169634 generic-all
 gc/g1/humongousObjects/TestHeapCounters.java 8178918 generic-all
-gc/parallel/TestAlwaysPreTouchBehavior.java 8325218 linux-all
 gc/TestAllocHumongousFragment.java#adaptive 8298781 generic-all
 gc/TestAllocHumongousFragment.java#aggressive 8298781 generic-all
 gc/TestAllocHumongousFragment.java#iu-aggressive 8298781 generic-all
 gc/TestAllocHumongousFragment.java#g1 8298781 generic-all
 gc/TestAllocHumongousFragment.java#static 8298781 generic-all
+gc/TestAlwaysPreTouchBehavior.java#ParallelCollector 8334513 generic-all
+gc/TestAlwaysPreTouchBehavior.java#SerialCollector 8334513 generic-all
+gc/TestAlwaysPreTouchBehavior.java#Shenandoah 8334513 generic-all
+gc/TestAlwaysPreTouchBehavior.java#G1 8334513 generic-all
+gc/TestAlwaysPreTouchBehavior.java#ZGenerational 8334513 generic-all
+gc/TestAlwaysPreTouchBehavior.java#ZSinglegen 8334513 generic-all
+gc/TestAlwaysPreTouchBehavior.java#Epsilon 8334513 generic-all
 gc/stress/gclocker/TestExcessGCLockerCollections.java 8229120 generic-all
 
 #############################################################################
@@ -116,12 +110,6 @@ runtime/StackGuardPages/TestStackGuardPagesNative.java 8303612 linux-all
 runtime/ErrorHandling/TestDwarf.java#checkDecoder 8305489 linux-all
 runtime/ErrorHandling/MachCodeFramesInErrorFile.java 8313315 linux-ppc64le
 runtime/cds/appcds/customLoader/HelloCustom_JFR.java 8241075 linux-all,windows-x64
-runtime/Thread/TestAlwaysPreTouchStacks.java 8324781 linux-all
-
-applications/jcstress/accessAtomic.java 8325984 generic-all
-applications/jcstress/acqrel.java 8325984 generic-all
-applications/jcstress/atomicity.java 8325984 generic-all
-applications/jcstress/coherence.java 8325984 generic-all
 
 applications/jcstress/copy.java 8229852 linux-all
 
@@ -139,15 +127,16 @@ serviceability/sa/TestRevPtrsForInvokeDynamic.java 8241235 generic-all
 serviceability/jvmti/ModuleAwareAgents/ThreadStart/MAAThreadStart.java 8225354 windows-all
 serviceability/jvmti/vthread/GetThreadStateMountedTest/GetThreadStateMountedTest.java 8318090,8318729 generic-all
 serviceability/jvmti/vthread/GetSetLocalTest/GetSetLocalTest.java 8286836 generic-all
+serviceability/jvmti/vthread/CarrierThreadEventNotification/CarrierThreadEventNotification.java 8333681 generic-all
 serviceability/dcmd/gc/RunFinalizationTest.java 8227120 generic-all
 
-serviceability/sa/ClhsdbCDSCore.java 8267433 macosx-x64
-serviceability/sa/ClhsdbFindPC.java#xcomp-core 8267433 macosx-x64
-serviceability/sa/ClhsdbFindPC.java#no-xcomp-core 8267433 macosx-x64
-serviceability/sa/ClhsdbPmap.java#core 8267433 macosx-x64
-serviceability/sa/ClhsdbPstack.java#core 8267433 macosx-x64
-serviceability/sa/TestJmapCore.java 8267433 macosx-x64
-serviceability/sa/TestJmapCoreMetaspace.java 8267433 macosx-x64
+serviceability/sa/ClhsdbCDSCore.java              8267433,8318754 macosx-x64,macosx-aarch64
+serviceability/sa/ClhsdbFindPC.java#xcomp-core    8267433,8318754 macosx-x64,macosx-aarch64
+serviceability/sa/ClhsdbFindPC.java#no-xcomp-core 8267433,8318754 macosx-x64,macosx-aarch64
+serviceability/sa/ClhsdbPmap.java#core            8267433,8318754 macosx-x64,macosx-aarch64
+serviceability/sa/ClhsdbPstack.java#core          8267433,8318754 macosx-x64,macosx-aarch64
+serviceability/sa/TestJmapCore.java               8267433,8318754 macosx-x64,macosx-aarch64
+serviceability/sa/TestJmapCoreMetaspace.java      8267433,8318754 macosx-x64,macosx-aarch64
 
 serviceability/attach/ConcAttachTest.java 8290043 linux-all
 
@@ -185,7 +174,7 @@ vmTestbase/vm/mlvm/meth/stress/jdi/breakpointInCompiledCode/Test.java 8257761 ge
 vmTestbase/vm/mlvm/indy/func/jvmti/mergeCP_indy2none_a/TestDescription.java 8013267 generic-all
 vmTestbase/vm/mlvm/indy/func/jvmti/mergeCP_indy2manyDiff_b/TestDescription.java 8013267 generic-all
 vmTestbase/vm/mlvm/indy/func/jvmti/mergeCP_indy2manySame_b/TestDescription.java 8013267 generic-all
-vmTestbase/vm/mlvm/meth/stress/compiler/deoptimize/Test.java#id1 8325905 generic-all
+vmTestbase/vm/mlvm/meth/stress/compiler/deoptimize/Test.java#id1 8324756 generic-all
 
 vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java 7199837 generic-all
 
diff --git a/test/hotspot/jtreg/TEST.ROOT b/test/hotspot/jtreg/TEST.ROOT
index 4c9a28a3076..5f4c52186a7 100644
--- a/test/hotspot/jtreg/TEST.ROOT
+++ b/test/hotspot/jtreg/TEST.ROOT
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2024, 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
@@ -90,7 +90,7 @@ requires.properties= \
     jdk.containerized
 
 # Minimum jtreg version
-requiredVersion=7.3.1+1
+requiredVersion=7.4+1
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../../ notation to reach them
diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups
index 78db6d01775..101cbe76afd 100644
--- a/test/hotspot/jtreg/TEST.groups
+++ b/test/hotspot/jtreg/TEST.groups
@@ -254,7 +254,6 @@ tier2_compiler = \
   compiler/parsing/ \
   compiler/rangechecks/ \
   compiler/reflection/ \
-  compiler/rtm/ \
   compiler/runtime/Test6826736.java \
   compiler/stable/ \
   compiler/stringopts/ \
@@ -449,6 +448,7 @@ hotspot_appcds_dynamic = \
  -runtime/cds/appcds/lambdaForm/DefaultClassListLFInvokers.java \
  -runtime/cds/appcds/methodHandles \
  -runtime/cds/appcds/sharedStrings \
+ -runtime/cds/appcds/resolvedConstants \
  -runtime/cds/appcds/ArchiveRelocationTest.java \
  -runtime/cds/appcds/BadBSM.java \
  -runtime/cds/appcds/DumpClassList.java \
diff --git a/test/hotspot/jtreg/applications/ctw/modules/generate.bash b/test/hotspot/jtreg/applications/ctw/modules/generate.bash
index 56e191e7af1..935503484b9 100644
--- a/test/hotspot/jtreg/applications/ctw/modules/generate.bash
+++ b/test/hotspot/jtreg/applications/ctw/modules/generate.bash
@@ -1,6 +1,6 @@
 #!/bin/bash
 #
-#  Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+#  Copyright (c) 2017, 2024, 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,7 @@ do
     echo creating $file for $module...
     cat > $file <<EOF
 /*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_incubator_vector.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_incubator_vector.java
new file mode 100644
index 00000000000..4a933544778
--- /dev/null
+++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_incubator_vector.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024, 2024, 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
+ * @summary run CTW for all classes from jdk.incubator.vector module
+ *
+ * @library /test/lib / /testlibrary/ctw/src
+ * @modules java.base/jdk.internal.access
+ *          java.base/jdk.internal.jimage
+ *          java.base/jdk.internal.misc
+ *          java.base/jdk.internal.reflect
+ * @modules jdk.incubator.vector
+ *
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run driver/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.incubator.vector
+ */
diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_internal_md.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_internal_md.java
new file mode 100644
index 00000000000..21c6afe3c76
--- /dev/null
+++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_internal_md.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024, 2024, 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
+ * @summary run CTW for all classes from jdk.internal.md module
+ *
+ * @library /test/lib / /testlibrary/ctw/src
+ * @modules java.base/jdk.internal.access
+ *          java.base/jdk.internal.jimage
+ *          java.base/jdk.internal.misc
+ *          java.base/jdk.internal.reflect
+ * @modules jdk.internal.md
+ *
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run driver/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.internal.md
+ */
diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_jpackage.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_jpackage.java
new file mode 100644
index 00000000000..a8fd34323c1
--- /dev/null
+++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_jpackage.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024, 2024, 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
+ * @summary run CTW for all classes from jdk.jpackage module
+ *
+ * @library /test/lib / /testlibrary/ctw/src
+ * @modules java.base/jdk.internal.access
+ *          java.base/jdk.internal.jimage
+ *          java.base/jdk.internal.misc
+ *          java.base/jdk.internal.reflect
+ * @modules jdk.jpackage
+ *
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run driver/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.jpackage
+ */
diff --git a/test/hotspot/jtreg/applications/ctw/modules/jdk_nio_mapmode.java b/test/hotspot/jtreg/applications/ctw/modules/jdk_nio_mapmode.java
new file mode 100644
index 00000000000..a43d2d7aab6
--- /dev/null
+++ b/test/hotspot/jtreg/applications/ctw/modules/jdk_nio_mapmode.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024, 2024, 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
+ * @summary run CTW for all classes from jdk.nio.mapmode module
+ *
+ * @library /test/lib / /testlibrary/ctw/src
+ * @modules java.base/jdk.internal.access
+ *          java.base/jdk.internal.jimage
+ *          java.base/jdk.internal.misc
+ *          java.base/jdk.internal.reflect
+ * @modules jdk.nio.mapmode
+ *
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run driver/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:jdk.nio.mapmode
+ */
diff --git a/test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java b/test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java
index 2e4ec32869d..46a294388e6 100644
--- a/test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java
+++ b/test/hotspot/jtreg/compiler/c1/TestTraceLinearScanLevel.java
@@ -26,8 +26,8 @@
  * @bug 8251093
  * @summary Sanity check the flag TraceLinearScanLevel with the highest level in a silent HelloWorld program.
  *
- * @requires vm.debug == true & vm.compiler1.enabled
- * @run main/othervm -XX:TraceLinearScanLevel=4 compiler.c1.TestTraceLinearScanLevel
+ * @requires vm.debug == true & vm.compiler1.enabled & vm.compMode != "Xcomp"
+ * @run main/othervm -Xbatch -XX:TraceLinearScanLevel=4 compiler.c1.TestTraceLinearScanLevel
  */
 package compiler.c1;
 
diff --git a/test/hotspot/jtreg/compiler/c2/TestMergeStores.java b/test/hotspot/jtreg/compiler/c2/TestMergeStores.java
index 55594650219..a94004d8e26 100644
--- a/test/hotspot/jtreg/compiler/c2/TestMergeStores.java
+++ b/test/hotspot/jtreg/compiler/c2/TestMergeStores.java
@@ -33,7 +33,7 @@
 
 /*
  * @test
- * @bug 8318446 8331054
+ * @bug 8318446 8331054 8331311
  * @summary Test merging of consecutive stores
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
@@ -42,7 +42,7 @@
 
 /*
  * @test
- * @bug 8318446 8331054
+ * @bug 8318446 8331054 8331311
  * @summary Test merging of consecutive stores
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
@@ -112,16 +112,32 @@ public TestMergeStores() {
         testGroups.get("test2").put("test2b", (_,_) -> { return test2b(aB.clone(), offset1, vL1); });
         testGroups.get("test2").put("test2c", (_,_) -> { return test2c(aB.clone(), offset1, vL1); });
         testGroups.get("test2").put("test2d", (_,_) -> { return test2d(aB.clone(), offset1, vL1); });
-        testGroups.get("test2").put("test2e", (_,_) -> { return test2d(aB.clone(), offset1, vL1); });
+        testGroups.get("test2").put("test2e", (_,_) -> { return test2e(aB.clone(), offset1, vL1); });
+
+        testGroups.put("test2BE", new HashMap<String,TestFunction>());
+        testGroups.get("test2BE").put("test2RBE", (_,_) -> { return test2RBE(aB.clone(), offset1, vL1); });
+        testGroups.get("test2BE").put("test2aBE", (_,_) -> { return test2aBE(aB.clone(), offset1, vL1); });
+        testGroups.get("test2BE").put("test2bBE", (_,_) -> { return test2bBE(aB.clone(), offset1, vL1); });
+        testGroups.get("test2BE").put("test2cBE", (_,_) -> { return test2cBE(aB.clone(), offset1, vL1); });
+        testGroups.get("test2BE").put("test2dBE", (_,_) -> { return test2dBE(aB.clone(), offset1, vL1); });
+        testGroups.get("test2BE").put("test2eBE", (_,_) -> { return test2eBE(aB.clone(), offset1, vL1); });
 
         testGroups.put("test3", new HashMap<String,TestFunction>());
         testGroups.get("test3").put("test3R", (_,_) -> { return test3R(aB.clone(), offset1, vL1); });
         testGroups.get("test3").put("test3a", (_,_) -> { return test3a(aB.clone(), offset1, vL1); });
 
+        testGroups.put("test3BE", new HashMap<String,TestFunction>());
+        testGroups.get("test3BE").put("test3RBE", (_,_) -> { return test3RBE(aB.clone(), offset1, vL1); });
+        testGroups.get("test3BE").put("test3aBE", (_,_) -> { return test3aBE(aB.clone(), offset1, vL1); });
+
         testGroups.put("test4", new HashMap<String,TestFunction>());
         testGroups.get("test4").put("test4R", (_,_) -> { return test4R(aB.clone(), offset1, vL1, vI1, vS1, vB1); });
         testGroups.get("test4").put("test4a", (_,_) -> { return test4a(aB.clone(), offset1, vL1, vI1, vS1, vB1); });
 
+        testGroups.put("test4BE", new HashMap<String,TestFunction>());
+        testGroups.get("test4BE").put("test4RBE", (_,_) -> { return test4RBE(aB.clone(), offset1, vL1, vI1, vS1, vB1); });
+        testGroups.get("test4BE").put("test4aBE", (_,_) -> { return test4aBE(aB.clone(), offset1, vL1, vI1, vS1, vB1); });
+
         testGroups.put("test5", new HashMap<String,TestFunction>());
         testGroups.get("test5").put("test5R", (_,_) -> { return test5R(aB.clone(), offset1); });
         testGroups.get("test5").put("test5a", (_,_) -> { return test5a(aB.clone(), offset1); });
@@ -134,6 +150,10 @@ public TestMergeStores() {
         testGroups.get("test7").put("test7R", (_,_) -> { return test7R(aB.clone(), offset1, vI1); });
         testGroups.get("test7").put("test7a", (_,_) -> { return test7a(aB.clone(), offset1, vI1); });
 
+        testGroups.put("test7BE", new HashMap<String,TestFunction>());
+        testGroups.get("test7BE").put("test7RBE", (_,_) -> { return test7RBE(aB.clone(), offset1, vI1); });
+        testGroups.get("test7BE").put("test7aBE", (_,_) -> { return test7aBE(aB.clone(), offset1, vI1); });
+
         testGroups.put("test100", new HashMap<String,TestFunction>());
         testGroups.get("test100").put("test100R", (_,_) -> { return test100R(aS.clone(), offset1); });
         testGroups.get("test100").put("test100a", (_,_) -> { return test100a(aS.clone(), offset1); });
@@ -146,6 +166,10 @@ public TestMergeStores() {
         testGroups.get("test102").put("test102R", (_,_) -> { return test102R(aS.clone(), offset1, vL1, vI1, vS1); });
         testGroups.get("test102").put("test102a", (_,_) -> { return test102a(aS.clone(), offset1, vL1, vI1, vS1); });
 
+        testGroups.put("test102BE", new HashMap<String,TestFunction>());
+        testGroups.get("test102BE").put("test102RBE", (_,_) -> { return test102RBE(aS.clone(), offset1, vL1, vI1, vS1); });
+        testGroups.get("test102BE").put("test102aBE", (_,_) -> { return test102aBE(aS.clone(), offset1, vL1, vI1, vS1); });
+
         testGroups.put("test200", new HashMap<String,TestFunction>());
         testGroups.get("test200").put("test200R", (_,_) -> { return test200R(aI.clone(), offset1); });
         testGroups.get("test200").put("test200a", (_,_) -> { return test200a(aI.clone(), offset1); });
@@ -158,6 +182,10 @@ public TestMergeStores() {
         testGroups.get("test202").put("test202R", (_,_) -> { return test202R(aI.clone(), offset1, vL1, vI1); });
         testGroups.get("test202").put("test202a", (_,_) -> { return test202a(aI.clone(), offset1, vL1, vI1); });
 
+        testGroups.put("test202BE", new HashMap<String,TestFunction>());
+        testGroups.get("test202BE").put("test202RBE", (_,_) -> { return test202RBE(aI.clone(), offset1, vL1, vI1); });
+        testGroups.get("test202BE").put("test202aBE", (_,_) -> { return test202aBE(aI.clone(), offset1, vL1, vI1); });
+
         testGroups.put("test300", new HashMap<String,TestFunction>());
         testGroups.get("test300").put("test300R", (_,_) -> { return test300R(aI.clone()); });
         testGroups.get("test300").put("test300a", (_,_) -> { return test300a(aI.clone()); });
@@ -184,6 +212,24 @@ public TestMergeStores() {
         // First use something in range, and after warmup randomize going outside the range.
         // Consequence: all RangeChecks stay in the final compilation.
 
+        testGroups.put("test500BE", new HashMap<String,TestFunction>());
+        testGroups.get("test500BE").put("test500RBE", (_,_) -> { return test500RBE(aB.clone(), offset1, vL1); });
+        testGroups.get("test500BE").put("test500aBE", (_,_) -> { return test500aBE(aB.clone(), offset1, vL1); });
+
+        testGroups.put("test501BE", new HashMap<String,TestFunction>());
+        testGroups.get("test501BE").put("test500RBE", (_,i) -> { return test500RBE(aB.clone(), RANGE - 20 + (i % 30), vL1); });
+        testGroups.get("test501BE").put("test501aBE", (_,i) -> { return test501aBE(aB.clone(), RANGE - 20 + (i % 30), vL1); });
+        //                                                                               +-------------------+
+        // Create offsets that are sometimes going to pass all RangeChecks, and sometimes one, and sometimes none.
+        // Consequence: all RangeChecks stay in the final compilation.
+
+        testGroups.put("test502BE", new HashMap<String,TestFunction>());
+        testGroups.get("test502BE").put("test500RBE", (w,i) -> { return test500RBE(aB.clone(), w ? offset1 : RANGE - 20 + (i % 30), vL1); });
+        testGroups.get("test502BE").put("test502aBE", (w,i) -> { return test502aBE(aB.clone(), w ? offset1 : RANGE - 20 + (i % 30), vL1); });
+        //                                                                                   +-----+   +-------------------+
+        // First use something in range, and after warmup randomize going outside the range.
+        // Consequence: all RangeChecks stay in the final compilation.
+
         testGroups.put("test600", new HashMap<String,TestFunction>());
         testGroups.get("test600").put("test600R", (_,i) -> { return test600R(aB.clone(), aI.clone(), i); });
         testGroups.get("test600").put("test600a", (_,i) -> { return test600a(aB.clone(), aI.clone(), i); });
@@ -191,6 +237,14 @@ public TestMergeStores() {
         testGroups.put("test700", new HashMap<String,TestFunction>());
         testGroups.get("test700").put("test700R", (_,i) -> { return test700R(aI.clone(), i); });
         testGroups.get("test700").put("test700a", (_,i) -> { return test700a(aI.clone(), i); });
+
+        testGroups.put("test800", new HashMap<String,TestFunction>());
+        testGroups.get("test800").put("test800R", (_,_) -> { return test800R(aB.clone(), offset1, vL1); });
+        testGroups.get("test800").put("test800a", (_,_) -> { return test800a(aB.clone(), offset1, vL1); });
+
+        testGroups.put("test800BE", new HashMap<String,TestFunction>());
+        testGroups.get("test800BE").put("test800RBE", (_,_) -> { return test800RBE(aB.clone(), offset1, vL1); });
+        testGroups.get("test800BE").put("test800aBE", (_,_) -> { return test800aBE(aB.clone(), offset1, vL1); });
     }
 
     @Warmup(100)
@@ -208,24 +262,39 @@ public TestMergeStores() {
                  "test2c",
                  "test2d",
                  "test2e",
+                 "test2aBE",
+                 "test2bBE",
+                 "test2cBE",
+                 "test2dBE",
+                 "test2eBE",
                  "test3a",
+                 "test3aBE",
                  "test4a",
+                 "test4aBE",
                  "test5a",
                  "test6a",
                  "test7a",
+                 "test7aBE",
                  "test100a",
                  "test101a",
                  "test102a",
+                 "test102aBE",
                  "test200a",
                  "test201a",
                  "test202a",
+                 "test202aBE",
                  "test300a",
                  "test400a",
                  "test500a",
                  "test501a",
                  "test502a",
+                 "test500aBE",
+                 "test501aBE",
+                 "test502aBE",
                  "test600a",
-                 "test700a"})
+                 "test700a",
+                 "test800a",
+                 "test800aBE"})
     public void runTests(RunInfo info) {
         // Repeat many times, so that we also have multiple iterations for post-warmup to potentially recompile
         int iters = info.isWarmUp() ? 1_000 : 50_000;
@@ -412,6 +481,39 @@ static void storeLongLE(byte[] bytes, int offset, long value) {
                                   (byte)(value >> 56));
     }
 
+    // -------------------------------------------
+    // -------      Big-Endian API      ----------
+    // -------------------------------------------
+
+    // Store a short BE into an array using store bytes in an array
+    @ForceInline
+    static void storeShortBE(byte[] bytes, int offset, short value) {
+        storeBytes(bytes, offset, (byte)(value >> 8),
+                                  (byte)(value >> 0));
+    }
+
+    // Store an int BE into an array using store bytes in an array
+    @ForceInline
+    static void storeIntBE(byte[] bytes, int offset, int value) {
+        storeBytes(bytes, offset, (byte)(value >> 24),
+                                  (byte)(value >> 16),
+                                  (byte)(value >> 8 ),
+                                  (byte)(value >> 0 ));
+    }
+
+    // Store an int BE into an array using store bytes in an array
+    @ForceInline
+    static void storeLongBE(byte[] bytes, int offset, long value) {
+        storeBytes(bytes, offset, (byte)(value >> 56),
+                                  (byte)(value >> 48),
+                                  (byte)(value >> 40),
+                                  (byte)(value >> 32),
+                                  (byte)(value >> 24),
+                                  (byte)(value >> 16),
+                                  (byte)(value >> 8 ),
+                                  (byte)(value >> 0 ));
+    }
+
     // Store 2 bytes into an array
     @ForceInline
     static void storeBytes(byte[] bytes, int offset, byte b0, byte b1) {
@@ -476,7 +578,7 @@ static Object[] test1a(byte[] a) {
     static Object[] test1b(byte[] a) {
         // Add custom null check, to ensure the unsafe access always recognizes its type as an array store
         if (a == null) {return null;}
-        UNSAFE.putLongUnaligned(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET, 0xdeadbeefbaadbabeL);
+        UNSAFE.putLongUnaligned(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET, 0xdeadbeefbaadbabeL, false /* bigEndian */);
         return new Object[]{ a };
     }
 
@@ -509,8 +611,9 @@ static Object[] test1e(byte[] a) {
     }
 
     @Test
-    @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
-        applyIf = {"UseUnalignedAccesses", "true"})
+    // Disabled by JDK-8335390, to be enabled again by JDK-8335392.
+    // @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
+    //     applyIf = {"UseUnalignedAccesses", "true"})
     static Object[] test1f(byte[] a) {
         UNSAFE.putByte(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET + 0, (byte)0xbe);
         UNSAFE.putByte(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET + 1, (byte)0xba);
@@ -589,7 +692,13 @@ static Object[] test2R(byte[] a, int offset, long v) {
 
     @Test
     @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
-        applyIf = {"UseUnalignedAccesses", "true"})
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"big-endian", "true"})
     static Object[] test2a(byte[] a, int offset, long v) {
         a[offset + 0] = (byte)(v >> 0);
         a[offset + 1] = (byte)(v >> 8);
@@ -608,13 +717,19 @@ static Object[] test2a(byte[] a, int offset, long v) {
     static Object[] test2b(byte[] a, int offset, long v) {
         // Add custom null check, to ensure the unsafe access always recognizes its type as an array store
         if (a == null) {return null;}
-        UNSAFE.putLongUnaligned(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET + offset, v);
+        UNSAFE.putLongUnaligned(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET + offset, v, false /* bigEndian */);
         return new Object[]{ a };
     }
 
     @Test
     @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
-        applyIf = {"UseUnalignedAccesses", "true"})
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"big-endian", "true"})
     static Object[] test2c(byte[] a, int offset, long v) {
         storeLongLE(a, offset, v);
         return new Object[]{ a };
@@ -638,6 +753,82 @@ static Object[] test2e(byte[] a, int offset, long v) {
         return new Object[]{ a };
     }
 
+    @DontCompile
+    static Object[] test2RBE(byte[] a, int offset, long v) {
+        a[offset + 0] = (byte)(v >> 56);
+        a[offset + 1] = (byte)(v >> 48);
+        a[offset + 2] = (byte)(v >> 40);
+        a[offset + 3] = (byte)(v >> 32);
+        a[offset + 4] = (byte)(v >> 24);
+        a[offset + 5] = (byte)(v >> 16);
+        a[offset + 6] = (byte)(v >> 8);
+        a[offset + 7] = (byte)(v >> 0);
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test2aBE(byte[] a, int offset, long v) {
+        a[offset + 0] = (byte)(v >> 56);
+        a[offset + 1] = (byte)(v >> 48);
+        a[offset + 2] = (byte)(v >> 40);
+        a[offset + 3] = (byte)(v >> 32);
+        a[offset + 4] = (byte)(v >> 24);
+        a[offset + 5] = (byte)(v >> 16);
+        a[offset + 6] = (byte)(v >> 8);
+        a[offset + 7] = (byte)(v >> 0);
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
+        applyIf = {"UseUnalignedAccesses", "true"})
+    static Object[] test2bBE(byte[] a, int offset, long v) {
+        // Add custom null check, to ensure the unsafe access always recognizes its type as an array store
+        if (a == null) {return null;}
+        UNSAFE.putLongUnaligned(a, UNSAFE.ARRAY_BYTE_BASE_OFFSET + offset, v, true /* bigEndian */);
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test2cBE(byte[] a, int offset, long v) {
+        storeLongBE(a, offset, v);
+        return new Object[]{ a };
+    }
+
+    @Test
+    // No optimization, casting long -> int -> byte does not work
+    static Object[] test2dBE(byte[] a, int offset, long v) {
+        storeIntBE(a, offset + 0, (int)(v >> 32));
+        storeIntBE(a, offset + 4, (int)(v >> 0));
+        return new Object[]{ a };
+    }
+
+    @Test
+    // No optimization, casting long -> short -> byte does not work
+    static Object[] test2eBE(byte[] a, int offset, long v) {
+        storeShortBE(a, offset + 0, (short)(v >> 48));
+        storeShortBE(a, offset + 2, (short)(v >> 32));
+        storeShortBE(a, offset + 4, (short)(v >> 16));
+        storeShortBE(a, offset + 6, (short)(v >> 0));
+        return new Object[]{ a };
+    }
+
     @DontCompile
     static Object[] test3R(byte[] a, int offset, long v) {
         a[offset + 0] = (byte)(v >> 0);
@@ -653,7 +844,13 @@ static Object[] test3R(byte[] a, int offset, long v) {
 
     @Test
     @IR(counts = {IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "2"},
-        applyIf = {"UseUnalignedAccesses", "true"})
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"big-endian", "true"})
     static Object[] test3a(byte[] a, int offset, long v) {
         a[offset + 0] = (byte)(v >> 0);
         a[offset + 1] = (byte)(v >> 8);
@@ -666,6 +863,40 @@ static Object[] test3a(byte[] a, int offset, long v) {
         return new Object[]{ a };
     }
 
+    @DontCompile
+    static Object[] test3RBE(byte[] a, int offset, long v) {
+        a[offset + 0] = (byte)(v >> 24);
+        a[offset + 1] = (byte)(v >> 16);
+        a[offset + 2] = (byte)(v >> 8);
+        a[offset + 3] = (byte)(v >> 0);
+        a[offset + 4] = (byte)(v >> 24);
+        a[offset + 5] = (byte)(v >> 16);
+        a[offset + 6] = (byte)(v >> 8);
+        a[offset + 7] = (byte)(v >> 0);
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "2"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test3aBE(byte[] a, int offset, long v) {
+        a[offset + 0] = (byte)(v >> 24);
+        a[offset + 1] = (byte)(v >> 16);
+        a[offset + 2] = (byte)(v >> 8);
+        a[offset + 3] = (byte)(v >> 0);
+        a[offset + 4] = (byte)(v >> 24);
+        a[offset + 5] = (byte)(v >> 16);
+        a[offset + 6] = (byte)(v >> 8);
+        a[offset + 7] = (byte)(v >> 0);
+        return new Object[]{ a };
+    }
+
     @DontCompile
     static Object[] test4R(byte[] a, int offset, long v1, int v2, short v3, byte v4) {
         a[offset +  0] = (byte)0x00;
@@ -693,7 +924,14 @@ static Object[] test4R(byte[] a, int offset, long v1, int v2, short v3, byte v4)
                   IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "3",
                   IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "2",
                   IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
-        applyIf = {"UseUnalignedAccesses", "true"})
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "12",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",  // Stores of constants can be merged
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
     static Object[] test4a(byte[] a, int offset, long v1, int v2, short v3, byte v4) {
         a[offset +  0] = (byte)0x00; // individual load expected to go into state of RC
         a[offset +  1] = (byte)0xFF;
@@ -715,6 +953,62 @@ static Object[] test4a(byte[] a, int offset, long v1, int v2, short v3, byte v4)
         return new Object[]{ a };
     }
 
+    @DontCompile
+    static Object[] test4RBE(byte[] a, int offset, long v1, int v2, short v3, byte v4) {
+        a[offset +  0] = (byte)0x00;
+        a[offset +  1] = (byte)0xFF;
+        a[offset +  2] = v4;
+        a[offset +  3] = (byte)0x42;
+        a[offset +  4] = (byte)(v1 >> 8);
+        a[offset +  5] = (byte)(v1 >> 0);
+        a[offset +  6] = (byte)0xAB;
+        a[offset +  7] = (byte)0xCD;
+        a[offset +  8] = (byte)0xEF;
+        a[offset +  9] = (byte)0x01;
+        a[offset + 10] = (byte)(v2 >> 24);
+        a[offset + 11] = (byte)(v2 >> 16);
+        a[offset + 12] = (byte)(v2 >> 8);
+        a[offset + 13] = (byte)(v2 >> 0);
+        a[offset + 14] = (byte)(v3 >> 8);
+        a[offset + 15] = (byte)(v3 >> 0);
+        a[offset + 16] = (byte)0xEF;
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "12",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",  // Stores of constants can be merged
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "4", // 3 (+ 1 for uncommon trap)
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "3",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "2",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test4aBE(byte[] a, int offset, long v1, int v2, short v3, byte v4) {
+        a[offset +  0] = (byte)0x00; // individual load expected to go into state of RC
+        a[offset +  1] = (byte)0xFF;
+        a[offset +  2] = v4;
+        a[offset +  3] = (byte)0x42;
+        a[offset +  4] = (byte)(v1 >> 8);
+        a[offset +  5] = (byte)(v1 >> 0);
+        a[offset +  6] = (byte)0xAB;
+        a[offset +  7] = (byte)0xCD;
+        a[offset +  8] = (byte)0xEF;
+        a[offset +  9] = (byte)0x01;
+        a[offset + 10] = (byte)(v2 >> 24);
+        a[offset + 11] = (byte)(v2 >> 16);
+        a[offset + 12] = (byte)(v2 >> 8);
+        a[offset + 13] = (byte)(v2 >> 0);
+        a[offset + 14] = (byte)(v3 >> 8);
+        a[offset + 15] = (byte)(v3 >> 0);
+        a[offset + 16] = (byte)0xEF;
+        return new Object[]{ a };
+    }
+
     @DontCompile
     static Object[] test5R(byte[] a, int offset) {
         a[offset +  0] = (byte)0x01;
@@ -810,6 +1104,26 @@ static Object[] test7a(byte[] a, int offset1, int v1) {
         return new Object[]{ a };
     }
 
+    @DontCompile
+    static Object[] test7RBE(byte[] a, int offset1, int v1) {
+        a[offset1 +  1] = (byte)(v1 >> 24);
+        a[offset1 +  2] = (byte)(v1 >> 16);
+        a[offset1 +  3] = (byte)(v1 >> 8);
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "3",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"})
+    static Object[] test7aBE(byte[] a, int offset1, int v1) {
+        a[offset1 +  1] = (byte)(v1 >> 24);
+        a[offset1 +  2] = (byte)(v1 >> 16);
+        a[offset1 +  3] = (byte)(v1 >> 8);
+        return new Object[]{ a };
+    }
+
     @DontCompile
     static Object[] test100R(short[] a, int offset) {
         a[offset +  0] = (short)0x0100;
@@ -925,7 +1239,14 @@ static Object[] test102R(short[] a, int offset, long v1, int v2, short v3) {
                   IRNode.STORE_C_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "4", // 3 (+1 that goes into RC)
                   IRNode.STORE_I_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "3",
                   IRNode.STORE_L_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "2"},
-        applyIf = {"UseUnalignedAccesses", "true"})
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_C_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "12",
+                  IRNode.STORE_I_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",  // Stores of constants can be merged
+                  IRNode.STORE_L_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
     static Object[] test102a(short[] a, int offset, long v1, int v2, short v3) {
         a[offset +  0] = (short)0x0000; // store goes into RC
         a[offset +  1] = (short)0xFFFF;
@@ -947,6 +1268,62 @@ static Object[] test102a(short[] a, int offset, long v1, int v2, short v3) {
         return new Object[]{ a };
     }
 
+    @DontCompile
+    static Object[] test102RBE(short[] a, int offset, long v1, int v2, short v3) {
+        a[offset +  0] = (short)0x0000;
+        a[offset +  1] = (short)0xFFFF;
+        a[offset +  2] = v3;
+        a[offset +  3] = (short)0x4242;
+        a[offset +  4] = (short)(v1 >> 16);
+        a[offset +  5] = (short)(v1 >>  0);
+        a[offset +  6] = (short)0xAB11;
+        a[offset +  7] = (short)0xCD36;
+        a[offset +  8] = (short)0xEF89;
+        a[offset +  9] = (short)0x0156;
+        a[offset + 10] = (short)(v1 >> 48);
+        a[offset + 11] = (short)(v1 >> 32);
+        a[offset + 12] = (short)(v1 >> 16);
+        a[offset + 13] = (short)(v1 >> 0);
+        a[offset + 14] = (short)(v2 >> 16);
+        a[offset + 15] = (short)(v2 >> 0);
+        a[offset + 16] = (short)0xEFEF;
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_C_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "12",
+                  IRNode.STORE_I_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",  // Stores of constants can be merged
+                  IRNode.STORE_L_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_C_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "4", // 3 (+1 that goes into RC)
+                  IRNode.STORE_I_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "3",
+                  IRNode.STORE_L_OF_CLASS, "short\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "2"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test102aBE(short[] a, int offset, long v1, int v2, short v3) {
+        a[offset +  0] = (short)0x0000; // store goes into RC
+        a[offset +  1] = (short)0xFFFF;
+        a[offset +  2] = v3;
+        a[offset +  3] = (short)0x4242;
+        a[offset +  4] = (short)(v1 >> 16);
+        a[offset +  5] = (short)(v1 >>  0);
+        a[offset +  6] = (short)0xAB11;
+        a[offset +  7] = (short)0xCD36;
+        a[offset +  8] = (short)0xEF89;
+        a[offset +  9] = (short)0x0156;
+        a[offset + 10] = (short)(v1 >> 48);
+        a[offset + 11] = (short)(v1 >> 32);
+        a[offset + 12] = (short)(v1 >> 16);
+        a[offset + 13] = (short)(v1 >> 0);
+        a[offset + 14] = (short)(v2 >> 16);
+        a[offset + 15] = (short)(v2 >> 0);
+        a[offset + 16] = (short)0xEFEF;
+        return new Object[]{ a };
+    }
+
     @DontCompile
     static Object[] test200R(int[] a, int offset) {
         a[offset +  0] = 0x01001236;
@@ -1062,7 +1439,14 @@ static Object[] test202R(int[] a, int offset, long v1, int v2) {
                   IRNode.STORE_C_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
                   IRNode.STORE_I_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "6", // 5 (+1 that goes into RC)
                   IRNode.STORE_L_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "6"},
-        applyIf = {"UseUnalignedAccesses", "true"})
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_C_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "10",
+                  IRNode.STORE_L_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "4"}, // Stores of constants can be merged
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
     static Object[] test202a(int[] a, int offset, long v1, int v2) {
         a[offset +  0] = 0x00000000; // merged with store below, but also kept unchanged for RC
         a[offset +  1] = 0xFFFFFFFF;
@@ -1075,7 +1459,7 @@ static Object[] test202a(int[] a, int offset, long v1, int v2) {
         a[offset +  8] = 0xEF890173;
         a[offset +  9] = 0x01560124;
         a[offset + 10] = (int)(v1 >> 0);
-        a[offset + 11] = (int)(v1 >> 32);
+        a[offset + 11] = (int)(v1 >> 32); // Stores to +11 and +12 can be merged also on big-endian
         a[offset + 12] = (int)(v1 >> 0);
         a[offset + 13] = (int)(v1 >> 32);
         a[offset + 14] = v2;
@@ -1084,6 +1468,62 @@ static Object[] test202a(int[] a, int offset, long v1, int v2) {
         return new Object[]{ a };
     }
 
+    @DontCompile
+    static Object[] test202RBE(int[] a, int offset, long v1, int v2) {
+        a[offset +  0] = 0x00000000;
+        a[offset +  1] = 0xFFFFFFFF;
+        a[offset +  2] = v2;
+        a[offset +  3] = 0x42424242;
+        a[offset +  4] = (int)(v1 >> 32);
+        a[offset +  5] = (int)(v1 >>  0);
+        a[offset +  6] = 0xAB110129;
+        a[offset +  7] = 0xCD360183;
+        a[offset +  8] = 0xEF890173;
+        a[offset +  9] = 0x01560124;
+        a[offset + 10] = (int)(v1 >> 32);
+        a[offset + 11] = (int)(v1 >> 0);
+        a[offset + 12] = (int)(v1 >> 32);
+        a[offset + 13] = (int)(v1 >> 0);
+        a[offset + 14] = v2;
+        a[offset + 15] = v2;
+        a[offset + 16] = 0xEFEFEFEF;
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_C_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "10",
+                  IRNode.STORE_L_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "4"}, // Stores of constants can be merged
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_C_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "6", // 5 (+1 that goes into RC)
+                  IRNode.STORE_L_OF_CLASS, "int\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "6"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test202aBE(int[] a, int offset, long v1, int v2) {
+        a[offset +  0] = 0x00000000; // merged with store below, but also kept unchanged for RC
+        a[offset +  1] = 0xFFFFFFFF;
+        a[offset +  2] = v2;
+        a[offset +  3] = 0x42424242;
+        a[offset +  4] = (int)(v1 >> 32);
+        a[offset +  5] = (int)(v1 >>  0);
+        a[offset +  6] = 0xAB110129;
+        a[offset +  7] = 0xCD360183;
+        a[offset +  8] = 0xEF890173;
+        a[offset +  9] = 0x01560124;
+        a[offset + 10] = (int)(v1 >> 32);
+        a[offset + 11] = (int)(v1 >> 0);  // Stores to +11 and +12 can be merged also on little-endian
+        a[offset + 12] = (int)(v1 >> 32);
+        a[offset + 13] = (int)(v1 >> 0);
+        a[offset + 14] = v2;
+        a[offset + 15] = v2;
+        a[offset + 16] = 0xEFEFEFEF;
+        return new Object[]{ a };
+    }
+
     @DontCompile
     static Object[] test300R(int[] a) {
         a[2] = 42;
@@ -1175,7 +1615,13 @@ static Object[] test500R(byte[] a, int offset, long v) {
                   IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
                   IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
                   IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"}, // expect merged
-        applyIf = {"UseUnalignedAccesses", "true"})
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"big-endian", "true"})
     static Object[] test500a(byte[] a, int offset, long v) {
         int idx = 0;
         try {
@@ -1255,6 +1701,140 @@ static Object[] test502a(byte[] a, int offset, long v) {
         return new Object[]{ a, new int[]{ idx } };
     }
 
+    @DontCompile
+    // The 500-series has all the same code, but is executed with different inputs:
+    // 500a: never violate a RangeCheck -> expect will always merge stores
+    // 501a: randomly violate RangeCheck, also during warmup -> never merge stores
+    // 502a: during warmup never violate RangeCheck -> compile once with merged stores
+    //       but then after warmup violate RangeCheck -> recompile without merged stores
+    static Object[] test500RBE(byte[] a, int offset, long v) {
+        int idx = 0;
+        try {
+            a[offset + 0] = (byte)(v >> 56);
+            idx = 1;
+            a[offset + 1] = (byte)(v >> 48);
+            idx = 2;
+            a[offset + 2] = (byte)(v >> 40);
+            idx = 3;
+            a[offset + 3] = (byte)(v >> 32);
+            idx = 4;
+            a[offset + 4] = (byte)(v >> 24);
+            idx = 5;
+            a[offset + 5] = (byte)(v >> 16);
+            idx = 6;
+            a[offset + 6] = (byte)(v >> 8);
+            idx = 7;
+            a[offset + 7] = (byte)(v >> 0);
+            idx = 8;
+        } catch (ArrayIndexOutOfBoundsException _) {}
+        return new Object[]{ a, new int[]{ idx } };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1", // for RangeCheck trap
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1"}, // expect merged
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test500aBE(byte[] a, int offset, long v) {
+        int idx = 0;
+        try {
+            a[offset + 0] = (byte)(v >> 56);
+            idx = 1;
+            a[offset + 1] = (byte)(v >> 48);
+            idx = 2;
+            a[offset + 2] = (byte)(v >> 40);
+            idx = 3;
+            a[offset + 3] = (byte)(v >> 32);
+            idx = 4;
+            a[offset + 4] = (byte)(v >> 24);
+            idx = 5;
+            a[offset + 5] = (byte)(v >> 16);
+            idx = 6;
+            a[offset + 6] = (byte)(v >> 8);
+            idx = 7;
+            a[offset + 7] = (byte)(v >> 0);
+            idx = 8;
+        } catch (ArrayIndexOutOfBoundsException _) {}
+        return new Object[]{ a, new int[]{ idx } };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "7",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test501aBE(byte[] a, int offset, long v) {
+        int idx = 0;
+        try {
+            a[offset + 0] = (byte)(v >> 56);
+            idx = 1;
+            a[offset + 1] = (byte)(v >> 48);
+            idx = 2;
+            a[offset + 2] = (byte)(v >> 40);
+            idx = 3;
+            a[offset + 3] = (byte)(v >> 32);
+            idx = 4;
+            a[offset + 4] = (byte)(v >> 24);
+            idx = 5;
+            a[offset + 5] = (byte)(v >> 16);
+            idx = 6;
+            a[offset + 6] = (byte)(v >> 8);
+            idx = 7;
+            a[offset + 7] = (byte)(v >> 0);
+            idx = 8;
+        } catch (ArrayIndexOutOfBoundsException _) {}
+        return new Object[]{ a, new int[]{ idx } };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "8",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "7",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test502aBE(byte[] a, int offset, long v) {
+        int idx = 0;
+        try {
+            a[offset + 0] = (byte)(v >> 56);
+            idx = 1;
+            a[offset + 1] = (byte)(v >> 48);
+            idx = 2;
+            a[offset + 2] = (byte)(v >> 40);
+            idx = 3;
+            a[offset + 3] = (byte)(v >> 32);
+            idx = 4;
+            a[offset + 4] = (byte)(v >> 24);
+            idx = 5;
+            a[offset + 5] = (byte)(v >> 16);
+            idx = 6;
+            a[offset + 6] = (byte)(v >> 8);
+            idx = 7;
+            a[offset + 7] = (byte)(v >> 0);
+            idx = 8;
+        } catch (ArrayIndexOutOfBoundsException _) {}
+        return new Object[]{ a, new int[]{ idx } };
+    }
+
     @DontCompile
     static Object[] test600R(byte[] aB, int[] aI, int i) {
         Object a = null;
@@ -1319,4 +1899,69 @@ static Object[] test700a(int[] a, long v1) {
         a[1] = (int)(v1 >> -2);
         return new Object[]{ a };
     }
+
+    @DontCompile
+    static Object[] test800R(byte[] a, int offset, long v) {
+        a[offset + 0] = (byte)(v >> 0);
+        a[offset + 1] = (byte)(v >> 8);
+        a[offset + 2] = (byte)(v >> 16);
+        a[offset + 3] = (byte)(v >> 24);
+        a[offset + 4] = (byte)(v >> 32);
+        a[offset + 5] = (byte)(v >> 40);
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "6",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"})
+    static Object[] test800a(byte[] a, int offset, long v) {
+        // Merge attempts begin at the lowest store in the Memory chain.
+        // Candidates are found following the chain. The list is trimmed to a
+        // power of 2 length by removing higher stores.
+        a[offset + 0] = (byte)(v >> 0);  // Removed from candidate list
+        a[offset + 1] = (byte)(v >> 8);  // Removed from candidate list
+        a[offset + 2] = (byte)(v >> 16); // The 4 following stores are on the candidate list.
+        a[offset + 3] = (byte)(v >> 24); // The current logic does not merge them
+        a[offset + 4] = (byte)(v >> 32); // since it would require shifting the input.
+        a[offset + 5] = (byte)(v >> 40);
+        return new Object[]{ a };
+    }
+
+    @DontCompile
+    static Object[] test800RBE(byte[] a, int offset, long v) {
+        a[offset + 0] = (byte)(v >> 40);
+        a[offset + 1] = (byte)(v >> 32);
+        a[offset + 2] = (byte)(v >> 24);
+        a[offset + 3] = (byte)(v >> 16);
+        a[offset + 4] = (byte)(v >> 8);
+        a[offset + 5] = (byte)(v >> 0);
+        return new Object[]{ a };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "6",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIfPlatform = {"little-endian", "true"})
+    @IR(counts = {IRNode.STORE_B_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "2",
+                  IRNode.STORE_C_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0",
+                  IRNode.STORE_I_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "1",
+                  IRNode.STORE_L_OF_CLASS, "byte\\\\[int:>=0] \\\\(java/lang/Cloneable,java/io/Serializable\\\\)", "0"},
+        applyIf = {"UseUnalignedAccesses", "true"},
+        applyIfPlatform = {"big-endian", "true"})
+    static Object[] test800aBE(byte[] a, int offset, long v) {
+        // Merge attempts begin at the lowest store in the Memory chain.
+        // Candidates are found following the chain. The list is trimmed to a
+        // power of 2 length by removing higher stores.
+        a[offset + 0] = (byte)(v >> 40); // Removed from candidate list
+        a[offset + 1] = (byte)(v >> 32); // Removed from candidate list
+        a[offset + 2] = (byte)(v >> 24); // The 4 following stores are on the candidate list
+        a[offset + 3] = (byte)(v >> 16); // and they are successfully merged on big endian platforms.
+        a[offset + 4] = (byte)(v >> 8);
+        a[offset + 5] = (byte)(v >> 0);
+        return new Object[]{ a };
+    }
 }
diff --git a/test/hotspot/jtreg/compiler/c2/TestMergeStoresUnsafeArrayPointer.java b/test/hotspot/jtreg/compiler/c2/TestMergeStoresUnsafeArrayPointer.java
new file mode 100644
index 00000000000..dbfdfe68957
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/c2/TestMergeStoresUnsafeArrayPointer.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2024, 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 8335390
+ * @summary Test merge stores for some Unsafe store address patterns.
+ * @modules java.base/jdk.internal.misc
+ * @requires vm.bits == 64
+ * @requires os.maxMemory > 8G
+ * @run main/othervm -XX:CompileCommand=compileonly,compiler.c2.TestMergeStoresUnsafeArrayPointer::test*
+ *                   -Xbatch
+ *                   -Xmx8g
+ *                   compiler.c2.TestMergeStoresUnsafeArrayPointer
+ * @run main/othervm -Xmx8g
+ *                   compiler.c2.TestMergeStoresUnsafeArrayPointer
+ */
+
+package compiler.c2;
+import jdk.internal.misc.Unsafe;
+
+public class TestMergeStoresUnsafeArrayPointer {
+    static final Unsafe UNSAFE = Unsafe.getUnsafe();
+
+    // We allocate a big int array of length:
+    static final int SIZE = (1 << 30) + 100;
+
+    // This gives us a memory region of 4x as many bytes:
+    static final long BYTE_SIZE = 4L * SIZE; // = 1L << 32 + 400L
+
+    // We set an "anchor" in the middle of this memory region, in bytes:
+    static final long ANCHOR = BYTE_SIZE / 2;
+
+    static int four = 4;
+
+    public static void main(String[] args) {
+        System.out.println("Allocate big array of SIZE = " + SIZE);
+        int[] big = new int[SIZE];
+
+        // Each test is executed a few times, so that we can see the difference between
+        // interpreter and compiler.
+        int errors = 0;
+
+        long val = 0;
+        System.out.println("test1");
+        for (int i = 0; i < 100_000; i++) {
+            testClear(big);
+            test1(big, ANCHOR);
+            long sum = testSum(big);
+            if (i == 0) {
+                val = sum;
+            } else {
+                if (sum != val) {
+                    System.out.println("ERROR: test1 had wrong value: " + val + " != " + sum);
+                    errors++;
+                    break;
+                }
+            }
+        }
+
+        val = 0;
+        System.out.println("test2");
+        for (int i = 0; i < 100_000; i++) {
+            testClear(big);
+            test2(big, ANCHOR);
+            long sum = testSum(big);
+            if (i == 0) {
+                val = sum;
+            } else {
+                if (sum != val) {
+                    System.out.println("ERROR: test2 had wrong value: " + val + " != " + sum);
+                    errors++;
+                    break;
+                }
+            }
+        }
+
+        if (errors > 0) {
+            throw new RuntimeException("ERRORS: " + errors);
+        }
+        System.out.println("PASSED");
+    }
+
+    // Only clear and sum over relevant parts of array to make the test fast.
+    static void testClear(int[] a) {
+        for (int j = 0               ; j <              100; j++) { a[j] = j; }
+        for (int j = a.length/2 - 100; j < a.length/2 + 100; j++) { a[j] = j; }
+        for (int j = a.length   - 100; j < a.length   +   0; j++) { a[j] = j; }
+    }
+
+    static long testSum(int[] a) {
+        long sum = 0;
+        for (int j = 0               ; j <              100; j++) { sum += a[j]; }
+        for (int j = a.length/2 - 100; j < a.length/2 + 100; j++) { sum += a[j]; }
+        for (int j = a.length   - 100; j < a.length   +   0; j++) { sum += a[j]; }
+        return sum;
+    }
+
+    // Reference: expected to merge.
+    static void test1(int[] a, long anchor) {
+        long base = UNSAFE.ARRAY_INT_BASE_OFFSET + anchor;
+        UNSAFE.putInt(a, base + 0, 0x42424242);
+        UNSAFE.putInt(a, base + 4, 0x66666666);
+    }
+
+    // Test: if MergeStores is applied this can lead to wrong results
+    static void test2(int[] a, long anchor) {
+        long base = UNSAFE.ARRAY_INT_BASE_OFFSET + ANCHOR;
+        UNSAFE.putInt(a, base + 0                 + (long)(four + Integer.MAX_VALUE), 0x42424242);
+        UNSAFE.putInt(a, base + Integer.MAX_VALUE + (long)(four + 4                ), 0x66666666);
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/c2/cr7200264/TestIntVect.java b/test/hotspot/jtreg/compiler/c2/cr7200264/TestIntVect.java
index 17556896f26..457e33667b2 100644
--- a/test/hotspot/jtreg/compiler/c2/cr7200264/TestIntVect.java
+++ b/test/hotspot/jtreg/compiler/c2/cr7200264/TestIntVect.java
@@ -480,10 +480,7 @@ void test_suba(int[] a0, int[] a1, int[] a2) {
 
     @Test
     @IR(counts = { IRNode.SUB_VI, "> 0", IRNode.LSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.SUB_VI, "> 0", IRNode.LSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_mulc(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]*VALUE);
@@ -492,10 +489,7 @@ void test_mulc(int[] a0, int[] a1) {
 
     @Test
     @IR(counts = { IRNode.SUB_VI, "> 0", IRNode.LSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.SUB_VI, "> 0", IRNode.LSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_mulc_n(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]*(-VALUE));
@@ -527,15 +521,7 @@ void test_mula(int[] a0, int[] a1, int[] a2) {
                    IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0",
                    IRNode.SUB_VI,
                    IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0" },
-        applyIfCPUFeatureOr = {"avx2", "true", "sve", "true"})
-    @IR(counts = { IRNode.ADD_VI,
-                   IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0",
-                   IRNode.RSHIFT_VI,
-                   IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0",
-                   IRNode.SUB_VI,
-                   IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"avx2", "true", "sve", "true", "rvv", "true"})
     // Not vectorized: On aarch64, vectorization for this example results in
     // MulVL nodes, which asimd does not support.
     @IR(counts = { IRNode.LOAD_VECTOR_I, "= 0",
@@ -555,15 +541,7 @@ void test_divc(int[] a0, int[] a1) {
                    IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0",
                    IRNode.SUB_VI,
                    IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0" },
-        applyIfCPUFeatureOr = {"avx2", "true", "sve", "true"})
-    @IR(counts = { IRNode.ADD_VI,
-                   IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0",
-                   IRNode.RSHIFT_VI,
-                   IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0",
-                   IRNode.SUB_VI,
-                   IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"avx2", "true", "sve", "true", "rvv", "true"})
     // Not vectorized: On aarch64, vectorization for this example results in
     // MulVL nodes, which asimd does not support.
     @IR(counts = { IRNode.LOAD_VECTOR_I, "= 0",
@@ -683,10 +661,7 @@ void test_xora(int[] a0, int[] a1, int[] a2) {
 
     @Test
     @IR(counts = { IRNode.LSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.LSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_sllc(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]<<VALUE);
@@ -695,10 +670,7 @@ void test_sllc(int[] a0, int[] a1) {
 
     @Test
     @IR(counts = { IRNode.LSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.LSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_sllc_n(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]<<(-VALUE));
@@ -710,12 +682,7 @@ void test_sllc_n(int[] a0, int[] a1) {
     @IR(counts = { IRNode.LSHIFT_VI,     "= 0",
                    IRNode.LOAD_VECTOR_I, "> 0",
                    IRNode.STORE_VECTOR,  "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.LSHIFT_VI,     "= 0",
-                   IRNode.LOAD_VECTOR_I, "> 0",
-                   IRNode.STORE_VECTOR,  "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_sllc_o(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]<<SHIFT);
@@ -727,12 +694,7 @@ void test_sllc_o(int[] a0, int[] a1) {
     @IR(counts = { IRNode.LSHIFT_VI,     "= 0",
                    IRNode.LOAD_VECTOR_I, "> 0",
                    IRNode.STORE_VECTOR,  "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.LSHIFT_VI,     "= 0",
-                   IRNode.LOAD_VECTOR_I, "> 0",
-                   IRNode.STORE_VECTOR,  "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_sllc_on(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]<<(-SHIFT));
@@ -741,10 +703,7 @@ void test_sllc_on(int[] a0, int[] a1) {
 
     @Test
     @IR(counts = { IRNode.LSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.LSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_sllv(int[] a0, int[] a1, int b) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]<<b);
@@ -753,10 +712,7 @@ void test_sllv(int[] a0, int[] a1, int b) {
 
     @Test
     @IR(counts = { IRNode.URSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.URSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srlc(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>>VALUE);
@@ -765,10 +721,7 @@ void test_srlc(int[] a0, int[] a1) {
 
     @Test
     @IR(counts = { IRNode.URSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.URSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srlc_n(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>>(-VALUE));
@@ -780,12 +733,7 @@ void test_srlc_n(int[] a0, int[] a1) {
     @IR(counts = { IRNode.URSHIFT_VI,    "= 0",
                    IRNode.LOAD_VECTOR_I, "> 0",
                    IRNode.STORE_VECTOR,  "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.URSHIFT_VI,    "= 0",
-                   IRNode.LOAD_VECTOR_I, "> 0",
-                   IRNode.STORE_VECTOR,  "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srlc_o(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>>SHIFT);
@@ -797,12 +745,7 @@ void test_srlc_o(int[] a0, int[] a1) {
     @IR(counts = { IRNode.URSHIFT_VI,    "= 0",
                    IRNode.LOAD_VECTOR_I, "> 0",
                    IRNode.STORE_VECTOR,  "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.URSHIFT_VI,    "= 0",
-                   IRNode.LOAD_VECTOR_I, "> 0",
-                   IRNode.STORE_VECTOR,  "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srlc_on(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>>(-SHIFT));
@@ -811,10 +754,7 @@ void test_srlc_on(int[] a0, int[] a1) {
 
     @Test
     @IR(counts = { IRNode.URSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.URSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srlv(int[] a0, int[] a1, int b) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>>b);
@@ -823,10 +763,7 @@ void test_srlv(int[] a0, int[] a1, int b) {
 
     @Test
     @IR(counts = { IRNode.RSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.RSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srac(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>VALUE);
@@ -835,10 +772,7 @@ void test_srac(int[] a0, int[] a1) {
 
     @Test
     @IR(counts = { IRNode.RSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.RSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srac_n(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>(-VALUE));
@@ -850,12 +784,7 @@ void test_srac_n(int[] a0, int[] a1) {
     @IR(counts = { IRNode.RSHIFT_VI,     "= 0",
                    IRNode.LOAD_VECTOR_I, "> 0",
                    IRNode.STORE_VECTOR,  "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.RSHIFT_VI,     "= 0",
-                   IRNode.LOAD_VECTOR_I, "> 0",
-                   IRNode.STORE_VECTOR,  "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srac_o(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>SHIFT);
@@ -867,12 +796,7 @@ void test_srac_o(int[] a0, int[] a1) {
     @IR(counts = { IRNode.RSHIFT_VI,     "= 0",
                    IRNode.LOAD_VECTOR_I, "> 0",
                    IRNode.STORE_VECTOR,  "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.RSHIFT_VI,     "= 0",
-                   IRNode.LOAD_VECTOR_I, "> 0",
-                   IRNode.STORE_VECTOR,  "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srac_on(int[] a0, int[] a1) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>(-SHIFT));
@@ -881,10 +805,7 @@ void test_srac_on(int[] a0, int[] a1) {
 
     @Test
     @IR(counts = { IRNode.RSHIFT_VI, "> 0" },
-        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
-    @IR(counts = { IRNode.RSHIFT_VI, "> 0" },
-        applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"})
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true", "rvv", "true"})
     void test_srav(int[] a0, int[] a1, int b) {
         for (int i = 0; i < a0.length; i+=1) {
             a0[i] = (int)(a1[i]>>b);
diff --git a/test/hotspot/jtreg/compiler/c2/irTests/TestArrLenCheckOptimization.java b/test/hotspot/jtreg/compiler/c2/irTests/TestArrLenCheckOptimization.java
new file mode 100644
index 00000000000..cb955bf14e7
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/c2/irTests/TestArrLenCheckOptimization.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2024, Arm Limited. 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 compiler.c2.irTests;
+
+import compiler.lib.ir_framework.*;
+import jdk.test.lib.Asserts;
+
+/*
+ * @test
+ * @bug 8321308
+ * @summary AArch64: Fix matching predication for cbz/cbnz
+ * @requires os.arch=="aarch64"
+ * @library /test/lib /
+ * @run driver compiler.c2.irTests.TestArrLenCheckOptimization
+ */
+
+public class TestArrLenCheckOptimization {
+
+    int result = 0;
+
+    @Test
+    @IR(counts = {IRNode.CBZW_LS, "1"})
+    void test_le_int(int ia[]) {
+        result += ia[0];
+    }
+
+    @Test
+    @IR(counts = {IRNode.CBNZW_HI, "1"})
+    void test_gt_int(int ia[]) {
+        if (ia.length > 0) {
+            result += 0x88;
+        } else {
+            result -= 1;
+        }
+    }
+
+    @Test
+    @IR(counts = {IRNode.CBZ_LS, "1"})
+    void test_le_long(int ia[]) {
+        if (Long.compareUnsigned(ia.length, 0) > 0) {
+            result += 0x80;
+        } else {
+            result -= 1;
+        }
+    }
+
+    @Test
+    @IR(counts = {IRNode.CBZ_HI, "1"})
+    void test_gt_long(int ia[]) {
+        if (Long.compareUnsigned(ia.length, 0) > 0) {
+            result += 0x82;
+        } else {
+            result -= 1;
+        }
+    }
+
+    @Run(test = {"test_le_int", "test_gt_int", "test_le_long", "test_gt_long"},
+         mode = RunMode.STANDALONE)
+    public void test_runner() {
+        for (int i = 0; i < 10_000; i++) {
+            test_le_int(new int[1]);
+            test_gt_int(new int[0]);
+            test_le_long(new int[1]);
+            test_gt_long(new int[0]);
+        }
+    }
+
+    public static void main(String [] args) {
+        TestFramework.run();
+    }
+ }
diff --git a/test/hotspot/jtreg/compiler/c2/irTests/TestIfMinMax.java b/test/hotspot/jtreg/compiler/c2/irTests/TestIfMinMax.java
index 42be20162d8..89d8f1dd8e3 100644
--- a/test/hotspot/jtreg/compiler/c2/irTests/TestIfMinMax.java
+++ b/test/hotspot/jtreg/compiler/c2/irTests/TestIfMinMax.java
@@ -180,19 +180,19 @@ static Object[] setupIntArrays() {
         int[] a = new int[512];
         int[] b = new int[512];
 
-        // Fill from 1 to 50
-        for (int i = 0; i < 50; i++) {
+        // Fill from 1 to 125
+        for (int i = 0; i < 125; i++) {
             a[i] = i + 1;
             b[i] = 1;
         }
 
-        // Fill from -1 to -50
-        for (int i = 50; i < 100; i++) {
-            a[i] = -(i - 49);
+        // Fill from -1 to -125
+        for (int i = 125; i < 250; i++) {
+            a[i] = -(i - 124);
             b[i] = 1;
         }
 
-        for (int i = 100; i < 512; i++) {
+        for (int i = 250; i < 512; i++) {
             a[i] = RANDOM.nextInt();
             b[i] = 1;
         }
@@ -205,19 +205,19 @@ static Object[] setupLongArrays() {
         long[] a = new long[512];
         long[] b = new long[512];
 
-        // Fill from 1 to 50
-        for (int i = 0; i < 50; i++) {
+        // Fill from 1 to 125
+        for (int i = 0; i < 125; i++) {
             a[i] = i + 1;
             b[i] = 1;
         }
 
-        // Fill from -1 to -50
-        for (int i = 50; i < 100; i++) {
-            a[i] = -(i - 49);
+        // Fill from -1 to -125
+        for (int i = 125; i < 250; i++) {
+            a[i] = -(i - 124);
             b[i] = 1;
         }
 
-        for (int i = 100; i < 512; i++) {
+        for (int i = 250; i < 512; i++) {
             a[i] = RANDOM.nextLong();
             b[i] = 1;
         }
diff --git a/test/hotspot/jtreg/compiler/c2/irTests/TestVectorizeURShiftSubword.java b/test/hotspot/jtreg/compiler/c2/irTests/TestVectorizeURShiftSubword.java
index f477a08f717..9896a8b906e 100644
--- a/test/hotspot/jtreg/compiler/c2/irTests/TestVectorizeURShiftSubword.java
+++ b/test/hotspot/jtreg/compiler/c2/irTests/TestVectorizeURShiftSubword.java
@@ -35,7 +35,7 @@
  * @key randomness
  * @summary Auto-vectorization enhancement for unsigned shift right on signed subword types
  * @requires ((os.arch=="amd64" | os.arch=="x86_64") & (vm.opt.UseSSE == "null" | vm.opt.UseSSE > 3)) | os.arch=="aarch64" |
- *           (os.arch == "riscv64" & vm.cpu.features ~= ".*v,.*")
+ *           (os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*")
  * @library /test/lib /
  * @run driver compiler.c2.irTests.TestVectorizeURShiftSubword
  */
diff --git a/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java b/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java
index 57f41dece80..6f173fefe1e 100644
--- a/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java
+++ b/test/hotspot/jtreg/compiler/cha/AbstractRootMethod.java
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true
+ * @requires !vm.graal.enabled
  * @modules java.base/jdk.internal.org.objectweb.asm
  *          java.base/jdk.internal.misc
  *          java.base/jdk.internal.vm.annotation
diff --git a/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java b/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java
index ee2dda744e6..1b72399069e 100644
--- a/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java
+++ b/test/hotspot/jtreg/compiler/cha/DefaultRootMethod.java
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true
+ * @requires !vm.graal.enabled
  * @modules java.base/jdk.internal.org.objectweb.asm
  *          java.base/jdk.internal.misc
  *          java.base/jdk.internal.vm.annotation
diff --git a/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java b/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java
index 736fa242bdc..068da4100bd 100644
--- a/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java
+++ b/test/hotspot/jtreg/compiler/cha/StrengthReduceInterfaceCall.java
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @requires !vm.graal.enabled & vm.opt.final.UseVtableBasedCHA == true
+ * @requires !vm.graal.enabled
  * @modules java.base/jdk.internal.org.objectweb.asm
  *          java.base/jdk.internal.misc
  *          java.base/jdk.internal.vm.annotation
diff --git a/test/hotspot/jtreg/compiler/ciReplay/TestNullStaticField.java b/test/hotspot/jtreg/compiler/ciReplay/TestNullStaticField.java
new file mode 100644
index 00000000000..47a78ad5e44
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/ciReplay/TestNullStaticField.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc. 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 8333805
+ * @library / /test/lib
+ * @summary Replaying compilation with null static final fields results in a crash
+ * @requires vm.flightRecorder != true & vm.compMode != "Xint" & vm.compMode != "Xcomp" & vm.debug == true & vm.compiler2.enabled
+ * @modules java.base/jdk.internal.misc
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ *      compiler.ciReplay.TestNullStaticField
+ */
+
+package compiler.ciReplay;
+
+public class TestNullStaticField extends DumpReplayBase {
+
+    public static void main(String[] args) {
+        new TestNullStaticField().runTest(TIERED_DISABLED_VM_OPTION);
+    }
+
+    @Override
+    public void testAction() {
+        positiveTest(TIERED_DISABLED_VM_OPTION, "-XX:+ReplayIgnoreInitErrors");
+    }
+
+    @Override
+    public String getTestClass() {
+        return TestClassNullStaticField.class.getName();
+    }
+
+}
+
+class TestClassNullStaticField {
+
+    static final Object[] staticNullArrayField = null;
+    static final Object[][] staticNullMultiArrayField = null;
+    static final Object staticNullObjectField = null;
+    static final String staticNullStringField = null;
+    static final int[] staticNullIntArrayField = null;
+    static final Object[] staticNotNullArrayField = new A[10];
+    static final Object[][] staticNotNullMultiArrayField = new A[10][10];
+    static final Object staticNotNullObjectField = new A();
+    static final String staticNotNullStringField = "Not null";
+    static final int[] staticNotNullIntArrayField = new int[10];
+
+    public static void main(String[] args) {
+        for (int i = 0; i < 20_000; i++) {
+            test();
+        }
+    }
+    public static void test() {
+
+    }
+
+    private static class A {
+    }
+}
+
diff --git a/test/hotspot/jtreg/compiler/gcbarriers/TestShenandoahBarrierExpansion.java b/test/hotspot/jtreg/compiler/gcbarriers/TestShenandoahBarrierExpansion.java
new file mode 100644
index 00000000000..84a34695092
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/gcbarriers/TestShenandoahBarrierExpansion.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2024 Red Hat 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 compiler.gcbarriers;
+
+import compiler.lib.ir_framework.CompilePhase;
+import compiler.lib.ir_framework.DontInline;
+import compiler.lib.ir_framework.IR;
+import compiler.lib.ir_framework.IRNode;
+import compiler.lib.ir_framework.Test;
+import compiler.lib.ir_framework.TestFramework;
+
+/**
+ * @test
+ * @bug 8231569
+ * @summary Test that Shenandoah barriers are expanded correctly
+ * @library /test/lib /
+ * @requires vm.gc.Shenandoah
+ * @run main compiler.gcbarriers.TestShenandoahBarrierExpansion
+ */
+public class TestShenandoahBarrierExpansion {
+    public static void main(String[] args) {
+        TestFramework test = new TestFramework(TestShenandoahBarrierExpansion.class);
+        test.addFlags("-XX:+UseShenandoahGC");
+        test.start();
+    }
+
+    private static Object staticField;
+    @Test
+    @IR(failOn = IRNode.IF, phase = CompilePhase.AFTER_PARSING)
+    @IR(counts = { IRNode.IF, "2" }, phase = CompilePhase.BARRIER_EXPANSION)
+    public Object testLoadFieldObject() {
+        return staticField;
+    }
+
+    private static A staticField2 = new A();
+    @Test
+    @IR(counts = { IRNode.IF, "1" }, phase = CompilePhase.AFTER_PARSING)
+    @IR(counts = { IRNode.IF, "3" }, phase = CompilePhase.BARRIER_EXPANSION)
+    private static int testLoadObjectFieldWithNullCheck() {
+        return staticField2.intField;
+    }
+
+    private static A staticField3 = new A();
+    @Test
+    @IR(counts = { IRNode.IF, "2" }, phase = CompilePhase.AFTER_PARSING)
+    @IR(counts = { IRNode.IF, "6" }, phase = CompilePhase.BARRIER_EXPANSION)
+    private static int testLoadTwoObjectFieldsWithNullCheck() {
+        return staticField2.intField + staticField3.intField;
+    }
+
+    @Test
+    @IR(failOn = IRNode.IF, phase = CompilePhase.AFTER_PARSING)
+    @IR(counts = { IRNode.IF, "3" }, phase = CompilePhase.BARRIER_EXPANSION)
+    private static void testLoadTwoFieldObjectAndEscape() {
+        final A field2 = staticField2;
+        final A field3 = staticField3;
+        notInlined(field2, field3);
+    }
+
+    @DontInline
+    private static void notInlined(A field2, A field3) {
+        // noop
+    }
+
+    private static class A {
+        public int intField;
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/intrinsics/TestBitShuffleOpers.java b/test/hotspot/jtreg/compiler/intrinsics/TestBitShuffleOpers.java
index 9a7e0c6b9f2..064ffeb41fb 100644
--- a/test/hotspot/jtreg/compiler/intrinsics/TestBitShuffleOpers.java
+++ b/test/hotspot/jtreg/compiler/intrinsics/TestBitShuffleOpers.java
@@ -31,7 +31,7 @@
  *            (vm.cpu.features ~= ".*bmi2.*" & vm.cpu.features ~= ".*bmi1.*" &
  *             vm.cpu.features ~= ".*sse2.*")) |
  *            (os.arch=="aarch64" & vm.cpu.features ~= ".*svebitperm.*") |
- *            (os.arch=="riscv64" & vm.cpu.features ~= ".*v,.*"))
+ *            (os.arch=="riscv64" & vm.cpu.features ~= ".*rvv.*"))
  * @library /test/lib /
  * @run driver compiler.intrinsics.TestBitShuffleOpers
  */
diff --git a/test/hotspot/jtreg/compiler/intrinsics/chacha/TestChaCha20.java b/test/hotspot/jtreg/compiler/intrinsics/chacha/TestChaCha20.java
index 55f8375332d..448d594b6aa 100644
--- a/test/hotspot/jtreg/compiler/intrinsics/chacha/TestChaCha20.java
+++ b/test/hotspot/jtreg/compiler/intrinsics/chacha/TestChaCha20.java
@@ -38,7 +38,7 @@
  * @library /test/lib
  * @requires (vm.cpu.features ~= ".*avx512.*" | vm.cpu.features ~= ".*avx2.*" | vm.cpu.features ~= ".*avx.*") |
  *           (os.arch=="aarch64" & vm.cpu.features ~= ".*simd.*") |
- *           (os.arch == "riscv64" & vm.cpu.features ~= ".*v,.*")
+ *           (os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*")
  * @build   compiler.intrinsics.chacha.ExerciseChaCha20
  *          jdk.test.whitebox.WhiteBox
  * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
@@ -60,13 +60,9 @@ private static List<String> mix(List<String> o, String... mix) {
         return n;
     }
 
-    private static boolean containsFuzzy(List<String> list, String sub, Boolean matchExactly) {
+    private static boolean containsFuzzy(List<String> list, String sub) {
         for (String s : list) {
-            if (matchExactly) {
-                if (s.equals(sub)) return true;
-            } else {
-                if (s.contains(sub)) return true;
-            }
+            if (s.contains(sub)) return true;
         }
         return false;
     }
@@ -86,27 +82,27 @@ public static void main(String... args) throws Exception {
             }
 
             // Otherwise, select the tests that make sense on current platform.
-            if (containsFuzzy(cpuFeatures, "avx512", false)) {
+            if (containsFuzzy(cpuFeatures, "avx512")) {
                 System.out.println("Setting up AVX512 worker");
                 configs.add(List.of("-XX:UseAVX=3"));
             }
-            if (containsFuzzy(cpuFeatures, "avx2", false)) {
+            if (containsFuzzy(cpuFeatures, "avx2")) {
                 System.out.println("Setting up AVX2 worker");
                 configs.add(List.of("-XX:UseAVX=2"));
             }
-            if (containsFuzzy(cpuFeatures, "avx", false)) {
+            if (containsFuzzy(cpuFeatures, "avx")) {
                 System.out.println("Setting up AVX worker");
                 configs.add(List.of("-XX:UseAVX=1"));
             }
         } else if (Platform.isAArch64()) {
             // AArch64 intrinsics require the advanced simd instructions
-            if (containsFuzzy(cpuFeatures, "simd", false)) {
+            if (containsFuzzy(cpuFeatures, "simd")) {
                 System.out.println("Setting up ASIMD worker");
                 configs.add(new ArrayList());
             }
         } else if (Platform.isRISCV64()) {
             // Riscv64 intrinsics require the vector instructions
-            if (containsFuzzy(cpuFeatures, "v", true)) {
+            if (containsFuzzy(cpuFeatures, "rvv")) {
                 System.out.println("Setting up vector worker");
                 configs.add(List.of("-XX:+UseRVV"));
             }
diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java b/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java
index 1fb68439afb..efa7ccadfda 100644
--- a/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java
+++ b/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java
@@ -378,6 +378,26 @@ public class IRNode {
         beforeMatchingNameRegex(CAST_LL, "CastLL");
     }
 
+    public static final String CBNZW_HI = PREFIX + "CBNZW_HI" + POSTFIX;
+    static {
+        optoOnly(CBNZW_HI, "cbwhi");
+    }
+
+    public static final String CBZW_LS = PREFIX + "CBZW_LS" + POSTFIX;
+    static {
+        optoOnly(CBZW_LS, "cbwls");
+    }
+
+    public static final String CBZ_LS = PREFIX + "CBZ_LS" + POSTFIX;
+    static {
+        optoOnly(CBZ_LS, "cbls");
+    }
+
+    public static final String CBZ_HI = PREFIX + "CBZ_HI" + POSTFIX;
+    static {
+        optoOnly(CBZ_HI, "cbhi");
+    }
+
     public static final String CHECKCAST_ARRAY = PREFIX + "CHECKCAST_ARRAY" + POSTFIX;
     static {
         String regex = "(((?i:cmp|CLFI|CLR).*precise \\[.*:|.*(?i:mov|mv|or).*precise \\[.*:.*\\R.*(cmp|CMP|CLR))" + END;
diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java b/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java
index 82d4a398ab6..73943db3f53 100644
--- a/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java
+++ b/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java
@@ -31,6 +31,7 @@
 import jdk.test.whitebox.WhiteBox;
 
 import java.lang.reflect.Method;
+import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -74,7 +75,10 @@ public class IREncodingPrinter {
         "x86",
         // corresponds to vm.bits
         "32-bit",
-        "64-bit"
+        "64-bit",
+        // java.nio.ByteOrder
+        "little-endian",
+        "big-endian"
     ));
 
     // Please verify new CPU features before adding them. If we allow non-existent features
@@ -104,7 +108,7 @@ public class IREncodingPrinter {
         "asimd",
         "sve",
         // Riscv64
-        "v",
+        "rvv",
         "zvbb"
     ));
 
@@ -359,7 +363,9 @@ private boolean checkPlatform(String platform, String value) {
             arch = "x86";
         }
 
-        String currentPlatform = os + " " + arch + " " + (Platform.is32bit() ? "32-bit" : "64-bit");
+        String endianess = ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN)? "big-endian" : "little-endian";
+
+        String currentPlatform = os + " " + arch + " " + (Platform.is32bit() ? "32-bit" : "64-bit") + " " + endianess;
 
         return (trueValue && currentPlatform.contains(platform)) || (falseValue && !currentPlatform.contains(platform));
     }
diff --git a/test/hotspot/jtreg/compiler/locks/TestCoarsenedAndNotEscapedLocksElimination.java b/test/hotspot/jtreg/compiler/locks/TestCoarsenedAndNotEscapedLocksElimination.java
new file mode 100644
index 00000000000..4b20ddc0033
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/locks/TestCoarsenedAndNotEscapedLocksElimination.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2024, 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 8334421
+ * @summary C2 incorrectly marks not-escaped locks for elimination after
+ *          coarsened locks were eliminated and created unbalanced regions.
+ * @requires vm.compMode != "Xint"
+ * @run main/othervm -XX:-TieredCompilation TestCoarsenedAndNotEscapedLocksElimination
+ * @run main TestCoarsenedAndNotEscapedLocksElimination
+ */
+
+import java.util.Vector;
+
+class TestVector extends Vector<Object> {
+
+    TestVector() {
+        super();
+    }
+
+    TestVector(int initialCapacity) {
+        super(initialCapacity);
+    }
+
+    TestVector(int initialCapacity, int capacityIncrement) {
+        super(initialCapacity, capacityIncrement);
+    }
+
+    Object[] getElementData () {
+        return elementData; // access protected field
+    }
+}
+
+public class TestCoarsenedAndNotEscapedLocksElimination {
+
+    public static void main(String[] strArr) {
+        TestCoarsenedAndNotEscapedLocksElimination tc = new TestCoarsenedAndNotEscapedLocksElimination();
+        String result = null;
+        for (int i = 0; i < 12000; ++i) {
+            result = tc.test();
+            if (result != null) break;
+        }
+        System.out.println(result == null? "passed" : result);
+    }
+
+    int [][] vector_types = {
+       {-1, -1},
+       {0, -1},
+       {1, -1},
+       {2, -1},
+       {1025, -1},
+       {0, -2},
+       {1, -2},
+       {2, -2},
+       {1025, -2},
+       {0, 0},
+       {1, 0},
+       {2, 0},
+       {1025, 0},
+       {0, 1},
+       {1, 1},
+       {2, 1},
+       {1025, 1},
+       {0, 1025 },
+       {1, 1025 },
+       {2, 1025 },
+       {1025, 1025 }
+    };
+
+    Object [] elems = {
+        null,
+        new Object(),
+        new Vector(),
+        new Object[0]
+    };
+
+    int cntr = 0, mode = 0;
+
+    void reset() {
+        cntr = 0;
+        mode = 0;
+    }
+
+    TestVector nextVector() {
+        if (cntr == vector_types.length) {
+            return null;
+        } else {
+            TestVector vect;
+            if (vector_types[cntr][0] < 0) {
+                vect = new TestVector();
+            } else if (vector_types[cntr][1] == -2) {
+                vect = new TestVector(vector_types[cntr][0]);
+            } else {
+                vect = new TestVector(vector_types[cntr][0], vector_types[cntr][1]);
+            }
+            if (mode == 1) {
+                vect.addElement(null);
+                vect.addElement(new Object());
+                vect.addElement(new Vector());
+                vect.addElement(new Object[0]);
+            } else if (mode == 2) {
+                int cap = vect.capacity();
+                vect.addElement(null);
+                for (int i = 0; i < cap; i++) {
+                    vect.addElement(new Object());
+                }
+            }
+            if (++mode == 3) {
+                mode = 0;
+                cntr++;
+            }
+            return vect;
+        }
+    }
+
+    public String test() {
+        reset();
+        TestVector vect = (TestVector)nextVector();
+        while (vect != null) {
+            Object [] backup_array = new Object[vect.size()];
+            System.arraycopy(vect.getElementData(),0,backup_array,0,vect.size());
+
+            int old_size = vect.size();
+            vect.setSize(vect.size());
+            if (vect.size() != old_size) {
+                return "Vector: "+vect+" size changed after setSize(size())";
+            }
+            for (int i = 0; i < vect.size(); i++) {
+                if (vect.elementAt(i) != backup_array[i]) {
+                    return "Vector: "+vect+" : "+i+"th element changed after setSize(size())";
+                }
+            }
+
+            old_size = vect.size();
+            vect.setSize(vect.size()*2);
+            if (vect.size() != old_size*2) {
+                return "Vector: "+vect+" size incorrectly changed after setSize(size()*2)";
+            }
+            for (int i = 0; i < old_size; i++) {
+                if (vect.elementAt(i) != backup_array[i]) {
+                    return "Vector: "+vect+" : "+i+"th element changed after setSize(size()*2)";
+                }
+            }
+            for (int i = old_size; i < old_size*2; i++) {
+                if (vect.elementAt(i) != null) {
+                    return "Vector: "+vect+" : "+i+"th element not null after setSize(size()*2)";
+                }
+            }
+
+            old_size = vect.size();
+            int old_cap = vect.capacity();
+            vect.setSize(vect.capacity()+1);
+            if (vect.size() != old_cap+1) {
+                return "Vector: "+vect+" size incorrectly changed after setSize(capacity()+1)";
+            }
+            for (int i = 0; i < old_size && i < backup_array.length; i++) {
+                if (vect.elementAt(i) != backup_array[i]) {
+                    return "Vector: "+vect+" : "+i+"th element changed after setSize(capacity()+1)";
+                }
+            }
+            for (int i = old_size; i < old_cap + 1; i++) {
+                if (vect.elementAt(i) != null) {
+                    return "Vector: "+vect+" : "+i+"th element not null after setSize(capacity()+1)";
+                }
+            }
+
+            old_size = vect.size();
+            vect.setSize(vect.size()/2);
+            if (vect.size() != old_size/2) {
+                return "Vector: "+vect+" size incorrectly changed after setSize(size()/2)";
+            }
+            for (int i = 0; i < old_size/2 && i < backup_array.length; i++) {
+                if (vect.elementAt(i) != backup_array[i]) {
+                    return "Vector: "+vect+" : "+i+"th element changed after setSize(size()/2)";
+                }
+            }
+
+            vect = nextVector();
+        }
+        return null;
+    }
+
+}
+
diff --git a/test/hotspot/jtreg/compiler/loopopts/TestPartialPeelAtUnsignedTestsNegativeLimit.java b/test/hotspot/jtreg/compiler/loopopts/TestPartialPeelAtUnsignedTestsNegativeLimit.java
new file mode 100644
index 00000000000..7809f79ce9d
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/loopopts/TestPartialPeelAtUnsignedTestsNegativeLimit.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright (c) 2024, 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 id=Xbatch
+ * @bug 8332920
+ * @summary Tests partial peeling at unsigned tests with limit being negative in exit tests "i >u limit".
+ * @run main/othervm -Xbatch -XX:-TieredCompilation
+ *                   -XX:CompileOnly=*TestPartialPeel*::original*,*TestPartialPeel*::test*
+ *                   compiler.loopopts.TestPartialPeelAtUnsignedTestsNegativeLimit
+ */
+
+/*
+ * @test id=Xcomp-run-inline
+ * @bug 8332920
+ * @summary Tests partial peeling at unsigned tests with limit being negative in exit tests "i >u limit".
+ * @run main/othervm -Xcomp -XX:-TieredCompilation
+ *                   -XX:CompileOnly=*TestPartialPeel*::original*,*TestPartialPeel*::run*,*TestPartialPeel*::test*
+ *                   -XX:CompileCommand=inline,*TestPartialPeelAtUnsignedTestsNegativeLimit::test*
+ *                   -XX:CompileCommand=dontinline,*TestPartialPeelAtUnsignedTestsNegativeLimit::check
+ *                   compiler.loopopts.TestPartialPeelAtUnsignedTestsNegativeLimit
+ */
+
+/*
+ * @test id=Xcomp-compile-test
+ * @bug 8332920
+ * @summary Tests partial peeling at unsigned tests with limit being negative in exit tests "i >u limit".
+ * @run main/othervm -Xcomp -XX:-TieredCompilation -XX:CompileOnly=*TestPartialPeel*::original*,*TestPartialPeel*::test*
+ *                   compiler.loopopts.TestPartialPeelAtUnsignedTestsNegativeLimit
+ */
+
+/*
+ * @test id=vanilla
+ * @bug 8332920
+ * @requires vm.flavor == "server" & (vm.opt.TieredStopAtLevel == null | vm.opt.TieredStopAtLevel == 4)
+ * @summary Tests partial peeling at unsigned tests with limit being negative in exit tests "i >u limit".
+ *          Only run this test with C2 since it is time-consuming and only tests a C2 issue.
+ * @run main compiler.loopopts.TestPartialPeelAtUnsignedTestsNegativeLimit
+ */
+
+package compiler.loopopts;
+
+import java.util.Random;
+
+import static java.lang.Integer.*;
+
+public class TestPartialPeelAtUnsignedTestsNegativeLimit {
+    static int iFld = 10000;
+    static int iterations = 0;
+    static int iFld2;
+    static boolean flag;
+    final static Random RANDOM = new Random();
+
+    public static void main(String[] args) {
+        compareUnsigned(3, 3); // Load Integer class for -Xcomp
+        for (int i = 0; i < 2; i++) {
+            if (!originalTest()) {
+                throw new RuntimeException("originalTest() failed");
+            }
+        }
+
+        for (int i = 0; i < 2000; i++) {
+            // For profiling
+            iFld = -1;
+            originalTestVariation1();
+
+            // Actual run
+            iFld = MAX_VALUE - 100_000;
+            if (!originalTestVariation1()) {
+                throw new RuntimeException("originalTestVariation1() failed");
+            }
+        }
+
+        for (int i = 0; i < 2000; ++i) {
+            // For profiling
+            iFld = MAX_VALUE;
+            originalTestVariation2();
+
+            // Actual run
+            iFld = MIN_VALUE + 100000;
+            if (!originalTestVariation2()) {
+                throw new RuntimeException("originalTestVariation2() failed");
+            }
+        }
+
+        runWhileLTIncr();
+        runWhileLTDecr();
+    }
+
+    // Originally reported simplified regression test with 2 variations (see below).
+    public static boolean originalTest() {
+        for (int i = MAX_VALUE - 50_000; compareUnsigned(i, -1) < 0; i++) {
+            if (compareUnsigned(MIN_VALUE, i) < 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static boolean originalTestVariation1() {
+        int a = 0;
+        for (int i = iFld; compareUnsigned(i, -1) < 0; ++i) { // i <u -1
+
+            if (i >= Integer.MIN_VALUE + 1 && i <= 100) { // Transformed to unsigned test.
+                return true;
+            }
+            a *= 23;
+        }
+        return false;
+    }
+
+    public static boolean originalTestVariation2() {
+        int a = 0;
+        for (int i = iFld; compareUnsigned(i, -1000) < 0; i--) { // i <u -1
+            if (compareUnsigned(MAX_VALUE - 20, i) > 0) {
+                return true;
+            }
+            a = i;
+        }
+        System.out.println(a);
+        return false;
+    }
+
+
+    public static void testWhileLTIncr(int init, int limit) {
+        int i = init;
+        while (true) {
+            // <Peeled Section>
+
+            // Found as loop head in ciTypeFlow, but both paths inside loop -> head not cloned.
+            // As a result, this head has the safepoint as backedge instead of the loop exit test
+            // and we cannot create a counted loop (yet). We first need to partial peel.
+            if (flag) {
+            }
+
+            iFld2++;
+
+            // Loop exit test i >=u limit (i.e. "while (i <u limit)") to partial peel with.
+            // insert_cmpi_loop_exit() changes this exit condition into a signed and an unsigned test:
+            //   i >= limit && i >=u limit
+            // where the signed condition can be used as proper loop exit condition for a counted loop
+            // (we cannot use an unsigned counted loop exit condition).
+            //
+            // After Partial Peeling, we have:
+            //   if (i >= limit) goto Exit
+            // Loop:
+            //   if (i >=u limit) goto Exit
+            //   ...
+            //   i++;
+            //   if (i >= limit) goto Exit
+            //   goto Loop
+            // Exit:
+            //   ...
+            //
+            // If init = MAX_VALUE and limit = MIN_VALUE:
+            //   i >= limit
+            //   MAX_VALUE >= MIN_VALUE
+            // which is true where
+            //   i >=u limit
+            //   MAX_VALUE >=u MIN_VALUE
+            //   MAX_VALUE >=u (uint)(MAX_INT + 1)
+            // is false and we wrongly never enter the loop even though we should have.
+            // This results in a wrong execution.
+            if (compareUnsigned(i, limit) >= 0) {
+                return;
+            }
+            // <-- Partial Peeling CUT -->
+            // Safepoint
+            // <Unpeeled Section>
+            iterations++;
+            i++;
+        }
+    }
+
+    // Same as testWhileLTIncr() but with decrement instead.
+    public static void testWhileLTDecr(int init, int limit) {
+        int i = init;
+        while (true) {
+            if (flag) {
+            }
+
+            // Loop exit test.
+            if (compareUnsigned(i, limit) >= 0) { // While (i <u limit)
+                return;
+            }
+
+            iterations++;
+            i--;
+        }
+    }
+
+    public static void runWhileLTIncr() {
+        // Currently works:
+        testWhileLTIncr(MAX_VALUE, -1);
+        check(MIN_VALUE); // MAX_VALUE + 1 iterations
+        testWhileLTIncr(-1, 1);
+        check(0);
+        testWhileLTIncr(0, 0);
+        check(0);
+        checkIncrWithRandom(0, 0); // Sanity check this method.
+        flag = !flag; // Change profiling
+        testWhileLTIncr(MAX_VALUE - 2000, MAX_VALUE);
+        check(2000);
+        testWhileLTIncr(MAX_VALUE - 1990, MAX_VALUE);
+        check(1990);
+        testWhileLTIncr(MAX_VALUE - 1, MAX_VALUE);
+        check(1);
+        testWhileLTIncr(MIN_VALUE, MIN_VALUE + 2000);
+        check(2000);
+        testWhileLTIncr(MIN_VALUE, MIN_VALUE + 1990);
+        check(1990);
+        testWhileLTIncr(MIN_VALUE, MIN_VALUE + 1);
+        check(1);
+
+        flag = !flag;
+        // Overflow currently does not work with negative limit and is fixed with patch:
+        testWhileLTIncr(MAX_VALUE, MIN_VALUE);
+        check(1);
+        testWhileLTIncr(MAX_VALUE - 2000, MIN_VALUE);
+        check(2001);
+        testWhileLTIncr(MAX_VALUE, MIN_VALUE + 2000);
+        check(2001);
+        testWhileLTIncr(MAX_VALUE - 2000, MIN_VALUE + 2000);
+        check(4001);
+
+        // Random values
+        int init = RANDOM.nextInt(0, MAX_VALUE);
+        int limit = RANDOM.nextInt(MIN_VALUE, 0);
+        testWhileLTIncr(init, limit);
+        checkIncrWithRandom(init, limit);
+    }
+
+    public static void runWhileLTDecr() {
+        // Currently works:
+        testWhileLTDecr(1, -1);
+        check(2);
+        testWhileLTDecr(-1, 1);
+        check(0);
+        testWhileLTDecr(0, 0);
+        check(0);
+        checkDecrWithRandom(0, 0); // Sanity check this method.
+        flag = !flag;
+        testWhileLTDecr(MAX_VALUE, MIN_VALUE);
+        check(MIN_VALUE); // MAX_VALUE + 1 iterations
+        testWhileLTDecr(MAX_VALUE, -1);
+        check(MIN_VALUE); // MAX_VALUE + 1 iterations
+        testWhileLTDecr(MAX_VALUE, MIN_VALUE);
+        check(MIN_VALUE); // MAX_VALUE + 1 iterations
+        testWhileLTDecr(MIN_VALUE, 0);
+        check(0);
+        testWhileLTDecr(MIN_VALUE, 1);
+        check(0);
+        flag = !flag;
+
+        // Underflow currently does not work with negative limit and is fixed with patch:
+        testWhileLTDecr(MIN_VALUE, -1);
+        check(MIN_VALUE + 1); // MAX_VALUE + 2 iterations
+        testWhileLTDecr(MIN_VALUE, -2000);
+        check(MIN_VALUE + 1); // MAX_VALUE + 2 iterations
+        testWhileLTDecr(MIN_VALUE, MIN_VALUE + 1);
+        check(MIN_VALUE + 1); // MAX_VALUE + 2 iterations
+        testWhileLTDecr(MIN_VALUE + 2000, -1);
+        check(MIN_VALUE + 2001); // MAX_VALUE + 2002 iterations
+        testWhileLTDecr(MIN_VALUE + 2000, -2000);
+        check(MIN_VALUE + 2001); // MAX_VALUE + 2002 iterations
+        testWhileLTDecr(MIN_VALUE + 2000, MIN_VALUE + 2001);
+        check(MIN_VALUE + 2001); // MAX_VALUE + 2002 iterations
+
+        // Random values
+        int r1 = RANDOM.nextInt(MIN_VALUE, 0);
+        int r2 = RANDOM.nextInt(MIN_VALUE, 0);
+        int init = Math.min(r1, r2);
+        int limit = Math.max(r1, r2);
+        testWhileLTDecr(init, limit);
+        checkDecrWithRandom(init, limit);
+    }
+
+    static void check(int expectedIterations) {
+        if (expectedIterations != iterations) {
+            throw new RuntimeException("Expected " + expectedIterations + " iterations but only got " + iterations);
+        }
+        iterations = 0; // Reset
+    }
+
+    static void checkIncrWithRandom(long init, long limit) {
+        long expectedIterations = ((long)(MAX_VALUE) - init) + (limit - (long)MIN_VALUE) + 1;
+        if ((int)expectedIterations != iterations) {
+            String error = "Expected %d iterations but only got %d, init: %d, limit: %d"
+                            .formatted(expectedIterations, iterations, init, limit);
+            throw new RuntimeException(error);
+        }
+        iterations = 0; // Reset
+    }
+
+    static void checkDecrWithRandom(long init, long limit) {
+        long expectedIterations = init + MIN_VALUE + MAX_VALUE + 2;
+        if (init == limit) {
+            expectedIterations = 0;
+        }
+        if ((int)expectedIterations != iterations) {
+            String error = "Expected %d iterations but only got %d, init: %d, limit: %d"
+                    .formatted(expectedIterations, iterations, init, limit);
+            throw new RuntimeException(error);
+        }
+        iterations = 0; // Reset
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java b/test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java
index 9dc1cf1f031..c60144da0cd 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/CoLocatePackMemoryState.java
@@ -24,12 +24,11 @@
 
 /**
  * @test
- * @requires vm.compiler2.enabled
  * @bug 8238438
  * @summary Tests to select the memory state of the last load in a load pack in SuperWord::co_locate_pack.
  *
  * @run main/othervm -Xbatch -XX:CompileCommand=compileonly,compiler.loopopts.superword.CoLocatePackMemoryState::test
- *      -XX:LoopMaxUnroll=16 compiler.loopopts.superword.CoLocatePackMemoryState
+ *                   -XX:+IgnoreUnrecognizedVMOptions -XX:LoopMaxUnroll=16 compiler.loopopts.superword.CoLocatePackMemoryState
  */
 
 package compiler.loopopts.superword;
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java b/test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java
index 27bfa8cec0e..ee691a91bda 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/RedTest_long.java
@@ -25,7 +25,6 @@
  * @test
  * @bug 8240248
  * @summary Add C2 x86 Superword support for scalar logical reduction optimizations : long test
- * @requires vm.bits == "64"
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.RedTest_long
  */
@@ -137,6 +136,7 @@ public static void reductionInit2(
         failOn = {IRNode.ADD_REDUCTION_VL})
     @IR(applyIfCPUFeature = {"avx2", "true"},
         applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.ADD_REDUCTION_VL, ">= 1", IRNode.ADD_REDUCTION_VL, "<= 2"}) // one for main-loop, one for vector-post-loop
     public static long sumReductionImplement(
             long[] a,
@@ -154,6 +154,7 @@ public static long sumReductionImplement(
         failOn = {IRNode.OR_REDUCTION_V})
     @IR(applyIfCPUFeature = {"avx2", "true"},
         applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.OR_REDUCTION_V, ">= 1", IRNode.OR_REDUCTION_V, "<= 2"}) // one for main-loop, one for vector-post-loop
     public static long orReductionImplement(
             long[] a,
@@ -171,6 +172,7 @@ public static long orReductionImplement(
         failOn = {IRNode.AND_REDUCTION_V})
     @IR(applyIfCPUFeature = {"avx2", "true"},
         applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.AND_REDUCTION_V, ">= 1", IRNode.AND_REDUCTION_V, "<= 2"}) // one for main-loop, one for vector-post-loop
     public static long andReductionImplement(
             long[] a,
@@ -188,6 +190,7 @@ public static long andReductionImplement(
         failOn = {IRNode.XOR_REDUCTION_V})
     @IR(applyIfCPUFeature = {"avx2", "true"},
         applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.XOR_REDUCTION_V, ">= 1", IRNode.XOR_REDUCTION_V, "<= 2"}) // one for main-loop, one for vector-post-loop
     public static long xorReductionImplement(
             long[] a,
@@ -205,6 +208,7 @@ public static long xorReductionImplement(
         failOn = {IRNode.MUL_REDUCTION_VL})
     @IR(applyIfCPUFeature = {"avx512dq", "true"},
         applyIfAnd = {"SuperWordReductions", "true", "LoopMaxUnroll", ">= 8"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.MUL_REDUCTION_VL, ">= 1", IRNode.MUL_REDUCTION_VL, "<= 2"}) // one for main-loop, one for vector-post-loop
     public static long mulReductionImplement(
             long[] a,
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java b/test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java
index b1495d00548..591765bb582 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/ReductionPerf.java
@@ -25,11 +25,10 @@
  * @test
  * @bug 8074981 8302652
  * @summary Test SuperWord Reduction Perf.
- * @requires vm.compiler2.enabled
- * @requires vm.simpleArch == "x86" | vm.simpleArch == "x64" | vm.simpleArch == "aarch64" | vm.simpleArch == "riscv64"
  * @library /test/lib /
- * @run main/othervm -Xbatch -XX:LoopUnrollLimit=250
+ * @run main/othervm -Xbatch
  *                   -XX:CompileCommand=exclude,compiler.loopopts.superword.ReductionPerf::main
+ *                   -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=250
  *                   compiler.loopopts.superword.ReductionPerf
  */
 
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVector.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVector.java
index fe873770ab4..fd5c2969074 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVector.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVector.java
@@ -39,7 +39,6 @@
  * @summary Test AlignVector with various loop init, stride, scale, invar, etc.
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
- * @requires vm.compiler2.enabled
  * @run driver compiler.loopopts.superword.TestAlignVector NoAlignVector
  */
 
@@ -49,7 +48,6 @@
  * @summary Test AlignVector with various loop init, stride, scale, invar, etc.
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
- * @requires vm.compiler2.enabled
  * @run driver compiler.loopopts.superword.TestAlignVector AlignVector
  */
 
@@ -59,7 +57,6 @@
  * @summary Test AlignVector with various loop init, stride, scale, invar, etc.
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
- * @requires vm.compiler2.enabled
  * @run driver compiler.loopopts.superword.TestAlignVector VerifyAlignVector
  */
 
@@ -96,7 +93,7 @@ interface TestFunction {
     public static void main(String[] args) {
         TestFramework framework = new TestFramework(TestAlignVector.class);
         framework.addFlags("--add-modules", "java.base", "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED",
-                           "-XX:LoopUnrollLimit=250");
+                           "-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=250");
 
         switch (args[0]) {
             case "NoAlignVector"     -> { framework.addFlags("-XX:-AlignVector"); }
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVectorFuzzer.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVectorFuzzer.java
index 7526d180952..7b95781905e 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVectorFuzzer.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestAlignVectorFuzzer.java
@@ -27,10 +27,8 @@
  * @summary Fuzzing loops with different (random) init, limit, stride, scale etc. Do not force alignment.
  * @modules java.base/jdk.internal.misc
  * @library /test/lib
- * @requires vm.compiler2.enabled
  * @key randomness
  * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions
- *                                 -XX:CompileCommand=MemLimit,*.*,0
  *                                 -XX:LoopUnrollLimit=250
  *                                 -XX:CompileCommand=printcompilation,compiler.loopopts.superword.TestAlignVectorFuzzer::*
  *                                 compiler.loopopts.superword.TestAlignVectorFuzzer
@@ -42,10 +40,8 @@
  * @summary Fuzzing loops with different (random) init, limit, stride, scale etc. Verify AlignVector.
  * @modules java.base/jdk.internal.misc
  * @library /test/lib
- * @requires vm.compiler2.enabled
  * @key randomness
  * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions
- *                                 -XX:CompileCommand=MemLimit,*.*,0
  *                                 -XX:+AlignVector -XX:+VerifyAlignVector
  *                                 -XX:LoopUnrollLimit=250
  *                                 -XX:CompileCommand=printcompilation,compiler.loopopts.superword.TestAlignVectorFuzzer::*
@@ -58,11 +54,8 @@
  * @summary Fuzzing loops with different (random) init, limit, stride, scale etc. Verify AlignVector.
  * @modules java.base/jdk.internal.misc
  * @library /test/lib
- * @requires vm.compiler2.enabled
- * @requires vm.bits == 64
  * @key randomness
  * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions
- *                                 -XX:CompileCommand=MemLimit,*.*,0
  *                                 -XX:+AlignVector -XX:+VerifyAlignVector
  *                                 -XX:LoopUnrollLimit=250
  *                                 -XX:CompileCommand=printcompilation,compiler.loopopts.superword.TestAlignVectorFuzzer::*
@@ -76,10 +69,8 @@
  * @summary Fuzzing loops with different (random) init, limit, stride, scale etc. Verify AlignVector.
  * @modules java.base/jdk.internal.misc
  * @library /test/lib
- * @requires vm.compiler2.enabled
  * @key randomness
  * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions
- *                                 -XX:CompileCommand=MemLimit,*.*,0
  *                                 -XX:+AlignVector -XX:+VerifyAlignVector
  *                                 -XX:LoopUnrollLimit=250
  *                                 -XX:CompileCommand=printcompilation,compiler.loopopts.superword.TestAlignVectorFuzzer::*
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestCompatibleUseDefTypeSize.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestCompatibleUseDefTypeSize.java
new file mode 100644
index 00000000000..43580f4dee2
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestCompatibleUseDefTypeSize.java
@@ -0,0 +1,476 @@
+/*
+ * Copyright (c) 2024, 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 compiler.loopopts.superword;
+
+import compiler.lib.ir_framework.*;
+import jdk.test.lib.Utils;
+import jdk.test.whitebox.WhiteBox;
+import java.lang.reflect.Array;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Random;
+import java.nio.ByteOrder;
+
+/*
+ * @test
+ * @bug 8325155
+ * @summary Test some cases that vectorize after the removal of the alignment boundaries code.
+ *          Now, we instead check if use-def connections have compatible type size.
+ * @library /test/lib /
+ * @run driver compiler.loopopts.superword.TestCompatibleUseDefTypeSize
+ */
+
+public class TestCompatibleUseDefTypeSize {
+    static int RANGE = 1024*8;
+    private static final Random RANDOM = Utils.getRandomInstance();
+
+    // Inputs
+    byte[] aB;
+    byte[] bB;
+    short[] aS;
+    short[] bS;
+    char[] aC;
+    char[] bC;
+    int[] aI;
+    int[] bI;
+    long[] aL;
+    long[] bL;
+    float[] aF;
+    float[] bF;
+    double[] aD;
+    double[] bD;
+
+    // List of tests
+    Map<String,TestFunction> tests = new HashMap<String,TestFunction>();
+
+    // List of gold, the results from the first run before compilation
+    Map<String,Object[]> golds = new HashMap<String,Object[]>();
+
+    interface TestFunction {
+        Object[] run();
+    }
+
+    public static void main(String[] args) {
+        TestFramework.run();
+    }
+
+    public TestCompatibleUseDefTypeSize() {
+        // Generate input once
+        aB = generateB();
+        bB = generateB();
+        aS = generateS();
+        bS = generateS();
+        aC = generateC();
+        bC = generateC();
+        aI = generateI();
+        bI = generateI();
+        aL = generateL();
+        bL = generateL();
+        aF = generateF();
+        bF = generateF();
+        aD = generateD();
+        bD = generateD();
+
+        // Add all tests to list
+        tests.put("test0",       () -> { return test0(aB.clone(), bC.clone()); });
+        tests.put("test1",       () -> { return test1(aB.clone(), bC.clone()); });
+        tests.put("test2",       () -> { return test2(aB.clone(), bC.clone()); });
+        tests.put("test3",       () -> { return test3(aI.clone(), bI.clone()); });
+        tests.put("test4",       () -> { return test4(aI.clone(), bI.clone()); });
+        tests.put("test5",       () -> { return test5(aI.clone(), bF.clone()); });
+        tests.put("test6",       () -> { return test6(aI.clone(), bF.clone()); });
+        tests.put("test7",       () -> { return test7(aI.clone(), bF.clone()); });
+        tests.put("test8",       () -> { return test8(aL.clone(), bD.clone()); });
+        tests.put("test9",       () -> { return test9(aL.clone(), bD.clone()); });
+        tests.put("test10",      () -> { return test10(aL.clone(), bD.clone()); });
+        tests.put("test11",      () -> { return test11(aC.clone()); });
+
+        // Compute gold value for all test methods before compilation
+        for (Map.Entry<String,TestFunction> entry : tests.entrySet()) {
+            String name = entry.getKey();
+            TestFunction test = entry.getValue();
+            Object[] gold = test.run();
+            golds.put(name, gold);
+        }
+    }
+
+    @Warmup(100)
+    @Run(test = {"test0",
+                 "test1",
+                 "test2",
+                 "test3",
+                 "test4",
+                 "test5",
+                 "test6",
+                 "test7",
+                 "test8",
+                 "test9",
+                 "test10",
+                 "test11"})
+    public void runTests() {
+        for (Map.Entry<String,TestFunction> entry : tests.entrySet()) {
+            String name = entry.getKey();
+            TestFunction test = entry.getValue();
+            // Recall gold value from before compilation
+            Object[] gold = golds.get(name);
+            // Compute new result
+            Object[] result = test.run();
+            // Compare gold and new result
+            verify(name, gold, result);
+        }
+    }
+
+    static byte[] generateB() {
+        byte[] a = new byte[RANGE];
+        for (int i = 0; i < a.length; i++) {
+            a[i] = (byte)RANDOM.nextInt();
+        }
+        return a;
+    }
+
+    static short[] generateS() {
+        short[] a = new short[RANGE];
+        for (int i = 0; i < a.length; i++) {
+            a[i] = (short)RANDOM.nextInt();
+        }
+        return a;
+    }
+
+    static char[] generateC() {
+        char[] a = new char[RANGE];
+        for (int i = 0; i < a.length; i++) {
+            a[i] = (char)RANDOM.nextInt();
+        }
+        return a;
+    }
+
+    static int[] generateI() {
+        int[] a = new int[RANGE];
+        for (int i = 0; i < a.length; i++) {
+            a[i] = RANDOM.nextInt();
+        }
+        return a;
+    }
+
+    static long[] generateL() {
+        long[] a = new long[RANGE];
+        for (int i = 0; i < a.length; i++) {
+            a[i] = RANDOM.nextLong();
+        }
+        return a;
+    }
+
+    static float[] generateF() {
+        float[] a = new float[RANGE];
+        for (int i = 0; i < a.length; i++) {
+            a[i] = Float.intBitsToFloat(RANDOM.nextInt());
+        }
+        return a;
+    }
+
+    static double[] generateD() {
+        double[] a = new double[RANGE];
+        for (int i = 0; i < a.length; i++) {
+            a[i] = Double.longBitsToDouble(RANDOM.nextLong());
+        }
+        return a;
+    }
+
+    static void verify(String name, Object[] gold, Object[] result) {
+        if (gold.length != result.length) {
+            throw new RuntimeException("verify " + name + ": not the same number of outputs: gold.length = " +
+                                       gold.length + ", result.length = " + result.length);
+        }
+        for (int i = 0; i < gold.length; i++) {
+            Object g = gold[i];
+            Object r = result[i];
+            if (g.getClass() != r.getClass() || !g.getClass().isArray() || !r.getClass().isArray()) {
+                throw new RuntimeException("verify " + name + ": must both be array of same type:" +
+                                           " gold[" + i + "].getClass() = " + g.getClass().getSimpleName() +
+                                           " result[" + i + "].getClass() = " + r.getClass().getSimpleName());
+            }
+            if (g == r) {
+                throw new RuntimeException("verify " + name + ": should be two separate arrays (with identical content):" +
+                                           " gold[" + i + "] == result[" + i + "]");
+            }
+            if (Array.getLength(g) != Array.getLength(r)) {
+                    throw new RuntimeException("verify " + name + ": arrays must have same length:" +
+                                           " gold[" + i + "].length = " + Array.getLength(g) +
+                                           " result[" + i + "].length = " + Array.getLength(r));
+            }
+            Class c = g.getClass().getComponentType();
+            if (c == byte.class) {
+                verifyB(name, i, (byte[])g, (byte[])r);
+            } else if (c == short.class) {
+                verifyS(name, i, (short[])g, (short[])r);
+            } else if (c == char.class) {
+                verifyC(name, i, (char[])g, (char[])r);
+            } else if (c == int.class) {
+                verifyI(name, i, (int[])g, (int[])r);
+            } else if (c == long.class) {
+                verifyL(name, i, (long[])g, (long[])r);
+            } else if (c == float.class) {
+                verifyF(name, i, (float[])g, (float[])r);
+            } else if (c == double.class) {
+                verifyD(name, i, (double[])g, (double[])r);
+            } else {
+                throw new RuntimeException("verify " + name + ": array type not supported for verify:" +
+                                       " gold[" + i + "].getClass() = " + g.getClass().getSimpleName() +
+                                       " result[" + i + "].getClass() = " + r.getClass().getSimpleName());
+            }
+        }
+    }
+
+    static void verifyB(String name, int i, byte[] g, byte[] r) {
+        for (int j = 0; j < g.length; j++) {
+            if (g[j] != r[j]) {
+                throw new RuntimeException("verify " + name + ": arrays must have same content:" +
+                                           " gold[" + i + "][" + j + "] = " + g[j] +
+                                           " result[" + i + "][" + j + "] = " + r[j]);
+            }
+        }
+    }
+
+    static void verifyS(String name, int i, short[] g, short[] r) {
+        for (int j = 0; j < g.length; j++) {
+            if (g[j] != r[j]) {
+                throw new RuntimeException("verify " + name + ": arrays must have same content:" +
+                                           " gold[" + i + "][" + j + "] = " + g[j] +
+                                           " result[" + i + "][" + j + "] = " + r[j]);
+            }
+        }
+    }
+
+    static void verifyC(String name, int i, char[] g, char[] r) {
+        for (int j = 0; j < g.length; j++) {
+            if (g[j] != r[j]) {
+                throw new RuntimeException("verify " + name + ": arrays must have same content:" +
+                                           " gold[" + i + "][" + j + "] = " + g[j] +
+                                           " result[" + i + "][" + j + "] = " + r[j]);
+            }
+        }
+    }
+
+    static void verifyI(String name, int i, int[] g, int[] r) {
+        for (int j = 0; j < g.length; j++) {
+            if (g[j] != r[j]) {
+                throw new RuntimeException("verify " + name + ": arrays must have same content:" +
+                                           " gold[" + i + "][" + j + "] = " + g[j] +
+                                           " result[" + i + "][" + j + "] = " + r[j]);
+            }
+        }
+    }
+
+    static void verifyL(String name, int i, long[] g, long[] r) {
+        for (int j = 0; j < g.length; j++) {
+            if (g[j] != r[j]) {
+                throw new RuntimeException("verify " + name + ": arrays must have same content:" +
+                                           " gold[" + i + "][" + j + "] = " + g[j] +
+                                           " result[" + i + "][" + j + "] = " + r[j]);
+            }
+        }
+    }
+
+    static void verifyF(String name, int i, float[] g, float[] r) {
+        for (int j = 0; j < g.length; j++) {
+            if (Float.floatToIntBits(g[j]) != Float.floatToIntBits(r[j])) {
+                throw new RuntimeException("verify " + name + ": arrays must have same content:" +
+                                           " gold[" + i + "][" + j + "] = " + g[j] +
+                                           " result[" + i + "][" + j + "] = " + r[j]);
+            }
+        }
+    }
+
+    static void verifyD(String name, int i, double[] g, double[] r) {
+        for (int j = 0; j < g.length; j++) {
+            if (Double.doubleToLongBits(g[j]) != Double.doubleToLongBits(r[j])) {
+                throw new RuntimeException("verify " + name + ": arrays must have same content:" +
+                                           " gold[" + i + "][" + j + "] = " + g[j] +
+                                           " result[" + i + "][" + j + "] = " + r[j]);
+            }
+        }
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // "inflate"  method: 1 byte -> 2 byte.
+    // Java scalar code has no explicit conversion.
+    // Vector code would need a conversion. We may add this in the future.
+    static Object[] test0(byte[] src, char[] dst) {
+        for (int i = 0; i < src.length; i++) {
+            dst[i] = (char)(src[i] & 0xff);
+        }
+        return new Object[]{ src, dst };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // "inflate"  method: 1 byte -> 2 byte.
+    // Java scalar code has no explicit conversion.
+    // Vector code would need a conversion. We may add this in the future.
+    static Object[] test1(byte[] src, char[] dst) {
+        for (int i = 0; i < src.length; i++) {
+            dst[i] = (char)(src[i]);
+        }
+        return new Object[]{ src, dst };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // "deflate"  method: 2 byte -> 1 byte.
+    // Java scalar code has no explicit conversion.
+    // Vector code would need a conversion. We may add this in the future.
+    static Object[] test2(byte[] src, char[] dst) {
+        for (int i = 0; i < src.length; i++) {
+            src[i] = (byte)(dst[i]);
+        }
+        return new Object[]{ src, dst };
+    }
+
+    @Test
+    @IR(counts = {IRNode.LOAD_VECTOR_I, "> 0",
+                  IRNode.ADD_VI,        "> 0",
+                  IRNode.STORE_VECTOR,  "> 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIf = {"AlignVector", "false"}, // a[i] and a[i+1] cannot both be aligned.
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // Used to not vectorize because of "alignment boundaries".
+    // Assume 64 byte vector width:
+    // a[i+0:i+15] and a[i+1:i+16], each are 4 * 16 = 64 byte.
+    // The alignment boundary is every 64 byte, so one of the two vectors gets cut up.
+    static Object[] test3(int[] a, int[] b) {
+        for (int i = 0; i < a.length-1; i++) {
+            a[i] = (int)(b[i] + a[i+1]);
+        }
+        return new Object[]{ a, b };
+    }
+
+    @Test
+    @IR(counts = {IRNode.LOAD_VECTOR_I, "> 0",
+                  IRNode.ADD_VI,        "> 0",
+                  IRNode.STORE_VECTOR,  "> 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIf = {"AlignVector", "false"}, // a[i] and a[i+1] cannot both be aligned.
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // same as test3, but hand-unrolled
+    static Object[] test4(int[] a, int[] b) {
+        for (int i = 0; i < a.length-2; i+=2) {
+            a[i+0] = (int)(b[i+0] + a[i+1]);
+            a[i+1] = (int)(b[i+1] + a[i+2]);
+        }
+        return new Object[]{ a, b };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // In theory, one would expect this to be a simple 4byte -> 4byte conversion.
+    // But there is a CmpF and CMove here because we check for isNaN. Plus a MoveF2I.
+    //
+    // Would be nice to vectorize: Missing support for CmpF, CMove and MoveF2I.
+    static Object[] test5(int[] a, float[] b) {
+        for (int i = 0; i < a.length; i++) {
+            a[i] = Float.floatToIntBits(b[i]);
+        }
+        return new Object[]{ a, b };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // Missing support for MoveF2I
+    static Object[] test6(int[] a, float[] b) {
+        for (int i = 0; i < a.length; i++) {
+            a[i] = Float.floatToRawIntBits(b[i]);
+        }
+        return new Object[]{ a, b };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // Missing support for MoveI2F
+    static Object[] test7(int[] a, float[] b) {
+        for (int i = 0; i < a.length; i++) {
+            b[i] = Float.intBitsToFloat(a[i]);
+        }
+        return new Object[]{ a, b };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // Missing support for Needs CmpD, CMove and MoveD2L
+    static Object[] test8(long[] a, double[] b) {
+        for (int i = 0; i < a.length; i++) {
+            a[i] = Double.doubleToLongBits(b[i]);
+        }
+        return new Object[]{ a, b };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // Missing support for MoveD2L
+    static Object[] test9(long[] a, double[] b) {
+        for (int i = 0; i < a.length; i++) {
+            a[i] = Double.doubleToRawLongBits(b[i]);
+        }
+        return new Object[]{ a, b };
+    }
+
+    @Test
+    @IR(counts = {IRNode.STORE_VECTOR, "= 0"},
+        applyIfPlatform = {"64-bit", "true"},
+        applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
+    // Missing support for MoveL2D
+    static Object[] test10(long[] a, double[] b) {
+        for (int i = 0; i < a.length; i++) {
+            b[i] = Double.longBitsToDouble(a[i]);
+        }
+        return new Object[]{ a, b };
+    }
+
+    @Test
+    // MaxI reduction is with char type, but the MaxI char vector is not implemented.
+    static Object[] test11(char[] a) {
+        char m = 0;
+        for (int i = 0; i < a.length; i++) {
+            m = (char)Math.max(m, a[i]);
+            a[i] = 0;
+        }
+        return new Object[]{ a, new char[] { m } };
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java
index 94e47f3f747..3849f1b05cf 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestCyclicDependency.java
@@ -27,7 +27,6 @@
  * @bug 8298935
  * @summary Writing forward on array creates cyclic dependency
  *          which leads to wrong result, when ignored.
- * @requires vm.compiler2.enabled
  * @library /test/lib /
  * @run driver TestCyclicDependency
  */
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java
index 1e48ae07106..2f0a5809d08 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java
@@ -27,7 +27,7 @@
  *   and various MaxVectorSize values, and +- AlignVector.
  *
  * Note: this test is auto-generated. Please modify / generate with script:
- *       https://bugs.openjdk.org/browse/JDK-8310190
+ *       https://bugs.openjdk.org/browse/JDK-8333729
  *
  * Types: int, long, short, char, byte, float, double
  * Offsets: 0, -1, 1, -2, 2, -3, 3, -4, 4, -7, 7, -8, 8, -14, 14, -16, 16, -18, 18, -20, 20, -31, 31, -32, 32, -63, 63, -64, 64, -65, 65, -128, 128, -129, 129, -192, 192
@@ -113,7 +113,6 @@
  * @test id=vanilla-A
  * @bug 8298935 8308606 8310308 8312570 8310190
  * @summary Test SuperWord: vector size, offsets, dependencies, alignment.
- * @requires vm.compiler2.enabled
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestDependencyOffsets vanilla-A
  */
@@ -122,7 +121,6 @@
  * @test id=vanilla-U
  * @bug 8298935 8308606 8310308 8312570 8310190
  * @summary Test SuperWord: vector size, offsets, dependencies, alignment.
- * @requires vm.compiler2.enabled
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestDependencyOffsets vanilla-U
  */
@@ -1285,7 +1283,7 @@ public static void main(String args[]) {
                            "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestDependencyOffsets::init",
                            "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestDependencyOffsets::test*",
                            "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestDependencyOffsets::verify",
-                           "-XX:LoopUnrollLimit=250");
+                           "-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=250");
 
         if (args.length != 1) {
             throw new RuntimeException("Test requires exactly one argument!");
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java
index 2a27aad8d5a..a0e4b58f509 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestGeneralizedReductions.java
@@ -27,7 +27,6 @@
  * @summary Test reduction vectorizations that are enabled by performing SLP
  *          reduction analysis on unrolled loops.
  * @library /test/lib /
- * @requires vm.bits == 64
  * @run driver compiler.loopopts.superword.TestGeneralizedReductions
  */
 
@@ -42,7 +41,7 @@ public class TestGeneralizedReductions {
 
     public static void main(String[] args) throws Exception {
         // Fix maximum number of unrolls for test stability.
-        TestFramework.runWithFlags("-XX:LoopMaxUnroll=16");
+        TestFramework.runWithFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopMaxUnroll=16");
     }
 
     @Run(test = {"testReductionOnGlobalAccumulator",
@@ -82,7 +81,9 @@ private static void initArray(long[] array) {
     }
 
     @Test
-    @IR(applyIfCPUFeature = {"avx2", "true"}, applyIf = {"SuperWordReductions", "true"},
+    @IR(applyIfCPUFeature = {"avx2", "true"},
+        applyIf = {"SuperWordReductions", "true"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.ADD_REDUCTION_VI, ">= 1"})
     private static long testReductionOnGlobalAccumulator(long[] array) {
         acc = 0;
@@ -93,7 +94,9 @@ private static long testReductionOnGlobalAccumulator(long[] array) {
     }
 
     @Test
-    @IR(applyIfCPUFeature = {"avx2", "true"}, applyIf = {"SuperWordReductions", "true"},
+    @IR(applyIfCPUFeature = {"avx2", "true"},
+        applyIf = {"SuperWordReductions", "true"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.ADD_REDUCTION_VI, ">= 1"})
     private static long testReductionOnPartiallyUnrolledLoop(long[] array) {
         int sum = 0;
@@ -105,7 +108,9 @@ private static long testReductionOnPartiallyUnrolledLoop(long[] array) {
     }
 
     @Test
-    @IR(applyIfCPUFeature = {"avx2", "true"}, applyIf = {"SuperWordReductions", "true"},
+    @IR(applyIfCPUFeature = {"avx2", "true"},
+        applyIf = {"SuperWordReductions", "true"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.ADD_REDUCTION_VI, ">= 1"})
     private static long testReductionOnLargePartiallyUnrolledLoop(long[] array) {
         int sum = 0;
@@ -128,7 +133,9 @@ private static long testReductionOnLargePartiallyUnrolledLoop(long[] array) {
     // If this limitation is overcome in the future, the test case should be
     // turned into a positive one.
     @Test
-    @IR(applyIfCPUFeature = {"avx2", "true"}, applyIf = {"SuperWordReductions", "true"},
+    @IR(applyIfCPUFeature = {"avx2", "true"},
+        applyIf = {"SuperWordReductions", "true"},
+        applyIfPlatform = {"64-bit", "true"},
         failOn = {IRNode.ADD_REDUCTION_VI})
     private static long testReductionOnPartiallyUnrolledLoopWithSwappedInputs(long[] array) {
         int sum = 0;
@@ -142,6 +149,7 @@ private static long testReductionOnPartiallyUnrolledLoopWithSwappedInputs(long[]
     @Test
     @IR(applyIfCPUFeature = {"avx2", "true"},
         applyIfAnd = {"SuperWordReductions", "true","UsePopCountInstruction", "true"},
+        applyIfPlatform = {"64-bit", "true"},
         counts = {IRNode.ADD_REDUCTION_VI, ">= 1",
                   IRNode.POPCOUNT_VL, ">= 1"})
     @IR(applyIfPlatform = {"riscv64", "true"},
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java
index b2748348036..65398e8adfd 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency.java
@@ -27,8 +27,6 @@
  * @bug 8304042
  * @summary Test some examples with independent packs with cyclic dependency
  *          between the packs.
- * @requires vm.bits == 64
- * @requires vm.compiler2.enabled
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency
@@ -78,7 +76,7 @@ public static void main(String args[]) {
                                    "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency::test*",
                                    "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency::verify",
                                    "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency::init",
-                                   "-XX:LoopUnrollLimit=1000");
+                                   "-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=1000");
     }
 
     TestIndependentPacksWithCyclicDependency() {
@@ -120,6 +118,7 @@ public void runTest0() {
 
     @Test
     @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VF, "> 0"},
+        applyIfPlatform = {"64-bit", "true"},
         applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
     static void test0(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb) {
         for (int i = 0; i < RANGE; i+=2) {
@@ -144,6 +143,7 @@ public void runTest1() {
 
     @Test
     @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VF, "> 0", IRNode.VECTOR_CAST_F2I, "> 0", IRNode.VECTOR_CAST_I2F, "> 0"},
+        applyIfPlatform = {"64-bit", "true"},
         applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"})
     static void test1(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb) {
         for (int i = 0; i < RANGE; i+=2) {
@@ -167,6 +167,7 @@ public void runTest2() {
 
     @Test
     @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VI, "> 0"},
+        applyIfPlatform = {"64-bit", "true"},
         applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
     static void test2(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb) {
         for (int i = 0; i < RANGE; i+=2) {
@@ -191,6 +192,7 @@ public void runTest3() {
 
     @Test
     @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VF, "> 0"},
+        applyIfPlatform = {"64-bit", "true"},
         applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
     static void test3(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb) {
         for (int i = 0; i < RANGE; i+=2) {
@@ -267,6 +269,7 @@ public void runTest6() {
 
     @Test
     @IR(counts = {IRNode.ADD_VI, "> 0", IRNode.MUL_VI, "> 0", IRNode.ADD_VF, "> 0"},
+        applyIfPlatform = {"64-bit", "true"},
         applyIfCPUFeatureOr = {"sse4.1", "true", "asimd", "true"})
     static void test6(int[] dataIa, int[] dataIb, float[] dataFa, float[] dataFb,
                       long[] dataLa, long[] dataLb) {
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java
index 31a2ba3a0cb..32d69689a42 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestIndependentPacksWithCyclicDependency2.java
@@ -28,11 +28,10 @@
  * @summary Test some examples with independent packs with cyclic dependency
  *          between the packs.
  *          Before fix, this hit: "assert(!is_visited) failed: visit only once"
- * @requires vm.compiler2.enabled
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
- * @run main/othervm -XX:LoopUnrollLimit=250
- *                   -XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency2::test
+ * @run main/othervm -XX:CompileCommand=compileonly,compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency2::test
+ *                   -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=250
  *                   compiler.loopopts.superword.TestIndependentPacksWithCyclicDependency2
  */
 
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeCompilation.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeCompilation.java
index afe19fa1cd8..cdd80d3baaa 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeCompilation.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeCompilation.java
@@ -27,9 +27,9 @@
  * @test
  * @bug 8327978
  * @summary Test compile time for large compilation, where SuperWord takes especially much time.
- * @requires vm.compiler2.enabled
- * @run main/othervm/timeout=30 -XX:LoopUnrollLimit=1000 -Xbatch
+ * @run main/othervm/timeout=30 -Xbatch
  *                              -XX:CompileCommand=compileonly,compiler.loopopts.superword.TestLargeCompilation::test*
+ *                              -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=1000
  *                              compiler.loopopts.superword.TestLargeCompilation
  */
 
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java
index cfb2931d928..b3453c24d77 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestLargeScaleAndStride.java
@@ -35,8 +35,7 @@
  * @bug 8328938
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
- * @requires vm.compiler2.enabled
- * @run main/othervm -XX:+AlignVector compiler.loopopts.superword.TestLargeScaleAndStride
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlignVector compiler.loopopts.superword.TestLargeScaleAndStride
  */
 
 package compiler.loopopts.superword;
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java
index 752c8010468..45e3af07741 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMovingLoadBeforeStore.java
@@ -24,16 +24,16 @@
 
 /**
  * @test
- * @requires vm.compiler2.enabled
  * @bug 8316679 8316594
  * @summary In SuperWord::output, LoadVector can be moved before StoreVector, but only if it is proven to be safe.
  * @key randomness
  * @modules java.base/jdk.internal.misc
  * @library /test/lib
  * @run main/othervm -XX:CompileCommand=compileonly,compiler.loopopts.superword.TestMovingLoadBeforeStore::test*
- *                   -Xbatch -XX:LoopUnrollLimit=100
- *                   -XX:+UnlockDiagnosticVMOptions -XX:+StressLCM
  *                   --add-modules java.base --add-exports java.base/jdk.internal.misc=ALL-UNNAMED
+ *                   -Xbatch
+ *                   -XX:+UnlockDiagnosticVMOptions -XX:+StressLCM
+ *                   -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=100
  *                   compiler.loopopts.superword.TestMovingLoadBeforeStore
  */
 
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java
index 4521d43804b..e0f073c7f8f 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMulAddS2I.java
@@ -41,7 +41,6 @@ public class TestMulAddS2I {
 
     static short[] sArr1 = new short[RANGE];
     static short[] sArr2 = new short[RANGE];
-    static int[] ioutArr = new int[RANGE];
     static final int[] GOLDEN_A;
     static final int[] GOLDEN_B;
     static final int[] GOLDEN_C;
@@ -50,6 +49,10 @@ public class TestMulAddS2I {
     static final int[] GOLDEN_F;
     static final int[] GOLDEN_G;
     static final int[] GOLDEN_H;
+    static final int[] GOLDEN_I;
+    static final int[] GOLDEN_J;
+    static final int[] GOLDEN_K;
+    static final int[] GOLDEN_L;
 
     static {
         for (int i = 0; i < RANGE; i++) {
@@ -58,31 +61,40 @@ public class TestMulAddS2I {
         }
         GOLDEN_A = testa();
         GOLDEN_B = testb();
-        GOLDEN_C = testc();
-        GOLDEN_D = testd();
-        GOLDEN_E = teste();
-        GOLDEN_F = testf();
-        GOLDEN_G = testg();
-        GOLDEN_H = testh();
+        GOLDEN_C = testc(new int[ITER]);
+        GOLDEN_D = testd(new int[ITER]);
+        GOLDEN_E = teste(new int[ITER]);
+        GOLDEN_F = testf(new int[ITER]);
+        GOLDEN_G = testg(new int[ITER]);
+        GOLDEN_H = testh(new int[ITER]);
+        GOLDEN_I = testi(new int[ITER]);
+        GOLDEN_J = testj(new int[ITER]);
+        GOLDEN_K = testk(new int[ITER]);
+        GOLDEN_L = testl(new int[ITER]);
     }
 
 
     public static void main(String[] args) {
-        TestFramework.runWithFlags("-XX:+AlignVector");
-        TestFramework.runWithFlags("-XX:-AlignVector");
+        TestFramework.runWithFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AlignVector");
+        TestFramework.runWithFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:-AlignVector");
     }
 
-    @Run(test = {"testa", "testb", "testc", "testd", "teste", "testf", "testg", "testh"})
+    @Run(test = {"testa", "testb", "testc", "testd", "teste", "testf", "testg", "testh",
+                 "testi", "testj", "testk", "testl"})
     @Warmup(0)
     public static void run() {
         compare(testa(), GOLDEN_A, "testa");
         compare(testb(), GOLDEN_B, "testb");
-        compare(testc(), GOLDEN_C, "testc");
-        compare(testd(), GOLDEN_D, "testd");
-        compare(teste(), GOLDEN_E, "teste");
-        compare(testf(), GOLDEN_F, "testf");
-        compare(testg(), GOLDEN_G, "testg");
-        compare(testh(), GOLDEN_H, "testh");
+        compare(testc(new int[ITER]), GOLDEN_C, "testc");
+        compare(testd(new int[ITER]), GOLDEN_D, "testd");
+        compare(teste(new int[ITER]), GOLDEN_E, "teste");
+        compare(testf(new int[ITER]), GOLDEN_F, "testf");
+        compare(testg(new int[ITER]), GOLDEN_G, "testg");
+        compare(testh(new int[ITER]), GOLDEN_H, "testh");
+        compare(testi(new int[ITER]), GOLDEN_I, "testi");
+        compare(testj(new int[ITER]), GOLDEN_J, "testj");
+        compare(testk(new int[ITER]), GOLDEN_K, "testk");
+        compare(testl(new int[ITER]), GOLDEN_L, "testl");
     }
 
     public static void compare(int[] out, int[] golden, String name) {
@@ -138,8 +150,7 @@ public static int[] testb() {
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
     @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
-    public static int[] testc() {
-        int[] out = new int[ITER];
+    public static int[] testc(int[] out) {
         for (int i = 0; i < ITER; i++) {
             out[i] += ((sArr1[2*i] * sArr2[2*i]) + (sArr1[2*i+1] * sArr2[2*i+1]));
         }
@@ -155,8 +166,7 @@ public static int[] testc() {
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
     @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
-    public static int[] testd() {
-        int[] out = ioutArr;
+    public static int[] testd(int[] out) {
         for (int i = 0; i < ITER-2; i+=2) {
             // Unrolled, with the same structure.
             out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
@@ -174,8 +184,7 @@ public static int[] testd() {
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
     @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
-    public static int[] teste() {
-        int[] out = ioutArr;
+    public static int[] teste(int[] out) {
         for (int i = 0; i < ITER-2; i+=2) {
             // Unrolled, with some swaps.
             out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
@@ -193,8 +202,7 @@ public static int[] teste() {
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
     @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
-    public static int[] testf() {
-        int[] out = ioutArr;
+    public static int[] testf(int[] out) {
         for (int i = 0; i < ITER-2; i+=2) {
             // Unrolled, with some swaps.
             out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
@@ -212,8 +220,7 @@ public static int[] testf() {
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
     @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
-    public static int[] testg() {
-        int[] out = ioutArr;
+    public static int[] testg(int[] out) {
         for (int i = 0; i < ITER-2; i+=2) {
             // Unrolled, with some swaps.
             out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
@@ -231,8 +238,7 @@ public static int[] testg() {
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
     @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
         counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
-    public static int[] testh() {
-        int[] out = ioutArr;
+    public static int[] testh(int[] out) {
         for (int i = 0; i < ITER-2; i+=2) {
             // Unrolled, with some swaps.
             out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
@@ -240,4 +246,57 @@ public static int[] testh() {
         }
         return out;
     }
+
+    @Test
+    @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"},
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
+    @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"})
+    public static int[] testi(int[] out) {
+        for (int i = 0; i < ITER-2; i+=2) {
+            // Unrolled, with some swaps that prevent vectorization.
+            out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); // ok
+            out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+3]) + (sArr1[2*i+3] * sArr2[2*i+2])); // bad
+        }
+        return out;
+    }
+
+    @Test
+    @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"},
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
+    @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"})
+    public static int[] testj(int[] out) {
+        for (int i = 0; i < ITER-2; i+=2) {
+            // Unrolled, with some swaps that prevent vectorization.
+            out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+1]) + (sArr1[2*i+1] * sArr2[2*i+0])); // bad
+            out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+3]) + (sArr1[2*i+3] * sArr2[2*i+2])); // bad
+        }
+        return out;
+    }
+
+    @Test
+    @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"},
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
+    @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"})
+    public static int[] testk(int[] out) {
+        for (int i = 0; i < ITER-2; i+=2) {
+            // Unrolled, with some swaps that prevent vectorization.
+            out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+1]) + (sArr1[2*i+1] * sArr2[2*i+0])); // bad
+            out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+2]) + (sArr1[2*i+3] * sArr2[2*i+3])); // ok
+        }
+        return out;
+    }
+
+    @Test
+    @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"},
+        applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
+    @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"})
+    public static int[] testl(int[] out) {
+        for (int i = 0; i < ITER-2; i+=2) {
+            // Unrolled, with some swaps that prevent vectorization.
+            out[i+0] += ((sArr1[2*i+1] * sArr2[2*i+1]) + (sArr1[2*i+0] * sArr2[2*i+0])); // ok
+            out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+3]) + (sArr1[2*i+3] * sArr2[2*i+2])); // bad
+        }
+        return out;
+    }
+
 }
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/BufferOverflowProvoker.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java
similarity index 55%
rename from test/hotspot/jtreg/compiler/testlibrary/rtm/BufferOverflowProvoker.java
rename to test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java
index 6a3ab4e35aa..2062469edb0 100644
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/BufferOverflowProvoker.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestParallelReduction.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,27 +21,40 @@
  * questions.
  */
 
-package compiler.testlibrary.rtm;
+package compiler.loopopts.superword;
 
-/**
- * In order to provoke transactional execution abort due to
- * internal's buffer overflow BufferOverflowProvoker modifies
- * 1MB of BYTES during single transaction.
+/*
+ * @test
+ * @bug 8333876
+ * @summary Test parallel reductions.
+ * @run main compiler.loopopts.superword.TestParallelReduction
  */
-class BufferOverflowProvoker extends AbortProvoker {
-    /**
-     * To force buffer overflow abort we modify memory region with
-     * size more then L1d cache size.
-     */
-    private static final int MORE_THAN_L1D_SIZE = 1024 * 1024;
-    private static final byte[] DATA = new byte[MORE_THAN_L1D_SIZE];
 
-    @Override
-    public void forceAbort() {
-        synchronized(monitor) {
-            for (int i = 0; i < BufferOverflowProvoker.DATA.length; i++) {
-                BufferOverflowProvoker.DATA[i]++;
+public class TestParallelReduction {
+    static int RANGE = 10_000;
+
+    public static void main(String[] args) {
+        float[] a = new float[RANGE];
+        for (int i = 0; i < a.length; i++) {
+            a[i] = i;
+        }
+
+        float gold = test(a);
+
+        for (int i = 0; i < 10_000; i++) {
+            if (test(a) != gold) {
+                throw new RuntimeException("wrong value");
             }
         }
     }
+
+    static float test(float[] a) {
+        float x = 0;
+        float y = 0;
+        for (int i = 0; i < a.length; i+=2) {
+            x += a[i+0];
+            y += a[i+1];
+        }
+        return x+y;
+    }
 }
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java
index 99e1e2465f8..b69bff04088 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestPeeledReductionNode.java
@@ -29,8 +29,9 @@
  * @library /test/lib
  * @comment The test is run with -XX:LoopUnrollLimit=32 to prevent unrolling
  *          from fully replacing vectorization.
- * @run main/othervm -Xbatch -XX:LoopUnrollLimit=32
- *      compiler.loopopts.superword.TestPeeledReductionNode
+ * @run main/othervm -Xbatch
+ *                   -XX:+IgnoreUnrecognizedVMOptions -XX:LoopUnrollLimit=32
+ *                   compiler.loopopts.superword.TestPeeledReductionNode
  */
 package compiler.loopopts.superword;
 
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java
index 488e32c416a..5d419766aeb 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestPickFirstMemoryState.java
@@ -24,7 +24,6 @@
 
 /**
  * @test
- * @requires vm.compiler2.enabled
  * @bug 8240281
  * @summary Test which needs to select the memory state of the first load in a load pack in SuperWord::co_locate_pack.
  *
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java
index 4f1972dfdfe..bbdf4d3ad7a 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestPickLastMemoryState.java
@@ -25,7 +25,6 @@
 
 /**
  * @test
- * @requires vm.compiler2.enabled
  * @bug 8290910 8293216
  * @summary Test which needs to select the memory state of the last load in a load pack in SuperWord::co_locate_pack.
  *
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java
index f74c19d1b8b..f2ed8b6aec2 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestScheduleReordersScalarMemops.java
@@ -28,7 +28,6 @@
  * @bug 8304720
  * @summary Test some examples where non-vectorized memops also need to
  *          be reordered during SuperWord::schedule.
- * @requires vm.compiler2.enabled
  * @modules java.base/jdk.internal.misc
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestScheduleReordersScalarMemops
@@ -55,8 +54,8 @@ public static void main(String args[]) {
                                    "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestScheduleReordersScalarMemops::test*",
                                    "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestScheduleReordersScalarMemops::verify",
                                    "-XX:CompileCommand=compileonly,compiler.loopopts.superword.TestScheduleReordersScalarMemops::init",
-                                   "-XX:LoopUnrollLimit=1000",
-                                   "-XX:-TieredCompilation", "-Xbatch");
+                                   "-XX:-TieredCompilation", "-Xbatch",
+                                   "-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=1000");
     }
 
     TestScheduleReordersScalarMemops() {
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestSplitPacks.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestSplitPacks.java
index 4bc18e9abdb..1824f18c8ff 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestSplitPacks.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestSplitPacks.java
@@ -37,7 +37,6 @@
  * @bug 8326139
  * @summary Test splitting packs in SuperWord
  * @library /test/lib /
- * @requires vm.compiler2.enabled
  * @run driver compiler.loopopts.superword.TestSplitPacks
  */
 
@@ -71,7 +70,7 @@ interface TestFunction {
     }
 
     public static void main(String[] args) {
-        TestFramework.runWithFlags("-XX:LoopUnrollLimit=1000");
+        TestFramework.runWithFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:LoopUnrollLimit=1000");
     }
 
     public TestSplitPacks() {
@@ -390,9 +389,9 @@ static Object[] test1d(int[] a, int[] b, int mask) {
 
     @Test
     @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_2, "> 0",
-                  IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_4, "= 0",
+                  IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_4, "> 0",
                   IRNode.AND_VI,        IRNode.VECTOR_SIZE_2, "> 0",
-                  IRNode.AND_VI,        IRNode.VECTOR_SIZE_4, "= 0",
+                  IRNode.AND_VI,        IRNode.VECTOR_SIZE_4, "> 0",
                   IRNode.STORE_VECTOR, "> 0"},
         applyIf = {"MaxVectorSize", ">=32"},
         applyIfPlatform = {"64-bit", "true"},
@@ -405,8 +404,6 @@ static Object[] test1d(int[] a, int[] b, int mask) {
     //  | |    \ \ \ \
     //  0 1 - - 4 5 6 7
     //
-    // The 4-pack does not vectorize. This is a technical limitation that
-    // we can hopefully soon remove. Load and store offsets are different.
     static Object[] test2a(int[] a, int[] b, int mask) {
         for (int i = 0; i < RANGE; i+=8) {
             int b0 = a[i+0] & mask;
@@ -428,9 +425,9 @@ static Object[] test2a(int[] a, int[] b, int mask) {
     }
 
     @Test
-    @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_2, "= 0",
+    @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_2, "> 0",
                   IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_4, "> 0",
-                  IRNode.AND_VI,        IRNode.VECTOR_SIZE_2, "= 0",
+                  IRNode.AND_VI,        IRNode.VECTOR_SIZE_2, "> 0",
                   IRNode.AND_VI,        IRNode.VECTOR_SIZE_4, "> 0",
                   IRNode.STORE_VECTOR, "> 0"},
         applyIf = {"MaxVectorSize", ">=32"},
@@ -444,8 +441,6 @@ static Object[] test2a(int[] a, int[] b, int mask) {
     //  | | | |    \ \
     //  0 1 2 3 -- 6 7
     //
-    // The 2-pack does not vectorize. This is a technical limitation that
-    // we can hopefully soon remove. Load and store offsets are different.
     static Object[] test2b(int[] a, int[] b, int mask) {
         for (int i = 0; i < RANGE; i+=8) {
             int b0 = a[i+0] & mask;
@@ -468,9 +463,9 @@ static Object[] test2b(int[] a, int[] b, int mask) {
 
     @Test
     @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_2, "> 0",
-                  IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_4, "= 0",
+                  IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_4, "> 0",
                   IRNode.AND_VI,        IRNode.VECTOR_SIZE_2, "> 0",
-                  IRNode.AND_VI,        IRNode.VECTOR_SIZE_4, "= 0",
+                  IRNode.AND_VI,        IRNode.VECTOR_SIZE_4, "> 0",
                   IRNode.STORE_VECTOR, "> 0"},
         applyIf = {"MaxVectorSize", ">=32"},
         applyIfPlatform = {"64-bit", "true"},
@@ -483,8 +478,6 @@ static Object[] test2b(int[] a, int[] b, int mask) {
     //  | |  / / / /
     //  0 1 2 3 4 5 - -
     //
-    // The 4-pack does not vectorize. This is a technical limitation that
-    // we can hopefully soon remove. Load and store offsets are different.
     static Object[] test2c(int[] a, int[] b, int mask) {
         for (int i = 0; i < RANGE; i+=8) {
             int b0 = a[i+0] & mask;
@@ -506,9 +499,9 @@ static Object[] test2c(int[] a, int[] b, int mask) {
     }
 
     @Test
-    @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_2, "= 0",
+    @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_2, "> 0",
                   IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE_4, "> 0",
-                  IRNode.AND_VI,        IRNode.VECTOR_SIZE_2, "= 0",
+                  IRNode.AND_VI,        IRNode.VECTOR_SIZE_2, "> 0",
                   IRNode.AND_VI,        IRNode.VECTOR_SIZE_4, "> 0",
                   IRNode.STORE_VECTOR, "> 0"},
         applyIf = {"MaxVectorSize", ">=32"},
@@ -522,8 +515,6 @@ static Object[] test2c(int[] a, int[] b, int mask) {
     //  | | | |  / /
     //  0 1 2 3 4 5 - -
     //
-    // The 2-pack does not vectorize. This is a technical limitation that
-    // we can hopefully soon remove. Load and store offsets are different.
     static Object[] test2d(int[] a, int[] b, int mask) {
         for (int i = 0; i < RANGE; i+=8) {
             int b0 = a[i+0] & mask;
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java
index 30cdc05bfe5..eed03b3a4a1 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReduction.java
@@ -25,7 +25,6 @@
  * @test id=Vanilla-Unaligned
  * @bug 8302652 8314612
  * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop
- * @requires vm.compiler2.enabled
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestUnorderedReduction Vanilla-Unaligned
  */
@@ -34,7 +33,6 @@
  * @test id=Vanilla-Aligned
  * @bug 8302652 8314612
  * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop
- * @requires vm.compiler2.enabled
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestUnorderedReduction Vanilla-Aligned
  */
@@ -43,7 +41,6 @@
  * @test id=MaxVectorSize16-Unaligned
  * @bug 8302652 8314612
  * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop
- * @requires vm.compiler2.enabled
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestUnorderedReduction MaxVectorSize16-Unaligned
  */
@@ -52,7 +49,6 @@
  * @test id=MaxVectorSize32-Aligned
  * @bug 8302652 8314612
  * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop
- * @requires vm.compiler2.enabled
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestUnorderedReduction MaxVectorSize32-Aligned
  */
@@ -75,10 +71,10 @@ public static void main(String[] args) {
         }
 
         switch (args[0]) {
-            case "Vanilla-Unaligned"         -> { framework.addFlags("-XX:-AlignVector"); }
-            case "Vanilla-Aligned"           -> { framework.addFlags("-XX:+AlignVector"); }
-            case "MaxVectorSize16-Unaligned" -> { framework.addFlags("-XX:-AlignVector", "-XX:MaxVectorSize=16"); }
-            case "MaxVectorSize32-Aligned"   -> { framework.addFlags("-XX:+AlignVector", "-XX:MaxVectorSize=32"); }
+            case "Vanilla-Unaligned"         -> { framework.addFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:-AlignVector"); }
+            case "Vanilla-Aligned"           -> { framework.addFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AlignVector"); }
+            case "MaxVectorSize16-Unaligned" -> { framework.addFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:-AlignVector", "-XX:MaxVectorSize=16"); }
+            case "MaxVectorSize32-Aligned"   -> { framework.addFlags("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AlignVector", "-XX:MaxVectorSize=32"); }
             default -> { throw new RuntimeException("Test argument not recognized: " + args[0]); }
         }
         framework.start();
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java
index 666ddaac441..0d4a4e7b5d8 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestUnorderedReductionPartialVectorization.java
@@ -26,7 +26,6 @@
  * @bug JDK-8310130
  * @summary Special test cases for PhaseIdealLoop::move_unordered_reduction_out_of_loop
  *          Here a case with partial vectorization of the reduction.
- * @requires vm.bits == "64"
  * @library /test/lib /
  * @run driver compiler.loopopts.superword.TestUnorderedReductionPartialVectorization
  */
@@ -62,6 +61,7 @@ public void runTests() throws Exception {
     @IR(counts = {IRNode.LOAD_VECTOR_I,   IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0",
                   IRNode.VECTOR_CAST_I2L, IRNode.VECTOR_SIZE + "min(max_int, max_long)", "> 0",
                   IRNode.OR_REDUCTION_V,                                                 "> 0",},
+        applyIfPlatform = {"64-bit", "true"},
         applyIfCPUFeatureOr = {"avx2", "true"})
     static long test1(int[] data, long sum) {
         for (int i = 0; i < data.length; i+=2) {
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java
new file mode 100644
index 00000000000..b328d4135ec
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestVectorFPReduction.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2024, Arm Limited. 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 compiler.loopopts.superword;
+
+import compiler.lib.ir_framework.*;
+
+/*
+ * @test
+ * @bug 8320725
+ * @summary Ensure strictly ordered AddReductionVF/VD and MulReductionVF/VD nodes
+            are generated when these operations are auto-vectorized
+ * @library /test/lib /
+ * @run driver compiler.loopopts.superword.TestVectorFPReduction
+ */
+
+public class TestVectorFPReduction {
+
+    final private static int SIZE = 1024;
+
+    private static double[] da = new double[SIZE];
+    private static double[] db = new double[SIZE];
+    private static float[] fa = new float[SIZE];
+    private static float[] fb = new float[SIZE];
+    private static float fresult;
+    private static double dresult;
+
+    public static void main(String[] args) {
+        TestFramework.run();
+    }
+
+    @Test
+    @IR(failOn = {IRNode.ADD_REDUCTION_VF},
+        applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"})
+    @IR(counts = {"requires_strict_order", ">=1", IRNode.ADD_REDUCTION_VF, ">=1"},
+        failOn = {"no_strict_order"},
+        applyIfCPUFeatureOr = {"sve", "true", "sse2", "true", "rvv", "true"},
+        phase = CompilePhase.PRINT_IDEAL)
+    private static void testAddReductionVF() {
+        float result = 1;
+        for (int i = 0; i < SIZE; i++) {
+            result += (fa[i] + fb[i]);
+        }
+        fresult += result;
+    }
+
+    @Test
+    @IR(failOn = {IRNode.ADD_REDUCTION_VD},
+        applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"})
+    @IR(counts = {"requires_strict_order", ">=1", IRNode.ADD_REDUCTION_VD, ">=1"},
+        failOn = {"no_strict_order"},
+        applyIfCPUFeatureOr = {"sve", "true", "sse2", "true", "rvv", "true"},
+        phase = CompilePhase.PRINT_IDEAL)
+    private static void testAddReductionVD() {
+        double result = 1;
+        for (int i = 0; i < SIZE; i++) {
+            result += (da[i] + db[i]);
+        }
+        dresult += result;
+    }
+
+    @Test
+    @IR(failOn = {IRNode.MUL_REDUCTION_VF},
+        applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"})
+    @IR(counts = {"requires_strict_order", ">=1", IRNode.MUL_REDUCTION_VF, ">=1"},
+        failOn = {"no_strict_order"},
+        applyIfCPUFeatureOr = {"sve", "true", "sse2", "true"},
+        phase = CompilePhase.PRINT_IDEAL)
+    private static void testMulReductionVF() {
+        float result = 1;
+        for (int i = 0; i < SIZE; i++) {
+            result *= (fa[i] + fb[i]);
+        }
+        fresult += result;
+    }
+
+    @Test
+    @IR(failOn = {IRNode.MUL_REDUCTION_VD},
+        applyIfCPUFeatureAnd = {"asimd", "true", "sve", "false"})
+    @IR(counts = {"requires_strict_order", ">=1", IRNode.MUL_REDUCTION_VD, ">=1"},
+        failOn = {"no_strict_order"},
+        applyIfCPUFeatureOr = {"sve", "true", "sse2", "true"},
+        phase = CompilePhase.PRINT_IDEAL)
+    private static void testMulReductionVD() {
+        double result = 1;
+        for (int i = 0; i < SIZE; i++) {
+            result *= (da[i] + db[i]);
+        }
+        dresult += result;
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java b/test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java
index f63692871ad..d595e914ff4 100644
--- a/test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java
+++ b/test/hotspot/jtreg/compiler/loopopts/superword/Vec_MulAddS2I.java
@@ -27,47 +27,62 @@
  * @bug 8214751
  * @summary Test operations in C2 MulAddS2I and MulAddVS2VI nodes.
  * @library /test/lib
- * @requires vm.compiler2.enabled
  *
- * @run main/othervm -XX:LoopUnrollLimit=250
+ * @run main/othervm
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:LoopUnrollLimit=250
  *      -XX:CompileThresholdScaling=0.1
  *      -XX:+UseSuperWord
  *      -XX:LoopMaxUnroll=2
  *      compiler.loopopts.superword.Vec_MulAddS2I
- * @run main/othervm -XX:LoopUnrollLimit=250
+ * @run main/othervm
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:LoopUnrollLimit=250
  *      -XX:CompileThresholdScaling=0.1
  *      -XX:-UseSuperWord
  *      -XX:LoopMaxUnroll=2
  *      compiler.loopopts.superword.Vec_MulAddS2I
  *
- * @run main/othervm -XX:LoopUnrollLimit=250
+ * @run main/othervm
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:LoopUnrollLimit=250
  *      -XX:CompileThresholdScaling=0.1
  *      -XX:+UseSuperWord
  *      -XX:LoopMaxUnroll=4
  *      compiler.loopopts.superword.Vec_MulAddS2I
- * @run main/othervm -XX:LoopUnrollLimit=250
+ * @run main/othervm
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:LoopUnrollLimit=250
  *      -XX:CompileThresholdScaling=0.1
  *      -XX:-UseSuperWord
  *      -XX:LoopMaxUnroll=4
  *      compiler.loopopts.superword.Vec_MulAddS2I
  *
- * @run main/othervm -XX:LoopUnrollLimit=250
+ * @run main/othervm
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:LoopUnrollLimit=250
  *      -XX:CompileThresholdScaling=0.1
  *      -XX:+UseSuperWord
  *      -XX:LoopMaxUnroll=8
  *      compiler.loopopts.superword.Vec_MulAddS2I
- * @run main/othervm -XX:LoopUnrollLimit=250
+ * @run main/othervm
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:LoopUnrollLimit=250
  *      -XX:CompileThresholdScaling=0.1
  *      -XX:-UseSuperWord
  *      -XX:LoopMaxUnroll=8
  *      compiler.loopopts.superword.Vec_MulAddS2I
  *
- * @run main/othervm -XX:LoopUnrollLimit=250
+ * @run main/othervm
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:LoopUnrollLimit=250
  *      -XX:CompileThresholdScaling=0.1
  *      -XX:+UseSuperWord
  *      -XX:LoopMaxUnroll=16
  *      compiler.loopopts.superword.Vec_MulAddS2I
- * @run main/othervm -XX:LoopUnrollLimit=250
+ * @run main/othervm
+ *      -XX:+IgnoreUnrecognizedVMOptions
+ *      -XX:LoopUnrollLimit=250
  *      -XX:CompileThresholdScaling=0.1
  *      -XX:-UseSuperWord
  *      -XX:LoopMaxUnroll=16
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/RTMGenericCommandLineOptionTest.java b/test/hotspot/jtreg/compiler/rtm/cli/RTMGenericCommandLineOptionTest.java
deleted file mode 100644
index ffe510a0f32..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/RTMGenericCommandLineOptionTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.Platform;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.function.BooleanSupplier;
-
-/**
- * Base for all RTM-related CLI tests.
- */
-public abstract class RTMGenericCommandLineOptionTest {
-
-    protected static final String RTM_INSTR_ERROR
-            = "RTM instructions are not available on this CPU";
-    protected static final String RTM_UNSUPPORTED_VM_ERROR
-            = "RTM locking optimization is not supported in this VM";
-    protected static final String RTM_FOR_STACK_LOCKS_WARNING
-            = "UseRTMForStackLocks flag should be off when UseRTMLocking "
-            + "flag is off";
-    protected static final String RTM_COUNT_INCR_WARNING
-            = "must be a power of 2, resetting it to 64";
-
-    protected final String optionName;
-    protected final String errorMessage;
-    protected final String experimentalOptionError;
-    protected final boolean isExperimental;
-    protected final boolean isBoolean;
-    protected final String defaultValue;
-    protected final String[] optionValues;
-
-    /**
-     * Constructs new genetic RTM CLI test, for option {@code optionName} which
-     * has default value {@code defaultValue}. Test cases will use option's
-     * values passed via {@code optionValues} for verification of correct
-     * option processing.
-     *
-     * Test constructed using this ctor will be started on any cpu regardless
-     * it's architecture and supported/unsupported features.
-     *
-     * @param optionName name of option to be tested
-     * @param isBoolean {@code true} if option is binary
-     * @param isExperimental {@code true} if option is experimental
-     * @param defaultValue default value of tested option
-     * @param optionValues different option values
-     */
-    public RTMGenericCommandLineOptionTest(
-            String optionName, boolean isBoolean, boolean isExperimental,
-            String defaultValue, String... optionValues) {
-        this.optionName = optionName;
-        this.isExperimental = isExperimental;
-        this.isBoolean = isBoolean;
-        this.defaultValue = defaultValue;
-        this.optionValues = optionValues;
-        this.errorMessage = CommandLineOptionTest.
-                getUnrecognizedOptionErrorMessage(optionName);
-        this.experimentalOptionError = CommandLineOptionTest.
-                getExperimentalOptionErrorMessage(optionName);
-    }
-
-    public void runTestCases() throws Throwable {
-        if (Platform.isX86() || Platform.isX64()) {
-            if (Platform.isServer()) {
-                runX86SupportedVMTestCases();
-            } else {
-                runX86UnsupportedVMTestCases();
-            }
-        } else {
-            runNonX86TestCases();
-        }
-    }
-
-    /**
-     * Runs test cases on X86 CPU if VM supports RTM locking.
-     * @throws Throwable
-     */
-    protected void runX86SupportedVMTestCases() throws Throwable {
-        runGenericX86TestCases();
-    }
-
-    /**
-     * Runs test cases on X86 CPU if VM does not support RTM locking.
-     * @throws Throwable
-     */
-    protected void runX86UnsupportedVMTestCases() throws Throwable {
-        runGenericX86TestCases();
-    }
-
-    /**
-     * Runs test cases on non-X86 CPU.
-     * @throws Throwable
-     */
-    protected void runNonX86TestCases() throws Throwable {
-        CommandLineOptionTest.verifySameJVMStartup(
-                new String[] { errorMessage }, null,
-                String.format("Option '%s' should be unknown on non-X86CPUs.%n"
-                + "JVM startup should fail", optionName), "", ExitCode.FAIL,
-                prepareOptionValue(defaultValue));
-    }
-
-    /**
-     * Runs generic X86 test cases.
-     * @throws Throwable
-     */
-    protected void runGenericX86TestCases() throws Throwable {
-        verifyJVMStartup();
-        verifyOptionValues();
-    }
-
-    protected void verifyJVMStartup() throws Throwable {
-        String optionValue = prepareOptionValue(defaultValue);
-        String shouldFailMessage = String.format("VM option '%s' is "
-                + "experimental.%nVM startup expected to fail without "
-                + "-XX:+UnlockExperimentalVMOptions option", optionName);
-        String shouldPassMessage = String.format("VM option '%s' is "
-                + "experimental%nVM startup should pass with "
-                + "-XX:+UnlockExperimentalVMOptions option", optionName);
-        if (isExperimental) {
-            // verify that option is experimental
-            CommandLineOptionTest.verifySameJVMStartup(
-                    new String[] { experimentalOptionError },
-                    new String[] { errorMessage }, shouldFailMessage,
-                    shouldFailMessage, ExitCode.FAIL, optionValue);
-            // verify that it could be passed if experimental options
-            // are unlocked
-            CommandLineOptionTest.verifySameJVMStartup(null,
-                    new String[] {
-                            experimentalOptionError,
-                            errorMessage
-                    },
-                    shouldPassMessage,
-                    "JVM should start without any warnings or errors",
-                    ExitCode.OK,
-                    CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                    optionValue);
-        } else {
-            // verify that option could be passed
-            CommandLineOptionTest.verifySameJVMStartup(null,
-                    new String[]{errorMessage},
-                    String.format("VM startup shuld pass with '%s' option",
-                            optionName),
-                    "JVM should start without any warnings or errors",
-                    ExitCode.OK, optionValue);
-        }
-    }
-
-    protected void verifyOptionValues() throws Throwable {
-        // verify default value
-        if (isExperimental) {
-            CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                    defaultValue,
-                    String.format("Option '%s' is expected to have '%s' "
-                            + "default value", optionName, defaultValue),
-                    CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS);
-        } else {
-            CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                    defaultValue,
-                    String.format("Option '%s' is expected to have '%s' "
-                            + "default value", optionName, defaultValue));
-        }
-        // verify other specified option values
-        if (optionValues == null) {
-            return;
-        }
-
-        for (String value : optionValues) {
-            if (isExperimental) {
-                CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                        value,
-                        String.format("Option '%s' is set to have '%s' value",
-                                optionName, value),
-                        CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                        prepareOptionValue(value));
-            } else {
-                CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                        value,
-                        String.format("Option '%s' is set to have '%s' value",
-                                optionName, value), prepareOptionValue(value));
-            }
-        }
-    }
-
-    protected String prepareOptionValue(String value) {
-        if (isBoolean) {
-            return CommandLineOptionTest.prepareBooleanFlag(optionName,
-                    Boolean.valueOf(value));
-        } else {
-            return String.format("-XX:%s=%s", optionName, value);
-        }
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/RTMLockingAwareTest.java b/test/hotspot/jtreg/compiler/rtm/cli/RTMLockingAwareTest.java
deleted file mode 100644
index 394d73e2283..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/RTMLockingAwareTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Base for all RTM-related CLI tests on options whose processing depends
- * on UseRTMLocking value.
- *
- * Since UseRTMLocking option could be used when both CPU and VM supports RTM
- * locking, this test will be skipped on all unsupported configurations.
- */
-public abstract class RTMLockingAwareTest
-        extends RTMGenericCommandLineOptionTest {
-    protected final String warningMessage;
-    protected final String[] correctValues;
-    protected final String[] incorrectValues;
-    /**
-     * Constructs new test for option {@code optionName} that should be executed
-     * only on CPU with RTM support.
-     * Test will be executed using set of correct values from
-     * {@code correctValues} and set of incorrect values from
-     * {@code incorrectValues}.
-     *
-     * @param optionName name of option to be tested
-     * @param isBoolean {@code true} if tested option is binary
-     * @param isExperimental {@code true} if tested option is experimental
-     * @param defaultValue default value of tested option
-     * @param correctValues array with correct values, that should not emit
-     *                      {@code warningMessage} to VM output
-     * @param incorrectValues array with incorrect values, that should emit
-     *                        {@code waningMessage} to VM output
-     * @param warningMessage warning message associated with tested option
-     */
-    protected RTMLockingAwareTest(String optionName, boolean isBoolean,
-            boolean isExperimental, String defaultValue,
-            String[] correctValues, String[] incorrectValues,
-            String warningMessage) {
-        super(optionName, isBoolean, isExperimental, defaultValue);
-        this.correctValues = correctValues;
-        this.incorrectValues = incorrectValues;
-        this.warningMessage = warningMessage;
-    }
-
-    @Override
-    protected void verifyJVMStartup() throws Throwable {
-        // Run generic sanity checks
-        super.verifyJVMStartup();
-        // Verify how option values will be processed depending on
-        // UseRTMLocking value.
-        if (correctValues != null) {
-            for (String correctValue : correctValues) {
-                // For correct values it is expected to see no warnings
-                // regardless to UseRTMLocking
-                verifyStartupWarning(correctValue, true, false);
-                verifyStartupWarning(correctValue, false, false);
-            }
-        }
-
-        if (incorrectValues != null) {
-            for (String incorrectValue : incorrectValues) {
-                // For incorrect values it is expected to see warning
-                // only with -XX:+UseRTMLocking
-                verifyStartupWarning(incorrectValue, true, true);
-                verifyStartupWarning(incorrectValue, false, false);
-            }
-        }
-    }
-
-    @Override
-    protected void verifyOptionValues() throws Throwable {
-        super.verifyOptionValues();
-        // Verify how option values will be setup after processing
-        // depending on UseRTMLocking value
-        if (correctValues != null) {
-            for (String correctValue : correctValues) {
-                // Correct value could be set up regardless to UseRTMLocking
-                verifyOptionValues(correctValue, false, correctValue);
-                verifyOptionValues(correctValue, true, correctValue);
-            }
-        }
-
-        if (incorrectValues != null) {
-            for (String incorrectValue : incorrectValues) {
-                // With -XX:+UseRTMLocking, incorrect value will be changed to
-                // default value.
-                verifyOptionValues(incorrectValue, false, incorrectValue);
-                verifyOptionValues(incorrectValue, true, defaultValue);
-            }
-        }
-    }
-
-    private void verifyStartupWarning(String value, boolean useRTMLocking,
-            boolean isWarningExpected) throws Throwable {
-        String warnings[] = new String[] { warningMessage };
-        List<String> options = new LinkedList<>();
-        options.add(CommandLineOptionTest.prepareBooleanFlag("UseRTMLocking",
-                useRTMLocking));
-
-        if (isExperimental) {
-            options.add(CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS);
-        }
-        options.add(prepareOptionValue(value));
-
-        String errorString =  String.format("JVM should start with option '%s'"
-                + "'%nWarnings should be shown: %s", optionName,
-                isWarningExpected);
-        CommandLineOptionTest.verifySameJVMStartup(
-                (isWarningExpected ? warnings : null),
-                (isWarningExpected ? null : warnings),
-                errorString, errorString, ExitCode.OK,
-                options.toArray(new String[options.size()]));
-    }
-
-    private void verifyOptionValues(String value, boolean useRTMLocking,
-            String expectedValue) throws Throwable {
-        List<String> options = new LinkedList<>();
-        options.add(CommandLineOptionTest.prepareBooleanFlag("UseRTMLocking",
-                useRTMLocking));
-
-        if (isExperimental) {
-            options.add(CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS);
-        }
-        options.add(prepareOptionValue(value));
-
-        CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                expectedValue, String.format("Option '%s' should have '%s' "
-                        + "value if '%s' flag set",
-                        optionName, expectedValue, prepareOptionValue(value)),
-                options.toArray(new String[options.size()]));
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java b/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java
deleted file mode 100644
index 8cf31499047..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.Platform;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public abstract class TestPrintPreciseRTMLockingStatisticsBase
-        extends RTMGenericCommandLineOptionTest {
-    protected static final String DEFAULT_VALUE = "false";
-
-    protected TestPrintPreciseRTMLockingStatisticsBase() {
-        super("PrintPreciseRTMLockingStatistics", true, false,
-                TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE);
-    }
-
-    @Override
-    protected void runNonX86TestCases() throws Throwable {
-        verifyJVMStartup();
-        verifyOptionValues();
-    }
-
-    @Override
-    protected void verifyJVMStartup() throws Throwable {
-        if (Platform.isServer()) {
-            if (!Platform.isDebugBuild()) {
-                String shouldFailMessage = String.format("VM option '%s' is "
-                        + "diagnostic%nJVM startup should fail without "
-                        + "-XX:\\+UnlockDiagnosticVMOptions flag", optionName);
-                String shouldPassMessage = String.format("VM option '%s' is "
-                        + "diagnostic%nJVM startup should pass with "
-                        + "-XX:\\+UnlockDiagnosticVMOptions in debug build",
-                        optionName);
-                String errorMessage = CommandLineOptionTest.
-                        getDiagnosticOptionErrorMessage(optionName);
-                // verify that option is actually diagnostic
-                CommandLineOptionTest.verifySameJVMStartup(
-                        new String[] { errorMessage }, null, shouldFailMessage,
-                        shouldFailMessage, ExitCode.FAIL,
-                        prepareOptionValue("true"));
-
-                CommandLineOptionTest.verifySameJVMStartup(null,
-                        new String[] { errorMessage }, shouldPassMessage,
-                        shouldPassMessage + "without any warnings", ExitCode.OK,
-                        CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS,
-                        prepareOptionValue("true"));
-            } else {
-                String shouldPassMessage = String.format("JVM startup should "
-                                + "pass with '%s' option in debug build",
-                                optionName);
-                CommandLineOptionTest.verifySameJVMStartup(null, null,
-                        shouldPassMessage, shouldPassMessage,
-                        ExitCode.OK, prepareOptionValue("true"));
-            }
-        } else {
-            String errorMessage = CommandLineOptionTest.
-                    getUnrecognizedOptionErrorMessage(optionName);
-            String shouldFailMessage =  String.format("JVM startup should fail"
-                    + " with '%s' option in not debug build", optionName);
-            CommandLineOptionTest.verifySameJVMStartup(
-                    new String[]{errorMessage}, null, shouldFailMessage,
-                    shouldFailMessage, ExitCode.FAIL,
-                    CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS,
-                    prepareOptionValue("true"));
-        }
-    }
-
-    @Override
-    protected void verifyOptionValues() throws Throwable {
-        if (Platform.isServer()) {
-            // Verify default value
-            CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                    TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE,
-                    String.format("Option '%s' should have '%s' default value",
-                            optionName,
-                       TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE),
-                    CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS);
-        }
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java
deleted file mode 100644
index b4a71cd21b6..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify PrintPreciseRTMLockingStatistics on CPUs and OSs with
- *          rtm support and on VM with rtm locking support,
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public class TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig
-        extends TestPrintPreciseRTMLockingStatisticsBase {
-
-    @Override
-    protected void verifyOptionValues() throws Throwable {
-        super.verifyOptionValues();
-        // verify default value
-        CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE,
-                String.format("Option '%s' should have '%s' default value on"
-                        + " supported CPU", optionName,
-                TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE),
-                CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMLocking");
-
-        CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE,
-                String.format("Option '%s' should have '%s' default value on"
-                        + " supported CPU when -XX:-UseRTMLocking flag set",
-                        optionName,
-                       TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE),
-                CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:-UseRTMLocking", prepareOptionValue("true"));
-
-        // verify that option could be turned on
-        CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true",
-                String.format("Option '%s' should have 'true' value when set "
-                        + "on supported CPU and -XX:+UseRTMLocking flag set",
-                        optionName),
-                CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMLocking", prepareOptionValue("true"));
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig()
-                .runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingThresholdOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingThresholdOption.java
deleted file mode 100644
index 0eb0cc24dc4..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingThresholdOption.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify processing of RTMLockingThreshold option.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestRTMLockingThresholdOption
- */
-
-package compiler.rtm.cli;
-
-public class TestRTMLockingThresholdOption
-        extends RTMGenericCommandLineOptionTest {
-    private static final String DEFAULT_VALUE = "10000";
-
-    private TestRTMLockingThresholdOption() {
-        super("RTMLockingThreshold", false, true,
-                TestRTMLockingThresholdOption.DEFAULT_VALUE);
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMLockingThresholdOption().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMSpinLoopCountOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMSpinLoopCountOption.java
deleted file mode 100644
index e138b3372ff..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMSpinLoopCountOption.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify processing of RTMSpinLoopCount option.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestRTMSpinLoopCountOption
- */
-
-package compiler.rtm.cli;
-
-public class TestRTMSpinLoopCountOption
-        extends RTMGenericCommandLineOptionTest {
-    private static final String DEFAULT_VALUE = "100";
-
-    private TestRTMSpinLoopCountOption() {
-        super("RTMSpinLoopCount", false, true,
-                TestRTMSpinLoopCountOption.DEFAULT_VALUE,
-                "0", "10", "42", "1000");
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMSpinLoopCountOption().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java
deleted file mode 100644
index 929838dad06..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify RTMTotalCountIncrRate option processing on CPU and OS with
- *          rtm support and on VM with rtm locking support.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestRTMTotalCountIncrRateOptionOnSupportedConfig
- */
-
-package compiler.rtm.cli;
-
-public class TestRTMTotalCountIncrRateOptionOnSupportedConfig
-        extends RTMLockingAwareTest {
-    private static final String DEFAULT_VALUE = "64";
-
-    private TestRTMTotalCountIncrRateOptionOnSupportedConfig() {
-        super("RTMTotalCountIncrRate", false, true,
-                TestRTMTotalCountIncrRateOptionOnSupportedConfig.DEFAULT_VALUE,
-                /* correct values */
-                new String[] { "1", "2", "128", "1024" },
-                /* incorrect values */
-                new String[] { "3", "5", "7", "42" },
-                RTMGenericCommandLineOptionTest.RTM_COUNT_INCR_WARNING);
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMTotalCountIncrRateOptionOnSupportedConfig().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java
deleted file mode 100644
index cc9f93165d0..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify UseRTMDeopt option processing on CPUs with rtm support
- *          when rtm locking is supported by VM.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestUseRTMDeoptOptionOnSupportedConfig
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public class TestUseRTMDeoptOptionOnSupportedConfig {
-    private static final String DEFAULT_VALUE = "false";
-
-    public void runTestCases() throws Throwable {
-        String shouldPassMessage = " JVM should startup with option '"
-                + "-XX:+UseRTMDeopt' without any warnings";
-        // verify that option could be turned on
-        CommandLineOptionTest.verifySameJVMStartup(
-                null, null, shouldPassMessage, shouldPassMessage, ExitCode.OK,
-                "-XX:+UseRTMDeopt");
-        shouldPassMessage = " JVM should startup with option '"
-                + "-XX:-UseRTMDeopt' without any warnings";
-        // verify that option could be turned off
-        CommandLineOptionTest.verifySameJVMStartup(
-                null, null, shouldPassMessage, shouldPassMessage, ExitCode.OK,
-                "-XX:-UseRTMDeopt");
-        String defValMessage = String.format("UseRTMDeopt should have '%s'"
-                                    + "default value",
-                        TestUseRTMDeoptOptionOnSupportedConfig.DEFAULT_VALUE);
-        // verify default value
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt",
-                TestUseRTMDeoptOptionOnSupportedConfig.DEFAULT_VALUE,
-                defValMessage);
-        // verify default value
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt",
-                TestUseRTMDeoptOptionOnSupportedConfig.DEFAULT_VALUE,
-                defValMessage,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMLocking");
-        // verify that option is off when UseRTMLocking is off
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt",
-                "false", "UseRTMDeopt should be off when UseRTMLocking is off",
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:-UseRTMLocking", "-XX:+UseRTMDeopt");
-        // verify that option could be turned on
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", "true",
-                "UseRTMDeopt should be on when UseRTMLocking is on and "
-                        + "'-XX:+UseRTMDeopt' flag set",
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMLocking", "-XX:+UseRTMDeopt");
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMDeoptOptionOnSupportedConfig().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java
deleted file mode 100644
index b018e8d078f..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify UseRTMDeopt option processing on CPUs or OSs without rtm support
- *          or on VMs without rtm locking support.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires !vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestUseRTMDeoptOptionOnUnsupportedConfig
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public class TestUseRTMDeoptOptionOnUnsupportedConfig
-        extends RTMGenericCommandLineOptionTest {
-    private static final String DEFAULT_VALUE = "false";
-
-    private TestUseRTMDeoptOptionOnUnsupportedConfig() {
-        super("UseRTMDeopt", true, false,
-                TestUseRTMDeoptOptionOnUnsupportedConfig.DEFAULT_VALUE,
-                "true");
-    }
-
-    @Override
-    protected void runX86SupportedVMTestCases() throws Throwable {
-        super.verifyJVMStartup();
-        // verify default value
-        CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                defaultValue, String.format("'%s' should have '%s' "
-                        + "default value on unsupported configs.",
-                        optionName, DEFAULT_VALUE));
-        // verify that until RTMLocking is not used, value
-        // will be set to default false.
-        CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                defaultValue, String.format("'%s' should be off on unsupported"
-                        + " configs even if '-XX:+%s' flag set", optionName,
-                        optionName),
-                "-XX:+UseRTMDeopt");
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMDeoptOptionOnUnsupportedConfig().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java
deleted file mode 100644
index 37d8a6bcaaa..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify UseRTMForStackLocks option processing on CPU and OS with
- *          rtm support when VM supports rtm locking.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestUseRTMForStackLocksOptionOnSupportedConfig
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public class TestUseRTMForStackLocksOptionOnSupportedConfig {
-    private static final String DEFAULT_VALUE = "false";
-
-    public void runTestCases() throws Throwable {
-        String errorMessage
-                = CommandLineOptionTest.getExperimentalOptionErrorMessage(
-                "UseRTMForStackLocks");
-        String warningMessage
-                = RTMGenericCommandLineOptionTest.RTM_FOR_STACK_LOCKS_WARNING;
-
-        String shouldFailMessage = " VM option 'UseRTMForStackLocks' is "
-                + "experimental%nJVM startup should fail without "
-                + "-XX:+UnlockExperimentalVMOptions flag";
-
-        CommandLineOptionTest.verifySameJVMStartup(
-                new String[] { errorMessage }, null, shouldFailMessage,
-                shouldFailMessage + "%nError message expected", ExitCode.FAIL,
-                "-XX:+UseRTMForStackLocks");
-        String shouldPassMessage = " VM option 'UseRTMForStackLocks'"
-                + " is experimental%nJVM startup should pass with "
-                + "-XX:+UnlockExperimentalVMOptions flag";
-        // verify that we get a warning when trying to use rtm for stack
-        // lock, but not using rtm locking.
-        CommandLineOptionTest.verifySameJVMStartup(
-                new String[] { warningMessage }, null, shouldPassMessage,
-                "There should be warning when trying to use rtm for stack "
-                        + "lock, but not using rtm locking", ExitCode.OK,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMForStackLocks",
-                "-XX:-UseRTMLocking");
-        // verify that we don't get a warning when no using rtm for stack
-        // lock and not using rtm locking.
-        CommandLineOptionTest.verifySameJVMStartup(null,
-                new String[] { warningMessage }, shouldPassMessage,
-                "There should not be any warning when use both "
-                        + "-XX:-UseRTMForStackLocks and -XX:-UseRTMLocking "
-                        + "flags",
-                ExitCode.OK,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:-UseRTMForStackLocks",
-                "-XX:-UseRTMLocking");
-        // verify that we don't get a warning when using rtm for stack
-        // lock and using rtm locking.
-        CommandLineOptionTest.verifySameJVMStartup(null,
-                new String[] { warningMessage }, shouldPassMessage,
-                "There should not be any warning when use both "
-                        + "-XX:+UseRTMForStackLocks and -XX:+UseRTMLocking"
-                        + " flags",
-                ExitCode.OK,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMForStackLocks",
-                "-XX:+UseRTMLocking");
-        // verify that default value if false
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks",
-                TestUseRTMForStackLocksOptionOnSupportedConfig.DEFAULT_VALUE,
-                "Default value of option 'UseRTMForStackLocks' should be false",
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS);
-        // verify that default value is false even with +UseRTMLocking
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks",
-                TestUseRTMForStackLocksOptionOnSupportedConfig.DEFAULT_VALUE,
-                "Default value of option 'UseRTMForStackLocks' should be false",
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMLocking");
-        // verify that we can turn the option on
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks",
-                        "true", "Value of option 'UseRTMForStackLocks' should "
-                                + "be able to be set as 'true' when both "
-                                + "-XX:+UseRTMForStackLocks and "
-                                + "-XX:+UseRTMLocking flags used",
-                        CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                        "-XX:+UseRTMLocking", "-XX:+UseRTMForStackLocks");
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMForStackLocksOptionOnSupportedConfig().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java
deleted file mode 100644
index 13159dbd895..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify UseRTMForStackLocks option processing on CPUs or OSs without
- *          rtm support and/or on VMs without rtm locking support.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires !vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestUseRTMForStackLocksOptionOnUnsupportedConfig
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public class TestUseRTMForStackLocksOptionOnUnsupportedConfig
-        extends RTMGenericCommandLineOptionTest {
-    private static final String DEFAULT_VALUE = "false";
-
-    private TestUseRTMForStackLocksOptionOnUnsupportedConfig() {
-        super("UseRTMForStackLocks", true, true,
-                TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE,
-                "true");
-    }
-
-    @Override
-    protected void runX86SupportedVMTestCases() throws Throwable {
-        String shouldFailMessage = String.format("VM option '%s' is "
-                + "experimental%nJVM startup should fail without "
-                + "-XX:+UnlockExperimentalVMOptions flag", optionName);
-
-        // verify that option is experimental
-        CommandLineOptionTest.verifySameJVMStartup(
-                new String[] { experimentalOptionError }, null,
-                shouldFailMessage, shouldFailMessage + "%nError message "
-                        + "should be shown", ExitCode.FAIL,
-                prepareOptionValue("true"));
-
-        CommandLineOptionTest.verifySameJVMStartup(
-                new String[]{ experimentalOptionError }, null,
-                shouldFailMessage, shouldFailMessage + "%nError message "
-                        + "should be shown", ExitCode.FAIL,
-                prepareOptionValue("false"));
-
-        String shouldPassMessage = String.format("VM option '%s' is "
-                + " experimental%nJVM startup should pass with "
-                + "-XX:+UnlockExperimentalVMOptions flag", optionName);
-        // verify that if we turn it on, then VM output will contain
-        // warning saying that this option could be turned on only
-        // when we use rtm locking
-        CommandLineOptionTest.verifySameJVMStartup(
-                new String[]{
-                    RTMGenericCommandLineOptionTest.RTM_FOR_STACK_LOCKS_WARNING
-                }, null, shouldPassMessage, "There should be warning when try "
-                    + "to use rtm for stack lock, but not using rtm locking",
-                ExitCode.OK,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                prepareOptionValue("true")
-        );
-        // verify that options is turned off by default
-        CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE,
-                String.format("Default value of option '%s' should be '%s'",
-                        optionName, DEFAULT_VALUE),
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS);
-        // verify that it could not be turned on without rtm locking
-        CommandLineOptionTest.verifyOptionValueForSameVM(optionName,
-                TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE,
-                String.format("Value of '%s' shouldn't able to be set to "
-                        + "'true' without setting -XX:+UseRTMLocking flag",
-                        optionName),
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                prepareOptionValue("true"));
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMForStackLocksOptionOnUnsupportedConfig().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java
deleted file mode 100644
index ff0a7623da0..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify UseRTMLocking option processing on CPU and OS with rtm support and
- *          on VM with rtm locking support.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestUseRTMLockingOptionOnSupportedConfig
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public class TestUseRTMLockingOptionOnSupportedConfig {
-    private static final String DEFAULT_VALUE = "false";
-
-    public void runTestCases() throws Throwable {
-        String unrecongnizedOption
-                =  CommandLineOptionTest.getUnrecognizedOptionErrorMessage(
-                "UseRTMLocking");
-        String shouldPassMessage = "VM option 'UseRTMLocking' is experimental"
-                + "%nJVM startup should pass with "
-                + "-XX:+UnlockExperimentalVMOptions flag";
-        // verify that there are no warning or error in VM output
-        CommandLineOptionTest.verifySameJVMStartup(null,
-                new String[]{
-                        RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR,
-                        unrecongnizedOption
-                }, shouldPassMessage, "There should not be any warning when use"
-                        + "with -XX:+UnlockExperimentalVMOptions", ExitCode.OK,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMLocking"
-        );
-
-        CommandLineOptionTest.verifySameJVMStartup(null,
-                new String[]{
-                        RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR,
-                        unrecongnizedOption
-                }, shouldPassMessage, "There should not be any warning when use"
-                        + "with -XX:+UnlockExperimentalVMOptions", ExitCode.OK,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:-UseRTMLocking"
-        );
-        // verify that UseRTMLocking is of by default
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking",
-                TestUseRTMLockingOptionOnSupportedConfig.DEFAULT_VALUE,
-                String.format("Default value of option 'UseRTMLocking' should "
-                    + "be '%s'", DEFAULT_VALUE),
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS);
-        // verify that we can change UseRTMLocking value
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking",
-                TestUseRTMLockingOptionOnSupportedConfig.DEFAULT_VALUE,
-                String.format("Default value of option 'UseRTMLocking' should "
-                    + "be '%s'", DEFAULT_VALUE),
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:-UseRTMLocking");
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking",
-                "true", "Value of 'UseRTMLocking' should be set "
-                        + "to 'true' if -XX:+UseRTMLocking flag set",
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-XX:+UseRTMLocking");
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMLockingOptionOnSupportedConfig().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java
deleted file mode 100644
index 973c5cccbd9..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify UseRTMLocking option processing on CPUs without
- *          rtm support.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires !vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestUseRTMLockingOptionOnUnsupportedCPU
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.Platform;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public class TestUseRTMLockingOptionOnUnsupportedCPU {
-    private static final String DEFAULT_VALUE = "false";
-
-    public void runTestCases() throws Throwable {
-        String unrecognizedOption
-                = CommandLineOptionTest.getUnrecognizedOptionErrorMessage(
-                "UseRTMLocking");
-        String errorMessage = RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR;
-
-        if (Platform.isX86() || Platform.isX64()) {
-            String shouldFailMessage = "JVM startup should fail with option " +
-                                       "-XX:+UseRTMLocking on unsupported CPU";
-
-            // verify that we get an error when use +UseRTMLocking
-            // on unsupported CPU
-            CommandLineOptionTest.verifySameJVMStartup(
-                    new String[] { errorMessage },
-                    new String[] { unrecognizedOption }, shouldFailMessage,
-                    shouldFailMessage + ". Error message should be shown.",
-                    ExitCode.FAIL, "-XX:+UseRTMLocking");
-
-            String shouldPassMessage = "JVM startup should pass with option "
-                    + "-XX:-UseRTMLocking even on unsupported CPU";
-            // verify that we can pass -UseRTMLocking without
-            // getting any error messages
-            CommandLineOptionTest.verifySameJVMStartup(null, new String[] {
-                    errorMessage, unrecognizedOption }, shouldPassMessage,
-                    shouldPassMessage + " without any warnings", ExitCode.OK,
-                    "-XX:-UseRTMLocking");
-
-            // verify that UseRTMLocking is false by default
-            CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking",
-                    TestUseRTMLockingOptionOnUnsupportedCPU.DEFAULT_VALUE,
-                    String.format("Default value of option 'UseRTMLocking' "
-                        +"should be '%s'", DEFAULT_VALUE));
-        } else {
-            String shouldFailMessage = "RTMLocking should be unrecognized"
-                    + " on non-x86 CPUs. JVM startup should fail."
-                    + "Error message should be shown";
-            // verify that on non-x86 CPUs RTMLocking could not be used
-            CommandLineOptionTest.verifySameJVMStartup(
-                    new String[] { unrecognizedOption },
-                    null, shouldFailMessage, shouldFailMessage,
-                    ExitCode.FAIL, "-XX:+UseRTMLocking");
-
-            CommandLineOptionTest.verifySameJVMStartup(
-                    new String[] { unrecognizedOption },
-                    null, shouldFailMessage, shouldFailMessage,
-                    ExitCode.FAIL, "-XX:-UseRTMLocking");
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMLockingOptionOnUnsupportedCPU().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java
deleted file mode 100644
index a26b8ffbad5..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify UseRTMLocking option processing on CPU with rtm support
- *          in case when VM should not support this option.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.cpu & !(vm.flavor == "server" & !vm.emulatedClient)
- * @run driver compiler.rtm.cli.TestUseRTMLockingOptionOnUnsupportedVM
- */
-
-package compiler.rtm.cli;
-
-import jdk.test.lib.process.ExitCode;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-public class TestUseRTMLockingOptionOnUnsupportedVM {
-    private static final String DEFAULT_VALUE = "false";
-
-    public void runTestCases() throws Throwable {
-        String errorMessage
-                = RTMGenericCommandLineOptionTest.RTM_UNSUPPORTED_VM_ERROR;
-        String shouldFailMessage = "JVM startup should fail with option "
-                + "-XX:+UseRTMLocking even on unsupported VM. Error message"
-                + " should be shown";
-        String shouldPassMessage = "JVM startup should pass with option "
-                + "-XX:-UseRTMLocking even on unsupported VM";
-        // verify that we can't use +UseRTMLocking
-        CommandLineOptionTest.verifySameJVMStartup(
-                new String[] { errorMessage }, null, shouldFailMessage,
-                shouldFailMessage, ExitCode.FAIL,
-                 "-XX:+UseRTMLocking");
-        // verify that we can turn it off
-        CommandLineOptionTest.verifySameJVMStartup(null,
-                new String[] { errorMessage }, shouldPassMessage,
-                shouldPassMessage + " without any warnings", ExitCode.OK,
-                "-XX:-UseRTMLocking");
-        // verify that it is off by default
-        CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking",
-                TestUseRTMLockingOptionOnUnsupportedVM.DEFAULT_VALUE,
-                String.format("Default value of option 'UseRTMLocking' should"
-                    + " be '%s'", DEFAULT_VALUE));
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMLockingOptionOnUnsupportedVM().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java b/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java
deleted file mode 100644
index d38bf0a7f2b..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2014, 2021, 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 8031320
- * @summary Verify processing of UseRTMXendForLockBusy option.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestUseRTMXendForLockBusyOption
- */
-
-package compiler.rtm.cli;
-
-public class TestUseRTMXendForLockBusyOption
-        extends RTMGenericCommandLineOptionTest {
-    private static final String DEFAULT_VALUE = "true";
-
-    public TestUseRTMXendForLockBusyOption() {
-        super("UseRTMXendForLockBusy", true, true,
-                TestUseRTMXendForLockBusyOption.DEFAULT_VALUE, "true");
-    }
-
-    public static void main(String agrs[]) throws Throwable {
-        new TestUseRTMXendForLockBusyOption().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortRatio.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortRatio.java
deleted file mode 100644
index 20713301da5..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortRatio.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that RTMAbortRatio affects amount of aborts before
- *          deoptimization.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestRTMAbortRatio
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.XAbortProvoker;
-import compiler.testlibrary.rtm.CompilableTest;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that method will be deoptimized on high abort ratio
- * as soon as abort ratio reaches RTMAbortRatio's value.
- */
-public class TestRTMAbortRatio {
-
-    protected void runTestCases() throws Throwable {
-        verifyAbortRatio(0, false);
-        verifyAbortRatio(10, false);
-        verifyAbortRatio(50, false);
-        verifyAbortRatio(100, false);
-
-        verifyAbortRatio(0, true);
-        verifyAbortRatio(10, true);
-        verifyAbortRatio(50, true);
-        verifyAbortRatio(100, true);
-    }
-
-    private void verifyAbortRatio(int abortRatio, boolean useStackLock)
-            throws Throwable {
-        CompilableTest test = new Test();
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                test,
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                "-XX:+UseRTMDeopt",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:RTMAbortThreshold=0",
-                CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold",
-                        10 * Test.TOTAL_ITERATIONS),
-                CommandLineOptionTest.prepareNumericFlag("RTMAbortRatio",
-                        abortRatio),
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                test.getClass().getName(),
-                Boolean.toString(!useStackLock));
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                test.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1, "VM output should contain "
-                + "exactly one RTM locking statistics entry.");
-
-        RTMLockingStatistics lock = statistics.get(0);
-        int actualRatio;
-
-        if (lock.getTotalAborts() == 1L) {
-            actualRatio = 0;
-        } else {
-            actualRatio = (int) (lock.getTotalLocks()
-                    / (lock.getTotalAborts() - 1L));
-        }
-
-        Asserts.assertLTE(actualRatio, abortRatio, String.format(
-                "Actual abort ratio (%d) should lower or equal to "
-                + "specified (%d).", actualRatio, abortRatio));
-    }
-
-    /**
-     * Force abort after {@code Test.WARMUP_ITERATIONS} is done.
-     */
-    public static class Test implements CompilableTest {
-        private static final int TOTAL_ITERATIONS = 10000;
-        private static final int WARMUP_ITERATIONS = 1000;
-        private final XAbortProvoker xabort = new XAbortProvoker();
-        private final Object monitor = new Object();
-        // Following field have to be static in order to avoid escape analysis.
-        @SuppressWarnings("UnsuedDeclaration")
-        private static int field = 0;
-
-        @Override
-        public String getMethodWithLockName() {
-             return this.getClass().getName() + "::lock";
-         }
-
-        @Override
-        public String[] getMethodsToCompileNames() {
-            return new String[] { getMethodWithLockName(), "*.doAbort" };
-        }
-
-        public void lock(boolean abort) {
-            synchronized(monitor) {
-                if (abort) {
-                    xabort.doAbort();
-                }
-            }
-        }
-
-        /**
-         * Usage:
-         * Test &lt;inflate monitor&gt;
-         */
-        public static void main(String args[]) throws Throwable {
-            Asserts.assertGTE(args.length, 1, "One argument required.");
-            Test t = new Test();
-            boolean shouldBeInflated = Boolean.valueOf(args[0]);
-            if (shouldBeInflated) {
-                AbortProvoker.inflateMonitor(t.monitor);
-            }
-            for (int i = 0; i < Test.TOTAL_ITERATIONS; i++) {
-                AbortProvoker.verifyMonitorState(t.monitor, shouldBeInflated);
-                t.lock(i >= Test.WARMUP_ITERATIONS);
-            }
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMAbortRatio().runTestCases();
-    }
-}
-
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortThreshold.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortThreshold.java
deleted file mode 100644
index 4eddead8e5e..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAbortThreshold.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that RTMAbortThreshold option affects
- *          amount of aborts after which abort ratio is calculated.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestRTMAbortThreshold
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that on RTMAbortThreshold option actually affects how soon
- * method will be deoptimized on high abort ratio.
- */
-public class TestRTMAbortThreshold {
-
-    protected void runTestCases() throws Throwable {
-        verifyAbortThreshold(false, 1);
-        verifyAbortThreshold(false, 10);
-        verifyAbortThreshold(false, 1000);
-
-        verifyAbortThreshold(true, 1);
-        verifyAbortThreshold(true, 10);
-        verifyAbortThreshold(true, 1000);
-    }
-
-    private void verifyAbortThreshold(boolean useStackLock,
-            long abortThreshold) throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                provoker,
-                "-XX:+UseRTMDeopt",
-                "-XX:RTMAbortRatio=0",
-                CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold",
-                        abortThreshold),
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                AbortProvoker.class.getName(),
-                AbortType.XABORT.toString(),
-                Boolean.toString(!useStackLock));
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                provoker.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1, "VM output should contain "
-                + "exactly one RTM locking statistics entry for method "
-                + provoker.getMethodWithLockName());
-
-        Asserts.assertEQ(statistics.get(0).getTotalLocks(), abortThreshold,
-                String.format("Expected that method with rtm lock elision was"
-                        + " deoptimized after %d lock attempts",
-                        abortThreshold));
-    }
-
-    public static void main(String args[]) throws Throwable {
-         new TestRTMAbortThreshold().runTestCases();
-    }
-}
-
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java
deleted file mode 100644
index 03f56769bff..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that if we use RTMDeopt, then deoptimization
- *          caused by reason other then rtm_state_change will reset
- *          method's RTM state. And if we don't use RTMDeopt, then
- *          RTM state remain the same after such deoptimization.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestRTMAfterNonRTMDeopt
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.XAbortProvoker;
-import compiler.testlibrary.rtm.CompilableTest;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * To verify that with +UseRTMDeopt method's RTM state will be
- * changed to ProfileRTM on deoptimization unrelated to
- * rtm_state_change following sequence of events is used:
- * <pre>
- *
- *     rtm state ^
- *               |
- *       UseRTM  |      ******|     ******
- *               |            |
- *   ProfileRTM  |******|     |*****|
- *               |      |     |     |
- *              0-------|-----|-----|---------------------&gt; time
- *                      |     |     \ force abort
- *                      |     |
- *                      |     \ force deoptimization
- *                      |
- *                      \ force xabort
- * </pre>
- * When xabort is forced by native method call method should
- * change it's state to UseRTM, because we use RTMAbortRatio=100
- * and low RTMLockingThreshold, so at this point actual abort
- * ratio will be below 100% and there should be enough lock
- * attempts to recompile method without RTM profiling.
- */
-public class TestRTMAfterNonRTMDeopt {
-    private static final int ABORT_THRESHOLD = 1000;
-    private static final String RANGE_CHECK = "range_check";
-
-    protected void runTestCases() throws Throwable {
-        verifyRTMAfterDeopt(false, false);
-        verifyRTMAfterDeopt(true, false);
-
-        verifyRTMAfterDeopt(false, true);
-        verifyRTMAfterDeopt(true, true);
-    }
-
-    private void verifyRTMAfterDeopt(boolean useStackLock,
-            boolean useRTMDeopt) throws Throwable {
-        CompilableTest test = new Test();
-        String logFile = String.format("rtm_%s_stack_lock_%s_deopt.xml",
-                (useStackLock ? "use" : "no"), (useRTMDeopt ? "use" : "no"));
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                logFile,
-                test,
-                "-XX:CompileThreshold=1",
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMDeopt",
-                        useRTMDeopt),
-                "-XX:RTMAbortRatio=100",
-                CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold",
-                        TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD),
-                CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold",
-                        TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD / 2L),
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                Test.class.getName(),
-                Boolean.toString(!useStackLock)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        int traps = RTMTestBase.firedRTMStateChangeTraps(logFile);
-
-        if (useRTMDeopt) {
-            Asserts.assertEQ(traps, 2, "Two uncommon traps with "
-                    + "reason rtm_state_change should be fired.");
-        } else {
-            Asserts.assertEQ(traps, 0, "No uncommon traps with "
-                    + "reason rtm_state_change should be fired.");
-        }
-
-        int rangeCheckTraps = RTMTestBase.firedUncommonTraps(logFile,
-                TestRTMAfterNonRTMDeopt.RANGE_CHECK);
-
-        Asserts.assertEQ(rangeCheckTraps, 1,
-                "One range_check uncommon trap should be fired.");
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                test.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        int expectedStatEntries = (useRTMDeopt ? 4 : 2);
-
-        Asserts.assertEQ(statistics.size(), expectedStatEntries,
-                String.format("VM output should contain %d RTM locking "
-                        + "statistics entries.", expectedStatEntries));
-    }
-
-    public static class Test implements CompilableTest {
-        // Following field have to be static in order to avoid escape analysis.
-        @SuppressWarnings("UnsuedDeclaration")
-        private static int field = 0;
-        private static final int ITERATIONS = 10000;
-        private static final int RANGE_CHECK_AT = ITERATIONS / 2;
-        private final XAbortProvoker xabort = new XAbortProvoker();
-        private final Object monitor = new Object();
-
-        @Override
-        public String getMethodWithLockName() {
-            return this.getClass().getName() + "::forceAbort";
-        }
-
-        @Override
-        public String[] getMethodsToCompileNames() {
-            return new String[] { getMethodWithLockName(),
-                                  XAbortProvoker.class.getName() + "::doAbort()" };
-        }
-
-        public void forceAbort(int a[], boolean abort) {
-            try {
-                synchronized(monitor) {
-                    a[0]++;
-                    if (abort) {
-                        Test.field = xabort.doAbort();
-                    }
-                }
-            } catch (Throwable t) {
-                // suppress any throwables
-            }
-        }
-
-        /**
-         * Usage:
-         * Test &lt;inflate monitor&gt;
-         */
-        public static void main(String args[]) throws Throwable {
-            Test t = new Test();
-
-            boolean shouldBeInflated = Boolean.valueOf(args[0]);
-            if (shouldBeInflated) {
-                AbortProvoker.inflateMonitor(t.monitor);
-            }
-
-            int tmp[] = new int[1];
-
-            for (int i = 0; i < Test.ITERATIONS; i++ ) {
-                AbortProvoker.verifyMonitorState(t.monitor, shouldBeInflated);
-                if (i == Test.RANGE_CHECK_AT) {
-                    t.forceAbort(new int[0], false);
-                } else {
-                    boolean isThreshold
-                            = (i == TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD);
-                    boolean isThresholdPlusRange
-                            = (i == TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD
-                            + Test.RANGE_CHECK_AT);
-                    t.forceAbort(tmp, isThreshold || isThresholdPlusRange);
-                }
-            }
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMAfterNonRTMDeopt().runTestCases();
-    }
-}
-
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java
deleted file mode 100644
index 5faec082fc2..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that on high abort ratio method will be recompiled
- *          without rtm locking.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestRTMDeoptOnHighAbortRatio
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that on high abort ratio method wil be deoptimized with
- * <i>rtm_state_change</i> reason and after that RTM-based lock elision will not
- * be used for that method.
- * This test make asserts on total locks count done by compiled method,
- * so in order to avoid issue with retriable locks -XX:RTMRetryCount=0 is used.
- * For more details on that issue see {@link TestUseRTMAfterLockInflation}.
- */
-public class TestRTMDeoptOnHighAbortRatio {
-    private static final long ABORT_THRESHOLD
-            = AbortProvoker.DEFAULT_ITERATIONS / 2L;
-
-    protected void runTestCases() throws Throwable {
-        verifyDeopt(false);
-        verifyDeopt(true);
-    }
-
-    private void verifyDeopt(boolean useStackLock) throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-        String logFileName = String.format("rtm_deopt_%s_stack_lock.xml",
-                (useStackLock ? "use" : "no"));
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                logFileName,
-                provoker,
-                "-XX:+UseRTMDeopt",
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                "-XX:RTMRetryCount=0",
-                CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold",
-                        TestRTMDeoptOnHighAbortRatio.ABORT_THRESHOLD),
-                "-XX:RTMAbortRatio=100",
-                "-XX:CompileThreshold=1",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                AbortProvoker.class.getName(),
-                AbortType.XABORT.toString(),
-                Boolean.toString(!useStackLock)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName);
-
-        Asserts.assertEQ(firedTraps, 1, "Expected to get only one "
-                + "deoptimization due to rtm state change");
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                provoker.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1, "VM output should contain "
-                + "exactly one RTM locking statistics entry for method "
-                + provoker.getMethodWithLockName());
-
-        Asserts.assertEQ(statistics.get(0).getTotalLocks(),
-                TestRTMDeoptOnHighAbortRatio.ABORT_THRESHOLD,
-                "After AbortThreshold was reached, method should be"
-                + " recompiled without rtm lock eliding.");
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMDeoptOnHighAbortRatio().runTestCases();
-    }
-}
-
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java
deleted file mode 100644
index 404d076e5ca..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that on low abort ratio method will be recompiled.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestRTMDeoptOnLowAbortRatio
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.XAbortProvoker;
-import compiler.testlibrary.rtm.CompilableTest;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that low abort ratio method will be deoptimized with
- * <i>rtm_state_change</i> reason and will continue to use RTM-based lock
- * elision after that.
- * This test make asserts on total locks count done by compiled method,
- * so in order to avoid issue with retriable locks -XX:RTMRetryCount=0 is used.
- * For more details on that issue see {@link TestUseRTMAfterLockInflation}.
- */
-public class TestRTMDeoptOnLowAbortRatio {
-    private static final long LOCKING_THRESHOLD = 100L;
-    private static final long ABORT_THRESHOLD = LOCKING_THRESHOLD / 2L;
-
-    protected void runTestCases() throws Throwable {
-        verifyRTMDeopt(false);
-        verifyRTMDeopt(true);
-    }
-
-    private void verifyRTMDeopt(boolean useStackLock) throws Throwable {
-        CompilableTest test = new Test();
-        String logFileName = String.format("rtm_deopt_%s_stack_lock.xml",
-                                           useStackLock ? "use" : "no");
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                logFileName,
-                test,
-                "-XX:+UseRTMDeopt",
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold",
-                        TestRTMDeoptOnLowAbortRatio.LOCKING_THRESHOLD),
-                CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold",
-                        TestRTMDeoptOnLowAbortRatio.ABORT_THRESHOLD),
-                "-XX:RTMAbortRatio=100",
-                "-XX:CompileThreshold=1",
-                "-XX:RTMRetryCount=0",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                Test.class.getName(),
-                Boolean.toString(!useStackLock)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName);
-
-        Asserts.assertEQ(firedTraps, 1,
-                        "Expected to get only one deoptimization due to rtm"
-                        + " state change");
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                test.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 2,
-                         "VM output should contain two RTM locking "
-                         + "statistics entries for method "
-                         + test.getMethodWithLockName());
-
-        RTMLockingStatistics statisticsBeforeDeopt = null;
-
-        for (RTMLockingStatistics s : statistics) {
-            if (s.getTotalLocks()
-                    == TestRTMDeoptOnLowAbortRatio.LOCKING_THRESHOLD) {
-                Asserts.assertNull(statisticsBeforeDeopt,
-                        "Only one abort was expected during test run");
-                statisticsBeforeDeopt = s;
-            }
-        }
-
-        Asserts.assertNotNull(statisticsBeforeDeopt,
-                "After LockThreshold was reached, method should be recompiled "
-                + "with rtm lock eliding.");
-    }
-
-    public static class Test implements CompilableTest {
-        private final XAbortProvoker xabort = new XAbortProvoker();
-        private final Object monitor = new Object();
-
-        @Override
-        public String getMethodWithLockName() {
-            return this.getClass().getName() + "::forceAbort";
-        }
-
-        @Override
-        public String[] getMethodsToCompileNames() {
-            return new String[] { getMethodWithLockName(),
-                                  XAbortProvoker.class.getName() + "::doAbort" };
-        }
-
-        public void forceAbort(boolean abort) {
-            synchronized(monitor) {
-                if (abort) {
-                    xabort.doAbort();
-                }
-            }
-        }
-
-        /**
-         * Usage:
-         * Test &lt;inflate monitor&gt;
-         */
-        public static void main(String args[]) throws Throwable {
-            Asserts.assertGTE(args.length, 1, "One argument required.");
-            Test t = new Test();
-            boolean shouldBeInflated = Boolean.valueOf(args[0]);
-            if (shouldBeInflated) {
-                AbortProvoker.inflateMonitor(t.monitor);
-            }
-            for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) {
-                AbortProvoker.verifyMonitorState(t.monitor, shouldBeInflated);
-                t.forceAbort(i >= TestRTMDeoptOnLowAbortRatio.ABORT_THRESHOLD);
-            }
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMDeoptOnLowAbortRatio().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingCalculationDelay.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingCalculationDelay.java
deleted file mode 100644
index 053e14d583f..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingCalculationDelay.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that RTMLockingCalculationDelay affect when
- *          abort ratio calculation is started.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestRTMLockingCalculationDelay
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-/**
- * Test verifies that abort ratio calculation could be delayed using
- * RTMLockingCalculationDelay option.
- */
-public class TestRTMLockingCalculationDelay {
-    private static final boolean INFLATE_MONITOR = true;
-
-    protected void runTestCases() throws Throwable {
-        // verify that calculation will be started immediately
-        verifyLockingCalculationDelay(0, 0, true);
-
-        // verify that calculation will not be started during
-        // first 10 minutes, while test will be started immediately
-        verifyLockingCalculationDelay(600000, 0, false);
-
-        // verify that calculation will be started after a second
-        verifyLockingCalculationDelay(1000, 1000, true);
-    }
-
-    private void verifyLockingCalculationDelay(long delay, long testDelay,
-            boolean deoptExpected) throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-        String logFileName = String.format("rtm_delay_%d_%d.xml", delay,
-                testDelay);
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                logFileName,
-                provoker,
-                "-XX:+UseRTMDeopt",
-                CommandLineOptionTest.prepareNumericFlag(
-                        "RTMLockingCalculationDelay", delay),
-                "-XX:RTMAbortRatio=0",
-                "-XX:RTMAbortThreshold=0",
-                AbortProvoker.class.getName(),
-                AbortType.XABORT.toString(),
-                Boolean.toString(
-                        TestRTMLockingCalculationDelay.INFLATE_MONITOR),
-                Long.toString(AbortProvoker.DEFAULT_ITERATIONS),
-                Long.toString(testDelay)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        int deopts = RTMTestBase.firedRTMStateChangeTraps(logFileName);
-
-        if (deoptExpected) {
-            Asserts.assertGT(deopts, 0, "At least one deoptimization due to "
-                    + "rtm_state_chage is expected");
-        } else {
-            Asserts.assertEQ(deopts, 0, "No deoptimizations due to "
-                    + "rtm_state_chage are expected");
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMLockingCalculationDelay().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingThreshold.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingThreshold.java
deleted file mode 100644
index 913fac3068b..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMLockingThreshold.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that RTMLockingThreshold affects rtm state transition
- *          ProfileRTM => UseRTM.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestRTMLockingThreshold
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.XAbortProvoker;
-import compiler.testlibrary.rtm.CompilableTest;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that RTMLockingThreshold option actually affects how soon
- * method will be deoptimized on low abort ratio.
- */
-public class TestRTMLockingThreshold {
-
-    /**
-     * We use non-zero abort threshold to avoid abort related to
-     * interrupts, VMM calls, etc. during first lock attempt.
-     *
-     */
-    private static final int MIN_ABORT_THRESHOLD = 10;
-
-    protected void runTestCases() throws Throwable {
-        verifyLockingThreshold(0, false);
-        verifyLockingThreshold(100, false);
-        verifyLockingThreshold(1000, false);
-
-        verifyLockingThreshold(0, true);
-        verifyLockingThreshold(100, true);
-        verifyLockingThreshold(1000, true);
-    }
-
-    private void verifyLockingThreshold(int lockingThreshold,
-            boolean useStackLock) throws Throwable {
-        CompilableTest test = new Test();
-
-        int abortThreshold = Math.max(lockingThreshold / 2,
-                TestRTMLockingThreshold.MIN_ABORT_THRESHOLD);
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                test,
-                "-XX:CompileThreshold=1",
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                "-XX:+UseRTMDeopt",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:RTMRetryCount=0",
-                CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold",
-                        abortThreshold),
-                CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold",
-                        lockingThreshold),
-                "-XX:RTMAbortRatio=100",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                Test.class.getName(),
-                Boolean.toString(!useStackLock),
-                Integer.toString(lockingThreshold)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                test.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 2, "VM output should contain two "
-                + "RTM locking statistics entries.");
-
-        /**
-         * If RTMLockingThreshold==0, then we have to make at least 1 call.
-         */
-        long expectedValue = lockingThreshold;
-        if (expectedValue == 0) {
-            expectedValue++;
-        }
-
-        RTMLockingStatistics statBeforeDeopt = null;
-        for (RTMLockingStatistics s : statistics) {
-            if (s.getTotalLocks() == expectedValue) {
-                Asserts.assertNull(statBeforeDeopt,
-                        "Only one statistics entry should contain aborts");
-                statBeforeDeopt = s;
-            }
-        }
-
-        Asserts.assertNotNull(statBeforeDeopt, "There should be exactly one "
-                + "statistics entry corresponding to ProfileRTM state.");
-    }
-
-    public static class Test implements CompilableTest {
-        // Following field have to be static in order to avoid escape analysis.
-        @SuppressWarnings("UnsuedDeclaration")
-        private static int field = 0;
-        private static final int TOTAL_ITERATIONS = 10000;
-        private final XAbortProvoker xabort = new XAbortProvoker();
-        private final Object monitor = new Object();
-
-        @Override
-        public String getMethodWithLockName() {
-            return this.getClass().getName() + "::lock";
-        }
-
-        @Override
-        public String[] getMethodsToCompileNames() {
-            return new String[] { getMethodWithLockName(),
-                                  XAbortProvoker.class.getName() + "::doAbort" };
-        }
-
-        public void lock(boolean abort) {
-            synchronized(monitor) {
-                if (abort) {
-                    Test.field += xabort.doAbort();
-                }
-            }
-        }
-
-        /**
-         * Usage:
-         * Test &lt;inflate monitor&gt;
-         */
-        public static void main(String args[]) throws Throwable {
-            Asserts.assertGTE(args.length, 2, "Two arguments required.");
-            Test t = new Test();
-            boolean shouldBeInflated = Boolean.valueOf(args[0]);
-            int lockingThreshold = Integer.valueOf(args[1]);
-            if (shouldBeInflated) {
-                AbortProvoker.inflateMonitor(t.monitor);
-            }
-            for (int i = 0; i < Test.TOTAL_ITERATIONS; i++) {
-                AbortProvoker.verifyMonitorState(t.monitor, shouldBeInflated);
-                t.lock(i >= lockingThreshold / 2);
-            }
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMLockingThreshold().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMRetryCount.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMRetryCount.java
deleted file mode 100644
index ed09be05d21..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMRetryCount.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that RTMRetryCount affects actual amount of retries.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                   -XX:+WhiteBoxAPI
- *                   compiler.rtm.locking.TestRTMRetryCount
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.BusyLock;
-import compiler.testlibrary.rtm.CompilableTest;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that RTMRetryCount option actually affects amount of
- * retries on lock busy.
- */
-public class TestRTMRetryCount {
-    /**
-     * Time in ms, during which busy lock will be locked.
-     */
-    private static final int LOCKING_TIME = 5000;
-    private static final boolean INFLATE_MONITOR = true;
-
-    protected void runTestCases() throws Throwable {
-        verifyRTMRetryCount(0);
-        verifyRTMRetryCount(1);
-        verifyRTMRetryCount(5);
-        verifyRTMRetryCount(10);
-    }
-
-    private void verifyRTMRetryCount(int retryCount) throws Throwable {
-        CompilableTest busyLock = new BusyLock();
-        long expectedAborts = retryCount + 1L;
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                busyLock,
-                "-XX:-UseRTMXendForLockBusy",
-                "-XX:RTMTotalCountIncrRate=1",
-                CommandLineOptionTest.prepareNumericFlag("RTMRetryCount",
-                        retryCount),
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                BusyLock.class.getName(),
-                Boolean.toString(TestRTMRetryCount.INFLATE_MONITOR),
-                Integer.toString(TestRTMRetryCount.LOCKING_TIME)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                busyLock.getMethodWithLockName(), outputAnalyzer.getStdout());
-
-        Asserts.assertEQ(statistics.size(), 1, "VM output should contain "
-                + "exactly one rtm locking statistics entry for method "
-                + busyLock.getMethodWithLockName());
-
-        Asserts.assertEQ(statistics.get(0).getTotalAborts(), expectedAborts,
-                String.format("It is expected to get %d aborts",
-                        expectedAborts));
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMRetryCount().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMSpinLoopCount.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMSpinLoopCount.java
deleted file mode 100644
index 8702ae0b734..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMSpinLoopCount.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that RTMSpinLoopCount affects time spent
- *          between locking attempts.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                   -XX:+WhiteBoxAPI
- *                   compiler.rtm.locking.TestRTMSpinLoopCount
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.BusyLock;
-import compiler.testlibrary.rtm.CompilableTest;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-import jdk.test.lib.Platform;
-
-import java.util.List;
-
-/**
- * Test verifies that RTMSpinLoopCount increase time spent between retries
- * by comparing amount of retries done with different RTMSpinLoopCount's values.
- */
-public class TestRTMSpinLoopCount {
-    private static final int LOCKING_TIME = 1000;
-    private static final int RTM_RETRY_COUNT = 1000;
-    private static final boolean INFLATE_MONITOR = true;
-    private static final long MAX_ABORTS = RTM_RETRY_COUNT + 1L;
-    private static int[] SPIN_LOOP_COUNTS;
-
-    protected void runTestCases() throws Throwable {
-
-        SPIN_LOOP_COUNTS = new int[] { 0, 100, 1_000, 10_000, 100_000 };
-
-        long[] aborts = new long[TestRTMSpinLoopCount.SPIN_LOOP_COUNTS.length];
-
-        for (int i = 0; i < TestRTMSpinLoopCount.SPIN_LOOP_COUNTS.length; i++) {
-            aborts[i] = getAbortsCountOnLockBusy(
-                    TestRTMSpinLoopCount.SPIN_LOOP_COUNTS[i]);
-        }
-
-        for (int i = 1; i < aborts.length; i++) {
-            Asserts.assertLTE(aborts[i], aborts[i - 1], "Increased spin loop "
-                    + "count should not increase retries count.");
-        }
-    }
-
-    private long getAbortsCountOnLockBusy(int spinLoopCount) throws Throwable {
-        CompilableTest test = new BusyLock();
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                test,
-                CommandLineOptionTest.prepareNumericFlag("RTMRetryCount",
-                        TestRTMSpinLoopCount.RTM_RETRY_COUNT),
-                CommandLineOptionTest.prepareNumericFlag("RTMSpinLoopCount",
-                        spinLoopCount),
-                "-XX:-UseRTMXendForLockBusy",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                BusyLock.class.getName(),
-                Boolean.toString(TestRTMSpinLoopCount.INFLATE_MONITOR),
-                Integer.toString(TestRTMSpinLoopCount.LOCKING_TIME)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                test.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1,
-                "VM output should contain exactly one entry for method "
-                 + test.getMethodWithLockName());
-
-        RTMLockingStatistics lock = statistics.get(0);
-
-        Asserts.assertLTE(lock.getTotalAborts(),
-                TestRTMSpinLoopCount.MAX_ABORTS, String.format("Total aborts "
-                        + "count (%d) should be less or equal to %d",
-                        lock.getTotalAborts(),
-                        TestRTMSpinLoopCount.MAX_ABORTS));
-
-        return lock.getTotalAborts();
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMSpinLoopCount().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMTotalCountIncrRate.java b/test/hotspot/jtreg/compiler/rtm/locking/TestRTMTotalCountIncrRate.java
deleted file mode 100644
index e0a8394570e..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestRTMTotalCountIncrRate.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that RTMTotalCountIncrRate option affects
- *          RTM locking statistics.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestRTMTotalCountIncrRate
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.XAbortProvoker;
-import compiler.testlibrary.rtm.CompilableTest;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that with RTMTotalCountIncrRate=1 RTM locking statistics
- * contains precise information abort attempted locks and that with other values
- * statistics contains information abort non-zero locking attempts.
- * Since assert done for RTMTotalCountIncrRate=1 is pretty strict, test uses
- * -XX:RTMRetryCount=0 to avoid issue with retriable aborts. For more details on
- * that issue see {@link TestUseRTMAfterLockInflation}.
- */
-public class TestRTMTotalCountIncrRate {
-    protected void runTestCases() throws Throwable {
-        verifyLocksCount(1, false);
-        verifyLocksCount(64, false);
-        verifyLocksCount(128, false);
-        verifyLocksCount(1, true);
-        verifyLocksCount(64, true);
-        verifyLocksCount(128, true);
-    }
-
-    private void verifyLocksCount(int incrRate, boolean useStackLock)
-            throws Throwable{
-        CompilableTest test = new Test();
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                test,
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                CommandLineOptionTest.prepareNumericFlag(
-                        "RTMTotalCountIncrRate", incrRate),
-                "-XX:RTMRetryCount=0",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                Test.class.getName(),
-                Boolean.toString(!useStackLock)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                test.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1, "VM output should contain "
-                + "exactly one RTM locking statistics entry for method "
-                + test.getMethodWithLockName());
-
-        RTMLockingStatistics lock = statistics.get(0);
-        if (incrRate == 1) {
-            Asserts.assertEQ(lock.getTotalLocks(), Test.TOTAL_ITERATIONS,
-                    "Total locks should be exactly the same as amount of "
-                    + "iterations.");
-        }
-    }
-
-    public static class Test implements CompilableTest {
-        private static final long TOTAL_ITERATIONS = 10000L;
-        private final XAbortProvoker xabort = new XAbortProvoker();
-        private final Object monitor = new Object();
-        // Following field have to be static in order to avoid escape analysis.
-        @SuppressWarnings("UnsuedDeclaration")
-        private static int field = 0;
-
-        @Override
-        public String getMethodWithLockName() {
-            return this.getClass().getName() + "::lock";
-        }
-
-        @Override
-        public String[] getMethodsToCompileNames() {
-            return new String[] { getMethodWithLockName(), "*.doAbort" };
-        }
-
-        public void lock(boolean forceAbort) {
-            synchronized(monitor) {
-                if (forceAbort) {
-                    // We're calling native method in order to force
-                    // abort. It's done by explicit xabort call emitted
-                    // in SharedRuntime::generate_native_wrapper.
-                    // If an actual JNI call will be replaced by
-                    // intrinsic - we'll be in trouble, since xabort
-                    // will be no longer called and test may fail.
-                    xabort.doAbort();
-                }
-                Test.field++;
-            }
-        }
-
-        /**
-         * Usage:
-         * Test &lt;inflate monitor&gt;
-         */
-        public static void main(String args[]) throws Throwable {
-            Asserts.assertGTE(args.length, 1, "One argument required.");
-            Test test = new Test();
-            boolean shouldBeInflated = Boolean.valueOf(args[0]);
-            if (shouldBeInflated) {
-                AbortProvoker.inflateMonitor(test.monitor);
-            }
-            for (long i = 0L; i < Test.TOTAL_ITERATIONS; i++) {
-                AbortProvoker.verifyMonitorState(test.monitor,
-                        shouldBeInflated);
-                // Force abort on first iteration to avoid rare case when
-                // there were no aborts and locks count was not incremented
-                // with RTMTotalCountIncrRate > 1 (in such case JVM won't
-                // print JVM locking statistics).
-                test.lock(i == 0);
-            }
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestRTMTotalCountIncrRate().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMAfterLockInflation.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMAfterLockInflation.java
deleted file mode 100644
index d99a59ab84f..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMAfterLockInflation.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that rtm locking is used for stack locks before
- *          inflation and after it used for inflated locks.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestUseRTMAfterLockInflation
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-
-import java.util.List;
-
-/**
- * Test verifies that RTM is used after lock inflation by executing compiled
- * method with RTM-based lock elision using stack lock first, then that lock
- * is inflated and the same compiled method invoked again.
- *
- * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times before
- * lock inflation and the same amount of times after inflation.
- * As a result total locks count should be equal to
- * {@code 2 * AbortProvoker.DEFAULT_ITERATIONS}.
- * It is a pretty strict assertion which could fail if some retriable abort
- * happened: it could be {@code AbortType.RETRIABLE} or
- * {@code AbortType.MEM_CONFLICT}, but unfortunately abort can has both these
- * reasons simultaneously. In order to avoid false negative failures related
- * to incorrect aborts counting, -XX:RTMRetryCount=0 is used.
- */
-public class TestUseRTMAfterLockInflation {
-    private static final long EXPECTED_LOCKS
-            = 2L * AbortProvoker.DEFAULT_ITERATIONS;
-
-    protected void runTestCases() throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-        long totalLocksCount = 0;
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                provoker,
-                "-XX:+UseRTMForStackLocks",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:RTMRetryCount=0",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                Test.class.getName(),
-                AbortType.XABORT.toString());
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                provoker.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 2,
-                "VM output should contain two rtm locking statistics entries "
-                + "for method " + provoker.getMethodWithLockName());
-
-        for (RTMLockingStatistics s : statistics) {
-            totalLocksCount += s.getTotalLocks();
-        }
-
-        Asserts.assertEQ(totalLocksCount,
-                TestUseRTMAfterLockInflation.EXPECTED_LOCKS,
-                "Total lock count should be greater or equal to "
-                + TestUseRTMAfterLockInflation.EXPECTED_LOCKS);
-    }
-
-    public static class Test {
-        /**
-         * Usage:
-         * Test &lt;provoker type&gt;
-         */
-        public static void main(String args[]) throws Throwable {
-            Asserts.assertGT(args.length, 0,
-                    "AbortType name is expected as first argument.");
-
-            AbortProvoker provoker
-                    = AbortType.lookup(Integer.valueOf(args[0])).provoker();
-            for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) {
-                AbortProvoker.verifyMonitorState(provoker, false /*deflated*/);
-                provoker.forceAbort();
-            }
-            provoker.inflateMonitor();
-            for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) {
-                AbortProvoker.verifyMonitorState(provoker, true /*inflated*/);
-                provoker.forceAbort();
-            }
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMAfterLockInflation().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMDeopt.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMDeopt.java
deleted file mode 100644
index facf686739c..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMDeopt.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that UseRTMDeopt affects uncommon trap installation in
- *          compiled methods with synchronized block.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestUseRTMDeopt
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-/**
- * Test verifies that usage of UseRTMDeopt option affects uncommon traps usage
- * for methods that use locking.
- */
-public class TestUseRTMDeopt {
-
-    protected void runTestCases() throws Throwable {
-        verifyUseRTMDeopt(false);
-        verifyUseRTMDeopt(true);
-    }
-
-    private void verifyUseRTMDeopt(boolean useRTMDeopt) throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-        String logFileName = String.format("rtm_%s_deopt.xml",
-                useRTMDeopt ? "use" : "no");
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                logFileName,
-                provoker,
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMDeopt",
-                        useRTMDeopt),
-                AbortProvoker.class.getName(),
-                AbortType.XABORT.toString()
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        int expectedUncommonTraps = useRTMDeopt ? 1 : 0;
-        int installedUncommonTraps
-                = RTMTestBase.installedRTMStateChangeTraps(logFileName);
-
-        Asserts.assertEQ(expectedUncommonTraps, installedUncommonTraps,
-                String.format("Expected to find %d uncommon traps "
-                              + "installed with reason rtm_state_change.",
-                        expectedUncommonTraps));
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMDeopt().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForInflatedLocks.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForInflatedLocks.java
deleted file mode 100644
index 0b5267a3ef6..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForInflatedLocks.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that rtm locking is used for inflated locks.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestUseRTMForInflatedLocks
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-
-import java.util.List;
-
-/**
- * Test verifies that RTM-based lock elision could be used for inflated locks
- * by calling compiled method that use RTM-based lock elision and using
- * manually inflated lock.
- * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times,
- * so total locks count should be the same.
- * This test could also be affected by retriable aborts, so -XX:RTMRetryCount=0
- * is used. For more information abort that issue see
- * {@link TestUseRTMAfterLockInflation}.
- */
-public class TestUseRTMForInflatedLocks {
-
-    protected void runTestCases() throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-        RTMLockingStatistics lock;
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                provoker,
-                "-XX:-UseRTMForStackLocks",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:RTMRetryCount=0",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                AbortProvoker.class.getName(),
-                AbortType.XABORT.toString());
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                provoker.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1,
-                "VM output should contain exactly one rtm locking statistics "
-                + "entry for method " + provoker.getMethodWithLockName());
-
-        lock = statistics.get(0);
-        Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS,
-                "Total lock count should be greater or equal to "
-                + AbortProvoker.DEFAULT_ITERATIONS);
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMForInflatedLocks().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForStackLocks.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForStackLocks.java
deleted file mode 100644
index 720fedb613b..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMForStackLocks.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that rtm locking is used for stack locks.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.locking.TestUseRTMForStackLocks
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-
-import java.util.List;
-
-/**
- * Test verifies that RTM-based lock elision could be used for stack locks
- * by calling compiled method that use RTM-based lock elision and using
- * stack lock.
- * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times,
- * so total locks count should be the same.
- * This test could also be affected by retriable aborts, so -XX:RTMRetryCount=0
- * is used. For more information abort that issue see
- * {@link TestUseRTMAfterLockInflation}.
- */
-public class TestUseRTMForStackLocks {
-    private static final boolean INFLATE_MONITOR = false;
-
-    protected void runTestCases() throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-        RTMLockingStatistics lock;
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                provoker,
-                "-XX:+UseRTMForStackLocks",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:RTMRetryCount=0",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                AbortProvoker.class.getName(),
-                AbortType.XABORT.toString(),
-                Boolean.toString(TestUseRTMForStackLocks.INFLATE_MONITOR));
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                provoker.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1,
-                "VM output should contain exactly one rtm locking statistics "
-                + "entry for method " + provoker.getMethodWithLockName());
-
-        lock = statistics.get(0);
-        Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS,
-                "Total locks count should be greater or equal to "
-                + AbortProvoker.DEFAULT_ITERATIONS);
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMForStackLocks().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMXendForLockBusy.java b/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMXendForLockBusy.java
deleted file mode 100644
index 2eb3735855e..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/locking/TestUseRTMXendForLockBusy.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that UseRTMXendForLockBusy option affects
- *          method behaviour if lock is busy.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                   -XX:+WhiteBoxAPI
- *                   compiler.rtm.locking.TestUseRTMXendForLockBusy
- */
-
-package compiler.rtm.locking;
-
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.BusyLock;
-import compiler.testlibrary.rtm.CompilableTest;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that with +UseRTMXendForLockBusy there will be no aborts
- * forced by the test.
- */
-public class TestUseRTMXendForLockBusy {
-    private final static int LOCKING_TIME = 5000;
-
-    protected void runTestCases() throws Throwable {
-        // inflated lock, xabort on lock busy
-        verifyXendForLockBusy(true, false);
-        // inflated lock, xend on lock busy
-        verifyXendForLockBusy(true, true);
-        // stack lock, xabort on lock busy
-        verifyXendForLockBusy(false, false);
-        // stack lock, xend on lock busy
-        verifyXendForLockBusy(false, true);
-    }
-
-    private void verifyXendForLockBusy(boolean inflateMonitor,
-            boolean useXend) throws Throwable {
-        CompilableTest test = new BusyLock();
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                test,
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        !inflateMonitor),
-                CommandLineOptionTest.prepareBooleanFlag(
-                        "UseRTMXendForLockBusy",
-                        useXend),
-                "-XX:RTMRetryCount=0",
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                BusyLock.class.getName(),
-                Boolean.toString(inflateMonitor),
-                Integer.toString(TestUseRTMXendForLockBusy.LOCKING_TIME)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                test.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1, "VM output should contain "
-                + "exactly one rtm locking statistics entry for method "
-                + test.getMethodWithLockName());
-
-        long aborts = statistics.get(0).getAborts(AbortType.XABORT);
-
-        if (useXend) {
-            Asserts.assertEQ(aborts, 0L,
-                    "Expected to get no aborts on busy lock");
-        } else {
-            Asserts.assertGT(aborts, 0L,
-                    "Expected to get at least one abort on busy lock");
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMXendForLockBusy().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/method_options/TestNoRTMLockElidingOption.java b/test/hotspot/jtreg/compiler/rtm/method_options/TestNoRTMLockElidingOption.java
deleted file mode 100644
index 07514e4fc37..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/method_options/TestNoRTMLockElidingOption.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that NoRTMLockEliding option could be applied to
- *          specified method and that such method will not use rtm.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.method_options.TestNoRTMLockElidingOption
- */
-
-package compiler.rtm.method_options;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that method tagged with option <i>NoRTMLockElidingOption</i>
- * will not use RTM-based lock elision.
- * Test invokes compiled method and checks that no deoptimization with
- * <i>rtm_state_change</i> reason had happened and that that VM output
- * does not contain RTM locking statistics for compiled method.
- */
-public class TestNoRTMLockElidingOption {
-
-    public void runTestCases() throws Throwable {
-        verifyOption(false);
-        verifyOption(true);
-    }
-
-    public void verifyOption(boolean useStackLock) throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-        String logFileName = String.format("rtm_deopt_%s_stack_lock.xml",
-                (useStackLock ? "use" : "no"));
-        String methodOption = String.format("-XX:CompileCommand=option," +
-                "%s,NoRTMLockEliding", provoker.getMethodWithLockName());
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                logFileName,
-                provoker,
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                methodOption,
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:+UseRTMDeopt",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                AbortProvoker.class.getName(),
-                AbortType.XABORT.toString(),
-                Boolean.toString(!useStackLock)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName);
-
-        Asserts.assertEQ(firedTraps, 0,
-                "No deoptimizations with rtm_state_change reason are expected");
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                provoker.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 0,
-                "VM output should not contain RTM locking statistics entries "
-                + "for method " + provoker.getMethodWithLockName());
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestNoRTMLockElidingOption().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/method_options/TestUseRTMLockElidingOption.java b/test/hotspot/jtreg/compiler/rtm/method_options/TestUseRTMLockElidingOption.java
deleted file mode 100644
index 4007121b4aa..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/method_options/TestUseRTMLockElidingOption.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that UseRTMLockEliding option could be applied to
- *          specified method and that such method will not be deoptimized
- *          on high abort ratio.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.method_options.TestUseRTMLockElidingOption
- */
-
-package compiler.rtm.method_options;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.util.List;
-
-/**
- * Test verifies that method tagged with option <i>UseRTMLockElidingOption</i>
- * will use RTM-based lock elision, but will be never deoptimized with
- * <i>rtm_state_change reason</i>.
- * Test invokes compiled method and checks that no deoptimization with
- * <i>rtm_state_change</i> reason had happened and that that VM output
- * contains RTM locking statistics for compiled method and that total locks
- * count equals to method's invocations.
- * Since last assert is pretty strict, test uses -XX:RTMRetryCount=0 in order
- * to avoid issue with retriable aborts described in
- * {@link TestUseRTMAfterLockInflation}.
- */
-public class TestUseRTMLockElidingOption {
-
-    public void runTestCases() throws Throwable {
-        verifyOption(false);
-        verifyOption(true);
-    }
-
-    public void verifyOption(boolean useStackLock) throws Throwable {
-        AbortProvoker provoker = AbortType.XABORT.provoker();
-        String logFileName = String.format("rtm_deopt_%s_stack_lock.xml",
-                (useStackLock ? "use" : "no"));
-        String methodOption = String.format("-XX:CompileCommand=option," +
-                "%s,UseRTMLockEliding", provoker.getMethodWithLockName());
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                logFileName,
-                provoker,
-                CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks",
-                        useStackLock),
-                methodOption,
-                "-XX:RTMTotalCountIncrRate=1",
-                "-XX:RTMRetryCount=0",
-                "-XX:+UseRTMDeopt",
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                provoker.getClass().getName(),
-                AbortType.XABORT.toString(),
-                Boolean.toString(!useStackLock)
-        );
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName);
-
-        Asserts.assertEQ(firedTraps, 0,
-                "Method deoptimization with rtm_state_change is unexpected");
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                provoker.getMethodWithLockName(), outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 1,
-                "VM output should contain exactly one RTM locking "
-                + "statistics entry for method "
-                + provoker.getMethodWithLockName());
-
-        RTMLockingStatistics lock = statistics.get(0);
-
-        Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS,
-                "Expected to get total locks count equal to total amount of "
-                + "lock attempts.");
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestUseRTMLockElidingOption().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java b/test/hotspot/jtreg/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java
deleted file mode 100644
index 4223924b9bd..00000000000
--- a/test/hotspot/jtreg/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 8031320
- * @summary Verify that rtm locking statistics contain proper information
- *          on overall aborts and locks count and count of aborts of
- *          different types. Test also verify that VM output does not
- *          contain rtm locking statistics when it should not.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.rtm.cpu & vm.rtm.compiler
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- *                          -XX:+WhiteBoxAPI
- *                          compiler.rtm.print.TestPrintPreciseRTMLockingStatistics
- */
-
-
-package compiler.rtm.print;
-
-import compiler.testlibrary.rtm.AbortProvoker;
-import compiler.testlibrary.rtm.AbortType;
-import compiler.testlibrary.rtm.RTMLockingStatistics;
-import compiler.testlibrary.rtm.RTMTestBase;
-import jdk.test.lib.Asserts;
-import jdk.test.lib.process.OutputAnalyzer;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Test verifies that VM output does not contain RTM locking statistics when it
- * should not (when PrintPreciseRTMLockingStatistics is off) and that with
- * -XX:+PrintPreciseRTMLockingStatistics locking statistics contains sane
- * total locks and aborts count as well as for specific abort types.
- */
-public class TestPrintPreciseRTMLockingStatistics {
-
-    public void runTestCases() throws Throwable {
-        verifyNoStatistics();
-        verifyStatistics();
-    }
-
-    // verify that VM output does not contain
-    // rtm locking statistics
-    private void verifyNoStatistics() throws Throwable {
-        verifyNoStatistics(AbortType.XABORT);
-
-        verifyNoStatistics(AbortType.XABORT,
-                "-XX:-PrintPreciseRTMLockingStatistics");
-
-        verifyNoStatistics(AbortType.XABORT, "-XX:-UseRTMLocking",
-                "-XX:+PrintPreciseRTMLockingStatistics");
-    }
-
-    // verify that rtm locking statistics contain information
-    // about each type of aborts
-    private void verifyStatistics() throws Throwable {
-        verifyAbortsCount(AbortType.XABORT);
-        verifyAbortsCount(AbortType.MEM_CONFLICT);
-        verifyAbortsCount(AbortType.BUF_OVERFLOW);
-        verifyAbortsCount(AbortType.NESTED_ABORT);
-    }
-
-    private void verifyNoStatistics(AbortType abortProvokerType,
-            String... vmOpts) throws Throwable {
-        AbortProvoker provoker = abortProvokerType.provoker();
-        List<String> finalVMOpts = new LinkedList<>();
-        Collections.addAll(finalVMOpts, vmOpts);
-        Collections.addAll(finalVMOpts, AbortProvoker.class.getName(),
-                abortProvokerType.toString());
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(provoker,
-                finalVMOpts.toArray(new String[finalVMOpts.size()]));
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                outputAnalyzer.getOutput());
-
-        Asserts.assertEQ(statistics.size(), 0, "VM output should not contain "
-                + "any RTM locking statistics");
-    }
-
-    private void verifyAbortsCount(AbortType abortType) throws Throwable {
-        AbortProvoker provoker = abortType.provoker();
-
-        OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(
-                provoker,
-                "-XX:+PrintPreciseRTMLockingStatistics",
-                AbortProvoker.class.getName(),
-                abortType.toString());
-
-        outputAnalyzer.shouldHaveExitValue(0);
-
-        List<RTMLockingStatistics> statistics = RTMLockingStatistics.fromString(
-                provoker.getMethodWithLockName(),outputAnalyzer.getOutput());
-
-        Asserts.assertGT(statistics.size(), 0, "VM output should contain one "
-                + "rtm locking statistics entry for method "
-                + provoker.getMethodWithLockName());
-
-        RTMLockingStatistics lock = statistics.get(0);
-
-        Asserts.assertGT(lock.getTotalAborts(), 0L,
-                "RTM locking statistics should contain non zero total aborts "
-                + "count");
-
-        Asserts.assertGT(lock.getAborts(abortType), 0L, String.format(
-                "RTM locking statistics should contain non zero aborts count "
-                + "for abort reason %s", abortType));
-    }
-
-    public static void main(String args[]) throws Throwable {
-        new TestPrintPreciseRTMLockingStatistics().runTestCases();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/sharedstubs/SharedStubToInterpTest.java b/test/hotspot/jtreg/compiler/sharedstubs/SharedStubToInterpTest.java
index 5dd938442cc..2bf8afae609 100644
--- a/test/hotspot/jtreg/compiler/sharedstubs/SharedStubToInterpTest.java
+++ b/test/hotspot/jtreg/compiler/sharedstubs/SharedStubToInterpTest.java
@@ -36,6 +36,7 @@
  * @requires vm.opt.TieredStopAtLevel == null & vm.opt.TieredCompilation == null
  * @requires vm.simpleArch == "x86" | vm.simpleArch == "x64" | vm.simpleArch == "aarch64" | vm.simpleArch == "riscv64"
  * @requires vm.debug
+ * @requires !vm.graal.enabled
  * @run driver compiler.sharedstubs.SharedStubToInterpTest -XX:-TieredCompilation
  *
  */
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortProvoker.java
deleted file mode 100644
index cf74942aadf..00000000000
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortProvoker.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (c) 2014, 2022, 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 compiler.testlibrary.rtm;
-
-import jdk.test.lib.Asserts;
-import jdk.test.whitebox.WhiteBox;
-
-import java.util.Objects;
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-
-/**
- * Base class for different transactional execution abortion
- * provokers aimed to force abort due to specified reason.
- */
-public abstract class AbortProvoker implements CompilableTest {
-    public static final long DEFAULT_ITERATIONS = 10000L;
-    private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
-    @SuppressWarnings("unused")
-    private static int sharedState = 0;
-    /**
-     * Inflates monitor associated with object {@code monitor}.
-     * Inflation is forced by entering the same monitor from
-     * two different threads.
-     *
-     * @param monitor monitor to be inflated.
-     * @return inflated monitor.
-     * @throws Exception if something went wrong.
-     */
-    public static Object inflateMonitor(Object monitor) throws Exception {
-        CyclicBarrier barrier = new CyclicBarrier(2);
-
-        Runnable inflatingRunnable = () -> {
-            synchronized (monitor) {
-                try {
-                    barrier.await();
-                } catch (BrokenBarrierException  | InterruptedException e) {
-                    throw new RuntimeException(
-                            "Synchronization issue occurred.", e);
-                }
-                try {
-                    monitor.wait();
-                } catch (InterruptedException e) {
-                    throw new AssertionError("The thread waiting on an"
-                            + " inflated monitor was interrupted, thus test"
-                            + " results may be incorrect.", e);
-                }
-            }
-        };
-
-        Thread t = new Thread(inflatingRunnable);
-        t.setDaemon(true);
-        t.start();
-        // Wait until thread t enters the monitor.
-        barrier.await();
-        synchronized (monitor) {
-            // At this point thread t is already waiting on the monitor.
-            // Modifying static field just to avoid lock's elimination.
-            sharedState++;
-        }
-        verifyMonitorState(monitor, true /* inflated */);
-        return monitor;
-    }
-
-    /**
-     * Verifies that {@code monitor} is a stack-lock or inflated lock depending
-     * on {@code shouldBeInflated} value. If {@code monitor} is inflated while
-     * it is expected that it should be a stack-lock, then this method attempts
-     * to deflate it by forcing a safepoint and then verifies the state once
-     * again.
-     *
-     * @param monitor monitor to be verified.
-     * @param shouldBeInflated flag indicating whether or not monitor is
-     *                         expected to be inflated.
-     * @throws RuntimeException if the {@code monitor} in a wrong state.
-     */
-    public static void verifyMonitorState(Object monitor,
-            boolean shouldBeInflated) {
-        if (!shouldBeInflated && WHITE_BOX.isMonitorInflated(monitor)) {
-            boolean did_deflation = WHITE_BOX.deflateIdleMonitors();
-            Asserts.assertEQ(did_deflation, true,
-                             "deflateIdleMonitors() should have worked.");
-        }
-        Asserts.assertEQ(WHITE_BOX.isMonitorInflated(monitor), shouldBeInflated,
-                "Monitor in a wrong state.");
-    }
-    /**
-     * Verifies that monitor used by the {@code provoker} is a stack-lock or
-     * inflated lock depending on {@code shouldBeInflated} value. If such
-     * monitor is inflated while it is expected that it should be a stack-lock,
-     * then this method attempts to deflate it by forcing a safepoint and then
-     * verifies the state once again.
-     *
-     * @param provoker AbortProvoker whose monitor's state should be verified.
-     * @param shouldBeInflated flag indicating whether or not monitor is
-     *                         expected to be inflated.
-     * @throws RuntimeException if the {@code monitor} in a wrong state.
-     */
-    public static void verifyMonitorState(AbortProvoker provoker,
-            boolean shouldBeInflated) {
-        verifyMonitorState(provoker.monitor, shouldBeInflated);
-    }
-
-    /**
-     * Get instance of specified AbortProvoker, inflate associated monitor
-     * if needed and then invoke forceAbort method in a loop.
-     *
-     * Usage:
-     * AbortProvoker &lt;AbortType name&gt; [&lt;inflate monitor&gt
-     * [&lt;iterations&gt; [ &lt;delay&gt;]]]
-     *
-     *  Default parameters are:
-     *  <ul>
-     *  <li>inflate monitor = <b>true</b></li>
-     *  <li>iterations = {@code AbortProvoker.DEFAULT_ITERATIONS}</li>
-     *  <li>delay = <b>0</b></li>
-     *  </ul>
-     */
-    public static void main(String args[]) throws Throwable {
-        Asserts.assertGT(args.length, 0, "At least one argument is required.");
-
-        AbortType abortType = AbortType.lookup(Integer.valueOf(args[0]));
-        boolean monitorShouldBeInflated = true;
-        long iterations = AbortProvoker.DEFAULT_ITERATIONS;
-
-        if (args.length > 1) {
-            monitorShouldBeInflated = Boolean.valueOf(args[1]);
-
-            if (args.length > 2) {
-                iterations = Long.valueOf(args[2]);
-
-                if (args.length > 3) {
-                    Thread.sleep(Integer.valueOf(args[3]));
-                }
-            }
-        }
-
-        AbortProvoker provoker = abortType.provoker();
-
-        if (monitorShouldBeInflated) {
-            provoker.inflateMonitor();
-        }
-
-        for (long i = 0; i < iterations; i++) {
-            AbortProvoker.verifyMonitorState(provoker, monitorShouldBeInflated);
-            provoker.forceAbort();
-        }
-    }
-
-    protected final Object monitor;
-
-    protected AbortProvoker() {
-        this(new Object());
-    }
-
-    protected AbortProvoker(Object monitor) {
-        this.monitor = Objects.requireNonNull(monitor);
-    }
-
-    /**
-     * Inflates monitor used by this AbortProvoker instance.
-     * @throws Exception
-     */
-    public void inflateMonitor() throws Exception {
-        AbortProvoker.inflateMonitor(monitor);
-    }
-
-    /**
-     * Forces transactional execution abortion.
-     */
-    public abstract void forceAbort();
-
-    /**
-     * Returns names of all methods that have to be compiled
-     * in order to successfully force transactional execution
-     * abortion.
-     *
-     * @return array with methods' names that have to be compiled.
-     */
-    @Override
-    public String[] getMethodsToCompileNames() {
-        return new String[] { getMethodWithLockName() };
-    }
-
-    /**
-     * Returns name of the method that will contain monitor whose locking
-     * will be elided using transactional execution.
-     *
-     * @return name of the method that will contain elided lock.
-     */
-    @Override
-    public String getMethodWithLockName() {
-        return this.getClass().getName() + "::forceAbort";
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortType.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortType.java
deleted file mode 100644
index dd439111afa..00000000000
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/AbortType.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package compiler.testlibrary.rtm;
-
-import jdk.test.lib.Asserts;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Type of transactional execution abort.
- * For more details on different abort types please see
- * shared/vm/runtime/rtmLocking.hpp
- */
-public enum AbortType {
-    XABORT(0),
-    RETRIABLE(1),
-    MEM_CONFLICT(2),
-    BUF_OVERFLOW(3),
-    DEBUG_BREAKPOINT(4),
-    NESTED_ABORT(5);
-
-    private final int type;
-    private static final Map<Integer, AbortType> LOOKUP_MAP = new HashMap<>();
-
-    static {
-        for (AbortType abortType : AbortType.values()) {
-            Asserts.assertFalse(LOOKUP_MAP.containsKey(abortType.type),
-                    "Abort type values should be unique.");
-            LOOKUP_MAP.put(abortType.type, abortType);
-        }
-    }
-
-    private AbortType(int type) {
-        this.type = type;
-    }
-
-    /**
-     * Returns AbortProvoker for aborts represented by this abort type.
-     *
-     * @return an AbortProvoker instance
-     */
-    public AbortProvoker provoker() {
-        return AbortType.createNewProvoker(this);
-    }
-
-    public static AbortType lookup(int type) {
-        Asserts.assertLT(type, AbortType.values().length,
-                "Unknown abort type.");
-        return LOOKUP_MAP.get(type);
-    }
-
-    /**
-     * Returns transaction execution abort provoker for specified abortion type.
-     *
-     * @param type a type of abort which will be forced by returned
-     *             AbortProvoker instance.
-     * @return AbortProvoker instance that will force abort of specified type
-     * @throws RuntimeException if there is no provoker for specified type
-     */
-    private static AbortProvoker createNewProvoker(AbortType type) {
-        switch (type) {
-            case XABORT:
-                return new XAbortProvoker();
-            case MEM_CONFLICT:
-                return new MemoryConflictProvoker();
-            case BUF_OVERFLOW:
-                return new BufferOverflowProvoker();
-            case NESTED_ABORT:
-                return new NestedAbortProvoker();
-            default:
-                throw new RuntimeException("No provoker exists for type "
-                        + type.name());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return Integer.toString(type);
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/BusyLock.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/BusyLock.java
deleted file mode 100644
index 79120a64136..00000000000
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/BusyLock.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package compiler.testlibrary.rtm;
-
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-
-/**
- * Test case for busy lock scenario.
- * One thread enters the monitor and sleep for a while.
- * Another thread is blocked on the same monitor.
- */
-public class BusyLock implements CompilableTest, Runnable {
-    private static final int DEFAULT_TIMEOUT = 1000;
-    private final CyclicBarrier barrier;
-
-    // Following field have to be static in order to avoid escape analysis.
-    @SuppressWarnings("UnsuedDeclaration")
-    private static int field = 0;
-    protected final Object monitor;
-    protected final int timeout;
-
-    public BusyLock() {
-        this(BusyLock.DEFAULT_TIMEOUT);
-    }
-
-    public BusyLock(int timeout) {
-        this.timeout = timeout;
-        this.monitor = new Object();
-        this.barrier = new CyclicBarrier(2);
-    }
-
-    @Override
-    public void run() {
-        try {
-            synchronized (monitor) {
-                barrier.await();
-                Thread.sleep(timeout);
-            }
-        } catch (InterruptedException | BrokenBarrierException e) {
-            throw new RuntimeException("Synchronization error happened.", e);
-        }
-    }
-
-    public void syncAndTest() {
-        try {
-            // wait until monitor is locked by a ::run method
-            barrier.await();
-        } catch (InterruptedException | BrokenBarrierException e) {
-            throw new RuntimeException("Synchronization error happened.", e);
-        }
-        test();
-    }
-
-    public void test() {
-        synchronized(monitor) {
-            BusyLock.field++;
-        }
-    }
-
-    @Override
-    public String getMethodWithLockName() {
-        return this.getClass().getName() + "::test";
-    }
-
-    @Override
-    public String[] getMethodsToCompileNames() {
-        return new String[] { getMethodWithLockName() };
-    }
-
-    /**
-     * Usage:
-     * BusyLock [ &lt;inflate monitor&gt; [ &lt;timeout&gt; ] ]
-     *
-     * Default values are:
-     * <ul>
-     *     <li>inflate monitor = {@code true}</li>
-     *     <li>timeout = {@code BusyLock.DEFAULT_TIMEOUT}</li>
-     * </ul>
-     */
-    public static void main(String args[]) throws Exception {
-        int timeoutValue = BusyLock.DEFAULT_TIMEOUT;
-        boolean inflateMonitor = true;
-
-        if (args.length > 0 ) {
-            inflateMonitor = Boolean.valueOf(args[0]);
-
-            if (args.length > 1) {
-                timeoutValue = Integer.valueOf(args[1]);
-            }
-        }
-
-        BusyLock busyLock = new BusyLock(timeoutValue);
-
-        if (inflateMonitor) {
-            AbortProvoker.inflateMonitor(busyLock.monitor);
-        }
-
-        Thread t = new Thread(busyLock);
-        t.start();
-        busyLock.syncAndTest();
-        t.join();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/MemoryConflictProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/MemoryConflictProvoker.java
deleted file mode 100644
index 7926c9e23b4..00000000000
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/MemoryConflictProvoker.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2014, 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 compiler.testlibrary.rtm;
-
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-
-/**
- * To force transactional execution abort due to memory conflict
- * one thread should access memory region from transactional region
- * while another thread should modify the same memory region.
- * Since this scenario is based on the race condition between threads
- * you should not expect some particular amount of aborts.
- */
-class MemoryConflictProvoker extends AbortProvoker {
-    // Following field have to be static in order to avoid escape analysis.
-    @SuppressWarnings("UnsuedDeclaration")
-    private static int field = 0;
-    private static final int INNER_ITERATIONS = 10000;
-    private final CyclicBarrier barrier;
-    /**
-     * This thread will access and modify memory region
-     * from outside of the transaction.
-     */
-    private final Runnable conflictingThread;
-
-    public MemoryConflictProvoker() {
-        this(new Object());
-    }
-
-    public MemoryConflictProvoker(Object monitor) {
-        super(monitor);
-        barrier = new CyclicBarrier(2);
-        conflictingThread = () -> {
-            try {
-                barrier.await();
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-            for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) {
-                MemoryConflictProvoker.field++;
-            }
-        };
-    }
-
-    /**
-     * Accesses and modifies memory region from within the transaction.
-     */
-    public void transactionalRegion() {
-        for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) {
-            synchronized(monitor) {
-                MemoryConflictProvoker.field--;
-            }
-        }
-    }
-
-    @Override
-    public void forceAbort() {
-        try {
-            Thread t = new Thread(conflictingThread);
-            t.start();
-            try {
-                barrier.await();
-            } catch (InterruptedException | BrokenBarrierException e) {
-                throw new RuntimeException(e);
-            }
-            transactionalRegion();
-            t.join();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public String getMethodWithLockName() {
-        return this.getClass().getName() + "::transactionalRegion";
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/NestedAbortProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/NestedAbortProvoker.java
deleted file mode 100644
index 7123f2d562f..00000000000
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/NestedAbortProvoker.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2014, 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 compiler.testlibrary.rtm;
-
-import java.util.Arrays;
-
-/**
- * In order to force nested transaction abort NestedAbortProvoker
- * invoke BufferOverflowProvoker from transactional region.
- */
-class NestedAbortProvoker extends AbortProvoker {
-    // Following field have to be static in order to avoid escape analysis.
-    @SuppressWarnings("UnsuedDeclaration")
-    private static int field = 0;
-    private final AbortProvoker nestedAbortProvoker;
-
-    public NestedAbortProvoker() {
-        this.nestedAbortProvoker = new XAbortProvoker(monitor);
-    }
-
-    @Override
-    public void forceAbort() {
-        synchronized(monitor) {
-            NestedAbortProvoker.field++;
-            nestedAbortProvoker.forceAbort();
-            NestedAbortProvoker.field--;
-        }
-    }
-
-    @Override
-    public String[] getMethodsToCompileNames() {
-        String nestedProvokerMethods[]
-                = nestedAbortProvoker.getMethodsToCompileNames();
-        String methods[] = Arrays.copyOf(nestedProvokerMethods,
-                nestedProvokerMethods.length + 1);
-        methods[methods.length - 1] = getMethodWithLockName();
-        return methods;
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMLockingStatistics.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMLockingStatistics.java
deleted file mode 100644
index 351b1a96bd8..00000000000
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMLockingStatistics.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, 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 compiler.testlibrary.rtm;
-
-import java.util.EnumMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Wrapper for +UsePreciseRTMLockingStatistics output.
- *
- * Example of locking statistics:
- *
- * java/lang/ClassLoader.loadClass@7
- * # rtm locks total (estimated): 6656
- * # rtm lock aborts (total): 10000
- * # rtm lock aborts 0 (abort instruction   ): 9999
- * # rtm lock aborts 1 (may succeed on retry): 9999
- * # rtm lock aborts 2 (thread conflict     ): 0
- * # rtm lock aborts 3 (buffer overflow     ): 1
- * # rtm lock aborts 4 (debug or trap hit   ): 0
- * # rtm lock aborts 5 (maximum nested depth): 0
- */
-public class RTMLockingStatistics {
-    /**
-     * Pattern for aborts per abort type entries.
-     */
-    private static final Pattern ABORT_PATTERN;
-
-    /**
-     * Pattern for whole statistics.
-     */
-    private static final Pattern RTM_LOCKING_STATISTICS_PATTERN;
-
-    static {
-        String abortRe
-                = "# rtm lock aborts\\s+(?<type>[0-9]+)\\s+\\([a-z\\s]+\\):\\s(?<count>[0-9]+)";
-
-        ABORT_PATTERN = Pattern.compile(abortRe);
-        RTM_LOCKING_STATISTICS_PATTERN = Pattern.compile(
-                "(?<className>[^.\n]+)\\." +
-                "(?<methodName>[^@\n]+)@(?<bci>[0-9]+)\n" +
-                "# rtm locks total \\(estimated\\):\\s*" +
-                "(?<totalLocks>[0-9]+)\n" +
-                "# rtm lock aborts\\s+\\(total\\):\\s*(?<totalAborts>[0-9]+)\n" +
-                "(?<abortStats>(" + abortRe + "\n)+)");
-    }
-
-    private final long totalLocks;
-    private final long totalAborts;
-    private final String className;
-    private final String methodName;
-    private final int bci;
-    private final Map<AbortType, Long> aborts = new EnumMap<>(AbortType.class);
-
-    /**
-     * Constructs RTMLockingStatistics from matcher captured statistics entry.
-     * @param matcher Matcher captured statistics entry.
-     */
-    private RTMLockingStatistics(Matcher matcher) {
-        className = matcher.group("className");
-        methodName = matcher.group("methodName");
-        bci = Integer.valueOf(matcher.group("bci"));
-        totalLocks = Long.valueOf(matcher.group("totalLocks"));
-        totalAborts = Long.valueOf(matcher.group("totalAborts"));
-
-        Matcher abortMatcher = ABORT_PATTERN.matcher(matcher.
-                group("abortStats"));
-
-        while (abortMatcher.find()) {
-            int type = Integer.valueOf(abortMatcher.group("type"));
-            long count = Long.valueOf(abortMatcher.group("count"));
-            setAborts(AbortType.lookup(type), count);
-        }
-    }
-
-
-    /**
-     * Parses string and return all founded RTM locking statistics entries.
-     *
-     * @param str the string to be parsed.
-     * @return list with all founded RTM locking statistics entries or
-     *         empty list if nothing was found.
-     */
-    public static List<RTMLockingStatistics> fromString(String str) {
-        List<RTMLockingStatistics> statistics = new LinkedList<>();
-        Matcher matcher = RTM_LOCKING_STATISTICS_PATTERN.matcher(str);
-
-        while (matcher.find()) {
-            RTMLockingStatistics lock = new RTMLockingStatistics(matcher);
-            statistics.add(lock);
-        }
-
-        return statistics;
-    }
-
-    /**
-     * Parses string and return all founded RTM locking statistics entries
-     * for locks in method {@code methodName}.
-     *
-     * @param methodName a name of the method for locks from which statistics
-     *                   should be gathered.
-     * @param str the string to be parsed.
-     * @return list with all founded RTM locking statistics entries or
-     *         empty list if nothing was found.
-     */
-    public static List<RTMLockingStatistics> fromString(String methodName,
-            String str) {
-        String formattedMethodName = formatMethodName(methodName);
-
-        List<RTMLockingStatistics> statisticsForMethod = new LinkedList<>();
-        for (RTMLockingStatistics statistics : fromString(str)) {
-            if (statistics.getLockName().startsWith(formattedMethodName)) {
-                statisticsForMethod.add(statistics);
-            }
-        }
-        return statisticsForMethod;
-    }
-
-    /**
-     * Formats method's name so it will have the same format as
-     * in rtm locking statistics.
-     *
-     * <pre>
-     * Example:
-     * com/example/Klass::method =&gt; com/example/Klass.method
-     * com/example/Klass.method  =&gt; com/example/Klass.method
-     * com.example.Klass::method =&gt; com/example/Klass.method
-     * com.example.Klass.method  =&gt; com/example/Klass.method
-     * </pre>
-     *
-     * @param methodName method's name that should be formatted.
-     * @return formatted method's name.
-     */
-    private static String formatMethodName(String methodName) {
-        String m[];
-        if (methodName.contains("::")) {
-            m = methodName.split("::");
-        } else {
-            int splitAt = methodName.lastIndexOf('.');
-            m = new String[2];
-            m[0] = methodName.substring(0, splitAt);
-            m[1] = methodName.substring(splitAt + 1);
-        }
-        return String.format("%s.%s", m[0].replaceAll("\\.", "/"), m[1]);
-    }
-
-    /**
-     * Returns name of lock for which this statistics was collected.
-     * Lock name has following format:
-     * &lt;class name&gt;.&lt;method name&gt;@&lt;bci&gt;
-     *
-     * @return name of lock.
-     */
-    public String getLockName() {
-        return String.format("%s.%s@%d", className, methodName, bci);
-    }
-
-    /**
-     * Returns aborts count for specified abort type.
-     *
-     * @param type an abort type.
-     * @return count of aborts.
-     */
-    public long getAborts(AbortType type) {
-        return aborts.getOrDefault(type, 0L);
-    }
-
-    /**
-     * Sets aborts count for specified abort type.
-     *
-     * @param type an abort type.
-     * @param count count of aborts.
-     */
-    public void setAborts(AbortType type, long count) {
-        aborts.put(type, count);
-    }
-
-    public long getTotalLocks() {
-        return totalLocks;
-    }
-
-    public long getTotalAborts() {
-        return totalAborts;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append(getLockName()).append('\n');
-        builder.append(String.format("# rtm locks total (estimated): %d\n",
-                getTotalLocks()));
-        builder.append(String.format("# rtm lock aborts: %d\n",
-                getTotalLocks()));
-
-        for (AbortType type : AbortType.values()) {
-            builder.append(String.format("# rtm lock aborts %s %d\n",
-                    type.toString(), getAborts(type)));
-        }
-        return builder.toString();
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMTestBase.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMTestBase.java
deleted file mode 100644
index b6535e65428..00000000000
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/RTMTestBase.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright (c) 2014, 2023, 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 compiler.testlibrary.rtm;
-
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.process.ProcessTools;
-import jdk.test.lib.Utils;
-import jdk.test.lib.cli.CommandLineOptionTest;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Auxiliary methods used for RTM testing.
- */
-public class RTMTestBase {
-    private static final String RTM_STATE_CHANGE_REASON = "rtm_state_change";
-    /**
-     * We don't parse compilation log as XML-document and use regular
-     * expressions instead, because in some cases it could be
-     * malformed.
-     */
-    private static final String FIRED_UNCOMMON_TRAP_PATTERN_TEMPLATE
-            = "<uncommon_trap thread='[0-9]+' reason='%s'";
-    private static final String INSTALLED_UNCOMMON_TRAP_PATTERN_TEMPLATE
-            = "<uncommon_trap bci='[0-9]+' reason='%s'";
-
-    /**
-     * Executes RTM test in a new JVM started with {@code options} cli options.
-     *
-     * @param test test case to execute.
-     * @param options additional options for VM
-     * @throws Exception when something went wrong.
-     */
-    public static OutputAnalyzer executeRTMTest(CompilableTest test,
-            String... options) throws Exception {
-        ProcessBuilder processBuilder
-                = ProcessTools.createLimitedTestJavaProcessBuilder(
-                RTMTestBase.prepareTestOptions(test, options));
-        OutputAnalyzer outputAnalyzer
-                = new OutputAnalyzer(processBuilder.start());
-        System.out.println(outputAnalyzer.getOutput());
-        return outputAnalyzer;
-    }
-
-    /**
-     * Executes test case and save compilation log to {@code logFileName}.
-     *
-     * @param logFileName a name of compilation log file
-     * @param test a test case to execute case to execute
-     * @param options additional options to VM
-     * @return OutputAnalyzer for started test case
-     * @throws Exception when something went wrong
-     */
-    public static OutputAnalyzer executeRTMTest(String logFileName,
-            CompilableTest test, String... options) throws Exception {
-        ProcessBuilder processBuilder
-                = ProcessTools.createLimitedTestJavaProcessBuilder(
-                RTMTestBase.prepareTestOptions(logFileName, test, options));
-        OutputAnalyzer outputAnalyzer
-                = new OutputAnalyzer(processBuilder.start());
-
-        System.out.println(outputAnalyzer.getOutput());
-
-        return outputAnalyzer;
-    }
-
-    /**
-     * Finds count of uncommon traps with reason {@code reason} installed
-     * during compilation.
-     *
-     * @param compilationLogFile a path to file with LogCompilation output.
-     * @param reason reason of installed uncommon traps.
-     * @return count of installed uncommon traps with reason {@code reason}.
-     * @throws IOException
-     */
-    public static int installedUncommonTraps(String compilationLogFile,
-            String reason)throws IOException {
-        String pattern = String.format(
-                RTMTestBase.INSTALLED_UNCOMMON_TRAP_PATTERN_TEMPLATE,
-                reason);
-        return RTMTestBase.findTraps(compilationLogFile, pattern);
-    }
-
-    /**
-     * Finds count of uncommon traps with reason <i>rtm_state_change</i>
-     * installed during compilation.
-     *
-     * @param compilationLogFile a path to file with LogCompilation output.
-     * @return count of installed uncommon traps with reason
-     *         <i>rtm_state_change</i>.
-     * @throws IOException
-     */
-    public static int installedRTMStateChangeTraps(String compilationLogFile)
-            throws IOException {
-        return RTMTestBase.installedUncommonTraps(compilationLogFile,
-                RTMTestBase.RTM_STATE_CHANGE_REASON);
-    }
-
-    /**
-     * Finds count of fired uncommon traps with reason {@code reason}.
-     *
-     * @param compilationLogFile a path to file with LogCompilation output.
-     * @param reason a reason of fired uncommon traps.
-     * @return count of fired uncommon traps with reason {@code reason}.
-     * @throws IOException
-     */
-    public static int firedUncommonTraps(String compilationLogFile,
-            String reason) throws IOException {
-        String pattern = String.format(
-                RTMTestBase.FIRED_UNCOMMON_TRAP_PATTERN_TEMPLATE,
-                reason);
-        return RTMTestBase.findTraps(compilationLogFile, pattern);
-    }
-
-    /**
-     * Finds count of fired uncommon traps with reason <i>rtm_state_change</i>.
-     *
-     * @param compilationLogFile a path to file with LogCompilation output.
-     * @return count of fired uncommon traps with reason
-     *         <i>rtm_state_change</i>.
-     * @throws IOException
-     */
-    public static int firedRTMStateChangeTraps(String compilationLogFile)
-            throws IOException {
-        return RTMTestBase.firedUncommonTraps(compilationLogFile,
-                RTMTestBase.RTM_STATE_CHANGE_REASON);
-    }
-
-    /**
-     * Finds count of uncommon traps that matches regular
-     * expression in {@code re}.
-     *
-     * @param compilationLogFile a path to file with LogCompilation output.
-     * @param re regular expression to match uncommon traps.
-     * @throws IOException
-     */
-    private static int findTraps(String compilationLogFile, String re)
-            throws IOException {
-        String compilationLog = RTMTestBase.fileAsString(compilationLogFile);
-        Pattern pattern = Pattern.compile(re);
-        Matcher matcher = pattern.matcher(compilationLog);
-        int traps = 0;
-        while (matcher.find()) {
-            traps++;
-        }
-        return traps;
-    }
-
-    /**
-     * Returns file's content as a string.
-     *
-     * @param path a path to file to operate on.
-     * @return string with content of file.
-     * @throws IOException
-     */
-    private static String fileAsString(String path) throws IOException {
-        byte[] fileAsBytes = Files.readAllBytes(Paths.get(path));
-        return new String(fileAsBytes);
-    }
-
-    /**
-     * Prepares VM options for test execution.
-     * This method get test java options, filter out all RTM-related options,
-     * adds CompileCommand=compileonly,method_name options for each method
-     * from {@code methodToCompile} and finally appends all {@code vmOpts}.
-     *
-     * @param test test case whose methods that should be compiled.
-     *             If {@code null} then no additional <i>compileonly</i>
-     *             commands will be added to VM options.
-     * @param vmOpts additional options to pass to VM.
-     * @return Array with VM options.
-     */
-    private static String[] prepareTestOptions(CompilableTest test,
-            String... vmOpts) {
-        return RTMTestBase.prepareFilteredTestOptions(test, null, vmOpts);
-    }
-
-    /**
-     * Prepares VM options for test execution.
-     * This method get test java options, filter out all RTM-related options
-     * and all options that matches regexps in {@code additionalFilters},
-     * adds CompileCommand=compileonly,method_name options for each method
-     * from {@code methodToCompile} and finally appends all {@code vmOpts}.
-     *
-     * @param test test case whose methods that should be compiled.
-     *             If {@code null} then no additional <i>compileonly</i>
-     *             commands will be added to VM options.
-     * @param additionalFilters array with regular expression that will be
-     *                          used to filter out test java options.
-     *                          If {@code null} then no additional filters
-     *                          will be used.
-     * @param vmOpts additional options to pass to VM.
-     * @return array with VM options.
-     */
-    private static String[] prepareFilteredTestOptions(CompilableTest test,
-            String[] additionalFilters, String... vmOpts) {
-        List<String> finalVMOpts = new LinkedList<>();
-        String[] filters;
-
-        if (additionalFilters != null) {
-            filters = Arrays.copyOf(additionalFilters,
-                    additionalFilters.length + 1);
-        } else {
-            filters = new String[1];
-        }
-
-        filters[filters.length - 1] = "RTM";
-        String[] filteredVMOpts = Utils.getFilteredTestJavaOpts(filters);
-        Collections.addAll(finalVMOpts, filteredVMOpts);
-        Collections.addAll(finalVMOpts, "-Xcomp", "-server",
-                "-XX:-TieredCompilation", "-XX:+UseRTMLocking",
-                CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS,
-                CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
-                "-Xbootclasspath/a:.", "-XX:+WhiteBoxAPI",
-                "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED");
-
-        if (test != null) {
-            for (String method : test.getMethodsToCompileNames()) {
-                finalVMOpts.add("-XX:CompileCommand=compileonly," + method);
-            }
-        }
-        Collections.addAll(finalVMOpts, vmOpts);
-        return finalVMOpts.toArray(new String[finalVMOpts.size()]);
-    }
-
-    /**
-     * Adds additional options for VM required for successful execution of test.
-     *
-     * @param logFileName a name of compilation log file
-     * @param test a test case to execute
-     * @param options additional options to VM
-     * @return an array with VM options
-     */
-    private static String[] prepareTestOptions(String logFileName,
-            CompilableTest test, String... options) {
-        String[] preparedOptions = RTMTestBase.prepareFilteredTestOptions(
-                test,
-                new String[] {
-                        "LogCompilation",
-                        "LogFile"
-                });
-        List<String> updatedOptions = new LinkedList<>();
-        Collections.addAll(updatedOptions, preparedOptions);
-        Collections.addAll(updatedOptions,
-                "-XX:+LogCompilation",
-                "-XX:LogFile=" + logFileName);
-        Collections.addAll(updatedOptions, options);
-
-        return updatedOptions.toArray(new String[updatedOptions.size()]);
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/XAbortProvoker.java b/test/hotspot/jtreg/compiler/testlibrary/rtm/XAbortProvoker.java
deleted file mode 100644
index 23b7b779288..00000000000
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/XAbortProvoker.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, 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 compiler.testlibrary.rtm;
-
-/**
- * Current RTM locking implementation force transaction abort
- * before native method call by explicit xabort(0) call.
- */
-public class XAbortProvoker extends AbortProvoker {
-
-    static {
-        try {
-            System.loadLibrary("XAbortProvoker");
-        } catch (UnsatisfiedLinkError e) {
-            System.out.println("Could not load native library: " + e);
-        }
-    }
-
-    public native int doAbort();
-
-    // Following field have to be static in order to avoid escape analysis.
-    @SuppressWarnings("UnsuedDeclaration")
-    private static int field = 0;
-
-    public XAbortProvoker() {
-        this(new Object());
-    }
-
-    public XAbortProvoker(Object monitor) {
-        super(monitor);
-    }
-
-    @Override
-    public void forceAbort() {
-        synchronized(monitor) {
-            XAbortProvoker.field = doAbort();
-        }
-    }
-
-    @Override
-    public String[] getMethodsToCompileNames() {
-        return new String[] {
-                getMethodWithLockName(),
-                XAbortProvoker.class.getName() + "::doAbort"
-        };
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/uncommontrap/DeoptReallocFailure.java b/test/hotspot/jtreg/compiler/uncommontrap/DeoptReallocFailure.java
index 949a3ecb5c2..96c79864b52 100644
--- a/test/hotspot/jtreg/compiler/uncommontrap/DeoptReallocFailure.java
+++ b/test/hotspot/jtreg/compiler/uncommontrap/DeoptReallocFailure.java
@@ -63,7 +63,7 @@ public static synchronized long  test() {
         NoEscape[] noEscape = new NoEscape[45];
         noEscape[0] = new NoEscape();
         for (int i=0;i<1024*256;i++) {
-           root.array[i]= new Object[45];
+           root.array[i]= new Object[4500];
         }
         return noEscape[0].f1;
     }
diff --git a/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java b/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java
new file mode 100644
index 00000000000..38a2753a7ed
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/vectorapi/TestVectorAddMulReduction.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2024, Arm Limited. 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 compiler.vectorapi;
+
+import compiler.lib.ir_framework.*;
+
+import jdk.incubator.vector.DoubleVector;
+import jdk.incubator.vector.FloatVector;
+import jdk.incubator.vector.VectorOperators;
+import jdk.incubator.vector.VectorSpecies;
+
+import java.util.Random;
+
+import jdk.test.lib.Asserts;
+import jdk.test.lib.Utils;
+
+/**
+ * @test
+ * @bug 8320725
+ * @library /test/lib /
+ * @summary Verify non-strictly ordered AddReductionVF/VD and MulReductionVF/VD
+ *          nodes are generated in VectorAPI
+ * @modules jdk.incubator.vector
+ * @run driver compiler.vectorapi.TestVectorAddMulReduction
+ */
+
+public class TestVectorAddMulReduction {
+
+    private static final int SIZE = 1024;
+    private static final Random RD = Utils.getRandomInstance();
+
+    private static float[] fa;
+    private static float fres;
+    private static double[] da;
+    private static double dres;
+
+    static {
+        fa = new float[SIZE];
+        da = new double[SIZE];
+        fres = 1;
+        dres = 1;
+        for (int i = 0; i < SIZE; i++) {
+            fa[i] = RD.nextFloat();
+            da[i] = RD.nextDouble();
+        }
+    }
+
+    // Test add reduction operation for floats
+    @ForceInline
+    public static void testFloatAddKernel(VectorSpecies SPECIES, float[] f) {
+        for (int i = 0; i < SPECIES.loopBound(f.length); i += SPECIES.length()) {
+            var av = FloatVector.fromArray(SPECIES, f, i);
+            fres += av.reduceLanes(VectorOperators.ADD);
+        }
+    }
+
+    @Test
+    @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
+        applyIf = {"MaxVectorSize", ">=8"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testFloatAdd_64() {
+        testFloatAddKernel(FloatVector.SPECIES_64, fa);
+    }
+
+    @Test
+    @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
+        applyIf = {"MaxVectorSize", ">=16"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testFloatAdd_128() {
+        testFloatAddKernel(FloatVector.SPECIES_128, fa);
+    }
+
+    @Test
+    @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
+        applyIf = {"MaxVectorSize", ">=32"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testFloatAdd_256() {
+        testFloatAddKernel(FloatVector.SPECIES_256, fa);
+    }
+
+    @Test
+    @IR(counts = {IRNode.ADD_REDUCTION_VF, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
+        applyIf = {"MaxVectorSize", ">=64"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testFloatAdd_512() {
+        testFloatAddKernel(FloatVector.SPECIES_512, fa);
+    }
+
+    // Test add reduction operation for doubles
+    @ForceInline
+    public static void testDoubleAddKernel(VectorSpecies SPECIES, double[] d) {
+        for (int i = 0; i < SPECIES.loopBound(d.length); i += SPECIES.length()) {
+            var av = DoubleVector.fromArray(SPECIES, d, i);
+            dres += av.reduceLanes(VectorOperators.ADD);
+        }
+    }
+
+    @Test
+    @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
+        applyIf = {"MaxVectorSize", ">=16"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testDoubleAdd_128() {
+        testDoubleAddKernel(DoubleVector.SPECIES_128, da);
+    }
+
+    @Test
+    @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
+        applyIf = {"MaxVectorSize", ">=32"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testDoubleAdd_256() {
+        testDoubleAddKernel(DoubleVector.SPECIES_256, da);
+    }
+
+    @Test
+    @IR(counts = {IRNode.ADD_REDUCTION_VD, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
+        applyIf = {"MaxVectorSize", ">=64"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testDoubleAdd_512() {
+        testDoubleAddKernel(DoubleVector.SPECIES_512, da);
+    }
+
+    // Test mul reduction operation for floats
+    // On aarch64, there are no direct vector mul reduction instructions for float/double mul reduction
+    // and scalar instructions are emitted for 64-bit/128-bit vectors. Thus MulReductionVF/VD nodes are generated
+    // only for vector length of 8B/16B on vectorAPI.
+    @ForceInline
+    public static void testFloatMulKernel(VectorSpecies SPECIES, float[] f) {
+        for (int i = 0; i < SPECIES.loopBound(f.length); i += SPECIES.length()) {
+            var av = FloatVector.fromArray(SPECIES, f, i);
+            fres += av.reduceLanes(VectorOperators.MUL);
+        }
+    }
+
+    @Test
+    @IR(counts = {IRNode.MUL_REDUCTION_VF, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
+        applyIf = {"MaxVectorSize", ">=8"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testFloatMul_64() {
+        testFloatMulKernel(FloatVector.SPECIES_64, fa);
+    }
+
+    @Test
+    @IR(counts = {IRNode.MUL_REDUCTION_VF, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
+        applyIf = {"MaxVectorSize", ">=16"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testFloatMul_128() {
+        testFloatMulKernel(FloatVector.SPECIES_128, fa);
+    }
+
+    // Test mul reduction operation for doubles
+    @ForceInline
+    public static void testDoubleMulKernel(VectorSpecies SPECIES, double[] d) {
+        for (int i = 0; i < SPECIES.loopBound(d.length); i += SPECIES.length()) {
+            var av = DoubleVector.fromArray(SPECIES, d, i);
+            dres += av.reduceLanes(VectorOperators.MUL);
+        }
+    }
+
+    @Test
+    @IR(counts = {IRNode.MUL_REDUCTION_VD, ">=1", "no_strict_order", ">=1"},
+        failOn = {"requires_strict_order"},
+        applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
+        applyIf = {"MaxVectorSize", ">=16"},
+        phase = CompilePhase.PRINT_IDEAL)
+    public static void testDoubleMul_128() {
+        testDoubleMulKernel(DoubleVector.SPECIES_128, da);
+    }
+
+    public static void main(String[] args) {
+        TestFramework.runWithFlags("--add-modules=jdk.incubator.vector");
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/vectorapi/VectorGatherMaskFoldingTest.java b/test/hotspot/jtreg/compiler/vectorapi/VectorGatherMaskFoldingTest.java
index 88d1bbde1d4..88175baf8e4 100644
--- a/test/hotspot/jtreg/compiler/vectorapi/VectorGatherMaskFoldingTest.java
+++ b/test/hotspot/jtreg/compiler/vectorapi/VectorGatherMaskFoldingTest.java
@@ -100,7 +100,7 @@ public class VectorGatherMaskFoldingTest {
         for (int i = 0; i < L_SPECIES.length(); i++) {
             longArray[i] = i + 1;
             longArray2[i] = L_SPECIES.length() - i + 1;
-            longMask[i] = i % 2 == 0;
+            longMask[i] = L_SPECIES.length() > 1 && i % 2 == 0;
             longMask2[i] = i >= L_SPECIES.length() / 2;
             longIndices[i] = (i + L_SPECIES.length() / 2) % L_SPECIES.length();
             longIndices2[i] = (L_SPECIES.length() - i) % L_SPECIES.length();
@@ -126,7 +126,7 @@ public class VectorGatherMaskFoldingTest {
         for (int i = 0; i < D_SPECIES.length(); i++) {
             doubleArray[i] = (double) i + 1.0;
             doubleArray2[i] = (double) (D_SPECIES.length() - i) + 1.0;
-            doubleMask[i] = i % 2 == 0;
+            doubleMask[i] = D_SPECIES.length() > 1 && i % 2 == 0;
             doubleMask2[i] = i >= D_SPECIES.length() / 2;
             doubleIndices[i] = (i + D_SPECIES.length() / 2) % D_SPECIES.length();
             doubleIndices2[i] = (D_SPECIES.length() - i) % D_SPECIES.length();
@@ -168,7 +168,7 @@ public static void testTwoLongVectorLoadGatherNotEqualArray() {
     public static void testTwoLongVectorLoadGatherNotEqualIndices() {
         LongVector res = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices, 0);
         LongVector res2 = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices2, 0);
-        Asserts.assertNotEquals(res, res2);
+        Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(res2));
     }
 
     @Test
@@ -176,7 +176,7 @@ public static void testTwoLongVectorLoadGatherNotEqualIndices() {
     public static void testOneLongVectorLoadGather() {
         LongVector res = LongVector.fromArray(L_SPECIES, longArray, 0);
         LongVector res2 = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices, 0);
-        Asserts.assertNotEquals(res, res2);
+        Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(res2));
     }
 
     @Test
@@ -232,7 +232,7 @@ public static void testTwoLongVectorLoadGatherMaskedNotEqualMask() {
     public static void testTwoLongVectorLoadGatherMaskedNotEqualIndices() {
         LongVector res = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices, 0, longVectorMask);
         LongVector res2 = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices2, 0, longVectorMask);
-        Asserts.assertNotEquals(res, res2);
+        Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(res2));
     }
 
 
@@ -334,7 +334,7 @@ public static void testTwoDoubleVectorLoadGatherNotEqualArray() {
     public static void testTwoDoubleVectorLoadGatherNotEqualIndices() {
         DoubleVector res = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices, 0);
         DoubleVector res2 = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices2, 0);
-        Asserts.assertNotEquals(res, res2);
+        Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(res2));
     }
 
     @Test
@@ -342,7 +342,7 @@ public static void testTwoDoubleVectorLoadGatherNotEqualIndices() {
     public static void testOneDoubleVectorLoadGather() {
         DoubleVector res = DoubleVector.fromArray(D_SPECIES, doubleArray, 0);
         DoubleVector res2 = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices, 0);
-        Asserts.assertNotEquals(res, res2);
+        Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(res2));
     }
 
     @Test
@@ -398,7 +398,7 @@ public static void testTwoDoubleVectorLoadGatherMaskedNotEqualMask() {
     public static void testTwoDoubleVectorLoadGatherMaskedNotEqualIndices() {
         DoubleVector res = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices, 0, doubleVectorMask);
         DoubleVector res2 = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices2, 0, doubleVectorMask);
-        Asserts.assertNotEquals(res, res2);
+        Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(res2));
     }
 
 
@@ -506,7 +506,7 @@ public static void testTwoLongVectorStoreScatterNotEqualIndices() {
         long[] res2 = new long[L_SPECIES.length()];
         longVector.intoArray(res, 0, longIndices, 0);
         longVector.intoArray(res2, 0, longIndices2, 0);
-        Asserts.assertFalse(Arrays.equals(res, res2));
+        Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, res2));
     }
 
     @Test
@@ -516,7 +516,7 @@ public static void testOneLongVectorStoreScatter() {
         long[] res2 = new long[L_SPECIES.length()];
         longVector.intoArray(res, 0);
         longVector.intoArray(res2, 0, longIndices, 0);
-        Asserts.assertFalse(Arrays.equals(res, res2));
+        Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, res2));
     }
 
     @Test
@@ -586,7 +586,7 @@ public static void testTwoLongVectorStoreScatterMaskedNotEqualIndices() {
         long[] res2 = new long[L_SPECIES.length()];
         longVector.intoArray(res, 0, longIndices, 0, longVectorMask);
         longVector.intoArray(res2, 0, longIndices2, 0, longVectorMask);
-        Asserts.assertFalse(Arrays.equals(res, res2));
+        Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, res2));
     }
 
 
@@ -712,7 +712,7 @@ public static void testTwoDoubleVectorStoreScatterNotEqualIndices() {
         double[] res2 = new double[D_SPECIES.length()];
         doubleVector.intoArray(res, 0, doubleIndices, 0);
         doubleVector.intoArray(res2, 0, doubleIndices2, 0);
-        Asserts.assertFalse(Arrays.equals(res, res2));
+        Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, res2));
     }
 
     @Test
@@ -722,7 +722,7 @@ public static void testOneDoubleVectorStoreScatter() {
         double[] res2 = new double[D_SPECIES.length()];
         doubleVector.intoArray(res, 0);
         doubleVector.intoArray(res2, 0, doubleIndices, 0);
-        Asserts.assertFalse(Arrays.equals(res, res2));
+        Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, res2));
     }
 
     @Test
@@ -792,7 +792,7 @@ public static void testTwoDoubleVectorStoreScatterMaskedNotEqualIndices() {
         double[] res2 = new double[D_SPECIES.length()];
         doubleVector.intoArray(res, 0, doubleIndices, 0, doubleVectorMask);
         doubleVector.intoArray(res2, 0, doubleIndices2, 0, doubleVectorMask);
-        Asserts.assertFalse(Arrays.equals(res, res2));
+        Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, res2));
     }
 
 
@@ -909,7 +909,7 @@ public static void testOneLongVectorStoreLoadGather() {
         long[] array = new long[L_SPECIES.length()];
         longVector.intoArray(array, 0);
         LongVector res = LongVector.fromArray(L_SPECIES, array, 0, longIndices, 0);
-        Asserts.assertNotEquals(res, longVector);
+        Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(longVector));
     }
 
     @Test
@@ -918,7 +918,7 @@ public static void testOneLongVectorStoreScatterLoad() {
         long[] array = new long[L_SPECIES.length()];
         longVector.intoArray(array, 0, longIndices, 0);
         LongVector res = LongVector.fromArray(L_SPECIES, array, 0);
-        Asserts.assertNotEquals(res, longVector);
+        Asserts.assertFalse(L_SPECIES.length() != 1 && res.equals(longVector));
     }
 
     @Test
@@ -945,7 +945,7 @@ public static void testLongVectorLoadGatherStoreScatterDuplicateIndicesVector()
         long[] res = new long[L_SPECIES.length()];
         longVector.intoArray(res, 0, duplicateLongIndices, 0);
         LongVector res2 = LongVector.fromArray(L_SPECIES, res, 0, duplicateLongIndices, 0);
-        Asserts.assertNotEquals(res2, longVector);
+        Asserts.assertFalse(L_SPECIES.length() != 1 && res2.equals(longVector));
     }
 
     @Test
@@ -963,7 +963,7 @@ public static void testStoreLoadLongVectorDifferentSpeciesVector() {
         long[] res = new long[L_SPECIES.length()];
         longVector.intoArray(res, 0);
         LongVector res2 = LongVector.fromArray(LongVector.SPECIES_64, res, 0);
-        Asserts.assertNotEquals(res2, longVector);
+        Asserts.assertFalse(L_SPECIES.length() != 1 && res2.equals(longVector));
     }
 
 
@@ -1041,7 +1041,7 @@ public static void testOneDoubleVectorStoreLoadGather() {
         double[] array = new double[D_SPECIES.length()];
         doubleVector.intoArray(array, 0);
         DoubleVector res = DoubleVector.fromArray(D_SPECIES, array, 0, doubleIndices, 0);
-        Asserts.assertNotEquals(res, doubleVector);
+        Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(doubleVector));
     }
 
     @Test
@@ -1050,7 +1050,7 @@ public static void testOneDoubleVectorStoreScatterLoad() {
         double[] array = new double[D_SPECIES.length()];
         doubleVector.intoArray(array, 0, doubleIndices, 0);
         DoubleVector res = DoubleVector.fromArray(D_SPECIES, array, 0);
-        Asserts.assertNotEquals(res, doubleVector);
+        Asserts.assertFalse(D_SPECIES.length() != 1 && res.equals(doubleVector));
     }
 
     @Test
@@ -1077,7 +1077,7 @@ public static void testDoubleVectorLoadGatherStoreScatterDuplicateIndicesVector(
         double[] res = new double[D_SPECIES.length()];
         doubleVector.intoArray(res, 0, duplicateDoubleIndices, 0);
         DoubleVector res2 = DoubleVector.fromArray(D_SPECIES, res, 0, duplicateDoubleIndices, 0);
-        Asserts.assertNotEquals(res2, doubleVector);
+        Asserts.assertFalse(D_SPECIES.length() != 1 && res2.equals(doubleVector));
     }
 
     @Test
@@ -1095,7 +1095,7 @@ public static void testStoreLoadDoubleVectorDifferentSpeciesVector() {
         double[] res = new double[D_SPECIES.length()];
         doubleVector.intoArray(res, 0);
         DoubleVector res2 = DoubleVector.fromArray(DoubleVector.SPECIES_64, res, 0);
-        Asserts.assertNotEquals(res2, doubleVector);
+        Asserts.assertFalse(D_SPECIES.length() != 1 && res2.equals(doubleVector));
     }
 
 
@@ -1175,7 +1175,7 @@ public static void testOneLongVectorLoadGatherStore() {
         long[] res = new long[L_SPECIES.length()];
         LongVector vector = LongVector.fromArray(L_SPECIES, longArray, 0, longIndices, 0);
         vector.intoArray(res, 0);
-        Asserts.assertFalse(Arrays.equals(res, longArray));
+        Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, longArray));
     }
 
     @Test
@@ -1184,7 +1184,7 @@ public static void testOneLongVectorLoadStoreScatter() {
         long[] res = new long[L_SPECIES.length()];
         LongVector vector = LongVector.fromArray(L_SPECIES, longArray, 0);
         vector.intoArray(res, 0, longIndices, 0);
-        Asserts.assertFalse(Arrays.equals(res, longArray));
+        Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, longArray));
     }
 
     @Test
@@ -1211,7 +1211,7 @@ public static void testLongVectorStoreScatterLoadGatherDuplicateIndicesVector()
         long[] res = new long[L_SPECIES.length()];
         LongVector vector = LongVector.fromArray(L_SPECIES, longArray, 0, duplicateLongIndices, 0);
         vector.intoArray(res, 0, duplicateLongIndices, 0);
-        Asserts.assertFalse(Arrays.equals(res, longArray));
+        Asserts.assertFalse(L_SPECIES.length() != 1 && Arrays.equals(res, longArray));
     }
 
     @Test
@@ -1289,7 +1289,7 @@ public static void testOneDoubleVectorLoadGatherStore() {
         double[] res = new double[D_SPECIES.length()];
         DoubleVector vector = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, doubleIndices, 0);
         vector.intoArray(res, 0);
-        Asserts.assertFalse(Arrays.equals(res, doubleArray));
+        Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, doubleArray));
     }
 
     @Test
@@ -1298,7 +1298,7 @@ public static void testOneDoubleVectorLoadStoreScatter() {
         double[] res = new double[D_SPECIES.length()];
         DoubleVector vector = DoubleVector.fromArray(D_SPECIES, doubleArray, 0);
         vector.intoArray(res, 0, doubleIndices, 0);
-        Asserts.assertFalse(Arrays.equals(res, doubleArray));
+        Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, doubleArray));
     }
 
     @Test
@@ -1325,7 +1325,7 @@ public static void testDoubleVectorStoreScatterLoadGatherDuplicateIndicesVector(
         double[] res = new double[D_SPECIES.length()];
         DoubleVector vector = DoubleVector.fromArray(D_SPECIES, doubleArray, 0, duplicateDoubleIndices, 0);
         vector.intoArray(res, 0, duplicateDoubleIndices, 0);
-        Asserts.assertFalse(Arrays.equals(res, doubleArray));
+        Asserts.assertFalse(D_SPECIES.length() != 1 && Arrays.equals(res, doubleArray));
     }
 
     @Test
@@ -1398,7 +1398,7 @@ public static void testFloatVectorLoadMaskedStoreVector() {
     public static void main(String[] args) {
         TestFramework testFramework = new TestFramework();
         testFramework.setDefaultWarmup(10000)
-                     .addFlags("--add-modules=jdk.incubator.vector", "-XX:+IncrementalInlineForceCleanup")
+                     .addFlags("--add-modules=jdk.incubator.vector", "-XX:+IgnoreUnrecognizedVMOptions", "-XX:+IncrementalInlineForceCleanup")
                      .start();
     }
 }
diff --git a/test/hotspot/jtreg/compiler/vectorapi/reshape/TestVectorCastRVV.java b/test/hotspot/jtreg/compiler/vectorapi/reshape/TestVectorCastRVV.java
index ebcd4a727f0..b8bcf73b403 100644
--- a/test/hotspot/jtreg/compiler/vectorapi/reshape/TestVectorCastRVV.java
+++ b/test/hotspot/jtreg/compiler/vectorapi/reshape/TestVectorCastRVV.java
@@ -34,7 +34,7 @@
  * @modules jdk.incubator.vector
  * @modules java.base/jdk.internal.misc
  * @summary Test that vector cast intrinsics work as intended on riscv (rvv).
- * @requires os.arch == "riscv64" & vm.cpu.features ~= ".*v,.*"
+ * @requires os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*"
  * @library /test/lib /
  * @run main/timeout=300 compiler.vectorapi.reshape.TestVectorCastRVV
  */
diff --git a/test/hotspot/jtreg/compiler/vectorization/TestFloat16VectorConvChain.java b/test/hotspot/jtreg/compiler/vectorization/TestFloat16VectorConvChain.java
new file mode 100644
index 00000000000..6b090c965bb
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/vectorization/TestFloat16VectorConvChain.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2024, 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
+* @summary Test Float16 vector conversion chain.
+* @requires vm.compiler2.enabled
+* @library /test/lib /
+* @run driver compiler.vectorization.TestFloat16VectorConvChain
+*/
+
+package compiler.vectorization;
+
+import compiler.lib.ir_framework.*;
+import java.util.Random;
+import java.util.Arrays;
+
+
+public class TestFloat16VectorConvChain {
+
+    @Test
+    @IR(counts = {IRNode.VECTOR_CAST_HF2F, IRNode.VECTOR_SIZE_ANY, ">= 1", IRNode.VECTOR_CAST_F2HF, IRNode.VECTOR_SIZE_ANY, " >= 1"})
+    public static void test(short [] res, short [] src1, short [] src2) {
+        for (int i = 0; i < res.length; i++) {
+            res[i] = (short)Float.float16ToFloat(Float.floatToFloat16(Float.float16ToFloat(src1[i]) + Float.float16ToFloat(src2[i])));
+        }
+    }
+
+    @Run(test = {"test"})
+    @Warmup(1000)
+    public static void micro() {
+        short [] res = new short[1024];
+        short [] src1 = new short[1024];
+        short [] src2 = new short[1024];
+        Arrays.fill(src1, (short)Float.floatToFloat16(1.0f));
+        Arrays.fill(src2, (short)Float.floatToFloat16(2.0f));
+        for (int i = 0; i < 1000; i++) {
+            test(res, src1, src2);
+        }
+    }
+
+    public static void main(String [] args) {
+        TestFramework.run(TestFloat16VectorConvChain.class);
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/vectorization/TestOffsetSorting.java b/test/hotspot/jtreg/compiler/vectorization/TestOffsetSorting.java
new file mode 100644
index 00000000000..a1b86293a18
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/vectorization/TestOffsetSorting.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2024, 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 8334228
+ * @summary Test sorting of VPointer by offset, when subtraction of two offsets can overflow.
+ * @run main/othervm -XX:CompileCommand=compileonly,compiler.vectorization.TestOffsetSorting::test -Xcomp compiler.vectorization.TestOffsetSorting
+ * @run main compiler.vectorization.TestOffsetSorting
+ */
+
+package compiler.vectorization;
+
+public class TestOffsetSorting {
+    static int RANGE = 10_000;
+
+    public static void main(String[] args) {
+        int[] a = new int[RANGE];
+        for (int i = 0; i < 10_000; i++) {
+            try {
+                test(a, 0);
+                throw new RuntimeException("test should go out-of-bounds");
+            } catch (ArrayIndexOutOfBoundsException e) {
+            }
+        }
+    }
+
+    static void test(int[] a, int invar) {
+        int large = (1 << 28) + (1 << 20);
+        for (int i = 0; i < 1_000; i++) {
+            a[i + invar - large] = 42;
+            a[i + invar + large] = 42;
+        }
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java b/test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java
index 66943d68a67..ee4e613dbbb 100644
--- a/test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java
+++ b/test/hotspot/jtreg/compiler/vectorization/TestSignumVector.java
@@ -28,7 +28,7 @@
  *          and riscv64 (vector)
  * @requires vm.compiler2.enabled
  * @requires (os.simpleArch == "x64" & vm.cpu.features ~= ".*avx.*") | os.arch == "aarch64" |
- *           (os.arch == "riscv64" & vm.cpu.features ~= ".*v,.*")
+ *           (os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*")
  * @library /test/lib /
  * @run driver compiler.vectorization.TestSignumVector
  */
diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/ArrayShiftOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/ArrayShiftOpTest.java
index c4f601f42c8..ec1e3f998ca 100644
--- a/test/hotspot/jtreg/compiler/vectorization/runner/ArrayShiftOpTest.java
+++ b/test/hotspot/jtreg/compiler/vectorization/runner/ArrayShiftOpTest.java
@@ -153,10 +153,7 @@ public long[] longExplicitRotateWithPopulateIndex2() {
 
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VI, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VI, ">0"})
     public int[] intShiftLargeDistConstant() {
         int[] res = new int[SIZE];
@@ -167,10 +164,7 @@ public int[] intShiftLargeDistConstant() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VI, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VI, ">0"})
     public int[] intShiftLargeDistInvariant() {
         int[] res = new int[SIZE];
@@ -181,10 +175,7 @@ public int[] intShiftLargeDistInvariant() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VS, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VS, ">0"})
     public short[] shortShiftLargeDistConstant() {
         short[] res = new short[SIZE];
@@ -195,10 +186,7 @@ public short[] shortShiftLargeDistConstant() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VS, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VS, ">0"})
     public short[] shortShiftLargeDistInvariant() {
         short[] res = new short[SIZE];
@@ -209,10 +197,7 @@ public short[] shortShiftLargeDistInvariant() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.LSHIFT_VL, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.LSHIFT_VL, ">0"})
     public long[] longShiftLargeDistConstant() {
         long[] res = new long[SIZE];
@@ -223,10 +208,7 @@ public long[] longShiftLargeDistConstant() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.URSHIFT_VL, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.URSHIFT_VL, ">0"})
     public long[] longShiftLargeDistInvariant() {
         long[] res = new long[SIZE];
@@ -259,10 +241,7 @@ public short[] loopIndexShiftDistance() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VS, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VS, ">0"})
     public short[] vectorUnsignedShiftRight() {
         short[] res = new short[SIZE];
diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicByteOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicByteOpTest.java
index f080e29d1c3..60a6d78a7d4 100644
--- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicByteOpTest.java
+++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicByteOpTest.java
@@ -189,10 +189,7 @@ public byte[] vectorXor() {
 
     // ---------------- Shift ----------------
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true"},
-        counts = {IRNode.LSHIFT_VB, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true", "rvv", "true"},
         counts = {IRNode.LSHIFT_VB, ">0"})
     public byte[] vectorShiftLeft() {
         byte[] res = new byte[SIZE];
@@ -203,10 +200,7 @@ public byte[] vectorShiftLeft() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true"},
-        counts = {IRNode.RSHIFT_VB, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VB, ">0"})
     public byte[] vectorSignedShiftRight() {
         byte[] res = new byte[SIZE];
@@ -217,10 +211,7 @@ public byte[] vectorSignedShiftRight() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true"},
-        counts = {IRNode.RSHIFT_VB, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse4.1", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VB, ">0"})
     public byte[] vectorUnsignedShiftRight() {
         byte[] res = new byte[SIZE];
diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicCharOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicCharOpTest.java
index 9fa53609ea2..8c20b879d59 100644
--- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicCharOpTest.java
+++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicCharOpTest.java
@@ -191,10 +191,7 @@ public char[] vectorXor() {
 
     // ---------------- Shift ----------------
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.LSHIFT_VC, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.LSHIFT_VC, ">0"})
     public char[] vectorShiftLeft() {
         char[] res = new char[SIZE];
@@ -205,10 +202,7 @@ public char[] vectorShiftLeft() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.URSHIFT_VC, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.URSHIFT_VC, ">0"})
     public char[] vectorSignedShiftRight() {
         char[] res = new char[SIZE];
@@ -219,10 +213,7 @@ public char[] vectorSignedShiftRight() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.URSHIFT_VC, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.URSHIFT_VC, ">0"})
     public char[] vectorUnsignedShiftRight() {
         char[] res = new char[SIZE];
diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicIntOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicIntOpTest.java
index 5774e3b63b2..b3d7c215867 100644
--- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicIntOpTest.java
+++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicIntOpTest.java
@@ -198,10 +198,7 @@ public int[] vectorXor() {
 
     // ---------------- Shift ----------------
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.LSHIFT_VI, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.LSHIFT_VI, ">0"})
     public int[] vectorShiftLeft() {
         int[] res = new int[SIZE];
@@ -212,10 +209,7 @@ public int[] vectorShiftLeft() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VI, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VI, ">0"})
     public int[] vectorSignedShiftRight() {
         int[] res = new int[SIZE];
@@ -226,10 +220,7 @@ public int[] vectorSignedShiftRight() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.URSHIFT_VI, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.URSHIFT_VI, ">0"})
     public int[] vectorUnsignedShiftRight() {
         int[] res = new int[SIZE];
diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicLongOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicLongOpTest.java
index c6ecac096f9..2f1bfcdf1df 100644
--- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicLongOpTest.java
+++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicLongOpTest.java
@@ -190,10 +190,7 @@ public long[] vectorXor() {
 
     // ---------------- Shift ----------------
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.LSHIFT_VL, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.LSHIFT_VL, ">0"})
     public long[] vectorShiftLeft() {
         long[] res = new long[SIZE];
@@ -204,10 +201,7 @@ public long[] vectorShiftLeft() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VL, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VL, ">0"})
     public long[] vectorSignedShiftRight() {
         long[] res = new long[SIZE];
@@ -218,10 +212,7 @@ public long[] vectorSignedShiftRight() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.URSHIFT_VL, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.URSHIFT_VL, ">0"})
     public long[] vectorUnsignedShiftRight() {
         long[] res = new long[SIZE];
diff --git a/test/hotspot/jtreg/compiler/vectorization/runner/BasicShortOpTest.java b/test/hotspot/jtreg/compiler/vectorization/runner/BasicShortOpTest.java
index bf5516ddaf8..50b68cd2e48 100644
--- a/test/hotspot/jtreg/compiler/vectorization/runner/BasicShortOpTest.java
+++ b/test/hotspot/jtreg/compiler/vectorization/runner/BasicShortOpTest.java
@@ -189,10 +189,7 @@ public short[] vectorXor() {
 
     // ---------------- Shift ----------------
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.LSHIFT_VS, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.LSHIFT_VS, ">0"})
     public short[] vectorShiftLeft() {
         short[] res = new short[SIZE];
@@ -203,10 +200,7 @@ public short[] vectorShiftLeft() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VS, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VS, ">0"})
     public short[] vectorSignedShiftRight() {
         short[] res = new short[SIZE];
@@ -242,10 +236,7 @@ public short[] vectorMax() {
     }
 
     @Test
-    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true"},
-        counts = {IRNode.RSHIFT_VS, ">0"})
-    @IR(applyIfPlatform = {"riscv64", "true"},
-        applyIfCPUFeature = {"v", "true"},
+    @IR(applyIfCPUFeatureOr = {"asimd", "true", "sse2", "true", "rvv", "true"},
         counts = {IRNode.RSHIFT_VS, ">0"})
     public short[] vectorUnsignedShiftRight() {
         short[] res = new short[SIZE];
diff --git a/test/hotspot/jtreg/containers/cgroup/PlainRead.java b/test/hotspot/jtreg/containers/cgroup/PlainRead.java
deleted file mode 100644
index 21eccd79835..00000000000
--- a/test/hotspot/jtreg/containers/cgroup/PlainRead.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2017, 2023, 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 PlainRead
- * @key cgroups
- * @requires os.family == "linux"
- * @requires vm.flagless
- * @library /testlibrary /test/lib
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI PlainRead
- */
-
-import jdk.test.lib.process.ProcessTools;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.Platform;
-import jdk.test.whitebox.WhiteBox;
-
-public class PlainRead {
-
-    static public void match(OutputAnalyzer oa, String what, String value) {
-       oa.shouldMatch("^.*" + what + " *" + value + ".*$");
-    }
-
-    static public void noMatch(OutputAnalyzer oa, String what, String value) {
-       oa.shouldNotMatch("^.*" + what + " *" + value + ".*$");
-    }
-
-    static final String good_value = "(\\d+|-1|-2|Unlimited)";
-    static final String bad_value = "(failed)";
-
-    static final String[] variables = {"Memory Limit is:", "CPU Quota is:", "CPU Period is:", "active_processor_count:"};
-
-    static public void isContainer(OutputAnalyzer oa) {
-        for (String v: variables) {
-            match(oa, v, good_value);
-        }
-        for (String v: variables) {
-            noMatch(oa, v, bad_value);
-        }
-    }
-
-    static public void isNotContainer(OutputAnalyzer oa) {
-       oa.shouldMatch("^.*Can't open /proc/self/mountinfo.*$");
-    }
-
-    public static void main(String[] args) throws Exception {
-        WhiteBox wb = WhiteBox.getWhiteBox();
-        ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-Xlog:os+container=trace", "-version");
-        OutputAnalyzer output = new OutputAnalyzer(pb.start());
-
-        if (wb.isContainerized()) {
-            System.out.println("Inside a cgroup, testing...");
-            isContainer(output);
-        }
-    }
-}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java b/test/hotspot/jtreg/containers/cgroup/TestContainerized.java
similarity index 55%
rename from test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java
rename to test/hotspot/jtreg/containers/cgroup/TestContainerized.java
index 274c3353637..52cf5451a8d 100644
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java
+++ b/test/hotspot/jtreg/containers/cgroup/TestContainerized.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,26 +21,28 @@
  * questions.
  */
 
-/**
+/*
  * @test
- * @bug 8031320
- * @summary Verify PrintPreciseRTMLockingStatistics on CPUs or OSs without
- *          rtm support and/or unsupported VM.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
+ * @bug 8261242
+ * @key cgroups
+ * @requires os.family == "linux"
  * @requires vm.flagless
- * @requires !vm.rtm.cpu & vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig
+ * @library /testlibrary /test/lib
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestContainerized
  */
 
-package compiler.rtm.cli;
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.whitebox.WhiteBox;
 
-public class TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig
-        extends TestPrintPreciseRTMLockingStatisticsBase {
+public class TestContainerized {
 
-    public static void main(String args[]) throws Throwable {
-        new TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig()
-                .runTestCases();
+    public static void main(String[] args) throws Exception {
+        WhiteBox wb = WhiteBox.getWhiteBox();
+        if (wb.isContainerized()) {
+            throw new RuntimeException("Test failed! Expected not containerized on plain Linux.");
+        }
+        System.out.println("Plain linux, no limits. Passed!");
     }
 }
diff --git a/test/hotspot/jtreg/gc/TestAlwaysPreTouchBehavior.java b/test/hotspot/jtreg/gc/TestAlwaysPreTouchBehavior.java
new file mode 100644
index 00000000000..c282c2876ea
--- /dev/null
+++ b/test/hotspot/jtreg/gc/TestAlwaysPreTouchBehavior.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2014, 2024, Alibaba Group Holding Limited. All rights reserved.
+ * Copyright (c) 2024, Red Hat Inc.
+ * 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 gc;
+
+/**
+ * @test id=ParallelCollector
+ * @summary tests AlwaysPreTouch
+ * @requires vm.gc.Parallel
+ * @requires os.maxMemory > 2G
+ * @requires os.family != "aix"
+ * @library /test/lib
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx512m -Xms512m -XX:+UseParallelGC -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior
+ */
+
+ /**
+ * @test id=SerialCollector
+ * @summary tests AlwaysPreTouch
+ * @requires vm.gc.Serial
+ * @requires os.maxMemory > 2G
+ * @requires os.family != "aix"
+ * @library /test/lib
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx512m -Xms512m -XX:+UseSerialGC -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior
+ */
+
+/**
+ * @test id=Shenandoah
+ * @summary tests AlwaysPreTouch
+ * @requires vm.gc.Shenandoah
+ * @requires os.maxMemory > 2G
+ * @requires os.family != "aix"
+ * @library /test/lib
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx512m -Xms512m -XX:+UseShenandoahGC  -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior
+ */
+
+/**
+ * @test id=G1
+ * @summary tests AlwaysPreTouch
+ * @requires vm.gc.G1
+ * @requires os.maxMemory > 2G
+ * @requires os.family != "aix"
+ * @library /test/lib
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx512m -Xms512m -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior
+ */
+
+/**
+ * @test id=ZGenerational
+ * @summary tests AlwaysPreTouch
+ * @requires vm.gc.ZGenerational
+ * @requires os.maxMemory > 2G
+ * @requires os.family != "aix"
+ * @library /test/lib
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+UseZGC -XX:+ZGenerational -Xmx512m -Xms512m -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior
+ */
+
+/**
+ * @test id=ZSinglegen
+ * @summary tests AlwaysPreTouch
+ * @requires vm.gc.ZSinglegen
+ * @requires os.maxMemory > 2G
+ * @requires os.family != "aix"
+ * @library /test/lib
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+UseZGC -XX:-ZGenerational -Xmx512m -Xms512m -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior
+ */
+
+/**
+ * @test id=Epsilon
+ * @summary tests AlwaysPreTouch
+ * @requires vm.gc.Epsilon
+ * @requires os.maxMemory > 2G
+ * @requires os.family != "aix"
+ * @library /test/lib
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xmx512m -Xms512m -XX:+AlwaysPreTouch gc.TestAlwaysPreTouchBehavior
+ */
+
+
+import jdk.test.lib.Asserts;
+
+import jdk.test.whitebox.WhiteBox;
+
+public class TestAlwaysPreTouchBehavior {
+
+    public static void main(String [] args) {
+    long rss = WhiteBox.getWhiteBox().rss();
+    System.out.println("RSS: " + rss);
+    if (rss == 0) {
+        System.out.println("cannot get RSS, just skip");
+        return; // Did not get available RSS, just ignore this test.
+    }
+    Runtime runtime = Runtime.getRuntime();
+    long committedMemory = runtime.totalMemory();
+    Asserts.assertGreaterThan(rss, committedMemory, "RSS of this process(" + rss + "b) should be bigger than or equal to committed heap mem(" + committedMemory + "b)");
+   }
+}
+
diff --git a/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java b/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java
index fd784861663..7194e97c768 100644
--- a/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java
+++ b/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java
@@ -59,15 +59,10 @@ public static void checkMinInitialMaxHeapFlags(String gcflag) throws Exception {
   }
 
   public static void checkMinInitialErgonomics(String gcflag) throws Exception {
-    // heap sizing ergonomics use the value NewSize + OldSize as default values
-    // for ergonomics calculation. Retrieve these values.
-    long[] values = new long[2];
-    getNewOldSize(gcflag, values);
-
     // we check cases with values smaller and larger than this default value.
-    long newPlusOldSize = values[0] + values[1];
-    long smallValue = newPlusOldSize / 2;
-    long largeValue = newPlusOldSize * 2;
+    long initialHeapSize = getInitialHeapSize(gcflag);
+    long smallValue = initialHeapSize / 2;
+    long largeValue = initialHeapSize * 2;
     long maxHeapSize = largeValue + (2 * 1024 * 1024);
 
     // -Xms is not set
@@ -114,14 +109,13 @@ private static long align_up(long value, long alignment) {
     return (value + alignmentMinusOne) & ~alignmentMinusOne;
   }
 
-  private static void getNewOldSize(String gcflag, long[] values) throws Exception {
+  private static long getInitialHeapSize(String gcflag) throws Exception {
     OutputAnalyzer output = GCArguments.executeTestJava(gcflag,
       "-XX:+PrintFlagsFinal", "-version");
     output.shouldHaveExitValue(0);
 
     String stdout = output.getStdout();
-    values[0] = getFlagValue(" NewSize", stdout);
-    values[1] = getFlagValue(" OldSize", stdout);
+    return getFlagValue(" InitialHeapSize", stdout);
   }
 
   public static void checkGenMaxHeapErgo(String gcflag) throws Exception {
diff --git a/test/hotspot/jtreg/gc/arguments/TestMaxNewSize.java b/test/hotspot/jtreg/gc/arguments/TestMaxNewSize.java
index 3f741ab1440..d967a4f609f 100644
--- a/test/hotspot/jtreg/gc/arguments/TestMaxNewSize.java
+++ b/test/hotspot/jtreg/gc/arguments/TestMaxNewSize.java
@@ -29,7 +29,7 @@
  * @summary Make sure that MaxNewSize always has a useful value after argument
  * processing.
  * @key flag-sensitive
- * @requires vm.gc.Serial & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null & vm.opt.OldSize == null
+ * @requires vm.gc.Serial & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null
  * @library /test/lib
  * @library /
  * @modules java.base/jdk.internal.misc
@@ -44,7 +44,7 @@
  * @summary Make sure that MaxNewSize always has a useful value after argument
  * processing.
  * @key flag-sensitive
- * @requires vm.gc.Parallel & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null & vm.opt.OldSize == null
+ * @requires vm.gc.Parallel & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null
  * @library /test/lib
  * @library /
  * @modules java.base/jdk.internal.misc
@@ -59,7 +59,7 @@
  * @summary Make sure that MaxNewSize always has a useful value after argument
  * processing.
  * @key flag-sensitive
- * @requires vm.gc.G1 & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null & vm.opt.OldSize == null
+ * @requires vm.gc.G1 & vm.opt.MaxNewSize == null & vm.opt.NewRatio == null & vm.opt.NewSize == null
  * @library /test/lib
  * @library /
  * @modules java.base/jdk.internal.misc
@@ -116,7 +116,6 @@ public static void main(String args[]) throws Exception {
     checkMaxNewSize(new String[] { gcName, "-Xmx128M" }, 128 * M);
     checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:NewRatio=5" }, 128 * M);
     checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:NewSize=32M" }, 128 * M);
-    checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:OldSize=96M" }, 128 * M);
     checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:MaxNewSize=32M" }, 32 * M);
     checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:NewSize=32M", "-XX:MaxNewSize=32M" }, 32 * M);
     checkMaxNewSize(new String[] { gcName, "-Xmx128M", "-XX:NewRatio=6", "-XX:MaxNewSize=32M" }, 32 * M);
diff --git a/test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java b/test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java
index 6b03401a563..6912499e53f 100644
--- a/test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java
+++ b/test/hotspot/jtreg/gc/arguments/TestMinInitialErgonomics.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@
  * @test TestMinInitialErgonomics
  * @bug 8006088
  * @requires vm.gc.Parallel
+ * @requires vm.compMode != "Xcomp"
  * @summary Test Parallel GC ergonomics decisions related to minimum and initial heap size.
  * @library /test/lib
  * @library /
diff --git a/test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java b/test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java
index a84ebc5fe5c..63c51c25149 100644
--- a/test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java
+++ b/test/hotspot/jtreg/gc/arguments/TestParallelGCErgo.java
@@ -27,6 +27,7 @@
  * @test TestParallelGCErgo
  * @bug 8272364
  * @requires vm.gc.Parallel
+ * @requires vm.opt.UseLargePages == null | !vm.opt.UseLargePages
  * @summary Verify ParallelGC minimum young and old ergonomics are setup correctly
  * @modules java.base/jdk.internal.misc
  * @library /test/lib
diff --git a/test/hotspot/jtreg/gc/g1/TestInvalidateArrayCopy.java b/test/hotspot/jtreg/gc/g1/TestInvalidateArrayCopy.java
index 2e5b3c0a363..84140ae1679 100644
--- a/test/hotspot/jtreg/gc/g1/TestInvalidateArrayCopy.java
+++ b/test/hotspot/jtreg/gc/g1/TestInvalidateArrayCopy.java
@@ -29,7 +29,7 @@
  * @summary Check that benign (0-sized) out of heap bounds card table invalidations do not assert.
  * @requires vm.gc.G1
  * @requires vm.debug
- * @run main/othervm -XX:NewSize=1M -Xlog:gc -XX:MaxNewSize=1m -XX:-UseTLAB -XX:OldSize=63M -XX:MaxHeapSize=64M gc.g1.TestInvalidateArrayCopy
+ * @run main/othervm -XX:NewSize=1M -Xlog:gc -XX:MaxNewSize=1m -XX:-UseTLAB -XX:MaxHeapSize=64M gc.g1.TestInvalidateArrayCopy
  */
 
 // The test allocates zero-sized arrays of j.l.O and tries to arraycopy random data into it so
diff --git a/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java b/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java
index 0ae28ab9d55..b9192c45fbf 100644
--- a/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java
+++ b/test/hotspot/jtreg/gc/g1/plab/lib/PLABUtils.java
@@ -40,7 +40,6 @@ public class PLABUtils {
     private final static String[] GC_TUNE_OPTIONS = {
         "-XX:+UseG1GC",
         "-XX:G1HeapRegionSize=1m",
-        "-XX:OldSize=64m",
         "-XX:-UseAdaptiveSizePolicy",
         "-XX:MaxTenuringThreshold=1",
         "-XX:-UseTLAB",
diff --git a/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java b/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java
deleted file mode 100644
index 12c03661e0e..00000000000
--- a/test/hotspot/jtreg/gc/parallel/TestAlwaysPreTouchBehavior.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2014, 2024, Alibaba Group Holding Limited. 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 gc.parallel;
-
-/**
- * @test TestAlwaysPreTouchBehavior
- * @summary Tests AlwaysPreTouch Bahavior, pages of java heap should be pretouched with AlwaysPreTouch enabled. This test reads RSS of test process, which should be bigger than heap size(1g) with AlwaysPreTouch enabled.
- * @requires vm.gc.Parallel
- * @requires vm.debug != true
- * @requires os.family == "linux"
- * @requires os.maxMemory > 2G
- * @library /test/lib
- * @run main/othervm -Xmx1g -Xms1g -XX:+UseParallelGC -XX:+AlwaysPreTouch gc.parallel.TestAlwaysPreTouchBehavior
- */
-import java.lang.management.ManagementFactory;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.io.IOException;
-import java.util.*;
-import javax.management.*;
-import java.lang.management.*;
-import jdk.test.lib.Utils;
-import jdk.test.lib.Asserts;
-import java.lang.management.*;
-import java.util.stream.*;
-import java.io.*;
-
-public class TestAlwaysPreTouchBehavior {
-    public static long getProcessRssInKb() throws IOException {
-        String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
-        // Read RSS from /proc/$pid/status. Only available on Linux.
-        String processStatusFile = "/proc/" + pid + "/status";
-        BufferedReader reader = new BufferedReader(new FileReader(processStatusFile));
-        String line = null;
-        while ((line = reader.readLine()) != null) {
-            if (line.startsWith("VmRSS:")) {
-                break;
-            }
-        }
-        reader.close();
-        return Long.valueOf(line.split("\\s+")[1].trim());
-    }
-    public static void main(String [] args) {
-    long rss = 0;
-    Runtime runtime = Runtime.getRuntime();
-    long committedMemory = runtime.totalMemory() / 1024; // in kb
-    try {
-        rss = getProcessRssInKb();
-    } catch (Exception e) {
-        System.out.println("cannot get RSS, just skip");
-        return; // Did not get avaiable RSS, just ignore this test
-    }
-    Asserts.assertGreaterThanOrEqual(rss, committedMemory, "RSS of this process(" + rss + "kb) should be bigger than or equal to committed heap mem(" + committedMemory + "kb)");
-   }
-}
-
diff --git a/test/hotspot/jtreg/gc/shenandoah/compiler/TestBarrierOnLoopBackedge.java b/test/hotspot/jtreg/gc/shenandoah/compiler/TestBarrierOnLoopBackedge.java
new file mode 100644
index 00000000000..a72c7d69d7f
--- /dev/null
+++ b/test/hotspot/jtreg/gc/shenandoah/compiler/TestBarrierOnLoopBackedge.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc. 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 8328107
+ * @summary Barrier expanded on backedge break loop verification code
+ * @requires vm.gc.Shenandoah
+ *
+ * @run main/othervm -XX:+UseShenandoahGC -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestBarrierOnLoopBackedge::notInlined
+ *                   -XX:+IgnoreUnrecognizedVMOptions -XX:+VerifyLoopOptimizations TestBarrierOnLoopBackedge
+ * @run main/othervm -XX:+UseShenandoahGC -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestBarrierOnLoopBackedge::notInlined
+ *                   -XX:+IgnoreUnrecognizedVMOptions -XX:+VerifyLoopOptimizations -XX:-UseCountedLoopSafepoints TestBarrierOnLoopBackedge
+ */
+
+public class TestBarrierOnLoopBackedge {
+    private static A field = new A();
+    private static final A finalField = new A();
+    private static float floatField;
+
+    public static void main(String[] args) {
+        A[] array = new A[1];
+        array[0] = finalField;
+        for (int i = 0; i < 20_000; i++) {
+            test1();
+            test2();
+        }
+    }
+
+    private static void test1() {
+        floatField = field.f;
+        for (int i = 0; i < 1000; i++) {
+            notInlined(field); // load barrier split thru phi and ends up on back edge
+            if (i % 2 == 0) {
+                field = finalField;
+            }
+        }
+    }
+
+    private static void test2() {
+        A[] array = new A[1];
+        notInlined(array);
+        int i = 0;
+        A a = array[0];
+        for (;;) {
+            synchronized (new Object()) {
+            }
+            notInlined(a);
+            i++;
+            if (i >= 1000) {
+                break;
+            }
+            a = array[0]; // load barrier pinned on backedge
+        }
+    }
+
+    private static void notInlined(Object a) {
+
+    }
+
+    private static class A {
+        float f;
+    }
+}
diff --git a/test/hotspot/jtreg/gtest/MetaspaceGtests.java b/test/hotspot/jtreg/gtest/MetaspaceGtests.java
index 4710c591029..f1f811d6a71 100644
--- a/test/hotspot/jtreg/gtest/MetaspaceGtests.java
+++ b/test/hotspot/jtreg/gtest/MetaspaceGtests.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -25,8 +25,8 @@
 
 /*
  * Note: This runs the metaspace-related parts of gtest in configurations which
- *  are not tested explicitly in the standard gtests.
- *
+ *  are not tested explicitly in the standard gtest. Hence, there is no "default-ndebug"
+ *  since that would be equivalent to the normal gtest for release builds.
  */
 
 /* @test id=default-debug
@@ -40,17 +40,7 @@
  * @run main/native GTestWrapper --gtest_filter=metaspace* -XX:+UnlockDiagnosticVMOptions -XX:VerifyMetaspaceInterval=1
  */
 
-/* @test id=balanced-with-guards
- * @summary Run metaspace-related gtests with allocation guards enabled
- * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.xml
- * @requires vm.debug
- * @requires vm.flagless
- * @run main/native GTestWrapper --gtest_filter=metaspace* -XX:VerifyMetaspaceInterval=1 -XX:+MetaspaceGuardAllocations
- */
-
-/* @test id=balanced-no-ccs
+/* @test id=no-ccs
  * @summary Run metaspace-related gtests with compressed class pointers off
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
diff --git a/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java b/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java
index 43a9985d835..180dc539795 100644
--- a/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java
+++ b/test/hotspot/jtreg/runtime/ClassInitErrors/TestStackOverflowDuringInit.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,16 +23,15 @@
 
 /**
  * @test
- * @bug 8309034
+ * @bug 8309034 8334545
  * @summary Test that when saving a class initialization failure caused by
  *          a StackOverflowError, that we record the SOE as the underlying
  *          cause, even if we can't create the ExceptionInInitializerError
- * @requires os.simpleArch == "x64"
- * @comment The reproducer only fails in the desired way on x64.
- * @requires vm.flagless
  * @comment This test could easily be perturbed so don't allow flag settings.
- *
- * @run main/othervm -Xss160K -Xint TestStackOverflowDuringInit
+ * @requires vm.flagless
+ * @comment Run with the smallest stack possible to limit the execution time.
+ *          This is the smallest stack that is supported by all platforms.
+ * @run main/othervm -Xss384K -Xint TestStackOverflowDuringInit
  */
 
 import java.io.ByteArrayOutputStream;
@@ -51,11 +50,33 @@ public class TestStackOverflowDuringInit {
     // of another class, which is where we will fail to create the EIIE.
     // Even then this is non-trivial, only the use of Long.valueOf from
     // the original reproducer seems to trigger SOE in just the right places.
+    // Later changes to the JDK meant that LongCache was initialized before
+    // the test even started under jtreg so we define local versions.
+
+    static class LongCache {
+        // Must have a static initializer
+        static {
+            System.out.println("LongCache is initializing");
+        }
+        static java.lang.Long valueOf(long l) {
+            return Long.valueOf(l);
+        }
+    }
+
+    static class MyLong {
+        static java.lang.Long valueOf(long l) {
+            if (l > -128 && l < 127) {
+                return LongCache.valueOf(l);
+            } else {
+                return Long.valueOf(l);
+            }
+        }
+    }
 
     static void recurse() {
         try {
-            // This will initialize Long but not touch LongCache.
-            Long.valueOf(1024L);
+            // This will initialize MyLong but not touch LongCache.
+            MyLong.valueOf(1024L);
             recurse();
         } finally {
             // This will require initializing LongCache, which will
@@ -63,14 +84,20 @@ static void recurse() {
             // will be marked erroneous. As we unwind and again execute this
             // we will throw NoClassDefFoundError due to the erroneous
             // state of LongCache.
-            Long.valueOf(0);
+            MyLong.valueOf(0);
         }
     }
 
     public static void main(String[] args) throws Exception {
-        String expected = "java.lang.NoClassDefFoundError: Could not initialize class java.lang.Long$LongCache";
+        String expected = "java.lang.NoClassDefFoundError: Could not initialize class TestStackOverflowDuringInit$LongCache";
         String cause = "Caused by: java.lang.StackOverflowError";
 
+        // Pre-load, but not initialize, LongCache, else we will
+        // hit SOE during class loading.
+        System.out.println("Pre-loading ...");
+        Class<?> c = Class.forName("TestStackOverflowDuringInit$LongCache",
+                                   false,
+                                   TestStackOverflowDuringInit.class.getClassLoader());
         try {
             recurse();
         } catch (Throwable ex) {
diff --git a/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java
index 12bced849d9..033b74f7eb1 100644
--- a/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java
+++ b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java
@@ -240,7 +240,6 @@ public static void main(String[] args) throws Exception {
         excludeTestMaxRange("MaxHeapSize");
         excludeTestMaxRange("MaxRAM");
         excludeTestMaxRange("NewSize");
-        excludeTestMaxRange("OldSize");
         excludeTestMaxRange("ParallelGCThreads");
         excludeTestMaxRange("TLABSize");
 
diff --git a/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java b/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java
index 7904b01495f..4e6252ae205 100644
--- a/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java
+++ b/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java
@@ -58,6 +58,7 @@ public class VMDeprecatedOptions {
             // deprecated non-alias flags:
             {"AllowRedefinitionToAddDeleteMethods", "true"},
             {"ZGenerational", "false"},
+            {"LockingMode", "1"},
 
             // deprecated alias flags (see also aliased_jvm_flags):
             {"CreateMinidumpOnCrash", "false"}
diff --git a/test/hotspot/jtreg/runtime/CompressedOops/CompressedCPUSpecificClassSpaceReservation.java b/test/hotspot/jtreg/runtime/CompressedOops/CompressedCPUSpecificClassSpaceReservation.java
index 8a25b1eff88..f1b4c7143b4 100644
--- a/test/hotspot/jtreg/runtime/CompressedOops/CompressedCPUSpecificClassSpaceReservation.java
+++ b/test/hotspot/jtreg/runtime/CompressedOops/CompressedCPUSpecificClassSpaceReservation.java
@@ -26,6 +26,7 @@
  * @summary Test the various CPU-specific reservation schemes
  * @requires vm.bits == 64 & !vm.graal.enabled & vm.debug == true
  * @requires vm.flagless
+ * @requires vm.cds
  * @requires (os.family != "windows") & (os.family != "aix")
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
diff --git a/test/hotspot/jtreg/runtime/FieldLayout/OldLayoutCheck.java b/test/hotspot/jtreg/runtime/FieldLayout/OldLayoutCheck.java
deleted file mode 100644
index a68b0a9efaf..00000000000
--- a/test/hotspot/jtreg/runtime/FieldLayout/OldLayoutCheck.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2020, 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 8239014
- * @summary -XX:-UseEmptySlotsInSupers sometime fails to reproduce the layout of the old code
- * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.bits == "64" & vm.opt.final.UseCompressedOops == true & vm.gc != "Z"
- * @run main/othervm -XX:+UseCompressedClassPointers -XX:-UseEmptySlotsInSupers OldLayoutCheck
- */
-
-/*
- * @test
- * @requires vm.bits == "32"
- * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @run main/othervm -XX:-UseEmptySlotsInSupers OldLayoutCheck
- */
-
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Comparator;
-import jdk.internal.misc.Unsafe;
-
-import jdk.test.lib.Asserts;
-import jdk.test.lib.Platform;
-
-public class OldLayoutCheck {
-
-    static class LIClass {
-        public long l;
-        public int i;
-    }
-
-    // 32-bit VMs: @0:  8 byte header,  @8: long field, @16:  int field
-    // 64-bit VMs: @0: 12 byte header, @12:  int field, @16: long field
-    static final long INT_OFFSET  = Platform.is64bit() ? 12L : 16L;
-    static final long LONG_OFFSET = Platform.is64bit() ? 16L :  8L;
-
-    static public void main(String[] args) {
-        Unsafe unsafe = Unsafe.getUnsafe();
-        Class c = LIClass.class;
-        Field[] fields = c.getFields();
-        for (int i = 0; i < fields.length; i++) {
-            long offset = unsafe.objectFieldOffset(fields[i]);
-            if (fields[i].getType() == int.class) {
-                Asserts.assertEquals(offset, INT_OFFSET, "Misplaced int field");
-            } else if (fields[i].getType() == long.class) {
-                Asserts.assertEquals(offset, LONG_OFFSET, "Misplaced long field");
-            } else {
-                Asserts.fail("Unexpected field type");
-            }
-        }
-    }
-}
diff --git a/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java b/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java
deleted file mode 100644
index 415cd105ee9..00000000000
--- a/test/hotspot/jtreg/runtime/InvocationTests/invocationOldCHATests.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2019, 2023, 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 id=special
- * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA)
- * @requires vm.flagless
- * @library /test/lib
- * @modules java.base/jdk.internal.org.objectweb.asm
- *          java.base/jdk.internal.misc
- * @compile invokespecial/Checker.java invokespecial/ClassGenerator.java invokespecial/Generator.java
- *
- * @run driver/timeout=1800 invocationOldCHATests special
- */
-
-/*
- * @test id=virtual
- * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA)
- * @requires vm.flagless
- * @library /test/lib
- * @modules java.base/jdk.internal.org.objectweb.asm
- *          java.base/jdk.internal.misc
- * @compile invokevirtual/Checker.java invokevirtual/ClassGenerator.java invokevirtual/Generator.java
- *
- * @run driver/timeout=1800 invocationOldCHATests virtual
- */
-
-/*
- * @test id=interface
- * @summary Run invocation tests with old CHA (-XX:-UseVtableBasedCHA)
- * @requires vm.flagless
- * @library /test/lib
- * @modules java.base/jdk.internal.org.objectweb.asm
- *          java.base/jdk.internal.misc
- * @compile invokeinterface/Checker.java invokeinterface/ClassGenerator.java invokeinterface/Generator.java
- *
- * @run driver/timeout=1800 invocationOldCHATests interface
- */
-
-import jdk.test.lib.process.ProcessTools;
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.compiler.InMemoryJavaCompiler;
-
-public class invocationOldCHATests {
-
-    public static void runTest(String whichTests, String classFileVersion) throws Throwable {
-        System.out.println("\nOld CHA invocation tests, Tests: " + whichTests +
-                           ", class file version: " + classFileVersion);
-        ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-Xmx128M",
-            "-Xcomp", "-XX:+UnlockDiagnosticVMOptions", "-XX:-UseVtableBasedCHA",
-            "--add-exports", "java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED",
-            whichTests, "--classfile_version=" + classFileVersion);
-        OutputAnalyzer output = new OutputAnalyzer(pb.start());
-        try {
-            output.shouldContain("EXECUTION STATUS: PASSED");
-            output.shouldHaveExitValue(0);
-        } catch (Throwable e) {
-            System.out.println(
-                "\nNote that an entry such as 'B.m/C.m' in the failure chart means that" +
-                " the test case failed because method B.m was invoked but the test " +
-                "expected method C.m to be invoked. Similarly, a result such as 'AME/C.m'" +
-                " means that an AbstractMethodError exception was thrown but the test" +
-                " case expected method C.m to be invoked.");
-            System.out.println(
-                "\nAlso note that passing --dump to invoke*.Generator will" +
-                " dump the generated classes (for debugging purposes).\n");
-
-            throw e;
-        }
-    }
-
-    public static void main(String args[]) throws Throwable {
-        if (args.length < 1) {
-            throw new IllegalArgumentException("Should provide the test name");
-        }
-        String testName = args[0];
-
-        // Get current major class file version and test with it.
-        byte klassbuf[] = InMemoryJavaCompiler.compile("blah", "public class blah { }");
-        int major_version = klassbuf[6] << 8 | klassbuf[7];
-
-        switch (testName) {
-            case "special":
-                runTest("invokespecial.Generator", String.valueOf(major_version));
-                break;
-            case "virtual":
-                runTest("invokevirtual.Generator", String.valueOf(major_version));
-                break;
-            case "interface":
-                runTest("invokeinterface.Generator", String.valueOf(major_version));
-                break;
-            default:
-                throw new IllegalArgumentException("Unknown test name: " + testName);
-        }
-    }
-}
diff --git a/test/hotspot/jtreg/runtime/Metaspace/PrintMetaspaceDcmd.java b/test/hotspot/jtreg/runtime/Metaspace/PrintMetaspaceDcmd.java
index 56d9c2095b2..42f22309d96 100644
--- a/test/hotspot/jtreg/runtime/Metaspace/PrintMetaspaceDcmd.java
+++ b/test/hotspot/jtreg/runtime/Metaspace/PrintMetaspaceDcmd.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2018, SAP and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -36,17 +36,6 @@
  * @run main/othervm -Dwith-compressed-class-space -XX:MaxMetaspaceSize=201M -Xmx100M -XX:+UseCompressedOops -XX:+UseCompressedClassPointers PrintMetaspaceDcmd
  */
 
-/*
- * @test id=test-64bit-ccs-guarded
- * @summary Test the VM.metaspace command
- * @requires vm.bits == "64"
- * @requires vm.debug == true
- * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @run main/othervm -Dwith-compressed-class-space -XX:MaxMetaspaceSize=201M -Xmx100M -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UnlockDiagnosticVMOptions -XX:+MetaspaceGuardAllocations PrintMetaspaceDcmd
- */
-
 /*
  * @test id=test-64bit-noccs
  * @summary Test the VM.metaspace command
diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/MetaspaceTestContext.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/MetaspaceTestContext.java
index 5061c828c06..fe52317d4dd 100644
--- a/test/hotspot/jtreg/runtime/Metaspace/elastic/MetaspaceTestContext.java
+++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/MetaspaceTestContext.java
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -195,17 +195,11 @@ public void checkStatistics() {
         // - whatever we allocated
         // - deallocated blocks in fbl
         // - remains of retired chunks in fbl
-        // - overhead per allocation (padding for alignment, possibly allocation guards)
+        // - overhead per allocation (padding for alignment)
 
         // Overhead per allocation (see metaspaceArena.cpp, get_raw_allocation_word_size() )
         // Any allocation is 3 words least
         expectedMaxUsage += (numAllocated * 3);
-        if (Settings.settings().usesAllocationGuards) {
-            // Guards need space.
-            expectedMaxUsage += (numAllocated * 2);
-            // Also, they disable the fbl, so deallocated still counts as used.
-            expectedMaxUsage += deallocatedWords;
-        }
 
         // Lets add a overhead per arena. Each arena carries a free block list containing
         // deallocated/retired blocks. We do not know how much. In general, the free block list should not
diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/Settings.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/Settings.java
index c6d69f341b9..222ce44acc6 100644
--- a/test/hotspot/jtreg/runtime/Metaspace/elastic/Settings.java
+++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/Settings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2020 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -27,8 +27,6 @@
 
 public final class Settings {
 
-    public boolean usesAllocationGuards = WhiteBox.getWhiteBox().getBooleanVMFlag("MetaspaceGuardAllocations");
-
     final static long rootChunkWordSize = 2048 * 1024;
 
     static Settings theSettings;
diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocation.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocation.java
index 1ecde3f8376..10d05a867fc 100644
--- a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocation.java
+++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocation.java
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,30 +27,22 @@
  * @test id=debug
  * @bug 8251158
  * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.management
+ * @modules java.base/jdk.internal.misc java.management
  * @build jdk.test.whitebox.WhiteBox
  * @requires (vm.debug == true)
- *
  * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- *
  * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI  -XX:VerifyMetaspaceInterval=10                                        TestMetaspaceAllocation
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI  -XX:VerifyMetaspaceInterval=10  -XX:+MetaspaceGuardAllocations        TestMetaspaceAllocation
- *
  */
 
 /*
  * @test id=ndebug
  * @bug 8251158
  * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.management
+ * @modules java.base/jdk.internal.misc java.management
  * @build jdk.test.whitebox.WhiteBox
  * @requires (vm.debug == false)
- *
  * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- *
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI                                        TestMetaspaceAllocation
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI TestMetaspaceAllocation
  */
 
 public class TestMetaspaceAllocation {
diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT1.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT1.java
index 8bbab2c71e9..5676f2c4bdb 100644
--- a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT1.java
+++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT1.java
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -58,7 +58,7 @@
  */
 
 /*
- * @test id=debug-default-strict
+ * @test id=debug-default-long-manual
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
@@ -74,24 +74,6 @@
  *      TestMetaspaceAllocationMT1 10
  */
 
-/*
- * @test id=debug-guard
- * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @build jdk.test.whitebox.WhiteBox
- * @key randomness
- * @requires (vm.debug == true)
- *
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- *
- * @run main/othervm/timeout=400
- *      -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
- *      -XX:VerifyMetaspaceInterval=10
- *      -XX:+MetaspaceGuardAllocations
- *      TestMetaspaceAllocationMT1 3
- */
-
 /*
  * @test id=ndebug-default
  * @library /test/lib
@@ -130,7 +112,6 @@ public static void main(String[] args) throws Exception {
             System.out.println("#### seconds: " + seconds);
             System.out.println("#### commitLimit: " + commitLimit);
             System.out.println("#### reserveLimit: " + reserveLimit);
-            System.out.println("#### guards: " + Settings.settings().usesAllocationGuards);
 
             MetaspaceTestContext context = new MetaspaceTestContext(commitLimit, reserveLimit);
             MetaspaceTestOneArenaManyThreads test = new MetaspaceTestOneArenaManyThreads(context, testAllocationCeiling, numThreads, seconds);
diff --git a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT2.java b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT2.java
index 17e3bb99353..2c6b3923d94 100644
--- a/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT2.java
+++ b/test/hotspot/jtreg/runtime/Metaspace/elastic/TestMetaspaceAllocationMT2.java
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2020, 2023 SAP SE. All rights reserved.
- * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -58,7 +58,7 @@
  */
 
 /*
- * @test id=debug-default-strict
+ * @test id=debug-default-long-manual
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
@@ -74,24 +74,6 @@
  *      TestMetaspaceAllocationMT2 10
  */
 
-/*
- * @test id=debug-guard
- * @library /test/lib
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @build jdk.test.whitebox.WhiteBox
- * @key randomness
- * @requires (vm.debug == true)
- *
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- *
- * @run main/othervm/timeout=400
- *      -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
- *      -XX:VerifyMetaspaceInterval=10
- *      -XX:+MetaspaceGuardAllocations
- *      TestMetaspaceAllocationMT2 3
- */
-
 /*
  * @test id=ndebug-default
  * @library /test/lib
@@ -129,7 +111,6 @@ public static void main(String[] args) throws Exception {
             System.out.println("#### seconds: " + seconds);
             System.out.println("#### commitLimit: " + commitLimit);
             System.out.println("#### reserveLimit: " + reserveLimit);
-            System.out.println("#### guards: " + Settings.settings().usesAllocationGuards);
 
             MetaspaceTestContext context = new MetaspaceTestContext(commitLimit, reserveLimit);
             MetaspaceTestManyArenasManyThreads test = new MetaspaceTestManyArenasManyThreads(context, testAllocationCeiling, numThreads, seconds);
diff --git a/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java b/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java
index 411676b1b63..049d7070266 100644
--- a/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java
+++ b/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -58,6 +58,8 @@ public class CheckForProperDetailStackTrace {
     private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
     private static final Path MODS_DIR = Paths.get(TEST_CLASSES, "mods");
 
+    private static final boolean expectSourceInformation = Platform.isLinux() || Platform.isWindows();
+
     /* The stack trace we look for by default. Note that :: has been replaced by .*
        to make sure it matches even if the symbol is not unmangled.
     */
@@ -121,29 +123,27 @@ public static void main(String args[]) throws Exception {
             // It's ok for ARM not to have symbols, because it does not support NMT detail
             // when targeting thumb2. It's also ok for Windows not to have symbols, because
             // they are only available if the symbols file is included with the build.
-            if (Platform.isWindows() || Platform.isARM()) {
-                return; // we are done
+            if (!Platform.isWindows() && !Platform.isARM()) {
+                output.reportDiagnosticSummary();
+                throw new RuntimeException("Expected symbol missing from output: " + expectedSymbol);
             }
-            output.reportDiagnosticSummary();
-            throw new RuntimeException("Expected symbol missing from output: " + expectedSymbol);
         }
 
         // Make sure the expected NMT detail stack trace is found
         System.out.println("Looking for a stack matching:");
-        if (okToHaveAllocateHeap) {
-            System.out.print(stackTraceAllocateHeap);
-            if (stackTraceMatches(stackTraceAllocateHeap, output)) {
-                return;
-            }
-        } else {
-            System.out.print(stackTraceDefault);
-            if (stackTraceMatches(stackTraceDefault, output)) {
-                return;
+        String toMatch = okToHaveAllocateHeap ? stackTraceAllocateHeap : stackTraceDefault;
+        if (!stackTraceMatches(toMatch, output)) {
+            output.reportDiagnosticSummary();
+            throw new RuntimeException("Expected stack trace missing from output");
+        }
+
+        System.out.println("Looking for source information:");
+        if (expectSourceInformation) {
+            if (!stackTraceMatches(".*moduleEntry.cpp.*", output)) {
+                output.reportDiagnosticSummary();
+                throw new RuntimeException("Expected source information missing from output");
             }
         }
-        // Failed to match so dump all the output
-        output.reportDiagnosticSummary();
-        throw new RuntimeException("Expected stack trace missing from output");
     }
 
     public static boolean stackTraceMatches(String stackTrace, OutputAnalyzer output) {
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMRetryCountOption.java b/test/hotspot/jtreg/runtime/NMT/PrintMemoryMapAtExitTest.java
similarity index 52%
rename from test/hotspot/jtreg/compiler/rtm/cli/TestRTMRetryCountOption.java
rename to test/hotspot/jtreg/runtime/NMT/PrintMemoryMapAtExitTest.java
index 79e32af0e52..2c51c079c73 100644
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMRetryCountOption.java
+++ b/test/hotspot/jtreg/runtime/NMT/PrintMemoryMapAtExitTest.java
@@ -1,5 +1,6 @@
 /*
- * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Red Hat, Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,30 +22,30 @@
  * questions.
  */
 
-/**
+/*
  * @test
- * @bug 8031320
- * @summary Verify processing of RTMRetryCount option.
- * @library /test/lib /
+ * @summary Verify PrintMemoryMapAtExit on normal JVM exit for summary tracking level
+ * @requires os.family == "linux"
  * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestRTMRetryCountOption
+ * @library /test/lib
+ * @run driver PrintMemoryMapAtExitTest
  */
 
-package compiler.rtm.cli;
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
 
-public class TestRTMRetryCountOption extends RTMGenericCommandLineOptionTest {
-    private static final String DEFAULT_VALUE = "5";
+public class PrintMemoryMapAtExitTest {
 
-    private TestRTMRetryCountOption() {
-        super("RTMRetryCount", false, false,
-                TestRTMRetryCountOption.DEFAULT_VALUE,
-                "0", "10", "100", "1000");
-    }
+    public static void main(String args[]) throws Exception {
+
+        ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder(
+                "-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintMemoryMapAtExit",
+                "-XX:NativeMemoryTracking=summary", "-version");
 
-    public static void main(String args[]) throws Throwable {
-        new TestRTMRetryCountOption().runTestCases();
+        OutputAnalyzer output = new OutputAnalyzer(pb.start());
+        output.shouldHaveExitValue(0);
+        output.shouldContain("Memory mappings");
+        output.shouldContain("JAVAHEAP");
+        output.shouldHaveExitValue(0);
     }
 }
diff --git a/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java b/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java
index a10f4193234..f16e0ff9da4 100644
--- a/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java
+++ b/test/hotspot/jtreg/runtime/Thread/TestAlwaysPreTouchStacks.java
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2022 SAP SE. All rights reserved.
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,18 +27,32 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.concurrent.CyclicBarrier;
 
+import static jdk.test.lib.Platform.isLinux;
+import static jdk.test.lib.Platform.isWindows;
+
 /*
- * @test
+ * @test id=preTouch
  * @summary Test AlwaysPreTouchThreadStacks
  * @requires os.family != "aix"
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
- * @run driver TestAlwaysPreTouchStacks
+ * @run driver TestAlwaysPreTouchStacks preTouch
+ */
+
+/*
+ * @test id=noPreTouch
+ * @summary Test that only touched committed memory is reported as thread stack usage.
+ * @requires os.family != "aix"
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ * @run driver TestAlwaysPreTouchStacks noPreTouch
  */
 
 public class TestAlwaysPreTouchStacks {
@@ -89,14 +103,27 @@ public static void main(String[] args) throws Exception {
             // should show up with fully - or almost fully - committed thread stacks.
 
         } else {
-
-            ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder(
+            boolean preTouch;
+            if (args.length == 1 && args[0].equals("noPreTouch")){
+                preTouch = false;
+            } else if (args.length == 1 && args[0].equals("preTouch")){
+                preTouch = true;
+            } else {
+                throw new RuntimeException("Invalid test input. Must be 'preTouch' or 'noPreTouch'.");
+            }
+            ArrayList<String> vmArgs = new ArrayList<>();
+            Collections.addAll(vmArgs,
                     "-XX:+UnlockDiagnosticVMOptions",
                     "-Xmx100M",
-                    "-XX:+AlwaysPreTouchStacks",
-                    "-XX:NativeMemoryTracking=summary", "-XX:+PrintNMTStatistics",
-                    "TestAlwaysPreTouchStacks",
-                    "test");
+                    "-XX:NativeMemoryTracking=summary", "-XX:+PrintNMTStatistics");
+            if (preTouch){
+                vmArgs.add("-XX:+AlwaysPreTouchStacks");
+            }
+            if (System.getProperty("os.name").contains("Linux")) {
+                vmArgs.add("-XX:-UseMadvPopulateWrite");
+            }
+            Collections.addAll(vmArgs, "TestAlwaysPreTouchStacks", "test");
+            ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder(vmArgs);
             OutputAnalyzer output = new OutputAnalyzer(pb.start());
             output.reportDiagnosticSummary();
 
@@ -106,8 +133,8 @@ public static void main(String[] args) throws Exception {
                 output.shouldContain("Alive: " + i);
             }
 
-            // We want to see, in the final NMT printout, a committed thread stack size very close to reserved
-            // stack size. Like this:
+            // If using -XX:+AlwaysPreTouchStacks, we want to see, in the final NMT printout,
+            // a committed thread stack size very close to reserved stack size. Like this:
             // -                    Thread (reserved=10332400KB, committed=10284360KB)
             //                      (thread #10021)
             //                      (stack: reserved=10301560KB, committed=10253520KB)   <<<<
@@ -131,8 +158,10 @@ public static void main(String[] args) throws Exception {
                     // as thread stack. But without pre-touching, the thread stacks would be committed to about 1/5th
                     // of their reserved size. Requiring them to be committed for over 3/4th shows that pretouch is
                     // really working.
-                    if ((double)committed < ((double)reserved * 0.75)) {
+                    if (preTouch && (double)committed < ((double)reserved * 0.75)) {
                         throw new RuntimeException("Expected a higher ratio between stack committed and reserved.");
+                    } else if (!preTouch && (double)committed > ((double)reserved * 0.50)){
+                        throw new RuntimeException("Expected a lower ratio between stack committed and reserved.");
                     }
                     // Added sanity tests: we expect our test threads to be still alive when NMT prints its final
                     // report, so their stacks should dominate the NMT-reported total stack size.
diff --git a/test/hotspot/jtreg/runtime/Thread/TestThreadDumpClassInitMonitor.java b/test/hotspot/jtreg/runtime/Thread/TestThreadDumpClassInitMonitor.java
index 0154f43244e..6260088fa33 100644
--- a/test/hotspot/jtreg/runtime/Thread/TestThreadDumpClassInitMonitor.java
+++ b/test/hotspot/jtreg/runtime/Thread/TestThreadDumpClassInitMonitor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 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
@@ -60,8 +60,7 @@ public class TestThreadDumpClassInitMonitor {
      */
     final static String TEST_THREAD = "TestThread";
     final static String TEST_THREAD_ENTRY = "\"" + TEST_THREAD;
-    // final static String IN_OBJECT_WAIT = "in Object.wait()";
-    final static String IN_CONVAR_WAIT = "waiting on condition";
+    final static String IN_OBJECT_WAIT = "in Object.wait()";
     final static String THREAD_STATE = "java.lang.Thread.State: RUNNABLE";
     final static String THREAD_INFO = "Thread:"; // the details are not important
     final static String JAVATHREAD_STATE = "JavaThread state: _thread_blocked";
@@ -140,7 +139,7 @@ public static void main(String[] args) throws Throwable {
                         continue;
                     }
                     foundLines++;
-                    if (!line.contains(IN_CONVAR_WAIT)) {
+                    if (!line.contains(IN_OBJECT_WAIT)) {
                         throw new Error("Unexpected initial stack line: " + line);
                     }
                     continue;
diff --git a/test/hotspot/jtreg/runtime/cds/DeterministicDump.java b/test/hotspot/jtreg/runtime/cds/DeterministicDump.java
index 8f9bb4a5829..cc8d8c2b1dd 100644
--- a/test/hotspot/jtreg/runtime/cds/DeterministicDump.java
+++ b/test/hotspot/jtreg/runtime/cds/DeterministicDump.java
@@ -25,7 +25,7 @@
  * @test
  * @bug 8241071
  * @summary The same JDK build should always generate the same archive file (no randomness).
- * @requires vm.cds
+ * @requires vm.cds & vm.flagless
  * @library /test/lib
  * @run driver DeterministicDump
  */
diff --git a/test/hotspot/jtreg/runtime/cds/StaticWritingError.java b/test/hotspot/jtreg/runtime/cds/StaticWritingError.java
new file mode 100644
index 00000000000..1bb3e7e721d
--- /dev/null
+++ b/test/hotspot/jtreg/runtime/cds/StaticWritingError.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2024, 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 8306580
+ * @summary Test the writing error when archive file cannot be created
+ * @requires vm.cds
+ * @library /test/lib
+ * @run driver StaticWritingError
+ */
+
+import java.io.File;
+import jdk.test.lib.cds.CDSOptions;
+import jdk.test.lib.cds.CDSTestUtils;
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class StaticWritingError {
+    public static void main(String[] args) throws Exception {
+        String directoryName = "nosuchdir";
+        String archiveName = "staticWritingError.jsa";
+
+        // Perform static dump and attempt to write archive in unwritable directory
+        CDSOptions opts = (new CDSOptions())
+            .addPrefix("-Xlog:cds")
+            .setArchiveName(directoryName + File.separator + archiveName);
+        OutputAnalyzer out = CDSTestUtils.createArchive(opts);
+        out.shouldHaveExitValue(1);
+        out.shouldContain("Unable to create shared archive file");
+        out.shouldContain("Encountered error while dumping");
+    }
+}
diff --git a/test/hotspot/jtreg/runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java b/test/hotspot/jtreg/runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java
index 9238a832add..3bc7a4427f4 100644
--- a/test/hotspot/jtreg/runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java
+++ b/test/hotspot/jtreg/runtime/cds/appcds/javaldr/ExceptionDuringDumpAtObjectsInitPhase.java
@@ -69,7 +69,7 @@ public static void main(String[] args) throws Throwable {
                         "-Dtest.with.exception=true",
                         gcLog).shouldNotHaveExitValue(0)
                               .shouldContain("Preload Warning: Cannot find jdk/internal/math/FDBigInteger")
-                              .shouldContain("VM exits due to exception, use -Xlog:cds,exceptions=trace for detail");
+                              .shouldContain("Unexpected exception, use -Xlog:cds,exceptions=trace for detail");
 
         // 2. Test with OOM
         System.out.println("2. OOM during dump");
diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java
new file mode 100644
index 00000000000..474fa65d6ea
--- /dev/null
+++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2024, 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
+ * @summary Dump time resolutiom of constant pool entries.
+ * @requires vm.cds
+ * @requires vm.compMode != "Xcomp"
+ * @library /test/lib
+ * @build ResolvedConstants
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar ResolvedConstantsApp ResolvedConstantsFoo ResolvedConstantsBar
+ * @run driver ResolvedConstants
+ */
+
+import jdk.test.lib.cds.CDSOptions;
+import jdk.test.lib.cds.CDSTestUtils;
+import jdk.test.lib.helpers.ClassFileInstaller;
+
+public class ResolvedConstants {
+    static final String classList = "ResolvedConstants.classlist";
+    static final String appJar = ClassFileInstaller.getJarPath("app.jar");
+    static final String mainClass = ResolvedConstantsApp.class.getName();
+
+    public static void main(String[] args) throws Exception {
+        // dump class list
+        CDSTestUtils.dumpClassList(classList, "-cp", appJar, mainClass)
+            .assertNormalExit(output -> {
+                output.shouldContain("Hello ResolvedConstantsApp");
+            });
+
+        CDSOptions opts = (new CDSOptions())
+            .addPrefix("-XX:ExtraSharedClassListFile=" + classList,
+                       "-cp", appJar,
+                       "-Xlog:cds+resolve=trace");
+        CDSTestUtils.createArchiveAndCheck(opts)
+          // Class References ---
+
+            // Always resolve reference when a class references itself
+            .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsApp app => ResolvedConstantsApp app")
+
+            // Always resolve reference when a class references a super class
+            .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsApp app => java/lang/Object boot")
+            .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsBar app => ResolvedConstantsFoo app")
+
+            // Always resolve reference when a class references a super interface
+            .shouldMatch("cds,resolve.*archived klass.* ResolvedConstantsApp app => java/lang/Runnable boot")
+
+            // java/lang/System is in the root loader but ResolvedConstantsApp is loaded by the app loader.
+            // Even though System is in the vmClasses list, when ResolvedConstantsApp looks up
+            // "java/lang/System" in its ConstantPool, the app loader may not have resolved the System
+            // class yet (i.e., there's no initiaited class entry for System in the app loader's dictionary)
+            .shouldMatch("cds,resolve.*reverted klass.* ResolvedConstantsApp .*java/lang/System")
+
+          // Field References ---
+
+            // Always resolve references to fields in the current class or super class(es)
+            .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsBar => ResolvedConstantsBar.b:I")
+            .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsBar => ResolvedConstantsBar.a:I")
+            .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsBar => ResolvedConstantsFoo.a:I")
+
+            // Do not resolve field references to child classes
+            .shouldMatch("cds,resolve.*archived field.* ResolvedConstantsFoo => ResolvedConstantsFoo.a:I")
+            .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsFoo    ResolvedConstantsBar.a:I")
+            .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsFoo    ResolvedConstantsBar.b:I")
+
+            // Do not resolve field references to unrelated classes
+            .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsApp    ResolvedConstantsBar.a:I")
+            .shouldMatch("cds,resolve.*reverted field.* ResolvedConstantsApp    ResolvedConstantsBar.b:I")
+
+          // Method References ---
+
+            // Should resolve references to own constructor
+            .shouldMatch("cds,resolve.*archived method .* ResolvedConstantsApp ResolvedConstantsApp.<init>:")
+            // Should resolve references to super constructor
+            .shouldMatch("cds,resolve.*archived method .* ResolvedConstantsApp java/lang/Object.<init>:")
+
+            // Should resolve interface methods in VM classes
+            .shouldMatch("cds,resolve.*archived interface method .* ResolvedConstantsApp java/lang/Runnable.run:")
+
+            // Should resolve references to own non-static method (private or public)
+            .shouldMatch("archived method.*: ResolvedConstantsBar ResolvedConstantsBar.doBar:")
+            .shouldMatch("archived method.*: ResolvedConstantsApp ResolvedConstantsApp.privateInstanceCall:")
+            .shouldMatch("archived method.*: ResolvedConstantsApp ResolvedConstantsApp.publicInstanceCall:")
+
+            // Should not resolve references to static method
+            .shouldNotMatch(" archived method CP entry.*: ResolvedConstantsApp ResolvedConstantsApp.staticCall:")
+
+            // Should resolve references to method in super type
+            .shouldMatch(" archived method CP entry.*: ResolvedConstantsBar ResolvedConstantsFoo.doBar:")
+
+            // App class cannot resolve references to methods in boot classes:
+            //    When the app class loader tries to resolve a class X that's normally loaded by
+            //    the boot loader, it's possible for the app class loader to get a different copy of
+            //    X (by using MethodHandles.Lookup.defineClass(), etc). Therefore, let's be on
+            //    the side of safety and revert all such references.
+            //
+            //    This will be addressed in JDK-8315737.
+            .shouldMatch("reverted method.*: ResolvedConstantsApp java/io/PrintStream.println:")
+            .shouldMatch("reverted method.*: ResolvedConstantsBar java/lang/Class.getName:")
+
+            // Should not resolve methods in unrelated classes.
+            .shouldMatch("reverted method.*: ResolvedConstantsApp ResolvedConstantsBar.doit:")
+
+          // End ---
+            ;
+    }
+}
+
+class ResolvedConstantsApp implements Runnable {
+    public static void main(String args[]) {
+        System.out.println("Hello ResolvedConstantsApp");
+        ResolvedConstantsApp app = new ResolvedConstantsApp();
+        ResolvedConstantsApp.staticCall();
+        app.privateInstanceCall();
+        app.publicInstanceCall();
+        Object a = app;
+        ((Runnable)a).run();
+
+        ResolvedConstantsFoo foo = new ResolvedConstantsFoo();
+        ResolvedConstantsBar bar = new ResolvedConstantsBar();
+        bar.a ++;
+        bar.b ++;
+        bar.doit();
+    }
+    private static void staticCall() {}
+    private void privateInstanceCall() {}
+    public void publicInstanceCall() {}
+
+    public void run() {}
+}
+
+class ResolvedConstantsFoo {
+    int a = 1;
+    void doit() {
+    }
+
+    void doBar(ResolvedConstantsBar bar) {
+        bar.a ++;
+        bar.b ++;
+    }
+}
+
+class ResolvedConstantsBar extends ResolvedConstantsFoo {
+    int b = 2;
+    void doit() {
+        System.out.println("Hello ResolvedConstantsBar and " + ResolvedConstantsFoo.class.getName());
+        System.out.println("a = " + a);
+        System.out.println("a = " + ((ResolvedConstantsFoo)this).a);
+        System.out.println("b = " + b);
+
+        doBar(this);
+
+        ((ResolvedConstantsFoo)this).doBar(this);
+    }
+}
diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutField.java b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutField.java
new file mode 100644
index 00000000000..250ff7d7d6f
--- /dev/null
+++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutField.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2024, 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
+ * @summary Fieldref entry for putfield bytecodes for a final field cannot be preresolved if it's used by a
+ *          method outside of <clinit>
+ * @requires vm.cds
+ * @requires vm.compMode != "Xcomp"
+ * @library /test/lib
+ * @build ResolvedPutFieldHelper
+ * @build ResolvedPutField
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar ResolvedPutFieldApp ResolvedPutFieldHelper
+ * @run driver ResolvedPutField
+ */
+
+import jdk.test.lib.cds.CDSOptions;
+import jdk.test.lib.cds.CDSTestUtils;
+import jdk.test.lib.helpers.ClassFileInstaller;
+
+public class ResolvedPutField {
+    static final String classList = "ResolvedPutField.classlist";
+    static final String appJar = ClassFileInstaller.getJarPath("app.jar");
+    static final String mainClass = ResolvedPutFieldApp.class.getName();
+    static final String error = "Update to non-static final field ResolvedPutFieldHelper.x attempted from a different method (set_x) than the initializer method <init>";
+    public static void main(String[] args) throws Exception {
+        // dump class list
+        CDSTestUtils.dumpClassList(classList, "-cp", appJar, mainClass)
+            .assertNormalExit(error);
+
+        CDSOptions opts = (new CDSOptions())
+            .addPrefix("-XX:ExtraSharedClassListFile=" + classList,
+                       "-cp", appJar,
+                       "-Xlog:cds+resolve=trace");
+        CDSTestUtils.createArchiveAndCheck(opts)
+            .shouldMatch("cds,resolve.*Failed to resolve putfield .*ResolvedPutFieldHelper -> ResolvedPutFieldHelper.x:I");
+    }
+}
+
+class ResolvedPutFieldApp {
+    public static void main(String args[]) {
+        try {
+            ResolvedPutFieldHelper.main(args);
+        } catch (IllegalAccessError e) {
+            System.out.println("IllegalAccessError expected:");
+            System.out.println(e);
+            System.exit(0);
+        }
+        throw new RuntimeException("IllegalAccessError expected!");
+    }
+}
diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutFieldHelper.jasm b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutFieldHelper.jasm
new file mode 100644
index 00000000000..dc7bcfff050
--- /dev/null
+++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedPutFieldHelper.jasm
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2024, 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.
+ *
+ */
+
+
+/*
+
+class ResolvedPutFieldHelper {
+   int x; // change it to 'final'
+   ResolvedPutFieldHelper() { x = 1; }
+   void set_x() { x = 2; }
+
+    public static void main(String args[]) {
+        ResolvedPutFieldHelper s = new ResolvedPutFieldHelper();
+        s.set_x();
+        System.out.println(s.x);
+    }
+}
+
+*/
+
+
+
+super class ResolvedPutFieldHelper
+    version 66:0
+{
+  //WAS Field x:I;
+  final Field x:I;
+
+  Method "<init>":"()V"
+    stack 2 locals 1
+  {
+        aload_0;
+        invokespecial    Method java/lang/Object."<init>":"()V";
+        aload_0;
+        iconst_1;
+        putfield         Field x:"I";
+        return;
+  }
+
+  // set_x is not allowed to write to the final "x" field. If CDS pre-resolves its
+  // ResolvedFieldEntry for the putfield bytecode, then we cannot get
+  // the IllegalAccessError at runtime. See JDK-8157181 for the code that
+  // throws the IllegalAccessError.
+
+  Method set_x:"()V"
+    stack 2 locals 1
+  {
+        aload_0;
+        iconst_2;
+        putfield         Field x:"I";
+        return;
+  }
+  public static Method main:"([Ljava/lang/String;)V"
+    stack 2 locals 2
+  {
+        new              class ResolvedPutFieldHelper;
+        dup;
+        invokespecial    Method "<init>":"()V";
+        astore_1;
+        aload_1;
+        invokevirtual    Method set_x:"()V";
+        getstatic         Field java/lang/System.out:"Ljava/io/PrintStream;";
+        aload_1;
+        getfield         Field x:"I";
+        invokevirtual    Method java/io/PrintStream.println:"(I)V";
+        return;
+  }
+}
diff --git a/test/hotspot/jtreg/runtime/locking/TestRecursiveMonitorChurn.java b/test/hotspot/jtreg/runtime/locking/TestRecursiveMonitorChurn.java
index 47cb5613171..19dd90015bf 100644
--- a/test/hotspot/jtreg/runtime/locking/TestRecursiveMonitorChurn.java
+++ b/test/hotspot/jtreg/runtime/locking/TestRecursiveMonitorChurn.java
@@ -21,19 +21,21 @@
  * questions.
  */
 
-import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.process.ProcessTools;
-
-import java.io.IOException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 /*
  * @test
  * @summary Tests that recursive locking doesn't cause excessive native memory usage
  * @library /test/lib
- * @run driver TestRecursiveMonitorChurn
+ * @build jdk.test.whitebox.WhiteBox
+ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ *                   -Xmx100M -XX:AsyncDeflationInterval=0 -XX:GuaranteedAsyncDeflationInterval=0
+ *                   -Xlog:monitorinflation=trace
+ *                   TestRecursiveMonitorChurn
  */
+
+import jdk.test.whitebox.WhiteBox;
+import jtreg.SkippedException;
+
 public class TestRecursiveMonitorChurn {
     static class Monitor {
         public static volatile int i, j;
@@ -46,50 +48,32 @@ synchronized void doSomethingElse() {
         }
     }
 
-    public static volatile Monitor monitor;
-    public static void main(String[] args) throws IOException {
-        if (args.length == 1 && args[0].equals("test")) {
-            // The actual test, in a forked JVM.
-            for (int i = 0; i < 100000; i++) {
-                monitor = new Monitor();
-                monitor.doSomething();
-            }
-            System.out.println("i + j = " + (Monitor.i + Monitor.j));
-        } else {
-            ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder(
-                    "-XX:+UnlockDiagnosticVMOptions",
-                    "-Xmx100M", "-XX:AsyncDeflationInterval=0", "-XX:GuaranteedAsyncDeflationInterval=0",
-                    "-XX:NativeMemoryTracking=summary", "-XX:+PrintNMTStatistics",
-                    "TestRecursiveMonitorChurn",
-                    "test");
-            OutputAnalyzer output = new OutputAnalyzer(pb.start());
-            output.reportDiagnosticSummary();
-
-            output.shouldHaveExitValue(0);
+    static final WhiteBox WB = WhiteBox.getWhiteBox();
+    static final int LM_MONITOR = 0;
+    static final int COUNT = 100000;
 
-            // We want to see, in the final NMT printout, a committed object monitor size that is reasonably low.
-            // Like this:
-            // -           Object Monitors (reserved=208, committed=208)
-            //                             (malloc=208 #1) (at peak)
-            //
-            // Without recursive locking support, this would look more like this:
-            // -           Object Monitors (reserved=20800624, committed=20800624)
-            //                             (malloc=20800624 #100003) (at peak)
+    public static volatile Monitor monitor;
+    public static void main(String[] args) {
+        if (WB.getIntVMFlag("LockingMode") == LM_MONITOR) {
+            throw new SkippedException("LM_MONITOR always inflates. Invalid test.");
+        }
+        final long pre_monitor_count = WB.getInUseMonitorCount();
+        System.out.println(" Precount = " + pre_monitor_count);
+        for (int i = 0; i < COUNT; i++) {
+            monitor = new Monitor();
+            monitor.doSomething();
+        }
+        System.out.println("i + j = " + (Monitor.i + Monitor.j));
+        final long post_monitor_count = WB.getInUseMonitorCount();
+        System.out.println("Postcount = " + post_monitor_count);
 
-            Pattern pat = Pattern.compile("- *Object Monitors.*reserved=(\\d+), committed=(\\d+).*");
-            for (String line : output.asLines()) {
-                Matcher m = pat.matcher(line);
-                if (m.matches()) {
-                    long reserved = Long.parseLong(m.group(1));
-                    long committed = Long.parseLong(m.group(2));
-                    System.out.println(">>>>> " + line + ": " + reserved + " - " + committed);
-                    if (committed > 1000) {
-                        throw new RuntimeException("Allocated too many monitors");
-                    }
-                    return;
-                }
+        if (pre_monitor_count != post_monitor_count) {
+            final long monitor_count_change = post_monitor_count - pre_monitor_count;
+            System.out.println("Unexpected change in monitor count: " + monitor_count_change);
+            if (monitor_count_change < 0) {
+                throw new RuntimeException("Unexpected Deflation");
             }
-            throw new RuntimeException("Did not find expected NMT output");
+            throw new RuntimeException("Unexpected Inflation");
         }
     }
 }
diff --git a/test/hotspot/jtreg/runtime/os/TestTracePageSizes.java b/test/hotspot/jtreg/runtime/os/TestTracePageSizes.java
index a94d9af4c27..e6fe18dce30 100644
--- a/test/hotspot/jtreg/runtime/os/TestTracePageSizes.java
+++ b/test/hotspot/jtreg/runtime/os/TestTracePageSizes.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
  * @library /test/lib
  * @build jdk.test.lib.Platform
  * @requires os.family == "linux"
+ * @requires os.arch != "ppc64le"
  * @run main/othervm -XX:+AlwaysPreTouch -Xlog:pagesize:ps-%p.log TestTracePageSizes
  */
 
@@ -51,6 +52,7 @@
  * @library /test/lib
  * @build jdk.test.lib.Platform
  * @requires os.family == "linux"
+ * @requires os.arch != "ppc64le"
  * @requires vm.gc != "Z" & vm.gc != "Shenandoah"
  * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:-SegmentedCodeCache TestTracePageSizes
  * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:-SegmentedCodeCache -XX:+UseLargePages TestTracePageSizes
@@ -63,6 +65,7 @@
  * @library /test/lib
  * @build jdk.test.lib.Platform
  * @requires os.family == "linux"
+ * @requires os.arch != "ppc64le"
  * @requires vm.gc.G1
  * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseG1GC TestTracePageSizes
  * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseG1GC -XX:+UseLargePages TestTracePageSizes
@@ -75,6 +78,7 @@
  * @library /test/lib
  * @build jdk.test.lib.Platform
  * @requires os.family == "linux"
+ * @requires os.arch != "ppc64le"
  * @requires vm.gc.Parallel
  * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseParallelGC TestTracePageSizes
  * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseParallelGC -XX:+UseLargePages TestTracePageSizes
@@ -87,6 +91,7 @@
  * @library /test/lib
  * @build jdk.test.lib.Platform
  * @requires os.family == "linux"
+ * @requires os.arch != "ppc64le"
  * @requires vm.gc.Serial
  * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseSerialGC TestTracePageSizes
  * @run main/othervm -XX:+AlwaysPreTouch -Xmx128m -Xlog:pagesize:ps-%p.log -XX:+UseSerialGC -XX:+UseLargePages TestTracePageSizes
@@ -261,12 +266,6 @@ public static void main(String args[]) throws Exception {
             throw new SkippedException("Kernel older than 3.8 - skipping this test.");
         }
 
-        // For similar reasons, we skip the test on ppc platforms, since there the smaps
-        //  format may follow a different logic.
-        if (Platform.isPPC()) {
-            throw new SkippedException("PPC - skipping this test.");
-        }
-
         // Parse /proc/self/smaps to compare with values logged in the VM.
         parseSmaps();
 
diff --git a/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java b/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java
new file mode 100644
index 00000000000..04163d7536a
--- /dev/null
+++ b/test/hotspot/jtreg/serviceability/dcmd/thread/PrintMountedVirtualThread.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2024, 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 jdk.test.lib.dcmd.CommandExecutor;
+import jdk.test.lib.dcmd.JMXExecutor;
+import jdk.test.lib.process.OutputAnalyzer;
+import org.junit.Test;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.regex.Pattern;
+
+/*
+ * @test
+ * @summary Test of diagnostic command Thread.print with virtual threads
+ * @requires vm.continuations
+ * @library /test/lib
+ * @run junit PrintMountedVirtualThread
+ */
+public class PrintMountedVirtualThread {
+
+    public void run(CommandExecutor executor) throws InterruptedException {
+        var shouldFinish = new AtomicBoolean(false);
+        var started = new AtomicBoolean();
+        final Runnable runnable = new DummyRunnable(shouldFinish, started);
+        try {
+            Thread vthread = Thread.ofVirtual().name("Dummy Vthread").start(runnable);
+            while (!started.get()) {
+                Thread.sleep(10);
+            }
+            /* Execute */
+            OutputAnalyzer output = executor.execute("Thread.print");
+            output.shouldMatch(".*at " + Pattern.quote(DummyRunnable.class.getName()) + "\\.run.*");
+            output.shouldMatch(".*at " + Pattern.quote(DummyRunnable.class.getName()) + "\\.compute.*");
+            output.shouldMatch("Mounted virtual thread " + "#" + vthread.threadId());
+
+        } finally {
+            shouldFinish.set(true);
+        }
+    }
+
+    @Test
+    public void jmx() throws InterruptedException {
+        run(new JMXExecutor());
+    }
+
+    static class DummyRunnable implements Runnable {
+        private final AtomicBoolean shouldFinish;
+        private final AtomicBoolean started;
+
+        public DummyRunnable(AtomicBoolean shouldFinish, AtomicBoolean started) {
+           this.shouldFinish = shouldFinish;
+           this.started = started;
+        }
+
+        public void run() {
+            compute();
+        }
+
+        void compute() {
+            started.set(true);
+            while (!shouldFinish.get()) {
+                Thread.onSpinWait();
+            }
+        }
+    }
+
+}
diff --git a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemDumpMapTest.java b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemDumpMapTest.java
index 347e8884096..eb0b6bd8566 100644
--- a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemDumpMapTest.java
+++ b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemDumpMapTest.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2023, Red Hat, Inc. and/or its affiliates.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Red Hat, Inc. and/or its affiliates.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,6 @@
 import jdk.test.lib.process.OutputAnalyzer;
 
 import java.io.*;
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.regex.Pattern;
 
@@ -41,9 +40,9 @@
  *          java.compiler
  *          java.management
  *          jdk.internal.jvmstat/sun.jvmstat.monitor
- * @run testng SystemDumpMapTest
+ * @run testng/othervm -XX:+UsePerfData SystemDumpMapTest
  */
-public class SystemDumpMapTest {
+public class SystemDumpMapTest extends SystemMapTestBase {
 
     private void run_test(CommandExecutor executor, boolean useDefaultFileName) {
 
@@ -64,18 +63,22 @@ private void run_test(CommandExecutor executor, boolean useDefaultFileName) {
             boolean NMTOff = output.contains("NMT is disabled");
             String regexBase = ".*0x\\p{XDigit}+ - 0x\\p{XDigit}+ +\\d+";
             HashSet<Pattern> patterns = new HashSet<>();
-            patterns.add(Pattern.compile(regexBase + ".*jvm.*"));
+            for (String s: shouldMatchUnconditionally) {
+                patterns.add(Pattern.compile(s));
+            }
             if (!NMTOff) { // expect VM annotations if NMT is on
-                patterns.add(Pattern.compile(regexBase + ".*JAVAHEAP.*"));
-                patterns.add(Pattern.compile(regexBase + ".*META.*"));
-                patterns.add(Pattern.compile(regexBase + ".*CODE.*"));
-                patterns.add(Pattern.compile(regexBase + ".*STACK.*main.*"));
+                for (String s: shouldMatchIfNMTIsEnabled) {
+                    patterns.add(Pattern.compile(s));
+                }
             }
+
             do {
                 String line = reader.readLine();
                 if (line != null) {
+                    System.out.println("   " + line);
                     for (Pattern pat : patterns) {
                         if (pat.matcher(line).matches()) {
+                            System.out.println(">>> matches " + pat);
                             patterns.remove(pat);
                             break;
                         }
diff --git a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTest.java b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTest.java
index 9fb8efe5a71..43857a1f039 100644
--- a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTest.java
+++ b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTest.java
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2023, Red Hat, Inc. and/or its affiliates.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Red Hat, Inc. and/or its affiliates.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,13 +27,6 @@
 import jdk.test.lib.dcmd.JMXExecutor;
 import jdk.test.lib.process.OutputAnalyzer;
 
-import java.io.*;
-import java.util.ArrayDeque;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.HashSet;
-import java.util.regex.Pattern;
-
 /*
  * @test
  * @summary Test of diagnostic command System.map
@@ -43,21 +36,19 @@
  *          java.compiler
  *          java.management
  *          jdk.internal.jvmstat/sun.jvmstat.monitor
- * @run testng SystemMapTest
+ * @run testng/othervm -XX:+UsePerfData SystemMapTest
  */
-public class SystemMapTest {
+public class SystemMapTest extends SystemMapTestBase {
     public void run(CommandExecutor executor) {
         OutputAnalyzer output = executor.execute("System.map");
-        output.reportDiagnosticSummary();
         boolean NMTOff = output.contains("NMT is disabled");
-
-        String regexBase = ".*0x\\p{XDigit}+ - 0x\\p{XDigit}+ +\\d+";
-        output.shouldMatch(regexBase + ".*jvm.*");
+        for (String s: shouldMatchUnconditionally) {
+            output.shouldMatch(s);
+        }
         if (!NMTOff) { // expect VM annotations if NMT is on
-            output.shouldMatch(regexBase + ".*JAVAHEAP.*");
-            output.shouldMatch(regexBase + ".*META.*");
-            output.shouldMatch(regexBase + ".*CODE.*");
-            output.shouldMatch(regexBase + ".*STACK.*main.*");
+            for (String s: shouldMatchIfNMTIsEnabled) {
+                output.shouldMatch(s);
+            }
         }
     }
 
diff --git a/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java
new file mode 100644
index 00000000000..000e977a590
--- /dev/null
+++ b/test/hotspot/jtreg/serviceability/dcmd/vm/SystemMapTestBase.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Red Hat, Inc. and/or its affiliates.
+ * 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.
+ */
+
+public class SystemMapTestBase {
+
+    // e.g.
+    // 0x00000007ff800000-0x00000007ff91a000      1155072 rw-p      1155072            0 4K   com              JAVAHEAP                              /shared/projects/openjdk/jdk-jdk/output-fastdebug/images/jdk/lib/server/classes.jsa
+    private static final String range = "0x\\p{XDigit}+-0x\\p{XDigit}+";
+    private static final String space = " +";
+    private static final String someSize = "\\d+";
+    private static final String pagesize = "(4K|8K|16K|64K|2M|16M|64M)";
+    private static final String prot = "[rwsxp-]+";
+
+    private static final String regexBase = range + space +
+            someSize + space +
+            prot + space +
+            someSize + space +
+            someSize + space +
+            pagesize + space;
+
+    private static final String regexBase_committed = regexBase + "com.*";
+    private static final String regexBase_shared_and_committed = regexBase + "shrd,com.*";
+
+    // java heap is either committed, non-shared, or - in case of ZGC - committed and shared.
+    private static final String regexBase_java_heap = regexBase + "(shrd,)?com.*";
+    protected static final String shouldMatchUnconditionally[] = {
+        // java launcher
+        regexBase_committed + "/bin/java",
+        // libjvm
+        regexBase_committed + "/lib/.*/libjvm.so",
+        // vdso library, should be part of all user space apps on all architectures OpenJDK supports.
+        regexBase_committed + "\\[vdso\\]",
+        // we should see the hs-perf data file, and it should appear as shared as well as committed
+        regexBase_shared_and_committed + "hsperfdata_.*"
+    };
+
+    protected static final String shouldMatchIfNMTIsEnabled[] = {
+        regexBase_java_heap + "JAVAHEAP.*",
+        // metaspace
+        regexBase_committed + "META.*",
+        // parts of metaspace should be uncommitted
+        regexBase + "-" + space + "META.*",
+        // code cache
+        regexBase_committed + "CODE.*",
+        // Main thread stack
+        regexBase_committed + "STACK.*main.*"
+    };
+}
diff --git a/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c b/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c
index 86f9993c703..a979d1f913e 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c
+++ b/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -200,7 +200,7 @@ Java_MyPackage_AddModuleUsesAndProvidesTest_checkUses(JNIEnv *env,
         throw_exc(env, "Check #UC3: service can not be used unexpectedly");
         return FAILED;
     }
-    fflush(0);
+    fflush(NULL);
     return PASSED;
 }
 
@@ -275,7 +275,7 @@ Java_MyPackage_AddModuleUsesAndProvidesTest_checkProvides(JNIEnv *env,
         throw_exc(env, "Check #PC2: error in add provides to baseModule with correct service and serviceImpl");
         return FAILED;
     }
-    fflush(0);
+    fflush(NULL);
     return PASSED;
 }
 
diff --git a/test/hotspot/jtreg/serviceability/jvmti/FollowReferences/FieldIndices/libFieldIndicesTest.cpp b/test/hotspot/jtreg/serviceability/jvmti/FollowReferences/FieldIndices/libFieldIndicesTest.cpp
index b8d83eb5085..6bcbab3f941 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/FollowReferences/FieldIndices/libFieldIndicesTest.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/FollowReferences/FieldIndices/libFieldIndicesTest.cpp
@@ -273,7 +273,9 @@ void Klass::explore_interfaces(JNIEnv* env) {
   if (super_klass != nullptr) {
     // Add all interfaces implemented by super_klass first.
     interface_count = super_klass->interface_count;
-    memcpy(interfaces, super_klass->interfaces, sizeof(Klass*) * super_klass->interface_count);
+    if (super_klass->interfaces != nullptr) {
+      memcpy(interfaces, super_klass->interfaces, sizeof(Klass*) * super_klass->interface_count);
+    }
   }
 
   // Interfaces implemented by the klass.
diff --git a/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents1.cpp b/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents1.cpp
index fa60c07f8db..0f040175bf9 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents1.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents1.cpp
@@ -71,7 +71,7 @@ CompiledMethodLoad(jvmtiEnv* jvmti, jmethodID method,
   check_jvmti_status(env, err, "CompiledMethodLoad: Error in JVMTI GetMethodName");
 
   printf("%s: CompiledMethodLoad: %s%s\n", AGENT_NAME, name, sign);
-  fflush(0);
+  fflush(nullptr);
 }
 
 JNIEXPORT jint JNICALL
diff --git a/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents2.cpp b/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents2.cpp
index 7af061196a1..d582a964892 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents2.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/GenerateEvents/libGenerateEvents2.cpp
@@ -71,7 +71,7 @@ CompiledMethodLoad(jvmtiEnv* jvmti, jmethodID method,
   check_jvmti_status(env, err, "CompiledMethodLoad: Error in JVMTI GetMethodName");
 
   printf("%s: CompiledMethodLoad: %s%s\n", AGENT_NAME, name, sign);
-  fflush(0);
+  fflush(nullptr);
 }
 
 JNIEXPORT jint JNICALL
@@ -132,7 +132,7 @@ Java_MyPackage_GenerateEventsTest_agent2FailStatus(JNIEnv *env, jclass cls) {
     printf("check2: Unexpected non-zero event count in agent2: %d\n", agent2_event_count);
   }
   printf("\n");
-  fflush(0);
+  fflush(nullptr);
 
   return fail_status;
 }
diff --git a/test/hotspot/jtreg/serviceability/jvmti/GetClassFields/FilteredFields/libFilteredFieldsTest.cpp b/test/hotspot/jtreg/serviceability/jvmti/GetClassFields/FilteredFields/libFilteredFieldsTest.cpp
index 28bfaaa03bd..fbefb1219e6 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/GetClassFields/FilteredFields/libFilteredFieldsTest.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/GetClassFields/FilteredFields/libFilteredFieldsTest.cpp
@@ -35,7 +35,7 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
     jint res = jvm->GetEnv((void **)&jvmti, JVMTI_VERSION_1_1);
     if (res != JNI_OK || jvmti == nullptr) {
         printf("Wrong result of a valid call to GetEnv!\n");
-        fflush(0);
+        fflush(nullptr);
         return JNI_ERR;
     }
     return JNI_OK;
@@ -72,7 +72,7 @@ Java_FilteredFieldsTest_getJVMTIFieldCount(JNIEnv *env, jclass cls, jclass clazz
         printf("  [%d]: %s\n", i, name);
         jvmti->Deallocate((unsigned char *)name);
     }
-    fflush(0);
+    fflush(nullptr);
     return fcount;
 }
 
diff --git a/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp b/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp
index 035aaef827e..b70f4834f23 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.cpp
@@ -515,7 +515,9 @@ static void event_storage_augment_storage(EventStorage* storage) {
   ObjectTrace** new_objects = reinterpret_cast<ObjectTrace**>(malloc(new_max * sizeof(*new_objects)));
 
   int current_count = storage->live_object_count;
-  memcpy(new_objects, storage->live_objects, current_count * sizeof(*new_objects));
+  if (storage->live_objects != nullptr) {
+    memcpy(new_objects, storage->live_objects, current_count * sizeof(*new_objects));
+  }
   free(storage->live_objects);
   storage->live_objects = new_objects;
   storage->live_object_size = new_max;
diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/libMissedStackMapFrames.cpp b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/libMissedStackMapFrames.cpp
index 5cebf608c34..066794d1d60 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/libMissedStackMapFrames.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/libMissedStackMapFrames.cpp
@@ -31,7 +31,7 @@ static void _log(const char* format, ...) {
   va_start(args, format);
   vprintf(format, args);
   va_end(args);
-  fflush(0);
+  fflush(nullptr);
 }
 
 static jvmtiEnv* jvmti = nullptr;
diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/libRedefineRetransform.cpp b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/libRedefineRetransform.cpp
index 518e147c942..450b0f35918 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/libRedefineRetransform.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/libRedefineRetransform.cpp
@@ -36,7 +36,7 @@ static void _log(const char* format, ...) {
     va_start(args, format);
     vprintf(format, args);
     va_end(args);
-    fflush(0);
+    fflush(nullptr);
 }
 
 static bool isTestClass(const char* name) {
diff --git a/test/hotspot/jtreg/serviceability/jvmti/events/FramePop/framepop02/libframepop02.cpp b/test/hotspot/jtreg/serviceability/jvmti/events/FramePop/framepop02/libframepop02.cpp
index 61c9a91184b..93df7f98277 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/events/FramePop/framepop02/libframepop02.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/events/FramePop/framepop02/libframepop02.cpp
@@ -194,7 +194,7 @@ void JNICALL MethodEntry(jvmtiEnv *jvmti, JNIEnv *jni,
   {
     if (printdump == JNI_TRUE) {
       print_current_time();
-      fflush(0);
+      fflush(nullptr);
       LOG(">>> %sMethod entry\n>>>", (isNative == JNI_TRUE) ? "Native " : "");
       printInfo(jni, jvmti, thr, method, frameCount);
     }
@@ -231,7 +231,7 @@ void JNICALL FramePop(jvmtiEnv *jvmti, JNIEnv *jni,
   {
     if (printdump == JNI_TRUE) {
       print_current_time();
-      fflush(0);
+      fflush(nullptr);
       LOG(" >>> Frame Pop\n>>>");
       printInfo(jni, jvmti, thr, method, frameCount);
     }
diff --git a/test/hotspot/jtreg/serviceability/jvmti/thread/GetStackTrace/get_stack_trace.hpp b/test/hotspot/jtreg/serviceability/jvmti/thread/GetStackTrace/get_stack_trace.hpp
index d7c85704275..b8828b0e80f 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/thread/GetStackTrace/get_stack_trace.hpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/thread/GetStackTrace/get_stack_trace.hpp
@@ -70,7 +70,7 @@ int compare_stack_trace(jvmtiEnv *jvmti, JNIEnv *jni, jthread thread,
 
     int exp_idx = expected_frames_length - 1 - i;
     printf("expected idx %d\n", exp_idx);
-    fflush(0);
+    fflush(nullptr);
     if (i < expected_frames_length) {
 
       // for generated classes don't compare lambda indicies
diff --git a/test/hotspot/jtreg/serviceability/jvmti/vthread/SuspendResume1/libSuspendResume1.cpp b/test/hotspot/jtreg/serviceability/jvmti/vthread/SuspendResume1/libSuspendResume1.cpp
index f05e619e0bd..93ad399b121 100644
--- a/test/hotspot/jtreg/serviceability/jvmti/vthread/SuspendResume1/libSuspendResume1.cpp
+++ b/test/hotspot/jtreg/serviceability/jvmti/vthread/SuspendResume1/libSuspendResume1.cpp
@@ -138,7 +138,7 @@ check_suspended_state(JNIEnv* jni, jthread thread, int thr_idx, char* tname, con
 
       LOG("## Agent: %s:  virtual thread of carrier thread has state: %s (%d)\n",
           func_name, TranslateState(state), (int)state);
-      fflush(0);
+      fflush(nullptr);
     }
     set_agent_fail_status();
     fatal(jni, "check_resumed_state: expected SUSPENDED flag in thread state");
@@ -169,7 +169,7 @@ check_resumed_state(JNIEnv* jni, jthread thread, int thr_idx, char* tname, const
 
       LOG("## Agent: %s:  virtual thread of carrier thread has state: %s (%d)\n",
           func_name, TranslateState(state), (int)state);
-      fflush(0);
+      fflush(nullptr);
     }
     set_agent_fail_status();
     fatal(jni, "check_resumed_state: NOT expected SUSPENDED flag in thread state");
@@ -210,7 +210,7 @@ test_thread_resume(JNIEnv* jni, jthread thread, int thr_idx, char* tname) {
 
     LOG("## Agent: test_thread_resume:  virtual thread of carrier thread has state: %s (%d)\n",
         TranslateState(state), (int)state);
-    fflush(0);
+    fflush(nullptr);
   }
   check_jvmti_status(jni, err, "test_thread_resume: error in JVMTI ResumeThread");
 
diff --git a/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java b/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java
index 4140a3e3381..4319d576590 100644
--- a/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java
+++ b/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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,6 +25,7 @@
 
 
 public class LingeredAppWithLock extends LingeredApp {
+    private static Object lockObj = new Object();
 
     public static void lockMethod(Object lock) {
         synchronized (lock) {
@@ -36,16 +37,28 @@ public static void lockMethod(Object lock) {
         }
     }
 
+    public static void waitMethod() {
+        synchronized (lockObj) {
+            try {
+                lockObj.wait(300000);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
     public static void main(String args[]) {
         Thread classLock1 = new Thread(() -> lockMethod(LingeredAppWithLock.class));
         Thread classLock2 = new Thread(() -> lockMethod(LingeredAppWithLock.class));
         Thread objectLock = new Thread(() -> lockMethod(classLock1));
         Thread primitiveLock = new Thread(() -> lockMethod(int.class));
+        Thread objectWait = new Thread(() -> waitMethod());
 
         classLock1.start();
         classLock2.start();
         objectLock.start();
         primitiveLock.start();
+        objectWait.start();
 
         // Wait until all threads have reached their blocked or timed wait state
         while ((classLock1.getState() != Thread.State.BLOCKED &&
@@ -53,7 +66,8 @@ public static void main(String args[]) {
                (classLock2.getState() != Thread.State.BLOCKED &&
                 classLock2.getState() != Thread.State.TIMED_WAITING) ||
                (objectLock.getState() != Thread.State.TIMED_WAITING) ||
-               (primitiveLock.getState() != Thread.State.TIMED_WAITING)) {
+               (primitiveLock.getState() != Thread.State.TIMED_WAITING) ||
+               (objectWait.getState() != Thread.State.TIMED_WAITING)) {
             try {
                 Thread.sleep(100);
             } catch (InterruptedException ex) {
diff --git a/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java
index cac6dac44a0..e4d4361e651 100644
--- a/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java
+++ b/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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,6 +31,7 @@
 
 /**
  * @test
+ * @bug 8185796 8335743
  * @requires vm.hasSA
  * @library /test/lib
  * @run main/othervm TestClhsdbJstackLock
@@ -57,7 +58,8 @@ public static void main (String... args) throws Exception {
                 "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$",
                 "^\\s+- waiting to lock <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$",
                 "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Thread\\)$",
-                "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$"));
+                "^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$",
+                "^\\s+- waiting on <0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)$"));
             unExpStrMap.put("jstack", List.of(
                 "missing reason for "));
             test.run(app.getPid(), cmds, expStrMap, unExpStrMap);
diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java
index 02a2a07f250..98c42866091 100644
--- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java
+++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -29,6 +29,7 @@
 
 /**
  * @test
+ * @bug 8185796 8335743
  * @requires vm.hasSA
  * @library /test/lib
  * @run driver TestJhsdbJstackLock
@@ -64,6 +65,7 @@ public static void main (String... args) throws Exception {
             out.shouldMatch("^\\s+- waiting to lock <0x[0-9a-f]+> \\(a java\\.lang\\.Class for LingeredAppWithLock\\)$");
             out.shouldMatch("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Thread\\)$");
             out.shouldMatch("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$");
+            out.shouldMatch("^\\s+- waiting on <0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)$");
 
             out.stderrShouldBeEmptyIgnoreDeprecatedWarnings();
 
diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/LoadUnloadGC.java b/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/LoadUnloadGC.java
index 9b79865462d..1d95426554b 100644
--- a/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/LoadUnloadGC.java
+++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/LoadUnloadGC.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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
@@ -71,12 +71,8 @@
 
 package gc.gctests.LoadUnloadGC;
 
-import nsk.share.test.*;
 import nsk.share.gc.*;
 import nsk.share.classload.ClassPathNonDelegatingClassLoader;
-import vm.share.monitoring.MemoryPoolFinder;
-
-import java.io.*;
 import java.util.*;
 import java.lang.management.MemoryPoolMXBean;
 
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/MemoryPoolFinder.java b/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/MemoryPoolFinder.java
similarity index 95%
rename from test/hotspot/jtreg/vmTestbase/vm/share/monitoring/MemoryPoolFinder.java
rename to test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/MemoryPoolFinder.java
index ca68beffca6..f7f5e19bd16 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/MemoryPoolFinder.java
+++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/LoadUnloadGC/MemoryPoolFinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -20,11 +20,11 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.monitoring;
+package gc.gctests.LoadUnloadGC;
 
 import java.lang.management.*;
 
-public enum MemoryPoolFinder {
+enum MemoryPoolFinder {
     CODE_CACHE,
         EDEN_SPACE,
         SURVIVOR_SPACE,
diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC01/libnativeGC01.cpp b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC01/libnativeGC01.cpp
index 63aed51a897..efd1fd3fa3a 100644
--- a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC01/libnativeGC01.cpp
+++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC01/libnativeGC01.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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
@@ -43,7 +43,7 @@ Java_gc_gctests_nativeGC01_nativeGC01_nativeMethod01
            */
         cls  = env->GetObjectClass(obj);
         mid = env->GetMethodID(cls, "callbackGC", "()V");
-        if (mid == 0) {
+        if (mid == nullptr) {
                 printf("couldnt locate method callbackGC()");
                 return -1;
         }
@@ -56,7 +56,7 @@ Java_gc_gctests_nativeGC01_nativeGC01_nativeMethod01
 
         clss = env->GetObjectClass(linked_list);
         mid2 = env->GetMethodID(clss, "getLength", "()I");
-        if (mid2 == 0) {
+        if (mid2 == nullptr) {
                 printf("couldnt locate method getLength()");
                 return -1;
         }
diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC02/libnativeGC02.cpp b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC02/libnativeGC02.cpp
index e6db8cf6184..eec3fa3e8e8 100644
--- a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC02/libnativeGC02.cpp
+++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC02/libnativeGC02.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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
@@ -41,7 +41,7 @@ Java_gc_gctests_nativeGC02_nativeGC02_nativeMethod02
 
         clss = env->GetObjectClass(obj);
         fid = env->GetFieldID(clss, "cl", "Lnsk/share/gc/CircularLinkedList;");
-        if (fid == 0) {
+        if (fid == nullptr) {
                 printf("could not locate field - cl\n");
                 return -1;
         }
@@ -53,7 +53,7 @@ Java_gc_gctests_nativeGC02_nativeGC02_nativeMethod02
 
         cls = env->GetObjectClass(obj);
         mid = env->GetMethodID(cls, "callbackGC", "()V");
-        if (mid == 0) {
+        if (mid == nullptr) {
                 printf("couldnt locate method callbackGC()\n");
                 return -1;
         }
@@ -66,7 +66,7 @@ Java_gc_gctests_nativeGC02_nativeGC02_nativeMethod02
 
         clss = env->GetObjectClass(linked_list);
         mid2 = env->GetMethodID(clss, "getLength", "(Lnsk/share/gc/CircularLinkedList;)I");
-        if (mid2 == 0) {
+        if (mid2 == nullptr) {
                 printf("couldnt locate method getLength(CircularLinkedList)\n");
                 return -1;
         }
diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC03/libnativeGC03.cpp b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC03/libnativeGC03.cpp
index 2c97863db5a..e3f54ec86ec 100644
--- a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC03/libnativeGC03.cpp
+++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC03/libnativeGC03.cpp
@@ -46,7 +46,7 @@ Java_gc_gctests_nativeGC03_nativeGC03_nativeMethod03
 
                 clss = env->GetObjectClass(obj);
                 mid = env->GetMethodID(clss, "fillArray", "()V");
-                if (mid == 0) {
+                if (mid == nullptr) {
                         return;
                 }
                 env->CallVoidMethod(obj, mid);
diff --git a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC05/libnativeGC05.cpp b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC05/libnativeGC05.cpp
index 4bfaeda1f06..a796cf938bb 100644
--- a/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC05/libnativeGC05.cpp
+++ b/test/hotspot/jtreg/vmTestbase/gc/gctests/nativeGC05/libnativeGC05.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,8 +28,8 @@ extern "C" {
 JNIEXPORT void JNICALL
 Java_gc_gctests_nativeGC05_nativeGC05_kickOffRefillers
 (JNIEnv *env, jobject obj, jobject matrix, jobject stack) {
-        jclass matrixClass, stackClass, pairClass = 0;
-        jmethodID stack_pop_mid, stack_empty_mid, matrix_repopulate_mid, pair_geti_mid = 0, pair_getj_mid = 0;
+        jclass matrixClass, stackClass, pairClass = nullptr;
+        jmethodID stack_pop_mid, stack_empty_mid, matrix_repopulate_mid, pair_geti_mid = nullptr, pair_getj_mid = nullptr;
         jobject pair;
         jint i, j;
         jboolean b;
@@ -40,18 +40,18 @@ Java_gc_gctests_nativeGC05_nativeGC05_kickOffRefillers
 
         /* GetMethodID's for the pop() and Repopulate() methods */
         stack_pop_mid  = env->GetMethodID(stackClass, "pop", "()Ljava/lang/Object;");
-        if (stack_pop_mid == 0) {
+        if (stack_pop_mid == nullptr) {
                 printf("could not get a methodID for Stack::pop()\n");
                 return;
         }
         stack_empty_mid = env->GetMethodID(stackClass, "empty", "()Z");
-        if (stack_empty_mid == 0) {
+        if (stack_empty_mid == nullptr) {
                 printf("could not get a methodID for Stack::empty()\n");
                 return;
         }
 
         matrix_repopulate_mid = env->GetMethodID(matrixClass, "repopulate", "(II)V");
-        if (matrix_repopulate_mid == 0) {
+        if (matrix_repopulate_mid == nullptr) {
                 printf("could not get a methodID for Matrix::repopulate(int, int)\n");
                 return;
         }
@@ -62,15 +62,15 @@ Java_gc_gctests_nativeGC05_nativeGC05_kickOffRefillers
                 /** pair = stack.pop() */
                 pair = env->CallObjectMethod(stack, stack_pop_mid);
 
-                if (pairClass == 0) {
+                if (pairClass == nullptr) {
                         pairClass = env->GetObjectClass(pair);
                         pair_geti_mid = env->GetMethodID(pairClass, "getI", "()I");
-                        if (pair_geti_mid == 0) {
+                        if (pair_geti_mid == nullptr) {
                                 printf("could not get a methodID for IndexPair::getI()\n");
                                 return;
                         }
                         pair_getj_mid = env->GetMethodID(pairClass, "getJ", "()I");
-                        if (pair_getj_mid == 0) {
+                        if (pair_getj_mid == nullptr) {
                                 printf("could not get a methodID for IndexPair::getJ()\n");
                                 return;
                         }
diff --git a/test/hotspot/jtreg/vmTestbase/gc/huge/quicklook/largeheap/MemOptions/MemOptionsTest.java b/test/hotspot/jtreg/vmTestbase/gc/huge/quicklook/largeheap/MemOptions/MemOptionsTest.java
index 67e629fddcd..4547bcdbc30 100644
--- a/test/hotspot/jtreg/vmTestbase/gc/huge/quicklook/largeheap/MemOptions/MemOptionsTest.java
+++ b/test/hotspot/jtreg/vmTestbase/gc/huge/quicklook/largeheap/MemOptions/MemOptionsTest.java
@@ -79,10 +79,6 @@ public void test() throws IOException {
         // positive("Initial young generation size at 32-bit range", "-Xmx5G", "-XX:NewSize=4G");
         // positive("Initial young generation size outside 32-bit range", "-Xmx5G", "-XX:NewSize=4G");
 
-        // positive("Initial old generation size within 32-bit range", "-Xmx3G", "-XX:OldSize=2G");
-        // positive("Initial old generation size at 32-bit range", "-Xmx5G", "-XX:OldSize=4G");
-        // positive("Initial old generation size outside 32-bit range", "-Xmx5G", "-XX:OldSize=4G");
-
         if (!failed.isEmpty()) {
             throw new AssertionError(String.format("%d cases failed : %s", failed.size(), failed));
         }
diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java b/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java
index f13dae70c91..244431100f7 100644
--- a/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/gc/HighWaterMarkTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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,7 +24,6 @@
 package metaspace.gc;
 
 import java.util.Arrays;
-import vm.share.VMRuntimeEnvUtils;
 
 /**
  * Test metaspace ergonomic.
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/gc/HeapOOMEException.java b/test/hotspot/jtreg/vmTestbase/metaspace/share/HeapOOMEException.java
similarity index 98%
rename from test/hotspot/jtreg/vmTestbase/vm/share/gc/HeapOOMEException.java
rename to test/hotspot/jtreg/vmTestbase/metaspace/share/HeapOOMEException.java
index 534df351169..493189a58c7 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/gc/HeapOOMEException.java
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/share/HeapOOMEException.java
@@ -20,7 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.gc;
+package metaspace.share;
 
 /**
  * This class is used to distinguish between OOME in metaspace and OOME in heap when triggering class unloading.
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingByFillingMetaspace.java b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingByFillingMetaspace.java
similarity index 98%
rename from test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingByFillingMetaspace.java
rename to test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingByFillingMetaspace.java
index e3f9caf9533..217abc25c96 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingByFillingMetaspace.java
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingByFillingMetaspace.java
@@ -20,7 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.gc;
+package metaspace.share;
 
 import nsk.share.test.ExecutionController;
 import nsk.share.gc.gp.classload.GeneratedClassProducer;
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingHelper.java b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingHelper.java
similarity index 97%
rename from test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingHelper.java
rename to test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingHelper.java
index b6458f5865e..7c9e4bec1a6 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingHelper.java
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingHelper.java
@@ -20,7 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.gc;
+package metaspace.share;
 
 import nsk.share.test.ExecutionController;
 
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingWithWhiteBox.java b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingWithWhiteBox.java
similarity index 98%
rename from test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingWithWhiteBox.java
rename to test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingWithWhiteBox.java
index dfe4bb73acb..678e9551fa7 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/gc/TriggerUnloadingWithWhiteBox.java
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/share/TriggerUnloadingWithWhiteBox.java
@@ -20,7 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.gc;
+package metaspace.share;
 
 
 import jdk.test.whitebox.WhiteBox;
diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java b/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java
index 690f2a67517..ce0dd65c7ee 100644
--- a/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/staticReferences/StaticReferences.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -53,14 +53,14 @@
 import java.util.Map;
 import java.util.Random;
 
-import vm.share.InMemoryJavaCompiler;
+import metaspace.share.TriggerUnloadingHelper;
+import metaspace.share.TriggerUnloadingWithWhiteBox;
 import nsk.share.gc.GCTestBase;
 import nsk.share.test.ExecutionController;
 import nsk.share.test.Stresser;
 import nsk.share.test.TestBase;
 import nsk.share.test.Tests;
-import vm.share.gc.TriggerUnloadingHelper;
-import vm.share.gc.TriggerUnloadingWithWhiteBox;
+import vm.share.InMemoryJavaCompiler;
 
 /**
  * Test checks that static fields will be initialized in new loaded class. Test performs in loop the following routine:
diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java
index 476dceb395d..3d57bfb6ea9 100644
--- a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,13 +28,13 @@
 import java.lang.reflect.Proxy;
 import java.util.List;
 
+import jdk.test.whitebox.WhiteBox;
+import metaspace.share.TriggerUnloadingHelper;
 import metaspace.stressHierarchy.common.classloader.tree.Node;
 import metaspace.stressHierarchy.common.classloader.tree.Tree;
 import metaspace.stressHierarchy.common.exceptions.ClassNotUnloadedException;
 import metaspace.stressHierarchy.common.exceptions.TimeIsOverException;
 import nsk.share.test.ExecutionController;
-import jdk.test.whitebox.WhiteBox;
-import vm.share.gc.TriggerUnloadingHelper;
 
 public class PerformChecksHelper {
 
diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java
index 61a19baf98e..20fcdabb13c 100644
--- a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java
+++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/StressHierarchyBaseClass.java
@@ -24,11 +24,10 @@
 
 import java.net.MalformedURLException;
 
-import vm.share.gc.HeapOOMEException;
-import vm.share.gc.TriggerUnloadingByFillingMetaspace;
-import vm.share.gc.TriggerUnloadingHelper;
-import vm.share.gc.TriggerUnloadingWithWhiteBox;
-
+import metaspace.share.HeapOOMEException;
+import metaspace.share.TriggerUnloadingByFillingMetaspace;
+import metaspace.share.TriggerUnloadingHelper;
+import metaspace.share.TriggerUnloadingWithWhiteBox;
 import metaspace.stressHierarchy.common.classloader.tree.Node;
 import metaspace.stressHierarchy.common.classloader.tree.Tree;
 import metaspace.stressHierarchy.common.exceptions.TimeIsOverException;
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001.java
index 60ae805703b..5af71d569f1 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -89,7 +89,10 @@ public class getvalues001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001/TestDescription.java
index 4fc9630df3c..04ddee42061 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -58,7 +58,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ArrayReference.GetValues.getvalues001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ArrayReference.GetValues.getvalues001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002.java
index 47f4097dae6..d5d44faef48 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -116,7 +116,10 @@ public class getvalues002 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002/TestDescription.java
index 92b567dccf2..5e1e30ae541 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/GetValues/getvalues002/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ArrayReference.GetValues.getvalues002a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ArrayReference.GetValues.getvalues002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001.java
index 36324982533..45acc929bfa 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -85,7 +85,10 @@ public class length001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001/TestDescription.java
index 164d8c8ecab..2f96d7c3a07 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/Length/length001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -57,7 +57,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ArrayReference.Length.length001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ArrayReference.Length.length001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001.java
index 117d66fe24c..12c06d8735d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -92,7 +92,10 @@ public class setvalues001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001/TestDescription.java
index 380ba4549ef..bf252a44d43 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayReference/SetValues/setvalues001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ArrayReference.SetValues.setvalues001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ArrayReference.SetValues.setvalues001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001.java
index c56ccde4c2f..b29a39fb4c5 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -84,7 +84,10 @@ public class newinstance001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001/TestDescription.java
index 7376e32c3cc..66b15f21665 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ArrayType/NewInstance/newinstance001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -55,7 +55,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ArrayType.NewInstance.newinstance001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ArrayType.NewInstance.newinstance001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001.java
index ba21914994d..1c02b225e0b 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -81,7 +81,10 @@ public class visibclasses001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001/TestDescription.java
index b298e05d721..379091615fe 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassLoaderReference/VisibleClasses/visibclasses001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -57,7 +57,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ClassLoaderReference.VisibleClasses.visibclasses001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ClassLoaderReference.VisibleClasses.visibclasses001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001.java
index b894d10c1b0..a23144b50e6 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -45,7 +45,10 @@ public class reflectype001 {
     static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";";
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001/TestDescription.java
index f476b8df0c8..ea86ce80bcb 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassObjectReference/ReflectedType/reflectype001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ClassObjectReference.ReflectedType.reflectype001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ClassObjectReference.ReflectedType.reflectype001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001.java
index d9f5e31b653..c5ab5ed56c8 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -97,7 +97,10 @@ public class invokemeth001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001/TestDescription.java
index 9b97c95b32f..c393e091c56 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/InvokeMethod/invokemeth001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ClassType.InvokeMethod.invokemeth001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ClassType.InvokeMethod.invokemeth001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001.java
index ff23a6420e6..a2323daaf74 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -96,8 +96,11 @@ public class newinst001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001/TestDescription.java
index 6132dbc6a4d..2d9abe94b73 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/NewInstance/newinst001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ClassType.NewInstance.newinst001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ClassType.NewInstance.newinst001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001.java
index 7931560a853..e40906c299a 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -88,7 +88,10 @@ public class setvalues001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001/TestDescription.java
index 24b11421e08..015e3377537 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/SetValues/setvalues001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -66,7 +66,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ClassType.SetValues.setvalues001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ClassType.SetValues.setvalues001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001.java
index 1e46507079e..4aed67d1f7e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -85,7 +85,10 @@ public class superclass001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001/TestDescription.java
index 02082032398..6cd1cd94042 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ClassType/Superclass/superclass001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ClassType.Superclass.superclass001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ClassType.Superclass.superclass001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.java
index 60b926256ad..6518ff5bb06 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -90,8 +90,11 @@ public class breakpoint001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001/TestDescription.java
index f4583fc1015..72c5a23c94f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.BREAKPOINT.breakpoint001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.BREAKPOINT.breakpoint001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java
index 4bb0add7c65..3edb73a609c 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -80,8 +80,11 @@ public class clsprepare001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001/TestDescription.java
index 8690a9d6125..563db722424 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_PREPARE/clsprepare001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.CLASS_PREPARE.clsprepare001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.CLASS_PREPARE.clsprepare001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java
index ba6905a68bd..ccfec8efeb9 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -80,8 +80,11 @@ public class clsunload001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001/TestDescription.java
index 2d323c71931..354b71a085e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/CLASS_UNLOAD/clsunload001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -62,7 +62,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.CLASS_UNLOAD.clsunload001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.CLASS_UNLOAD.clsunload001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001.java
index 0d6c11c40c8..789402dd37a 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -75,8 +75,11 @@ public class composite001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001/TestDescription.java
index 5cf8976cb88..ad91d73534c 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/Composite/composite001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -49,7 +49,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.Composite.composite001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.Composite.composite001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.java
index 2092256ef6c..0fca4cb44f9 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -97,8 +97,11 @@ public class exception001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001/TestDescription.java
index 9524d171c4b..7307c026cf5 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -64,7 +64,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.EXCEPTION.exception001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.EXCEPTION.exception001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java
index c81d901115c..1c6b5f4a931 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -99,8 +99,11 @@ public class fldaccess001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001/TestDescription.java
index d0c835009d6..ff74b0849ee 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_ACCESS/fldaccess001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -63,7 +63,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.FIELD_ACCESS.fldaccess001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.FIELD_ACCESS.fldaccess001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001.java
index 7bcf14c87c3..840b48428e5 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -100,8 +100,11 @@ public class fldmodification001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001/TestDescription.java
index 5055936173d..3901a6eaf8c 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/FIELD_MODIFICATION/fldmodification001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -64,7 +64,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.FIELD_MODIFICATION.fldmodification001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.FIELD_MODIFICATION.fldmodification001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001.java
index 6d75896e2df..b8834e94bcf 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -92,8 +92,11 @@ public class methentry001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001/TestDescription.java
index e41084de628..106002fdf9d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_ENTRY/methentry001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -61,7 +61,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.METHOD_ENTRY.methentry001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.METHOD_ENTRY.methentry001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001.java
index a113161ca32..6da08d6b858 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -92,8 +92,11 @@ public class methexit001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001/TestDescription.java
index bd765e2ea88..e6a74885a13 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/METHOD_EXIT/methexit001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -61,7 +61,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.METHOD_EXIT.methexit001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.METHOD_EXIT.methexit001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001.java
index 25003f018a0..fef8a095908 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -93,8 +93,11 @@ public class singlestep001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001/TestDescription.java
index 7d7afefd446..661189bcf31 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -63,7 +63,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.SINGLE_STEP.singlestep001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.SINGLE_STEP.singlestep001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002.java
index 50e55925d0d..66c9e65df56 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -95,8 +95,11 @@ public class singlestep002 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002/TestDescription.java
index ac11ead1f09..4fe15d10884 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep002/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -63,7 +63,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.SINGLE_STEP.singlestep002a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.SINGLE_STEP.singlestep002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003.java
index ae98242c0ee..47ef6474536 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -95,8 +95,11 @@ public class singlestep003 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003/TestDescription.java
index 00cf70a223d..d3c38bcbeb8 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/SINGLE_STEP/singlestep003/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -63,7 +63,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.SINGLE_STEP.singlestep003a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.SINGLE_STEP.singlestep003
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java
index f5aae7067db..753e5b49480 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -88,8 +88,11 @@ public class thrdeath001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001/TestDescription.java
index 85dd77be7e9..8cd28cb2381 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_DEATH/thrdeath001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -61,7 +61,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.THREAD_DEATH.thrdeath001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.THREAD_DEATH.thrdeath001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001.java
index f525d7d550f..7936fcbf5cb 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -88,8 +88,11 @@ public class thrstart001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001/TestDescription.java
index a4350324849..7345debf525 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/THREAD_START/thrstart001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -61,7 +61,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.THREAD_START.thrstart001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.THREAD_START.thrstart001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001.java
index 771e121d8ce..8a8526bbeb2 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -74,8 +74,11 @@ public class vmdeath001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001/TestDescription.java
index e1f3b1053b4..f40ecc66655 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -53,7 +53,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.VM_DEATH.vmdeath001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.VM_DEATH.vmdeath001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002.java
index 20f96d064d1..6bfb79d2575 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -81,8 +81,11 @@ public class vmdeath002 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002/TestDescription.java
index f0dbd749a32..cee21042bf5 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_DEATH/vmdeath002/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.VM_DEATH.vmdeath002a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.VM_DEATH.vmdeath002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001.java
index 58d77cd8901..eac5ee3efb6 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -74,8 +74,11 @@ public class vmstart001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001/TestDescription.java
index 139db45bef5..b0d6abd6928 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/VM_START/vmstart001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -51,7 +51,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Event.VM_START.vmstart001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Event.VM_START.vmstart001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001.java
index 4973cac34a7..dccddcf8066 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -88,8 +88,11 @@ public class clear001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001/TestDescription.java
index acc4090eb10..cc544397bf2 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Clear/clear001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -58,7 +58,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.EventRequest.Clear.clear001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.EventRequest.Clear.clear001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001.java
index b4cbd4f2072..166334be16a 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -88,8 +88,11 @@ public class clrallbreakp001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001/TestDescription.java
index 49c6d12afa5..bd251fe9c91 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002.java
index c106daa64ff..1a881b075f1 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -82,8 +82,11 @@ public class clrallbreakp002 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002/TestDescription.java
index 981b8fccb5e..53fa51809db 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp002/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -50,7 +50,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp002a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003.java
index 34a69758774..ce7c1f6609f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -88,8 +88,11 @@ public class clrallbreakp003 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003/TestDescription.java
index 15acb91350c..61c2355c1cb 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/ClearAllBreakpoints/clrallbreakp003/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -53,7 +53,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp003a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.EventRequest.ClearAllBreakpoints.clrallbreakp003
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001.java
index 522c6096cdf..55b5d12ee13 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -90,8 +90,11 @@ public class set001 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001/TestDescription.java
index d04dc2f9328..d982e35850d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -59,7 +59,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.EventRequest.Set.set001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.EventRequest.Set.set001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.java
index ae25ddc2fe2..86256e706fc 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -77,8 +77,11 @@ public class set002 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002/TestDescription.java
index efd3b666924..38df090783b 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -61,7 +61,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.EventRequest.Set.set002a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.EventRequest.Set.set002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001.java
index 29a06be58fc..7a597286034 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -93,7 +93,10 @@ public class bytecodes001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001/TestDescription.java
index b522bbedaa4..46efecf437e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/Bytecodes/bytecodes001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -54,7 +54,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Method.Bytecodes.bytecodes001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Method.Bytecodes.bytecodes001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001.java
index c9e558363a2..b01e814af1e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -89,7 +89,10 @@ public class isobsolete001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001/TestDescription.java
index c3b3b3c049d..270f5744bac 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -57,7 +57,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Method.IsObsolete.isobsolete001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Method.IsObsolete.isobsolete001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002.java
index c3266489f92..c06e62be316 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -96,7 +96,10 @@ public class isobsolete002 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002/TestDescription.java
index ce9fc223dae..e5b41793291 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/IsObsolete/isobsolete002/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -72,7 +72,7 @@
  *        nsk.jdwp.Method.IsObsolete.isobsolete002b
  * @run driver nsk.share.ExtraClassesBuilder
  *      newclass
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Method.IsObsolete.isobsolete002
  *      .
  *      -arch=${os.family}-${os.simpleArch}
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001.java
index ebb30638938..cf1bd6eb79a 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -89,7 +89,10 @@ public class linetable001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001/TestDescription.java
index d5dad5cc979..7a53a1b3816 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/LineTable/linetable001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -68,7 +68,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.Method.LineTable.linetable001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Method.LineTable.linetable001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001.java
index 9953dc9c94f..d6a2dcee264 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -119,7 +119,10 @@ public class vartable001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001/TestDescription.java
index f5633b360f3..f08b09e5079 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTable/vartable001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @comment debuggee should be compiled w/ debug info
  * @clean nsk.jdwp.Method.VariableTable.vartable001a
  * @compile -g:lines,source,vars ../vartable001a.java
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Method.VariableTable.vartable001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001.java
index a2e18c4f759..39890990b8d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2024, 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
@@ -136,7 +136,10 @@ public class vartblwithgen001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001/TestDescription.java
index 7741b022618..0227cae87ea 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Method/VariableTableWithGeneric/vartblwithgen001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @comment debuggee should be compiled w/ debug info
  * @clean nsk.jdwp.Method.VariableTableWithGeneric.vartblwithgen001a
  * @compile -g:lines,source,vars ../vartblwithgen001a.java
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.Method.VariableTableWithGeneric.vartblwithgen001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001.java
index 419d944398a..6f11394db53 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -86,7 +86,10 @@ public class disablecol001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001/TestDescription.java
index 9e50200593e..fdcc258523e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/DisableCollection/disablecol001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -54,7 +54,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ObjectReference.DisableCollection.disablecol001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ObjectReference.DisableCollection.disablecol001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001.java
index 2ab8c28e1c4..9172b4413d7 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -86,7 +86,10 @@ public class enablecol001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001/TestDescription.java
index d2dd41472e9..71a849b0c2a 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/EnableCollection/enablecol001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -55,7 +55,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ObjectReference.EnableCollection.enablecol001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ObjectReference.EnableCollection.enablecol001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001.java
index 08668e91afa..9702cb7f9e6 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -99,7 +99,10 @@ public class getvalues001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001/TestDescription.java
index 7ecb552e6c9..8bfbca6d448 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/GetValues/getvalues001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -58,7 +58,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ObjectReference.GetValues.getvalues001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ObjectReference.GetValues.getvalues001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001.java
index 761a5bf19a4..ffc2cc151a9 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -99,7 +99,10 @@ public class invokemeth001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001/TestDescription.java
index 71bfafa7718..3ad6bbf79db 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/InvokeMethod/invokemeth001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -61,7 +61,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ObjectReference.InvokeMethod.invokemeth001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ObjectReference.InvokeMethod.invokemeth001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001.java
index 284765bd25a..a8d61451f9a 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -86,7 +86,10 @@ public class iscollected001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001/TestDescription.java
index fda668d8b32..f6facbb7609 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/IsCollected/iscollected001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -57,7 +57,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ObjectReference.IsCollected.iscollected001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ObjectReference.IsCollected.iscollected001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001.java
index 8834b30e21b..e50dc29b151 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -101,7 +101,10 @@ public class monitorinfo001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001/TestDescription.java
index cf58779b87d..40be209f16f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/MonitorInfo/monitorinfo001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -69,7 +69,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ObjectReference.MonitorInfo.monitorinfo001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ObjectReference.MonitorInfo.monitorinfo001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001.java
index cc5530cf82a..4066c905768 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -86,7 +86,10 @@ public class referencetype001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001/TestDescription.java
index 0e7e8b9bb6b..e5b1413f147 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferenceType/referencetype001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -59,7 +59,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ObjectReference.ReferenceType.referencetype001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ObjectReference.ReferenceType.referencetype001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects001/referringObjects001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects001/referringObjects001.java
index c9ee73fa67c..f578d3be7d4 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects001/referringObjects001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects001/referringObjects001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -95,8 +95,11 @@ protected String getDebugeeClassName() {
         return nsk.jdwp.ObjectReference.ReferringObjects.referringObjects001.referringObjects001a.class.getName();
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects002/referringObjects002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects002/referringObjects002.java
index 4ad6b6ae328..4591bf093ea 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects002/referringObjects002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/ReferringObjects/referringObjects002/referringObjects002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -83,8 +83,11 @@ protected String getDebugeeClassName() {
         return nsk.jdwp.ObjectReference.ReferringObjects.referringObjects002.referringObjects002a.class.getName();
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001.java
index 3d20db7fa7e..d9a7622ea04 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -95,7 +95,10 @@ public class setvalues001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001/TestDescription.java
index e3c08d68b02..e35ea563262 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ObjectReference/SetValues/setvalues001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -68,7 +68,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ObjectReference.SetValues.setvalues001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ObjectReference.SetValues.setvalues001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001.java
index 23b1c3de7ee..0d7961924f9 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -45,7 +45,10 @@ public class classloader001 {
     static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";";
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001/TestDescription.java
index be36b5eccee..6b818c0a408 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassLoader/classloader001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -54,7 +54,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.ClassLoader.classloader001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.ClassLoader.classloader001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001.java
index b86d17d752f..5d74b011111 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -45,7 +45,10 @@ public class classobj001 {
     static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";";
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001/TestDescription.java
index 12baa51bca2..ffa15c1a66d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/ClassObject/classobj001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -54,7 +54,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.ClassObject.classobj001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.ClassObject.classobj001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001.java
index b6f559a5ae0..a4cfd9d9eba 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -61,7 +61,10 @@ public class fields001 {
     static final int FIELD_MODIFIER_FLAGS = JDWP.ModifierFlag.PUBLIC;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001/TestDescription.java
index a337e6b7fb5..7d6b41cc750 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Fields/fields001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.Fields.fields001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.Fields.fields001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001.java
index 24ac7321b9f..5feafc3c2b3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -101,8 +101,11 @@ public class fldwithgeneric001 {
 
     static final int FLDS_NUM = fields.length;
 
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001/TestDescription.java
index c410dabad08..7e9679e10eb 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/FieldsWithGeneric/fldwithgeneric001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -45,7 +45,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.FieldsWithGeneric.fldwithgeneric001t
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.FieldsWithGeneric.fldwithgeneric001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001.java
index cafe1ba1d1a..72c0c679bb8 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -99,7 +99,10 @@ public class getvalues001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001/TestDescription.java
index 6a0ceb754d8..e4c850e28a4 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/GetValues/getvalues001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -57,7 +57,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.GetValues.getvalues001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.GetValues.getvalues001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances001/instances001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances001/instances001.java
index 2312f571822..5a83ed4435b 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances001/instances001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances001/instances001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -89,8 +89,11 @@ protected String getDebugeeClassName() {
         return nsk.jdwp.ReferenceType.Instances.instances001.instances001a.class.getName();
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances002/instances002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances002/instances002.java
index cd90392f3d9..378104a1b74 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances002/instances002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Instances/instances002/instances002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -57,7 +57,7 @@
  *
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.Instances.instances002.instances002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
@@ -82,8 +82,11 @@ protected String getDebugeeClassName() {
         return nsk.jdwp.ReferenceType.Instances.instances002.instances002a.class.getName();
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001.java
index e7e06473d7b..d30d63b272b 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -52,7 +52,10 @@ public class interfaces001 {
     static final long interfaceIDs[] = new long[DECLARED_INTERFACES];
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001/TestDescription.java
index b67ad06b1c3..bfa503d42b3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Interfaces/interfaces001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -58,7 +58,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.Interfaces.interfaces001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.Interfaces.interfaces001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001.java
index 22e656e1f41..247ed13f668 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -63,7 +63,10 @@ public class methods001 {
     static final int METHOD_MODIFIER_FLAGS = JDWP.ModifierFlag.PUBLIC;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001/TestDescription.java
index f24bcd39b84..28a7ad43a60 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Methods/methods001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.Methods.methods001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.Methods.methods001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001.java
index e2e633222b3..d1536035625 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -110,8 +110,11 @@ public class methwithgeneric001 {
 
     static final int CLS_NUM = classes.length;
 
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001/TestDescription.java
index 648349f887e..475b7eedb05 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/MethodsWithGeneric/methwithgeneric001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -45,7 +45,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.MethodsWithGeneric.methwithgeneric001t
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.MethodsWithGeneric.methwithgeneric001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001.java
index 92e4f6f6b7c..7695861df3a 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -48,7 +48,10 @@ public class modifiers001 {
                                                  | JDWP.ModifierFlag.FINAL;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001/TestDescription.java
index fa26934f149..907993049a4 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Modifiers/modifiers001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.Modifiers.modifiers001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.Modifiers.modifiers001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001.java
index 33e4727bfe8..6b4e82dd6b6 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -92,7 +92,10 @@ public class nestedtypes001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001/TestDescription.java
index 4436bcccbb6..5da686e4a43 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/NestedTypes/nestedtypes001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -61,7 +61,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.NestedTypes.nestedtypes001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.NestedTypes.nestedtypes001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001.java
index 641079ba7fa..ddba04e292a 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -45,7 +45,10 @@ public class signature001 {
     static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";";
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001/TestDescription.java
index 27628d13e61..49ac330b518 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Signature/signature001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -52,7 +52,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.Signature.signature001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.Signature.signature001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001.java
index c6bbcd437f8..8f819a050b9 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -81,8 +81,11 @@ public class sigwithgeneric001 {
 
     static final int CLS_NUM = classes.length;
 
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001/TestDescription.java
index 9dc7275de7d..9928a55505e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SignatureWithGeneric/sigwithgeneric001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -44,7 +44,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.SignatureWithGeneric.sigwithgeneric001t
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.SignatureWithGeneric.sigwithgeneric001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001.java
index af9d7a26021..0735246d239 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -56,7 +56,10 @@ public class srcdebugext001 {
     private Transport transport;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001/TestDescription.java
index c614604e55d..f3fbe8830c4 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceDebugExtension/srcdebugext001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -39,7 +39,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.SourceDebugExtension.srcdebugext001t
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.SourceDebugExtension.srcdebugext001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001.java
index fb9d8948ef5..6ca69c009b2 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +46,10 @@ public class srcfile001 {
     static final String TESTED_CLASS_SRCFILENAME = "srcfile001a.java";
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001/TestDescription.java
index 09608b3757d..ff56e5c99cc 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/SourceFile/srcfile001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -52,7 +52,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.SourceFile.srcfile001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.SourceFile.srcfile001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001.java
index f0e357b4840..2aa64d3ed4b 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -48,7 +48,10 @@ public class status001 {
                                             | JDWP.ClassStatus.INITIALIZED;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001/TestDescription.java
index aefbb989bf9..5efd81a3896 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ReferenceType/Status/status001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -54,7 +54,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ReferenceType.Status.status001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ReferenceType.Status.status001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001.java
index 656ba90a250..b9f7a1f0ef3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -102,7 +102,10 @@ public class getvalues001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001/TestDescription.java
index 09ee0ba021a..5d862a12ec3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/GetValues/getvalues001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -64,7 +64,7 @@
  * @comment debuggee should be compiled w/ debug info
  * @clean nsk.jdwp.StackFrame.GetValues.getvalues001a
  * @compile -g:lines,source,vars ../getvalues001a.java
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.StackFrame.GetValues.getvalues001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001.java
index a896d567eb5..b4ad931f044 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -93,7 +93,10 @@ public class popframes001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001/TestDescription.java
index 2fd126b9fbb..902cdda31dc 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/PopFrames/popframes001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -60,7 +60,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.StackFrame.PopFrames.popframes001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.StackFrame.PopFrames.popframes001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001.java
index 58b9c26fae3..7e7d44ff968 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -109,7 +109,10 @@ public class setvalues001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001/TestDescription.java
index 96302cd9592..fec909b4092 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/SetValues/setvalues001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -75,7 +75,7 @@
  * @comment debuggee should be compiled w/ debug info
  * @clean nsk.jdwp.StackFrame.SetValues.setvalues001a
  * @compile -g:lines,source,vars ../setvalues001a.java
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.StackFrame.SetValues.setvalues001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001.java
index 90ab9f6e06b..d8302f07c7d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -87,7 +87,10 @@ public class thisobject001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001/TestDescription.java
index 9216e598b04..7d00be7f307 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StackFrame/ThisObject/thisobject001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -59,7 +59,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.StackFrame.ThisObject.thisobject001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.StackFrame.ThisObject.thisobject001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001.java
index 6a218281473..b07413fae93 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class value001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.StringReference.Value;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001/TestDescription.java
index ff107802db0..7380eed448d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/StringReference/Value/value001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -52,7 +52,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.StringReference.Value.value001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.StringReference.Value.value001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001.java
index 5bcf5132863..24e5d1a48d6 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class children001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.ThreadGroupReference.Children;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001/TestDescription.java
index 679af7f78c7..b77233495fd 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Children/children001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -49,7 +49,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadGroupReference.Children.children001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadGroupReference.Children.children001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001.java
index abb7ed4a59e..c33780bfba0 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class name001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.ThreadGroupReference.Name;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001/TestDescription.java
index 14218e86942..00304ac2b1d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Name/name001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -49,7 +49,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadGroupReference.Name.name001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadGroupReference.Name.name001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001.java
index bdcdbc1dd2d..8ebb47b1aea 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class parent001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.ThreadGroupReference.Parent;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001/TestDescription.java
index 4a2ff8684ac..48aeb6e47d2 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadGroupReference/Parent/parent001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -52,7 +52,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadGroupReference.Parent.parent001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadGroupReference.Parent.parent001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001.java
index 3b8219e63b7..9d74ebcc081 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -92,7 +92,10 @@ public class curcontmonitor001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001/TestDescription.java
index 298363ade01..126310353c2 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/CurrentContendedMonitor/curcontmonitor001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -63,7 +63,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.CurrentContendedMonitor.curcontmonitor001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.CurrentContendedMonitor.curcontmonitor001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java
index 8453e54e2c1..e7dce1525a0 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn001/forceEarlyReturn001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -74,7 +74,7 @@
  *
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.ForceEarlyReturn.forceEarlyReturn001.forceEarlyReturn001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
@@ -123,8 +123,11 @@ protected String getDebugeeClassName() {
         return "nsk.jdwp.ThreadReference.ForceEarlyReturn.forceEarlyReturn001.forceEarlyReturn001a";
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn002/forceEarlyReturn002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn002/forceEarlyReturn002.java
index e66da807669..2cb8de8cfa7 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn002/forceEarlyReturn002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ForceEarlyReturn/forceEarlyReturn002/forceEarlyReturn002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -95,8 +95,11 @@ protected String getDebugeeClassName() {
         return "nsk.jdwp.ThreadReference.ForceEarlyReturn.forceEarlyReturn002.forceEarlyReturn002a";
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001.java
index 0a6770fe338..5bab037024d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -90,7 +90,10 @@ public class framecnt001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001/TestDescription.java
index 16adec92f82..77063a5ce2f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/FrameCount/framecnt001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -57,7 +57,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.FrameCount.framecnt001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.FrameCount.framecnt001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001.java
index 42ab3aa776e..0a5028c4a65 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -95,7 +95,10 @@ public class frames001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001/TestDescription.java
index d742fb39d0e..b8dad9a09d7 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Frames/frames001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -62,7 +62,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.Frames.frames001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.Frames.frames001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001.java
index 722543cf8e1..f0c2914dffc 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -90,7 +90,10 @@ public class interrupt001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001/TestDescription.java
index 236ff3140d5..b6284ec0a50 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Interrupt/interrupt001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -66,7 +66,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.Interrupt.interrupt001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.Interrupt.interrupt001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001.java
index 5793eb8dc67..4633c6f1185 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -87,7 +87,10 @@ public class name001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001/TestDescription.java
index afc50298c1c..ab49aa26e14 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Name/name001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.Name.name001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.Name.name001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001.java
index 75f1dc408e6..c9ba5bcc955 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -98,7 +98,10 @@ public class ownmonitors001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001/TestDescription.java
index 84c7f627e6d..a929ce527f5 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitors/ownmonitors001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -62,7 +62,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.OwnedMonitors.ownmonitors001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.OwnedMonitors.ownmonitors001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo001/ownedMonitorsStackDepthInfo001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo001/ownedMonitorsStackDepthInfo001.java
index f178c88ae14..3b250989a43 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo001/ownedMonitorsStackDepthInfo001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo001/ownedMonitorsStackDepthInfo001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -87,8 +87,11 @@ protected String getDebugeeClassName() {
         return nsk.jdwp.ThreadReference.OwnedMonitorsStackDepthInfo.ownedMonitorsStackDepthInfo001.ownedMonitorsStackDepthInfo001a.class.getName();
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo002/ownedMonitorsStackDepthInfo002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo002/ownedMonitorsStackDepthInfo002.java
index cbc5fb63a23..140b249de9c 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo002/ownedMonitorsStackDepthInfo002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/OwnedMonitorsStackDepthInfo/ownedMonitorsStackDepthInfo002/ownedMonitorsStackDepthInfo002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -50,7 +50,7 @@
  *
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.OwnedMonitorsStackDepthInfo.ownedMonitorsStackDepthInfo002.ownedMonitorsStackDepthInfo002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
@@ -77,8 +77,11 @@ protected String getDebugeeClassName() {
         return AbstractJDWPDebuggee.class.getName();
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001.java
index 94697452200..97e270b32ec 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -87,7 +87,10 @@ public class resume001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001/TestDescription.java
index e5eb1c510f1..12af9f76939 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Resume/resume001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -59,7 +59,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.Resume.resume001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.Resume.resume001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001.java
index b7c708570f5..f41e3e919a5 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -87,7 +87,10 @@ public class status001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001/TestDescription.java
index 14ff0247143..5ae025526ac 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Status/status001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.Status.status001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.Status.status001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001.java
index f89d64ae747..416b3254e0e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -91,7 +91,10 @@ public class stop001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001/TestDescription.java
index 9229392142b..a9bcab6ef3e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Stop/stop001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -59,7 +59,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.Stop.stop001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.Stop.stop001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001.java
index 9f6ed3db961..0418fe080d6 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -87,7 +87,10 @@ public class suspend001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001/TestDescription.java
index d1477e47749..1c4bcf62e52 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/Suspend/suspend001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -58,7 +58,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.Suspend.suspend001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.Suspend.suspend001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001.java
index cbfe330774e..cbdff74e9cc 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -90,7 +90,10 @@ public class suspendcnt001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001/TestDescription.java
index 39e5469173a..188b5c01ec1 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/SuspendCount/suspendcnt001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -58,7 +58,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.SuspendCount.suspendcnt001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.SuspendCount.suspendcnt001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001.java
index c58491cb3d4..eb66314ebda 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class threadgroup001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.ThreadReference.ThreadGroup;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001/TestDescription.java
index f9b503a82fe..0aa449e9239 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/ThreadReference/ThreadGroup/threadgroup001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -58,7 +58,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.ThreadReference.ThreadGroup.threadgroup001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.ThreadReference.ThreadGroup.threadgroup001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001.java
index 687a56e69fb..292b2d8eb53 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -44,7 +44,10 @@ public class allclasses001 {
     static final String TESTED_CLASS_NAME = DEBUGEE_CLASS_NAME;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001/TestDescription.java
index 4f11e1d91bd..85a45c798e6 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClasses/allclasses001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -49,7 +49,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.AllClasses.allclasses001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.AllClasses.allclasses001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001.java
index c5806ce7b54..aee8b353368 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -87,8 +87,11 @@ public class allclswithgeneric001 {
 
     private Log log;
 
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001/TestDescription.java
index 980bdb98c89..8c251a0ca4b 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllClassesWithGeneric/allclswithgeneric001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -45,7 +45,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.AllClassesWithGeneric.allclswithgeneric001t
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.AllClassesWithGeneric.allclswithgeneric001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001.java
index e3e291fcdcd..5fa23569fc4 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -44,7 +44,10 @@ public class allthreads001 {
     static final String TESTED_CLASS_NAME = DEBUGEE_CLASS_NAME;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001/TestDescription.java
index 782045881ac..6822e5e7b32 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/AllThreads/allthreads001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -47,7 +47,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.AllThreads.allthreads001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.AllThreads.allthreads001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001.java
index 5e05f6406f6..e5b11b3be96 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class capabilities001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Capabilities;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001/TestDescription.java
index bba5b1c3015..30ed332c53e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Capabilities/capabilities001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -47,7 +47,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.Capabilities.capabilities001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.Capabilities.capabilities001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001.java
index 00ffc505034..1fe5df86db8 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class capabilitiesnew001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.CapabilitiesNew;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001/TestDescription.java
index 4d4c69cde63..aa0479c819b 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CapabilitiesNew/capabilitiesnew001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -49,7 +49,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.CapabilitiesNew.capabilitiesnew001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.CapabilitiesNew.capabilitiesnew001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001.java
index da06f738f93..1882ce81415 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class classpaths001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.ClassPaths;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001/TestDescription.java
index 4f7d685117c..41e53912f20 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassPaths/classpaths001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -40,7 +40,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.ClassPaths.classpaths001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.ClassPaths.classpaths001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001.java
index 03fc0c49dca..c319372fc90 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -45,7 +45,10 @@ public class classbysig001 {
 //    static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME + ";";
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001/TestDescription.java
index 14f40d16e78..2127c0d3d87 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ClassesBySignature/classbysig001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -47,7 +47,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.ClassesBySignature.classbysig001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.ClassesBySignature.classbysig001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001.java
index 5e0a4b8427e..aaa964b4fa3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class createstr001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.CreateString;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001/TestDescription.java
index 54789071b51..27bab252c02 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/CreateString/createstr001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -43,7 +43,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.CreateString.createstr001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.CreateString.createstr001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001.java
index e115fa9e648..89b0f608ff7 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class dispose001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Dispose;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001/TestDescription.java
index 44b64f614f3..2e3e7d2afcd 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Dispose/dispose001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -51,7 +51,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.Dispose.dispose001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.Dispose.dispose001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001.java
index 901b69de37a..9c2a0e53478 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -93,7 +93,10 @@ public class disposeobj001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001/TestDescription.java
index 3782fc59b3f..5fc151bf339 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/DisposeObjects/disposeobj001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -55,7 +55,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.DisposeObjects.disposeobj001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.DisposeObjects.disposeobj001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001.java
index b9313fc838f..f7fd27b03d5 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class exit001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Exit;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001/TestDescription.java
index c1fb69e2228..772184d294e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Exit/exit001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -53,7 +53,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.Exit.exit001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.Exit.exit001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001.java
index c0b28b905cc..890b1be77bc 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -78,7 +78,10 @@ public class holdevents001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001/TestDescription.java
index c562dc2e2a6..4f096ee2f49 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -52,7 +52,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.HoldEvents.holdevents001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.HoldEvents.holdevents001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents002.java
index 2995beb7979..c6e0cc4b014 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/HoldEvents/holdevents002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -87,8 +87,11 @@ public class holdevents002 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java
index 49dbbcd1705..863160e6a1f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class idsizes001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.IDSizes;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001/TestDescription.java
index 0dcb07c803b..bf0d6db0f88 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/IDSizes/idsizes001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -40,7 +40,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.IDSizes.idsizes001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.IDSizes.idsizes001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/InstanceCounts/instanceCounts001/instanceCounts001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/InstanceCounts/instanceCounts001/instanceCounts001.java
index e25d2cc3189..dc21d1bc9d3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/InstanceCounts/instanceCounts001/instanceCounts001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/InstanceCounts/instanceCounts001/instanceCounts001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -91,8 +91,11 @@ protected String getDebugeeClassName() {
         return "nsk.jdwp.VirtualMachine.InstanceCounts.instanceCounts001.instanceCounts001a";
     }
 
-    public static void main(String[] argv) {
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String[] argv, PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001.java
index 37cc65ff94e..bc620c8b59c 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -102,7 +102,10 @@ public class redefinecls001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001/TestDescription.java
index 5ea557b5164..7707821bc79 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/RedefineClasses/redefinecls001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -74,7 +74,7 @@
  *        nsk.jdwp.VirtualMachine.RedefineClasses.redefinecls001b
  * @run driver nsk.share.ExtraClassesBuilder
  *      newclass
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.RedefineClasses.redefinecls001
  *      .
  *      -arch=${os.family}-${os.simpleArch}
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001.java
index 95bafeb1aff..ddca99b03d3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -78,7 +78,10 @@ public class releaseevents001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001/TestDescription.java
index 589d061373d..8cbb7a6e15f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.ReleaseEvents.releaseevents001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.ReleaseEvents.releaseevents001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.java
index 64b6ce1547b..ff278aabcf3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -87,8 +87,11 @@ public class releaseevents002 {
     /**
      * Start test from command line.
      */
-    public static void main(String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002/TestDescription.java
index cb6760f9787..1c94d9d7587 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -56,7 +56,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.ReleaseEvents.releaseevents002a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.ReleaseEvents.releaseevents002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001.java
index ed427439edc..cb602d17ba0 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class resume001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Resume;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001/TestDescription.java
index 14fcd815f28..90b6db41be0 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Resume/resume001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -51,7 +51,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.Resume.resume001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.Resume.resume001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001.java
index 51e8a03487b..b90423e6219 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -85,7 +85,10 @@ public class setdefstrat001 {
      * Start test from command line.
      */
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001/TestDescription.java
index 94828c43d80..43f0a403798 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/SetDefaultStratum/setdefstrat001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -54,7 +54,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.SetDefaultStratum.setdefstrat001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.SetDefaultStratum.setdefstrat001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001.java
index e04cb45580c..daaf39cc5fa 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class threadgroups001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.TopLevelThreadGroups;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001/TestDescription.java
index ecd37d43e84..ac51bc95011 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/TopLevelThreadGroups/threadgroups001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -40,7 +40,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.TopLevelThreadGroups.threadgroups001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.TopLevelThreadGroups.threadgroups001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001.java
index b89aa3e0ec0..66575fee4f8 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class version001 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Version;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001/TestDescription.java
index c26171f0dec..cd1d7123a34 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -39,7 +39,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.Version.version001a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.Version.version001
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002.java
index 5907a8159ff..8060922340c 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +42,10 @@ public class version002 {
     static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.Version;
 
     public static void main (String argv[]) {
-        System.exit(run(argv,System.out) + JCK_STATUS_BASE);
+        int result = run(argv, System.out);
+        if (result != 0) {
+            throw new RuntimeException("Test failed");
+        }
     }
 
     public static int run(String argv[], PrintStream out) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002/TestDescription.java
index cfc6ed266c1..d09e4f5176d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/Version/version002/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -40,7 +40,7 @@
  * @library /vmTestbase /test/hotspot/jtreg/vmTestbase
  *          /test/lib
  * @build nsk.jdwp.VirtualMachine.Version.version002a
- * @run main/othervm
+ * @run driver
  *      nsk.jdwp.VirtualMachine.Version.version002
  *      -arch=${os.family}-${os.simpleArch}
  *      -verbose
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007/getclfld007.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007/getclfld007.cpp
index 3cd33384330..89a62346ca9 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007/getclfld007.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007/getclfld007.cpp
@@ -86,7 +86,7 @@ Java_nsk_jvmti_GetClassFields_getclfld007_check(JNIEnv *env, jclass cls, jclass
 
     if (jvmti == nullptr) {
         printf("JVMTI client was not properly loaded!\n");
-        fflush(0);
+        fflush(nullptr);
         result = STATUS_FAILED;
         return;
     }
@@ -98,7 +98,7 @@ Java_nsk_jvmti_GetClassFields_getclfld007_check(JNIEnv *env, jclass cls, jclass
     if (err != JVMTI_ERROR_NONE) {
         printf("GetClassFields unexpected error: %s (%d)\n",
                TranslateError(err), err);
-        fflush(0);
+        fflush(nullptr);
         result = STATUS_FAILED;
         return;
     }
@@ -132,7 +132,7 @@ Java_nsk_jvmti_GetClassFields_getclfld007_check(JNIEnv *env, jclass cls, jclass
         jvmti->Deallocate((unsigned char *)name);
         jvmti->Deallocate((unsigned char *)sig);
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 JNIEXPORT int JNICALL
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java
index b2af4412947..de99ad3686e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, 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
@@ -48,3 +48,10 @@
  * @run main/othervm/native -agentlib:setfldw001 nsk.jvmti.SetFieldAccessWatch.setfldw001
  */
 
+/*
+ * @test id=logging
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run main/othervm/native -agentlib:setfldw001 -XX:TraceJVMTI=ec+,+ioe,+s -Xlog:jvmti=trace:file=vm.%p.log nsk.jvmti.SetFieldAccessWatch.setfldw001
+ */
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp
index 57286ce78a0..67d92df6dd2 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldAccessWatch/setfldw001/setfldw001.cpp
@@ -26,6 +26,7 @@
 #include <ctype.h>
 #include "jvmti.h"
 #include "agent_common.hpp"
+#include "jvmti_common.hpp"
 #include "JVMTITools.hpp"
 
 extern "C" {
@@ -114,6 +115,14 @@ void JNICALL FieldAccess(jvmtiEnv *jvmti_env, JNIEnv *env,
     }
     fld_ind = (int)(fld_name[len - 1] - '0'); /* last digit is index in the array */
     fields[fld_ind].thrown_fid = field;
+
+    if (field == nullptr) {
+      fatal(env, "null field ID in FieldModification event.");
+    }
+
+    LOG("Event: (Field %d) field ID expected: 0x%p, got: 0x%p\n",
+        fld_ind, fields[fld_ind].fid, field);
+
     jvmti_env->Deallocate((unsigned char*) fld_name);
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java
index 1decdae357d..d0cbdc288b4 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/TestDescription.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, 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
@@ -48,3 +48,10 @@
  * @run main/othervm/native -agentlib:setfmodw001 nsk.jvmti.SetFieldModificationWatch.setfmodw001
  */
 
+/*
+ * @test id=logging
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run main/othervm/native -agentlib:setfmodw001 -XX:TraceJVMTI=ec+,+ioe,+s -Xlog:jvmti=trace:file=vm.%p.log nsk.jvmti.SetFieldModificationWatch.setfmodw001
+ */
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/setfmodw001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/setfmodw001.cpp
index 28851bc6838..4e41aa285e3 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/setfmodw001.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001/setfmodw001.cpp
@@ -26,6 +26,7 @@
 #include <ctype.h>
 #include "jvmti.h"
 #include "agent_common.hpp"
+#include "jvmti_common.hpp"
 #include "JVMTITools.hpp"
 
 extern "C" {
@@ -108,6 +109,13 @@ void JNICALL FieldModification(jvmtiEnv *jvmti_env, JNIEnv *env,
     }
     fld_ind = (int)(fld_name[len - 1] - '0'); /* last digit is index in the array */
     fields[fld_ind].thrown_fid = field;
+
+    if (field == nullptr) {
+      fatal(env, "null field ID in FieldModification event.");
+    }
+    LOG("Event: (Field %d) field ID expected: 0x%p, got: 0x%p\n",
+        fld_ind, fields[fld_ind].fid, field);
+
     jvmti_env->Deallocate((unsigned char*) fld_name);
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t004/hs203t004.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t004/hs203t004.java
index a694698e2a3..f9f1aa8a270 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t004/hs203t004.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS203/hs203t004/hs203t004.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -56,8 +56,6 @@
 
 package nsk.jvmti.scenarios.hotswap.HS203.hs203t004;
 
-import vm.share.VMRuntimeEnvUtils;
-import nsk.share.Consts;
 import nsk.share.jvmti.RedefineAgent;
 
 public class hs203t004 extends RedefineAgent {
@@ -68,13 +66,6 @@ public hs203t004(String[] arg) {
 
     public static void main(String[] arg) {
         arg = nsk.share.jvmti.JVMTITest.commonInit(arg);
-
-        if (!VMRuntimeEnvUtils.isJITEnabled()) {
-            System.out.println("WARNING: test isn't valid if JIT compilation is disabled");
-            System.out.println("Exiting with 'PASSED' status");
-            System.exit(Consts.JCK_STATUS_BASE + Consts.TEST_PASSED);
-        }
-
         hs203t004 hsCase = new hs203t004(arg);
         System.exit(hsCase.runAgent());
     }
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref001/followref001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref001/followref001.cpp
index ff431aa2203..b33128b4916 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref001/followref001.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref001/followref001.cpp
@@ -137,14 +137,14 @@ static bool initObjectDescList(jvmtiEnv*    jvmti,
     *objectsCount = 1 + 2 * chainLength;
 
     printf("Allocate memory for objects list: %d objects\n", *objectsCount);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JVMTI_VERIFY(jvmti->Allocate((*objectsCount * sizeof(ObjectDesc)),
                                           (unsigned char**) objectDescList))) {
         nsk_jvmti_setFailStatus();
         return false;
     }
     printf("  ... allocated array: 0x%p\n", (void*)objectDescList);
-    fflush(0);
+    fflush(nullptr);
 
     {
         int k;
@@ -179,7 +179,7 @@ static bool getAndTagClasses(jvmtiEnv*    jvmti,
     }
     printf("\nFound debugee class: 0x%p\n  %s\n",
            (void*) *debugeeClass, DEBUGEE_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JNI_VERIFY(jni, (*rootObjectClass =
             jni->FindClass(ROOT_OBJECT_CLASS_NAME)) != nullptr)) {
@@ -194,7 +194,7 @@ static bool getAndTagClasses(jvmtiEnv*    jvmti,
     printf("\nFound root object class: 0x%p, tag=%ld\n  %s\n",
            (void*) *rootObjectClass,(long) ROOT_CLASS_TAG,
            ROOT_OBJECT_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
 
 
     if (!NSK_JNI_VERIFY(jni, (*chainObjectClass =
@@ -209,7 +209,7 @@ static bool getAndTagClasses(jvmtiEnv*    jvmti,
     printf("\nFound chain object class: 0x%p, tag=%ld\n  %s\n",
            (void*) *chainObjectClass, (long) CHAIN_CLASS_TAG,
            CHAIN_OBJECT_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
 
      return true;
 } /* getAndTagClasses */
@@ -234,7 +234,7 @@ static bool getFieldsAndObjects(jvmtiEnv*  jvmti,
     }
     printf("\nFound fieldID: 0x%p - \'%s\' static field in debugee class\n",
            (void*) rootObjectField, OBJECT_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JNI_VERIFY(jni, (*reachableChainField =
             jni->GetFieldID(rootObjectClass, REACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
@@ -243,7 +243,7 @@ static bool getFieldsAndObjects(jvmtiEnv*  jvmti,
     }
     printf("\nFound fieldID: 0x%p - \'%s\' field in root object class\n",
            (void*) reachableChainField, REACHABLE_CHAIN_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JNI_VERIFY(jni, (*unreachableChainField =
             jni->GetFieldID(rootObjectClass, UNREACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
@@ -253,7 +253,7 @@ static bool getFieldsAndObjects(jvmtiEnv*  jvmti,
 
     printf("\nFound fieldID: 0x%p - \'%s\' field in root object class\n",
            (void*) unreachableChainField, UNREACHABLE_CHAIN_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JNI_VERIFY(jni, (*nextField =
             jni->GetFieldID(chainObjectClass, NEXT_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
@@ -262,7 +262,7 @@ static bool getFieldsAndObjects(jvmtiEnv*  jvmti,
     }
     printf("\nFound fieldID: 0x%p - \'%s\' field in chain object class\n",
            (void*) nextField, NEXT_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JNI_VERIFY(jni, (*rootObjectPtr =
             jni->GetStaticObjectField(debugeeClass, rootObjectField)) != nullptr)) {
@@ -270,14 +270,14 @@ static bool getFieldsAndObjects(jvmtiEnv*  jvmti,
         return false;
     }
     printf("\nFound root object: 0x%p\n", (void*) *rootObjectPtr);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JNI_VERIFY(jni, (*rootObjectPtr = jni->NewGlobalRef(*rootObjectPtr)) != nullptr)) {
         nsk_jvmti_setFailStatus();
         return false;
     }
     printf("Created root object global ref: 0x%p\n", (void*)*rootObjectPtr);
-    fflush(0);
+    fflush(nullptr);
 
      return true;
 } /* getFieldsAndObjects */
@@ -318,7 +318,7 @@ static bool getAndTagChainObjects(
         nsk_jvmti_setFailStatus();
     }
     printf("        tag=%-5ld object=0x%p\n", (long)objTag, (void*)nextObj);
-    fflush(0);
+    fflush(nullptr);
 
     /* To continue traversing objects in the chain */
     if (!getAndTagChainObjects(jvmti,
@@ -394,7 +394,7 @@ static int getAndTagTestedObjects(
            (long) ROOT_OBJECT_TAG, (void*) *rootObjectPtr);
 
     printf("    reachable objects chain: %d objects\n", chainLength);
-    fflush(0);
+    fflush(nullptr);
 
     if (!getAndTagChainObjects(jvmti,
                                jni,
@@ -453,7 +453,7 @@ static bool checkTestedObjects(jvmtiEnv*  jvmti,
     }
 
     printf("\nReachable objects:\n");
-    fflush(0);
+    fflush(nullptr);
     for (i = 0; i < chainLength; i++) {
         idx = i + 1;
         printf("Reachable object:\n"
@@ -488,7 +488,7 @@ static bool checkTestedObjects(jvmtiEnv*  jvmti,
             NSK_COMPLAIN0("Unreachable object was iterated\n");
             nsk_jvmti_setFailStatus();
         }
-        fflush(0);
+        fflush(nullptr);
     }
 
     return true;
@@ -514,7 +514,7 @@ static void releaseTestedObjects(jvmtiEnv*   jvmti,
         }
     }
 
-    fflush(0);
+    fflush(nullptr);
 } /* releaseTestedObjects */
 
 
@@ -542,7 +542,7 @@ jint JNICALL heapReferenceCallback(
                           /* ss45998: class_tag=>referrence_class_tag */
     printf("   size: %" LL "d, tag_ptr: 0x%p, referrer_tag_ptr: 0x%p, length: %-d\n",
                size,         tag_ptr,       referrer_tag_ptr,       length);
-    fflush(0);
+    fflush(nullptr);
 
     if (((uintptr_t) tag_ptr & FULL_32_BIT_MASK) == FULL_32_BIT_MASK) {
         NSK_COMPLAIN1("wrong tag_ptr passed to "
@@ -567,7 +567,7 @@ jint JNICALL heapReferenceCallback(
     printf("   class_tag=%" LL "d, tag=%" LL "d, size=%" LL "d,"
            " ref_tag=%" LL "d, referrer_index=%d\n\n",
                class_tag, tag, size, ref_tag, referrer_index);
-    fflush(0);
+    fflush(nullptr);
 
     if (length != -1) {
         NSK_COMPLAIN1("wrong length passed to heapReferenceCallback: "
@@ -647,7 +647,7 @@ jint JNICALL heapReferenceCallback(
         case JVMTI_HEAP_REFERENCE_OTHER: {
             NSK_COMPLAIN1("This reference kind was not expected: %s\n",
                            ref_kind_str[reference_kind]);
-            fflush(0);
+            fflush(nullptr);
             nsk_jvmti_setFailStatus();
             return 0;
         }
@@ -674,7 +674,7 @@ jint JNICALL primitiveFieldCallback(
                (long) class_tag,
                (long) DEREF(tag_ptr),
                (int) value_type);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 } /* primitiveFieldCallback */
 
@@ -694,7 +694,7 @@ jint JNICALL arrayPrimitiveValueCallback(
            (long) DEREF(tag_ptr),
            (int) element_count,
            (int) element_type);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 } /* arrayPrimitiveValueCallback */
 
@@ -711,7 +711,7 @@ jint JNICALL stringPrimitiveValueCallback(
            (long) class_tag,
            (long) DEREF(tag_ptr),
            (int) value_length);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 } /* stringPrimitiveValueCallback */
 
@@ -725,14 +725,14 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     jobject rootObject = nullptr;
 
     printf("Wait for tested objects created\n");
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout))) {
         return;
     }
 
 
     printf(">>> Obtain and tag tested objects from debugee class\n");
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_VERIFY(getAndTagTestedObjects(jvmti,
                                            jni,
@@ -745,7 +745,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Let debugee to clean links to unreachable objects\n");
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_VERIFY(nsk_jvmti_resumeSync())) {
         return;
@@ -755,7 +755,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Start iteration from root tested object: 0x%p\n\n", rootObject);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JVMTI_VERIFY(jvmti->FollowReferences((jint)   0,    /* heap_filter    */
                                                   (jclass) nullptr, /* class          */
@@ -767,19 +767,19 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Check if reachable objects were iterated:\n");
-    fflush(0);
+    fflush(nullptr);
 
     if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) {
         nsk_jvmti_setFailStatus();
     }
 
     printf(">>> Clean used data\n");
-    fflush(0);
+    fflush(nullptr);
 
     releaseTestedObjects(jvmti, jni, chainLength, objectDescList, rootObject);
 
     printf(">>> Let debugee to finish\n");
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_VERIFY(nsk_jvmti_resumeSync())) {
         return;
     }
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref002/followref002.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref002/followref002.cpp
index 6366b430776..9ea3a5d0d01 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref002/followref002.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref002/followref002.cpp
@@ -131,7 +131,7 @@ static int getAndTagChainObjects(
         nsk_jvmti_setFailStatus();
     }
     printf("        tag=%-5ld object=0x%p\n", (long)objTag, (void*)obj);
-    fflush(0);
+    fflush(nullptr);
     if (!getAndTagChainObjects(jvmti, jni, obj,
                                nextField,
                                nextFieldName,
@@ -170,14 +170,14 @@ static int getAndTagTestedObjects(
     *objectsCount = 1 + 2 * chainLength;
 
     printf("Allocate memory for objects list: %d objects\n", *objectsCount);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JVMTI_VERIFY(jvmti->Allocate((*objectsCount * sizeof(ObjectDesc)),
                                           (unsigned char**)objectDescList))) {
         nsk_jvmti_setFailStatus();
         return NSK_FALSE;
     }
     printf("  ... allocated array: 0x%p\n", (void*)objectDescList);
-    fflush(0);
+    fflush(nullptr);
 
     {
         int k;
@@ -191,7 +191,7 @@ static int getAndTagTestedObjects(
     (*objectDescList)[0].exp_class_tag = rootClassTag;
 
     printf("Find debugee class: %s\n", DEBUGEE_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (debugeeClass = jni->FindClass(DEBUGEE_CLASS_NAME)) != nullptr)) {
         nsk_jvmti_setFailStatus();
         return NSK_FALSE;
@@ -199,7 +199,7 @@ static int getAndTagTestedObjects(
     printf("  ... found class: 0x%p\n", (void*)debugeeClass);
 
     printf("Find root object class: %s\n", ROOT_OBJECT_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (rootObjectClass = jni->FindClass(ROOT_OBJECT_CLASS_NAME)) != nullptr)) {
         nsk_jvmti_setFailStatus();
         return NSK_FALSE;
@@ -212,7 +212,7 @@ static int getAndTagTestedObjects(
     printf("        tag=%-5ld rootClass=0x%p\n", (long)rootClassTag, (void*)rootObjectClass);
 
     printf("Find chain object class: %s\n", CHAIN_OBJECT_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (chainObjectClass =
             jni->FindClass(CHAIN_OBJECT_CLASS_NAME)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -226,7 +226,7 @@ static int getAndTagTestedObjects(
     printf("        tag=%-5ld chainClass=0x%p\n", (long)chainClassTag, (void*)chainObjectClass);
 
     printf("Find static field in debugee class: %s\n", OBJECT_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (objectField =
             jni->GetStaticFieldID(debugeeClass, OBJECT_FIELD_NAME, ROOT_OBJECT_CLASS_SIG)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -235,7 +235,7 @@ static int getAndTagTestedObjects(
     printf("  ... got fieldID: 0x%p\n", (void*)objectField);
 
     printf("Find instance field in root object class: %s\n", REACHABLE_CHAIN_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (reachableChainField =
             jni->GetFieldID(rootObjectClass, REACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -244,7 +244,7 @@ static int getAndTagTestedObjects(
     printf("  ... got fieldID: 0x%p\n", (void*)reachableChainField);
 
     printf("Find instance field in root object class: %s\n", UNREACHABLE_CHAIN_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (unreachableChainField =
             jni->GetFieldID(rootObjectClass, UNREACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -253,7 +253,7 @@ static int getAndTagTestedObjects(
     printf("  ... got fieldID: 0x%p\n", (void*)unreachableChainField);
 
     printf("Find instance field in chain object class: %s\n", TAIL_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (tailField =
             jni->GetFieldID(chainObjectClass, TAIL_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -262,14 +262,14 @@ static int getAndTagTestedObjects(
     printf("  ... got fieldID: 0x%p\n", (void*)tailField);
 
     printf("Get root object from static field: %s\n", OBJECT_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (*rootObject =
             jni->GetStaticObjectField(debugeeClass, objectField)) != nullptr)) {
         nsk_jvmti_setFailStatus();
         return NSK_FALSE;
     }
     printf("  ... got object: 0x%p\n", (void*)*rootObject);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JNI_VERIFY(jni, (*rootObject = jni->NewGlobalRef(*rootObject)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -280,7 +280,7 @@ static int getAndTagTestedObjects(
     printf("Obtain and tag chain objects:\n");
 
     printf("    root tested object:\n");
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JVMTI_VERIFY(jvmti->SetTag(*rootObject, rootObjectTag))) {
         nsk_jvmti_setFailStatus();
     }
@@ -295,7 +295,7 @@ static int getAndTagTestedObjects(
     (*objectDescList)[chainLength].exp_found = 1;
 
     printf("    reachable objects chain: %d objects\n", chainLength);
-    fflush(0);
+    fflush(nullptr);
     if (!getAndTagChainObjects(jvmti, jni, *rootObject,
                                reachableChainField,
                                REACHABLE_CHAIN_FIELD_NAME,
@@ -348,7 +348,7 @@ static int checkTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni,
     }
 
     printf("\nReachable objects:\n");
-    fflush(0);
+    fflush(nullptr);
     for (i = 0; i < chainLength; i++) {
         idx = i + 1;
         printf("Reachable object:\n"
@@ -383,7 +383,7 @@ static int checkTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni,
             NSK_COMPLAIN0("Unreachable object was iterated\n");
             nsk_jvmti_setFailStatus();
         }
-        fflush(0);
+        fflush(nullptr);
     }
 
     return NSK_TRUE;
@@ -404,7 +404,7 @@ static int releaseTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
         }
     }
 
-    fflush(0);
+    fflush(nullptr);
     return NSK_TRUE;
 } /* releaseTestedObjects */
 
@@ -456,7 +456,7 @@ jint JNICALL heapReferenceCallback(
            (long) size,
            (long) ref_tag,
            (int) referrer_index);
-    fflush(0);
+    fflush(nullptr);
 
     if (tag_ptr == nullptr) {
         NSK_COMPLAIN1("null tag_ptr is passed to heapReferenceCallback:"
@@ -531,7 +531,7 @@ jint JNICALL heapReferenceCallback(
         case JVMTI_HEAP_REFERENCE_OTHER: {
             NSK_COMPLAIN1("This reference kind was not expected: %s\n",
                            ref_kind_str[reference_kind]);
-            fflush(0);
+            fflush(nullptr);
             nsk_jvmti_setFailStatus();
             return 0;
         }
@@ -556,7 +556,7 @@ jint JNICALL primitiveFieldCallback(
            (long) class_tag,
            (long) DEREF(tag_ptr),
            (int) value_type);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 }
 
@@ -574,7 +574,7 @@ jint JNICALL arrayPrimitiveValueCallback(
            (long) DEREF(tag_ptr),
            (int) element_count,
            (int) element_type);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 }
 
@@ -590,7 +590,7 @@ jint JNICALL stringPrimitiveValueCallback(
            (long) class_tag,
            (long) DEREF(tag_ptr),
            (int) value_length);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 }
 
@@ -602,13 +602,13 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     jobject rootObject = nullptr;
 
     printf("Wait for tested objects created\n");
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout))) {
         return;
     }
 
     printf(">>> Obtain and tag tested objects from debugee class\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!NSK_VERIFY(getAndTagTestedObjects(jvmti, jni,
                                                chainLength, &objectsCount,
@@ -618,7 +618,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Let debugee to clean links to unreachable objects\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!NSK_VERIFY(nsk_jvmti_resumeSync())) {
             return;
@@ -629,7 +629,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf("\n\n>>> Start 1-st iteration for root tested object: 0x%p\n", rootObject);
-    fflush(0);
+    fflush(nullptr);
     {
         jint heap_filter = JVMTI_HEAP_FILTER_UNTAGGED | JVMTI_HEAP_FILTER_CLASS_UNTAGGED;
         if (!NSK_JVMTI_VERIFY(jvmti->FollowReferences(heap_filter,
@@ -643,7 +643,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Check if reachable objects were iterated\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) {
             nsk_jvmti_setFailStatus();
@@ -660,7 +660,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf("\n\n>>> Start 2-nd iteration for root tested object: 0x%p\n", rootObject);
-    fflush(0);
+    fflush(nullptr);
     {
         /* This time everythig is filtered out */
         jint heap_filter = JVMTI_HEAP_FILTER_UNTAGGED | JVMTI_HEAP_FILTER_CLASS_UNTAGGED |
@@ -676,7 +676,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Check if reachable objects were not reported this time\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) {
             nsk_jvmti_setFailStatus();
@@ -684,7 +684,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Clean used data\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!NSK_VERIFY(releaseTestedObjects(jvmti, jni, chainLength, objectDescList, rootObject))) {
             return;
@@ -692,7 +692,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf("Let debugee to finish\n");
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_VERIFY(nsk_jvmti_resumeSync()))
         return;
 }
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref003/followref003.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref003/followref003.cpp
index cb0385ee653..80cbf856f45 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref003/followref003.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref003/followref003.cpp
@@ -146,7 +146,7 @@ static int getChainObjects(jvmtiEnv* jvmti, JNIEnv* jni, jobject firstObject,
         nsk_jvmti_setFailStatus();
     }
     printf("        tag=%-5ld object=0x%p\n", (long)objTag, (void*)obj);
-    fflush(0);
+    fflush(nullptr);
     if (!getChainObjects(jvmti, jni, obj, nextField, nextFieldName,
                                 nextField, nextFieldName,
                                 count, objectDescList, tag, reachable)) {
@@ -173,14 +173,14 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     *objectsCount = 1 + 2 * chainLength;
 
     printf("Allocate memory for objects list: %d objects\n", *objectsCount);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JVMTI_VERIFY(jvmti->Allocate((*objectsCount * sizeof(ObjectDesc)),
                                           (unsigned char**)objectDescList))) {
         nsk_jvmti_setFailStatus();
         return NSK_FALSE;
     }
     printf("  ... allocated array: 0x%p\n", (void*)objectDescList);
-    fflush(0);
+    fflush(nullptr);
 
     {
         int k;
@@ -194,7 +194,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     (*objectDescList)[0].exp_class_tag = rootClassTag;
 
     printf("Find debugee class: %s\n", DEBUGEE_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (debugeeClass = jni->FindClass(DEBUGEE_CLASS_NAME)) != nullptr)) {
         nsk_jvmti_setFailStatus();
         return NSK_FALSE;
@@ -202,7 +202,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     printf("  ... found class: 0x%p\n", (void*)debugeeClass);
 
     printf("Find root object class: %s\n", ROOT_OBJECT_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (rootObjectClass = jni->FindClass(ROOT_OBJECT_CLASS_NAME)) != nullptr)) {
         nsk_jvmti_setFailStatus();
         return NSK_FALSE;
@@ -216,7 +216,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
            (long)rootClassTag, (void*)rootObjectClass);
 
     printf("Find chain object class: %s\n", CHAIN_OBJECT_CLASS_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (chainObjectClass =
             jni->FindClass(CHAIN_OBJECT_CLASS_NAME)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -232,7 +232,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
            (long)chainClassTag, (void*)chainObjectClass);
 
     printf("Find static field in debugee class: %s\n", OBJECT_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (objectField =
             jni->GetStaticFieldID(debugeeClass, OBJECT_FIELD_NAME, ROOT_OBJECT_CLASS_SIG)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -241,7 +241,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     printf("  ... got fieldID: 0x%p\n", (void*)objectField);
 
     printf("Find instance field in root object class: %s\n", REACHABLE_CHAIN_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (reachableChainField =
             jni->GetFieldID(rootObjectClass, REACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -250,7 +250,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     printf("  ... got fieldID: 0x%p\n", (void*)reachableChainField);
 
     printf("Find instance field in root object class: %s\n", UNREACHABLE_CHAIN_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (unreachableChainField =
             jni->GetFieldID(rootObjectClass, UNREACHABLE_CHAIN_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -259,7 +259,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     printf("  ... got fieldID: 0x%p\n", (void*)unreachableChainField);
 
     printf("Find instance field in chain object class: %s\n", TAIL_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (tailField =
             jni->GetFieldID(chainObjectClass, TAIL_FIELD_NAME, CHAIN_OBJECT_CLASS_SIG)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -268,14 +268,14 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     printf("  ... got fieldID: 0x%p\n", (void*)tailField);
 
     printf("Get root object from static field: %s\n", OBJECT_FIELD_NAME);
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JNI_VERIFY(jni, (*rootObject =
             jni->GetStaticObjectField(debugeeClass, objectField)) != nullptr)) {
         nsk_jvmti_setFailStatus();
         return NSK_FALSE;
     }
     printf("  ... got object: 0x%p\n", (void*)*rootObject);
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_JNI_VERIFY(jni, (*rootObject = jni->NewGlobalRef(*rootObject)) != nullptr)) {
         nsk_jvmti_setFailStatus();
@@ -286,7 +286,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     printf("Obtain and tag chain objects:\n");
 
     printf("    root tested object\n");
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_JVMTI_VERIFY(jvmti->SetTag(*rootObject, rootObjectTag))) {
         nsk_jvmti_setFailStatus();
     }
@@ -298,7 +298,7 @@ static int getTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
     (*objectDescList)[0].tag = rootObjectTag;
 
     printf("    reachable objects chain: %d objects\n", chainLength);
-    fflush(0);
+    fflush(nullptr);
     if (!getChainObjects(jvmti, jni, *rootObject,
                                 reachableChainField, REACHABLE_CHAIN_FIELD_NAME,
                                 tailField, TAIL_FIELD_NAME,
@@ -347,7 +347,7 @@ static int checkTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni,
     }
 
     printf("\nReachable objects:\n");
-    fflush(0);
+    fflush(nullptr);
     for (i = 0; i < chainLength; i++) {
         idx = i + 1;
         printf("Reachable object:\n"
@@ -382,7 +382,7 @@ static int checkTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni,
             NSK_COMPLAIN0("Unreachable object was iterated\n");
             nsk_jvmti_setFailStatus();
         }
-        fflush(0);
+        fflush(nullptr);
     }
 
     return NSK_TRUE;
@@ -403,7 +403,7 @@ static int releaseTestedObjects(jvmtiEnv* jvmti, JNIEnv* jni, int chainLength,
         }
     }
 
-    fflush(0);
+    fflush(nullptr);
     return NSK_TRUE;
 }
 
@@ -646,7 +646,7 @@ jint JNICALL heapReferenceCallback(
                    (long) size);
         }
 
-        fflush(0);
+        fflush(nullptr);
         return 0;
     }
 
@@ -665,7 +665,7 @@ jint JNICALL heapReferenceCallback(
            method,
            (long) location,
            (int) index);
-    fflush(0);
+    fflush(nullptr);
 
     if (tag_ptr == nullptr) {
         NSK_COMPLAIN1("null tag_ptr is passed to heapReferenceCallback:"
@@ -748,7 +748,7 @@ jint JNICALL heapReferenceCallback(
             if (tag != rootObjectTag || class_tag != rootClassTag) {
                  NSK_COMPLAIN1("This reference kind was not expected: %s\n",
                                ref_kind_str[ref_kind]);
-                 fflush(0);
+                 fflush(nullptr);
                  nsk_jvmti_setFailStatus();
             }
             break;
@@ -818,7 +818,7 @@ jint JNICALL heapReferenceCallback(
         default: {
             NSK_COMPLAIN1("This reference kind was not expected: %s\n\n",
                            ref_kind_str[ref_kind]);
-            fflush(0);
+            fflush(nullptr);
             nsk_jvmti_setFailStatus();
             break;
         }
@@ -840,7 +840,7 @@ jint JNICALL primitiveFieldCallback
            (long) class_tag,
            (long) DEREF(tag_ptr),
            (int) value_type);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 }
 
@@ -853,7 +853,7 @@ jint JNICALL arrayPrimitiveValueCallback
            (long) DEREF(tag_ptr),
            (int) element_count,
            (int) element_type);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 }
 
@@ -865,7 +865,7 @@ jint JNICALL stringPrimitiveValueCallback
            (long) class_tag,
            (long) DEREF(tag_ptr),
            (int) value_length);
-    fflush(0);
+    fflush(nullptr);
     return 0;
 }
 
@@ -902,13 +902,13 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     jobject rootObject = nullptr;
 
     printf("Wait for tested objects created\n");
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout))) {
         return;
     }
 
     printf(">>> Obtain and tag tested objects from debugee class\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!NSK_VERIFY(getTestedObjects(jvmti, jni, chainLength, &objectsCount,
                                          &objectDescList, &rootObject))) {
@@ -917,7 +917,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Let debugee to clean links to unreachable objects\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!NSK_VERIFY(nsk_jvmti_resumeSync())) {
             return;
@@ -933,7 +933,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf("\n\n>>> Start 1-st iteration starting from the heap root\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!NSK_JVMTI_VERIFY(jvmti->FollowReferences((jint)   0,     /* heap_filter    */
                                                       (jclass)  nullptr, /* class          */
@@ -946,7 +946,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Check if reachable objects were iterated\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) {
             nsk_jvmti_setFailStatus();
@@ -968,7 +968,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf("\n\n>>> Start 2-nd iteration starting from the heap root\n");
-    fflush(0);
+    fflush(nullptr);
     first_followref = 0;
     {
         jint heap_filter = JVMTI_HEAP_FILTER_UNTAGGED
@@ -985,7 +985,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
 
     printf(">>> Check that both reachable and unreachable "
            "objects were not iterated\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!checkTestedObjects(jvmti, jni, chainLength, objectDescList)) {
             nsk_jvmti_setFailStatus();
@@ -994,7 +994,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
 
 
     printf(">>> Clean used data\n");
-    fflush(0);
+    fflush(nullptr);
     {
         if (!NSK_VERIFY(releaseTestedObjects(jvmti, jni, chainLength,
                         objectDescList, rootObject))) {
@@ -1003,7 +1003,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf("Let debugee to finish\n");
-    fflush(0);
+    fflush(nullptr);
     if (!NSK_VERIFY(nsk_jvmti_resumeSync()))
         return;
 }
@@ -1047,7 +1047,7 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
                 info = INFO_HEAPOBJ;
             else {
                 printf("Unknown option value: info=%s\n", infoOpt);
-                fflush(0);
+                fflush(nullptr);
                 return JNI_ERR;
             }
         }
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref004/followref004.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref004/followref004.cpp
index e73534de8b6..2446b5f7caf 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref004/followref004.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref004/followref004.cpp
@@ -86,7 +86,7 @@ jint JNICALL primitiveFieldCallback(
                (long) DEREF(tag_ptr),
                (int) value_type);
 
-    fflush(0);
+    fflush(nullptr);
 
     markTagVisited(DEREF(tag_ptr));
 
@@ -111,7 +111,7 @@ jint JNICALL arrayPrimitiveValueCallback(
            (long) DEREF(tag_ptr),
            (int) element_count,
            (int) element_type);
-    fflush(0);
+    fflush(nullptr);
 
     markTagVisited(DEREF(tag_ptr));
 
@@ -132,7 +132,7 @@ jint JNICALL stringPrimitiveValueCallback(
            (long) class_tag,
            (long) DEREF(tag_ptr),
            (int) value_length);
-    fflush(0);
+    fflush(nullptr);
 
     markTagVisited(DEREF(tag_ptr));
 
@@ -168,14 +168,14 @@ static void JNICALL agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg)
     jvmtiError retCode;
 
     printf(">>> Sync with Java code\n");
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_VERIFY(nsk_jvmti_waitForSync(g_timeout))) {
         return;
     }
 
     printf(">>> Create JNI global references\n");
-    fflush(0);
+    fflush(nullptr);
 
     createGlobalRefs(jni);
 
@@ -192,7 +192,7 @@ static void JNICALL agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg)
     checkThatAllTagsVisited();
 
     printf(">>> Let debugee to finish\n");
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_VERIFY(nsk_jvmti_resumeSync())) {
         return;
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref005/followref005.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref005/followref005.cpp
index 333ddcccf83..d0194feab02 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref005/followref005.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref005/followref005.cpp
@@ -88,7 +88,7 @@ agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
     }
 
     printf(">>> Let debugee to finish\n");
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_VERIFY(nsk_jvmti_waitForSync(g_timeout))) {
         return;
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref006/followref006.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref006/followref006.cpp
index 54485fb809a..5c5e3780321 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref006/followref006.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/FollowReferences/followref006/followref006.cpp
@@ -181,7 +181,7 @@ static void JNICALL agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg)
     checkNoObjIterated(jni, jvmti, JAVA_UTIL_CALENDAR_CLASS_NAME);
 
     NSK_DISPLAY0("Let debugee to finish");
-    fflush(0);
+    fflush(nullptr);
 
     if (!NSK_VERIFY(nsk_jvmti_waitForSync(g_timeout))) {
         return;
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretbase/earlyretbase.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretbase/earlyretbase.cpp
index 47b9618d19c..6c57004fc5f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretbase/earlyretbase.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretbase/earlyretbase.cpp
@@ -33,7 +33,7 @@ extern "C" {
 #define STATUS_FAILED 2
 #define PASSED 0
 
-#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return errCode
+#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return errCode
 
 static jvmtiEnv *jvmti = nullptr;
 static jvmtiCapabilities caps;
@@ -59,7 +59,7 @@ MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thr,
 
     if (method == midActiveMethod) {
         printf("#### MethodExit event occurred ####\n");
-        fflush(0);
+        fflush(nullptr);
         meth_exit_gen_events++;
     }
 }
@@ -70,7 +70,7 @@ FramePop(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
 
     if (method == midActiveMethod) {
         printf("#### FramePop event occurred ####\n");
-        fflush(0);
+        fflush(nullptr);
         pop_frame_gen_events++;
     }
 }
@@ -120,7 +120,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretbase_resThread(JNIEnv *env,
         return JNI_ERR;
     }
     printf("<<<<<<<< ResumeThread() is successfully done\n");
-    fflush(0);
+    fflush(nullptr);
     return PASSED;
 }
 
@@ -176,7 +176,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretbase_doForceEarlyReturn(JNIEnv *env
         RETURN_FAILED;
     }
     printf("Check #1 PASSED: ForceEarlyReturn() is successfully done\n");
-    fflush(0);
+    fflush(nullptr);
 
     return(errCode);
 }
@@ -268,7 +268,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretbase_check(JNIEnv *env, jclass cls)
                "events generated correctly\n");
         errCode = PASSED;
     }
-    fflush(0);
+    fflush(nullptr);
     return errCode;
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretfp/earlyretfp.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretfp/earlyretfp.cpp
index 9a0ce3d8550..5e7506a871e 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretfp/earlyretfp.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretfp/earlyretfp.cpp
@@ -33,7 +33,7 @@ extern "C" {
 #define PASSED 0
 #define STATUS_FAILED 2
 
-#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return
+#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return
 
 #define METHCNT 2
 static jvmtiEnv *jvmti = nullptr;
@@ -175,7 +175,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid,
         printf(" expected: %d\n", framesCount + 1);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -220,7 +220,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
                TranslateError(err), err);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -256,7 +256,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
             RETURN_FAILED;
         }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
@@ -289,7 +289,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
         printf("Method was_popped_by_exception unexpectedly\n");
         errCode = STATUS_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 #ifdef STATIC_BUILD
@@ -361,7 +361,7 @@ jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
         printf("Warning: Breakpoint or SingleStep event are not implemented\n");
     }
 
-    fflush(0);
+    fflush(nullptr);
     return JNI_OK;
 }
 
@@ -431,7 +431,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretfp_printFloat(
       JNIEnv *env, jclass cls, jfloat val) {
 
     printf("\n>>> Returned value is %8.4f, hex: %#a\n", val, val);
-    fflush(0);
+    fflush(nullptr);
     return;
 }
 
@@ -440,7 +440,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretfp_printDouble(
       JNIEnv *env, jclass cls, jdouble val) {
 
     printf("\n>>> Returned value is %8.4f, hex: %#a\n", val, val);
-    fflush(0);
+    fflush(nullptr);
     return;
 }
 
@@ -451,7 +451,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretfp_check(JNIEnv *env, jclass cls) {
             framesCount, framesExpected);
         errCode = STATUS_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
     return errCode;
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretint/earlyretint.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretint/earlyretint.cpp
index feb51d5fc40..16cd4c38567 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretint/earlyretint.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretint/earlyretint.cpp
@@ -33,7 +33,7 @@ extern "C" {
 #define PASSED 0
 #define STATUS_FAILED 2
 
-#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return
+#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return
 
 static jvmtiEnv *jvmti = nullptr;
 static jvmtiCapabilities caps;
@@ -184,7 +184,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid,
         printf(" expected: %d\n", framesCount + 1);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -229,7 +229,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
                TranslateError(err), err);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -270,7 +270,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
             RETURN_FAILED;
         }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
@@ -295,7 +295,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
         printf("Method was_popped_by_exception unexpectedly\n");
         errCode = STATUS_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 #ifdef STATIC_BUILD
@@ -452,7 +452,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretint_printInt(
       JNIEnv *env, jclass cls, jint val) {
 
     printf("\n>>> Returned value: dec %d, hex: %#x\n", val, val);
-    fflush(0);
+    fflush(nullptr);
     return;
 }
 
@@ -463,7 +463,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretint_check(JNIEnv *env, jclass cls)
             framesCount, framesExpected);
         errCode = STATUS_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
     return errCode;
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretlong/earlyretlong.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretlong/earlyretlong.cpp
index 170d6839bef..2cb1a318d44 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretlong/earlyretlong.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretlong/earlyretlong.cpp
@@ -34,7 +34,7 @@ extern "C" {
 #define PASSED 0
 #define STATUS_FAILED 2
 
-#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return
+#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return
 
 static jvmtiEnv *jvmti = nullptr;
 static jvmtiCapabilities caps;
@@ -168,7 +168,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid,
         printf(" expected: %d\n", framesCount + 1);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -213,7 +213,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
                TranslateError(err), err);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -251,7 +251,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
             RETURN_FAILED;
         }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
@@ -276,7 +276,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
             errCode = STATUS_FAILED;
         }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 #ifdef STATIC_BUILD
@@ -412,7 +412,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretlong_printLong(
 
     printf("\n>>> Returned value: dec: %" LL "d, hex: %#x %#x\n",
             val, iptr[0], iptr[1]);
-    fflush(0);
+    fflush(nullptr);
     return;
 }
 
@@ -423,7 +423,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretlong_check(JNIEnv *env, jclass cls)
             framesCount, framesExpected);
         errCode = STATUS_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
     return errCode;
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretobj/earlyretobj.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretobj/earlyretobj.cpp
index 6faf82f9ed9..ee3b79632d5 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretobj/earlyretobj.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretobj/earlyretobj.cpp
@@ -34,7 +34,7 @@ extern "C" {
 #define PASSED 0
 #define STATUS_FAILED 2
 
-#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return
+#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return
 
 static jvmtiEnv *jvmti = nullptr;
 static jvmtiCapabilities caps;
@@ -168,7 +168,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid,
         printf(" expected: %d\n", framesCount + 1);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -213,7 +213,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
                TranslateError(err), err);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -251,7 +251,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
             RETURN_FAILED;
         }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
@@ -274,7 +274,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
             errCode = STATUS_FAILED;
         }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 #ifdef STATIC_BUILD
@@ -410,7 +410,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretobj_check(JNIEnv *env, jclass cls)
             framesCount, framesExpected);
         errCode = STATUS_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
     return errCode;
 }
 
@@ -419,7 +419,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretobj_printObject(
          JNIEnv *env, jclass cls, jobject obj) {
 
     printf("\nReturned jobject: %#" PRIxPTR "\n", (uintptr_t)obj);
-    fflush(0);
+    fflush(nullptr);
     return;
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretstr/earlyretstr.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretstr/earlyretstr.cpp
index 6ebb50026a3..8465d05f956 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretstr/earlyretstr.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretstr/earlyretstr.cpp
@@ -33,7 +33,7 @@ extern "C" {
 #define PASSED 0
 #define STATUS_FAILED 2
 
-#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return
+#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return
 
 static jvmtiEnv *jvmti = nullptr;
 static jvmtiCapabilities caps;
@@ -167,7 +167,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid,
         printf(" expected: %d\n", framesCount + 1);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -212,7 +212,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
                TranslateError(err), err);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -249,7 +249,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
             RETURN_FAILED;
         }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
@@ -273,7 +273,7 @@ void JNICALL MethodExit(jvmtiEnv *jvmti_env, JNIEnv *env, jthread thread,
           errCode = STATUS_FAILED;
       }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 #ifdef STATIC_BUILD
@@ -409,7 +409,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretstr_check(JNIEnv *env, jclass cls)
             framesCount, framesExpected);
         errCode = STATUS_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
     return errCode;
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretvoid/earlyretvoid.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretvoid/earlyretvoid.cpp
index 4919d27e9e7..e66b9fc97ac 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretvoid/earlyretvoid.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/ForceEarlyReturn/earlyretvoid/earlyretvoid.cpp
@@ -33,7 +33,7 @@ extern "C" {
 #define PASSED 0
 #define STATUS_FAILED 2
 
-#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return
+#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return
 
 static jvmtiEnv *jvmti = nullptr;
 static jvmtiCapabilities caps;
@@ -155,7 +155,7 @@ void check(jvmtiEnv *jvmti_env, jthread thr, jmethodID mid,
         }
         jvmti_env->Deallocate((unsigned char*)table);
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -192,7 +192,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
                TranslateError(err), err);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -223,7 +223,7 @@ void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv *env,
             RETURN_FAILED;
         }
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 #ifdef STATIC_BUILD
@@ -339,7 +339,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretvoid_getReady(
     } else {
         framesExpected = depth;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 JNIEXPORT jint JNICALL
@@ -349,7 +349,7 @@ Java_nsk_jvmti_unit_ForceEarlyReturn_earlyretvoid_check(JNIEnv *env, jclass cls)
             framesCount, framesExpected);
         errCode = STATUS_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
     return errCode;
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetAllStackTraces/getallstktr001/getallstktr001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetAllStackTraces/getallstktr001/getallstktr001.cpp
index c1f0443186f..8916186531d 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetAllStackTraces/getallstktr001/getallstktr001.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetAllStackTraces/getallstktr001/getallstktr001.cpp
@@ -179,7 +179,7 @@ void compare_all_frames(int ti, int frames_count,
         printf("thr #%d: compare frame #%d: fields are the same: "
                " method: 0x%p, location: %#" LL "x\n",
                ti, fi, fr1->method, fr1->location);
-        fflush(0);
+        fflush(nullptr);
     }
 }
 
@@ -225,7 +225,7 @@ void compare_one_stack_trace(int ti,
            " jthread: 0x%p, state: %d, frame_count: %d\n",
            ti, stk1->thread, stk1->state, stk1->frame_count);
 
-    fflush(0);
+    fflush(nullptr);
     compare_all_frames(ti,
                        stk1->frame_count,
                        stk1->frame_buffer,
@@ -291,7 +291,7 @@ Java_nsk_jvmti_unit_GetAllStackTraces_getallstktr001_GetThreadsInfo(
             iGlobalStatus = STATUS_FAILED;
         }
         printf("GetThreadInfo %d: thread: %s\n", ti, thread_info[ti].name);
-        fflush(0);
+        fflush(nullptr);
     }
 }
 
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetConstantPool/getcpool001/getcpool001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetConstantPool/getcpool001/getcpool001.cpp
index 997e6c667e6..d3905ad65eb 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetConstantPool/getcpool001/getcpool001.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/GetConstantPool/getcpool001/getcpool001.cpp
@@ -36,7 +36,7 @@ extern "C" {
 static jvmtiCapabilities caps;
 static jvmtiEventCallbacks callbacks;
 
-#define RETURN_FAILED errCode = STATUS_FAILED; fflush(0); return
+#define RETURN_FAILED errCode = STATUS_FAILED; fflush(nullptr); return
 
 static jint      errCode       = PASSED;
 static jvmtiEnv *jvmti         = nullptr;
@@ -63,7 +63,7 @@ Java_nsk_jvmti_unit_GetConstantPool_getcpool001_getCP(
     /* Print Constant Pool attrs*/
     printf("getCP: id = %d, cnt = %03d, bytes_cnt = %04d\n",
             id, cp_cnt, cp_bytes_cnt);
-    fflush(0);
+    fflush(nullptr);
 }
 
 void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
@@ -83,7 +83,7 @@ void JNICALL Breakpoint(jvmtiEnv *jvmti_env, JNIEnv *env,
                TranslateError(err), err);
         RETURN_FAILED;
     }
-    fflush(0);
+    fflush(nullptr);
 }
 
 #ifdef STATIC_BUILD
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp
index 11ef7e18d7b..6ee955ae420 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/unit/functions/rawmonitor/rawmonitor.cpp
@@ -1,5 +1,4 @@
 /*
-s
  * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/Log.java b/test/hotspot/jtreg/vmTestbase/nsk/share/Log.java
index 735f487f6c3..e5750182495 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/Log.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/Log.java
@@ -74,15 +74,15 @@ public class Log {
 
     /**
      * Is log-mode verbose?
-     * Default value is <code>false</code>.
+     * Always enabled.
      */
-    private boolean verbose = false;
+    private final boolean verbose = true;
 
     /**
      * Should log messages prefixed with timestamps?
-     * Default value is <code>false</code>.
+     * Always enabled.
      */
-    private boolean timestamp = false;
+    private final boolean timestamp = true;
 
     /**
      * Names for trace levels
@@ -193,7 +193,6 @@ public Log(PrintStream stream) {
      */
     public Log(PrintStream stream, boolean verbose) {
         this(stream);
-        this.verbose = verbose;
     }
 
     /**
@@ -204,7 +203,6 @@ public Log(PrintStream stream, boolean verbose) {
     public Log(PrintStream stream, ArgumentParser argsParser) {
         this(stream, argsParser.verbose());
         traceLevel = argsParser.getTraceLevel();
-        timestamp = argsParser.isTimestamp();
     }
 
     /////////////////////////////////////////////////////////////////
@@ -220,10 +218,9 @@ public boolean verbose() {
      * Enable or disable verbose mode for printing messages.
      */
     public void enableVerbose(boolean enable) {
-        if (!verbose) {
-            flushLogBuffer();
+        if (!enable) {
+            throw new RuntimeException("The non-verbose logging is not supported.");
         }
-        verbose = enable;
     }
 
     public int getTraceLevel() {
@@ -422,7 +419,6 @@ protected synchronized void logTo(PrintStream stream) {
             out.flush();
         }
         out = stream;
-        verbose = true;
     }
 
     /////////////////////////////////////////////////////////////////
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Debuggee.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Debuggee.java
index b0467a7e73c..f7472e2db03 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Debuggee.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Debuggee.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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,55 +30,15 @@
 import java.io.*;
 
 /**
- * Interface defining methods to control mirror of debuggee (i.e. debugged VM).
+ * Class defining methods to control mirror of debuggee (i.e. debugged VM).
  */
-public interface Debuggee {
+public class Debuggee extends LocalProcess {
 
     /** Default prefix for log messages. */
     public static final String LOG_PREFIX = "debuggee> ";
     public static final String DEBUGEE_STDOUT_LOG_PREFIX = "debuggee.stdout> ";
     public static final String DEBUGEE_STDERR_LOG_PREFIX = "debuggee.stderr> ";
 
-    /**
-     * Launch debuggee.
-     *
-     * @throws IOException
-     */
-    public void launch (String[] args) throws IOException;
-
-    /** Return exit status. */
-    public int getStatus ();
-
-    /** Check whether the process has been terminated. */
-    public boolean terminated();
-
-    /** Kill the debuggee VM. */
-    public void killDebuggee ();
-
-    /** Wait until the debuggee VM shutdown or crash. */
-    public int waitForDebuggee () throws InterruptedException;
-
-    /** Get a pipe to write to the debuggee's stdin stream. */
-    public OutputStream getInPipe ();
-
-    /** Get a pipe to read the debuggee's stdout stream. */
-    public InputStream getOutPipe ();
-
-    /** Get a pipe to read the debuggee's stderr stream. */
-    public InputStream getErrPipe ();
-
-    /** Redirect stdout stream to <code>Log</code> */
-    public void redirectStdout(Log log, String prefix);
-
-    /** Redirect stderr stream to <code>Log</code> */
-    public void redirectStderr(Log log, String prefix);
-}
-
-/**
- * Mirror of locally launched debuggee.
- */
-final class LocalLaunchedDebuggee extends LocalProcess implements Debuggee {
-
     private IORedirector stdoutRedirector = null;
     private IORedirector stderrRedirector = null;
     private IORedirector stdinRedirector = null;
@@ -90,7 +50,7 @@ final class LocalLaunchedDebuggee extends LocalProcess implements Debuggee {
     private Launcher launcher = null;
 
     /** Enwrap the existing <code>VM</code> mirror. */
-    LocalLaunchedDebuggee (Launcher launcher) {
+    Debuggee(Launcher launcher) {
         super();
         this.launcher = launcher;
     }
@@ -235,70 +195,3 @@ public void redirectStderr(Log log, String prefix) {
 }
 
 
-/**
- * Mirror of remotely launched debuggee.
- */
-final class RemoteLaunchedDebuggee implements Debuggee {
-
-    /** Launcher that creates this debuggee. */
-    private Launcher launcher = null;
-
-    /** Enwrap the existing <code>VM</code> mirror. */
-    RemoteLaunchedDebuggee (Launcher launcher) {
-        super();
-        this.launcher = launcher;
-    }
-
-    /**
-     * Launch debugee on remote host via <code>Launcher</code> object.
-     */
-    public void launch(String[] args) throws IOException {
-        String cmdLine = ArgumentHandler.joinArguments(args, "\"");
-        launcher.display("Starting remote java process:\n" + cmdLine);
-        launcher.launchRemoteProcess(args);
-    }
-
-    /** Return exit status of the debuggee VM. */
-    public int getStatus () {
-        return launcher.getRemoteProcessStatus();
-    }
-
-    /** Check whether the debuggee VM has been terminated. */
-    public boolean terminated () {
-        return launcher.isRemoteProcessTerminated();
-    }
-
-    // ---------------------------------------------- //
-
-    /** Kill the debuggee VM. */
-    public void killDebuggee () {
-        launcher.killRemoteProcess();
-    }
-
-    /** Wait until the debuggee VM shutdown or crash. */
-    public int waitForDebuggee () {
-        return launcher.waitForRemoteProcess();
-    }
-
-    /** Get a pipe to write to the debuggee's stdin stream. */
-    public OutputStream getInPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debuggee's stdout stream. */
-    public InputStream getOutPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debuggee's stderr stream. */
-    public InputStream getErrPipe () {
-        return null;
-    }
-
-    public void redirectStdout(Log log, String prefix) {
-    }
-
-    public void redirectStderr(Log log, String prefix) {
-    }
-
-}
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java
index 0db3a6f718e..35df95b2d6f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdb/Launcher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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
@@ -103,52 +103,21 @@ public void launchJdbAndDebuggee (String classToExecute) throws IOException {
 
         String[] jdbCmdArgs = makeJdbCmdLine(classToExecute);
 
-        if (argumentHandler.isLaunchedLocally()) {
-
-            if (argumentHandler.isDefaultConnector()) {
-
-                localDefaultLaunch(jdbCmdArgs, classToExecute);
-
-            } else if (argumentHandler.isRawLaunchingConnector()) {
-
-                localRawLaunch(jdbCmdArgs, classToExecute);
-
-            } else if (argumentHandler.isLaunchingConnector()) {
-
-                localLaunch(jdbCmdArgs, classToExecute);
-
-            } else if (argumentHandler.isAttachingConnector()) {
-
-                localLaunchAndAttach(jdbCmdArgs, classToExecute);
-
-            } else if (argumentHandler.isListeningConnector()) {
-
-                localLaunchAndListen(jdbCmdArgs, classToExecute);
-
-            } else {
-                throw new TestBug("Unexpected connector type for local launch mode"
-                                  + argumentHandler.getConnectorType());
-            }
-
-        } else if (argumentHandler.isLaunchedRemotely()) {
-
-            connectToBindServer(classToExecute);
-
-            if (argumentHandler.isAttachingConnector()) {
-
-                remoteLaunchAndAttach(jdbCmdArgs, classToExecute);
-
-            } else if (argumentHandler.isListeningConnector()) {
-
-                remoteLaunchAndListen(jdbCmdArgs, classToExecute);
-
-            } else {
-                throw new TestBug("Unexpected connector type for remote launch mode"
-                                  + argumentHandler.getConnectorType());
-            }
+        if (argumentHandler.isDefaultConnector()) {
+            localDefaultLaunch(jdbCmdArgs, classToExecute);
+        } else if (argumentHandler.isRawLaunchingConnector()) {
+            localRawLaunch(jdbCmdArgs, classToExecute);
+        } else if (argumentHandler.isLaunchingConnector()) {
+            localLaunch(jdbCmdArgs, classToExecute);
+        } else if (argumentHandler.isAttachingConnector()) {
+            localLaunchAndAttach(jdbCmdArgs, classToExecute);
+        } else if (argumentHandler.isListeningConnector()) {
+            localLaunchAndListen(jdbCmdArgs, classToExecute);
         } else {
-            throw new Failure("Unexpected launching mode: " + argumentHandler.getLaunchMode());
+            throw new TestBug("Unexpected connector type for local launch mode"
+                              + argumentHandler.getConnectorType());
         }
+
     }
 
     /**
@@ -198,11 +167,7 @@ private String[] makeJdbCmdLine (String classToExecute) {
             if (argumentHandler.isRawLaunchingConnector()) {
 
                 if (argumentHandler.isSocketTransport()) {
-                    if (argumentHandler.isLaunchedLocally()) {
-                        connectorAddress = argumentHandler.getTransportPort();
-                    } else {
-                        connectorAddress = argumentHandler.getDebugeeHost() + ":" + argumentHandler.getTransportPort();
-                    }
+                    connectorAddress = argumentHandler.getTransportPort();
                 } else if (argumentHandler.isShmemTransport() ) {
                     connectorAddress = argumentHandler.getTransportSharedName();
                 } else {
@@ -247,8 +212,6 @@ private String[] makeJdbCmdLine (String classToExecute) {
 
                 if (argumentHandler.isSocketTransport()) {
                     connect.append("port=" + argumentHandler.getTransportPort().trim());
-                    if (argumentHandler.isLaunchedRemotely())
-                        connect.append(",hostname=" + argumentHandler.getDebugeeHost().trim());
                 } else if (argumentHandler.isShmemTransport()) {
                     connect.append("name=" + argumentHandler.getTransportSharedName().trim());
                 } else {
@@ -324,7 +287,7 @@ private String[] makeJdbCmdLine (String classToExecute) {
     private void localLaunchAndAttach
        (String[] jdbCmdArgs, String classToExecute) throws IOException {
 
-        debuggee = new LocalLaunchedDebuggee(this);
+        debuggee = new Debuggee(this);
         String address = makeTransportAddress();
         String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address);
         debuggee.launch(javaCmdArgs);
@@ -346,57 +309,12 @@ private String[] makeJdbCmdLine (String classToExecute) {
         String address = jdb.waitForListeningJdb();
         display("Listening address found: " + address);
 
-        debuggee = new LocalLaunchedDebuggee(this);
+        debuggee = new Debuggee(this);
         String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address);
         debuggee.launch(javaCmdArgs);
 
 //        jdb.waitForPrompt(0, false);
     }
 
-    /**
-     * Run test in remote mode using attaching connector.
-     */
-    private void remoteLaunchAndAttach
-       (String[] jdbCmdArgs, String classToExecute) throws IOException {
-
-        debuggee = new RemoteLaunchedDebuggee(this);
-        String address = makeTransportAddress();
-        String[] javaCmdArgs = makeCommandLineArgs(classToExecute, address);
-        try {
-            debuggee.launch(javaCmdArgs);
-        } catch (IOException e) {
-            throw new Failure("Caught exception while launching debuggee VM process:\n\t"
-                            + e);
-        };
-
-        display("Start jdb attaching to remote debuggee");
-        jdb = Jdb.startAttachingJdb (this, jdbCmdArgs, JDB_STARTED);
-//        jdb.waitForPrompt(0, false);
-    }
-
-    /**
-     * Run test in remote mode using listening connector.
-     */
-    private void remoteLaunchAndListen
-       (String[] jdbCmdArgs, String classToExecute) throws IOException {
-
-        jdb = new Jdb(this);
-        display("Starting jdb listening to remote debuggee");
-        jdb.launch(jdbCmdArgs);
-        String address = jdb.waitForListeningJdb();
-        display("Listening address found: " + address);
-
-        debuggee = new RemoteLaunchedDebuggee(this);
-        String[] javaCmdArgs = makeCommandLineArgs(classToExecute);
-        try {
-            debuggee.launch(javaCmdArgs);
-        } catch (IOException e) {
-            throw new Failure("Caught exception while launching debuggee VM process:\n\t"
-                            + e);
-        };
-
-        jdb.waitForMessage(0, JDB_STARTED);
-//        jdb.waitForPrompt(0, false);
-    }
 
 } // End of Launcher
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java
index 16863189500..3f924c6ac47 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/ArgumentHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -457,18 +457,6 @@ protected void checkOptions() {
         }
  */
 
-        if (! isLaunchedLocally() && ! isDefaultDebugeeSuspendMode()) {
-            throw new BadOption("inconsistent options: "
-                                + "-debugee.launch=" + getLaunchMode()
-                                + " and -debugee.suspend=" + getDebugeeSuspendMode());
-        }
-
-        if (! isLaunchedLocally() && isLaunchingConnector()) {
-            throw new BadOption("inconsistent options: "
-                                + "-debugee.launch=" + getLaunchMode()
-                                + " and -connector=" + getConnectorType());
-        }
-
         if (isLaunchingConnector() && ! isDefaultTransport()) {
             throw new BadOption("inconsistent options: "
                                 + "-connector=" + getConnectorType()
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java
index b983ac998f5..9879b68775f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java
@@ -127,8 +127,7 @@ public Binder (ArgumentHandler argumentHandler, Log log) {
      * started with launching connector.
      */
     public Debugee makeLocalDebugee(Process process) {
-        LocalLaunchedDebugee debugee = new LocalLaunchedDebugee(process, this);
-        return debugee;
+        return new Debugee(process, this);
     }
 
     /**
@@ -189,51 +188,22 @@ public Debugee bindToDebugeeNoWait(String classToExecute) {
 
         prepareForPipeConnection(argumentHandler);
 
-        if (argumentHandler.isLaunchedLocally()) {
-
-            if (argumentHandler.isDefaultConnector()) {
-                debugee = localDefaultLaunchDebugee(vmm, classToExecute, classPath);
-            } else if (argumentHandler.isRawLaunchingConnector()) {
-                debugee = localRawLaunchDebugee(vmm, classToExecute, classPath);
-            } else if (argumentHandler.isLaunchingConnector()) {
-                debugee = localLaunchDebugee(vmm, classToExecute, classPath);
-            } else if (argumentHandler.isAttachingConnector()) {
-                debugee = localLaunchAndAttachDebugee(vmm, classToExecute, classPath);
-            } else if (argumentHandler.isListeningConnector()) {
-                debugee = localLaunchAndListenDebugee(vmm, classToExecute, classPath);
-            } else {
-                throw new TestBug("Unexpected connector type for local debugee launch mode"
-                                  + argumentHandler.getConnectorType());
-            }
-
-        } else if (argumentHandler.isLaunchedRemotely()) {
-
-            connectToBindServer(classToExecute);
-
-            if (argumentHandler.isAttachingConnector()) {
-                debugee = remoteLaunchAndAttachDebugee(vmm, classToExecute, classPath);
-            } else if (argumentHandler.isListeningConnector()) {
-                debugee = remoteLaunchAndListenDebugee(vmm, classToExecute, classPath);
-            } else {
-                throw new TestBug("Unexpected connector type for remote debugee launch mode"
-                                  + argumentHandler.getConnectorType());
-            }
-
-        } else if (argumentHandler.isLaunchedManually()) {
-
-            if (argumentHandler.isAttachingConnector()) {
-                debugee = manualLaunchAndAttachDebugee(vmm, classToExecute, classPath);
-            } else if (argumentHandler.isListeningConnector()) {
-                debugee = manualLaunchAndListenDebugee(vmm, classToExecute, classPath);
-            } else {
-                throw new TestBug("Unexpected connector type for manual debugee launch mode"
-                                  + argumentHandler.getConnectorType());
-            }
-
+        if (argumentHandler.isDefaultConnector()) {
+            debugee = localDefaultLaunchDebugee(vmm, classToExecute, classPath);
+        } else if (argumentHandler.isRawLaunchingConnector()) {
+            debugee = localRawLaunchDebugee(vmm, classToExecute, classPath);
+        } else if (argumentHandler.isLaunchingConnector()) {
+            debugee = localLaunchDebugee(vmm, classToExecute, classPath);
+        } else if (argumentHandler.isAttachingConnector()) {
+            debugee = localLaunchAndAttachDebugee(vmm, classToExecute, classPath);
+        } else if (argumentHandler.isListeningConnector()) {
+            debugee = localLaunchAndListenDebugee(vmm, classToExecute, classPath);
         } else {
-            throw new Failure("Unexpected debugee launching mode: " + argumentHandler.getLaunchMode());
+            throw new TestBug("Unexpected connector type for local debugee launch mode"
+                              + argumentHandler.getConnectorType());
         }
 
+
         return debugee;
     }
 
@@ -486,194 +456,6 @@ private Debugee localLaunchAndListenDebugee (VirtualMachineManager vmm,
 
     // -------------------------------------------------- //
 
-    /**
-     * Launch debugee VM remotely via <code>BindServer</code> and connect to it using
-     * <code>AttachingConnector</code>.
-     */
-    private Debugee remoteLaunchAndAttachDebugee (VirtualMachineManager vmm,
-                                                    String classToExecute,
-                                                    String classPath) {
-        display("Finding connector: " + argumentHandler.getConnectorName() );
-        AttachingConnector connector =
-            (AttachingConnector) findConnector(argumentHandler.getConnectorName(),
-                                                vmm.attachingConnectors());
-
-        Map<java.lang.String,? extends com.sun.jdi.connect.Connector.Argument> arguments = setupAttachingConnector(connector, classToExecute, classPath);
-
-        String address = makeTransportAddress();
-        String[] cmdLineArgs = makeCommandLineArgs(classToExecute, address);
-        String javaCmdLine = makeCommandLineString(classToExecute, address, "\"");
-
-        display("Starting remote java process:\n\t" + javaCmdLine);
-        Debugee debugee = startRemoteDebugee(cmdLineArgs);
-
-        display("Attaching to debugee");
-        VirtualMachine vm;
-        IOException ioe = null;
-        for (int i = 0; i < CONNECT_TRIES; i++) {
-            try {
-                vm = connector.attach(arguments);
-                display("Debugee attached");
-                debugee.setupVM(vm);
-                return debugee;
-            } catch (IOException e) {
-                display("Attempt #" + i + " to connect to debugee VM failed:\n\t" + e);
-                ioe = e;
-                if (debugee.terminated()) {
-                    throw new Failure("Unable to connect to debuggee VM: VM process is terminated");
-                }
-                try {
-                    Thread.currentThread().sleep(CONNECT_TRY_DELAY);
-                } catch (InterruptedException ie) {
-                    ie.printStackTrace(log.getOutStream());
-                    throw new Failure("Thread interrupted while pausing connection attempts:\n\t"
-                                    + ie);
-                }
-            } catch (IllegalConnectorArgumentsException e) {
-                e.printStackTrace(log.getOutStream());
-                throw new TestBug("Wrong connector arguments used to attach to debuggee VM:\n\t" + e);
-            }
-        }
-        throw new Failure("Unable to connect to debugee VM after " + CONNECT_TRIES
-                        + " tries:\n\t" + ioe);
-    }
-
-    /**
-     * Launch debugee VM remotely via <code>BindServer</code> and connect to it using
-     * <code>ListeningConnector</code>.
-     */
-    private Debugee remoteLaunchAndListenDebugee (VirtualMachineManager vmm,
-                                                    String classToExecute,
-                                                    String classPath) {
-        display("Finding connector: " + argumentHandler.getConnectorName() );
-        ListeningConnector connector =
-            (ListeningConnector) findConnector(argumentHandler.getConnectorName(),
-                                                vmm.listeningConnectors());
-        Map<java.lang.String,? extends com.sun.jdi.connect.Connector.Argument> arguments = setupListeningConnector(connector, classToExecute, classPath);
-
-        String address = null;
-        try {
-            display("Listening for connection from debugee");
-            address = connector.startListening(arguments);
-        } catch (IllegalConnectorArgumentsException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new TestBug("Wrong connector arguments used to listen debuggee VM:\n\t" + e);
-        } catch (IOException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new Failure("Caught exception while starting listening debugee VM:\n\t" + e);
-        };
-
-        String[] cmdLineArgs = makeCommandLineArgs(classToExecute, address);
-        String javaCmdLine = makeCommandLineString(classToExecute, address, "\"");
-
-        display("Starting remote java process:\n\t" + javaCmdLine);
-        Debugee debugee = startRemoteDebugee(cmdLineArgs);
-
-        display("Waiting for connection from debugee");
-        VirtualMachine vm;
-        IOException ioe = null;
-        for (int i = 0; i < CONNECT_TRIES; i++) {
-            try {
-                vm = connector.accept(arguments);
-                connector.stopListening(arguments);
-                display("Debugee attached");
-                debugee.setupVM(vm);
-                return debugee;
-            } catch (IOException e) {
-                display("Attempt #" + i + " to listen debugee VM failed:\n\t" + e);
-                ioe = e;
-                if (debugee.terminated()) {
-                    throw new Failure("Unable to connect to debuggee VM: VM process is terminated");
-                }
-                try {
-                    Thread.currentThread().sleep(CONNECT_TRY_DELAY);
-                } catch (InterruptedException ie) {
-                    ie.printStackTrace(log.getOutStream());
-                    throw new Failure("Thread interrupted while pausing connection attempts:\n\t"
-                                    + ie);
-                }
-            } catch (IllegalConnectorArgumentsException e) {
-                e.printStackTrace(log.getOutStream());
-                throw new TestBug("Wrong connector arguments used to listen debuggee VM:\n\t" + e);
-            }
-        }
-        throw new Failure("Unable to connect to debugee VM after " + CONNECT_TRIES
-                        + " tries:\n\t" + ioe);
-    }
-
-    // -------------------------------------------------- //
-
-    /**
-     * Prompt to manually launch debugee VM and connect to it using
-     * <code>AttachingConnector</code>.
-     */
-    private Debugee manualLaunchAndAttachDebugee (VirtualMachineManager vmm,
-                                                    String classToExecute,
-                                                    String classPath) {
-        display("Finding connector: " + argumentHandler.getConnectorName() );
-        AttachingConnector connector =
-            (AttachingConnector) findConnector(argumentHandler.getConnectorName(),
-                                                vmm.attachingConnectors());
-        Map<java.lang.String,? extends com.sun.jdi.connect.Connector.Argument> arguments = setupAttachingConnector(connector, classToExecute, classPath);
-
-        String address = makeTransportAddress();
-        String javaCmdLine = makeCommandLineString(classToExecute, address, "\"");
-
-        display("Starting manual java process:\n\t" + javaCmdLine);
-        ManualLaunchedDebugee debugee = startManualDebugee(javaCmdLine);
-
-        VirtualMachine vm;
-        try {
-            display("Attaching to debugee");
-            vm = connector.attach(arguments);
-        } catch (IllegalConnectorArgumentsException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new TestBug("Wrong connector arguments used to attach to debuggee VM:\n\t" + e);
-        } catch (IOException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new Failure("Caught exception while attaching to debugee VM:\n\t" + e);
-        };
-        display("Debugee attached");
-
-        debugee.setupVM(vm);
-        return debugee;
-    }
-
-    /**
-     * Prompt to manually launch debugee VM and connect to it using
-     * <code>ListeningConnector</code>.
-     */
-    private Debugee manualLaunchAndListenDebugee (VirtualMachineManager vmm,
-                                                    String classToExecute,
-                                                    String classPath) {
-        display("Finding connector: " + argumentHandler.getConnectorName() );
-        ListeningConnector connector =
-            (ListeningConnector) findConnector(argumentHandler.getConnectorName(),
-                                                vmm.listeningConnectors());
-        Map<java.lang.String,? extends com.sun.jdi.connect.Connector.Argument> arguments = setupListeningConnector(connector, classToExecute, classPath);
-
-        VirtualMachine vm;
-        try {
-            display("Listening for connection from debugee");
-            String address = connector.startListening(arguments);
-            String javaCmdLine = makeCommandLineString(classToExecute, address, "\"");
-            display("Starting manual java process:\n\t" + javaCmdLine);
-            ManualLaunchedDebugee debugee = startManualDebugee(javaCmdLine);
-            display("Waiting for connection from debugee");
-            vm = connector.accept(arguments);
-            display("Debugee attached");
-            connector.stopListening(arguments);
-            debugee.setupVM(vm);
-            return debugee;
-        } catch (IllegalConnectorArgumentsException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new TestBug("Wrong connector arguments used to listen debuggee VM:\n\t" + e);
-        } catch (IOException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new Failure("Caught exception while listening to debugee VM:\n\t" + e);
-        }
-    }
-
     // -------------------------------------------------- //
 
     /**
@@ -920,33 +702,6 @@ protected Debugee startLocalDebugee(String[] cmdArgs) {
         return makeLocalDebugee(process);
     }
 
-    /**
-     * Launch remote debuggee process with specified command line arguments
-     * and make initial <code>Debugee</code> mirror.
-     */
-    protected RemoteLaunchedDebugee startRemoteDebugee(String[] cmdArgs) {
-        try {
-            launchRemoteProcess(cmdArgs);
-        } catch (IOException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new Failure("Caught exception while launching remote debuggee VM process:\n\t"
-                            + e);
-        }
-
-        RemoteLaunchedDebugee debugee = new RemoteLaunchedDebugee(this);
-        return debugee;
-    }
-
-    /**
-     * Launch manual debuggee process with specified command line arguments
-     * and make initial <code>Debugee</code> mirror.
-     */
-    protected ManualLaunchedDebugee startManualDebugee(String cmd) {
-        ManualLaunchedDebugee debugee = new ManualLaunchedDebugee(this);
-        debugee.launchDebugee(cmd);
-        return debugee;
-    }
-
     public static String readVMStartExceptionOutput(VMStartException e, PrintStream log) {
         StringBuffer msg = new StringBuffer();
         try (InputStream is = e.process().getInputStream()) {
@@ -995,287 +750,4 @@ private static byte[] readAllBytes(InputStream is) throws IOException {
         return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
     }
 
-}
-
-
-/**
- * Mirror of locally launched debugee.
- */
-final class LocalLaunchedDebugee extends Debugee {
-
-    /** Enwrap the locally started VM process. */
-    public LocalLaunchedDebugee (Process process, Binder binder) {
-        super(binder);
-        this.process = process;
-        checkTermination = true;
-    }
-
-    // ---------------------------------------------- //
-
-    /** Return exit status of the debugee VM. */
-    public int getStatus () {
-        return process.exitValue();
-    }
-
-    /** Check whether the debugee VM has been terminated. */
-    public boolean terminated () {
-        if (process == null)
-            return true;
-
-        try {
-            int value = process.exitValue();
-            return true;
-        } catch (IllegalThreadStateException e) {
-            return false;
-        }
-    }
-
-    // ---------------------------------------------- //
-
-    /** Kill the debugee VM. */
-    protected void killDebugee () {
-        super.killDebugee();
-        if (!terminated()) {
-            log.display("Killing debugee VM process");
-            process.destroy();
-        }
-    }
-
-    /** Wait until the debugee VM shutdown or crash. */
-    protected int waitForDebugee () throws InterruptedException {
-        int code = process.waitFor();
-        return code;
-    }
-
-    /** Get a pipe to write to the debugee's stdin stream. */
-    protected OutputStream getInPipe () {
-        return process.getOutputStream();
-    }
-
-    /** Get a pipe to read the debugee's stdout stream. */
-    protected InputStream getOutPipe () {
-        return process.getInputStream();
-    }
-
-    /** Get a pipe to read the debugee's stderr stream. */
-    protected InputStream getErrPipe () {
-        return process.getErrorStream();
-    }
-}
-
-
-/**
- * Mirror of remotely launched debugee.
- */
-final class RemoteLaunchedDebugee extends Debugee {
-
-    /** Enwrap the remotely started VM process. */
-    public RemoteLaunchedDebugee (Binder binder) {
-        super(binder);
-    }
-
-    // ---------------------------------------------- //
-
-    /** Return exit status of the debugee VM. */
-    public int getStatus () {
-        return binder.getRemoteProcessStatus();
-    }
-
-    /** Check whether the debugee VM has been terminated. */
-    public boolean terminated () {
-        return binder.isRemoteProcessTerminated();
-    }
-
-    // ---------------------------------------------- //
-
-    /** Kill the debugee VM. */
-    protected void killDebugee () {
-        super.killDebugee();
-        if (!terminated()) {
-            binder.killRemoteProcess();
-        }
-    }
-
-    /** Wait until the debugee VM shutdown or crash. */
-    protected int waitForDebugee () {
-        return binder.waitForRemoteProcess();
-    }
-
-    /** Get a pipe to write to the debugee's stdin stream. */
-    protected OutputStream getInPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debugee's stdout stream. */
-    protected InputStream getOutPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debugee's stderr stream. */
-    protected InputStream getErrPipe () {
-        return null;
-    }
-
-    public void redirectStdout(OutputStream out) {
-    }
-
-    public void redirectStdout(Log log, String prefix) {
-    }
-
-    public void redirectStderr(OutputStream out) {
-    }
-
-    public void redirectStderr(Log log, String prefix) {
-    }
-}
-
-
-/**
- * Mirror of manually launched debugee.
- */
-final class ManualLaunchedDebugee extends Debugee {
-    /** Enwrap the manually started VM process. */
-    public ManualLaunchedDebugee (Binder binder) {
-        super(binder);
-        makeInputReader();
-    }
-
-    // ---------------------------------------------- //
-
-    private int exitCode = 0;
-    private boolean finished = false;
-    private static BufferedReader bin = null;
-
-    public void launchDebugee(String commandLine) {
-        makeInputReader();
-
-        putMessage("Launch target VM using such command line:\n"
-                    + commandLine);
-        String answer = askQuestion("Has the VM successfully started? (yes/no)", "yes");
-        for ( ; ; ) {
-            if (answer.equals("yes"))
-                break;
-            if (answer.equals("no"))
-                throw new Failure ("Unable to manually launch debugee VM");
-            answer = askQuestion("Wrong answer. Please type yes or no", "yes");
-        }
-    }
-
-    private static void makeInputReader() {
-        if (bin == null) {
-            bin = new BufferedReader(new InputStreamReader(System.in));
-        }
-    }
-
-    private static void destroyInputReader() {
-        if (bin != null) {
-            try {
-                bin.close();
-            } catch (IOException e) {
-//                e.printStackTrace(log.getOutStream());
-                throw new Failure("Caught exception while closing input stream:\n\t" + e);
-            }
-            bin = null;
-        }
-    }
-
-    private static void putMessage(String msg) {
-        System.out.println("\n>>> " + msg);
-    }
-
-    private static String askQuestion(String question, String defaultAnswer) {
-        try {
-            System.out.print("\n>>> " + question);
-            System.out.print(" [" + defaultAnswer + "] ");
-            System.out.flush();
-            String answer = bin.readLine();
-            if (answer.equals(""))
-                return defaultAnswer;
-            return answer;
-        } catch (IOException e) {
-//            e.printStackTrace(log.getOutStream());
-            throw new Failure("Caught exception while reading answer:\n\t" + e);
-        }
-    }
-
-    /** Return exit status of the debugee VM. */
-    public int getStatus () {
-        if (! finished) {
-            throw new Failure("Unable to get status of debugee VM: process still alive");
-        }
-        return exitCode;
-    }
-
-    /** Check whether the debugee VM has been terminated. */
-    public boolean terminated () {
-        return finished;
-    }
-
-    // ---------------------------------------------- //
-
-    /** Kill the debugee VM. */
-    protected void killDebugee () {
-        super.killDebugee();
-        if (!terminated()) {
-            putMessage("Kill launched VM");
-            String answer = askQuestion("Has the VM successfully terminated? (yes/no)", "yes");
-            for ( ; ; ) {
-                if (answer.equals("yes")) {
-                    finished = true;
-                    break;
-                }
-                if (answer.equals("no"))
-                    throw new Failure ("Unable to manually kill debugee VM");
-                answer = askQuestion("Wrong answer. Please type yes or no", "yes");
-            }
-        }
-    }
-
-    /** Wait until the debugee VM shutdown or crash. */
-    protected int waitForDebugee () {
-        putMessage("Wait for launched VM to exit.");
-        String answer = askQuestion("What is VM exit code?", "95");
-        for ( ; ; ) {
-            try {
-                exitCode = Integer.parseInt(answer);
-                break;
-            } catch (NumberFormatException e) {
-                answer = askQuestion("Wrong answer. Please type integer value", "95");
-            }
-        }
-        finished = true;
-        return exitCode;
-    }
-
-    /** Get a pipe to write to the debugee's stdin stream. */
-    protected OutputStream getInPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debugee's stdout stream. */
-    protected InputStream getOutPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debugee's stderr stream. */
-    protected InputStream getErrPipe () {
-        return null;
-    }
-
-    public void redirectStdout(OutputStream out) {
-    }
-
-    public void redirectStdout(Log log, String prefix) {
-    }
-
-    public void redirectStderr(OutputStream out) {
-    }
-
-    public void redirectStderr(Log log, String prefix) {
-    }
-
-    public void close() {
-        destroyInputReader();
-        super.close();
-    }
-}
+}
\ No newline at end of file
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java
index dd6c8a1b82d..6b4f65bc625 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Debugee.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -47,7 +47,7 @@
  * @see Binder
  * @see DebugeeProcess
  */
-abstract public class Debugee extends DebugeeProcess {
+public class Debugee extends DebugeeProcess {
 
     /**
      * Mirror of the debugee VM. This must be initialized by every
@@ -68,6 +68,13 @@ protected Debugee (Binder binder) {
         this.argumentHandler = (ArgumentHandler)binder.getArgumentHandler();
     }
 
+    protected Debugee (Process process, Binder binder) {
+        super(binder);
+        this.process = process;
+        this.binder = binder;
+        this.argumentHandler = (ArgumentHandler)binder.getArgumentHandler();
+    }
+
     /** Setup <code>Debugee</code> object with given VM mirror. */
     public void setupVM(VirtualMachine vm) {
         if (this.vm != null) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Binder.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Binder.java
index 698ac2cbe89..0a15c23b004 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Binder.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Binder.java
@@ -98,13 +98,8 @@ public Debugee bindToDebugee (String classToExecute) {
 
         prepareForPipeConnection(argumentHandler);
 
-        if (argumentHandler.isLaunchedRemotely()) {
-            connectToBindServer(classToExecute);
-            debugee = launchDebugee(classToExecute);
-        } else {
-            debugee = launchDebugee(classToExecute);
-            debugee.redirectOutput(log);
-        }
+        debugee = launchDebugee(classToExecute);
+        debugee.redirectOutput(log);
 
         Transport transport = debugee.connect();
 
@@ -117,334 +112,16 @@ public Debugee bindToDebugee (String classToExecute) {
     public Debugee launchDebugee (String classToExecute) {
 
         try {
-
-            if (argumentHandler.isLaunchedLocally()) {
-                LocalLaunchedDebugee debugee = new LocalLaunchedDebugee(this);
-                String address = debugee.prepareTransport(argumentHandler);
-                if (address == null)
-                    address = makeTransportAddress();
-                String[] argsArray = makeCommandLineArgs(classToExecute, address);
-                debugee.launch(argsArray);
-                return debugee;
-            }
-
-            if (argumentHandler.isLaunchedRemotely()) {
-                RemoteLaunchedDebugee debugee = new RemoteLaunchedDebugee(this);
-                String address = debugee.prepareTransport(argumentHandler);
-                if (address == null)
-                    address = makeTransportAddress();
-                String[] argsArray = makeCommandLineArgs(classToExecute, address);
-                debugee.launch(argsArray);
-                return debugee;
-            }
-
-            if (argumentHandler.isLaunchedManually()) {
-                ManualLaunchedDebugee debugee = new ManualLaunchedDebugee(this);
-                String address = debugee.prepareTransport(argumentHandler);
-                if (address == null)
-                    address = makeTransportAddress();
-                String cmdLine = makeCommandLineString(classToExecute, address, "\"");
-                debugee.launch(cmdLine);
-                return debugee;
-            }
-
-            throw new TestBug("Unexpected launching mode: "
-                            + argumentHandler.getLaunchMode());
+            Debugee debugee = new Debugee(this);
+            String address = debugee.prepareTransport(argumentHandler);
+            if (address == null)
+                address = makeTransportAddress();
+            String[] argsArray = makeCommandLineArgs(classToExecute, address);
+            debugee.launch(argsArray);
+            return debugee;
         } catch (IOException e) {
             e.printStackTrace(log.getOutStream());
             throw new Failure("Caught exception while launching debugee:\n\t" + e);
         }
     }
-
-}
-
-/**
- * Mirror of locally launched debugee.
- */
-final class LocalLaunchedDebugee extends Debugee {
-
-    /** Enwrap the existing <code>VM</code> mirror. */
-    public LocalLaunchedDebugee (Binder binder) {
-        super(binder);
-        checkTermination = true;
-    }
-
-    // ---------------------------------------------- //
-
-    public void launch(String[] args) throws IOException {
-        String cmdLine = ArgumentHandler.joinArguments(args, "\"");
-        display("Starting java process:\n" + cmdLine);
-        process = binder.launchProcess(args);
-    }
-
-    /** Return exit status of the debugee VM. */
-    public int getStatus () {
-        return process.exitValue();
-    }
-
-    /** Check whether the debugee VM has been terminated. */
-    public boolean terminated () {
-        if (process == null)
-            return true;
-
-        try {
-            int value = process.exitValue();
-            return true;
-        } catch (IllegalThreadStateException e) {
-            return false;
-        }
-    }
-
-    // ---------------------------------------------- //
-
-    /** Kill the debugee VM. */
-    protected void killDebugee () {
-        super.killDebugee();
-        if (!terminated()) {
-            log.display("Killing debugee VM process");
-            process.destroy();
-        }
-    }
-
-    /** Wait until the debugee VM shutdown or crash. */
-    protected int waitForDebugee () throws InterruptedException {
-        return process.waitFor();
-    }
-
-    /** Get a pipe to write to the debugee's stdin stream. */
-    protected OutputStream getInPipe () {
-        return process.getOutputStream();
-    }
-
-    /** Get a pipe to read the debugee's stdout stream. */
-    protected InputStream getOutPipe () {
-        return process.getInputStream();
-    }
-
-    /** Get a pipe to read the debugee's stderr stream. */
-    protected InputStream getErrPipe () {
-        return process.getErrorStream();
-    }
-}
-
-
-/**
- * Mirror of remotely launched debugee.
- */
-final class RemoteLaunchedDebugee extends Debugee {
-
-    /** Enwrap the existing <code>VM</code> mirror. */
-    public RemoteLaunchedDebugee (Binder binder) {
-        super(binder);
-    }
-
-    // ---------------------------------------------- //
-
-    public void launch(String[] args) throws IOException {
-        String cmdLine = ArgumentHandler.joinArguments(args, "\"");
-        display("Starting remote java process:\n" + cmdLine);
-        binder.launchRemoteProcess(args);
-    }
-
-    /** Return exit status of the debugee VM. */
-    public int getStatus () {
-        return binder.getRemoteProcessStatus();
-    }
-
-    /** Check whether the debugee VM has been terminated. */
-    public boolean terminated () {
-        return binder.isRemoteProcessTerminated();
-    }
-
-    // ---------------------------------------------- //
-
-    /** Kill the debugee VM. */
-    protected void killDebugee () {
-        super.killDebugee();
-        if (!terminated()) {
-            log.display("Killing debugee VM process");
-            binder.killRemoteProcess();
-        }
-    }
-
-    /** Wait until the debugee VM shutdown or crash. */
-    protected int waitForDebugee () {
-        return binder.waitForRemoteProcess();
-    }
-
-    /** Get a pipe to write to the debugee's stdin stream. */
-    protected OutputStream getInPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debugee's stdout stream. */
-    protected InputStream getOutPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debugee's stderr stream. */
-    protected InputStream getErrPipe () {
-        return null;
-    }
-
-    public void redirectStdout(OutputStream out) {
-    }
-
-    public void redirectStdout(Log log, String prefix) {
-    }
-
-    public void redirectStderr(OutputStream out) {
-    }
-
-    public void redirectStderr(Log log, String prefix) {
-    }
-}
-
-
-/**
- * Mirror of manually launched debugee.
- */
-final class ManualLaunchedDebugee extends Debugee {
-
-    private int exitCode = 0;
-    private boolean finished = false;
-    private static BufferedReader bin = new BufferedReader(new InputStreamReader(System.in));
-
-    /** Enwrap the existing <code>VM</code> mirror. */
-    public ManualLaunchedDebugee (Binder binder) {
-        super(binder);
-    }
-
-    // ---------------------------------------------- //
-
-    public void launch(String commandLine) throws IOException {
-        putMessage("Launch target VM using such command line:\n"
-                    + commandLine);
-        String answer = askQuestion("Has the VM successfully started? (yes/no)", "yes");
-        for ( ; ; ) {
-            if (answer.equals("yes"))
-                break;
-            if (answer.equals("no"))
-                throw new Failure ("Unable to manually launch debugee VM");
-            answer = askQuestion("Wrong answer. Please type yes or no", "yes");
-        }
-    }
-
-    private void putMessage(String msg) {
-        System.out.println("\n>>> " + msg);
-    }
-
-    private String askQuestion(String question, String defaultAnswer) {
-        try {
-            System.out.print("\n>>> " + question);
-            System.out.print(" [" + defaultAnswer + "] ");
-            System.out.flush();
-            String answer = bin.readLine();
-            if (answer.equals(""))
-                return defaultAnswer;
-            return answer;
-        } catch (IOException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new Failure("Caught exception while reading answer:\n\t" + e);
-        }
-    }
-
-    /** Return exit status of the debugee VM. */
-    public int getStatus () {
-        if (! terminated()) {
-            throw new Failure("Unable to get status of debugee VM: process still alive");
-        }
-        return exitCode;
-    }
-
-    /** Check whether the debugee VM has been terminated. */
-    public boolean terminated () {
-        if(! finished) {
-            String answer = askQuestion("Has the VM exited?", "no");
-            for ( ; ; ) {
-                if (answer.equals("no"))
-                    return false;
-                if (answer.equals("yes")) {
-                    finished = true;
-                    waitForDebugee();
-                    break;
-                }
-                answer = askQuestion("Wrong answer. Please type yes or no", "yes");
-            }
-        }
-        return finished;
-    }
-
-    // ---------------------------------------------- //
-
-    /** Kill the debugee VM. */
-    protected void killDebugee () {
-        super.killDebugee();
-        if (!terminated()) {
-            putMessage("Kill launched VM");
-            String answer = askQuestion("Has the VM successfully terminated? (yes/no)", "yes");
-            for ( ; ; ) {
-                if (answer.equals("yes")) {
-                    finished = true;
-                    break;
-                }
-                if (answer.equals("no"))
-                    throw new Failure ("Unable to manually kill debugee VM");
-                answer = askQuestion("Wrong answer. Please type yes or no", "yes");
-            }
-        }
-    }
-
-    /** Wait until the debugee VM shutdown or crash. */
-    protected int waitForDebugee () {
-        putMessage("Wait for launched VM to exit.");
-        String answer = askQuestion("What is VM exit code?", "95");
-        for ( ; ; ) {
-            try {
-                exitCode = Integer.parseInt(answer);
-                break;
-            } catch (NumberFormatException e) {
-                answer = askQuestion("Wrong answer. Please type integer value", "95");
-            }
-        }
-        finished = true;
-        return exitCode;
-    }
-
-    /** Get a pipe to write to the debugee's stdin stream. */
-    protected OutputStream getInPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debugee's stdout stream. */
-    protected InputStream getOutPipe () {
-        return null;
-    }
-
-    /** Get a pipe to read the debugee's stderr stream. */
-    protected InputStream getErrPipe () {
-        return null;
-    }
-
-    public void redirectStdout(OutputStream out) {
-    }
-
-    public void redirectStdout(Log log, String prefix) {
-    }
-
-    public void redirectStderr(OutputStream out) {
-    }
-
-    public void redirectStderr(Log log, String prefix) {
-    }
-
-    public void close() {
-        try {
-            bin.close();
-        } catch (IOException e) {
-            log.display("WARNING: Caught IOException while closing InputStream");
-        }
-        bin = null;
-        super.close();
-    }
-}
+}
\ No newline at end of file
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Debugee.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Debugee.java
index ba1b4129cc7..ef95ee88560 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Debugee.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdwp/Debugee.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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,7 +46,7 @@
  * @see Transport
  * @see DebugeeProcess
  */
-abstract public class Debugee extends DebugeeProcess {
+public class Debugee extends DebugeeProcess {
 
     /** Binder that creates this debugee. */
     protected Binder binder = null;
@@ -63,6 +63,12 @@ protected Debugee (Binder binder) {
         prefix = "Debugee> ";
     }
 
+    public void launch(String[] args) throws IOException {
+        String cmdLine = ArgumentHandler.joinArguments(args, "\"");
+        display("Starting java process:\n" + cmdLine);
+        process = binder.launchProcess(args);
+    }
+
     /** Return <code>Binder</code> of the debugee object. */
     public Binder getBinder() {
         return binder;
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeArgumentHandler.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeArgumentHandler.java
index 98f11a426ea..72461a52309 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeArgumentHandler.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeArgumentHandler.java
@@ -57,8 +57,6 @@
  *   (this works only with <code>-connector=listening</code> and <code>-transport=socket</code>)
  * <li> <code>-debugee.suspend=[yes|no|default]</code> -
  *   should debugee start in suspend mode or not
- * <li> <code>-debugee.launch=[local|remote|manual]</code> -
- *   launch and bind to debugee VM locally, remotely (via BindSever) or manually
  * <li> <code>-debugee.vmhome=</code>&lt;<i>path</i>&gt; -
  *   path to JDK used for launching debugee VM
  * <li> <code>-debugee.vmkind=</code>&lt;<i>name</i>&gt; -
@@ -275,11 +273,8 @@ public boolean isDefaultDebugeeSuspendMode() {
      * @see #isDefaultDebugeeSuspendMode()
      */
     public boolean willDebugeeSuspended() {
-        if (isLaunchedLocally()) {
-            String mode = getDebugeeSuspendMode();
-            return mode.equals("no");
-        }
-        return true;
+        String mode = getDebugeeSuspendMode();
+        return mode.equals("no");
     }
 
     private boolean pipePortInited = false;
@@ -337,54 +332,6 @@ public void setPipePortNumber(int port) {
         setOption("-", "pipe.port", value);
     }
 
-    /**
-     * Return debugee VM launching mode, specified by
-     * <code>-launch.mode</code> command line option, or
-     * "<i>local</i>" string by default.
-     *
-     * Possible values for this option are:
-     * <ul>
-     * <li> "<code>local</code>"
-     * <li> "<code>remote</code>"
-     * <li> "<code>manual</code>"
-     * </ul>
-     *
-     * @see #isLaunchedLocally()
-     * @see #isLaunchedRemotely()
-     * @see #isLaunchedManually()
-     * @see #setRawArguments(String[])
-     */
-    public String getLaunchMode() {
-        return options.getProperty("debugee.launch", "local");
-    }
-
-    /**
-     * Return <i>true</i> if debugee should be launched locally.
-     *
-     * @see #getLaunchMode()
-     */
-    public boolean isLaunchedLocally() {
-        return getLaunchMode().equals("local");
-    }
-
-    /**
-     * Return <i>true</i> if debugee should be launched remotely via
-     * BindServer.
-     *
-     * @see #getLaunchMode()
-     */
-    public boolean isLaunchedRemotely() {
-        return getLaunchMode().equals("remote");
-    }
-
-    /**
-     * Return <i>true</i> if debugee should be launched manually by user.
-     *
-     * @see #getLaunchMode()
-     */
-    public boolean isLaunchedManually() {
-        return getLaunchMode().equals("manual");
-    }
 
     /**
      * Return additional options for launching debugee VM, specified by
@@ -710,9 +657,7 @@ protected boolean checkOption(String option, String value) {
         }
 
         // option with any nonempty string value
-        if (option.equals("test.host")
-            || option.equals("debugee.host")
-            || option.equals("debugee.vmkind")
+        if (option.equals("debugee.vmkind")
             || option.equals("debugee.vmhome")
             || option.equals("transport.shname")) {
             if (value.length() <= 0) {
@@ -748,14 +693,10 @@ protected boolean checkOption(String option, String value) {
             return true;
         }
 
-        if (option.equals("debugee.launch")) {
-            if ((!value.equals("local"))
-                && (!value.equals("remote"))
-                && (!value.equals("manual"))) {
-                throw new BadOption(option + ": must be one of: "
-                                           + "local, remote, manual " + value);
-            }
-            return true;
+        if (option.equals("debugee.launch")
+                || option.equals("debugee.host")
+                || option.equals("test.host")) {
+            throw new RuntimeException("option " + option + " is not supported.");
         }
 
         if (option.equals("jvmdi.strict")) {
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java
index 58732bd0aa4..d36c9d9624f 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeBinder.java
@@ -35,15 +35,6 @@
  * debuggee VM and to make connection to it using JDI connector or
  * JDWP transport.
  * <p>
- * The present version of <code>Binder</code> allows
- * to launch debuggee VM either on local machine (<i>local</i> launch mode),
- * or on remote host using <code>BindServer</code> utility
- * (<i>remote</i> launch mode). Also there is an ability to launch
- * debuggee VM manually as a separate process on local or remote machine
- * (<i>manual</i> launch mode), which is usefull for debugging.
- * All these launching modes are specified by command line option
- * <code>-debugee.launch</code> recognized by <code>DebugeeArgumentHandler</code>.
- * <p>
  * <code>Binder</code> also makes it possible to establish TCP/IP
  * connection between debugger and debuggee throw <code>IOPipe</code>
  * object. This connection allows debugger to communicate with debuggee
@@ -105,8 +96,6 @@ public static String getVersion () {
     }
 
     // -------------------------------------------------- //
-
-    private BindServerListener bindServerListener = null;
     private ServerSocket pipeServerSocket = null;
 
     // -------------------------------------------------- //
@@ -320,11 +309,11 @@ public String[] makeCommandLineArgs(String classToExecute, String transportAddre
             }
         }
 
-/*
-        String classPath = System.getProperty("java.class.path");
-        args.add("-classpath")
+
+        String classPath = System.getProperty("test.class.path");
+        args.add("-classpath");
         args.add(classPath);
- */
+
 
         String server;
         if (argumentHandler.isAttachingConnector()) {
@@ -386,356 +375,12 @@ public String[] makeCommandLineArgs(String classToExecute) {
         return makeCommandLineArgs(classToExecute, makeTransportAddress());
     }
 
-    /**
-     * Make connection to remote BindServer and start BindServerListener thread.
-     *
-     * @throws IOException if I/O error occured while connecting
-     */
-    public void connectToBindServer(String taskID) {
-        if (bindServerListener != null) {
-            throw new Failure("Connection to BindServer already exists");
-        }
-        try {
-            bindServerListener = new BindServerListener(this);
-            bindServerListener.setDaemon(true);
-            bindServerListener.connect(taskID);
-            bindServerListener.start();
-        } catch (IOException e) {
-            e.printStackTrace(getOutStream());
-            throw new Failure("Caught exception while connecting to BindServer:\n\t" + e);
-        }
-    }
-
-    /**
-     * Split string into list of substrings using specified separator.
-     */
-    private static String[] splitString(String givenString, String separator) {
-        Vector<String> tmpList = new Vector<String>();
-        StringTokenizer tokenizer = new StringTokenizer(givenString, separator);
-        while(tokenizer.hasMoreTokens()) {
-            tmpList.add(tokenizer.nextToken());
-        }
-        String[] list = new String[tmpList.size()];
-        for (int i = 0; i < tmpList.size(); i++) {
-            list[i] = tmpList.elementAt(i);
-        }
-        return list;
-    }
-
-    /**
-     * Send command to remote <code>BindServer</code> and receive reply.
-     *
-     * @throws IOException if I/O error occured while launching process
-     */
-    public synchronized Object sendRemoteCommand(Object command) {
-        try {
-            bindServerListener.sendCommand(command);
-            Object reply = bindServerListener.getReply();
-            return reply;
-        } catch (IOException e) {
-            e.printStackTrace(log.getOutStream());
-            throw new Failure("Unexpected exception while sending command to BindServer:\n\t"
-                            + e);
-        }
-    }
-
-    /**
-     * Launch remote process using request to <code>BindServer</code>.
-     *
-     * @throws IOException if I/O error occured
-     */
-    public void launchRemoteProcess(String[] args) throws IOException {
-        String pathSeparator = System.getProperty("path.separator");
-        BindServer.LaunchDebugee command =
-            new BindServer.LaunchDebugee(args,
-                    System.getProperty("file.separator"),
-                    System.getProperty("user.dir"),
-                    splitString(System.getProperty("java.library.path"), pathSeparator),
-                    splitString(System.getProperty("java.class.path"), pathSeparator),
-                    splitString(System.getProperty("java.library.path"), pathSeparator));
-
-        Object reply = sendRemoteCommand(command);
-        if (reply instanceof BindServer.OK) {
-            // do nothing
-        } else if (reply instanceof BindServer.RequestFailed) {
-            BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply;
-            throw new Failure("BindServer error: " + castedReply.reason);
-        } else {
-            throw new Failure("Wrong reply from BindServer: " + reply);
-        }
-    }
-
-    /**
-     * Return exit status of the remotely launched process
-     * using request to <code>BindServer</code>.
-     */
-    public int getRemoteProcessStatus () {
-        Object reply = sendRemoteCommand(new BindServer.DebugeeExitCode());
-        if (reply instanceof BindServer.OK) {
-            BindServer.OK castedReply = (BindServer.OK)reply;
-            return (int)castedReply.info;
-        } else if (reply instanceof BindServer.CaughtException) {
-            BindServer.CaughtException castedReply = (BindServer.CaughtException)reply;
-            throw new IllegalThreadStateException(castedReply.reason);
-        } else if (reply instanceof BindServer.RequestFailed) {
-            BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply;
-            throw new Failure("BindServer error: " + castedReply.reason);
-        } else {
-            throw new Failure("Wrong reply from BindServer: " + reply);
-        }
-    }
-
-    /**
-     * Check whether the remotely launched process has been terminated
-     * using request to <code>BindServer</code>.
-     */
-    public boolean isRemoteProcessTerminated () {
-        try {
-            int value = getRemoteProcessStatus();
-            return true;
-        } catch (IllegalThreadStateException e) {
-            return false;
-        }
-    }
-
-    // ---------------------------------------------- //
-
-    /**
-     * Kill the remotely launched process
-     * using request to <code>BindServer</code>.
-     */
-    public void killRemoteProcess () {
-        Object reply = sendRemoteCommand(new BindServer.KillDebugee());
-        if (reply instanceof BindServer.OK) {
-            return;
-        } else if (reply instanceof BindServer.RequestFailed) {
-            BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply;
-            throw new Failure("BindServer error: " + castedReply.reason);
-        } else {
-            throw new Failure("Wrong reply from BindServer: " + reply);
-        }
-    }
-
-    /**
-     * Wait until the remotely launched process exits or crashes
-     * using request to <code>BindServer</code>.
-     */
-    public int waitForRemoteProcess () {
-
-        Object reply = sendRemoteCommand(new BindServer.WaitForDebugee(0));
-        if (reply instanceof BindServer.OK) {
-            BindServer.OK castedReply = (BindServer.OK)reply;
-            return (int)castedReply.info;
-        } else if (reply instanceof BindServer.RequestFailed) {
-            BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply;
-            throw new Failure("BindServer error: " + castedReply.reason);
-        } else {
-            throw new Failure("Wrong reply from BindServer: " + reply);
-        }
-    }
 
     /**
      * Close binder by closing all started threads.
      */
     public void close() {
-        if (bindServerListener != null) {
-            bindServerListener.close();
-        }
         closePipeServerSocket();
     }
 
-    /**
-     * Separate thread for listening connection from <code>BindServer</code>.
-     */
-    private class BindServerListener extends Thread {
-        private SocketConnection connection = null;
-        private Log.Logger logger = null;
-
-        /** List of received responses from <code>BindServer</code>. */
-        private LinkedList<BindServer.Response> replies = new LinkedList<BindServer.Response>();
-
-        /**
-         * Make thread.
-         */
-        public BindServerListener(Log.Logger logger) {
-            this.logger = logger;
-        }
-
-        /**
-         * Establish connection to <code>BindServer</code>.
-         */
-        public void connect(String taskID) throws IOException {
-            String host = argumentHandler.getDebugeeHost();
-            int port = argumentHandler.getBindPortNumber();
-            display("Connecting to BindServer: " + host + ":" + port);
-            connection = new SocketConnection(logger, "BindServer");
-//            connection.setPingTimeout(DebugeeBinder.PING_TIMEOUT);
-            connection.attach(host, port);
-            handshake(taskID);
-        }
-
-        /**
-         * Receive OK(version) from BindServer and check received version number.
-         */
-        private void handshake(String taskID) {
-            // receive OK(version)
-            trace(TRACE_LEVEL_ACTIONS, "Waiting for initial OK(version) from BindServer");
-            Object reply = connection.readObject();
-            trace(TRACE_LEVEL_ACTIONS, "Got initial OK(version) from BindServer: " + reply);
-            if (reply instanceof BindServer.RequestFailed) {
-                BindServer.RequestFailed castedReply = (BindServer.RequestFailed)reply;
-                trace(TRACE_LEVEL_ACTIONS, "Reply is RequestFailed: throw Failure");
-                throw new Failure("BindServer error: " + castedReply.reason);
-            } else if (reply instanceof BindServer.OK) {
-                BindServer.OK castedReply = (BindServer.OK)reply;
-                trace(TRACE_LEVEL_ACTIONS, "Reply is OK: check BindServer version");
-                if (castedReply.info != BindServer.VERSION) {
-                    throw new Failure("Wrong version of BindServer: " + castedReply.info
-                                    + " (expected: " + BindServer.VERSION + ")");
-                }
-                display("Connected to BindServer: version " + castedReply.info);
-            } else {
-                trace(TRACE_LEVEL_ACTIONS, "Reply is unknown: throw Failure");
-                throw new Failure("Wrong reply from BindServer: " + reply);
-            }
-
-            // send TaskID(id)
-            try {
-                trace(TRACE_LEVEL_ACTIONS, "Sending TaskID(id) to BindServer");
-                sendCommand(new BindServer.TaskID(taskID));
-                trace(TRACE_LEVEL_ACTIONS, "Sent TaskID(id) to BindServer");
-            } catch (IOException e) {
-                throw new Failure("Caught IOException while sending TaskID(id) to BindServer:\n\t"
-                                + e);
-            }
-        }
-
-        /**
-         * Check if thread is connected to <code>BindServer</code>.
-         */
-        public boolean isConnected() {
-            return (connection != null && connection.isConnected());
-        }
-
-        /**
-         * Send a command to </code>BindServer</code>.
-         */
-        public synchronized void sendCommand(Object command) throws IOException {
-            connection.writeObject(command);
-        }
-
-        /**
-         * Receive response from <code>BindServer</code>.
-         */
-        public Object getReply() {
-            synchronized (replies) {
-                while (replies.isEmpty()) {
-                    if (!isConnected()) {
-                        throw new Failure("No reply from BindServer: connection lost");
-                    }
-                    try {
-                        replies.wait(TRY_DELAY);
-                    } catch (InterruptedException e) {
-                        e.printStackTrace(getOutStream());
-                        throw new Failure("Thread interrupted while waiting for reply from BindServer:\n\t"
-                                        + e);
-                    }
-                }
-                Object reply = replies.removeFirst();
-                if (reply == null) {
-                    throw new Failure("No reply from BindServer: connection lost");
-                }
-                return reply;
-            }
-        }
-
-        /**
-         * Add response object to the list of received responses.
-         */
-        private void addReply(BindServer.Response reply) {
-            synchronized (replies) {
-                replies.add(reply);
-                replies.notifyAll();
-            }
-        }
-
-        /**
-         * Read packets from <code>BindServer<code> connection and
-         * notify waiting thread if response or IOPipe message received.
-         * Received lines of redirected streams are put into log.
-         */
-        public void run() {
-            trace(TRACE_LEVEL_THREADS, "BindServerListener thread started");
-            try {
-                for (;;) {
-                    Object reply = connection.readObject();
-                    if (reply == null) {
-                        break;
-                    } else if (reply instanceof BindServer.Disconnect) {
-                        reply = null;
-                        trace(TRACE_LEVEL_ACTIONS, "Packet is Disconnect: close connection");
-                        break;
-                    } else if (reply instanceof BindServer.RedirectedStream) {
-                        BindServer.RedirectedStream castedReply = (BindServer.RedirectedStream)reply;
-                        trace(TRACE_LEVEL_ACTIONS, "Packet is RedirectedStream: put message into log");
-                        log.println(castedReply.line);
-                    } else if (reply instanceof BindServer.Response) {
-                        BindServer.Response castedReply = (BindServer.Response)reply;
-                        trace(TRACE_LEVEL_ACTIONS, "Packet is reply: notify all threads waiting for reply");
-                        addReply(castedReply);
-                    } else {
-                        trace(TRACE_LEVEL_ACTIONS, "Packet is unknown: throw Failure");
-                        throw new Failure("Wrong reply from BindServer: " + reply);
-                    }
-                }
-            } catch (Exception e) {
-                e.printStackTrace(getOutStream());
-                complain("Caught exception while reading packets from BindServer:\n\t" + e);
-            } finally {
-                closeConnection();
-                addReply(null);
-                trace(TRACE_LEVEL_THREADS, "BindServerListener thread finished");
-            }
-        }
-
-        /**
-         * Send Disconnect command to </code>BindServer</code>.
-         */
-        public void disconnect() {
-            if (connection == null) return;
-            try {
-                sendCommand(new BindServer.Disconnect());
-            } catch (IOException e) {
-                display("Caught IOException while requesting disconnection with BindServer");
-            }
-        }
-
-        /**
-         * Close socket connection.
-         */
-        public void closeConnection() {
-            if (connection != null) {
-                connection.close();
-            }
-        }
-
-        /**
-         * Wait for thread finished in the specified timeout or interrupt it.
-         */
-        public void waitForThread(long millis) {
-            DebugeeBinder.waitForThread(this, millis, logger);
-        }
-
-        /**
-         * Close this thread by waiting for it finishes or interrupt it
-         * and close socket connection.
-         */
-        public void close() {
-            disconnect();
-            waitForThread(DebugeeBinder.THREAD_TIMEOUT);
-            closeConnection();
-        }
-
-    } // BindServerListener
-
 } // DebugeeBinder
diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeProcess.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeProcess.java
index 6eb1f327660..b875911e973 100644
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeProcess.java
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/DebugeeProcess.java
@@ -74,8 +74,8 @@ abstract public class DebugeeProcess {
     /** Argument handler from binder. */
     protected DebugeeArgumentHandler argumentHandler = null;
 
-    /** Need or not to check debuggee process termination at exit. */
-    protected boolean checkTermination = false;
+    /** Need or not to check debuggee process termination. */
+    private boolean checkTermination = true;
 
     /** Debugee VM process or <i>null</i> if not available. */
     protected Process process = null;
@@ -164,26 +164,50 @@ public void sendSignal(String signal) {
     // --------------------------------------------------- //
 
     /** Wait until the debugee VM shutdown or crash. */
-    abstract protected int waitForDebugee () throws InterruptedException;
+    protected int waitForDebugee() throws InterruptedException {
+        return process.waitFor();
+    }
 
     /** Kill the debugee VM. */
-    abstract protected void killDebugee ();
+    protected void killDebugee() {
+        if (!terminated()) {
+            log.display("Killing debugee VM process");
+            process.destroy();
+        }
+    }
 
     /** Check whether the debugee VM has been terminated. */
-    abstract public boolean terminated ();
+     public boolean terminated() {
+        if (process == null)
+            return true;
+
+        try {
+            int value = process.exitValue();
+            return true;
+        } catch (IllegalThreadStateException e) {
+            return false;
+        }
+    }
 
     /** Return the debugee VM exit status. */
-    abstract public int getStatus ();
+    public int getStatus() {
+        return process.exitValue();
+    }
 
     /** Get a pipe to write to the debugee's stdin stream. */
-    abstract protected OutputStream getInPipe ();
+    protected OutputStream getInPipe() {
+        return process.getOutputStream();
+    }
 
     /** Get a pipe to read the debugee's stdout stream. */
-    abstract protected InputStream getOutPipe ();
+    protected InputStream getOutPipe() {
+        return process.getInputStream();
+    }
 
     /** Get a pipe to read the debugee's stderr stream. */
-    abstract protected InputStream getErrPipe ();
-
+    protected InputStream getErrPipe() {
+        return process.getErrorStream();
+    }
     // --------------------------------------------------- //
 
     /**
diff --git a/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/LogCompilationTest.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/LogCompilationTest.java
index 0d24be9a16d..0a069d272c0 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/LogCompilationTest.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/LogCompilationTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -29,7 +29,6 @@
 import nsk.share.log.LogSupport;
 import vm.share.options.Option;
 import vm.share.options.OptionSupport;
-import vm.share.process.ProcessExecutor;
 
 import java.io.File;
 import java.io.FileNotFoundException;
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessExecutor.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/ProcessExecutor.java
similarity index 96%
rename from test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessExecutor.java
rename to test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/ProcessExecutor.java
index 0d9a0e06329..9ab0a781d1f 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessExecutor.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/ProcessExecutor.java
@@ -20,23 +20,16 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.process;
+package vm.compiler.complog.share;
 
 import nsk.share.TestBug;
 import nsk.share.TestFailure;
 import nsk.share.log.Log;
-import vm.share.ProcessUtils;
 
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.BufferedReader;
 import java.io.OutputStream;
 import java.io.PrintStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
 import java.io.IOException;
 import java.util.*;
-import java.lang.reflect.Field;
 
 public class ProcessExecutor {
     private static long CLEANUP_TIMEOUT = 60000;
@@ -138,8 +131,8 @@ public int waitFor(long timeout) {
         return -1;
     }
 
-    public int getPid() {
-        return ProcessUtils.getPid(process);
+    public long getPid() {
+        return process.pid();
     }
 
     public OutputStream getStdIn() {
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamListener.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamListener.java
similarity index 97%
rename from test/hotspot/jtreg/vmTestbase/vm/share/process/StreamListener.java
rename to test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamListener.java
index 26c542f9bd0..c2d4e58c5bd 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamListener.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamListener.java
@@ -20,7 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.process;
+package vm.compiler.complog.share;
 
 /*
  * StreamListener listens on events from BufferedInputStream.
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamLogger.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamLogger.java
similarity index 98%
rename from test/hotspot/jtreg/vmTestbase/vm/share/process/StreamLogger.java
rename to test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamLogger.java
index 5162e4010ff..690f0bbfbfc 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamLogger.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamLogger.java
@@ -20,7 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.process;
+package vm.compiler.complog.share;
 
 import nsk.share.log.Log;
 
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamReader.java b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamReader.java
similarity index 99%
rename from test/hotspot/jtreg/vmTestbase/vm/share/process/StreamReader.java
rename to test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamReader.java
index a8f56318da5..d983ae1aebe 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamReader.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/compiler/complog/share/StreamReader.java
@@ -20,7 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.process;
+package vm.compiler.complog.share;
 
 import java.io.InputStream;
 import java.io.InputStreamReader;
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/func/findByName/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/func/findByName/Test.java
index f891b980f82..f78c9221dd5 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/func/findByName/Test.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/func/findByName/Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, 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
@@ -50,7 +50,7 @@
 
 import vm.mlvm.hiddenloader.share.HiddenkTestee01;
 import vm.mlvm.share.MlvmTest;
-import vm.share.FileUtils;
+import vm.mlvm.share.FileUtils;
 
 public class Test extends MlvmTest {
     private static final Class<?> PARENT = HiddenkTestee01.class;
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/share/StressClassLoadingTest.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/share/StressClassLoadingTest.java
index edb91743c44..b269d7aa57f 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/share/StressClassLoadingTest.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/share/StressClassLoadingTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,24 +23,25 @@
 
 package vm.mlvm.hiddenloader.share;
 
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodHandles.Lookup;
+
 
 import java.io.File;
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodHandles.Lookup;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
+
 import nsk.share.test.Stresser;
-import vm.share.options.Option;
-import vm.share.options.OptionSupport;
-import vm.share.options.IgnoreUnknownArgumentsHandler;
 import vm.mlvm.share.Env;
 import vm.mlvm.share.MlvmTest;
 import vm.mlvm.share.CustomClassLoaders;
-import vm.share.FileUtils;
-import vm.share.UnsafeAccess;
+import vm.mlvm.share.FileUtils;
+import vm.share.options.Option;
+import vm.share.options.OptionSupport;
+import vm.share.options.IgnoreUnknownArgumentsHandler;
 
 /**
  * Does stress-testing of class loading subsystem.
@@ -164,7 +165,7 @@ public void run() {
                             c = CustomClassLoaders.makeClassBytesLoader(classBytes, className)
                                     .loadClass(className);
                         }
-                        UnsafeAccess.unsafe.ensureClassInitialized(c);
+                        MethodHandles.lookup().ensureInitialized(c);
                     } catch (Throwable e) {
                         Env.traceVerbose(e, "parser caught exception");
                     }
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/byteMutation/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/byteMutation/Test.java
index e6a3e8a890d..e9a49e119c8 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/byteMutation/Test.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/byteMutation/Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, 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
@@ -44,7 +44,7 @@
 
 import vm.mlvm.hiddenloader.share.HiddenkTestee01;
 import vm.mlvm.hiddenloader.share.StressClassLoadingTest;
-import vm.share.FileUtils;
+import vm.mlvm.share.FileUtils;
 import vm.share.options.Option;
 
 /**
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/heap/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/heap/Test.java
index ea59685dfd3..47de7772930 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/heap/Test.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/heap/Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, 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
@@ -51,7 +51,7 @@
 import vm.mlvm.share.MlvmOOMTest;
 import vm.mlvm.share.MlvmTestExecutor;
 import vm.mlvm.share.Env;
-import vm.share.FileUtils;
+import vm.mlvm.share.FileUtils;
 
 /**
  * This test loads a class using defineHiddenClass, creates instances
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/metaspace/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/metaspace/Test.java
index 85bb7c6167f..886e2e3d525 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/metaspace/Test.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/oome/metaspace/Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, 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
@@ -51,7 +51,7 @@
 import vm.mlvm.share.MlvmOOMTest;
 import vm.mlvm.share.MlvmTestExecutor;
 import vm.mlvm.share.Env;
-import vm.share.FileUtils;
+import vm.mlvm.share.FileUtils;
 
 /**
  * This test loads classes using defineHiddenClass and stores them,
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/parallelLoad/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/parallelLoad/Test.java
index fa4dbf3f4eb..b3e433df957 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/parallelLoad/Test.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/hiddenloader/stress/parallelLoad/Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2024, 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
@@ -51,7 +51,7 @@
 import vm.mlvm.hiddenloader.share.HiddenkTestee01;
 import vm.mlvm.share.MlvmTestExecutor;
 import vm.mlvm.share.MultiThreadedTest;
-import vm.share.FileUtils;
+import vm.mlvm.share.FileUtils;
 
 /**
  * Verifies that loading classes in parallel from several threads using
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java
index beb77041fdb..6f2c82923b2 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/indy/stress/gc/lotsOfCallSites/Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -47,15 +47,11 @@
 package vm.mlvm.indy.stress.gc.lotsOfCallSites;
 
 import java.lang.invoke.CallSite;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodType;
 import java.lang.ref.PhantomReference;
 import java.lang.ref.Reference;
 import java.lang.ref.ReferenceQueue;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.management.MemoryMXBean;
 import java.lang.management.MemoryPoolMXBean;
 import java.lang.management.ManagementFactory;
@@ -67,8 +63,8 @@
 import nsk.share.test.Stresser;
 import vm.mlvm.share.CustomClassLoaders;
 import vm.mlvm.share.Env;
+import vm.mlvm.share.FileUtils;
 import vm.mlvm.share.MlvmTest;
-import vm.share.FileUtils;
 import vm.share.options.Option;
 
 /**
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/CustomClassLoaders.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/CustomClassLoaders.java
index 9596f7b1eab..6be720088ac 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/CustomClassLoaders.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/CustomClassLoaders.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2024, 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,8 +25,6 @@
 
 import java.io.IOException;
 
-import vm.share.FileUtils;
-
 public class CustomClassLoaders {
 
     public static ClassLoader makeClassBytesLoader(final byte[] classBytes,
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/FileUtils.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/FileUtils.java
similarity index 99%
rename from test/hotspot/jtreg/vmTestbase/vm/share/FileUtils.java
rename to test/hotspot/jtreg/vmTestbase/vm/mlvm/share/FileUtils.java
index 1652e75beaf..c749551e85b 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/FileUtils.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/FileUtils.java
@@ -20,7 +20,7 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share;
+package vm.mlvm.share;
 
 import java.io.File;
 import java.io.FileInputStream;
diff --git a/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/MlvmTestExecutor.java b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/MlvmTestExecutor.java
index 2c219309b63..5ff219e8271 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/MlvmTestExecutor.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/mlvm/share/MlvmTestExecutor.java
@@ -23,12 +23,16 @@
 
 package vm.mlvm.share;
 
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
 import java.lang.reflect.Constructor;
 import java.util.List;
 
+import com.sun.management.HotSpotDiagnosticMXBean;
+
 import nsk.share.Consts;
 import nsk.share.ArgumentParser;
-import vm.share.ProcessUtils;
 import vm.share.options.IgnoreUnknownArgumentsHandler;
 import vm.share.options.OptionSupport;
 
@@ -261,10 +265,23 @@ public static void launch(Class<?> testClass, Object[] constructorArgs) {
         }
     }
 
+    private static void dumpHeapWithHotspotDiagnosticMXBean(String fileName) throws IOException {
+        System.err.println("Dumping heap to " + fileName);
+
+        File f = new File(fileName);
+        if (f.exists())
+            f.delete();
+
+        HotSpotDiagnosticMXBean b = ManagementFactory.getPlatformMXBeans(
+                com.sun.management.HotSpotDiagnosticMXBean.class).get(0);
+        b.dumpHeap(fileName, false);
+    }
+
+
     private static void optionallyDumpHeap() {
         try {
             if (MlvmTest.getHeapDumpAfter()) {
-                ProcessUtils.dumpHeapWithHotspotDiagnosticMXBean(HEAP_DUMP_FILENAME);
+                dumpHeapWithHotspotDiagnosticMXBean(HEAP_DUMP_FILENAME);
             }
         } catch (Exception e) {
             Env.traceNormal(e, "Error dumping heap: ");
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/CommentedFileReader.java b/test/hotspot/jtreg/vmTestbase/vm/share/CommentedFileReader.java
deleted file mode 100644
index 019d237482c..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/CommentedFileReader.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share;
-
-import java.io.*;
-import java.util.LinkedList;
-
-/**
- * Utility class intended to read file line by line and skip comments.
- */
-public class CommentedFileReader {
-
-    /**
-     * Type of comments that should be removed from file.
-     */
-    public static enum CommentStyle {
-        /**
-         * Comments started with <i>#</i>.
-         */
-        BASH,
-        /**
-         * Comments started with <i>//</i>.
-         */
-        JAVA
-    }
-
-    /**
-     * Get lines from specified file and filter out comments.
-     * Only comments in BASH style will be filtered out.
-     *
-     * @param path to file that should be readed
-     * @return filtered lines from file
-     */
-    public static String[] readFile(String path) throws IOException {
-        return readFile(new File(path), CommentStyle.BASH);
-    }
-
-    /**
-     * Get lines from specified file and filter out comments.
-     * Only comments in BASH style will be filtered out.
-     *
-     * @param file that should be readed
-     * @return filtered lines from file
-     */
-    public static String[] readFile(File file) throws IOException {
-        return readFile(file, CommentStyle.BASH);
-    }
-
-    /**
-     * Get lines from specified file without comments.
-     *
-     * @param path to file that should be readed
-     * @param commentStyle describes what strings will be treated as comments
-     * @return filtered lines from file
-     */
-    public static String[] readFile(String path, CommentStyle commentStyle) throws IOException {
-        return readFile(new File(path), commentStyle);
-    }
-
-    /**
-     * Get lines from specified file without comments.
-     *
-     * @param file that should be readed
-     * @param commentStyle describes what strings will be treated as comments
-     * @return filtered lines from file
-     */
-    public static String[] readFile(File file, CommentStyle commentStyle) throws IOException {
-        LinkedList<String> entries = new LinkedList<String>();
-        BufferedReader reader = new BufferedReader(new FileReader(file));
-        String commentBeginning;
-
-        switch (commentStyle) {
-        case BASH:
-            commentBeginning = "#";
-            break;
-        case JAVA:
-            commentBeginning = "//";
-            break;
-        default:
-            throw new IllegalArgumentException("Unknown comment style");
-        }
-
-        while (true) {
-            String entry = reader.readLine();
-            if (entry == null) {
-                break;
-            }
-
-            entry = entry.replaceAll(commentBeginning + ".*", "").trim();
-
-            if (entry.length() > 0) {
-                entries.add(entry);
-            }
-        }
-
-        return entries.toArray(new String[entries.size()]);
-    }
-
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.cpp b/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.cpp
index c69025fe4c2..1f7305b381c 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.cpp
+++ b/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.cpp
@@ -21,12 +21,8 @@
  * questions.
  */
 #include "jni.h"
-#include "native_thread.hpp"
 #ifdef _WIN32
 #include <windows.h>
-#include <process.h>
-#include <vdmdbg.h>
-#include <dbghelp.h>
 #else /* _WIN32 */
 #include <unistd.h>
 #include <signal.h>
@@ -35,40 +31,6 @@
 
 extern "C" {
 
-/*
- * Class:     vm_share_ProcessUtils
- * Method:    sendSignal
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL Java_vm_share_ProcessUtils_sendSignal
-(JNIEnv *env, jclass klass, jint signalNum) {
-#ifdef _WIN32
-/* TODO TODO TODO
-        int dw;
-        LPVOID lpMsgBuf;
-        if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0)) {
-                dw = GetLastError();
-                FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
-                                nullptr,
-                                dw,
-                                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                                (LPTSTR) &lpMsgBuf,
-                                0,
-                                nullptr
-                             );
-                printf("%s\n", (LPTSTR)lpMsgBuf);
-                LocalFree(lpMsgBuf);
-                return JNI_FALSE;
-        }
-        */
-        return JNI_TRUE;
-#else /* _WIN32 */
-        if (kill(getpid(), signalNum) < 0)
-                return JNI_FALSE;
-        return JNI_TRUE;
-#endif /* _WIN32 */
-}
-
 /*
  * Class:     vm_share_ProcessUtils
  * Method:    sendCtrlBreak
@@ -101,167 +63,4 @@ JNIEXPORT jboolean JNICALL Java_vm_share_ProcessUtils_sendCtrlBreak
 #endif /* _WIN32 */
 }
 
-#ifdef _WIN32
-static BOOL  (WINAPI *_MiniDumpWriteDump)  (HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
-                                            PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION);
-void reportLastError(const char *msg) {
-        long errcode = GetLastError();
-        if (errcode != 0) {
-                DWORD len = 0;
-                char *buf;
-                size_t n = (size_t)FormatMessage(
-                                FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_ALLOCATE_BUFFER,
-                                nullptr,
-                                errcode,
-                                0,
-                                (LPSTR) &buf,
-                                (DWORD)len,
-                                nullptr);
-                if (n > 3) {
-                        /* Drop final '.', CR, LF */
-                        if (buf[n - 1] == '\n') n--;
-                        if (buf[n - 1] == '\r') n--;
-                        if (buf[n - 1] == '.') n--;
-                        buf[n] = '\0';
-                }
-                printf("%s: %s\n", msg, buf);
-                LocalFree(buf);
-        }
-}
-
-#endif /* _WIN32 */
-
-jboolean doDumpCore() {
-#ifdef _WIN32
-        char path[MAX_PATH];
-        DWORD size;
-        DWORD pathLen = (DWORD) sizeof(path);
-        HINSTANCE dbghelp;
-        MINIDUMP_EXCEPTION_INFORMATION* pmei;
-
-        HANDLE hProcess = GetCurrentProcess();
-        DWORD processId = GetCurrentProcessId();
-        HANDLE dumpFile;
-        MINIDUMP_TYPE dumpType;
-        static const char* cwd;
-        static const char* name = "DBGHELP.DLL";
-
-        printf("# TEST: creating Windows minidump...\n");
-        size = GetSystemDirectory(path, pathLen);
-        if (size > 0) {
-                strcat(path, "\\");
-                strcat(path, name);
-                dbghelp = LoadLibrary(path);
-                if (dbghelp == nullptr)
-                        reportLastError("Load DBGHELP.DLL from system directory");
-        } else {
-                printf("GetSystemDirectory returned 0\n");
-        }
-
-        // try Windows directory
-        if (dbghelp == nullptr) {
-                size = GetWindowsDirectory(path, pathLen);
-                if (size > 6) {
-                        strcat(path, "\\");
-                        strcat(path, name);
-                        dbghelp = LoadLibrary(path);
-                        if (dbghelp == nullptr) {
-                                reportLastError("Load DBGHELP.DLL from Windows directory");
-                        }
-                }
-        }
-        if (dbghelp == nullptr) {
-                printf("Failed to load DBGHELP.DLL\n");
-                return JNI_FALSE;
-        }
-
-        _MiniDumpWriteDump =
-                        (BOOL(WINAPI *)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
-                                        PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION))
-                                        GetProcAddress(dbghelp, "MiniDumpWriteDump");
-
-        if (_MiniDumpWriteDump == nullptr) {
-                printf("Failed to find MiniDumpWriteDump() in module dbghelp.dll");
-                return JNI_FALSE;
-        }
-        dumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory | MiniDumpWithHandleData);
-
-        // Older versions of dbghelp.h doesn't contain all the dumptypes we want, dbghelp.h with
-        // API_VERSION_NUMBER 11 or higher contains the ones we want though
-#if API_VERSION_NUMBER >= 11
-        dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo |
-                        MiniDumpWithUnloadedModules);
-#endif
-
-        dumpFile = CreateFile("core.mdmp", GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
-
-        if (dumpFile == INVALID_HANDLE_VALUE) {
-                reportLastError("Failed to create file for dumping");
-                return JNI_FALSE;
-        }
-        pmei = nullptr;
-
-
-        // Older versions of dbghelp.dll (the one shipped with Win2003 for example) may not support all
-        // the dump types we really want. If first call fails, lets fall back to just use MiniDumpWithFullMemory then.
-        if (_MiniDumpWriteDump(hProcess, processId, dumpFile, dumpType, pmei, nullptr, nullptr) == FALSE &&
-                        _MiniDumpWriteDump(hProcess, processId, dumpFile, (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, nullptr, nullptr) == FALSE) {
-                reportLastError("Call to MiniDumpWriteDump() failed");
-                return JNI_FALSE;
-        }
-
-        CloseHandle(dumpFile);
-        printf("# TEST: minidump created\n");
-        // Emulate Unix behaviour - exit process.
-        ExitProcess(137);
-
-        return JNI_TRUE;
-#else /* _WIN32 */
-        if (kill(getpid(), SIGSEGV) < 0)
-                return JNI_FALSE;
-        return JNI_TRUE;
-#endif /* _WIN32 */
-
-}
-
-/*
- * Class:     vm_share_ProcessUtils
- * Method:    dumpCore
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL Java_vm_share_ProcessUtils_dumpCore
-  (JNIEnv *env, jclass klass)
-{
-        return doDumpCore();
-}
-
-/*
- * Class:     vm_share_ProcessUtils
- * Method:    getPid
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_vm_share_ProcessUtils_getPid
-  (JNIEnv *env, jclass klass) {
-#ifdef _WIN32
-        return _getpid();
-#else /* _WIN32 */
-        return getpid();
-#endif /* _WIN32 */
-}
-
-
-/*
- * Class:     vm_share_ProcessUtils
- * Method:    getPid
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_vm_share_ProcessUtils_getWindowsPid
-  (JNIEnv *env, jclass klass, jlong handle) {
-#ifdef _WIN32
-        return GetProcessId((HANDLE) handle);
-#else /* _WIN32 */
-        return -1;
-#endif /* _WIN32 */
-}
-
 }
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.java b/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.java
index 2e9174452fd..3595428d98c 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.java
+++ b/test/hotspot/jtreg/vmTestbase/vm/share/ProcessUtils.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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,67 +46,4 @@ private ProcessUtils() {}
      * @return true if it was successful
      */
     public static native boolean sendCtrlBreak();
-
-    /**
-     * Send any signal to java process on Unix. It currently does nothing on Windows.
-     *
-     * @return true if it was successful
-     */
-    public static native boolean sendSignal(int signalNum);
-
-    /**
-     * Force java process to dump core.
-     *
-     * This is done by sending SIGSEGV on unix systems.
-     *
-     * @return true if it was successful, false if not (for example on Windows)
-     */
-    public static native boolean dumpCore();
-
-    /**
-     * Get PID of java process.
-     *
-     * @return PID
-     */
-    public static native int getPid();
-
-    public static int getPid(Process process) {
-        Throwable exception;
-        try {
-            Field pidField = process.getClass().getDeclaredField("pid");
-            pidField.setAccessible(true);
-            return ((Integer) pidField.get(process)).intValue();
-        } catch (NoSuchFieldException e) {
-            exception = e;
-        } catch (IllegalAccessException e) {
-            exception = e;
-        }
-        // Try to get Windows handle
-        try {
-            Field handleField = process.getClass().getDeclaredField("handle");
-            handleField.setAccessible(true);
-            long handle = ((Long) handleField.get(process)).longValue();
-            return getWindowsPid(handle);
-        } catch (NoSuchFieldException e) {
-            exception = e;
-        } catch (IllegalAccessException e) {
-            exception = e;
-        }
-        throw new TestBug("Unable to determine pid from process class " + process.getClass(), exception);
-    }
-
-    private static native int getWindowsPid(long handle);
-
-    @SuppressWarnings("restriction")
-    public static void dumpHeapWithHotspotDiagnosticMXBean(String fileName) throws IOException {
-        System.err.println("Dumping heap to " + fileName);
-
-        File f = new File(fileName);
-        if (f.exists())
-            f.delete();
-
-        HotSpotDiagnosticMXBean b = ManagementFactory.getPlatformMXBeans(
-                com.sun.management.HotSpotDiagnosticMXBean.class).get(0);
-        b.dumpHeap(fileName, false);
-    }
 }
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/RandomEx.java b/test/hotspot/jtreg/vmTestbase/vm/share/RandomEx.java
deleted file mode 100644
index 8abcfb1ba80..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/RandomEx.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2013, 2020, 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 vm.share;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-
-import jdk.test.lib.Utils;
-
-public class RandomEx extends Random {
-    private final Map<Class<?>, Supplier<?>> map = new HashMap<>();
-
-    {
-        map.put(Boolean.class, this::nextBoolean);
-        map.put(boolean.class, this::nextBoolean);
-        map.put(Byte.class, this::nextByte);
-        map.put(byte.class, this::nextByte);
-        map.put(Short.class, this::nextShort);
-        map.put(short.class, this::nextShort);
-        map.put(Character.class, this::nextChar);
-        map.put(char.class, this::nextChar);
-        map.put(Integer.class, this::nextInt);
-        map.put(int.class, this::nextInt);
-        map.put(Long.class, this::nextLong);
-        map.put(long.class, this::nextLong);
-        map.put(Float.class, this::nextFloat);
-        map.put(float.class, this::nextFloat);
-        map.put(Double.class, this::nextDouble);
-        map.put(double.class, this::nextDouble);
-    }
-
-    public RandomEx() {
-        super(Utils.getRandomInstance().nextLong());
-    }
-
-    public RandomEx(long seed) {
-        super(seed);
-    }
-
-    public byte nextByte() {
-        return (byte) next(Byte.SIZE);
-    }
-
-    public short nextShort() {
-        return (short) next(Short.SIZE);
-    }
-
-    public char nextChar() {
-        return (char) next(Character.SIZE);
-    }
-
-    public <T> T next(Predicate<T> p, T dummy) {
-        T result;
-        do {
-            result = next(dummy);
-        } while (!p.test(result));
-        return result;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <T> T next(T dummy) {
-        Supplier<?> supplier = map.get(dummy.getClass());
-        if (supplier == null) {
-            throw new IllegalArgumentException("supplier for <" +
-                    dummy.getClass() + ">is not found");
-        }
-        return (T) supplier.get();
-    }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/StringUtils.java b/test/hotspot/jtreg/vmTestbase/vm/share/StringUtils.java
deleted file mode 100644
index 56439538693..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/StringUtils.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * 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 vm.share;
-
-import java.io.ByteArrayOutputStream;
-import java.util.Random;
-import java.util.function.Predicate;
-
-public class StringUtils {
-
-    public static byte[] binaryReplace(final byte[] src, String search,
-            String replacement) {
-        if (search.length() == 0)
-            return src;
-
-        int nReplaced = 0;
-
-        try {
-            final byte[] bSrch = search.getBytes("ASCII");
-            final byte[] bRepl = replacement.getBytes("ASCII");
-
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            try {
-                searching: for (int i = 0; i < src.length; i++) {
-                    if (src[i] == bSrch[0]) {
-                        replacing: do {
-                            for (int ii = 1; ii < Math.min(bSrch.length,
-                                    src.length - i); ii++)
-                                if (src[i + ii] != bSrch[ii])
-                                    break replacing;
-
-                            out.write(bRepl);
-                            i += bSrch.length - 1;
-                            nReplaced++;
-                            continue searching;
-                        } while (false);
-                    }
-
-                    out.write(src[i]);
-                }
-
-            return out.toByteArray();
-
-            } finally {
-                out.close();
-            }
-        } catch (Exception e) {
-            RuntimeException t = new RuntimeException("Test internal error");
-            t.initCause(e);
-            throw t;
-        }
-    }
-
-    public static String generateString(Random rng, int length,
-            Predicate<Character> predicate) {
-        if (length <= 0) {
-            throw new IllegalArgumentException("length <= 0");
-        }
-        StringBuilder builder = new StringBuilder(length);
-        for (int i = 0; i < length; ++i) {
-            char tmp;
-            do {
-                tmp = (char) rng.nextInt(Character.MAX_VALUE);
-            } while (!predicate.test(tmp));
-            builder.append(tmp);
-        }
-        return builder.toString();
-    }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/VMRuntimeEnvUtils.java b/test/hotspot/jtreg/vmTestbase/vm/share/VMRuntimeEnvUtils.java
deleted file mode 100644
index 85cab7a06db..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/VMRuntimeEnvUtils.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share;
-
-import com.sun.management.HotSpotDiagnosticMXBean;
-import com.sun.management.VMOption;
-
-import java.lang.management.ManagementFactory;
-import java.util.Objects;
-
-public class VMRuntimeEnvUtils {
-    private static HotSpotDiagnosticMXBean DIAGNOSTIC_BEAN
-            = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
-
-    private VMRuntimeEnvUtils() {
-    }
-
-    public static boolean isJITEnabled() {
-        boolean isJITEnabled = ManagementFactory.getCompilationMXBean() != null;
-
-        return isJITEnabled;
-    }
-
-    /**
-     * Returns value of VM option.
-     *
-     * @param name option's name
-     * @return value of option or {@code null}, if option doesn't exist
-     * @throws NullPointerException if name is null
-     * @see HotSpotDiagnosticMXBean#getVMOption(String)
-     */
-    public static String getVMOption(String name) {
-        Objects.requireNonNull(name);
-        VMOption tmp;
-        try {
-            tmp = DIAGNOSTIC_BEAN.getVMOption(name);
-        } catch (IllegalArgumentException e) {
-            tmp = null;
-        }
-        return (tmp == null ? null : tmp.getValue());
-    }
-
-    /**
-     * Returns value of VM option or default value.
-     *
-     * @param name         option's name
-     * @param defaultValue default value
-     * @return value of option or {@code defaultValue}, if option doesn't exist
-     * @throws NullPointerException if name is null
-     * @see #getVMOption(String)
-     */
-    public static String getVMOption(String name, String defaultValue) {
-        String result = getVMOption(name);
-        return result == null ? defaultValue : result;
-    }
-
-    /**
-     * Returns if a boolean VM option is enabled or not.
-     *
-     * @param name  option's name
-     * @return true iff enabled
-     * @throws IllegalArgumentException if naming non-boolean or non-existing option
-     */
-    public static boolean isVMOptionEnabled(String name) {
-        String isSet = getVMOption(name, "error");
-        if (isSet.equals("true")) {
-            return true;
-        } else if (isSet.equals("false")) {
-            return false;
-        }
-        throw new IllegalArgumentException(name + " is not a boolean option.");
-    }
-
-    /**
-     * Sets a specified value for VM option of given name.
-     *
-     * @param name  option's name
-     * @param value new value
-     * @throws NullPointerException     if name is null
-     * @throws IllegalArgumentException if new value is invalid or if vm option
-     *                                  is not writable.
-     * @see HotSpotDiagnosticMXBean#setVMOption(String, String)
-     */
-    public static void setVMOption(String name, String value) {
-        Objects.requireNonNull(name);
-        DIAGNOSTIC_BEAN.setVMOption(name, value);
-    }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryManagerData.java b/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryManagerData.java
deleted file mode 100644
index ec58d3d43eb..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryManagerData.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.monitoring.data;
-
-import java.lang.management.*;
-import javax.management.*;
-import java.io.Serializable;
-
-public class MemoryManagerData implements MemoryManagerMXBean, Serializable {
-        private String[] memoryPoolNames;
-        private String name;
-        private boolean valid;
-
-        public MemoryManagerData(String[] memoryPoolNames, String name, boolean valid) {
-                this.memoryPoolNames = memoryPoolNames;
-                this.name = name;
-                this.valid = valid;
-        }
-
-        public MemoryManagerData(MemoryManagerMXBean memoryManager) {
-                this.memoryPoolNames = memoryManager.getMemoryPoolNames();
-                this.name = memoryManager.getName();
-                this.valid = memoryManager.isValid();
-        }
-
-        public String[] getMemoryPoolNames() {
-                return memoryPoolNames;
-        }
-
-        public String getName() {
-                return name;
-        }
-
-        public boolean isValid() {
-                return valid;
-        }
-
-    public ObjectName getObjectName() {
-        return null;
-    }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryPoolData.java b/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryPoolData.java
deleted file mode 100644
index cf2221bf136..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryPoolData.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.monitoring.data;
-
-import java.lang.management.MemoryPoolMXBean;
-import java.io.Serializable;
-
-public class MemoryPoolData implements Serializable {
-        private String name;
-        private boolean valid;
-        private MemoryUsageData usage;
-
-        public MemoryPoolData(String name, boolean valid, MemoryUsageData usage) {
-                this.name = name;
-                this.valid = valid;
-        }
-
-        public MemoryPoolData(MemoryPoolMXBean memoryManager) {
-                this.name = memoryManager.getName();
-                this.valid = memoryManager.isValid();
-                this.usage = new MemoryUsageData(memoryManager.getUsage());
-        }
-
-        public String getName() {
-                return name;
-        }
-
-        public boolean hasName(String name) {
-                return this.name.equals(name);
-        }
-
-        public boolean isValid() {
-                return valid;
-        }
-
-        public MemoryUsageData getUsage() {
-                return usage;
-        }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryUsageData.java b/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryUsageData.java
deleted file mode 100644
index 60b9fababe0..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/monitoring/data/MemoryUsageData.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.monitoring.data;
-
-import java.io.Serializable;
-import java.lang.management.MemoryUsage;
-import nsk.share.log.Log;
-
-public class MemoryUsageData implements Serializable {
-        private long init;
-        private long used;
-        private long committed;
-        private long max;
-
-        public MemoryUsageData(long init, long used, long committed, long max) {
-                this.init = init;
-                this.used = used;
-                this.committed = committed;
-                this.max = max;
-        }
-
-        public MemoryUsageData(MemoryUsage usage) {
-                this.init = usage.getInit();
-                this.used = usage.getUsed();
-                this.committed = usage.getCommitted();
-                this.max = usage.getMax();
-        }
-
-        public MemoryUsageData(MemoryUsageData usage, MemoryUsageData usage1) {
-                this.init = usage.getInit() + usage1.getInit();
-                this.used = usage.getUsed() + usage1.getUsed();
-                this.committed = usage.getCommitted() + usage1.getCommitted();
-                this.max = usage.getMax() + usage1.getMax();
-        }
-
-        public long getInit() {
-                return init;
-        }
-
-        public long getUsed() {
-                return used;
-        }
-
-        public long getMax() {
-                return max;
-        }
-
-        public long getFree() {
-                return committed - used;
-        }
-
-        public long getCommitted() {
-                return committed;
-        }
-
-        public void log(Log log) {
-                log.info("    Init: " + init);
-                log.info("    Used: " + used);
-                log.info("    Committed: " + committed);
-                log.info("    Max: " + max);
-        }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageInput.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageInput.java
deleted file mode 100644
index d684d88f543..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageInput.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.process;
-
-import java.util.List;
-
-public interface MessageInput {
-        public boolean waitForStart(long timeout) throws InterruptedException;
-        public boolean waitForMessage(long timeout) throws InterruptedException;
-        public boolean waitForMessage(String msg, long timeout) throws InterruptedException;
-        public String getMessage();
-        public List<String> getMessages();
-        public List<String> getMessages(int to);
-        public List<String> getMessages(int from, int to);
-        public boolean waitForFinish(long timeout) throws InterruptedException;
-        public void reset();
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessHandler.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessHandler.java
deleted file mode 100644
index 4ca3b191993..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/ProcessHandler.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.process;
-
-import java.util.List;
-
-public class ProcessHandler implements MessageInput, MessageOutput {
-        private StreamMessageInput stdout = new StreamMessageInput();
-        private StreamMessageInput stderr = new StreamMessageInput();
-        private StreamMessageOutput stdin = new StreamMessageOutput();
-
-        public ProcessHandler() {
-        }
-
-        public ProcessHandler(ProcessExecutor exec) {
-                bind(exec);
-        }
-
-        public void bind(ProcessExecutor exec) {
-                exec.addStdOutListener(stdout.createListener());
-                exec.addStdErrListener(stderr.createListener());
-                exec.start();
-                stdin.bind(exec.getStdIn());
-        }
-
-        public boolean waitForStart(long timeout) throws InterruptedException {
-                return stdout.waitForStart(timeout) && stderr.waitForStart(timeout);
-        }
-
-        public boolean waitForMessage(long timeout) throws InterruptedException {
-                return stdout.waitForMessage(timeout);
-        }
-
-        public boolean waitForMessage(String msg, long timeout) throws InterruptedException {
-                return stdout.waitForMessage(msg, timeout);
-        }
-
-        public String getMessage() {
-                return stdout.getMessage();
-        }
-
-        public List<String> getMessages() {
-                return stdout.getMessages();
-        }
-
-        public List<String> getMessages(int to) {
-                return stdout.getMessages(to);
-        }
-
-        public List<String> getMessages(int from, int to) {
-                return stdout.getMessages(from, to);
-        }
-
-        public boolean waitForStdErrMessage(String msg, long timeout) throws InterruptedException {
-                return stderr.waitForMessage(msg, timeout);
-        }
-
-        public String getStdErrMessage() {
-                return stderr.getMessage();
-        }
-
-        public boolean waitForFinish(long timeout) throws InterruptedException {
-                return stdout.waitForFinish(timeout) && stderr.waitForFinish(timeout);
-        }
-
-        public void start() {
-                stdin.start();
-        }
-
-        public void send(String msg) {
-                stdin.send(msg);
-        }
-
-        public void finish() {
-                stdin.finish();
-        }
-
-        public void reset() {
-                stdout.reset();
-                stderr.reset();
-        }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageInput.java b/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageInput.java
deleted file mode 100644
index 03d9ec6bd3e..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/StreamMessageInput.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.process;
-
-import java.util.List;
-import java.util.ArrayList;
-import nsk.share.TestBug;
-
-public class StreamMessageInput implements MessageInput {
-        private Object sync = new Object();
-        private List<String> lines = new ArrayList<String>();
-        private int position = 0;
-        private volatile boolean active = false;
-        private volatile Throwable exception;
-
-        public StreamMessageInput() {
-        }
-
-        public StreamMessageInput(StreamReader sd) {
-                bind(sd);
-        }
-
-        public StreamListener createListener() {
-                return new Listener();
-        }
-
-        public void bind(StreamReader sd) {
-                sd.addListener(createListener());
-        }
-
-        public boolean isActive() {
-                return active;
-        }
-
-        public boolean isException() {
-                return exception != null;
-        }
-
-        public Throwable getException() {
-                return exception;
-        }
-
-        public boolean waitForStart(long timeout) throws InterruptedException {
-                long startTime = System.currentTimeMillis();
-                long curTime = startTime;
-                synchronized (sync) {
-                        while (!active && curTime - startTime < timeout) {
-                                sync.wait(curTime - startTime);
-                                curTime = System.currentTimeMillis();
-                        }
-                }
-                return active;
-        }
-
-        public boolean waitForFinish(long timeout) throws InterruptedException {
-                long startTime = System.currentTimeMillis();
-                long curTime = startTime;
-                synchronized (sync) {
-                        while (active && curTime - startTime < timeout) {
-                                sync.wait(curTime - startTime);
-                                curTime = System.currentTimeMillis();
-                        }
-                }
-                return !active;
-        }
-
-        public boolean waitForMessage(String msg, long timeout) throws InterruptedException {
-                long startTime = System.currentTimeMillis();
-                long curTime = startTime;
-                int n = position;
-                synchronized (sync) {
-                        while (curTime - startTime < timeout) {
-                                while (n < lines.size()) {
-                                        // System.out.println("Check: " + lines.get(n));
-                                        if (msg == null || lines.get(n++).contains(msg)) {
-                                                return true;
-                                        }
-                                }
-                                sync.wait(timeout - (curTime - startTime));
-                                curTime = System.currentTimeMillis();
-                        }
-                        return false;
-                }
-        }
-
-        public boolean waitForMessage(long timeout) throws InterruptedException {
-                return waitForMessage(null, timeout);
-        }
-
-        public String getMessage() {
-                if (position < lines.size())
-                        return lines.get(position++);
-                else
-                        return null;
-        }
-
-        public String getMessage(int index) {
-                return lines.get(index);
-        }
-
-        public int getPosition() {
-                return position;
-        }
-
-        public void setPosition(int position) {
-                this.position = position;
-        }
-
-        public int getMessageCount() {
-                return lines.size();
-        }
-
-        public List<String> getMessages() {
-                return getMessages(position, lines.size());
-        }
-
-        public List<String> getMessages(int to) {
-                return getMessages(position, to);
-        }
-
-        public List<String> getMessages(int from, int to) {
-                synchronized (sync) {
-                        if (to < 0)
-                                to = lines.size() + to;
-                        position = Math.max(position, to);
-                        return new ArrayList<String>(lines.subList(from, to));
-                }
-        }
-
-        public void reset() {
-                synchronized (sync) {
-                        position = lines.size();
-                }
-        }
-
-        private class Listener implements StreamListener {
-                @Override
-                public void onStart() {
-                        synchronized (sync) {
-                                active = true;
-                                sync.notifyAll();
-                        }
-                }
-
-                @Override
-                public void onRead(String line) {
-                        //System.out.println("onRead: " + line);
-                        synchronized (sync) {
-                                lines.add(line);
-                                sync.notifyAll();
-                        }
-                }
-
-                @Override
-                public void onFinish() {
-                        synchronized (sync) {
-                                active = false;
-                                sync.notifyAll();
-                        }
-                }
-
-                @Override
-                public void onException(Throwable e) {
-                        exception = e;
-                }
-        }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/transform/AbstractClassFileTransformer.java b/test/hotspot/jtreg/vmTestbase/vm/share/transform/AbstractClassFileTransformer.java
deleted file mode 100644
index 95906789fda..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/transform/AbstractClassFileTransformer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.transform;
-
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.IllegalClassFormatException;
-import java.security.ProtectionDomain;
-
-public abstract class AbstractClassFileTransformer
-        implements ClassFileTransformer {
-    protected abstract boolean shouldBeTransformed(String name);
-
-    protected abstract byte[] transformClass(byte[] bytes);
-
-    @Override
-    public byte[] transform(ClassLoader loader, String className,
-            Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
-            byte[] classfileBuffer) throws IllegalClassFormatException {
-        if (shouldBeTransformed(className)) {
-            return transformClass(classfileBuffer);
-        }
-        return null;
-    }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/transform/AnnotationAppender.java b/test/hotspot/jtreg/vmTestbase/vm/share/transform/AnnotationAppender.java
deleted file mode 100644
index b3891fec5e4..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/transform/AnnotationAppender.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.transform;
-
-import jdk.internal.org.objectweb.asm.AnnotationVisitor;
-
-public abstract class AnnotationAppender {
-    private final String desc;
-    private final boolean visible;
-    private boolean annotationPresent;
-
-    public AnnotationAppender(String desc, boolean visible) {
-        this.desc = desc;
-        this.visible = visible;
-    }
-
-    public void checkAnnotation(String desc, boolean isVisible) {
-        annotationPresent |= visible == isVisible && this.desc.equals(desc);
-    }
-
-    public void addAnnotation(VisitAnnotation func) {
-        if (shouldAdd()) {
-            AnnotationVisitor av = func.visit(desc, true);
-            if (av != null) {
-                postCreate(av);
-                av.visitEnd();
-                annotationPresent = true;
-            }
-        }
-    }
-
-    protected boolean shouldAdd() {
-        return !annotationPresent;
-    }
-
-    protected abstract void postCreate(AnnotationVisitor av);
-
-    @FunctionalInterface
-    public static interface VisitAnnotation {
-        AnnotationVisitor visit(String desc, boolean visible);
-    }
-}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/transform/TransformingClassLoader.java b/test/hotspot/jtreg/vmTestbase/vm/share/transform/TransformingClassLoader.java
deleted file mode 100644
index 5ce3dd02eb6..00000000000
--- a/test/hotspot/jtreg/vmTestbase/vm/share/transform/TransformingClassLoader.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * 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 vm.share.transform;
-
-import vm.share.FileUtils;
-
-public class TransformingClassLoader extends ClassLoader {
-    private final AbstractClassFileTransformer transformer;
-
-    protected TransformingClassLoader(ClassLoader parent,
-            AbstractClassFileTransformer transformer) {
-        super(parent);
-        this.transformer = transformer;
-    }
-
-    @Override
-    protected Class<?> loadClass(String name, boolean resolve)
-            throws ClassNotFoundException {
-        if (!transformer.shouldBeTransformed(name)) {
-            return super.loadClass(name, resolve);
-        }
-        synchronized (getClassLoadingLock(name)) {
-            // First, check if the class has already been loaded
-            Class<?> c = findLoadedClass(name);
-            if (c == null) {
-                try {
-                    byte[] bytes = FileUtils.readClass(name);
-                    bytes = transformer.transformClass(bytes);
-                    c = defineClass(name, bytes, 0, bytes.length);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    return super.loadClass(name, resolve);
-                }
-            }
-            if (resolve) {
-                resolveClass(c);
-            }
-            return c;
-        }
-    }
-}
diff --git a/test/jaxp/TEST.ROOT b/test/jaxp/TEST.ROOT
index a44ad3a7c01..8098695b80e 100644
--- a/test/jaxp/TEST.ROOT
+++ b/test/jaxp/TEST.ROOT
@@ -23,7 +23,7 @@ modules=java.xml
 groups=TEST.groups
 
 # Minimum jtreg version
-requiredVersion=7.3.1+1
+requiredVersion=7.4+1
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../ notation to reach them
diff --git a/test/jdk/ProblemList-Virtual.txt b/test/jdk/ProblemList-Virtual.txt
index c45353e65ed..d7692b578cd 100644
--- a/test/jdk/ProblemList-Virtual.txt
+++ b/test/jdk/ProblemList-Virtual.txt
@@ -36,8 +36,6 @@ javax/management/remote/mandatory/loading/MissingClassTest.java 8145413 windows-
 
 javax/management/remote/mandatory/loading/RMIDownloadTest.java 8308366 windows-x64
 
-java/lang/instrument/NativeMethodPrefixAgent.java 8307169 generic-all
-
 java/lang/ScopedValue/StressStackOverflow.java#default 8309646 generic-all
 java/lang/ScopedValue/StressStackOverflow.java#no-TieredCompilation 8309646 generic-all
 java/lang/ScopedValue/StressStackOverflow.java#TieredStopAtLevel1 8309646 generic-all
diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt
index e2201e9f95c..20dfcef539d 100644
--- a/test/jdk/ProblemList.txt
+++ b/test/jdk/ProblemList.txt
@@ -486,7 +486,6 @@ java/beans/XMLEncoder/Test6570354.java 8015593 macosx-all
 
 # jdk_lang
 
-java/lang/ProcessHandle/InfoTest.java                           8211847 aix-ppc64
 java/lang/invoke/LFCaching/LFMultiThreadCachingTest.java        8151492 generic-all
 java/lang/invoke/LFCaching/LFGarbageCollectedTest.java          8078602 generic-all
 java/lang/invoke/lambda/LambdaFileEncodingSerialization.java    8249079 linux-all
@@ -552,8 +551,6 @@ java/net/MulticastSocket/SetLoopbackMode.java                   7122846,8308807
 java/net/MulticastSocket/SetOutgoingIf.java                     8308807 aix-ppc64
 java/net/MulticastSocket/Test.java                              7145658,8308807 macosx-all,aix-ppc64
 
-java/net/ServerSocket/AcceptInheritHandle.java                  8211854 aix-ppc64
-
 java/net/Socket/asyncClose/Race.java                            8317801 aix-ppc64
 
 ############################################################################
@@ -612,16 +609,14 @@ sun/security/smartcardio/TestMultiplePresent.java               8039280 generic-
 sun/security/smartcardio/TestPresent.java                       8039280 generic-all
 sun/security/smartcardio/TestTransmit.java                      8039280 generic-all
 com/sun/crypto/provider/Cipher/DES/PerformanceTest.java         8039280 generic-all
-com/sun/security/auth/callback/TextCallbackHandler/Default.java 8039280 generic-all
 com/sun/security/auth/callback/TextCallbackHandler/Password.java 8039280 generic-all
 com/sun/security/sasl/gsskerb/AuthOnly.java                     8039280 generic-all
 com/sun/security/sasl/gsskerb/ConfSecurityLayer.java            8039280 generic-all
 com/sun/security/sasl/gsskerb/NoSecurityLayer.java              8039280 generic-all
 sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.java 8039280 generic-all
 sun/security/provider/PolicyParser/PrincipalExpansionError.java 8039280 generic-all
-javax/net/ssl/SSLSession/CertMsgCheck.java                      8326705 generic-all
 
-sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java            8316183 linux-ppc64le
+sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java            8316183,8333317 generic-all
 
 ############################################################################
 
@@ -720,9 +715,6 @@ com/sun/jdi/InvokeHangTest.java                                 8218463 linux-al
 
 # jdk_util
 
-java/util/Locale/LocaleProvidersRun.java                        8268379 macosx-x64
-sun/util/locale/provider/CalendarDataRegression.java            8268379 macosx-x64
-
 ############################################################################
 
 # jdk_instrument
@@ -784,7 +776,6 @@ java/awt/Modal/PrintDialogsTest/PrintDialogsTest.java 8068378 generic-all
 java/awt/event/MouseEvent/AltGraphModifierTest/AltGraphModifierTest.java 8162380 generic-all
 java/awt/image/VolatileImage/VolatileImageConfigurationTest.java 8171069 macosx-all,linux-all
 java/awt/Modal/InvisibleParentTest/InvisibleParentTest.java 8172245 linux-all
-java/awt/print/Dialog/RestoreActiveWindowTest/RestoreActiveWindowTest.java 8185429 macosx-all
 java/awt/Frame/FrameStateTest/FrameStateTest.java 8203920 macosx-all,linux-all
 java/awt/print/PrinterJob/ScaledText/ScaledText.java 8231226 macosx-all
 java/awt/font/TextLayout/TestJustification.java 8250791 macosx-all
diff --git a/test/jdk/TEST.ROOT b/test/jdk/TEST.ROOT
index 25ef8250e4d..67eceaa5a3e 100644
--- a/test/jdk/TEST.ROOT
+++ b/test/jdk/TEST.ROOT
@@ -11,7 +11,7 @@
 #
 # A test flagged with cgroups uses cgroups.
 #
-# Notes on "client" keywords : headful sound printer multimon 
+# Notes on "client" keywords : headful sound printer multimon
 # ===========================================================
 #
 # These keywords are there to help with test selection so that
@@ -31,7 +31,7 @@
 # Tests may not fail if there is none, instead just silently return.
 # But they also may legitimately throw an Exception depending on the test.
 # Also printer tests are not necessarily headful, but some are, and some are automated.
-# 
+#
 # "sound". Similarly, not all sound tests require audio devices, but many do.
 # A test flagged with key "sound" needs audio devices on the system.
 # Also they are not necessarily "headful", since they don't require a display etc.
@@ -99,13 +99,14 @@ requires.properties= \
     vm.jvmci \
     vm.jvmci.enabled \
     vm.jvmti \
+    vm.cpu.features \
     docker.support \
     release.implementor \
     jdk.containerized \
     jdk.foreign.linker
 
 # Minimum jtreg version
-requiredVersion=7.3.1+1
+requiredVersion=7.4+1
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../ notation to reach them
diff --git a/test/jdk/TEST.groups b/test/jdk/TEST.groups
index fa868699aab..6a5be3736e8 100644
--- a/test/jdk/TEST.groups
+++ b/test/jdk/TEST.groups
@@ -251,6 +251,8 @@ jdk_security = \
     :jdk_security3 \
     :jdk_security4
 
+# Tests in this group are manual as they depend on external infra
+# and may fail with external reasons, for instance - change in CA test portal.
 jdk_security_infra = \
     security/infra
 
@@ -618,10 +620,10 @@ jdk_core_manual_no_input = \
     javax/xml/jaxp/datatype/8033980/GregorianCalAndDurSerDataUtil.java
 
 jdk_security_manual_no_input = \
+    :jdk_security_infra \
     com/sun/crypto/provider/Cipher/DES/PerformanceTest.java \
     com/sun/crypto/provider/Cipher/AEAD/GCMIncrementByte4.java \
     com/sun/crypto/provider/Cipher/AEAD/GCMIncrementDirect4.java \
-    com/sun/security/auth/callback/TextCallbackHandler/Default.java \
     com/sun/security/auth/callback/TextCallbackHandler/Password.java \
     com/sun/security/sasl/gsskerb/AuthOnly.java \
     com/sun/security/sasl/gsskerb/ConfSecurityLayer.java \
@@ -661,4 +663,4 @@ jdk_containers_extended = \
 
 jdk_core_no_security = \
    :jdk_core \
-   -:jdk_security
\ No newline at end of file
+   -:jdk_security
diff --git a/test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java b/test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java
index ac411bab7d2..0e2c6ce51c0 100644
--- a/test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java
+++ b/test/jdk/com/sun/java/swing/plaf/gtk/bug6492108.java
@@ -109,6 +109,7 @@ protected Component createContentPane() {
         } catch (Throwable t) {
             fail("Problem creating text components");
         }
+        setDelay(50);
         return panel;
     }
 
diff --git a/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java b/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java
new file mode 100644
index 00000000000..deffffc0fa8
--- /dev/null
+++ b/test/jdk/com/sun/jdi/BreakpointOnClassPrepare.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2024, 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 8333542
+ * @summary Missed breakpoint due to JVM not blocking other threads while
+ *          delivering a ClassPrepareEvent.
+ *
+ * @run build TestScaffold VMConnection TargetListener TargetAdapter
+ * @run compile -g BreakpointOnClassPrepare.java
+ * @run driver BreakpointOnClassPrepare SUSPEND_NONE
+ * @run driver BreakpointOnClassPrepare SUSPEND_EVENT_THREAD
+ * @run driver BreakpointOnClassPrepare SUSPEND_ALL
+ */
+
+import com.sun.jdi.*;
+import com.sun.jdi.event.*;
+import com.sun.jdi.request.*;
+
+import java.util.*;
+
+// The debuggee spawns 50 threads that call LoadedClass.foo(). The debugger enables
+// ClassPrepareEvent for LoadedClass, and sets a breakpoint on LoadedClass.foo() when
+// the ClassPrepareEvent arrives. The debugger expects 50 breakpoints to be hit.
+// This verifies that the thread that causes the generation of the ClassPrepareEvent
+// has properly blocked all other threads from executing LoadedClass.foo() until the
+// ClassPrepareEvent has been delivered.
+
+class LoadedClass {
+    static void foo(int k) {
+        System.out.println("HIT = " + k); // set breakpoint here
+    }
+}
+
+class BreakpointOnClassPrepareTarg {
+    public static void main(String[] args) throws InterruptedException {
+        System.out.println("Start");
+        Thread threads[] = new Thread[BreakpointOnClassPrepare.NUM_BREAKPOINTS];
+        for (int i = 0; i < BreakpointOnClassPrepare.NUM_BREAKPOINTS; i++) {
+            int k = i;
+            Thread t = DebuggeeWrapper.newThread(() -> {
+                System.out.println("k = " + k);
+                LoadedClass.foo(k);
+            });
+            threads[i] = t;
+            t.setDaemon(true);
+            t.setName("MyThread-" + k);
+            t.start();
+        }
+
+        for (int i = 0; i < BreakpointOnClassPrepare.NUM_BREAKPOINTS; i++) {
+            try {
+                Thread t = threads[i];
+                t.join();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        System.out.println("Finish");
+    }
+}
+
+    /********** test program **********/
+
+public class BreakpointOnClassPrepare extends TestScaffold {
+    ClassType targetClass;
+    ThreadReference mainThread;
+
+    BreakpointOnClassPrepare(String args[]) {
+        super(args);
+    }
+
+    public static void main(String[] args)      throws Exception {
+        new BreakpointOnClassPrepare(args).startTests();
+    }
+
+    /********** event handlers **********/
+
+    static final int NUM_BREAKPOINTS = 50;
+    int bkptCount;
+    BreakpointRequest bkptRequest;
+
+    public void breakpointReached(BreakpointEvent event) {
+        bkptCount++;
+        String threadInfo;
+        try {
+            threadInfo = event.thread().toString();
+        } catch (ObjectCollectedException e) {
+            // It's possible the Thread already terminated and was collected
+            // if the SUSPEND_NONE policy was used.
+            threadInfo = "(thread collected)";
+        }
+        System.out.println("Got BreakpointEvent: " + bkptCount + " for thread " + threadInfo);
+    }
+
+    public void vmDisconnected(VMDisconnectEvent event) {
+        println("Got VMDisconnectEvent");
+    }
+
+    /********** test core **********/
+
+    protected void runTests() throws Exception {
+        /* Determine which suspend policy to use. */
+        int policy;
+        if (args.length != 1) {
+            throw new RuntimeException("Invalid number of args: " + args.length);
+        }
+        String policyString = args[0];
+        if (policyString.equals("SUSPEND_NONE")) {
+            policy = EventRequest.SUSPEND_NONE;
+        } else if (policyString.equals("SUSPEND_ALL")) {
+            policy = EventRequest.SUSPEND_ALL;
+        } else if (policyString.equals("SUSPEND_EVENT_THREAD")) {
+            policy = EventRequest.SUSPEND_EVENT_THREAD;
+        } else {
+            throw new RuntimeException("Invalid suspend policy: " + policyString);
+        }
+
+        /* Stop when the target is loaded. */
+        BreakpointEvent bpe = startToMain("BreakpointOnClassPrepareTarg");
+
+        /* Stop when "LoadedClass" is loaded. */
+        EventRequestManager erm = vm().eventRequestManager();
+        ClassPrepareEvent cpe = resumeToPrepareOf("LoadedClass");
+        println("Got ClassPrepareEvent: " + cpe);
+
+        /* Set a breakpoint for each time LoadedClass.foo() is called. */
+        ClassType loadedClass = (ClassType)cpe.referenceType() ;
+        Location loc1 = findMethodLocation(loadedClass,  "foo", "(I)V", 1);
+        bkptRequest = erm.createBreakpointRequest(loc1);
+        bkptRequest.setSuspendPolicy(policy);
+        bkptRequest.enable();
+
+        listenUntilVMDisconnect();
+
+        if (!testFailed && bkptCount == NUM_BREAKPOINTS) {
+            println("BreakpointOnClassPrepare: passed");
+        } else {
+            throw new Exception("BreakpointOnClassPrepare: failed. bkptCount == " + bkptCount);
+        }
+    }
+}
diff --git a/test/jdk/com/sun/jdi/EATests.java b/test/jdk/com/sun/jdi/EATests.java
index cd80d01a07f..72859481659 100644
--- a/test/jdk/com/sun/jdi/EATests.java
+++ b/test/jdk/com/sun/jdi/EATests.java
@@ -289,6 +289,7 @@ public static void main(String[] args) {
         // Relocking test cases
         new EARelockingSimpleTarget()                                                       .run();
         new EARelockingSimpleWithAccessInOtherThreadTarget()                                .run();
+        new EARelockingSimpleWithAccessInOtherThread_02_DynamicCall_Target()                .run();
         new EARelockingRecursiveTarget()                                                    .run();
         new EARelockingNestedInflatedTarget()                                               .run();
         new EARelockingNestedInflated_02Target()                                            .run();
@@ -413,6 +414,7 @@ protected void runTests() throws Exception {
         // Relocking test cases
         new EARelockingSimple()                                                       .run(this);
         new EARelockingSimpleWithAccessInOtherThread()                                .run(this);
+        new EARelockingSimpleWithAccessInOtherThread_02_DynamicCall()                 .run(this);
         new EARelockingRecursive()                                                    .run(this);
         new EARelockingNestedInflated()                                               .run(this);
         new EARelockingNestedInflated_02()                                            .run(this);
@@ -1851,6 +1853,95 @@ public int getExpectedIResult() {
 
 /////////////////////////////////////////////////////////////////////////////
 
+// The debugger reads and publishes an object with eliminated locking to an instance field.
+// A 2nd thread in the debuggee finds it there and changes its state using a synchronized method.
+// Without eager relocking the accesses are unsynchronized which can be observed.
+// This is a variant of EARelockingSimpleWithAccessInOtherThread with a dynamic call (not devirtualized).
+class EARelockingSimpleWithAccessInOtherThread_02_DynamicCall extends EATestCaseBaseDebugger {
+
+    public void runTestCase() throws Exception {
+        BreakpointEvent bpe = resumeTo(TARGET_TESTCASE_BASE_NAME, "dontinline_brkpt", "()V");
+        printStack(bpe.thread());
+        String l1ClassName = EARelockingSimpleWithAccessInOtherThread_02_DynamicCall_Target.SyncCounter.class.getName();
+        ObjectReference ctr = getLocalRef(bpe.thread().frame(2), l1ClassName, "l1");
+        setField(testCase, "sharedCounter", ctr);
+        terminateEndlessLoop();
+    }
+}
+
+class EARelockingSimpleWithAccessInOtherThread_02_DynamicCall_Target extends EATestCaseBaseTarget {
+
+    public static final BrkPtDispatchA[] disp =
+        {new BrkPtDispatchA(), new BrkPtDispatchB(), new BrkPtDispatchC(), new BrkPtDispatchD()};
+
+    public static class BrkPtDispatchA {
+        public EATestCaseBaseTarget testCase;
+        public void dontinline_brkpt() { testCase.dontinline_brkpt(); }
+    }
+
+    public static class BrkPtDispatchB extends BrkPtDispatchA {
+        @Override
+        public void dontinline_brkpt() { testCase.dontinline_brkpt(); }
+    }
+
+    public static class BrkPtDispatchC extends BrkPtDispatchA {
+        @Override
+        public void dontinline_brkpt() { testCase.dontinline_brkpt(); }
+    }
+
+    public static class BrkPtDispatchD extends BrkPtDispatchA {
+        @Override
+        public void dontinline_brkpt() {
+            testCase.dontinline_brkpt();
+        }
+    }
+
+    public static class SyncCounter {
+        private int val;
+        public synchronized int inc() { return val++; }
+    }
+
+    public volatile SyncCounter sharedCounter;
+
+    @Override
+    public void setUp() {
+        super.setUp();
+        testMethodDepth = 2;
+        for (BrkPtDispatchA d : disp) {
+            d.testCase = this;
+        }
+        doLoop = true;
+        new Thread(() -> {
+                while (doLoop) {
+                    SyncCounter ctr = sharedCounter;
+                    if (ctr != null) {
+                        ctr.inc();
+                    }
+                }
+            }).start();
+    }
+
+    public int dispCount;
+    public void dontinline_testMethod() {
+        SyncCounter l1 = new SyncCounter();
+        synchronized (l1) {      // Eliminated locking
+            l1.inc();
+            // Use different types for the subsequent call to prevent devirtualization.
+            BrkPtDispatchA d = disp[(dispCount++) & 3];
+            d.dontinline_brkpt();  // Dynamic call. Debugger publishes l1 to sharedCounter.
+            iResult = l1.inc();    // Changes by the 2nd thread will be observed if l1
+                                   // was not relocked before passing it to the debugger.
+        }
+    }
+
+    @Override
+    public int getExpectedIResult() {
+        return 1;
+    }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
 // Test recursive locking
 class EARelockingRecursiveTarget extends EATestCaseBaseTarget {
 
diff --git a/test/jdk/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java b/test/jdk/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java
index 83e37f0b475..6b0302aafbf 100644
--- a/test/jdk/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java
+++ b/test/jdk/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java
@@ -75,7 +75,6 @@ public static void main(String[] argv)
         // threads block after doing some computation
         waitUntilThreadBlocked();
 
-
         long times[] = mbean.getThreadCpuTime(ids);
         long userTimes[] = mbean.getThreadUserTime(ids);
 
@@ -222,6 +221,8 @@ private static void waitUntilThreadBlocked()
                 }
             }
         }
+        // Account for threads using CPU for a few millis after their WAITING state is visible:
+        goSleep(500);
     }
 
     public static void doit() {
diff --git a/test/jdk/com/sun/net/httpserver/AuthenticatorTest b/test/jdk/com/sun/net/httpserver/AuthenticatorTest.java
similarity index 75%
rename from test/jdk/com/sun/net/httpserver/AuthenticatorTest
rename to test/jdk/com/sun/net/httpserver/AuthenticatorTest.java
index 1fe7f383035..1456af618fa 100644
--- a/test/jdk/com/sun/net/httpserver/AuthenticatorTest
+++ b/test/jdk/com/sun/net/httpserver/AuthenticatorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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,36 +25,36 @@
  * @test
  * @bug 8251496
  * @summary Tests for methods in Authenticator
- * @run testng/othervm AuthenticatorTest
+ * @run junit AuthenticatorTest
  */
 
 import com.sun.net.httpserver.Authenticator;
-import com.sun.net.httpserver.BasicAuthenticator;
 import com.sun.net.httpserver.HttpPrincipal;
-import org.testng.annotations.Test;
 
-import static org.testng.Assert.assertEquals;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 
 public class AuthenticatorTest {
     @Test
     public void testFailure() {
         var failureResult = new Authenticator.Failure(666);
-        assertEquals(failureResult.getResponseCode(), 666);
+        assertEquals(666, failureResult.getResponseCode());
     }
 
     @Test
     public void testRetry() {
         var retryResult = new Authenticator.Retry(333);
-        assertEquals(retryResult.getResponseCode(), 333);
+        assertEquals(333, retryResult.getResponseCode());
     }
 
     @Test
-    public void TestSuccess() {
+    public void testSuccess() {
         var principal = new HttpPrincipal("test", "123");
         var successResult = new Authenticator.Success(principal);
-        assertEquals(successResult.getPrincipal(), principal);
-        assertEquals("test", principal.getName());
+        assertEquals(principal, successResult.getPrincipal());
+        assertEquals("test", principal.getUsername());
         assertEquals("123", principal.getRealm());
     }
 }
diff --git a/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java b/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java
index 606a1ad5e0e..1fb3350c8f7 100644
--- a/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java
+++ b/test/jdk/com/sun/security/auth/callback/TextCallbackHandler/Default.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,31 +23,48 @@
 
 /*
  * @test
+ * @library /test/lib /java/security/testlibrary
  * @bug 4470717
  * @summary fix default handling and other misc
- * @run main/manual Default
+ * @run main/othervm Default
  */
 
 import com.sun.security.auth.callback.TextCallbackHandler;
+import jdk.test.lib.Asserts;
+
 import javax.security.auth.callback.*;
+import java.io.*;
 
 public class Default {
-   public static void main(String args[]) throws Exception {
-        TextCallbackHandler h = new TextCallbackHandler();
-        NameCallback nc = new NameCallback("Name: ", "charlie");
-        ConfirmationCallback cc = new ConfirmationCallback
-                        ("Correct?",
-                        ConfirmationCallback.INFORMATION,
-                        ConfirmationCallback.YES_NO_OPTION,
-                        ConfirmationCallback.NO);
-
-        Callback[] callbacks = { nc, cc };
-        h.handle(callbacks);
-
-        if (cc.getSelectedIndex() == ConfirmationCallback.YES) {
-            System.out.println("yes");
-        } else {
-            System.out.println("no");
+    public static void main(String args[]) throws Exception {
+        InputStream in = System.in;
+        PrintStream err = System.err;
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final String defaultName = "charlie";
+        final String simulatedInput = "-1\n-1\n";
+        HumanInputStream humanInputStream = new HumanInputStream(simulatedInput);
+
+        try (PrintStream prints = new PrintStream(baos)) {
+            System.setIn(humanInputStream);
+            System.setErr(prints);
+            NameCallback nameCallback = new NameCallback("Name: ", defaultName);
+            ConfirmationCallback confirmationCallback = new ConfirmationCallback(
+                    "Correct?",
+                    ConfirmationCallback.INFORMATION,
+                    ConfirmationCallback.YES_NO_OPTION,
+                    ConfirmationCallback.NO);
+            new TextCallbackHandler().handle(new Callback[]{nameCallback, confirmationCallback});
+
+            Asserts.assertEquals(nameCallback.getDefaultName(), defaultName);
+            Asserts.assertEquals(confirmationCallback.getSelectedIndex(), ConfirmationCallback.NO);
+
+        } finally {
+            System.setIn(in);
+            System.setErr(err);
         }
-   }
+
+        // check that the default name and confirmation were visible in the output
+        Asserts.assertTrue(baos.toString().contains(String.format("Name:  [%s]", defaultName)));
+        Asserts.assertTrue(baos.toString().contains("1. No [default]"));
+    }
 }
diff --git a/test/jdk/com/sun/tools/attach/Agent.java b/test/jdk/com/sun/tools/attach/Agent.java
index 9090ea73519..510ff787fa7 100644
--- a/test/jdk/com/sun/tools/attach/Agent.java
+++ b/test/jdk/com/sun/tools/attach/Agent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
  * the given port.
  */
 import java.net.Socket;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.io.IOException;
 
@@ -38,7 +39,7 @@ public static void agentmain(String args) throws IOException {
         int port = Integer.parseInt(args);
         System.out.println("Agent connecting back to Tool....");
         Socket s = new Socket();
-        s.connect( new InetSocketAddress(port) );
+        s.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(), port));
         System.out.println("Agent connected to Tool.");
         s.close();
     }
diff --git a/test/jdk/com/sun/tools/attach/BasicTests.java b/test/jdk/com/sun/tools/attach/BasicTests.java
index 4dc7065630f..9ae45436810 100644
--- a/test/jdk/com/sun/tools/attach/BasicTests.java
+++ b/test/jdk/com/sun/tools/attach/BasicTests.java
@@ -23,6 +23,8 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.List;
@@ -213,7 +215,8 @@ public static void main(String args[]) throws Exception {
 
             System.out.println(" - Test: End-to-end connection with agent");
 
-            ServerSocket ss = new ServerSocket(0);
+            ServerSocket ss = new ServerSocket();
+            ss.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
             int port = ss.getLocalPort();
 
             System.out.println(" - Loading Agent.jar into target VM ...");
@@ -231,7 +234,8 @@ public static void main(String args[]) throws Exception {
 
             System.out.println(" - Test: End-to-end connection with RedefineAgent");
 
-            ServerSocket ss2 = new ServerSocket(0);
+            ServerSocket ss2 = new ServerSocket();
+            ss2.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
             int port2 = ss2.getLocalPort();
 
             System.out.println(" - Loading RedefineAgent.jar into target VM ...");
diff --git a/test/jdk/com/sun/tools/attach/RedefineAgent.java b/test/jdk/com/sun/tools/attach/RedefineAgent.java
index af01df42762..cc0e7d269df 100644
--- a/test/jdk/com/sun/tools/attach/RedefineAgent.java
+++ b/test/jdk/com/sun/tools/attach/RedefineAgent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2024, 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
@@ -32,6 +32,7 @@
  * 6446941 java.lang.instrument: multiple agent attach fails (first agent chooses capabilities)
  */
 import java.net.Socket;
+import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.io.IOException;
 import java.util.Arrays;
@@ -104,7 +105,7 @@ public static void agentmain(String args, Instrumentation inst) throws Exception
         int port = Integer.parseInt(args);
         System.out.println("RedefineAgent connecting back to Tool....");
         Socket s = new Socket();
-        s.connect( new InetSocketAddress(port) );
+        s.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(), port));
         System.out.println("RedefineAgent connected to Tool.");
 
         testRedefine(inst);
diff --git a/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java b/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java
new file mode 100644
index 00000000000..f9ce1b7c196
--- /dev/null
+++ b/test/jdk/java/awt/print/PrinterJob/PageDialogCancelTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2024, 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 8334366
+ * @key headful printer
+ * @summary Verifies original pageobject is returned unmodified
+ *          on cancelling pagedialog
+ * @requires (os.family == "windows")
+ * @run main PageDialogCancelTest
+ */
+
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+import java.awt.print.PageFormat;
+import java.awt.print.PrinterJob;
+
+public class PageDialogCancelTest {
+
+    public static void main(String[] args) throws Exception {
+        PrinterJob pj = PrinterJob.getPrinterJob();
+        PageFormat oldFormat = new PageFormat();
+        Robot robot = new Robot();
+        Thread t1 = new Thread(() -> {
+            robot.delay(2000);
+            robot.keyPress(KeyEvent.VK_ESCAPE);
+            robot.keyRelease(KeyEvent.VK_ESCAPE);
+            robot.waitForIdle();
+        });
+        t1.start();
+        PageFormat newFormat = pj.pageDialog(oldFormat);
+        if (!newFormat.equals(oldFormat)) {
+            throw new RuntimeException("Original PageFormat not returned on cancelling PageDialog");
+        }
+    }
+}
+
diff --git a/test/jdk/java/awt/print/PrinterJob/PrintNullString.java b/test/jdk/java/awt/print/PrinterJob/PrintNullString.java
index e4323b232a7..397dd2902d1 100644
--- a/test/jdk/java/awt/print/PrinterJob/PrintNullString.java
+++ b/test/jdk/java/awt/print/PrinterJob/PrintNullString.java
@@ -148,7 +148,7 @@ private void paint(Graphics2D g2d) {
             // API 3: null & empty drawString(Iterator, int, int);
             try {
                 g2d.drawString(nullIterator, 20, 120);
-                g2d.drawString("FAILURE: No NPE for null iterator, float", 20, 120);
+                g2d.drawString("FAILURE: No NPE for null iterator, int", 20, 120);
             } catch (NullPointerException e) {
                 g2d.drawString("caught expected NPE for null iterator, int", 20, 120);
             }
@@ -169,7 +169,7 @@ private void paint(Graphics2D g2d) {
             }
 
             try {
-                g2d.drawString(emptyIterator, 20, 180);
+                g2d.drawString(emptyIterator, 20.0f, 180.0f);
                 g2d.drawString("FAILURE: No IAE for empty iterator, float", 20, 180);
             } catch (IllegalArgumentException e) {
                 g2d.drawString("caught expected IAE for empty iterator, float", 20, 180);
diff --git a/test/jdk/java/awt/print/PrinterJob/XparColor.java b/test/jdk/java/awt/print/PrinterJob/XparColor.java
index 9a85a78af55..30713b1424e 100644
--- a/test/jdk/java/awt/print/PrinterJob/XparColor.java
+++ b/test/jdk/java/awt/print/PrinterJob/XparColor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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,7 +24,7 @@
 /**
  * @test
  * @bug 4179262
- @ @key printer
+ * @key printer
  * @summary Confirm that transparent colors are printed correctly. The
  * printout should show transparent rings with increasing darkness toward
  * the center.
diff --git a/test/jdk/java/foreign/TestSegments.java b/test/jdk/java/foreign/TestSegments.java
index 44ecd12ba5e..b361abac3df 100644
--- a/test/jdk/java/foreign/TestSegments.java
+++ b/test/jdk/java/foreign/TestSegments.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -43,7 +43,6 @@
 import java.util.function.Supplier;
 
 import static java.lang.foreign.ValueLayout.JAVA_INT;
-import static java.lang.foreign.ValueLayout.JAVA_LONG;
 import static org.testng.Assert.*;
 
 public class TestSegments {
@@ -383,9 +382,14 @@ void testReinterpret() {
             assertEquals(MemorySegment.ofAddress(42).reinterpret(100, Arena.ofAuto(), null).byteSize(), 100);
             // check scope and cleanup
             assertEquals(MemorySegment.ofAddress(42).reinterpret(100, arena, s -> counter.incrementAndGet()).scope(), arena.scope());
-            assertEquals(MemorySegment.ofAddress(42).reinterpret(arena, s -> counter.incrementAndGet()).scope(), arena.scope());
+            assertEquals(MemorySegment.ofAddress(42).reinterpret(arena, _ -> counter.incrementAndGet()).scope(), arena.scope());
+            // check read-only state
+            assertFalse(MemorySegment.ofAddress(42).reinterpret(100).isReadOnly());
+            assertTrue(MemorySegment.ofAddress(42).asReadOnly().reinterpret(100).isReadOnly());
+            assertTrue(MemorySegment.ofAddress(42).asReadOnly().reinterpret(100, Arena.ofAuto(), null).isReadOnly());
+            assertTrue(MemorySegment.ofAddress(42).asReadOnly().reinterpret(arena, _ -> counter.incrementAndGet()).isReadOnly());
         }
-        assertEquals(counter.get(), 2);
+        assertEquals(counter.get(), 3);
     }
 
     @Test
diff --git a/test/jdk/java/io/Console/RestoreEchoTest.java b/test/jdk/java/io/Console/RestoreEchoTest.java
new file mode 100644
index 00000000000..78d36faa537
--- /dev/null
+++ b/test/jdk/java/io/Console/RestoreEchoTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2024, 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.Console;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
+import org.junit.jupiter.api.Assumptions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+import static org.junit.jupiter.api.Assertions.*;
+
+
+/**
+ * @test
+ * @bug 8332161
+ * @summary Tests JdkConsoleImpl restores the echo state after readPassword() call
+ * @library /test/lib
+ * @run junit RestoreEchoTest
+ */
+public class RestoreEchoTest {
+
+    @Test
+    @EnabledOnOs({OS.LINUX, OS.MAC})
+    public void testRestoreEcho() throws Throwable {
+        // check "expect" command availability
+        var expect = Paths.get("/usr/bin/expect");
+        if (!Files.exists(expect) || !Files.isExecutable(expect)) {
+            Assumptions.abort("'" + expect + "' not found");
+        }
+
+        expectRunner("-echo");
+        expectRunner("echo");
+    }
+
+    private static void expectRunner(String initialEcho) throws Throwable {
+        // invoking "expect" command
+        var testSrc = System.getProperty("test.src", ".");
+        var testClasses = System.getProperty("test.classes", ".");
+        var jdkDir = System.getProperty("test.jdk");
+        OutputAnalyzer output = ProcessTools.executeProcess(
+                "expect",
+                "-n",
+                testSrc + "/restoreEcho.exp",
+                initialEcho,
+                jdkDir + "/bin/java",
+                "-Djdk.console=java.base",
+                "-classpath", testClasses,
+                "RestoreEchoTest");
+        output.reportDiagnosticSummary();
+        assertEquals(0, output.getExitValue());
+    }
+
+    public static void main(String... args) throws Throwable {
+        if (!"java.base".equals(System.getProperty("jdk.console"))) {
+            throw new RuntimeException("Test failed. jdk.console is not java.base");
+        }
+
+        Console con = System.console();
+        if (con == null) {
+            throw new RuntimeException("Test failed. System.console() returned null");
+        }
+
+        // testing readLine()
+        String input = con.readLine("prompt: ");
+        con.printf("input is %s%n", input);
+
+        // testing readPassword()
+        input = String.valueOf(con.readPassword("password prompt: "));
+        con.printf("password is %s%n", input);
+    }
+}
diff --git a/test/jdk/java/io/Console/restoreEcho.exp b/test/jdk/java/io/Console/restoreEcho.exp
new file mode 100644
index 00000000000..5a194b07a7d
--- /dev/null
+++ b/test/jdk/java/io/Console/restoreEcho.exp
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2024, 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.
+#
+
+set initialEcho [lindex $argv 0]
+set java [lrange $argv 1 end]
+set rlprompt "prompt: "
+set rpprompt "password prompt: "
+set rlinput "InPuT"
+set rpinput "PaSsWoRd"
+set rlexpected "input is $rlinput"
+set rpexpected "password is $rpinput"
+set stty_init $initialEcho
+set timeout 10
+
+proc test {prompt input echoStat expected} {
+    expect "$prompt"
+    send -- "$input\n"
+    if {$echoStat == "echo"} {
+        expect "$input"
+    }
+    expect "$expected"
+
+    if {$expect_out(0,string) != $expected} {
+        send_error "Expected: $expected\n"
+        send_error "Received: $expect_out(0,string)"
+        exit 1
+    }
+}
+
+spawn sh -c "[list {*}$java] && stty -a"
+
+# readLine() - input is displayed depending on initialEcho value
+test "$rlprompt" "$rlinput" "$initialEcho" "$rlexpected"
+# readPassword() - input is not displayed
+test "$rpprompt" "$rpinput" "-echo" "$rpexpected"
+# See if the initialEcho is restored with `stty -a`
+expect -- " $initialEcho "
+expect eof
diff --git a/test/jdk/java/io/IO/IO.java b/test/jdk/java/io/IO/IO.java
index 1a9a25c90c7..328c189fb2f 100644
--- a/test/jdk/java/io/IO/IO.java
+++ b/test/jdk/java/io/IO/IO.java
@@ -21,6 +21,7 @@
  * questions.
  */
 
+import java.lang.reflect.Method;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -34,6 +35,10 @@
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.condition.EnabledOnOs;
 import org.junit.jupiter.api.condition.OS;
+import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
+import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -48,6 +53,7 @@
  * @library /test/lib
  * @run junit IO
  */
+@ExtendWith(IO.TimingExtension.class)
 public class IO {
 
     @Nested
@@ -62,6 +68,11 @@ public static void prepareTTY() {
             if (!Files.exists(expect) || !Files.isExecutable(expect)) {
                 Assumptions.abort("'" + expect + "' not found");
             }
+            try {
+                var outputAnalyzer = ProcessTools.executeProcess(
+                        expect.toAbsolutePath().toString(), "-version");
+                outputAnalyzer.reportDiagnosticSummary();
+            } catch (Exception _) { }
         }
 
         /*
@@ -174,4 +185,41 @@ public void nullConsole(String method) throws Exception {
         assertEquals(1, output.getExitValue());
         output.shouldContain("Exception in thread \"main\" java.io.IOError");
     }
+
+
+    // adapted from https://junit.org/junit5/docs/current/user-guide/#extensions-lifecycle-callbacks-timing-extension
+    // remove after CODETOOLS-7903752 propagates to jtreg that this test is routinely run by
+
+    public static class TimingExtension implements BeforeTestExecutionCallback,
+            AfterTestExecutionCallback {
+
+        private static final System.Logger logger = System.getLogger(
+                TimingExtension.class.getName());
+
+        private static final String START_TIME = "start time";
+
+        @Override
+        public void beforeTestExecution(ExtensionContext context) {
+            getStore(context).put(START_TIME, time());
+        }
+
+        @Override
+        public void afterTestExecution(ExtensionContext context) {
+            Method testMethod = context.getRequiredTestMethod();
+            long startTime = getStore(context).remove(START_TIME, long.class);
+            long duration = time() - startTime;
+
+            logger.log(System.Logger.Level.INFO, () ->
+                    String.format("Method [%s] took %s ms.", testMethod.getName(), duration));
+        }
+
+        private ExtensionContext.Store getStore(ExtensionContext context) {
+            return context.getStore(ExtensionContext.Namespace.create(getClass(),
+                    context.getRequiredTestMethod()));
+        }
+
+        private long time() {
+            return System.nanoTime() / 1_000_000;
+        }
+    }
 }
diff --git a/test/jdk/java/io/IO/input.exp b/test/jdk/java/io/IO/input.exp
index ba86b57b131..6f17a1379ec 100644
--- a/test/jdk/java/io/IO/input.exp
+++ b/test/jdk/java/io/IO/input.exp
@@ -23,6 +23,7 @@
 
 set prompt [lindex $argv $argc-1]
 set stty_init "rows 24 cols 80"
+set timeout -1
 
 spawn {*}$argv
 expect {
@@ -30,7 +31,8 @@ expect {
         send "hello\r"
     }
     timeout {
-        puts "timeout"; exit 1
+        puts "timeout"
+        exit 1
     }
 }
 expect eof
diff --git a/test/jdk/java/io/IO/output.exp b/test/jdk/java/io/IO/output.exp
index 9044912cfaf..a792b8791a4 100644
--- a/test/jdk/java/io/IO/output.exp
+++ b/test/jdk/java/io/IO/output.exp
@@ -21,12 +21,23 @@
 # questions.
 #
 
-################################################################################
-# This script does not expect/verify anything and is only used to simulate tty #
-################################################################################
+# This script doesn't verify any output strings, it's only used to simulate tty
 
-# Use `noecho` below, otherwise, expect will output the expanded "spawn ..."
+set stty_init "rows 24 cols 80"
+set timeout -1
+
+# Use `-noecho` below, otherwise, expect will output the expanded "spawn ..."
 # command, which will interfere with asserting output from the java test
+# counterpart
 
 spawn -noecho {*}$argv
-expect eof
+
+expect {
+    eof {
+        exit 0
+    }
+    timeout {
+        puts "timeout"
+        exit 1
+    }
+}
diff --git a/test/jdk/java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java b/test/jdk/java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java
index 48cbd1b0ffe..196a27b52ba 100644
--- a/test/jdk/java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java
+++ b/test/jdk/java/io/Serializable/concurrentClassDescLookup/ConcurrentClassDescLookup.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
  */
 
 import java.io.*;
+import java.util.concurrent.CountDownLatch;
 
 class Good implements Serializable {
     private static final long serialVersionUID = 6319710844400051132L;
@@ -51,19 +52,20 @@ class Bad implements Serializable {
 class SuccessfulLookup extends Thread {
     Class<?> cl;
     long suid;
-    Object barrier;
+    final CountDownLatch lookupLatch;
     boolean ok;
 
-    SuccessfulLookup(Class<?> cl, long suid, Object barrier) {
+    SuccessfulLookup(Class<?> cl, long suid, CountDownLatch lookupLatch) {
         this.cl = cl;
         this.suid = suid;
-        this.barrier = barrier;
+        this.lookupLatch = lookupLatch;
     }
 
     public void run() {
-        synchronized (barrier) {
-            try { barrier.wait(); } catch (InterruptedException ex) {}
-        }
+        lookupLatch.countDown(); // let others know we are ready
+        try {
+            lookupLatch.await(); // await for others
+        } catch (InterruptedException ex) {}
         for (int i = 0; i < 100; i++) {
             if (ObjectStreamClass.lookup(cl).getSerialVersionUID() != suid) {
                 return;
@@ -75,18 +77,19 @@ public void run() {
 
 class FailingLookup extends Thread {
     Class<?> cl;
-    final Object barrier;
+    final CountDownLatch lookupLatch;
     boolean ok;
 
-    FailingLookup(Class<?> cl, Object barrier) {
+    FailingLookup(Class<?> cl, CountDownLatch lookupLatch) {
         this.cl = cl;
-        this.barrier = barrier;
+        this.lookupLatch = lookupLatch;
     }
 
     public void run() {
-        synchronized (barrier) {
-            try { barrier.wait(); } catch (InterruptedException ex) {}
-        }
+        lookupLatch.countDown(); // let others know we are ready
+        try {
+            lookupLatch.await(); // await for others
+        } catch (InterruptedException ex) {}
         for (int i = 0; i < 100; i++) {
             try {
                 ObjectStreamClass.lookup(cl);
@@ -102,39 +105,36 @@ public class ConcurrentClassDescLookup {
     public static void main(String[] args) throws Exception {
         ClassLoader loader = ConcurrentClassDescLookup.class.getClassLoader();
         Class<?> cl = Class.forName("Good", false, loader);
-        Object barrier = new Object();
-        SuccessfulLookup[] slookups = new SuccessfulLookup[50];
+        int numSuccessfulLookups = 50;
+        CountDownLatch sLookupLatch = new CountDownLatch(numSuccessfulLookups);
+        SuccessfulLookup[] slookups = new SuccessfulLookup[numSuccessfulLookups];
         for (int i = 0; i < slookups.length; i++) {
-            slookups[i] =
-                new SuccessfulLookup(cl, 6319710844400051132L, barrier);
+            slookups[i] = new SuccessfulLookup(cl, 6319710844400051132L, sLookupLatch);
             slookups[i].start();
         }
-        Thread.sleep(1000);
-        synchronized (barrier) {
-            barrier.notifyAll();
-        }
+        System.out.println("awaiting completion of " + slookups.length + " SuccessfulLookup");
         for (int i = 0; i < slookups.length; i++) {
             slookups[i].join();
             if (!slookups[i].ok) {
                 throw new Error();
             }
         }
-
+        System.out.println("all " + slookups.length + " SuccessfulLookup completed");
         cl = Class.forName("Bad", false, loader);
-        FailingLookup[] flookups = new FailingLookup[50];
+        int numFailingLookups = 50;
+        CountDownLatch fLookupLatch = new CountDownLatch(numFailingLookups);
+        FailingLookup[] flookups = new FailingLookup[numFailingLookups];
         for (int i = 0; i < flookups.length; i++) {
-            flookups[i] = new FailingLookup(cl, barrier);
+            flookups[i] = new FailingLookup(cl, fLookupLatch);
             flookups[i].start();
         }
-        Thread.sleep(1000);
-        synchronized (barrier) {
-            barrier.notifyAll();
-        }
-        for (int i = 0; i < slookups.length; i++) {
+        System.out.println("awaiting completion of " + flookups.length + " FailingLookup");
+        for (int i = 0; i < flookups.length; i++) {
             flookups[i].join();
             if (!flookups[i].ok) {
                 throw new Error();
             }
         }
+        System.out.println("all " + flookups.length + " FailingLookup completed");
     }
 }
diff --git a/test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java b/test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java
index ca31213b28f..c9b757a7b51 100644
--- a/test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java
+++ b/test/jdk/java/io/Serializable/records/BadCanonicalCtrTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -207,7 +207,7 @@ protected Class<?> resolveClass(ObjectStreamClass desc)
      */
     static byte[] removeConstructor(byte[] classBytes) {
         var cf = ClassFile.of();
-        return cf.transform(cf.parse(classBytes), ClassTransform.dropping(ce ->
+        return cf.transformClass(cf.parse(classBytes), ClassTransform.dropping(ce ->
                 ce instanceof MethodModel mm && mm.methodName().equalsString(INIT_NAME)));
     }
 
@@ -217,7 +217,7 @@ static byte[] removeConstructor(byte[] classBytes) {
      */
     static byte[] modifyConstructor(byte[] classBytes) {
         var cf = ClassFile.of();
-        return cf.transform(cf.parse(classBytes), ClassTransform.dropping(ce ->
+        return cf.transformClass(cf.parse(classBytes), ClassTransform.dropping(ce ->
                         ce instanceof MethodModel mm && mm.methodName().equalsString(INIT_NAME))
                 .andThen(ClassTransform.endHandler(clb -> clb.withMethodBody(INIT_NAME,
                         MethodTypeDesc.of(CD_void, CD_Object), ACC_PUBLIC, cob -> {
diff --git a/test/jdk/java/io/Serializable/records/ProhibitedMethods.java b/test/jdk/java/io/Serializable/records/ProhibitedMethods.java
index 53252aaf558..3a66e46f83b 100644
--- a/test/jdk/java/io/Serializable/records/ProhibitedMethods.java
+++ b/test/jdk/java/io/Serializable/records/ProhibitedMethods.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -243,7 +243,7 @@ static byte[] addReadObjectNoData(byte[] classBytes) {
     static byte[] addMethod(byte[] classBytes,
                             String name, MethodTypeDesc desc) {
         var cf = ClassFile.of();
-        return cf.transform(cf.parse(classBytes), ClassTransform.endHandler(clb -> {
+        return cf.transformClass(cf.parse(classBytes), ClassTransform.endHandler(clb -> {
             clb.withMethodBody(name, desc, ACC_PRIVATE, cob -> {
                 cob.loadConstant(name + " should not be invoked");
                 cob.invokestatic(Assert.class.describeConstable().orElseThrow(), "fail",
diff --git a/test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java b/test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java
index 4ff15aa84d4..12a5fe8c402 100644
--- a/test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java
+++ b/test/jdk/java/io/Serializable/records/SerialPersistentFieldsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -231,7 +231,7 @@ static byte[] addSerialPersistentFields(byte[] classBytes,
                                             ObjectStreamField[] spf) {
         var cf = ClassFile.of();
         var model = cf.parse(classBytes);
-        return cf.transform(model, new SerialPersistentFieldsVisitor(model.thisClass().asSymbol(), spf));
+        return cf.transformClass(model, new SerialPersistentFieldsVisitor(model.thisClass().asSymbol(), spf));
     }
 
     /** A visitor that adds a serialPersistentFields field, and assigns it in clinit. */
diff --git a/test/jdk/java/lang/ModuleTests/AnnotationsTest.java b/test/jdk/java/lang/ModuleTests/AnnotationsTest.java
index 60487584273..1fffe710ce5 100644
--- a/test/jdk/java/lang/ModuleTests/AnnotationsTest.java
+++ b/test/jdk/java/lang/ModuleTests/AnnotationsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -148,7 +148,7 @@ public void testWithModuleInfoResourceXXXX() throws IOException {
     static byte[] addDeprecated(byte[] bytes, boolean forRemoval, String since) {
         var cf = ClassFile.of();
         var oldModel = cf.parse(bytes);
-        return cf.transform(oldModel, new ClassTransform() {
+        return cf.transformClass(oldModel, new ClassTransform() {
             boolean rvaaFound = false;
 
             @Override
diff --git a/test/jdk/java/lang/ProcessHandle/OnExitTest.java b/test/jdk/java/lang/ProcessHandle/OnExitTest.java
index b75775b51a2..79c696efdfc 100644
--- a/test/jdk/java/lang/ProcessHandle/OnExitTest.java
+++ b/test/jdk/java/lang/ProcessHandle/OnExitTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -32,6 +32,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
+import jdk.test.lib.Platform;
 import jdk.test.lib.Utils;
 
 import org.testng.annotations.Test;
@@ -40,6 +41,7 @@
 
 /*
  * @test
+ * @bug 8333742
  * @requires vm.flagless
  * @library /test/lib
  * @modules jdk.management
@@ -65,8 +67,10 @@ public static void main(String[] args) {
     @Test
     public static void test1() {
         try {
-            int[] exitValues = {0, 1, 10};
+            int[] exitValues = {0, 1, 10, 259};
             for (int value : exitValues) {
+                // Linux & Mac don't support exit codes longer than 8 bits, skip
+                if (value == 259 && !Platform.isWindows()) continue;
                 Process p = JavaChild.spawn("exit", Integer.toString(value));
                 CompletableFuture<Process> future = p.onExit();
                 future.thenAccept( (ph) -> {
@@ -81,7 +85,9 @@ public static void test1() {
                 Assert.assertEquals(h, p);
                 Assert.assertEquals(p.exitValue(), value);
                 Assert.assertFalse(p.isAlive(), "Process should not be alive");
-                p.waitFor();
+                Assert.assertEquals(p.waitFor(), value);
+                Assert.assertTrue(p.waitFor(1, TimeUnit.MILLISECONDS),
+                        "waitFor should return true");
             }
         } catch (IOException | InterruptedException | ExecutionException ex) {
             Assert.fail(ex.getMessage(), ex);
diff --git a/test/jdk/java/lang/String/IndexOf.java b/test/jdk/java/lang/String/IndexOf.java
new file mode 100644
index 00000000000..baab83e19c4
--- /dev/null
+++ b/test/jdk/java/lang/String/IndexOf.java
@@ -0,0 +1,258 @@
+/*
+ * Copyright (c) 2024, Intel Corporation. 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 8320448
+ * @summary test String indexOf() intrinsic
+ * @run driver IndexOf
+ */
+
+/*
+ * @test
+ * @bug 8320448
+ * @summary test String indexOf() intrinsic
+ * @requires vm.cpu.features ~= ".*avx2.*"
+ * @requires vm.compiler2.enabled
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xcomp -XX:-TieredCompilation -XX:UseAVX=2 -XX:+UnlockDiagnosticVMOptions -XX:+EnableX86ECoreOpts IndexOf
+ */
+
+ public class IndexOf {
+  final int scope = 32*2+16+8;
+  final char a, aa, b, c, d;
+  enum Encoding {LL, UU, UL; }
+  final Encoding ae;
+  int failures;
+
+  IndexOf(Encoding _ae) {
+      failures = 0;
+      ae = _ae;
+      switch (ae) {
+          case LL:
+              a = 'a';
+              aa = a;
+              b = 'b';
+              c = 'c';
+              d = 'd';
+              break;
+          case UU:
+              a = '\u0061';
+              aa = a;
+              b = '\u0062';
+              c = '\u1063';
+              d = '\u0064';
+              break;
+          default: //case UL:
+              a = 'a';
+              aa = '\u1061';
+              b = 'b';
+              c = 'c';
+              d = 'd';
+              break;
+      }
+  }
+
+  // needle    =~ /ab*d/
+  // badNeedle =~ /ab*db*d/
+  interface Append {void append(int pos, char cc);}
+  String newNeedle(int size, int badPosition) {
+      if (size<2) {throw new RuntimeException("Fix testcase "+size);}
+
+      StringBuilder needle = new StringBuilder(size);
+      Append n = (int pos, char cc) -> {
+          if (pos == badPosition)
+              needle.append(c);
+          else
+              needle.append(cc);
+      };
+
+      n.append(0, a);
+      for (int i=1; i<size-1; i++) {
+          n.append(i, b);
+      }
+      n.append(size-1, d);
+
+      return needle.toString();
+  }
+
+  // haystack  =~ /a*{needle}d*/
+  String newHaystack(int size, String needle, int nPosition) {
+      if (nPosition+needle.length()>size) {throw new RuntimeException("Fix testcase "+nPosition+" "+needle.length()+" "+size);}
+      StringBuilder haystack = new StringBuilder(size);
+      int i = 0;
+      for (; i<nPosition; i++) {
+          haystack.append(aa);
+      }
+      haystack.append(needle);
+      i += needle.length();
+      for (; i<size; i++) {
+          haystack.append(d);
+      }
+      return haystack.toString();
+  }
+
+  // haystack =~ /a*{needle}+b*/
+  String newHaystackRepeat(int size, String needle, int nPosition) {
+      if (nPosition+needle.length()>size) {throw new RuntimeException("Fix testcase "+nPosition+" "+needle.length()+" "+size);}
+      StringBuilder haystack = new StringBuilder(size);
+      int i = 0;
+      for (; i<nPosition; i++) {
+          haystack.append(aa);
+      }
+      for (; i< nPosition+needle.length(); i += needle.length()) {
+          haystack.append(needle);
+      }
+      for (; i<size; i++) {
+          haystack.append(d);
+      }
+      return haystack.toString();
+  }
+
+  public static void main(String[] args) {
+      int failures = 0;
+      for (Encoding ae : Encoding.values()) {
+          failures += (new IndexOf(ae))
+              .test0()
+              .test1()
+              .test2()
+              .test3()
+              .test4()
+              .failures;
+      }
+      if (failures != 0) {
+          throw new RuntimeException("IndexOf test failed.");
+      }
+  }
+
+  // Need to disable checks in String.java if intrinsic is to be tested
+  IndexOf test0() { // Test 'trivial cases'
+      // if (0==needle_len) return haystack_off;
+      if (3 != "Hello".indexOf("", 3)) {
+          System.out.println("FAILED: if (0==needle_len) return haystack_off");
+          failures++;
+      }
+      //if (0==haystack_len) return -1;
+      if (-1 != "".indexOf("Hello", 3)) {
+          System.out.println("FAILED: if (0==haystack_len) return -1");
+          failures++;
+      }
+      //if (needle_len>haystack_len) return -1;
+      if (-1 != "Hello".indexOf("HelloWorld", 3)) {
+          System.out.println("FAILED: if (needle_len>haystack_len) return -1");
+          failures++;
+      }
+      return this;
+  }
+
+  IndexOf test1() { // Test expected to find one needle
+      for (int nSize = 2; nSize<scope; nSize++) {
+          String needle = newNeedle(nSize, -1);
+          for (int hSize = nSize; hSize<scope; hSize++) {
+              for (int i = 0; i<hSize-nSize; i++) {
+                  String haystack = newHaystack(hSize, needle, i);
+                  for (int j = 0; j<=i; j++) {
+                      int found = haystack.indexOf(needle, j);
+                      if (i != found) {
+                          System.out.println("("+ae.name()+")(T1) Trying needle["+nSize+"] in haystack["+hSize+"] at offset["+i+"]");
+                          System.out.println("    FAILED: Found " + needle + "@" + found + " in " + haystack + " from ["+j+"]");
+                          failures++;
+                      }
+                  }
+              }
+          }
+      }
+      return this;
+  }
+
+  IndexOf test2() { // Test needle with one mismatched character
+      for (int nSize = 2; nSize<scope; nSize++) {
+          for (int hSize = nSize; hSize<scope; hSize++) {
+              String needle = newNeedle(nSize, -1);
+              for (int badPosition = 0; badPosition < nSize; badPosition+=1) {
+                  String badNeedle = newNeedle(nSize, badPosition);
+                  for (int i = 0; i<hSize-nSize; i++) {
+                      String haystack = newHaystack(hSize, needle, i);
+                      int found = haystack.indexOf(badNeedle, 1);
+                      if (-1 != found) {
+                          System.out.println("("+ae.name()+")(T2) Trying bad needle["+nSize+"]["+badPosition+"] in haystack["+hSize+"] at offset["+i+"]");
+                          System.out.println("    FAILED: False " + found + " " + haystack + "["+needle+"]["+badNeedle+"]");
+                          failures++;
+                      }
+                  }
+              }
+          }
+      }
+      return this;
+  }
+
+  IndexOf test3() { // Test expected to find first of the repeated needles
+      for (int nSize = 2; nSize<scope; nSize++) {
+          String needle = newNeedle(nSize, -1);
+          for (int hSize = nSize; hSize<scope; hSize++) {
+              for (int i = 0; i<hSize-nSize; i++) {
+                  String haystack = newHaystackRepeat(hSize, needle, i);
+                  for (int j = 0; j<=i; j++) {
+                      int found = haystack.indexOf(needle, j);
+                      if (i != found) {
+                          System.out.println("("+ae.name()+")(T3) Trying repeaded needle["+nSize+"] in haystack["+hSize+"] at offset["+i+"]");
+                          System.out.println("    FAILED: " + found + " " + haystack + "["+needle+"]");
+                          failures++;
+                      }
+                  }
+              }
+          }
+      }
+      return this;
+  }
+
+  IndexOf test4() { // Test needle at unreachable offset
+      for (int nSize = 2; nSize<scope; nSize++) {
+          String needle = newNeedle(nSize, -1);
+          for (int hSize = nSize; hSize<scope; hSize++) {
+              for (int i = 0; i<hSize-nSize; i++) {
+                  String haystack = newHaystack(hSize, needle, i);
+                  // prefix lookup
+                  for (int j = nSize-1; j<i+nSize; j++) {
+                      int found = haystack.indexOf(needle, 0, j);
+                      if (-1 != found) {
+                          System.out.println("("+ae.name()+")(T4) Trying needle["+nSize+"] at offset ["+i+"] in haystack["+hSize+"] upto ["+j+"]");
+                          System.out.println("    FAILED: False " + found + " " + haystack + "["+needle+"]");
+                          failures++;
+                      }
+                  }
+
+                  // sufix lookup
+                  for (int j = i+1; j<hSize; j++) {
+                      int found = haystack.indexOf(needle, j);
+                      if (-1 != found) {
+                          System.out.println("("+ae.name()+")(T4) Trying needle["+nSize+"] at offset ["+i+"] in haystack["+hSize+"] from ["+j+"]");
+                          System.out.println("    FAILED: False " + found + " " + haystack + "["+needle+"]");
+                          failures++;
+                      }
+                  }
+              }
+          }
+      }
+      return this;
+  }
+}
\ No newline at end of file
diff --git a/test/jdk/java/lang/StringBuffer/ECoreIndexOf.java b/test/jdk/java/lang/StringBuffer/ECoreIndexOf.java
new file mode 100644
index 00000000000..ccaee0f77ea
--- /dev/null
+++ b/test/jdk/java/lang/StringBuffer/ECoreIndexOf.java
@@ -0,0 +1,1381 @@
+/*
+ * Copyright (c) 2024, 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 8320448
+ * @summary Test indexOf and lastIndexOf
+ * @run main/othervm -Xbatch -XX:-TieredCompilation -XX:CompileCommand=dontinline,ECoreIndexOf.indexOfKernel ECoreIndexOf
+ * @run main/othervm -Xbatch -XX:CompileCommand=dontinline,ECoreIndexOf.indexOfKernel ECoreIndexOf
+ * @key randomness
+ */
+
+/* @test
+ * @bug 8320448
+ * @summary Test indexOf and lastIndexOf
+ * @requires vm.cpu.features ~= ".*avx2.*"
+ * @requires vm.compiler2.enabled
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+EnableX86ECoreOpts -XX:UseAVX=2 -Xbatch -XX:-TieredCompilation -XX:CompileCommand=dontinline,ECoreIndexOf.indexOfKernel ECoreIndexOf
+ * @key randomness
+ */
+
+import java.nio.charset.StandardCharsets;
+import java.util.Random;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.nio.charset.Charset;
+import java.lang.Math;
+
+// @ECoreIndexOf(singleThreaded=true)
+public class ECoreIndexOf {
+
+  static Random generator;
+  private static boolean failure = false;
+  static char[] haystack = new char[128];
+  static char[] haystack_16 = new char[128];
+
+  static boolean verbose = false;
+  static boolean success = true;
+
+  static Map<Charset, String> titles = new HashMap<Charset, String>();
+  static Random rng = new Random(1999);
+
+  public static void main(String[] args) throws Exception {
+    int foo = 0;
+    String testName = "ECoreIndexOf";
+
+    generator = new Random();
+    long seed = generator.nextLong();
+    generator.setSeed(seed);
+    System.out.println("Seed set to "+ seed);
+
+    ///////////////////////////  WARM-UP //////////////////////////
+
+    for (int i = 0; i < 20000; i++) {
+      char c = 65;
+      char c16 = 0x1ed;
+      StringBuffer sb = new StringBuffer("a");
+      StringBuffer sb16 = new StringBuffer("\u01fe");
+
+      foo += indexOfKernel("\u01fe", "a");
+      foo += indexOfKernel("\u01fe", "a", 0);
+      foo += indexOfKernel("\u01fe", "\u01ff");
+      foo += indexOfKernel("\u01fe", "\u01ff", 0);
+      foo += indexOfKernel("a", "a");
+      foo += indexOfKernel("a", "a", 0);
+      foo += indexOfKernel("a", "\u01ff");
+      foo += indexOfKernel("a", "\u01ff", 0);
+
+      foo += indexOfKernel("\u01fe", c);
+      foo += indexOfKernel("\u01fe", c, 0);
+      foo += indexOfKernel("\u01fe", c16);
+      foo += indexOfKernel("\u01fe", c16, 0);
+      foo += indexOfKernel("a", c);
+      foo += indexOfKernel("a", c, 0);
+      foo += indexOfKernel("a", c16);
+      foo += indexOfKernel("a", c16, 0);
+
+      foo += indexOfKernel(sb16, c);
+      foo += indexOfKernel(sb16, c, 0);
+      foo += indexOfKernel(sb16, c16);
+      foo += indexOfKernel(sb16, c16, 0);
+      foo += indexOfKernel(sb, c);
+      foo += indexOfKernel(sb, c, 0);
+      foo += indexOfKernel(sb, c16);
+      foo += indexOfKernel(sb, c16, 0);
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    String[] decorators = {"", " (same char)"};
+    Charset[] charSets = {StandardCharsets.ISO_8859_1, StandardCharsets.UTF_16};
+    boolean[] truefalse = {true, false};
+
+    titles.put(StandardCharsets.ISO_8859_1, "L");
+    titles.put(StandardCharsets.UTF_16, "U");
+
+    for (int xxy = 0; xxy < 2; xxy++) { // Run at least twice to ensure stub called
+
+      for (int i = 0; i < 128; i++) {
+        haystack[i] = (char) i;
+      }
+
+      haystack_16[0] = '\u0000'; // (char) (23 + 256);
+      for (int i = 1; i < 128; i++) {
+        haystack_16[i] = (char) (i);
+      }
+
+      simpleTest();
+      compareIndexOfLastIndexOf();
+      compareStringStringBuffer();
+      StringIndexof();
+      StringIndexofChar();
+      StringIndexofHuge();
+
+      for (String decorator : decorators) {
+        for (Charset csHaystack : charSets) {
+          for (Charset csNeedle : charSets) {
+            System.out.println("Testing " + titles.get(csHaystack) + titles.get(csNeedle) + decorator);
+            for (boolean useOffset : truefalse) {
+              for (boolean useBuffer : truefalse) {
+                exhaustive(useOffset, useBuffer, csHaystack, csNeedle);
+              }
+            }
+          }
+        }
+
+        for (int i = 0; i < 128; i++) {
+          haystack[i] = (char) 'a';
+        }
+
+        for (int i = 0; i < 128; i++) {
+          haystack_16[i] = (char) ('a' + 256);
+        }
+      }
+    }
+
+    System.out.println(testName + " complete.");
+
+    if (failure)
+      throw new RuntimeException("One or more failures.");
+  }
+
+  private static void report(String testName, int failCount) {
+    System.err.println(testName + ": " +
+        (failCount == 0 ? "Passed" : "Failed(" + failCount + ")"));
+    if (failCount > 0)
+      failure = true;
+  }
+
+  private static String generateTestString(int min, int max) {
+    StringBuffer aNewString = new StringBuffer(120);
+    int aNewLength = getRandomIndex(min, max);
+    for (int y = 0; y < aNewLength; y++) {
+      int achar = generator.nextInt(30) + 30;
+      char test = (char) (achar);
+      aNewString.append(test);
+    }
+    return aNewString.toString();
+  }
+
+  private static String makeRndString(boolean isUtf16, int length) {
+    StringBuilder sb = new StringBuilder(length);
+    if (length > 0) {
+      sb.append(isUtf16 ? '\u2026' : 'b'); // ...
+
+      for (int i = 1; i < length - 1; i++) {
+        sb.append((char) ('b' + rng.nextInt(26)));
+      }
+
+      sb.append(rng.nextInt(3) >= 1 ? 'a' : 'b');// 66.6% of time 'a' is in string
+    }
+    return sb.toString();
+  }
+
+  private static int indexOfKernel(String haystack, String needle) {
+    return haystack.indexOf(needle);
+  }
+
+  private static int indexOfKernel(String haystack, String needle, int offset) {
+    return haystack.indexOf(needle, offset);
+  }
+
+  private static int indexOfKernel(StringBuffer haystack, String needle) {
+    return haystack.indexOf(needle);
+  }
+
+  private static int indexOfKernel(StringBuffer haystack, char cneedle) {
+    String needle = String.valueOf(cneedle);
+    return haystack.indexOf(needle);
+  }
+
+  private static int indexOfKernel(StringBuffer haystack, String needle, int offset) {
+    return haystack.indexOf(needle, offset);
+  }
+
+  private static int indexOfKernel(StringBuffer haystack, char cneedle, int offset) {
+    String needle = String.valueOf(cneedle);
+    return haystack.indexOf(needle, offset);
+  }
+
+  private static int indexOfKernel(String haystack, char needle) {
+    return haystack.indexOf(needle);
+  }
+
+  private static int indexOfKernel(String haystack, char needle, int offset) {
+    return haystack.indexOf(needle, offset);
+  }
+
+  private static void printStringBytes(byte[] bytes) {
+    System.err.println(" bytes.len=" + bytes.length);
+    for (byte b : bytes) {
+      System.err.print(String.format("0x%02x ", b));
+    }
+    System.err.println("");
+  }
+
+  private static int getRandomIndex(int constraint1, int constraint2) {
+    int range = constraint2 - constraint1;
+    int x = generator.nextInt(range);
+    return constraint1 + x;
+  }
+
+  private static int naiveFind(String haystack, String needle) {
+    return naiveFind(haystack, needle, 0);
+  }
+
+  private static int naiveFind(String haystack, char needle) {
+    return naiveFind(haystack, needle, 0);
+  }
+
+  private static int naiveFind(String haystack, String needle, int offset) {
+    int x = offset;
+    int len = haystack.length() - offset;
+    if (needle.length() == 0)
+      return offset;
+    if (needle.length() > len)
+      return -1;
+    int hsndx = 0;
+    int nndx = 0;
+    for (int xx = 0; xx < offset; xx++) {
+      hsndx += Character.charCount(haystack.codePointAt(hsndx));
+    }
+
+    for (x = offset; x < haystack.length() - needle.length() + 1; x++) {
+      if (haystack.codePointAt(hsndx) == needle.codePointAt(0)) {
+        nndx = Character.charCount(needle.codePointAt(0));
+        int hsndx_tmp = hsndx + Character.charCount(haystack.codePointAt(hsndx));
+
+        while (nndx < needle.length()) {
+          if (haystack.codePointAt(hsndx_tmp) != needle.codePointAt(nndx)) {
+            break;
+          }
+          hsndx_tmp += Character.charCount(haystack.codePointAt(hsndx_tmp));
+          nndx += Character.charCount(needle.codePointAt(nndx));
+        }
+        if (nndx == needle.length()) {
+          return x;
+        }
+      }
+      hsndx += Character.charCount(haystack.codePointAt(hsndx));
+    }
+    return -1;
+  }
+
+  private static int naiveFind(String haystack, char cneedle, int offset) {
+    int x = offset;
+    int len = haystack.length() - offset;
+    String needle = String.valueOf(cneedle);
+    if (len == 0)
+      return -1;
+    int hsndx = 0;
+    for (int xx = 0; xx < offset; xx++) {
+      hsndx += Character.charCount(haystack.codePointAt(hsndx));
+    }
+
+    for (x = offset; x < haystack.length(); x++) {
+      if (haystack.codePointAt(hsndx) == needle.codePointAt(0)) {
+        return x;
+      }
+      hsndx += Character.charCount(haystack.codePointAt(hsndx));
+    }
+
+    return -1;
+  }
+
+  private static void exhaustive(boolean useOffset, boolean useStringBuffer, Charset hs_charset,
+      Charset needleCharset) {
+    int result = 0;
+    int midresult = 0;
+    int endresult = 0;
+    int l_offset = 0;
+    int failCount = 0;
+
+    String thisTest = titles.get(hs_charset) + titles.get(needleCharset) + (useOffset ? " w/offset" : "") + (useStringBuffer ? " StringBuffer" : "");
+
+    for (int needleSize = 0; needleSize < 128; needleSize++) {
+      for (int haystackSize = 0; haystackSize < 128; haystackSize++) {
+        for (l_offset = 0; l_offset <= haystackSize; l_offset++) {
+          String needle = new String(Arrays.copyOfRange(
+              (needleCharset == StandardCharsets.UTF_16) ? haystack_16 : haystack, l_offset, l_offset + needleSize));
+          int hsSize = (haystackSize - l_offset) >= 0 ? haystackSize - l_offset : 0;
+          int midStart = Math.max((hsSize / 2) - (needleSize / 2), 0);
+          int endStart = (hsSize > needleSize) ? hsSize - needleSize : 0;
+          String midNeedle = new String(
+              Arrays.copyOfRange((needleCharset == StandardCharsets.UTF_16) ? haystack_16 : haystack,
+                  midStart + l_offset, midStart + needleSize + l_offset));
+          String endNeedle = new String(
+              Arrays.copyOfRange((needleCharset == StandardCharsets.UTF_16) ? haystack_16 : haystack,
+                  endStart + l_offset, endStart + needleSize + l_offset));
+          String shs = new String(
+              Arrays.copyOfRange((hs_charset == StandardCharsets.UTF_16) ? haystack_16 : haystack, 0, haystackSize));
+
+          // Truncate needles to correct lengths
+
+          if (l_offset + needleSize > haystack.length + 1) {
+            needle = needle.substring(0, needleSize);
+            midNeedle = midNeedle.substring(0, needleSize);
+            endNeedle = endNeedle.substring(0, needleSize);
+          }
+
+          if (!success && needleSize > 1) {
+            needle = needle.substring(0, needle.length() - 1) + (char) ((int) (needle.charAt(needle.length() - 2) + 1));
+            midNeedle = midNeedle.substring(0, midNeedle.length() - 1)
+                + (char) ((int) (midNeedle.charAt(midNeedle.length() - 2) + 1));
+            endNeedle = endNeedle.substring(0, endNeedle.length() - 1)
+                + (char) ((int) (endNeedle.charAt(endNeedle.length() - 2) + 1));
+          }
+
+          StringBuffer hs = new StringBuffer(shs.length());
+          hs.append(shs);
+          if (!shs.equals(hs.toString()))
+            throw new RuntimeException("Initial equality failure");
+
+          if (useStringBuffer) {
+            result = indexOfKernel(hs, needle, l_offset);
+            midresult = indexOfKernel(hs, midNeedle, l_offset);
+            endresult = indexOfKernel(hs, endNeedle, l_offset);
+          } else {
+            result = indexOfKernel(shs, needle, l_offset);
+            midresult = indexOfKernel(shs, midNeedle, l_offset);
+            endresult = indexOfKernel(shs, endNeedle, l_offset);
+          }
+          int nResult = naiveFind(hs.toString(), needle, l_offset);
+          int midnResult = naiveFind(hs.toString(), midNeedle, l_offset);
+          int endnResult = naiveFind(hs.toString(), endNeedle, l_offset);
+          if (result != nResult) {
+            failCount++;
+            System.err.println("useOffset=" + useOffset + ", useStringBuffer=" + useStringBuffer);
+            System.err.print("Haystack=");
+            printStringBytes(shs.getBytes(hs_charset));
+            System.err.print("Needle=");
+            printStringBytes(needle.getBytes(needleCharset));
+            System.err.println("l_offset=" + l_offset);
+            System.err.println("haystackLen=" + haystackSize + " needleLen=" + needleSize +
+                " result=" + result + " nResult=" + nResult);
+            System.err.println("");
+          }
+          // badResults = success ? ((midnResult == -1) || (midresult == -1)) :
+          // ((midnResult != -1) || (midresult != -1));
+          if ((midresult != midnResult)) {
+            failCount++;
+            System.err.println("useOffset=" + useOffset + ", useStringBuffer=" + useStringBuffer);
+            System.err.print("Haystack=");
+            printStringBytes(shs.getBytes(hs_charset));
+            System.err.print("Needle=");
+            printStringBytes(midNeedle.getBytes(needleCharset));
+            System.err.println("l_offset=" + l_offset);
+            System.err.println("haystackLen=" + haystackSize + " needleLen=" + needleSize +
+                " midresult=" + midresult + " midnResult=" + midnResult);
+            System.err.println("");
+          }
+          // badResults = success ? ((endnResult == -1) || (endresult == -1)) :
+          // ((endnResult != -1) || (endresult != -1));
+          if ((endresult != endnResult)) {
+            failCount++;
+            System.err.println("useOffset=" + useOffset + ", useStringBuffer=" + useStringBuffer);
+            System.err.print("Haystack=");
+            printStringBytes(shs.getBytes(hs_charset));
+            System.err.print("Needle=");
+            printStringBytes(endNeedle.getBytes(needleCharset));
+            System.err.println("l_offset=" + l_offset);
+            System.err.println("haystackLen=" + haystackSize + " needleLen=" + needleSize +
+                " endresult=" + endresult + " endnResult=" + endnResult);
+            System.err.println("");
+          }
+
+          if (!useOffset)
+            l_offset = haystackSize + 100;
+        }
+      }
+    }
+
+    report("Exhaustive " + thisTest, failCount);
+  }
+
+  private static void PrintError(int kernel, int naive, int num, String prefix, String hs, char needle) {
+    PrintError(kernel, naive, num, prefix, hs, String.valueOf(needle));
+  }
+
+  private static void PrintError(int kernel, int naive, int num, String prefix, String hs, String needle) {
+    if (!verbose)
+      return;
+    System.err.println(prefix + ": (" + num + "): kernel=" + kernel + ", naive=" + naive);
+    System.err.print("Haystack=");
+    printStringBytes(hs.getBytes());
+    System.err.print("Needle=");
+    printStringBytes(needle.getBytes());
+    System.err.println("");
+  }
+
+  private static void simpleTest() {
+    int failCount = 0;
+    String sourceString;
+    StringBuffer sourceBuffer;
+    String targetString;
+    String emptyString = "";
+    String allAs = new String("aaaaaaaaaaaaaaaaaaaaaaaaa");
+    StringBuffer allAsBuffer = new StringBuffer(allAs);
+
+    for (int i = 0; i < 10000; i++) {
+      do {
+        sourceString = generateTestString(99, 100);
+        sourceBuffer = new StringBuffer(sourceString);
+        targetString = generateTestString(10, 11);
+      } while (indexOfKernel(sourceString, targetString) != -1);
+
+      int index1 = generator.nextInt(90) + 5;
+      sourceBuffer = sourceBuffer.replace(index1, index1, targetString);
+
+      if ((indexOfKernel(sourceBuffer, targetString) != index1) ||
+          (index1 != naiveFind(sourceBuffer.toString(), targetString, 0))) {
+        System.err.println("sourceBuffer.indexOf(targetString) fragment '" + targetString + "' ("
+            + targetString.length() + ") String = "
+            + sourceBuffer.toString() + " len Buffer = " + sourceBuffer.toString().length());
+        System.err.println("  naive = " + naiveFind(sourceBuffer.toString(), targetString, 0) + ", IndexOf = "
+            + indexOfKernel(sourceBuffer, targetString));
+        failCount++;
+      }
+      if ((indexOfKernel(sourceBuffer, targetString, 5) != index1) ||
+          (index1 != naiveFind(sourceBuffer.toString(), targetString, 0))) {
+        System.err.println("sourceBuffer.indexOf(targetString, 5) fragment '" + targetString + "' ("
+            + targetString.length() + ") String = "
+            + sourceBuffer.toString() + " len Buffer = " + sourceBuffer.toString().length());
+        System.err.println("  naive = " + naiveFind(sourceBuffer.toString(), targetString, 0) + ", IndexOf = "
+            + indexOfKernel(sourceBuffer, targetString, 5));
+        failCount++;
+      }
+      if ((indexOfKernel(sourceBuffer, targetString, 99) == index1) ||
+          (index1 != naiveFind(sourceBuffer.toString(), targetString, 0))) {
+        System.err.println("sourceBuffer.indexOf(targetString, 99) fragment '" + targetString + "' ("
+            + targetString.length() + ") String = "
+            + sourceBuffer.toString() + " len Buffer = " + sourceBuffer.toString().length());
+        System.err.println("  naive = " + naiveFind(sourceBuffer.toString(), targetString, 0) + ", IndexOf = "
+            + indexOfKernel(sourceBuffer, targetString, 99));
+        failCount++;
+      }
+      if ((indexOfKernel(sourceBuffer, emptyString, 99) != 99) ||
+          (99 != naiveFind(sourceBuffer.toString(), emptyString, 99))) {
+        System.err.println("sourceBuffer.indexOf(emptyString, 99) fragment '" + emptyString + "' ("
+            + emptyString.length() + ") String = "
+            + sourceBuffer.toString() + " len Buffer = " + sourceBuffer.toString().length());
+        System.err.println("  naive = " + naiveFind(sourceBuffer.toString(), emptyString, 99) + ", IndexOf = "
+            + indexOfKernel(sourceBuffer, emptyString, 99));
+        failCount++;
+      }
+      if ((indexOfKernel(allAsBuffer.substring(1, 3), allAsBuffer.substring(5, 12)) != -1) ||
+          (-1 != naiveFind(allAsBuffer.substring(1, 3).toString(), allAsBuffer.substring(5, 12), 0))) {
+        System.err.println("allAsBuffer.substring(1, 3).indexOf(allAsBuffer.substring(5, 12)) fragment '"
+            + allAsBuffer.substring(5, 12) + "' ("
+            + allAsBuffer.substring(5, 12).length() + ") String = "
+            + allAsBuffer.substring(1, 3) + " len Buffer = " + allAsBuffer.substring(1, 3).length());
+        System.err.println(
+            "  naive = " + naiveFind(allAsBuffer.substring(1, 3).toString(), allAsBuffer.substring(5, 12), 0)
+                + ", IndexOf = " + indexOfKernel(allAsBuffer.substring(1, 3), allAsBuffer.substring(5, 12)));
+        failCount++;
+      }
+    }
+
+    report("Basic Test                   ", failCount);
+  }
+
+  // Note: it is possible although highly improbable that failCount will
+  // be > 0 even if everthing is working ok
+  private static void compareIndexOfLastIndexOf() {
+    int failCount = 0;
+    String sourceString;
+    StringBuffer sourceBuffer;
+    String targetString;
+
+    for (int i = 0; i < 10000; i++) {
+      do {
+        sourceString = generateTestString(99, 100);
+        sourceBuffer = new StringBuffer(sourceString);
+        targetString = generateTestString(10, 11);
+      } while (indexOfKernel(sourceString, targetString) != -1);
+
+      int index1 = generator.nextInt(100);
+      sourceBuffer = sourceBuffer.replace(index1, index1, targetString);
+
+      // extremely remote possibility of > 1 match
+      int matches = 0;
+      int index2 = -1;
+      while ((index2 = indexOfKernel(sourceBuffer, targetString, index2 + 1)) != -1)
+        matches++;
+      if (matches > 1)
+        continue;
+
+      if (indexOfKernel(sourceBuffer, targetString) != sourceBuffer.lastIndexOf(targetString))
+        failCount++;
+      sourceString = sourceBuffer.toString();
+      if (indexOfKernel(sourceString, targetString) != sourceString.lastIndexOf(targetString))
+        failCount++;
+    }
+
+    report("IndexOf vs LastIndexOf       ", failCount);
+  }
+
+  private static void compareStringStringBuffer() {
+    int failCount = 0;
+    boolean make_new = true;
+
+    String fragment = null;
+    StringBuffer testBuffer = null;
+    String testString = null;
+    int testIndex = 0;
+
+    failCount = indexOfKernel("", "");
+
+    for (int x = 0; x < 1000000; x++) {
+      if (make_new) {
+        testString = generateTestString(1, 100);
+        int len = testString.length();
+
+        testBuffer = new StringBuffer(len);
+        testBuffer.append(testString);
+        if (!testString.equals(testBuffer.toString()))
+          throw new RuntimeException("Initial equality failure");
+
+        int x1 = 0;
+        int x2 = 1000;
+        while (x2 > testString.length()) {
+          x1 = generator.nextInt(len);
+          x2 = generator.nextInt(100);
+          x2 = x1 + x2;
+        }
+        fragment = testString.substring(x1, x2);
+      }
+
+      int sAnswer = indexOfKernel(testString, fragment);
+      int sbAnswer = indexOfKernel(testBuffer, fragment);
+
+      if (sAnswer != sbAnswer) {
+        System.err.println("(1) IndexOf fragment '" + fragment + "' (" + fragment.length() + ") len String = "
+            + testString.length() + " len Buffer = " + testBuffer.length());
+        System.err.println("  sAnswer = " + sAnswer + ", sbAnswer = " + sbAnswer);
+        System.err.println("  testString = '" + testString + "'");
+        System.err.println("  testBuffer = '" + testBuffer + "'");
+        failCount++;
+
+        sAnswer = indexOfKernel(testString, fragment);
+        sbAnswer = indexOfKernel(testBuffer, fragment);
+      } else {
+        if (sAnswer > testString.length()) {
+          System.err.println(
+              "IndexOf returned value out of range; return: " + sAnswer + " length max: " + testBuffer.length());
+        }
+      }
+
+      if ((fragment == "0#:02/62;+-\"\"0$25-5$#)1263") && (testBuffer.length() == 94)) {
+        String xx = "abc";
+        String yy = "abcdefg";
+        int sA = indexOfKernel(xx, yy);
+      }
+
+      if (make_new)
+        testIndex = getRandomIndex(-100, 100);
+
+      sAnswer = indexOfKernel(testString, fragment, testIndex);
+      sbAnswer = indexOfKernel(testBuffer, fragment, testIndex);
+
+      if (sAnswer != sbAnswer) {
+        System.err.println("(2) IndexOf fragment '" + fragment + "' (" + fragment.length() + ") index = " + testIndex
+            + " len String = " + testString.length() + " len Buffer = " + testBuffer.length());
+        System.err.println("  sAnswer = " + sAnswer + ", sbAnswer = " + sbAnswer);
+        System.err.println("  testString = '" + testString + "'");
+        System.err.println("  testBuffer = '" + testBuffer + "'");
+        failCount++;
+        make_new = true;
+
+        sAnswer = indexOfKernel(testString, fragment, testIndex);
+        sbAnswer = indexOfKernel(testBuffer, fragment, testIndex);
+      } else {
+        if ((sAnswer > testString.length()) || ((sAnswer != -1) && (sAnswer < testIndex) && (fragment.length() != 0))) {
+          System.err.println("IndexOf returned value out of range; return: " + sAnswer + " length max: "
+              + testString.length() + " index: " + testIndex);
+          System.err.println("(3) IndexOf fragment '" + fragment + "' (" + fragment.length() + ") index = " + testIndex
+              + " len String = " + testString.length() + " len Buffer = " + testBuffer.length());
+        }
+      }
+
+      sAnswer = testString.lastIndexOf(fragment);
+      sbAnswer = testBuffer.lastIndexOf(fragment);
+
+      if (sAnswer != sbAnswer) {
+          System.err.println("(1) lastIndexOf fragment '" + fragment + "' len String = " + testString.length()
+            + " len Buffer = " + testBuffer.length());
+          System.err.println("  sAnswer = " + sAnswer + ", sbAnswer = " + sbAnswer);
+          failCount++;
+
+          sAnswer = testString.lastIndexOf(fragment);
+          sbAnswer = testBuffer.lastIndexOf(fragment);
+      }
+
+      if (make_new)
+        testIndex = getRandomIndex(-100, 100);
+
+      sAnswer = testString.lastIndexOf(fragment, testIndex);
+      sbAnswer = testBuffer.lastIndexOf(fragment, testIndex);
+
+      if (sAnswer != sbAnswer) {
+        System.err.println("(2) lastIndexOf fragment '" + fragment + "' index = " + testIndex + " len String = "
+            + testString.length() + " len Buffer = " + testBuffer.length());
+        failCount++;
+      }
+    }
+
+    report("String vs StringBuffer       ", failCount);
+  }
+
+  //////////////////////////////////////////////////////////////////////
+  // Test routines used in benchmarks
+  //
+  // From StringIndexofHuge
+  private static void StringIndexofHuge() {
+    int stubResult = 0;
+    int failCount = 0;
+
+    for (int xx = 0; xx < 2; xx++) {
+      int num = 1;
+
+      String dataString = "ngdflsoscargfdgf";
+      String dataString16 = "ngdfilso\u01facargfd\u01eef";
+      String dataStringHuge = (("A".repeat(32) + "B".repeat(32)).repeat(16) + "X").repeat(2) + "bB";
+      String dataStringHuge16 = "\u01de" + (("A".repeat(32) + "B".repeat(32)).repeat(16) + "\u01fe").repeat(2)
+          + "\u01eeB";
+      String earlyMatchString = dataStringHuge.substring(0, 34);
+      String earlyMatchString16 = dataStringHuge16.substring(0, 34);
+      String midMatchString = dataStringHuge.substring(dataStringHuge.length() / 2 - 16,
+          dataStringHuge.length() / 2 + 32);
+      String midMatchString16 = dataStringHuge16.substring(dataStringHuge16.length() / 2 - 16,
+          dataStringHuge16.length() / 2 + 32);
+      String lateMatchString = dataStringHuge.substring(dataStringHuge.length() - 31);
+      String lateMatchString16 = dataStringHuge16.substring(dataStringHuge16.length() - 31);
+
+      String searchString = "oscar";
+      String searchString16 = "o\u01facar";
+      String searchStringSmall = "dgf";
+      String searchStringSmall16 = "d\u01eef";
+
+      String searchStringHuge = "capaapapapasdkajdlkajskldjaslkajdlkajskldjaslkjdlkasjdsalk";
+      String searchStringHuge16 = "capaapapapasdkajdlka\u01feskldjaslkajdlkajskldjaslkjdlkasjdsalk";
+
+      String searchNoMatch = "XYXyxYxy".repeat(22);
+      String searchNoMatch16 = "\u01ab\u01ba\u01cb\u01bc\u01de\u01ed\u01fa\u01af".repeat(22);
+
+      stubResult = indexOfKernel(dataStringHuge16, earlyMatchString);
+      int nResult = naiveFind(dataStringHuge16, earlyMatchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, earlyMatchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge, earlyMatchString);
+      nResult = naiveFind(dataStringHuge, earlyMatchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge, earlyMatchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge, midMatchString);
+      nResult = naiveFind(dataStringHuge, midMatchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge, midMatchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge, lateMatchString);
+      nResult = naiveFind(dataStringHuge, lateMatchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge, lateMatchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge, searchNoMatch);
+      nResult = naiveFind(dataStringHuge, searchNoMatch);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge, searchNoMatch);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(searchString, searchString);
+      nResult = naiveFind(searchString, searchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", searchString, searchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataString, searchString);
+      nResult = naiveFind(dataString, searchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataString, searchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataString, searchStringSmall);
+      nResult = naiveFind(dataString, searchStringSmall);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataString, searchStringSmall);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge, "B".repeat(30) + "X" + "A".repeat(30), 74);
+      nResult = naiveFind(dataStringHuge, "B".repeat(30) + "X" + "A".repeat(30), 74);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge,
+            "B".repeat(30) + "X" + "A".repeat(30));
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge, "A".repeat(32) + "F" + "B".repeat(32), 64);
+      nResult = naiveFind(dataStringHuge, "A".repeat(32) + "F" + "B".repeat(32), 64);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge,
+            "A".repeat(32) + "F" + "B".repeat(32));
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(midMatchString, dataStringHuge, 3);
+      nResult = naiveFind(midMatchString, dataStringHuge, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", midMatchString, dataStringHuge);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge, "A".repeat(32) + "B".repeat(30) + "bB");
+      nResult = naiveFind(dataStringHuge, "A".repeat(32) + "B".repeat(30) + "bB");
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge,
+            "A".repeat(32) + "B".repeat(30) + "bB");
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, earlyMatchString);
+      nResult = naiveFind(dataStringHuge16, earlyMatchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, earlyMatchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, midMatchString);
+      nResult = naiveFind(dataStringHuge16, midMatchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, midMatchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, lateMatchString);
+      nResult = naiveFind(dataStringHuge16, lateMatchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, lateMatchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, searchNoMatch);
+      nResult = naiveFind(dataStringHuge16, searchNoMatch);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, searchNoMatch);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(searchString16, searchString);
+      nResult = naiveFind(searchString16, searchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", searchString16, searchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataString16, searchString);
+      nResult = naiveFind(dataString16, searchString);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataString16, searchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataString16, searchStringSmall);
+      nResult = naiveFind(dataString16, searchStringSmall);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataString16, searchStringSmall);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, "B".repeat(30) + "X" + "A".repeat(30), 74);
+      nResult = naiveFind(dataStringHuge16, "B".repeat(30) + "X" + "A".repeat(30), 74);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16,
+            "B".repeat(30) + "X" + "A".repeat(30));
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, "A".repeat(32) + "F" + "B".repeat(32), 64);
+      nResult = naiveFind(dataStringHuge16, "A".repeat(32) + "F" + "B".repeat(32), 64);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16,
+            "A".repeat(32) + "F" + "B".repeat(32));
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(midMatchString16, dataStringHuge, 3);
+      nResult = naiveFind(midMatchString16, dataStringHuge, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", midMatchString16, dataStringHuge);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, "A".repeat(32) + "B".repeat(30) + "bB");
+      nResult = naiveFind(dataStringHuge16, "A".repeat(32) + "B".repeat(30) + "bB");
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16,
+            "A".repeat(32) + "B".repeat(30) + "bB");
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, earlyMatchString16);
+      nResult = naiveFind(dataStringHuge16, earlyMatchString16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, earlyMatchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, midMatchString16);
+      nResult = naiveFind(dataStringHuge16, midMatchString16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, midMatchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, lateMatchString16);
+      nResult = naiveFind(dataStringHuge16, lateMatchString16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, lateMatchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, searchNoMatch16);
+      nResult = naiveFind(dataStringHuge16, searchNoMatch16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16, searchNoMatch16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(searchString16, searchString16);
+      nResult = naiveFind(searchString16, searchString16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", searchString16, searchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataString16, searchString16);
+      nResult = naiveFind(dataString16, searchString16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataString16, searchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataString16, searchStringSmall16);
+      nResult = naiveFind(dataString16, searchStringSmall16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataString16, searchStringSmall16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, "B".repeat(30) + "X" + "A".repeat(30), 74);
+      nResult = naiveFind(dataStringHuge16, "B".repeat(30) + "X" + "A".repeat(30), 74);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16,
+            "B".repeat(30) + "X" + "A".repeat(30));
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, "A".repeat(32) + "\u01ef" + "B".repeat(32), 64);
+      nResult = naiveFind(dataStringHuge16, "A".repeat(32) + "\u01ef" + "B".repeat(32), 64);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16,
+            "A".repeat(32) + "\u01ef" + "B".repeat(32));
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(midMatchString16, dataStringHuge16, 3);
+      nResult = naiveFind(midMatchString16, dataStringHuge16, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", midMatchString16, dataStringHuge16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringHuge16, "A".repeat(32) + "B".repeat(30) + "\u01eeB");
+      nResult = naiveFind(dataStringHuge16, "A".repeat(32) + "B".repeat(30) + "\u01eeB");
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexofHuge", dataStringHuge16,
+            "A".repeat(32) + "B".repeat(30) + "\u01eeB");
+        failCount++;
+      }
+      num++;
+    }
+
+    report("StringIndexofHuge            ", failCount);
+  }
+
+  /////////////////////////////////////////////////////////////////////
+  //
+  // From StringIndexof
+  private static void StringIndexof() {
+    int stubResult = 0;
+    int failCount = 0;
+
+    for (int xx = 0; xx < 2; xx++) {
+      int num = 1;
+
+      String dataString = "ngdfilsoscargfdgf";
+      String searchString = "oscar";
+      String dataStringBig = "2937489745890797905764956790452976742965790437698498409583479067ngdcapaapapapasdkajdlkajskldjaslkjdlkasjdsalkjas";
+      String searchStringBig = "capaapapapasdkajdlkajskldjaslkjdlkasjdsalk";
+      String data = "0000100101010010110101010010101110101001110110101010010101010010000010111010101010101010100010010101110111010101101010100010010100001010111111100001010101001010100001010101001010101010111010010101010101010101010101010";
+      String sub = "10101010";
+      String shortSub1 = "1";
+      String data2 = "00001001010100a10110101010010101110101001110110101010010101010010000010111010101010101010a100010010101110111010101101010100010010a100a0010101111111000010101010010101000010101010010101010101110a10010101010101010101010101010";
+      String shortSub2 = "a";
+      char searchChar = 's';
+
+      String string16Short = "scar\u01fe1";
+      String string16Medium = "capaapapapasdkajdlkajskldjaslkjdlkasjdsalksca1r\u01fescar";
+      String string16Long = "2937489745890797905764956790452976742965790437698498409583479067ngdcapaapapapasdkajdlkajskldjaslkjdlkasjdsalkja1sscar\u01fescar";
+      char searchChar16 = 0x1fe;
+      String searchString16 = "\u01fe";
+
+      stubResult = indexOfKernel(dataStringBig, searchChar);
+      int nResult = naiveFind(dataStringBig, searchChar);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", dataStringBig, searchChar);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(searchStringBig, searchChar);
+      nResult = naiveFind(searchStringBig, searchChar);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", searchStringBig, searchChar);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(searchString, searchChar);
+      nResult = naiveFind(searchString, searchChar);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", searchString, searchChar);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Long, searchChar16);
+      nResult = naiveFind(string16Long, searchChar16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Long, searchChar16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Medium, searchChar16);
+      nResult = naiveFind(string16Medium, searchChar16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Medium, searchChar16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Short, searchChar16);
+      nResult = naiveFind(string16Short, searchChar16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Short, searchChar16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringBig, searchChar, 3);
+      nResult = naiveFind(dataStringBig, searchChar, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", dataStringBig, searchChar);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(searchStringBig, searchChar, 3);
+      nResult = naiveFind(searchStringBig, searchChar, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", searchStringBig, searchChar);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(searchString, searchChar, 1);
+      nResult = naiveFind(searchString, searchChar, 1);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", searchString, searchChar);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Long, searchChar16, 3);
+      nResult = naiveFind(string16Long, searchChar16, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Long, searchChar16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Medium, searchChar16, 3);
+      nResult = naiveFind(string16Medium, searchChar16, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Medium, searchChar16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Short, searchChar16, 2);
+      nResult = naiveFind(string16Short, searchChar16, 2);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Short, searchChar16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Long, shortSub1);
+      nResult = naiveFind(string16Long, shortSub1);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Long, shortSub1);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Medium, shortSub1);
+      nResult = naiveFind(string16Medium, shortSub1);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Medium, shortSub1);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Long, shortSub2);
+      nResult = naiveFind(string16Long, shortSub2);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Long, shortSub2);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Long, shortSub1, 3);
+      nResult = naiveFind(string16Long, shortSub1, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Long, shortSub1);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Medium, shortSub1, 3);
+      nResult = naiveFind(string16Medium, shortSub1, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Medium, shortSub1);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Short, shortSub2, 1);
+      nResult = naiveFind(string16Short, shortSub2, 1);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Short, shortSub2);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Long, searchString16, 3);
+      nResult = naiveFind(string16Long, searchString16, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Long, searchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Medium, searchString16, 3);
+      nResult = naiveFind(string16Medium, searchString16, 3);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Medium, searchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Short, searchString16, 2);
+      nResult = naiveFind(string16Short, searchString16, 2);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Short, searchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Long, searchString16);
+      nResult = naiveFind(string16Long, searchString16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Long, searchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Medium, searchString16);
+      nResult = naiveFind(string16Medium, searchString16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Medium, searchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(string16Short, searchString16);
+      nResult = naiveFind(string16Short, searchString16);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", string16Short, searchString16);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataString, searchString, 2);
+      nResult = naiveFind(dataString, searchString, 2);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", dataString, searchString);
+        failCount++;
+      }
+      num++;
+      stubResult = indexOfKernel(dataStringBig, searchStringBig, 2);
+      nResult = naiveFind(dataStringBig, searchStringBig, 2);
+      if (nResult != stubResult) {
+        PrintError(stubResult, nResult, num, "StringIndexof", dataStringBig, searchStringBig);
+      }
+      {
+        int index = 0;
+        int dummy = 0;
+        while ((index = indexOfKernel(data, sub, index)) > -1) {
+          nResult = naiveFind(data, sub, index);
+          if (index != nResult) {
+            PrintError(stubResult, nResult, num, "StringIndexof", data, sub);
+            failCount++;
+          }
+          index++;
+          dummy += index;
+        }
+        num++;
+      }
+      {
+        int dummy = 0;
+        int index = 0;
+        while ((index = indexOfKernel(data, shortSub1, index)) > -1) {
+          nResult = naiveFind(data, shortSub1, index);
+          if (index != nResult) {
+            PrintError(stubResult, nResult, num, "StringIndexof", data, shortSub1);
+            failCount++;
+          }
+          index++;
+          dummy += index;
+        }
+        num++;
+      }
+      {
+        int dummy = 0;
+        int index = 0;
+        while ((index = indexOfKernel(data2, shortSub2, index)) > -1) {
+          nResult = naiveFind(data2, shortSub2, index);
+          if (index != nResult) {
+            PrintError(stubResult, nResult, num, "StringIndexof", data2, shortSub2);
+            failCount++;
+          }
+          index++;
+          dummy += index;
+        }
+        num++;
+      }
+      {
+        String tmp = "simple-hash:SHA-1/UTF-8";
+        if (!tmp.contains("SHA-1")) {
+          PrintError(stubResult, nResult, num, "StringIndexof", "simple-hash:SHA-1/UTF-8", "SHA-1");
+          failCount++;
+        }
+        num++;
+      }
+    }
+
+    report("StringIndexof                ", failCount);
+  }
+
+  /////////////////////////////////////////////////////////////////////
+  //
+  // From StringIndexofChar
+  private static void StringIndexofChar() {
+    int stubResult = 0;
+    int failCount = 0;
+
+    for (int xx = 0; xx < 2; xx++) {
+      stubResult = 0;
+      int nResult = 0;
+      int num = 1;
+
+      String[] latn1_short = new String[100];
+      String[] latn1_sse4 = new String[100];
+      String[] latn1_avx2 = new String[100];
+      String[] latn1_mixedLength = new String[100];
+      String[] utf16_short = new String[100];
+      String[] utf16_sse4 = new String[100];
+      String[] utf16_avx2 = new String[100];
+      String[] utf16_mixedLength = new String[100];
+
+      for (int i = 0; i < 100; i++) {
+        latn1_short[i] = makeRndString(false, 15);
+        latn1_sse4[i] = makeRndString(false, 16);
+        latn1_avx2[i] = makeRndString(false, 32);
+        utf16_short[i] = makeRndString(true, 7);
+        utf16_sse4[i] = makeRndString(true, 8);
+        utf16_avx2[i] = makeRndString(true, 16);
+        latn1_mixedLength[i] = makeRndString(false, rng.nextInt(65));
+        utf16_mixedLength[i] = makeRndString(true, rng.nextInt(65));
+      }
+      for (String what : latn1_mixedLength) {
+        stubResult = indexOfKernel(what, 'a');
+        nResult = naiveFind(what, 'a');
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, 'a');
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : utf16_mixedLength) {
+        stubResult = indexOfKernel(what, 'a');
+        nResult = naiveFind(what, 'a');
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, 'a');
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : latn1_mixedLength) {
+        stubResult = indexOfKernel(what, "a");
+        nResult = naiveFind(what, "a");
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, "a");
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : utf16_mixedLength) {
+        stubResult = indexOfKernel(what, "a");
+        nResult = naiveFind(what, "a");
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, "a");
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : latn1_short) {
+        stubResult = indexOfKernel(what, 'a');
+        nResult = naiveFind(what, 'a');
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, 'a');
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : latn1_sse4) {
+        stubResult = indexOfKernel(what, 'a');
+        nResult = naiveFind(what, 'a');
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, 'a');
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : latn1_avx2) {
+        stubResult = indexOfKernel(what, 'a');
+        nResult = naiveFind(what, 'a');
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, 'a');
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : utf16_short) {
+        stubResult = indexOfKernel(what, 'a');
+        nResult = naiveFind(what, 'a');
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, 'a');
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : utf16_sse4) {
+        stubResult = indexOfKernel(what, 'a');
+        nResult = naiveFind(what, 'a');
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, 'a');
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : utf16_avx2) {
+        stubResult = indexOfKernel(what, 'a');
+        nResult = naiveFind(what, 'a');
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, 'a');
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : latn1_short) {
+        stubResult = indexOfKernel(what, "a");
+        nResult = naiveFind(what, "a");
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, "a");
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : latn1_sse4) {
+        stubResult = indexOfKernel(what, "a");
+        nResult = naiveFind(what, "a");
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, "a");
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : latn1_avx2) {
+        stubResult = indexOfKernel(what, "a");
+        nResult = naiveFind(what, "a");
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, "a");
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : utf16_short) {
+        stubResult = indexOfKernel(what, "a");
+        nResult = naiveFind(what, "a");
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, "a");
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : utf16_sse4) {
+        stubResult = indexOfKernel(what, "a");
+        nResult = naiveFind(what, "a");
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, "a");
+          failCount++;
+        }
+      }
+      num++;
+      for (String what : utf16_avx2) {
+        stubResult = indexOfKernel(what, "a");
+        nResult = naiveFind(what, "a");
+        if (nResult != stubResult) {
+          PrintError(stubResult, nResult, num, "StringIndexofChar", what, "a");
+          failCount++;
+        }
+      }
+      num++;
+    }
+
+    report("StringIndexofChar            ", failCount);
+  }
+
+}
diff --git a/test/jdk/java/lang/instrument/NativeMethodPrefixApp.java b/test/jdk/java/lang/instrument/NativeMethodPrefixApp.java
index 5060e67ca87..65cc54793cb 100644
--- a/test/jdk/java/lang/instrument/NativeMethodPrefixApp.java
+++ b/test/jdk/java/lang/instrument/NativeMethodPrefixApp.java
@@ -25,6 +25,7 @@
 import java.io.File;
 import java.nio.file.Path;
 import java.lang.management.*;
+import java.util.zip.CRC32;
 
 import bootreporter.*;
 import jdk.test.lib.helpers.ClassFileInstaller;
@@ -96,6 +97,10 @@ private static void launchApp(final Path agentJar) throws Exception {
         final OutputAnalyzer oa = ProcessTools.executeTestJava(
                 "--enable-preview", // due to usage of ClassFile API PreviewFeature in the agent
                 "-javaagent:" + agentJar.toString(),
+                // We disable CheckIntrinsic because the NativeMethodPrefixAgent modifies
+                // the native method names, which then causes a failure in the VM check
+                // for the presence of an intrinsic on a @IntrinsicCandidate native method.
+                "-XX:+UnlockDiagnosticVMOptions", "-XX:-CheckIntrinsics",
                 NativeMethodPrefixApp.class.getName());
         oa.shouldHaveExitValue(0);
         // make available stdout/stderr in the logs, even in case of successful completion
@@ -109,6 +114,10 @@ private void run() throws Exception {
         java.lang.reflect.Array.getLength(new short[5]);
         RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean();
         System.err.println(mxbean.getVmVendor());
+        // Simply load a class containing an @IntrinsicCandidate on a native method
+        // to exercise the VM code which verifies the presence of the intrinsic
+        // implementation for that method.
+        System.err.println(new CRC32());
 
         NativeMethodPrefixAgent.checkErrors();
 
diff --git a/test/jdk/java/lang/instrument/asmlib/Instrumentor.java b/test/jdk/java/lang/instrument/asmlib/Instrumentor.java
index 29f2740a874..77893ed8a11 100644
--- a/test/jdk/java/lang/instrument/asmlib/Instrumentor.java
+++ b/test/jdk/java/lang/instrument/asmlib/Instrumentor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, 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
@@ -148,7 +148,7 @@ public void atEnd(ClassBuilder builder) {
     }
 
     public synchronized byte[] apply() {
-        var bytes = ClassFile.of().transform(model, transform);
+        var bytes = ClassFile.of().transformClass(model, transform);
 
         return dirty.get() ? bytes : null;
     }
diff --git a/test/jdk/java/lang/invoke/8022701/BogoLoader.java b/test/jdk/java/lang/invoke/8022701/BogoLoader.java
index ac06718b42a..e497c169c3a 100644
--- a/test/jdk/java/lang/invoke/8022701/BogoLoader.java
+++ b/test/jdk/java/lang/invoke/8022701/BogoLoader.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -123,7 +123,7 @@ protected Class<?> loadClass(String name, boolean resolve)
                         System.err.println("Replacing class " + name);
                     }
                     var cf = ClassFile.of();
-                    classData = cf.transform(cf.parse(classData), replaced.get(name));
+                    classData = cf.transformClass(cf.parse(classData), replaced.get(name));
                 }
                 clazz = defineClass(name, classData, 0, classData.length);
             } catch (java.io.EOFException ioe) {
diff --git a/test/jdk/java/lang/invoke/PrivateInvokeTest.java b/test/jdk/java/lang/invoke/PrivateInvokeTest.java
index 12edf8e3263..8ae78d96713 100644
--- a/test/jdk/java/lang/invoke/PrivateInvokeTest.java
+++ b/test/jdk/java/lang/invoke/PrivateInvokeTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2024, 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,8 +67,6 @@ public class PrivateInvokeTest {
         String vstr = System.getProperty(THIS_CLASS.getSimpleName()+".verbose");
         if (vstr == null)
             vstr = System.getProperty(THIS_CLASS.getName()+".verbose");
-        if (vstr == null)
-            vstr = System.getProperty("test.verbose");
         if (vstr != null)  verbose = Integer.parseInt(vstr);
     }
     private static int referenceKind(Method m) {
diff --git a/test/jdk/java/lang/invoke/TypeConvertingTest.java b/test/jdk/java/lang/invoke/TypeConvertingTest.java
new file mode 100644
index 00000000000..1df6e007880
--- /dev/null
+++ b/test/jdk/java/lang/invoke/TypeConvertingTest.java
@@ -0,0 +1,798 @@
+/*
+ * Copyright (c) 2024, 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 org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+/* @test
+ * @bug 8335060
+ * @summary unit tests of TypeConvertingMethodAdapter
+ * @run junit TypeConvertingTest
+ */
+public class TypeConvertingTest {
+
+    static void smallBooleanC(boolean b) {
+        assertTrue(b);
+    }
+
+    static void bigBooleanC(Boolean b) {
+        assertTrue(b);
+    }
+
+    static void smallByteC(byte b) {
+        assertEquals(1, b);
+    }
+
+    static void bigByteC(Byte b) {
+        assertEquals((byte)1, b);
+    }
+
+    static void smallShortC(short s) {
+        assertEquals(1, s);
+    }
+
+    static void bigShortC(Short s) {
+        assertEquals((short)1, s);
+    }
+
+    static void smallCharC(char c) {
+        assertEquals(1, c);
+    }
+
+    static void bigCharC(Character c) {
+        assertEquals((char)1, c);
+    }
+
+    static void smallIntC(int i) {
+        assertEquals(1, i);
+    }
+
+    static void bigIntC(Integer i) {
+        assertEquals(1, i);
+    }
+
+    static void smallLongC(long l) {
+        assertEquals(1, l);
+    }
+
+    static void bigLongC(Long l) {
+        assertEquals(1, l);
+    }
+
+    static void smallFloatC(float f) {
+        assertEquals(1.0f, f);
+    }
+
+    static void bigFloatC(Float f) {
+        assertEquals(1.0f, f);
+    }
+
+    static void smallDoubleC(double d) {
+        assertEquals(1.0, d);
+    }
+
+    static void bigDoubleC(Double d) {
+        assertEquals(1.0, d);
+    }
+
+    static void numberC(Number n) {
+        assertEquals(1, n.intValue());
+    }
+
+
+    static boolean smallBooleanS() {return true;}
+
+    static Boolean bigBooleanS() {return true;}
+
+    static byte smallByteS() {return 1;}
+
+    static Byte bigByteS() {return 1;}
+
+    static short smallShortS() {return 1;}
+
+    static Short bigShortS() {return 1;}
+
+    static char smallCharS() {return 1;}
+
+    static Character bigCharS() {return 1;}
+
+    static int smallIntS() {return 1;}
+
+    static Integer bigIntS() {return 1;}
+
+    static long smallLongS() {return 1;}
+
+    static Long bigLongS() {return 1l;}
+
+    static float smallFloatS() {return 1;}
+
+    static Float bigFloatS() {return 1f;}
+
+    static double smallDoubleS() {return 1;}
+
+    static Double bigDoubleS() {return 1d;}
+
+    static Number numberS() {return 1;}
+
+
+    interface GenericC<T> {
+        void m(T t);
+    }
+
+    interface SmallBooleanC {
+        void m(boolean b);
+    }
+
+    interface BigBooleanC {
+        void m(Boolean b);
+    }
+
+    interface SmallByteC {
+        void m(byte b);
+    }
+
+    interface BigByteC {
+        void m(Byte b);
+    }
+
+    interface SmallShortC {
+        void m(short s);
+    }
+
+    interface BigShortC {
+        void m(Short s);
+    }
+
+    interface SmallCharC {
+        void m(char c);
+    }
+
+    interface BigCharC {
+        void m(Character c);
+    }
+
+    interface SmallIntC {
+        void m(int i);
+    }
+
+    interface BigIntC {
+        void m(Integer i);
+    }
+
+    interface SmallLongC {
+        void m(long l);
+    }
+
+    interface BigLongC {
+        void m(Long l);
+    }
+
+    interface SmallFloatC {
+        void m(float f);
+    }
+
+    interface BigFloatC {
+        void m(Float f);
+    }
+
+    interface SmallDoubleC {
+        void m(double d);
+    }
+
+    interface BigDoubleC {
+        void m(Double d);
+    }
+
+    interface BigNumberC {
+        void m(Number n);
+    }
+
+
+    interface GenericS<T> {
+        T m();
+    }
+
+    interface SmallBooleanS {
+        boolean m();
+    }
+
+    interface BigBooleanS {
+        Boolean m();
+    }
+
+    interface SmallByteS {
+        byte m();
+    }
+
+    interface BigByteS {
+        Byte m();
+    }
+
+    interface SmallShortS {
+        short m();
+    }
+
+    interface BigShortS {
+        Short m();
+    }
+
+    interface SmallCharS {
+        char m();
+    }
+
+    interface BigCharS {
+        Character m();
+    }
+
+    interface SmallIntS {
+        int m();
+    }
+
+    interface BigIntS {
+        Integer m();
+    }
+
+    interface SmallLongS {
+        long m();
+    }
+
+    interface BigLongS {
+        Long m();
+    }
+
+    interface SmallFloatS {
+        float m();
+    }
+
+    interface BigFloatS {
+        Float m();
+    }
+
+    interface SmallDoubleS {
+        double m();
+    }
+
+    interface BigDoubleS {
+        Double m();
+    }
+
+    interface BigNumberS {
+        Number m();
+    }
+
+
+    static void testGenericBoolean(GenericC<Boolean> t) {
+        t.m(true);
+    }
+
+    static void testGenericByte(GenericC<Byte> t) {
+        t.m((byte)1);
+    }
+
+    static void testGenericShort(GenericC<Short> t) {
+        t.m((short)1);
+    }
+
+    static void testGenericChar(GenericC<Character> t) {
+        t.m((char)1);
+    }
+
+    static void testGenericInt(GenericC<Integer> t) {
+        t.m(1);
+    }
+
+    static void testGenericLong(GenericC<Long> t) {
+        t.m(1l);
+    }
+
+    static void testGenericFloat(GenericC<Float> t) {
+        t.m(1.0f);
+    }
+
+    static void testGenericDouble(GenericC<Double> t) {
+        t.m(1.0d);
+    }
+
+    static void testGenericNumber(GenericC<Number> t) {
+        t.m(1);
+    }
+
+    static void testSmallBoolean(SmallBooleanC t) {
+        t.m(true);
+    }
+
+    static void testSmallByte(SmallByteC t) {
+        t.m((byte)1);
+    }
+
+    static void testSmallShort(SmallShortC t) {
+        t.m((short)1);
+    }
+
+    static void testSmallChar(SmallCharC t) {
+        t.m((char)1);
+    }
+
+    static void testSmallInt(SmallIntC t) {
+        t.m(1);
+    }
+
+    static void testSmallLong(SmallLongC t) {
+        t.m(1l);
+    }
+
+    static void testSmallFloat(SmallFloatC t) {
+        t.m(1.0f);
+    }
+
+    static void testSmallDouble(SmallDoubleC t) {
+        t.m(1.0d);
+    }
+
+    static void testBigBoolean(BigBooleanC t) {
+        t.m(true);
+    }
+
+    static void testBigByte(BigByteC t) {
+        t.m((byte)1);
+    }
+
+    static void testBigShort(BigShortC t) {
+        t.m((short)1);
+    }
+
+    static void testBigChar(BigCharC t) {
+        t.m((char)1);
+    }
+
+    static void testBigInt(BigIntC t) {
+        t.m(1);
+    }
+
+    static void testBigLong(BigLongC t) {
+        t.m(1l);
+    }
+
+    static void testBigFloat(BigFloatC t) {
+        t.m(1.0f);
+    }
+
+    static void testBigDouble(BigDoubleC t) {
+        t.m(1.0d);
+    }
+
+    static void testBigNumber(BigNumberC t) {
+        t.m(1);
+    }
+
+
+    static void testGenericBoolean(GenericS<Boolean> t) {
+        assertEquals(true, t.m());
+    }
+
+    static void testGenericByte(GenericS<Byte> t) {
+        assertEquals((byte)1, t.m());
+    }
+
+    static void testGenericShort(GenericS<Short> t) {
+        assertEquals((short)1, t.m());
+    }
+
+    static void testGenericChar(GenericS<Character> t) {
+        assertEquals((char)1, t.m());
+    }
+
+    static void testGenericInt(GenericS<Integer> t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testGenericLong(GenericS<Long> t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testGenericFloat(GenericS<Float> t) {
+        assertEquals(1.0f, t.m());
+    }
+
+    static void testGenericDouble(GenericS<Double> t) {
+        assertEquals(1.0d, t.m());
+    }
+
+    static void testGenericNumber(GenericS<Number> t) {
+        assertEquals(1, t.m().intValue());
+    }
+
+    static void testSmallBoolean(SmallBooleanS t) {
+        assertEquals(true, t.m());
+    }
+
+    static void testSmallByte(SmallByteS t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testSmallShort(SmallShortS t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testSmallChar(SmallCharS t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testSmallInt(SmallIntS t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testSmallLong(SmallLongS t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testSmallFloat(SmallFloatS t) {
+        assertEquals(1.0f, t.m());
+    }
+
+    static void testSmallDouble(SmallDoubleS t) {
+        assertEquals(1.0d, t.m());
+    }
+
+    static void testBigBoolean(BigBooleanS t) {
+        assertEquals(true, t.m());
+    }
+
+    static void testBigByte(BigByteS t) {
+        assertEquals((byte)1, t.m());
+    }
+
+    static void testBigShort(BigShortS t) {
+        assertEquals((short)1, t.m());
+    }
+
+    static void testBigChar(BigCharS t) {
+        assertEquals((char)1, t.m());
+    }
+
+    static void testBigInt(BigIntS t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testBigLong(BigLongS t) {
+        assertEquals(1, t.m());
+    }
+
+    static void testBigFloat(BigFloatS t) {
+        assertEquals(1.0f, t.m());
+    }
+
+    static void testBigDouble(BigDoubleS t) {
+        assertEquals(1.0f, t.m());
+    }
+
+    static void testBigNumber(BigNumberS t) {
+        assertEquals(1, t.m().intValue());
+    }
+
+
+    @Test
+    void testGenericBoolean() {
+        testGenericBoolean(TypeConvertingTest::smallBooleanC);
+        testGenericBoolean(TypeConvertingTest::bigBooleanC);
+
+        testGenericBoolean(TypeConvertingTest::smallBooleanS);
+        testGenericBoolean(TypeConvertingTest::bigBooleanS);
+    }
+
+    @Test
+    void testGenericByte() {
+        testGenericByte(TypeConvertingTest::smallByteC);
+        testGenericByte(TypeConvertingTest::bigByteC);
+        testGenericByte(TypeConvertingTest::smallShortC);
+        testGenericByte(TypeConvertingTest::smallIntC);
+        testGenericByte(TypeConvertingTest::smallLongC);
+        testGenericByte(TypeConvertingTest::smallFloatC);
+        testGenericByte(TypeConvertingTest::smallDoubleC);
+        testGenericByte(TypeConvertingTest::numberC);
+
+        testGenericByte(TypeConvertingTest::smallByteS);
+        testGenericByte(TypeConvertingTest::bigByteS);
+    }
+
+    @Test
+    void testGenericShort() {
+        testGenericShort(TypeConvertingTest::smallShortC);
+        testGenericShort(TypeConvertingTest::bigShortC);
+        testGenericShort(TypeConvertingTest::smallIntC);
+        testGenericShort(TypeConvertingTest::smallLongC);
+        testGenericShort(TypeConvertingTest::smallFloatC);
+        testGenericShort(TypeConvertingTest::smallDoubleC);
+        testGenericShort(TypeConvertingTest::numberC);
+
+        testGenericShort(TypeConvertingTest::smallShortS);
+        testGenericShort(TypeConvertingTest::bigShortS);
+    }
+
+    @Test
+    void testGenericChar() {
+        testGenericChar(TypeConvertingTest::smallCharC);
+        testGenericChar(TypeConvertingTest::bigCharC);
+        testGenericChar(TypeConvertingTest::smallIntC);
+        testGenericChar(TypeConvertingTest::smallLongC);
+        testGenericChar(TypeConvertingTest::smallFloatC);
+        testGenericChar(TypeConvertingTest::smallDoubleC);
+
+        testGenericChar(TypeConvertingTest::smallCharS);
+        testGenericChar(TypeConvertingTest::bigCharS);
+    }
+
+    @Test
+    void testGenericInt() {
+        testGenericInt(TypeConvertingTest::smallIntC);
+        testGenericInt(TypeConvertingTest::bigIntC);
+        testGenericInt(TypeConvertingTest::smallLongC);
+        testGenericInt(TypeConvertingTest::smallFloatC);
+        testGenericInt(TypeConvertingTest::smallDoubleC);
+        testGenericInt(TypeConvertingTest::numberC);
+
+        testGenericInt(TypeConvertingTest::smallIntS);
+        testGenericInt(TypeConvertingTest::bigIntS);
+    }
+
+    @Test
+    void testGenericLong() {
+        testGenericLong(TypeConvertingTest::smallLongC);
+        testGenericLong(TypeConvertingTest::bigLongC);
+        testGenericLong(TypeConvertingTest::smallFloatC);
+        testGenericLong(TypeConvertingTest::smallDoubleC);
+        testGenericLong(TypeConvertingTest::numberC);
+
+        testGenericLong(TypeConvertingTest::smallLongS);
+        testGenericLong(TypeConvertingTest::bigLongS);
+    }
+
+    @Test
+    void testGenericFloat() {
+        testGenericFloat(TypeConvertingTest::smallFloatC);
+        testGenericFloat(TypeConvertingTest::bigFloatC);
+        testGenericFloat(TypeConvertingTest::smallDoubleC);
+        testGenericFloat(TypeConvertingTest::numberC);
+
+        testGenericFloat(TypeConvertingTest::smallFloatS);
+        testGenericFloat(TypeConvertingTest::bigFloatS);
+    }
+
+    @Test
+    void testGenericDouble() {
+        testGenericDouble(TypeConvertingTest::smallDoubleC);
+        testGenericDouble(TypeConvertingTest::bigDoubleC);
+        testGenericDouble(TypeConvertingTest::numberC);
+
+        testGenericDouble(TypeConvertingTest::smallDoubleS);
+        testGenericDouble(TypeConvertingTest::bigDoubleS);
+    }
+
+    @Test
+    void testGenericNumber() {
+        testGenericNumber(TypeConvertingTest::numberC);
+
+        testGenericNumber(TypeConvertingTest::numberS);
+    }
+
+    @Test
+    void testSmallBoolean() {
+        testSmallBoolean(TypeConvertingTest::smallBooleanC);
+        testSmallBoolean(TypeConvertingTest::bigBooleanC);
+
+        testSmallBoolean(TypeConvertingTest::smallBooleanS);
+        testSmallBoolean(TypeConvertingTest::bigBooleanS);
+    }
+
+    @Test
+    void testSmallByte() {
+        testSmallByte(TypeConvertingTest::smallByteC);
+        testSmallByte(TypeConvertingTest::bigByteC);
+        testSmallByte(TypeConvertingTest::smallShortC);
+        testSmallByte(TypeConvertingTest::smallIntC);
+        testSmallByte(TypeConvertingTest::smallLongC);
+        testSmallByte(TypeConvertingTest::smallFloatC);
+        testSmallByte(TypeConvertingTest::smallDoubleC);
+        testSmallByte(TypeConvertingTest::numberC);
+
+        testSmallByte(TypeConvertingTest::smallByteS);
+        testSmallByte(TypeConvertingTest::bigByteS);
+    }
+
+    @Test
+    void testSmallShort() {
+        testSmallShort(TypeConvertingTest::smallShortC);
+        testSmallShort(TypeConvertingTest::bigShortC);
+        testSmallShort(TypeConvertingTest::smallIntC);
+        testSmallShort(TypeConvertingTest::smallLongC);
+        testSmallShort(TypeConvertingTest::smallFloatC);
+        testSmallShort(TypeConvertingTest::smallDoubleC);
+        testSmallShort(TypeConvertingTest::numberC);
+
+        testSmallShort(TypeConvertingTest::smallShortS);
+        testSmallShort(TypeConvertingTest::bigShortS);
+    }
+
+    @Test
+    void testSmallChar() {
+        testSmallChar(TypeConvertingTest::smallCharC);
+        testSmallChar(TypeConvertingTest::bigCharC);
+        testSmallChar(TypeConvertingTest::smallIntC);
+        testSmallChar(TypeConvertingTest::smallLongC);
+        testSmallChar(TypeConvertingTest::smallFloatC);
+        testSmallChar(TypeConvertingTest::smallDoubleC);
+
+        testSmallChar(TypeConvertingTest::smallCharS);
+        testSmallChar(TypeConvertingTest::bigCharS);
+    }
+
+    @Test
+    void testSmallInt() {
+        testSmallInt(TypeConvertingTest::smallIntC);
+        testSmallInt(TypeConvertingTest::bigIntC);
+        testSmallInt(TypeConvertingTest::smallLongC);
+        testSmallInt(TypeConvertingTest::smallFloatC);
+        testSmallInt(TypeConvertingTest::smallDoubleC);
+        testSmallInt(TypeConvertingTest::numberC);
+
+        testSmallInt(TypeConvertingTest::smallIntS);
+        testSmallInt(TypeConvertingTest::bigIntS);
+    }
+
+    @Test
+    void testSmallLong() {
+        testSmallLong(TypeConvertingTest::smallLongC);
+        testSmallLong(TypeConvertingTest::bigLongC);
+        testSmallLong(TypeConvertingTest::smallFloatC);
+        testSmallLong(TypeConvertingTest::smallDoubleC);
+        testSmallLong(TypeConvertingTest::numberC);
+
+        testSmallLong(TypeConvertingTest::smallLongS);
+        testSmallLong(TypeConvertingTest::bigLongS);
+    }
+
+    @Test
+    void testSmallFloat() {
+        testSmallFloat(TypeConvertingTest::smallFloatC);
+        testSmallFloat(TypeConvertingTest::bigFloatC);
+        testSmallFloat(TypeConvertingTest::smallDoubleC);
+        testSmallFloat(TypeConvertingTest::numberC);
+
+        testSmallFloat(TypeConvertingTest::smallFloatS);
+        testSmallFloat(TypeConvertingTest::bigFloatS);
+    }
+
+    @Test
+    void testSmallDouble() {
+        testSmallDouble(TypeConvertingTest::smallDoubleC);
+        testSmallDouble(TypeConvertingTest::bigDoubleC);
+        testSmallDouble(TypeConvertingTest::numberC);
+
+        testSmallDouble(TypeConvertingTest::smallDoubleS);
+        testSmallDouble(TypeConvertingTest::bigDoubleS);
+    }
+
+    @Test
+    void testBigBoolean() {
+        testBigBoolean(TypeConvertingTest::smallBooleanC);
+        testBigBoolean(TypeConvertingTest::bigBooleanC);
+
+        testBigBoolean(TypeConvertingTest::smallBooleanS);
+        testBigBoolean(TypeConvertingTest::bigBooleanS);
+    }
+
+    @Test
+    void testBigByte() {
+        testBigByte(TypeConvertingTest::smallByteC);
+        testBigByte(TypeConvertingTest::bigByteC);
+        testBigByte(TypeConvertingTest::smallShortC);
+        testBigByte(TypeConvertingTest::smallIntC);
+        testBigByte(TypeConvertingTest::smallLongC);
+        testBigByte(TypeConvertingTest::smallFloatC);
+        testBigByte(TypeConvertingTest::smallDoubleC);
+        testBigByte(TypeConvertingTest::numberC);
+
+        testBigByte(TypeConvertingTest::smallByteS);
+        testBigByte(TypeConvertingTest::bigByteS);
+    }
+
+    @Test
+    void testBigShort() {
+        testBigShort(TypeConvertingTest::smallShortC);
+        testBigShort(TypeConvertingTest::bigShortC);
+        testBigShort(TypeConvertingTest::smallIntC);
+        testBigShort(TypeConvertingTest::smallLongC);
+        testBigShort(TypeConvertingTest::smallFloatC);
+        testBigShort(TypeConvertingTest::smallDoubleC);
+        testBigShort(TypeConvertingTest::numberC);
+
+        testBigShort(TypeConvertingTest::smallShortS);
+        testBigShort(TypeConvertingTest::bigShortS);
+    }
+
+    @Test
+    void testBigChar() {
+        testBigChar(TypeConvertingTest::smallCharC);
+        testBigChar(TypeConvertingTest::bigCharC);
+        testBigChar(TypeConvertingTest::smallIntC);
+        testBigChar(TypeConvertingTest::smallLongC);
+        testBigChar(TypeConvertingTest::smallFloatC);
+        testBigChar(TypeConvertingTest::smallDoubleC);
+
+        testBigChar(TypeConvertingTest::smallCharS);
+        testBigChar(TypeConvertingTest::bigCharS);
+    }
+
+    @Test
+    void testBigInt() {
+        testBigInt(TypeConvertingTest::smallIntC);
+        testBigInt(TypeConvertingTest::bigIntC);
+        testBigInt(TypeConvertingTest::smallLongC);
+        testBigInt(TypeConvertingTest::smallFloatC);
+        testBigInt(TypeConvertingTest::smallDoubleC);
+        testBigInt(TypeConvertingTest::numberC);
+
+        testBigInt(TypeConvertingTest::smallIntS);
+        testBigInt(TypeConvertingTest::bigIntS);
+    }
+
+    @Test
+    void testBigLong() {
+        testBigLong(TypeConvertingTest::smallLongC);
+        testBigLong(TypeConvertingTest::bigLongC);
+        testBigLong(TypeConvertingTest::smallFloatC);
+        testBigLong(TypeConvertingTest::smallDoubleC);
+        testBigLong(TypeConvertingTest::numberC);
+
+        testBigLong(TypeConvertingTest::smallLongS);
+        testBigLong(TypeConvertingTest::bigLongS);
+    }
+
+    @Test
+    void testBigFloat() {
+        testBigFloat(TypeConvertingTest::smallFloatC);
+        testBigFloat(TypeConvertingTest::bigFloatC);
+        testBigFloat(TypeConvertingTest::smallDoubleC);
+        testBigFloat(TypeConvertingTest::numberC);
+
+        testBigFloat(TypeConvertingTest::smallFloatS);
+        testBigFloat(TypeConvertingTest::bigFloatS);
+    }
+
+    @Test
+    void testBigDouble() {
+        testBigDouble(TypeConvertingTest::smallDoubleC);
+        testBigDouble(TypeConvertingTest::bigDoubleC);
+        testBigDouble(TypeConvertingTest::numberC);
+
+        testBigDouble(TypeConvertingTest::smallDoubleS);
+        testBigDouble(TypeConvertingTest::bigDoubleS);
+    }
+
+    @Test
+    void testBigNumber() {
+        testBigNumber(TypeConvertingTest::numberC);
+
+        testBigNumber(TypeConvertingTest::numberS);
+    }
+}
diff --git a/test/jdk/java/lang/invoke/accessProtectedSuper/BogoLoader.java b/test/jdk/java/lang/invoke/accessProtectedSuper/BogoLoader.java
index 0f149959928..9ed6422f015 100644
--- a/test/jdk/java/lang/invoke/accessProtectedSuper/BogoLoader.java
+++ b/test/jdk/java/lang/invoke/accessProtectedSuper/BogoLoader.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -125,7 +125,7 @@ protected Class<?> loadClass(String name, boolean resolve)
                         System.err.println("Replacing class " + name);
                     }
                     var cf = ClassFile.of();
-                    classData = cf.transform(cf.parse(classData), replaced.get(name));
+                    classData = cf.transformClass(cf.parse(classData), replaced.get(name));
                 }
                 clazz = defineClass(name, classData, 0, classData.length);
             } catch (java.io.EOFException ioe) {
diff --git a/test/jdk/java/lang/reflect/Proxy/NonPublicMethodTypeTest.java b/test/jdk/java/lang/reflect/Proxy/NonPublicMethodTypeTest.java
new file mode 100644
index 00000000000..8919dc2f0b2
--- /dev/null
+++ b/test/jdk/java/lang/reflect/Proxy/NonPublicMethodTypeTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2024, 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 8333854
+ * @summary Test invoking a method in a proxy interface with package-private
+ *          classes or interfaces in its method type
+ * @run junit NonPublicMethodTypeTest
+ */
+
+import org.junit.jupiter.api.Test;
+
+import java.lang.reflect.Proxy;
+
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+
+public final class NonPublicMethodTypeTest {
+    interface NonPublicWorker {
+        void work();
+    }
+
+    public interface PublicWorkable {
+        void accept(NonPublicWorker worker);
+    }
+
+    @Test
+    public void test() {
+        PublicWorkable proxy = (PublicWorkable) Proxy.newProxyInstance(
+               NonPublicMethodTypeTest.class.getClassLoader(),
+               new Class[] {PublicWorkable.class},
+               (_, _, _) -> null);
+        assertNotSame(NonPublicWorker.class.getPackage(),
+                proxy.getClass().getPackage(),
+                "Proxy class should not be able to access method parameter " +
+                        "NonPublic type's package");
+        proxy.accept(() -> {}); // Call should not fail
+    }
+}
diff --git a/test/jdk/java/net/Authenticator/BasicTest4.java b/test/jdk/java/net/Authenticator/BasicTest4.java
index 0146651ba6a..becfdb351ab 100644
--- a/test/jdk/java/net/Authenticator/BasicTest4.java
+++ b/test/jdk/java/net/Authenticator/BasicTest4.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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
@@ -151,7 +151,7 @@ public void run () {
                 System.out.println ("checkfor returned " + success);
                 readAll (s);
                 os = s.getOutputStream();
-                os.write (reply2.getBytes());
+                os.write ((reply2+"HelloAgain").getBytes());
                 s.close ();
 
                 if (success)
diff --git a/test/jdk/java/net/MulticastSocket/IPMulticastIF.java b/test/jdk/java/net/MulticastSocket/IPMulticastIF.java
index 566e3603fa6..3909f6d6276 100644
--- a/test/jdk/java/net/MulticastSocket/IPMulticastIF.java
+++ b/test/jdk/java/net/MulticastSocket/IPMulticastIF.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, 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
@@ -63,9 +63,25 @@ public Object[][] positive() throws Exception {
                                           InetAddress.getLoopbackAddress());
         List<Object[]> list = new ArrayList<>();
         NetworkConfiguration nc = NetworkConfiguration.probe();
+        // retains only network interface whose bound addresses match
         addrs.stream().forEach(a -> nc.multicastInterfaces(true)
-                                      .map(nif -> new Object[] { new InetSocketAddress(a, 0), nif })
-                                      .forEach(list::add) );
+                .filter(nif -> nif.inetAddresses().toList().contains(a))
+                .map(nif -> new Object[] { new InetSocketAddress(a, 0), nif })
+                .forEach(list::add) );
+        // any network interface should work with the wildcard address
+        nc.multicastInterfaces(true)
+                .map(nif -> new Object[] {new InetSocketAddress(0), nif})
+                .forEach(list::add);
+        return list.stream().toArray(Object[][]::new);
+    }
+
+    @DataProvider(name = "interfaces")
+    public Object[][] interfaces() throws Exception {
+        List<Object[]> list = new ArrayList<>();
+        NetworkConfiguration nc = NetworkConfiguration.probe();
+        nc.multicastInterfaces(true)
+                .map(nif -> new Object[] {nif})
+                .forEach(list::add);
 
         return list.stream().toArray(Object[][]::new);
     }
@@ -82,8 +98,8 @@ public void testSetGetInterfaceBound(InetSocketAddress bindAddr, NetworkInterfac
         }
     }
 
-    @Test(dataProvider = "scenarios")
-    public void testSetGetInterfaceUnbound(InetSocketAddress ignore, NetworkInterface nif)
+    @Test(dataProvider = "interfaces")
+    public void testSetGetInterfaceUnbound(NetworkInterface nif)
         throws Exception
     {
         out.println(format("\n\n--- testSetGetInterfaceUnbound nif=[%s]", nif));
@@ -106,8 +122,8 @@ public void testSetGetOptionBound(InetSocketAddress bindAddr, NetworkInterface n
         }
     }
 
-    @Test(dataProvider = "scenarios")
-    public void testSetGetOptionUnbound(InetSocketAddress ignore, NetworkInterface nif)
+    @Test(dataProvider = "interfaces")
+    public void testSetGetOptionUnbound(NetworkInterface nif)
         throws Exception
     {
         out.println(format("\n\n--- testSetGetOptionUnbound nif=[%s]", nif));
@@ -139,8 +155,8 @@ public void testGetInterfaceBound(InetSocketAddress bindAddr)
     }
 
     @Test
-    public void testGettInterfaceUnbound() throws Exception {
-        out.println("\n\n--- testGettInterfaceUnbound ");
+    public void testGetInterfaceUnbound() throws Exception {
+        out.println("\n\n--- testGetInterfaceUnbound ");
         try (MulticastSocket ms = new MulticastSocket()) {
             assertPlaceHolder(ms.getNetworkInterface());
         }
diff --git a/test/jdk/java/net/URLConnection/TruncatedFixedResponse.java b/test/jdk/java/net/URLConnection/TruncatedFixedResponse.java
new file mode 100644
index 00000000000..89d80199930
--- /dev/null
+++ b/test/jdk/java/net/URLConnection/TruncatedFixedResponse.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2024, 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 8335135
+ * @library /test/lib
+ * @summary Check that reading from inputStream throws an IOException
+ *          if the fixed response stream is closed before reading all bytes.
+ */
+
+import jdk.test.lib.net.URIBuilder;
+
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.net.HttpURLConnection;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URL;
+
+public class TruncatedFixedResponse implements Runnable {
+
+    ServerSocket ss;
+
+    /*
+     * Our "http" server to return a truncated fixed response
+     */
+    public void run() {
+        try {
+            Socket s = ss.accept();
+
+            BufferedReader in = new BufferedReader(
+                    new InputStreamReader(s.getInputStream()));
+            while (true) {
+                String req = in.readLine();
+                if (req.isEmpty()) {
+                    break;
+                }
+            }
+            PrintStream out = new PrintStream(
+                    new BufferedOutputStream(s.getOutputStream()));
+
+            /* send the header */
+            out.print("HTTP/1.1 200\r\n");
+            out.print("Content-Length: 100\r\n");
+            out.print("Content-Type: text/html\r\n");
+            out.print("\r\n");
+            out.print("Some content, but too short");
+            out.close();
+            s.close();
+            ss.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    TruncatedFixedResponse() throws Exception {
+        /* start the server */
+        ss = new ServerSocket();
+        ss.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+        new Thread(this).start();
+
+        /* establish http connection to server */
+        URL url = URIBuilder.newBuilder()
+                .scheme("http")
+                .loopback()
+                .port(ss.getLocalPort())
+                .path("/foo")
+                .toURL();
+        HttpURLConnection http = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
+
+        try (InputStream in = http.getInputStream()) {
+            while (in.read() != -1) {
+                // discard response
+            }
+            throw new AssertionError("Expected IOException was not thrown");
+        } catch (IOException ex) {
+            System.out.println("Got expected exception: " + ex);
+        }
+    }
+
+    public static void main(String args[]) throws Exception {
+        new TruncatedFixedResponse();
+    }
+}
diff --git a/test/jdk/java/net/httpclient/BodySubscribersTest.java b/test/jdk/java/net/httpclient/BodySubscribersTest.java
index 508cc95abb0..5ee7ed4ef62 100644
--- a/test/jdk/java/net/httpclient/BodySubscribersTest.java
+++ b/test/jdk/java/net/httpclient/BodySubscribersTest.java
@@ -24,7 +24,7 @@
 /*
  * @test
  * @summary Basic test for the standard BodySubscribers default behavior
- * @bug 8225583
+ * @bug 8225583 8334028
  * @run testng BodySubscribersTest
  */
 
diff --git a/test/jdk/java/net/httpclient/ForbiddenHeadTest.java b/test/jdk/java/net/httpclient/ForbiddenHeadTest.java
index 4b651eb4813..1498aa118b3 100644
--- a/test/jdk/java/net/httpclient/ForbiddenHeadTest.java
+++ b/test/jdk/java/net/httpclient/ForbiddenHeadTest.java
@@ -381,7 +381,7 @@ public void setup() throws Exception {
     public void teardown() throws Exception {
         authClient = noAuthClient = null;
         Thread.sleep(100);
-        AssertionError fail = TRACKER.check(500);
+        AssertionError fail = TRACKER.check(1500);
         try {
             proxy.stop();
             authproxy.stop();
diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java
index ac251f9ba7d..114110344a4 100644
--- a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java
+++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/SSLTubeTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -85,16 +85,17 @@ private static class SSLLoopbackSubscriber implements FlowTube {
                               ExecutorService exec,
                               CountDownLatch allBytesReceived) throws IOException {
             SSLServerSocketFactory fac = ctx.getServerSocketFactory();
+            InetAddress loopback = InetAddress.getLoopbackAddress();
             SSLServerSocket serv = (SSLServerSocket) fac.createServerSocket();
             serv.setReuseAddress(false);
-            serv.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+            serv.bind(new InetSocketAddress(loopback, 0));
             SSLParameters params = serv.getSSLParameters();
             params.setApplicationProtocols(new String[]{"proto2"});
             serv.setSSLParameters(params);
 
 
             int serverPort = serv.getLocalPort();
-            clientSock = new Socket("localhost", serverPort);
+            clientSock = new Socket(loopback, serverPort);
             serverSock = (SSLSocket) serv.accept();
             this.buffer = new LinkedBlockingQueue<>();
             this.allBytesReceived = allBytesReceived;
@@ -107,6 +108,7 @@ private static class SSLLoopbackSubscriber implements FlowTube {
         }
 
         public void start() {
+            System.out.println("Starting: server listening at: " + serverSock.getLocalSocketAddress());
             thread1.start();
             thread2.start();
             thread3.start();
@@ -144,6 +146,7 @@ private void clientReader() {
                     publisher.submit(List.of(bb));
                 }
             } catch (Throwable e) {
+                System.out.println("clientReader got exception: " + e);
                 e.printStackTrace();
                 Utils.close(clientSock);
             }
@@ -176,6 +179,7 @@ private void clientWriter() {
                     clientSubscription.request(1);
                 }
             } catch (Throwable e) {
+                System.out.println("clientWriter got exception: " + e);
                 e.printStackTrace();
             }
         }
@@ -212,6 +216,7 @@ private void serverLoopback() {
                         is.close();
                         os.close();
                         serverSock.close();
+                        System.out.println("serverLoopback exiting normally");
                         return;
                     }
                     os.write(bb, 0, n);
@@ -219,7 +224,10 @@ private void serverLoopback() {
                     loopCount.addAndGet(n);
                 }
             } catch (Throwable e) {
+                System.out.println("serverLoopback got exception: " + e);
                 e.printStackTrace();
+            } finally {
+                System.out.println("serverLoopback exiting at count: " + loopCount.get());
             }
         }
 
diff --git a/test/jdk/java/nio/channels/DatagramChannel/AdaptorBasic.java b/test/jdk/java/nio/channels/DatagramChannel/AdaptorBasic.java
index 4ac5d4b3c88..504b648dcb6 100644
--- a/test/jdk/java/nio/channels/DatagramChannel/AdaptorBasic.java
+++ b/test/jdk/java/nio/channels/DatagramChannel/AdaptorBasic.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, 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
@@ -36,6 +36,8 @@
 import java.util.*;
 import java.lang.reflect.Field;
 
+import jdk.test.lib.Platform;
+
 
 public class AdaptorBasic {
 
@@ -69,6 +71,8 @@ static void test(DatagramSocket ds, InetSocketAddress dst, boolean shouldTimeout
         for (;;) {
             try {
                 ds.receive(ip);
+                // weed off stray datagrams
+                if (ip.getPort() != dst.getPort()) continue;
             } catch (SocketTimeoutException x) {
                 if (shouldTimeout) {
                     out.println("Receive timed out, as expected");
@@ -111,12 +115,36 @@ static void test(InetSocketAddress dst,
             // Original
             ds = new DatagramSocket();
         } else {
-            DatagramChannel dc = DatagramChannel.open();
-            ds = dc.socket();
-            ds.bind(new InetSocketAddress(0));
+            int attempts = 0;
+            DatagramChannel toclose = null;
+            while (true) {
+                DatagramChannel dc = DatagramChannel.open();
+                ds = dc.socket();
+                if (Platform.isOSX() && dst.getAddress().isLoopbackAddress()) {
+                    // avoid binding to the wildcard on macOS if possible, in order to limit
+                    // potential port conflict issues
+                    ds.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+                } else {
+                    ds.bind(new InetSocketAddress(0));
+                }
+                // on some systems it may be possible to bind two sockets
+                // to the same port if one of them is bound to the wildcard,
+                // if that happens, try again...
+                if (ds.getLocalPort() == dst.getPort()) {
+                    if (toclose != null) toclose.close();
+                    toclose = dc;
+                    if (++attempts == 10) {
+                        throw new AssertionError("Couldn't allocate port for client socket");
+                    }
+                    continue;
+                }
+                if (toclose != null) toclose.close();
+                break;
+            }
         }
 
-        out.println("socket: " + ds);
+        out.println("socket: " + ds + " bound to src: "
+                + ds.getLocalSocketAddress() + ", dst: " + dst);
         if (connect) {
             ds.connect(dst);
             out.println("connect: " + ds);
@@ -141,7 +169,7 @@ static void test(InetSocketAddress dst,
     public static void main(String[] args) throws Exception {
         // need an UDP echo server
         try (TestServers.UdpEchoServer echoServer
-                = TestServers.UdpEchoServer.startNewServer(100)) {
+                = TestServers.UdpEchoServer.startNewServer(100, InetAddress.getLoopbackAddress())) {
             final InetSocketAddress address
                 = new InetSocketAddress(echoServer.getAddress(),
                                         echoServer.getPort());
diff --git a/test/jdk/java/nio/channels/DatagramChannel/Disconnect.java b/test/jdk/java/nio/channels/DatagramChannel/Disconnect.java
index 1ba742b6552..cdc5882fefd 100644
--- a/test/jdk/java/nio/channels/DatagramChannel/Disconnect.java
+++ b/test/jdk/java/nio/channels/DatagramChannel/Disconnect.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,6 +34,7 @@
 import java.nio.*;
 import java.nio.channels.*;
 import java.io.IOException;
+
 import jdk.test.lib.net.IPSupport;
 
 public class Disconnect {
@@ -42,43 +43,61 @@ public static void main(String[] args) throws IOException {
 
         // test with default protocol family
         try (DatagramChannel dc = DatagramChannel.open()) {
-            test(dc);
-            test(dc);
+            InetAddress lo = InetAddress.getLoopbackAddress();
+            System.out.println("Testing with default family and " + lo);
+            test(dc, lo);
+            test(dc, lo);
         }
 
         if (IPSupport.hasIPv4()) {
             // test with IPv4 only
             try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)) {
-                test(dc);
-                test(dc);
+                InetAddress lo4 = InetAddress.ofLiteral("127.0.0.1");
+                System.out.println("Testing with INET family and " + lo4);
+                test(dc, lo4);
+                test(dc, lo4);
             }
         }
 
         if (IPSupport.hasIPv6()) {
             // test with IPv6 only
             try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET6)) {
-                test(dc);
-                test(dc);
+                InetAddress lo6 = InetAddress.ofLiteral("::1");
+                System.out.println("Testing with INET6 family and " + lo6);
+                test(dc, lo6);
+                test(dc, lo6);
             }
         }
     }
 
+    static int getLocalPort(DatagramChannel ch) throws IOException {
+        return ((InetSocketAddress) ch.getLocalAddress()).getPort();
+    }
+
     /**
      * Connect DatagramChannel to a server, write a datagram and disconnect. Invoke
      * a second or subsequent time with the same DatagramChannel instance to check
      * that disconnect works as expected.
      */
-    static void test(DatagramChannel dc) throws IOException {
+    static void test(DatagramChannel dc, InetAddress lo) throws IOException {
         try (DatagramChannel server = DatagramChannel.open()) {
-            server.bind(new InetSocketAddress(0));
+            server.bind(new InetSocketAddress(lo, 0));
 
-            InetAddress lh = InetAddress.getLocalHost();
-            dc.connect(new InetSocketAddress(lh, server.socket().getLocalPort()));
+            SocketAddress dcbound = dc.getLocalAddress();
+            dc.connect(new InetSocketAddress(lo, server.socket().getLocalPort()));
+            System.out.println("dc bound to " + dcbound + " and connected from " +
+                    dc.getLocalAddress() + " to " + dc.getRemoteAddress());
 
             dc.write(ByteBuffer.wrap("hello".getBytes()));
 
-            ByteBuffer bb = ByteBuffer.allocate(100);
-            server.receive(bb);
+            if (getLocalPort(dc) != getLocalPort(server)) {
+                ByteBuffer bb = ByteBuffer.allocate(100);
+                server.receive(bb);
+            } else {
+                // some systems may allow dc and server to bind to the same port.
+                // when that happen the datagram may never be received
+                System.out.println("Server and clients are bound to the same port: skipping receive");
+            }
 
             dc.disconnect();
 
diff --git a/test/jdk/java/nio/channels/DatagramChannel/Loopback.java b/test/jdk/java/nio/channels/DatagramChannel/Loopback.java
index a61a4d0b177..5562378b83f 100644
--- a/test/jdk/java/nio/channels/DatagramChannel/Loopback.java
+++ b/test/jdk/java/nio/channels/DatagramChannel/Loopback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -118,7 +118,8 @@ static void test(ProtocolFamily family, InetAddress group, NetworkInterface ni)
 
             // send datagram to multicast group
             System.out.format("send %s -> %s%n", dc.getLocalAddress(), target);
-            ByteBuffer src = ByteBuffer.wrap("hello".getBytes("UTF-8"));
+            String str = "hello " + System.nanoTime();
+            ByteBuffer src = ByteBuffer.wrap(str.getBytes("UTF-8"));
             dc.send(src, target);
 
             // receive datagram sent to multicast group
@@ -142,6 +143,7 @@ static void test(ProtocolFamily family, InetAddress group, NetworkInterface ni)
             System.out.format("send %s -> %s%n", dc.getLocalAddress(), target);
             src.clear();
             dc.send(src, target);
+            src.flip();
 
             // test that we don't receive the datagram sent to multicast group
             dc.configureBlocking(false);
@@ -157,10 +159,16 @@ static void test(ProtocolFamily family, InetAddress group, NetworkInterface ni)
                     } else {
                         sel.selectedKeys().clear();
                         SocketAddress sender = dc.receive(dst);
+                        if (src.mismatch(dst) != -1) {
+                            System.out.println("src: " + src + "not equal to dst: " + dst);
+                            dst.clear();
+                            continue;
+                        }
                         if (sender != null) {
                             System.out.format("received %s from %s%n", dst, sender);
                             senderPort = ((InetSocketAddress) sender).getPort();
-                            assertTrue(senderPort != localPort, "Unexpected message");
+                            assertTrue(senderPort != localPort,
+                                    "Unexpected message: localPort=" + localPort);
                         }
                     }
                 }
diff --git a/test/jdk/java/nio/channels/Selector/DeferredClose/DeferredCloseTest.java b/test/jdk/java/nio/channels/Selector/DeferredClose/DeferredCloseTest.java
new file mode 100644
index 00000000000..42dd7d42f56
--- /dev/null
+++ b/test/jdk/java/nio/channels/Selector/DeferredClose/DeferredCloseTest.java
@@ -0,0 +1,484 @@
+/*
+ * Copyright (c) 2024, 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.IOException;
+import java.io.UncheckedIOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.ClosedSelectorException;
+import java.nio.channels.DatagramChannel;
+import java.nio.channels.Pipe;
+import java.nio.channels.SelectableChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.time.Instant;
+import java.util.Objects;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.function.Function;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/*
+ * @test
+ * @bug 8334719
+ * @summary verifies that if a registered channel has in-progress operations, then
+ *          the Selector during its deferred close implementation won't prematurely release
+ *          the channel's resources
+ *
+ * @comment we use a patched java.net.InetSocketAddress to allow the test to intentionally
+ *          craft some delays at specific locations in the implementation of InetSocketAddress
+ *          to trigger race conditions
+ * @compile/module=java.base java/net/InetSocketAddress.java
+ * @run junit/othervm DeferredCloseTest
+ */
+public class DeferredCloseTest {
+
+    private static final int NUM_ITERATIONS = 10;
+    private static final InetSocketAddress BIND_ADDR = new InetSocketAddress(
+            InetAddress.getLoopbackAddress(), 0);
+
+    @BeforeAll
+    public static void beforeAll() throws Exception {
+        // configure our patched java.net.InetSocketAddress implementation
+        // to introduce delay in certain methods which get invoked
+        // internally from the DC.send() implementation
+        InetSocketAddress.enableDelay();
+    }
+
+    @AfterAll
+    public static void afterAll() throws Exception {
+        // delays in patched InetSocketAddress are no longer needed
+        InetSocketAddress.disableDelay();
+    }
+
+    private static Stream<Arguments> dcOperations() {
+        return Stream.of(
+                Arguments.of(
+                        // repeatedly do DC.send() till there's a ClosedChannelException
+                        "DC.send()",
+                        null,
+                        (Function<DatagramChannel, Void>) (dc) -> {
+                            ByteBuffer bb = ByteBuffer.allocate(100);
+                            try {
+                                // We send to ourselves. Target, content and
+                                // receipt of the Datagram isn't of importance
+                                // in this test.
+                                SocketAddress target = dc.getLocalAddress();
+                                System.out.println("DC: " + dc + " sending to " + target);
+                                while (true) {
+                                    bb.clear();
+                                    dc.send(bb, target);
+                                }
+                            } catch (ClosedChannelException _) {
+                            } catch (Exception e) {
+                                throw new RuntimeException(e);
+                            }
+                            return null;
+                        }
+                ),
+                Arguments.of(
+                        // repeatedly do DC.receive() till there's a ClosedChannelException
+                        "DC.receive()",
+                        (Function<DatagramChannel, Void>) (dc) -> {
+                            try {
+                                SocketAddress target = dc.getLocalAddress();
+                                ByteBuffer sendBB = ByteBuffer.allocate(100);
+                                // first send() a few datagrams so that subsequent
+                                // receive() does receive them and thus triggers
+                                // the potential race with the deferred close
+                                for (int i = 0; i < 5; i++) {
+                                    sendBB.clear();
+                                    dc.send(sendBB, target);
+                                }
+                            } catch (Exception e) {
+                                throw new RuntimeException(e);
+                            }
+                            return null;
+                        },
+                        (Function<DatagramChannel, Void>) (dc) -> {
+                            try {
+                                ByteBuffer rcvBB = ByteBuffer.allocate(10);
+                                while (true) {
+                                    rcvBB.clear();
+                                    dc.receive(rcvBB);
+                                }
+                            } catch (ClosedChannelException _) {
+                            } catch (Exception e) {
+                                throw new RuntimeException(e);
+                            }
+                            return null;
+                        }
+                )
+        );
+    }
+
+    /**
+     * Runs the test for DatagramChannel.
+     *
+     * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch)
+     */
+    @ParameterizedTest
+    @MethodSource("dcOperations")
+    public void testDatagramChannel(String opName, Function<DatagramChannel, Void> preOp,
+                                    Function<DatagramChannel, Void> dcOperation)
+            throws Exception {
+        try (ExecutorService executor = Executors.newFixedThreadPool(2)) {
+            for (int i = 1; i <= NUM_ITERATIONS; i++) {
+                System.out.format("%s DatagramChannel - %d of %d ...%n",
+                        Instant.now(), i, NUM_ITERATIONS);
+                try (Selector sel = Selector.open();
+                     DatagramChannel dc = DatagramChannel.open()) {
+                    // create a non-blocking bound DatagramChannel
+                    dc.bind(BIND_ADDR);
+                    dc.configureBlocking(false);
+                    // register the DatagramChannel with a selector
+                    // (doesn't matter the interestOps)
+                    SelectionKey key = dc.register(sel, SelectionKey.OP_READ);
+                    if (preOp != null) {
+                        preOp.apply(dc);
+                    }
+                    CountDownLatch opStartLatch = new CountDownLatch(1);
+                    runTest(executor, key, () -> {
+                        // notify that we will now start operation on the DC
+                        opStartLatch.countDown();
+                        return dcOperation.apply(dc);
+                    }, opStartLatch);
+                }
+            }
+        }
+    }
+
+
+    private static Stream<Arguments> scOperations() {
+        return Stream.of(
+                Arguments.of(
+                        // repeatedly do SC.write() till there's a ClosedChannelException
+                        "SC.write()", (Function<SocketChannel, Void>) (sc) -> {
+                            ByteBuffer bb = ByteBuffer.allocate(100);
+                            try {
+                                System.out.println("SC: " + sc + " writing");
+                                while (true) {
+                                    bb.clear();
+                                    sc.write(bb);
+                                }
+                            } catch (ClosedChannelException _) {
+                            } catch (IOException ioe) {
+                                throw new UncheckedIOException(ioe);
+                            }
+                            return null;
+                        }
+                ),
+                Arguments.of(
+                        // repeatedly do SC.read() till there's a ClosedChannelException
+                        "SC.read()", (Function<SocketChannel, Void>) (sc) -> {
+                            ByteBuffer bb = ByteBuffer.allocate(100);
+                            try {
+                                System.out.println("SC: " + sc + " reading");
+                                while (true) {
+                                    bb.clear();
+                                    sc.read(bb);
+                                }
+                            } catch (ClosedChannelException _) {
+                            } catch (IOException ioe) {
+                                throw new UncheckedIOException(ioe);
+                            }
+                            return null;
+                        }
+                )
+        );
+    }
+
+    /**
+     * Runs the test for SocketChannel
+     *
+     * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch)
+     */
+    @ParameterizedTest
+    @MethodSource("scOperations")
+    public void testSocketChannel(String opName, Function<SocketChannel, Void> scOperation)
+            throws Exception {
+        try (ExecutorService executor = Executors.newFixedThreadPool(3)) {
+            for (int i = 1; i <= NUM_ITERATIONS; i++) {
+                System.out.format("%s SocketChannel - %d of %d ...%n",
+                        Instant.now(), i, NUM_ITERATIONS);
+                try (Selector sel = Selector.open();
+                     SocketChannel sc = SocketChannel.open()) {
+                    // create and bind a SocketChannel
+                    sc.bind(BIND_ADDR);
+                    // stay in blocking mode till the SocketChannel is connected
+                    sc.configureBlocking(true);
+                    Future<SocketChannel> acceptedChannel;
+                    SocketChannel conn;
+                    // create a remote server and connect to it
+                    try (ServerSocketChannel server = ServerSocketChannel.open()) {
+                        server.bind(BIND_ADDR);
+                        SocketAddress remoteAddr = server.getLocalAddress();
+                        acceptedChannel = executor.submit(new ConnAcceptor(server));
+                        System.out.println("connecting to " + remoteAddr);
+                        sc.connect(remoteAddr);
+                        conn = acceptedChannel.get();
+                    }
+                    try (conn) {
+                        // switch to non-blocking
+                        sc.configureBlocking(false);
+                        System.out.println("switched to non-blocking: " + sc);
+                        // register the SocketChannel with a selector
+                        // (doesn't matter the interestOps)
+                        SelectionKey key = sc.register(sel, SelectionKey.OP_READ);
+                        CountDownLatch opStartLatch = new CountDownLatch(1);
+                        runTest(executor, key, () -> {
+                            // notify that we will now start operation on the SC
+                            opStartLatch.countDown();
+                            return scOperation.apply(sc);
+                        }, opStartLatch);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Runs the test for ServerSocketChannel
+     *
+     * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch)
+     */
+    @Test
+    public void testServerSocketChannel() throws Exception {
+        try (ExecutorService executor = Executors.newFixedThreadPool(2)) {
+            for (int i = 1; i <= NUM_ITERATIONS; i++) {
+                System.out.format("%s ServerSocketChannel - %d of %d ...%n",
+                        Instant.now(), i, NUM_ITERATIONS);
+                try (Selector sel = Selector.open();
+                     ServerSocketChannel ssc = ServerSocketChannel.open()) {
+                    // create and bind a ServerSocketChannel
+                    ssc.bind(BIND_ADDR);
+                    ssc.configureBlocking(false);
+                    // register the ServerSocketChannel with a selector
+                    SelectionKey key = ssc.register(sel, SelectionKey.OP_ACCEPT);
+                    CountDownLatch opStartLatch = new CountDownLatch(1);
+                    runTest(executor, key, () -> {
+                        // notify that we will now start accept()ing
+                        opStartLatch.countDown();
+                        // repeatedly do SSC.accept() till there's a ClosedChannelException
+                        try {
+                            while (true) {
+                                ssc.accept();
+                            }
+                        } catch (ClosedChannelException _) {
+                        }
+                        return null;
+                    }, opStartLatch);
+                }
+            }
+        }
+    }
+
+    /**
+     * Runs the test for SinkChannel
+     *
+     * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch)
+     */
+    @Test
+    public void testSinkChannel() throws Exception {
+        try (ExecutorService executor = Executors.newFixedThreadPool(2)) {
+            for (int i = 1; i <= NUM_ITERATIONS; i++) {
+                System.out.format("%s SinkChannel - %d of %d ...%n",
+                        Instant.now(), i, NUM_ITERATIONS);
+                Pipe pipe = Pipe.open();
+                try (Selector sel = Selector.open();
+                     Pipe.SinkChannel sink = pipe.sink()) {
+                    sink.configureBlocking(false);
+                    SelectionKey key = sink.register(sel, SelectionKey.OP_WRITE);
+                    CountDownLatch opStartLatch = new CountDownLatch(1);
+                    runTest(executor, key, () -> {
+                        // notify that we will now start write()ing
+                        opStartLatch.countDown();
+                        // repeatedly do SC.write() till there's a ClosedChannelException
+                        ByteBuffer bb = ByteBuffer.allocate(100);
+                        try {
+                            while (true) {
+                                bb.clear();
+                                sink.write(bb);
+                            }
+                        } catch (ClosedChannelException _) {
+                        }
+                        return null;
+                    }, opStartLatch);
+                }
+            }
+        }
+    }
+
+    /**
+     * Runs the test for SourceChannel
+     *
+     * @see #runTest(ExecutorService, SelectionKey, Callable, CountDownLatch)
+     */
+    @Test
+    public void testSourceChannel() throws Exception {
+        try (ExecutorService executor = Executors.newFixedThreadPool(2)) {
+            for (int i = 1; i <= NUM_ITERATIONS; i++) {
+                System.out.format("%s SourceChannel - %d of %d ...%n",
+                        Instant.now(), i, NUM_ITERATIONS);
+                Pipe pipe = Pipe.open();
+                try (Selector sel = Selector.open();
+                     Pipe.SourceChannel source = pipe.source()) {
+                    source.configureBlocking(false);
+                    SelectionKey key = source.register(sel, SelectionKey.OP_READ);
+                    CountDownLatch opStartLatch = new CountDownLatch(1);
+                    runTest(executor, key, () -> {
+                        // notify that we will now start read()ing
+                        opStartLatch.countDown();
+                        // repeatedly do SC.read() till there's a ClosedChannelException
+                        ByteBuffer bb = ByteBuffer.allocate(100);
+                        try {
+                            while (true) {
+                                bb.clear();
+                                source.read(bb);
+                            }
+                        } catch (ClosedChannelException _) {
+                        }
+                        return null;
+                    }, opStartLatch);
+                }
+            }
+        }
+    }
+
+    /**
+     * SelectableChannel implementations internally have a deferred close implementation. When a
+     * channel is registered with a Selector and close() is invoked on the channel from a certain
+     * thread, then the implementation of close() defers the actual close if the channel has
+     * in-progress operations (for example, read/write/send/receive and such) in some other thread.
+     * A subsequent operation through the Selector (like Selector.select()) then completes the
+     * deferred close (waiting for any in-progress operations to complete). This test method
+     * verifies that the deferred close implementation doesn't prematurely close and release
+     * the resources used by the channel, while there are in-progress operations.
+     * <p>
+     * Launches 2 threads, T1 and T2. When T1 and T2 are in progress, this method closes the
+     * channel that is registered with the Selector.
+     * T1 is running the channelOperation (which keeps running operations on the channel).
+     * T2 is running a task which keeps invoking Selector.select(), until the channel is closed.
+     * When T2 notices that the channel is closed, it cancels the selectionKey and then
+     * invokes one last Selector.select() operation to finish the deferred close of the channel.
+     */
+    private static void runTest(ExecutorService executor, SelectionKey selectionKey,
+                                Callable<Void> channelOperation, CountDownLatch chanOpStartLatch)
+            throws Exception {
+
+        SelectableChannel channel = selectionKey.channel();
+        assertFalse(channel.isBlocking(), "channel isn't non-blocking: " + channel);
+        selectionKey.selector().selectNow();
+        // run the channel operations
+        Future<?> channelOpResult = executor.submit(channelOperation);
+        CountDownLatch selectorTaskStartLatch = new CountDownLatch(1);
+        // run the Selector.select() task
+        Future<?> selectorTaskResult = executor.submit(
+                new SelectorTask(selectionKey, selectorTaskStartLatch));
+        // await for the channel operation task and the selector task to start
+        chanOpStartLatch.await();
+        selectorTaskStartLatch.await();
+        // close the channel while it's still registered with the Selector,
+        // so that the close is deferred by the channel implementations.
+        System.out.println("closing channel: " + channel);
+        assertTrue(channel.isOpen(), "channel already closed: " + channel);
+        assertTrue(channel.isRegistered(), "channel isn't registered: " + channel);
+        channel.close();
+        // wait for the operation on the channel and the selector task to complete
+        channelOpResult.get();
+        selectorTaskResult.get();
+    }
+
+    /*
+     * Keeps invoking Selector.select() until the channel is closed, after which
+     * it cancels the SelectionKey and does one last Selector.select() to finish
+     * the deferred close.
+     */
+    private static final class SelectorTask implements Callable<Void> {
+        private final SelectionKey selectionKey;
+        private final CountDownLatch startedLatch;
+
+        private SelectorTask(SelectionKey selectionKey, CountDownLatch startedLatch) {
+            this.selectionKey = Objects.requireNonNull(selectionKey);
+            this.startedLatch = startedLatch;
+        }
+
+        @Override
+        public Void call() throws Exception {
+            try {
+                Selector selector = selectionKey.selector();
+                SelectableChannel channel = selectionKey.channel();
+                // notify that the task has started
+                startedLatch.countDown();
+                while (true) {
+                    selector.select(10);
+                    if (!channel.isOpen()) {
+                        // the channel is (defer) closed, cancel the registration and then
+                        // issue a select() so that the Selector finishes the deferred
+                        // close of the channel.
+                        System.out.println("channel: " + channel + " isn't open," +
+                                " now cancelling key: " + selectionKey);
+                        selectionKey.cancel();
+                        System.out.println("initiating select after key cancelled: " + selectionKey);
+                        selector.select(5);
+                        break;
+                    }
+                }
+            } catch (ClosedSelectorException _) {
+            }
+            return null;
+        }
+    }
+
+    private static final class ConnAcceptor implements Callable<SocketChannel> {
+        private final ServerSocketChannel serverSocketChannel;
+
+        private ConnAcceptor(ServerSocketChannel serverSocketChannel) {
+            this.serverSocketChannel = serverSocketChannel;
+        }
+
+        @Override
+        public SocketChannel call() throws Exception {
+            SocketChannel accepted = serverSocketChannel.accept();
+            System.out.println("Accepted connection: " + accepted);
+            return accepted;
+        }
+    }
+}
diff --git a/test/jdk/java/nio/channels/Selector/DeferredClose/java.base/java/net/InetSocketAddress.java b/test/jdk/java/nio/channels/Selector/DeferredClose/java.base/java/net/InetSocketAddress.java
new file mode 100644
index 00000000000..5994e9268a1
--- /dev/null
+++ b/test/jdk/java/nio/channels/Selector/DeferredClose/java.base/java/net/InetSocketAddress.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2024, 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 java.net;
+
+
+import java.util.Locale;
+
+// Patched implementation only meant to be used in certain tests
+public class InetSocketAddress extends SocketAddress {
+
+    @java.io.Serial
+    private static final long serialVersionUID = 5076001401234631237L;
+
+    private static boolean enableDelay;
+
+    static {
+        System.out.println("patched InetSocketAddress class in use");
+    }
+
+    private final String hostname;
+    private final InetAddress addr;
+    private final int port;
+
+    public InetSocketAddress(int port) {
+        this(InetAddress.anyLocalAddress(), port);
+    }
+
+    public InetSocketAddress(InetAddress addr, int port) {
+        this(null,
+                addr == null ? InetAddress.anyLocalAddress() : addr,
+                checkPort(port));
+    }
+
+    public InetSocketAddress(String hostname, int port) {
+        checkHost(hostname);
+        InetAddress addr = null;
+        String host = null;
+        try {
+            addr = InetAddress.getByName(hostname);
+        } catch (UnknownHostException e) {
+            host = hostname;
+        }
+        this.hostname = host;
+        this.addr = addr;
+        this.port = checkPort(port);
+    }
+
+    public static InetSocketAddress createUnresolved(String host, int port) {
+        return new InetSocketAddress(checkHost(host), null, checkPort(port));
+    }
+
+    public static void enableDelay() {
+        enableDelay = true;
+    }
+
+    public static void disableDelay() {
+        enableDelay = false;
+    }
+
+    private InetSocketAddress(String hostname, InetAddress addr, int port) {
+        this.hostname = hostname;
+        this.addr = addr;
+        this.port = port;
+        if (enableDelay) {
+            doDelay();
+        }
+    }
+
+    /**
+     * Gets the port number.
+     *
+     * @return the port number.
+     */
+    public final int getPort() {
+        if (enableDelay) {
+            doDelay();
+        }
+        return this.port;
+    }
+
+    /**
+     * Gets the {@code InetAddress}.
+     *
+     * @return the InetAddress or {@code null} if it is unresolved.
+     */
+    public final InetAddress getAddress() {
+        return this.addr;
+    }
+
+    public final String getHostName() {
+        if (hostname != null) {
+            return hostname;
+        }
+        if (addr != null) {
+            return addr.getHostName();
+        }
+        return null;
+    }
+
+    public final String getHostString() {
+        if (hostname != null) {
+            return hostname;
+        }
+        if (addr != null) {
+            if (addr.holder().getHostName() != null) {
+                return addr.holder().getHostName();
+            } else {
+                return addr.getHostAddress();
+            }
+        }
+        return null;
+    }
+
+    public final boolean isUnresolved() {
+        return addr == null;
+    }
+
+    @Override
+    public String toString() {
+        String formatted;
+        if (isUnresolved()) {
+            formatted = hostname + "/<unresolved>";
+        } else {
+            formatted = addr.toString();
+            if (addr instanceof Inet6Address) {
+                int i = formatted.lastIndexOf("/");
+                formatted = formatted.substring(0, i + 1)
+                        + "[" + formatted.substring(i + 1) + "]";
+            }
+        }
+        return formatted + ":" + port;
+    }
+
+    @Override
+    public final boolean equals(Object other) {
+        if (!(other instanceof InetSocketAddress that)) {
+            return false;
+        }
+        boolean sameIP;
+        if (addr != null) {
+            sameIP = addr.equals(that.addr);
+        } else if (hostname != null) {
+            sameIP = (that.addr == null) &&
+                    hostname.equalsIgnoreCase(that.hostname);
+        } else {
+            sameIP = (that.addr == null) && (that.hostname == null);
+        }
+        return sameIP && (port == that.port);
+    }
+
+    @Override
+    public final int hashCode() {
+        if (addr != null) {
+            return addr.hashCode() + port;
+        }
+        if (hostname != null) {
+            return hostname.toLowerCase(Locale.ROOT).hashCode() + port;
+        }
+        return port;
+    }
+
+    private static int checkPort(int port) {
+        if (port < 0 || port > 0xFFFF)
+            throw new IllegalArgumentException("port out of range:" + port);
+        return port;
+    }
+
+    private static String checkHost(String hostname) {
+        if (hostname == null)
+            throw new IllegalArgumentException("hostname can't be null");
+        return hostname;
+    }
+
+    private static void doDelay() {
+        System.out.println("intentional delay injected in InetSocketAddress");
+        try {
+            Thread.sleep(10);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+        }
+    }
+}
diff --git a/test/jdk/java/nio/channels/SocketChannel/OpenLeak.java b/test/jdk/java/nio/channels/SocketChannel/OpenLeak.java
index 8d8673355ef..c7eed1f27a0 100644
--- a/test/jdk/java/nio/channels/SocketChannel/OpenLeak.java
+++ b/test/jdk/java/nio/channels/SocketChannel/OpenLeak.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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,28 +25,110 @@
  * @bug 6548464
  * @summary SocketChannel.open(SocketAddress) leaks file descriptor if
  *     connection cannot be established
+ * @requires vm.flagless
  * @build OpenLeak
- * @run main/othervm -Djava.security.manager=allow OpenLeak
+ * @run junit/othervm OpenLeak
  */
 
+import java.io.IOException;
+import java.net.ConnectException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.SocketAddress;
 import java.nio.channels.SocketChannel;
+import java.nio.channels.UnresolvedAddressException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 
 public class OpenLeak {
 
-    public static void main(String[] args) throws Exception {
-        InetAddress lh = InetAddress.getLocalHost();
-        InetSocketAddress isa = new InetSocketAddress(lh, 12345);
+    static final String OS_NAME = System.getProperty("os.name").toLowerCase(Locale.ROOT);
+    static final boolean IS_WINDOWS_2016 = OS_NAME.contains("windows") && OS_NAME.contains("2016");
+
+    // On Windows Server 2016 trying to connect to port 47 consumes the
+    // whole connect timeout - which makes the test fail in timeout.
+    // We skip this part of the test on Windows Server 2016
+    static final boolean TEST_WITH_RESERVED_PORT = !IS_WINDOWS_2016;
+
+    private static final int MAX_LOOP = 250000;
 
-        System.setSecurityManager( new SecurityManager() );
-        for (int i=0; i<100000; i++) {
-            try {
-                SocketChannel.open(isa);
-                throw new RuntimeException("This should not happen");
-            } catch (SecurityException x) { }
+
+    // Try to find a suitable port to provoke a "Connection Refused"
+    // error.
+    private static InetSocketAddress findSuitableRefusedAddress(InetSocketAddress isa)
+            throws IOException {
+        if (!TEST_WITH_RESERVED_PORT) return null;
+        var addr = isa.getAddress();
+        try (SocketChannel sc1 = SocketChannel.open(isa)) {
+            // If we manage to connect, let's try to use some other
+            // port.
+            // port 51 is reserved too - there should be nothing there...
+            isa = new InetSocketAddress(addr, 51);
+            try (SocketChannel sc2 = SocketChannel.open(isa)) {
+            }
+            // OK, last attempt...
+            // port 61 is reserved too - there should be nothing there...
+            isa = new InetSocketAddress(addr, 61);
+            try (SocketChannel sc3 = SocketChannel.open(isa)) {
+            }
+            System.err.println("Could not find a suitable port");
+            return null;
+        } catch (ConnectException x) {
         }
+        return isa;
+    }
+
+    private static InetSocketAddress createUnresolved(InetSocketAddress isa, InetSocketAddress def) {
+       var sa = isa == null ? def : isa;
+       return InetSocketAddress.createUnresolved(sa.getHostString(), sa.getPort());
+    }
 
+
+    // Builds a list of test cases
+    static List<Object[]> testCases() throws Exception {
+        InetAddress lo = InetAddress.getLoopbackAddress();
+
+        // Try to find a suitable port that will cause a
+        // Connection Refused exception
+        // port 47 is reserved - there should be nothing there...
+        InetSocketAddress def = new InetSocketAddress(lo, 47);
+        InetSocketAddress isa = findSuitableRefusedAddress(def);
+        InetSocketAddress sa  = createUnresolved(isa, def);
+
+        final List<Object[]> cases = new ArrayList<>();
+        cases.add(new Object[]{sa, UnresolvedAddressException.class});
+        if (isa != null) {
+            cases.add(new Object[]{isa, ConnectException.class});
+        }
+        return cases;
+    }
+
+    @ParameterizedTest
+    @MethodSource("testCases")
+    public void test(SocketAddress sa, Class<? extends Throwable> expectedException) throws Exception {
+        System.err.printf("%nExpecting %s for %s%n", expectedException, sa);
+
+        int i = 0;
+        try {
+            for (i = 0; i < MAX_LOOP; i++) {
+                Throwable x =
+                        assertThrows(expectedException, () -> SocketChannel.open(sa));
+                if (i < 5 || i >= MAX_LOOP - 5) {
+                    // print a message for the first five and last 5 exceptions
+                    System.err.println(x);
+                }
+            }
+        } catch (Throwable t) {
+            System.err.println("Failed at " + i + " with " + t);
+            throw t;
+        }
     }
 
 }
diff --git a/test/jdk/java/nio/channels/TestServers.java b/test/jdk/java/nio/channels/TestServers.java
index e2c4151195d..4f459c439f5 100644
--- a/test/jdk/java/nio/channels/TestServers.java
+++ b/test/jdk/java/nio/channels/TestServers.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, 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
@@ -497,6 +497,7 @@ static abstract class AbstractUdpServer extends AbstractServer
             implements Runnable, Closeable {
 
         protected final long linger; // #of ms to wait before responding
+        protected final InetAddress bindAddress; //local address to bind to; can be null.
         private Thread acceptThread; // thread waiting for packets
         private DatagramSocket serverSocket; // the server socket
         private boolean started = false; // whether the server is started
@@ -509,7 +510,20 @@ static abstract class AbstractUdpServer extends AbstractServer
          * responding to requests.
          */
         protected AbstractUdpServer(long linger) {
+            this(linger, null);
+        }
+
+        /**
+         * Creates a new abstract UDP server.
+         *
+         * @param linger the amount of time the server should wait before
+         *          responding to requests.
+         * @param bindAddress the address to bind to. If {@code null}, will
+         *                    bind to InetAddress.getLocalHost();
+         */
+        protected AbstractUdpServer(long linger, InetAddress bindAddress) {
             this.linger = linger;
+            this.bindAddress = bindAddress;
         }
 
         /**
@@ -574,8 +588,9 @@ public final synchronized void start() throws IOException {
             if (started) {
                 return;
             }
+            InetAddress lh = bindAddress == null ? InetAddress.getLocalHost() : bindAddress;
             final DatagramSocket socket =
-                    newDatagramSocket(0, InetAddress.getLocalHost());
+                    newDatagramSocket(0, lh);
             serverSocket = socket;
             acceptThread = new Thread(this);
             acceptThread.setDaemon(true);
@@ -759,7 +774,11 @@ public UdpEchoServer() {
         }
 
         public UdpEchoServer(long linger) {
-            super(linger);
+            this(linger, null);
+        }
+
+        public UdpEchoServer(long linger, InetAddress bindAddress) {
+            super(linger, bindAddress);
         }
 
         @Override
@@ -795,7 +814,11 @@ public static UdpEchoServer startNewServer() throws IOException {
         }
 
         public static UdpEchoServer startNewServer(long linger) throws IOException {
-            final UdpEchoServer echoServer = new UdpEchoServer(linger);
+            return startNewServer(0, InetAddress.getLocalHost());
+        }
+
+        public static UdpEchoServer startNewServer(long linger, InetAddress bindAddress) throws IOException {
+            final UdpEchoServer echoServer = new UdpEchoServer(linger, bindAddress);
             echoServer.start();
             return echoServer;
         }
diff --git a/test/jdk/java/nio/channels/etc/MemorySegments.java b/test/jdk/java/nio/channels/etc/MemorySegments.java
new file mode 100644
index 00000000000..77da11759c7
--- /dev/null
+++ b/test/jdk/java/nio/channels/etc/MemorySegments.java
@@ -0,0 +1,494 @@
+/*
+ * Copyright (c) 2024, 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 8333849
+ * @summary Test ByteChannel implementations of read and write with ByteBuffers that are
+ *    backed by MemorySegments allocated from an Arena
+ * @run junit MemorySegments
+ */
+
+import java.io.IOException;
+import java.lang.foreign.Arena;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+import java.nio.channels.FileChannel;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Random;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+import static java.nio.file.StandardOpenOption.*;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import static org.junit.jupiter.api.Assertions.*;
+
+class MemorySegments {
+    private static final int SIZE = 100;   // buffer size used by tests
+
+    /**
+     * Return a stream of suppliers for each Arena type. A supplier is used to avoid JUnit
+     * closing the Arena and failing (as some Arenas are not closable).
+     */
+    static Stream<Supplier<Arena>> arenaSuppliers() {
+        return Stream.of(Arena::global, Arena::ofAuto, Arena::ofConfined, Arena::ofShared);
+    }
+
+    /**
+     * SocketChannel read/write(ByteBuffer).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testSocketChannelReadWrite(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        try (ServerSocketChannel ssc = ServerSocketChannel.open()) {
+            ssc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+
+            try (SocketChannel sc1 = SocketChannel.open(ssc.getLocalAddress());
+                 SocketChannel sc2 = ssc.accept()) {
+
+                // write
+                ByteBuffer src = arena.allocate(SIZE).asByteBuffer();
+                fillRandom(src);
+                int nwritten = sc1.write(src);
+                assertTrue(nwritten > 0);
+                assertTrue(nwritten <= SIZE);
+                assertEquals(nwritten, src.position());
+
+                // read
+                ByteBuffer dst = arena.allocate(SIZE + 100).asByteBuffer();
+                int nread = sc2.read(dst);
+                assertTrue(nread > 0);
+                assertTrue(nread <= nwritten);
+                assertEquals(nread, dst.position());
+
+                // check contents
+                dst.flip();
+                assertEquals(src.slice(0, nread), dst);
+            }
+
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * SocketChannel write(ByteBuffer[]).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testSocketChannelGatheringWrite(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        try (ServerSocketChannel ssc = ServerSocketChannel.open()) {
+            ssc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+
+            try (SocketChannel sc1 = SocketChannel.open(ssc.getLocalAddress());
+                 SocketChannel sc2 = ssc.accept()) {
+
+                // gathering write
+                ByteBuffer src = arena.allocate(SIZE * 2).asByteBuffer();
+                fillRandom(src);
+                ByteBuffer src1 = src.slice(0, SIZE);
+                ByteBuffer src2 = src.slice(SIZE, SIZE);
+                var srcs = new ByteBuffer[] { src1, src2 };
+                int nwritten = (int) sc1.write(srcs);
+                assertTrue(nwritten > 0);
+                assertEquals(Math.min(nwritten, SIZE), src1.position());
+                assertEquals(nwritten, src1.position() + src2.position());
+
+                // read
+                ByteBuffer dst = arena.allocate(SIZE * 2 + 50).asByteBuffer();
+                int nread = sc2.read(dst);
+                assertTrue(nread > 0);
+                assertTrue(nread <= nwritten);
+                assertEquals(nread, dst.position());
+
+                // check contents
+                dst.flip();
+                assertEquals(src.slice(0, nread), dst);
+            }
+
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * SocketChannel read(ByteBuffer[]).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testSocketChannelScatteringRead(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        try (ServerSocketChannel ssc = ServerSocketChannel.open()) {
+            ssc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+
+            try (SocketChannel sc1 = SocketChannel.open(ssc.getLocalAddress());
+                 SocketChannel sc2 = ssc.accept()) {
+
+                // write
+                ByteBuffer src = arena.allocate(SIZE).asByteBuffer();
+                fillRandom(src);
+                int nwritten = sc1.write(src);
+                assertTrue(nwritten > 0);
+                assertTrue(nwritten <= SIZE);
+                assertEquals(nwritten, src.position());
+
+                // scattering read
+                ByteBuffer dst = arena.allocate(SIZE + 50).asByteBuffer();
+                ByteBuffer dst1 = dst.slice(0, 50);
+                ByteBuffer dst2 = dst.slice(50, dst.capacity() - 50);
+                var dsts = new ByteBuffer[]{ dst1, dst2 };
+                int nread = (int) sc2.read(dsts);
+                assertTrue(nread > 0);
+                assertTrue(nread <= nwritten);
+                assertTrue(dst1.position() > 0);
+                assertEquals(nread, dst1.position() + dst2.position());
+
+                // check contents
+                src.flip();
+                assertEquals(src, dst.slice(0, nread));
+            }
+
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * DatagramChannel send/receive(ByteBuffer).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testDatagramChannelSendReceive(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        try (DatagramChannel dc = DatagramChannel.open()) {
+            dc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+            SocketAddress target = dc.getLocalAddress();
+
+            // send
+            ByteBuffer src = arena.allocate(SIZE).asByteBuffer();
+            fillRandom(src);
+            int n = dc.send(src, target);
+            assertEquals(SIZE, n);
+            assertFalse(src.hasRemaining());
+
+            // receive
+            ByteBuffer dst = arena.allocate(SIZE + 100).asByteBuffer();
+            SocketAddress remote = dc.receive(dst);
+            assertEquals(remote, target);
+            assertEquals(SIZE, dst.position());
+
+            // check contents
+            src.clear();
+            dst.flip();
+            assertEquals(src, dst);
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * DatagramChannel read/write(ByteBuffer).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testDatagramChannelReadWrite(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        try (DatagramChannel dc = DatagramChannel.open()) {
+            dc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+            SocketAddress target = dc.getLocalAddress();
+            dc.connect(target);
+
+            // write
+            ByteBuffer src = arena.allocate(SIZE).asByteBuffer();
+            fillRandom(src);
+            int n = dc.write(src);
+            assertEquals(SIZE, n);
+            assertFalse(src.hasRemaining());
+
+            // read
+            ByteBuffer dst = arena.allocate(SIZE + 100).asByteBuffer();
+            n = dc.read(dst);
+            assertEquals(SIZE, n);
+            assertEquals(SIZE, dst.position());
+
+            // check contents
+            src.clear();
+            dst.flip();
+            assertEquals(src, dst);
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * DatagramChannel write(ByteBuffer[]).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testDatagramChannelGatheringWrite(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        try (DatagramChannel dc = DatagramChannel.open()) {
+            dc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+            SocketAddress target = dc.getLocalAddress();
+            dc.connect(target);
+
+            // gathering write
+            ByteBuffer src1 = arena.allocate(SIZE).asByteBuffer();
+            ByteBuffer src2 = arena.allocate(SIZE).asByteBuffer();
+            fillRandom(src1);
+            fillRandom(src2);
+            var srcs = new ByteBuffer[] { src1, src2 };
+            int nwritten = (int) dc.write(srcs);
+            assertEquals(SIZE*2, nwritten);
+            assertFalse(src1.hasRemaining());
+            assertFalse(src2.hasRemaining());
+
+            // read
+            ByteBuffer dst = arena.allocate(SIZE*2 + 50).asByteBuffer();
+            int nread = dc.read(dst);
+            assertEquals(SIZE*2, nread);
+            assertEquals(SIZE*2, dst.position());
+
+            // check contents
+            src1.flip();
+            src2.flip();
+            assertEquals(src1, dst.slice(0, SIZE));
+            assertEquals(src2, dst.slice(SIZE, SIZE));
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * DatagramChannel read(ByteBuffer[]).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testDatagramChannelScatteringRead(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        try (DatagramChannel dc = DatagramChannel.open()) {
+            dc.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0));
+            SocketAddress target = dc.getLocalAddress();
+            dc.connect(target);
+
+            // write
+            ByteBuffer src = arena.allocate(SIZE*2).asByteBuffer();
+            fillRandom(src);
+            int nwritten = dc.write(src);
+            assertEquals(SIZE*2, nwritten);
+            assertEquals(nwritten, src.position());
+
+            // scattering read
+            ByteBuffer dst1 = arena.allocate(SIZE).asByteBuffer();
+            ByteBuffer dst2 = arena.allocate(SIZE + 50).asByteBuffer();
+            var dsts = new ByteBuffer[] { dst1, dst2 };
+            int nread = (int) dc.read(dsts);
+            assertEquals(SIZE*2, nread);
+            assertEquals(nread, dst1.position() + dst2.position());
+
+            // check contents
+            dst1.flip();
+            assertEquals(src.slice(0, SIZE), dst1);
+            dst2.flip();
+            assertEquals(src.slice(SIZE, SIZE), dst2);
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * FileChannel read/write(ByteBuffer).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testFileChannelReadWrite(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        Path file = Files.createTempFile(Path.of("."), "test", "dat");
+        try (FileChannel fc = FileChannel.open(file, READ, WRITE)) {
+
+            // write
+            ByteBuffer src = arena.allocate(SIZE).asByteBuffer();
+            fillRandom(src);
+            int nwritten = fc.write(src);
+            assertTrue(nwritten > 0);
+            assertTrue(nwritten <= SIZE);
+            assertEquals(nwritten, src.position());
+            assertEquals(nwritten, (int) fc.position());
+            assertEquals(nwritten, (int) fc.size());
+
+            // read
+            ByteBuffer dst = arena.allocate(SIZE + 100).asByteBuffer();
+            fc.position(0);
+            int nread = fc.read(dst);
+            assertTrue(nread > 0);
+            assertTrue(nread <= nwritten);
+            assertEquals(nread, dst.position());
+            assertEquals(nread, (int) fc.position());
+
+            // check contents
+            dst.flip();
+            assertEquals(src.slice(0, nread), dst);
+
+            // reset
+            fc.truncate(0L);
+            src.clear();
+            dst.clear();
+
+            // write with position
+            nwritten = fc.write(src, 10L);
+            assertTrue(nwritten > 0);
+            assertTrue(nwritten <= SIZE);
+            assertEquals(nwritten, src.position());
+            assertEquals(0, (int) fc.position());
+            assertEquals(nwritten + 10, (int) fc.size());
+
+            // read with position
+            nread = fc.read(dst, 10L);
+            assertTrue(nread > 0);
+            assertTrue(nread <= nwritten);
+            assertEquals(nread, dst.position());
+            assertEquals(0, (int)fc.position());
+
+            // check contents
+            dst.flip();
+            assertEquals(src.slice(0, nread), dst);
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * FileChannel write(ByteBuffer[]).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testFileChannelGatheringWrite(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        Path file = Files.createTempFile(Path.of(""), "test", "dat");
+        try (FileChannel fc = FileChannel.open(file, READ, WRITE)) {
+
+            // gathering write
+            ByteBuffer src = arena.allocate(SIZE * 2).asByteBuffer();
+            fillRandom(src);
+            ByteBuffer src1 = src.slice(0, SIZE);
+            ByteBuffer src2 = src.slice(SIZE, SIZE);
+            var srcs = new ByteBuffer[] { src1, src2 };
+            int nwritten = (int) fc.write(srcs);
+            assertTrue(nwritten > 0);
+            assertEquals(Math.min(nwritten, SIZE), src1.position());
+            assertEquals(nwritten, src1.position() + src2.position());
+            assertEquals(nwritten, (int) fc.position());
+            assertEquals(nwritten, (int) fc.size());
+
+            // read
+            ByteBuffer dst = arena.allocate(SIZE*2 + 50).asByteBuffer();
+            fc.position(0);
+            int nread = fc.read(dst);
+            assertTrue(nread > 0);
+            assertTrue(nread <= nwritten);
+            assertEquals(nread, dst.position());
+            assertEquals(nread, (int) fc.position());
+
+            // check contents
+            dst.flip();
+            assertEquals(src.slice(0, nread), dst);
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * FileChannel read(ByteBuffer[]).
+     */
+    @ParameterizedTest
+    @MethodSource("arenaSuppliers")
+    void testFileChannelScatteringRead(Supplier<Arena> arenaSupplier) throws IOException {
+        Arena arena = arenaSupplier.get();
+        Path file = Files.createTempFile(Path.of(""), "test", "dat");
+        try (FileChannel fc = FileChannel.open(file, READ, WRITE)) {
+
+            // write
+            ByteBuffer src = arena.allocate(SIZE).asByteBuffer();
+            fillRandom(src);
+            int nwritten = fc.write(src);
+            assertTrue(nwritten > 0);
+            assertTrue(nwritten <= SIZE);
+            assertEquals(nwritten, src.position());
+            assertEquals(nwritten, (int) fc.position());
+            assertEquals(nwritten, (int) fc.size());
+
+            // scattering read
+            ByteBuffer dst = arena.allocate(SIZE + 50).asByteBuffer();
+            ByteBuffer dst1 = dst.slice(0, 50);
+            ByteBuffer dst2 = dst.slice(50, dst.capacity() - 50);
+            var dsts = new ByteBuffer[] { dst1, dst2 };
+            fc.position(0);
+            int nread = (int) fc.read(dsts);
+            assertTrue(nread > 0);
+            assertTrue(nread <= nwritten);
+            assertTrue(dst1.position() > 0);
+            assertEquals(nread, dst1.position() + dst2.position());
+            assertEquals(nread, (int) fc.position());
+
+            // check contents
+            dst.limit(nread);
+            assertEquals(src.slice(0, nread), dst);
+        } finally {
+            tryClose(arena);
+        }
+    }
+
+    /**
+     * Fill the buffer with random bytes.
+     */
+    private void fillRandom(ByteBuffer bb) {
+        Random r = new Random();
+        int pos = bb.position();
+        while (bb.hasRemaining()) {
+            bb.put((byte) r.nextInt(256));
+        }
+        bb.position(pos);
+    }
+
+    /**
+     * Attempt to close the given Arena.
+     */
+    private boolean tryClose(Arena arena) {
+        try {
+            arena.close();
+            return true;
+        } catch (UnsupportedOperationException e) {
+            return false;
+        }
+    }
+
+}
diff --git a/test/jdk/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java b/test/jdk/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java
index 1898f584bcd..ad85da7ae63 100644
--- a/test/jdk/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java
+++ b/test/jdk/java/nio/file/attribute/BasicFileAttributeView/CreationTime.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,15 +21,24 @@
  * questions.
  */
 
-/* @test
- * @bug 8011536 8151430 8316304
+/* @test id=tmp
+ * @bug 8011536 8151430 8316304 8334339
  * @summary Basic test for creationTime attribute on platforms/file systems
- *     that support it.
+ *     that support it, tests using /tmp directory.
  * @library  ../.. /test/lib
  * @build jdk.test.lib.Platform
  * @run main CreationTime
  */
 
+/* @test id=cwd
+ * @summary Basic test for creationTime attribute on platforms/file systems
+ *     that support it, tests using the test scratch directory, the test
+ *     scratch directory maybe at diff disk partition to /tmp on linux.
+ * @library  ../.. /test/lib
+ * @build jdk.test.lib.Platform
+ * @run main CreationTime .
+ */
+
 import java.lang.foreign.Linker;
 import java.nio.file.Path;
 import java.nio.file.Files;
@@ -38,6 +47,7 @@
 import java.io.IOException;
 
 import jdk.test.lib.Platform;
+import jtreg.SkippedException;
 
 public class CreationTime {
 
@@ -68,8 +78,14 @@ static void test(Path top) throws IOException {
         FileTime creationTime = creationTime(file);
         Instant now = Instant.now();
         if (Math.abs(creationTime.toMillis()-now.toEpochMilli()) > 10000L) {
-            err.println("File creation time reported as: " + creationTime);
-            throw new RuntimeException("Expected to be close to: " + now);
+            System.out.println("creationTime.toMillis() == " + creationTime.toMillis());
+            // If the file system doesn't support birth time, then skip this test
+            if (creationTime.toMillis() == 0) {
+                throw new SkippedException("birth time not support for: " + file);
+            } else {
+                err.println("File creation time reported as: " + creationTime);
+                throw new RuntimeException("Expected to be close to: " + now);
+            }
         }
 
         /**
@@ -95,7 +111,7 @@ static void test(Path top) throws IOException {
             // Creation time updates are not supported on Linux
             supportsCreationTimeWrite = false;
         }
-        System.out.println("supportsCreationTimeRead == " + supportsCreationTimeRead);
+        System.out.println(top + " supportsCreationTimeRead == " + supportsCreationTimeRead);
 
         /**
          * If the creation-time attribute is supported then change the file's
@@ -127,7 +143,12 @@ static void test(Path top) throws IOException {
 
     public static void main(String[] args) throws IOException {
         // create temporary directory to run tests
-        Path dir = TestUtil.createTemporaryDirectory();
+        Path dir;
+        if (args.length == 0) {
+            dir = TestUtil.createTemporaryDirectory();
+        } else {
+            dir = TestUtil.createTemporaryDirectory(args[0]);
+        }
         try {
             test(dir);
         } finally {
diff --git a/test/jdk/java/rmi/reliability/benchmark/bench/Makefile b/test/jdk/java/rmi/reliability/benchmark/bench/Makefile
index f0600d4df30..805d6216373 100644
--- a/test/jdk/java/rmi/reliability/benchmark/bench/Makefile
+++ b/test/jdk/java/rmi/reliability/benchmark/bench/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2024, 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
@@ -47,4 +47,3 @@ all: .classes
 
 clean:
 	rm -f *.class .classes
-
diff --git a/test/jdk/java/rmi/reliability/benchmark/bench/rmi/Makefile b/test/jdk/java/rmi/reliability/benchmark/bench/rmi/Makefile
index bb44d94f154..c142b3a2d05 100644
--- a/test/jdk/java/rmi/reliability/benchmark/bench/rmi/Makefile
+++ b/test/jdk/java/rmi/reliability/benchmark/bench/rmi/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2000, 2024, 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
@@ -72,4 +72,3 @@ altroot.clean:
 
 clean: altroot.clean
 	rm -f *.class .classes
-
diff --git a/test/jdk/java/security/testlibrary/HumanInputStream.java b/test/jdk/java/security/testlibrary/HumanInputStream.java
new file mode 100644
index 00000000000..50e5dd0bcc8
--- /dev/null
+++ b/test/jdk/java/security/testlibrary/HumanInputStream.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2024, 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.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * HumanInputStream tries to act like a human sitting in front of a computer
+ * terminal typing on the keyboard while a program is running.
+ * <p>
+ * The program may call InputStream.read() and BufferedReader.readLine() in
+ * various places. a call to B.readLine() will try to buffer as much input as
+ * possible. Thus, a trivial InputStream will find it impossible to feed
+ * anything to I.read() after a B.readLine() call.
+ * <p>
+ * This is why HumanInputStream was created, which will only send a single line
+ * to B.readLine(), no more, no less, and the next I.read() can have a chance
+ * to read the exact character right after "\n".
+ *
+ */
+
+public class HumanInputStream extends InputStream {
+    byte[] src;
+    int pos;
+    int length;
+    boolean inLine;
+    int stopIt;
+
+    public HumanInputStream(String input) {
+        src = input.getBytes();
+        pos = 0;
+        length = src.length;
+        stopIt = 0;
+        inLine = false;
+    }
+
+    // the trick: when called through read(byte[], int, int),
+    // return -1 twice after "\n"
+
+    @Override public int read() throws IOException {
+        int re;
+        if(pos < length) {
+            re = src[pos];
+            if(inLine) {
+                if(stopIt > 0) {
+                    stopIt--;
+                    re = -1;
+                } else {
+                    if(re == '\n') {
+                        stopIt = 2;
+                    }
+                    pos++;
+                }
+            } else {
+                pos++;
+            }
+        } else {
+            re = -1; //throws new IOException("NO MORE TO READ");
+        }
+        return re;
+    }
+    @Override public int read(byte[] buffer, int offset, int len) {
+        inLine = true;
+        try {
+            return super.read(buffer, offset, len);
+        } catch(Exception e) {
+            throw new RuntimeException("HumanInputStream error");
+        } finally {
+            inLine = false;
+        }
+    }
+    @Override public int available() {
+        if (pos < length) return 1;
+        return 0;
+    }
+
+    // test part
+    static void assertTrue(boolean bool) {
+        if (!bool)
+            throw new RuntimeException();
+    }
+
+    public static void test() throws Exception {
+        class Tester {
+            HumanInputStream is;
+            BufferedReader reader;
+            Tester(String s) {
+                is = new HumanInputStream(s);
+                reader = new BufferedReader(new InputStreamReader(is));
+            }
+
+            // three kinds of test method
+            // 1. read byte by byte from InputStream
+            void testStreamReadOnce(int expection) throws Exception {
+                assertTrue(is.read() == expection);
+            }
+            void testStreamReadMany(String expectation) throws Exception {
+                char[] keys = expectation.toCharArray();
+                for (char key : keys) {
+                    assertTrue(is.read() == key);
+                }
+            }
+            // 2. read a line with a newly created Reader
+            void testReaderReadline(String expectation) throws Exception {
+                String s = new BufferedReader(new InputStreamReader(is)).readLine();
+                if(s == null) assertTrue(expectation == null);
+                else assertTrue(s.equals(expectation));
+            }
+            // 3. read a line with the old Reader
+            void testReaderReadline2(String expectation) throws Exception  {
+                String s = reader.readLine();
+                if(s == null) assertTrue(expectation == null);
+                else assertTrue(s.equals(expectation));
+            }
+        }
+
+        Tester test;
+
+        test = new Tester("111\n222\n\n444\n\n");
+        test.testReaderReadline("111");
+        test.testReaderReadline("222");
+        test.testReaderReadline("");
+        test.testReaderReadline("444");
+        test.testReaderReadline("");
+        test.testReaderReadline(null);
+
+        test = new Tester("111\n222\n\n444\n\n");
+        test.testReaderReadline2("111");
+        test.testReaderReadline2("222");
+        test.testReaderReadline2("");
+        test.testReaderReadline2("444");
+        test.testReaderReadline2("");
+        test.testReaderReadline2(null);
+
+        test = new Tester("111\n222\n\n444\n\n");
+        test.testReaderReadline2("111");
+        test.testReaderReadline("222");
+        test.testReaderReadline2("");
+        test.testReaderReadline2("444");
+        test.testReaderReadline("");
+        test.testReaderReadline2(null);
+
+        test = new Tester("1\n2");
+        test.testStreamReadMany("1\n2");
+        test.testStreamReadOnce(-1);
+
+        test = new Tester("12\n234");
+        test.testStreamReadOnce('1');
+        test.testReaderReadline("2");
+        test.testStreamReadOnce('2');
+        test.testReaderReadline2("34");
+        test.testReaderReadline2(null);
+
+        test = new Tester("changeit\n");
+        test.testStreamReadMany("changeit\n");
+        test.testReaderReadline(null);
+
+        test = new Tester("changeit\nName\nCountry\nYes\n");
+        test.testStreamReadMany("changeit\n");
+        test.testReaderReadline("Name");
+        test.testReaderReadline("Country");
+        test.testReaderReadline("Yes");
+        test.testReaderReadline(null);
+
+        test = new Tester("Me\nHere\n");
+        test.testReaderReadline2("Me");
+        test.testReaderReadline2("Here");
+    }
+}
diff --git a/test/jdk/java/text/Format/NumberFormat/BigDecimalParse.java b/test/jdk/java/text/Format/NumberFormat/BigDecimalParse.java
index 771ae761a3a..1d8168cd054 100644
--- a/test/jdk/java/text/Format/NumberFormat/BigDecimalParse.java
+++ b/test/jdk/java/text/Format/NumberFormat/BigDecimalParse.java
@@ -23,14 +23,18 @@
 
 /*
  * @test
- * @bug 4018937 8008577 8174269
+ * @bug 4018937 8008577 8174269 8333755
  * @summary Confirm that methods which are newly added to support BigDecimal and BigInteger work as expected.
  * @run junit/othervm BigDecimalParse
  */
 
 import java.math.BigDecimal;
-import java.text.*;
-import java.util.*;
+import java.text.DecimalFormat;
+import java.text.Format;
+import java.text.MessageFormat;
+import java.text.NumberFormat;
+import java.text.ParsePosition;
+import java.util.Locale;
 
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.BeforeAll;
@@ -543,23 +547,23 @@ public void test_Parse_in_MessageFormat_NotParseIntegerOnly() {
     static final int[][] parsePosition2 = {     // {errorIndex, index}
         /*
          * Should keep in mind that the expected result is different from
-         * DecimalFormat.parse() for some cases.
+         * DecimalFormat.parse() for some cases. This is because parsing integer
+         * only will return a successful parse for the subformat, but since the index
+         * returned is not equal to the length, at the MessageFormat level, this
+         * will be interpreted as a failed parse, and so the DecimalFormat index
+         * should be reflected as the MessageFormat errorIndex.
          */
         {28, 0},        // parsing stopped at '.'
         {29, 0},        // parsing stopped at '.'
         {29, 0},        // parsing stopped at '.'
-        {2, 0},         // parsing stopped at '(' because cannot find ')'
-        {2, 0},         // parsing stopped at the first numeric
-                        // because cannot find '%'
-        {2, 0},         // parsing stopped at the first numeric
-                        // because cannot find '%'
+        {30, 0},        // parsing stopped at '.'
+        {31, 0},        // parsing stopped at '.'
+        {32, 0},        // parsing stopped at '.'
         {28, 0},        // parsing stopped at '.'
         {29, 0},        // parsing stopped at '.'
-
         {-1, 57}, {-1, 58}, {-1, 59}, {-1, 61},
         {56, 0},        // parsing stopped at '.'
-                        // because cannot find '%'
-        {2, 0},         // parsing stopped at '(' because cannot find ')'
+        {57, 0},        // parsing stopped at '.'
         {-1, 60}, {-1, 61},
         {28, 0},        // parsing stopped at '.'
         {-1, 88},
diff --git a/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java b/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java
index d62a867e573..333bc1b0506 100644
--- a/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java
+++ b/test/jdk/java/text/Format/NumberFormat/StrictParseTest.java
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8327640 8331485
+ * @bug 8327640 8331485 8333755
  * @summary Test suite for NumberFormat parsing with strict leniency
  * @run junit/othervm -Duser.language=en -Duser.country=US StrictParseTest
  * @run junit/othervm -Duser.language=ja -Duser.country=JP StrictParseTest
@@ -34,6 +34,7 @@
  * @run junit/othervm -Duser.language=ar -Duser.country=AR StrictParseTest
  */
 
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -72,17 +73,18 @@ public class StrictParseTest {
     private static final CompactNumberFormat cmpctFmt =
             (CompactNumberFormat) NumberFormat.getCompactNumberInstance(Locale.getDefault(),
                     NumberFormat.Style.SHORT);
-
-
-    // All NumberFormats should parse strictly
-    static {
-        dFmt.setStrict(true);
-        pFmt.setStrict(true);
-        cFmt.setStrict(true);
-        cmpctFmt.setStrict(true);
-        // To effectively test strict compactNumberFormat parsing
-        cmpctFmt.setParseIntegerOnly(false);
-        cmpctFmt.setGroupingUsed(true);
+    private static final NumberFormat[] FORMATS = new NumberFormat[]{dFmt, cFmt, pFmt, cmpctFmt};
+
+    // Restore defaults before runs
+    @BeforeEach
+    void beforeEach() {
+        for (NumberFormat fmt : FORMATS) {
+            fmt.setStrict(true);
+            fmt.setParseIntegerOnly(false);
+            fmt.setGroupingUsed(true);
+        }
+        // Grouping Size is not defined at NumberFormat level
+        // Compact needs to manually init grouping size
         cmpctFmt.setGroupingSize(3);
     }
 
@@ -114,6 +116,20 @@ public void uniqueCaseNumberFormatTest() {
         failParse(nonLocalizedDFmt, "a123456,7890b", 6);
     }
 
+
+    // 8333755: Check that parsing with integer only against a suffix value works
+    @Test // Non-localized, run once
+    @EnabledIfSystemProperty(named = "user.language", matches = "en")
+    public void integerOnlyParseWithSuffixTest() {
+        // Some pattern with a suffix
+        DecimalFormat fmt = new DecimalFormat("0.00b");
+        fmt.setParseIntegerOnly(true);
+        assertEquals(5d, successParse(fmt, "5.55b", 1));
+        assertEquals(5d, successParse(fmt, "5b", 2));
+        assertEquals(5555d, successParse(fmt, "5,555.55b", 5));
+        assertEquals(5d, successParse(fmt, "5.55E55b", 1));
+    }
+
     @Test // Non-localized, only run once
     @EnabledIfSystemProperty(named = "user.language", matches = "en")
     public void badExponentParseNumberFormatTest() {
@@ -170,24 +186,30 @@ public void numFmtStrictGroupingNotUsed(String toParse) {
         } else {
             successParse(dFmt, toParse);
         }
-        dFmt.setGroupingUsed(true);
     }
 
-    // Exception should be thrown if decimal separator occurs anywhere
-    // Don't pass badParseStrings for same reason as previous method.
+    // 8333755: Parsing behavior should follow normal strict behavior
+    // However the index returned, should be before decimal point
+    // and the value parsed equal to the integer portion
     @ParameterizedTest
-    @MethodSource({"validParseStrings", "integerOnlyParseStrings"})
-    public void numFmtStrictIntegerOnlyUsed(String toParse) {
-        // When integer only is true, if a decimal separator is found,
-        // a failure should occur
+    @MethodSource("validIntegerOnlyParseStrings")
+    public void numFmtStrictIntegerOnlyUsedTest(String toParse, Number expVal) {
         dFmt.setParseIntegerOnly(true);
-        int failIndex = toParse.indexOf(dfs.getDecimalSeparator());
-        if (failIndex > -1) {
-            failParse(dFmt, toParse, failIndex);
+        int expectedIndex = toParse.indexOf(dfs.getDecimalSeparator());
+        if (expectedIndex > -1) {
+            assertEquals(successParse(dFmt, toParse, expectedIndex), expVal);
         } else {
-            successParse(dFmt, toParse);
+            assertEquals(successParse(dFmt, toParse), expVal);
         }
-        dFmt.setParseIntegerOnly(false);
+    }
+
+    // 8333755: Parsing behavior should follow normal strict behavior
+    // when it comes to failures.
+    @ParameterizedTest
+    @MethodSource("badParseStrings")
+    public void numFmtStrictIntegerOnlyUsedFailTest(String toParse, int expectedErrorIndex) {
+        dFmt.setParseIntegerOnly(true);
+        failParse(dFmt, toParse, expectedErrorIndex);
     }
 
     // ---- CurrencyFormat tests ----
@@ -270,6 +292,18 @@ public void compactFmtEdgeParseTest() {
         failParse(cnf, "c1bb", 2);
     }
 
+    @ParameterizedTest
+    @MethodSource({"validIntegerOnlyParseStrings", "compactValidIntegerOnlyParseStrings"})
+    @EnabledIfSystemProperty(named = "user.language", matches = "en")
+    public void compactFmtSuccessParseIntOnlyTest(String toParse, double expectedValue) {
+        // compact does not accept exponents
+        if (toParse.indexOf('E') > -1) {
+            return;
+        }
+        cmpctFmt.setParseIntegerOnly(true);
+        assertEquals(expectedValue, successParse(cmpctFmt, toParse, toParse.length()));
+    }
+
     // Ensure that on failure, the original index of the PP remains the same
     @Test
     public void parsePositionIndexTest() {
@@ -279,7 +313,13 @@ public void parsePositionIndexTest() {
     // ---- Helper test methods ----
 
     // Should parse entire String successfully, and return correctly parsed value.
-    private double successParse(NumberFormat fmt, String toParse) {
+    private Number successParse(NumberFormat fmt, String toParse) {
+        return successParse(fmt, toParse, toParse.length());
+    }
+
+    // Overloaded method that allows for an expected ParsePosition index value
+    // that is not the string length.
+    private Number successParse(NumberFormat fmt, String toParse, int expectedIndex) {
         // For Strings that don't have grouping separators, we test them with
         // grouping off so that they do not fail under the expectation that
         // grouping symbols should occur
@@ -292,7 +332,7 @@ private double successParse(NumberFormat fmt, String toParse) {
         assertDoesNotThrow(() -> fmt.parse(toParse, pp));
         assertEquals(-1, pp.getErrorIndex(),
                 "ParsePosition ErrorIndex is not in correct location");
-        assertEquals(toParse.length(), pp.getIndex(),
+        assertEquals(expectedIndex, pp.getIndex(),
                 "ParsePosition Index is not in correct location");
         fmt.setGroupingUsed(true);
         return parsedValue.doubleValue();
@@ -388,7 +428,9 @@ private static Stream<Arguments> badParseStrings() {
                 Arguments.of("1.a", 2),
                 Arguments.of(".22a", 3),
                 Arguments.of(".1a1", 2),
-                Arguments.of("1,234,a", 5))
+                Arguments.of("1,234,a", 5),
+                // Double decimal
+                Arguments.of("1,234..5", 5))
                 .map(args -> Arguments.of(
                         localizeText(String.valueOf(args.get()[0])), args.get()[1]));
     }
@@ -397,6 +439,8 @@ private static Stream<Arguments> badParseStrings() {
     // Given as Arguments<String, expectedParsedNumber>
     private static Stream<Arguments> validParseStrings() {
         return Stream.of(
+                Arguments.of("1,234.55", 1234.55d),
+                Arguments.of("1,234.5", 1234.5d),
                 Arguments.of("1,234.00", 1234d),
                 Arguments.of("1,234.0", 1234d),
                 Arguments.of("1,234.", 1234d),
@@ -414,17 +458,19 @@ private static Stream<Arguments> validParseStrings() {
                         localizeText(String.valueOf(args.get()[0])), args.get()[1]));
     }
 
-    // Separate test data set for integer only. Can not use "badParseStrings", as
-    // there is test data where the failure may occur from some other issue,
-    // not related to grouping
-    private static Stream<Arguments> integerOnlyParseStrings() {
+    // Separate test data set for integer only.
+    // Valid parse strings, that would parse successfully for integer/non-integer parse
+    private static Stream<Arguments> validIntegerOnlyParseStrings() {
         return Stream.of(
-                Arguments.of("234.a"),
-                Arguments.of("234.a1"),
-                Arguments.of("234.1"),
-                Arguments.of("234.1a"),
-                Arguments.of("234."))
-                .map(args -> Arguments.of(localizeText(String.valueOf(args.get()[0]))));
+                Arguments.of("234", 234d),
+                Arguments.of("234.", 234d),
+                Arguments.of("234.1", 234d),
+                Arguments.of("1,234.1", 1234d),
+                Arguments.of("234.12345", 234d),
+                Arguments.of("234.543E23", 234d),
+                Arguments.of("234,000.55E22", 234000d),
+                Arguments.of("234E22", 234E22))
+                .map(args -> Arguments.of(localizeText(String.valueOf(args.get()[0])), args.get()[1]));
     }
 
     // Separate test data set for no grouping. Can not use "badParseStrings", as
@@ -514,6 +560,12 @@ private static Stream<Arguments> compactValidParseStrings() {
         );
     }
 
+    private static Stream<Arguments> compactValidIntegerOnlyParseStrings() {
+        return validIntegerOnlyParseStrings().map(args -> Arguments.of(
+                args.get()[0] + "K", (double) args.get()[1] * 1000)
+        );
+    }
+
     // Replace the grouping and decimal separators with localized variants
     // Used during localization of data
     private static String localizeText(String text) {
@@ -526,7 +578,10 @@ private static String localizeText(String text) {
                 sb.append(dfs.getGroupingSeparator());
             } else if (c == '.') {
                 sb.append(dfs.getDecimalSeparator());
-            } else if (c == '0') {
+            } else if (c == 'E') {
+                sb.append(dfs.getExponentSeparator());
+            }
+            else if (c == '0') {
                 sb.append(dfs.getZeroDigit());
             } else {
                 sb.append(c);
diff --git a/test/jdk/java/util/Currency/CheckDataVersion.java b/test/jdk/java/util/Currency/CheckDataVersion.java
index ba18677dbbe..303603c5b85 100644
--- a/test/jdk/java/util/Currency/CheckDataVersion.java
+++ b/test/jdk/java/util/Currency/CheckDataVersion.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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
@@ -38,7 +38,7 @@
 import java.util.Currency;
 
 class CheckDataVersion {
-    static final String datafile = "tablea1.txt";
+    static final String datafile = "ISO4217-list-one.txt";
     static final String FILEVERSIONKEY = "FILEVERSION=";
     static final String DATAVERSIONKEY = "DATAVERSION=";
     static String fileVersion;
diff --git a/test/jdk/java/util/Currency/CurrencyTest.java b/test/jdk/java/util/Currency/CurrencyTest.java
index 495de30e821..c8dfb5013bd 100644
--- a/test/jdk/java/util/Currency/CurrencyTest.java
+++ b/test/jdk/java/util/Currency/CurrencyTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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,7 +25,7 @@
  * @test
  * @bug 4290801 4692419 4693631 5101540 5104960 6296410 6336600 6371531
  *      6488442 7036905 8008577 8039317 8074350 8074351 8150324 8167143
- *      8264792
+ *      8264792 8334653
  * @summary Basic tests for Currency class.
  * @modules java.base/java.util:open
  *          jdk.localedata
@@ -59,7 +59,7 @@
 
 public class CurrencyTest {
 
-    // 'tablea1.txt' should be up-to-date before testing
+    // 'ISO4217-list-one.txt' should be up-to-date before testing
     @Test
     public void dataVersionTest() {
         CheckDataVersion.check();
diff --git a/test/jdk/java/util/Currency/tablea1.txt b/test/jdk/java/util/Currency/ISO4217-list-one.txt
similarity index 97%
rename from test/jdk/java/util/Currency/tablea1.txt
rename to test/jdk/java/util/Currency/ISO4217-list-one.txt
index 6e85de5e6d2..1912b5cc7db 100644
--- a/test/jdk/java/util/Currency/tablea1.txt
+++ b/test/jdk/java/util/Currency/ISO4217-list-one.txt
@@ -1,12 +1,12 @@
 #
 #
-# Amendments up until ISO 4217 AMENDMENT NUMBER 176
-#   (As of 06 December 2023)
+# Amendments up until ISO 4217 AMENDMENT NUMBER 177
+#   (As of 20 June 2024)
 #
 
 # Version
 FILEVERSION=3
-DATAVERSION=176
+DATAVERSION=177
 
 # ISO 4217 currency data
 AF	AFN	971	2
@@ -276,7 +276,7 @@ WF	XPF	953	0
 EH	MAD	504	2
 YE	YER	886	2
 ZM	ZMW	967	2
-ZW	ZWL	932	2
+ZW	ZWG	924	2
 #XAU	XAU	959
 #XBA	XBA	955
 #XBB	XBB	956
diff --git a/test/jdk/java/util/Currency/ValidateISO4217.java b/test/jdk/java/util/Currency/ValidateISO4217.java
index 53788c899b3..cd6e4f41a9f 100644
--- a/test/jdk/java/util/Currency/ValidateISO4217.java
+++ b/test/jdk/java/util/Currency/ValidateISO4217.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, 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,7 +25,7 @@
  * @test
  * @bug 4691089 4819436 4942982 5104960 6544471 6627549 7066203 7195759
  *      8039317 8074350 8074351 8145952 8187946 8193552 8202026 8204269
- *      8208746 8209775 8264792 8274658 8283277 8296239 8321480
+ *      8208746 8209775 8264792 8274658 8283277 8296239 8321480 8334653
  * @summary Validate ISO 4217 data for Currency class.
  * @modules java.base/java.util:open
  *          jdk.localedata
@@ -60,7 +60,8 @@
 
 /**
  * This class tests the latest ISO 4217 data and Java's currency data which is
- * based on ISO 4217. The golden-data file (ISO 4217 data) 'tablea1.txt' has the following
+ * based on ISO 4217. The golden-data file, 'ISO4217-list-one.txt', based on the
+ * “List one: Currency, fund and precious metal codes” has the following
  * format: <Country code>\t<Currency code>\t<Numeric code>\t<Minor unit>[\t<Cutover Date>\t<new Currency code>\t<new Numeric code>\t<new Minor unit>]
  * The Cutover Date is given in SimpleDateFormat's 'yyyy-MM-dd-HH-mm-ss' format in the GMT time zone.
  */
@@ -68,7 +69,7 @@ public class ValidateISO4217 {
 
     // Input golden-data file
     private static final File dataFile = new File(System.getProperty(
-            "test.src", "."), "tablea1.txt");
+            "test.src", "."), "ISO4217-list-one.txt");
     // Code statuses
     private static final byte UNDEFINED = 0;
     private static final byte DEFINED = 1;
@@ -89,7 +90,7 @@ public class ValidateISO4217 {
                     + "DEM-EEK-ESP-FIM-FRF-GHC-GRD-GWP-HRK-IEP-ITL-LTL-LUF-LVL-MGF-MRO-MTL-MXV-MZM-NLG-"
                     + "PTE-ROL-RUR-SDD-SIT-SLL-SKK-SRG-STD-TMM-TPE-TRL-VEF-UYI-USN-USS-VEB-VED-"
                     + "XAG-XAU-XBA-XBB-XBC-XBD-XDR-XFO-XFU-XPD-XPT-XSU-XTS-XUA-XXX-"
-                    + "YUM-ZMK-ZWD-ZWN-ZWR";
+                    + "YUM-ZMK-ZWD-ZWL-ZWN-ZWR";
     private static final String[][] extraCodes = {
             /* Defined in ISO 4217 list, but don't have code and minor unit info. */
             {"AQ", "", "", "0"},    // Antarctica
diff --git a/test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java b/test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java
index 184e007becd..cb3d4dde914 100644
--- a/test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java
+++ b/test/jdk/java/util/Locale/LanguageSubtagRegistryTest.java
@@ -25,9 +25,9 @@
  * @test
  * @bug 8025703 8040211 8191404 8203872 8222980 8225435 8241082 8242010 8247432
  *      8258795 8267038 8287180 8302512 8304761 8306031 8308021 8313702 8318322
- *      8327631 8332424
+ *      8327631 8332424 8334418
  * @summary Checks the IANA language subtag registry data update
- *          (LSR Revision: 2024-05-16) with Locale and Locale.LanguageRange
+ *          (LSR Revision: 2024-06-14) with Locale and Locale.LanguageRange
  *          class methods.
  * @run main LanguageSubtagRegistryTest
  */
diff --git a/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java b/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java
index 30cd81757df..66a60f11ad4 100644
--- a/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java
+++ b/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 4354216 8213127
+ * @bug 4354216 8213127 8334333
  * @summary Test for the cause support when throwing a
  *          MissingResourceBundle. (This test exists under
  *          ResourceBundle/Control because bad resource bundle data can be
@@ -32,6 +32,7 @@
  * @build jdk.test.lib.JDKToolLauncher
  *        jdk.test.lib.Utils
  *        jdk.test.lib.process.ProcessTools
+ *        jdk.test.lib.Platform
  *        MissingResourceCauseTest
  *        NonResourceBundle
  *        PrivateConstructorRB
@@ -50,9 +51,14 @@
 import jdk.test.lib.JDKToolLauncher;
 import jdk.test.lib.Utils;
 import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.Platform;
+import jtreg.SkippedException;
 
 public class MissingResourceCauseTestRun {
     public static void main(String[] args) throws Throwable {
+        if (Platform.isRoot() && !Platform.isWindows()) {
+            throw new SkippedException("Unable to create an unreadable properties file.");
+        }
         Path path = Paths.get("UnreadableRB.properties");
         Files.deleteIfExists(path);
         try {
@@ -98,7 +104,7 @@ private static void runCmd() throws Throwable {
     }
 
     private static void deleteFile(Path path) throws Throwable {
-        if(path.toFile().exists()) {
+        if (path.toFile().exists()) {
             ProcessTools.executeCommand("chmod", "666", path.toString())
                         .outputTo(System.out)
                         .errorTo(System.out)
diff --git a/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java
index c980e17d05f..07348841b1e 100644
--- a/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java
+++ b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/WhileOpStatefulTest.java
@@ -256,7 +256,7 @@ private void testWhileMulti(Map<String, Supplier<Stream<Integer>>> sources,
                                                              EXECUTION_TIME_LIMIT);
             return s.peek(e -> {
                 if (!isWithinExecutionPeriod.getAsBoolean()) {
-                    throw new RuntimeException();
+                    throw new RuntimeException("Execution time limit exceeded!");
                 }
             });
         });
@@ -266,7 +266,7 @@ private void testWhileMulti(Map<String, Supplier<Stream<Integer>>> sources,
             return s.parallel()
                     .peek(e -> {
                         if (!isWithinExecutionPeriod.getAsBoolean()) {
-                            throw new RuntimeException();
+                            throw new RuntimeException("Execution time limit exceeded!");
                         }
                     });
         });
diff --git a/test/jdk/javax/crypto/SecretKeyFactory/evilprov/Makefile b/test/jdk/javax/crypto/SecretKeyFactory/evilprov/Makefile
index 918c31f0947..800e1817b42 100644
--- a/test/jdk/javax/crypto/SecretKeyFactory/evilprov/Makefile
+++ b/test/jdk/javax/crypto/SecretKeyFactory/evilprov/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@
 JAVABIN=$(JAVA_BASE)/bin
 JAVAC=$(JAVABIN)/javac
 JAVA=$(JAVABIN)/java
-JAR=$(JAVABIN)/jar 
+JAR=$(JAVABIN)/jar
 JARSIGNER=$(JAVABIN)/jarsigner
 
 # Compile-time flags and paths
diff --git a/test/jdk/javax/management/monitor/StartStopTest.java b/test/jdk/javax/management/monitor/StartStopTest.java
index 8e5490aeaae..4779f40cdc7 100644
--- a/test/jdk/javax/management/monitor/StartStopTest.java
+++ b/test/jdk/javax/management/monitor/StartStopTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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
@@ -32,9 +32,17 @@
  *
  * @run clean StartStopTest
  * @run build StartStopTest
+ *
  * @run main/othervm/timeout=300 StartStopTest 1
  * @run main/othervm/timeout=300 StartStopTest 2
  * @run main/othervm/timeout=300 StartStopTest 3
+ * @run main/othervm/timeout=300 -Djava.security.manager=allow StartStopTest 1
+ * @run main/othervm/timeout=300 -Djava.security.manager=allow StartStopTest 2
+ * @run main/othervm/timeout=300 -Djava.security.manager=allow StartStopTest 3
+ * @run main/othervm/timeout=300/policy=all.policy StartStopTest 1
+ * @run main/othervm/timeout=300/policy=all.policy StartStopTest 2
+ * @run main/othervm/timeout=300/policy=all.policy StartStopTest 3
+ *
  * @run main/othervm/timeout=300 -Djmx.x.monitor.maximum.pool.size=5 StartStopTest 1
  * @run main/othervm/timeout=300 -Djmx.x.monitor.maximum.pool.size=5 StartStopTest 2
  * @run main/othervm/timeout=300 -Djmx.x.monitor.maximum.pool.size=5 StartStopTest 3
diff --git a/test/jdk/javax/management/monitor/ThreadPoolAccTest.java b/test/jdk/javax/management/monitor/ThreadPoolAccTest.java
index 542fa9c657c..508cefddf94 100644
--- a/test/jdk/javax/management/monitor/ThreadPoolAccTest.java
+++ b/test/jdk/javax/management/monitor/ThreadPoolAccTest.java
@@ -30,13 +30,19 @@
  *
  * @run clean ThreadPoolAccTest
  * @run build ThreadPoolAccTest
+ *
+ * @run main/othervm ThreadPoolAccTest
  * @run main/othervm -Djava.security.manager=allow ThreadPoolAccTest
+ * @run main/othervm -Djava.security.manager=allow -DThreadPoolAccTest.useGetSubjectACC=true ThreadPoolAccTest
+ * @run main/othervm/policy=all.policy ThreadPoolAccTest
+ * @run main/othervm/policy=all.policy -DThreadPoolAccTest.useGetSubjectACC=true ThreadPoolAccTest
  */
 
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.Date;
 import java.util.Set;
+import java.util.concurrent.Callable;
 import javax.management.MBeanServer;
 import javax.management.MBeanServerFactory;
 import javax.management.ObjectName;
@@ -67,7 +73,9 @@ public String getString() {
             return "";
         }
         private void setPrincipal() {
-            Subject subject = Subject.getSubject(AccessController.getContext());
+            // Use Subject.current() unless test Property is set.
+            Subject subject = Boolean.getBoolean("ThreadPoolAccTest.useGetSubjectACC") ?
+                              Subject.getSubject(AccessController.getContext()) : Subject.current();
             Set<JMXPrincipal> principals = subject.getPrincipals(JMXPrincipal.class);
             principal = principals.iterator().next().getName();
         }
@@ -136,7 +144,9 @@ public Void run() {
                         return null;
                     }
                 };
-                Subject.doAs(subject, action);
+                // Subject.doAs(subject, action);
+                Callable<Void> c = (Callable<Void>) () -> action.run();
+                Subject.callAs(subject, c);
             }
 
             sleep(500); // wait for getX method to be called, which calls setPrincipal
diff --git a/test/jdk/javax/management/monitor/all.policy b/test/jdk/javax/management/monitor/all.policy
new file mode 100644
index 00000000000..cb9dbed32cc
--- /dev/null
+++ b/test/jdk/javax/management/monitor/all.policy
@@ -0,0 +1,3 @@
+grant {
+    permission java.security.AllPermission;
+};
diff --git a/test/jdk/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java b/test/jdk/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java
index 72ae5766307..8f8ef54eade 100644
--- a/test/jdk/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java
+++ b/test/jdk/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,9 @@
  * @bug 6199899
  * @summary Tests reconnection done by a fetching notif thread.
  * @author Shanliang JIANG
+ * @requires vm.compMode != "Xcomp"
+ * @comment Running with -Xcomp is likely to cause a timeout from ServerCommunicatorAdmin
+ *          before addNotificationListener can complete.
  *
  * @run clean NotifReconnectDeadlockTest
  * @run build NotifReconnectDeadlockTest
diff --git a/test/jdk/javax/management/remote/mandatory/notif/NotificationAccessControllerTest.java b/test/jdk/javax/management/remote/mandatory/notif/NotificationAccessControllerTest.java
index 352faea27d1..57db8588ed3 100644
--- a/test/jdk/javax/management/remote/mandatory/notif/NotificationAccessControllerTest.java
+++ b/test/jdk/javax/management/remote/mandatory/notif/NotificationAccessControllerTest.java
@@ -30,6 +30,8 @@
  *          java.management/com.sun.jmx.remote.security
  * @run clean NotificationAccessControllerTest
  * @run build NotificationAccessControllerTest
+ *
+ * @run main/othervm NotificationAccessControllerTest
  * @run main/othervm -Djava.security.manager=allow NotificationAccessControllerTest
  */
 
diff --git a/test/jdk/javax/management/remote/mandatory/notif/NotificationEmissionTest.java b/test/jdk/javax/management/remote/mandatory/notif/NotificationEmissionTest.java
index a4c57005853..e57636c87f6 100644
--- a/test/jdk/javax/management/remote/mandatory/notif/NotificationEmissionTest.java
+++ b/test/jdk/javax/management/remote/mandatory/notif/NotificationEmissionTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, 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,7 +31,9 @@
  *
  * @run clean NotificationEmissionTest
  * @run build NotificationEmissionTest
+ *
  * @run main NotificationEmissionTest 1
+ * @run main/othervm -Djava.security.manager=allow NotificationEmissionTest 1
  * @run main/othervm -Djava.security.manager=allow NotificationEmissionTest 2
  * @run main/othervm -Djava.security.manager=allow NotificationEmissionTest 3
  * @run main/othervm -Djava.security.manager=allow NotificationEmissionTest 4
diff --git a/test/jdk/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java b/test/jdk/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java
index f9e04a373f6..796507eeff3 100644
--- a/test/jdk/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java
+++ b/test/jdk/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java
@@ -30,6 +30,7 @@
  *
  * @run clean NonJMXPrincipalsTest SimpleStandard SimpleStandardMBean
  * @run build NonJMXPrincipalsTest SimpleStandard SimpleStandardMBean
+ * @run main/othervm NonJMXPrincipalsTest
  * @run main/othervm -Djava.security.manager=allow NonJMXPrincipalsTest
  */
 
diff --git a/test/jdk/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java b/test/jdk/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java
index d073553d3f5..ae3ec697b39 100644
--- a/test/jdk/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java
+++ b/test/jdk/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java
@@ -30,6 +30,8 @@
  *
  * @run clean PasswordAccessFileTest SimpleStandard SimpleStandardMBean
  * @run build PasswordAccessFileTest SimpleStandard SimpleStandardMBean
+ *
+ * @run main/othervm PasswordAccessFileTest
  * @run main/othervm -Djava.security.manager=allow PasswordAccessFileTest
  */
 
diff --git a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIAltAuthTest.java b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIAltAuthTest.java
index e86f9cc8f1a..13d94a87920 100644
--- a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIAltAuthTest.java
+++ b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIAltAuthTest.java
@@ -30,7 +30,10 @@
  *          java.management/com.sun.jmx.remote.security
  * @run clean RMIAltAuthTest
  * @run build RMIAltAuthTest SimpleStandard SimpleStandardMBean
+ *
+ * @run main/othervm RMIAltAuthTest
  * @run main/othervm -Djava.security.manager=allow RMIAltAuthTest
+ * @run main/othervm -Djava.security.manager=allow -DSimpleStandard.useGetSubjectACC=true RMIAltAuthTest
  */
 
 import java.io.File;
diff --git a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIPasswdAuthTest.java b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIPasswdAuthTest.java
index 87384e070cd..8897d34c4e8 100644
--- a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIPasswdAuthTest.java
+++ b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/RMIPasswdAuthTest.java
@@ -30,7 +30,10 @@
  *          java.management/com.sun.jmx.remote.security
  * @run clean RMIPasswdAuthTest
  * @run build RMIPasswdAuthTest SimpleStandard SimpleStandardMBean
+ *
+ * @run main/othervm RMIPasswdAuthTest
  * @run main/othervm -Djava.security.manager=allow RMIPasswdAuthTest
+ * @run main/othervm -Djava.security.manager=allow -DSimpleStandard.useGetSubjectACC=true RMIPasswdAuthTest
  */
 
 import java.io.File;
diff --git a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/SimpleStandard.java b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/SimpleStandard.java
index bc503b3e291..b5657498365 100644
--- a/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/SimpleStandard.java
+++ b/test/jdk/javax/management/remote/mandatory/passwordAuthenticator/SimpleStandard.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2024, 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
@@ -152,8 +152,8 @@ public int getNbResets() {
      * type JMXPrincipal and refers to the "monitorRole" identity.
      */
     private void checkSubject() {
-        AccessControlContext acc = AccessController.getContext();
-        Subject subject = Subject.getSubject(acc);
+        Subject subject = Boolean.getBoolean("SimpleStandard.useGetSubjectACC") ?
+                          Subject.getSubject(AccessController.getContext()) : Subject.current();
         Set principals = subject.getPrincipals();
         Principal principal = (Principal) principals.iterator().next();
         if (!(principal instanceof JMXPrincipal))
diff --git a/test/jdk/javax/management/security/AuthorizationTest.java b/test/jdk/javax/management/security/AuthorizationTest.java
index 2c48dbffb56..cdb412e139b 100644
--- a/test/jdk/javax/management/security/AuthorizationTest.java
+++ b/test/jdk/javax/management/security/AuthorizationTest.java
@@ -29,9 +29,15 @@
  * @modules java.management.rmi
  * @library /test/lib
  * @compile Simple.java
+ *
+ * @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials
+ * @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username2 -Dpassword=password2 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedSetException -expectedInvokeException
+ * @run main/othervm/timeout=300 -DDEBUG_STANDARD -Dusername=username6 -Dpassword=password6 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException
+ *
  * @run main/othervm/timeout=300 -Djava.security.manager=allow -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials
  * @run main/othervm/timeout=300 -Djava.security.manager=allow -DDEBUG_STANDARD -Dusername=username2 -Dpassword=password2 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedSetException -expectedInvokeException
  * @run main/othervm/timeout=300 -Djava.security.manager=allow -DDEBUG_STANDARD -Dusername=username6 -Dpassword=password6 AuthorizationTest -server -mapType x.access.file;x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException
+ *
  * @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username1 -Dpassword=password1 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials
  * @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username3 -Dpassword=password3 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials -expectedGetException
  * @run main/othervm/timeout=300/policy=java.policy.authorization -DDEBUG_STANDARD -Dusername=username5 -Dpassword=password5 AuthorizationTest -server -mapType x.password.file -populate -client -mapType credentials -expectedCreateException -expectedGetException -expectedSetException -expectedInvokeException
diff --git a/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java b/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java
index 37c252bc6f0..498c17672b2 100644
--- a/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java
+++ b/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java
@@ -40,20 +40,25 @@ public static void main(String[] args) throws Exception {
 
         // Initial client session
         TLSBase.Client client1 = new TLSBase.Client(true, false);
-        if (server.getSession(client1).getSessionContext() == null) {
-            for (Exception e : server.getExceptionList()) {
-                System.out.println("Looking at " + e.getClass() + " " +
-                    e.getMessage());
-                if (e.getMessage().contains(args[0])) {
-                    System.out.println("Found correct exception: " + args[0] +
+
+        server.getSession(client1).getSessionContext();
+        server.done();
+
+        var eList = server.getExceptionList();
+        System.out.println("Exception list size is " + eList.size());
+
+        for (Exception e : eList) {
+            System.out.println("Looking at " + e.getClass() + " " +
+                e.getMessage());
+            if (e.getMessage().contains(args[0])) {
+                System.out.println("Found correct exception: " + args[0] +
                     " in " + e.getMessage());
-                    return;
-                } else {
-                    System.out.println("No \"" + args[0] + "\" found.");
-                }
+                return;
+            } else {
+                System.out.println("No \"" + args[0] + "\" found.");
             }
-
-            throw new Exception("Failed to find expected alert: " + args[0]);
         }
+
+        throw new Exception("Failed to find expected alert: " + args[0]);
     }
 }
diff --git a/test/jdk/javax/net/ssl/templates/TLSBase.java b/test/jdk/javax/net/ssl/templates/TLSBase.java
index 812aea09fea..5c95253e6f0 100644
--- a/test/jdk/javax/net/ssl/templates/TLSBase.java
+++ b/test/jdk/javax/net/ssl/templates/TLSBase.java
@@ -97,8 +97,8 @@ public void write(SSLSocket sock, byte[] data) throws Exception {
     private static KeyManager[] getKeyManager(boolean empty) throws Exception {
         FileInputStream fis = null;
         if (!empty) {
-            fis = new FileInputStream(System.getProperty("test.src", "./") + "/" + pathToStores +
-                "/" + keyStoreFile);
+            fis = new FileInputStream(System.getProperty("test.src", "./") +
+                "/" + pathToStores + "/" + keyStoreFile);
         }
         // Load the keystore
         char[] pwd = passwd.toCharArray();
@@ -113,8 +113,8 @@ private static KeyManager[] getKeyManager(boolean empty) throws Exception {
     private static TrustManager[] getTrustManager(boolean empty) throws Exception {
         FileInputStream fis = null;
         if (!empty) {
-            fis = new FileInputStream(System.getProperty("test.src", "./") + "/" + pathToStores +
-                "/" + trustStoreFile);
+            fis = new FileInputStream(System.getProperty("test.src", "./") +
+                "/" + pathToStores + "/" + trustStoreFile);
         }
         // Load the keystore
         KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
@@ -148,7 +148,6 @@ static class Server extends TLSBase {
         // Clients sockets are kept in a hash table with the port as the key.
         ConcurrentHashMap<Integer, SSLSocket> clientMap =
                 new ConcurrentHashMap<>();
-        boolean exit = false;
         Thread t;
         List<Exception> exceptionList = new ArrayList<>();
 
@@ -157,13 +156,14 @@ static class Server extends TLSBase {
             name = "server";
             try {
                 sslContext = SSLContext.getInstance("TLS");
-                sslContext.init(TLSBase.getKeyManager(builder.km), TLSBase.getTrustManager(builder.tm), null);
+                sslContext.init(TLSBase.getKeyManager(builder.km),
+                    TLSBase.getTrustManager(builder.tm), null);
                 fac = sslContext.getServerSocketFactory();
                 ssock = (SSLServerSocket) fac.createServerSocket(0);
                 ssock.setNeedClientAuth(builder.clientauth);
                 serverPort = ssock.getLocalPort();
             } catch (Exception e) {
-                System.err.println(e.getMessage());
+                System.err.println("Failure during server initialization");
                 e.printStackTrace();
             }
 
@@ -178,6 +178,7 @@ static class Server extends TLSBase {
                         try {
                             write(c, read(c));
                         } catch (Exception e) {
+                            System.out.println("Caught " + e.getMessage());
                             e.printStackTrace();
                             exceptionList.add(e);
                         }
@@ -203,13 +204,14 @@ static class Server extends TLSBase {
             name = "server";
             try {
                 sslContext = SSLContext.getInstance("TLS");
-                sslContext.init(TLSBase.getKeyManager(km), TLSBase.getTrustManager(tm), null);
+                sslContext.init(TLSBase.getKeyManager(km),
+                    TLSBase.getTrustManager(tm), null);
                 fac = sslContext.getServerSocketFactory();
                 ssock = (SSLServerSocket) fac.createServerSocket(0);
                 ssock.setNeedClientAuth(true);
                 serverPort = ssock.getLocalPort();
             } catch (Exception e) {
-                System.err.println(e.getMessage());
+                System.err.println("Failure during server initialization");
                 e.printStackTrace();
             }
 
@@ -224,7 +226,9 @@ static class Server extends TLSBase {
                             try {
                                 write(c, read(c));
                             } catch (Exception e) {
+                                System.out.println("Caught " + e.getMessage());
                                 e.printStackTrace();
+                                exceptionList.add(e);
                             }
                         }
                     } catch (Exception ex) {
@@ -239,7 +243,7 @@ static class Server extends TLSBase {
         // test or the test will never end.
         void done() {
             try {
-                t.interrupt();
+                t.join(5000);
                 ssock.close();
             } catch (Exception e) {
                 System.err.println(e.getMessage());
diff --git a/test/jdk/javax/swing/JFileChooser/TABTestONFCExit.java b/test/jdk/javax/swing/JFileChooser/TABTestONFCExit.java
new file mode 100644
index 00000000000..16fcc9d1208
--- /dev/null
+++ b/test/jdk/javax/swing/JFileChooser/TABTestONFCExit.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2024, 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.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.Point;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+
+import javax.swing.AbstractButton;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JTable;
+import javax.swing.JToggleButton;
+import javax.swing.SwingUtilities;
+import javax.swing.WindowConstants;
+import javax.swing.UIManager;
+import javax.swing.table.DefaultTableModel;
+
+import java.util.function.Predicate;
+
+/*
+ * @test
+ * @bug 6967482
+ * @key headful
+ * @summary Test to check if TAB is working on JTable after JFileChooser is
+ *          closed
+ * @run main TABTestONFCExit
+ */
+
+public class TABTestONFCExit {
+    private static JTable table;
+    private static JFileChooser fc;
+    private static JFrame frame;
+    private static Robot robot;
+    private static volatile Point loc;
+    private static volatile Rectangle rect;
+    private static volatile int selectedColumnBeforeTabPress;
+    private static volatile int selectedColumnAfterTabPress;
+
+    public static void main(String[] args) throws Exception {
+        robot = new Robot();
+        robot.setAutoDelay(50);
+        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
+        try {
+            SwingUtilities.invokeAndWait(TABTestONFCExit::initialize);
+            robot.waitForIdle();
+            robot.delay(100);
+
+            SwingUtilities.invokeAndWait(TABTestONFCExit::clickDetails);
+            robot.waitForIdle();
+            robot.delay(100);
+
+            SwingUtilities.invokeAndWait(() -> {
+                loc = table.getLocationOnScreen();
+                rect = table.getCellRect(0, 0, true);
+            });
+
+            onClick(loc, rect);
+
+            SwingUtilities.invokeAndWait(() ->
+                    selectedColumnBeforeTabPress = table.getSelectedColumn());
+
+            robot.keyPress(KeyEvent.VK_TAB);
+            robot.keyRelease(KeyEvent.VK_TAB);
+            robot.waitForIdle();
+            robot.delay(100);
+
+            SwingUtilities.invokeAndWait(() ->
+                    selectedColumnAfterTabPress = table.getSelectedColumn());
+            robot.waitForIdle();
+            robot.delay(100);
+
+            if (selectedColumnAfterTabPress == selectedColumnBeforeTabPress) {
+                throw new RuntimeException("TAB failed to move cell!");
+            }
+            System.out.println("Test Passed" );
+
+        } finally {
+            SwingUtilities.invokeAndWait(() -> {
+                if (frame != null) {
+                    frame.dispose();
+                }
+            });
+        }
+    }
+
+    private static void onClick(Point loc, Rectangle cellRect) {
+        robot.mouseMove(loc.x + cellRect.x + cellRect.width / 2,
+                loc.y + cellRect.y + cellRect.height / 2);
+        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
+        robot.waitForIdle();
+        robot.delay(100);
+    }
+
+    private static void initialize() {
+        frame = new JFrame("Tab Test");
+        fc = new JFileChooser();
+        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+        frame.add(getJTable(), BorderLayout.NORTH);
+        frame.add(fc, BorderLayout.SOUTH);
+        frame.pack();
+        frame.setVisible(true);
+    }
+
+    private static JTable getJTable() {
+        if (table == null) {
+            table = new JTable();
+            table.setModel(new DefaultTableModel(5, 5));
+        }
+        return table;
+    }
+    private static void clickDetails() {
+        AbstractButton details = findDetailsButton(fc);
+        if (details == null) {
+            throw new Error("Couldn't find 'Details' button in JFileChooser");
+        }
+        details.doClick();
+    }
+
+    private static AbstractButton findDetailsButton(final Container container) {
+        Component result = findComponent(container,
+                c -> c instanceof JToggleButton button
+                        && "Details".equals(button.getToolTipText()));
+        return (AbstractButton) result;
+    }
+
+    private static Component findComponent(final Container container,
+                                           final Predicate<Component> predicate) {
+        for (Component child : container.getComponents()) {
+            if (predicate.test(child)) {
+                return child;
+            }
+            if (child instanceof Container cont && cont.getComponentCount() > 0) {
+                Component result = findComponent(cont, predicate);
+                if (result != null) {
+                    return result;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/test/jdk/javax/swing/JMenu/TestUngrab.java b/test/jdk/javax/swing/JMenu/TestUngrab.java
index 64326009c6c..ca738dabcb0 100644
--- a/test/jdk/javax/swing/JMenu/TestUngrab.java
+++ b/test/jdk/javax/swing/JMenu/TestUngrab.java
@@ -27,7 +27,6 @@
  * @test
  * @bug 8267374
  * @key headful
- * @requires (os.family == "mac")
  * @summary Verifies menu closes when main window is resized
  * @run main TestUngrab
  */
diff --git a/test/jdk/javax/swing/JPopupMenu/MouseDragPopupTest.java b/test/jdk/javax/swing/JPopupMenu/MouseDragPopupTest.java
new file mode 100644
index 00000000000..e34b53d0360
--- /dev/null
+++ b/test/jdk/javax/swing/JPopupMenu/MouseDragPopupTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2024, 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.awt.Dimension;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+
+/*
+ * @test
+ * @bug 8315655
+ * @summary Verifies Right click and dragging over a component with a popup menu will not open the popup
+ * @key headful
+ * @run main MouseDragPopupTest
+ */
+public class MouseDragPopupTest {
+    static JFrame frame;
+    static JPanel panel;
+    static Robot robot;
+    static volatile boolean failed;
+    static volatile Point srcPoint;
+    static volatile Dimension d;
+
+    public static void main(String[] args) throws Exception {
+        try {
+            robot = new Robot();
+            robot.setAutoWaitForIdle(true);
+            robot.setAutoDelay(100);
+
+            SwingUtilities.invokeAndWait(() -> {
+                createAndShowGUI();
+            });
+            robot.delay(1000);
+
+            SwingUtilities.invokeAndWait(() -> {
+                srcPoint = frame.getLocationOnScreen();
+                d = frame.getSize();
+            });
+            srcPoint.translate(2 * d.width / 3, 3 * d.height / 4);
+
+            final Point dstPoint = new Point(srcPoint);
+            dstPoint.translate(4 * d.width / 15, 0);
+
+            robot.mouseMove(srcPoint.x, srcPoint.y);
+
+            robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
+
+            while (!srcPoint.equals(dstPoint)) {
+                srcPoint.translate(sign(dstPoint.x - srcPoint.x), 0);
+                robot.mouseMove(srcPoint.x, srcPoint.y);
+            }
+
+            if (failed) {
+                throw new RuntimeException("Popup was shown, Test Failed.");
+            }
+        } finally {
+            robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
+            SwingUtilities.invokeAndWait(() -> {
+                if (frame != null) {
+                    frame.dispose();
+                }
+            });
+        }
+    }
+
+    public static int sign(int n) {
+        return n < 0 ? -1 : n == 0 ? 0 : 1;
+    }
+
+    static void createAndShowGUI() {
+        frame = new JFrame("MouseDragPopupTest");
+        panel = new JPanel();
+        JPanel innerPanel = new JPanel();
+        JPopupMenu menu = new JPopupMenu();
+
+        menu.addPopupMenuListener(new PopupMenuListener() {
+            @Override
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                failed = true;
+            }
+
+            @Override
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
+
+            @Override
+            public void popupMenuCanceled(PopupMenuEvent e) {}
+        });
+
+        menu.add("This should not appear");
+        innerPanel.setComponentPopupMenu(menu);
+
+        panel.add(new JLabel("Right click and drag from here"));
+        panel.add(innerPanel);
+        panel.add(new JLabel("to here"));
+
+        frame.add(panel);
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.pack();
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+    }
+}
diff --git a/test/jdk/javax/swing/JSplitPane/TestSplitPaneEnableTest.java b/test/jdk/javax/swing/JSplitPane/TestSplitPaneEnableTest.java
new file mode 100644
index 00000000000..0172e4b5242
--- /dev/null
+++ b/test/jdk/javax/swing/JSplitPane/TestSplitPaneEnableTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2024, 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 5021949
+ * @summary  Verifies JSplitPane setEnabled(false) disables one touch expandable clicks
+ * @run main TestSplitPaneEnableTest
+ */
+
+import java.awt.Point;
+import java.awt.event.InputEvent;
+import javax.swing.JButton;
+import javax.swing.JSplitPane;
+import javax.swing.plaf.basic.BasicSplitPaneDivider;
+import javax.swing.plaf.basic.BasicSplitPaneUI;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+public class TestSplitPaneEnableTest {
+    private static JButton leftOneTouchButton;
+    private static JButton rightOneTouchButton;
+
+    private static void setLookAndFeel(UIManager.LookAndFeelInfo laf) {
+        try {
+            UIManager.setLookAndFeel(laf.getClassName());
+        } catch (UnsupportedLookAndFeelException ignored) {
+            System.out.println("Unsupported LAF: " + laf.getClassName());
+        } catch (ClassNotFoundException | InstantiationException
+                 | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
+            if (laf.getClassName().toLowerCase().contains("gtk")) {
+                continue;
+            }
+            System.out.println("Testing LAF : " + laf.getClassName());
+
+            SwingUtilities.invokeAndWait(() -> {
+                setLookAndFeel(laf);
+                JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
+                                                new JButton("Left"), new JButton("Right"));
+                jsp.setUI(new TestSplitPaneUI());
+                jsp.setOneTouchExpandable(true);
+                jsp.setEnabled(false);
+                if (leftOneTouchButton.isEnabled()) {
+                    throw new RuntimeException("leftButton is enabled for disabled JSplitPane");
+                }
+                if (rightOneTouchButton.isEnabled()) {
+                    throw new RuntimeException("rightButton is enabled for disabled JSplitPane");
+                }
+
+            });
+        }
+    }
+
+    static class TestSplitPaneUI extends BasicSplitPaneUI {
+
+        public TestSplitPaneUI() {
+            super();
+        }
+
+        public BasicSplitPaneDivider createDefaultDivider() {
+            return new TestSplitPaneDivider(this);
+        }
+    }
+
+    static class TestSplitPaneDivider extends BasicSplitPaneDivider {
+
+        public TestSplitPaneDivider(BasicSplitPaneUI ui) {
+            super(ui);
+        }
+
+        protected JButton createLeftOneTouchButton() {
+            leftOneTouchButton = super.createLeftOneTouchButton();
+            return leftOneTouchButton;
+        }
+
+        protected JButton createRightOneTouchButton() {
+            rightOneTouchButton = super.createRightOneTouchButton();
+            return rightOneTouchButton;
+        }
+    }
+}
+
diff --git a/test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java b/test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java
index 6cf6231bb8b..4f338601dc6 100644
--- a/test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java
+++ b/test/jdk/javax/swing/JTabbedPane/4361477/bug4361477.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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,8 +30,7 @@
  * @test
  * @key headful
  * @bug 4361477
- * @summary JTabbedPane throws ArrayOutOfBoundsException
- * @author Oleg Mokhovikov
+ * @summary JTabbedPane throws ArrayIndexOutOfBoundsException
  * @run main bug4361477
  */
 public class bug4361477 {
diff --git a/test/jdk/jdk/classfile/AdaptCodeTest.java b/test/jdk/jdk/classfile/AdaptCodeTest.java
index 2a75cd7e020..2b9dff58819 100644
--- a/test/jdk/jdk/classfile/AdaptCodeTest.java
+++ b/test/jdk/jdk/classfile/AdaptCodeTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -59,7 +59,7 @@ void testNullAdaptIterator() throws Exception {
         var cc = ClassFile.of();
         ClassModel cm = cc.parse(testClassPath);
         for (ClassTransform t : Transforms.noops) {
-            byte[] newBytes = cc.transform(cm, t);
+            byte[] newBytes = cc.transformClass(cm, t);
             String result = (String)
                     new ByteArrayClassLoader(AdaptCodeTest.class.getClassLoader(), testClassName, newBytes)
                             .getMethod(testClassName, "many")
@@ -79,7 +79,7 @@ void testNullAdaptIterator2(String path) throws Exception {
         var cc = ClassFile.of();
         ClassModel cm = cc.parse(fs.getPath(path));
         for (ClassTransform t : Transforms.noops) {
-            byte[] newBytes = cc.transform(cm, t);
+            byte[] newBytes = cc.transformClass(cm, t);
         }
     }
 
@@ -101,7 +101,7 @@ void testSevenOfThirteenIterator() throws Exception {
             }
         });
 
-        byte[] newBytes = cc.transform(cm, transform);
+        byte[] newBytes = cc.transformClass(cm, transform);
 //        Files.write(Path.of("foo.class"), newBytes);
         String result = (String)
                 new ByteArrayClassLoader(AdaptCodeTest.class.getClassLoader(), testClassName, newBytes)
diff --git a/test/jdk/jdk/classfile/AdvancedTransformationsTest.java b/test/jdk/jdk/classfile/AdvancedTransformationsTest.java
index 88792eedcf1..6c7194271a4 100644
--- a/test/jdk/jdk/classfile/AdvancedTransformationsTest.java
+++ b/test/jdk/jdk/classfile/AdvancedTransformationsTest.java
@@ -77,7 +77,7 @@ void testShiftLocals() throws Exception {
         try (var in = StackMapGenerator.class.getResourceAsStream("StackMapGenerator.class")) {
             var cc = ClassFile.of();
             var clm = cc.parse(in.readAllBytes());
-            cc.verify(cc.transform(clm, (clb, cle) -> {
+            cc.verify(cc.transformClass(clm, (clb, cle) -> {
                 if (cle instanceof MethodModel mm) {
                     clb.transformMethod(mm, (mb, me) -> {
                         if (me instanceof CodeModel com) {
@@ -303,7 +303,7 @@ private static byte[] instrument(ClassModel target, ClassModel instrumentor, Pre
         var targetFieldNames = target.fields().stream().map(f -> f.fieldName().stringValue()).collect(Collectors.toSet());
         var targetMethods = target.methods().stream().map(m -> m.methodName().stringValue() + m.methodType().stringValue()).collect(Collectors.toSet());
         var instrumentorClassRemapper = ClassRemapper.of(Map.of(instrumentor.thisClass().asSymbol(), target.thisClass().asSymbol()));
-        return ClassFile.of().transform(target,
+        return ClassFile.of().transformClass(target,
                 ClassTransform.transformingMethods(
                         instrumentedMethodsFilter,
                         (mb, me) -> {
@@ -334,7 +334,7 @@ private static byte[] instrument(ClassModel target, ClassModel instrumentor, Pre
 
                                                 //inlined target locals must be shifted based on the actual instrumentor locals
                                                 codeBuilder.block(inlinedBlockBuilder -> inlinedBlockBuilder
-                                                        .transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol())
+                                                    .transform(targetCodeModel, CodeLocalsShifter.of(mm.flags(), mm.methodTypeSymbol())
                                                         .andThen(CodeRelabeler.of())
                                                         .andThen((innerBuilder, shiftedTargetCode) -> {
                                                             //returns must be replaced with jump to the end of the inlined method
diff --git a/test/jdk/jdk/classfile/BSMTest.java b/test/jdk/jdk/classfile/BSMTest.java
index 927549f0210..d0cc87d7493 100644
--- a/test/jdk/jdk/classfile/BSMTest.java
+++ b/test/jdk/jdk/classfile/BSMTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -60,7 +60,7 @@ public class BSMTest {
     void testSevenOfThirteenIterator() throws Exception {
         var cc = ClassFile.of();
         ClassModel cm = cc.parse(testClassPath);
-        byte[] newBytes = cc.transform(cm, (cb, ce) -> {
+        byte[] newBytes = cc.transformClass(cm, (cb, ce) -> {
             if (ce instanceof MethodModel mm) {
                 cb.transformMethod(mm, (mb, me) -> {
                     if (me instanceof CodeModel xm) {
diff --git a/test/jdk/jdk/classfile/ClassBuildingTest.java b/test/jdk/jdk/classfile/ClassBuildingTest.java
index 83c794ae879..bf6380ae8fe 100644
--- a/test/jdk/jdk/classfile/ClassBuildingTest.java
+++ b/test/jdk/jdk/classfile/ClassBuildingTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -59,7 +59,7 @@ public void test() throws Throwable {
         transform = transform.andThen(ClassTransform.transformingMethods(MethodTransform.dropping(me
                 -> me instanceof SignatureAttribute)));
 
-        MethodHandles.lookup().defineClass(cc.transform(cm, transform));
+        MethodHandles.lookup().defineClass(cc.transformClass(cm, transform));
     }
 }
 
diff --git a/test/jdk/jdk/classfile/ClassHierarchyInfoTest.java b/test/jdk/jdk/classfile/ClassHierarchyInfoTest.java
index b8eadeda5e1..4065f1d5e2f 100644
--- a/test/jdk/jdk/classfile/ClassHierarchyInfoTest.java
+++ b/test/jdk/jdk/classfile/ClassHierarchyInfoTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -122,7 +122,7 @@ void transformAndVerify(ClassHierarchyResolver res) throws Exception {
     void transformAndVerifySingle(ClassHierarchyResolver res) throws Exception {
         Path path = FileSystems.getFileSystem(URI.create("jrt:/")).getPath("modules/java.base/java/util/HashMap.class");
         var classModel = ClassFile.of().parse(path);
-        byte[] newBytes = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(res)).transform(classModel,
+        byte[] newBytes = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(res)).transformClass(classModel,
                 (clb, cle) -> {
                     if (cle instanceof MethodModel mm) {
                         clb.transformMethod(mm, (mb, me) -> {
diff --git a/test/jdk/jdk/classfile/CorpusTest.java b/test/jdk/jdk/classfile/CorpusTest.java
index 21e275a837d..67a2ebabb31 100644
--- a/test/jdk/jdk/classfile/CorpusTest.java
+++ b/test/jdk/jdk/classfile/CorpusTest.java
@@ -79,7 +79,7 @@ class CorpusTest {
     static void splitTableAttributes(String sourceClassFile, String targetClassFile) throws IOException, URISyntaxException {
         var root = Paths.get(URI.create(CorpusTest.class.getResource("CorpusTest.class").toString())).getParent();
         var cc = ClassFile.of();
-        Files.write(root.resolve(targetClassFile), cc.transform(cc.parse(root.resolve(sourceClassFile)), ClassTransform.transformingMethodBodies((cob, coe) -> {
+        Files.write(root.resolve(targetClassFile), cc.transformClass(cc.parse(root.resolve(sourceClassFile)), ClassTransform.transformingMethodBodies((cob, coe) -> {
             var dcob = (DirectCodeBuilder)cob;
             var curPc = dcob.curPc();
             switch (coe) {
@@ -117,7 +117,7 @@ public void writeBody(BufWriter b) {
     static Path[] corpus() throws IOException, URISyntaxException {
         splitTableAttributes("testdata/Pattern2.class", "testdata/Pattern2-split.class");
         return Stream.of(
-                Files.walk(JRT.getPath("modules/java.base/java")),
+                Files.walk(JRT.getPath("modules/java.base/java/util")),
                 Files.walk(JRT.getPath("modules"), 2).filter(p -> p.endsWith("module-info.class")),
                 Files.walk(Paths.get(URI.create(CorpusTest.class.getResource("CorpusTest.class").toString())).getParent()))
                 .flatMap(p -> p)
@@ -140,13 +140,14 @@ void testNullAdaptations(Path path) throws Exception {
         for (Transforms.NoOpTransform m : Transforms.NoOpTransform.values()) {
             if (m == Transforms.NoOpTransform.ARRAYCOPY
                 || m == Transforms.NoOpTransform.SHARED_3_NO_STACKMAP
+                || m == Transforms.NoOpTransform.CLASS_REMAPPER
                 || m.name().startsWith("ASM"))
                 continue;
 
             try {
                 byte[] transformed = m.shared && m.classTransform != null
                                      ? ClassFile.of(ClassFile.StackMapsOption.DROP_STACK_MAPS)
-                                                .transform(ClassFile.of().parse(bytes), m.classTransform)
+                                                .transformClass(ClassFile.of().parse(bytes), m.classTransform)
                                      : m.transform.apply(bytes);
                 Map<Integer, Integer> newDups = findDups(transformed);
                 oldRecord = m.classRecord(bytes);
@@ -190,12 +191,8 @@ void testNullAdaptations(Path path) throws Exception {
                                  .collect(joining("\n"));
             fail(String.format("Errors in testNullAdapt: %s", msg));
         }
-    }
 
-    @ParameterizedTest
-    @MethodSource("corpus")
-    void testReadAndTransform(Path path) throws IOException {
-        byte[] bytes = Files.readAllBytes(path);
+        // test read and transform
         var cc = ClassFile.of();
         var classModel = cc.parse(bytes);
         assertEqualsDeep(ClassRecord.ofClassModel(classModel), ClassRecord.ofStreamingElements(classModel),
@@ -213,7 +210,7 @@ void testReadAndTransform(Path path) throws IOException {
 
         //testing maxStack and maxLocals are calculated identically by StackMapGenerator and StackCounter
         byte[] noStackMaps = ClassFile.of(ClassFile.StackMapsOption.DROP_STACK_MAPS)
-                                      .transform(newModel,
+                                      .transformClass(newModel,
                                                          ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL));
         var noStackModel = cc.parse(noStackMaps);
         var itStack = newModel.methods().iterator();
diff --git a/test/jdk/jdk/classfile/DiscontinuedInstructionsTest.java b/test/jdk/jdk/classfile/DiscontinuedInstructionsTest.java
index be7e425c694..9070f0b1d45 100644
--- a/test/jdk/jdk/classfile/DiscontinuedInstructionsTest.java
+++ b/test/jdk/jdk/classfile/DiscontinuedInstructionsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -74,7 +74,7 @@ void testJsrAndRetProcessing() throws Exception {
                 .invoke(null, list);
         assertEquals(list, List.of("Hello", "World"));
 
-        bytes = cc.transform(cc.parse(bytes), ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL));
+        bytes = cc.transformClass(cc.parse(bytes), ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL));
 
         new ByteArrayClassLoader(DiscontinuedInstructionsTest.class.getClassLoader(), testClass, bytes)
                 .getMethod(testClass, testMethod)
@@ -84,17 +84,17 @@ void testJsrAndRetProcessing() throws Exception {
         var clm = cc.parse(bytes);
 
         //test failover stack map generation
-        cc.transform(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)
+        cc.transformClass(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)
                  .andThen(ClassTransform.endHandler(clb -> clb.withVersion(JAVA_6_VERSION, 0))));
 
         //test failure of stack map generation for Java 7
         assertThrows(IllegalArgumentException.class, () ->
-                cc.transform(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)
+                cc.transformClass(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)
                          .andThen(ClassTransform.endHandler(clb -> clb.withVersion(JAVA_7_VERSION, 0)))));
 
         //test failure of stack map generation when enforced to generate
         assertThrows(IllegalArgumentException.class, () ->
                 ClassFile.of(ClassFile.StackMapsOption.GENERATE_STACK_MAPS)
-                         .transform(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)));
+                         .transformClass(clm, ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)));
     }
 }
diff --git a/test/jdk/jdk/classfile/LvtTest.java b/test/jdk/jdk/classfile/LvtTest.java
index 7c60d75823a..7fb289cc175 100644
--- a/test/jdk/jdk/classfile/LvtTest.java
+++ b/test/jdk/jdk/classfile/LvtTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -108,7 +108,7 @@ void buildLVTEntries() throws Exception {
         ClassModel c = cc.parse(fileBytes);
 
         // Compare transformed model and original with CodeBuilder filter
-        byte[] newClass = cc.transform(c, Transforms.threeLevelNoop);
+        byte[] newClass = cc.transformClass(c, Transforms.threeLevelNoop);
         ClassRecord orig = ClassRecord.ofClassModel(cc.parse(fileBytes), ClassRecord.CompatibilityFilter.By_ClassBuilder);
         ClassRecord transformed = ClassRecord.ofClassModel(cc.parse(newClass), ClassRecord.CompatibilityFilter.By_ClassBuilder);
         ClassRecord.assertEqualsDeep(transformed, orig);
diff --git a/test/jdk/jdk/classfile/MassAdaptCopyCodeTest.java b/test/jdk/jdk/classfile/MassAdaptCopyCodeTest.java
index 423ea91802a..067bce8b75f 100644
--- a/test/jdk/jdk/classfile/MassAdaptCopyCodeTest.java
+++ b/test/jdk/jdk/classfile/MassAdaptCopyCodeTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -80,7 +80,7 @@ void copy(String name, byte[] bytes) throws Exception {
     }
 
     public byte[] adaptCopy(ClassModel cm) {
-        return ClassFile.of().transform(cm, (cb, ce) -> {
+        return ClassFile.of().transformClass(cm, (cb, ce) -> {
             if (ce instanceof MethodModel mm) {
                 cb.transformMethod(mm, (mb, me) -> {
                     if (me instanceof CodeModel xm) {
diff --git a/test/jdk/jdk/classfile/MassAdaptCopyPrimitiveMatchCodeTest.java b/test/jdk/jdk/classfile/MassAdaptCopyPrimitiveMatchCodeTest.java
index 0ac9de70472..67e20be0ad3 100644
--- a/test/jdk/jdk/classfile/MassAdaptCopyPrimitiveMatchCodeTest.java
+++ b/test/jdk/jdk/classfile/MassAdaptCopyPrimitiveMatchCodeTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -99,7 +99,7 @@ void copy(String name, byte[] bytes) throws Exception {
         Map<String, byte[]> m2b = new HashMap<>();
         Map<String, CodeAttribute> m2c = new HashMap<>();
         byte[] resultBytes =
-                cc.transform(cm, (cb, e) -> {
+                cc.transformClass(cm, (cb, e) -> {
                     if (e instanceof MethodModel mm) {
                         Optional<CodeModel> code = mm.code();
                         if (code.isPresent()) {
diff --git a/test/jdk/jdk/classfile/OptionsTest.java b/test/jdk/jdk/classfile/OptionsTest.java
index eecc2d7a385..10e3855b060 100644
--- a/test/jdk/jdk/classfile/OptionsTest.java
+++ b/test/jdk/jdk/classfile/OptionsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -62,7 +62,7 @@ static Path[] corpus() throws IOException, URISyntaxException {
     @MethodSource("corpus")
     void testAttributesProcessingOptionOnTransform(Path path) throws Exception {
         testNoUnstable(path, ClassFile.of().parse(
-                ClassFile.of(ClassFile.AttributesProcessingOption.DROP_UNSTABLE_ATRIBUTES).transform(
+                ClassFile.of(ClassFile.AttributesProcessingOption.DROP_UNSTABLE_ATRIBUTES).transformClass(
                             ClassFile.of().parse(path),
                             ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL))));
     }
@@ -108,7 +108,7 @@ void testUnknownAttribute() throws Exception {
 
         //test drop unknown at transform
         assertTrue(ClassFile.of().parse(
-                ClassFile.of(ClassFile.AttributesProcessingOption.DROP_UNKNOWN_ATTRIBUTES).transform(
+                ClassFile.of(ClassFile.AttributesProcessingOption.DROP_UNKNOWN_ATTRIBUTES).transformClass(
                         ClassFile.of().parse(classBytes),
                         ClassTransform.ACCEPT_ALL)).attributes().isEmpty());
     }
diff --git a/test/jdk/jdk/classfile/ShortJumpsFixTest.java b/test/jdk/jdk/classfile/ShortJumpsFixTest.java
index a259795b551..63e9f0bf904 100644
--- a/test/jdk/jdk/classfile/ShortJumpsFixTest.java
+++ b/test/jdk/jdk/classfile/ShortJumpsFixTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -136,7 +136,7 @@ void testFailBackJumpsDirectGen(Sample sample) throws Exception {
     @MethodSource("provideFwd")
     void testFixFwdJumpsTransform(Sample sample) throws Exception {
         assertFixed(sample,
-                    CC_Fixed_Jumps.transform(
+                    CC_Fixed_Jumps.transformClass(
                             generateFwd(CC_No_Stack_No_Patch, sample, false),
                             overflow()));
     }
@@ -145,7 +145,7 @@ void testFixFwdJumpsTransform(Sample sample) throws Exception {
     @MethodSource("provideBack")
     void testFixBackJumpsTransform(Sample sample) throws Exception {
         assertFixed(sample,
-                    CC_Fixed_Jumps.transform(
+                    CC_Fixed_Jumps.transformClass(
                             generateBack(CC_No_Stack_No_Patch, sample, false),
                             overflow()));
     }
@@ -154,7 +154,7 @@ void testFixBackJumpsTransform(Sample sample) throws Exception {
     @MethodSource("provideFwd")
     void testFailFwdJumpsTransform(Sample sample) throws Exception {
         assertThrows(IllegalArgumentException.class, () ->
-                     CC_Not_Fixed_Jumps.transform(
+                     CC_Not_Fixed_Jumps.transformClass(
                             generateFwd(CC_No_Stack_No_Patch, sample, false),
                             overflow()));
     }
@@ -163,7 +163,7 @@ void testFailFwdJumpsTransform(Sample sample) throws Exception {
     @MethodSource("provideBack")
     void testFailBackJumpsTransform(Sample sample) throws Exception {
         assertThrows(IllegalArgumentException.class, () ->
-                     CC_Not_Fixed_Jumps.transform(
+                     CC_Not_Fixed_Jumps.transformClass(
                             generateBack(CC_No_Stack_No_Patch, sample, false),
                             overflow()));
     }
@@ -172,7 +172,7 @@ void testFailBackJumpsTransform(Sample sample) throws Exception {
     @MethodSource("provideFwd")
     void testFixFwdJumpsChainedTransform(Sample sample) throws Exception {
         assertFixed(sample,
-                    CC_Fixed_Jumps.transform(
+                    CC_Fixed_Jumps.transformClass(
                             generateFwd(CC_No_Stack_No_Patch, sample, false),
                             ClassTransform.ACCEPT_ALL.andThen(overflow()))); //involve BufferedCodeBuilder here
     }
@@ -181,7 +181,7 @@ void testFixFwdJumpsChainedTransform(Sample sample) throws Exception {
     @MethodSource("provideBack")
     void testFixBackJumpsChainedTransform(Sample sample) throws Exception {
         assertFixed(sample,
-                    CC_Fixed_Jumps.transform(
+                    CC_Fixed_Jumps.transformClass(
                             generateBack(CC_No_Stack_No_Patch, sample, false),
                             ClassTransform.ACCEPT_ALL.andThen(overflow()))); //involve BufferedCodeBuilder here
     }
@@ -190,7 +190,7 @@ void testFixBackJumpsChainedTransform(Sample sample) throws Exception {
     @MethodSource("provideFwd")
     void testFailFwdJumpsChainedTransform(Sample sample) throws Exception {
         assertThrows(IllegalArgumentException.class, () ->
-                     CC_Not_Fixed_Jumps.transform(
+                     CC_Not_Fixed_Jumps.transformClass(
                             generateFwd(CC_No_Stack_No_Patch, sample, false),
                             ClassTransform.ACCEPT_ALL.andThen(overflow()))); //involve BufferedCodeBuilder here
     }
@@ -199,7 +199,7 @@ void testFailFwdJumpsChainedTransform(Sample sample) throws Exception {
     @MethodSource("provideBack")
     void testFailBackJumpsChainedTransform(Sample sample) throws Exception {
         assertThrows(IllegalArgumentException.class, () ->
-                     CC_Not_Fixed_Jumps.transform(
+                     CC_Not_Fixed_Jumps.transformClass(
                             generateBack(CC_No_Stack_No_Patch, sample, false),
                             ClassTransform.ACCEPT_ALL.andThen(overflow()))); //involve BufferedCodeBuilder here
     }
diff --git a/test/jdk/jdk/classfile/StackMapsTest.java b/test/jdk/jdk/classfile/StackMapsTest.java
index b3df31291bc..137f5bac486 100644
--- a/test/jdk/jdk/classfile/StackMapsTest.java
+++ b/test/jdk/jdk/classfile/StackMapsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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,7 +24,7 @@
 /*
  * @test
  * @summary Testing Classfile stack maps generator.
- * @bug 8305990 8320222 8320618
+ * @bug 8305990 8320222 8320618 8335475
  * @build testdata.*
  * @run junit StackMapsTest
  */
@@ -36,6 +36,10 @@
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+
+import static java.lang.constant.ConstantDescs.MTD_void;
 import static org.junit.jupiter.api.Assertions.*;
 import static helpers.TestUtil.assertEmpty;
 import static java.lang.classfile.ClassFile.ACC_STATIC;
@@ -221,7 +225,7 @@ void testClassVersions() throws Exception {
         var actualVersion = cc.parse(StackMapsTest.class.getResourceAsStream("/testdata/Pattern1.class").readAllBytes());
 
         //test transformation to class version 49 with removal of StackMapTable attributes
-        var version49 = cc.parse(cc.transform(
+        var version49 = cc.parse(cc.transformClass(
                                     actualVersion,
                                     ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)
                                                   .andThen(ClassTransform.endHandler(clb -> clb.withVersion(49, 0)))));
@@ -229,7 +233,7 @@ void testClassVersions() throws Exception {
                                 .walk().anyMatch(n -> n.name().equals("stack map frames")));
 
         //test transformation to class version 50 with re-generation of StackMapTable attributes
-         assertEmpty(cc.verify(cc.transform(
+         assertEmpty(cc.verify(cc.transformClass(
                                     version49,
                                     ClassTransform.transformingMethodBodies(CodeTransform.ACCEPT_ALL)
                                                   .andThen(ClassTransform.endHandler(clb -> clb.withVersion(50, 0))))));
@@ -238,7 +242,7 @@ void testClassVersions() throws Exception {
     @Test
     void testInvalidAALOADStack() {
         ClassFile.of().build(ClassDesc.of("Test"), clb
-                -> clb.withMethodBody("test", ConstantDescs.MTD_void, 0, cob
+                -> clb.withMethodBody("test", MTD_void, 0, cob
                         -> cob.bipush(10)
                               .anewarray(ConstantDescs.CD_Object)
                               .lconst_1() //long on stack caused NPE, see 8320618
@@ -312,4 +316,28 @@ void testInvalidStack() throws Exception {
                                            cb.pop();
                                        })));
     }
+
+    @ParameterizedTest
+    @EnumSource(ClassFile.StackMapsOption.class)
+    void testEmptyCounters(ClassFile.StackMapsOption option) {
+        var cf = ClassFile.of(option);
+        var bytes = cf.build(ClassDesc.of("Test"), clb -> clb
+            .withMethodBody("a", MTD_void, ACC_STATIC, CodeBuilder::return_)
+            .withMethodBody("b", MTD_void, 0, CodeBuilder::return_)
+        );
+
+        var cm = ClassFile.of().parse(bytes);
+        for (var method : cm.methods()) {
+            var name = method.methodName();
+            var code = method.code().orElseThrow();
+            if (name.equalsString("a")) {
+                assertEquals(0, code.maxLocals()); // static method
+                assertEquals(0, code.maxStack());
+            } else {
+                assertTrue(name.equalsString("b"));
+                assertEquals(1, code.maxLocals()); // instance method
+                assertEquals(0, code.maxStack());
+            }
+        }
+    }
 }
diff --git a/test/jdk/jdk/classfile/TestRecordComponent.java b/test/jdk/jdk/classfile/TestRecordComponent.java
index 95d56ffae8d..b39029154a0 100644
--- a/test/jdk/jdk/classfile/TestRecordComponent.java
+++ b/test/jdk/jdk/classfile/TestRecordComponent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -65,7 +65,7 @@ void testAdapt() throws Exception {
             } else
                 cb.with(ce);
         };
-        ClassModel newModel = cc.parse(cc.transform(cm, xform));
+        ClassModel newModel = cc.parse(cc.transformClass(cm, xform));
         ClassRecord.assertEquals(newModel, cm);
     }
 
@@ -74,7 +74,7 @@ void testPassThrough() throws Exception {
         var cc = ClassFile.of();
         ClassModel cm = cc.parse(Files.readAllBytes(testClassPath));
         ClassTransform xform = (cb, ce) -> cb.with(ce);
-        ClassModel newModel = cc.parse(cc.transform(cm, xform));
+        ClassModel newModel = cc.parse(cc.transformClass(cm, xform));
         ClassRecord.assertEquals(newModel, cm);
     }
 
@@ -92,7 +92,7 @@ void testChagne() throws Exception {
             else
                 cb.with(ce);
         };
-        ClassModel newModel = cc.parse(cc.transform(cm, xform));
+        ClassModel newModel = cc.parse(cc.transformClass(cm, xform));
         RecordAttribute ra = newModel.findAttribute(Attributes.record()).orElseThrow();
         assertEquals(ra.components().size(), 2, "Should have two components");
         assertEquals(ra.components().get(0).name().stringValue(), "fooXYZ");
diff --git a/test/jdk/jdk/classfile/TransformTests.java b/test/jdk/jdk/classfile/TransformTests.java
index 13abca0ec52..0cc1dafdf32 100644
--- a/test/jdk/jdk/classfile/TransformTests.java
+++ b/test/jdk/jdk/classfile/TransformTests.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,22 @@
 
 /*
  * @test
+ * @bug 8336010
  * @summary Testing ClassFile transformations.
  * @run junit TransformTests
  */
+import java.lang.classfile.ClassBuilder;
+import java.lang.classfile.CodeBuilder;
+import java.lang.classfile.CodeElement;
+import java.lang.classfile.FieldModel;
+import java.lang.classfile.FieldTransform;
+import java.lang.classfile.Label;
+import java.lang.classfile.MethodTransform;
+import java.lang.classfile.instruction.BranchInstruction;
+import java.lang.classfile.instruction.LabelTarget;
+import java.lang.constant.ClassDesc;
+import java.lang.constant.MethodTypeDesc;
+import java.lang.reflect.AccessFlag;
 import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -39,8 +52,13 @@
 import java.lang.classfile.CodeTransform;
 import java.lang.classfile.MethodModel;
 import java.lang.classfile.instruction.ConstantInstruction;
+import java.util.HashSet;
+import java.util.Set;
+
 import org.junit.jupiter.api.Test;
 
+import static java.lang.classfile.ClassFile.*;
+import static java.lang.constant.ConstantDescs.*;
 import static org.junit.jupiter.api.Assertions.*;
 
 /**
@@ -97,8 +115,8 @@ void testSingleTransform() throws Exception {
         ClassModel cm = cc.parse(bytes);
 
         assertEquals(invoke(bytes), "foo");
-        assertEquals(invoke(cc.transform(cm, transformCode(foo2foo))), "foo");
-        assertEquals(invoke(cc.transform(cm, transformCode(foo2bar))), "bar");
+        assertEquals(invoke(cc.transformClass(cm, transformCode(foo2foo))), "foo");
+        assertEquals(invoke(cc.transformClass(cm, transformCode(foo2bar))), "bar");
     }
 
     @Test
@@ -110,7 +128,7 @@ void testSeq2() throws Exception {
 
         assertEquals(invoke(bytes), "foo");
         ClassTransform transform = transformCode(foo2bar.andThen(bar2baz));
-        assertEquals(invoke(cc.transform(cm, transform)), "baz");
+        assertEquals(invoke(cc.transformClass(cm, transform)), "baz");
     }
 
     @Test
@@ -121,9 +139,154 @@ void testSeqN() throws Exception {
         ClassModel cm = cc.parse(bytes);
 
         assertEquals(invoke(bytes), "foo");
-        assertEquals(invoke(cc.transform(cm, transformCode(foo2bar.andThen(bar2baz).andThen(baz2foo)))), "foo");
-        assertEquals(invoke(cc.transform(cm, transformCode(foo2bar.andThen(bar2baz).andThen(baz2quux)))), "quux");
-        assertEquals(invoke(cc.transform(cm, transformCode(foo2foo.andThen(foo2bar).andThen(bar2baz)))), "baz");
+        assertEquals(invoke(cc.transformClass(cm, transformCode(foo2bar.andThen(bar2baz).andThen(baz2foo)))), "foo");
+        assertEquals(invoke(cc.transformClass(cm, transformCode(foo2bar.andThen(bar2baz).andThen(baz2quux)))), "quux");
+        assertEquals(invoke(cc.transformClass(cm, transformCode(foo2foo.andThen(foo2bar).andThen(bar2baz)))), "baz");
+    }
+
+    /**
+     * Test to ensure class elements, such as field and
+     * methods defined with transform/with, are visible
+     * to next transforms.
+     */
+    @Test
+    void testClassChaining() throws Exception {
+        var bytes = Files.readAllBytes(testClassPath);
+        var cf = ClassFile.of();
+        var cm = cf.parse(bytes);
+        var otherCm = cf.parse(cf.build(ClassDesc.of("Temp"), clb -> clb
+            .withMethodBody("baz", MTD_void, ACC_STATIC, CodeBuilder::return_)
+            .withField("baz", CD_long, ACC_STATIC)));
+
+        var methodBaz = otherCm.methods().getFirst();
+        var fieldBaz = otherCm.fields().getFirst();
+
+        ClassTransform transform1 = ClassTransform.endHandler(cb -> {
+            ClassBuilder ret;
+            ret = cb.withMethodBody("bar", MTD_void, ACC_STATIC, CodeBuilder::return_);
+            assertSame(cb, ret);
+            ret = cb.transformMethod(methodBaz, MethodTransform.ACCEPT_ALL);
+            assertSame(cb, ret);
+            ret = cb.withField("bar", CD_int, ACC_STATIC);
+            assertSame(cb, ret);
+            ret = cb.transformField(fieldBaz, FieldTransform.ACCEPT_ALL);
+            assertSame(cb, ret);
+        });
+
+        Set<String> methodNames = new HashSet<>();
+        Set<String> fieldNames = new HashSet<>();
+        ClassTransform transform2 = (cb, ce) -> {
+            if (ce instanceof MethodModel mm) {
+                methodNames.add(mm.methodName().stringValue());
+            }
+            if (ce instanceof FieldModel fm) {
+                fieldNames.add(fm.fieldName().stringValue());
+            }
+            cb.with(ce);
+        };
+
+        cf.transformClass(cm, transform1.andThen(transform2));
+
+        assertEquals(Set.of(INIT_NAME, "foo", "bar", "baz"), methodNames);
+        assertEquals(Set.of("bar", "baz"), fieldNames);
+    }
+
+    /**
+     * Test to ensure method elements, such as generated
+     * or transformed code, are visible to transforms.
+     */
+    @Test
+    void testMethodChaining() throws Exception {
+        var mtd = MethodTypeDesc.of(CD_String);
+
+        var cf = ClassFile.of();
+
+        // withCode
+        var cm = cf.parse(cf.build(ClassDesc.of("Temp"), clb -> clb
+            .withMethod("baz", mtd, ACC_STATIC | ACC_NATIVE, _ -> {})));
+
+        MethodTransform transform1 = MethodTransform.endHandler(mb -> {
+            var ret = mb.withCode(cob -> cob.loadConstant("foo").areturn());
+            assertSame(mb, ret);
+        });
+
+        boolean[] sawWithCode = { false };
+        MethodTransform transform2 = (mb, me) -> {
+            if (me instanceof CodeModel) {
+                sawWithCode[0] = true;
+            }
+            mb.with(me);
+        };
+
+        cf.transformClass(cm, ClassTransform.transformingMethods(transform1.andThen(transform2)));
+
+        assertTrue(sawWithCode[0], "Code attribute generated not visible");
+
+        // transformCode
+        var outerCm = cf.parse(testClassPath);
+        var foo = outerCm.methods().stream()
+            .filter(m -> m.flags().has(AccessFlag.STATIC))
+            .findFirst().orElseThrow();
+
+        MethodTransform transform3 = MethodTransform.endHandler(mb -> {
+            var ret = mb.transformCode(foo.code().orElseThrow(), CodeTransform.ACCEPT_ALL);
+            assertSame(mb, ret);
+        });
+
+        boolean[] sawTransformCode = { false };
+        MethodTransform transform4 = (mb, me) -> {
+            if (me instanceof CodeModel) {
+                sawTransformCode[0] = true;
+            }
+            mb.with(me);
+        };
+
+        cf.transformClass(cm, ClassTransform.transformingMethods(transform3.andThen(transform4)));
+
+        assertTrue(sawTransformCode[0], "Code attribute transformed not visible");
+    }
+
+    /**
+     * Test to ensure code elements, such as code block
+     * begin and end labels, are visible to transforms.
+     */
+    @Test
+    void testCodeChaining() throws Exception {
+        var bytes = Files.readAllBytes(testClassPath);
+        var cf = ClassFile.of();
+        var cm = cf.parse(bytes);
+
+        CodeTransform transform1 = new CodeTransform() {
+            @Override
+            public void atStart(CodeBuilder builder) {
+                builder.block(bcb -> {
+                    bcb.loadConstant(9876L);
+                    bcb.goto_(bcb.endLabel());
+                });
+            }
+
+            @Override
+            public void accept(CodeBuilder builder, CodeElement element) {
+                builder.with(element);
+            }
+        };
+        Set<Label> leaveLabels = new HashSet<>();
+        Set<Label> targetedLabels = new HashSet<>();
+        CodeTransform transform2 = (cb, ce) -> {
+            if (ce instanceof BranchInstruction bi) {
+                leaveLabels.add(bi.target());
+            }
+            if (ce instanceof LabelTarget lt) {
+                targetedLabels.add(lt.label());
+            }
+            cb.with(ce);
+        };
+
+        cf.transformClass(cm, ClassTransform.transformingMethods(MethodTransform
+            .transformingCode(transform1.andThen(transform2))));
+
+        leaveLabels.removeIf(targetedLabels::contains);
+        assertTrue(leaveLabels.isEmpty(), () -> "Some labels are not bounded: " + leaveLabels);
     }
 
     public static class TestClass {
diff --git a/test/jdk/jdk/classfile/VerifierSelfTest.java b/test/jdk/jdk/classfile/VerifierSelfTest.java
index ef1bc3cab30..529edbf2b79 100644
--- a/test/jdk/jdk/classfile/VerifierSelfTest.java
+++ b/test/jdk/jdk/classfile/VerifierSelfTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -74,7 +74,7 @@ void testFailed() throws IOException {
         var cc = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(
                 className -> ClassHierarchyResolver.ClassHierarchyInfo.ofClass(null)));
         var classModel = cc.parse(path);
-        byte[] brokenClassBytes = cc.transform(classModel,
+        byte[] brokenClassBytes = cc.transformClass(classModel,
                 (clb, cle) -> {
                     if (cle instanceof MethodModel mm) {
                         clb.transformMethod(mm, (mb, me) -> {
diff --git a/test/jdk/jdk/classfile/examples/AnnotationsExamples.java b/test/jdk/jdk/classfile/examples/AnnotationsExamples.java
index 846645d93a9..a43ab72556e 100644
--- a/test/jdk/jdk/classfile/examples/AnnotationsExamples.java
+++ b/test/jdk/jdk/classfile/examples/AnnotationsExamples.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -47,7 +47,7 @@ public class AnnotationsExamples {
     public byte[] addAnno(ClassModel m) {
         // @@@ Not correct
         List<Annotation> annos = List.of(Annotation.of(ClassDesc.of("java.lang.FunctionalInterface")));
-        return ClassFile.of().transform(m, ClassTransform.endHandler(cb -> cb.with(RuntimeVisibleAnnotationsAttribute.of(annos))));
+        return ClassFile.of().transformClass(m, ClassTransform.endHandler(cb -> cb.with(RuntimeVisibleAnnotationsAttribute.of(annos))));
     }
 
     /**
@@ -75,7 +75,7 @@ public void swapAnnotation(ClassModel m) {
             var cc = ClassFile.of();
             for (Annotation ann : a.annotations()) {
                 if (ann.className().stringValue().equals("Ljava/lang/annotation/Documented;")) {
-                    m2 = cc.parse(cc.transform(m, SWAP_ANNO_TRANSFORM));
+                    m2 = cc.parse(cc.transformClass(m, SWAP_ANNO_TRANSFORM));
                 }
             }
         }
@@ -119,7 +119,7 @@ public void addAnnotation(ClassModel m) {
             var cc = ClassFile.of();
             for (Annotation ann : a.annotations()) {
                 if (ann.className().stringValue().equals("Ljava/lang/FunctionalInterface;")) {
-                    m2 = cc.parse(cc.transform(m, (cb, ce) -> {
+                    m2 = cc.parse(cc.transformClass(m, (cb, ce) -> {
                         if (ce instanceof RuntimeVisibleAnnotationsAttribute ra) {
                             var oldAnnos = ra.annotations();
                             List<Annotation> newAnnos = new ArrayList<>(oldAnnos.size() + 1);
@@ -145,7 +145,7 @@ public void addAnnotation(ClassModel m) {
     }
 
     public byte[] viaEndHandlerClassBuilderEdition(ClassModel m) {
-        return ClassFile.of().transform(m, ClassTransform.ofStateful(() -> new ClassTransform() {
+        return ClassFile.of().transformClass(m, ClassTransform.ofStateful(() -> new ClassTransform() {
             boolean found = false;
 
             @Override
@@ -172,7 +172,7 @@ public void atEnd(ClassBuilder builder) {
     }
 
     public byte[] viaEndHandlerClassTransformEdition(ClassModel m) {
-        return ClassFile.of().transform(m, ClassTransform.ofStateful(() -> new ClassTransform() {
+        return ClassFile.of().transformClass(m, ClassTransform.ofStateful(() -> new ClassTransform() {
             boolean found = false;
 
             @Override
diff --git a/test/jdk/jdk/classfile/examples/ExampleGallery.java b/test/jdk/jdk/classfile/examples/ExampleGallery.java
index 736725eeebe..7de4a78ffbf 100644
--- a/test/jdk/jdk/classfile/examples/ExampleGallery.java
+++ b/test/jdk/jdk/classfile/examples/ExampleGallery.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -62,7 +62,7 @@
  */
 public class ExampleGallery {
     public byte[] changeClassVersion(ClassModel cm) {
-        return ClassFile.of().transform(cm, (cb, ce) -> {
+        return ClassFile.of().transformClass(cm, (cb, ce) -> {
             switch (ce) {
                 case ClassFileVersion cv -> cb.withVersion(57, 0);
                 default -> cb.with(ce);
@@ -71,7 +71,7 @@ public byte[] changeClassVersion(ClassModel cm) {
     }
 
     public byte[] incrementClassVersion(ClassModel cm) {
-        return ClassFile.of().transform(cm, (cb, ce) -> {
+        return ClassFile.of().transformClass(cm, (cb, ce) -> {
             switch (ce) {
                 case ClassFileVersion cv -> cb.withVersion(cv.majorVersion() + 1, 0);
                 default -> cb.with(ce);
@@ -80,7 +80,7 @@ public byte[] incrementClassVersion(ClassModel cm) {
     }
 
     public byte[] changeSuperclass(ClassModel cm, ClassDesc superclass) {
-        return ClassFile.of().transform(cm, (cb, ce) -> {
+        return ClassFile.of().transformClass(cm, (cb, ce) -> {
             switch (ce) {
                 case Superclass sc -> cb.withSuperclass(superclass);
                 default -> cb.with(ce);
@@ -89,11 +89,11 @@ public byte[] changeSuperclass(ClassModel cm, ClassDesc superclass) {
     }
 
     public byte[] overrideSuperclass(ClassModel cm, ClassDesc superclass) {
-        return ClassFile.of().transform(cm, ClassTransform.endHandler(cb -> cb.withSuperclass(superclass)));
+        return ClassFile.of().transformClass(cm, ClassTransform.endHandler(cb -> cb.withSuperclass(superclass)));
     }
 
     public byte[] removeInterface(ClassModel cm, String internalName) {
-        return ClassFile.of().transform(cm, (cb, ce) -> {
+        return ClassFile.of().transformClass(cm, (cb, ce) -> {
             switch (ce) {
                 case Interfaces i -> cb.withInterfaces(i.interfaces().stream()
                                                         .filter(e -> !e.asInternalName().equals(internalName))
@@ -104,7 +104,7 @@ public byte[] removeInterface(ClassModel cm, String internalName) {
     }
 
     public byte[] addInterface(ClassModel cm, ClassDesc newIntf) {
-        return ClassFile.of().transform(cm, ClassTransform.ofStateful(()  -> new ClassTransform() {
+        return ClassFile.of().transformClass(cm, ClassTransform.ofStateful(()  -> new ClassTransform() {
             boolean seen = false;
 
             @Override
@@ -133,7 +133,7 @@ public void atEnd(ClassBuilder builder) {
 
     }
     public byte[] addInterface1(ClassModel cm, ClassDesc newIntf) {
-        return ClassFile.of().transform(cm, ClassTransform.ofStateful(()  -> new ClassTransform() {
+        return ClassFile.of().transformClass(cm, ClassTransform.ofStateful(()  -> new ClassTransform() {
             Interfaces interfaces;
 
             @Override
@@ -160,11 +160,11 @@ public void atEnd(ClassBuilder builder) {
     }
 
     public byte[] removeSignature(ClassModel cm) {
-        return ClassFile.of().transform(cm, ClassTransform.dropping(e -> e instanceof SignatureAttribute));
+        return ClassFile.of().transformClass(cm, ClassTransform.dropping(e -> e instanceof SignatureAttribute));
     }
 
     public byte[] changeSignature(ClassModel cm) {
-        return ClassFile.of().transform(cm, (cb, ce) -> {
+        return ClassFile.of().transformClass(cm, (cb, ce) -> {
             switch (ce) {
                 case SignatureAttribute sa -> {
                     String result = sa.signature().stringValue();
@@ -176,7 +176,7 @@ public byte[] changeSignature(ClassModel cm) {
     }
 
     public byte[] setSignature(ClassModel cm) {
-        return ClassFile.of().transform(cm, ClassTransform.dropping(e -> e instanceof SignatureAttribute)
+        return ClassFile.of().transformClass(cm, ClassTransform.dropping(e -> e instanceof SignatureAttribute)
                                           .andThen(ClassTransform.endHandler(b -> b.with(SignatureAttribute.of(
                                               ClassSignature.of(
                                                       ClassTypeSig.of(ClassDesc.of("impl.Fox"),
@@ -187,16 +187,16 @@ public byte[] setSignature(ClassModel cm) {
     // @@@ strip annos (class, all)
 
     public byte[] stripFields(ClassModel cm, Predicate<String> filter) {
-        return ClassFile.of().transform(cm, ClassTransform.dropping(e -> e instanceof FieldModel fm
+        return ClassFile.of().transformClass(cm, ClassTransform.dropping(e -> e instanceof FieldModel fm
                                                          && filter.test(fm.fieldName().stringValue())));
     }
 
     public byte[] addField(ClassModel cm) {
-        return ClassFile.of().transform(cm, ClassTransform.endHandler(cb -> cb.withField("cool", ClassDesc.ofDescriptor("(I)D"), ClassFile.ACC_PUBLIC)));
+        return ClassFile.of().transformClass(cm, ClassTransform.endHandler(cb -> cb.withField("cool", ClassDesc.ofDescriptor("(I)D"), ClassFile.ACC_PUBLIC)));
     }
 
     public byte[] changeFieldSig(ClassModel cm) {
-        return ClassFile.of().transform(cm, ClassTransform.transformingFields((fb, fe) -> {
+        return ClassFile.of().transformClass(cm, ClassTransform.transformingFields((fb, fe) -> {
             if (fe instanceof SignatureAttribute sa)
                 fb.with(SignatureAttribute.of(Signature.parseFrom(sa.signature().stringValue().replace("this/", "that/"))));
             else
@@ -205,7 +205,7 @@ public byte[] changeFieldSig(ClassModel cm) {
     }
 
     public byte[] changeFieldFlags(ClassModel cm) {
-        return ClassFile.of().transform(cm, ClassTransform.transformingFields((fb, fe) -> {
+        return ClassFile.of().transformClass(cm, ClassTransform.transformingFields((fb, fe) -> {
             switch (fe) {
                 case AccessFlags a -> fb.with(AccessFlags.ofField(a.flagsMask() & ~ClassFile.ACC_PUBLIC & ~ClassFile.ACC_PROTECTED));
                 default -> fb.with(fe);
@@ -214,7 +214,7 @@ public byte[] changeFieldFlags(ClassModel cm) {
     }
 
     public byte[] addException(ClassModel cm, ClassDesc ex) {
-        return ClassFile.of().transform(cm, ClassTransform.transformingMethods(
+        return ClassFile.of().transformClass(cm, ClassTransform.transformingMethods(
                 MethodTransform.ofStateful(() -> new MethodTransform() {
                     ExceptionsAttribute attr;
 
@@ -258,11 +258,11 @@ public void accept(CodeBuilder codeB, CodeElement codeE) {
             }
         });
 
-        return ClassFile.of().transform(cm, ClassTransform.transformingMethodBodies(transform));
+        return ClassFile.of().transformClass(cm, ClassTransform.transformingMethodBodies(transform));
     }
 
     public byte[] addInstrumentationBeforeInvoke(ClassModel cm) {
-        return ClassFile.of().transform(cm, ClassTransform.transformingMethodBodies((codeB, codeE) -> {
+        return ClassFile.of().transformClass(cm, ClassTransform.transformingMethodBodies((codeB, codeE) -> {
             switch (codeE) {
                 case InvokeInstruction i -> {
                     codeB.nop();
@@ -274,7 +274,7 @@ public byte[] addInstrumentationBeforeInvoke(ClassModel cm) {
     }
 
     public byte[] replaceIntegerConstant(ClassModel cm) {
-        return ClassFile.of().transform(cm, ClassTransform.transformingMethodBodies((codeB, codeE) -> {
+        return ClassFile.of().transformClass(cm, ClassTransform.transformingMethodBodies((codeB, codeE) -> {
             switch (codeE) {
                 case ConstantInstruction ci -> {
                         if (ci.constantValue() instanceof Integer i) codeB.loadConstant(i + 1);
diff --git a/test/jdk/jdk/classfile/examples/ExperimentalTransformExamples.java b/test/jdk/jdk/classfile/examples/ExperimentalTransformExamples.java
index d66cc6737da..c0bfceff16f 100644
--- a/test/jdk/jdk/classfile/examples/ExperimentalTransformExamples.java
+++ b/test/jdk/jdk/classfile/examples/ExperimentalTransformExamples.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -52,7 +52,7 @@ public class ExperimentalTransformExamples {
     };
 
     public byte[] deleteAnnotations(ClassModel cm) {
-        return ClassFile.of().transform(cm, (cb, ce) -> {
+        return ClassFile.of().transformClass(cm, (cb, ce) -> {
             switch (ce) {
                 case MethodModel m -> cb.transformMethod(m, dropMethodAnnos);
                 case FieldModel f -> cb.transformField(f, dropFieldAnnos);
diff --git a/test/jdk/jdk/classfile/examples/TransformExamples.java b/test/jdk/jdk/classfile/examples/TransformExamples.java
index 97dfcd8a585..2473e024e70 100644
--- a/test/jdk/jdk/classfile/examples/TransformExamples.java
+++ b/test/jdk/jdk/classfile/examples/TransformExamples.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -38,18 +38,18 @@
  */
 public class TransformExamples {
     public byte[] noop(ClassModel cm) {
-        return ClassFile.of().transform(cm, ClassTransform.ACCEPT_ALL);
+        return ClassFile.of().transformClass(cm, ClassTransform.ACCEPT_ALL);
     }
 
     public byte[] deleteAllMethods(ClassModel cm) {
-        return ClassFile.of().transform(cm, (b, e) -> {
+        return ClassFile.of().transformClass(cm, (b, e) -> {
             if (!(e instanceof MethodModel))
                 b.with(e);
         });
     }
 
     public byte[] deleteFieldsWithDollarInName(ClassModel cm) {
-        return ClassFile.of().transform(cm, (b, e) ->
+        return ClassFile.of().transformClass(cm, (b, e) ->
                         {
                             if (!(e instanceof FieldModel fm && fm.fieldName().stringValue().contains("$")))
                                 b.with(e);
@@ -57,14 +57,14 @@ public byte[] deleteFieldsWithDollarInName(ClassModel cm) {
     }
 
     public byte[] deleteAttributes(ClassModel cm) {
-        return ClassFile.of().transform(cm, (b, e) -> {
+        return ClassFile.of().transformClass(cm, (b, e) -> {
             if (!(e instanceof Attribute))
                 b.with(e);
         });
     }
 
     public byte[] keepMethodsAndFields(ClassModel cm) {
-        return ClassFile.of().transform(cm, (b, e) -> {
+        return ClassFile.of().transformClass(cm, (b, e) -> {
             if (e instanceof MethodModel || e instanceof FieldModel)
                 b.with(e);
         });
diff --git a/test/jdk/jdk/classfile/helpers/RebuildingTransformation.java b/test/jdk/jdk/classfile/helpers/RebuildingTransformation.java
index 0c9b771c3ef..7905a79fd40 100644
--- a/test/jdk/jdk/classfile/helpers/RebuildingTransformation.java
+++ b/test/jdk/jdk/classfile/helpers/RebuildingTransformation.java
@@ -257,8 +257,8 @@ public void accept(CodeBuilder cob, CodeElement coe) {
                         case IF_ICMPLE -> cob.if_icmple(target);
                         case IF_ICMPLT -> cob.if_icmplt(target);
                         case IF_ICMPNE -> cob.if_icmpne(target);
-                        case IFNONNULL -> cob.if_nonnull(target);
-                        case IFNULL -> cob.if_null(target);
+                        case IFNONNULL -> cob.ifnonnull(target);
+                        case IFNULL -> cob.ifnull(target);
                         case IFEQ -> cob.ifeq(target);
                         case IFGE -> cob.ifge(target);
                         case IFGT -> cob.ifgt(target);
diff --git a/test/jdk/jdk/classfile/helpers/Transforms.java b/test/jdk/jdk/classfile/helpers/Transforms.java
index 64b4836d50a..0b44c5a22aa 100644
--- a/test/jdk/jdk/classfile/helpers/Transforms.java
+++ b/test/jdk/jdk/classfile/helpers/Transforms.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -187,7 +187,7 @@ public enum NoOpTransform {
                     shared
                     ? options
                     : Stream.concat(Stream.of(options), Stream.of(ClassFile.ConstantPoolSharingOption.NEW_POOL)).toArray(ClassFile.Option[]::new));
-            this.transform = bytes -> cc.transform(cc.parse(bytes), classTransform);
+            this.transform = bytes -> cc.transformClass(cc.parse(bytes), classTransform);
         }
 
         public Optional<ClassRecord> classRecord(byte[] bytes) throws IOException {
@@ -212,7 +212,7 @@ public enum InjectNopTransform {
         NOP_SHARED(bytes -> {
             var cc = ClassFile.of();
             ClassModel cm = cc.parse(bytes);
-            return cc.transform(cm, (cb, ce) -> {
+            return cc.transformClass(cm, (cb, ce) -> {
                 if (ce instanceof MethodModel mm) {
                     cb.transformMethod(mm, (mb, me) -> {
                         if (me instanceof CodeModel xm) {
@@ -253,7 +253,7 @@ public enum SimpleTransform {
         HIGH_SHARED_ADD_FIELD(bytes -> {
             var cc = ClassFile.of();
             ClassModel cm = cc.parse(bytes);
-            return cc.transform(cm, new ClassTransform() {
+            return cc.transformClass(cm, new ClassTransform() {
                 @Override
                 public void accept(ClassBuilder builder, ClassElement element) {
                     builder.with(element);
@@ -291,7 +291,7 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str
         HIGH_SHARED_DEL_METHOD(bytes -> {
             var cc = ClassFile.of();
             ClassModel cm = cc.parse(bytes);
-            return cc.transform(cm, (builder, element) -> {
+            return cc.transformClass(cm, (builder, element) -> {
                 if (!(element instanceof MethodModel mm))
                     builder.with(element);
             });
diff --git a/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java b/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java
new file mode 100644
index 00000000000..0e668b1f969
--- /dev/null
+++ b/test/jdk/jdk/internal/platform/cgroup/TestSystemSettings.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc.
+ * 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
+ * @key cgroups
+ * @requires (os.family == "linux" & !vm.musl)
+ * @requires vm.flagless
+ * @library /test/lib
+ * @build TestSystemSettings
+ * @run main/othervm TestSystemSettings
+ */
+
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class TestSystemSettings {
+
+    public static void main(String[] args) throws Exception {
+        ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XshowSettings:system", "-version");
+        OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+        output.shouldContain("System not containerized.");
+    }
+}
diff --git a/test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java b/test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java
index 8edb74b847a..58f23350dd0 100644
--- a/test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java
+++ b/test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java
@@ -29,6 +29,7 @@
 import java.util.List;
 import java.util.concurrent.CyclicBarrier;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
 import jdk.jfr.Event;
@@ -143,28 +144,43 @@ private static void printTimestamp(Instant timestamp) {
     }
 
     private static Path makeUnorderedRecording() throws Exception {
-        CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1);
-
-        try (Recording r = new Recording()) {
-            r.start();
-            List<Emitter> emitters = new ArrayList<>();
-            for (int i = 0; i < THREAD_COUNT; i++) {
-                Emitter e = new Emitter(barrier);
-                e.start();
-                emitters.add(e);
-            }
-            // Thread buffers should now have one event each
-            barrier.await();
-            // Add another event to each thread buffer, so
-            // events are bound to come out of order when they
-            // are flushed
-            for (Emitter e : emitters) {
-                e.join();
+        while (true) {
+            CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1);
+            try (Recording r = new Recording()) {
+                r.start();
+                List<Emitter> emitters = new ArrayList<>();
+                for (int i = 0; i < THREAD_COUNT; i++) {
+                    Emitter e = new Emitter(barrier);
+                    e.start();
+                    emitters.add(e);
+                }
+                // Thread buffers should now have one event each
+                barrier.await();
+                // Add another event to each thread buffer, so
+                // events are bound to come out of order when they
+                // are flushed
+                for (Emitter e : emitters) {
+                    e.join();
+                }
+                r.stop();
+                Path p = Utils.createTempFile("recording", ".jfr");
+                r.dump(p);
+                // Order is only guaranteed within a segment.
+                int segments = countSegments(p);
+                if (segments < 2) {
+                    return p;
+                }
+                System.out.println("File contains more than one segment (" + segments + "). Retrying.");
             }
-            r.stop();
-            Path p = Utils.createTempFile("recording", ".jfr");
-            r.dump(p);
-            return p;
+        }
+    }
+
+    private static int countSegments(Path file) throws Exception {
+        AtomicInteger segments = new AtomicInteger();
+        try (EventStream es = EventStream.openFile(file)) {
+            es.onFlush(segments::incrementAndGet);
+            es.start();
+            return segments.get();
         }
     }
 }
diff --git a/test/jdk/jdk/jfr/api/consumer/recordingstream/TestStop.java b/test/jdk/jdk/jfr/api/consumer/recordingstream/TestStop.java
index 58dcbbcbe20..36bbaa3c557 100644
--- a/test/jdk/jdk/jfr/api/consumer/recordingstream/TestStop.java
+++ b/test/jdk/jdk/jfr/api/consumer/recordingstream/TestStop.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -41,7 +41,7 @@
  * @requires vm.hasJFR
  * @library /test/lib /test/jdk
  * @build jdk.jfr.api.consumer.recordingstream.EventProducer
- * @run main/othervm jdk.jfr.api.consumer.recordingstream.TestStop
+ * @run main/othervm -Xlog:system+parser+jfr=info jdk.jfr.api.consumer.recordingstream.TestStop
  */
 public class TestStop {
     static class StopEvent extends Event {
@@ -139,41 +139,50 @@ private static void testNestedStop() throws Exception {
                 Path fileInner = Path.of("inner.jfr");
                 inner.dump(fileInner);
                 outer.dump(fileOuter);
-                System.out.println("Outer dump:");
                 var dumpOuter = RecordingFile.readAllEvents(fileOuter);
-                for (RecordedEvent e : dumpOuter) {
-                    System.out.println(eventToText(e));
-                }
-                System.out.println("Inner dump:");
                 var dumpInner = RecordingFile.readAllEvents(fileInner);
-                for (RecordedEvent e : dumpInner) {
-                    System.out.println(eventToText(e));
-                }
-                System.out.println();
-                System.out.println("Outer stream:");
-                for (String s : outerStream) {
-                    System.out.println(s);
-                }
-                System.out.println("Inner stream:");
-                for (String s : innerStream) {
-                    System.out.println(s);
-                }
+
                 if (dumpOuter.size() != 3) {
+                    log(outerStream, innerStream, dumpOuter, dumpInner);
                     throw new AssertionError("Expected outer dump to have 3 events");
                 }
                 if (outerStream.size() != 3) {
+                    log(outerStream, innerStream, dumpOuter, dumpInner);
                     throw new AssertionError("Expected outer stream to have 3 events");
                 }
                 if (dumpInner.size() != 1) {
+                    log(outerStream, innerStream, dumpOuter, dumpInner);
                     throw new AssertionError("Expected inner dump to have 1 event");
                 }
                 if (innerStream.size() != 1) {
+                    log(outerStream, innerStream, dumpOuter, dumpInner);
                     throw new AssertionError("Expected inner stream to have 1 event");
                 }
             }
         }
     }
 
+    private static void log(List<String> outerStream, List<String> innerStream, List<RecordedEvent> dumpOuter,
+            List<RecordedEvent> dumpInner) {
+        System.out.println("Outer dump:");
+        for (RecordedEvent e : dumpOuter) {
+            System.out.println(eventToText(e));
+        }
+        System.out.println("Inner dump:");
+        for (RecordedEvent e : dumpInner) {
+            System.out.println(eventToText(e));
+        }
+        System.out.println();
+        System.out.println("Outer stream:");
+        for (String s : outerStream) {
+            System.out.println(s);
+        }
+        System.out.println("Inner stream:");
+        for (String s : innerStream) {
+            System.out.println(s);
+        }
+    }
+
     private static String eventToText(RecordedEvent event) {
         Instant timestamp = event.getEndTime();
         long s = timestamp.getEpochSecond();
diff --git a/test/jdk/jdk/jfr/api/consumer/streaming/TestJVMExit.java b/test/jdk/jdk/jfr/api/consumer/streaming/TestJVMExit.java
index 5b30a52e4b7..77eba735d7a 100644
--- a/test/jdk/jdk/jfr/api/consumer/streaming/TestJVMExit.java
+++ b/test/jdk/jdk/jfr/api/consumer/streaming/TestJVMExit.java
@@ -34,12 +34,29 @@
  * @requires vm.hasJFR
  * @library /test/lib /test/jdk
  * @modules jdk.jfr jdk.attach java.base/jdk.internal.misc
+ * @build jdk.jfr.api.consumer.streaming.TestProcess
  *
  * @run main/othervm -Dsun.tools.attach.attachTimeout=100000 jdk.jfr.api.consumer.streaming.TestJVMExit
  */
 public class TestJVMExit {
 
     public static void main(String... args) throws Exception {
+        while (true) {
+            try {
+                testExit();
+                return;
+            } catch (RuntimeException e) {
+                String message = String.valueOf(e.getMessage());
+                // If the test application crashes during startup, retry.
+                if (!message.contains("is no longer alive")) {
+                    throw e;
+                }
+                System.out.println("Application not alive when trying to get repository. Retrying.");
+            }
+        }
+    }
+
+    private static void testExit() throws Exception {
         try (TestProcess process = new TestProcess("exit-application")) {
             AtomicInteger eventCounter = new AtomicInteger();
             try (EventStream es = EventStream.openRepository(process.getRepository())) {
diff --git a/test/jdk/jdk/jfr/event/io/TestInstrumentation.java b/test/jdk/jdk/jfr/event/io/TestInstrumentation.java
index 5f3885f31bf..daa3d0162d4 100644
--- a/test/jdk/jdk/jfr/event/io/TestInstrumentation.java
+++ b/test/jdk/jdk/jfr/event/io/TestInstrumentation.java
@@ -317,7 +317,7 @@ public byte[] transform(
 
         instrClassesDone.add(target);
         var cf = ClassFile.of();
-        return cf.transform(cf.parse(bytes), (clb, ce) -> {
+        return cf.transformClass(cf.parse(bytes), (clb, ce) -> {
             MethodKey key;
             if (ce instanceof MethodModel mm && instrMethodKeys.contains(key = new MethodKey(
                     target, mm.methodName().stringValue(), mm.methodTypeSymbol()))) {
diff --git a/test/jdk/jdk/jfr/event/runtime/TestSizeTFlags.java b/test/jdk/jdk/jfr/event/runtime/TestSizeTFlags.java
index c2ad220d78d..ae21537840f 100644
--- a/test/jdk/jdk/jfr/event/runtime/TestSizeTFlags.java
+++ b/test/jdk/jdk/jfr/event/runtime/TestSizeTFlags.java
@@ -40,13 +40,12 @@
  * @key jfr
  * @summary Test checks that flags of type size_t are being sent to the jfr
  * @library /test/lib
- * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:-UseFastUnorderedTimeStamps -XX:+UseG1GC -XX:+UseTLAB -XX:MinTLABSize=3k -XX:OldSize=30m -XX:YoungPLABSize=3k -XX:MaxDirectMemorySize=5M  jdk.jfr.event.runtime.TestSizeTFlags
+ * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:-UseFastUnorderedTimeStamps -XX:+UseG1GC -XX:+UseTLAB -XX:MinTLABSize=3k -XX:YoungPLABSize=3k -XX:MaxDirectMemorySize=5M  jdk.jfr.event.runtime.TestSizeTFlags
  */
 public class TestSizeTFlags {
     private static final String EVENT_NAME = EventNames.UnsignedLongFlag;
-    private static final int NUMBER_OF_FLAGS_TO_CHECK = 4;
+    private static final int NUMBER_OF_FLAGS_TO_CHECK = 3;
     private static final long MIN_TLAB_SIZE_FLAG_VALUE = 3*1024L;
-    private static final long OLD_SIZE_FLAG_VALUE = 30*1024*1024L;
     private static final long YOUNG_PLAB_SIZE_FLAG_VALUE = 3*1024L;
     private static final long MAX_DIRECT_MEMORY_SIZE_FLAG_VALUE = 5*1024*1024L;
 
@@ -71,16 +70,12 @@ public static void main(String[] args) throws Exception {
                         flagsFoundWithExpectedValue[0] = MIN_TLAB_SIZE_FLAG_VALUE == value;
                         continue;
                     }
-                    case "OldSize": {
-                        flagsFoundWithExpectedValue[1] = OLD_SIZE_FLAG_VALUE == value;
-                        continue;
-                    }
                     case "YoungPLABSize": {
-                        flagsFoundWithExpectedValue[2] = YOUNG_PLAB_SIZE_FLAG_VALUE == value;
+                        flagsFoundWithExpectedValue[1] = YOUNG_PLAB_SIZE_FLAG_VALUE == value;
                         continue;
                     }
                     case "MaxDirectMemorySize": {
-                        flagsFoundWithExpectedValue[3] = MAX_DIRECT_MEMORY_SIZE_FLAG_VALUE == value;
+                        flagsFoundWithExpectedValue[2] = MAX_DIRECT_MEMORY_SIZE_FLAG_VALUE == value;
                         continue;
                     }
                     default: {
diff --git a/test/jdk/jdk/jfr/javaagent/TestEventInstrumentation.java b/test/jdk/jdk/jfr/javaagent/TestEventInstrumentation.java
index 8a8415dc524..049a1172d0c 100644
--- a/test/jdk/jdk/jfr/javaagent/TestEventInstrumentation.java
+++ b/test/jdk/jdk/jfr/javaagent/TestEventInstrumentation.java
@@ -116,7 +116,7 @@ public byte[] transform(ClassLoader classLoader, String className,
                 }
 
                 var cf = ClassFile.of();
-                result = cf.transform(cf.parse(bytes), (clb, ce) -> {
+                result = cf.transformClass(cf.parse(bytes), (clb, ce) -> {
                     if (ce instanceof MethodModel mm && mm.methodName().equalsString(INIT_NAME)) {
                         clb.transformMethod(mm, MethodTransform.transformingCode(new CodeTransform() {
                             @Override
diff --git a/test/jdk/jdk/jfr/jvm/TestHiddenWait.java b/test/jdk/jdk/jfr/jvm/TestHiddenWait.java
new file mode 100644
index 00000000000..f4b810f192e
--- /dev/null
+++ b/test/jdk/jdk/jfr/jvm/TestHiddenWait.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2024, 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 jdk.jfr.jvm;
+
+import java.nio.file.Path;
+import java.time.Duration;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
+
+import jdk.jfr.Recording;
+import jdk.jfr.Name;
+import jdk.jfr.Event;
+import jdk.jfr.FlightRecorder;
+import jdk.jfr.consumer.RecordedEvent;
+import jdk.jfr.consumer.RecordingStream;
+import jdk.test.lib.jfr.Events;
+
+/**
+ * @test TestHiddenWait
+ * @key jfr
+ * @summary Checks that JFR code don't emit noise in the form of ThreadSleep and JavaMonitorWait events.
+ * @requires vm.hasJFR
+ * @library /test/lib
+ * @run main/othervm jdk.jfr.jvm.TestHiddenWait
+ */
+public class TestHiddenWait {
+    static final String PERIODIC_EVENT_NAME = "test.Periodic";
+
+    @Name(PERIODIC_EVENT_NAME)
+    public static class PeriodicEvent extends Event {
+    }
+
+    public static void main(String... args) throws Exception {
+        FlightRecorder.addPeriodicEvent(PeriodicEvent.class,  () -> {
+            PeriodicEvent event = new PeriodicEvent();
+            event.commit();
+        });
+        try (Recording r = new Recording()) {
+            AtomicLong counter = new AtomicLong();
+            r.enable("jdk.ThreadSleep").withoutThreshold();
+            r.enable("jdk.JavaMonitorWait").withoutThreshold();
+            r.enable(PERIODIC_EVENT_NAME).withPeriod(Duration.ofMillis(100));
+            r.start();
+            // Triggers Object.wait() in stream barrier
+            try (RecordingStream b = new RecordingStream()) {
+                b.startAsync();
+                b.stop();
+            }
+            // Wait for for periodic events
+            try (RecordingStream s = new RecordingStream()) {
+                s.onEvent(PERIODIC_EVENT_NAME, e -> {
+                    if (counter.incrementAndGet() >= 2) {
+                        s.close();
+                    }
+                });
+                s.start();
+            }
+            List<RecordedEvent> events = Events.fromRecording(r);
+            for (RecordedEvent event : events) {
+                if (!event.getEventType().getName().equals(PERIODIC_EVENT_NAME)) {
+                    System.out.println(event);
+                    throw new Exception("Didn't expect ThreadSleep or JavaMonitorWait events");
+                }
+            }
+        }
+    }
+}
diff --git a/test/jdk/jdk/jfr/jvm/TestWaste.java b/test/jdk/jdk/jfr/jvm/TestWaste.java
index 0cc1010765e..afa2dda4ee1 100644
--- a/test/jdk/jdk/jfr/jvm/TestWaste.java
+++ b/test/jdk/jdk/jfr/jvm/TestWaste.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -47,7 +47,7 @@
  * @requires vm.hasJFR
  * @library /test/lib /test/jdk
  * @modules jdk.jfr/jdk.jfr.internal.test
- * @run main/othervm -XX:TLABSize=2k jdk.jfr.jvm.TestWaste
+ * @run main/othervm -Xlog:jfr+system+parser=debug -XX:TLABSize=2k jdk.jfr.jvm.TestWaste
  */
 public class TestWaste {
     static List<Object> list = new LinkedList<>();
diff --git a/test/jdk/jdk/lambda/separate/ClassToInterfaceConverter.java b/test/jdk/jdk/lambda/separate/ClassToInterfaceConverter.java
index 26c17901281..7bf9b19390e 100644
--- a/test/jdk/jdk/lambda/separate/ClassToInterfaceConverter.java
+++ b/test/jdk/jdk/lambda/separate/ClassToInterfaceConverter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, 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
@@ -50,7 +50,7 @@ private byte[] convertToInterface(ClassModel classModel) {
             }
         };
 
-        return ClassFile.of().transform(classModel,
+        return ClassFile.of().transformClass(classModel,
             ClassTransform.dropping(ce -> ce instanceof MethodModel mm && mm.methodName().equalsString(INIT_NAME))
                           .andThen(ClassTransform.transformingMethodBodies(ct))
                           .andThen(ClassTransform.endHandler(b -> b.withFlags(ACC_INTERFACE | ACC_ABSTRACT | ACC_PUBLIC)))
diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java
index 9f071bc1450..889926077a9 100644
--- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java
+++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CAInterop.java
@@ -27,12 +27,12 @@
  * @summary Interoperability tests with Actalis CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp
  *  CAInterop actalisauthenticationrootca OCSP
- * @run main/othervm/timeout=180 -Djava.security.debug=certpath,ocsp
+ * @run main/othervm/manual/timeout=180 -Djava.security.debug=certpath,ocsp
  *  -Dcom.sun.security.ocsp.useget=false
  *  CAInterop actalisauthenticationrootca OCSP
- * @run main/othervm/timeout=180 -Djava.security.debug=certpath,ocsp
+ * @run main/othervm/manual/timeout=180 -Djava.security.debug=certpath,ocsp
  *  CAInterop actalisauthenticationrootca CRL
  */
 
@@ -42,9 +42,9 @@
  * @summary Interoperability tests with Amazon's CA1
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop amazonrootca1 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca1 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop amazonrootca1 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop amazonrootca1 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca1 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop amazonrootca1 CRL
  */
 
 /*
@@ -53,9 +53,9 @@
  * @summary Interoperability tests with Amazon's CA2
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop amazonrootca2 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca2 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop amazonrootca2 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop amazonrootca2 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca2 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop amazonrootca2 CRL
  */
 
 /*
@@ -64,9 +64,9 @@
  * @summary Interoperability tests with Amazon's CA3
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop amazonrootca3 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca3 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop amazonrootca3 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop amazonrootca3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop amazonrootca3 CRL
  */
 
 /*
@@ -75,9 +75,9 @@
  * @summary Interoperability tests with Amazon's CA4
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop amazonrootca4 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca4 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop amazonrootca4 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop amazonrootca4 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop amazonrootca4 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop amazonrootca4 CRL
  */
 
 /*
@@ -86,9 +86,9 @@
  * @summary Interoperability tests with Buypass Class 2 CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop buypassclass2ca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop buypassclass2ca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop buypassclass2ca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop buypassclass2ca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop buypassclass2ca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop buypassclass2ca CRL
  */
 
 /*
@@ -97,9 +97,9 @@
  * @summary Interoperability tests with Buypass Class 3 CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop buypassclass3ca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop buypassclass3ca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop buypassclass3ca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop buypassclass3ca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop buypassclass3ca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop buypassclass3ca CRL
  */
 
 /*
@@ -108,9 +108,9 @@
  * @summary Interoperability tests with Comodo RSA CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop comodorsaca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop comodorsaca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop comodorsaca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop comodorsaca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop comodorsaca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop comodorsaca CRL
  */
 
 /*
@@ -119,9 +119,9 @@
  * @summary Interoperability tests with Comodo ECC CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop comodoeccca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop comodoeccca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop comodoeccca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop comodoeccca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop comodoeccca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop comodoeccca CRL
  */
 
 /*
@@ -130,9 +130,9 @@
  * @summary Interoperability tests with Comodo userTrust RSA CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop usertrustrsaca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop usertrustrsaca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop usertrustrsaca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop usertrustrsaca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop usertrustrsaca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop usertrustrsaca CRL
  */
 
 /*
@@ -141,9 +141,9 @@
  * @summary Interoperability tests with Comodo userTrust ECC CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop usertrusteccca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop usertrusteccca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop usertrusteccca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop usertrusteccca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop usertrusteccca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop usertrusteccca CRL
  */
 
 /*
@@ -152,8 +152,8 @@
  * @summary Interoperability tests with Let's Encrypt ISRG Root X1 CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop letsencryptisrgx1 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop letsencryptisrgx1 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop letsencryptisrgx1 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop letsencryptisrgx1 DEFAULT
  */
 
 /*
@@ -162,8 +162,8 @@
  * @summary Interoperability tests with Let's Encrypt ISRG Root X2 CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop letsencryptisrgx2 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop letsencryptisrgx2 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop letsencryptisrgx2 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop letsencryptisrgx2 DEFAULT
  */
 
 /*
@@ -172,9 +172,9 @@
  * @summary Interoperability tests with GlobalSign R6 CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop globalsignrootcar6 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsignrootcar6 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop globalsignrootcar6 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop globalsignrootcar6 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsignrootcar6 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop globalsignrootcar6 CRL
  */
 
 /*
@@ -183,9 +183,9 @@
  * @summary Interoperability tests with Entrust CAs
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop entrustrootcaec1 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop entrustrootcaec1 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop entrustrootcaec1 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop entrustrootcaec1 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop entrustrootcaec1 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop entrustrootcaec1 CRL
  */
 
 /*
@@ -194,9 +194,9 @@
  * @summary Interoperability tests with Entrust CAs
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop entrustrootcag4 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop entrustrootcag4 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop entrustrootcag4 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop entrustrootcag4 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop entrustrootcag4 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop entrustrootcag4 CRL
  */
 
 /*
@@ -205,9 +205,9 @@
  * @summary Interoperability tests with GoDaddy CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop godaddyrootg2ca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop godaddyrootg2ca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop godaddyrootg2ca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop godaddyrootg2ca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop godaddyrootg2ca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop godaddyrootg2ca CRL
  */
 
 /*
@@ -216,9 +216,9 @@
  * @summary Interoperability tests with Starfield CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop starfieldrootg2ca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop starfieldrootg2ca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop starfieldrootg2ca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop starfieldrootg2ca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop starfieldrootg2ca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop starfieldrootg2ca CRL
  */
 
 /*
@@ -227,8 +227,8 @@
  * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop globalsigneccrootcar4 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsigneccrootcar4 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop globalsigneccrootcar4 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsigneccrootcar4 DEFAULT
  */
 
 /*
@@ -237,8 +237,8 @@
  * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop gtsrootcar1 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootcar1 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop gtsrootcar1 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootcar1 DEFAULT
  */
 
 /*
@@ -247,8 +247,8 @@
  * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop gtsrootcar2 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootcar2 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop gtsrootcar2 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootcar2 DEFAULT
  */
 
 /*
@@ -257,8 +257,8 @@
  * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop gtsrootecccar3 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootecccar3 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop gtsrootecccar3 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootecccar3 DEFAULT
  */
 
 /*
@@ -267,8 +267,8 @@
  * @summary Interoperability tests with Google's GlobalSign R4 and GTS Root certificates
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootecccar4 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop gtsrootecccar4 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop gtsrootecccar4 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop gtsrootecccar4 DEFAULT
  */
 
 /*
@@ -277,9 +277,9 @@
  * @summary Interoperability tests with Microsoft TLS root CAs
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop microsoftecc2017 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop microsoftecc2017 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop microsoftecc2017 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop microsoftecc2017 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop microsoftecc2017 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop microsoftecc2017 CRL
  */
 
 /*
@@ -288,9 +288,9 @@
  * @summary Interoperability tests with Microsoft TLS root CAs
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop microsoftrsa2017 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop microsoftrsa2017 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop microsoftrsa2017 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop microsoftrsa2017 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop microsoftrsa2017 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop microsoftrsa2017 CRL
  */
 
 /*
@@ -299,9 +299,9 @@
  * @summary Interoperability tests with QuoVadis Root CA1 G3 CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca1g3 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca1g3 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop quovadisrootca1g3 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca1g3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca1g3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop quovadisrootca1g3 CRL
  */
 
 /*
@@ -310,9 +310,9 @@
  * @summary Interoperability tests with QuoVadis Root CA2 G3 CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca2g3 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca2g3 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop quovadisrootca2g3 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca2g3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca2g3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop quovadisrootca2g3 CRL
  */
 
 /*
@@ -321,9 +321,9 @@
  * @summary Interoperability tests with QuoVadis Root CA3 G3 CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca3g3 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca3g3 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop quovadisrootca3g3 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop quovadisrootca3g3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop quovadisrootca3g3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop quovadisrootca3g3 CRL
  */
 
 /*
@@ -332,9 +332,9 @@
  * @summary Interoperability tests with DigiCert TLS ECC P384 Root G5
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop digicerttlseccrootg5 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop digicerttlseccrootg5 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop digicerttlseccrootg5 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop digicerttlseccrootg5 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop digicerttlseccrootg5 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop digicerttlseccrootg5 CRL
  */
 
 /*
@@ -343,9 +343,9 @@
  * @summary Interoperability tests with DigiCert TLS RSA4096 Root G5
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop digicerttlsrsarootg5 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop digicerttlsrsarootg5 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop digicerttlsrsarootg5 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop digicerttlsrsarootg5 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop digicerttlsrsarootg5 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop digicerttlsrsarootg5 CRL
  */
 
 /*
@@ -354,9 +354,9 @@
  * @summary Interoperability tests with SSL.com's RSA CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop sslrootrsaca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrootrsaca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop sslrootrsaca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop sslrootrsaca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrootrsaca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop sslrootrsaca CRL
  */
 
 /*
@@ -365,9 +365,9 @@
  * @summary Interoperability tests with SSL.com's EV RSA CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop sslrootevrsaca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrootevrsaca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop sslrootevrsaca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop sslrootevrsaca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrootevrsaca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop sslrootevrsaca CRL
  */
 
 /*
@@ -376,9 +376,9 @@
  * @summary Interoperability tests with SSL.com's ECC CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop sslrooteccca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrooteccca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop sslrooteccca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop sslrooteccca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop sslrooteccca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop sslrooteccca CRL
  */
 
 /*
@@ -387,9 +387,9 @@
  * @summary Interoperability tests with TeliaSonera Root CA v1
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop teliasonerarootcav1 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop teliasonerarootcav1 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop teliasonerarootcav1 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop teliasonerarootcav1 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop teliasonerarootcav1 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop teliasonerarootcav1 CRL
  */
 
 /*
@@ -398,9 +398,9 @@
  * @summary Interoperability tests with TWCA Global Root CA from TAIWAN-CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop twcaglobalrootca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop twcaglobalrootca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop twcaglobalrootca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop twcaglobalrootca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop twcaglobalrootca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop twcaglobalrootca CRL
  */
 
 /*
@@ -409,9 +409,9 @@
  * @summary Interoperability tests with Certigna Root CAs from Dhimyotis
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop certignarootca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certignarootca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop certignarootca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop certignarootca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certignarootca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop certignarootca CRL
  */
 
 /*
@@ -420,9 +420,9 @@
  * @summary Interoperability tests with AffirmTrust Commercial CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop affirmtrustcommercialca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustcommercialca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop affirmtrustcommercialca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop affirmtrustcommercialca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustcommercialca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop affirmtrustcommercialca CRL
  */
 
 /*
@@ -431,9 +431,9 @@
  * @summary Interoperability tests with AffirmTrust Networking CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop affirmtrustnetworkingca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustnetworkingca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop affirmtrustnetworkingca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop affirmtrustnetworkingca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustnetworkingca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop affirmtrustnetworkingca CRL
  */
 
 /*
@@ -442,9 +442,9 @@
  * @summary Interoperability tests with AffirmTrust Premium CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop affirmtrustpremiumca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustpremiumca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop affirmtrustpremiumca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop affirmtrustpremiumca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustpremiumca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop affirmtrustpremiumca CRL
  */
 
 /*
@@ -453,9 +453,9 @@
  * @summary Interoperability tests with AffirmTrust Premium ECC CA
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop affirmtrustpremiumeccca OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustpremiumeccca OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop affirmtrustpremiumeccca CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop affirmtrustpremiumeccca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop affirmtrustpremiumeccca OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop affirmtrustpremiumeccca CRL
  */
 
 /*
@@ -464,9 +464,9 @@
  * @summary Interoperability tests with Telia Root CA V2
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop teliarootcav2 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop teliarootcav2 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop teliarootcav2 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop teliarootcav2 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop teliarootcav2 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop teliarootcav2 CRL
  */
 
 /*
@@ -475,9 +475,9 @@
  * @summary Interoperability tests with eMudhra Root CA G1
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop emsignrootcag1 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop emsignrootcag1 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop emsignrootcag1 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop emsignrootcag1 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop emsignrootcag1 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop emsignrootcag1 CRL
  */
 
 /*
@@ -486,9 +486,9 @@
  * @summary Interoperability tests with eMudhra ECC Root CA G3
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop emsigneccrootcag3 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop emsigneccrootcag3 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop emsigneccrootcag3 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop emsigneccrootcag3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop emsigneccrootcag3 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop emsigneccrootcag3 CRL
  */
 
 /*
@@ -497,8 +497,8 @@
  * @summary Interoperability tests with Certainly Root R1
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop certainlyrootr1 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certainlyrootr1 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop certainlyrootr1 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certainlyrootr1 DEFAULT
  */
 
 /*
@@ -507,8 +507,8 @@
  * @summary Interoperability tests with Certainly Root E1
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop certainlyroote1 DEFAULT
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certainlyroote1 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop certainlyroote1 DEFAULT
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop certainlyroote1 DEFAULT
  */
 
 /*
@@ -517,9 +517,9 @@
  * @summary Interoperability tests with GlobalSign Root R46
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop globalsignr46 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsignr46 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop globalsignr46 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop globalsignr46 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsignr46 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop globalsignr46 CRL
  */
 
 /*
@@ -528,13 +528,15 @@
  * @summary Interoperability tests with GlobalSign Root E46
  * @library /test/lib
  * @build jtreg.SkippedException ValidatePathWithURL CAInterop
- * @run main/othervm -Djava.security.debug=certpath,ocsp CAInterop globalsigne46 OCSP
- * @run main/othervm -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsigne46 OCSP
- * @run main/othervm -Djava.security.debug=certpath CAInterop globalsigne46 CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp CAInterop globalsigne46 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath,ocsp -Dcom.sun.security.ocsp.useget=false CAInterop globalsigne46 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CAInterop globalsigne46 CRL
  */
 
 /**
- * Collection of certificate validation tests for interoperability with external CAs
+ * Collection of certificate validation tests for interoperability with external CAs.
+ * These tests are marked as manual as they depend on external infrastructure and may fail
+ * with external reasons, for instance - change in CA test portal.
  */
 public class CAInterop {
 
diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CertignaCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CertignaCA.java
index f1dd2d6229a..eb09d56a14e 100644
--- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CertignaCA.java
+++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/CertignaCA.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,8 +26,8 @@
  * @bug 8245654 8256895
  * @summary Interoperability tests with Certigna Root CAs from Dhimyotis
  * @build ValidatePathWithParams
- * @run main/othervm -Djava.security.debug=certpath CertignaCA OCSP
- * @run main/othervm -Djava.security.debug=certpath CertignaCA CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath CertignaCA OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath CertignaCA CRL
  */
 public class CertignaCA {
     // Owner: CN=Certigna Services CA, OID.2.5.4.97=NTRFR-48146308100036,
diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DTrustCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DTrustCA.java
index 152e77907bb..13a2e8044da 100644
--- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DTrustCA.java
+++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DTrustCA.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,8 +27,8 @@
  * @summary Interoperability tests with "D-Trust Root Class 3 CA 2 2009" and
  *          "D-Trust Root Class 3 CA 2 EV 2009" CAs
  * @build ValidatePathWithParams
- * @run main/othervm -Djava.security.debug=certpath DTrustCA OCSP
- * @run main/othervm -Djava.security.debug=certpath DTrustCA CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath DTrustCA OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath DTrustCA CRL
  */
 public class DTrustCA {
 
diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DigicertCSRootG5.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DigicertCSRootG5.java
index 30ad81b1755..4b45bb857ba 100644
--- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DigicertCSRootG5.java
+++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/DigicertCSRootG5.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,8 +26,8 @@
  * @bug 8318759
  * @summary Interoperability tests with Digicert CS Root G5 certificates
  * @build ValidatePathWithParams
- * @run main/othervm -Djava.security.debug=ocsp,certpath DigicertCSRootG5 OCSP
- * @run main/othervm -Djava.security.debug=certpath DigicertCSRootG5 CRL
+ * @run main/othervm/manual -Djava.security.debug=ocsp,certpath DigicertCSRootG5 OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath DigicertCSRootG5 CRL
  */
 
 public class DigicertCSRootG5 {
diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/EmSignRootG2CA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/EmSignRootG2CA.java
index 8f5df9cce75..14e48a6e78f 100644
--- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/EmSignRootG2CA.java
+++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/EmSignRootG2CA.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,8 +26,8 @@
  * @bug 8319187
  * @summary Interoperability tests with eMudhra emSign Root CA G2 CS root
  * @build ValidatePathWithParams
- * @run main/othervm -Djava.security.debug=certpath EmSignRootG2CA OCSP
- * @run main/othervm -Djava.security.debug=certpath EmSignRootG2CA CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath EmSignRootG2CA OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath EmSignRootG2CA CRL
  */
 
 public class EmSignRootG2CA {
diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/HaricaCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/HaricaCA.java
index 247502e6e6c..744e9b6bf34 100644
--- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/HaricaCA.java
+++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/HaricaCA.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,8 +26,8 @@
  * @bug 8256421
  * @summary Interoperability tests with Harica CAs
  * @build ValidatePathWithParams
- * @run main/othervm -Djava.security.debug=certpath HaricaCA OCSP
- * @run main/othervm -Djava.security.debug=certpath HaricaCA CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath HaricaCA OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath HaricaCA CRL
  */
 
 /*
diff --git a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java
index 469501c70c2..3e9631848c2 100644
--- a/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java
+++ b/test/jdk/security/infra/java/security/cert/CertPathValidator/certification/LuxTrustCA.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,8 +26,8 @@
  * @bug 8232019 8256895
  * @summary Interoperability tests with LuxTrust Global Root 2 CA
  * @build ValidatePathWithParams
- * @run main/othervm -Djava.security.debug=certpath LuxTrustCA OCSP
- * @run main/othervm -Djava.security.debug=certpath LuxTrustCA CRL
+ * @run main/othervm/manual -Djava.security.debug=certpath LuxTrustCA OCSP
+ * @run main/othervm/manual -Djava.security.debug=certpath LuxTrustCA CRL
  */
 
 /*
diff --git a/test/jdk/security/infra/javax/net/ssl/HttpsURLConnectionTest.java b/test/jdk/security/infra/javax/net/ssl/HttpsURLConnectionTest.java
index 7aeb67e842d..7e08d6cd4fe 100644
--- a/test/jdk/security/infra/javax/net/ssl/HttpsURLConnectionTest.java
+++ b/test/jdk/security/infra/javax/net/ssl/HttpsURLConnectionTest.java
@@ -28,7 +28,7 @@
  *          KEYCHAINSTORE-ROOT trust store
  * @library /test/lib
  * @requires os.family == "mac"
- * @run main/othervm HttpsURLConnectionTest https://github.com KeychainStore-Root
+ * @run main/othervm/manual HttpsURLConnectionTest https://github.com KeychainStore-Root
  */
 import java.io.*;
 import java.net.*;
diff --git a/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java b/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java
index 770b642088a..09e32174c74 100644
--- a/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java
+++ b/test/jdk/sun/management/jmxremote/bootstrap/RmiBootstrapTest.java
@@ -61,6 +61,7 @@
  *
  * @library /test/lib
  *
+ * @run main/othervm/timeout=300 RmiBootstrapTest .*_test.*.in
  * @run main/othervm/timeout=300 -Djava.security.manager=allow RmiBootstrapTest .*_test.*.in
  * */
 
@@ -72,6 +73,7 @@
  *
  * @library /test/lib
  *
+ * @run main/othervm/timeout=300 RmiBootstrapTest .*_ssltest.*.in
  * @run main/othervm/timeout=300 -Djava.security.manager=allow RmiBootstrapTest .*_ssltest.*.in
  * */
 
diff --git a/test/jdk/sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java b/test/jdk/sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java
index 32796985a8b..e859d671a67 100644
--- a/test/jdk/sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java
+++ b/test/jdk/sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2024, 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
@@ -173,7 +173,7 @@ public static void main (String[] args) throws Exception {
                     c=is.read();
                     System.out.println("client reads: "+c);
                 } catch (IOException ioe) {
-                    is.read ();
+                    System.out.println("client got expected exception: "+ioe);
                     break;
                 }
             }
diff --git a/test/jdk/sun/security/ec/ECDHPrimitive.java b/test/jdk/sun/security/ec/ECDHPrimitive.java
new file mode 100644
index 00000000000..b41b93bc5ff
--- /dev/null
+++ b/test/jdk/sun/security/ec/ECDHPrimitive.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2018, 2024, 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.*;
+import java.math.BigInteger;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.*;
+import java.security.spec.*;
+import java.util.*;
+import javax.crypto.*;
+
+import jdk.test.lib.Asserts;
+
+/*
+ * @test
+ * @bug 8189189
+ * @summary Test ECDH primitive operations
+ * @library /test/lib
+ * @run main ECDHPrimitive
+ */
+public class ECDHPrimitive {
+
+
+    private static final Map<String, String> NAME_MAP = Map.of(
+            "P-256", "secp256r1",
+            "P-384", "secp384r1",
+            "P-521", "secp521r1"
+    );
+
+    public static void main(String[] args) throws Exception {
+        Path testFile = Path.of(System.getProperty("test.src"), "KAS_ECC_CDH_PrimitiveTest.txt");
+
+        ECParameterSpec ecParams = null;
+
+        try (BufferedReader in = Files.newBufferedReader(testFile)) {
+            Map<String, byte[]> values = new HashMap<>();
+            String line = in.readLine();
+            while (line != null) {
+                line = line.trim();
+                if (line.startsWith("#") || line.length() == 0) {
+                    // ignore
+                } else if (line.startsWith("[")) {
+                    // change curve name
+                    StringTokenizer tok = new StringTokenizer(line, "[]");
+                    String name = tok.nextToken();
+                    String curveName = lookupName(name);
+
+                    if (curveName == null) {
+                        System.out.println("Unknown curve: " + name
+                                + ". Skipping test");
+                        ecParams = null;
+                    } else {
+                        AlgorithmParameters params
+                                = AlgorithmParameters.getInstance("EC");
+
+                        params.init(new ECGenParameterSpec(curveName));
+                        ecParams = params.getParameterSpec(
+                                ECParameterSpec.class);
+                        System.out.println("Testing curve: " + curveName);
+                    }
+
+                } else if (line.startsWith("ZIUT")) {
+                    addKeyValue(line, values);
+                    if (ecParams != null) {
+                        runTest(ecParams, values);
+                    }
+                } else {
+                    addKeyValue(line, values);
+                }
+
+                line = in.readLine();
+            }
+        }
+    }
+
+    private static void runTest(ECParameterSpec ecParams,
+                                Map<String, byte[]> values) throws Exception {
+
+        byte[] xArr = values.get("QCAVSx");
+        BigInteger x = new BigInteger(1, xArr);
+        byte[] yArr = values.get("QCAVSy");
+        BigInteger y = new BigInteger(1, yArr);
+        ECPoint w = new ECPoint(x, y);
+        ECPublicKeySpec pubSpec = new ECPublicKeySpec(w, ecParams);
+
+        byte[] dArr = values.get("dIUT");
+        BigInteger d = new BigInteger(1, dArr);
+        ECPrivateKeySpec priSpec = new ECPrivateKeySpec(d, ecParams);
+
+        KeyFactory kf = KeyFactory.getInstance("EC");
+        PublicKey pub = kf.generatePublic(pubSpec);
+        PrivateKey pri = kf.generatePrivate(priSpec);
+
+        KeyAgreement ka = KeyAgreement.getInstance("ECDH");
+        ka.init(pri);
+        ka.doPhase(pub, true);
+        byte[] secret = ka.generateSecret();
+
+        byte[] expectedSecret = values.get("ZIUT");
+        Asserts.assertEqualsByteArray(secret, expectedSecret, "Incorrect secret value");
+        int testIndex = values.get("COUNT")[0];
+        System.out.println("Test " + testIndex + " passed.");
+    }
+
+    private static void addKeyValue(String line, Map<String, byte[]> values) {
+        StringTokenizer tok = new StringTokenizer(line, " =");
+        String key = tok.nextToken();
+        String value = tok.nextToken();
+        byte[] valueArr;
+        if (value.length() <= 2) {
+            valueArr = new byte[1];
+            valueArr[0] = Byte.parseByte(value, 10);
+        } else {
+            valueArr = HexFormat.of().parseHex(value);
+        }
+
+        values.put(key, valueArr);
+    }
+
+    private static String lookupName(String name) {
+        return NAME_MAP.get(name);
+    }
+}
\ No newline at end of file
diff --git a/test/jdk/sun/security/ec/ECDSAPrimitive.java b/test/jdk/sun/security/ec/ECDSAPrimitive.java
new file mode 100644
index 00000000000..ba9ed0dec80
--- /dev/null
+++ b/test/jdk/sun/security/ec/ECDSAPrimitive.java
@@ -0,0 +1,429 @@
+/*
+ * Copyright (c) 2018, 2024, 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.*;
+import java.math.BigInteger;
+import java.nio.file.Path;
+import java.security.*;
+import java.security.spec.*;
+import java.util.*;
+
+import sun.security.ec.*;
+import sun.security.ec.point.*;
+import sun.security.util.ArrayUtil;
+import sun.security.util.math.*;
+import jdk.test.lib.Asserts;
+
+/*
+ * @test
+ * @bug 8189189 8147502 8295010
+ * @summary Test ECDSA primitive operations
+ * @library /test/lib
+ * @modules java.base/sun.security.ec java.base/sun.security.ec.point
+ *          java.base/sun.security.util java.base/sun.security.util.math
+ * @run main ECDSAPrimitive
+ */
+public class ECDSAPrimitive {
+
+    private static final Map<String, String> CURVE_NAME_MAP = Map.ofEntries(
+            Map.entry("P-256", "secp256r1"),
+            Map.entry("P-384", "secp384r1"),
+            Map.entry("P-521", "secp521r1")
+    );
+    private static final Set<String> DIGEST_NAME_SET = Set.of(
+            "SHA-224",
+            "SHA-256",
+            "SHA-384",
+            "SHA-512"
+    );
+
+    public static void main(String[] args) throws Exception {
+        Path siggenFile = Path.of(System.getProperty("test.src"), "SigGen-1.txt");
+
+        ECParameterSpec ecParams = null;
+        String digestAlg = null;
+
+        try (BufferedReader in = new BufferedReader(new FileReader(
+                siggenFile.toFile()))) {
+            Map<String, byte[]> values = new HashMap<>();
+            String line = in.readLine();
+            while (line != null) {
+                line = line.trim();
+                if (line.startsWith("#") || line.length() == 0) {
+                    // ignore
+                } else if (line.startsWith("[")) {
+                    // change curve and hash
+                    StringTokenizer tok = new StringTokenizer(line, "[,]");
+                    String name = tok.nextToken();
+                    String curveName = lookUpCurveName(name);
+
+                    String digestName = tok.nextToken();
+                    digestAlg = lookUpDigestName(digestName);
+
+                    if (curveName == null) {
+                        System.out.println("Unknown curve: " + name
+                                + ". Skipping test");
+                        ecParams = null;
+                        digestAlg = null;
+                    }
+                    if (digestAlg == null) {
+                        System.out.println("Unknown digest: " + digestName
+                                + ". Skipping test");
+                        ecParams = null;
+                        digestAlg = null;
+                    } else {
+                        AlgorithmParameters params =
+                                AlgorithmParameters.getInstance("EC", "SunEC");
+                        params.init(new ECGenParameterSpec(curveName));
+                        ecParams = params.getParameterSpec(
+                                ECParameterSpec.class);
+                        System.out.println("Testing curve/digest: "
+                                + curveName + "/" + digestAlg);
+                    }
+
+                } else if (line.startsWith("S")) {
+                    addKeyValue(line, values);
+                    if (ecParams != null) {
+                        runTest(ecParams, digestAlg, values);
+                    }
+                } else {
+                    addKeyValue(line, values);
+                }
+
+                line = in.readLine();
+            }
+        }
+    }
+
+    private static void runTest(ECParameterSpec ecParams, String digestAlg,
+                                Map<String, byte[]> values) throws Exception {
+
+        Optional<ECDSAOperations> opsOpt =
+                ECDSAOperations.forParameters(ecParams);
+        Optional<Signer> signerOpt = opsOpt.map(OpsSigner::new);
+        Signer signer = signerOpt.orElseGet(() -> new JCASigner(ecParams));
+
+        byte[] msg = values.get("Msg");
+        MessageDigest md = MessageDigest.getInstance(digestAlg);
+        byte[] digest = md.digest(msg);
+
+        // all operations accept little endian private key and nonce
+        byte[] privateKey = values.get("d");
+        byte[] k = values.get("k");
+
+        byte[] computedSig = signer.sign(privateKey, digest, k);
+
+        int valueLength = computedSig.length / 2;
+        byte[] computedR = Arrays.copyOf(computedSig, valueLength);
+        byte[] expectedR = values.get("R");
+        Asserts.assertEquals(new BigInteger(1, expectedR), new BigInteger(1, computedR), "R");
+
+        byte[] computedS = Arrays.copyOfRange(computedSig, valueLength,
+                2 * valueLength);
+        byte[] expectedS = values.get("S");
+        Asserts.assertEquals(new BigInteger(1, expectedS), new BigInteger(1, computedS), "S");
+
+        // ensure public key is correct
+        byte[] expectedQx = values.get("Qx");
+        byte[] expectedQy = values.get("Qy");
+        ECPoint ecPublicKey =
+                signer.checkPublicKey(privateKey, expectedQx, expectedQy);
+
+        // ensure the verification works
+        if (!signer.verify(ecPublicKey, digest, computedSig)) {
+            throw new RuntimeException("Signature did not verify");
+        }
+
+        // ensure incorrect signature does not verify
+        int length = k.length;
+        computedSig[length / 2] ^= (byte) 1;
+        if (signer.verify(ecPublicKey, digest, computedSig)) {
+            throw new RuntimeException("Incorrect signature verified");
+        }
+        computedSig[length / 2] ^= (byte) 1;
+        computedSig[length + length / 2] ^= (byte) 1;
+        if (signer.verify(ecPublicKey, digest, computedSig)) {
+            throw new RuntimeException("Incorrect signature verified");
+        }
+
+        System.out.println("Test case passed");
+    }
+
+    private static void addKeyValue(String line, Map<String, byte[]> values) {
+        StringTokenizer tok = new StringTokenizer(line, " =");
+        String key = tok.nextToken();
+        String value = tok.nextToken();
+        byte[] valueArr;
+        if (value.length() <= 2) {
+            valueArr = new byte[1];
+            valueArr[0] = Byte.parseByte(value, 10);
+        } else {
+            // some values are odd-length big-endian integers
+            if (value.length() % 2 == 1) {
+                if (key.equals("Msg")) {
+                    throw new RuntimeException("message length may not be odd");
+                }
+                value = "0" + value;
+            }
+            valueArr = HexFormat.of().parseHex(value);
+        }
+
+        values.put(key, valueArr);
+    }
+
+    private static String lookUpCurveName(String name) {
+        return CURVE_NAME_MAP.get(name);
+    }
+
+    private static String lookUpDigestName(String name) {
+        return DIGEST_NAME_SET.contains(name) ? name : null;
+    }
+
+    public static boolean verifySignedDigest(ECDSAOperations ops, ECPoint publicKey,
+                                             byte[] digest, byte[] signature) {
+
+        try {
+            return verifySignedDigestImpl(ops, publicKey, digest, signature);
+        } catch (ImproperSignatureException ex) {
+            return false;
+        }
+    }
+
+    private static boolean verifySignedDigestImpl(ECDSAOperations ops, ECPoint publicKey,
+                                                  byte[] digest, byte[] signature)
+            throws ImproperSignatureException {
+
+        ECOperations ecOps = ops.getEcOperations();
+        IntegerFieldModuloP orderField = ecOps.getOrderField();
+        int orderBits = orderField.getSize().bitLength();
+        if (orderBits % 8 != 0 && orderBits < digest.length * 8) {
+            // This implementation does not support truncating digests to
+            // a length that is not a multiple of 8.
+            throw new ProviderException("Invalid digest length");
+        }
+        // decode signature as (r, s)
+        byte[] rBytes = Arrays.copyOf(signature, signature.length / 2);
+        ArrayUtil.reverse(rBytes);
+        byte[] sBytes = Arrays.copyOfRange(signature, signature.length / 2,
+                signature.length);
+        ArrayUtil.reverse(sBytes);
+
+        // convert r and s to field elements
+        // TODO: reject non-canonical values
+        IntegerModuloP s = orderField.getElement(sBytes);
+        IntegerModuloP r = orderField.getElement(rBytes);
+
+        // truncate the digest and interpret as a field element
+        int length = (orderBits + 7) / 8;
+        int lengthE = Math.min(length, digest.length);
+        byte[] E = new byte[lengthE];
+        System.arraycopy(digest, 0, E, 0, lengthE);
+        ArrayUtil.reverse(E);
+        IntegerModuloP e = orderField.getElement(E);
+
+        // perform the calculation
+        IntegerModuloP sInverse = s.multiplicativeInverse();
+        IntegerModuloP u1 = e.multiply(sInverse);
+        IntegerModuloP u2 = r.multiply(sInverse);
+
+        byte[] u1Bytes = u1.asByteArray(length);
+        byte[] u2Bytes = u2.asByteArray(length);
+        AffinePoint publicKeyPoint = ECDSAOperations.toAffinePoint(publicKey,
+                ecOps.getField());
+        MutablePoint R = ecOps.multiply(publicKeyPoint, u2Bytes);
+        AffinePoint a1 = ops.basePointMultiply(u1Bytes);
+        MutablePoint p2 = new ProjectivePoint.Mutable(
+                a1.getX(false).mutable(),
+                a1.getY(false).mutable(),
+                ecOps.getField().get1().mutable());
+        ecOps.setSum(R, p2);
+
+        // can't continue if R is neutral
+        if (ecOps.isNeutral(R)) {
+            throw new ImproperSignatureException();
+        }
+
+        IntegerModuloP xr = R.asAffine().getX();
+        byte[] temp = new byte[length];
+        xr.asByteArray(temp);
+        IntegerModuloP v = orderField.getElement(temp);
+
+        // Check that v==r by subtracting and comparing result to 0
+        v.subtract(r).mutable().asByteArray(temp);
+        return ECOperations.allZero(temp);
+    }
+
+    private interface Signer {
+        byte[] sign(byte[] privateKey, byte[] digest, byte[] k);
+
+        ECPoint checkPublicKey(byte[] privateKey, byte[] expectedQx,
+                               byte[] expectedQy);
+
+        boolean verify(ECPoint ecPublicKey, byte[] digest, byte[] sig);
+    }
+
+    private static class FixedRandom extends SecureRandom {
+
+        private final byte[] val;
+
+        public FixedRandom(byte[] val) {
+            BigInteger biVal = new BigInteger(1, val);
+            biVal = biVal.subtract(BigInteger.ONE);
+            byte[] temp = biVal.toByteArray();
+            this.val = new byte[val.length];
+            int inStartPos = Math.max(0, temp.length - val.length);
+            int outStartPos = Math.max(0, val.length - temp.length);
+            System.arraycopy(temp, inStartPos, this.val, outStartPos,
+                    temp.length - inStartPos);
+        }
+
+        @Override
+        public void nextBytes(byte[] bytes) {
+            Arrays.fill(bytes, (byte) 0);
+            int copyLength = Math.min(val.length, bytes.length - 2);
+            System.arraycopy(val, 0, bytes, bytes.length - copyLength - 2,
+                    copyLength);
+        }
+    }
+
+    // The signature verification function lives here. It is not used in the
+    // JDK, but it is working, and the performance is roughly as good as the
+    // native implementation in the JDK.
+
+    private static class JCASigner implements Signer {
+
+        private static final String SIG_ALG = "NONEwithECDSAinP1363Format";
+        private final ECParameterSpec ecParams;
+
+        private JCASigner(ECParameterSpec ecParams) {
+            this.ecParams = ecParams;
+        }
+
+        @Override
+        public byte[] sign(byte[] privateKey, byte[] digest, byte[] k) {
+
+            try {
+
+                KeyFactory kf = KeyFactory.getInstance("EC", "SunEC");
+                BigInteger s = new BigInteger(1, privateKey);
+                ECPrivateKeySpec privKeySpec =
+                        new ECPrivateKeySpec(s, ecParams);
+                PrivateKey privKey = kf.generatePrivate(privKeySpec);
+
+                Signature sig = Signature.getInstance(SIG_ALG, "SunEC");
+                sig.initSign(privKey, new FixedRandom(k));
+                sig.update(digest);
+                return sig.sign();
+            } catch (Exception ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+
+        @Override
+        public ECPoint checkPublicKey(byte[] privateKey, byte[] expectedQx,
+                                      byte[] expectedQy) {
+            // no way to compute the public key using the API
+            BigInteger x = new BigInteger(1, expectedQx);
+            BigInteger y = new BigInteger(1, expectedQy);
+            return new ECPoint(x, y);
+        }
+
+        @Override
+        public boolean verify(ECPoint ecPublicKey, byte[] digest,
+                              byte[] providedSig) {
+
+            try {
+                KeyFactory kf = KeyFactory.getInstance("EC", "SunEC");
+                ECPublicKeySpec pubKeySpec =
+                        new ECPublicKeySpec(ecPublicKey, ecParams);
+                PublicKey pubKey = kf.generatePublic(pubKeySpec);
+
+                Signature sig = Signature.getInstance(SIG_ALG, "SunEC");
+                sig.initVerify(pubKey);
+                sig.update(digest);
+                return sig.verify(providedSig);
+            } catch (Exception ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+    }
+
+    private static class OpsSigner implements Signer {
+
+        private final ECDSAOperations ops;
+
+        public OpsSigner(ECDSAOperations ops) {
+            this.ops = ops;
+        }
+
+        @Override
+        public byte[] sign(byte[] privateKey, byte[] digest, byte[] k) {
+
+            privateKey = privateKey.clone();
+            ArrayUtil.reverse(privateKey);
+            k = k.clone();
+            ArrayUtil.reverse(k);
+            ECDSAOperations.Nonce nonce = new ECDSAOperations.Nonce(k);
+            try {
+                return ops.signDigest(privateKey, digest, nonce);
+            } catch (Exception ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+
+        @Override
+        public ECPoint checkPublicKey(byte[] privateKey, byte[] expectedQx,
+                                      byte[] expectedQy) {
+
+            privateKey = privateKey.clone();
+            ArrayUtil.reverse(privateKey);
+            AffinePoint publicKey = ops.basePointMultiply(privateKey);
+            int length = privateKey.length;
+            byte[] computedQx = new byte[length];
+            byte[] computedQy = new byte[length];
+            publicKey.getX().asByteArray(computedQx);
+            ArrayUtil.reverse(computedQx);
+            Asserts.assertEqualsByteArray(expectedQx, computedQx, "Qx");
+            publicKey.getY().asByteArray(computedQy);
+            ArrayUtil.reverse(computedQy);
+            Asserts.assertEqualsByteArray(expectedQy, computedQy, "Qy");
+            BigInteger bigX = publicKey.getX().asBigInteger();
+            BigInteger bigY = publicKey.getY().asBigInteger();
+            return new ECPoint(bigX, bigY);
+        }
+
+        @Override
+        public boolean verify(ECPoint publicKey, byte[] digest, byte[] sig) {
+            return verifySignedDigest(ops, publicKey, digest, sig);
+        }
+    }
+
+    /*
+     * An exception indicating that a signature is not formed correctly.
+     */
+    private static class ImproperSignatureException extends Exception {
+
+        private static final long serialVersionUID = 1;
+    }
+
+}
diff --git a/test/jdk/sun/security/ec/KAS_ECC_CDH_PrimitiveTest.txt b/test/jdk/sun/security/ec/KAS_ECC_CDH_PrimitiveTest.txt
new file mode 100644
index 00000000000..00da4fa3aef
--- /dev/null
+++ b/test/jdk/sun/security/ec/KAS_ECC_CDH_PrimitiveTest.txt
@@ -0,0 +1,3049 @@
+#  CAVS 14.1
+#  ECC CDH Primitive (SP800-56A Section 5.7.1.2) Test Information for "testecccdh"
+#  Curves tested: Curves tested: P-192 P-224 P-256 P-384 P-521 K-163 K-233 K-283 K-409 K-571 B-163 B-233 B-283 B-409 B-571 
+#  Generated on Mon Nov 19 10:52:17 2012
+
+[P-192]
+
+COUNT = 0
+QCAVSx = 42ea6dd9969dd2a61fea1aac7f8e98edcc896c6e55857cc0
+QCAVSy = dfbe5d7c61fac88b11811bde328e8a0d12bf01a9d204b523
+dIUT = f17d3fea367b74d340851ca4270dcb24c271f445bed9d527
+QIUTx = b15053401f57285637ec324c1cd2139e3a67de3739234b37
+QIUTy = f269c158637482aad644cd692dd1d3ef2c8a7c49e389f7f6
+ZIUT = 803d8ab2e5b6e6fca715737c3a82f7ce3c783124f6d51cd0
+
+COUNT = 1
+QCAVSx = deb5712fa027ac8d2f22c455ccb73a91e17b6512b5e030e7
+QCAVSy = 7e2690a02cc9b28708431a29fb54b87b1f0c14e011ac2125
+dIUT = 56e853349d96fe4c442448dacb7cf92bb7a95dcf574a9bd5
+QIUTx = c00d435716ffea53fd8c162792414c37665187e582716539
+QIUTy = ab711c62aa71a5a18e8a3c48f89dc6fa52fac0108e52a8a0
+ZIUT = c208847568b98835d7312cef1f97f7aa298283152313c29d
+
+COUNT = 2
+QCAVSx = 4edaa8efc5a0f40f843663ec5815e7762dddc008e663c20f
+QCAVSy = 0a9f8dc67a3e60ef6d64b522185d03df1fc0adfd42478279
+dIUT = c6ef61fe12e80bf56f2d3f7d0bb757394519906d55500949
+QIUTx = e184bc182482f3403c8787b83842477467fcd011db0f6c64
+QIUTy = f9d1c14142f40de8639db97d51a63d2cce1007ccf773cdcb
+ZIUT = 87229107047a3b611920d6e3b2c0c89bea4f49412260b8dd
+
+COUNT = 3
+QCAVSx = 8887c276edeed3e9e866b46d58d895c73fbd80b63e382e88
+QCAVSy = 04c5097ba6645e16206cfb70f7052655947dd44a17f1f9d5
+dIUT = e6747b9c23ba7044f38ff7e62c35e4038920f5a0163d3cda
+QIUTx = 2b838dbe73735f37a39a78d3195783d26991e86ff4d92d1a
+QIUTy = 60d344942274489f98903b2e7f93f8d197fc9ae60a0ed53a
+ZIUT = eec0bed8fc55e1feddc82158fd6dc0d48a4d796aaf47d46c
+
+COUNT = 4
+QCAVSx = 0d045f30254adc1fcefa8a5b1f31bf4e739dd327cd18d594
+QCAVSy = 542c314e41427c08278a08ce8d7305f3b5b849c72d8aff73
+dIUT = beabedd0154a1afcfc85d52181c10f5eb47adc51f655047d
+QIUTx = 1f65cf6e8978e1c1bc10bb61a7db311de310088c8cf9768b
+QIUTy = f7d438168e7f42ab14b16af53a7a2f646ff40b53d74cbcc7
+ZIUT = 716e743b1b37a2cd8479f0a3d5a74c10ba2599be18d7e2f4
+
+COUNT = 5
+QCAVSx = fb35ca20d2e96665c51b98e8f6eb3d79113508d8bccd4516
+QCAVSy = 368eec0d5bfb847721df6aaff0e5d48c444f74bf9cd8a5a7
+dIUT = cf70354226667321d6e2baf40999e2fd74c7a0f793fa8699
+QIUTx = 5f4844ffcce61005d24f737db98675e92f7b6543aeb6106c
+QIUTy = 5424f598139215d389b6b12b86d58014857f2ddadb540f51
+ZIUT = f67053b934459985a315cb017bf0302891798d45d0e19508
+
+COUNT = 6
+QCAVSx = 824752960c1307e5f13a83da21c7998ca8b5b00b9549f6d0
+QCAVSy = bc52d91e234363bc32ee0b6778f25cd8c1847510f4348b94
+dIUT = fe942515237fffdd7b4eb5c64909eee4856a076cdf12bae2
+QIUTx = e6369df79b207b8b8679f7c869cfc264859d1ab55aa401e8
+QIUTy = 1f99c71f801a30b52f74da6e5e6dbb62ee4c5da1090cc020
+ZIUT = 75822971193edd472bf30151a782619c55ad0b279c9303dd
+
+COUNT = 7
+QCAVSx = 10bb57020291141981f833b4749e5611034b308e84011d21
+QCAVSy = e1cacd6b7bd17ed8ddb50b6aee0654c35f2d0eddc1cffcf6
+dIUT = 33fed10492afa5bea0333c0af12cac940c4d222455bcd0fe
+QIUTx = ef0b28afc41637d737f42e4c8aaceadc84ba2e0b849ca18c
+QIUTy = 57797942e552173bba17f73278e029f42335068bd770ddf2
+ZIUT = 67cba2cbb69ee78bf1abafb0e6fbe33fa2094c128d59652d
+
+COUNT = 8
+QCAVSx = 5192fce4185a7758ea1bc56e0e4f4e8b2dce32348d0dced1
+QCAVSy = 20989981beaaf0006d88a96e7971a2fa3a33ba46047fc7ba
+dIUT = f3557c5d70b4c7954960c33568776adbe8e43619abe26b13
+QIUTx = d70112c5f0f0844386494ac1ad99dce2214134176ebfb9af
+QIUTy = d3c187a038510ab31d459e2b7af1a380dd7576af06267548
+ZIUT = cf99a2770a386ca0137d1eca0a226e484297ac3c513f3631
+
+COUNT = 9
+QCAVSx = 26d019dbe279ead01eed143a91601ada26e2f42225b1c62b
+QCAVSy = 6ca653f08272e0386fc9421fbd580093d7ae6301bca94476
+dIUT = 586cfba1c6e81766ed52828f177b1be14ebbc5b83348c311
+QIUTx = 58b3c63e56bec9d696bf9a88df2873738391f76368aa2b49
+QIUTy = 5776773b261faf7ba2fdc4fe43b92c0b1c7a2fd054a43650
+ZIUT = 576331e2b4fb38a112810e1529834de8307fb0a0d2756877
+
+COUNT = 10
+QCAVSx = 539bc40fe20a0fb267888b647b03eaaf6ec20c02a1e1f8c8
+QCAVSy = 69095e5bb7b4d44c3278a7ee6beca397c45246da9a34c8be
+dIUT = cad8100603a4f65be08d8fc8a1b7e884c5ff65deb3c96d99
+QIUTx = b7fcc0f52c7a411edbed39e10bf02b6ae0f26614c6b325a2
+QIUTy = 47483b26eb67776de2b93ab7119d5447573739e3d55e72fb
+ZIUT = 902f4501916a0dd945554c3a37b3d780d375a6da713197c4
+
+COUNT = 11
+QCAVSx = 5d343ddb96318fb4794d10f6c573f99fee5d0d57b996250f
+QCAVSy = 99fbdf9d97dd88ad410235dac36e5b92ce2824b8e587a82c
+dIUT = 1edd879cc5c79619cae6c73a691bd5a0395c0ef3b356fcd2
+QIUTx = 6ce6adb2c30808f590048c33dffad4524ebf7a5fd39b747b
+QIUTy = 4966bd2f3d00569b4d4c0409fbd7a2db752f6d09bca8c25f
+ZIUT = 46e4de335054d429863218ae33636fc9b89c628b64b506c7
+
+COUNT = 12
+QCAVSx = 8d3db9bdce137ffbfb891388c37df6c0cbc90aa5e5376220
+QCAVSy = 135d30b5cb660eef8764ffc744f15c1b5d6dc06ba4416d37
+dIUT = 460e452273fe1827602187ad3bebee65cb84423bb4f47537
+QIUTx = d1bd3a3efabf4767fe6380bdf0dbf49d52d4cf0cbb89404c
+QIUTy = c150c2b4c8b3aa35f765f847e4f7f8fd8704d241a181ee99
+ZIUT = 1bfe9e5a20ac7a38d8f605b425bb9030be31ef97c101c76c
+
+COUNT = 13
+QCAVSx = 9e0a6949519c7f5be68c0433c5fdf13064aa13fb29483dc3
+QCAVSy = e1c8ba63e1f471db23185f50d9c871edea21255b3a63b4b7
+dIUT = b970365008456f8758ecc5a3b33cf3ae6a8d568107a52167
+QIUTx = c1b8610c8c63f8d4abda093b9a11a566044bf65c6faa8999
+QIUTy = a5bc4b3ca095382e9738aee95fe9479b17879b3ad5295559
+ZIUT = 0e8c493a4adc445dc9288a3b9b272599224054592d7265b3
+
+COUNT = 14
+QCAVSx = be088238902e9939b3d054eeeb8492daf4bdcf09a2ab77f1
+QCAVSy = 58d6749a3a923dc80440f2661fd35b651617e65294b46375
+dIUT = 59c15b8a2464e41dfe4371c7f7dadf470ae425544f8113bd
+QIUTx = 1fe776f73567b6ac0b0d6764164de6c5be751ba8d1ff455e
+QIUTy = 4c160bf38afb2b71f684261664115ce874553e8b059432d2
+ZIUT = 0f1991086b455ded6a1c4146f7bf59fe9b495de566ebc6bf
+
+COUNT = 15
+QCAVSx = bf5ae05025e1be617e666d87a4168363873d5761b376b503
+QCAVSy = e1e6e38b372b6bee0ff5b3502d83735e3b2c26825e4f0fcc
+dIUT = a6e9b885c66b959d1fc2708d591b6d3228e49eb98f726d61
+QIUTx = 632bb7651dbf49dde9dd125d13fb234e06617723beed3d1b
+QIUTy = f4ad5209638488397c5f44f994dd7479807e79f4887d2e71
+ZIUT = b30f2127c34df35aaa91dbf0bbe15798e799a03ed11698c1
+
+COUNT = 16
+QCAVSx = 6cc4feed84c7ab0d09005d660ed34de6955a9461c4138d11
+QCAVSy = 31225f33864ed48da06fa45a913b46cf42557742e35085e6
+dIUT = bdb754096ffbfbd8b0f3cb046ccb7ca149c4e7192067a3ee
+QIUTx = d9c098d421d741f6faab116f3e4731d28c5558e19fe112a1
+QIUTy = 38d4dc48ccdb1d3ed8d31fd06784a4f87a68aec1cbd5b08f
+ZIUT = 64a5c246599d3e8177a2402a1110eb81e6c456ab4edb5127
+
+COUNT = 17
+QCAVSx = 36157315bee7afedded58c4e8ba14d3421c401e51135bcc9
+QCAVSy = 37c297ca703f77c52bb062d8ce971db84097ba0c753a418f
+dIUT = d5bcf2534dafc3d99964c7bd63ab7bd15999fe56dd969c42
+QIUTx = fda1d5d28d6fe0e7909d6a8bafa7824db5572ab92ffe7de6
+QIUTy = 134a297c1d9c8bbab249abacd951ed11e5a99f92e7991572
+ZIUT = 017b8ca53c82fab163da2ab783966a39e061b32c8cfa334d
+
+COUNT = 18
+QCAVSx = 98464d47f0256f8292e027e8c92582ea77cf9051f5ce8e5d
+QCAVSy = 449552ef7578be96236fe5ed9d0643c0bb6c5a9134b0108d
+dIUT = 43d4b9df1053be5b4268104c02244d3bf9594b010b46a8b2
+QIUTx = c3020b7091463d788f1f1d76f7cfeec82ecdb3b7d99c345c
+QIUTy = 9a7710d5179591d8f3df0aa122301768ae7db7eee2d7f583
+ZIUT = 340ef3db3dbebdd91c62c3d4e1a3da2c7c52a3338b865259
+
+COUNT = 19
+QCAVSx = 563eb66c334cf6f123bf04c7803b48a3110214237e983bf5
+QCAVSy = 0f351104819199ef07c9a6051d20758f3af79027ea66a53f
+dIUT = 94cac2c2ca714746401670d94edbf3f677867b5a03bee7ad
+QIUTx = b18554a2e743ef0aa2f040987c4c451004e096df3d80ddae
+QIUTy = 6e3e2c618f896e36ba620077684b70a05ffb79bf5e6c7640
+ZIUT = 2162144921df5103d0e6a650fb13fd246f4738d0896ce92f
+
+COUNT = 20
+QCAVSx = 86828c4ac92b5507618aec7873a1d4fc6543c5be33cf3078
+QCAVSy = b22ca72437545e10d6d4f052422eb898b737a4b8543ee550
+dIUT = 2a3a9e33c8cc3107a9f9265c3bdea1206570e86f92ac7014
+QIUTx = a7ba38be1bc669dd23ccfcee0645b1f0db8cf942deafaeb6
+QIUTy = b82db79d80cd0e37f28d4163adc389dee8fc7797b5c9831b
+ZIUT = 4c69e7feed4b11159adfc16a6047a92572ea44e0740b23af
+
+COUNT = 21
+QCAVSx = 6700a102437781a9581da2bc25ced5abf419da91d3c803df
+QCAVSy = 71396c9cf08bcd91854e3e6e42d8c657ce0f27ab77a9dc4b
+dIUT = 4a6b78a98ac98fa8e99a8ece08ec0251125f85c6fd0e289b
+QIUTx = e769dbbcd5ce2d83514b768d3d2d5aa0bcd8f66af15f5500
+QIUTy = 2fc6d0b039e0f28f74fbeffe9e883d4dd72296e4e95cae71
+ZIUT = 46072acefd67bff50de355ca7a31fa6be59f26e467587259
+
+COUNT = 22
+QCAVSx = a82f354cf97bee5d22dc6c079f2902ead44d96a8f614f178
+QCAVSy = a654a9aa8a1a0802f2ce0ee8a0f4ebe96dee1b37464b1ff2
+dIUT = c5a6491d78844d6617ef33be6b8bd54da221450885d5950f
+QIUTx = db1b24f7466bc154e9d7d2c3ca52dcfe0bfc9563c5fdb6f3
+QIUTy = 1c74fbbf5bd99921f1a9a744f8e1cf770bd6a76a772b3003
+ZIUT = ec5580eabca9f3389d2b427ddf6e49e26d629afd03fa766e
+
+COUNT = 23
+QCAVSx = 3cec21b28668a12a2cf78e1a8e55d0efe065152fffc34718
+QCAVSy = 1029557beba4ff1992bd21c23cb4825f6dae70e3318fd1ca
+dIUT = 2ba2703c5e23f6463c5b88dc37292fabd3399b5e1fb67c05
+QIUTx = 7543148906cef9b37a71a7c08363cdd3bba50142d65241aa
+QIUTy = 8b3a6973de8dc271e27c1ead1e962fdaae3710c724daac38
+ZIUT = 7f3929dd3cbf7673bc30d859d90b880307475f800660ea32
+
+COUNT = 24
+QCAVSx = 7082644715b8b731f8228b5118e7270d34d181f361a221fc
+QCAVSy = 464649d6c88ca89614488a1cc7b8442bb42f9fb3020a3d76
+dIUT = 836118c6248f882e9147976f764826c1a28755a6102977d5
+QIUTx = fcd345a976c720caaa97de6697226825615e1287a9eff67e
+QIUTy = 58ea42edbeeafca9ff44cfd7f29abd2cbde7626d79e422c9
+ZIUT = 72e88f3ea67d46d46dbf83926e7e2a6b85b54536741e6d2c
+
+
+[P-224]
+
+COUNT = 0
+QCAVSx = af33cd0629bc7e996320a3f40368f74de8704fa37b8fab69abaae280
+QCAVSy = 882092ccbba7930f419a8a4f9bb16978bbc3838729992559a6f2e2d7
+dIUT = 8346a60fc6f293ca5a0d2af68ba71d1dd389e5e40837942df3e43cbd
+QIUTx = 8de2e26adf72c582d6568ef638c4fd59b18da171bdf501f1d929e048
+QIUTy = 4a68a1c2b0fb22930d120555c1ece50ea98dea8407f71be36efac0de
+ZIUT = 7d96f9a3bd3c05cf5cc37feb8b9d5209d5c2597464dec3e9983743e8
+
+COUNT = 1
+QCAVSx = 13bfcd4f8e9442393cab8fb46b9f0566c226b22b37076976f0617a46
+QCAVSy = eeb2427529b288c63c2f8963c1e473df2fca6caa90d52e2f8db56dd4
+dIUT = 043cb216f4b72cdf7629d63720a54aee0c99eb32d74477dac0c2f73d
+QIUTx = 2f90f5c8eac9c7decdbb97b6c2f715ab725e4fe40fe6d746efbf4e1b
+QIUTy = 66897351454f927a309b269c5a6d31338be4c19a5acfc32cf656f45c
+ZIUT = ee93ce06b89ff72009e858c68eb708e7bc79ee0300f73bed69bbca09
+
+COUNT = 2
+QCAVSx = 756dd806b9d9c34d899691ecb45b771af468ec004486a0fdd283411e
+QCAVSy = 4d02c2ca617bb2c5d9613f25dd72413d229fd2901513aa29504eeefb
+dIUT = 5ad0dd6dbabb4f3c2ea5fe32e561b2ca55081486df2c7c15c9622b08
+QIUTx = 005bca45d793e7fe99a843704ed838315ab14a5f6277507e9bc37531
+QIUTy = 43e9d421e1486ae5893bfd23c210e5c140d7c6b1ada59d842c9a98de
+ZIUT = 3fcc01e34d4449da2a974b23fc36f9566754259d39149790cfa1ebd3
+
+COUNT = 3
+QCAVSx = 0f537bf1c1122c55656d25e8aa8417e0b44b1526ae0523144f9921c4
+QCAVSy = f79b26d30e491a773696cc2c79b4f0596bc5b9eebaf394d162fb8684
+dIUT = 0aa6ff55a5d820efcb4e7d10b845ea3c9f9bc5dff86106db85318e22
+QIUTx = 2f96754131e0968198aa78fbe8c201dc5f3581c792de487340d32448
+QIUTy = 61e8a5cd79615203b6d89e9496f9e236fe3b6be8731e743d615519c6
+ZIUT = 49129628b23afcef48139a3f6f59ff5e9811aa746aa4ff33c24bb940
+
+COUNT = 4
+QCAVSx = 2b3631d2b06179b3174a100f7f57131eeea8947be0786c3dc64b2239
+QCAVSy = 83de29ae3dad31adc0236c6de7f14561ca2ea083c5270c78a2e6cbc0
+dIUT = efe6e6e25affaf54c98d002abbc6328da159405a1b752e32dc23950a
+QIUTx = 355e962920bde043695f6bffb4b355c63da6f5de665ed46f2ec817e2
+QIUTy = 748e095368f62e1d364edd461719793b404adbdaacbcadd88922ff37
+ZIUT = fcdc69a40501d308a6839653a8f04309ec00233949522902ffa5eac6
+
+COUNT = 5
+QCAVSx = 4511403de29059f69a475c5a6a5f6cabed5d9f014436a8cb70a02338
+QCAVSy = 7d2d1b62aa046df9340f9c37a087a06b32cf7f08a223f992812a828b
+dIUT = 61cb2932524001e5e9eeed6df7d9c8935ee3322029edd7aa8acbfd51
+QIUTx = d50e4adabfd989d7dbc7cf4052546cc7c447a97630436997ad4b9536
+QIUTy = 5bea503473c5eaef9552d42c40b1f2f7ca292733b255b9bbe1b12337
+ZIUT = 827e9025cb62e0e837c596063f3b9b5a0f7afd8d8783200086d61ec1
+
+COUNT = 6
+QCAVSx = 314a0b26dd31c248845d7cc17b61cad4608259bed85a58d1f1ffd378
+QCAVSy = 66e4b350352e119eecada382907f3619fd748ea73ae4899dfd496302
+dIUT = 8c7ace347171f92def98d845475fc82e1d1496da81ee58f505b985fa
+QIUTx = b1a8dcac89aca2799320b451df1c7ff4d97567abb68141c0d95fc2aa
+QIUTy = 3524950902b1510bdc987d860afc27ad871ceaea66935abd3c0a99a8
+ZIUT = 335ba51228d94acbed851ca7821c801d5cb1c7975d7aa90a7159f8fa
+
+COUNT = 7
+QCAVSx = abe6843beec2fd9e5fb64730d0be4d165438ce922ed75dd80b4603e5
+QCAVSy = 6afe8673a96c4ba9900ad85995e631e436c6cc88a2c2b47b7c4886b8
+dIUT = 382feb9b9ba10f189d99e71a89cdfe44cb554cec13a212840977fb68
+QIUTx = abb6f1e3773ff8fc73aea2a0b107809ce70adcefed6e41fc5cb43045
+QIUTy = a963897ae906c10a055eeadb97ffdd6f748d3e5621e5fff304e48ba7
+ZIUT = 8c2e627594206b34f7356d3426eb3d79f518ef843fbe94014cceace3
+
+COUNT = 8
+QCAVSx = 13cf9d6d2c9aae8274c27d446afd0c888ffdd52ae299a35984d4f527
+QCAVSy = dcbee75b515751f8ee2ae355e8afd5de21c62a939a6507b538cbc4af
+dIUT = e0d62035101ef487c485c60fb4500eebe6a32ec64dbe97dbe0232c46
+QIUTx = 88537735e9b23e3e0e076f135a82d33f9bffb465f3abce8322a62a62
+QIUTy = b4c8c123673197875c0bd14ed097606d330fba2b9200ef65a44764d3
+ZIUT = 632abb662728dbc994508873d5c527ca5ef923c0d31fa6c47ef4c825
+
+COUNT = 9
+QCAVSx = 965b637c0dfbc0cf954035686d70f7ec30929e664e521dbaa2280659
+QCAVSy = 82a58ff61bc90019bbcbb5875d3863db0bc2a1fa34b0ad4de1a83f99
+dIUT = b96ade5b73ba72aa8b6e4d74d7bf9c58e962ff78eb542287c7b44ba2
+QIUTx = 37682926a54f70a4c1748f54d50d5b00138a055f924f2c65e5b0bbe4
+QIUTy = 596afefcdd640d29635015b89bdddd1f8c2723686d332e7a06ca8799
+ZIUT = 34641141aab05ef58bd376d609345901fb8f63477c6be9097f037f1f
+
+COUNT = 10
+QCAVSx = 73cc645372ca2e71637cda943d8148f3382ab6dd0f2e1a49da94e134
+QCAVSy = df5c355c23e6e232ebc3bee2ab1873ee0d83e3382f8e6fe613f6343c
+dIUT = a40d7e12049c71e6522c7ff2384224061c3a457058b310557655b854
+QIUTx = 399801243bfe0c2da9b0a53c8ca57f2eee87aaa94a8e4d5e029f42ca
+QIUTy = aa49e6d4b47cee7a5c4ab71d5a67da84e0b9b425ce3e70da68c889e7
+ZIUT = 4f74ac8507501a32bfc5a78d8271c200e835966e187e8d00011a8c75
+
+COUNT = 11
+QCAVSx = 546578216250354e449e21546dd11cd1c5174236739acad9ce0f4512
+QCAVSy = d2a22fcd66d1abedc767668327c5cb9c599043276239cf3c8516af24
+dIUT = ad2519bc724d484e02a69f05149bb047714bf0f5986fac2e222cd946
+QIUTx = df9c1e0ef15e53b9f626e2be1cbe893639c06f3e0439ee95d7d4b1e3
+QIUTy = 7a52a7386adda243efdf8941085c84e31239cab92b8017336748965e
+ZIUT = ad09c9ae4d2324ea81bb555b200d3c003e22a6870ee03b52df49e4de
+
+COUNT = 12
+QCAVSx = 1d46b1dc3a28123cb51346e67baec56404868678faf7d0e8b2afa22a
+QCAVSy = 0ec9e65ec97e218373e7fc115c2274d5b829a60d93f71e01d58136c3
+dIUT = 3d312a9b9d8ed09140900bbac1e095527ebc9e3c6493bcf3666e3a29
+QIUTx = b4a0198dc8810e884425b750928b0c960c31f7a99663400b01a179df
+QIUTy = 812b601bfc0738242c6f86f830f27acd632ca618a0b5280c9d5769f7
+ZIUT = ef029c28c68064b8abd2965a38c404fb5e944ace57e8638daba9d3cd
+
+COUNT = 13
+QCAVSx = 266d038cc7a4fe21f6c976318e827b82bb5b8f7443a55298136506e0
+QCAVSy = df123d98a7a20bbdf3943df2e3563422f8c0cf74d53aaabdd7c973ba
+dIUT = 8ce0822dc24c153995755ac350737ef506641c7d752b4f9300c612ed
+QIUTx = 00dfc7ec137690cd6d12fdb2fd0b8c5314582108769c2b722ffb3958
+QIUTy = 5eef3da4ba458127346bb64023868bddb7558a2ecfc813645f4ce9fe
+ZIUT = f83c16661dfcbad021cc3b5a5af51d9a18db4653866b3ff90787ce3e
+
+COUNT = 14
+QCAVSx = eb0a09f7a1c236a61f595809ec5670efd92e4598d5e613e092cdfdca
+QCAVSy = 50787ae2f2f15b88bc10f7b5f0aee1418373f16153aebd1fba54288d
+dIUT = 0ff9b485325ab77f29e7bc379fed74bfac859482da0dee7528c19db2
+QIUTx = 7e603e6976db83c36011508fa695d1b515249e2e54b48fcbcfb90247
+QIUTy = 0179a600ce86adfca9b1b931fa5173d618da09e841803d19b0264286
+ZIUT = f51258c63f232e55a66aa25ebd597b2018d1052c02eeb63866758005
+
+COUNT = 15
+QCAVSx = 6b2f6b18a587f562ffc61bd9b0047322286986a78f1fd139b84f7c24
+QCAVSy = 7096908e4615266be59a53cd655515056ff92370a6271a5d3823d704
+dIUT = 19cf5ff6306467f28b9fe0675a43c0582552c8c12e59ce7c38f292b1
+QIUTx = fc20e906e609c112cfc2e0fea6303882c5db94e87e022373ab2c082a
+QIUTy = aecdf1daa71782bc5a26bbbd8d7e8a76490e26abc17dffc774bd7341
+ZIUT = 7fdc969a186ff18429f2a276dac43beea21182d82ce2e5a0876552b1
+
+COUNT = 16
+QCAVSx = 328101ba826acd75ff9f34d5574ce0dbc92f709bad8d7a33c47940c1
+QCAVSy = df39f1ea88488c55d5538160878b9ced18a887ea261dd712d14024ff
+dIUT = 90a15368e3532c0b1e51e55d139447c2c89bc160719d697291ea7c14
+QIUTx = c6837d506e976da7db3ad1267c359dff2ea6fb0b7f7f8e77024c59e9
+QIUTy = 67eb491d2fc8a530c46525d2a8b2d7c1df5fba1ae740a4649c683ee6
+ZIUT = 3d60ab6db2b3ffe2d29ccff46d056e54230cf34982e241556ed2920c
+
+COUNT = 17
+QCAVSx = 0081e34270871e2ebbd94183f617b4ae15f0416dd634fe6e934cf3c0
+QCAVSy = 3a1e9f38a7b90b7317d26b9f6311063ab58b268cf489b2e50386d5d6
+dIUT = 8e0838e05e1721491067e1cabc2e8051b290e2616eec427b7121897d
+QIUTx = e9150f770075626019e18f95473b71e6828041791d3f08d3faeeaa2b
+QIUTy = 475f70735eaae52308a3b763dc88efe18ab590ebafa035f6e08b001c
+ZIUT = 9116d72786f4db5df7a8b43078c6ab9160d423513d35ea5e2559306d
+
+COUNT = 18
+QCAVSx = 2623632fdf0bd856805a69aa186d4133ef5904e1f655a972d66cce07
+QCAVSy = 2cef9728dd06fb8b50150f529b695076d4507983912585c89bd0682e
+dIUT = 38106e93f16a381adb1d72cee3da66ae462ad4bbfea9ecdf35d0814e
+QIUTx = 7be6c4c917829ab657dd79e8637d7aefd2f81f0de7654d957e97658d
+QIUTy = 430d22d9e8438310f61e0d43f25fa3e34585f432baad27db3021bf0d
+ZIUT = 207c53dcefac789aaa0276d9200b3a940ce5f2296f4cb2e81a185d3d
+
+COUNT = 19
+QCAVSx = 8ee4d1dcc31dee4bf6fe21ca8a587721d910acfb122c16c2a77a8152
+QCAVSy = 4ebf323fff04eb477069a0ac68b345f6b1ae134efc31940e513cb99f
+dIUT = e5d1718431cf50f6cbd1bc8019fa16762dfa12c989e5999977fb4ea2
+QIUTx = 2ea4966e7f92ed7f5cc61fde792045f63b731d6e7d0de2577f2d8ece
+QIUTy = 1c4a7b1ede6f839162292df424be78e8176fb6f942a3c02391700f31
+ZIUT = 10e467da34f48ad7072005bccd6da1b2ba3f71eafa1c393842f91d74
+
+COUNT = 20
+QCAVSx = 97dcbe6d28335882a6d193cc54a1063dd0775dc328565300bb99e691
+QCAVSy = dad11dd5ece8cfd9f97c9a526e4a1506e6355969ee87826fc38bcd24
+dIUT = 3d635691b62a9a927c633951c9369c8862bd2119d30970c2644727d6
+QIUTx = 438bbb980517afb20be1d674e3ac2b31cef07a9b23fb8f6e38e0d6c0
+QIUTy = 0be5f1c47d58d21b6ed28423b32f5a94750da47edcef33ea79942afd
+ZIUT = 82fd2f9c60c4f999ac00bbe64bfc11da8ff8cda2e499fced65230bb1
+
+COUNT = 21
+QCAVSx = ce9126dd53972dea1de1d11efef900de34b661859c4648c5c0e534f7
+QCAVSy = e113b6f2c1659d07f2716e64a83c18bbce344dd2121fe85168eae085
+dIUT = acf3c85bbdc379f02f5ea36e7f0f53095a9e7046a28685a8659bf798
+QIUTx = ff7511215c71d796bd646e8474be4416b91684ce0d269ef6f422013b
+QIUTy = b7bf5e79b5a9393bb9ea42c0bdb2d3c2dc806e1a7306aa58e4fdbea5
+ZIUT = 530f7e7fc932613b29c981f261cb036cba3f1df3864e0e1cba2685a2
+
+COUNT = 22
+QCAVSx = 84419967d6cfad41e75a02b6da605a97949a183a97c306c4b46e66a5
+QCAVSy = 5cc9b259718b1bc8b144fde633a894616ffd59a3a6d5d8e942c7cbb7
+dIUT = cffd62cb00a0e3163fbf2c397fadc9618210f86b4f54a675287305f0
+QIUTx = 04bf4d948f4430d18b4ed6c96dbaf981fa11a403ed16887f06754981
+QIUTy = 7c1326a9cef51f79d4e78303d6064b459f612584ac2fdf593d7d5d84
+ZIUT = 49f6fd0139248ef4df2db05d1319bd5b1489e249827a45a8a5f12427
+
+COUNT = 23
+QCAVSx = 7c9cac35768063c2827f60a7f51388f2a8f4b7f8cd736bd6bc337477
+QCAVSy = 29ee6b849c6025d577dbcc55fbd17018f4edbc2ef105b004d6257bcd
+dIUT = 85f903e43943d13c68932e710e80de52cbc0b8f1a1418ea4da079299
+QIUTx = 970a4a7e01d4188497ceb46955eb1b842d9085819a9b925c84529d3d
+QIUTy = dfa2526480f833ea0edbd204e4e365fef3472888fe7d9691c3ebc09f
+ZIUT = 8f7e34e597ae8093b98270a74a8dfcdbed457f42f43df487c5487161
+
+COUNT = 24
+QCAVSx = 085a7642ad8e59b1a3e8726a7547afbecffdac1dab7e57230c6a9df4
+QCAVSy = f91c36d881fe9b8047a3530713554a1af4c25c5a8e654dcdcf689f2e
+dIUT = cce64891a3d0129fee0d4a96cfbe7ac470b85e967529057cfa31a1d9
+QIUTx = a6b29632db94da2125dc1cf80e03702687b2acc1122022fa2174765a
+QIUTy = 61723edd73e10daed73775278f1958ba56f1fc9d085ebc2b64c84fe5
+ZIUT = 71954e2261e8510be1a060733671d2e9d0a2d012eb4e09556d697d2a
+
+
+[P-256]
+
+COUNT = 0
+QCAVSx = 700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287
+QCAVSy = db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac
+dIUT = 7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534
+QIUTx = ead218590119e8876b29146ff89ca61770c4edbbf97d38ce385ed281d8a6b230
+QIUTy = 28af61281fd35e2fa7002523acc85a429cb06ee6648325389f59edfce1405141
+ZIUT = 46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b
+
+COUNT = 1
+QCAVSx = 809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7ae
+QCAVSy = b29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3
+dIUT = 38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5
+QIUTx = 119f2f047902782ab0c9e27a54aff5eb9b964829ca99c06b02ddba95b0a3f6d0
+QIUTy = 8f52b726664cac366fc98ac7a012b2682cbd962e5acb544671d41b9445704d1d
+ZIUT = 057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67
+
+COUNT = 2
+QCAVSx = a2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3
+QCAVSy = ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536
+dIUT = 1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8
+QIUTx = d9f2b79c172845bfdb560bbb01447ca5ecc0470a09513b6126902c6b4f8d1051
+QIUTy = f815ef5ec32128d3487834764678702e64e164ff7315185e23aff5facd96d7bc
+ZIUT = 2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ec
+
+COUNT = 3
+QCAVSx = df3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed
+QCAVSy = 422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4
+dIUT = 207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d
+QIUTx = 24277c33f450462dcb3d4801d57b9ced05188f16c28eda873258048cd1607e0d
+QIUTy = c4789753e2b1f63b32ff014ec42cd6a69fac81dfe6d0d6fd4af372ae27c46f88
+ZIUT = 96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024
+
+COUNT = 4
+QCAVSx = 41192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb922
+QCAVSy = 1af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328
+dIUT = 59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf
+QIUTx = a8c5fdce8b62c5ada598f141adb3b26cf254c280b2857a63d2ad783a73115f6b
+QIUTy = 806e1aafec4af80a0d786b3de45375b517a7e5b51ffb2c356537c9e6ef227d4a
+ZIUT = 19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62
+
+COUNT = 5
+QCAVSx = 33e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792
+QCAVSy = f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2f
+dIUT = f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef
+QIUTx = 7b861dcd2844a5a8363f6b8ef8d493640f55879217189d80326aad9480dfc149
+QIUTy = c4675b45eeb306405f6c33c38bc69eb2bdec9b75ad5af4706aab84543b9cc63a
+ZIUT = 664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3
+
+COUNT = 6
+QCAVSx = 6a9e0c3f916e4e315c91147be571686d90464e8bf981d34a90b6353bca6eeba7
+QCAVSy = 40f9bead39c2f2bcc2602f75b8a73ec7bdffcbcead159d0174c6c4d3c5357f05
+dIUT = 3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190
+QIUTx = 9fb38e2d58ea1baf7622e96720101cae3cde4ba6c1e9fa26d9b1de0899102863
+QIUTy = d5561b900406edf50802dd7d73e89395f8aed72fba0e1d1b61fe1d22302260f0
+ZIUT = ca342daa50dc09d61be7c196c85e60a80c5cb04931746820be548cdde055679d
+
+COUNT = 7
+QCAVSx = a9c0acade55c2a73ead1a86fb0a9713223c82475791cd0e210b046412ce224bb
+QCAVSy = f6de0afa20e93e078467c053d241903edad734c6b403ba758c2b5ff04c9d4229
+dIUT = d8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8
+QIUTx = 20f07631e4a6512a89ad487c4e9d63039e579cb0d7a556cb9e661cd59c1e7fa4
+QIUTy = 6de91846b3eee8a5ec09c2ab1f41e21bd83620ccdd1bdce3ab7ea6e02dd274f5
+ZIUT = 35aa9b52536a461bfde4e85fc756be928c7de97923f0416c7a3ac8f88b3d4489
+
+COUNT = 8
+QCAVSx = 94e94f16a98255fff2b9ac0c9598aac35487b3232d3231bd93b7db7df36f9eb9
+QCAVSy = d8049a43579cfa90b8093a94416cbefbf93386f15b3f6e190b6e3455fedfe69a
+dIUT = 0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d
+QIUTx = abb61b423be5d6c26e21c605832c9142dc1dfe5a5fff28726737936e6fbf516d
+QIUTy = 733d2513ef58beab202090586fac91bf0fee31e80ab33473ab23a2d89e58fad6
+ZIUT = 605c16178a9bc875dcbff54d63fe00df699c03e8a888e9e94dfbab90b25f39b4
+
+COUNT = 9
+QCAVSx = e099bf2a4d557460b5544430bbf6da11004d127cb5d67f64ab07c94fcdf5274f
+QCAVSy = d9c50dbe70d714edb5e221f4e020610eeb6270517e688ca64fb0e98c7ef8c1c5
+dIUT = 2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08
+QIUTx = 3d63e429cb5fa895a9247129bf4e48e89f35d7b11de8158efeb3e106a2a87395
+QIUTy = 0cae9e477ef41e7c8c1064379bb7b554ddcbcae79f9814281f1e50f0403c61f3
+ZIUT = f96e40a1b72840854bb62bc13c40cc2795e373d4e715980b261476835a092e0b
+
+COUNT = 10
+QCAVSx = f75a5fe56bda34f3c1396296626ef012dc07e4825838778a645c8248cff01658
+QCAVSy = 33bbdf1b1772d8059df568b061f3f1122f28a8d819167c97be448e3dc3fb0c3c
+dIUT = 77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848
+QIUTx = ad5d13c3db508ddcd38457e5991434a251bed49cf5ddcb59cdee73865f138c9f
+QIUTy = 62cec1e70588aa4fdfc7b9a09daa678081c04e1208b9d662b8a2214bf8e81a21
+ZIUT = 8388fa79c4babdca02a8e8a34f9e43554976e420a4ad273c81b26e4228e9d3a3
+
+COUNT = 11
+QCAVSx = 2db4540d50230756158abf61d9835712b6486c74312183ccefcaef2797b7674d
+QCAVSy = 62f57f314e3f3495dc4e099012f5e0ba71770f9660a1eada54104cdfde77243e
+dIUT = 42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e
+QIUTx = ab48caa61ea35f13f8ed07ffa6a13e8db224dfecfae1a7df8b1bb6ebaf0cb97d
+QIUTy = 1274530ca2c385a3218bddfbcbf0b4024c9badd5243bff834ebff24a8618dccb
+ZIUT = 72877cea33ccc4715038d4bcbdfe0e43f42a9e2c0c3b017fc2370f4b9acbda4a
+
+COUNT = 12
+QCAVSx = cd94fc9497e8990750309e9a8534fd114b0a6e54da89c4796101897041d14ecb
+QCAVSy = c3def4b5fe04faee0a11932229fff563637bfdee0e79c6deeaf449f85401c5c4
+dIUT = ceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b
+QIUTx = 9a8cd9bd72e71752df91440f77c547509a84df98114e7de4f26cdb39234a625d
+QIUTy = d07cfc84c8e144fab2839f5189bb1d7c88631d579bbc58012ed9a2327da52f62
+ZIUT = e4e7408d85ff0e0e9c838003f28cdbd5247cdce31f32f62494b70e5f1bc36307
+
+COUNT = 13
+QCAVSx = 15b9e467af4d290c417402e040426fe4cf236bae72baa392ed89780dfccdb471
+QCAVSy = cdf4e9170fb904302b8fd93a820ba8cc7ed4efd3a6f2d6b05b80b2ff2aee4e77
+dIUT = 43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604
+QIUTx = f989cf8ee956a82e7ebd9881cdbfb2fd946189b08db53559bc8cfdd48071eb14
+QIUTy = 5eff28f1a18a616b04b7d337868679f6dd84f9a7b3d7b6f8af276c19611a541d
+ZIUT = ed56bcf695b734142c24ecb1fc1bb64d08f175eb243a31f37b3d9bb4407f3b96
+
+COUNT = 14
+QCAVSx = 49c503ba6c4fa605182e186b5e81113f075bc11dcfd51c932fb21e951eee2fa1
+QCAVSy = 8af706ff0922d87b3f0c5e4e31d8b259aeb260a9269643ed520a13bb25da5924
+dIUT = b2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903
+QIUTx = 69c627625b36a429c398b45c38677cb35d8beb1cf78a571e40e99fe4eac1cd4e
+QIUTy = 81690112b0a88f20f7136b28d7d47e5fbc2ada3c8edd87589bc19ec9590637bd
+ZIUT = bc5c7055089fc9d6c89f83c1ea1ada879d9934b2ea28fcf4e4a7e984b28ad2cf
+
+COUNT = 15
+QCAVSx = 19b38de39fdd2f70f7091631a4f75d1993740ba9429162c2a45312401636b29c
+QCAVSy = 09aed7232b28e060941741b6828bcdfa2bc49cc844f3773611504f82a390a5ae
+dIUT = 4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8
+QIUTx = 5fe964671315a18aa68a2a6e3dd1fde7e23b8ce7181471cfac43c99e1ae80262
+QIUTy = d5827be282e62c84de531b963884ba832db5d6b2c3a256f0e604fe7e6b8a7f72
+ZIUT = 9a4e8e657f6b0e097f47954a63c75d74fcba71a30d83651e3e5a91aa7ccd8343
+
+COUNT = 16
+QCAVSx = 2c91c61f33adfe9311c942fdbff6ba47020feff416b7bb63cec13faf9b099954
+QCAVSy = 6cab31b06419e5221fca014fb84ec870622a1b12bab5ae43682aa7ea73ea08d0
+dIUT = 4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147
+QIUTx = c9b2b8496f1440bd4a2d1e52752fd372835b364885e154a7dac49295f281ec7c
+QIUTy = fbe6b926a8a4de26ccc83b802b1212400754be25d9f3eeaf008b09870ae76321
+ZIUT = 3ca1fc7ad858fb1a6aba232542f3e2a749ffc7203a2374a3f3d3267f1fc97b78
+
+COUNT = 17
+QCAVSx = a28a2edf58025668f724aaf83a50956b7ac1cfbbff79b08c3bf87dfd2828d767
+QCAVSy = dfa7bfffd4c766b86abeaf5c99b6e50cb9ccc9d9d00b7ffc7804b0491b67bc03
+dIUT = 1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e
+QIUTx = 59e1e101521046ad9cf1d082e9d2ec7dd22530cce064991f1e55c5bcf5fcb591
+QIUTy = 482f4f673176c8fdaa0bb6e59b15a3e47454e3a04297d3863c9338d98add1f37
+ZIUT = 1aaabe7ee6e4a6fa732291202433a237df1b49bc53866bfbe00db96a0f58224f
+
+COUNT = 18
+QCAVSx = a2ef857a081f9d6eb206a81c4cf78a802bdf598ae380c8886ecd85fdc1ed7644
+QCAVSy = 563c4c20419f07bc17d0539fade1855e34839515b892c0f5d26561f97fa04d1a
+dIUT = dd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3
+QIUTx = 30b9db2e2e977bcdc98cb87dd736cbd8e78552121925cf16e1933657c2fb2314
+QIUTy = 6a45028800b81291bce5c2e1fed7ded650620ebbe6050c6f3a7f0dfb4673ab5c
+ZIUT = 430e6a4fba4449d700d2733e557f66a3bf3d50517c1271b1ddae1161b7ac798c
+
+COUNT = 19
+QCAVSx = ccd8a2d86bc92f2e01bce4d6922cf7fe1626aed044685e95e2eebd464505f01f
+QCAVSy = e9ddd583a9635a667777d5b8a8f31b0f79eba12c75023410b54b8567dddc0f38
+dIUT = 5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76
+QIUTx = 46c9ebd1a4a3c8c0b6d572b5dcfba12467603208a9cb5d2acfbb733c40cf6391
+QIUTy = 46c913a27d044185d38b467ace011e04d4d9bbbb8cb9ae25fa92aaf15a595e86
+ZIUT = 1ce9e6740529499f98d1f1d71329147a33df1d05e4765b539b11cf615d6974d3
+
+COUNT = 20
+QCAVSx = c188ffc8947f7301fb7b53e36746097c2134bf9cc981ba74b4e9c4361f595e4e
+QCAVSy = bf7d2f2056e72421ef393f0c0f2b0e00130e3cac4abbcc00286168e85ec55051
+dIUT = b601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d
+QIUTx = 7c9e950841d26c8dde8994398b8f5d475a022bc63de7773fcf8d552e01f1ba0a
+QIUTy = cc42b9885c9b3bee0f8d8c57d3a8f6355016c019c4062fa22cff2f209b5cc2e1
+ZIUT = 4690e3743c07d643f1bc183636ab2a9cb936a60a802113c49bb1b3f2d0661660
+
+COUNT = 21
+QCAVSx = 317e1020ff53fccef18bf47bb7f2dd7707fb7b7a7578e04f35b3beed222a0eb6
+QCAVSy = 09420ce5a19d77c6fe1ee587e6a49fbaf8f280e8df033d75403302e5a27db2ae
+dIUT = fefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535
+QIUTx = 38b54db85500cb20c61056edd3d88b6a9dc26780a047f213a6e1b900f76596eb
+QIUTy = 6387e4e5781571e4eb8ae62991a33b5dc33301c5bc7e125d53794a39160d8fd0
+ZIUT = 30c2261bd0004e61feda2c16aa5e21ffa8d7e7f7dbf6ec379a43b48e4b36aeb0
+
+COUNT = 22
+QCAVSx = 45fb02b2ceb9d7c79d9c2fa93e9c7967c2fa4df5789f9640b24264b1e524fcb1
+QCAVSy = 5c6e8ecf1f7d3023893b7b1ca1e4d178972ee2a230757ddc564ffe37f5c5a321
+dIUT = 334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce
+QIUTx = 3f2bf1589abf3047bf3e54ac9a95379bff95f8f55405f64eca36a7eebe8ffca7
+QIUTy = 5212a94e66c5ae9a8991872f66a72723d80ec5b2e925745c456f5371943b3a06
+ZIUT = 2adae4a138a239dcd93c243a3803c3e4cf96e37fe14e6a9b717be9599959b11c
+
+COUNT = 23
+QCAVSx = a19ef7bff98ada781842fbfc51a47aff39b5935a1c7d9625c8d323d511c92de6
+QCAVSy = e9c184df75c955e02e02e400ffe45f78f339e1afe6d056fb3245f4700ce606ef
+dIUT = 2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d
+QIUTx = 29c0807f10cbc42fb45c9989da50681eead716daa7b9e91fd32e062f5eb92ca0
+QIUTy = ff1d6d1955d7376b2da24fe1163a271659136341bc2eb1195fc706dc62e7f34d
+ZIUT = 2e277ec30f5ea07d6ce513149b9479b96e07f4b6913b1b5c11305c1444a1bc0b
+
+COUNT = 24
+QCAVSx = 356c5a444c049a52fee0adeb7e5d82ae5aa83030bfff31bbf8ce2096cf161c4b
+QCAVSy = 57d128de8b2a57a094d1a001e572173f96e8866ae352bf29cddaf92fc85b2f92
+dIUT = 85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0
+QIUTx = 9cf4b98581ca1779453cc816ff28b4100af56cf1bf2e5bc312d83b6b1b21d333
+QIUTy = 7a5504fcac5231a0d12d658218284868229c844a04a3450d6c7381abe080bf3b
+ZIUT = 1e51373bd2c6044c129c436e742a55be2a668a85ae08441b6756445df5493857
+
+
+[P-384]
+
+COUNT = 0
+QCAVSx = a7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066
+QCAVSy = ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437a
+dIUT = 3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1
+QIUTx = 9803807f2f6d2fd966cdd0290bd410c0190352fbec7ff6247de1302df86f25d34fe4a97bef60cff548355c015dbb3e5f
+QIUTy = ba26ca69ec2f5b5d9dad20cc9da711383a9dbe34ea3fa5a2af75b46502629ad54dd8b7d73a8abb06a3a3be47d650cc99
+ZIUT = 5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1
+
+COUNT = 1
+QCAVSx = 30f43fcf2b6b00de53f624f1543090681839717d53c7c955d1d69efaf0349b7363acb447240101cbb3af6641ce4b88e0
+QCAVSy = 25e46c0c54f0162a77efcc27b6ea792002ae2ba82714299c860857a68153ab62e525ec0530d81b5aa15897981e858757
+dIUT = 92860c21bde06165f8e900c687f8ef0a05d14f290b3f07d8b3a8cc6404366e5d5119cd6d03fb12dc58e89f13df9cd783
+QIUTx = ea4018f5a307c379180bf6a62fd2ceceebeeb7d4df063a66fb838aa35243419791f7e2c9d4803c9319aa0eb03c416b66
+QIUTy = 68835a91484f05ef028284df6436fb88ffebabcdd69ab0133e6735a1bcfb37203d10d340a8328a7b68770ca75878a1a6
+ZIUT = a23742a2c267d7425fda94b93f93bbcc24791ac51cd8fd501a238d40812f4cbfc59aac9520d758cf789c76300c69d2ff
+
+COUNT = 2
+QCAVSx = 1aefbfa2c6c8c855a1a216774550b79a24cda37607bb1f7cc906650ee4b3816d68f6a9c75da6e4242cebfb6652f65180
+QCAVSy = 419d28b723ebadb7658fcebb9ad9b7adea674f1da3dc6b6397b55da0f61a3eddacb4acdb14441cb214b04a0844c02fa3
+dIUT = 12cf6a223a72352543830f3f18530d5cb37f26880a0b294482c8a8ef8afad09aa78b7dc2f2789a78c66af5d1cc553853
+QIUTx = fcfcea085e8cf74d0dced1620ba8423694f903a219bbf901b0b59d6ac81baad316a242ba32bde85cb248119b852fab66
+QIUTy = 972e3c68c7ab402c5836f2a16ed451a33120a7750a6039f3ff15388ee622b7065f7122bf6d51aefbc29b37b03404581b
+ZIUT = 3d2e640f350805eed1ff43b40a72b2abed0a518bcebe8f2d15b111b6773223da3c3489121db173d414b5bd5ad7153435
+
+COUNT = 3
+QCAVSx = 8bc089326ec55b9cf59b34f0eb754d93596ca290fcb3444c83d4de3a5607037ec397683f8cef07eab2fe357eae36c449
+QCAVSy = d9d16ce8ac85b3f1e94568521aae534e67139e310ec72693526aa2e927b5b322c95a1a033c229cb6770c957cd3148dd7
+dIUT = 8dd48063a3a058c334b5cc7a4ce07d02e5ee6d8f1f3c51a1600962cbab462690ae3cd974fb39e40b0e843daa0fd32de1
+QIUTx = e38c9846248123c3421861ea4d32669a7b5c3c08376ad28104399494c84ff5efa3894adb2c6cbe8c3c913ef2eec5bd3c
+QIUTy = 9fa84024a1028796df84021f7b6c9d02f0f4bd1a612a03cbf75a0beea43fef8ae84b48c60172aadf09c1ad016d0bf3ce
+ZIUT = 6a42cfc392aba0bfd3d17b7ccf062b91fc09bbf3417612d02a90bdde62ae40c54bb2e56e167d6b70db670097eb8db854
+
+COUNT = 4
+QCAVSx = eb952e2d9ac0c20c6cc48fb225c2ad154f53c8750b003fd3b4ed8ed1dc0defac61bcdde02a2bcfee7067d75d342ed2b0
+QCAVSy = f1828205baece82d1b267d0d7ff2f9c9e15b69a72df47058a97f3891005d1fb38858f5603de840e591dfa4f6e7d489e1
+dIUT = 84ece6cc3429309bd5b23e959793ed2b111ec5cb43b6c18085fcaea9efa0685d98a6262ee0d330ee250bc8a67d0e733f
+QIUTx = 3222063a2997b302ee60ee1961108ff4c7acf1c0ef1d5fb0d164b84bce71c431705cb9aea9a45f5d73806655a058bee3
+QIUTy = e61fa9e7fbe7cd43abf99596a3d3a039e99fa9dc93b0bdd9cad81966d17eeaf557068afa7c78466bb5b22032d1100fa6
+ZIUT = ce7ba454d4412729a32bb833a2d1fd2ae612d4667c3a900e069214818613447df8c611de66da200db7c375cf913e4405
+
+COUNT = 5
+QCAVSx = 441d029e244eb7168d647d4df50db5f4e4974ab3fdaf022aff058b3695d0b8c814cc88da6285dc6df1ac55c553885003
+QCAVSy = e8025ac23a41d4b1ea2aa46c50c6e479946b59b6d76497cd9249977e0bfe4a6262622f13d42a3c43d66bdbb30403c345
+dIUT = 68fce2121dc3a1e37b10f1dde309f9e2e18fac47cd1770951451c3484cdb77cb136d00e731260597cc2859601c01a25b
+QIUTx = 868be0e694841830e424d913d8e7d86b84ee1021d82b0ecf523f09fe89a76c0c95c49f2dfbcf829c1e39709d55efbb3b
+QIUTy = 9195eb183675b40fd92f51f37713317e4a9b4f715c8ab22e0773b1bc71d3a219f05b8116074658ee86b52e36f3897116
+ZIUT = ba69f0acdf3e1ca95caaac4ecaf475bbe51b54777efce01ca381f45370e486fe87f9f419b150c61e329a286d1aa265ec
+
+COUNT = 6
+QCAVSx = 3d4e6bf08a73404accc1629873468e4269e82d90d832e58ad72142639b5a056ad8d35c66c60e8149fac0c797bceb7c2f
+QCAVSy = 9b0308dc7f0e6d29f8c277acbc65a21e5adb83d11e6873bc0a07fda0997f482504602f59e10bc5cb476b83d0a4f75e71
+dIUT = b1764c54897e7aae6de9e7751f2f37de849291f88f0f91093155b858d1cc32a3a87980f706b86cc83f927bdfdbeae0bd
+QIUTx = c371222feaa6770c6f3ea3e0dac9740def4fcf821378b7f91ff937c21e0470f70f3a31d5c6b2912195f10926942b48ae
+QIUTy = 047d6b4d765123563f81116bc665b7b8cc6207830d805fd84da7cb805a65baa7c12fd592d1b5b5e3e65d9672a9ef7662
+ZIUT = 1a6688ee1d6e59865d8e3ada37781d36bb0c2717eef92e61964d3927cb765c2965ea80f7f63e58c322ba0397faeaf62b
+
+COUNT = 7
+QCAVSx = f5f6bef1d110da03be0017eac760cc34b24d092f736f237bc7054b3865312a813bcb62d297fb10a4f7abf54708fe2d3d
+QCAVSy = 06fdf8d7dc032f4e10010bf19cbf6159321252ff415fb91920d438f24e67e60c2eb0463204679fa356af44cea9c9ebf5
+dIUT = f0f7a96e70d98fd5a30ad6406cf56eb5b72a510e9f192f50e1f84524dbf3d2439f7287bb36f5aa912a79deaab4adea82
+QIUTx = 99c8c41cb1ab5e0854a346e4b08a537c1706a61553387c8d94943ab15196d40dbaa55b8210a77a5d00915f2c4ea69eab
+QIUTy = 5531065bdcf17bfb3cb55a02e41a57c7f694c383ad289f900fbd656c2233a93c92e933e7a26f54cbb56f0ad875c51bb0
+ZIUT = d06a568bf2336b90cbac325161be7695eacb2295f599500d787f072612aca313ee5d874f807ddef6c1f023fe2b6e7cd0
+
+COUNT = 8
+QCAVSx = 7cdec77e0737ea37c67b89b7137fe38818010f4464438ee4d1d35a0c488cad3fde2f37d00885d36d3b795b9f93d23a67
+QCAVSy = 28c42ee8d6027c56cf979ba4c229fdb01d234944f8ac433650112c3cf0f02844e888a3569dfef7828a8a884589aa055e
+dIUT = 9efb87ddc61d43c482ba66e1b143aef678fbd0d1bebc2000941fabe677fe5b706bf78fce36d100b17cc787ead74bbca2
+QIUTx = 4c34efee8f0c95565d2065d1bbac2a2dd25ae964320eb6bccedc5f3a9b42a881a1afca1bb6b880584fa27b01c193cd92
+QIUTy = d8fb01dbf7cd0a3868c26b951f393c3c56c2858cee901f7793ff5d271925d13a41f8e52409f4eba1990f33acb0bac669
+ZIUT = bb3b1eda9c6560d82ff5bee403339f1e80342338a991344853b56b24f109a4d94b92f654f0425edd4c205903d7586104
+
+COUNT = 9
+QCAVSx = 8eeea3a319c8df99fbc29cb55f243a720d95509515ee5cc587a5c5ae22fbbd009e626db3e911def0b99a4f7ae304b1ba
+QCAVSy = 73877dc94db9adddc0d9a4b24e8976c22d73c844370e1ee857f8d1b129a3bd5f63f40caf3bd0533e38a5f5777074ff9e
+dIUT = d787a57fde22ec656a0a525cf3c738b30d73af61e743ea90893ecb2d7b622add2f94ee25c2171467afb093f3f84d0018
+QIUTx = 171546923b87b2cbbad664f01ce932bf09d6a6118168678446bfa9f0938608cb4667a98f4ec8ac1462285c2508f74862
+QIUTy = fa41cb4db68ae71f1f8a3e8939dc52c2dec61a83c983beb2a02baf29ec49278088882ed0cf56c74b5c173b552ccf63cf
+ZIUT = 1e97b60add7cb35c7403dd884c0a75795b7683fff8b49f9d8672a8206bfdcf0a106b8768f983258c74167422e44e4d14
+
+COUNT = 10
+QCAVSx = a721f6a2d4527411834b13d4d3a33c29beb83ab7682465c6cbaf6624aca6ea58c30eb0f29dd842886695400d7254f20f
+QCAVSy = 14ba6e26355109ad35129366d5e3a640ae798505a7fa55a96a36b5dad33de00474f6670f522214dd7952140ab0a7eb68
+dIUT = 83d70f7b164d9f4c227c767046b20eb34dfc778f5387e32e834b1e6daec20edb8ca5bb4192093f543b68e6aeb7ce788b
+QIUTx = 57cd770f3bbcbe0c78c770eab0b169bc45e139f86378ffae1c2b16966727c2f2eb724572b8f3eb228d130db4ff862c63
+QIUTy = 7ec5c8813b685558d83e924f14bc719f6eb7ae0cbb2c474227c5bda88637a4f26c64817929af999592da6f787490332f
+ZIUT = 1023478840e54775bfc69293a3cf97f5bc914726455c66538eb5623e218feef7df4befa23e09d77145ad577db32b41f9
+
+COUNT = 11
+QCAVSx = d882a8505c2d5cb9b8851fc676677bb0087681ad53faceba1738286b45827561e7da37b880276c656cfc38b32ade847e
+QCAVSy = 34b314bdc134575654573cffaf40445da2e6aaf987f7e913cd4c3091523058984a25d8f21da8326192456c6a0fa5f60c
+dIUT = 8f558e05818b88ed383d5fca962e53413db1a0e4637eda194f761944cbea114ab9d5da175a7d57882550b0e432f395a9
+QIUTx = 9a2f57f4867ce753d72b0d95195df6f96c1fae934f602efd7b6a54582f556cfa539d89005ca2edac08ad9b72dd1f60ba
+QIUTy = d9b94ee82da9cc601f346044998ba387aee56404dc6ecc8ab2b590443319d0b2b6176f9d0eac2d44678ed561607d09a9
+ZIUT = 6ad6b9dc8a6cf0d3691c501cbb967867f6e4bbb764b60dbff8fcff3ed42dbba39d63cf325b4b4078858495ddee75f954
+
+COUNT = 12
+QCAVSx = 815c9d773dbf5fb6a1b86799966247f4006a23c92e68c55e9eaa998b17d8832dd4d84d927d831d4f68dac67c6488219f
+QCAVSy = e79269948b2611484560fd490feec887cb55ef99a4b524880fa7499d6a07283aae2afa33feab97deca40bc606c4d8764
+dIUT = 0f5dee0affa7bbf239d5dff32987ebb7cf84fcceed643e1d3c62d0b3352aec23b6e5ac7fa4105c8cb26126ad2d1892cb
+QIUTx = 23346bdfbc9d7c7c736e02bdf607671ff6082fdd27334a8bc75f3b23681ebe614d0597dd614fae58677c835a9f0b273b
+QIUTy = 82ba36290d2f94db41479eb45ab4eaf67928a2315138d59eecc9b5285dfddd6714f77557216ea44cc6fc119d8243efaf
+ZIUT = cc9e063566d46b357b3fcae21827377331e5e290a36e60cd7c39102b828ae0b918dc5a02216b07fe6f1958d834e42437
+
+COUNT = 13
+QCAVSx = 1c0eeda7a2be000c5bdcda0478aed4db733d2a9e341224379123ad847030f29e3b168fa18e89a3c0fba2a6ce1c28fc3b
+QCAVSy = ec8c1c83c118c4dbea94271869f2d868eb65e8b44e21e6f14b0f4d9b38c068daefa27114255b9a41d084cc4a1ad85456
+dIUT = 037b633b5b8ba857c0fc85656868232e2febf59578718391b81da8541a00bfe53c30ae04151847f27499f8d7abad8cf4
+QIUTx = 8878ac8a947f7d5cb2b47aad24fbb8210d86126585399a2871f84aa9c5fde3074ae540c6bf82275ca822d0feb862bc74
+QIUTy = 632f5cd2f900c2711c32f8930728eb647d31edd8d650f9654e7d33e5ed1b475489d08daa30d8cbcba6bfc3b60d9b5a37
+ZIUT = deff7f03bd09865baf945e73edff6d5122c03fb561db87dec8662e09bed4340b28a9efe118337bb7d3d4f7f568635ff9
+
+COUNT = 14
+QCAVSx = c95c185e256bf997f30b311548ae7f768a38dee43eeeef43083f3077be70e2bf39ac1d4daf360c514c8c6be623443d1a
+QCAVSy = 3e63a663eaf75d8a765ab2b9a35513d7933fa5e26420a5244550ec6c3b6f033b96db2aca3d6ac6aab052ce929595aea5
+dIUT = e3d07106bedcc096e7d91630ffd3094df2c7859db8d7edbb2e37b4ac47f429a637d06a67d2fba33838764ef203464991
+QIUTx = e74a1a2b85f1cbf8dbbdf050cf1aff8acb02fda2fb6591f9d3cfe4e79d0ae938a9c1483e7b75f8db24505d65065cdb18
+QIUTy = 1773ee591822f7abaa856a1a60bc0a5203548dbd1cb5025466eff8481bd07614eaa04a16c3db76905913e972a5b6b59d
+ZIUT = c8b1038f735ad3bb3e4637c3e47eab487637911a6b7950a4e461948329d3923b969e5db663675623611a457fcda35a71
+
+COUNT = 15
+QCAVSx = 3497238a7e6ad166df2dac039aa4dac8d17aa925e7c7631eb3b56e3aaa1c545fcd54d2e5985807910fb202b1fc191d2a
+QCAVSy = a49e5c487dcc7aa40a8f234c979446040d9174e3ad357d404d7765183195aed3f913641b90c81a306ebf0d8913861316
+dIUT = f3f9b0c65a49a506632c8a45b10f66b5316f9eeb06fae218f2da62333f99905117b141c760e8974efc4af10570635791
+QIUTx = a4ad77aa7d86e5361118a6b921710c820721210712f4c347985fdee58aa4effa1e28be80a17b120b139f96300f89b49b
+QIUTy = 1ddf22e07e03f1560d8f45a480094560dba9fae7f9531130c1b57ebb95982496524f31d3797793396fa823f22bdb4328
+ZIUT = d337eaa32b9f716b8747b005b97a553c59dab0c51df41a2d49039cdae705aa75c7b9e7bc0b6a0e8c578c902bc4fff23e
+
+COUNT = 16
+QCAVSx = 90a34737d45b1aa65f74e0bd0659bc118f8e4b774b761944ffa6573c6df4f41dec0d11b697abd934d390871d4b453240
+QCAVSy = 9b590719bb3307c149a7817be355d684893a307764b512eeffe07cb699edb5a6ffbf8d6032e6c79d5e93e94212c2aa4e
+dIUT = 59fce7fad7de28bac0230690c95710c720e528f9a4e54d3a6a8cd5fc5c5f21637031ce1c5b4e3d39647d8dcb9b794664
+QIUTx = 9c43bf971edf09402876ee742095381f78b1bd3aa39b5132af75dbfe7e98bd78bde10fe2e903c2b6379e1deee175a1b0
+QIUTy = a6c58ecea5a477bb01bd543b339f1cc49f1371a2cda4d46eb4e53e250597942351a99665a122ffea9bde0636c375daf2
+ZIUT = 32d292b695a4488e42a7b7922e1ae537d76a3d21a0b2e36875f60e9f6d3e8779c2afb3a413b9dd79ae18e70b47d337c1
+
+COUNT = 17
+QCAVSx = dda546acfc8f903d11e2e3920669636d44b2068aeb66ff07aa266f0030e1535b0ed0203cb8a460ac990f1394faf22f1d
+QCAVSy = 15bbb2597913035faadf413476f4c70f7279769a40c986f470c427b4ee4962abdf8173bbad81874772925fd32f0b159f
+dIUT = 3e49fbf950a424c5d80228dc4bc35e9f6c6c0c1d04440998da0a609a877575dbe437d6a5cedaa2ddd2a1a17fd112aded
+QIUTx = 5a949594228b1a3d6f599eb3db0d06070fbc551c657b58234ba164ce3fe415fa5f3eb823c08dc29b8c341219c77b6b3d
+QIUTy = 2baad447c8c290cfed25edd9031c41d0b76921457327f42db31122b81f337bbf0b1039ec830ce9061a3761953c75e4a8
+ZIUT = 1220e7e6cad7b25df98e5bbdcc6c0b65ca6c2a50c5ff6c41dca71e475646fd489615979ca92fb4389aeadefde79a24f1
+
+COUNT = 18
+QCAVSx = 788be2336c52f4454d63ee944b1e49bfb619a08371048e6da92e584eae70bde1f171c4df378bd1f3c0ab03048a237802
+QCAVSy = 4673ebd8db604eaf41711748bab2968a23ca4476ce144e728247f08af752929157b5830f1e26067466bdfa8b65145a33
+dIUT = 50ccc1f7076e92f4638e85f2db98e0b483e6e2204c92bdd440a6deea04e37a07c6e72791c190ad4e4e86e01efba84269
+QIUTx = 756c07df0ce32c839dac9fb4733c9c28b70113a676a7057c38d223f22a3a9095a8d564653af528e04c7e1824be4a6512
+QIUTy = 17c2ce6962cbd2a2e066297b39d57dd9bb4680f0191d390f70b4e461419b2972ce68ad46127fdda6c39195774ea86df3
+ZIUT = 793bb9cd22a93cf468faf804a38d12b78cb12189ec679ddd2e9aa21fa9a5a0b049ab16a23574fe04c1c3c02343b91beb
+
+COUNT = 19
+QCAVSx = d09bb822eb99e38060954747c82bb3278cf96bbf36fece3400f4c873838a40c135eb3babb9293bd1001bf3ecdee7bf26
+QCAVSy = d416db6e1b87bbb7427788a3b6c7a7ab2c165b1e366f9608df512037584f213a648d47f16ac326e19aae972f63fd76c9
+dIUT = 06f132b71f74d87bf99857e1e4350a594e5fe35533b888552ceccbc0d8923c902e36141d7691e28631b8bc9bafe5e064
+QIUTx = 2a3cc6b8ff5cde926e7e3a189a1bd029c9b586351af8838f4f201cb8f4b70ef3b0da06d352c80fc26baf8f42b784459e
+QIUTy = bf9985960176da6d23c7452a2954ffcbbcb24249b43019a2a023e0b3dabd461f19ad3e775c364f3f11ad49f3099400d3
+ZIUT = 012d191cf7404a523678c6fc075de8285b243720a903047708bb33e501e0dbee5bcc40d7c3ef6c6da39ea24d830da1e8
+
+COUNT = 20
+QCAVSx = 13741262ede5861dad71063dfd204b91ea1d3b7c631df68eb949969527d79a1dc59295ef7d2bca6743e8cd77b04d1b58
+QCAVSy = 0baaeadc7e19d74a8a04451a135f1be1b02fe299f9dc00bfdf201e83d995c6950bcc1cb89d6f7b30bf54656b9a4da586
+dIUT = 12048ebb4331ec19a1e23f1a2c773b664ccfe90a28bfb846fc12f81dff44b7443c77647164bf1e9e67fd2c07a6766241
+QIUTx = bc18836bc7a9fdf54b5352f37d7528ab8fa8ec544a8c6180511cbfdd49cce377c39e34c031b5240dc9980503ed2f262c
+QIUTy = 8086cbe338191080f0b7a16c7afc4c7b0326f9ac66f58552ef4bb9d24de3429ed5d3277ed58fcf48f2b5f61326bec6c6
+ZIUT = ad0fd3ddffe8884b9263f3c15fe1f07f2a5a22ffdc7e967085eea45f0cd959f20f18f522763e28bcc925e496a52dda98
+
+COUNT = 21
+QCAVSx = 9e22cbc18657f516a864b37b783348b66f1aa9626cd631f4fa1bd32ad88cf11db52057c660860d39d11fbf024fabd444
+QCAVSy = 6b0d53c79681c28116df71e9cee74fd56c8b7f04b39f1198cc72284e98be9562e35926fb4f48a9fbecafe729309e8b6f
+dIUT = 34d61a699ca576169fcdc0cc7e44e4e1221db0fe63d16850c8104029f7d48449714b9884328cae189978754ab460b486
+QIUTx = 867f81104ccd6b163a7902b670ef406042cb0cce7dcdc63d1dfc91b2c40e3cdf7595834bf9eceb79849f1636fc8462fc
+QIUTy = 9d4bde8e875ec49697d258d1d59465f8431c6f5531e1c59e9f9ebe3cf164a8d9ce10a12f1979283a959bad244dd83863
+ZIUT = dc4ca392dc15e20185f2c6a8ea5ec31dfc96f56153a47394b3072b13d0015f5d4ae13beb3bed54d65848f9b8383e6c95
+
+COUNT = 22
+QCAVSx = 2db5da5f940eaa884f4db5ec2139b0469f38e4e6fbbcc52df15c0f7cf7fcb1808c749764b6be85d2fdc5b16f58ad5dc0
+QCAVSy = 22e8b02dcf33e1b5a083849545f84ad5e43f77cb71546dbbac0d11bdb2ee202e9d3872e8d028c08990746c5e1dde9989
+dIUT = dc60fa8736d702135ff16aab992bb88eac397f5972456c72ec447374d0d8ce61153831bfc86ad5a6eb5b60bfb96a862c
+QIUTx = b69beede85d0f829fec1b893ccb9c3e052ff692e13b974537bc5b0f9feaf7b22e84f03231629b24866bdb4b8cf908914
+QIUTy = 66f85e2bfcaba2843285b0e14ebc07ef7dafff8b424416fee647b59897b619f20eed95a632e6a4206bf7da429c04c560
+ZIUT = d765b208112d2b9ed5ad10c4046e2e3b0dbf57c469329519e239ac28b25c7d852bf757d5de0ee271cadd021d86cfd347
+
+COUNT = 23
+QCAVSx = 329647baa354224eb4414829c5368c82d7893b39804e08cbb2180f459befc4b347a389a70c91a23bd9d30c83be5295d3
+QCAVSy = cc8f61923fad2aa8e505d6cfa126b9fabd5af9dce290b75660ef06d1caa73681d06089c33bc4246b3aa30dbcd2435b12
+dIUT = 6fa6a1c704730987aa634b0516a826aba8c6d6411d3a4c89772d7a62610256a2e2f289f5c3440b0ec1e70fa339e251ce
+QIUTx = 53de1fc1328e8de14aecab29ad8a40d6b13768f86f7d298433d20fec791f86f8bc73f358098b256a298bb488de257bf4
+QIUTy = ac28944fd27f17b82946c04c66c41f0053d3692f275da55cd8739a95bd8cd3af2f96e4de959ea8344d8945375905858b
+ZIUT = d3778850aeb58804fbe9dfe6f38b9fa8e20c2ca4e0dec335aafceca0333e3f2490b53c0c1a14a831ba37c4b9d74be0f2
+
+COUNT = 24
+QCAVSx = 29d8a36d22200a75b7aea1bb47cdfcb1b7fd66de967041434728ab5d533a060df732130600fe6f75852a871fb2938e39
+QCAVSy = e19b53db528395de897a45108967715eb8cb55c3fcbf23379372c0873a058d57544b102ecce722b2ccabb1a603774fd5
+dIUT = 74ad8386c1cb2ca0fcdeb31e0869bb3f48c036afe2ef110ca302bc8b910f621c9fcc54cec32bb89ec7caa84c7b8e54a8
+QIUTx = 27a3e83cfb9d5122e73129d801615857da7cc089cccc9c54ab3032a19e0a0a9f677346e37f08a0b3ed8da6e5dd691063
+QIUTy = 8d60e44aa5e0fd30c918456796af37f0e41957901645e5c596c6d989f5859b03a0bd7d1f4e77936fff3c74d204e5388e
+ZIUT = 81e1e71575bb4505498de097350186430a6242fa6c57b85a5f984a23371123d2d1424eefbf804258392bc723e4ef1e35
+
+
+[P-521]
+
+COUNT = 0
+QCAVSx = 000000685a48e86c79f0f0875f7bc18d25eb5fc8c0b07e5da4f4370f3a9490340854334b1e1b87fa395464c60626124a4e70d0f785601d37c09870ebf176666877a2046d
+QCAVSy = 000001ba52c56fc8776d9e8f5db4f0cc27636d0b741bbe05400697942e80b739884a83bde99e0f6716939e632bc8986fa18dccd443a348b6c3e522497955a4f3c302f676
+dIUT = 0000017eecc07ab4b329068fba65e56a1f8890aa935e57134ae0ffcce802735151f4eac6564f6ee9974c5e6887a1fefee5743ae2241bfeb95d5ce31ddcb6f9edb4d6fc47
+QIUTx = 000000602f9d0cf9e526b29e22381c203c48a886c2b0673033366314f1ffbcba240ba42f4ef38a76174635f91e6b4ed34275eb01c8467d05ca80315bf1a7bbd945f550a5
+QIUTy = 000001b7c85f26f5d4b2d7355cf6b02117659943762b6d1db5ab4f1dbc44ce7b2946eb6c7de342962893fd387d1b73d7a8672d1f236961170b7eb3579953ee5cdc88cd2d
+ZIUT = 005fc70477c3e63bc3954bd0df3ea0d1f41ee21746ed95fc5e1fdf90930d5e136672d72cc770742d1711c3c3a4c334a0ad9759436a4d3c5bf6e74b9578fac148c831
+
+COUNT = 1
+QCAVSx = 000001df277c152108349bc34d539ee0cf06b24f5d3500677b4445453ccc21409453aafb8a72a0be9ebe54d12270aa51b3ab7f316aa5e74a951c5e53f74cd95fc29aee7a
+QCAVSy = 0000013d52f33a9f3c14384d1587fa8abe7aed74bc33749ad9c570b471776422c7d4505d9b0a96b3bfac041e4c6a6990ae7f700e5b4a6640229112deafa0cd8bb0d089b0
+dIUT = 000000816f19c1fb10ef94d4a1d81c156ec3d1de08b66761f03f06ee4bb9dcebbbfe1eaa1ed49a6a990838d8ed318c14d74cc872f95d05d07ad50f621ceb620cd905cfb8
+QIUTx = 000000d45615ed5d37fde699610a62cd43ba76bedd8f85ed31005fe00d6450fbbd101291abd96d4945a8b57bc73b3fe9f4671105309ec9b6879d0551d930dac8ba45d255
+QIUTy = 000001425332844e592b440c0027972ad1526431c06732df19cd46a242172d4dd67c2c8c99dfc22e49949a56cf90c6473635ce82f25b33682fb19bc33bd910ed8ce3a7fa
+ZIUT = 000b3920ac830ade812c8f96805da2236e002acbbf13596a9ab254d44d0e91b6255ebf1229f366fb5a05c5884ef46032c26d42189273ca4efa4c3db6bd12a6853759
+
+COUNT = 2
+QCAVSx = 00000092db3142564d27a5f0006f819908fba1b85038a5bc2509906a497daac67fd7aee0fc2daba4e4334eeaef0e0019204b471cd88024f82115d8149cc0cf4f7ce1a4d5
+QCAVSy = 0000016bad0623f517b158d9881841d2571efbad63f85cbe2e581960c5d670601a6760272675a548996217e4ab2b8ebce31d71fca63fcc3c08e91c1d8edd91cf6fe845f8
+dIUT = 0000012f2e0c6d9e9d117ceb9723bced02eb3d4eebf5feeaf8ee0113ccd8057b13ddd416e0b74280c2d0ba8ed291c443bc1b141caf8afb3a71f97f57c225c03e1e4d42b0
+QIUTx = 000000717fcb3d4a40d103871ede044dc803db508aaa4ae74b70b9fb8d8dfd84bfecfad17871879698c292d2fd5e17b4f9343636c531a4fac68a35a93665546b9a878679
+QIUTy = 000000f3d96a8637036993ab5d244500fff9d2772112826f6436603d3eb234a44d5c4e5c577234679c4f9df725ee5b9118f23d8a58d0cc01096daf70e8dfec0128bdc2e8
+ZIUT = 006b380a6e95679277cfee4e8353bf96ef2a1ebdd060749f2f046fe571053740bbcc9a0b55790bc9ab56c3208aa05ddf746a10a3ad694daae00d980d944aabc6a08f
+
+COUNT = 3
+QCAVSx = 000000fdd40d9e9d974027cb3bae682162eac1328ad61bc4353c45bf5afe76bf607d2894c8cce23695d920f2464fda4773d4693be4b3773584691bdb0329b7f4c86cc299
+QCAVSy = 00000034ceac6a3fef1c3e1c494bfe8d872b183832219a7e14da414d4e3474573671ec19b033be831b915435905925b44947c592959945b4eb7c951c3b9c8cf52530ba23
+dIUT = 000000e548a79d8b05f923b9825d11b656f222e8cb98b0f89de1d317184dc5a698f7c71161ee7dc11cd31f4f4f8ae3a981e1a3e78bdebb97d7c204b9261b4ef92e0918e0
+QIUTx = 0000000ce800217ed243dd10a79ad73df578aa8a3f9194af528cd1094bbfee27a3b5481ad5862c8876c0c3f91294c0ab3aa806d9020cbaa2ed72b7fecdc5a09a6dad6f32
+QIUTy = 000001543c9ab45b12469232918e21d5a351f9a4b9cbf9efb2afcc402fa9b31650bec2d641a05c440d35331c0893d11fb13151335988b303341301a73dc5f61d574e67d9
+ZIUT = 00fbbcd0b8d05331fef6086f22a6cce4d35724ab7a2f49dd8458d0bfd57a0b8b70f246c17c4468c076874b0dff7a0336823b19e98bf1cec05e4beffb0591f97713c6
+
+COUNT = 4
+QCAVSx = 00000098d99dee0816550e84dbfced7e88137fddcf581a725a455021115fe49f8dc3cf233cd9ea0e6f039dc7919da973cdceaca205da39e0bd98c8062536c47f258f44b5
+QCAVSy = 000000cd225c8797371be0c4297d2b457740100c774141d8f214c23b61aa2b6cd4806b9b70722aa4965fb622f42b7391e27e5ec21c5679c5b06b59127372997d421adc1e
+dIUT = 000001c8aae94bb10b8ca4f7be577b4fb32bb2381032c4942c24fc2d753e7cc5e47b483389d9f3b956d20ee9001b1eef9f23545f72c5602140046839e963313c3decc864
+QIUTx = 00000106a14e2ee8ff970aa8ab0c79b97a33bba2958e070b75b94736b77bbe3f777324fa52872771aa88a63a9e8490c3378df4dc760cd14d62be700779dd1a4377943656
+QIUTy = 0000002366ce3941e0b284b1aa81215d0d3b9778fce23c8cd1e4ed6fa0abf62156c91d4b3eb55999c3471bed275e9e60e5aa9d690d310bfb15c9c5bbd6f5e9eb39682b74
+ZIUT = 0145cfa38f25943516c96a5fd4bfebb2f645d10520117aa51971eff442808a23b4e23c187e639ff928c3725fbd1c0c2ad0d4aeb207bc1a6fb6cb6d467888dc044b3c
+
+COUNT = 5
+QCAVSx = 0000007ae115adaaf041691ab6b7fb8c921f99d8ed32d283d67084e80b9ad9c40c56cd98389fb0a849d9ecf7268c297b6f93406119f40e32b5773ed25a28a9a85c4a7588
+QCAVSy = 000001a28e004e37eeaefe1f4dbb71f1878696141af3a10a9691c4ed93487214643b761fa4b0fbeeb247cf6d3fba7a60697536ad03f49b80a9d1cb079673654977c5fa94
+dIUT = 0000009b0af137c9696c75b7e6df7b73156bb2d45f482e5a4217324f478b10ceb76af09724cf86afa316e7f89918d31d54824a5c33107a483c15c15b96edc661340b1c0e
+QIUTx = 000000748cdbb875d35f4bccb62abe20e82d32e4c14dc2feb5b87da2d0ccb11c9b6d4b7737b6c46f0dfb4d896e2db92fcf53cdbbae2a404c0babd564ad7adeac6273efa3
+QIUTy = 000001984acab8d8f173323de0bb60274b228871609373bb22a17287e9dec7495873abc09a8915b54c8455c8e02f654f602e23a2bbd7a9ebb74f3009bd65ecc650814cc0
+ZIUT = 005c5721e96c273319fd60ecc46b5962f698e974b429f28fe6962f4ac656be2eb8674c4aafc037eab48ece612953b1e8d861016b6ad0c79805784c67f73ada96f351
+
+COUNT = 6
+QCAVSx = 0000012588115e6f7f7bdcfdf57f03b169b479758baafdaf569d04135987b2ce6164c02a57685eb5276b5dae6295d3fe90620f38b5535c6d2260c173e61eb888ca920203
+QCAVSy = 000001542c169cf97c2596fe2ddd848a222e367c5f7e6267ebc1bcd9ab5dcf49158f1a48e4af29a897b7e6a82091c2db874d8e7abf0f58064691344154f396dbaed188b6
+dIUT = 000001e48faacee6dec83ffcde944cf6bdf4ce4bae72747888ebafee455b1e91584971efb49127976a52f4142952f7c207ec0265f2b718cf3ead96ea4f62c752e4f7acd3
+QIUTx = 0000010eb1b4d9172bcc23f4f20cc9560fc54928c3f34ea61c00391dc766c76ed9fa608449377d1e4fadd1236025417330b4b91086704ace3e4e6484c606e2a943478c86
+QIUTy = 00000149413864069825ee1d0828da9f4a97713005e9bd1adbc3b38c5b946900721a960fe96ad2c1b3a44fe3de9156136d44cb17cbc2415729bb782e16bfe2deb3069e43
+ZIUT = 01736d9717429b4f412e903febe2f9e0fffd81355d6ce2c06ff3f66a3be15ceec6e65e308347593f00d7f33591da4043c30763d72749f72cdceebe825e4b34ecd570
+
+COUNT = 7
+QCAVSx = 00000169491d55bd09049fdf4c2a53a660480fee4c03a0538675d1cd09b5bba78dac48543ef118a1173b3fbf8b20e39ce0e6b890a163c50f9645b3d21d1cbb3b60a6fff4
+QCAVSy = 00000083494b2eba76910fed33c761804515011fab50e3b377abd8a8a045d886d2238d2c268ac1b6ec88bd71b7ba78e2c33c152e4bf7da5d565e4acbecf5e92c7ad662bb
+dIUT = 000000c29aa223ea8d64b4a1eda27f39d3bc98ea0148dd98c1cbe595f8fd2bfbde119c9e017a50f5d1fc121c08c1cef31b758859556eb3e0e042d8dd6aaac57a05ca61e3
+QIUTx = 0000001511c848ef60d5419a98d10204db0fe58224124370061bcfa4e9249d50618c56bf3722471b259f38263bb7b280d23caf2a1ee8737f9371cdb2732cdc958369930c
+QIUTy = 000001d461681ae6d8c49b4c5f4d6016143fb1bd7491573e3ed0e6c48b82e821644f87f82f0e5f08fd16f1f98fa17586200ab02ed8c627b35c3f27617ec5fd92f456203f
+ZIUT = 018f2ae9476c771726a77780208dedfefa205488996b18fecc50bfd4c132753f5766b2cd744afa9918606de2e016effc63622e9029e76dc6e3f0c69f7aeced565c2c
+
+COUNT = 8
+QCAVSx = 0000008415f5bbd0eee387d6c09d0ef8acaf29c66db45d6ba101860ae45d3c60e1e0e3f7247a4626a60fdd404965c3566c79f6449e856ce0bf94619f97da8da24bd2cfb6
+QCAVSy = 000000fdd7c59c58c361bc50a7a5d0d36f723b17c4f2ad2b03c24d42dc50f74a8c465a0afc4683f10fab84652dfe9e928c2626b5456453e1573ff60be1507467d431fbb2
+dIUT = 00000028692be2bf5c4b48939846fb3d5bce74654bb2646e15f8389e23708a1afadf561511ea0d9957d0b53453819d60fba8f65a18f7b29df021b1bb01cd163293acc3cc
+QIUTx = 000001cfdc10c799f5c79cb6930a65fba351748e07567993e5e410ef4cacc4cd8a25784991eb4674e41050f930c7190ac812b9245f48a7973b658daf408822fe5b85f668
+QIUTy = 00000180d9ddfc9af77b9c4a6f02a834db15e535e0b3845b2cce30388301b51cecbe3276307ef439b5c9e6a72dc2d94d879bc395052dbb4a5787d06efb280210fb8be037
+ZIUT = 0105a346988b92ed8c7a25ce4d79d21bc86cfcc7f99c6cd19dbb4a39f48ab943b79e4f0647348da0b80bd864b85c6b8d92536d6aa544dc7537a00c858f8b66319e25
+
+COUNT = 9
+QCAVSx = 000001c721eea805a5cba29f34ba5758775be0cf6160e6c08723f5ab17bf96a1ff2bd9427961a4f34b07fc0b14ca4b2bf6845debd5a869f124ebfa7aa72fe565050b7f18
+QCAVSy = 000000b6e89eb0e1dcf181236f7c548fd1a8c16b258b52c1a9bfd3fe8f22841b26763265f074c4ccf2d634ae97b701956f67a11006c52d97197d92f585f5748bc2672eeb
+dIUT = 000001194d1ee613f5366cbc44b504d21a0cf6715e209cd358f2dd5f3e71cc0d67d0e964168c42a084ebda746f9863a86bacffc819f1edf1b8c727ccfb3047240a57c435
+QIUTx = 0000016bd15c8a58d366f7f2b2f298cc87b7485e9ee70d11d12448b8377c0a82c7626f67aff7f97be7a3546bf417eeeddf75a93c130191c84108042ea2fca17fd3f80d14
+QIUTy = 000001560502d04b74fce1743aab477a9d1eac93e5226981fdb97a7478ce4ce566ff7243931284fad850b0c2bcae0ddd2d97790160c1a2e77c3ed6c95ecc44b89e2637fc
+ZIUT = 004531b3d2c6cd12f21604c8610e6723dbf4daf80b5a459d6ba5814397d1c1f7a21d7c114be964e27376aaebe3a7bc3d6af7a7f8c7befb611afe487ff032921f750f
+
+COUNT = 10
+QCAVSx = 000001c35823e440a9363ab98d9fc7a7bc0c0532dc7977a79165599bf1a9cc64c00fb387b42cca365286e8430360bfad3643bc31354eda50dc936c329ecdb60905c40fcb
+QCAVSy = 000000d9e7f433531e44df4f6d514201cbaabb06badd6783e01111726d815531d233c5cdb722893ffbb2027259d594de77438809738120c6f783934f926c3fb69b40c409
+dIUT = 000001fd90e3e416e98aa3f2b6afa7f3bf368e451ad9ca5bd54b5b14aee2ed6723dde5181f5085b68169b09fbec721372ccf6b284713f9a6356b8d560a8ff78ca3737c88
+QIUTx = 000001ebea1b10d3e3b971b7efb69fc878de11c7f472e4e4d384c31b8d6288d8071517acade9b39796c7af5163bcf71aeda777533f382c6cf0a4d9bbb938c85f44b78037
+QIUTy = 0000016b0e3e19c2996b2cbd1ff64730e7ca90edca1984f9b2951333535e5748baa34a99f61ff4d5f812079e0f01e87789f34efdad8098015ee74a4f846dd190d16dc6e1
+ZIUT = 0100c8935969077bae0ba89ef0df8161d975ec5870ac811ae7e65ca5394efba4f0633d41bf79ea5e5b9496bbd7aae000b0594baa82ef8f244e6984ae87ae1ed124b7
+
+COUNT = 11
+QCAVSx = 000000093057fb862f2ad2e82e581baeb3324e7b32946f2ba845a9beeed87d6995f54918ec6619b9931955d5a89d4d74adf1046bb362192f2ef6bd3e3d2d04dd1f87054a
+QCAVSy = 000000aa3fb2448335f694e3cda4ae0cc71b1b2f2a206fa802d7262f19983c44674fe15327acaac1fa40424c395a6556cb8167312527fae5865ecffc14bbdc17da78cdcf
+dIUT = 0000009012ecfdadc85ced630afea534cdc8e9d1ab8be5f3753dcf5f2b09b40eda66fc6858549bc36e6f8df55998cfa9a0703aecf6c42799c245011064f530c09db98369
+QIUTx = 000000234e32be0a907131d2d128a6477e0caceb86f02479745e0fe245cb332de631c078871160482eeef584e274df7fa412cea3e1e91f71ecba8781d9205d48386341ad
+QIUTy = 000001cf86455b09b1c005cffba8d76289a3759628c874beea462f51f30bd581e3803134307dedbb771b3334ee15be2e242cd79c3407d2f58935456c6941dd9b6d155a46
+ZIUT = 017f36af19303841d13a389d95ec0b801c7f9a679a823146c75c17bc44256e9ad422a4f8b31f14647b2c7d317b933f7c2946c4b8abd1d56d620fab1b5ff1a3adc71f
+
+COUNT = 12
+QCAVSx = 00000083192ed0b1cb31f75817794937f66ad91cf74552cd510cedb9fd641310422af5d09f221cad249ee814d16dd7ac84ded9eacdc28340fcfc9c0c06abe30a2fc28cd8
+QCAVSy = 0000002212ed868c9ba0fb2c91e2c39ba93996a3e4ebf45f2852d0928c48930e875cc7b428d0e7f3f4d503e5d60c68cb49b13c2480cd486bed9200caddaddfe4ff8e3562
+dIUT = 000001b5ff847f8eff20b88cfad42c06e58c3742f2f8f1fdfd64b539ba48c25926926bd5e332b45649c0b184f77255e9d58fe8afa1a6d968e2cb1d4637777120c765c128
+QIUTx = 000001de3dc9263bc8c4969dc684be0eec54befd9a9f3dba194d8658a789341bf0d78d84da6735227cafaf09351951691197573c8c360a11e5285712b8bbdf5ac91b977c
+QIUTy = 000000812de58cd095ec2e5a9b247eb3ed41d8bef6aeace194a7a05b65aa5d289fbc9b1770ec84bb6be0c2c64cc37c1d54a7f5d71377a9adbe20f26f6f2b544a821ea831
+ZIUT = 00062f9fc29ae1a68b2ee0dcf956cbd38c88ae5f645eaa546b00ebe87a7260bf724be20d34b9d02076655c933d056b21e304c24ddb1dedf1dd76de611fc4a2340336
+
+COUNT = 13
+QCAVSx = 000001a89b636a93e5d2ba6c2292bf23033a84f06a3ac1220ea71e806afbe097a804cc67e9baa514cfb6c12c9194be30212bf7aae7fdf6d376c212f0554e656463ffab7e
+QCAVSy = 00000182efcaf70fc412d336602e014da47256a0b606f2addcce8053bf817ac8656bb4e42f14c8cbf2a68f488ab35dcdf64056271dee1f606a440ba4bd4e5a11b8b8e54f
+dIUT = 0000011a6347d4e801c91923488354cc533e7e35fddf81ff0fb7f56bb0726e0c29ee5dcdc5f394ba54cf57269048aab6e055895c8da24b8b0639a742314390cc04190ed6
+QIUTx = 000000fe30267f33ba5cdefc25cbb3c9320dad9ccb1d7d376644620ca4fadee5626a3cede25ad254624def727a7048f7145f76162aa98042f9b123b2076f8e8cf59b3fdf
+QIUTy = 0000001145dc6631953b6e2945e94301d6cbb098fe4b04f7ee9b09411df104dc82d7d79ec46a01ed0f2d3e7db6eb680694bdeb107c1078aec6cabd9ebee3d342fe7e54df
+ZIUT = 0128ab09bfec5406799e610f772ba17e892249fa8e0e7b18a04b9197034b250b48294f1867fb9641518f92766066a07a8b917b0e76879e1011e51ccbd9f540c54d4f
+
+COUNT = 14
+QCAVSx = 0000017200b3f16a68cbaed2bf78ba8cddfb6cffac262bba00fbc25f9dc72a07ce59372904899f364c44cb264c097b647d4412bee3e519892d534d9129f8a28f7500fee7
+QCAVSy = 000000baba8d672a4f4a3b63de48b96f56e18df5d68f7d70d5109833f43770d6732e06b39ad60d93e5b43db8789f1ec0aba47286a39ea584235acea757dbf13d53b58364
+dIUT = 00000022b6d2a22d71dfaa811d2d9f9f31fbed27f2e1f3d239538ddf3e4cc8c39a330266db25b7bc0a9704f17bde7f3592bf5f1f2d4b56013aacc3d8d1bc02f00d3146cc
+QIUTx = 000000ba38cfbf9fd2518a3f61d43549e7a6a6d28b2be57ffd3e0faceb636b34ed17e044a9f249dae8fc132e937e2d9349cd2ed77bb1049ceb692a2ec5b17ad61502a64c
+QIUTy = 0000001ec91d3058573fa6c0564a02a1a010160c313bc7c73510dc983e5461682b5be00dbce7e2c682ad73f29ca822cdc111f68fabe33a7b384a648342c3cdb9f050bcdb
+ZIUT = 0101e462e9d9159968f6440e956f11dcf2227ae4aea81667122b6af9239a291eb5d6cf5a4087f358525fcacfa46bb2db01a75af1ba519b2d31da33eda87a9d565748
+
+COUNT = 15
+QCAVSx = 0000004efd5dbd2f979e3831ce98f82355d6ca14a5757842875882990ab85ab9b7352dd6b9b2f4ea9a1e95c3880d65d1f3602f9ca653dc346fac858658d75626f4d4fb08
+QCAVSy = 00000061cf15dbdaa7f31589c98400373da284506d70c89f074ed262a9e28140796b7236c2eef99016085e71552ff488c72b7339fefb7915c38459cb20ab85aec4e45052
+dIUT = 0000005bacfff268acf6553c3c583b464ea36a1d35e2b257a5d49eb3419d5a095087c2fb4d15cf5bf5af816d0f3ff7586490ccd3ddc1a98b39ce63749c6288ce0dbdac7d
+QIUTx = 00000036e488da7581472a9d8e628c58d6ad727311b7e6a3f6ae33a8544f34b09280249020be7196916fafd90e2ec54b66b5468d2361b99b56fa00d7ac37abb8c6f16653
+QIUTy = 0000011edb9fb8adb6a43f4f5f5fdc1421c9fe04fc8ba46c9b66334e3af927c8befb4307104f299acec4e30f812d9345c9720d19869dbfffd4ca3e7d2713eb5fc3f42615
+ZIUT = 0141d6a4b719ab67eaf04a92c0a41e2dda78f4354fb90bdc35202cc7699b9b04d49616f82255debf7bbec045ae58f982a66905fcfae69d689785e38c868eb4a27e7b
+
+COUNT = 16
+QCAVSx = 00000129891de0cf3cf82e8c2cf1bf90bb296fe00ab08ca45bb7892e0e227a504fdd05d2381a4448b68adff9c4153c87eacb78330d8bd52515f9f9a0b58e85f446bb4e10
+QCAVSy = 0000009edd679696d3d1d0ef327f200383253f6413683d9e4fcc87bb35f112c2f110098d15e5701d7ceee416291ff5fed85e687f727388b9afe26a4f6feed560b218e6bb
+dIUT = 0000008e2c93c5423876223a637cad367c8589da69a2d0fc68612f31923ae50219df2452e7cc92615b67f17b57ffd2f52b19154bb40d7715336420fde2e89fee244f59dc
+QIUTx = 000000fa3b35118d6c422570f724a26f90b2833b19239174cea081c53133f64db60d6940ea1261299c04c1f4587cdb0c4c39616479c1bb0c146799a118032dcf98f899c0
+QIUTy = 00000069f040229006151fa32b51f679c8816f7c17506b403809dc77cd58a2aec430d94d13b6c916de99f355aa45fcfbc6853d686c71be496a067d24bfaea4818fc51f75
+ZIUT = 00345e26e0abb1aac12b75f3a9cf41efe1c336396dffa4a067a4c2cfeb878c68b2b045faa4e5b4e6fa4678f5b603c351903b14bf9a6a70c439257199a640890b61d1
+
+COUNT = 17
+QCAVSx = 000001a3c20240e59f5b7a3e17c275d2314ba1741210ad58b71036f8c83cc1f6b0f409dfdd9113e94b67ec39c3291426c23ffcc447054670d2908ff8fe67dc2306034c5c
+QCAVSy = 000001d2825bfd3af8b1e13205780c137fe938f84fde40188e61ea02cead81badfdb425c29f7d7fb0324debadc10bbb93de68f62c35069268283f5265865db57a79f7bf7
+dIUT = 00000004d49d39d40d8111bf16d28c5936554326b197353eebbcf47545393bc8d3aaf98f14f5be7074bfb38e6cc97b989754074daddb3045f4e4ce745669fdb3ec0d5fa8
+QIUTx = 0000012ec226d050ce07c79b3df4d0f0891f9f7adf462e8c98dbc1a2a14f5e53a3f5ad894433587cc429a8be9ea1d84fa33b1803690dae04da7218d30026157fc995cf52
+QIUTy = 0000004837dfbf3426f57b5c793269130abb9a38f618532211931154db4eeb9aede88e57290f842ea0f2ea9a5f74c6203a3920fe4e305f6118f676b154e1d75b9cb5eb88
+ZIUT = 006fe9de6fb8e672e7fd150fdc5e617fabb0d43906354ccfd224757c7276f7a1010091b17ed072074f8d10a5ec971eb35a5cb7076603b7bc38d432cbc059f80f9488
+
+COUNT = 18
+QCAVSx = 0000007e2d138f2832e345ae8ff65957e40e5ec7163f016bdf6d24a2243daa631d878a4a16783990c722382130f9e51f0c1bd6ff5ac96780e48b68f5dec95f42e6144bb5
+QCAVSy = 000000b0de5c896791f52886b0f09913e26e78dd0b69798fc4df6d95e3ca708ecbcbcce1c1895f5561bbabaae372e9e67e6e1a3be60e19b470cdf673ec1fc393d3426e20
+dIUT = 0000011a5d1cc79cd2bf73ea106f0e60a5ace220813b53e27b739864334a07c03367efda7a4619fa6eef3a9746492283b3c445610a023a9cc49bf4591140384fca5c8bb5
+QIUTx = 000000eb07c7332eedb7d3036059d35f7d2288d4377d5f42337ad3964079fb120ccd4c8bd384b585621055217023acd9a94fcb3b965bfb394675e788ade41a1de73e620c
+QIUTy = 000000491a835de2e6e7deb7e090f4a11f2c460c0b1f3d5e94ee8d751014dc720784fd3b54500c86ebaef18429f09e8e876d5d1538968a030d7715dde99f0d8f06e29d59
+ZIUT = 01e4e759ecedce1013baf73e6fcc0b92451d03bdd50489b78871c333114990c9ba6a9b2fc7b1a2d9a1794c1b60d9279af6f146f0bbfb0683140403bfa4ccdb524a29
+
+COUNT = 19
+QCAVSx = 000000118c36022209b1af8ebad1a12b566fc48744576e1199fe80de1cdf851cdf03e5b9091a8f7e079e83b7f827259b691d0c22ee29d6bdf73ec7bbfd746f2cd97a357d
+QCAVSy = 000000da5ff4904548a342e2e7ba6a1f4ee5f840411a96cf63e6fe622f22c13e614e0a847c11a1ab3f1d12cc850c32e095614ca8f7e2721477b486e9ff40372977c3f65c
+dIUT = 0000010c908caf1be74c616b625fc8c1f514446a6aec83b5937141d6afbb0a8c7666a7746fa1f7a6664a2123e8cdf6cd8bf836c56d3c0ebdcc980e43a186f938f3a78ae7
+QIUTx = 00000031890f4c7abec3f723362285d77d2636f876817db3bbc88b01e773597b969ff6f013ea470c854ab4a7739004eb8cbea69b82ddf36acadd406871798ecb2ac3aa7f
+QIUTy = 000000d8b429ae3250266b9643c0c765a60dc10155bc2531cf8627296f4978b6640a9e600e19d0037d58503fa80799546a814d7478a550aa90e5ebeb052527faaeae5d08
+ZIUT = 0163c9191d651039a5fe985a0eea1eba018a40ab1937fcd2b61220820ee8f2302e9799f6edfc3f5174f369d672d377ea8954a8d0c8b851e81a56fda95212a6578f0e
+
+COUNT = 20
+QCAVSx = 000001780edff1ca1c03cfbe593edc6c049bcb2860294a92c355489d9afb2e702075ade1c953895a456230a0cde905de4a3f38573dbfcccd67ad6e7e93f0b5581e926a5d
+QCAVSy = 000000a5481962c9162962e7f0ebdec936935d0eaa813e8226d40d7f6119bfd940602380c86721e61db1830f51e139f210000bcec0d8edd39e54d73a9a129f95cd5fa979
+dIUT = 000001b37d6b7288de671360425d3e5ac1ccb21815079d8d73431e9b74a6f0e7ae004a357575b11ad66642ce8b775593eba9d98bf25c75ef0b4d3a2098bbc641f59a2b77
+QIUTx = 000000189a5ee34de7e35aefeaeef9220c18071b4c29a4c3bd9d954458bd3e82a7a34da34cff5579b8101c065b1f2f527cf4581501e28ef5671873e65267733d003520af
+QIUTy = 000001eb4bc50a7b4d4599d7e3fa773ddb9eb252c9b3422872e544bdf75c7bf60f5166ddc11eb08fa7c30822dabaee373ab468eb2d922e484e2a527fff2ebb804b7d9a37
+ZIUT = 015d613e267a36342e0d125cdad643d80d97ed0600afb9e6b9545c9e64a98cc6da7c5aaa3a8da0bdd9dd3b97e9788218a80abafc106ef065c8f1c4e1119ef58d298b
+
+COUNT = 21
+QCAVSx = 0000016dacffa183e5303083a334f765de724ec5ec9402026d4797884a9828a0d321a8cfac74ab737fe20a7d6befcfc73b6a35c1c7b01d373e31abc192d48a4241a35803
+QCAVSy = 0000011e5327cac22d305e7156e559176e19bee7e4f2f59e86f1a9d0b6603b6a7df1069bde6387feb71587b8ffce5b266e1bae86de29378a34e5c74b6724c4d40a719923
+dIUT = 000000f2661ac762f60c5fff23be5d969ccd4ec6f98e4e72618d12bdcdb9b4102162333788c0bae59f91cdfc172c7a1681ee44d96ab2135a6e5f3415ebbcd55165b1afb0
+QIUTx = 000000a8e25a6902d687b4787cdc94c364ac7cecc5c495483ed363dc0aa95ee2bd739c4c4d46b17006c728b076350d7d7e54c6822f52f47162a25109aaaba690cab696ec
+QIUTy = 00000168d2f08fe19e4dc9ee7a195b03c9f7fe6676f9f520b6270557504e72ca4394a2c6918625e15ac0c51b8f95cd560123653fb8e8ee6db961e2c4c62cc54e92e2a2a9
+ZIUT = 014d6082a3b5ced1ab8ca265a8106f302146c4acb8c30bb14a4c991e3c82a9731288bdb91e0e85bda313912d06384fc44f2153fb13506fa9cf43c9aab5750988c943
+
+COUNT = 22
+QCAVSx = 000000a091421d3703e3b341e9f1e7d58f8cf7bdbd1798d001967b801d1cec27e605c580b2387c1cb464f55ce7ac80334102ab03cfb86d88af76c9f4129c01bedd3bbfc4
+QCAVSy = 0000008c9c577a8e6fc446815e9d40baa66025f15dae285f19eb668ee60ae9c98e7ecdbf2b2a68e22928059f67db188007161d3ecf397e0883f0c4eb7eaf7827a62205cc
+dIUT = 000000f430ca1261f09681a9282e9e970a9234227b1d5e58d558c3cc6eff44d1bdf53de16ad5ee2b18b92d62fc79586116b0efc15f79340fb7eaf5ce6c44341dcf8dde27
+QIUTx = 0000006c1d9b5eca87de1fb871a0a32f807c725adccde9b3967453a71347d608f0c030cd09e338cdecbf4a02015bc8a6e8d3e2595fe773ffc2fc4e4a55d0b1a2cc00323b
+QIUTy = 000001141b2109e7f4981c952aa818a2b9f6f5c41feccdb7a7a45b9b4b672937771b008cae5f934dfe3fed10d383ab1f38769c92ce88d9be5414817ecb073a31ab368ccb
+ZIUT = 0020c00747cb8d492fd497e0fec54644bf027d418ab686381f109712a99cabe328b9743d2225836f9ad66e5d7fed1de247e0da92f60d5b31f9e47672e57f710598f4
+
+COUNT = 23
+QCAVSx = 0000004f38816681771289ce0cb83a5e29a1ab06fc91f786994b23708ff08a08a0f675b809ae99e9f9967eb1a49f196057d69e50d6dedb4dd2d9a81c02bdcc8f7f518460
+QCAVSy = 0000009efb244c8b91087de1eed766500f0e81530752d469256ef79f6b965d8a2232a0c2dbc4e8e1d09214bab38485be6e357c4200d073b52f04e4a16fc6f5247187aecb
+dIUT = 0000005dc33aeda03c2eb233014ee468dff753b72f73b00991043ea353828ae69d4cd0fadeda7bb278b535d7c57406ff2e6e473a5a4ff98e90f90d6dadd25100e8d85666
+QIUTx = 000000c825ba307373cec8dd2498eef82e21fd9862168dbfeb83593980ca9f82875333899fe94f137daf1c4189eb502937c3a367ea7951ed8b0f3377fcdf2922021d46a5
+QIUTy = 0000016b8a2540d5e65493888bc337249e67c0a68774f3e8d81e3b4574a0125165f0bd58b8af9de74b35832539f95c3cd9f1b759408560aa6851ae3ac7555347b0d3b13b
+ZIUT = 00c2bfafcd7fbd3e2fd1c750fdea61e70bd4787a7e68468c574ee99ebc47eedef064e8944a73bcb7913dbab5d93dca660d216c553622362794f7a2acc71022bdb16f
+
+COUNT = 24
+QCAVSx = 000001a32099b02c0bd85371f60b0dd20890e6c7af048c8179890fda308b359dbbc2b7a832bb8c6526c4af99a7ea3f0b3cb96ae1eb7684132795c478ad6f962e4a6f446d
+QCAVSy = 0000017627357b39e9d7632a1370b3e93c1afb5c851b910eb4ead0c9d387df67cde85003e0e427552f1cd09059aad0262e235cce5fba8cedc4fdc1463da76dcd4b6d1a46
+dIUT = 000000df14b1f1432a7b0fb053965fd8643afee26b2451ecb6a8a53a655d5fbe16e4c64ce8647225eb11e7fdcb23627471dffc5c2523bd2ae89957cba3a57a23933e5a78
+QIUTx = 0000004e8583bbbb2ecd93f0714c332dff5ab3bc6396e62f3c560229664329baa5138c3bb1c36428abd4e23d17fcb7a2cfcc224b2e734c8941f6f121722d7b6b94154576
+QIUTy = 000001cf0874f204b0363f020864672fadbf87c8811eb147758b254b74b14fae742159f0f671a018212bbf25b8519e126d4cad778cfff50d288fd39ceb0cac635b175ec0
+ZIUT = 01aaf24e5d47e4080c18c55ea35581cd8da30f1a079565045d2008d51b12d0abb4411cda7a0785b15d149ed301a3697062f42da237aa7f07e0af3fd00eb1800d9c41
+
+
+[K-163]
+
+COUNT = 0
+QCAVSx = 0000000574236f1428c432130946783a5b3aabb6c27ea5d6
+QCAVSy = 00000007908c251b8da021cbac281f123f7af4fac5b3dbb8
+dIUT = 6653b6077398fadc7bf5e60158170148c3dc4527
+QIUTx = 000000071f8b2877d6027d9c1ade4244f2dea12692ef23d5
+QIUTy = 00000005c15ee776221c72b84b347ce383f38067b89c3e9a
+ZIUT = 04325bff38f1b0c83c27f554a6c972a80f14bc23bc
+
+COUNT = 1
+QCAVSx = 00000001699744092fe2b5fe7ecbf6987b7aea0a06fd2cb0
+QCAVSy = 000000035de441df9408d91f0e021df8f0526b8063031495
+dIUT = 00000003aef44754d0ca97d42b4e97aa92156263c0e078f6
+QIUTx = 00000001b0108c786bf4d340f0505bdfc7d45b514611ad94
+QIUTy = 000000022c9c39d5fb9456b8a2221cea4f058f6a8d2cd84a
+ZIUT = 05f9ac3a3dd88429600958386c55bef4b1aa5f0c24
+
+COUNT = 2
+QCAVSx = 00000002965db159171f5cb7e7a1bcc61611aeaca8c52c9b
+QCAVSy = 00000006871d1e9c1fe845268076a995803a6d49cd075554
+dIUT = 000000031172342e6d37cc1e062a4494c39cba48f9ad9a8c
+QIUTx = 00000003a27ecaec2b66feac2040f6890128bd0058d31924
+QIUTy = 000000014007e3209b6d7127b0f393e5e58b1590b9f40be2
+ZIUT = 022e0290eda5d348894129f7455d1c766d32d5c2c2
+
+COUNT = 3
+QCAVSx = 000000055b68c0c2c246fe0f2cd5484b58814c65213ea541
+QCAVSy = 0000000539c11d2592a2f6393b6e86c54df909b95fe0d5a8
+dIUT = 000000032a511cdcd4bfc567ceac8c24ed04e8894df78ddf
+QIUTx = 00000006978dacaa47d8f3bc90b41ec7f4f8ac79a86ddd07
+QIUTy = 00000007f8b0ef4270760376bc2d5faed83da7872631d09f
+ZIUT = 037f659f430009fcdae4e9f6e6316b0f5dbb268212
+
+COUNT = 4
+QCAVSx = 00000006b8ef5a62d3b636a5a76bfeb1ef8ff4d8b3d9e2fc
+QCAVSy = 0000000675a757266718398d8af66d2971798478e2f37d28
+dIUT = 00000002c6f64fe609eb8eeb5b53fab6308898e63ff2e3f6
+QIUTx = 0000000549e1a82ec284bf77d528627e52d832e236c92ad3
+QIUTy = 000000019883aa9b458b35bd544d6882812150c1497d31d4
+ZIUT = 00503bbb9b62f50ae7a8dfd74a1741826f09290651
+
+COUNT = 5
+QCAVSx = 000000056c4a3586acb03099d52b2cd4ac59269cf51b8730
+QCAVSy = 00000002426561cbd9da1b23a6003de0e5f7c4a065a5c2b8
+dIUT = 000000026a56867513ddd8ca94d7923baa1f7fb00daa38fa
+QIUTx = 00000006c28a40dc4e5503d2c4b8ab0b6b7046e8e25ac09f
+QIUTy = 0000000121911654a5836005d8036d976585ff1d831e587b
+ZIUT = 012cf17799fdefa2940b18d56e80d44414c5b13884
+
+COUNT = 6
+QCAVSx = 0000000741c69a4edb386c94f819d1b5ddd0281e4ff29765
+QCAVSy = 00000000d32f972abac91be85a709eba07f5d16215ae602d
+dIUT = 0000000386811079c8021c2d79f4de952cb2e599c42e19ed
+QIUTx = 000000060aa42a62e21eea37e362b4d3de837f0c49d3ac13
+QIUTy = 000000069b20d6fd16d13b1883df05629ac7d1b82386b344
+ZIUT = 062a2f926ab435ac14e05d44c27b46b6820b713aee
+
+COUNT = 7
+QCAVSx = 00000001ef47795fb0e380405ab5e88defc3ced9a92514a6
+QCAVSy = 00000000be6181d7fc03ca8bfdf11869cea28cfa0e5f5f64
+dIUT = e46e9c965268647f2048474c7b1a54dffe728f1f
+QIUTx = 00000007a984ead440310cef2e1338972ff2dddb65cac3d2
+QIUTy = 0000000333c1a93427fe6ac502760b7778898a8bb6a40ad9
+ZIUT = 0399b9294e895486bdefbaad7a729353ce09586357
+
+COUNT = 8
+QCAVSx = 0000000374d7f9ba8cda8a68de7279d3ff8674032fd47c02
+QCAVSy = 00000003ede995c3a4e8a6fe21cd1e4cd4ca3812c0d692a5
+dIUT = 000000027334971405b0461c3ede67f2ba336734451a8378
+QIUTx = 0000000767c31ee9303b1b2cd3059f81507ef304ebd3102c
+QIUTy = 0000000251e0d430dc3f63f3a37bab1e7a957652cf67e22c
+ZIUT = 022325a9a769a902c2e64c80a1d35429ced42ae0a4
+
+COUNT = 9
+QCAVSx = 00000006577df54e11c7e76202f94f564e6137b23ce6e441
+QCAVSy = 000000068936600aadcb25fd4024ed3e845b2bbf807280e6
+dIUT = 000000019bb480739011235c6d5c6e74d6a7bb4f20f61b7a
+QIUTx = 0000000093549075704d79dae772317dd65244fa772569eb
+QIUTy = 00000002a8a2821dd39d7e7653ca71cfc1a9ed857801a39b
+ZIUT = 051392d5377016358405030b48744003db66440a2d
+
+COUNT = 10
+QCAVSx = 0000000261d15345ceb492229a8d74597e7dfd19aeb6848a
+QCAVSy = 0000000114a122ce28ca15620f7b40a1f26b4234c956bdc1
+dIUT = f4edb58bcc3d6e9d317229420a733281eccff1cf
+QIUTx = 000000027183609b7593b1845365c081d45ff66c9ab5e370
+QIUTy = 000000069b981236fe930947b6b77f374282a18e4be993cb
+ZIUT = 045dac076e79de2fc631315465d3ef6245f26647e5
+
+COUNT = 11
+QCAVSx = 000000070e380f49370a0027954a4ea880bc1929b28c5329
+QCAVSy = 000000046fe3b454af9420a811f1e15f774da5ae1a40b459
+dIUT = 00000001b990491a12fdee231aa2a116e1e3c1c91d0fd478
+QIUTx = 00000003da869d09c4e4545ac1689fc72316012632d0abd9
+QIUTy = 00000002c820f40310e5ffd2f8bf439fba879bb2ef621b2a
+ZIUT = 014f7a46847ed6a7ff605b0e52c616e4ad3f0d5029
+
+COUNT = 12
+QCAVSx = 00000006e60af77419b9fe0fc5c79ca1a22a1011402405b6
+QCAVSy = 000000069bca34005b578cd7a7a6929bd3f6ce29943b5ed9
+dIUT = e829b9942fd96487f6012908fe04f6d8eaaf1966
+QIUTx = 00000005ab2074c04df57160167735f7fc2d8f629d34ff18
+QIUTy = 000000012e9da6d05bb3e2acbe5ba4afb4a0dd72db07d6ac
+ZIUT = 00eacabc34555956995623e60482e5c118e34e2094
+
+COUNT = 13
+QCAVSx = 00000004f750e27500e10f0a176b83f14bc26d6bd71ebd74
+QCAVSy = 000000039e5009067c0ee2c8f55b7e84da7a391f08af7504
+dIUT = 0000000157ce8f0b6ce92e426ec99f223ad82763e4bd3ff3
+QIUTx = 00000005d3989cca4ae732de93672b25c9260861b4c0dce3
+QIUTy = 0000000436a331ead24f2807b55260f9dc3de668cfbfebb7
+ZIUT = 0414a622645107f115576f51cdf39d1393a2d7851f
+
+COUNT = 14
+QCAVSx = 00000002ab9f5ba94102d21a706761eac0092190f1cdad04
+QCAVSy = 00000004addd77e199c132d18ac541b117748d2319db7fe5
+dIUT = 0000000379885f45f2d707be1c11d86c41bada493b2a5603
+QIUTx = 00000005ae31cb29b31d24f5f94c30e9c02f07f38bff0ac8
+QIUTy = 00000004d8d8e39bf87f058543dc8990a91214da416cc558
+ZIUT = 056be002daff11c4066e10acd046a85e170fa4c122
+
+COUNT = 15
+QCAVSx = 000000043d25d2de9293b84d351a33cb1a52f5930a4c8b76
+QCAVSy = 00000003d259d8236e9c8d6437f41e6d54611c52238fe2d5
+dIUT = ba8c5864db3efd768b9376fc2b6c1f85f46f6af2
+QIUTx = 000000062f622149823f255b4f86906666f3a3556af080ea
+QIUTy = 0000000274ca32c10f9add61a026d20ad3ad56b17fb06a46
+ZIUT = 021fef8e473daeda8ef6bf07814d7b9b613e3076a3
+
+COUNT = 16
+QCAVSx = 00000000560e1a421865118bea16cdad6b67aba384ef387b
+QCAVSy = 000000058b213ec2ab3942f8f6ad60a956955b589066b856
+dIUT = 00000003e5080484d3730b2248ccc48260d4bd1857605ad1
+QIUTx = 000000058aea6e40b8cb25e6622a7be4ff01b79c92de72a5
+QIUTy = 000000043f6776b6deff3d29b4c703899d705c7fecf525c4
+ZIUT = 03a287fd1cca68db47a3c74c12627fc3728568dd66
+
+COUNT = 17
+QCAVSx = 000000038e485de92e41f1caca6c0eb9d811a5aca89bf345
+QCAVSy = 0000000331a1677c46a68e964811a9cc5e4e53ea71e23129
+dIUT = 5d052ba1abea724978caef1879245672d5aef891
+QIUTx = 000000036b84a77337a9de5c1dd7ae3c899381382f0fffa4
+QIUTy = 000000056d4ac39fe881fdb8e60d4559658aaade45663ee5
+ZIUT = 029558b41b8b92387bc22c868f51bb7acb6e4ee2e3
+
+COUNT = 18
+QCAVSx = 000000064259e500476dda3e97e25e491d466c2b7958bd49
+QCAVSy = 00000003c2e53281393641a518d1dceffabee8b29bde1402
+dIUT = 000000039180187a9eddcf38dc264f055b07d20b9f9a8bc4
+QIUTx = 00000004b292d1fa09dfc5e6a3ad99fd02feb74d480e34f2
+QIUTy = 00000006e1888009a0a0491c0be6abfac943d377f0b4863b
+ZIUT = 0530020c8f6362312bfbe5c1c605b40dc2e032e81c
+
+COUNT = 19
+QCAVSx = 00000003714276997b4478e2d8b59af5f2e63e22bc4c31e4
+QCAVSy = 0000000673f28d962abfedee62eab47c3b4579a1e5168336
+dIUT = 000000016d37862b195763c6a01d5e39b9459a32507c2b21
+QIUTx = 000000033440e460c475f2058a767ec466ca18bce41f830e
+QIUTy = 0000000372aee323d063fa89acbffbf55024ae24e4929f19
+ZIUT = 0521673006a1d9608911d54536e122d809e919d804
+
+COUNT = 20
+QCAVSx = 0000000275ec15f27dd2da6e44dfe6235472d5bd3a2502f8
+QCAVSy = 000000058fd02262b27c185dde26b2c77d5a4f4d50dc9928
+dIUT = 6c658794b039c820a8b033008fa8ac7556bcaec3
+QIUTx = 00000004cbfb286691e415081a1785ec6b0aacdb1d231d1d
+QIUTy = 00000005dd6acfe91d68a8ec23686478c0ee8c89277aef14
+ZIUT = 0460579beca16cccce314ff3040de4785336fc358c
+
+COUNT = 21
+QCAVSx = 0000000233af36103039226f416dd22e1a26b73f9093d38a
+QCAVSy = 0000000734258a175c97768a9f72b824b99a91f5cf8e3d96
+dIUT = 0000000169c8da22c35a855495047a104be00b1575b652ab
+QIUTx = 000000045efed9c8bd2a4e429588f344f49d1e63e668bd01
+QIUTy = 000000025d1af85ac21d59822d7df8f0e4bebadf3b5d4401
+ZIUT = 05ba66964483fe473ccbd00c37ad3ba40cc5969f62
+
+COUNT = 22
+QCAVSx = 00000006d032152240f28be7f74df8f6d2a450c1229a5a95
+QCAVSy = 00000007aadac77cc4448985d1794636bc1d582f3d101a33
+dIUT = 032fc790864632630c49a29e9ad0fb6d10f2b58c
+QIUTx = 0000000779cfb3e17c902a2584ed3382a8bed8262db98424
+QIUTy = 000000004af273875f8a2ab9a94ac0d1e4a23390b2bb505c
+ZIUT = 0277c4a76e1613b2ede699a675c1645a786075009e
+
+COUNT = 23
+QCAVSx = 00000001f8581ec61df1409227aab7a015f2c71d29e3716c
+QCAVSy = 00000001c1f51cc4185b68a260e31b4b00c03a4403f65c25
+dIUT = 00000003c1de5bb40e70933ed7db84ce2cb468cbba299b3a
+QIUTx = 00000005ffe0f16018bd4bdee5f73bfdad04d713f2216f50
+QIUTy = 000000042361c881f0081cb0544efab0c3b34f59eaadeec4
+ZIUT = 03c6481dac387af39e8c09a553068ac496eea03691
+
+COUNT = 24
+QCAVSx = 00000002ba22fbdaaaa806c8570f14ad4c882a610ccb8d84
+QCAVSy = 00000006d4438e528ca887b05bd2564df93bef9bf660da78
+dIUT = 00000003881275ba48bea0becc0211903467f5d0aae321aa
+QIUTx = 0000000776e40fe7149985337ef1b6c9b830cb3608752aa6
+QIUTy = 000000058e6ecbb27b0b2d3cd0e3a7ba538de3576fd5b9f6
+ZIUT = 07b5d096d06d41c3ad6458cc93417e6facc99bc7b8
+
+
+[K-233]
+
+COUNT = 0
+QCAVSx = 000001f40e34b3ed4a1b2d40c056fb75f2ad543c897cfd82f542cf746a0f202f
+QCAVSy = 000000c130a1abe92bc4c977c800777996ccc50b90df991a2e81dd515c188599
+dIUT = 000000135a5b8c3ce047fbc5df26277d3bf83ac33ddadb5cf4a050ca82be48f0
+QIUTx = 000001a53e5c138b3d83905d563aa1db01274633c986b52f78225a92e33e7952
+QIUTy = 000000ecabd3e2e26729a965604e560ed4498a22b31c39642e1cf99b1dde3ec7
+ZIUT = 00a822b141ca1f5ad32899e68c54d1fec3df8100df485ebf1c5868a9ac89
+
+COUNT = 1
+QCAVSx = 000000c864c2a462a9363a4ac3d818211bca0369472d186288a27567433bda45
+QCAVSy = 000000689d4d0006eba054dc69fcc0786780fb5f74d3989213504e2f6e666980
+dIUT = 00000051be6fbcd4878c55439b0bcbbe5ea8e84bc9db89e70a8e8ebf34782da8
+QIUTx = 000001c5a1e5d3ee516e3ede723fa2d5cd3456b116326303c5ee49273a5604c4
+QIUTy = 000000568d0fe7130295541bfa265074147546e9733736ba007559d716d8e094
+ZIUT = 01662682bec2dfae05e38587c8e6a4d18aef4cb3416989c47c11bbe2810f
+
+COUNT = 2
+QCAVSx = 000001782d82fcd211c0247c87e657efcc5d2ff6b05eb935330a53903fb3bfa3
+QCAVSy = 000000cce830a515d690ab98149579ad3481384859e565d07fa61f50ebd669a2
+dIUT = 0000002ecca595e55e6c85c5af78c59540fdb749003ff4ec361c38b48e7da6bc
+QIUTx = 0000005a48fac476c31cad0c68e64e65e687ae4418fb5d3b4bb2abb990dd0de4
+QIUTy = 0000002d9add706626f2859ece110df2dde89faf3e8aac433e2595e23c274082
+ZIUT = 00215d511cb95e0e073ee999908a7a844afd75c9acb7a9d724f7fd322b01
+
+COUNT = 3
+QCAVSx = 0000008d800d3767abf5731695754ee8829b858ff4eb604a448ad66490b49c19
+QCAVSy = 000001bc0f0339649ad4d7b7cff3fca9e965a38625e8f45bc9602a33c0798a33
+dIUT = 0000006a7c03892df184d56cdccb9d5e9a16483a6c9388ae212aa926c8fdfb5e
+QIUTx = 0000014aaf880e81db69aba2b403bbda7f361e3339b483ce2699f30bf5281ead
+QIUTy = 000001b71559bd7d9384e517b87f1138a696fbceb3510d8c41c2158d4aa3e5b2
+ZIUT = 01394e02c70104f2a5308b2d101b02c70ef2d13540602b8e8f82dc6d569f
+
+COUNT = 4
+QCAVSx = 0000014a3e121add7a5267f5cad204b3f49215084786b23f8d94d9fda02e0f19
+QCAVSy = 000000394fea175dad9b34d525434654d0c86637926cac3a3292a2e4a514b5f5
+dIUT = 0000002e2ff8791bc64c00f3b0f1d5d5cfb9ddb3b193814599f7dbddedefcfa3
+QIUTx = 0000018045cc9e65f6e275e322a62c18efe2d00cf93995feb53561273a3f1306
+QIUTy = 00000164e0073c0d4b3e12e22f837bd3fec421e3bb09e0c0dd997422830f6403
+ZIUT = 008556a4c3a8906ddbcb946099ca5dbe7bdb6cd8f37fbb50c96fcefed32d
+
+COUNT = 5
+QCAVSx = 00000089667888f8425c5a623134622f1ea9d9af36df9772c410d6e31f2b4db8
+QCAVSy = 00000084430fa47164d1c0eb97042a44cbef400bbb545faea4ef49ba5e3bef42
+dIUT = 00000066972e71566746f2f76c87793774054ea275e2a7e27ab7c2d05c5f2412
+QIUTx = 00000020226dd73e318e4fc8d49dd43e59e260193d1bb248cbe4c06b4d6b8389
+QIUTy = 000000ed12a4f389696ab31c93ea3ec4d8eaf18be097fc9152e2c42b73ff4528
+ZIUT = 004ea6e0e34ec7c9bbad47f0f6f8ec0608e736d91e0e56cf3e5cffe8c370
+
+COUNT = 6
+QCAVSx = 00000164da099225eb3c641fc83c77204a396eab9495b12a22f68e7a4b8399d5
+QCAVSy = 000000cd98f2704c7494e6d20375e74528c8f56f867e9dd763298142ea01724b
+dIUT = 0000001e53baa16bc0262b5329a711b0eb188a1bca7ef4b5c85061225d41d4a9
+QIUTx = 0000007d6d785fa323174eb9cde5b705428e4019244835bc94702f280c25ffe5
+QIUTy = 0000019aa0ef433074c484d14e611372f03ef8912f1a8246ceb1e90c817db3db
+ZIUT = 0160d0b9b92a4acd089738fd489ae39734551e888fd05a020ce26498270a
+
+COUNT = 7
+QCAVSx = 00000033a8b08a3c33c343032ced1c0f5e826f932dee879ec1607a2af5d46298
+QCAVSy = 0000006c4f27a49b51a89f6d0960160ba5b8fec08dd2cd4bc909a490aebe4f7b
+dIUT = 00000042a8032a11d1657755c49e477033b0d341da2fe993a4577b41a40cee1a
+QIUTx = 000001f6629697da620d597fc1f51c83374213f37e952fc117ee65a9e766aefb
+QIUTy = 0000002b36dedc787ac951d2879d72414da2e7575a6cd7c42e0fa20b32d461f7
+ZIUT = 0038381b342efaa70bb79adb76ceb775de5f45f863559ecaee1ddbbd0313
+
+COUNT = 8
+QCAVSx = 000000cfe15f861aa0153485f38ac033df9c8d812afde167b8918bb94a08d963
+QCAVSy = 000001bebf067f85126d114932162164201b1374bf1840aa11d5e250639d0608
+dIUT = 00000043e5770978195f917152f057ba1fb0156d894d32e8bb54c7f62f7340a6
+QIUTx = 000001487d1fdabccd7d89da25685b042980ab170aee3c11f31180e3b7c50a4a
+QIUTy = 0000017e383dd65a1ec8a409007f75035e5b161335d9c7756ed970490fbd171a
+ZIUT = 0122169f1dff445ec663270375dfe914016c38ce6c2d40d0b8098abc60ac
+
+COUNT = 9
+QCAVSx = 000000763e286be50740b7f8bd78fa70bcac880df3d7371eb33fda2453b3ed23
+QCAVSy = 00000057be6c5f7d990b75439868339ae327af04a049b38b92332b9cb8cb27d9
+dIUT = 0000004c67c6103e62124600a0d9e923dc217a022f57c6feb219c703334ff339
+QIUTx = 0000002352fe9341e62c609fc1538e0270405e7001d747b87500e644a112c5d9
+QIUTy = 00000041f3b15b714a6f7ef647e23665ea530efcbe19b0740436cda812e83939
+ZIUT = 0054d47c9d0a9fee258122326be25daf35f0ba0b8449e16b4623a8c0fd7e
+
+COUNT = 10
+QCAVSx = 000000bc8a71ad4c1134def026e4723e310223fb2c5859bc7594054c894da552
+QCAVSy = 000000c3650563505535033c7a6c448d73bfa08fb8370234c7fdbac1b34daa22
+dIUT = 00000019e54da872995eb3dcdccc50418ec351400889fae75a0ba4dcff25f1f9
+QIUTx = 0000015e67eaebe52ba37f5b73a199d950812cec1012fd410581444bbf23e0c8
+QIUTy = 00000022055ef821df33042fb8316ddad76485dbd2590e2f5498a914e4f0ad39
+ZIUT = 0071aed39f5c44a7ff72db3e0f8284da39dfb2d894f278d2006f9d2686e3
+
+COUNT = 11
+QCAVSx = 0000016cc1ae13fb348252493021cd6146d531f0b722842a44c7979689f1ff38
+QCAVSy = 0000018c0963ff0ea37048c9f6f47644f2a7c8c503863c27cf21ee6e0a3224ea
+dIUT = 00000013a5ffc9a0f7069c1c66148699612e5cfab7e2bf7b3255f181a0227192
+QIUTx = 0000018de4dc4f6a4de5c3638ebba24dc7064983b159f55b139c7680a1cb90d1
+QIUTy = 00000135532d8148af3e227d4a8960e768c565f72c1ac0a1c9a7bd185cf994d0
+ZIUT = 01ca68ead4eddc8847a3a661cc6628e076bdd4b45047ece72245d094dd3b
+
+COUNT = 12
+QCAVSx = 000000e49e182ac5d932be8b05fe340e8cb72df35647decd679a8c59b5d8fbfa
+QCAVSy = 00000181b95a965abd16ec2430c26dd071984e854a967ff114ee7831bd314b2a
+dIUT = 0000002f5d2a7e0877a4c99073732386e8d59734a23dd7f0df7fcd54d941e760
+QIUTx = 0000014798094680cbd32fb1ee9dcaa6b8739a556305235933fb27157d319e57
+QIUTy = 000001c855f0d453c1ffb5f668b32a8b3e309e0e8101bc39b6dbe7de214015e3
+ZIUT = 017a893b2e090780ff8daaf3588f9dfc0ac4dfe1f1e263697a9d1f398ab3
+
+COUNT = 13
+QCAVSx = 000001598b2fdb5bf1a3951fb9ec016ecb4d28f66c2e9d13596786593585d719
+QCAVSy = 000001ef65caf15795d14a0be89cac7c680323bc59803ba874cb2968672cb8a9
+dIUT = 000000652a11f6c3117f1326fa6877405cec7331c4f146a97f74ab0c44de01b7
+QIUTx = 0000002cd6d4c1d2cc5e34205eadb94f4cfd35bb569da722c4d9b19b8d5cc2de
+QIUTy = 000000ea3004e5b0930df7f8bda314c8bc1145463eb60022cd2dcf6c0c824e50
+ZIUT = 0041fa5fdf495b885699249b7746334b76c59e1c917bfc1ae371b96941f4
+
+COUNT = 14
+QCAVSx = 000001b6cff3b7fa215e378605c93f86f5cd3845f45fbde8be079dec29bc8862
+QCAVSy = 00000166222efa5dba9e858c245dbb5da668239ab5ba728618fb85a90ddc760a
+dIUT = 0000002ad5f71c6384af62689b35c24c4ddfb35acf8106cb0c19502c2ca184af
+QIUTx = 000000fe1b52408a712841bd62f0ee51307f26331d402bcc3a5ab0405d1c5e80
+QIUTy = 0000010a731a7d6a6a4f5b40b2eaa810c1902db27b28d297bc05f3714cacafc0
+ZIUT = 015f5adba59d1ee01696cecce4b63e78e68508303ee496ff5abcea25ad3b
+
+COUNT = 15
+QCAVSx = 000000cf402aebc3e4247a9ab43da9755176a810e011f9fd977de1be2fd534fb
+QCAVSy = 000001bac45fa42d605ad3479c7c43e724910716737953cc8504af14f331d34f
+dIUT = 0000006f01cb54781cbda6d88deb59843ae0836b1af683efc75650be84f208a7
+QIUTx = 0000004d00a8f0820da9097fe50e8e7defdac29607dd4cb1dd881d4e61f1e78b
+QIUTy = 0000008a4a8e9c811b444367952752ab8c2a5198efb28fbedbf3fbd701a857a9
+ZIUT = 003d5c29b3753e89ce5064575393392b377ca657a0b73872c82165fc43ae
+
+COUNT = 16
+QCAVSx = 000000f38ccccf08e5bdff3bb35f7e75bdced68d3791dcf7843ca88ff092136d
+QCAVSy = 0000015ed7697a4b8c99d0147828f6c861ffc9cfb0f33dce9d14b0731e1da262
+dIUT = 0000005dc1ba1839f5d1fea85ab3614c55a9c5fe600853c71a61983c7dc82de2
+QIUTx = 000000b6cb6ffa4e2eabcf7b987ebb520165a8ec9a22a6f9ffb100f38172a0fb
+QIUTy = 000000d39814e1852476e56e89ce8cdd64372840c01570a86940ace24bb9cf6a
+ZIUT = 007c01f906caa590898a09f46b6f5383658e7fee656aca0f111f22939960
+
+COUNT = 17
+QCAVSx = 000001e328571df933acfd4c96f3c4bde71e9175cbcd62aeecd76384744a0f3f
+QCAVSy = 0000019ff48aae0c252eda8d340b25c4dda01a2f21aaa35d39baf036696a1101
+dIUT = 000000241e1df5587031dddae196891c28821cc7879ad35832ae718f6e792e66
+QIUTx = 000001c172cee2b76503eb4d90b39ddace825b23c32375cb68eaecd7348490a3
+QIUTy = 000000c246ef9c6e2fadac77c73ee9dd5adee828b7918417395b5997be1a0278
+ZIUT = 019eece7d3fafc9274d361c6fafd9efd9ee485cbacb3baaf6834feb4df6a
+
+COUNT = 18
+QCAVSx = 000000f4aa7f9340a9da46c4f06728753a4adc5af53a4dcb467f70b4873da785
+QCAVSy = 0000007f321e2bc4e29a68ac23c77cedd3bbcde0bf7b92a27ffa76496988981d
+dIUT = 000000044ac55a913a8c7f7ed7fc5679f52f47cbb9730325be21b7993779d187
+QIUTx = 0000009794861017b3debeff302e425327fe269d78753b73bc1bfb3a77f716dc
+QIUTy = 00000002581a49c1269f5ec868dc6d7f5c2d8e749632d47ab6d9e68dbad985f0
+ZIUT = 01e4b7e89fb1b51179b8792f5cd581c3917e11246d3846f6344ee82eed66
+
+COUNT = 19
+QCAVSx = 00000068d9e55e7a105b7bb44b21d669bb0ef657a91437ad84bf6d5853270c98
+QCAVSy = 000000143c8bedb54db07df8f67083c59a0aa7cd8a0efa42f42fd62e442e0b62
+dIUT = 0000002bc136778531089da5c2fab3caeec256c54b0b35fc2c65f7b8ee6161c3
+QIUTx = 000001fb258a31d166bef9cd664cd7b66cd8c186e7025c77f0bae731587e9ef6
+QIUTy = 00000060dfd4e475e92805d1935d0382dc1767067915cc00ed3b24f65382d21a
+ZIUT = 0145710c3ab0780ec233424d4e28b38d29f886965bbcac49fa300e1ed886
+
+COUNT = 20
+QCAVSx = 00000099eb91cda98620103c3205d6489e68ad7e57d0a51dc502d6e30588f418
+QCAVSy = 0000003fbf829929edd28e906f58f87abed6d6d177f436f0dd940dda25eaf188
+dIUT = 0000000d56595471435d95fec37df622f18ee7dabb24379c82bbf714c5abc5e3
+QIUTx = 000001a52940a452aaf420b37b5f32c2c337306894a882feea7addadc01927ee
+QIUTy = 000000771b9f62a2a6fa892503225275490388b8bfc2df77df3e806bedba7d88
+ZIUT = 006941a2a531083563dd886b06c0860770a4724bb04a4ebb2afb1ba2636b
+
+COUNT = 21
+QCAVSx = 000000dccaa22b43391dc052597ae3bd07c6e5f021f39e987756f6548171ee94
+QCAVSy = 00000128efd49af3a6b32dc16797a978f0ad4ab0db66ababd6ad5672f4f812c9
+dIUT = 00000019c8ab2b32f2ee93bf2ff6bc44378b60872bdaeb6ba56b514c8f388ba7
+QIUTx = 00000083530fa3df315a8740ac52f4d394b80c4a5f210baba0b6dc2205e12493
+QIUTy = 00000037b9d02ed43e9d41d0dbb8403b9021b4d2c1bd360ee53c31c27b492005
+ZIUT = 001d754ee5351d4582974734072abac23376e24348370934e7b864db0f52
+
+COUNT = 22
+QCAVSx = 00000170917b33b37b8eaff2461e5f9eb8f0797b13aabd915a60706cd4f32cb6
+QCAVSy = 0000007651e0742c0d83d4b68552e9b7abec3644ba9755cffe6d4e56943a6b9b
+dIUT = 000000503160104d88a0c0f63956e7c3bba702963f9f1b53fc119a592eeea4f5
+QIUTx = 000001463c78e498abf34033ec3e1d973dc12509e2d234fb91403715e42f61f7
+QIUTy = 000000ade7abb98a0308886696353aad33c05bab5cf3c0d4e969cbf4c4ceec93
+ZIUT = 011346b83791e4bea7f6ba6b1265e5050895d84027c106f77353418f75d7
+
+COUNT = 23
+QCAVSx = 000000d8ed318382b85c2525a02c22c67f5bf366335d94767eb5cb45739664c5
+QCAVSy = 0000017d8fde7bbc568fdc802a3e3455f3cf35602df70684c8acdda165a02656
+dIUT = 0000004547eaf9be1ce5af1386e311046ec83260b84a2ca91055f60668b946e0
+QIUTx = 000001504938c167680afb8b6d5858cfaa191c40196fc4e500c662c5346ecc90
+QIUTy = 00000137d1ba942228dae68c450b1a033a2c810a995971f01c24089e4a6fdcc5
+ZIUT = 00b4938ed1ed012a9a53892ed9949397cdc4e4a612d54dcf80cdb039f47b
+
+COUNT = 24
+QCAVSx = 0000017f87f13f6dfee6081bb5cca532fe268c271d2756b31bdf643297cf695b
+QCAVSy = 000000f3a746955e12dd0b71919edbf23b2322cab328dd09bdf87bcafdcd2884
+dIUT = 00000042fbe554862f3595184a45510ca53df97c45175584b5d2de042723358e
+QIUTx = 00000131b8d61b9cfb0536c588214e45888ebe48391eeecb4d7fb5be8eff4acf
+QIUTy = 00000165da49557a0aa9d45dd378d5f899272cc697682276ae91d2c0b675c469
+ZIUT = 01b3d2578bde3066a253db5322c85cf9487ce77b67ece955e281b0d7d0e7
+
+
+[K-283]
+
+COUNT = 0
+QCAVSx = 03f075c24c35a9dc9952be6fd32b761dce63f4720a22408e3a14bbd097e012b5694c22a0
+QCAVSy = 0675825b40202e95be7dab5a826147e04b8c51a09b0034577c1f31f8c16a70c8e1c85b89
+dIUT = 015fde49b802542a52c70b23a0b1784e5f8780b56853f9a5f8c3a5266e8727dce97d4a17
+QIUTx = 0611edc045dbe43ecc4ef6b324cd51f70fe3d7ddf877ec68b798909c3c4561756aa30e5f
+QIUTy = 00833b25511704af09b62d9f7cbac59814e75bbb9c735f55538491dbfa60c1e0115efe42
+ZIUT = 0745552817b5d729310b7dbebae687648714a9ae695dad20ca1ab6111c3d054670f21132
+
+COUNT = 1
+QCAVSx = 0799b430e92320ffeabf2d6cc87399e30c0aa84420ff8eba2309b99487b742d722e8b7a5
+QCAVSy = 0217362801fd6d2d286e5cdf375cd0ae569b700005312e37e8e35b1592efb9b5eaf47b3a
+dIUT = 013b911f62f3aa884354634547ee622807d5d106020330ae2b9798c0c4cd0eadb10ba948
+QIUTx = 078d2ecd4d902332b6b3c7bd4ba7d200fc34c45eda30998b6025ed47b1f4f8e68f328624
+QIUTy = 04d5e53647dddf2fccc8816dac8bc70c29807622cc95539a72aa3a9b230ca1d25ee7b516
+ZIUT = 02eb0c1ceb6179232e91cff91fc8a30553c6ed7e0a71deb1bda0a10735a84593dd903636
+
+COUNT = 2
+QCAVSx = 00ce47a743d48b86fefd6b5c02f2a97b2762a2fe57e0bdf85c1d6a29de8862c4c99ed53a
+QCAVSy = 0322e596069f916568ca248ced57efe90534af4a9f90a4f40f797e452967031726bf41d7
+dIUT = 0177632b69e7edda3cf007307504343cc2162326f62017cbddf360a876dc93b81f04c58e
+QIUTx = 03815ab6480e4ad24a6628275ef2ee0ce7d58699239dbce23338842bc58c42cca94d2412
+QIUTy = 02de833cc664cac90d30fbeac603efbbce9276d4f16ab1c46e7e11c81a9aa9e25c82969a
+ZIUT = 04a9dd2cf5076814e5329c518c4f27b429dbe01d46682d476e7e78880de368b064236ba9
+
+COUNT = 3
+QCAVSx = 0728975839b42c62036a7afffaddefc3024b7258407bed565caea939be33d16ac94445c7
+QCAVSy = 07712630790b05ae04d8d7d9f2365dae9ad24c4c61b3eb20c0a7987e6a4c4b0f598c371f
+dIUT = 003bfe9a1c985386e5ba2b31553a55151e78ddc38f07432b5c42a1cd2da278fd0b68e047
+QIUTx = 01d9c3337da95ec6e5a4bff1cc92783989b66c9230107870d4a578699338e38eb2d92eff
+QIUTy = 00cdaad7d0eb0f445aa763a5dfb8f38f55355777ce24f753b5ad3d3cbab125f491698d56
+ZIUT = 044e2cd2bc164d21cf4b9833c0aa62ed059282e62b82f4500aeb422d17e1f6e7e8bbd500
+
+COUNT = 4
+QCAVSx = 055672d73998451089e2b7c7104b42247dddd132d40ad087b588d6a385da64f5a2f46838
+QCAVSy = 02b4cb1581f9e2b378eb7a4f64f5a7d4320b2ca3d3474726f670c3883bb8da47f3d745be
+dIUT = 00d95af52a708e692d02677b21032f7aead6003f124e72013f37c06e0bbc20e3532b3cea
+QIUTx = 06e487f91e73bdd344fb8bc8f4c1f476e727fb2671e9d6c8fbd775f1aaa24caf2e9a36f5
+QIUTy = 0663e1cff8099757bb9ff1b87890283aa49cff0f7b12fe184ed2a428375d2796cd81de91
+ZIUT = 04d4f04d2fcf1bcd8150eaded90e467d3d38f753b6fb54eed8f9d29cd3dcc7be2c83de11
+
+COUNT = 5
+QCAVSx = 02cc28a4cb76d147d98dfa677dca14e1771347b9681c65cdb540f22c907613fdccb0c8da
+QCAVSy = 07d4065f990c8fc37d100ece38fbf574ce444dc37355e0702b80d1eb1bdd670997e8f271
+dIUT = 00c733d9094032cc7aed6c54a8ced753eaf2a48882285a3b4c7e6021f26bece0722840ad
+QIUTx = 026896b039d7068d98a326710ebb7a978bd47661154645ae30cd83d60535067e05151ccb
+QIUTy = 00d83a263bdbd8c8abf0310bfbfc83917a86b0d8c4be0b155ab7b9e2c705605628bbcdd9
+ZIUT = 01c343540541604f68ddbd63c483760d824ded5c18be7e56e6d36a9ac6d25772afb0a90a
+
+COUNT = 6
+QCAVSx = 063880eb538c7275ecba4db53d9b68c287fb3778bef514974d1e7e31a9ae365a2181415f
+QCAVSy = 04af9f2cf92542e1ff8ff28f8e7c8e809584e243a4902949a765a284986c750b1b06c89a
+dIUT = 00db39d7536072dc3448cd7d2160e50c811f648358eb0db1d5428e81aa7a686b7865adfd
+QIUTx = 03a721906ad13dc15c311fd4e552f3bc87b7d92ceeedbb0c316a952785ba4689fc0ba270
+QIUTy = 029514f3873bbc3b9e217061f7a6261fdc6268685f9656f1d5eea472cc2db5a8c162e6e9
+ZIUT = 05e38079815477b8a79096ce339c4a255f8b213be74715ea61ef7dd0c0b5f161d9de7521
+
+COUNT = 7
+QCAVSx = 05bfd2895a2e66366db7a83788c72bce48f79b5c9524a08ae273c78ceb39ae97559d5ac3
+QCAVSy = 04a2b0a55f80155a1a330fde6cb6d97eddb0a9dcb66c49b392904abe8b381f91090dbb21
+dIUT = 006649bfd641dabf1b9d499d4fb04beb099475d0aa15d5ef6848b734d2d413008b604308
+QIUTx = 008f6576d62affc71836d19adbbc3d504210f12efb61c42057824515290c502f2e09b6d8
+QIUTy = 0021643be87ae6e549b0d5fbb558c1303d14b1ccd77703ec74f9602f35ca8d7a5139bce7
+ZIUT = 0531ccf51d1096982f7c2ec513a92bf51c7ac5069cb15c5e2a053ceae7e5550908a19101
+
+COUNT = 8
+QCAVSx = 063547f7570bd6959733c03d2e6c4c88971f314adcf28bc851dc52ed4e8c1a4ea06f8702
+QCAVSy = 0122d3773b0934e900fba7ebfe1ad5ed5bec0fb1a9ddcf4eeb61cbed040074313c0b3170
+dIUT = 0081860a653d6d94446d7766164ff92c6c5c1545c735304b3ad4d5178c8b14d0181e9471
+QIUTx = 06b68815bb83691d16749c4be16125e2a6d6dae94252739ba7bf0db0d50198ea2fe43ddf
+QIUTy = 039e0d93018a46125620f6ffaca5a0668343c57025a60c31a9d6e51191cab338993b46b5
+ZIUT = 06ffe79d2b7664ee2d8303ffe0ceca8c49a581fcdb49c4af6a060ff204eea74f4cf39cef
+
+COUNT = 9
+QCAVSx = 009047f7d77397db70e39fe9e4ba9d97a995a7ee066ecf538179e937ac86cacdac510950
+QCAVSy = 007cd875167f06a2fb9a819e2cbdacefc16cae0eef2cbb0b2d49beae109db753c9506170
+dIUT = 002243e8919bd7a97cef0e9cde63c76d4e107150294fcf8dd7676451ca3bfa5c5edb964c
+QIUTx = 03e439e3ebdfa7a23a9deb09de141905c653c4f202edf2cf5f09faef88ba3113701e49f0
+QIUTy = 071d071b86ed0f468fc6019de23fe4ba2cb3b50032be35e92d2e5af40de706ab524e82ab
+ZIUT = 0311c430db78b6203e27b52988e1e9dae890c655dac4acefa7ee9612bec32e3e5f52be55
+
+COUNT = 10
+QCAVSx = 04bdec19300c8afdeed86499d2703922df57b2ffec37e45c03a5e2909de3c333bd06a5e1
+QCAVSy = 01aa4f40844f2413f1fcbded003b1d15c9f1df7548de2a2bbf71b516657ad8d8c77cf72d
+dIUT = 00512a42841e1227fc9fed51c2268731684136f225cfbf45648987e2453a7186f6a7edef
+QIUTx = 022f76e5ab714fdf78571e84c2b6ea3a17f12999be483bc67e1b843d209bdfec0347a43e
+QIUTy = 02eec1fc0e85f330c53dad7bff4862d8afff8aa14f94756e95b8f01fd7eeb8fc54527787
+ZIUT = 0701d92ed8687138014b4379f1c34677e1744f6ae8c89958a5962f14408d587b95472db3
+
+COUNT = 11
+QCAVSx = 0611f53af4b488990e7a52e5c73856a1e74279bb0f36d3ab1989b2ccd99391b6c6b3a13d
+QCAVSy = 054ea95a234f65897195bc97b03fa6d246ea5ab5f41da22c08ed817aa7c04adf372982b3
+dIUT = 002a8af497d1a3dac0732a393dedf75394a3f519ce07faed3f77dc0e669f3a1b1c6ddadb
+QIUTx = 0571f0c87f88888ec0738961834021765cc4f5c8db2b1f9ea9b8fe9847f8964349fdc44f
+QIUTy = 04ef7c8044a609694746ccaafe87fc7f9f1a78d00f8354f5da7ee2f5da7235ac1ad4b57c
+ZIUT = 04f2301ed85a5c91c31a7fd125854904340a55e34976a20743bd33d95e476450f301ee62
+
+COUNT = 12
+QCAVSx = 012706ec0a0e76425d8ab4e0d55930a4416e4dd0a1af6d97987252988da0ac9627577cbe
+QCAVSy = 04215e8715129cc76301791701dc5fe1abcd672b6aa19ba4c7e532ee7a913eea60dbc9d0
+dIUT = 01de9fba4ab24d06e74ae5ad36ae195c2360c728eb38c50ef533329e70c5ae19f489b6d5
+QIUTx = 048d61e0b9b8064bcca8ce40d4f9e68b23684137726a44ea75c8f2f8850f0333fbe985e6
+QIUTy = 05fcaba38d51e2112b6b9f34e6779c10c0c559c3ecd156022966cf92a8c7f65020a79ebd
+ZIUT = 0643900f337ed362815f181e0628ed5184dad3e66a1f030e947f116696312d835f7f6e7b
+
+COUNT = 13
+QCAVSx = 05bb20bea4fd85d0162689c550054001409b6c712d356a52f793d78aa2d8261a43c5b6de
+QCAVSy = 031be5cafc8aaef19b861503413a7b73b60b37b0180493d82e9426f47b6587393d08de08
+dIUT = 015d3a222d5709cb339d93cd29650664f39bf3201c5d1e86d3aef8f795b9fddf47d8c4a8
+QIUTx = 01e2b88de3772b09c63d036e0dbba435246987497b6283dab8ccf1002486de0730277b43
+QIUTy = 03ce182b7f0cea21a06a1d4de8722cbfc59b9d9d79bc760b9d17d85671561aeaadd54941
+ZIUT = 063b1a3db331f91abd0af837db9d5f040620d1ddd7fccf8b58e0df43698351ea1942548e
+
+COUNT = 14
+QCAVSx = 010a3ca2435b135ffea08792b7f19b4ee181207c29be1ce1fdeacdb69a669f9cdde9181a
+QCAVSy = 024908274b1e98c6d197ed2783c3c953c1b3b34fa43a8b2f5742584e37fea407269b43bf
+dIUT = 0098c570666792efda65fc9e7909931158dfd4477be93332e493d69866b6602c4951de6f
+QIUTx = 04dc6774fe46ab0ed2768d379e7564a37c6bb1dd1bfc555727ad94c20f4732cabf2a2c82
+QIUTy = 06c6cf0f421f91fca22b4871216a9f1fe3878f07914e96ae94ac770b6762f9dce08ffa2d
+ZIUT = 0516da1d64bc4b25ce4763e6438257d62fb1ffdeae16d68701d63b603ad53e8587927669
+
+COUNT = 15
+QCAVSx = 053a0dd6135e43a114e5000aec40ba2709b3a613730f1cc2006b446935e237bfccc394d8
+QCAVSy = 03b66ce6cf01507d462eeefff6211bd4c56070116c6907468f7c76fe01140bf0d5fb7b79
+dIUT = 00f4b6db4a87cdd30029cc3be89e40b9bcb014d010a91a252c56cb28671f354a804cb4d8
+QIUTx = 066ddf04831fd1c72bc48b709061c1aeaaad19c9da3d8c1506fa775d4f5a5412eee0286d
+QIUTy = 03aa1d13146ff192792b74a5c64ad3150fae344fa830e0f44733d867f4e0ae053526c62b
+ZIUT = 049c68c333b96705eee4a3def0d568b0d4faf24df2fc2f1bf40da0af0946240c38e97f74
+
+COUNT = 16
+QCAVSx = 06d4a6f3e87b6d8c49cbe517a975d2ab8c6339135596d6b30cc65cc80c1284508f49789b
+QCAVSy = 02963b356f2434ec249bcb6589ede4de36cecd3450e6f5e477bfcdc29ada4aef0f45ac53
+dIUT = 01ab82c5a62ae47ecbccf666cc3323b35128c52d17be11baf3bdb56006e5d568baad8bbc
+QIUTx = 00a04ad7a583666a40437f968b02cac7946745b4ca949021c5443deb70183f88e1778fe0
+QIUTy = 02bb591c32f0db3430342f0e37c45449c293c54f6b7df6f797c0992c2829858b680f2bdc
+ZIUT = 04dd44c1a30edac2e39a5bc9902625880a18516385c90a9cc6b94c4f111e0260863ccab2
+
+COUNT = 17
+QCAVSx = 076452e19d7a10b885123d503f5d0433e163df134fffb8558f8ac26cfb30629f8cfb093e
+QCAVSy = 06b3a24b2a4b077770d396bbf154af41eee3503573a6de9afe0f6d18b02fc9761ca1643d
+dIUT = 001254af1791cc75694ce590bb518a770a750446171a30edd6c0382a17e6880a1aea5b81
+QIUTx = 02b766c993b398d2426a7a0a49e9d001079d0fc32197181c56eac1805e4f87c9df055dea
+QIUTy = 036e7bbd3be9139d4d43a8655ef7d51a062d9947d1a48010ef1ea10eedeb27f0d1ffe765
+ZIUT = 0049c165339e9aeb2b516684b442921f1fef3091cf781e03fb3f56e93af1f3d6e500c81f
+
+COUNT = 18
+QCAVSx = 018e0bb7516d2c42e9dd96caaff5f20bfddf3e8623fc947d4d70491536790b8741cdd372
+QCAVSy = 032c0fffbda2fa863cb9d15c36545020d5bb24d930daf2fea4555f7c24d6aefbb2c01d92
+dIUT = 012017b9a0599fbf13cee10850a8f8bd06ccc00bd29ac6779f1bd93346b22c98327e0fa7
+QIUTx = 0421c62dcab54ba800eafac232fc730ce70f6d5cc53ff53d371269cf046daeaf451b33e7
+QIUTy = 03d635f55233da3c490a959c6e63a94fcdbe471fbfca19d2c5a3fd12b04db380c3c895cc
+ZIUT = 0645d7f4c5479baff5bc0cba654a3dcfda56c0e9d19f50f9d8d8c6357c09a140effbf223
+
+COUNT = 19
+QCAVSx = 024abb155e49124282ea32e5b544621ae9b513aa0476da3bddb75260d5f5fa2e7b898987
+QCAVSy = 01bdfb0a079a55bcfce1ca8bce3019cbcae6164003384166ebbb0bb733539565adc446f3
+dIUT = 004f197c85432cb42a1777249ae411ef4bb2657ba4bad35ae538635a151c8d6a564f9cca
+QIUTx = 040c88924d5a24a853fae408aea5b3bc827d7315fbb58e6ea1f6a65677dd4c4d304bd75f
+QIUTy = 054b82869ada4433f7208f8570f24f06cb64046e8ac086ac57d3707fc882c6352733dff6
+ZIUT = 028017c2a0240fd746ee72a0bcae1e53e05b7af254298094c381e735523854ea5fdd4f5c
+
+COUNT = 20
+QCAVSx = 07527512bc934938cc5240ce70ef65222db85c13c961c1f31f914205067d64b1a4c85314
+QCAVSy = 02aabdb81ffed2c001acbb4d0b7be539304e32e431e02df8b192ad74ed1b4b0606bfc90b
+dIUT = 014e893483d1d8b7621cf48bd24bc8a1b95bb40a08c16c32874a652b59a2252139428dac
+QIUTx = 01574e17ce26311c40abf3243f4889a2eae74a8341aa7838551056f4395b8f02bdc327be
+QIUTy = 0086e59f985348f3f8d7953800b1d75e141521249c43fe0616913db5d1d4bd5400abce55
+ZIUT = 02603c00998deba52db12814b1f77b2120cbc1dca59009c0d6ea40dcbcabca32c50380d8
+
+COUNT = 21
+QCAVSx = 07ec29da2f304ceba8d5e249eb6054a4e4f59534ee59d25c1dc0e12cc38f768b83daffee
+QCAVSy = 0112c7d4a37fec842271a0a822d37637e6ed55190713001aefe11b06f7e1d34e00fcdecb
+dIUT = 01eb6f6c91a880a5462185c6a700e8637b8f447d09d1b251460fe57f1bf462efddddaec0
+QIUTx = 031b3026104388374cfb7c7b4ef64211a47e20b9561a3bbca53516040b7bda2837309454
+QIUTy = 024f8aeb23a35e1c22225967c7911868c84efdd873dbbccbc763ead67e72a2324aa4c6f2
+ZIUT = 026a719bff31da4b4ebaed7bd043064f9c3930b5774c4a99809332c808aacba4b9e3733a
+
+COUNT = 22
+QCAVSx = 061ef59389edf8f8273a662a4195411e9448bb1b77fb0800be525eb5a6a03b19665719a9
+QCAVSy = 029686f8477fb5c769efb082cb3f1a0c79db55cb264e2112c0e779e7b558f70045816a10
+dIUT = 0147be4e38667e32a6a61ab980ced92e42695925b113c694a7960aedea2e1d571a42d3de
+QIUTx = 06f599f0c149457a32f1a2ffabd4dff916259382912b6402b50cdf5c235fdd1b790e5eaf
+QIUTy = 04ccf1d8a4bfeb77ff3290e65ac601ee5b97fc1b1869a2eb9f0b76277e8066c086776c40
+ZIUT = 048c48c993040619536f45482c494a39b32e75fe69e478ba06e376228b79eb83d3ff9168
+
+COUNT = 23
+QCAVSx = 079d5760ee6ef978518bbce536b031c655a8acf5604497ba43de0beb6877a547c3edd458
+QCAVSy = 0421b3051dd36396d20ffcd7cf34fca022516dd4bffac73fc995ae9ea814ce0e4027f7c6
+dIUT = 01e1900be61adb7e55559d99a0b7d9354456f5151e2fd7b83c005b10b16004ebe876c068
+QIUTx = 042ecc99ff48b53f6619b484af8fa59b234a981c9c3e9107bbd1cdaacce81885d06e02a9
+QIUTy = 0183da0d7fee7f3e70e117f0e8a4a742cad10aefcdc4aab9bb31458237686afb4facf3a9
+ZIUT = 05d85b16bb2a0d32c73d1402838bdfa512d744fa88c74d3d90cf714c2480e03363d5c6ec
+
+COUNT = 24
+QCAVSx = 024784d3d3d5e8021ffed8a2709a9f54d5395d98fa442a655a05dd94262b603596f8bff1
+QCAVSy = 03e8e39e08cce55e1bed2dfe0d2f8c141b06401dba037ecb384744930c8178d146416324
+dIUT = 0077e41ab2d09c34c588abc76d4312602e71f60019027b986e0ded372535c2b6a933a533
+QIUTx = 02923323f170074222d3a6a287adafd3d1fe12715d57b91b1ff476a2b4fcc385de261ecc
+QIUTy = 04cc498d67c6267cc7c4c2d40a56cdc2a6e715edd8b2a9614eeb33d0b6fd162cbb85a714
+ZIUT = 066abb838b5f12b6fc15ceb745600686bc2d5773e53469c2ee920cfba5459a1cab20d153
+
+
+[K-409]
+
+COUNT = 0
+QCAVSx = 0177f736f6116320cafbb5b4dec202d40508182fe011189b81e1f3998f5408607a46bb150ac47bcaaafde47b8a7b72f478bc22d2
+QCAVSy = 01df4ef4b37e0124e55b67f3586de24a88a6c5d98854007d4b0c4b4ccd68d51fafa7638bbe555d60b74def217c6a63c5b4068fb7
+dIUT = 00084b711e3c60822e70fa6828b5abfb0e448888b35b0c8bb09f806616dc1ecf22dd86237d937c1bfde62b75ae655953fc6b2f7e
+QIUTx = 0068a3f8b12e02d10e2f52095526bc4048b8f6ac3a84531772870789938f1aeff813e05e509ea9587d2b7e4aa14344bac3ec46f0
+QIUTy = 00d1ceb40c7d5f3297e2955f0f3eb1422b3e6bbbfbf7eb518b9c17ae8d40feb84aaf36f5e5bd96075b2b4dbe538ac011962ac705
+ZIUT = 0176bc5c4036ce5125493a58dd265f04d190f028366f7799f70aedf29ac67b5b37c37238593377a47944f5b639f43856dbd560ec
+
+COUNT = 1
+QCAVSx = 010c4c68a9f1a62a326556b6d977a79cd9c4476c05b1add4a2cfd3068249a3c3923822428d352c5d74e5d64acceedbdaa6efbe4c
+QCAVSy = 00866ae940dd31b5e6e3f20b3b4d87a6a02c78173c80aa510a6edff852c629e6064df5d7c600fd98e58e8e8c662bb4b96c8ba905
+dIUT = 0065188bb7796e451f44727a1a0674440dd33d258ad2fdc7b98faf64b11e7e8ce5e8c21e799f1ff2fd29d4c94aa158962068a59f
+QIUTx = 0032c5768452f3c1f3bc54879379ad420891267742b37fb096ee7b8c21ceed0041e9470cec3bedcb799e90bdbb31192083ff0344
+QIUTy = 00f9c6122927fb824246d1dc1ce0fde71a6849a82d41065da1d85256a9b1979bf7f286366fc8b324893ebe34e59c046007399414
+ZIUT = 00575d9e7f70a4a1c5c807b6b5d6b7330bdd764db2aa60f3bfe497e6bfe90f038fb4f6acf7ac06efc3d157c3dc907b2ae093c6a2
+
+COUNT = 2
+QCAVSx = 01e4d580d5e9ad81671c6cd662d5569bafe4d75aa4f449aed56bd800619520c9f32c4e230c4d91b1c411f9086d5291ba137014a2
+QCAVSy = 000c8ffb42392ff397bbd467972f3ed251d5a079965da0b1d2a3cc16c31d255dce9886937b2dc941eab0d8be8bbcd15aa6ed96d6
+dIUT = 006cb17c3fc21ab48e5c3717c791118d4761e2c51986bf147942554dc5a18bf9bb6c67bdbba908a1e8ba8e7790f59a397134f683
+QIUTx = 002b890418afc5797c9746a44ca059367ae0663bcf058156860c613ee05e11da3f2f799c70a68fe72fd5dac2469daa18107029de
+QIUTy = 01356904b197bf9e0657f4349d252bbb375c66206fc0d8312599bdbefee8608ec948dce486807baa535ed06adac9c797634711ab
+ZIUT = 00ce87aa5e7700384df59d3f1075d282c1aa511391c42ef609b8de1264eca8f7737df91565c73ee884ea882d47c56d979141f0f2
+
+COUNT = 3
+QCAVSx = 00b7d19354cadcc94708267aed8b23e484e32a03814b026a800f5ba01e9204c43052e4d47c6fcd92329654e0e9015b012f79344a
+QCAVSy = 017995c15796c5ae93e0a207a2707004fbb1a49a0d47fd404f12d57849d8397cd4d2c6d2b4b90f864403d4acd16a32b7ff4877b4
+dIUT = 0011d43bc08da9ce5defc94b4ef90d9324de080347ff4df86645d325603a2dffd28ecaf0775ec53caf5a554eaf8b68487df88654
+QIUTx = 01257b6abd470d294b59ddaedacd545dcf43808af890f576288803342fc61eb396f560af74342e10bb94d224c24d8e5900e5b972
+QIUTy = 01dccad97ecef4387a1cf512b16dd5bc7ab615fbc5087ac19d5fc2762f615b4904ea39343bbb185db64a19f7f70ecf0d557b15e8
+ZIUT = 00691dd6b5177702d6a0b1f8b07f3b018478680de7ee079272ff75659335c96afcea7650caa01f996aa37946b78e14a83e579fb4
+
+COUNT = 4
+QCAVSx = 00f2a11ccd3a53c95ea98f3144fb77d4a684f9a1f423eb81e3a8bfbe22b680f21870f58caeb6946c6b3b873699cffd314063f408
+QCAVSy = 00fdf26eede6cba7248240720906ce076cc4322d18bc7683d2240ba68476ce79022780b2fa54e0f7c76528b77fa631fe5abb5b95
+dIUT = 000d6b259656d526777dedb5246a192f0c05c7270a3b4e64a9d6c877cd06d2962a1ac84ec2d89765f967f6044f2dfa56903107f3
+QIUTx = 0193afa13bd1e081cee5df1286fe44a293b7d1b10c290a5f2ae7be2d02736009a26d83aaaa9017a8c8bf60efa15fcead07767d48
+QIUTy = 01d02fd66a7806c4c8445fa615254ff32bb9c1d85a3904f939c1061e250d3eb6413130a2a5570994795310e96dc3aff3b8218ad3
+ZIUT = 0136f5c04cf9a56db24ad99bd286feb800aea38d44f819be1c2a9dba15c635c4e122893570233a4c5754a41499eafa39a35aa57e
+
+COUNT = 5
+QCAVSx = 0117449fbea6b2d5f4e8e4d39a7228424cf06f456bf3ae39bc1fb2a99e4183b716e194fc507465664d009d5bcee3a426ba932c10
+QCAVSy = 01146d32b70f09e65fcf69eb9ae66162d10bd04369de8e8187fa9c3d1b5dda26f10b469cd4925ca37e0994415757e6895e588145
+dIUT = 004bf7351b195875d01f6306ca127db8a1a5f597719c0d10e1d68f5d4855bf07605790691fcd0d8b5db137d3fc2679de75a06781
+QIUTx = 01d386645aaa48e2fd0950e6a9ace9dff62c8f5e94cdba45bd73c6be6bf7b763a2c9a807846312da3ab821c049ac0861f82337f0
+QIUTy = 002a6436ef8a1261aecc38c821da774a391fdcc7750c9437d9dfe64c823350813999f0fd4f07f1d6d98074098612bc52044249d4
+ZIUT = 004f684f9d559d16485f0023bf012006265ed81f06fbc1441334a559e5500a3f77603565013694023e0d8f44fd12dcf69eb8d654
+
+COUNT = 6
+QCAVSx = 0119980f11149dee5e2c2d00561d3c26a42a5a44e874765ddda4d818ea704edbba23abed5e08be92d655d79e55c5bc54787b4dd4
+QCAVSy = 01366b3dda3e9879c4481ddc367e51c1c0541945964636d5021687c285c47d40e79ff7f0bb56a93ac560be8dcb970f58b23b10a7
+dIUT = 0069da659010345c6900fdecb31df9babedbe4253398290b34012fb134bc59147572e62a60f5cacced87b0f8d1ff7c049dfe9692
+QIUTx = 0038687019f7c219ddd9567b20f5ea1e8a50451dd40bf5b65f7b2e133de6f36e4a3f8fa2f977efe920f845d176c8a57023cc55c2
+QIUTy = 0149397fbc42bacf85c59e04535df1d52715761eea997d4ff87204866cdc3d4a54c2425ad214a7a0dd592f4a991ab768c8f404be
+ZIUT = 00137894f637460a63576824536944cddb42dfe63169c84040a0345ad7516ec4f1ad00bb4de20ea6ea43824b9b0f74dfa6881cfc
+
+COUNT = 7
+QCAVSx = 01fa39b5d3375d43247ac9500061ebff7a0c15b8c5dfe9c751784386c981860de6e1b9584da0f42119417f32338290910a9a259e
+QCAVSy = 002bdecd502ba64a6f21d08fa4250389d4270324456e9441657495c72ad760fb348325f89b7a5404a2c21c2aa07711bcf5f30412
+dIUT = 0006dfdab3ca1b2a2821cefdb5872bb95f023161ae4e2d549d0fb1f382563413584491657db101c323514832c363f636a9e69e83
+QIUTx = 003e9a9b5f282066e233870dcb00c4aed2d73a331f79d49c8d5c2d93908b0ef5e72b748814d1b8840642d75b7a9a55301b1e7c82
+QIUTy = 01085f57691e04afac6e884e2fdbd8df802f4d435bce611231ab3274761ead5e2e6a344a53f33c0fa156e3132062f72bcda3fc0c
+ZIUT = 00f03b0b43a351311689eb1d3fc457013f294a7d02ad850c72e4ff9b64ce68a47beb49bc5bcbdc828534f8c8a5e13de5fe522eb0
+
+COUNT = 8
+QCAVSx = 01b255d5bb75d25970301de9e0e3959a12205d511f8e64f042a01c950db471b1d6d5847f75669eeb0bf187f1559db3b22aeec096
+QCAVSy = 017e590cfa855349136198c2ddd8a5210882473c9dd591c02e202ca0404bbc9f6391d73ae011dac9965155d2650139fe2e54ec67
+dIUT = 0029b2fcb308596a975c5b4cd1e75267c5424e00774114ec2051a571b299766189fad24e92f96e3d527736ea480367bdbdd0530e
+QIUTx = 014c757399be201e08afd8b4a671e7d3b6d7f8844498ab592e1bf69315347ce82dbd785d45922660d4d0d27fa2b0ac62e707fcec
+QIUTy = 0098f0773d3efe9c290a992eca05875d3463f0736b2dfef4affd9ff00f96ade53399917dea074c798fc535738f0c5689a2447f86
+ZIUT = 018f55b81f15f862aed042f37433050ac61718c9939d432b2a20e12d647f99753b8dd5127cf8963247fe7e1d5ade1442229bc646
+
+COUNT = 9
+QCAVSx = 00ecf7064f528fadae380cb382984811047a0d7dd9a8de8e76f8178aa60069e77a948acfa74d2c77a76851659a98197054da8d44
+QCAVSy = 00b98e13497f776072711c42c18dbfc8eb8c8523ff633af988a1f242ed3c3c565d18cf224f8751f2942e360ba16e0f5830952919
+dIUT = 001b98015c0202ea16417971a37304250839bd6a6e5d83497f7f93f0f7472a21fce4be5be776e90959dbc41a0e85ed225837e8d5
+QIUTx = 01fec09f94571614e7cd8e958ebcd7a2fcd8c248d408cdba359630545c31383922774d3b24e20591d8b41e954e16654fe85cbaca
+QIUTy = 0031e0eb1dd1ce467a8b78d10d25b9de92cfdc2773831e6e28a152d02ae2a5a510994cc010462254441ea41121c0677fb4178bda
+ZIUT = 002b560d1949297dc7e1bbe8ce49a595762924afcf0271e9c493c18ad5cbfcea5f3900c7b793ae5dd44f48884b0bc3b52c66e05a
+
+COUNT = 10
+QCAVSx = 004e05c34dac44e6e1b08cdfae6357c20db7a544dc253dff1c23d4dba871b96781b6a61638d73865dafe0a9443c3ec328857d23e
+QCAVSy = 01226c427778bb224624cd215493d7a4f32a4f141979236409505d8cf58d81dfd3c793e59543a780314f3cd8ee17664dc2e4639e
+dIUT = 00473bcecb137711e5e89763a40f77dbe2ea8c2509d209064e39cf905afaa901085f8e795c9b8017c9a5d0a1b96812c124a3ffbf
+QIUTx = 01c8e9adc4816e6606ffff5e1a7d48a7854c35aaf055d31833f0cabde8bbc4d2458e3cd3c82a4af80745f595b3ba12f8b5c0ce90
+QIUTy = 00fc43f193b5589aee62985735e3628374dd45a86a61baaf78c21fa6e787856ea6b8b88316540571825865ce6b8578add5faa69f
+ZIUT = 000b43cb539bb4bb42f195ffdbcdeb482b69301c0155a840cd381f55c465a8e57ec51d6555871537b56bf84a1544cae2b2b8eb38
+
+COUNT = 11
+QCAVSx = 016f6960fd2357d2f70b5f778be5e0aa71556b9d2f4cceb14f7812da858ab872818b4610d41a8f66200b4343422227d9fddf712e
+QCAVSy = 00aaf592a725e7738388896b9be9f78c1c3d6972b9f99034d02cc0f9776a9f6c2f9b7d501f75be18599b088c4c5881c66146e5b9
+dIUT = 0020dddd67134a418378baa0ddfc9111c0a2ed492b289569dd0061bf1226d235bdaa5203d3efa2bd0141d2ace27c3ae8e6daf11f
+QIUTx = 0167d577b2a43cc1a7d88a6be883c28dbf48c3e1fbf21ad83e7a7e3d753fb0b6d3f80cd1376fd98be260f494757cdc063256d5b2
+QIUTy = 015ed7003b7d2bd5e0359303660add090049039cf7df396989ea18c702f704c45cf6fde7ad072d31253d1d5295e9c5d1d5c62c3b
+ZIUT = 0113dd2cf8732ceb8a893e149f13d52026e5d829322d0f1233a624fd6b74d56e7e6374d70942a25152ce5073831660333fb3e070
+
+COUNT = 12
+QCAVSx = 00f549c47dc8e92fecd38b5750895880e449f1e31abe0bb1eacc84298f836108e5a308ccb9578dcbd4be6177752eb231e78f011c
+QCAVSy = 0093663ec3fcb54d676897bfc95db5e54ad6eea1ec7b46ca4bf3d2535839f101cb3e6d5f11b6a36bf40363c31c9f88137862674f
+dIUT = 00607a5a6532177b52f23492717dd0a7b2af98e04884f77075e4604410c5044a08461ecf37c4efa3edc2cb667c84b86415936b70
+QIUTx = 000a5677ac6c00d2646054dbebfc536db0a9b351a2408a73e083ad62d182fb87cb80322c539553ecdbc213ce84c66ddf8dc1d234
+QIUTy = 01327a0a3769240fda45f94bb07361c74aa8c8d119414a7b5666e25a3ab6881975396325a77f541a1ba268012a82c5110d2a49e2
+ZIUT = 00c8e62ac25c11e86b98642e4ec7adde9d9436f9337369fb065abc9ea784f90b8b8bebae35da92185486191dd9f49370b1148ce6
+
+COUNT = 13
+QCAVSx = 00411e5d4c96e35de9b541da5fac691336462c882d8e8ce4d6eb7121417e70950c4d9502f64565d5a6cfa735c90eef83c7b861e2
+QCAVSy = 0096b904e37ca1c2db59a54615627e1c3356160fe175284aadc3b2fa06ba0b30aaa07c84e64e48652e5feb303595066e0f8468f7
+dIUT = 0034da9a453711f04a0b1ea1b9af701e0dc3a55cdd585e43e3ecf41e934ecaf880ff1614dce5cc992a69addfc408dae1b09b8d05
+QIUTx = 01f7bff435547a89516d017d1bdac4cda36041a0d3dfd03258562b2e28f40cd64f6ae2b70457773f9675cffc40c021e4702b08d6
+QIUTy = 0013c59a72f0c83f5bb90a0bfee798952fb91ee329c98c4b5914f445ae7c8483767052b5f529974621545ddcd6377f5e387d573c
+ZIUT = 012505746f1a40ef75f950595211ce04f87f1daffffdf8c12600a9e2994c8c1d8b19c0e0559adf9a94762cb983569de6d0d8baca
+
+COUNT = 14
+QCAVSx = 000fa8243f000a3398808a1f88ffc5a342968fee5c7b26a9e1ffa26efa885e74e1c562027d95db08cc15bd25a3fc11ab4dc13ca2
+QCAVSy = 00fed687c7197ff1aeb980e72a3a7c318142052c2389b0866db3b87e5c8025e79bb4f4f996fa6352ab9cb20172ef78d6ffca906f
+dIUT = 003141afbba8b4d9f0cbe8297f365873196739465e3e20a89af9fdf8b01d195aa1052e6176b5fad856136b6b320eebfc08c1cd01
+QIUTx = 01805ffc576e8a45f06297b2335d03abc8adfd15ad37e76d80d3b4180d5f72efc90f3f2b036acd817f40fd49064aa25ea383c82e
+QIUTy = 01f22da6b50ac5628943f05b141493cacc0f02bcdf3bffdb43582343b68615761a180bd7d1ab1ddc15f5374a8f665d13b4b91272
+ZIUT = 019a71ab576546e2351aa92b6075e8229813e6a2cb3647147b192b4597f1217223e7197d846c0d65ea0d4aa4c503bd000ba312ba
+
+COUNT = 15
+QCAVSx = 00be7d58043263ab2f42252d41b582d862c2b243ce18576081bd6edd2f63f0164f365cae67268d227f3944677e1c146af864b8ae
+QCAVSy = 01a4bcbc6416d86597a148ca4d610ee656a00026ce6047bd9fbd40d89530196a4693ae595d69956503b9d2ab4aabe7c958a14c69
+dIUT = 004e517796cac9d7c75316eb5e68963fe6324781fab986e940200e711ddbf9882d99a620a976352e2496748cfb61dccbf6d659cc
+QIUTx = 0056a452fb1d558079c3e91bf22f86884ca89788806fe7d6d6ca40b5485079d77dc43e466a71259792c65ff6ab7204066c0e67a8
+QIUTy = 01f29b723d9f7d4de6ccc2f9708079c5d30ae5d960e62a7c4f6dc98bfc95b4f531f197c39486705432594203c25147156dfd5b5c
+ZIUT = 014f4b7ea93c9dd846d2228c2b6a8dfe616057232b7af845a570cb6cacf9feef2d8ef4fafb285b38e63cce0a09b4d82dbe43a390
+
+COUNT = 16
+QCAVSx = 011fea58d9e36cf8ed4ef3b42f77ccea93bf542ac92141dc2c094061985f3df786d192a57bee072550b302583f0f9428301b1b76
+QCAVSy = 01b3dcc1b8a3545264427386329eb81fe992654040694781c0d8b27c1e49442b99bab93ef9666fea14d4843ee4bc5b045ac50c11
+dIUT = 001c80b64d51e8025699e7be2c4b983cfa4b7e91b112e2eca5f9d0cb7e3d4f85aff7b33a921eaa124cb7002eab62973d65e16bc9
+QIUTx = 01fd0e4eafb26c08c9f8e747d4991f468c76b4864166e37642b583db285a4bc4c33979917d9129a91cb0a75c1aee7cd4fbab73ce
+QIUTy = 00468efabcf448fcce821f3de81e994d79a7d99ea989ac81fa135f7ac88b154c767909c681f7e48c00b2e66bbaeb8f8688f44672
+ZIUT = 001fe2ed30ad4143c5eeb0b7622e6aa49e4e4d51c1ddc467b3fc54215dae931be0b6b6443e716895acb6570cdc21fcbdae46e5d6
+
+COUNT = 17
+QCAVSx = 00ca809340bd13354b6071d073e65b9b0d2bac82e22abfcac7e70afd9d224852f0e212976e5ec823eb8950e02bc759ecf56f79a8
+QCAVSy = 0031281e8976401aab58fa8eaf8636feb013170bcab5781be0a28d27339e9470e166c7f685f2ea9143310dca1b3ab8e1c8e60592
+dIUT = 0043c96c32cf648b036112421adbaa925cd54175abad39e5681bfc9eb4b1b649aec1c876ec1ec4610f1b3b06514a48e6ea7a4a25
+QIUTx = 00de181e81b9e7776d474694a2d124d0b876d9548f20ee3386304945d9131f90457d9b938df098b035bedaaf80ed6d979404fc70
+QIUTy = 0181a3516dbea9da97d6ececdb10f96d54469d273ab366e89a40fdcedcf1bda837d5c14bd10c0b6a2a9c8a47810125c764dd35ef
+ZIUT = 01610efb48fd22261921f7484ed6382fceb6bdf28f3bc2340a175b7971b93ed5ff357ed55e5307bbf42e40a5b3fabdaed0ce19a2
+
+COUNT = 18
+QCAVSx = 0074795b0a9ca070491fb54a3bc249981defbec037e4040f76656428b1538b978503f81f80ad9ef97c5e127ba51ec040584b9a20
+QCAVSy = 003ece27f3daefe7bdffdfa727b2af95af8591af946cddfe37e85643b8d179ca8b9529106f9c5f3a95a8819225f9d7d4a730fd22
+dIUT = 003636854b8ee0254bb2d0ebedc720b66b20129a21f1a4fe39118cfdd4d137dbe5e570ebe2c48a7f9ac21cff3e5adf47434697db
+QIUTx = 01efc0cd1a86ce7544f25f44e63a0913c11fd6b08bc09ad8cd82f3af7e32a7a7ecacd56e25526589313879d4a7fd4382d4114e4a
+QIUTy = 005a34ef7403599c2f83f3e83299524893f2418ff95d6c2fdc0a3db970e62fddcf4cda182aa78b54fd8c2e818fb1ee2dd2776763
+ZIUT = 008d990982aac8d5371b867de21e09064fef30e73321337dc24f19ad5ddb6c4ad217136b7c61e360a73fa7571d526c8f514a06d4
+
+COUNT = 19
+QCAVSx = 011eb64ed4249e1195b2d1307a35a514d66d29ba6f9044f9c02b4b2d3cb3e3d4c0cdc5489cddfb96226c9ce3e36fb8ff2eef208c
+QCAVSy = 0099880b0d0d43c5c579ad77ddae68f2c917f4b062ea8d777b9cdf465cbb59107e70992714e8cbfac76296d5ede99c48d38a8973
+dIUT = 004998a062a32170bb358954d2c2496da886200827fa13566836ae26e38d51926ca3d202589f7bfa27ea22d399973db6f9fde9f4
+QIUTx = 00f71590b04290b5f3cd9ba0e394a3be5a1514f45e53497f6cdedbf839728e0288135d769e4b28932c875823fe256e891997c476
+QIUTy = 009d16ba726a5a9e09103bc94a09d8079ac8edf23410c8469f79f55f3355cfb3ad703624ec6d75eceae3881da20903c71de1f5ac
+ZIUT = 0155dc98729c8c1bc65eb8a3ec09135f46bfa313bf56aa3169e312db8991abda338f8ac7a75bce42884068efb7e6e625939d2b88
+
+COUNT = 20
+QCAVSx = 00a15e96a776eadb8f8a0b61360335cb5017d7d97116489341e995157f1adf178e5628bad3e830bee54433119164886db5c34654
+QCAVSy = 00551ca5605e4ae0534534a0ab343d039a3ba7a1cce832c4d65e26bae7ab8e5f9c74b3d421a528e559778ab27b59aae1a916d4eb
+dIUT = 005a3f805fe3c3266feb3e0bb7da6761bb117618bc57af357b53f199e6e4cbc1281975321403ea6de618ec32e86b8ca1e10d7c43
+QIUTx = 01ae460e1248504d33d67ed750f1d618e53728d55e390dfc18d94b56dbb3d3c0bdc96c92ca1eca9f44fb8a58cf36dcfcc0588cbe
+QIUTy = 00f7011fc321ef6258dcfc1fdc2c0a4e54c86ec939bc9ceca6c291750c1ff540b34a418793842a2c5cab6061dbbe9b5be3fa6115
+ZIUT = 0109e85c684d027a625ec5e6df952e2f20a14ed5b092d1b1b38435251303844d230fffc53d84b923555e1e1cbebe20b5d68c3bc6
+
+COUNT = 21
+QCAVSx = 016427e72bc57d26a910a6722eac2c78fba8abffccbc11a9f8377bfe213ed9ad64bde2ae8687f8ff1dfdb29b5dcecd02269828c2
+QCAVSy = 00ad4f9abc21da0d31f19659cd3b0c185581436ac08b15c0b48a7ac39eed03e0ee97e164cfaa5abc774412cbfff94a9ea2a9636a
+dIUT = 0055901e9b6586b7f3372660ebcfe90249900c902d7c632a8d17fae21d3fde3037325b5775eac5a174a1ee2b3ff2bc5ce69d8cc1
+QIUTx = 00ba952233531b6a6c7ade6f338d24fc65777b5d305297e66d32cb1bc506c5bca2287d3acd33fe19653d6c88a06eca3712ce9caa
+QIUTy = 00716beb14f02233630f34603e309bf6e2572f0b791dfa4c582af6a37abcdd64e8d785a95ddff59bbc6fbe1b7fc735725efcf0ba
+ZIUT = 01ae814e02c4684c21dd7e58a65ec51ec68c37e59e299ce65608186c0acce08e41c8320b1941a611fe66b1921b558d7f402d0eb0
+
+COUNT = 22
+QCAVSx = 012e89dccdf975851accf0294cf4bde1259c907a6d3acef69f1939b558c4d211522e4eaac613e3ac8491c93deb6d344a9f87acbe
+QCAVSy = 01a52608ead09d2db123a0dc782ab20ddb793d5bb70ac95c58e62146beb62bb668fd57f92038e4585cde1f91ee8c52526afeb1b5
+dIUT = 00044ae43bd247e75afa7bd8dc28e75bdb9ddd99df56668c831454dc28f3e9a44ecfd47ba8420a286f1ef372fd29b365df9b82f1
+QIUTx = 00202694f378d70965d42828ad5f37137bf8b63cec2c0d158e5ba94cab1f8e61e5a300986ba349b3adf3efc05e65670af88cd3d6
+QIUTy = 00baf0da4aedb972f88a215dfbff64e4290fadc25da3f0d83f35e65bc4177d3025d71d8eeb9c41470f3c719e00ef1fb7552e6a89
+ZIUT = 0140e7db3f6415d884822ccc7316a329dfed177b76c0117abd722feca889bee4e14e65d26c6cc935c0e94205f05fc1a7abfb0348
+
+COUNT = 23
+QCAVSx = 00aba93ae1d1552880b31f503fc4be9f91d10247f14c816015ffb2bad29ab8180e7b50a27144e01c21e63c3dafcd251308bac768
+QCAVSy = 00e4ab66e514bd02abeae1c7123788a692584ddb4a909a217fb35de66588233dadef7036ff9d9f24eba3772e2fa3037bbae63cfe
+dIUT = 0056d73730753ada70fd801c749c2f1f1a61ef5bd6ecb796a9e15efe9bbe6158f669542787350f4d643bda6f3e8c6423b817b530
+QIUTx = 0025a06b71a0ae252f2f905221983ebfce21ad96121a5c0dcc5ef0d0fec301ec77ef4b915818fedcda7f3fd733c7f9e529079cb6
+QIUTy = 00026890d5303b619c7f81f60fb82b26b0b98d8f24c45cab41a44eeb3a3a312944e889b4035e04360b305043e30d0cb9041a89de
+ZIUT = 002ec4deac3e83d60ad39969f2f93b49f31875831ecd51ea5c37ca48de081c0c8cc660edc53a222f3043447f9cb752763be7494a
+
+COUNT = 24
+QCAVSx = 00aa4eb898443cce3ed2c072d858775ac221c24e33eca6f31579663544bb33a4a068a86d13f167b65304c5f7f25f895f65b2f428
+QCAVSy = 0083cded30211b66f1adf17318b6de50d7724c0584995e068b724703ae08ed71a32b334987a7b31d6c2637152917327d37accd33
+dIUT = 0062b026d49720660cf6a4f569be98dfa108c8eba08234ae9a87f3c88b6c65934b996815322a16f9aabed13317bf7725bea5808e
+QIUTx = 000f52925394cb52bc330e06390c0c0a2e10ed9797149fbcc88d80fbcaec173e24a05daef98401d5e47f3b765bedbb8246312856
+QIUTy = 013d99c1710805d5fc7db7259ac9e134b411d00d73fb0762e3d211cdc56bf7f714512d04a630c8732551ee734287476cf511e836
+ZIUT = 01c9cc05d19f96c4d233039cfbc43ab68d657bb507f46a353091fe98fc0f422a8e7593c195d326977a2be6bbd2cb44eb1fe81650
+
+
+[K-571]
+
+COUNT = 0
+QCAVSx = 03106a5c1d923a0990ea8c6008c36c366b53e5622b98464044741fbc7840284db8bbf602866c30ccbf5f9b7e59cc1d9bfcc5b970fa624da9b15f6cb336f5dda7e6b9924d5dce4543
+QCAVSy = 005c5c7bbd5a789ac4c6283deb0d0d37c4852baa57d6bc2b0ac6337feb09704c44d1b385b70cc394fa235d83e6e7111787e57d0902c0cb132a190a6e62f398511c0c2c4cd50d4570
+dIUT = 0173cd1631e18ece01b73b3572ffaa7495c4bc81f4078ae50d69cb1e338acf13469117112921166ddf2d29f3a9f8e10c67e88c9a99203a834565be76ac59126436739a6afa029cc5
+QIUTx = 03fbfbbcfba609157f68a23126d805f7c75efb19befb595e3a975e08ff46bd34c8b87b9645c0e86ea0ad915465d5c856c69bb9b722b0d17bf97ad95c4602dea17c6b512054cb22d8
+QIUTy = 071c16df71e1b71b4bd3d9938827d3959093b9db1ff86bed73944a42dcb67cc33102e28c1d0e9804a6450656f4bf33ad72ecf7bb83bd282cde4bc15d4e48064aa8ad2f02979f5f3f
+ZIUT = 003198a6b5d6cce847e24348a6a6ceff7a89ed3794d7acedc4e858c80ad04a74dbc02c7038e05ab26b2a299ec92ee0d2c7e66a81872a5157fbc5d4d37ad598d6ddee995ed28a2d74
+
+COUNT = 1
+QCAVSx = 0211223c4b729b206be01f8085a997e1dde5cdb27c048925a27369bcca6a3e2fbfc65637f1eceb133be749679a17b1ce58821f46bd1844a89cf0042c8043cb105e01a3fc948d2663
+QCAVSy = 02b1ec2e6e2c2375b464b0a502c5053b5b348bd08178c72c603105d0468196a4695dc267d6e109f1b1274453b6eff14ddf3783969e8825648debc216afff9258f644d77ecd9911cf
+dIUT = 00937edb3aa29563d2248591c9fb448985095f913a7458315593cfce87e68fb0f1a525b7310a101176e34d45c1004538954e2044543817cab0d563df6cb0d5e8617bbba150e755e1
+QIUTx = 02363cc5624b06df1956befa597d4c757cc2b1001a3e1544d24408290f694877455ba92e56088462f0ffacbd393cf835b56b7046a15d4b724dc6c3573cb156c0df298aa8b1255cb8
+QIUTy = 0409f773b98d5edc2734d835953281b82ac0e15d902d887a7c6ba75629a37671b101d18ddfdc4193d98b18551414c49173004530f7976d27c273a73ddbb898fcb5fade9c0bb7883f
+ZIUT = 00577147459262e5ad42f222827f20ed574b2118924205bcdbd339ce20cfb085d072fd70f4ca1f5768fafaeb5710f7ccbea4fc2ae5377b0cff20a889a2201739139bf788a9bf2d7d
+
+COUNT = 2
+QCAVSx = 004d48be599ebb1ed602472d7a87f4cd2080f44ec28855fecc3a9cdde25551787abd27cc1da7e77817e94c9c0289c005a0e36e3bcfb0d381e8cc9684b6f7dd05177f16f63f8721ca
+QCAVSy = 062cf71af0a2f8e35c4d7f9312bd34a846a380f63f0dc7294c18877103357e20d1f0eeff312a993deb2a1ecfc80aea06a5b71e4f8b9cefaebcd32626919064f88af416d86e3e7af3
+dIUT = 0034099b0773f021ee0d3dd185c704b5158a94328daa09768fad5804df1da2fc067190cf1028c30237bf2a48da13abae35a25c3e6387d3993f9b568305b8bf0818ff527dd8205df4
+QIUTx = 0674dcc4f755c44fdabdc078488107bb64a460ba932c7e185484ccd27fa870031107e9955204b0630b9b4d3608d9aa931d7c766cc2e45878eb6d8cd96bdf711b2fe8b47b8d233ed5
+QIUTy = 05d96be6b7e2ba74c8032af19ca2f2b39d2fd4e8c89b156b6b25c2ea4f71f74a02ca7da2a463acd7605d5350fd16a9c9052534e7e81d648e4060a2b01c459c260cb6567da1fc5314
+ZIUT = 014662b261d0bc2168642bfa4f80c4b3fe8176f604ad3703f443ec7aaa3dcf3c5465b869a8fcea60b8f55ce7118806c5d28a04848bd961db0061209b59bc02979acce9324d7c0c31
+
+COUNT = 3
+QCAVSx = 06bf252e62c9969171a9717671da0f7032e9520a497ec831f4dc776ac87e0194af99546c41d08048ea06da9235cf1369c3ea53e6b8cbb7a7fd4296354548d44edf463f77ad341b02
+QCAVSy = 0294d5f7e736dcd8990198e4e0f0b398b8ac6a87764af601596234a2e162c9c667e47eb3d987efbaeb03b5e3699a38ef953c74fb28fd7d8a4ec5a36319ccc44a19aa88201ddacbf8
+dIUT = 001547438df76fcb5e2ae6925845bbfb03b4fbe8255616ec7fbd97b48f112692219f4f1275e6d2453d5bcf3bac4106f0161b8119f487d88b5f8c8e08b3aa17b83fe01102d76392d3
+QIUTx = 0427e2dc11ee5223bd9c3d9418c79114682f91dda06e7d88c339a7e56e0dfb636b6e63fde8a381146ecb705ca202d2b73df408451763c5166066a97ff4e4f32f0b4cc942344b0b2d
+QIUTy = 0760c8a388e2eea27ef6838c7d45052e38cbee2096cbe89f774774134076658df90c62c7dc0e3fde995d7a99090993009ab6c535677dbdb376f183eb5092d2cb6a8837b6bea35dcd
+ZIUT = 051ec4db0622b7b1c798366453c70f959376ea3942aed2e931ff62a4019eb12ba5ff119214c8bfd8bdb66e62b562400f2d3d48a84b1b3baad3667f735ad4d0f183bdb91aaedcf1f1
+
+COUNT = 4
+QCAVSx = 05701e63b01c16c4eb19938265ba134cac7316278e2f1eb40a04775448bded97e7a37d01fed8a4e0b43ff4dba21a47759ccd45bf9671dd22eec65b4aff8b8db89dfe3e490c0ac9d6
+QCAVSy = 02dd97b6415aee2b01cfeb3cd2a03578abfed9ca87be9a26d899595a87bcbd972748fa6a0be4eb557e69c6d28e2bba1580dc74e2751d7ccd918c46b4be6875a4e4c290d959c23c12
+dIUT = 00c7b4252ca9b192c5feaa9a210fd84e2e48320271f10f67ea9eb30b0de8086d59dae04259fd12b086d890e22d45d27d7c8455dcf7ada796e35e3a3138342cc736bc3ed3781c4119
+QIUTx = 0325623838e8b18d81b68060734254eb02b8ebb2264556fc9850c36d3035449aa764f351dbaf7bbca9b9adb11f27cc88a1ac6fb71aa10ef8d0d09392b0ca7eaa7a5cc14078cc18bb
+QIUTy = 0098fc7656d9de3a51923dba290ecbe413ef8d951f24e9248cb552309f97127fb9429ecf6dd07b6de894e16ab60e33b4ee73024ccbe866de5e17f1b478dc7727a1bb42371820b12d
+ZIUT = 05b355eb5c47d8027b6c5301d2463b99c636db207792e2975ab1a53c1cbb131280288432a79a3b47271d6a2bd777298baf8a675f66be9dc72c3588d299df8b52e7840322b43c2071
+
+COUNT = 5
+QCAVSx = 032fa1816fd2317c16b5b19a25d46fa5e45ab15ee9f2b1d1274c2a06023994db309fad56f60b3ce57f32dfc7d045a84b7d805232be34c7e759514c30a25207ba800215b2060f04c2
+QCAVSy = 041469593d5748072b9ac8fde023095289bcdf65ab1bfc0856f83e9ae06c897303bd16f5e45823d65fec8310fd4332b65cff47a799af4f7c8638e2d7f85948c43f10534c980ccb62
+dIUT = 0066cc51980d3851b488c2c181496c83505fb957b1ec4a84df1e105e30d002bcb978b6d0bdc3b7644ed3dfbc33ca6bfe4362cd8cc541740b0de8cf2edcce4592e34fa11ac26ec922
+QIUTx = 0771fa29e5930d6dfd36d3a9e7159675fd23d0b5e1fd9ae6454aca9e8127f1e7e3f5322b5c16b095573b3266d08f0dc33043ffb3d7b08e4e052ed3f0349a329025ea6ff3e1668547
+QIUTy = 022f994f9974692dbb6e58cc7ae5f90652ee231e0a3961569dc646d114522a3777410c1b352d668079f80010bb540e4c28408665810fe61fd60e70d30c688eab8fde04364dee5c9b
+ZIUT = 052bd78bf1326c6d91840a351d4874d36b147139882356c595b8607f9998773092a99adf70adeed19e122d4d2fec16285f000161145135d96355cba039a96335e7716724c249f88b
+
+COUNT = 6
+QCAVSx = 03e63dd4c98c151361c9902b763ae32f2d6de75953fa3d6838c1d613d448fca73bf302d30212a96d32b9549e17c5cf395c565191f6a22dac4da7c1e1a9d9bae86ebfb72c82ea199a
+QCAVSy = 041609ab9c12c15e5127005ebeff6fd1f73b6912ed070af87f5ffc21df903dde1d715582dd2f699040200045cdba9ecd758ac4d084d4c8d78219f6fad94d341ad77daccdabb54a2b
+dIUT = 01990d15fa2cc90e783d432201784bab56b6d29d1f2665a76cd013eb96f6300ed8f762b78a5596ac7e8c1e76167f107c20443b1ac732101e9f0aca12551a536d152df2b3db0f20de
+QIUTx = 076c3d72f0e715f2491bc9d99278a8ef3c390b3a96e9997b37e5b7bd8a5f07af68f8e0ee3892b63ff112a73a849f0e84a782d4fb426eb5f2f15adacce9e5476a6daccf3a7fa9a291
+QIUTy = 0540a763823599e0c86027bacc8cbb30e3a2467276fc4f7e5fd4ed385dfc6f883fed7bca69df21a0668b55ebd292da8fd6356a3ec5cd1c762c01473aa067004cacedad564fe06910
+ZIUT = 0226c28e5a6bc735935f9df2c1b02d096d4dee41ffb95a67905aab8de1b2d8c66e2bb471293091438d3f05df7e48003e58a958b72f839f7f2e2c54287fa3cadcd41a2542ae4ec03a
+
+COUNT = 7
+QCAVSx = 06f91a7ce11ba9bf2de1fe070f9dc843bb717c306d9c63b5078d2a11323f20c9c0d7b7743d311ddacdcf5dd00f498b199672c78ae25e6864d62bdc16935d6fb8dad2082d3676ebf3
+QCAVSy = 04593c5bad12c3d655c6611c7ca9711f9e32a28fee54b3b8243962a3c55d41f2c185e4c58b7a2998e978021b95b724635daccbd7fc30d20720797bc291362c55b024acb2bdcf3d59
+dIUT = 002b0937e731f59ddddf0e94fba92bb1a6ceb819e7659bcf6edd4b4af49c2ef25c5b6039256f928363e18404b1653d3998054c2c25a3f83a0c5548a139e3e6a180756746cd34ee29
+QIUTx = 0270c4c00de2709010c7cf047a0ce69b87f41dca48d35b71fba4b258886d73ae42defb8653951c1bd3eb4ce0e6175a946c67afa67753475c51fd525b0fd9f5a26dafca319faa5e15
+QIUTy = 06680bbdc281505f5d3fbe29744a999e07ff612576993f6f8be3113db1ee6cf23799867bbc80a140376a9b6327451f98bf8fd1db46f9d9cc05e88704d5712d4567e1df40d39e99ef
+ZIUT = 051a3deb052d3e99bb6ab6c6b284db2c998e9bee543e02e57f1b13fe9fafbfe53a89658c58eb947dbd178aea2f6cb28e305c9867bd65bb26f71793f90c984ca11113e1a8dbc8f7d1
+
+COUNT = 8
+QCAVSx = 05ab2a7f10ac89f98c409580abc11ad90c93360e6ab282920b59d316ca9f2b23aeb50876cb1bcbe8ee9ae6b5533fdcd11ad4f86d8918d66389da87c98bf1d6323bd0947d8099083b
+QCAVSy = 0689e1947276791dcb9527183e32a08072b7e03dcad175fe3cfd7beefc848dcef483380c6005411385c7027c9a52b60a6e537a875380d25bc47c7bf2364dd68a66f21d0f57866a42
+dIUT = 01cd41cff762402a834e7e0ab908fc54940f697b50022a4dfed8cf0b13d7e0ee523fbf33ee9693895f918d94e15b084655d61b2294ca51c4123fe5e0868e9d0d1cac2138f0577a17
+QIUTx = 0610797bbc6d9131180ae54ab66e6780849258369741470e076cf05e0785bb4e7900b908d38d8dab3b9427b952add20efb758cff80aeb641c4dde1eeda5509f386d5658559609cef
+QIUTy = 068d2515f425a0e3037547342f1b6ff931763f5052e536ea4f78377b5c941459c8c2201482afcf3cda7390e9e5d319451864ca03683541ab2cd77a9d88fd7a610ca845ee5cd3d498
+ZIUT = 00697c751ddbca7034fb4d3fc1b2618daf78cdae464e8332d1215020c8f896f4864c7a6f2c61a363f730f58fd3bdb4f78a90b40aeb83b4fbc1d8d37cf6a27a6f722c68a82979fa16
+
+COUNT = 9
+QCAVSx = 0034091c3ac6fc5299df18f162eaf7a207fc1543aa498e7272e15a92772f57772229069456e219c9c2872bd53783b0fb1345f5e84674c4344129a314146b7030fc75197a20c588aa
+QCAVSy = 049e3a3f5ee65875e1401089970638b807df97568a5995c8fe2f502473b83f58c556c5f214ed6f03ef8ece01401a2134bc041f66922fcc4e3938e0c6d302eb42200678a97139f291
+dIUT = 019dff0d72a8b042c4e92f1dae7407bf4a106cda564db7508e5a76b03130c91d5e5cbcf2f578c2e9dee43849f911d7773d4c267e282c277b731f88a6ef0eeddd520f57e743ebf965
+QIUTx = 05bb60a5fe8e3b173cf8413eaf413a3286a5a7aa378f21446c61057696012746d02d10a831f785c9c96561ffc6ad4f9ecdf4937fffd8e698408e660fe896f7ed44af6b3b42ea849f
+QIUTy = 037e3a35e48aa66bd851c59f851d4a1ff334e0e589dac30986acd06d6eb8ce236f2a9688f278a14dcfe0660b5fa0e97ecfcebbf5b40d3d3f5150a5545acba6239c00419ac72dc2cc
+ZIUT = 0322517da30e010aeaa2ec9bad2745d8e67f906294ecd6b1d16808be3837f79070d0e1bbbd617f4b8b031d3b51ea2acc59de408a130138c78571f8800fa907caf550d23323d1c818
+
+COUNT = 10
+QCAVSx = 057b7c65bc51e87bdad37c2b4dae67fb008ce71fd3072e41b77c562d7c41748872a20bef8517ba4be89637dde98e2ba1b3b01f63940713e2823d8dab68a5cc78561de14085e4cf87
+QCAVSy = 00ba77430a5560089dfac4f68b4f34937a384dd607bcbb5fab5677a7fae09ed07cfade399e87ce9fdd9397c681aa3378ce3bc82b007f6de4f7cb96dadf55a4c8734a37f39a5c2f25
+dIUT = 01e1416d429926cabea547bb2776710a52f7130393081020312b3962195eb6ed17c6d436bc46a5b47a7aaacf8f8117fea3cafa16665cc1845b0ec94faf687579b1c116ba183e825f
+QIUTx = 065660a58688a16588a9c16b8272040a30afe3150630676023fe165686dfbda64fc85995ddc18c9c5b029bffbd4dffa8f62989c639a68623eca78009cb088ee1cb42c4855b79d302
+QIUTy = 0492c3867f137bf2787a7ab0568d3079b8d9a1e0b0ba5d29d0c7ba616d0bb27725da2ca6bc67bf084fab52599ed42b0ef48743423cbc6f4135692c309ae2630cc4a5390be93f274b
+ZIUT = 000911ec1cf82a22c849b401dfe56453a06f4af32644ea8b63135b68a979236d05968eeadca7f0cd339d295cc58967a7f38cfad6e947a71295733e42ca3c1ba9b4ff6195607bb530
+
+COUNT = 11
+QCAVSx = 06fa7477edec5f1e742881f8d7b2af56375113e992b797fd387eb5b53c33c6ba7236417b2c7e6e346267f1b8c6d7857d6e08f9a60e86de23da4b368424fb003f96b4c89f5d244a74
+QCAVSy = 073e1fedf62e8c81283622b53eb2cdb27b64c3c1dd78da0c90dd6c3c776ad146302e43aba541379bc8f3bddc2e19ff15d96664ce2d09eb6fb5b13848a82b31b452d8e84da3b85318
+dIUT = 0196363eef1a0e5be97d8f7601fe40ff4010f4949f016908a906ed5cdaf1221d3a593b3a4676beafd1fa14bc0f7c533b17086f207f9c484cfc2fbc3db2be4123a8e86f3b4911cce3
+QIUTx = 01b12e38914ee0075a888d6d61cdc7570c511d90a9e3a0e2738c3a9981ab9aba9a6c61460bad079a28429a5207d2c801af2fdceda366440a11686765e9ba77f7a6bc55012d4c9510
+QIUTy = 070ede5877665fd636adcfd07220d745ed7ac0a9b0202159f450c9f6c1b837192a69ee6ad955327eb9cd326a0588b59723db4e8fd258b11db888a53eb14f2be08512688329059892
+ZIUT = 0724c979affb3ab8d307529759bae5fa67319d441851e5817fef014350e3014e068428c9dac395c5e7b9e5b8877457b3e4625ef49ede4ae3626755eefc3fb3cf09c23e8a5a9f8c25
+
+COUNT = 12
+QCAVSx = 018bb6cbfcbfbaed468564b368f0b0abc3fbca47dcc19f2c846bfa287370e1b912f6b70e08519f577f0cac325b79fd66b6b23aa1e2ae262bcd2e7a8b2c2d98d9ed77a54c7295f98d
+QCAVSy = 05be9bbd91772bb42266aba9c893e56670cfb66cafbe4401ca2cb5765b469504848597c7f446e99814746787158a83ebf8e3796857363a8e04f8742a09d7eca16386d60fd7c858df
+dIUT = 00a19a0edf508347f4402cecbce127dc6410b1967d3f89e6b3ba08b48aad08cd6ca5e5d1228cdcc41a1c380f2ae9052d73db7550e7a3c1d857056c98947f5b2c71c33c4eebc1210c
+QIUTx = 0629f70558308708e6929b1ad0fe3128a8af7f96591b47cb8ea2c3454120a6d393ed989d13231c661966a378b967efa64d3c0938e9c0b8b16c99d7349bdd59e2d44804f8fee1fb47
+QIUTy = 06a5e50fd5024d8953e32242823250e998ca602b52599405129735a874e833b3bd73d7a9dc53adea092ba8d24207f5ea5657a29919b88a6d63fd0a943b56dde4c8478481b57723e4
+ZIUT = 005a526588a3a2ce08b20925e83987eb0a1e68f997102df7f9af83823ac8e06abbd29c04cb1f974ba9c9ac49b48b5af37679a39b532d359cdec3d41b3f80a1ee12c80276256b738d
+
+COUNT = 13
+QCAVSx = 032184b6863e2cb5bc71baff5b6b57a10594831cc11a9e5eedec4804e2016e3dd064cffd12a1eea0f6932911ded345ace5c1ff250b9648d93b953386dae9b5628c3c62527b890519
+QCAVSy = 07f783e0341a871e6256da349ebb539f88767d7dac1511e3c3e4d43b0fd31d5dd2c2f0f176eac544a871f42b983f8fba4df67ab6a239b7df997226304b73165d962f4e1d2d18de9f
+dIUT = 004cac3fcc00734442cdd80eaf824412c20ea9eeb03d43b999d49de61873602020a2b3c47965f6f453b91b7a2c1d93e13a89544533e35a122cfc8612c8690b69bb7a557875f960b2
+QIUTx = 03e211c3b4986927c4388d1680cb4770dee6c78266724582c66ccc50c6cb28239474d521facc7206af6bb29cced733edbbc0d20b9264ce63d9437188e3d31c0e0bc3e9f9d88429e4
+QIUTy = 037a7c59012a82d59cc1e2f0fd4fd751e5737acb77f2a0799e0af38996ab5e11090a6396cc480e6f2aabd8fad44611691e5822115fd49d2a000c9b49d1f4964e24d43fbb81fa879f
+ZIUT = 049db68dc9fb4cfbad8247ca4fe7c573c0640abead8f319194d665ecaf4f04b61f84f5df0d8a6386f6df04ca1a685a7394567eba5deb9f739b1e623ed6507021593f0e22e2dfc3f6
+
+COUNT = 14
+QCAVSx = 071e167e59e2a709ebf4be3d83fb9dc69ed749e3ab8a54e202c35f8d45deaa2bda86c2afa1b0a04754d18898fcdd9b185f1d8ba2e180a47ac291bb4aad8f997f73b1423bcd7e9b92
+QCAVSy = 057119085bc7cb2023d23f88101420f9f508f0db94f8dfbedd5cbe88cec80a9dc708df6cccdf815d75b146280d7cd2eb97cf1a7dd550be523824f932a777679f2ee9f66d4258dda6
+dIUT = 00d514144d4548bcfcbcf57009f7e8ee104b15456f491826bdfd9ba67e871fdbd8fc8490ecbcb269091fc7529e5e55713a81de20c0ed01ecb3159ae61424bdbc5653732587d1e94f
+QIUTx = 03ee5f877b737dae40baf91e0cc581dfe8d291f8c451d5bfc0b690df7025875d9569d52021b3b6890e01a2ba95899e2928a902cd5dc8143c07ea26749a9c94068b5c34c596b0943e
+QIUTy = 058e1ba516a818cae9b37086287e088083e2b421fef0b59ba816ab031375d09d7af7d57866744687be3bb41ce2276d3a38f97bbb9fb59f24a92f0085b04ee5ed1ac0efa671394f73
+ZIUT = 0343c45daab4f91e02ef9bd6e1cd157b00ab0ab0a3e0d9734918a1d896cdf7cc1212bf74d7bb9bf96bd4abf42df325756c407217f44a5950c2b66af820692742ed7ebe14e48d2d88
+
+COUNT = 15
+QCAVSx = 074f1a7b5cfb0eeef1e15e63512c73188dafbe88e8e9c42073b2b652b9f028214f0bec79142d8889416abf7a83e29f479e7bc3ca657ef0a10c2ea3ade3117c0d369dacc2339d1c12
+QCAVSy = 00e8992a54076753029f2c0e9d8c166e6ba84896a4785ffff598c4823e5461ff005490bb7fb6d878ac34f427fd9db48cbdf12eb9826d68fd2cf171d4d61c3f275d44947d4df4c752
+dIUT = 00ccc6dca5a985583ce00812c3d07822f6341c79d78c16b2e7ae4bbf5bffac1acd9deab678193f8f89b0e2aae52e30311444dd11253f96d62db3abfb17e423f0ddf0e991081154c3
+QIUTx = 03826215343cfd4ad968d572bab2dee2279f9e8effa0ff80b0df5dd2ea822b502274e507c87d2429dd8bbdba6eb8ab433b1ee1cad3a97c7d244194fd9a43f3e1ff33144e2db80864
+QIUTy = 070f4508ae391ce24154b38873af0082d95895ac92fd1aa321ba93beef404a63f7b1afa1feec997885523a6688ada94dd45eb32ca7f1bb87e63c4de97493196c3b53cf83d218dc37
+ZIUT = 04a565cb3e15236a7f6c413afeb419c082427b10a6d07ff87e81740716433c06b3254414381e4ff9860340dd6201ab6621d162cd12047a5515ab1d65f20c97eb3d7132642f8ad58a
+
+COUNT = 16
+QCAVSx = 004b54b3cefd415f5eaaca4ae4e5dacfbce20cba1932a2f50549bcd31630017ad21475df154ff37be13ca61a4c60336b33d0ffc762aa9e9e9fc6e6fd17250b5e4022b55141d23fbf
+QCAVSy = 056f7c8d65c568de95bd1664fff71429ec738987697f217de5adf36d14a80b6fe585e4685e03c81838abedfdc05a1e01407af4ab989fc1d1273ba8a182c461856d5effe705d7dfe5
+dIUT = 01886213658bd17e7dc334dd8003926a447c34a197ee5d6d0bbc46e85ec1cfa6802858d1c367276ca572ba27aa7a5d1e216902416b48af6e4277945e465d7d840dff1438543caa46
+QIUTx = 047f6cc42107c40c168dc679a864f969b53f756257113b7502796efa54cdcce704b9344ee4bf964752d68910262bd26ab6b347084404b28306ca3425f29894ce6fd4293c5973522f
+QIUTy = 060cfdb5467675a789923be973c6645dbe26d00a39d4e81255217291a3882cfa8f91f4aa8214d3524c95ef6a24e47b3b9d0ef55f670756ae4a4d9c65f075f4170b2d18aafbca0265
+ZIUT = 047265831f1f589b5f30806e2fb80aa7844cbf32b6993384beaac7d992b327b97dfd0bb89ca09e711507e846ed4ad003e7115fa8843b23d38f320e43b5eb506bde48fbd7af4983b9
+
+COUNT = 17
+QCAVSx = 07ec71bea081190a9c4cdff809ed2b65a77800cd1b3beffd1e4004d126ac352d24235c797a5a567daef7393d276638132ea7f0f61e550dc251d341f66102f96c2abf7ee37c0fc9ed
+QCAVSy = 00efc2ac8705b2f9c9c06a910a304c42b1ad53101aeb0d146319dc24815c7cc1983b1cad91d5f9c6d5eef1677a1f2d2bdd75a1fb4c5796a4c56964aa3e43f3da26c737edd9cb0910
+dIUT = 004c0dd3715e8888dc2222069e7f611801685140303e16b8b443433d5e18a4b1803d5680416aebda7ae7e9449154be346a7dcb36c1db22744673fb3b245e58440787ed3dec6d3db5
+QIUTx = 02fb241eb2c28a1b0675b5760fe5663efa603eb0590842f455973f0573e148a47e63f97e8df9a570b0655d5afc42019fe95fe44fdb02a68271d82df580010f91dff0cb3d9bda8992
+QIUTy = 033f93a9dc39d87403b6a94dc0632dec6757842d0aaf8ad8c41ebb637058bfc11c19a3a9abddf204201ef4f96fe9629233a5070a08794d14470091e30cdd876aaf65407627233234
+ZIUT = 059b62c25c96955b8fb4deddcf90ebe6845ee71ea357739273d6d67f21a0c47d154add9d5d4d2b657fe1988ad614b0b4902faa92fe999abd754ad33cd6b92fe2f6a68a6f2c1eeb27
+
+COUNT = 18
+QCAVSx = 06708686b4f5ad2fec457aad5ac4a3dc4867a477eb54fc0d493511b5561ea151dd4caf5d4311983500b48c8043af09e3f4042d5a07ebf050a4e801daeef3317be093955020452b29
+QCAVSy = 0525c8682583b55f7ecec59b920846f75d11d021e9ffb20018639f6ab93022472c192d398e150cdc630a11fcf942e5d238cd6c14b30f44a24d2f843ec5d135ddc7abda56047abc21
+dIUT = 007d54194fc226cc39f640d3d17b9b95b70b51f98ad5ca1991566108d839e377e21ba48cbf441530b3341ddc61b0a58141aaa66530241fa529505d70804b2560c5be481310b9962d
+QIUTx = 02ed5f3a2efa4ab0f9db5fced7b1300de4d457a9ad0827457e5e1c4bc15ebd183775de4b73c1f820dd4033366100e48b4164d04e9fb6cf1a4bdb55122a86005fbd0bd2cddbc95fa7
+QIUTy = 0327fe654ef68563cc8888acca85163c2b154fb70b0f4a2b58c36388a0c25f80a4c887977d46000dc4d86e95cfd8f9065c00eb28653c8fb477bbb5c63dd47b83ca5e0f871e9eed3d
+ZIUT = 02777c72853b76b29f69d3aa27a1659789a025af0633d833b22b57bf328d231ebd128bf96a4c8a7ffd2ee7a51e5ebb7a8e5bca20e4ad49671a2123dfbc0d6c40594e04765186de06
+
+COUNT = 19
+QCAVSx = 07ce7674403dfc62895d71e2ab587ce735f279f12f7df3161335be43fc2908ea736f6f58b932d793aff66f332735d4d38f05cb03cf275ca0e00da1f57381e08bfeb5017877342272
+QCAVSy = 07d6649f3d91e7bf5f8de611bd971818106df2e37935bb464cd9e7469629c6ae7e7f2b2240276cb0eedb7a26d0c7d377f4009a1dd48a793cc993fb0d4a04db1dbad4493304bc5c0e
+dIUT = 010740b958285242045cd5358d7ff9232b7d7d413af7e205c285f88492ef27a2fb850e0567ec24c480c75ad32f70342025c86267dbe4ff80a2c509e5b9a45130e99e7c7cc8cc6ece
+QIUTx = 03f3f585cafd46a663b6cf8b8323ef9159d5195d3118f3edf38732ca0ff73b2d065d9e69ae1e3978b2ce6dc61500f7b8bbf6f6a70b47bb64cc4fd195bba6ac932b70beafe174148a
+QIUTy = 00b1566fe619f2cc00aba05e24a6cccbc91338b2eef553da0d477d6c8c0ac4c656e134dbcf31ffb15c67d589bd2918f1174909e5428c71c90e38c4e11b56236abfa1de6a8579eb4d
+ZIUT = 02c2ec1632e83416182a9a438f7360b88061bab84f5bded3dd8a0c87baf44507df94fdcf99353b107e61cfcfc8af071b3aa8cec7b34a542bf2ab8ea0bd9db67d66b428c9a6c14458
+
+COUNT = 20
+QCAVSx = 0483ad7382e348afc7f271d50d8d39b814b7d6dc0c562a6ba556568045bd2d620906ab1106f9137ff725892e8436a8cd7b88892a32f19ab269e2ad30d7f0ec00e3a052fbbc466307
+QCAVSy = 041cc4b0f195dc73c4a8e10605f2a382923abd2381f24e4abbd401e087c50d18f6dab01a25db7e89dfff68c663494fb4d087a816b85444d882bec2ac25e42fde78ebcca79a6fddf0
+dIUT = 00c85e5d2ded5bc3b6b553fe0a02311b72bc5cdc8e96df179ce57511c26ac9e873fc1f76cdde9a7d8e52a7e9be5c7753620331e8977a98902b48ae9899ce8a6a6636611276ae2383
+QIUTx = 0289aa5209fe7b1ad7b9c5e0e630ba5e02929ea1b1f114d30a0648012bf029e066453f2d28e1d503665dd0833f0ba37e4583b434dd9956100a1ae6e54f96d9347d806741d3a76e31
+QIUTy = 033afe87b29edef447ff5a02e63f64905b5f53ac856cfd7755ad542812ecdd568e8ae1f9d32fea0f02018dcfd0e16d6a6a2797b7e3dc855bfdb6b0d0b2525e143678d539bf8c0672
+ZIUT = 07e1d202a54d34020939f7aed56931f21b206761e4fc79b9a7b320f81077be322ae7809446b5b3ea701618ecdb0a1796ab80407a281bdbcb4d580131b61f8743bfef7a4d9c5941f1
+
+COUNT = 21
+QCAVSx = 07a5e8eb4968497a11b90c60e13d5f3c61c6868573a6b6db7c208a856d54e74f4368e28100b9e0bf49fc3104e146fbda784623a36d9f01f23ebadfab04d7f48ff66506c698bedd11
+QCAVSy = 013db968fc7cd338cb8e3042a171fa306f9ab6f6c865ddc5ba5fe994a30d8fc1fa127191f08e4e14b9aa086a52fbcaa46d22107fd6df53108b53fe0bb96bc974c03a8c6528f9792d
+dIUT = 0053a48cfda8ee232cea3549927b22f375d6096560025e213161d43eed02d07365d9ede7c93d457ea51ea2369e87463eddbf25a06bb1f080fb4763074a8283dd3d69f1de865295e3
+QIUTx = 04790f9db600b9a0a57e03d274a3d23a55aa0d86b2d6fa07fafe3c9d4c3393771dde89c70a6470a31bad105c21d4844cd7bfc3b59738f9d6c528c414d524f88e0c862e4e17aff454
+QIUTy = 05dc12db04e2489db8a46cdeff9f8d9d2e00d024f656c781eb4d2db167624b3a70addaaa158ca00601d4cad065917bebe766912faba9987fcc5fc8a78dd21643aa650e6a4a7e2061
+ZIUT = 07f49ee5d822b17e3f1ec9946fad8d0a0a6b327242afe675806b3e6b7541745e21cd1b70df926af057a9f8deae4cb9a1edc782014426152e8aa4cf6a4080dad4678dc8ff0d9e1af9
+
+COUNT = 22
+QCAVSx = 013caaf8ce2e2321cf256f2b64aa89add6968c298624a22bd38ef94deb3a70ea44ce87a948ea56bf0ee9407134f8c97b17b1f54561ff7747e3f6b656f80d60778d05b8c4cbbbcf3c
+QCAVSy = 0047a2dca3eb6754b0a9fd16b081fca497b29dd2ec9e6a7596d06b059c2ab18900fcc58715247276e390df1dbab26ba81235a4dc6738237fcefd3812b7ab436c926c50c600e6e907
+dIUT = 015a5e5946fe2c9cae6d412c618c1bd07724432b2f1dedb1327d8a99ce830e6b030f4025c14b4e3d1912ea9a78290a1cfc7d0189a30c614010c873146a182f639193a2912edcd04a
+QIUTx = 03140887e87039797869f5d9db50d91ba69d0bfdc5a677c700610562f680d951a5e0517cb2f966367d48e423b046db4e68bc1c4b3183dc80bee126e89014994cdf83c4312a3e5ea7
+QIUTy = 07b8d706962cb192f0ed14c4da710d1b1b073fd8ca497a94379a7454c9c3d4ce6e5fd2e6386852a77c5435abb23536dcc83986cedd4512752f295ca500f055f462763c29fb678caa
+ZIUT = 058cd5608dd9d64d4d822baeca123358a4d7e56d3777ecdf569a149c2f85ed35479eaeaababd0b026dc3b56aedafedfc8491040413f85b669d8512a3ef7bc8fe8706b5c7585370aa
+
+COUNT = 23
+QCAVSx = 0743b3c965a83ee9f6bdb9901a1dcc1f78196544a88b9cf8117f89ed1574e5c5d804fc451112c257877e12b0a66c693c6655c12bba4535d99d62405f4a9dcebc056d8b7cbbada120
+QCAVSy = 03efa58aa3a8c6a24f43c5581fec041442ae955275dbc1d46d10156059d2637b9a82994b024a247d2a66724ba90d02787b168b1fa1f4b6749645406c438f8d316d670f1e0d8b0301
+dIUT = 00bd58e19c05df7e99bd962070e0b4c7576042858447e023b41bb29745a89a4874dfe325a15d38d2fb9e870f419dd15f4aaac65dbbc5ac2c540f57cdb0e45bc86621726d922d14aa
+QIUTx = 01e4b2a277ddd78f2f119c05b6ae1ea7a2a744961e08940f6569ee8808c53bc7a12138064ed5c8c222eef2774e70c28bce3a6c05f3a654e121006ab62bc94381d01ca0d1b08234d6
+QIUTy = 07eed8cd7a8a3549b0d9ef8786879efdc9c0f4ce90b3991a33cbbb1d3704db93513138b19a50ecac880e578de21046f03a200048180884bc42cf9aafe58cc1eaf536d6d25f1541d8
+ZIUT = 03bf7a59bbdd688682c45664d20c19cb2d24fcca6772120cbeed1cde762d449ebf22855627eb6b2be6e7f7c0f0034d02686f2a4488549f8cb198e02b46972bcb88914bea66dd6400
+
+COUNT = 24
+QCAVSx = 0722f1e7a0607750dae2d62c5d3d470f006c3254558eaaa294eeedbca8d30bf4abb955deb62e4179925f6cbadf3bf8776f15dcae3556addf797105a77b7f6f71206ca0e6ea91e188
+QCAVSy = 035d108ca0d620cab96b7cbf617d1b5ac06e37792629886564fd147c58e55e423344ff4f1fba4af0fe34152b384b7685caad15d3bc270e43422ad874e71e408a71a6c8a90d2ad978
+dIUT = 011463070fcb4a28be4e2a67c29c7fa48a4c585a307405d06a1a0678e909dd6eafb898662cdd8bcc019deb14e5d92d172ba1c438ef0f64d80107c7e8e68029f4e0aa814a1099ca38
+QIUTx = 00939398e463886f0dbb48a74f573a1215000668e10b57989dc300b2f9a8c08cd43d6cbb7f46ec77c1c294b23f86299027d2b93fd6eb18210a8230bf46e3921f182c9260c30847ab
+QIUTy = 03d48ec633b9da1650ea762656b3e31f26aec07e7ca6aafc1ed7cb466eaaf3993e0467048c967bb1e9b4ae073a230c1e2f74e2e618666cf56a06f2b65ec3955b6ffbb06a908cf616
+ZIUT = 06d410e9ba6b8b87b00d0f676de8ba27f6afe7e308c2e992f318fc14cba0a447316ad86e8e6c1d3345d8e4035735232c2c597e760b8800a89a521567b09408f9c7be279c137c963f
+
+
+[B-163]
+
+COUNT = 0
+QCAVSx = 00000003a647ba32dac71ec6780b0638a70cd24fc3bd4c8e
+QCAVSy = 00000002e69e961541844a4aa33769a7bce710f6640a560c
+dIUT = 00000003edae173de8fa0cf0412d6a7bdc81fdbd0617adf8
+QIUTx = 000000035466701d0b0030d098b6ed2343d355c24c907271
+QIUTy = 00000000d8bc02f341d261860dfb65f0cb7f0b488d8296cc
+ZIUT = 0100fb42d177ffe6c31378e2e04e0da7376ffe8765
+
+COUNT = 1
+QCAVSx = 00000001282898936486dc2e3cd1585f32d5544264e191e4
+QCAVSy = 00000005e9e98bb7499bf895f77f8fc8301d6e1c7a9f6191
+dIUT = 0000000178dcc8216425d4bf71c8f2925dd1af86dc04a268
+QIUTx = 000000011e49430cdd06f2e765b8f2cc067cd424e2e75485
+QIUTy = 0000000083af15b22cd7dfd1dff7396bf3f3038f50524991
+ZIUT = 0681c9e59eb7eba769f5b6f2b06ddf1efd12997995
+
+COUNT = 2
+QCAVSx = 00000005874fcc8c484c014173102dcb70c624ee6108d31d
+QCAVSy = 0000000049693f4edc714b0d0baa5bfc5d8bc6ac04089de4
+dIUT = 00000003ea1e79e52a070898d6a3c4e748e95ac8710d77f6
+QIUTx = 0000000137860ba3458af13c22af8225f561e01331cd87a8
+QIUTy = 00000007720356e15dc73f9fee7a1c021feca97cd41204e3
+ZIUT = 01e0749a21fc508f76dade85435bbbe12c448bd8c4
+
+COUNT = 3
+QCAVSx = 000000003748d798f140268f1e718b3b23aa2acc0333c074
+QCAVSy = 00000000c42a927ab579696123095575ac949b07a7d1d4bc
+dIUT = 00000001ad5ca9abc8bcdcc482995ad1a977e4727150bb36
+QIUTx = 000000025ae78311b0fcf369566a319f89849546aeaec305
+QIUTy = 0000000640eb0fdf520480afbeb9f2674feb1d6df482d7f5
+ZIUT = 0320398f7acf791e0d602d7b94742cce58e9fddbac
+
+COUNT = 4
+QCAVSx = 0000000380db3df2b1c0154a8e8cb304aecd581d35f315cd
+QCAVSy = 000000071534ec2e8b357d9e069d7f1fa98bd44ed8b06826
+dIUT = 00000002d28a8aa1d89fa3e5e596ffd1808254ee17a0d0fa
+QIUTx = 00000006e6c52494ab63c89c9788556f716677f3b48042a0
+QIUTy = 00000004e98258b9c56f02d3edb4ca5b0aeeaa9daaa6fe0f
+ZIUT = 03e4de43de85223d818e5be6549c29cdfa1afe1782
+
+COUNT = 5
+QCAVSx = 0000000136e0d05b4f398b827e198046148b2f41573fc07c
+QCAVSy = 0000000739934cec10572852e1f619222e2f5ec4e0fa5aa6
+dIUT = 00000002e170f7f4dc152fe4706f99d9be229e1317d82bbd
+QIUTx = 00000007900dac251de8a944cf0a1bf2eb2efeee14676e9b
+QIUTy = 0000000091e7df67f77622729d59b7e34b947127e7fa2e5d
+ZIUT = 037b178aab014d5abab305e37deed7f4798cdb862c
+
+COUNT = 6
+QCAVSx = 000000076c3ae4a781673627d0e9bcb615f626a160a55dda
+QCAVSy = 000000058c0ec8f2649c2ddcd9c24b643433b14d907c5903
+dIUT = 00000002923d2c802cec42def2633debdca759d59744d3e8
+QIUTx = 00000002cdcb4f91ed7d17768db80be2b3ac9e0956b1d971
+QIUTy = 000000032433f455a6cd253e91582d2f6f5a712655da1d69
+ZIUT = 00958b2aaa6061222dd248a6b9700fb6839dacdc99
+
+COUNT = 7
+QCAVSx = 00000000d65f0516c1b3eed9220e59b3d049dd1153179ac5
+QCAVSy = 000000020bfe107a89a7360cd2e217534d6df298cc4bc458
+dIUT = 000000025b17bd6e4207d9fb1a3af02fd5db26af8348aeb0
+QIUTx = 00000006f6f5b1f3b18f45db4fb3777e6840fb5a5b61a914
+QIUTy = 0000000737ce14aeb24e0591585a7417b89256749f461de6
+ZIUT = 0393387e1dab35748f20d506a0e2b4dc0ee6c3ff39
+
+COUNT = 8
+QCAVSx = 000000040d903ce2b30f70a6a03849b0e1758fef8887bd31
+QCAVSy = 00000004abd8bdb7c1327c99b33820dbe18ae114fb435949
+dIUT = 137e8132ad288923e64811e92298f5c0dcc95705
+QIUTx = 00000006f2cdd1d630dd731ed77f901c7b0e735515e26d4e
+QIUTy = 00000001062f2f715c4d2af97bb1be8b6cfa2e3ee314253e
+ZIUT = 0212358d3f8bce69b662447333b3edbbc9b2f7e805
+
+COUNT = 9
+QCAVSx = 000000022ed24643f0cec68c8e4ad1aa2c4369d8aa03f594
+QCAVSy = 00000005ccca62b6dd1d316dedbd0f1d530bed6e556b3ad8
+dIUT = 00000001c48c50b7d3ecdf3b901bad0eefc3e3826e3cea9f
+QIUTx = 000000019175573117dd851e6eebfd9fb1e5a884ebfefee5
+QIUTy = 00000003adf37e4ded52573fa57c8cb2bfca6c65c3674462
+ZIUT = 023472fa59846f7be07cf060cdd69a9fbb27d4fe44
+
+COUNT = 10
+QCAVSx = 0000000793f4b31172eee66f2769eb305d03b5c3f7cfff8b
+QCAVSy = 00000001f3ecec6bbda9bde8a4da14db3e5ff934b9835b17
+dIUT = 00000001162d9ed3a660455e8c015d1e45d1515749a3dcd2
+QIUTx = 00000004283eb0e5085d198b378fc95f6fb4c3198b4d3c78
+QIUTy = 0000000107a1168f2f47b963e4b3a9024e0c357a5ebdf92c
+ZIUT = 0173a056c4c9ef6707cd23928999c4680f42b71f7c
+
+COUNT = 11
+QCAVSx = 00000002ea7a50834602f112f6dd0e6d25f064f9d05eff26
+QCAVSy = 00000001bf3f69d14acc8333533a88c2e8824863a47ae027
+dIUT = 000000019a1d16f4a572f3c1b51ea2ace69280e7137b8f8c
+QIUTx = 00000005cede96a70f714cd68963f2d6ca236269a938f311
+QIUTy = 00000006cdadd54b6f733c80934787e28c2ccf58b1227bc0
+ZIUT = 03d34f411a297d7c990fa4a83b5f54759607f9d33f
+
+COUNT = 12
+QCAVSx = 00000006dd1305349e8aa08020073a0de5afc5dc1b6a62d3
+QCAVSy = 00000003497eb7bf4089ef02cd0a5dd0f86bd8798a44c56c
+dIUT = 00000002efd4400dad3cfad8d1637fa9290c4b758a3015b6
+QIUTx = 0000000513131b4bcb72ef68ab043ee84fc8cb03b6d8f187
+QIUTy = 0000000120b7d5772bbb17ecb1c9e80c36f808fd54a93aae
+ZIUT = 06120aed8d4c1e506710e2cfb98ca2022e642ca89f
+
+COUNT = 13
+QCAVSx = 00000005a0e341118e69827d6a7f8282fbf0b94400f08240
+QCAVSy = 0000000423b993d4367fbf4f6504d9e09a64123a3b53d128
+dIUT = 000000012b0d64977cfc13b48345ef7072d1a3890eafb95b
+QIUTx = 00000001b9363cf48735676878d80ce1481b8588683f7444
+QIUTy = 0000000768fa7327cd7252c8f696ed4947868915ada1fb5d
+ZIUT = 021a58087968c5df57afd7c343a4cfa2ee8e7073f1
+
+COUNT = 14
+QCAVSx = 000000001a923d6191634306124c1e267309b07dba32decb
+QCAVSy = 00000005a3517f5426a3411a727eddc29a3ec229558368d1
+dIUT = 000000033ac953803d0446b3cda4ebd071b4eb027c11bfd8
+QIUTx = 00000005c446e9896ca44cca733e9f4e5b64afddc0537211
+QIUTy = 00000006bad1b2522692f970b38be6935dc7d1c09dcd206f
+ZIUT = 03da9c0879219e48c3df56174898fab9ee5b0a6bcd
+
+COUNT = 15
+QCAVSx = 00000002fa8baf0d6128add9b902aa181c81e24298451e2e
+QCAVSy = 00000002b93d1f6913914ffe1559c7c114c631bb6b29617e
+dIUT = 00000001bd79145ae7f42c6b25d1c38965ec08fd27533a7a
+QIUTx = 00000000e9d8fc3a026925c8add508f920fa2e5ff5282688
+QIUTy = 00000005b7bf631259ac7d36936c130ff206d820b13bde81
+ZIUT = 05b33fe3874d32aed99919265cc0074902e538fe54
+
+COUNT = 16
+QCAVSx = 0000000353e2da45ab7c4930280c3edb4ba90012d56df62f
+QCAVSy = 000000026931e30b97ff5ef7bacc0de4d9490708522e3b2b
+dIUT = 0000000330ca1f5ad77d7a66d87423328020c91ec79f3764
+QIUTx = 00000005ba37d36997c4f2abe603dfe042232738e82b0b3a
+QIUTy = 000000073c8cd950044972a005c6f1af8e4306e0ccefb946
+ZIUT = 053dbce9826af4d290036feb46875e975b7848a9c4
+
+COUNT = 17
+QCAVSx = 0000000721670884daa8cd627638ec90f3448efb0f2489ba
+QCAVSy = 00000004f84a983bec6b2889c8211bf231149b5bebcc75e0
+dIUT = 00000002d23140074d6eddd5bc099b17de12afb9ddf2ecbe
+QIUTx = 00000006e06cc7c30f5ed7e686c3a75a1d44257770601cb2
+QIUTy = 000000030dc414c4afb390ed467af471aa9bd2b75f32dfd8
+ZIUT = 00d49b971cab937f40908913fe259849679ca076d9
+
+COUNT = 18
+QCAVSx = 00000001d6319ec2dc5c08f0261aed0231418d6dc3d0cda7
+QCAVSy = 000000038e64953f7cdac71d052e55855746b43d44181b91
+dIUT = 00000002449c1b9ff09e7a9a03b17f5ff461115f5f3f1a7f
+QIUTx = 000000073f9ddddc4650933deccc9546d392a35dbbc66a76
+QIUTy = 00000004de7558dde649f72322b39e31c8e29ce6f599485e
+ZIUT = 0483ad0b7f8a716273f624b8979c19126705266e4b
+
+COUNT = 19
+QCAVSx = 00000004f167907bf4b98e8696d81da7d2c1056efa0dc14c
+QCAVSy = 00000006cb9ab65143832b9cefd5d9ce69ec4db2edd067aa
+dIUT = d08b95d9a4ce724ec462cce12701fd8c3d53fdcd
+QIUTx = 0000000026a770d86e1c89ba7a86aef649ba7ea86fc7d5b2
+QIUTy = 00000001db1020e0f764df54a53c23c938cec98d9a77ad1d
+ZIUT = 00f69dcb547119fc9b8c454335aab184c3ada5f1c6
+
+COUNT = 20
+QCAVSx = 000000079b6d14c743271402d1323603215feb3c68b14455
+QCAVSy = 00000004e3905686a538c25a02bea92f42184021b5ea2593
+dIUT = 00000003808efe6ad50d250d87192e16499ce3259428f3b8
+QIUTx = 0000000013a02e25fc927875afa557bd673f65870459e671
+QIUTy = 00000004038dbae5c5e54084708a24bc3fd072e769c12377
+ZIUT = 01bc5ee5261b2bba55b10cbaa6cc3c97b98d00ffea
+
+COUNT = 21
+QCAVSx = 0000000772f42d272a057de0ff926c9f94605c6675d21526
+QCAVSy = 0000000602e7e53255de9bf58c057eefb79bce431b5c3808
+dIUT = 00000002ad232a7a41e6cc2495538d87b023cdec7b6e1f23
+QIUTx = 0000000549e30780d93f796fdcf691905575d85c66453bdb
+QIUTy = 00000002162a885bea31344543f5d06191369dec6e70e967
+ZIUT = 008574d838d3de87965fc1b4343fe4f078588c4ea1
+
+COUNT = 22
+QCAVSx = 000000050b2429460971739a9d6d5670bc6d759e5656768b
+QCAVSy = 0000000492bc2d3f638d4978e4ca58ca5a4ef19c5eccea8d
+dIUT = dc99b19f3d8847875190e9588b2bbd830dbd3a95
+QIUTx = 00000000f65d984d71dcc18bf172abe4d3993ce0f7cf324c
+QIUTy = 000000001b49e6a2cf1173aadac3af6c09e966f31141abd9
+ZIUT = 04579b477a92ed961cfdb2014407e88e7716452a4b
+
+COUNT = 23
+QCAVSx = 000000017d52116f0c95587f1b7b06c76e98d99c82dcf20c
+QCAVSy = 000000024ea22bdd990bd79e63e735b21282ae1b5ea66648
+dIUT = 0000000356ab85b04d0851b8f66b4a796526d3f3e3882844
+QIUTx = 0000000776a2e1af932d74519070bfa941eaa93e9ff5e97a
+QIUTy = 00000005abe9ed46245fd0146250d2a563c46ebf7acd2342
+ZIUT = 035a8c10e64403c52ef8d17c5f4dead0df81fb1f21
+
+COUNT = 24
+QCAVSx = 00000003a7ea10ba1d6aa545700b40b737951a9e736dfa0c
+QCAVSy = 00000004f9352fb2ac2444e928754e3655fd62e3a42564e8
+dIUT = 7a7b547550c758a9de7f06e2f38e55f5e9e44ce6
+QIUTx = 000000045952c0b517e685cab09470327f9d4b212751b049
+QIUTy = 000000044a429a6efb04bcea0240ab5805de740aa61f994e
+ZIUT = 000142615e3607ac148c4de8f334be849235d01cdb
+
+
+[B-233]
+
+COUNT = 0
+QCAVSx = 0000004756baddefc3dc337ab27b5452eb10affd9e31f5b55c330e90f0f686a2
+QCAVSy = 0000012a79f65232308a21c98c01555ccafc7dce15c8fed3025a760cbd6c2327
+dIUT = 0000003c3ee474ac0d0bc1df567e3c35f5f766c5332b2d6730ff0e4d8e75aedb
+QIUTx = 00000061e8a9b517fd05a026ec376616229fd8639a1fa76defe5398022f9d9c8
+QIUTy = 000000706b5cb08738a94552fee584b1372fead4af79040909fcf6f50084bbfa
+ZIUT = 00e9f3d8c4f1bec0f920e763ea1bb7415899f01734609e7547dc425ec946
+
+COUNT = 1
+QCAVSx = 000001186a028f9a18db927f63253c203eb26aa3aba0d40b1a3abc64e47a22ad
+QCAVSy = 000000cbd8b95f89e421128bc73a43c5cc254e3867096ab89d788b2ed3b90a96
+dIUT = 000000aa41a5a01a4e66a67997b0be16f56b160b0561ad07f3af2964386461d0
+QIUTx = 0000002d91402446557068c40fc075dee93916b0f1a9392e47e56b747125ae1f
+QIUTy = 0000013ab0915e4acf779516826fa1dc1885a06abc5d0809c92240ccf9c3d8a4
+ZIUT = 00f1fbecfadb158d62eb1109c085124fad67a8795b58815eb396c95db4b9
+
+COUNT = 2
+QCAVSx = 00000093bf85621602238e98d09c98828d51a49460362c23c5141d3d1b235296
+QCAVSy = 0000008497152187a8b3b2958a1d0a2eecff4492251807cbfd03d5f2685bca37
+dIUT = 000000c6677c28068b462e34862ce6c9d8ad8c1b3c7efe80cbab41da419278e4
+QIUTx = 00000042cb311dcff2482a2cece696c1eb64c69ac2aa599209a5c18763a3150a
+QIUTy = 000001b0329f36c135d002f08be3e3ffa9da18c5d6a70c360f4f871f12bf3f95
+ZIUT = 019ea831c51d88a7cf754495a1c474082ed481c8eb83190a77defb09d479
+
+COUNT = 3
+QCAVSx = 0000004549648692af95d88e4e1d4914d8c9769aadac5a0f75783265f3eb9657
+QCAVSy = 000001b094b4802f397663d0e682fabf1c94c4e214e48327b95eefcb92b771fd
+dIUT = 0000009c61024b3dff219b37f1be6701804adf247414448dd0f0dc51293ac913
+QIUTx = 000000124120d8409850e71e33c9e2d9c40ea32bed11d77804786e9b076892ab
+QIUTy = 0000006dae1ba4817296ff63073bac9ce065d4331ba1a5c899cc1c07405dae3e
+ZIUT = 00088425fb04c2ce408f08d81385a322703a077bf00ba0791e4e79b80419
+
+COUNT = 4
+QCAVSx = 00000073c5cf4a01d09e3b41b5e7778c6b9ba52daf88fc404f8e2fd09db4027e
+QCAVSy = 00000070391edaa76f0e3970394cac0338061058858c3c73d5cb512e5326304f
+dIUT = 0000006e69d064dbd9a794f68e699a0e941bdda6a53a1ceca3b3db82925b6f8b
+QIUTx = 000000c57d61fcb1fee90d5d8c97cbf188c8ef8259b0ae2587ecf1ff8cd2e2fa
+QIUTy = 000000b8ad86c6805a4ab44513dbba2f5098b9e9c1e05b679f52937aece2b182
+ZIUT = 019b5efb23bc18a4f18c22fe2fd5cdbd02372cabde5e5c9f4b4f9a49438f
+
+COUNT = 5
+QCAVSx = 00000123a6b081a761e86c042e1914af47f093b2655543e564584b60642539a9
+QCAVSy = 000000518ee3c1ae546404df1eccd69aa6856431d1c8881cf0578cff4eb8c11b
+dIUT = 0000005ae5de30c7c3171813a2dd3e3ea2c5ceaa0473c39457e9929071e1a420
+QIUTx = 0000017cf9fca05d4a55e4b68fee7a3bd43f047303f2a266d81bb5e1ec7e2558
+QIUTy = 0000003b0af43de05003397de1d4b27827ad2fcd675cbf61a445a1ec40a569b6
+ZIUT = 01f36d9519c3d47f030eeac3338db583b96fefa551a4b56cc5567f2d9d7a
+
+COUNT = 6
+QCAVSx = 00000141fbbf2b361c2c8ce5edabfa22aa4755581e5b1a66600362a0ee7bc574
+QCAVSy = 000001aea3cac203f8c780475a2609b2970cc86f96ea4011c348da8262b334aa
+dIUT = 000000c68796955b68b5f8827e38ac0782b1ac2c4552caef0c60958467cd85c1
+QIUTx = 00000034789fbc60f1086034c8f2ce86fd4aa335194c9146890357dc475699e4
+QIUTy = 000001d37f796327f71ec31510468463d0b2905488a4a60267870dfee567c250
+ZIUT = 00e54b1c916ff3ba1aa0b2b99f0ebde4f1a4cc6a10d959bb2f7f4c777b84
+
+COUNT = 7
+QCAVSx = 00000096a0d3f36e8f753791074cea697b2471627e0c9e7a294a029a9d3b9429
+QCAVSy = 000000b767174a2920b62f1f02fa79097845d51d93e0c8104410831a2dd55c3c
+dIUT = 00000074245cc97dd450935689ea3fca7b0b30c1d67ce6e8be17cb1192575caf
+QIUTx = 000001e1c570acc653c706fd7740194a554de7f3799a12b820d6a941197f761d
+QIUTy = 000001e2225e8d0d41c808f6ead7af320fb25fed29a99098a0f0e11cd869e53c
+ZIUT = 00bc0dcf7585753cc79aa412d2740b4b2d1c644fc9755cb0550286bcf68e
+
+COUNT = 8
+QCAVSx = 00000166be2426b3bf8e6d05a24d7d1f2c0e329e4120cfc8e6ff52486f095586
+QCAVSy = 0000007371e288145fc25a5a9cb5f2a386034f2f328c6eaa24c8b096e8ab1f0c
+dIUT = 00000097beed4b738a6205cc9ea046b448b523128b93101a02d964435eb17806
+QIUTx = 0000018358da94079a700a10b20a2325d33d80e95eb4fc4a98101c312635939c
+QIUTy = 0000000c4f442d0071c7bd1d217cf235fd031dec309e85ea2014e68b50fc2ba0
+ZIUT = 01b7ef3148be331115321b1c2a68832fdfb991b26224a60dddce3e060d27
+
+COUNT = 9
+QCAVSx = 00000181f3bb0b097713277c5f3b46cef02aa9cbe29ab95c76e9b60a1f7a51e5
+QCAVSy = 0000002e2fb672d72bf78f7cfedc40d3726c6b4fb585417c7476b655e32bbd3b
+dIUT = 000000759c55da55e1fdb5ba7f8b893abaae5925b9b08184a3d554957acf3ec0
+QIUTx = 0000002af25f810e18a81b69da254a65b8a6c7ab80ddc27c85622e2348add132
+QIUTy = 00000128b753e4b21a8c3acf85aab92a9aa6a7b33f2cb69d7024baf8e8b07142
+ZIUT = 0041249865c913b287a253150b207e2682efd96057cb0709e9bbb48c0fc9
+
+COUNT = 10
+QCAVSx = 00000065aa4115e59e6045aaf99ee1beca1fab923bbdc919206e0931620ba996
+QCAVSy = 00000128d00b775899a58a59bcb2ab79d609e2dcda98e6523bb67168554f84e6
+dIUT = 000000ee639d89f0e433c075e2ef57cc243581e95b261f8a93b8ef6f5ebf8015
+QIUTx = 00000006638f6bcd85043395d01d767ff77e9d677f37ef400f2e16fee86dbaf2
+QIUTy = 0000006c12496266debb1d8343b9684e27c5f7129c17024a8e6704672a5f3d63
+ZIUT = 01cf480fbc2be2c2c4448c88890972c7ff9cbe08a75e26c3809596b8b5c0
+
+COUNT = 11
+QCAVSx = 0000013576e700f36367fb741842f231889f36822aab2933c245eed57b9dacad
+QCAVSy = 0000017910e9071a3e42e7f21b363f0e687d289810a4ec29c36ece14854e1dd1
+dIUT = 000000929b09b67b29aa4ff15d6779a1733065049faeb2c227012c49f277ed51
+QIUTx = 000000ca0403d95d85f0cb0ae4d2aeae18e187b79c201ed68c14ad24ed003922
+QIUTy = 000000cf6b0a502b290d0aeee820661accf6ea597687c45c7f93a773d25f62a6
+ZIUT = 01ce8abf3c8ccfa30e5f35ddb75f5e106aab1e67086156a1ededa1717b77
+
+COUNT = 12
+QCAVSx = 000000e9fba71a64abb177fa436cb9739c9f68c0155adc897139c1bf3df99a53
+QCAVSy = 0000019af1131be47de08870835da14946fed73034179f809298d0149b16dd36
+dIUT = 000000e27af04efe2d86ffed6ecdf718fc0b8e049ed222e7600c3ce31ce4e97a
+QIUTx = 00000145ec0db5fe62b92547792012268af21ba928a8fd98d0a1dee3d8fb2559
+QIUTy = 0000010a031cea56b183e93093008ab705cc9099e5b65c5cb4407324b96fee90
+ZIUT = 0025df759a20312361b9f6767efe8e8d69979e34639469a91fed9fce04f8
+
+COUNT = 13
+QCAVSx = 0000011f994a416cc1990b8c61767a3d68fbea73af7b48b655e47470fccc791f
+QCAVSy = 0000015de988835d6812f0bdd7007a895971e1a06f4d22ce1303c9f55efe647c
+dIUT = 0000001a726d7b9928691eb0149ca8f0edee47bd0c734113ab6003241ee193de
+QIUTx = 0000007426bfa8878fe59b16a9b8c63910a1e2fbc6b07ba995ba04c31402112e
+QIUTy = 000000944e9616676cb2fc7fa0f9e1b87a358748243e80fb62264284645a6a4d
+ZIUT = 00437ab4a53756ff678a1f580c0fd1f33b23021d62060808453b4aabe627
+
+COUNT = 14
+QCAVSx = 0000010513620aee0d0478872438e99b23ea4900153f9366eb17d61bdf35aa19
+QCAVSy = 000001136dfbc8401bbda0d675ca06a0cff6bdd467c0ac9a978293300728e7dc
+dIUT = 000000f459c7672169c1259e4e199333964c1fffbce75ad30dde1264f5cb86d1
+QIUTx = 000001b44a81895d2105fa16a6e09526c09ae7f6cbdbce210870f4e33db8b6f4
+QIUTy = 000000b1e072c62a2642975f06c687c6467da295ef93f04d1c5494a624683c80
+ZIUT = 01ebd55823c57d1fc7b36cf1ed2051ead64db6d114014d3407186f50d957
+
+COUNT = 15
+QCAVSx = 00000035dffec9117ed7167627a24a3ebddd49a3f45d91ad18401d3d449b2fef
+QCAVSy = 000001931754ce5cf557a1c1acedfe5e9a7b0b91f81643da8586a6865885f042
+dIUT = 000000656a47b8772b08b1d907c823fb6c45c65f9f18f8b43f3a61e6c74611e1
+QIUTx = 00000153cdbad92eb8d20da0c1c7aad46d08336cbc976e8d6f83947e4f4d6616
+QIUTy = 000001c977b97a5e1205ca66545df3a526b6e325e087c0e070839fe7ec1ee788
+ZIUT = 006d07f6e08b11a060ccec43b07ca7d9eaf6c3ece06f4785519284bf6f0a
+
+COUNT = 16
+QCAVSx = 0000004845ce661b1eae34c1699f1bfe38dc87ef28b8b0a7771ff366dc21d863
+QCAVSy = 000001096b1954b06eaa7073ed939801aa2974da1d60d66e97c31df0f6876faf
+dIUT = 000000f14f5ec4efaf86e43fece65f17ff91b1a8d61be3416eeeb884f4e2d14e
+QIUTx = 000001d9f8c01e9c20f6150ec7620a75e39e96f9247bece137b0365bec54254c
+QIUTy = 0000006008373b9e087805294dadae00894667fdb9f6b8a4d16295e5b9d21a6d
+ZIUT = 00aea594f092b4052f7564b2e5651bcf43ef7e336a064d6bfb1a89cf5e51
+
+COUNT = 17
+QCAVSx = 0000014734192165c96fbdb794cab1e2d1ef111e1a20a7205db01aa803a032a2
+QCAVSy = 000001ecdfc3940b7d0618cd6315441751f663df74d356492ef934b4ba2b2ad1
+dIUT = 0000001fa5cbd88a146f6ccf5f79dfbc70868fd9bb4c8115976c96270ff7bc5e
+QIUTx = 0000014d276f4281cb50a26b29ec81fced96d0e909994b2285433855256d58db
+QIUTy = 000000ac4792af62a0dc4fd4eec384fbf3fbb82c8347486bc1eb1338bc7f3ab0
+ZIUT = 0099d6d076e14ccfee15ed7e7ef384bfee12deba8c9ae8f6cca3486a1494
+
+COUNT = 18
+QCAVSx = 0000007e1f3251e2a0aa6de1f8df86b85ed9d11da5eb7136add45ea7d25c867c
+QCAVSy = 000000d96281e0756de9daa55d2ef6573bb2fe2dd09b71d91191a5a043bae0f3
+dIUT = 000000f58684ea14a68fefb8cc26b267a13419c62d7261bad14e5368a9819a18
+QIUTx = 0000009a65a85394070fe0e5a108164eb289cc3d77ed0848fd57f384e62caa20
+QIUTy = 000000e7f56f2c27be4faeb20e274c2604c6dc2d88597030ad2164fad03cb904
+ZIUT = 01b1e977c43afd203132c085b95db0e2046a4b6ac2c046ee9ad665050578
+
+COUNT = 19
+QCAVSx = 000000be1ee750f2712b2acb20c45e97357c50db3be895b33f830c71bc9f4f3d
+QCAVSy = 0000015fec810cdb179fcd1ce8e4dc1a2499e40de8a4a49a9420f00e56110cf4
+dIUT = 000000eefb24789b32b436ce39622c114c39a6cd1e58ec9443c8870e5ee2f801
+QIUTx = 0000013fb1ca9ed709bb386fba02cc7862fd6c64e1087be5f61ea733946c1634
+QIUTy = 000001cb4097e44a730700debfe8143fbf9bca3a3d6c46985a27cd5043b2ca5a
+ZIUT = 000e4cb704355cba1b40cee3da102cb048519a91b4c789b3757cfdd933aa
+
+COUNT = 20
+QCAVSx = 0000015c2e2ce0bc722cea4cbc7c3352cbe0d28b5b002e44d93705895d791afc
+QCAVSy = 0000014f616983ad08e745315c4767b0ae21a6fd8a629c258ce7aefa4c17a8e0
+dIUT = 00000017524d506616bd205cb3978bc75e3a3476233e49b6dc206f9711697557
+QIUTx = 00000150a17327845e7bc79d8ece12930dc2b77654caa1082b57b0cf8e05b1ac
+QIUTy = 000000151c76822d8df5effd8c6943395b6a8d538431d42e846e9ff8de7eaee6
+ZIUT = 00d8c13bc5e819c6101daef3f6fb5be6bccecf233c4b7fc65054e8e8d3bc
+
+COUNT = 21
+QCAVSx = 000000bafa9bba92725eef0c4a0afcbd4263e55f5155645b5c58a96bc3e9e965
+QCAVSy = 000000d1b3d0e35d617e09e078c571a5f41ea22dfd112d67a94d8dfbba66e9a9
+dIUT = 000000a6b05d30a703f1179a80f8a864b34ca15c453e82808a1095e435e9bacb
+QIUTx = 00000093b3252251fd9d6d9c81d78cf1f134cdd554d63c2a1e2f1afa14e2d4e4
+QIUTy = 0000008aeb0a8ab3ff5e4fb023f7e1917f0108890af11abca7da027fadacc3b4
+ZIUT = 0129af50fa085133771753f297a313bba0d2f5882e7634b7ef5adce760ff
+
+COUNT = 22
+QCAVSx = 000000798bf5ab761bb6acfed0cef1cd71b3ef46f2504323cafc4081592dd6f6
+QCAVSy = 0000016277aeb3e1cac0121b07d9378a3a0cbc6567b48423929e36dc855e9d1a
+dIUT = 000000168d09809eb9f6acf31134eb5eb1af966e212b9b6be68cfd22401425e9
+QIUTx = 000001710a05f02b5505729516b1ac73d45f3cf08f1c5134d2f73d12570243c9
+QIUTy = 0000018611b10dab507583f2be10fd4296f537d4af09576f96979f1eadfe291c
+ZIUT = 0077c4ea1095fadc4cb4190a3fd530c7d15325e5d79b8e8a2b708e2344cf
+
+COUNT = 23
+QCAVSx = 0000015f723da9a38c2da5062c17d0b837522f7c69c793f79c17fb6965d44a03
+QCAVSy = 00000132b17760ac2e2bb9f813ed7790c5cd3aa0d38ab64e2e272ddf4a4c2c1a
+dIUT = 0000003824f71ec3255bbd03642d782cc6794e1e54aa8fa5f2a331ee13f78450
+QIUTx = 000001a4e35a8c32717f2aaa3eeef177848e580e0fed6c8096868f6acc4e1c09
+QIUTy = 0000013727604e81d3a9d93d243fe79e2db8a442334a8ea1852b9f83cae1bc3e
+ZIUT = 00d9eb3c79cf442595dad03ed4a38daf358b97d5dfc01cb61ff200a47958
+
+COUNT = 24
+QCAVSx = 00000051b70bb8b8e2341b86821d54b974b696bda443acb7ea65965d27d2ac70
+QCAVSy = 000000c7784eef889c471c9d26b3e0de24ad2b4bf8bbba6fe18f51a412188058
+dIUT = 00000090adc0b207dae381622cf92e04bce7479180ec6e1771662f5c3179bd99
+QIUTx = 00000106adbf9bbfdb3083598a7f6db2e91d2e7c174f705fc216631b7d05edf2
+QIUTy = 00000190d84ca6f4695fdbca40d26a74998a05c3d761dbf08981b645c0ea239e
+ZIUT = 0124c19cffc0b9549bfa378a548e8ce11ee7fca28d2d898de49ae1f2ff61
+
+
+[B-283]
+
+COUNT = 0
+QCAVSx = 02504e1a17819d39f010a4a69a0568299402b58f944a384c7d1a62c9c93ea4d1ff300e13
+QCAVSy = 0265132f7b4c64b74b9179ed0f2e211f4328d625405022f554170da932b80fdf7c1aab12
+dIUT = 02f43455842246a2cc8ec068e9d6c6e4160f6ba4e3b5d831d93c1daa8fd3d5a9660c7bb1
+QIUTx = 0561e495563018169804d4c8e2435b4afd85da376d914b69d39246f8e06113aa32e642d2
+QIUTy = 0781a7f59de7f42f5f9d6c3481f33fc5deb357c6ecf4c758e370d2435de3d8ee737703f4
+ZIUT = 065194e26090e74047ee75f13f9769d20e1b52189650011e283daa090732cc53755dc366
+
+COUNT = 1
+QCAVSx = 01623a9675e8c40366e26131e47b1af06c8b33acf5e92f54644816dcb844382c944cc21f
+QCAVSy = 029d280f4d4c0c5fd70f7e24095950128bea3cae3ca46f6a5f70b739fe1a990268804e38
+dIUT = 02b941e692e0a984c5ffa883c9f9f8256a43ab1fd1ad9782a42e429a94e910e482b91c23
+QIUTx = 07b90af116b737d9008e4c18f6ad539d29ee1790008a1daf2e856fa672eca4aafc96ca63
+QIUTy = 06aaf78d0f20657b77b97cca30eab79b679a3aaa90b10907f979cde988ce718491010c2a
+ZIUT = 075c535cc70de19c92d7314afa2f33200903431f6990ad40ac31dadaf4e492a799b75b05
+
+COUNT = 2
+QCAVSx = 07b8369728432f7528d3eec8a6788e69cd2eb88162c47512742ee0f027ccb4157a28a223
+QCAVSy = 05986eb7f109aa1f8556eba2bdc88e4913b65effb944eae639636cba7e01dc3718bcb361
+dIUT = 0287de172ba50f327bfc7d5a8c0156d25a1f0b9f71d389852f2e3b587406cb74ef3bd041
+QIUTx = 00a03490765fc90c23553c0e2b79dfa232b51a73f21554e5eb18da4c994d925f8ed2bbef
+QIUTy = 0304ffd41c5b0ab2a70b82188e8f1578d6ab7d3ce3ce34fa45dcc32207f163e91c5d6814
+ZIUT = 02956f63d48a49a330e2068955cc2886dbfd5bf72a81b10ed83f2d758dd315eca172927d
+
+COUNT = 3
+QCAVSx = 073b092a2a4d7c9a17bb88e75b40a9e4e43b99813cf61682d49b92905c2dd606790aed39
+QCAVSy = 0566ad452a2d8ef0a327ce8e2856146fecaf09e4431ccc04256a077f60701ce4476b6dac
+dIUT = 0153bbb8a3ce4a1b99960f56186ab50207f588f30c94beef28408423ba44fc875faf38d8
+QIUTx = 04f2c2454899623af13b65820aba145738407f77186abafa52d24b35bfdf5808ffeae076
+QIUTy = 0111f448460ad2430aaec788de291548475a1e5836dac520d8e493c9f601275e70ea29d2
+ZIUT = 068a3f6938c44b797524377508585842c6a7f1af5ffe9131dd3ff786ae56e1739345d3d7
+
+COUNT = 4
+QCAVSx = 0455e87bc230ce7fc586312dd207c529e47e3c74cc0ce5d073fbf4b1c957f8cbbd9113bc
+QCAVSy = 021ffbf62fb2531db39ef2d0bdce0d9c141c92e9cdca627caa39b593fc4a0210e8ee481f
+dIUT = 032ac0dcb9aa3972401f9f58845ed765da36b7d6f77355779bfb2439827ff3556a75781c
+QIUTx = 07159c86b9c6adb2160c28d86118f84564a90c149ede28329463677a4c87729f897c2f98
+QIUTy = 008a78167e1690625992b0efc2e0ef6f6d61e81837c8ecdfdab51d15340e37e7d8d05120
+ZIUT = 019b48d5eeaeb05b58801ae8f345ad9bacb91daac885e506949b849ebc67bcbfa308aab7
+
+COUNT = 5
+QCAVSx = 0652ccc8921f439af42a2301236b5843a42f1fd99ecfe1b4134c3de014cdc76035347cc0
+QCAVSy = 03341d80749f1a5ec9f7ac6252384fefd38b6f2bbcdc18febe86c160f5e78c003f066e06
+dIUT = 02689bf21475d32fe71a7355efd9a7787caa9545ebeb853e5184ce42152429051f40cbc4
+QIUTx = 00d7e5bcfac578fcd728180645176d7e088b68d330a209f18b968662fed16342b3921a20
+QIUTy = 06f750b3b5e98e0099b695965aa1d16475d1074f9231127ed703e2696d4b56afdebbceaa
+ZIUT = 061b3bef1766460f6296ed47d39ebf5a710d202d2b7e7cac0f0d3b235405eece99aa30d7
+
+COUNT = 6
+QCAVSx = 062331b933afb4384fa3a4d224551ae8120bc55fc7ea73f2be749e217afc4e1ba79e760f
+QCAVSy = 02bf51c44f8361c3054cad640f92446fe3820b063cf4bb22ca17c0a274fd46f50504fbec
+dIUT = 01052042988dddf470d0a2e36fff5b93ec69f4d240a8e37c064cc4d599467ba27af3c9f1
+QIUTx = 00c7c9ff77e018b8801bddf886702556b126a6d9a1831a1f60f35872e524c134d553e4a4
+QIUTy = 0035d767b58b499d9fb54562c3830411af59e7088a4a3333d5dc7fe5b0f7f1e1c5e3ac2b
+ZIUT = 055d579458860a3dd92ac6570847632f04460755c22a4c432cf4dde9611d2ce1608ca185
+
+COUNT = 7
+QCAVSx = 021e82d6af6d321198176ff8986c2bc786a0081326cc85f026b71b32ac06c0bae6b4cba2
+QCAVSy = 01e9733fa9d29961269420db24edc0d5ae285d78c9ae14b38b1019f13652f190277dc47f
+dIUT = 03bb9ad5fa552d38d1a77cb553c631e2d0940db6b04f0bd7011ea735be50d045da9a9c1d
+QIUTx = 0687071805c25a7d0b1739f7cf681b2f295c4f9d8937351d21d1d43f634e9a57105bf127
+QIUTy = 0633ba21872e379c50e448372b1c0e65e85d07edd712d7dc06fa69a299f6037dece660dc
+ZIUT = 054fa7c6c84fb89e5892d9194540860ea31ae2b6e37a86971344230ea512a3f6c0569216
+
+COUNT = 8
+QCAVSx = 045d62d01db5ef173d0cff315a92a9a105d1ad784ff9b08e721f3580e06265ff538a194b
+QCAVSy = 06b764c1ff76985496b94451b756c4f30fdfc638d8990312bbeccbfbd73e8c5a855adb75
+dIUT = 0133aa445dc80d7d5a097d1da11d510e6571a783b4fb235402717d68ba8fd1454e6b319f
+QIUTx = 02d26e46a6ed9fcf1d2f89c63d80e0172dedb4f5aeddff092836aac8599094885557ead9
+QIUTy = 07d6713974701c160aedec8f94e6446bf7d3c790cbff8702cc7840a7818e5b626271f723
+ZIUT = 0353ff03afda3772984aadc4000e1275656607154b06c3a59c664945fa6fde1c255ffa86
+
+COUNT = 9
+QCAVSx = 04a561b5184aded9c7bd9868f3043b5e2de51908f9c03d5e6b08a3088bcc50ee3203e263
+QCAVSy = 05815b579ff5dec6fac977ba7088b333bf4c0231da021874ee00d71fe25d3f4d50a57ac3
+dIUT = 004661f107a9b570045ddbb0738ab69b1c17a9acc11da5dac7fd864b3dfc36a25282d6aa
+QIUTx = 061babbefee5211c4917506ce5f9f9e3d1e52b2506f38ca096e1b653ca9fb69f46105702
+QIUTy = 0014bfd2ef228b5a03e26230c1e897ad081a704013cee55166ca46de395fc52f5d21203a
+ZIUT = 050795ba093d2e02398c358951f20c9e3b4f60628a96a4d0c46cb8fc0005e5331b38a09a
+
+COUNT = 10
+QCAVSx = 01d7d7536cd8383e1c0b1b8aae02baa9fd2c4e68b21808c1754d0b151361157f81245930
+QCAVSy = 073034da416797da95a3836eef27b1fa271f59a434848e980bad2fdd53ffd1e366ff6917
+dIUT = 0036bd21f84ab9db6f4bddc94635f19f80acb2813da5399e0777832c2febdc71862abe33
+QIUTx = 068ee3245754d51df7780046af39acb407c4998c620bff94fb374faf4b498006eea0cf88
+QIUTy = 0366a449f09ecfbaecc49d880307f57246c11c5bea00af42718677a8def15e5926da1822
+ZIUT = 02ab08d63cdb4be2502558e67eab27570f2d029e7f981d153b973080585d01e42f7187d9
+
+COUNT = 11
+QCAVSx = 02042f5a3fe5e3d3335bb7bcdb9dcbd8716ed18d7fc2ff4297bc1feb7cca310022e2213d
+QCAVSy = 07bebb6c0e046d5afdbfa87ea98ca7f55e9cdbb055d0cc549b4458d6998bdbb345177388
+dIUT = 016597ae6e49e79d069034972a63525a3c3e2d2c253b9e1dd3f37816812cf54ad65c546a
+QIUTx = 050ea073522dbe51408f85f0a6086bd4c8efe572f80aadadd7e70ebb4b728bfdbfd4f1bc
+QIUTy = 07da520017c7ad2916a2719b8558958f77c712d352cff9c0ad99fbc98a0e065eb7ac7feb
+ZIUT = 0599757e3ffeb484b32d3b47828b6823d46786d35477082ceacf3a5a11552394fe58f53b
+
+COUNT = 12
+QCAVSx = 067afdf788f8f4831c3c7d7604d07a5bdc59da42d932731faf5eaf0753280966ab693790
+QCAVSy = 001b39d1d872b65e31251c1f584e4fe3ed75d53ad90e836fe90c8db94fe77cef0bca7204
+dIUT = 015ea8567c7b82b483fa365e8e681c0a635f563a1c81470b4dfe44f194fa91eb7842181e
+QIUTx = 07afe2b22b54fe895c242c20c054989fa804e591970dda8a7ce109d6bd31b6daa8f2fc74
+QIUTy = 060733bd5a4ea9b5ea7090acfee918106b7f25272f3f7cb36eda38bacd21375610cde928
+ZIUT = 005e331af55e96153d8a7b906a4a19016a26381977b49f80b9d70db099053c6a3b8e80d5
+
+COUNT = 13
+QCAVSx = 018866a4fa2f7c2534e563a291de871a8b3052a674f5dbc23b9dea0e8cefda06abc32c8f
+QCAVSy = 058dc4cf1bf985d1b566970847cba6b8a4f40c7e62a5808b0720bbb8cdf3b4531e380be7
+dIUT = 002911d938d9508aeccb9877e127d1b1461acdaed035f20e0f744c774f1c72703b5c4b49
+QIUTx = 0386bfdfe60373be114b417c4dceb443223fde67c0fef29ed0f867b5a15f5ea0ccb4dcca
+QIUTy = 02fac38ec8494cf7576233ec8282de384b67f0ca8048084201039d194c8bda4f6e0aff3e
+ZIUT = 07e132ea71a16c7cc261b9d6ff6fc52cc490da616b07d92f9e591fc1e630d3442572338f
+
+COUNT = 14
+QCAVSx = 000571d7bef056089172f13423a585ab979f4b8f77e752c042c0c65263b476981e5f3157
+QCAVSy = 044bca693e9d3b1a7fa6ad42db7f36b1a65712d09ef3bb715e2640a182f436620686c0a4
+dIUT = 01662f554856c0208a31b195148f828e0b5c92a4ea4c033248bebf957b586b409ed59850
+QIUTx = 07055264c3de3a622d26fe7ad700bdea045d4b3ce718f4e6ae44cf376c3a96a2650b3221
+QIUTy = 00f45cc1138668adc8150d37c072bb4245660c18785683c7b17aa1fb8591ba6cda23657a
+ZIUT = 010f26817098ce1bbd6743784d6fb65e60699c14933a2c8d854027aa58b58db9e66a53a7
+
+COUNT = 15
+QCAVSx = 016eb4bbb3c386e0f42fb037bee478c4c0dbfbe55cc68e33fdb029b9e5e724aff4fd8bf6
+QCAVSy = 0251432f84568a44971e86ab715d3879e614e10725735ef8fb6652d079c7908f11bd1f01
+dIUT = 012c0100a9963ee17d7acf4ddf8e02d8ae75f3b99114f5366afb4a00ade9a3c0ee39a887
+QIUTx = 07794fa19c6b10d399e0f52d36f483c7851848e62bacf95b5af51eca09ad445ee19ef34d
+QIUTy = 06140d2ee16cd0a6cb1960509a7ccc664be97644a95ae16f4a173d9a867015f0837f0560
+ZIUT = 00bdd8ccd1b40c5bc2efc1c105999350fefaf784710914ff639582f1277678699491140c
+
+COUNT = 16
+QCAVSx = 02417c65694d850c7c866f7e11639a5f8718ca9aabb392fa8610e2d5d7dda3375a607f9b
+QCAVSy = 05133938dc99144d16ea7525c3fe4e32e320ed075b96527e13b2a99c9f27ade9ef9edcb6
+dIUT = 0345c276b05ece9e7c86811f8c8af48b22db41d4066275009611b880d7d2cef329c50e82
+QIUTx = 007afffcfa31c110aab3bb394530a41c416af566bfba8f159f984437e799dddaaf8cdfd2
+QIUTy = 065fb3c68446a74068bab7e36ab80e984707e39a4a143f5a46d646342f9f12f26a32291b
+ZIUT = 014a83e747c90aec6101c0a752d92eef7475b00051ecad3d7c2e50cf4eba1ef3c80b8c94
+
+COUNT = 17
+QCAVSx = 00c5d6149f87174ba37f4c1c6f67f6905abb319f526b7aa1be1dd205df930ab1c91bb1f8
+QCAVSy = 00c2e21e1206cd4bb5b622abe97ca3f252cbc68d054a77f8ebabad593fb1863306928bf7
+dIUT = 03afd5affa346b5259697d9217952afcd03ddfec04631bd995c10ac2583b0ca8d2461f5d
+QIUTx = 06b4c2c3615b266543de189c896cff77b5557c782c215961ac7324185fc9a81098f2ebea
+QIUTy = 047fef1960739ae0aee39a3ffdb82e890d4236fc22dad395d490bc3a5eea58e8cd03edbb
+ZIUT = 00afd29e352779a39021536ea50c24fa264c599f8f8fe8f2ccf0615a6547a064d7c1a150
+
+COUNT = 18
+QCAVSx = 0173044e5be63997d7925e431bbf004cf0f0ba85aa295a341e8f5857a120be89d77653e9
+QCAVSy = 0737cc049690f970824a7b0c2022439682c9d82f4f23e48e5f07fea96267ca3bd4d730a5
+dIUT = 03d5771f8485c3b8be62a56f3936513e3b631a561a942613df95140f473214df617c4c4e
+QIUTx = 05906cc4529b220228efbb0545bf55ec03c86f87e2f4e3a3cbf404e07b73a5b1a5f528cd
+QIUTy = 016588e480c4856cd2ee9aaf1e302812fbc0b33f527c29b77ce0f4878ea089d025a440c0
+ZIUT = 0477990f17d65589289c28e54a56a83bc05ef4ea6863c5ebe840925c9fbef64ccd6e69a4
+
+COUNT = 19
+QCAVSx = 068587e69deddf4b55ac51f2a17dd8bfd6f94e721003214215bfb24b248281e75a3c6594
+QCAVSy = 044eee9c702bc4c1e210c7cc214524592568ac0f9fd67d6ea02b4dc3efb42cfbb2263dac
+dIUT = 00e2c0c602fb132399ee9f31008365ea22cc1260f79fe3ae61089b8a6fa4559cac91aec8
+QIUTx = 06e6e318c0c4c0b661dfd3e722090ecd32fdc9ca3d168d9c7174c1d40adbb2ce672d9252
+QIUTy = 040bdc1dbc7b163f7c9551f47daa8294ac2dc4fe0d472c4e2f2cfefc95d523ff59e0e880
+ZIUT = 067a661346fe052ca27f3f03e75bbdfc8fe6d0d85c62c8f79525252aa241ae9de97d56c3
+
+COUNT = 20
+QCAVSx = 03f1226d802c575f871a213b8150f7818bbd625663b73e720a737f071896086da0b14cd9
+QCAVSy = 07d1cb0ce19c98a63aaf7b314f1f5720e32887053384ac0f5eb69b6c471a8e3d3d16e76f
+dIUT = 032d573fdeb85a4da2297896631414518d4ba07dc4dd72f731728890d0b44d36f2309c0e
+QIUTx = 06f6ffea0a87bd9eeb539c48a3fcbf388159862259c7f7840e64809fbedb01a83812c0c6
+QIUTy = 07c795b8f2847fc39fa56c2de1e6cbbf4945087cb2e3b919dc776b4cc1c83e4b1c79b8ba
+ZIUT = 06476b0620eef165941a4507e6d798d6f150ab29333c0552281b629170d3291b2f9b3f41
+
+COUNT = 21
+QCAVSx = 02a911e7e6d2fc770d1eabc7df701bb119084a685900d22d52d598fe1d28fc891b31b487
+QCAVSy = 01b8dc6713ca453e91b2ec4e4d1f834b08eebc7e8886c3a458e70925242c4b22bf0b2053
+dIUT = 00a6aacb5dd3e835814f452d8207d15a533638f70e94f87c06196eff8838d48eed2e2674
+QIUTx = 02dd0093a8d419831f34bac6c60a570c51d08e699b181c964b667d0d17ed72a49119acd9
+QIUTy = 01a91976be5d5e037f22350d67ab7bfab51bbc4fa6026d347d28fb4407bccc40dd10a00e
+ZIUT = 0746719f2ad08f8a8d6d6fbf15723f336285ce75d3a2fcbd5a0c54c577517a22bc264161
+
+COUNT = 22
+QCAVSx = 07541aa51d7302e2bb557c27ec15d7f9c3ae3b76ec2f86cb95e8dead7fa06b578397f1f1
+QCAVSy = 017ea22f6b5474f0f5f0f4ead54172064051538d3e232a530dfca5f2a0dc67746c8bb1da
+dIUT = 00112fb2ab56443765676a1e41b3cb91eb1a6790e964ee900cfc9295636ba4c6fa87aad2
+QIUTx = 03f507d99cc2498e2c7f54fb3c9c032f382548e2e3168fa140125a526048568f3bb3e5a1
+QIUTy = 05270df77efc7d6c55f9259bc82273c9b6bdf3676e13c3601b1b3022b962de1129cb3b14
+ZIUT = 03cda4b5f44b5d3dc248310f994419fbcbd665115d1876046652251ad4aeeb1dcf184288
+
+COUNT = 23
+QCAVSx = 021fb14e52cd4243a520f630229b1dd6961c49bd96f43fa9cae37add84da7ae72dc3078e
+QCAVSy = 00dd638bf9053fad6aa4ff2d330b8a4a20bfe3020f40b9692302d0b0a3c2d877856ec46a
+dIUT = 03e4f1c4f30e2a8d6fd559f7fe8820e886949de87c01d8eb64c7b40f1548cb617a926033
+QIUTx = 05e3fc56ec162885c1291e4ae9c19c8eb2bb559eb7ecd5817549b5a2ea3a66d951880aa6
+QIUTy = 04c004f2ae4db4f748b437bc115e06ea2017a87798298dd6004616fcffdcc7ec2dfd6db9
+ZIUT = 015c892f95768a96ab5a4f9523b7fd466e101f63b88ad8f1fecb3027cd70aa00735dcc90
+
+COUNT = 24
+QCAVSx = 00d08ed3856abef7d4a62243c92d6e670ceb3af32357fdb9d39c19175a10d1cbab36ce78
+QCAVSy = 05db9fad7fc8afe79c8b9ce48e62ffa0d46b805a9e5821e2761c25c0edba92b120b063f2
+dIUT = 00ae7eb3d40354f9f8fed18f2162dee38156cae0535b55370da3638f01668aecf9708be6
+QIUTx = 061e8858e368d9c917f129d932ddc4cca521ff419f1d74230e8aa5b1b3e9ce67f41c4b4c
+QIUTy = 02b0d7fbdc636a3bc34bbdd2a89291b567b0fb2af32383868bd40d4ba4cac9880c2540b8
+ZIUT = 01adf5a96358e18d69fd383b4dc7b20dd646b68a5c9f1417bcf426240ca22b8f32bdf1a4
+
+
+[B-409]
+
+COUNT = 0
+QCAVSx = 0146989a50297be373dd665c45455a2ae4c221da5cd424007bd97f9e8e846f96740f3fa58c3c94129671cdd4d7ea650a2aade9d7
+QCAVSy = 01b42bffda843946a14ad6080f95b8fc6b7e173528d08ed36fe640aaf85aa00fb5edd5905a38b3c7961b7722b77b8dcb44bb25f5
+dIUT = 00ace92103ffe262ac17ad42a46d4366f4cb4c580eff3ab1dde6bddfdbb7374811d52b1fa99320b4af5d4e9208c14eb8efa8916c
+QIUTx = 004ebc4d4acf9b404dabc3af3e8cbea8b88b32999d3ecb7f367b12eb3a6280b840038e22681637a7d16436e014f69616abf72e45
+QIUTy = 009e24109541c8024217e9ab2c963fa9e373640095a6c25a26eefac58e4342c0c85448b2709592a12402fe2b68a793c558ce8cd6
+ZIUT = 01d48a586be9285fa38dd3e70b0330b0ffebd327ceefef88fdc1521ef2fd61cbc9124e03b0c926e70fa56acb3edb54c3c48fab2b
+
+COUNT = 1
+QCAVSx = 017e9f01b1d6e5702328330d232a1dd3f2c592cc409f6caef0708440837f3597510f111954aa51e5646ccf47eff1f07a4f8ae1cb
+QCAVSy = 003714f6ea1fd143ce751e2d85baf54c5523976108ed482fd6ae103743131ca716026b16a1e496231f991cdc8f6db447f5f95f8e
+dIUT = 003ff22f7d7c049989a43e0ea3f5d61798159c178aa792d79d1ffebff8db70ee1fde040a4b5f1ed33fb3ff23c44e7c6b21b0623b
+QIUTx = 01d5c9260e73ea36e4deaaa4b8f4541f678066b690771a86f0dadc580fdb895981e6dd02dd264ed9f9c1763bd54a6052a2d3dba7
+QIUTy = 011a706826365ece28e38b33620bca016d2d9338518dfd6868370476dacb41e3b947465769ebe81b620731673576f77451d0fe14
+ZIUT = 01856c92b46d671d8a7f6cc468efb60a61093d006c95bb931c1fccc336d4a8490fe17fe163c972bac39fe728f24534a0c34d2d21
+
+COUNT = 2
+QCAVSx = 0183ee355a93cd13aff1756a08e58e2195a826298d43f6d07bb1c382b4e568d0080939260009c6afcbed0f23252e01d6d14c6d8f
+QCAVSy = 01b2309b3819c2454a48ad253ac97bce3c79b51f50ed6803cf05464b74a5a1de22113e23c018c5ced9186ddb981c629e2e9db3ee
+dIUT = 0096de2c3929c4085f9cc1d3778c2dbf3db7f0f77e7ba7bbc4e408c7d65e2c8b88b0755f160badb524e7697c50e60c8d99e56da4
+QIUTx = 019c47d79914c8bdae754ec5ec1e81c8ff329a938e6971eee3c945c4ebf489e14b15e6135616c898c80b7b06b8af67061c769ab5
+QIUTy = 000088022b4fb0e754ec4fab8cf4fc636255426755fa99b56805c15eac04325155dccbfa4145e161c40f189bdbaa3dd3e0c3d6c9
+ZIUT = 01972e225e08b47512e92c0da9a1bdddb1802be402222cac5788b322e101feeb06b66b2fe726c1cd8aec92e02f37d15f4c97e64d
+
+COUNT = 3
+QCAVSx = 00e85de9d63e34e5c7bba6ff9b16f4c84d95f11dfe92107b1fbecae98ce6eff3db96d86900bfd22cd423dbce1e5726be8e597933
+QCAVSy = 00b7141771f7c816d55ec8c53822d2e7a192fa54a17e5b99b2d90961b54a99fed53aba4bda1a4074ad3d23f9c911205795b5450b
+dIUT = 00abd5d61cde31180301c269d52af856baa39b89f5ef45367f5519210c71d77b318d053ec0c2f49bf46de05cabf23c7d2bd7d23f
+QIUTx = 01a7ef3d17c301e8661ba66c1cdee82a9b44d716909e3663b423dc06ef6be4f616cd179321ce7a572da4bca2e89b768edc8459b3
+QIUTy = 00df743849a20bc3026062b420d3942f18e2d6c5307e6e1955e33b09d5951dc59b31a2b1d58c233e2c896e2d9ccaa8eeb8e8f113
+ZIUT = 00b6661a866abbf1843dea8f220e360fe7cd7d9e85c316138fd2532a57d7d2a6bfe6e5518019c603a2d0e338ac6a8690093c2883
+
+COUNT = 4
+QCAVSx = 00ca870acbe4eb3ae65edd95d6944eb090e0e550712be3b1369e473203f52b1838654f7a4342bd8309704fed6933ae9d162ccd7d
+QCAVSy = 01796cc286bf3d53ad636977374f8356e45730b7aa43805fb52801f73be3e9b32808984aaebbed7be5e39e51335b0dff34782948
+dIUT = 00f323c8ee433c9ba15d3708069834acc4d937be5017e1d182ec76466aba282c73b5e3e96fe106143641402c72c62484ba1f12f2
+QIUTx = 00b74f52520119fc08536cea584220de9b062401e64ff6359305c2e6b0c04a95f77baf53e23c326aee76211495c30b2c150b9275
+QIUTy = 01540588e2fd5688d1b35763908c1f823eeeca8942f6216ce04cef66ed6991df6a22fb74411b13d06513a65b64e62815ee020697
+ZIUT = 010889037c707d90b833d03256ff2e8a5ffce16fb3613486221494a4fee82e74625a93d966c2028d0930115494f9456cec4d2b6d
+
+COUNT = 5
+QCAVSx = 007eb61dfddfc3c0d083fe2213967986381d9e30e684afdf2bac8f1a362e8c6d6358df95930600427dfc1eb14118fd1239b67b69
+QCAVSy = 015ba87f98114cec8b2cb45bba3dcf006b287e07e3bef1da27ce08da9e4f48bd241f59a1f9c93c837884715750f4085f913f4f7a
+dIUT = 00133da2ba54b36244c8042f0e2da3718e56dbd2848ef427bddb24177f624475b53400afdcb18879e8fe6b4609a4f7bbc2152b13
+QIUTx = 00e3a2f4e63cfbc1ee844745ab3e1e5be573204609aece5e28b8fb8ab8ae06898467a95a7b59c0898a414abff2703ccbcdc09209
+QIUTy = 010d73c43b630170395104acad6c1a563d3296632332a1481ddc2c31836bd1a3ee1a7364d7f5b8295db95a3745b4bbbeb8095bc2
+ZIUT = 010a8aafbb243fc9466bf381eae173c01be95d88a9c131b07ed54d2f117cd3af4019ffb196ebe8290b1269622f9df26763ffa211
+
+COUNT = 6
+QCAVSx = 0082f148ec34d1d08b26e79e3772e12d659598b73b6fff0bab1845e9a5b5071449ef2759fed63aa80624b83a6b2e9d739b83f6db
+QCAVSy = 0109cea048a720ba749fc522c85af5fe783751c39fe8d0515ba0f0d3dcd19f18c22da3909f02d78735aa11b2feba0f8d330c5703
+dIUT = 00df7554c0132fd4e4a2b9217875f9924a55cab319b76a7c179cf0222937579996cf94920bafd453e52f5d2fc48001329fbd78c4
+QIUTx = 0160851cff947ce72a118aab4dad4ce2c3ce9bc330ce1d06efad7f630e45bbcf37097d94051d9d310abffa8d96ed22a847cbe693
+QIUTy = 0079a3ddde636bc62af41e6ec0e073fe6462e38ad4b9e3a36ecc8113a2c6394ced21abdc8ec5969e58e009ea13dbe929a96709ca
+ZIUT = 01e17b8844c4c757553a628d6f4c48f3a337ed2bbb6e4047dbfcfbfd02bb81c6e096f8ccbb7f2e5d10ee9cbcc960e3a99e79bd09
+
+COUNT = 7
+QCAVSx = 0083ca04df8458e5e6ce6e13b937dab498521d826fb9541234567e995f0683c80f438516eeff0cf8918a5f8b5262ccdca3997417
+QCAVSy = 005f8b3c20e3fe2559efe0e85a12276df922ef0f4257fe703be2529f6effb6f299a1a251c01e38d43ca6ca576ef1e0beb6c9121e
+dIUT = 0032735dd7f118d29f9f3cab3a072db8c886d42fa5de7bea65036ed3c8d44a11e8f96f4e1a6f254888cab214305191a26dd1dad1
+QIUTx = 002d39e0f89fb875151ee3b354f8ea159e7fba6f23f8a764d49e07ef43f18d3cf86e1baaae0ad79d4000709a50252f1ce3603135
+QIUTy = 00ce44a9b775b03cf42b310249660794c25e0422b03ad9babaa23610613251fe0e54046e04f9210436dd376003d18f98dfdae189
+ZIUT = 01167edf7a3c50e13be126eb2caf6b5f8f761cc8dba413246423b877df74a3aa3f48144b44cd133ad9f2d05ef97a08f7ca511d7f
+
+COUNT = 8
+QCAVSx = 01311536a9745b7475e6c2fd724c23d9ea66803a139b47e3ae263b0fb7e42e3316279bbf622ae262531b2e2283ecc1a6127c9b09
+QCAVSy = 01d48ccc781f0bdec3130910044b76909a9abd7fcb18407dc42f63912fa2667208003ab2d28102adcfb93ddc053760e53c2daa78
+dIUT = 00b04f33b68799630d62f44337c77c5a6b6e0f7606b5c87244aa4e7da698cc8ff1d3311b48ee7c9a6812baf9054379aeb61c0c13
+QIUTx = 01c5940c2de2b3735824ae2994c15086fa958750e4d83123af047e9b3c264746c9b5d919da215355d8c28b2808a37d0cc5f2f6a1
+QIUTy = 000abfe6f1510a182eff78dd802e9ba21e668aea5732c732ddfc5df9301f5899f02bae80f8282601ef3eefe414ef2c726fe00258
+ZIUT = 015c0d202bfdee2dfbd4be91625171992e6c6b1a1d06cc1b2b66ed64c9d928bd4f062912900d3f89045c7190f513d3b019a634f5
+
+COUNT = 9
+QCAVSx = 010c273530f54fe174bbbd5c2771a55a42e64050c3bf2523e6082af476eb025787696edf6e438dd056b598f5000633c264fd7ba5
+QCAVSy = 00443e72da93b0c7825f4223c796826fd1322345ea25adf3df1a2c6958908c0fd9b13e93cc005f4ecb155a2fff7ac54fa8180785
+dIUT = 00d4ebc31c9a65ee3b1abd9d6e6495780c54e633f5a2a9f61c8408d767d0916d91cb54cfcd937538df92cfc45938e33b77d724f2
+QIUTx = 014dfaaa70518f367cdfca89795a0db374bb7b407a58caac24ba46824dce78501067d7e0467d30b9e1fdbb0a7eace15fb0c208cf
+QIUTy = 019d62be2b12a17a78f6c9f7e703669765f763c6235fe7af78f25044e99c4b1b90653640b3f0ae481a55d47d1eb17b86c5bada1b
+ZIUT = 007c32383aae80e1111207894c8cc5be66fe538af4a19195742a94a4c3f5c765d9776a56177c485ddb53c038b70478959d374627
+
+COUNT = 10
+QCAVSx = 013beb8d36d1e7f53d80beea33efc3e0098deaeaa17977da8f9aae9c576e7920e8f6da55a20930ce60fd490b4fb0154d49277d99
+QCAVSy = 011dc1d87f352e12bdb41a1b7a1f1e516629ed323c5d5b263ff036f023f0ff5f722d056c24a411f53b347d0786d84f7be879105a
+dIUT = 0026176aaf98a6433566f1dcc1919e94453e9cbf3c97e069b4a17426449167f6a1089ac16a102a4b3e432a978bfb46255dc43d1a
+QIUTx = 01535fc949b49030308bc0da9793d57088766ac8cf22e8d6c276d8f3f7650f30135e1f6c00300c1344e2f0306ea0e270b09a80af
+QIUTy = 00b8fc3fa61dc22c55501f2a6b2944946d99f7bbfefbec7acf4fb200c1002e322c39172ec0a2b6ce0807f1e3ebb1ea3400353143
+ZIUT = 01166107ab98db1dbe22c5888a70c992af4faf4623ef593802aedfe433809c53ef4ab0b2dc4dc2546488b356ef3265356055d8f5
+
+COUNT = 11
+QCAVSx = 01690c74649e92e1c1004f43fd6e4690be595904c56d2acd85a49af0a17d34368c8768d039ede9c92ad26b26306b5ffdef7bfd19
+QCAVSy = 0081275f7e2ff068a6c1b92dd38c034256ed7322b027702994c74f5b818124d34a190987fd658892fc99e7acb9877bd6fe946919
+dIUT = 00bf3e7395c72aa84c0960e5c69022ce39067404534473c4c7829424f81f1d44b31f20e2b982e251cf9ffb327a7d834f59d1948a
+QIUTx = 011cbc4ed9036a27effc89ffd55fa1e3ead0fb93bacfa0a78bcafe3914ab1a97860fec1334caaba07243591603e67791aea4bcb7
+QIUTy = 0101074c444627630ad0a5258e24438d71f26ab94d05bb47d1ab97858c4b92c6ff1cb9be66b984fe8e16e44f393e63f9d64281c8
+ZIUT = 007e7a249094eb52bee0115b8bd5545f81bf0b7d66998fe124c9a3dd3c5715d03b2f973d47c19af5108a2ae005fcca65e61f337d
+
+COUNT = 12
+QCAVSx = 005c24f4ad9bdcb1460685a22da54dbddd1507ef6de469da4170ce30147579a54945dbb1bce9f02e470033bb15fc1a70f831e79b
+QCAVSy = 017ca932b90a08ca2e3f55c50cc0e13d279d7bc9119c573c3f741410bb7c1cad1076c3ba42aed1ce69d56228b082fb6de0eefb68
+dIUT = 0096d403b0fa601c9a75aa7de9fe9e11d42efa93d96dd35102da05d3ac807e44194e18e79c8b5be11c5fb39c8bd4e312325afaf2
+QIUTx = 0009833946294d4aeecdb6f7254ca489c0ff13af2dc6e2ca5626835d5dd22241440c37a63690cd11867581ff61b7252d07afb8ff
+QIUTy = 006183fee6f4d6ef5b723c53c96c5c1ecdd84652e379c937878d766f83370500412359c22d4778bdf807b3c84e5b83350910a1a9
+ZIUT = 00b9d8b68642b2729340d8b7c5ed3b3a8913c4a3f6b947473017c0e105bc7edc60daa9b0732772220f93eca4878085f756e3adad
+
+COUNT = 13
+QCAVSx = 00aabf6aabb3e90f956d7004ffc893c70f8e90cdc31fc0c7a88f16320541d58443af39405d888d9676557cdd394b27dc5449f945
+QCAVSy = 0127f26dba06c33f8fb45d955cfdb5cedda93dd8a45db42ee0b9264a054c16a87bedad45c0d9a0f35bbc6aa7a1295622e83ebe8b
+dIUT = 0067125ec309ab5dc7ea568f8815a2b30cfac3366bb4f0160d53738ab995ce75681fcd5e492f3a9725b4cf75ba4301a786049342
+QIUTx = 01f1d1aee5fc594ca4a22b81bad707d821bef3253966f5d77956157483961696f4c60476a42b452b89c1ecb3615475ec9c96dc87
+QIUTy = 00755c5ef55889b415cefa0e881a3efc9be86f36c67615423b452eab4cd5611aef4198ddb31aecb434eeeec12edd05913af19fc4
+ZIUT = 017d60394c7ee64ba73db91484713370daa821255807349c237e5849411bf0bab3a1b353be3cd07eeddc5c2ffc74336225dae6f7
+
+COUNT = 14
+QCAVSx = 001f4ffbf22f67c1591b0a770e563c0aba66fe01561c5e227e522b5dde23c748cacf8f4a02290de26b47767d388a5c836d3eff4b
+QCAVSy = 002d273f2e8516e508388f8ed2015ec9fe67c66f832cf2b261dfad5856128042fb4a61a91a37b341de4296d4bf63bf67a3458a74
+dIUT = 006b2cc2387f69afd43978b7f66bd17666257081ba4d66ee6a9a82b7c87c4ac5f0eba6bc2d981ca1da9ff202ba72cb7fe9c06cf0
+QIUTx = 0086a44d6ee4e8c50d1e10d7d1d113a9610750210679e0e4cab8c62267842938ad5d933c980eef9d4644791bbfd35bbac649d213
+QIUTy = 011da63212631605fea0e93f5826b1929b2bd1db950615fcb05eb47bd9cb69eae03b1c33d7a9e47b335a40498238fedb8999b04d
+ZIUT = 00b19e052edd44421ee2f5ba845911fed9183d885da85d51dc819ca565ce574f7db257509876377b40c5a08349019563b60e13e9
+
+COUNT = 15
+QCAVSx = 01b0833eb3440450e3fa5148c25c2df2e0020626f2407422217e4ecb8bd8a751a72bab2ec5642ae90fd29d8c4d79e9cc191b5ba5
+QCAVSy = 0023078905b6a33009ffea1a1977db943579afbeb871970059696b29ef90dd8461776b343a09c853a538e4f22fdf854fcbf3b734
+dIUT = 003e098f3f195e89da71d6367000f804079adca3275b2e793e8d312c8e402cf0d0ce5331742f87515f4dd9cc668246194b9572b6
+QIUTx = 010af4ae334ba40bd6538e0f095aa56f61a2bd2b5f38e954b7617d92ba10603cdcca836554d0242ddb37d5e1576b0be69f0eece7
+QIUTy = 01b335521aec305f314d7f23ed28cc0c4d23f33a6785fc6c6de93e5fabce271302f9557f6d2ae77c52720eda5a2e15436443dfd2
+ZIUT = 01697512676ae56ff5ab778c411042d217ad24a24ea05bbc253e4395fecc8a07fe77ae0ca4ed977459f1a14d9b83931bccf46107
+
+COUNT = 16
+QCAVSx = 0174bd233f861c7b853cca8f5a383574849ef2cd76ef22bc0e159f713a1d07387c4203b11f4c339b669674fcf1dac199703beb07
+QCAVSy = 01e2c778cca64963d87329e57c8bc96d0f6737041fd087dafc07dd670e2ce725547e1a261c43fbc54e14c3473ebdbb31fda8473a
+dIUT = 007d849313c6499dae472b0bddb76dec45806f82e098723301df33b6bbb97f794bf26879fc33c2973f86c1551549641a819b5711
+QIUTx = 004812af1937630b8ea7d0ff723cbb05b7a2740fc4c9be792db204f929674c32e47d85e4770b903d3290a6d62c274cb257b76837
+QIUTy = 008c6f61711786bf5c54eb0c1b3126d641b24a6662b67b257302a9a61aa8cd503846bcbb1b14fa5c97454368b6c27dd2de2ae80b
+ZIUT = 015960ea8b92bd77d52874e3ea82ed1763440189d68728d3974d4c01d6aafdbb5274648f6f3eaa4faf3fc72d09892ab038cb2fb7
+
+COUNT = 17
+QCAVSx = 00c1dcb737d253035bb91d2a4a85f37d00142be81fc9278cb23a4d1d79d27c8d3c4440b2c842bc1e21f6924e14dc831b0abfb845
+QCAVSy = 000c73d5687b0490ccc07f654101acddb36cd0c2eecce165df276f83be211d01d30ff5c243f0900572ee6df07f539df6a4689b0b
+dIUT = 00bfa594856c67c2836b7fb171b67c7a41ae43ef3450898024a9313654fcf31e1e1fbac7ad52b2bc4358975a5c61ab9f4e3e4e9e
+QIUTx = 00e1b5309a44800a916ad8a4d19b82a58b00ee048248050a6ed6c33ce1bc9701547e93d7c9042f8490654b73a2cd7d73f733c0bf
+QIUTy = 0180b20338746351faccfb9a3711a4e138457550bbf58316034c6f216a53749263dffe2359bddcdc89ec6446a9a4a9f4ef90c86d
+ZIUT = 01127491ff33a67ffc4757416cd02a081cafb723aff52af35b069b89963e8e3ef5bc19c5a093ccf511e3c3c19be789280e986809
+
+COUNT = 18
+QCAVSx = 013d96a267d1a2a9ea83aeb1b01d8ace22e251c82f5f5fc3ef5997a3011a74a10115df60e98d139cdd360e74d76fa522eeb56f4b
+QCAVSy = 016b655ab7cd0d39f588fbefec54e4f45047664c8b3be8e57ab113770f5fe0c62300f4a09fa2899e73bbc9823265f55d5cf4ae18
+dIUT = 004a020e06c400ef2498c111cde15087cda48a6fb2ecc01d985b57f0d3921920e92c43f3ab688129dc01ad29fc31d68e9622319b
+QIUTx = 0167227f62849594ed63f247f780b2d11dd9a2c2c71bd6b71294cf8b59ce690bfe00da9bc1db8d1daac9bff8c00e7bdf071fe0d3
+QIUTy = 0136c3ea77d093d9739fbe6891318b14959778599bd1e7d5a97bfc82ffe85fd5a9a01b82f72e11fad96d2f5cb5798f59efea15ed
+ZIUT = 01254508553eab09fbc2fafe13fa9b324d9217d7d0ba4cedbe5dc869ad68de4f87774dd17d6428ed242c71956f252969e6bd5837
+
+COUNT = 19
+QCAVSx = 01787b30b3b204e298690b9d711ffeef167adc5792068b5c8d422ec90f94c2bdd284cdbf8bee642f70bd7be2da906b9edbbc2cd1
+QCAVSy = 0043078f912110290a13d90160f0e71582fa39c0e75d8190eb811d450220044cc6d680d956a98860e6fc85bb86d65990a160c5b8
+dIUT = 00c19b391665f50353547fc72c9ed019f5311690ee41e7c895aa7ef92c60fb9f3454dfac575245a6869f1fdec745d63ea56c8922
+QIUTx = 0053a7a62a8b4044b60af76efa5b44429bf65f65987d6a062163dd55f08dc9a91b8bb9b6270f8a026123f99eb9372ccbdd27ca3b
+QIUTy = 00add46f7ea7092f48ddaa2feb96cb24bf92d2628fb6e4f7cddf523e5f84011cf8aababd6009a13f29a63b6b7ee664c66f3829f3
+ZIUT = 004b9accc21d7122835fc21410ed1d83767c47a54ffee5f0c180fc55f3d0e8484af3ad38020294be92f02f0ba7e2b4f4eb1db07f
+
+COUNT = 20
+QCAVSx = 01e9da0ad1a15ac3c431f220954ed2e502af7b746c3fd57b2eceb7748658020a095664878354df0aa181e57e5ead2c985ad3023d
+QCAVSy = 009cce73a54708348b48f8f3f674bb7654f441f283d4e8a4ec8f8592ef52395f24c112d5942d3ae08ffe8d999efde399888a7cf3
+dIUT = 006c9098b53d10f2ac0284a99902658f667ea4cab28698af3fa07006a1bb46363b103c4aa4c92c1c3fe7539097fa70b8a4fa46c5
+QIUTx = 00d3edf652f43f9c9a92a2e4d34ba83f5d7e950c28346a2a6851bf75547050140a4e9c1c1b500e1d2ad364c306b9a44af503a621
+QIUTy = 0099b26c64367f1903da95df51562d25042c01a1adda75bba58bdb0d8aab350b52ecfbe98488c2619de01cd70f5e008953bca547
+ZIUT = 0093e2581c159d74d11f8667ee03399208b5c1a4ee5b20070ce8d97d251ef1236dc81dd688b2f07a730e6b8aeca0c193a28b178f
+
+COUNT = 21
+QCAVSx = 00c49294fb712942221a2500324af7bd8c7ec1cd1b8094ded1bac0010a8696083f7efaecaa5103d6762499e1be4857d320030281
+QCAVSy = 00564fa1110b393925dfbb24ba9a6b3373f4624ecbc3e12f9706f3ab0542992d8db6c8d8bb25fa0614d486f6d1ac9f3d98b9edfe
+dIUT = 00a7fa38a8ab8030d6b497a23bde5e5007e39d14da9f82dc564ae3cdb4af5fcf41bcfef7adadb59171e6d7d3d3c3ac67f7be7073
+QIUTx = 0013bb3ba91d5d2488af572d995cef8fffb1fd85d113421e8d2c0c3aa97cdb8a933fc0d3f05f4646ce841ebdcf1a98604bffa3df
+QIUTy = 01f2e04ea16a012d4864cf2ca7564846de73a33f24578dc4d221359c4f2f86ca823cb0596bfe4760e9eadcb4ad508ab1a171ecbd
+ZIUT = 008e2f1c4bad19c46a5134afccf7f4ec14ab591c8b8ea48d9c3d1e7354ab43ba20aa39a65fd92cdc176cf3dedecbf9da49a8d855
+
+COUNT = 22
+QCAVSx = 0134add2c499172df792d94a9b3895e245b84073c325263a858c1e9f7cf30a44f268d3f8358411dc0a9caab505c0abc016130bf5
+QCAVSy = 0031c236b143ca036c883641f7f9b957f4f798a31667c41560340279fce0962a21bd8bb52fa23db71a84f35a5794ef5e075972dd
+dIUT = 00ce9f827bd24c014c3ee59edef747178d6c030c19669ad8e718ba1302bef4b5ad2c1233448f5275b29a896c0b2e7b0da92068be
+QIUTx = 0176e31012d9c604b2d1a1922a28d8a574f060cc36388b2816d2f8117da20c0699ab0a08f76fbaa476f0a9c424bf4c952b4754fd
+QIUTy = 011fedc3e8f8e828e0ffbf02fd85d29c0201fd0f53bf2614c10ae51ccb58cbc4900c38cc4c9a52d86d89f9b8c2de4e227f4e228e
+ZIUT = 0190a1693eebe287ec980236d8762804d23fdb6f222763a0efc364f9280fdd53394c2badcc51ff09557f3b97cae7f70d790bf9df
+
+COUNT = 23
+QCAVSx = 00f0ec972dc9fdfd08cd8dfcba7298b4df2dbd80c20b2889e663ac58cc348cbf8f9ffd31ffb50618d6c38d72a99d5c5d2eacc001
+QCAVSy = 00bb0b48893cdb915e65cd5d797804802017a295343654246a37fe3a60d7de987e6a9a10aaf063d96b10184612ccd26407d7e03e
+dIUT = 00e36f3b9a1341995b13fe70bc545d279e6db1482c92b13ce8cc0da1c100ea2faa803a64a58cc7eb1cfd167570835c522f659347
+QIUTx = 00d1ca82393b8d50bd1898a909bf39333eca3bde98b0b0dced66f828630e69e6eb128b7cec23f07260047073260a765331dd6f57
+QIUTy = 006c535ff943a0fe750fc6c39904a6912ba1ebc0f46c1b0823e4013c77475ea29b3f32481966f1b165bedba6c17a1494fb6d4f3d
+ZIUT = 001469dabcf2210aa7de0040b201221eb4d1a4725431fb5a93212a66ddea4187e078f5e3d82606f6cdfc0ffe6b69574d1d0ba643
+
+COUNT = 24
+QCAVSx = 01378444e0deecff3aec5ab6e74e8123ba98d8b91a507cfca0d85097aad944c15b4fd89c8cbe2c7451d8ec641045421b4bf6978b
+QCAVSy = 016447c213c9035de7bcc29bdd61d6ee6ed5579c36bec56bc6b44f9286bf9e99fac97f356708cd0310dbf6338f9af8d7b1359102
+dIUT = 0008a06716ed6f4cf728f9019928f367c77a9052490b9a8ba87a59cdca84e77c6a299853f5496febe652f4ba333501c4fcf2ba2f
+QIUTx = 00a045b5e6bbb7950495f6d5d645a2b7d72006725d0223c7ff75534022c9260ab0d2d8d333789a3dccfc3a89502ca500bd0c1f61
+QIUTy = 01ec556e1b1621ec1893654e198d5923e311478a8bd2ffff280c9092ffc0737289a997492b6e9ebf931947634ef7f43b429cf36a
+ZIUT = 005c701a93d7790322aa7c67440fdd9ee8057a0dae86d1e856ae89e7893da178bd67777f86db2be5c8e31dc50ed8a440aabc342d
+
+
+[B-571]
+
+COUNT = 0
+QCAVSx = 03b63f5fa112ae6b5f113c765144fe4cbd6020e26d400c11609a3a634b9a325f416b0e3d3215734c68a1c2c8fad1d0bb9eb3939a41af22421f68781e7eb0664b9df5cea448deaa3b
+QCAVSy = 008e6cc77bcddc816e84cfc1f626824fa24d3d5fd33d8093cbfe1fc4d881b63b494123bc759670edcb1887bb3b9d5a8b516bc503828163709d4dacb594d277a15a92c064e5770d1b
+dIUT = 0344f22be87999b95b2287f67430ea8fe646c62fe38b7ce61f1f956597c27bddd9902e20d4436abf3bebd8243ec29a00481a8a2c19f550e99641b5f14aafbb5bda953a7559f8653a
+QIUTx = 06af71fcec1a2904116fe14878663764c1ec74870e5d2d53919f0b635912db80dd5460d9e699458ff8494c5bfc74fba8d3b12f65f015e8def10de33f1800191f4cb502d21938b951
+QIUTy = 019584177b189c6641ffb678b6d7833d8d4bb25dee5018dda4e4c0d219048c01cd0da9eaffe346d53cf1a07b33b3dbdd4bc3acabe4832f9981eff2660991aac852147985eea3a51e
+ZIUT = 06775e1b99a236e02b020bc73666e5751c1210dcb6e9b02a69f4075376e49f7a1476d2209e861abb73f5e3ad189d268e035b1de93d47b3a64de5783c9a09bc223e1cc612f26dcdf1
+
+COUNT = 1
+QCAVSx = 0575cbb059f423309f993b6c06ac71d7bcc5d1e6a19afe72811cb612a6238c9ccc331e67da0c10b88cc2a5f1ef2ff6d6b744065d242f598da2d6335d4c3becf5c3953940c60efcc7
+QCAVSy = 06b433652e3a36a07018aa8ad3d2ff31ed785ce5601716eff7710fc13c6ff9ff75c7f3701d459fd8fe70c0b4afceda08681717db9821d8c858fd39e274ff37772f8e84856e706745
+dIUT = 02f4d2b7e63660e6c20949e06dc670be8aaf82530e0b6eafe21011fe9d0f4407c8549515734528cda299e9fcf738a97fbf43c4bba26744b327531b40143e158bc8645909ea888456
+QIUTx = 06ea711827ad8ed589b709ef35f6a9cd4625798bd887e5fe59c51f0f41c328b7ecdf84736c43fb70e3986ee5e5f986e009f641158a75cce6b39f53a8bf0682830194e4007148deef
+QIUTy = 04c6b9f2a6099fc0367fa9609394c3221ad8c6fb111d2bdc4305053804788d32eaf76431406e768a448cb5c8e34c81225eec9015abbd92725c002712ed3192d807b36afea853f722
+ZIUT = 03a80ea8cfecb858f9b77bdb46b6cda26320ee8c561a2fd6b7e0a2b62201fbfe60f577780c75a98a11a69de4c4ee911930d2200b6972bc3123d7f278615ecc65984a59fe352a1cec
+
+COUNT = 2
+QCAVSx = 064aa66830ff44324a67ae8a907896897b507566cf52dfe13e3adbb1e793665d2b718358754efe809e4496218502feb5604dbfbc04a1107ca9ec4eadc7d10a9d6d1474cedf578145
+QCAVSy = 06f63f69f8c18b67f11051b3d30236a1a249088b2bcab5cff830cdb9eb3e75c1e87252e5d8e61bb1a66348fb681e962d65abc54d5dea2dd72c554590740074f7c66c4b8dfd307561
+dIUT = 012b6313b56853cf8d0273049cf7ed2ab8e632e59256ed043366857648f3f2a9674caeb6fb0fcd5fbab0bbabbce17a0fc4a78148499c389af57486374641695b0e852f3152eec724
+QIUTx = 040a78763d170459dd34b5c04ec782e698cbe903a5a348551c5248d9dacf19bcb9a498ea05e80e2d6cc1f3ea5ba3a43855b801c8c0356fe3e29ee224bb91f4ed0c85678379b72542
+QIUTy = 01ff49ce0a62e9edae6aa63a9848e44f185412d0feb46b87f91424bdaffed5168321ed76f235f75d33667f6d7d6a9c857bb4f85442fc40f9a20c04ae06362a46eceea15c45d69beb
+ZIUT = 03edea7e47ded7c2ab1115f4ebcbb42677c7fba6e0cfd811602896251ada1d5a0b461aaf4e000f4d4231b96d8dee7630d9f1b7860e6418dac8c3b07b66af6fd1acdb44b2683b29b4
+
+COUNT = 3
+QCAVSx = 050671af65cbef92f305e5facb4288cc04a4c6978a3b78afe4049c6a995fe8c3c0bb609abe49d152b1eed6c714d254fe6eff159a9ebd24ad16919ef76f4470057eb7c265a4bd96e8
+QCAVSy = 051d08e21d264d8e4dbc73408842ab57cd78d323e7deb625b3741994b8affe01af4461622db419afeead045845f6c3db6d982f45b692bea11cf25d18aca3c83bec840c7582a7062d
+dIUT = 021997b5481c0cf6cf436bfe360c3b119b9e4dd56f3c2847affb2021cbac4b57dc18f5075d678af2ba6e9eefbc4138d818053f2df32a10e8ae5d6409f5b2f1f3cabf36f808fdc07c
+QIUTx = 0560cf91328c26bba13f71c9b5dddd05c185969d88bd0e9d34a3607a923b23a5b675452167003ae2f0add5141ea4be41ebae91d3a6aa15c393dbf585ad6c9214b269e86b4f054bf5
+QIUTy = 02e32ec240418a9a4f9017e632f8a77897a2233d6f1f45b8f7aa818f847ddb3ceab5a5a12c754fce8d57b0320a076b53441dcf9f65ef3204e089191ef156ff762294897a72fca932
+ZIUT = 005b640015330f8416f2bbbf8b5660e01a7abba8b0197a29e52bb535d62f89ad0443e08b6e0d1d15f4eb03c0fe35e3e43bd7739cb692092698a2cd13126cee4432831ec7423b3434
+
+COUNT = 4
+QCAVSx = 039ac9e91af594074dcd338da4f5240574f01e413a49b92246ba3d6de855e3dedf6e7fdeda9ab7f7f8476e770ce9bbc3a9a5eb984543dcc37f5f11be6e28a1d1090931f5c5b5a351
+QCAVSy = 0780d32dbb134899bda2e98848941878387aba6665fd24252160ce3123f68f9b5bd8f254a38b84ec536525fe007a863b6fcc489f937a05a5fd946d62825328a09f83a7cba27fea5e
+dIUT = 02b539acc770758799f439670eae85b9ba34a8b4f371cc935a20ce8c566521eecd8c4f5aff116ae0db2ad6eae1a3384434c599379821ad05d81ada0548299dfd98cfd6d3f1573524
+QIUTx = 06dae538c820443977415cef4e79974ba762b69b434810200cc6fff326a2344cd21be19c153642df82a3e57a5531a8bf19767e1995d2728fcb661d58ec561ef23a34d8607971490d
+QIUTy = 0504243c792b903184ea725a947ca89218ca9c8fa1e09a7dd68de88eae90f9bd2a8df414dd69a8b2b1a2ded2c6d7f514c8907997624eb0bc9ea933a2d474ef8f83baea3243834de2
+ZIUT = 027af05ecd0332784d64b0b1bdb45c310fd445c5a6d6b34f35f4eaa3fa3e171ab98763d243a1dedf46aa29864620a47d05eeaefd748186bcbcf187c01e7ce36e2a53ded071036b59
+
+COUNT = 5
+QCAVSx = 06f6588491060a1e88148e4bdee38bc674713fe384d7cfdbf5bd90c9dbb6e1587e459dce6e0d69b8b2cfeb5055bee56a73c13436060198ad4750dae8253ea839a2e246d541459775
+QCAVSy = 05b61b8f7d8d6c8162a2269e7287d459034b8faac0360fcf99fb21da34a314e6735319b9d03626b9268369345f3a624acadb219b207188d0e945cbc67c982068d32613fc21f8b0f4
+dIUT = 0318a96e382782d4476f1bebf697a1076f22e1d2ec84747f9fc42505d5547daaa08d814721759659958685cf4ea4bba12fffb66af09f6694521f11c09b6626c8ae52fbfb336a52a1
+QIUTx = 06770f2fcd2e9b7f8bc5c292d283abad85155071fe37ef7ce84f34c7616da3dbe1bdce9ab04cea7bc4bc258c5d2ab77239d3d084568b2dff779988288d9fc6bb364f519d0e855ad3
+QIUTy = 04f6a1f4e5fe00fe9a25d8459b88803988ef2bf2fef5a23f13e7a7e7f3459abfc3d5c00303abcc5080fab81b09d5be0320ef990519a06af13c29562ee955715a82cc0daef2c5e0eb
+ZIUT = 0763c0d659a7c080912005a2afd60ce57e610619b388ef3d5dd3c9386ab12069c6ef3a8e72eb741cba2da5c6f9267f6c09fada6459690ed4e432445d6f0f72dbcb059c87df36f665
+
+COUNT = 6
+QCAVSx = 05a52cebf68103cab0266cf2c689c48f080549fffc70db9809c2a46f908b7289be597329f39ee1e4cca398664ffa9bdcf01293f43593d188e12411d57e559b3f6a30e9554869f049
+QCAVSy = 014e137165fb0d530e8653d7cb2a84618dd3afcfa3f08560179142aae972790ce746a2fd4469d41558744378c640ae73a489bb7f81cdca6b1bb167c794c26d6238a0d256afc3ba21
+dIUT = 028b4319eb7054cff6382820c52f9c332eae670d1f07cfc8f1472e9260f5e47a385768016cd2006700ca7bdc5d1d567d92460af7c2a425dd0d78aeee3d15fb28d71167e6486b81c4
+QIUTx = 05b1b114cef13aa5df306ce74197d680f9b8c9d8f6753a09db88466a6bb04eaf1eb873836022d7504f45fae85a8e4a5417edd7ce3a0e5eb9e79264884ed783577b3fc52d825f0b57
+QIUTy = 018e3226e36b4b336799c4684bba505e984dc8819166f17ceb840e36125b283a8c8635ddf7e770406d9856d82b37cff1fbcc5d3f5cf4b55eca41ee131f21ea7bcb19ce05f6564245
+ZIUT = 0428413f2d2aad4d5288885c2edc8b976321ae1dd4fc6b41275fb88b8c5e7776165effce79025163538a0e83c919220a407ead6cefd616b4b05294488c2ef5d30ab8caa55ccbd1b1
+
+COUNT = 7
+QCAVSx = 026e2f1ee64e7958e902547a7db0a1e14866f3d2c0127c2bb9b09ee232d3d9518ee44ae8f5bb433a088069fa386cd5c8902711b762ac0da3a7a3420472c47e850f988dd60a636d7d
+QCAVSy = 0677ff510052d4f460849fb8ef0d4f3519cd238e4e1c688b736cf6e3759550d134a1e6ca3cb479d68b4dc5d0bba1aee178bd6fe15ec196fb1f627d87079394f6f7854e053228dee5
+dIUT = 020115d17e41e13178b42a004c01d5e4ef1c76241049c7d31bf0ea85d6e070a2e2b92080e61de546fccbd4d991236bb360ef3f206ee16d8843a0ddc803463664a8ccdc2d87a10277
+QIUTx = 06c8ac34364acae35e3c417160333e48641868fcca04c0d577be06f58ab0a55fd7db779fe737779da33d009f57b5bad49702eacf575acbaf27df833070cd893a7924770c92eff3a0
+QIUTy = 061b82e545d41c62fef068b34cdbf01396115d2a1417f9719483d26986b6d52f8f6de06837795f6d9dd7cd095741114318c6e8a6206b3deeef014f0e44b0dc6684e100e4ac361650
+ZIUT = 031bd2a84369e93dfa00581446d52762100d985cc7bb91c4fa8be7472e2e8e9781c52b19a54330442441bacae23f4bdc76486eb475d51f26aafbfb272a5ab5db184a4d3c3006e5d1
+
+COUNT = 8
+QCAVSx = 023ee4f9ec24dee203acfb658631313c7ad4394c47f1794d08b599ffc15f0e5dab2911d97e030ddf7cb4bbadf8a5bce05c35358fbd0cf95d3d5c7ff3cd8ee6b54e379d8d0123939b
+QCAVSy = 0606be23e7c5746dbd38404fd607fb7f278ee249dc8e2740cf1bb9b1c07b1cf7e0a50a432567d1869799a803122510db437981a2aa126eb9aaf3c7be05a80fac1495e1c40ca1c106
+dIUT = 00847b545ef49615671f08be73a49147063184493340111ea4dce13c2f921f07bfacffc8441f4c7c9d0479f57f3a13f4c33c63ed47c3a43fb2f06d06a9780e5c0b3ac30410adc491
+QIUTx = 06994ddc5ae2c5b6f45dc32b710f1a49391a47f3a0f8c2d7846552fe487ef01cca0431155bb54533b067a29e8367373af95d6a7f0bf98d869b708f48f95f1b88a1530fe22547e97e
+QIUTy = 04f6288d4d704f33a898031e7d0046fbf1e34a72c8af190f4d33163343c897ba0c0d8af8a86236a1c3b655b979dc4522d33d66a665b3b6501570f076322af0ad2bbaaa04ea2e995d
+ZIUT = 04df20154fa49a1d6e04dc2ba6e55a7f2ae575de5e2c6e4091a4d2c36aa93ca9699b890f0ee4df53aa75d0d9babad68605bc027ec67c187a6826aac0f4bc596baae788b376110216
+
+COUNT = 9
+QCAVSx = 00d4a0b11c1739bed094e72d7a6923836836d9215746c72cc680045a36d81adf5e25394f269a2ada1d9439ebc33bb931d6fa595a25261c244a1e17b046fb10fb54bb312288cf2e8d
+QCAVSy = 075204f50d32ab8a6abbff982d1fe372b8c5415bb5b726b346aa4f08be32f8ca282c1ef6e152423360d97b728a074e6b3cf3b912718b1692cd983019741a2541824234bdc8c323f9
+dIUT = 034c2458302b43857f12ad8bd9a875237641a21e21ca3cf9a0956d3cfeded96a5e1f533d827b528fbb586da93eefbb66d0778b19b1a7fb6f17bbf9e79b9acefcdd7b9605e7898f26
+QIUTx = 032d3a7a4099f089fea9189211f7366f2edc4abfb316c5c05948d8de57fca023bfb6a11b102ea4120ba62192c0df610bd8d2f63fc57727f4a6b640abf8d299fac56c4c7af88349ea
+QIUTy = 04e6399f1ced2669d3a5506d35ea2bebfccf0cec84bc97383aadc3b48347f629626e6096f890435e5933675048fdcefcdede3ed616e6560d42e9e17c5492e30bc2de4689c0592ecb
+ZIUT = 037a380f525590582658e2dd272a32de67fc0cf5390b37f4d33c1359f075d4461ea38a55027317892a3d1d22f5ea333ad437667d2f3eb8781c39504036ae33e4b0a26b6894722f0b
+
+COUNT = 10
+QCAVSx = 03bb84032b7fffce27accf354b89dddf646cdcb56634df0f8520a7730f8abeb05f9933d8a4352d1c7767cc3f9b80ceffcdd0cb3a97b59283fd0a674dc4fd240333f020c82b4804c5
+QCAVSy = 074499336ac3a805430789902768252026b526ece54ac28e8cc878f18baf9fab42ba4ce34e4968aac1ee6a0bb15c9a709882a5372af56ea0b36817385fbbfeac4b906069e53fbfba
+dIUT = 012db785a03c26be3a6e9a582e5c32a89570ad4308b713ce5471ea193dec1f32d68b4fcdfb1600fdb1ecb6769e26a0e057812dbbf0ed495592665e6b8e9a97378a30b5c660fbadc1
+QIUTx = 07edf7ee0ec77f5a6c3c9ec4ed8fd3cb814a342e9cc6470b54781ed6c141e2115c86dbd7ba27993eb7ebed7a38be488f96fddfa982f3691aa1c2a697f7706bff3d1add7396066194
+QIUTy = 07b3824b7f7b266fa42fe536adc2ac79b9d1e5b408e7217b3a99ddeb992f3123ff2d168774d300a818a32692e265afc6f6f578d9bd3121132b5979841f7a2d060e8948901d657c1c
+ZIUT = 0420de313bddce87d07321e3f0af404d9d13e5369b79506e807178711153c9b1837cd055562eff3aadfc5954a221eeebb1bec1696d3df1cccfb8b61172a50d83cee95f4140ba070b
+
+COUNT = 11
+QCAVSx = 06556a4cc98466794a93d03388536776f7a4b3344c3dc4eb960a4a6458fc7869cd4e45b2f140c468a7d4ebba84c9482337a2a8adaac88a9a629da03dd247526642b0ab71fb7a8c70
+QCAVSy = 054b97d952b19f742856dacf4e50df0c3103baf253f4de65a3d9cace63fe82906d2c8e8a3312fb535e00f9b5ca69f87dbc7fa3f7d87fe024536604aafe4640593cccfef6fac028a6
+dIUT = 0202606a76b6a13d6e29280bc1613e115025770b245f5561d5883e135e159cc437b1c9355b2eee2b3babef229fe545aab2bcca155e8972495f1974bdb1ec0e60c4e6c79c48f26a46
+QIUTx = 06e74dba4e0702f186d334d3c49e2578e1edfac564645dda8c4a588158f8d7a3ef63243653c0d507427734fb4cc87adf4a36bd5abca1f920b9bd6e3bfa51c916d5710884594e9485
+QIUTy = 05b92147a2db48a3830ccfa28951a2b7e8eb84313b99b0a99031c7834c633f865a2f9844952528ae5dee02428a824cdfb7e20928ffc53420df38ead0b4240d0659d5adb1ff2e2dcb
+ZIUT = 0606228f5a05077aeefbefac23c0d5bac7a6062bfc2b02ce8bba6698ea96b456b1f0d32c6e05dbb9be61a83090428eedea18c74f41238edede9e3a12e28722d2f314613c2e84d6db
+
+COUNT = 12
+QCAVSx = 01005182b029a48528eef5ffd0221ad87085abac6a72705203a3c1689abbbc0e12927a5e83b352a1bad97706101f44a1022ccc0d5522dc5d1ca1433de03a2ba1df864875f522be61
+QCAVSy = 018b02a98f0b3e4ccf44a96939a2083ab1f2a04dafd5bdcee3cff438bb08bff12043aa192c5fcf34e13b5c29742c5d864b9cac46bea6e96df2b1be4493acf950224d71737f990658
+dIUT = 0048678348ac33b92f2c59677103ea409946b5593d105fc4983351c4ede929c4b93bfc695876555e3ace417b82ac05b832676ac23e2955a09ee64a20a5f98e62499f43ba7f7fc8e1
+QIUTx = 031dd4808d2b341b8881f5e50a2dcce38df839009f92185978dfd9a60cdaee005cdba82655647736d407afb90c67cddb13ba2b01618f45e8a274317e02f770f80ef87bbbc1b11056
+QIUTy = 050a0671c9c0ce57a494e6911f1376cf1fc3393885ba8c26f6ddcbb5361876860a35afc1f4560f2970c30db3f1c817dbc8af2b025daed3a9da12d2fae9d714cead80445e6a0a0813
+ZIUT = 052669336019db5eddef5eab2336abeb60bbc7295e4bb663ab43e373fb6d888d7433ec89a487a91d4a59c289a9509ddd1bab33cd02a7bf37aaad78dbedf0b4ae5f2f35d15cb4e628
+
+COUNT = 13
+QCAVSx = 07fab4e59328c700f74649bd90a7d51ff28958fe720daaab328cfc9b002aa706ceb39934db9ccf81deec95689ce8c776b4fc6542a82358cc51ebbc6d8e5322cb3fa6e4695e170fc1
+QCAVSy = 05acd45cffa29ddb34ee42e7410026798e37a8d1a9ce9f9294da5198164b69010c68c53281ccbfc407d141097da137e7849f228fdc1a07aa298be26ca771f47ac4feb2723d5a6666
+dIUT = 0017bab72d788f8b78b9bfc4912863c5a48922fe69e8a4cf5e6e91763efd5477a1cd439dedd0afea504e3b3af6823ea3089c0374ed9aee24a88516c8cf3afabe995b9b9675f3b5ab
+QIUTx = 0161c14bbc84e42ec7677a8c3770065ecd1f0f44eac8242a715a61971e7e4ffff78ff57a1bf1b95cbfc2ed957d1195f9ea50809715c2439c7543e573520135426d47535b8bfc8533
+QIUTy = 01253633d02251464edcc53ed9e8a9ed9329320ef5eeaf35d64c59b9735c96e07f1a62ec17bcee4f04cd9a85a3eb504aaf37bb388c6c7d08d90aa0b68556b5c068ecbf0a5984460d
+ZIUT = 062de5aa98b440c6cb7a1428f6b5e47452b30454eec4d651982b531121febbd5a3833b180017f7ddb5ce38d7bb1c842de1a8a8fc7fc981e24733b7662813fd010a4e757ca4ea5c28
+
+COUNT = 14
+QCAVSx = 072676302ad18731b76202bc51429ebf7eccf6325f4e084c2f92e3288ed290488b9e36720e29daa2db1993a7d17ce8ef9d8ccec61de8a407176e2674c25d57bff2c46596358b3605
+QCAVSy = 03c0022d53229091e14af0f7450deca1cb5db821e71590608fe0986d73e88c915e5ee8dfebc8955913d9164f992f56394a662ef11c8214e8ada85df1b17b0b97414cdd662d188b5d
+dIUT = 02ab2d43027b08f8abfa3598ef0144399a60b6037b17a3ae413d422efa2167e9ea4f19d7eca98d85c67c1fe85fbcbc1f12bafa30a85dbdf542466889315f1532defc5d181509f008
+QIUTx = 0328c0d67fd552ea10e5bdf7b87d50bf4dcba34dca569aeb869c5c7dc7d832ce30feed32e25a723793f97c557e2f978c5e1349e69b73ef9916001ffb0d6cdb2c6343e34538386e6e
+QIUTy = 01d151b46ed004263cd9a5c0d46a840d03222631f92ff9280e95a35746cdbcafd9fed6811c7614b9d50aa2828dc7a275b39d3d418a349dd1e2b73211f4de9a34b42fca11b9760eca
+ZIUT = 07c7eb4892816cc3388ebcdfb412984e05910c112dd15b8e5481719401701aceba22fcf35aab0c3b040096161011f6177097c505395d9d6d8a713f6a5100fb476adbe7b9cdf4b68b
+
+COUNT = 15
+QCAVSx = 06cd7931fcf1935f81f301479ed9ad0c6f9a05becf4e573a2ff409bafc442ec195f7e3fdfd08e58161d4e0fd37f62a969421b19cd48fe848a5d7f74b8137a7c726a9cbd37a2cf3b4
+QCAVSy = 04b5b2cd83b27895751c34d3ac5b960a133ec18b039c2e128d3441db4f76e8b75064094619b122e5fb2f1c2796559ad953c711e330dc7bf55edf29f095cae45557b7c8d5843d89bd
+dIUT = 0049c6e4c05a197b24afd2707243ffbfd55b0088fd33d87dae4d21048f75f2b862563075241d2f36fdd0e9405ab42aa55cbf2095dabc3daedfae9deb922220783e8591cfd67600b1
+QIUTx = 001fe29a4c2dd000bbed129121b88edbb5c39b34003f170ac19fa9a85c5fe587aab821361f4963440f25acb49758810552f06b719a9eb43b720e9b7ad6ef9d41248d5f335f99515a
+QIUTy = 01499db95808c719d24eb05c633db8b05cf969ca0bf656435b1fdf1b0928290f6a6bf880adb9fd53c86ec76e0f62ce89cbeb4c266f64a876d778231a0030c38aa00d66c6bd680785
+ZIUT = 05c638349000ec30881cd190c067e7f12b6b42d5842a8285a8ff0dc7e9c9eaf483309e48314fdc2ce7f9da6a468e549c8e70a50b68d07aee29708a98172209e5cd2e8c09cb66d982
+
+COUNT = 16
+QCAVSx = 02984b653074c36a259ad956d5556512c2c731fa50f2005d0049a9d977de5c00b7a054c960cdd707896321490be433bd5effd44c564eaa2d5021175050c5bfc163cdb1e81df1335a
+QCAVSy = 01a786d29098b334f5c1c4ae86a41bf275cc6787da7206916557a4f433192141034567e041d55d794a7707c7aaf28842d5c8f590375a43656918aa80e55b0285347cce8ffe1f15e8
+dIUT = 0186b31ce490c7f28f2793075a4ae645acb39e71ffe944ee62bf82587f1c3cbe288ce6024d8d035f107d9a4faed57a7b21ee1d6e7129a098004f22ccd52740c034a6df37b53d0732
+QIUTx = 06b15f1a859e3d80924611b20c1b94dff6bd0574fef81937f1e54d148d2d31f8c21b0ea9ce031c9455706f085a69fd492418558c7de9aadc2c9a996e7ed1feda329c7d7609bb6b22
+QIUTy = 032910544cb136e2c29aa33572aa6c3471a52ebca6b228bee749fa9ffe29296a4a5b6aa0c6dc9f095216e7b1513d81cba00794a3f558f74a1b541c73b2308f4f8e74028b5c2bcdf3
+ZIUT = 007a40a59b6632156a43158565a4eeaf80618e501c5ac5afdab4ce3cb76ac99a0bcd17e9eec549373ace8c96aac78e2af6600483a2c49ec81298a083d5237118de96a953999beb26
+
+COUNT = 17
+QCAVSx = 01a8682e09eccd1868da202916a561ee8513c0d73470cd341aee79ed93556a3a6e7c7b20302ec74a0c5170a8e37d78a9b5d0de3900eb2a663a7247cf7943fd381d95b3aafd156167
+QCAVSy = 052fecc68f7695d4e41a080c47650d202874da163a1748e550373958e31bd0aae520996d30f384730f4854f5e54e68cc24958adc52e2a4c407356514f3ea7166056dc67e4d118fa8
+dIUT = 0341f8e86182de4fc3f43857250a929a41994d331da154c0249fa0d1c26a6de0e835fa08a8cc524e3dac286383f90bd2f4d2c75142f1d38108d9c062143c8e6edbbda0af87a76ad5
+QIUTx = 02c5c5eb7327402672573c37b492890343ab422b51bc65b600766ec1d07908ff03bcfde7694d832bcde52946339df0aab4074ae07a89f821f5a1130d2b73db0c423ae7a023ae2c18
+QIUTy = 0476ed3dbd936d1c36987a43512c8f0562e316122d05a7edd4e4248984c11f6eb85215d5aaa0262a95f20666c9dbf45248ae177d2dfffa3a6a950533298b5c3f4a1b62da1eafcd51
+ZIUT = 021fd2726973405fc30d2a1f2115907cbd0de90bb6bcb0496452e389b1b10ccf38e2400617040cf0dbb188f345337678b0ad8603dcfe926582d4321f384daec0943e2cd267f48343
+
+COUNT = 18
+QCAVSx = 02cdaf139a0cda2800d61128ffe4d7323b34a0fcf48c9400479ff4c8291cbf46f16c41e4409aaedf14bc60a642b2d7baacde8e0051dd8ae01bf5ad2e6e6490c77cd406a999c565e6
+QCAVSy = 078edd29db6a3b87a11505b57c543ffb746a5b40fb83d7206180f3ae9fcb222c5411a77476660c7b311b646310905889a95a0f2fdc35d30fc61cc5560a2914232d62ad36386b9179
+dIUT = 0207a7382d8a22571226e0c06c2681d09bca19b5db7e7bbfc13ac208389df8168d77615e30ca86103936e53dd9af01cdfe24f508ec609399775ce84c8689f8d5f96f652e014e0de8
+QIUTx = 04608dc0512bc55c734cd562ac5825f7ca38b793f8ece9b981cc1c4032ddd8039164d0c646b42b2fd453b5a1d3a74ae23c32c7d584007de3cd34e33121b90fab3ada6621b3ac9785
+QIUTy = 06aa9ffbfd65c509370846707674ac723dac24a6f33a1e0bbcdf8b24ba32cf7bdec8fdc9233b757bc073d64dedf484c6fa01ef28e874fb0d34f58b0e32b18645c30bdcb516ee3841
+ZIUT = 07a47bdc7d54ecd391672f131b3214d0efc4d40195db1ec993a62fe9da875efff5403bd708fa491a01a94f4bddc7d516baffff9fbdd213ca1a4905f9aa679d65da25c0f1fd2afb0a
+
+COUNT = 19
+QCAVSx = 00051512e4a0dbc535c97be10ffa7425758382883040466601d5391bcb3582c11525293249f24497cc807216b34c92c1e075781c8391c3f6d3d14f88a1d50ea9fc75ff8d51ccf933
+QCAVSy = 039da46cac866ab347617ac5a8b4f1657034e3b8ddb66bc4273e2e1ce01641ece636979de8b2492dc69e88537c36b1c3ad0d35227f867e43df9c8917dce9f8c1ef3ba3cb5ca8ba52
+dIUT = 006ba8f12cc6e0e78df8cc6298848a740025e72c62d099e92584ac76f595ac1fc724cb06a85a07f0d4440faf3ddea2f265f2015dd059a16a03a29915b8731d604512ceef22b841f3
+QIUTx = 0636f435e80600666108737300773a8ed6ffa8ebf8307c81ff5f44353e91bad086331b8feff3f1cdb86e061bde5f71c5fb938f117e2226a97d2b66b098e9ff525182c816e702c6a9
+QIUTy = 01c1bd8afae6a94108fc2c755d5de3fa2a4b3471fc2a5cdf4adda68529bf180ff28db154ab4311247b392e93a335bbe8796608bbd6013f43cdcc846ec22267423c3cfda2ce8a3d96
+ZIUT = 07326196a7decc92c81ae5a0779c9a42f53d94cfa4c3a13f19dbb554138e0e864eee6bc93e39214e2f74705a4b172aab510444c93b5b3e62517bbb7279337102db1c61de349d9747
+
+COUNT = 20
+QCAVSx = 004c2de5642431bcc6eb82efd4355540a8b5d23b12b0df7d31ad69425b94549877443ee8dd7c09cfbbed86f13665931d4b2a21759c33e10b4acfc63ba1ef61acaaa18c94e3cfc933
+QCAVSy = 01765b7a37eb806d43196d2931da1a1953742d3e0da7ccb67e0dfdba5e034914cce3ee6393bfde40670f406196067da8b293c6843593dd221c89bf97963676bd044e8c8ab8e717ad
+dIUT = 010716f2e774f27f42de3f6c9694d8eca2179823091d202f2ba1629193a1c98700693398ffc83157f7ce4858e7535e3990d219bc249de164558cac807ee159778a012da19e5012bf
+QIUTx = 0150b3adde162a7f09350dacf460419fe86b99dcd94f44283fba3e43d281b93bb54282812ce52265a94838968d67a9d6ecdc1b6cb64cf1594521c4749ea43d8e4ec045e645ff238b
+QIUTy = 07b43321b6118b87c46c7b52288df5dd1cf7da6183ece5633b4c17cae362d821191f7d57923928339aadf7d85f7f19de9486709e4d2ddef42c55bb4d76a3cb50cad2a098ead5952a
+ZIUT = 059052d3e1c66efa4b7dd39e74299e886367d8fe49d7cab90e4f051bec10316438fb29b1290dfdaec169decd622a1010cf0a0275008814f4861b4d83ba78515a8768d978be430011
+
+COUNT = 21
+QCAVSx = 025038a0e72ae8c16e36e3e3b504ed7341ef709b9fec8be90177346d76ca7bc7133d0ec280acf066005c5cc10b52aa654335fe820a6617e560e270903ff1c2cc8af1398f24dfe2b0
+QCAVSy = 031074ca3931801a6acb765b6e9144172ed81d999ed9e835bd35526b03ef2a13f78376032b0eb8146c23132365fce176a7cbdca44b35aa379859f688ac26dc64c8149a4322d083d1
+dIUT = 01d0103fc7948af107e51f4d2cc0392b66808059d1f26cba05be6a381f522d4cb854137934accd1cea3360948e406d3108c943769dc700b4c9cc0cc1d84bab58a35e27eb240475f0
+QIUTx = 012bda8ded3ed7e8b6d39b5855a58d725b65e3857c2a674996eb393a3e3f91595bbfa87253a56ebac2b10ed406af9dbff53b22265fbeb5a769cace2b60b45dbf97ceed2b0a04db50
+QIUTy = 026454827efe29b324ae3f2d4c0dca3a3a95491511c531645acf545b45ef6ac4a50c09d3d21f213ca76b96fb18242ecbe08af68755de4e1077173475826eaabed26a75c369cd7b0f
+ZIUT = 03acfa4b3d1c2a6b62af23bdff6a215a416d4437ce6cc114d17dc4201195987a5d7301da11b913254702d7172e31d64e59b24deaa3270f20445e51dc484f7a2b8c3cbeb0bb9efb28
+
+COUNT = 22
+QCAVSx = 01bdfffd69c2e08fb03c853ef2ebd088e68d233fdb95f0b246de7955d615077dfd0b0ff02c64d01de793359096b85e057b1b7f9f59262dc2757f18243e182e1a0bfe9dcbb027d68b
+QCAVSy = 0218be7d956029f139c19d2da346773b16d7afc858ab8dcb60d7e484aecec309cb3fea96af3903637e5db4db678bb5db9b0b18d83cf9ebc1b1aaf24f4367ec533684ce9d56582d43
+dIUT = 032d2f557fe47b8d280f682e24fda627dd7a58e9b00822a3aaf6eb7a014f476c17941adc5e2238a3080d706f1e16a451b7e92942779930c5670a473281cac78b858d1f1cc99b0aff
+QIUTx = 040f3130e74b1c8eb265e7c4e6921411eb971418267e8dea879c2e8b563864f23a61b23422c9a06fa178a8a155e3e78457597587f3e35b79f19d0c2e185aef46db95819cbe127b10
+QIUTy = 01c91d27c2ae7113eb03be98e94d3ad6dec791fac2fe0d2c8c98b71371b058a649fa9c3fa3ccdbba932395c27affa20d95ac041bc9978e3f530829a2c64c89b1bcceac06854fb903
+ZIUT = 067a58e5b3287bb9aa83ed9ca2d718cf7165fb574b6a446c3019849cd1584673d561b574bc8f68419437c5e8113e060847cad3b5ddc2f67ad75bc1e3f04554e63a5e4945cfcb65f5
+
+COUNT = 23
+QCAVSx = 008fc3b414f3412b403f01c253bd2226150225ddaab34d201089f49d79e5dcc2e3b68216faa66dac44529c7fe3ba4d28d815b088235955713bb7721383533b5d94221b4ed1e162b8
+QCAVSy = 02b32201de272b1b32b6a6a58ea22411c48f5dc5cf0f95872e6751ed622ceecea22a556975de6003869ae20af39b42ba8871789c82e8f3ad3cf6006f43bc4c7d4102032c43f8f797
+dIUT = 03eee29196a8be70eb3a310464059cc0c4c42f13487ab1a0762c2cbe304ebe63503e6c7068a7f4bc197f81f65b4295c14b210f3cb2378b67401fcf52bec02c13b61b6de14e1b7e5b
+QIUTx = 0177acc5fe9f42f4de2d27ab9bf6f7e0eace303c266ff8b3469082aba9367e66440bd6b1bd8b6e1aec92b65e35aea8f007f09d4cd67eea5d6000736cabbb9dccc943ebb5656a0586
+QIUTy = 0716f1898e2a8c27319de7a2698f21d5de58a4b8b8dd02b5e433110d3977fee8ec5c089d170af02a4ad3c1fab44b0d1e2a3beba9e0719cd8bf8364478d686c4e35f7457d24d021d6
+ZIUT = 06b272ca3330c0cdfbe60a1746bc0ddea6257536cdd8e976f2517eb541460a3f0e6ea7fec2b495e0f57712c8cac35e8a7d64d876c29851bbfeb6fe726d57e0be43dc76a584ef9c93
+
+COUNT = 24
+QCAVSx = 0565a82994d7e6f53eeb6bf67523ee680ffb770118673c3e15c3200e6c8d1f26cabaf00c1da48e6374316497cba5f19f17420f267633f40e5b06362789bff11adf596d5b1cf768ef
+QCAVSy = 016b2d4daaca9c6bed976b2064ef54352a58ae34367835a6210e1578291c1de8d67c20bc3d6ffa620c87b3098a2b9f3abb8d2cacd5b2ee2b68399eac4e8f65cebdd66300fd049b5b
+dIUT = 0169a2d87586944c3173bf9a2275e3080003db648c2d1e1c56e2c37ce0d7cd9f818ea6b7bba343f774ef0f334ea5c12ef0be7593d04ed945458d71e17112eb01d9041d2133b13473
+QIUTx = 051e521764265af7f01bcd9c3fd022dfdb2d4a2c58b3b23d2e550302c42aadd57d1df6fc18e465bd98442495eed22f3fd6700284c9fa7833b5165149b8e1a91e0e099a0a5732d5c2
+QIUTy = 0198e7e7d094e207528c583865d262a918fc2a39261e95c07dcbd044efd3981899078af3eb97398201a4650f0dccbf19f922c8dbc3839bf6be0053f84531c71843a9e6a102ab58d6
+ZIUT = 02da266a269bdc8d8b2a0c6bb5762f102fc801c8d5394a9271539136bd81d4b69cfbb7525cd0a983fb7f7e9deec583b8f8e574c6184b2d79831ec770649e484dc006fa35b0bffd0b
+
diff --git a/test/jdk/sun/security/ec/SigGen-1.txt b/test/jdk/sun/security/ec/SigGen-1.txt
new file mode 100644
index 00000000000..83463a21f5b
--- /dev/null
+++ b/test/jdk/sun/security/ec/SigGen-1.txt
@@ -0,0 +1,5879 @@
+#  CAVS 11.2
+#  "SigVer" information for "ecdsa_values"
+#  Curves/SHAs selected: P-224,SHA-224 P-224,SHA-256 P-224,SHA-384 P-224,SHA-512 P-256,SHA-224 P-256,SHA-256 P-256,SHA-384 P-256,SHA-512 P-384,SHA-224 P-384,SHA-256 P-384,SHA-384 P-384,SHA-512 P-521,SHA-224 P-521,SHA-256 P-521,SHA-384 P-521,SHA-512 K-233,SHA-224 K-233,SHA-256 K-233,SHA-384 K-233,SHA-512 K-283,SHA-224 K-283,SHA-256 K-283,SHA-384 K-283,SHA-512 K-409,SHA-224 K-409,SHA-256 K-409,SHA-384 K-409,SHA-512 K-571,SHA-224 K-571,SHA-256 K-571,SHA-384 K-571,SHA-512 B-233,SHA-224 B-233,SHA-256 B-233,SHA-384 B-233,SHA-512 B-283,SHA-224 B-283,SHA-256 B-283,SHA-384 B-283,SHA-512 B-409,SHA-224 B-409,SHA-256 B-409,SHA-384 B-409,SHA-512 BB-571,SHA-224 B-571,SHA-256 B-571,SHA-384 B-571,SHA-512
+#  Generated on Tue Aug 16 15:27:42 2011
+
+
+
+
+[P-224,SHA-224]
+
+Msg = 699325d6fc8fbbb4981a6ded3c3a54ad2e4e3db8a5669201912064c64e700c139248cdc19495df081c3fc60245b9f25fc9e301b845b3d703a694986e4641ae3c7e5a19e6d6edbf1d61e535f49a8fad5f4ac26397cfec682f161a5fcd32c5e780668b0181a91955157635536a22367308036e2070f544ad4fff3d5122c76fad5d
+d = 16797b5c0c7ed5461e2ff1b88e6eafa03c0f46bf072000dfc830d615
+Qx = 605495756e6e88f1d07ae5f98787af9b4da8a641d1a9492a12174eab
+Qy = f5cc733b17decc806ef1df861a42505d0af9ef7c3df3959b8dfc6669
+k = d9a5a7328117f48b4b8dd8c17dae722e756b3ff64bd29a527137eec0
+R = 2fc2cff8cdd4866b1d74e45b07d333af46b7af0888049d0fdbc7b0d6
+S = 8d9cc4c8ea93e0fd9d6431b9a1fd99b88f281793396321b11dac41eb
+
+Msg = 7de42b44db0aa8bfdcdac9add227e8f0cc7ad1d94693beb5e1d325e5f3f85b3bd033fc25e9469a89733a65d1fa641f7e67d668e7c71d736233c4cba20eb83c368c506affe77946b5e2ec693798aecd7ff943cd8fab90affddf5ad5b8d1af332e6c5fe4a2df16837700b2781e08821d4fbdd8373517f5b19f9e63b89cfeeeef6f
+d = cf020a1ff36c28511191482ed1e5259c60d383606c581948c3fbe2c5
+Qx = fa21f85b99d3dc18c6d53351fbcb1e2d029c00fa7d1663a3dd94695e
+Qy = e9e79578f8988b168edff1a8b34a5ed9598cc20acd1f0aed36715d88
+k = c780d047454824af98677cf310117e5f9e99627d02414f136aed8e83
+R = 45145f06b566ec9fd0fee1b6c6551a4535c7a3bbfc0fede45f4f5038
+S = 7302dff12545b069cf27df49b26e4781270585463656f2834917c3ca
+
+Msg = af0da3adab82784909e2b3dadcecba21eced3c60d7572023dea171044d9a10e8ba67d31b04904541b87fff32a10ccc6580869055fec6216a00320a28899859a6b61faba58a0bc10c2ba07ea16f214c3ddcc9fc5622ad1253b63fe7e95227ae3c9caa9962cffc8b1c4e8260036469d25ab0c8e3643a820b8b3a4d8d43e4b728f9
+d = dde6f173fa9f307d206ce46b4f02851ebce9638a989330249fd30b73
+Qx = fc21a99b060afb0d9dbf3250ea3c4da10be94ce627a65874d8e4a630
+Qy = e8373ab7190890326aac4aacca3eba89e15d1086a05434dd033fd3f3
+k = 6629366a156840477df4875cfba4f8faa809e394893e1f5525326d07
+R = 41f8e2b1ae5add7c24da8725a067585a3ad6d5a9ed9580beb226f23a
+S = a5d71bff02dce997305dd337128046f36714398f4ef6647599712fae
+
+Msg = cfa56ae89727df6b7266f69d6636bf738f9e4f15f49c42a0123edac4b3743f32ea52389f919ceb90575c4184897773b2f2fc5b3fcb354880f15c93383215d3c2551fcc1b4180a1ac0f69c969bbc306acd115ce3976eff518540f43ad4076dbb5fbad9ce9b3234f1148b8f5e059192ff480fc4bcbd00d25f4d9f5ed4ba5693b6c
+d = aeee9071248f077590ac647794b678ad371f8e0f1e14e9fbff49671e
+Qx = fad0a34991bbf89982ad9cf89337b4bd2565f84d5bdd004289fc1cc3
+Qy = 5d8b6764f28c8163a12855a5c266efeb9388df4994b85a8b4f1bd3bc
+k = 1d35d027cd5a569e25c5768c48ed0c2b127c0f99cb4e52ea094fe689
+R = 2258184ef9f0fa698735379972ce9adf034af76017668bfcdab978de
+S = 866fb8e505dea6c909c2c9143ec869d1bac2282cf12366130ff2146c
+
+Msg = c223c8009018321b987a615c3414d2bb15954933569ca989de32d6bf11107bc47a330ab6d88d9b50d106cf5777d1b736b14bc48deda1bc573a9a7dd42cd061860645306dce7a5ba8c60f135a6a21999421ce8c4670fe7287a7e9ea3aa1e0fa82721f33e6e823957fe86e2283c89ef92b13cd0333c4bb70865ae1919bf538ea34
+d = 29c204b2954e1406a015020f9d6b3d7c00658298feb2d17440b2c1a4
+Qx = 0e0fc15e775a75d45f872e5021b554cc0579da19125e1a49299c7630
+Qy = cb64fe462d025ae2a1394746bdbf8251f7ca5a1d6bb13e0edf6b7b09
+k = 39547c10bb947d69f6c3af701f2528e011a1e80a6d04cc5a37466c02
+R = 86622c376d326cdf679bcabf8eb034bf49f0c188f3fc3afd0006325d
+S = 26613d3b33c70e635d7a998f254a5b15d2a3642bf321e8cff08f1e84
+
+Msg = 1c27273d95182c74c100d85b5c08f4b26874c2abc87f127f304aedbf52ef6540eba16dd664ae1e9e30ea1e66ff9cc9ab5a80b5bcbd19dde88a29ff10b50a6abd73388e8071306c68d0c9f6caa26b7e68de29312be959b9f4a5481f5a2ad2070a396ed3de21096541cf58c4a13308e08867565bf2df9d649357a83cdcf18d2cd9
+d = 8986a97b24be042a1547642f19678de4e281a68f1e794e343dabb131
+Qx = 2c070e68e8478341938f3d5026a1fe01e778cdffbebbdd7a4cd29209
+Qy = cde21c9c7c6590ba300715a7adac278385a5175b6b4ea749c4b6a681
+k = 509712f9c0f3370f6a09154159975945f0107dd1cee7327c68eaa90b
+R = 57afda5139b180de96373c3d649700682e37efd56ae182335f081013
+S = eb6cd58650cfb26dfdf21de32fa17464a6efc46830eedc16977342e6
+
+Msg = 069ae374971627f6b8503f3aa63ab52bcf4f3fcae65b98cdbbf917a5b08a10dc760056714db279806a8d43485320e6fee0f1e0562e077ee270ace8d3c478d79bcdff9cf8b92fdea68421d4a276f8e62ae379387ae06b60af9eb3c40bd7a768aeffccdc8a08bc78ca2eca18061058043a0e441209c5c594842838a4d9d778a053
+d = d9aa95e14cb34980cfddadddfa92bde1310acaff249f73ff5b09a974
+Qx = 3a0d4b8e5fad1ea1abb8d3fb742cd45cd0b76d136e5bbb33206ad120
+Qy = c90ac83276b2fa3757b0f226cd7360a313bc96fd8329c76a7306cc7d
+k = 1f1739af68a3cee7c5f09e9e09d6485d9cd64cc4085bc2bc89795aaf
+R = 09bbdd003532d025d7c3204c00747cd52ecdfbc7ce3dde8ffbea23e1
+S = 1e745e80948779a5cc8dc5cb193beebb550ec9c2647f4948bf58ba7d
+
+Msg = d0d5ae3e33600aa21c1606caec449eee678c87cb593594be1fbb048cc7cfd076e5cc7132ebe290c4c014e7a517a0d5972759acfa1438d9d2e5d236d19ac92136f6252b7e5bea7588dcba6522b6b18128f003ecab5cb4908832fb5a375cf820f8f0e9ee870653a73dc2282f2d45622a2f0e85cba05c567baf1b9862b79a4b244e
+d = 380fb6154ad3d2e755a17df1f047f84712d4ec9e47d34d4054ea29a8
+Qx = 4772c27cca3348b1801ae87b01cb564c8cf9b81c23cc74468a907927
+Qy = de9d253935b09617a1655c42d385bf48504e06fa386f5fa533a21dcb
+k = 14dbdffa326ba2f3d64f79ff966d9ee6c1aba0d51e9a8e59f5686dc1
+R = ff6d52a09ca4c3b82da0440864d6717e1be0b50b6dcf5e1d74c0ff56
+S = 09490be77bc834c1efaa23410dcbf800e6fae40d62a737214c5a4418
+
+Msg = 79b7375ae7a4f2e4adad8765d14c1540cd9979db38076c157c1837c760ca6febbb18fd42152335929b735e1a08041bd38d315cd4c6b7dd2729de8752f531f07fe4ddc4f1899debc0311eef0019170b58e08895b439ddf09fbf0aeb1e2fd35c2ef7ae402308c3637733802601dd218fb14c22f57870835b10818369d57d318405
+d = 6b98ec50d6b7f7ebc3a2183ff9388f75e924243827ddded8721186e2
+Qx = 1f249911b125348e6e0a473479105cc4b8cfb4fa32d897810fc69ffe
+Qy = a17db03b9877d1b6328329061ea67aec5a38a884362e9e5b7d7642dc
+k = ab3a41fedc77d1f96f3103cc7dce215bf45054a755cf101735fef503
+R = 70ccc0824542e296d17a79320d422f1edcf9253840dafe4427033f40
+S = e3823699c355b61ab1894be3371765fae2b720405a7ce5e790ca8c00
+
+Msg = 8c7de96e6880d5b6efc19646b9d3d56490775cb3faab342e64db2e388c4bd9e94c4e69a63ccdb7e007a19711e69c06f106b71c983a6d97c4589045666c6ab5ea7b5b6d096ddf6fd35b819f1506a3c37ddd40929504f9f079c8d83820fc8493f97b2298aebe48fdb4ff472b29018fc2b1163a22bfbb1de413e8645e871291a9f6
+d = 8dda0ef4170bf73077d685e7709f6f747ced08eb4cde98ef06ab7bd7
+Qx = 7df67b960ee7a2cb62b22932457360ab1e046c1ec84b91ae65642003
+Qy = c764ca9fc1b0cc2233fa57bdcfedaab0131fb7b5f557d6ca57f4afe0
+k = 9ef6ebd178a76402968bc8ec8b257174a04fb5e2d65c1ab34ab039b9
+R = eef9e8428105704133e0f19636c89e570485e577786df2b09f99602a
+S = 8c01f0162891e4b9536243cb86a6e5c177323cca09777366caf2693c
+
+Msg = c89766374c5a5ccef5823e7a9b54af835ac56afbbb517bd77bfecf3fea876bd0cc9ea486e3d685cfe3fb05f25d9c67992cd7863c80a55c7a263249eb3996c4698ad7381131bf3700b7b24d7ca281a100cf2b750e7f0f933e662a08d9f9e47d779fb03754bd20931262ff381a2fe7d1dc94f4a0520de73fa72020494d3133ecf7
+d = 3dbe18cd88fa49febfcb60f0369a67b2379a466d906ac46a8b8d522b
+Qx = b10150fd797eb870d377f1dbfa197f7d0f0ad29965af573ec13cc42a
+Qy = 17b63ccefbe27fb2a1139e5757b1082aeaa564f478c23a8f631eed5c
+k = 385803b262ee2ee875838b3a645a745d2e199ae112ef73a25d68d15f
+R = 1d293b697f297af77872582eb7f543dc250ec79ad453300d264a3b70
+S = 517a91b89c4859fcc10834242e710c5f0fed90ac938aa5ccdb7c66de
+
+Msg = 30f0e3b502eec5646929d48fd46aa73991d82079c7bd50a38b38ec0bd84167c8cf5ba39bec26999e70208af9b445046cd9d20c82b7629ca1e51bdd00daddbc35f9eb036a15ac57898642d9db09479a38cc80a2e41e380c8a766b2d623de2de798e1eabc02234b89b85d60154460c3bf12764f3fbf17fcccc82df516a2fbe4ecf
+d = c906b667f38c5135ea96c95722c713dbd125d61156a546f49ddaadc6
+Qx = 3c9b4ef1748a1925578658d3af51995b989ad760790157b25fe09826
+Qy = 55648f4ff4edfb899e9a13bd8d20f5c24b35dc6a6a4e42ed5983b4a0
+k = b04d78d8ac40fefadb99f389a06d93f6b5b72198c1be02dbff6195f0
+R = 4bdd3c84647bad93dcaffd1b54eb87fc61a5704b19d7e6d756d11ad0
+S = fdd81e5dca54158514f44ba2330271eff4c618330328451e2d93b9fb
+
+Msg = 6bbb4bf987c8e5069e47c1a541b48b8a3e6d14bfd9ac6dfaa7503b64ab5e1a55f63e91cf5c3e703ac27ad88756dd7fb2d73b909fc15302d0592b974d47e72e60ed339a40b34d39a49b69ea4a5d26ce86f3ca00a70f1cd416a6a5722e8f39d1f0e966981803d6f46dac34e4c7640204cd0d9f1e53fc3acf30096cd00fa80b3ae9
+d = 3456745fbd51eac9b8095cd687b112f93d1b58352dbe02c66bb9b0cc
+Qx = f0acdfbc75a748a4a0ac55281754b5c4a364b7d61c5390b334daae10
+Qy = 86587a6768f235bf523fbfc6e062c7401ac2b0242cfe4e5fb34f4057
+k = 854b20c61bcdf7a89959dbf0985880bb14b628f01c65ef4f6446f1c1
+R = a2601fbb9fe89f39814735febb349143baa934170ffb91c6448a7823
+S = bf90f9305616020a0e34ef30803fc15fa97dffc0948452bbf6cb5f66
+
+Msg = 05b8f8e56214d4217323f2066f974f638f0b83689fc4ed1201848230efdc1fbca8f70359cecc921050141d3b02c2f17aa306fc2ce5fc06e7d0f4be162fcd985a0b687b4ba09b681cb52ffe890bf5bb4a104cb2e770c04df433013605eb8c72a09902f4246d6c22b8c191ef1b0bece10d5ce2744fc7345307dd1b41b6eff0ca89
+d = 2c522af64baaca7b7a08044312f5e265ec6e09b2272f462cc705e4c3
+Qx = 5fad3c047074b5de1960247d0cc216b4e3fb7f3b9cd960575c8479fc
+Qy = e4fc9c7f05ff0b040eb171fdd2a1dfe2572c564c2003a08c3179a422
+k = 9267763383f8db55eed5b1ca8f4937dc2e0ca6175066dc3d4a4586af
+R = 422e2e9fe535eb62f11f5f8ce87cf2e9ec65e61c06737cf6a0019ae6
+S = 116cfcf0965b7bc63aecade71d189d7e98a0434b124f2afbe3ccf0a9
+
+Msg = e5c979f0832242b143077bce6ef146a53bb4c53abfc033473c59f3c4095a68b7a504b609f2ab163b5f88f374f0f3bff8762278b1f1c37323b9ed448e3de33e6443796a9ecaa466aa75175375418186c352018a57ce874e44ae72401d5c0f401b5a51804724c10653fded9066e8994d36a137fdeb9364601daeef09fd174dde4a
+d = 3eff7d07edda14e8beba397accfee060dbe2a41587a703bbe0a0b912
+Qx = 6dd84f4d66f362844e41a7913c40b4aad5fa9ba56bb44c2d2ed9efac
+Qy = 15f65ebcdf2fd9f8035385a330bdabec0f1cd9cc7bc31d2fadbe7cda
+k = 7bb48839d7717bab1fdde89bf4f7b4509d1c2c12510925e13655dead
+R = 127051d85326049115f307af2bc426f6c2d08f4774a0b496fb6982b1
+S = 6857e84418c1d1179333b4e5307e92abade0b74f7521ad78044bf597
+
+[P-224,SHA-256]
+
+Msg = 2b49de971bb0f705a3fb5914eb7638d72884a6c3550667dbfdf301adf26bde02f387fd426a31be6c9ff8bfe8690c8113c88576427f1466508458349fc86036afcfb66448b947707e791e71f558b2bf4e7e7507773aaf4e9af51eda95cbce0a0f752b216f8a54a045d47801ff410ee411a1b66a516f278327df2462fb5619470e
+d = 888fc992893bdd8aa02c80768832605d020b81ae0b25474154ec89aa
+Qx = 4c741e4d20103670b7161ae72271082155838418084335338ac38fa4
+Qy = db7919151ac28587b72bad7ab180ec8e95ab9e2c8d81d9b9d7e2e383
+k = 06f7a56007825433c4c61153df1a135eee2f38ec687b492ed40d9c90
+R = 0909c9b9cae8d2790e29db6afdb45c04f5b072c4c20410c7dc9b6772
+S = 298f4fcae1fe271da1e0345d11d07a1fca43f58af4c113b909eedea0
+
+Msg = 1fa7201d96ad4d190415f2656d1387fa886afc38e5cd18b8c60da367acf32c627d2c9ea19ef3f030e559fc2a21695cdbb65ddf6ba36a70af0d3fa292a32de31da6acc6108ab2be8bd37843338f0c37c2d62648d3d49013edeb9e179dadf78bf885f95e712fcdfcc8a172e47c09ab159f3a00ed7b930f628c3c48257e92fc7407
+d = 5b5a3e186e7d5b9b0fbdfc74a05e0a3d85dc4be4c87269190c839972
+Qx = 897089f4ef05b943eeac06589f0e09ccc571a6add3eb1610a2fc830f
+Qy = 62ba3f6b3e6f0f062058b93e6f25b6041246c5be13584a41cae7e244
+k = 5b6f7eca2bcc5899fce41b8169d48cd57cf0c4a1b66a30a150072676
+R = f12c9985d454ffbc899ebbbb6cf43e3debcac7f19029f8f2f35cce31
+S = 12fcb848adbd8b1b4c72b2b54a04d936e4a5f480ae2a3ea2e3c1baae
+
+Msg = 74715fe10748a5b98b138f390f7ca9629c584c5d6ad268fc455c8de2e800b73fa1ea9aaee85de58baa2ce9ce68d822fc31842c6b153baef3a12bf6b4541f74af65430ae931a64c8b4950ad1c76b31aea8c229b3623390e233c112586aa5907bbe419841f54f0a7d6d19c003b91dc84bbb59b14ec477a1e9d194c137e21c75bbb
+d = f60b3a4d4e31c7005a3d2d0f91cb096d016a8ddb5ab10ecb2a549170
+Qx = 40a4ab1e6a9f84b4dedb81795e6a7124d1cfdfd7ec64c5d4b9e32666
+Qy = 83aa32a3c2fc068e62626f2dafce5d7f050e826e5c145cd2d13d1b27
+k = c31150420dfb38ba8347e29add189ec3e38c14b0c541497fb90bf395
+R = bf6c6daa89b21211ea2c9f45192d91603378d46b1a5057962dafaf12
+S = cb6b237950e0f0369323055cd1f643528c7a64616f75b11c4ddd63c7
+
+Msg = d10131982dd1a1d839aba383cd72855bf41061c0cb04dfa1acad3181f240341d744ca6002b52f25fb3c63f16d050c4a4ef2c0ebf5f16ce987558f4b9d4a5ad3c6b81b617de00e04ba32282d8bf223bfedbb325b741dfdc8f56fa85c65d42f05f6a1330d8cc6664ad32050dd7b9e3993f4d6c91e5e12cbd9e82196e009ad22560
+d = c8fc474d3b1cba5981348de5aef0839e376f9f18e7588f1eed7c8c85
+Qx = 66f49457ed15f67ed4042195856f052fe774077f61cebcb9efddc365
+Qy = 3a6e3f3423eec7308a69eb1b0416d67cc3b84d24f251d7cbdb45c079
+k = 5e5405ae9ab6164bb476c1bb021ec78480e0488736e4f8222920fbd9
+R = 7b7beaf9f696ca1a8051527478c4c075ab45aa4768937886dbf38618
+S = 93d4cf110a37c5a6f15c4e6024822118539e860dee2f60b8c3f462f6
+
+Msg = ef9dbd90ded96ad627a0a987ab90537a3e7acc1fdfa991088e9d999fd726e3ce1e1bd89a7df08d8c2bf51085254c89dc67bc21e8a1a93f33a38c18c0ce3880e958ac3e3dbe8aec49f981821c4ac6812dd29fab3a9ebe7fbd799fb50f12021b48d1d9abca8842547b3b99befa612cc8b4ca5f9412e0352e72ab1344a0ac2913db
+d = 04ef5d2a45341e2ace9af8a6ebd25f6cde45453f55b7a724eb6c21f6
+Qx = 8d642868e4d0f55ee62a2052e6b806b566d2ac79dbde7939fe725773
+Qy = 79505a57cd56904d2523b3e1281e9021167657d38aeb7d42fc8ec849
+k = ec60ea6f3d6b74d102e5574182566b7e79a69699a307fee70a2d0d22
+R = 2fd7fcbb7832c97ce325301dd338b279a9e28b8933284d49c6eabcf6
+S = 550b2f1efc312805a6ed8f252e692d8ee19eaa5bcd5d0cda63a1a3f0
+
+Msg = 4cc91f744ac858d3577e48813219aa3538dd813b186b42d1e6218376f07cc1cc448ddd6b37240e98bf953f49cf54d65c12878b33c0bf6eb1c60254f0b6fa974f847e53abc56773eef6f29885dfc619e6a48fc15a667ca94001a0c945b6357a53221b0f4b266181456b0d2d25e90708777f1a6f85971c00140c631c1991e0fd06
+d = 35d4bbe77d149812339e85c79483cb270bdac56bbf30b5ef3d1f4d39
+Qx = 7924b1d7f5920cce98e25094e40f2eb3eb80d70b17e14b3d36c3671c
+Qy = 26c5af35f71e61858582b7cc2b41790597c53ee514ffdf7a289d108c
+k = 751869c1d0e79eb30aae8fbfb6d97bfa332123fd6b6c72c9cd3c1796
+R = 26bb1b92b0f01e94eba5fa429271371db527ce857abba13bd1103f64
+S = 836aba9c63e1252c2b2d72a21e6a41b82241ebe32647e7f814652bcb
+
+Msg = 58f43cc1924de4bc5867664adbc9d26b4f096a43aca47c27c52851b006dc2a658919ef9ce5b5ac48372703be15ac51631c2bd84b88f479f113b0569a9a09e230ec1e8e573474c6075284d3e57d973829af35325d9e7dab4a5f9b065155bbcaff3642a82ef4c9b9e127d3575c050721653da3b087d3fa394192897a5519527d19
+d = 2c291a393281b75264c9b8817af684fa86a1cdc900822f74039dc5d6
+Qx = 18cb5826ad60e6696bf07655032a3749f6577ca36da3ccd6e66a137c
+Qy = 194e14820fe02d784fd1363ff7a30399518309765bd3f4412d646da2
+k = e2a860416229dfd3f5a5cc92344ca015093a543943a0d8f73bf2b2fd
+R = 00e300c1ef4a8c4ca5da6413856f8981db49de29bdf03f32ffc3ceab
+S = f250f18a51ba5f63e1584097841099fa6ae4e98ee458c061d1d5aed7
+
+Msg = 113a2806b052fde683ee09453098e402204155afb3776fd1cad3a9103421d327eab8f9ec0dd050ffcc83f93b34ea707705fabeccfe43ab1a71c95298fd3ec769d99ead1066950eee677d225816e0faad19cf69e1b35d16771689e2092cafe16d7c0dd7b0db73fffb8d0f3eaed83004dd21e753530ec939c89ba25578fa5f785b
+d = 831ea25dbeda33d272a1382c5def0e83929170ab06a629eed6ee244b
+Qx = 076518e393940d42dfd09819409d66966d8c9189c83d554a9cc8a082
+Qy = 44d0ceaf4c0f50e46bea4a52e30423ce3ada19edd363ac5694c65cb8
+k = 6be6dd9f6a083915ccba54626caf12d246d3aece0a7eda7d8d85599c
+R = ff1460946e06fb6f5d35e8d2625ca70ffb9b45308e3fabf6ad8351b1
+S = 6029aa3990918e8cb8a388d53b0772e5cdfff49c3405fe0d3a95933a
+
+Msg = 64cbfc8f2e2149a31b3e8a80c4a552f6c62aaeb7990b6e0ee55500a9d17be04213406578caf315951086dff5c2af3b5ce17d425d185101ef26f86396ba3a129a4f3f8e2dd595f59efb6c0f5c2dcc394569d7268695e9ac7daa84203f1f1895f1f9e4b514a5c9cd23baa63454710144fe735ad9b8f42d8c43267aa434a26d7e5f
+d = 70f74c7324ef137318b610ead8ddc5b964e0eed3750b20612fc2e67b
+Qx = 279649e2a2918e683520cde3fc98b0ae58a7100e8de35e7c9cc797b6
+Qy = aa4de6be34be61f02880139787b9038f4554a8ef1c994b887c2974b5
+k = 8e984864f86f7a2a73f3edda17dbccd13fac8fa4b872814abf223b1b
+R = 3b18736fa11d04e27e2614cda03a63ec11a180f357b0b3192920d09c
+S = 2f0f3dbd570727b14fbb29155538e62c930dd51c4035275c1365dc60
+
+Msg = a10a11c8e30fff118d371daf824f16c08200b83ea059436466a4611ccac93b2dea2de8c1006f946196aef7fe9b0c251a391b0340f21797798278b412ff2b53842eec6450728e2bca062f8337a2c204b9ea04ff660cd4d4db559f2f11c4d8ef199021339fcc82396f7a93926cf5f247e37d8067fe50692de54f102bd5ab51925c
+d = 026be5789886d25039c11d7d58a11a6e1d52cb1d5657561f2165b8a8
+Qx = 3fa617c50b177da1a2bdb98b780ad21ad1195c4bd24465f6187de3c9
+Qy = e3fd8d8876dfd03a4a4e31a1acad3a08d983826d286c250c4e5620c1
+k = 0128b8e3f50731eb5fcc223517fc0cf6b96cd1d2807eb4524bc46f77
+R = 3a6b633f96f3d0b6d54f7fb29ac33709e4f0dd8fa0e51606ed9765ca
+S = 63e8c119dfa51784decd864f6911f2210a80f8f02d472d88df10d119
+
+Msg = b3f720bf566ffa369259f4361959ae0641d2755ec264a4c4349981df2b02563275b2b9adb5aee47f7a456760a971991ffed6b17809bb9694138d1677fa916123795239353158fc6b22d10f20d26f5d2dcd8c56c44373eea5b93067dba2d7c5318dac2e9e8714873cb1b37f58c011fd14fa1e535554efe05f468bfc8e11cd8b99
+d = e79c18d935c2839644762867aa793201f96a3cde080c5968412ce784
+Qx = b7ae1e992b1c7fde1141f40bd913358538ca0f07f62b729f13cea327
+Qy = 811252d12120e04805fc171a439d382c43b68a21e1a0bdf5e4ec1da4
+k = 7abedab1d36f4f0959a03d968b27dd5708223b66e0fc48594d827361
+R = d35047d74e1e7305bb8c1a94e8ae47cb1591c3437a3e185e00afe710
+S = d9c425c9d5feb776ac8952e6c4eee0ecd68aef2f0e7bff2e49c9185e
+
+Msg = 0a398a46df7ccc48d1e7833f8bbc67100f1ef77a62dc78bbc115b2a662f9591fbaaa91ad3d788e2fdd1b3164e45293d4f5686c151296901768028ac80ded4bf89c647ad35f0c7c4cb318c0c757c1d83c44d850e5fd4677281b3f13b1ee54de79c8c042813f9d3312dcc6111a68299cb7e829557d7f3d96e702f65aefc6499415
+d = 0d087f9d1f8ae29c9cf791490efc4a5789a9d52038c4b1d22494ad8c
+Qx = cd95cf8fb1cd21690f40d647f2353672a1076cc6c46bddaad2d0fc56
+Qy = 934262f74d9ee0f8a2754f64cb7415923d64bf00c94a39b52803f577
+k = 557d0e3995dc6377b3911546dd7aeaeec62a6d8f2af6a274382fc37f
+R = 56df0ea6afdcc232ceb41729eec00cf906b69b6e28423a36d3c92cc5
+S = f4f70fd948c9a147f55317fdea7b8a84c33e721014552d5800d63edc
+
+Msg = 8c33616821a6038b448d8918668977fcf1ef5aa0cf7c341837b39bbcc9bca875a3757f4b392630e9995b9bbe4eb66978b877586adaa02f99d2344dae082a7603351d8ffcfca081ab403cd0acb90d078dd1d0789c2eb3185c62bff2d9f04cd38e509e3b83c12ed0a5c6808fc42f7ba5b06acdc496c8ad9be648ee6a4505f8560f
+d = 0830aebb6577d3a3be3ba54a4501c987b0e0bb593267b9bbadb66583
+Qx = b88652020e083ccc1c43dc83d1881884dd4c7e3b4e3460b344b1ea64
+Qy = 22b69b517f86d7c26dc37c0f8feb4bb07fe876149fbcc3334fd2805b
+k = e4f4a3280574c704c2fde47ca81ec883d27f2c5a961a294db7cda9d2
+R = b30b8a0079d9a134b5e1618c2ac63e3fbe0e95866b9dbc5f423f2707
+S = 3dc36746610271ef66e0aa52cc2ccadc5c9b08dc769e4dc4f6538c11
+
+Msg = 94d56535fd4edfe67a0daa6579f9d53bf6b7b8830ae2aeb62892ff59f18756ddf2811b449c7d20d65d54f8507de4e7c50eaa084830637812aa4b250a4d61ab67845be36e4a41cdc0a70f8d6e3a63d4514f0dc197e6486015046a316153d5f3a3a4a0ae1ed7ea5fa55e12e73d333333685c02e0eb636234ea7e6d4b76b4b76b5a
+d = 2acc9b97e625263e8e4cd164302c7d1e078bfcdd706111a13ccda5b2
+Qx = ce1a06f82df874dded37cca03b56c0648e4e8917ecd40ee73ee61588
+Qy = ceb6177b8f1ac7c5c6e6e1f7737cc3026952ee392badd2cd7af32f9d
+k = e401fa80f96480d437ed4f61a783888062ec33d530b188fd48016a6d
+R = 28674f447c4742e4087bbccfb522fbad4e18b56031d2ce8f532b078a
+S = a5a7a13d15b423dd17771f73cea98d89dbffa846cc209b45c0e29b76
+
+Msg = 5d8ebdf9eb28b47bdafaa36bf0b66a9eaf99b6c83959da4f2b1151b4f4ecd28fb115a64c0cb9491093a7e9b9c53ec423e4c72e7765bb9c818da0e8c428667e44474a71db4867130c77c40bfd8544b2d7b9d6464d2b8e6a48482153256a32437c3a747231f51134dd14c703407e31146a6fcde23bededcf16950486e90ca69ac0
+d = f4e873d4fb944fb52323406f933815092b7672221de4d1c45917f3fc
+Qx = 0dc2cdddb990341adb1de73f02d87fc3822485a659a15145f4251d5f
+Qy = cf78b2a83c7352eda1af2c74e1804ea04b35f76c04e89d90281dc2bb
+k = 5d1476c682a64162fd2fdc82696fc8cab1469a86f707ea2757416e40
+R = 82982b38ed465138df4018d7cfb835edcb591cb57446ca49d163782b
+S = 8ef1d7b326cabee7f7ab95b7b98d3c27a069c0fd95a1599c0ccb422b
+
+[P-224,SHA-384]
+
+Msg = 25e4416695f77551fdce276355528ccf1ddc2483821c5d22d751d50111ca2fadc6593b52c74f4b5957494f1df25b0b2f86950d0d19229ec6506fee8581d2dd09d48418b146ff16bd84a17ca0dc83b1888eb407376da6c8a88fa1e60b8c2a2471dfde4b3996ef673d5bde3d70c434dc9f2488e9de16ae657d29e5e59ec922a1ec
+d = 62c572ee0d6f81b27e591d788bfc2f42b5105d2663078dfb58069ebd
+Qx = bd6ba605639b98fa8113a16a3bb004ddfaec901c98a931206165f4a5
+Qy = a3190b10ef39e88abd60b2293b4707512b45c6c5ed5794cc11454427
+k = 0f0bb1e428bcdebf4dc62a5278068efc0f8ce75f89e89b3630f102b2
+R = aac0ea27e129f544abcc77f110e70bbdd5aa3e425dc39d5e8887025d
+S = 10e5dd06aee6b8419a04aa33d9d5678b0039c3acc3c4b61fe106bfdc
+
+Msg = 9164d633a553deccf3cbd2effccf1387fa3177cd28c95d94a7d1a3e159c5e5c027758cc26493301b2f4d141d8d07a5fe5fead987ce5f30abeafcb48c302afc6c2309f0e93d9b6818cbb6972d222cb7b01302dfe202ae83b89f53150ae4a0e2b8fc0fd1091f19b4ab2e6ab213ab322d04f2c5f57113bfad3c5675227237abf773
+d = e2f86bf73ba9336fa023343060f038e9ad41e5fe868e9f80574619a3
+Qx = f5d5346f17898ea6bbdfff19c216a8757a5dc37b95315f5481628381
+Qy = ae61fd172ac8b7a4f13870a932dece465834cbd4f50bbcfb802c824e
+k = 35724ac043e3b44b73b5a7919cf675190306d26aa67c27c28c873534
+R = 535147c265af138eec50c7fb570bcc8d2e6f675597b0fcc034e536bc
+S = 743812c188a1dddf9fb34b90738f8b2e58760d6cd20ccceb1bb9c516
+
+Msg = 019df05929321ecea7ee1de4f412aba1c8d3c24437db04b194a68a0a59dd871be10bd3a4be6edf551350ea49fc7155a4d887e1221486291abe77a30633a4c4f7868fe2df24311cba0c73804883954460e122387ed414111ff96ff1aebac8b6a6491d8a0d16e48a63bf3d027c0f68ee4a4b234d73b412196706af8ea022b4dcef
+d = b0a203438e2586d7575bc417a4a798e47abc22aa3955b58fc2789f17
+Qx = dc5d217862a1e5b00c95affa9d8b925a72b9beaeb7a86dc397e788d8
+Qy = 5f05f8e976ae1eb1036eca6d683a82850795bf9127dee5f8b2859445
+k = 408e9c8b1f33136d6ddb93ff3a498bc09d4eee99bf69cdd5af0aa5a2
+R = 1b5a964c8b1fc634c6e2b82322499df1d7f0c12a4d2a77723c816ab8
+S = cf54599a36ca064fae0aa936de5266f87704409d22a15d28c01b7f2a
+
+Msg = 5d09d2b1d3fa6e12c10d8b26dc9aabc8dc02bd06e63ff33f8bb91ede4b8694592a69e4ed4cdf6820069e2b9c7803658949e877ffe23bf90bcf5ce1409c06c71d86885a94048b05ac0ec9db193e489a5a2bfa367caf6aa8ecdb032be366174343f6875d2fe1785e8d77334f5f469cec64998e08d3303e5c9a1923b34fdc105d65
+d = efcfa50fad6fb2065f9a55f28c0c42fa24c809ccb19b6fc6d8ffb085
+Qx = 61521a0cfb72be77ba33cb3b8e022743cd9130ff49e97093b71aa178
+Qy = ce0819aedaf6fce639d0e593f8ab0147eeb6058f5f2b448231584ea9
+k = d1eea821f286eae6ebc1f61b08f9ad4323a3787e94af4c32cd31351b
+R = b37caaa71103752ac559f9eb4943324409ebfa8b585f684dcaa5c411
+S = 7c28e7619e2944ab4b7be022878c8052ebdf2cae5dff4f976c49686a
+
+Msg = 50f6dfc81c6cf189e0a310f992907fe93356cee9dea9a41c7671a8daf3f4cfe0c459ce6122c1e731dbf7593419d7114cb73b46956158a982c5d52c72f43f0f822046093c69aeff1f7e4cd8af00ba655c5baa2e7b6a400b4be1f6fd51b3e4cfb35a69c80a28c5cafb771b6c2e52e0aeef0e3fd045e8d40745f3f8b74fd969f816
+d = 61a17816937987764cdc064dc7b5b4f5b16db1023acdfe25902957dd
+Qx = a7e975c0a8f87c683bb8e31bc160843a7b69c945f4850bd60e1c08c0
+Qy = 8930a454dcc2aa13bed7ea89368b2c9d689d816b2acf4e52585ee9c4
+k = 44b1fdec2629f9075f89c134ac28ff19bfddaa9db02a5d7f853582b4
+R = b0f5635d8bc9c53a1d54a3ec63de59ed66e6b2358d4ab79755414326
+S = 67c68fe265c7e5aba4232deeafb88545a2aa266fb9f2c2bb3f3ae8d2
+
+Msg = e90129ac6672c85bb7b6b18e9dc199c96c81fd65034b53c77818364d512366fb9cd1bc7c82404c451e561fc1ed916c0948f6ac561b33a1ccca093f07684b8c2bafa9e966377bd208556018a5bafb9edcecf70498c7140fe9c8cf3ad8b8c3b0aa489df797944465047465415bb0e24333235fcdd59a98829a3941eaaf62033e82
+d = 79d5367314ec664aa0f6ca36f95549502a05bf8400bf532d669fab8d
+Qx = 3191f0237102dac159032ab2dde53cf56c9ec827b5caddfe9e83c02a
+Qy = b496b1bdcca4434ac0d0d91ea38ff3bc33f9f54095bfe17796d5a9e2
+k = da529c52f5cc1f435d873109cd991d6cd7e1631d9ff1dd9521dd5db6
+R = 8e0ac63903f4921755430572c3f08bc272790639bdf1009fe2a9a714
+S = 6278c841a2d0a270791fe54b36c49d426d67907aa4e4f59c8638ad97
+
+Msg = 3c9a483c9bee33b601549c592a82e95b4319b1e74b777877f0971bcb4273716b268e8f99f876e42f942f4cf08284896bbc1ffbf094ac0956c3cedfc3580cffa8c74fc6db29a371f2da2d05edb9185ece741fe0d3fabfe9d5b4d373755ebed13dc6840cfa3283b9ea46ec8b95c434f253ae86998182e9cc0e95ee64f323fc74b0
+d = 1320eedad4745121793a7eaf732b0b4498f7cb456cac8cf45a1f66f0
+Qx = 9fdd99906ab77fd29e9021bde947d05a7a9eb153612269bfb0899bc9
+Qy = 681b65b9ac8e4c2899bb622dafb253b7bf5a6e38e5f6595f997c291a
+k = 66ed8d8934633f4125f593cf1b1d3745c4db1f15dde60cf46ca1c7f2
+R = 80199485a3a96447b39f7679cd47412a78675ba17dcbd10465dc5b48
+S = a251fd9f136a3cb0dd0bc80659ae032e4a761ba7045da0034553fb8c
+
+Msg = bfc073fdda63c5fccaa0ca8770c293e8154e7aec56128bbac4fdbd541d602216ebf7ca1e02b514d6e396f20683802ba3f334310a9226576926e3bb19ceee27738d13377cbafeb09d091043501702a07aa31d1f29d50ddc55adcf16ffd40578e734a4e6cb6535f26ad48e0c62ad90e79720000e87d419e92dca3e11f943655b03
+d = e18821329447d3f65ba7279e96bd4624ffa1b32b90f6e8331b1e876d
+Qx = 46c9ed837232c47022df2f1a1578fbe65ac9f2e81c98a74cc22ea31a
+Qy = 6fc5e9568ae62b31412a0b0b367242e9fd7e518c83aa06a069e1d90d
+k = a4c1eb402a2fb3af26e0e14a3d2fc8ed3bc1a8b2475270356a79fdd3
+R = d478b68733d8ad44be46766e7b66af782fbdc7ff7ed0b191176da98a
+S = 5eae9160ccf71fd1d359d89cecce72ef8afaeee2365f6ba828aa450a
+
+Msg = 08079955d1a1f33728128c73673ec9f21a6ce138dcab5adc4dc068e6ab57314b9fbd8b013123b2fdafa9524fbdd0288777a233de8055cccfad83046ada6a19f01c47817496667bba8fc8b9456fc0e044a562d931dab1adcb66af8b66325bdf28d83ded3e2937958ccd19da540d70ef2c189f55a506c9c0d63406394c5bd3823b
+d = f73e030d5a696b358986d3efaca121cf71f775f8835a21e6135145d7
+Qx = 9ca2c6ea87ac8dd3a23a5b4010841a7c8af309038882ae44634bcf55
+Qy = b0a347dbd5ded3b8702ac5a457e8b32bd4de06fd315095fa1b7d5fe1
+k = e3cc786c1288ea567836c51d6d69dd0cab5c015987d936ccc3a4beb3
+R = f1234da71761b7a0f49e661a419d2a739bdc4544bf87690e3d2f96db
+S = 096d16bf8020c3d3c233894ad8eb81206010e62c6e692a215e088fd4
+
+Msg = 23900b768f6cd42b8a8df0dcbc9cb5daec8de36b9d5c619adcc1ba2b649103d5af123746cdf19c3fd0665a6fb9338156182aa06181e3c6e37ce56979612af2927440424f89cef43fc754854b8a5c43370808cf5f9929cf47712512ce2f8a2a20d2e9f568c2848b27dfbe09142843c83905ffa5da3b15501761b03dbc2c5398b6
+d = 7a0789323f8741c157a1753ae165ecaf8e8b03a60561f8b80cee467c
+Qx = 101271a9addd4bd1f19d00bf116c8524f52cefd598e85dc381597acb
+Qy = 2f17d14f4d8ccb28b216553718152ba7c104646d8eca986dd9ddea39
+k = d169f04f05b60c625cda864d187938863964dab7bb3b9dfc04b05519
+R = e4a51be686a764b709da23ab48b1985e153c6ee238d945e743907afc
+S = 118a8f1ffe3cd556ce6345bd1a398dd9cc3729b7fd6d8af9bfd82f40
+
+Msg = 1eb28c0bcdd18f73e347f957ece15b4cc83a771b0877e1feaac38e24028fb38ccea8b54ee017dc7c3d5a1327bc6f40b294aa65d7dc487f278846cd101ee84202f14b38aa2c275046aa2577f65ebaea41cd383e8def2fd0b4444dcf426fa75c4082cd7fa035cdb1e0d34a3c79d42130f5b0273eae75bc701dda3aebe7358f41b5
+d = 78e795d0edb11fd9e28dc26b21e751aa89bea0d87932ef11c95c0e18
+Qx = 9edd544107977134bf6360d43ccabb3c94d627c03963c0a04b439627
+Qy = ece4c61d319a0e41f3de7863e7c355bac94395aaa74cdb5f74a87a5b
+k = 36f7c0f76808b826a0a974a1fd6e155e00a73f1d34674a8f88be405a
+R = 3e319444438bc2cc92f323ea842cb402b3c3c2448c89869ef7998edb
+S = 3420cc38f058f41c31e71f4b1ad488f801111c73541de69fcee60695
+
+Msg = efab51855407438fd5c250670366bca3c026ecec4a59394f00d8a4b51746d0c4564366656d507e3e13e62fe7abeb976b8859895848dbaecf6582f1898ea06f00d4247702ed9721bd375aa83ae4c67c2eaa6e080777ea5ecf2cf787d785389560ac91cf63a52f0373c3185e18a3b8a466e21b61a239f1b77624eb1acacc76c4e1
+d = bee02d8bc5bffb3fd3b4c9d6f686409f02662d10150d1e58d689966a
+Qx = 8848f964c847fe9dddc774618d4588c9cd56bbe588d7b1fb369c8bfa
+Qy = ebbb699fbd0dc08859fe9132285fe20dff3b9d561c0640b6e0717607
+k = 59f1450d857b40e5552a4b8cd4ab0df2f01716635d172c1106840f21
+R = a206d8398a16a991bc217f77f23c6f648384f254f255a8a876404444
+S = eb1169cb5b1423dc0bfaffe565ae57f986e00de06405e3e7b605862e
+
+Msg = 31c29ca10279a417f0cc9b1382cf54dbfdfc89f2e6ef08c403c11f580cbf8674b141ed1a417563282d99a55fc616d836421cde9424815c95e7fb7668bf3f137b29937f14882d74e034b732d78d91af7721aac4950734f5fa5d4b4d35534974f8cab6d2e6dca75ddb57e99148c8a59df9fc5bcd723e546e8356f671cf2f65640a
+d = dc0ddf6e501418bb8eafc5d7ccc143369e2aa441df8fc57d5f94a738
+Qx = 063a5d632f4144376e14cfb03ad8ccf1489b613acd184d20dff66545
+Qy = e77727f057b043d8a0f7458196b72e92d11f85b0891c6aaa9d915f58
+k = ff0e5cae2671db7a1b90e22c63e7570bdd27352d45bac31e338debe0
+R = 5bc0b4998481ecbd3b6609184a84ca41d69b08c37138097f559259f8
+S = 0df8828eb1ca85e46405b94e1a2972c34c5e620a54e2f640f04aecc5
+
+Msg = 8db476f92e332519c1a0ece5d8deded6efbd2d8e8784eea0a6b4c3b4296c35f5f8de4317e5c1627b91fb1973fee86c06e4992aa5a20cb7475c8808ff1da354d07a488dffa7838c6ec1e3f99e3acba831f27bee8434eeda3eb36d0c6df3658883cd40068b1bed841310f6eb38d4a3d07d85848770ff7933c054cd8b34662660b1
+d = 229d89b2fcf8441ffc95ebb2ac2ef156e25825782044b2b8bd6a3e01
+Qx = de616848d8044a44789ef1ba3a6dd66fe9257ddc57f7534e59a701be
+Qy = 26cbf74a6d25e5b34b96d30f327abd574cff7f7dbe6686573a7d6c5c
+k = 3b18ca6ec8e8e255ac88f64302745ca0b73ff94b2b2d48be95b4aaee
+R = fa94fd8b827c06115c1eefd50afc02ce5926ee0e789667783c01c34b
+S = edf766a66973cfc33e4159966c07321a7f6549c3c60e8586ef41402b
+
+Msg = fcb272c828fe8fd3c6f8de9410c7b6e2b36717c1b0e5e359e9109bd7fc378978aa98182a9d99961898ed88999b050d3b64d1457d7a899d6d273b9f4dde2aafa36d76329d62509043c338f265fc4c7d938459b7fa3b230a9f6cb632b61489546bb4181a5ad7f0d7369b8caced48eb374b075b2b325bc86add0f3b680cd9e80acd
+d = 97d747068147c0393a0bb5c159e2c9f1bd538f6204823294883abe28
+Qx = 3858a576eef2ce24d01766997fb81b3f3f78b6104cd188610be221d7
+Qy = 95ffc677ac7bfe3e0bb4cffb17355a964c8356a807151b3cba5d1f4e
+k = c1a2ec1ef16cfd5107c892790daefbed061be78bd8576696b60f64d5
+R = 18c908541843fcdac99b9ff6bb397f3f8094d16b42670216e4eaa2d7
+S = c107a8a508ff57c5d4f78f86cc37e129c864d1c44ed5e73909613b74
+
+[P-224,SHA-512]
+
+Msg = 7522492bdb916a597b8121f3e5c273b1d2800ef8c1db4f7dcbae633b60d7da5193ba53a63d7a377b351897c3b24903ae1cd1994211b259be3e6ae2cbc8970e4957fdf782c7d1bc7a91c80c8ef65468d4ef35428f26e2940ae8b0bd9b8074236bf6c00d0ebe83f9ddb2ade0f835138d39f33b59f244e0037c171f1ba7045a96f5
+d = ba5374541c13597bded6880849184a593d69d3d4f0b1cb4d0919cbd6
+Qx = ac635fe00e8b7a3c8ef5655bdfb7f83e8532e59c0cc0b6534d810ffa
+Qy = 1d067aebeba66e79b28ecfe59ac6fdf5e1970dc3a84499c9d90cd8e2
+k = 187ed1f45c466cbafcd4b9577fb222408c011225dcccfd20f08b8d89
+R = f83d54945997584c923c09662c34cf9ad1e987da8bfd9be600e7a098
+S = 4ff2dba9dba992c98a095b1144a539310e1a570e20c88b7d0aa1955c
+
+Msg = 61097114ff855c3e34a62d9b853f8982d35f29cfa4a89893badbca7849e5fb437a1a38d6451bf0ca5a0d528e352b8e4b57f2ea359a7fc8841d49dd3e570f9b016f14156b0bbc4be822e260bd147ec081454969e11cb0034b7450ef4deb7ed6edb977e2f4ed60121aa095fb0ab40240dc329ecc917f5c64b4410612af065ee9dd
+d = 1e27187134d0a63542adf4665fba22f00cfc7b0a1e02effe913ceedc
+Qx = ecaea8ceea55c3bd418fd34a4ff2499e25e66a104eed846bc00c31d2
+Qy = 3933a356ab1f2dabc303ff0a5d076131e77032e6f502336883bf78a7
+k = 34cb597deae9a3b1cada937abcd247161b19b2b336b20e2e42ae01f1
+R = 58177ba46fb291490b39368774accf72736412c1fb5ee0f27b9b1e02
+S = 58337d78b95a080bfcabb5809bee012501b4da84b8ef310a4628f11c
+
+Msg = dd09ae6c982bb1440ca175a87766fefeacc49393ff797c446200662744f37a6e30c5d33ba70cbd8f12277fd6cc0704c17478bbab2a3047469e9618e3c340a9c8caaff5ce7c8a4d90ecae6a9b84b813419dec14460298e7521c9b7fdb7a2089328005bd51d57f92a1bcbeecd34aa40482b549e006bbf6c4ce66d34a22dda4e0e0
+d = 0905b40e6c29bfcbf55e04266f68f10ca8d3905001d68bb61a27749b
+Qx = d656b73b131aa4c6336a57849ce0d3682b6ab2113d013711e8c29762
+Qy = 6328335ffc2029afbfe2a15cc5636978778c3f9dab84840b05f2e705
+k = dc82840d147f893497a82f023d7d2cbf0a3a5b2ac6cc1b9b23e504be
+R = 583af080e0ec7c1ba5a491a84889b7b7b11ccfe18927c7c219b11757
+S = b23700035349df25d839f0973bef78a7515287de6c83707907074fa6
+
+Msg = 37a73e2774d3b274db426c89b945696daa96035031f72cea01894b24508c7f81961ec254d36ed6a0f448e11cf7950af769dc6cd2c47e52c6caf0ea92c270974f0214b4db436c36a60fb722060a6bb544462a82e1714f5906ec32886f7d59ebf289541c3a00ec1e004892ef2b1286a0194f55d083c6ec92c64b8fd1452e1c68ba
+d = afbaede5d75e4f241dd5b53220f3f5b9c1aa1d5d298e2d43236452dc
+Qx = fe83e59fc8ea8b939355d3258fe53a64d45f63031a0716b7cc416173
+Qy = f151d23060f1c856eb7f1f58be72a7228c3af89e43b56e9695b558c7
+k = 0fbbe7b40136c81a8fb894498d5502157a1cf5a89d0643de92cd38f6
+R = 24f3f457c7b72b7e759d5a8afbf330e31c5d8d2e36f92c0e79c5d87d
+S = 36fd1193def34f12a960740fd79fb38bf2b480726ccad540eb42cdf8
+
+Msg = 9dc2046ffdc6804544db964481abe5d2d276a2a9eeec4c7ad40215b1de23561d402db69bd0f6eec2254711eea4487c64d9a6b62c3ebaf5ffa8db6e7e3a6e17154d126967a47a853a6f8339bdca9be306a13c7f992ded7619b0da59909a49b1e0930360e05b47f18628a36d69b2f87f2bfddd6a5d4a72f84dc76dbdd43f3a6a35
+d = 950b07b0c2b7539a21b5135bfede214733f2e009647d38d8b21d760c
+Qx = f43d13bbfcee3b724063b3910fea49fd591b81e86fdb813b1a492d0c
+Qy = 6b4c8d6fa5dc661889e3cf5ec64997a78222837885f85d2fe9b684fb
+k = 83e110d0d1e700d2f36543028737d2a2f1474aa3b4b28998a39e4793
+R = 2685265bc878e85d10ab13293dec190881a57c4a467f8fc2170432ea
+S = 80a347bb49036522369339bd6485a967cdda818915d8eb947302fcf9
+
+Msg = d9c6847fce688c5e7525a1098b545cb6c15dcd21a02761fc82fc664372a667390680135f91c01a2fa5430c634b1a6d1cd6002d8aa021e7bf5956a7901c2f81bc25d502ba5f55a55f30c0323dc68205cbefec0538e68654e7b327ac1743641896c3e740d8f66f400902b304eafaa4e0d8cffae140536f0922444cc3216a675697
+d = 015bd9f5dfef393b431c3c7fced24385d861ccb563542574a5d2a9bc
+Qx = e868690641e2cda13b289a6c5d2fb175940396044d9cf27b4f2240af
+Qy = 4c78c9abdf2b7fc67ed4497001d7bcf1daca1739dc14a661f91d7c40
+k = e2374350f47c08f3c1359d4edf87e61d1ba4e7dd1540d8d9062efa79
+R = e12dc088d2bc032bb214c77d0e0fb749fc8e61ebe1ed72996f1084b6
+S = 0ab58aa31e0bba5fbc76855e6549f1036fba0a589aeab978ab01b8fb
+
+Msg = 69df8a01b66f04930efd2012ff2243874f256ca8758145d2a9e4ecc84d0dbdbd0dc494ae06db0ccbe819918137c90957114558580d6623efbafdd342b38dad9f08708084d32f874fba04782ce26aaab78de2102ad171f8a8f2b30b5bd3d55fdac5fa3acd6f7def7e61c2533938572b331ba6d1c02bd74bfdbf7337ade8f4a190
+d = 0a3c259df933247445acffb6d8265b601d597fb9997dc2a1eb4deef4
+Qx = e67f4385a9da54253cc371ee9bc6739ae6385a4b87669c7baf0c460d
+Qy = 2bb00b6ddd7b67d9ac5653ec04ca8529fbf16f815c04da3c2e58e82d
+k = 8bf5859665b6a23e6b05a311580f60187ba1c4ae89e44877fb48af66
+R = 653675fb993c3fa9e57b32e33029ec230b966e8077c72c1ec90ddefc
+S = 792723bf87e315147cd4303de7f1dfe95cd7658ebb95c38c1a196140
+
+Msg = 927524982b8d60777c1105c86fac05f634abf58c73f84fb95d81ba0b86e1e43592c4fcad2e395a40fbe7005697d86088e2fb3bb7287eb3f917d4f2dc281f5cbe65d05b4f9623bca849b10a03beca6aa2056a12ebb91cf257ac448c5e9a78f8349a6a29b17c8978bef43a443cbb8a149eb23f794844fc41693f2dbb97181444be
+d = a1c8ef463f9e7e3dd63e677412f87cf9ea4ac9a6a2dae629da5b9916
+Qx = 400e5cd4b315ceb309545cd3277acb70bdae2073fda6ad896ea14b27
+Qy = fbe1d2466cd2e116f38248bd5cabaa6cbe6c4a2694d998abd7b0c991
+k = 82f55a25d3ed6e47c22a6eed0fa52ed0818b87d6ea7950281dfefc09
+R = 16305a46a3f6f9e216ef8f6a6f5f0760d064a885657c864e1c1ea035
+S = 58fd97050bfbca6f87e64e1458c4ad80bae26e280356da344ad3b25d
+
+Msg = 5f9042283561e7f19a436d01c7ef5a950a6d77ede5629cd7e43c0a5d58e8c5673c37945a453291d12938253c71dbe12c8b022ba7276eda6be034ef5ec1ec77dbd1e08f0d7b8e7725b7ec671c075e008a20f77f4ab266f97079b0aa6337df59a33b881954084057b21f294dd14bcb0869a4a6f1f597955ec7bf9d19bb3537a66a
+d = fa511dbf6fef7e5e9c73e4555eb75d435f7884322d9faf5d78cacc0b
+Qx = e8dccd706c31f895f2f261ab979cbab51b8ae28196bcc12a42046380
+Qy = ec246be8e71ea3859cb717a59990fe22e4b76858ff49becd70739a01
+k = a37d665fe4314aa4cd03eb8e6a1f366b43e11fdb419c96b48f787b62
+R = 05e4909bcc172ab4140be291aad4660e375032bce2d762b6269ba764
+S = e347a1c9d3670690e1d8d1d4cd9579848f442199c10526488da5cebf
+
+Msg = c2ae5573d3bf396523bfb703db8502fd0760cd1be528f6ddbfb95aad399e0b19f3bd9e0fabdb05d49e3f893dffec5b627c9c2f7ad5f32e92e4e27a38cb5c28657657377fdfa1b66cd7ac3d15c6d49df92d284db99f69744f37dc7cb4e7d52920fdb200a7942623a7057ba82e467dcccaa5da416b48510d8364446a6a5e2a5aa8
+d = a58bd53646400a646f0e4208320dc679a9664d1c6bfb27fdc8eac7ea
+Qx = e22e0dc4ecd96eb0071b72ba4b4988bf784f3fe73cb81bfb93d9ac4f
+Qy = b3e213e518bee1367a4fb3703b9008bac9d95a1fc4aa61225fff9f3c
+k = 42c5b6f87d3bb1ed74f5ee8398d8f8c61e9e50ffa7a1da12d39893f9
+R = 5c0e5c6f057de1e99ef5d237a60d7a07fa9a42b120a82f573d9fb7b2
+S = 2fffc0bf550bd2f650fed085a84501cacfa6a1bb984df1f9237eaa59
+
+Msg = 03c1a1cd30a039d0dcb22fee2450a7fa79495a0d0f4f43d2de4d75bce003c0334a8860f5c164dbd94888a9f751235a3e570d31070e3e1293a7be616af7176600585d36ac013600157d2569d491da4b8a3bf3630c26e0b9925412189f50b0ae6f04c86477932e2ecd8c3546106ae1ebc684cc3adb27ed665eddece886adea4ce3
+d = 64bd4452b572cc95510ac2e572f41136299ff17f6e8448f4ffb571d0
+Qx = 92521fa25c2e034d127e0921efdb167f0b2ff8b20504487ed87fa264
+Qy = e72c770e37375ad7dc2c4e63e5701826f6606f6ffb9461ee61b4e872
+k = eaf76ee4d7e00d13d8a6d03dffd07ad9a8bb6dc8176c9f93059b1b7f
+R = cf5058e2a6cf5e61a138b013eb292f38a1b9f07239ae5941dbce8919
+S = d14198621650d985d270bc997da6e78588fd0ef843b874c66a3de3c3
+
+Msg = 888f6d9bc7c86c0079fbfd42d8c08d6958f40f6e570fb0b1f03d2f8f8a63df4fcc87b379a222cf835820a999d34996e08961f13b86b075e7fd1c303cd3baa44de42168561589012f7e5300da4f8bdf470c07119a5d9f7ba7293568cd7c6a1b7fc1e41cda40bed7d46e5a28af67ae2aabfefe67a86a1c601e6f5ee543e09bd7b6
+d = 7f3edb710df9d982f486233d0c176aa88f5a0ee81efa9b8145020294
+Qx = e7611e013e7b43ff5b8b57ad83333bffcc9e469ad23070b5791dc594
+Qy = 7784da0a11dbe16208c6e0b6d5029e71fbec4dffc9fa046d3eeb71c9
+k = 94db7ef9a232593091eb9a74f289529c7e0d7fef21f80b3c8556b75e
+R = a971f45bab10b1d16d7234ca8e4ec987da20d9e867f28aa063296e23
+S = e38c538d65a7e1a28fd3ec53f015a7e5beb60e9d309f1e3ba4b2c3d2
+
+Msg = 48453340f1317769e6ee6e103153714365731163dc18f84e9f2fa4b120f9c5a9645ee2f9b66c84c26d95912b422b009b64af96aa418b2427a4209f2e7513ba8e43ec8cf20b34e7529b22eb1199545afe9a9f7d9bcb320aec9ee0162f91c0d1dd9674c9c284f25199c5e109f6f84d7ed0d269cc6413edb81bc2c83e37d644d8b9
+d = b569f8296ff1d9cc01fffd9919016e5730c1858bdb7b99527153751a
+Qx = 242f34959516a4706172f7dede23110efa314bff22eb320ab88feeff
+Qy = 45e3227710900a8acfc9bcce728119d042f64ca40876c2b380ee46e0
+k = ae61523866a8f43e6cdd42ba27a34ed06527e8a5842901a64c393f76
+R = c2732a4e0815f9f785500e80147e9486994446beccf8a6a352b97585
+S = 6ecaece6487d7920e398f7f951ab7c7aba5832dabf03704106ad1244
+
+Msg = 4bdfd3b91d83108409ad765b256e0c9b9937ecf647f8e6f9fc807e2e72af8246178b3fe046b4ea10170450d71a4eec790ecb05f03d7077341de26c4db7eeae24d55c9a9093e837dfdb38168fe8230cb9605825a1282fecd741989bfcdb34678fe077477927f66bd26d003e5dda22043341a14dd31841ba483ad5ce2701e0f68e
+d = 41a4dd8eee39232b728516e2f21e66011e7426a6b25986c3ffa237e4
+Qx = c32988171caab178bf50dc7310bc7f604df5a9d19a8e602519c72d8a
+Qy = f8985d112ad9de05969e5364d943c1cc5cd198359f4c62b19da0e117
+k = 827d4999da81fa920c8492ccc1e2d5cdafed9754cf7382a859952071
+R = 89c61da7422ccd676baec07e2185c12e947a2374eede87847304be6c
+S = 2685379624717ea28422e8d001c090405a130b4ef9f1ac726c3ca502
+
+Msg = e6cdee8558bc1eacc24e82f0624ce8d02cc8d925b4dd3dec3a72f4a4e0fb76076bfa3ef2e2c33bdd7c27b322bdc09bbfee8fe46f75dbd7bbd2af09690b7137943efe21706e0a1b6d3089540fc58d85ddb55ea836616db573e36c521be008893f40a0a7c349602cc178ea43be59d31ec6449e7ff2c5379379f7d7645134df1bc3
+d = 67fa50569257c8cc89ac0325db4902003a62f30b917f53e4035a7e04
+Qx = 6773a0436a9c42635730413b19aa4166f08c69c0e5002953da42253b
+Qy = 555138290b093bf2fe79acda9131d920cd1e7ac43fb8775776cd713c
+k = 557cb45fd3a30b3bdbf08c56eabbd4478736024aaa52bf8448096453
+R = 8e92cf7a674aa5f7542dd95c695589a05747431692edd04804299b8f
+S = af4908b41f8180b71a6ff10fd51f3d143147af6ddddf7534d3284ed9
+
+
+[P-256,SHA-224]
+
+Msg = ff624d0ba02c7b6370c1622eec3fa2186ea681d1659e0a845448e777b75a8e77a77bb26e5733179d58ef9bc8a4e8b6971aef2539f77ab0963a3415bbd6258339bd1bf55de65db520c63f5b8eab3d55debd05e9494212170f5d65b3286b8b668705b1e2b2b5568610617abb51d2dd0cb450ef59df4b907da90cfa7b268de8c4c2
+d = 708309a7449e156b0db70e5b52e606c7e094ed676ce8953bf6c14757c826f590
+Qx = 29578c7ab6ce0d11493c95d5ea05d299d536801ca9cbd50e9924e43b733b83ab
+Qy = 08c8049879c6278b2273348474158515accaa38344106ef96803c5a05adc4800
+k = 58f741771620bdc428e91a32d86d230873e9140336fcfb1e122892ee1d501bdc
+R = 4a19274429e40522234b8785dc25fc524f179dcc95ff09b3c9770fc71f54ca0d
+S = 58982b79a65b7320f5b92d13bdaecdd1259e760f0f718ba933fd098f6f75d4b7
+
+Msg = 9155e91fd9155eeed15afd83487ea1a3af04c5998b77c0fe8c43dcc479440a8a9a89efe883d9385cb9edfde10b43bce61fb63669935ad39419cf29ef3a936931733bfc2378e253e73b7ae9a3ec7a6a7932ab10f1e5b94d05160c053988f3bdc9167155d069337d42c9a7056619efc031fa5ec7310d29bd28980b1e3559757578
+d = 90c5386100b137a75b0bb495002b28697a451add2f1f22cb65f735e8aaeace98
+Qx = 4a92396ff7930b1da9a873a479a28a9896af6cc3d39345b949b726dc3cd978b5
+Qy = 475abb18eaed948879b9c1453e3ef2755dd90f77519ec7b6a30297aad08e4931
+k = 36f853b5c54b1ec61588c9c6137eb56e7a708f09c57513093e4ecf6d739900e5
+R = 38b29558511061cfabdc8e5bb65ac2976d1aa2ba9a5deab8074097b2172bb9ad
+S = 0de2cde610502b6e03c0b23602eafbcd3faf886c81d111d156b7aa550f5bcd51
+
+Msg = b242a7586a1383368a33c88264889adfa3be45422fbef4a2df4e3c5325a9c7757017e0d5cf4bbf4de7f99d189f81f1fd2f0dd645574d1eb0d547eead9375677819297c1abe62526ae29fc54cdd11bfe17714f2fbd2d0d0e8d297ff98535980482dd5c1ebdc5a7274aabf1382c9f2315ca61391e3943856e4c5e616c2f1f7be0d
+d = a3a43cece9c1abeff81099fb344d01f7d8df66447b95a667ee368f924bccf870
+Qx = 5775174deb0248112e069cb86f1546ac7a78bc2127d0cb953bad46384dd6be5b
+Qy = a27020952971cc0b0c3abd06e9ca3e141a4943f560564eba31e5288928bc7ce7
+k = a0d9a7a245bd9b9aa86cecb89341c9de2e4f9b5d095a8150826c7ba7fb3e7df7
+R = b02a440add66a9ff9c3c0e9acf1be678f6bd48a10cbdec2ad6d186ffe05f3f2a
+S = a98bea42aec56a1fcecec00a1cc69b01fcbcf5de7ac1b2f2dcc09b6db064f92b
+
+Msg = b64005da76b24715880af94dba379acc25a047b06066c9bedc8f17b8c74e74f4fc720d9f4ef0e2a659e0756931c080587ebdcd0f85e819aea6dacb327a9d96496da53ea21aef3b2e793a9c0def5196acec99891f46ead78a85bc7ab644765781d3543da9fbf9fec916dca975ef3b4271e50ecc68bf79b2d8935e2b25fc063358
+d = 7bbc8ff13f6f921f21e949b224c16b7176c5984d312b671cf6c2e4841135fc7f
+Qx = f888e913ec6f3cd8b31eb89e4f8aaa8887d30ae5348ed7118696949d5b8cc7c1
+Qy = 08895d09620500d244e5035e262dea3f2867cd8967b226324d5c05220d8b410c
+k = 21c942f3b487accbf7fadc1c4b7a6c7567ce876c195022459fa1ebf6d04ffbaa
+R = 2e6cc883b8acc904ee9691ef4a9f1f5a9e5fbfde847cda3be833f949fb9c7182
+S = 2ac48f7a930912131a8b4e3ab495307817c465d638c2a9ea5ae9e2808806e20a
+
+Msg = fe6e1ea477640655eaa1f6e3352d4bce53eb3d95424df7f238e93d8531da8f36bc35fa6be4bf5a6a382e06e855139eb617a9cc9376b4dafacbd80876343b12628619d7cbe1bff6757e3706111ed53898c0219823adbc044eaf8c6ad449df8f6aab9d444dadb5c3380eec0d91694df5fc4b30280d4b87d27e67ae58a1df828963
+d = daf5ec7a4eebc20d9485796c355b4a65ad254fe19b998d0507e91ea24135f45d
+Qx = 137c465085c1b1b8cccbe9fccbe9d0295a331aaf332f3ed2e285d16e574b943b
+Qy = d3e8d5a24cd218c19760b0e85b35a8569945aa857cbf0fd6a3ce127581b217b6
+k = 343251dffa56e6a612fec7b078f9c3819eab402a72686b894a47a08fd97e6c23
+R = 775e25a296bd259510ae9375f548997bec8a744900022945281dc8c4d94f2b5b
+S = d87592ceab773ae103daebbb56a04144aaccb1e14efc1024dc36c0e382df1f70
+
+Msg = 907c0c00dc080a688548957b5b8b1f33ba378de1368023dcad43242411f554eb7d392d3e5c1668fad3944ff9634105343d83b8c85d2a988da5f5dc60ee0518327caed6dd5cf4e9bc6222deb46d00abde745f9b71d6e7aee6c7fdfc9ed053f2c0b611d4c6863088bd012ea9810ee94f8e58905970ebd07353f1f409a371ed03e3
+d = 8729a8396f262dabd991aa404cc1753581cea405f0d19222a0b3f210de8ee3c5
+Qx = 82b1f1a7af9b48ca8452613d7032beb0e4f28fe710306aeccc959e4d03662a35
+Qy = 5e39f33574097b8d32b471a591972496f5d44db344c037d13f06fafc75f016fd
+k = 6de9e21f0b2cacc1762b3558fd44d3cf156b85dbef430dd28d59713bfb9cfa0b
+R = a754b42720e71925d51fcef76151405a3696cc8f9fc9ca7b46d0b16edd7fb699
+S = 603924780439cc16ac4cf97c2c3065bc95353aa9179d0ab5f0322ca82f851cf2
+
+Msg = 771c4d7bce05610a3e71b272096b57f0d1efcce33a1cb4f714d6ebc0865b2773ec5eedc25fae81dee1d256474dbd9676623614c150916e6ed92ce4430b26037d28fa5252ef6b10c09dc2f7ee5a36a1ea7897b69f389d9f5075e271d92f4eb97b148f3abcb1e5be0b4feb8278613d18abf6da60bfe448238aa04d7f11b71f44c5
+d = f1b62413935fc589ad2280f6892599ad994dae8ca3655ed4f7318cc89b61aa96
+Qx = e0bbfe4016eea93e6f509518cbffc25d492de6ebbf80465a461caa5bdc018159
+Qy = 3231ee7a119d84fa56e3034d50fea85929aec2eb437abc7646821e1bf805fb50
+k = 7a33eeb9f469afd55de2fb786847a1d3e7797929305c0f90d953b6f143bb8fc6
+R = 96d1c9399948254ea381631fc0f43ea808110506db8aacf081df5535ac5eb8ad
+S = 73bf3691260dddd9997c97313f2a70783eacf8d15bdfb34bb13025cdfae72f70
+
+Msg = a3b2825235718fc679b942e8ac38fb4f54415a213c65875b5453d18ca012320ddfbbc58b991eaebadfc2d1a28d4f0cd82652b12e4d5bfda89eda3be12ac52188e38e8cce32a264a300c0e463631f525ae501348594f980392c76b4a12ddc88e5ca086cb8685d03895919a8627725a3e00c4728e2b7c6f6a14fc342b2937fc3dd
+d = 4caaa26f93f009682bbba6db6b265aec17b7ec1542bda458e8550b9e68eed18d
+Qx = e3c58c1c254d11c7e781ad133e4c36dd1b5de362120d336a58e7b68813f3fbee
+Qy = 59760db66120afe0d962c81a8e5586588fd19de2f40556371611c73af22c8a68
+k = c0d37142dc8b0d614fad20c4d35af6eb819e259e513ddeac1e1c273e7e1dc1bb
+R = 25dd8e4086c62a40d2a310e2f90f6af5cb7e677b4dfdb4dc4e99e23ea2f0e6dc
+S = 90ad62c179b0c9d61f521dde1cd762bfd224b5525c39c3706f2549313ddb4f39
+
+Msg = 3e6e2a9bffd729ee5d4807849cd4250021d8184cda723df6ab0e5c939d39237c8e58af9d869fe62d3c97b3298a99e891e5e11aa68b11a087573a40a3e83c7965e7910d72f81cad0f42accc5c25a4fd3cdd8cee63757bbbfbdae98be2bc867d3bcb1333c4632cb0a55dffeb77d8b119c466cd889ec468454fabe6fbee7102deaf
+d = 7af4b150bb7167cb68037f280d0823ce5320c01a92b1b56ee1b88547481b1de9
+Qx = cb3634ec4f0cbb99986be788f889e586026d5a851e80d15382f1bdb1bda2bc75
+Qy = 51e4e43bc16fb114896b18198a1aebe6054ba20ed0c0317c1b8776158c0e6bfb
+k = 98edd59fafbcaee5f64e84eb5ed59fff45d14aabada47cee2fa674377173627a
+R = 261a1cdb0fd93c0fb06ea6068b6b03c330a12f621a7eba76682a1d152c0e8d08
+S = 7ca049bad54feee101d6db807635ffb8bdb05a38e445c8c3d65d60df143514c5
+
+Msg = 52e5c308e70329a17c71eaedb66bbee303c8ec48a6f1a2efb235d308563cd58553d434e12f353227a9ea28608ec9c820ed83c95124e7a886f7e832a2de1032e78dc059208f9ec354170b2b1cab992b52ac01e6c0e4e1b0112686962edc53ab226dafcc9fc7baed2cd9307160e8572edb125935db49289b178f35a8ad23f4f801
+d = 52ad53e849e30bec0e6345c3e9d98ebc808b19496c1ef16d72ab4a00bbb8c634
+Qx = 7cca1334bfc2a78728c50b370399be3f9690d445aa03c701da643eeb0b0f7fa8
+Qy = 3f7522238668e615405e49b2f63faee58286000a30cdb4b564ac0df99bc8950f
+k = 8650c30712fc253610884fbba4a332a4574d4b7822f7776cab1df8f5fa05442a
+R = a18194c7ac5829afc408d78dde19542837e7be82706c3941b2d9c5e036bb51e0
+S = 188ead1cdf7c1d21114ff56d0421ffd501ab978ef58337462c0fa736d86299af
+
+Msg = d3e9e82051d4c84d699453c9ff44c7c09f6523bb92232bcf30bf3c380224249de2964e871d56a364d6955c81ef91d06482a6c7c61bc70f66ef22fad128d15416e7174312619134f968f1009f92cbf99248932efb533ff113fb6d949e21d6b80dfbbe69010c8d1ccb0f3808ea309bb0bac1a222168c95b088847e613749b19d04
+d = 80754962a864be1803bc441fa331e126005bfc6d8b09ed38b7e69d9a030a5d27
+Qx = 0aaeed6dd1ae020d6eefc98ec4241ac93cbd3c8afed05bb28007e7da5727571b
+Qy = 2dda1d5b7872eb94dfffb456115037ff8d3e72f8ebdd8fcfc42391f96809be69
+k = 738e050aeefe54ecba5be5f93a97bbcb7557d701f9da2d7e88483454b97b55a8
+R = 8cb9f41dfdcb9604e0725ac9b78fc0db916dc071186ee982f6dba3da36f02efa
+S = 5c87fe868fd4282fb114f5d70e9590a10a5d35cedf3ff6402ba5c4344738a32e
+
+Msg = 968951c2c1918436fe19fa2fe2152656a08f9a6b8aa6201920f1b424da98cee71928897ff087620cc5c551320b1e75a1e98d7d98a5bd5361c9393759614a6087cc0f7fb01fcb173783eb4c4c23961a8231ac4a07d72e683b0c1bd4c51ef1b031df875e7b8d5a6e0628949f5b8f157f43dccaea3b2a4fc11181e6b451e06ceb37
+d = cfa8c8bd810eb0d73585f36280ecdd296ee098511be8ad5eac68984eca8eb19d
+Qx = c227a2af15dfa8734e11c0c50f77e24e77ed58dd8cccf1b0e9fa06bee1c64766
+Qy = b686592ce3745eb300d2704083db55e1fa8274e4cb7e256889ccc0bb34a60570
+k = 2d6b449bb38b543d6b6d34ff8cb053f5e5b337f949b069b21f421995ebb28823
+R = 5e89d3c9b103c2fa3cb8cebeec23640acda0257d63ffbe2d509bfc49fab1dca6
+S = d70c5b1eeb29e016af9925798d24e166c23d58fedd2f1a3bbdb1ef78cdbfb63a
+
+Msg = 78048628932e1c1cdd1e70932bd7b76f704ba08d7e7d825d3de763bf1a062315f4af16eccefe0b6ebadccaf403d013f50833ce2c54e24eea8345e25f93b69bb048988d102240225ceacf5003e2abdcc90299f4bf2c101585d36ecdd7a155953c674789d070480d1ef47cc7858e97a6d87c41c6922a00ea12539f251826e141b4
+d = b2021e2665ce543b7feadd0cd5a4bd57ffcc5b32deb860b4d736d9880855da3c
+Qx = 722e0abad4504b7832a148746153777694714eca220eced2b2156ca64cfed3dd
+Qy = f0351b357b3081e859c46cad5328c5afa10546e92bc6c3fd541796ac30397a75
+k = b15bbce4b382145de7ecd670d947e77555ef7cd1693bd53c694e2b52b04d10e1
+R = 9d086dcd22da165a43091991bede9c1c14515e656633cb759ec2c17f51c35253
+S = 23595ad1cb714559faaecaf946beb9a71e584616030ceaed8a8470f4bf62768f
+
+Msg = 9b0800c443e693067591737fdbcf0966fdfa50872d41d0c189d87cbc34c2771ee5e1255fd604f09fcf167fda16437c245d299147299c69046895d22482db29aba37ff57f756716cd3d6223077f747c4caffbecc0a7c9dfaaafd9a9817470ded8777e6355838ac54d11b2f0fc3f43668ff949cc31de0c2d15af5ef17884e4d66a
+d = 0c9bce6a568ca239395fc3552755575cbcdddb1d89f6f5ab354517a057b17b48
+Qx = 4814d454495df7103e2da383aba55f7842fd84f1750ee5801ad32c10d0be6c7d
+Qy = a0bd039d5097c8f0770477f6b18d247876e88e528bf0453eab515ffab8a9eda3
+k = d414f1525cdcc41eba1652de017c034ebcc7946cb2efe4713d09f67c85b83153
+R = 84db02c678f9a21208cec8564d145a35ba8c6f26b4eb7e19522e439720dae44c
+S = 537c564da0d2dc5ac4376c5f0ca3b628d01d48df47a83d842c927e4d6db1e16d
+
+Msg = fc3b8291c172dae635a6859f525beaf01cf683765d7c86f1a4d768df7cae055f639eccc08d7a0272394d949f82d5e12d69c08e2483e11a1d28a4c61f18193106e12e5de4a9d0b4bf341e2acd6b715dc83ae5ff63328f8346f35521ca378b311299947f63ec593a5e32e6bd11ec4edb0e75302a9f54d21226d23314729e061016
+d = 1daa385ec7c7f8a09adfcaea42801a4de4c889fb5c6eb4e92bc611d596d68e3f
+Qx = f04e9f2831d9697ae146c7d4552e5f91085cc46778400b75b76f00205252941d
+Qy = bd267148174cd0c2b019cd0a5256e2f3f889d1e597160372b5a1339c8d787f10
+k = 7707db348ee6f60365b43a2a994e9b40ed56fe03c2c31c7e781bc4ffadcba760
+R = 5d95c385eeba0f15db0b80ae151912409128c9c80e554246067b8f6a36d85ea5
+S = db5d8a1e345f883e4fcb3871276f170b783c1a1e9da6b6615913368a8526f1c3
+
+[P-256,SHA-256]
+
+Msg = 5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8
+d = 519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464
+Qx = 1ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83
+Qy = ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9
+k = 94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de
+R = f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac
+S = 8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903
+
+Msg = c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1
+d = 0f56db78ca460b055c500064824bed999a25aaf48ebb519ac201537b85479813
+Qx = e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8a
+Qy = bfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39
+k = 6d3e71882c3b83b156bb14e0ab184aa9fb728068d3ae9fac421187ae0b2f34c6
+R = 976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db
+S = 1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932
+
+Msg = 3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee
+d = e283871239837e13b95f789e6e1af63bf61c918c992e62bca040d64cad1fc2ef
+Qx = 74ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde8
+Qy = 29074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614
+k = ad5e887eb2b380b8d8280ad6e5ff8a60f4d26243e0124c2f31a297b5d0835de2
+R = 35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1
+S = ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96
+
+Msg = 0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd50f9e51deaf98272f9266fc702e4e57c30
+d = a3d2d3b7596f6592ce98b4bfe10d41837f10027a90d7bb75349490018cf72d07
+Qx = 322f80371bf6e044bc49391d97c1714ab87f990b949bc178cb7c43b7c22d89e1
+Qy = 3c15d54a5cc6b9f09de8457e873eb3deb1fceb54b0b295da6050294fae7fd999
+k = 24fc90e1da13f17ef9fe84cc96b9471ed1aaac17e3a4bae33a115df4e5834f18
+R = d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884ca
+S = b46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89
+
+Msg = dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d10336ca443e1682aa04a7af832b0eee4e7
+d = 53a0e8a8fe93db01e7ae94e1a9882a102ebd079b3a535827d583626c272d280d
+Qx = 1bcec4570e1ec2436596b8ded58f60c3b1ebc6a403bc5543040ba82963057244
+Qy = 8af62a4c683f096b28558320737bf83b9959a46ad2521004ef74cf85e67494e1
+k = 5d833e8d24cc7a402d7ee7ec852a3587cddeb48358cea71b0bedb8fabe84e0c4
+R = 18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c387182604
+S = 77c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c
+
+Msg = 600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f25659157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f336fdd87d972d3a8b8a593ba85955cc9d71
+d = 4af107e8e2194c830ffb712a65511bc9186a133007855b49ab4b3833aefc4a1d
+Qx = a32e50be3dae2c8ba3f5e4bdae14cf7645420d425ead94036c22dd6c4fc59e00
+Qy = d623bf641160c289d6742c6257ae6ba574446dd1d0e74db3aaa80900b78d4ae9
+k = e18f96f84dfa2fd3cdfaec9159d4c338cd54ad314134f0b31e20591fc238d0ab
+R = 8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68
+S = d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb
+
+Msg = dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e05e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3c238fddd6e450a77455d534c48a152010b
+d = 78dfaa09f1076850b3e206e477494cddcfb822aaa0128475053592c48ebaf4ab
+Qx = 8bcfe2a721ca6d753968f564ec4315be4857e28bef1908f61a366b1f03c97479
+Qy = 0f67576a30b8e20d4232d8530b52fb4c89cbc589ede291e499ddd15fe870ab96
+k = 295544dbb2da3da170741c9b2c6551d40af7ed4e891445f11a02b66a5c258a77
+R = c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b254
+S = 84a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30
+
+Msg = 51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b8596ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1854bc8859734341aad237ba29a81a3fc8b
+d = 80e692e3eb9fcd8c7d44e7de9f7a5952686407f90025a1d87e52c7096a62618a
+Qx = a88bc8430279c8c0400a77d751f26c0abc93e5de4ad9a4166357952fe041e767
+Qy = 2d365a1eef25ead579cc9a069b6abc1b16b81c35f18785ce26a10ba6d1381185
+k = 7c80fd66d62cc076cef2d030c17c0a69c99611549cb32c4ff662475adbe84b22
+R = 9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902
+S = d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f
+
+Msg = 558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe70688c035688ea8c6baec65a5fc7e2c93e8
+d = 5e666c0db0214c3b627a8e48541cc84a8b6fd15f300da4dff5d18aec6c55b881
+Qx = 1bc487570f040dc94196c9befe8ab2b6de77208b1f38bdaae28f9645c4d2bc3a
+Qy = ec81602abd8345e71867c8210313737865b8aa186851e1b48eaca140320f5d8f
+k = 2e7625a48874d86c9e467f890aaa7cd6ebdf71c0102bfdcfa24565d6af3fdce9
+R = 2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9
+S = f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199
+
+Msg = 4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e
+d = f73f455271c877c4d5334627e37c278f68d143014b0a05aa62f308b2101c5308
+Qx = b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde
+Qy = 423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a
+k = 62f8665fd6e26b3fa069e85281777a9b1f0dfd2c0b9f54a086d0c109ff9fd615
+R = 1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620
+S = 880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430
+
+Msg = f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e877169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b88059bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d76dda04995847c657f4c19d303eb09eb48a
+d = b20d705d9bd7c2b8dc60393a5357f632990e599a0975573ac67fd89b49187906
+Qx = 51f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce
+Qy = 4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1
+k = 72b656f6b35b9ccbc712c9f1f3b1a14cbbebaec41c4bca8da18f492a062d6f6f
+R = 9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c42
+S = 2bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c
+
+Msg = 3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6bcd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67defaa89497aa8ef994c77f1130f752f94a4
+d = d4234bebfbc821050341a37e1240efe5e33763cbbb2ef76a1c79e24724e5a5e7
+Qx = 8fb287f0202ad57ae841aea35f29b2e1d53e196d0ddd9aec24813d64c0922fb7
+Qy = 1f6daff1aa2dd2d6d3741623eecb5e7b612997a1039aab2e5cf2de969cfea573
+k = d926fe10f1bfd9855610f4f5a3d666b1a149344057e35537373372ead8b1a778
+R = 490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb
+S = 644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7
+
+Msg = c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b01e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbfe22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f71eb7a49eb4c4ec55799bda1eb545143a7
+d = b58f5211dff440626bb56d0ad483193d606cf21f36d9830543327292f4d25d8c
+Qx = 68229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76
+Qy = 303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c
+k = e158bf4a2d19a99149d9cdb879294ccb7aaeae03d75ddd616ef8ae51a6dc1071
+R = e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb
+S = 9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333
+
+Msg = 72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b5759649c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc7930cfe89e526d1684365c5b0be2437fdb01
+d = 54c066711cdb061eda07e5275f7e95a9962c6764b84f6f1f3ab5a588e0a2afb1
+Qx = 0a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bb
+Qy = f26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae
+k = 646fe933e96c3b8f9f507498e907fdd201f08478d0202c752a7c2cfebf4d061a
+R = b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64b
+S = d7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851
+
+Msg = 21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983ebeec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d2046f23c1aa2e54b7fb6448a0da922bd7f34
+d = 34fa4682bf6cb5b16783adcd18f0e6879b92185f76d7c920409f904f522db4b1
+Qx = 105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d73737
+Qy = 6c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4
+k = a6f463ee72c9492bc792fe98163112837aebd07bab7a84aaed05be64db3086f4
+R = 542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d962663
+S = 4f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f
+
+[P-256,SHA-384]
+
+Msg = e0b8596b375f3306bbc6e77a0b42f7469d7e83635990e74aa6d713594a3a24498feff5006790742d9c2e9b47d714bee932435db747c6e733e3d8de41f2f91311f2e9fd8e025651631ffd84f66732d3473fbd1627e63dc7194048ebec93c95c159b5039ab5e79e42c80b484a943f125de3da1e04e5bf9c16671ad55a1117d3306
+d = b6faf2c8922235c589c27368a3b3e6e2f42eb6073bf9507f19eed0746c79dced
+Qx = e0e7b99bc62d8dd67883e39ed9fa0657789c5ff556cc1fd8dd1e2a55e9e3f243
+Qy = 63fbfd0232b95578075c903a4dbf85ad58f8350516e1ec89b0ee1f5e1362da69
+k = 9980b9cdfcef3ab8e219b9827ed6afdd4dbf20bd927e9cd01f15762703487007
+R = f5087878e212b703578f5c66f434883f3ef414dc23e2e8d8ab6a8d159ed5ad83
+S = 306b4c6c20213707982dffbb30fba99b96e792163dd59dbe606e734328dd7c8a
+
+Msg = 099a0131179fff4c6928e49886d2fdb3a9f239b7dd5fa828a52cbbe3fcfabecfbba3e192159b887b5d13aa1e14e6a07ccbb21f6ad8b7e88fee6bea9b86dea40ffb962f38554056fb7c5bb486418915f7e7e9b9033fe3baaf9a069db98bc02fa8af3d3d1859a11375d6f98aa2ce632606d0800dff7f55b40f971a8586ed6b39e9
+d = 118958fd0ff0f0b0ed11d3cf8fa664bc17cdb5fed1f4a8fc52d0b1ae30412181
+Qx = afda82260c9f42122a3f11c6058839488f6d7977f6f2a263c67d06e27ea2c355
+Qy = 0ae2bbdd2207c590332c5bfeb4c8b5b16622134bd4dc55382ae806435468058b
+k = 23129a99eeda3d99a44a5778a46e8e7568b91c31fb7a8628c5d9820d4bed4a6b
+R = e446600cab1286ebc3bb332012a2f5cc33b0a5ef7291d5a62a84de5969d77946
+S = cf89b12793ee1792eb26283b48fa0bdcb45ae6f6ad4b02564bf786bb97057d5a
+
+Msg = 0fbc07ea947c946bea26afa10c51511039b94ddbc4e2e4184ca3559260da24a14522d1497ca5e77a5d1a8e86583aeea1f5d4ff9b04a6aa0de79cd88fdb85e01f171143535f2f7c23b050289d7e05cebccdd131888572534bae0061bdcc3015206b9270b0d5af9f1da2f9de91772d178a632c3261a1e7b3fb255608b3801962f9
+d = 3e647357cd5b754fad0fdb876eaf9b1abd7b60536f383c81ce5745ec80826431
+Qx = 702b2c94d039e590dd5c8f9736e753cf5824aacf33ee3de74fe1f5f7c858d5ed
+Qy = 0c28894e907af99fb0d18c9e98f19ac80dd77abfa4bebe45055c0857b82a0f4d
+k = 9beab7722f0bcb468e5f234e074170a60225255de494108459abdf603c6e8b35
+R = c4021fb7185a07096547af1fb06932e37cf8bd90cf593dea48d48614fa237e5e
+S = 7fb45d09e2172bec8d3e330aa06c43fbb5f625525485234e7714b7f6e92ba8f1
+
+Msg = 1e38d750d936d8522e9db1873fb4996bef97f8da3c6674a1223d29263f1234a90b751785316444e9ba698bc8ab6cd010638d182c9adad4e334b2bd7529f0ae8e9a52ad60f59804b2d780ed52bdd33b0bf5400147c28b4304e5e3434505ae7ce30d4b239e7e6f0ecf058badd5b388eddbad64d24d2430dd04b4ddee98f972988f
+d = 76c17c2efc99891f3697ba4d71850e5816a1b65562cc39a13da4b6da9051b0fd
+Qx = d12512e934c367e4c4384dbd010e93416840288a0ba00b299b4e7c0d91578b57
+Qy = ebf8835661d9b578f18d14ae4acf9c357c0dc8b7112fc32824a685ed72754e23
+k = 77cffa6f9a73904306f9fcd3f6bbb37f52d71e39931bb4aec28f9b076e436ccf
+R = 4d5a9d95b0f09ce8704b0f457b39059ee606092310df65d3f8ae7a2a424cf232
+S = 7d3c014ca470a73cef1d1da86f2a541148ad542fbccaf9149d1b0b030441a7eb
+
+Msg = abcf0e0f046b2e0672d1cc6c0a114905627cbbdefdf9752f0c31660aa95f2d0ede72d17919a9e9b1add3213164e0c9b5ae3c76f1a2f79d3eeb444e6741521019d8bd5ca391b28c1063347f07afcfbb705be4b52261c19ebaf1d6f054a74d86fb5d091fa7f229450996b76f0ada5f977b09b58488eebfb5f5e9539a8fd89662ab
+d = 67b9dea6a575b5103999efffce29cca688c781782a41129fdecbce76608174de
+Qx = b4238b029fc0b7d9a5286d8c29b6f3d5a569e9108d44d889cd795c4a385905be
+Qy = 8cb3fff8f6cca7187c6a9ad0a2b1d9f40ae01b32a7e8f8c4ca75d71a1fffb309
+k = d02617f26ede3584f0afcfc89554cdfb2ae188c192092fdde3436335fafe43f1
+R = 26fd9147d0c86440689ff2d75569795650140506970791c90ace0924b44f1586
+S = 00a34b00c20a8099df4b0a757cbef8fea1cb3ea7ced5fbf7e987f70b25ee6d4f
+
+Msg = dc3d4884c741a4a687593c79fb4e35c5c13c781dca16db561d7e393577f7b62ca41a6e259fc1fb8d0c4e1e062517a0fdf95558b7799f20c211796167953e6372c11829beec64869d67bf3ee1f1455dd87acfbdbcc597056e7fb347a17688ad32fda7ccc3572da7677d7255c261738f07763cd45973c728c6e9adbeecadc3d961
+d = ecf644ea9b6c3a04fdfe2de4fdcb55fdcdfcf738c0b3176575fa91515194b566
+Qx = c3bdc7c795ec94620a2cfff614c13a3390a5e86c892e53a24d3ed22228bc85bf
+Qy = 70480fc5cf4aacd73e24618b61b5c56c1ced8c4f1b869580ea538e68c7a61ca3
+k = 53291d51f68d9a12d1dcdc58892b2f786cc15f631f16997d2a49bace513557d4
+R = a860c8b286edf973ce4ce4cf6e70dc9bbf3818c36c023a845677a9963705df8b
+S = 5630f986b1c45e36e127dd7932221c4272a8cc6e255e89f0f0ca4ec3a9f76494
+
+Msg = 719bf1911ae5b5e08f1d97b92a5089c0ab9d6f1c175ac7199086aeeaa416a17e6d6f8486c711d386f284f096296689a54d330c8efb0f5fa1c5ba128d3234a3da856c2a94667ef7103616a64c913135f4e1dc50e38daa60610f732ad1bedfcc396f87169392520314a6b6b9af6793dbabad4599525228cc7c9c32c4d8e097ddf6
+d = 4961485cbc978f8456ec5ac7cfc9f7d9298f99415ecae69c8491b258c029bfee
+Qx = 8d40bf2299e05d758d421972e81cfb0cce68b949240dc30f315836acc70bef03
+Qy = 5674e6f77f8b46f46cca937d83b128dffbe9bd7e0d3d08aa2cbbfdfb16f72c9a
+k = 373a825b5a74b7b9e02f8d4d876b577b4c3984168d704ba9f95b19c05ed590af
+R = ef6fb386ad044b63feb7445fa16b10319018e9cea9ef42bca83bdad01992234a
+S = ac1f42f652eb1786e57be01d847c81f7efa072ba566d4583af4f1551a3f76c65
+
+Msg = 7cf19f4c851e97c5bca11a39f0074c3b7bd3274e7dd75d0447b7b84995dfc9f716bf08c25347f56fcc5e5149cb3f9cfb39d408ace5a5c47e75f7a827fa0bb9921bb5b23a6053dbe1fa2bba341ac874d9b1333fc4dc224854949f5c8d8a5fedd02fb26fdfcd3be351aec0fcbef18972956c6ec0effaf057eb4420b6d28e0c008c
+d = 587907e7f215cf0d2cb2c9e6963d45b6e535ed426c828a6ea2fb637cca4c5cbd
+Qx = 660da45c413cc9c9526202c16b402af602d30daaa7c342f1e722f15199407f31
+Qy = e6f8cbb06913cc718f2d69ba2fb3137f04a41c27c676d1a80fbf30ea3ca46439
+k = 6b8eb7c0d8af9456b95dd70561a0e902863e6dfa1c28d0fd4a0509f1c2a647b2
+R = 08fabf9b57de81875bfa7a4118e3e44cfb38ec6a9b2014940207ba3b1c583038
+S = a58d199b1deba7350616230d867b2747a3459421811c291836abee715b8f67b4
+
+Msg = b892ffabb809e98a99b0a79895445fc734fa1b6159f9cddb6d21e510708bdab6076633ac30aaef43db566c0d21f4381db46711fe3812c5ce0fb4a40e3d5d8ab24e4e82d3560c6dc7c37794ee17d4a144065ef99c8d1c88bc22ad8c4c27d85ad518fa5747ae35276fc104829d3f5c72fc2a9ea55a1c3a87007cd133263f79e405
+d = 24b1e5676d1a9d6b645a984141a157c124531feeb92d915110aef474b1e27666
+Qx = b4909a5bdf25f7659f4ef35e4b811429fb2c59126e3dad09100b46aea6ebe7a6
+Qy = 760ae015fa6af5c9749c4030fdb5de6e58c6b5b1944829105cf7edf7d3a22cfb
+k = 88794923d8943b5dbcc7a7a76503880ff7da632b0883aaa60a9fcc71bf880fd6
+R = 6ec9a340b77fae3c7827fa96d997e92722ff2a928217b6dd3c628f3d49ae4ce6
+S = 637b54bbcfb7e7d8a41ea317fcfca8ad74eb3bb6b778bc7ef9dec009281976f7
+
+Msg = 8144e37014c95e13231cbd6fa64772771f93b44e37f7b02f592099cc146343edd4f4ec9fa1bc68d7f2e9ee78fc370443aa2803ff4ca52ee49a2f4daf2c8181ea7b8475b3a0f608fc3279d09e2d057fbe3f2ffbe5133796124781299c6da60cfe7ecea3abc30706ded2cdf18f9d788e59f2c31662df3abe01a9b12304fb8d5c8c
+d = bce49c7b03dcdc72393b0a67cf5aa5df870f5aaa6137ada1edc7862e0981ec67
+Qx = c786d9421d67b72b922cf3def2a25eeb5e73f34543eb50b152e738a98afb0ca5
+Qy = 6796271e79e2496f9e74b126b1123a3d067de56b5605d6f51c8f6e1d5bb93aba
+k = 89e690d78a5e0d2b8ce9f7fcbf34e2605fd9584760fa7729043397612dd21f94
+R = 07e5054c384839584624e8d730454dc27e673c4a90cbf129d88b91250341854d
+S = f7e665b88614d0c5cbb3007cafe713763d81831525971f1747d92e4d1ca263a7
+
+Msg = a3683d120807f0a030feed679785326698c3702f1983eaba1b70ddfa7f0b3188060b845e2b67ed57ee68087746710450f7427cb34655d719c0acbc09ac696adb4b22aba1b9322b7111076e67053a55f62b501a4bca0ad9d50a868f51aeeb4ef27823236f5267e8da83e143047422ce140d66e05e44dc84fb3a4506b2a5d7caa8
+d = 73188a923bc0b289e81c3db48d826917910f1b957700f8925425c1fb27cabab9
+Qx = 86662c014ab666ee770723be8da38c5cd299efc6480fc6f8c3603438fa8397b9
+Qy = f26b3307a650c3863faaa5f642f3ba1384c3d3a02edd3d48c657c269609cc3fc
+k = ec90584ab3b383b590626f36ed4f5110e49888aec7ae7a9c5ea62dd2dc378666
+R = 13e9ad59112fde3af4163eb5c2400b5e9a602576d5869ac1c569075f08c90ff6
+S = 708ac65ff2b0baaccc6dd954e2a93df46016bd04457636de06798fcc17f02be5
+
+Msg = b1df8051b213fc5f636537e37e212eb20b2423e6467a9c7081336a870e6373fc835899d59e546c0ac668cc81ce4921e88f42e6da2a109a03b4f4e819a17c955b8d099ec6b282fb495258dca13ec779c459da909475519a3477223c06b99afbd77f9922e7cbef844b93f3ce5f50db816b2e0d8b1575d2e17a6b8db9111d6da578
+d = f637d55763fe819541588e0c603f288a693cc66823c6bb7b8e003bd38580ebce
+Qx = 74a4620c578601475fc169a9b84be613b4a16cb6acab8fd98848a6ec9fbd133d
+Qy = 42b9e35d347c107e63bd55f525f915bcf1e3d2b81d002d3c39acf10fc30645a1
+k = 4d578f5099636234d9c1d566f1215d5d887ae5d47022be17dbf32a11a03f053b
+R = 113a933ebc4d94ce1cef781e4829df0c493b0685d39fb2048ce01b21c398dbba
+S = 3005bd4ec63dbd04ce9ff0c6246ad65d27fcf62edb2b7e461589f9f0e7446ffd
+
+Msg = 0b918ede985b5c491797d0a81446b2933be312f419b212e3aae9ba5914c00af431747a9d287a7c7761e9bcbc8a12aaf9d4a76d13dad59fc742f8f218ef66eb67035220a07acc1a357c5b562ecb6b895cf725c4230412fefac72097f2c2b829ed58742d7c327cad0f1058df1bddd4ae9c6d2aba25480424308684cecd6517cdd8
+d = 2e357d51517ff93b821f895932fddded8347f32596b812308e6f1baf7dd8a47f
+Qx = 7e4078a1d50c669fb2996dd9bacb0c3ac7ede4f58fa0fa1222e78dbf5d1f4186
+Qy = 0014e46e90cc171fbb83ea34c6b78202ea8137a7d926f0169147ed5ae3d6596f
+k = be522b0940b9a40d84bf790fe6abdc252877e671f2efa63a33a65a512fc2aa5c
+R = a26b9ad775ac37ff4c7f042cdc4872c5e4e5e800485f488ddfaaed379f468090
+S = f88eae2019bebbba62b453b8ee3472ca5c67c267964cffe0cf2d2933c1723dff
+
+Msg = 0fab26fde1a4467ca930dbe513ccc3452b70313cccde2994eead2fde85c8da1db84d7d06a024c9e88629d5344224a4eae01b21a2665d5f7f36d5524bf5367d7f8b6a71ea05d413d4afde33777f0a3be49c9e6aa29ea447746a9e77ce27232a550b31dd4e7c9bc8913485f2dc83a56298051c92461fd46b14cc895c300a4fb874
+d = 77d60cacbbac86ab89009403c97289b5900466856887d3e6112af427f7f0f50b
+Qx = a62032dfdb87e25ed0c70cad20d927c7effeb2638e6c88ddd670f74df16090e5
+Qy = 44c5ee2cf740ded468f5d2efe13daa7c5234645a37c073af35330d03a4fed976
+k = 06c1e692b045f425a21347ecf72833d0242906c7c1094f805566cdcb1256e394
+R = eb173b51fb0aec318950d097e7fda5c34e529519631c3e2c9b4550b903da417d
+S = ca2c13574bf1b7d56e9dc18315036a31b8bceddf3e2c2902dcb40f0cc9e31b45
+
+Msg = 7843f157ef8566722a7d69da67de7599ee65cb3975508f70c612b3289190e364141781e0b832f2d9627122742f4b5871ceeafcd09ba5ec90cae6bcc01ae32b50f13f63918dfb5177df9797c6273b92d103c3f7a3fc2050d2b196cc872c57b77f9bdb1782d4195445fcc6236dd8bd14c8bcbc8223a6739f6a17c9a861e8c821a6
+d = 486854e77962117f49e09378de6c9e3b3522fa752b10b2c810bf48db584d7388
+Qx = 760b5624bd64d19c866e54ccd74ad7f98851afdbc3ddeae3ec2c52a135be9cfa
+Qy = feca15ce9350877102eee0f5af18b2fed89dc86b7df0bf7bc2963c1638e36fe8
+k = e4f77c6442eca239b01b0254e11a4182782d96f48ab521cc3d1d68df12b5a41a
+R = bdff14e4600309c2c77f79a25963a955b5b500a7b2d34cb172cd6acd52905c7b
+S = b0479cdb3df79923ec36a104a129534c5d59f622be7d613aa04530ad2507d3a2
+
+[P-256,SHA-512]
+
+Msg = 6c8572b6a3a4a9e8e03dbeed99334d41661b8a8417074f335ab1845f6cc852adb8c01d9820fcf8e10699cc827a8fbdca2cbd46cc66e4e6b7ba41ec3efa733587e4a30ec552cd8ddab8163e148e50f4d090782897f3ddac84a41e1fcfe8c56b6152c0097b0d634b41011471ffd004f43eb4aafc038197ec6bae2b4470e869bded
+d = 9dd0d3a3d514c2a8adb162b81e3adfba3299309f7d2018f607bdb15b1a25f499
+Qx = 6b738de3398b6ac57b9591f9d7985dd4f32137ad3460dcf8970c1390cb9eaf8d
+Qy = 83bc61e26d2bbbd3cf2d2ab445a2bc4ab5dde41f4a13078fd1d3cc36ab596d57
+k = 9106192170ccb3c64684d48287bb81bbed51b40d503462c900e5c7aae43e380a
+R = 275fa760878b4dc05e9d157fedfd8e9b1c9c861222a712748cb4b7754c043fb1
+S = 699d906bb8435a05345af3b37e3b357786939e94caae257852f0503adb1e0f7e
+
+Msg = 7e3c8fe162d48cc8c5b11b5e5ebc05ebc45c439bdbc0b0902145921b8383037cb0812222031598cd1a56fa71694fbd304cc62938233465ec39c6e49f57dfe823983b6923c4e865633949183e6b90e9e06d8275f3907d97967d47b6239fe2847b7d49cf16ba69d2862083cf1bccf7afe34fdc90e21998964107b64abe6b89d126
+d = f9bf909b7973bf0e3dad0e43dcb2d7fa8bda49dbe6e5357f8f0e2bd119be30e6
+Qx = f2a6674d4e86152a527199bed293fa63acde1b4d8a92b62e552210ba45c38792
+Qy = c72565c24f0eee6a094af341ddd8579747b865f91c8ed5b44cda8a19cc93776f
+k = e547791f7185850f03d0c58419648f65b9d29cdc22ed1de2a64280220cfcafba
+R = 4782903d2aaf8b190dab5cae2223388d2d8bd845b3875d37485c54e1ded1d3d8
+S = dfb40e406bfa074f0bf832771b2b9f186e2211f0bca279644a0ca8559acf39da
+
+Msg = d5aa8ac9218ca661cd177756af6fbb5a40a3fecfd4eea6d5872fbb9a2884784aa9b5f0c023a6e0da5cf6364754ee6465b4ee2d0ddc745b02994c98427a213c849537da5a4477b3abfe02648be67f26e80b56a33150490d062aaac137aa47f11cfeddba855bab9e4e028532a563326d927f9e6e3292b1fb248ee90b6f429798db
+d = 724567d21ef682dfc6dc4d46853880cfa86fe6fea0efd51fac456f03c3d36ead
+Qx = 70b877b5e365fcf08140b1eca119baba662879f38e059d074a2cb60b03ea5d39
+Qy = 5f56f94d591df40b9f3b8763ac4b3dbe622c956d5bd0c55658b6f46fa3deb201
+k = 79d6c967ed23c763ece9ca4b026218004c84dc2d4ccc86cf05c5d0f791f6279b
+R = 2ba2ea2d316f8937f184ad3028e364574d20a202e4e7513d7af57ac2456804d1
+S = 64fe94968d18c5967c799e0349041b9e40e6c6c92ebb475e80dd82f51cf07320
+
+Msg = 790b06054afc9c3fc4dfe72df19dd5d68d108cfcfca6212804f6d534fd2fbe489bd8f64bf205ce04bcb50124a12ce5238fc3fe7dd76e6fa640206af52549f133d593a1bfd423ab737f3326fa79433cde293236f90d4238f0dd38ed69492ddbd9c3eae583b6325a95dec3166fe52b21658293d8c137830ef45297d67813b7a508
+d = 29c5d54d7d1f099d50f949bfce8d6073dae059c5a19cc70834722f18a7199edd
+Qx = 3088d4f45d274cc5f418c8ecc4cbcf96be87491f420250f8cbc01cdf2503ec47
+Qy = 634db48198129237ed068c88ff5809f6211921a6258f548f4b64dd125921b78b
+k = 0508ad7774908b5705895fda5c3b7a3032bf85dab7232bf981177019f3d76460
+R = acd9f3b63626c5f32103e90e1dd1695907b1904aa9b14f2132caef331321971b
+S = 15c04a8bd6c13ed5e9961814b2f406f064670153e4d5465dcef63c1d9dd52a87
+
+Msg = 6d549aa87afdb8bfa60d22a68e2783b27e8db46041e4df04be0c261c4734b608a96f198d1cdb8d082ae48579ec9defcf21fbc72803764a58c31e5323d5452b9fb57c8991d31749140da7ef067b18bf0d7dfbae6eefd0d8064f334bf7e9ec1e028daed4e86e17635ec2e409a3ed1238048a45882c5c57501b314e636b9bc81cbe
+d = 0d8095da1abba06b0d349c226511f642dabbf1043ad41baa4e14297afe8a3117
+Qx = 75a45758ced45ecf55f755cb56ca2601d794ebeaeb2e6107fe2fc443f580e23c
+Qy = 5303d47d5a75ec821d51a2ee7548448208c699eca0cd89810ffc1aa4faf81ead
+k = 5165c54def4026ab648f7768c4f1488bcb183f6db7ffe02c7022a529a116482a
+R = ebc85fc4176b446b3384ccc62fc2526b45665561a0e7e9404ac376c90e450b59
+S = 8b2c09428e62c5109d17ed0cf8f9fd7c370d018a2a73f701effc9b17d04852c6
+
+Msg = 1906e48b7f889ee3ff7ab0807a7aa88f53f4018808870bfed6372a77330c737647961324c2b4d46f6ee8b01190474951a701b048ae86579ff8e3fc889fecf926b17f98958ac7534e6e781ca2db2baa380dec766cfb2a3eca2a9d5818967d64dfab84f768d24ec122eebacaab0a4dc3a75f37331bb1c43dd8966cc09ec4945bbd
+d = 52fe57da3427b1a75cb816f61c4e8e0e0551b94c01382b1a80837940ed579e61
+Qx = 2177e20a2092a46667debdcc21e7e45d6da72f124adecbc5ada6a7bcc7b401d5
+Qy = 550e468f2626070a080afeeb98edd75a721eb773c8e62149f3e903cf9c4d7b61
+k = 0464fe9674b01ff5bd8be21af3399fad66f90ad30f4e8ee6e2eb9bcccfd5185c
+R = f8250f073f34034c1cde58f69a85e2f5a030703ebdd4dbfb98d3b3690db7d114
+S = a9e83e05f1d6e0fef782f186bedf43684c825ac480174d48b0e4d31505e27498
+
+Msg = 7b59fef13daf01afec35dea3276541be681c4916767f34d4e874464d20979863ee77ad0fd1635bcdf93e9f62ed69ae52ec90aab5bbf87f8951213747ccec9f38c775c1df1e9d7f735c2ce39b42edb3b0c5086247556cfea539995c5d9689765288ec600848ecf085c01ca738bbef11f5d12d4457db988b4add90be00781024ad
+d = 003d91611445919f59bfe3ca71fe0bfdeb0e39a7195e83ac03a37c7eceef0df2
+Qx = 7b9c592f61aae0555855d0b9ebb6fd00fb6746e8842e2523565c858630b9ba00
+Qy = d35b2e168b1875bbc563bea5e8d63c4e38957c774a65e762959a349eaf263ba0
+k = ef9df291ea27a4b45708f7608723c27d7d56b7df0599a54bc2c2fabbff373b40
+R = 66d057fd39958b0e4932bacd70a1769bbadcb62e4470937b45497a3d4500fabb
+S = 6c853b889e18b5a49ee54b54dd1aaedfdd642e30eba171c5cab677f0df9e7318
+
+Msg = 041a6767a935dc3d8985eb4e608b0cbfebe7f93789d4200bcfe595277ac2b0f402889b580b72def5da778a680fd380c955421f626d52dd9a83ea180187b850e1b72a4ec6dd63235e598fd15a9b19f8ce9aec1d23f0bd6ea4d92360d50f951152bc9a01354732ba0cf90aaed33c307c1de8fa3d14f9489151b8377b57c7215f0b
+d = 48f13d393899cd835c4193670ec62f28e4c4903e0bbe5817bf0996831a720bb7
+Qx = 82a1a96f4648393c5e42633ecdeb1d8245c78c5ea236b5bab460dedcc8924bc0
+Qy = e8cbf03c34b5154f876de19f3bb6fd43cd2eabf6e7c95467bcfa8c8fc42d76fd
+k = efed736e627899fea944007eea39a4a63c0c2e26491cd12adb546be3e5c68f7d
+R = cf7fc24bdaa09ac0cca8497e13298b961380668613c7493954048c06385a7044
+S = f38b1c8306cf82ab76ee3a772b14416b49993fe11f986e9b0f0593c52ec91525
+
+Msg = 7905a9036e022c78b2c9efd40b77b0a194fbc1d45462779b0b76ad30dc52c564e48a493d8249a061e62f26f453ba566538a4d43c64fb9fdbd1f36409316433c6f074e1b47b544a847de25fc67d81ac801ed9f7371a43da39001c90766f943e629d74d0436ba1240c3d7fab990d586a6d6ef1771786722df56448815f2feda48f
+d = 95c99cf9ec26480275f23de419e41bb779590f0eab5cf9095d37dd70cb75e870
+Qx = 42c292b0fbcc9f457ae361d940a9d45ad9427431a105a6e5cd90a345fe3507f7
+Qy = 313b08fd2fa351908b3178051ee782cc62b9954ad95d4119aa564900f8ade70c
+k = 4c08dd0f8b72ae9c674e1e448d4e2afe3a1ee69927fa23bbff3716f0b99553b7
+R = f2bc35eb1b8488b9e8d4a1dbb200e1abcb855458e1557dc1bf988278a174eb3b
+S = ed9a2ec043a1d578e8eba6f57217976310e8674385ad2da08d6146c629de1cd9
+
+Msg = cf25e4642d4f39d15afb7aec79469d82fc9aedb8f89964e79b749a852d931d37436502804e39555f5a3c75dd958fd5291ada647c1a5e38fe7b1048f16f2b711fdd5d39acc0812ca65bd50d7f8119f2fd195ab16633503a78ee9102c1f9c4c22568e0b54bd4fa3f5ff7b49160bf23e7e2231b1ebebbdaf0e4a7d4484158a87e07
+d = e15e835d0e2217bc7c6f05a498f20af1cd56f2f165c23d225eb3360aa2c5cbcf
+Qx = 89dd22052ec3ab4840206a62f2270c21e7836d1a9109a3407dd0974c7802b9ae
+Qy = e91609ba35c7008b080c77a9068d97a14ca77b97299e74945217672b2fd5faf0
+k = c9f621441c235fc47ec34eef4c08625df1ec74918e1f86075b753f2589f4c60b
+R = a70d1a2d555d599bfb8c9b1f0d43725341151d17a8d0845fa56f3563703528a7
+S = 4e05c45adf41783e394a5312f86e66871c4be4896948c85966879d5c66d54b37
+
+Msg = 7562c445b35883cc937be6349b4cefc3556a80255d70f09e28c3f393daac19442a7eecedcdfbe8f7628e30cd8939537ec56d5c9645d43340eb4e78fc5dd4322de8a07966b262770d7ff13a071ff3dce560718e60ed3086b7e0003a6abafe91af90af86733ce8689440bf73d2aa0acfe9776036e877599acbabfcb03bb3b50faa
+d = 808c08c0d77423a6feaaffc8f98a2948f17726e67c15eeae4e672edbe388f98c
+Qx = b0c0ad5e1f6001d8e9018ec611b2e3b91923e69fa6c98690ab644d650f640c42
+Qy = 610539c0b9ed21ac0a2f27527c1a61d9b47cbf033187b1a6ada006eb5b2662ed
+k = 1f6d4a905c761a53d54c362976717d0d7fc94d222bb5489e4830080a1a67535d
+R = 83404dcf8320baf206381800071e6a75160342d19743b4f176960d669dd03d07
+S = 3f75dcf102008b2989f81683ae45e9f1d4b67a6ef6fd5c8af44828af80e1cfb5
+
+Msg = 051c2db8e71e44653ea1cb0afc9e0abdf12658e9e761bfb767c20c7ab4adfcb18ed9b5c372a3ac11d8a43c55f7f99b33355437891686d42362abd71db8b6d84dd694d6982f0612178a937aa934b9ac3c0794c39027bdd767841c4370666c80dbc0f8132ca27474f553d266deefd7c9dbad6d734f9006bb557567701bb7e6a7c9
+d = f7c6315f0081acd8f09c7a2c3ec1b7ece20180b0a6365a27dcd8f71b729558f9
+Qx = 250f7112d381c1751860045d9bcaf20dbeb25a001431f96ac6f19109362ffebb
+Qy = 49fba9efe73546135a5a31ab3753e247034741ce839d3d94bd73936c4a17e4aa
+k = 68c299be2c0c6d52d208d5d1a9e0ffa2af19b4833271404e5876e0aa93987866
+R = 7b195e92d2ba95911cda7570607e112d02a1c847ddaa33924734b51f5d81adab
+S = 10d9f206755cef70ab5143ac43f3f8d38aea2644f31d52eaf3b472ee816e11e5
+
+Msg = 4dcb7b62ba31b866fce7c1feedf0be1f67bf611dbc2e2e86f004422f67b3bc1839c6958eb1dc3ead137c3d7f88aa97244577a775c8021b1642a8647bba82871e3c15d0749ed343ea6cad38f123835d8ef66b0719273105e924e8685b65fd5dc430efbc35b05a6097f17ebc5943cdcd9abcba752b7f8f37027409bd6e11cd158f
+d = f547735a9409386dbff719ce2dae03c50cb437d6b30cc7fa3ea20d9aec17e5a5
+Qx = 4ca87c5845fb04c2f76ae3273073b0523e356a445e4e95737260eba9e2d021db
+Qy = 0f86475d07f82655320fdf2cd8db23b21905b1b1f2f9c48e2df87e24119c4880
+k = 91bd7d97f7ed3253cedefc144771bb8acbbda6eb24f9d752bbe1dd018e1384c7
+R = 008c1755d3df81e64e25270dbaa9396641556df7ffc7ac9add6739c382705397
+S = 77df443c729b039aded5b516b1077fecdd9986402d2c4b01734ba91e055e87fc
+
+Msg = efe55737771070d5ac79236b04e3fbaf4f2e9bed187d1930680fcf1aba769674bf426310f21245006f528779347d28b8aeacd2b1d5e3456dcbf188b2be8c07f19219e4067c1e7c9714784285d8bac79a76b56f2e2676ea93994f11eb573af1d03fc8ed1118eafc7f07a82f3263c33eb85e497e18f435d4076a774f42d276c323
+d = 26a1aa4b927a516b661986895aff58f40b78cc5d0c767eda7eaa3dbb835b5628
+Qx = 28afa3b0f81a0e95ad302f487a9b679fcdef8d3f40236ec4d4dbf4bb0cbba8b2
+Qy = bb4ac1be8405cbae8a553fbc28e29e2e689fabe7def26d653a1dafc023f3cecf
+k = f98e1933c7fad4acbe94d95c1b013e1d6931fa8f67e6dbb677b564ef7c3e56ce
+R = 15a9a5412d6a03edd71b84c121ce9a94cdd166e40da9ce4d79f1afff6a395a53
+S = 86bbc2b6c63bad706ec0b093578e3f064736ec69c0dba59b9e3e7f73762a4dc3
+
+Msg = ea95859cc13cccb37198d919803be89c2ee10befdcaf5d5afa09dcc529d333ae1e4ffd3bd8ba8642203badd7a80a3f77eeee9402eed365d53f05c1a995c536f8236ba6b6ff8897393506660cc8ea82b2163aa6a1855251c87d935e23857fe35b889427b449de7274d7754bdeace960b4303c5dd5f745a5cfd580293d6548c832
+d = 6a5ca39aae2d45aa331f18a8598a3f2db32781f7c92efd4f64ee3bbe0c4c4e49
+Qx = c62cc4a39ace01006ad48cf49a3e71466955bbeeca5d318d672695df926b3aa4
+Qy = c85ccf517bf2ebd9ad6a9e99254def0d74d1d2fd611e328b4a3988d4f045fe6f
+k = dac00c462bc85bf39c31b5e01df33e2ec1569e6efcb334bf18f0951992ac6160
+R = 6e7ff8ec7a5c48e0877224a9fa8481283de45fcbee23b4c252b0c622442c26ad
+S = 3dfac320b9c873318117da6bd856000a392b815659e5aa2a6a1852ccb2501df3
+
+
+
+[P-384,SHA-224]
+
+Msg = 39f0b25d4c15b09a0692b22fbacbb5f8aee184cb75887e2ebe0cd3be5d3815d29f9b587e10b3168c939054a89df11068e5c3fac21af742bf4c3e9512f5569674e7ad8b39042bcd73e4b7ce3e64fbea1c434ed01ad4ad8b5b569f6a0b9a1144f94097925672e59ba97bc4d33be2fa21b46c3dadbfb3a1f89afa199d4b44189938
+d = 0af857beff08046f23b03c4299eda86490393bde88e4f74348886b200555276b93b37d4f6fdec17c0ea581a30c59c727
+Qx = 00ea9d109dbaa3900461a9236453952b1f1c2a5aa12f6d500ac774acdff84ab7cb71a0f91bcd55aaa57cb8b4fbb3087d
+Qy = 0fc0e3116c9e94be583b02b21b1eb168d8facf3955279360cbcd86e04ee50751054cfaebcf542538ac113d56ccc38b3e
+k = e2f0ce83c5bbef3a6eccd1744f893bb52952475d2531a2854a88ff0aa9b12c65961e2e517fb334ef40e0c0d7a31ed5f5
+R = c36e5f0d3de71411e6e519f63e0f56cff432330a04fefef2993fdb56343e49f2f7db5fcab7728acc1e33d4692553c02e
+S = 0d4064399d58cd771ab9420d438757f5936c3808e97081e457bc862a0c905295dca60ee94f4537591c6c7d217453909b
+
+Msg = 5a3c80e608ed3ac75a6e45f6e94d374271a6d42b67a481860d5d309cc8b37c79cb61f1716dc8aa84cb309ef9d68eb7fc6cf4b42333f316a5c30e74198c8b340926e340c5de47674a707293c4aa2a1a2274a602f01c26b156e895499c60b38ef53fc2032e7485c168d73700d6fa14232596a0e4997854a0b05d02e351b9d3de96
+d = 047dd5baab23f439ec23b58b7e6ff4cc37813cccb4ea73bb2308e6b82b3170edfe0e131eca50841bf1b686e651c57246
+Qx = de92ff09af2950854a70f2178d2ed50cc7042a7188301a1ea81d9629ad3c29795cb7f0d56630a401e4d6e5bed0068d1e
+Qy = 6135adbd8624130735e64e65ecbd43770dcc12b28e737b5ed033666f34c918eb5589508e4a13b9243374a118a628dd0b
+k = f3922351d14f1e5af84faab12fe57ded30f185afe5547aeb3061104740ecc42a8df0c27f3877b4d855642b78938c4e05
+R = 38e181870cb797c1f4e6598cfd032add1cb60447d33473038d06df73919f844eddd16f40f911075f8a4bacc0d924e684
+S = a58dd1ca18aa31277de66c30c3bb7a14b53705ce6c547ed2cb0e336f63c42809422efffcc722d1155f2254330a02b278
+
+Msg = e7d974c5dbd3bfb8a2fb92fdd782f997d04be79e9713944ce13c5eb6f75dfdec811b7ee4b3859114b07f263846ae13f795eec8f3cb5b7565baff68e0fdd5e09ba8b176d5a71cb03fbc5546e6937fba560acb4db24bd42de1851432b96e8ca4078313cb849bce29c9d805258601d67cd0259e255f3048682e8fdbdda3398c3e31
+d = 54ba9c740535574cebc41ca5dc950629674ee94730353ac521aafd1c342d3f8ac52046ed804264e1440d7fe409c45c83
+Qx = 3db95ded500b2506b627270bac75688dd7d44f47029adeff99397ab4b6329a38dbb278a0fc58fe4914e6ae31721a6875
+Qy = 049288341553a9ac3dc2d9e18e7a92c43dd3c25ca866f0cb4c68127bef6b0e4ba85713d27d45c7d0dc57e5782a6bf733
+k = 04324bd078807f6b18507a93ee60da02031717217ee5ce569750737be912be72da087ac00f50e13fdf7249a6ae33f73e
+R = b2752aa7abc1e5a29421c9c76620bcc3049ecc97e6bc39fcca126f505a9a1bfae3bde89fb751a1aa7b66fa8db3891ef0
+S = f1c69e6d818ca7ae3a477049b46420cebd910c0a9a477fd1a67a38d628d6edaac123aebfca67c53a5c80fe454dba7a9d
+
+Msg = a670fda4d1d56c70de1d8680328043b2b7029633caf0ee59ffe1421c914bb937133d5a0f9214846b2e0b350455a74c4ab434c56de65a17139bb8212bf1c76071a37536fa29348f871dbb26baa92eb93d97e923a6d2ffd9be25cbc33075e494e6db657bd8dc053fe4e17148d8cf6e2058164f2b5766750eb01bbe7b361cdb848c
+d = dabe87bbe95499bac23bc83c8b7307fe04be198f00059e2bf67c9611feaffb2c8f274f6aa50eb99c3074186d8067d659
+Qx = c2aa0a695125279705917e02a4f258cade4c3ff9140a071414babf87764f426f7f36ffda9d5f3394375d24864235476f
+Qy = 8f9808da0ce0227cf453f9e456f557db9752e23b45cce4baad5fee3844ddd7e1112bcec01ea9d67c7a76f3535bd0cb58
+k = 65a0305854033cbc6fe3ca139c40ca354d45801ecb59f4a923c251dc6b25d12d452d99b5d6711fdb5efac812aa464cc4
+R = c7fc32997d17ac79baf5789e4503f5f1a8863872bc350a91f12dd3ef8cf78c254e829217809e8e00b6b8d4d85be3f1fd
+S = 1422e1838a22496df93486bce1142961dbd8478ae844b8dda54e210afdae0d9e930d587c91bb600b0bde7237186d94e6
+
+Msg = 7843f918fe2588bcfe756e1f05b491d913523255aa006818be20b676c957f4edb8df863c6f5f8c15b3b80c7a2aa277b70d53f210bdfb856337980c406ea140e439dd321471407f374f69877b2d82367eed51e3c82c13948616dcb301d0c31f8f0352f2846abd9e72071f446a2f1bd3339a09ae41b84e150fd18f4ba5d3c6bfa0
+d = df43107a1deb24d02e31d479087bd669e2bc3e50f1f44b7db9484a7143cdca6a3391bddfea72dc940dbce8ec5efbd718
+Qx = 76bd4be5d520471162cb5c36f80038301b325f845d9642204a84d78b3e721098932827bf872bde0a9f86383953667d29
+Qy = 415116b8b878f896a5aa4dbbdc21076f27135d8bbcaaca02489ef639d742bd63f377da0c8e8ab36ff19b4a7cc5d4ceb4
+k = 798abad5a30d1805794540057388ee05e2422901c6335f985b9d4447b3ef75524751abfeab6409ad6bf77d4ae3014558
+R = 98744e5c6742fa5118a74a70db4957647a3cc12add4e876b45974a6a8707809f871daadbfc0b865e01624f706b65f10c
+S = 9e256e8da8eff5a0c83baaa1ef4f7be798eba9543bf97adb0fff8719f5406ea1207a0cf703d99aa8f02169724b492273
+
+Msg = caa83d5ab07febbd2e0fe2d63738b9b7b8752594bea7aaf50345b3d2f316653a8c9222f2b7877b64679e9573e81461a426029e45b8873a575094a1d572e0d32a9f0a9c6bcb9a2868543b7d8bbe4a69a09e7321f05f8366cced1b72df526f895b60aed2c39c249653c7839538770d4e5f47d3926ec0d168ab6a1af15bf1dca1f7
+d = ea7a563ba2a7f5ab69973dca1f1a0d1572f0c59817cd3b62ad356c2099e2cdca1c553323563f9dfbb333b126d84abc7f
+Qx = cf4717c5f5de668b785f06bdc9845df5a09e4edd83f4669756407cbb60807305c632bc49f818f4a84b194369aa07736f
+Qy = 7391e4982af8a2218f704f627d01f0508bfc8304992a2d598a420bf2eb519f33bd7caf79380793733b3dba0cc5e2b9d8
+k = 7b9606b3df7b2a340dbc68d9754de0734e1faeb5a0135578a97628d948702235c60b20c8002c8fcf906783e1b389e754
+R = 0d680010bed373287f9767955b5d2850e150b6713b49e453eb280148e45230c853d99ea2d2f8fcbd3ddcba19aeec0af1
+S = 64329763a930ab5452afdb0557fef16ff71810d6343dfc9c6ae18905c3d274db6554cdc69d6078a1ca03284474a94f30
+
+Msg = 594603458d6534974aeeafba919c4d0f4cb6843a3af41204bbb88aeb2fca2772d305163dba863da050aabedbaf89db521955d1715de95bbcef979ecdc0c976181ece00355385f8a8f8cce127c9eac15ce3e958a3ed686184674ec9a50eb63271606ee7fdcb1323da3c3db8e89cad1fb42139a32d08abcfbf0d4ccfca18c89a86
+d = 4cc70cb35b3ddeb0df53a6bd7bd05f8ff4392a2db7344f2d443761484b3a468a4ee3d1a8b27113d57283fd18b05f7829
+Qx = 40e1fe21df34bb85a642a0abe819ebd128f7e39b84d8dcc4a9a599b372fb9588da1484600ec28b1297bb685f9ae77831
+Qy = f3aa69ada57879fdcbe8df19cefabc308add7d03b17b1fac2f7783fece6a8dfe20bc36f518692677d96e3f730a67a671
+k = 8eda401d98f5688c34d8dbebcd3991c87c0442b0379154eaa2e5287dabe9a9e34cfc1305d11ff68781df25d5611b331d
+R = ff2d772786e159448bba26afd8c3281941a4cb0c56fec6f5cccb4c292c4ee0f7af9bd39bbe2d88148732585e104fdb30
+S = 07a1d890770daa949a17797dca7af3e8163da981ec330c03d63d1a8312c152be6a718163205ffa08da7dcc163ba261f4
+
+Msg = 733252d2bd35547838be22656cc7aa67eff0af0b13b428f77267a513c6824c3dbae533068b6817e82665f009560affcfe4b2ddb5b667a644fc1a42d24f24e0947e0dc50fb62c919bc1fe4e7ded5e28f2e6d80fcf66a081fb2763526f8def5a81a4ddd38be0b59ee839da1643eeeaee7b1927cec12cf3da67c02bc5465151e346
+d = 366d15e4cd7605c71560a418bd0f382fd7cd7ad3090ff1b2dfbed74336166a905e1b760cf0bccee7a0e66c5ebfb831f1
+Qx = a143f277ab36a10b645ff6c58241ea67ffdc8acf12d60973068390f06b4d8f4d773b10c1ebf6889b1cfa73ebb90f6ca1
+Qy = 7a17cad29bb507b309021f6f92cb5c10ba535f4a3e317fcc68cfd02d3ccd269f465169c73d30ff308f5350d881b08aec
+k = dbe545f920bc3d704c43d834bab21e40df12ec9e16a619a3e6b3f08760c26aae6e4fd91fad00f745194794b74bb1baee
+R = cdc39b12bba30da66fe9554713c05880ddc27afa4d2d151440f124c351fb9496dc95046516b0921083347d64369846ac
+S = 797d0344e49f9ba87a187c50f664e5015d449e346b1a7bd9427c5be559fc58173651880d5aadf053f81899d3368d6181
+
+Msg = 5a182bd174feb038dfae3346267156bf663167f713dea1ce936b0edb815cd9b8c8e4d411c786ba2494a81442617255db7158b142e720d86c9b56680fb9efd4298cdd69079a28153494c42a24251c7ad42ecf7e97eabc1b3997529b2a297cbad2474269b87a0b1e385f2d7f8b6eb8d1cd75eaf7e91d1acbecd45d7b2bfbbe3216
+d = e357d869857a52a06e1ece5593d16407022354780eb9a7cb8575cef327f877d22322c006b3c8c11e3d7d296a708bdb6d
+Qx = ce9a2185a68d6094aa5849a6efe78b349946f7380f0c79aa9664246cfcc71a879e90ad78a0474f58644c6a208168150e
+Qy = 8354fa47673cb3e07d446521345706c5515584b2602f921c3b9c44dded9e2c3f90ce47adb36d7e5f9f95a8c5ad8af397
+k = 1e77367ac4e10924854d135ad2f2507f39e2bafdbce33ff256bcbe9a7329b8d27185218bcc3550aafbe3390e84c77292
+R = df3182d49ad70959fb0c95bc7312750ce70fc87f1a328d39d9b29ac05d31305ce7209d6c24d13225d9567b489f7a187b
+S = d812b05abab0e96de13291e1f0da6479444ed5cd9d959b76f6cb43d394769035364f7c831a104dc7b5bd9b4a8e64df64
+
+Msg = aaa99fb1c71340d785a18f6f668e898c25cf7a0ac31d13c5b388b7233408493a5a109af6d07065376b96f4903df7aba2b2af671a18772bb0472490d1240cde28967680727dd4acd47e0308920a75da857a6eeedee5b6586d45dff3d8a680599665aa895c89dd7770b824b7dee477ac5e7602d409d3cc553090c970b50811dbab
+d = 745a18db47324a3710b993d115b2834339315e84e7006eafd889fb49bd3cc5a8b50c90526e65e6c53bddd2916d14bead
+Qx = f692578c6f77531210aef55c9e004ce3b66cf268c6900dde31a8bbb76e7562e3fb76242de34ca330d2501030aa119466
+Qy = 40965833b28de926c46de060aa25beaeda98f8415a6b1e3564aa77870cf4c89bd4fde92c8f5d9bf0eb41721586859d8e
+k = 11b9b36720abcac084efdb44c9f5b7d039e3250cb1e9c47850189ba3cfc1489d858b2a44df357772b61d919c7e729c0f
+R = 02b252c99820cf50e6ce060ab55bd4f682276e29b4ae4197417432e6a7bfb8cf0bac89dfe105456af805d822cee77696
+S = 8e248bbf7d7028d63177e565c9d1666ee5be4d1ffbfffc9c7814b0cd38f74b98f3f2cd59be42b9f132bfe5ee789cd96c
+
+Msg = 1fadfa8254d3a0b82d137cfdd82043d5dc1fef195d5297b09cc5cfb061f59c933451c0dc2a11b4037f34f88dacb803251f8880c4b72585c3c196e6fb23484ca43a191f8e41b9b9a37e2e6fcaab6738c3c62d1c98e1c620bb788b7b51a04f998a510efdba0d3418622fe8ce203b3fcd553b9b4206365a39031797ad11e49745ec
+d = 93f20963ea5011ff4f26481e359309e634195f6289134087bd2e83eee008c962780a679784ee7ac6acda03d663ed27e0
+Qx = 0edcde3533ea019e18f1a3cd97b7962e8823dda36c389f8f9287549f796d11376392b8a01c7a80f127a8f75795e04f54
+Qy = 63d7c458dccfc02f5148d755d59f9bbc8e3c3ea34908777928440747795955741296abcdd5386676419ed8049fedb489
+k = 3ad308faf04c42ee5ac69d36bc0aa9a96aacf55ea0f27dac4f52e088f023d206340a6324874ffad169ff80624de24c96
+R = 209b72f9aae72c4339813573c3a8408a9e0be641ca863d81d9d14c48d0bf4cd44a1a7985cff07b5d68f3f9478475645b
+S = f6292e599b22a76eda95393cf59f4745fa6c472effd1f781879ad9a4437a98080b0b07dadad0c249631c682d2836a977
+
+Msg = 9ecb6f5ed3ba666a8536a81ef65012c2cb8b433508798d84708abb06dfb75503886f78384fb8c7a4d2d49ef539d9b8a0b60938c7f07471dda91f258b0d99691b38a8403a2bb3f956bdfd09baba16d9b6877097a9b6213481b47a06e139d23ec7abad5668d21f912fdb70d31bb9adf9b3ce80e308252fa81a51674f88d02db72b
+d = f175e6ac42fd48ec9d652c10707c039c67c4cc61d8c45a373dcda6e4ca6c53e947e49c24e01b48e7cdf92edfe6d316a1
+Qx = a40c64f595491ce15790a5a87fbe64c1800247b42acd08fe5257700719f46afc8acce0e4ede0517a312092d5e3d089cd
+Qy = d565df9dc2f381cc0c5d84f382a43a98018524c0b4708a44b3e2817f9719f29fbf9c15803591ed9b4790c5adaba9f433
+k = 812dcaa6d4f9a43ccc553288065d13761581485aa903a500a690ccafbd330ba4818c977b98c4bb57f8a182a1afacfae9
+R = d000f18d3e4c162ff0d16f662e6703e7a6f5bff7a333ed266fa4f44c752415946c34945c342c20f739677186b1d80ab3
+S = ae7f1271c89e0aaa238710d039ea73a69110cc28fcf426f2fe6754b63a59e417fa84f903cf7dccb5468b43ff083bbfd5
+
+Msg = e55bfca78d98e68d1b63688db12485578f36c489766f4d0bfaa0088433ff12133aaca455805095f2e655940860958b3ead111d9070778ee3bbf3e47e43d9eba8b8d9b1fdf72f793fcde2bcaa334f3e35fa2cca531ea7cf27fe9ccba741e38ac26129b2d612bf54a34e0ae6c166c0fef07fcd2b9ac253d7e041a500f7be7b8369
+d = 46c4f0b228b28aaa0ec8cfdf1d0ed3408b7ae049312fb9eaf5f3892720e68684cc8ad29844a3dc9d110edf6916dfb8bb
+Qx = 13ddec844731b7e30c467451df08ca11d6c581cb64abd8a257671cffd26f5ccad4df7b9ee8924047a88a5d2d7567609c
+Qy = d74ca94f590fd1d13e190cc1e03c3da6c3faab15c7dda034af3deefee8aeec3628fa8b1978c54cfcd071baa319a46ec0
+k = 2a9dd520207c40a379cd4036adef9ee60fa8bc8c0d39b3ad91850ac93fd543f218b1688581f23481a090b0e4c73792ac
+R = 94e08cca20fe3866f643f53ec65faf3f2b4d80cd9bcc8ff8f88bb28da9eada324fc2d048908dd3d08a9e0ebb547731bc
+S = 8e6f82c4d3069b14f4c844b4ca133a9503493265c9f77a7d4775eda67de76798a23dd7ea48e0ac3c337dd62bf058319d
+
+Msg = 02c6b3c83bd34b288d96409162aa4ff114e9d134bf948046eb5ebcc0c7fe9dfceadda83ed69da2fac00c8840f6c702a3fc5e6959d70f7e8af923e99e4937232ae3b841ffefd2e62fab3671a7c94a0281b8ea5bc176add57c5c9b6893fe7f5d48ce7256b96510810c4e046168a3c5be9843b84d5268a50349b3444341aa5490dd
+d = 1d7b71ef01d0d33a8513a3aed3cabb83829589c8021087a740ca65b570777089be721a61172b874a22a1f81aef3f8bb6
+Qx = 8d2721370df8f097d5a69396249a315f6037dc7045b3da11eacae6d43036f779d5de7053d101768b42cc2b1283a3aaea
+Qy = a046039ae662141f9954d278183eaa2e03917fe58583e32d344074d59d60caa5b0949c53066525d5cca923e2f201502e
+k = d1b25ad25581cad17e96f1d302251681fee5b2efbb71c3c15ff035b2145d015d18e0e52dc3187ab5a560277b3a3929b0
+R = d836f52b14c7391744868daa2d5cf27eb9380b9b6176195573d5b04842e9f2fc3794d6cf877feafee63d11b05f6a6bee
+S = 8b89042fef2c04d4bd6c9d66a06a010514321d623a5f8d57ba5ac3686872eaabca9e0ba2d058ae7028e870acf03ca32d
+
+Msg = 94f8bfbb9dd6c9b6193e84c2023a27dea00fd48356909faec2161972439686c146184f80686bc09e1a698af7df9dea3d24d9e9fd6d7348a146339c839282cf8984345dc6a51096d74ad238c35233012ad729f262481ec7cd6488f13a6ebac3f3d23438c7ccb5a66e2bf820e92b71c730bb12fd64ea1770d1f892e5b1e14a9e5c
+d = cf53bdd4c91fe5aa4d82f116bd68153c907963fa3c9d478c9462bb03c79039493a8eaeb855773f2df37e4e551d509dcd
+Qx = 3a65b26c08102b44838f8c2327ea080daf1e4fc45bb279ce03af13a2f9575f0fff9e2e4423a58594ce95d1e710b590ce
+Qy = fe9dcbcb2ec6e8bd8ed3af3ff0aa619e900cc8bab3f50f6e5f79fac09164fb6a2077cc4f1fed3e9ec6899e91db329bf3
+k = df31908c9289d1fe25e055df199591b23e266433ab8657cc82cb3bca96b88720e229f8dfd42d8b78af7db69342430bca
+R = 6770eea9369d6718e60dd0b91aee845ff7ed7e0fcc91675f56d32e5227fd3a4612bbcb1556fe94a989b9e3bcc25bb20e
+S = c43072f706c98126d06a82b04251e3ecb0ba66c4bb6cd7c025919b9cc6019cdc635256d2a7fa017b806b1e88649d2c0d
+
+[P-384,SHA-256]
+
+Msg = 663b12ebf44b7ed3872b385477381f4b11adeb0aec9e0e2478776313d536376dc8fd5f3c715bb6ddf32c01ee1d6f8b731785732c0d8441df636d8145577e7b3138e43c32a61bc1242e0e73d62d624cdc924856076bdbbf1ec04ad4420732ef0c53d42479a08235fcfc4db4d869c4eb2828c73928cdc3e3758362d1b770809997
+d = c602bc74a34592c311a6569661e0832c84f7207274676cc42a89f058162630184b52f0d99b855a7783c987476d7f9e6b
+Qx = 0400193b21f07cd059826e9453d3e96dd145041c97d49ff6b7047f86bb0b0439e909274cb9c282bfab88674c0765bc75
+Qy = f70d89c52acbc70468d2c5ae75c76d7f69b76af62dcf95e99eba5dd11adf8f42ec9a425b0c5ec98e2f234a926b82a147
+k = c10b5c25c4683d0b7827d0d88697cdc0932496b5299b798c0dd1e7af6cc757ccb30fcd3d36ead4a804877e24f3a32443
+R = b11db00cdaf53286d4483f38cd02785948477ed7ebc2ad609054551da0ab0359978c61851788aa2ec3267946d440e878
+S = 16007873c5b0604ce68112a8fee973e8e2b6e3319c683a762ff5065a076512d7c98b27e74b7887671048ac027df8cbf2
+
+Msg = 784d7f4686c01bea32cb6cab8c089fb25c341080d9832e04feac6ea63a341079cbd562a75365c63cf7e63e7e1dddc9e99db75ccee59c5295340c2bba36f457690a8f05c62ab001e3d6b333780117d1456a9c8b27d6c2504db9c1428dad8ba797a4419914fcc636f0f14ede3fba49b023b12a77a2176b0b8ff55a895dcaf8dbce
+d = 0287f62a5aa8432ff5e95618ec8f9ccaa870dde99c30b51b7673378efe4ccac598f4bbebbfd8993f9abb747b6ad638b9
+Qx = b36418a3014074ec9bbcc6a4b2367a4fb464cca7ec0a324cb68670d5c5e03e7a7eb07da117c5ea50b665ab62bd02a491
+Qy = 4ea299c30e7d76e2c5905babada2d3bb4ee5eb35a5a23605cdb0d5133471a53eb9e6758e49105a4eaf29d2267ba84ef2
+k = 935eeab3edeb281fbd4eead0d9c0babd4b10ff18a31663ee9de3bfa9ae8f9d266441158ea31c889ded9b3c592da77fd7
+R = 738f9cb28f3b991335ef17b62559255faf75cad370a222464a492e27bb173c7f16b22100ada6b695875c7e4b1a28f158
+S = bc998c30e1491cd5d60dc7d1c38333165efe036b2a78db9b8f0e85ee68619cfba654e11ae5ca5ee5a87099c27cf22442
+
+Msg = 45e47fccc5bd6801f237cdbeac8f66ebc75f8b71a6da556d2e002352bd85bf269b6bc7c928d7bb1b0422601e4dd80b29d5906f8fcac212fe0eaaf52eda552303259cbcbe532e60abd3d38d786a45e39a2875bce675800a3eaeb9e42983d9fd9031180abd9adccc9ba30c6c198b4202c4dd70f241e969a3c412724b9b595bc28a
+d = d44d3108873977036c9b97e03f914cba2f5775b68c425d550995574081191da764acc50196f6d2508082a150af5cd41f
+Qx = c703835d723c85c643260379d8445b0c816fe9534351921e14a8e147fe140ec7b0c4d704f8dc66a232b2333b28f03dee
+Qy = c5d0bb054053fd86c26f147c4966757aa04b00513a02d427b8d06c16055c607955efdc518d338abfe7927c195dc28588
+k = c80f63e080650c8a21e4f63a62ec909adfb7d877f365d11ee1cb260baf112eb4730c161c1d99dba98fc0d5bbd00dc97d
+R = 81de2810cde421997013513951a3d537c51a013110d6dbb29251410bcb5ba001a9686b8490f1e581e282fd2ed0974b22
+S = 9cab0bbaffe91c7677ec3dd1f17060211a3cc0be574cbca064aa8c4b66ba6e64f3d80e83da895042ca32d311c388d950
+
+Msg = c33ff63b4e6891e00b2349b3f2907c417ca355560544a91e24a7a0ee260d6850aeded29fc0176b6039ca6187e8333391047cceaf14b1077df8f147dad84d36b2dac5666dc2f69dc9b58b88cc73956efdb3b47f91831d5875051c76b0c4e9fc087012a1f03eeee85d6745b46aa50bd9cb0110c2c94508765cec162ee1aa841d73
+d = d5b72cbb6ec68aca46b9c27ad992afd8ffa02cb3067b234fcfa6e272e3b31be760695ff7df988b57663057ab19dd65e3
+Qx = 135a6542612f1468d8a4d01ff1914e532b1dd64d3627db9d403dc325651d3f82b0f6f0fd1dbdeca2be967c4fb3793b5f
+Qy = cbbd40f6d3a38d0dfb64582ff4789d7b268241bc0c36de2884bccfaeeff3b7b2b46a30bb35719804e0d11124b4e7f480
+k = 9da6de7c87c101b68db64fea40d97f8ad974ceb88224c6796c690cbf61b8bd8eede8470b3caf6e6106b66cf3f0eebd55
+R = 17840911ecdf6ae0428b2634f442163c2c11b8dbf0cc7a5596fbe4d33e3e52f9d99e99ad169867b1f39e89c9180cedc2
+S = dd7ed67e480866d0474379ea4afff72870746f4feef2153be42f13bf472b1613d7faa5c0abb7f7464070f94d7cf3f234
+
+Msg = f562f2b9d84b0e96a52532c3b43c39c8018c738bd8dc3797a7de7353971b2729d522d6961b1f2e4df3f6a4bd3653e6d72b74fc0dba92ab939c4b542e994e5db6dd8ed4f56f651e699052e791237ae1f552f990ad156226ae8f7bf17fcbfa564f749604f97e9df0879d50985747d981422a23040fe52f5ec74caf1d4aaad8a710
+d = 218ee54a71ef2ccf012aca231fee28a2c665fc395ff5cd20bde9b8df598c282664abf9159c5b3923132983f945056d93
+Qx = 01989ff07a7a452d8084937448be946bfedac4049cea34b3db6f7c91d07d69e926cce0af3d6e88855a28120cf3dba8df
+Qy = eb064e029d7539d4b301aabafe8de8870162deffe6383bc63cc005add6ee1d5ced4a5761219c60cd58ad5b2a7c74aaa9
+k = c5d39b436d851d94691f5f4aa9ef447f7989d984f279ae8b091aef5449ac062bcc0567740f914624ad5b99fc32f9af0b
+R = 07d5b1b12877e8cb5e0aa5e71eeeb17bf0aa203064c7e98b3a1798a74dc9717252dc47c7f06aaf1d5fe15b868323bbb9
+S = 69428cf101a7af5d08161a9fd7af212e02e33b6062aebdce4c96bf3a0684b5394cb902ca7c2dec6e2f01f40c4576009d
+
+Msg = ace953ae851f571d71779aa120915f27450b236da23e9106f8d0756abdd25861937941228d225d5fb1aa1b1ebf759b1e326aeb3b6cd0cd87edd2ab9f6a7ad67b63d2c501d6a550edb2e7c9d216cc8af78dd33546af64d00abed4d0d2cfc5c9a7b5a055dbe8f7547902d185cf46937314832bc5c602419a82ab83dbd9d3bd5aff
+d = e6ab171f6937c000e144950801ad91023ae8e8476856c2592d9f7d5bb7180fd729211803d39a412ead6c0be761cfa5d1
+Qx = 38bc42b8c9d8866d09b214398d584b1b24a488dfacc3420d1e9506aa825b19fdf1ba74e7b8f547f47b571467fe8c4d1f
+Qy = 5179d62668d3f6a7ab5c8e3761a685e12008fb87d0529a97645f65cfb5364376c1b6682e0ffcddd0bcd995c41d013ad3
+k = 05e9718aea9669c9e434f73866da5f252dec6d24c47a1c4ee3233450b6ec626de9746ebe095b285558dfc89fc1b622fe
+R = df9bab9dd1f22ec6f27116f38831cb2089aa78aa8c073024a0faddd9a48e810a5e8e2cadd80fbf8dbd6088c71fe30b5b
+S = 1e0e8718567d12d18558c57f9e87a755c309e4ffb497335a3adfc8d7475ce8fd882d5dc33a8f5a16274b7ad74bb7862a
+
+Msg = 9635ab832240be95301bedb94c5aec169eedc198cbbdfedcf41e9b586143d829b4597a6b2a81902828332825fd84a785f187a3894e21bd99d22c4f94dcf34453fc052f15ec64d1447c932cb38fcdd30b7be851963409c11881438cbaad7e96f9efbde317f2235d66af804477a5dfe9f0c51448383830050ecf228889f83631e1
+d = 14acd516c7198798fd42ab0684d18df1cd1c99e304312752b3035bed6535a8975dff8acfc2ba1675787c817b5bff6960
+Qx = 29909d143cf7ee9c74b11d52f1a8f3ebd4a720c135612ca5618d3f432f03a95602ee75a2057e1d7aab51d0648ac0b334
+Qy = 404b6c5adffbadfa1b0380ae89fed96ec1ca16cc28661e623d0f1c8b130fbaa96dd7257eae2bf03c2d3dcbc3dbc82c58
+k = 7f623c103eaa9099a0462e55f80519c565adaeffcb57a29993f3a8a92e63a560be8f0fb9d23dc80bff1064bb41abad79
+R = 932ab291950c16b2b19a8036cd2e905714c6229cb190a73b3ea49c48dd8e76063a453c7c3267a57597d2973678216296
+S = d17d4c5ddbb9c27beebf526f113b416c8abfad53d11c4224813c7f351ba41a77dd4e77d6e4a65bef2c9f62cc37a469a5
+
+Msg = d98b9a7d4fe9d0fd95de5056af164a8b7882cd34ab5bde83a2abb32dc361eb56a479a3a6119db3b91dcad26a42d2206749567f0d97c34a981a91fc734921821a429f6a53401743a5c406ba9d560f956203abc9d1f32f1a13e7d7b290f75c95fdbf857ea597021461c06a3aacfa554ede3d69e4ff03bbbee5b7463ec77de2b3b2
+d = 2e780550984f3a00cb1e412429b33493c6eb6cd86d12f9d80588c247dcf567bd04296d2d4b24b889d9c54954b7f38f57
+Qx = 37dac42ef04663238443ef33e8addee2e78c40d50a1751913a7f5c37d1f23a26c7f86e16055c788b8ca9554f06b2f2ef
+Qy = bbed1549652904e3d00c39b01cc0460dbaf3185e6190c2705677a9701de1fe56dff4f4d8418ee15059ff8fc36800982d
+k = b788ca82811b0d4e4841765c71eafaa1e575378beedcd3860d8b92db3d070ac5aef7c425067860fbee6c50cf0c642bbb
+R = 7292b3851870daeb2555a8a2fb198ead78739fcfb75327e5c32a82c6b77d58983e5ad548ccb75dcf9411039c9576d9b9
+S = a378c61802d9f1dd062b6e18f16416a954018f77df4df95ad1b983570377d5cfce4cc7861759e802c52f81abc4f49aac
+
+Msg = 1b4c754ac1c28dc415a71eac816bde68de7e8db66409af835838c5bb2c605111108a3bf13606ed5d8ade5ed72e50503e0de664416393d178ea4eec834d8d6f15039847b410080fd5529b426e5aadd8451c20ebd92d787921f33e147bcbeb327b104d4aab1157fc1df33e4d768404b5ccb7110055c2508c600f429fd0c21b5784
+d = a24d0fe90808aecc5d90626d7e6da7c9be5dfd4e1233c7f0f71f1b7c1c6fd318fafe18559c94718f044cf02ed5107cb1
+Qx = ec8ae1fb9bb88589d27d6f27d790392853396f37bc0c381631d85800fc668eea0886bf1c6cff801147df19778d5b1604
+Qy = 1e1a8336c1e2506f8ee388b55cc648ae73b9295ea78467979d2affb364536fad28120f51ec62a67cbb6ce7784780389f
+k = 755d025509b73cf1ea8817beb772ad150b4c17a52378be187daffe3db0158921e5e552d1ca3c85df28519939f3cb794d
+R = 23ff2ffa62bbd427d49995d9c9950116e0d5a06ef076a4553448bc109e6482c5e87d4c833bc88de0bc722bc98cae2e61
+S = 9aea13d487c3ea6917e16374caafcf0321c12a80d28902dd8cd81909bb04b8c439e2491e504756742d0d0bfb15a9c34c
+
+Msg = 3cd8c053741dd9f974c6c5dbf8a1e5728e9b5eafb1cbcfc3452f5fbbda32a8c7564dee157e8d902c52514361da6d972934a56b3276e2a9379e328e24282e0db697c5bc29090fc489ec46b7b188325dd4e96494c250de0f4a89fe2ccf919eaefcfb50c288113e6df92714feb7f46e0822478c796d0f4ff3447a32997e892693ce
+d = 1c172e25732555afee7ded67a496f3f11babc0875898619f4519c29321e201e8ba1149f2c20b48e5efba235d58fea7c3
+Qx = 13e9e2c8bbcfe26e8f5f43c86268c5980ee693236a6b8777f3a7323718baa21005b482d08aafc6fa6e3667d91353544c
+Qy = 9ba181b3ee505be030f87ecd249b00670a791489b42af04976013483ff95b630c91c01e95757e906129f2f9b4ce719a8
+k = 08aec9a9e58bdc028805eb5dc86073d05fff1f5fb3fd17f510fc08f9272d84ba7aa66b6f77d84fe6360bd538192bf01a
+R = 2b4337c3dfbc886ffad7858ae2480cb62227e12205a70361c42f1a5ca9e658ee30fc3cf4030d85bd065edad83b99821f
+S = 2550cef8574bf17fb3d6b0c9d04ab266962bac3621bac233ff2e4989712d2a4a07171c0aebd3040cd6a32c3bd3efb8b5
+
+Msg = ed955dda6d9650124804d3deb6aeef900e520faf98b1ef6f14efcada7ca2433f09329b70897305e59c89024d76e466b28fe02cb2a9b12e2478c66470259d7c282137a19e5a04ffadea55245c0f34a681593fedc42931d8b3321b3d82e9cc102cd00540ad311ec7bd8c9d06db21bea4ca3dc74d98931ae0d40494aefc2345132c
+d = 5b96555dbd602e71d4d5d3aee19fd1ea084ee23d4f55c10937056762bc2015cbded2e898a487f5482ab7e1e971245907
+Qx = 6e14c17bb831b0112d7f3543c5fd17c78379a516c9e0539b03b8b4bfdead2820343fc84b0382807573ded6c4d97b7003
+Qy = 7f60021d2de77546db666721c9aec84c3e2ba8de0ba77443600dc77e6839bbf9316271adb22d4cb47d08f745ecb1dafd
+k = 7ad6f4ffd2b429ba10c6f112f800cacf1ad508cf8eba880893bb9659c1ddaaec57dcdc093a114500460d457bdde324f2
+R = faea950ca513806bc59028c638d6302ffc86978c3ff1f06db015dd7c4777050186cb8dd871f5e926e1416539c1939c2f
+S = 2c592240eabb8a1f9878e1b5c9d5d3ced7b3a7ae571f5a86494ed2ca567a36eb72e7bea8934bded29594bccf67ca84bd
+
+Msg = ce395b001da2a58e49691605d44af4206306f62f561bf2394060d2a5591a350277166bed043819035f1e60b5b3fb5ae113ddd0473f8ef6b2b050c472c2a264e1d8b3ca82a4f158c40f2d78d9ce5e5ea6de243f2e1f13f47f6c6f403b270912c81c636be35b396ca58468b3fb60aa83911d61441a0528d973bc31f965d4059080
+d = 8df9c3c710a25192f3dea970910bb3784e3509874cccf4334823eb9f7a8d05b067f2d812d61e878e24b093089a0b8245
+Qx = 92c9e32b20cbe6d4ed0727c6c942cf804a72031d6dfd69078b5e78ebce2d192268f1f5e2abce5aaf1f8d6a35f136837f
+Qy = d5167905fa7689e03b9fb1487c566f62b36f2bc1c4a2bfb6a836113b5c8d46f7c1ca51b628b14397fbc06ec9a07f4849
+k = 258dd05919735cd48627c9fe9fac5c252604aa7c2ae0460d7c1149cd96b7bd2ba195ad393bf392a2499f06aead5ba050
+R = 413793bcce52eda0f5b675a8d687cce86d5c9e1659b38a89e96246b5e05f8b0934d17dbba3b2ea44c838aa5fd87125d1
+S = ce7309fc2d6e3438818a1a29a997410b025b0403de20795b97c86c46034a6b02afeed279aeb06522d4de941bfdf50469
+
+Msg = ffefe316455ae4ffdb890bb804bf7d31424ea060ecacff419d0f7134ff76ad434063c0ec0f8bb7059584d3a03f3625bb9e9f66ace1a47ac4b8f3e76fc7c420c55edb1427d1fa15b387ad73d02b0595c4e74321be8822752230a0dcfb85d60bfa186da7623a8ec3eb1633f0a294b23ae87216b14ccee9ef56418dcfab9427371e
+d = 6002cb01ad2ce6e7101665d47729c863b6435c3875de57a93f99da834f73e3e6e2b3880e06de3e6bd1d51ea1807ab0d7
+Qx = e4216e1a20af8e8e3e74653ac016545001066e53e64af679ad1c85841bb475aed3e00ead052ae9955f48d675ff4ace56
+Qy = 8804c17641be21d4c6386902c9c5c888af25d97ca383703ea4a85cf93bbab360c0bbd2993374da499a303778650270b9
+k = 6b9507fd2844df0949f8b67b6fde986e50173713ac03df2edf65cb339859321cd3a2b9aab8356f95dec62460ab19c822
+R = 018891f6381ed358b422f79a299cf0789cee783ba388af4d82cbbe17f3709751b7fd9400e9702820c28b9afc62fdf489
+S = aef73bd590802b2fd2a65c4f7fec89f9b24ecc199a69254785925f334cd1977c5e1f858bd9830d7d7d243ea707b1af0b
+
+Msg = 304bccb718b3a9e12669913490cc5bcc1979287b56c628fad706c354241e88d10e81445a2853e3fc32ece094ba1abc3fdcab61da27f9a0fca739371049fed462ee6b08fa31cde12720f8144a6f00ce9b1a7a6eadd231f126717074b4efb5c72ce673ca5859000a436f67a338d698759f12c461247c45a361fb6cb661fdbe6714
+d = d8559c3543afc6f7b3dc037a687bad2630283757ba7862fd23ed14e2151a4cf5fed3d249268f780e0b96b6b46274a2d5
+Qx = 5f94223918f2ec9f0a08342cb99e724881c92453957c59672860f69daac01b660331a0f5845e50f1f27766b219c89e7e
+Qy = d76d83396130d10d1168d76c7fc83742ffffbe66d9f4da4ca3f95f5ad6dac8cc7bb65d16d317d37aa99fdbf30ec7439c
+k = 4ad5a92b5b8e170b71c8a7ed419dc624c7680004562b8d16a37b6e639f581ce81d5f0d98cce44d54c4e7136229148340
+R = f7baa6a5488ab462ea59aa31a36402b15880c68110b6069f51ede0c3b52a7b1e5bf926fdbe95768931b7d5f87058835c
+S = 28b1c4ef448a432f7c91b98b0c6471691e888211b6af907369a8930859b8cdb2e94f466a44f4e52f46df9b0d65e35de6
+
+Msg = 64f9f05c2805acf59c047b5f5d2e20c39277b6d6380f70f87b72327a76170b872bfe4b25c451602acfb6a631bb885e2655aee8abe44f69c90fb21ffde03cef2a452c468c6369867dfd8aa26ac24e16aa53b292375a8d8fbf988e302bf00088e4c061aa12c421d8fe3cbd7273b0e8993701df1c59431f436a08b8e15bd123d133
+d = b9208cbfd186ddfa3efd5b71342ae1efb01a13ebc4c2a992a2cbee7254b7846a4252ece1104b89d13d835911f8511224
+Qx = 166e6d96cb60d916fd19888a2dd945a3306ff0d7b0a5e30729f47d3dac3de2be3fd5cd7437e9a80d6c48cf960d2d36f8
+Qy = e6b2b70f131092ae210f29cc6bad701318bddb31bddf921695855c6208941100d0cee5d10799f8b835afe3ea510e8229
+k = da706ab5f61531f2378b3c0a2b342108cd119eadaa88b859df64923bccfb0ec2393fd312826f65c15a6587d1d460015b
+R = d9124c42858080c62400e4d4d8136304e03d910cbe9b9b3487f4d27c7e0540a314d34bef8c850045c8746ca631c11c42
+S = bbf6424a3b70166fa799f49e918439d515327039258ef9bd88435a59c9c19659f8ec3c8660720b0c08354ff60e0f5a76
+
+[P-384,SHA-384]
+
+Msg = 6b45d88037392e1371d9fd1cd174e9c1838d11c3d6133dc17e65fa0c485dcca9f52d41b60161246039e42ec784d49400bffdb51459f5de654091301a09378f93464d52118b48d44b30d781eb1dbed09da11fb4c818dbd442d161aba4b9edc79f05e4b7e401651395b53bd8b5bd3f2aaa6a00877fa9b45cadb8e648550b4c6cbe
+d = 201b432d8df14324182d6261db3e4b3f46a8284482d52e370da41e6cbdf45ec2952f5db7ccbce3bc29449f4fb080ac97
+Qx = c2b47944fb5de342d03285880177ca5f7d0f2fcad7678cce4229d6e1932fcac11bfc3c3e97d942a3c56bf34123013dbf
+Qy = 37257906a8223866eda0743c519616a76a758ae58aee81c5fd35fbf3a855b7754a36d4a0672df95d6c44a81cf7620c2d
+k = dcedabf85978e090f733c6e16646fa34df9ded6e5ce28c6676a00f58a25283db8885e16ce5bf97f917c81e1f25c9c771
+R = 50835a9251bad008106177ef004b091a1e4235cd0da84fff54542b0ed755c1d6f251609d14ecf18f9e1ddfe69b946e32
+S = 0475f3d30c6463b646e8d3bf2455830314611cbde404be518b14464fdb195fdcc92eb222e61f426a4a592c00a6a89721
+
+Msg = d768f41e6e8ec2125d6cf5786d1ba96668ac6566c5cdbbe407f7f2051f3ad6b1acdbfe13edf0d0a86fa110f405406b69085219b5a234ebdb93153241f785d45811b3540d1c37424cc7194424787a51b79679266484c787fb1ded6d1a26b9567d5ea68f04be416caf3be9bd2cafa208fe2a9e234d3ae557c65d3fe6da4cb48da4
+d = 23d9f4ea6d87b7d6163d64256e3449255db14786401a51daa7847161bf56d494325ad2ac8ba928394e01061d882c3528
+Qx = 5d42d6301c54a438f65970bae2a098cbc567e98840006e356221966c86d82e8eca515bca850eaa3cd41f175f03a0cbfd
+Qy = 4aef5a0ceece95d382bd70ab5ce1cb77408bae42b51a08816d5e5e1d3da8c18fcc95564a752730b0aabea983ccea4e2e
+k = 67ba379366049008593eac124f59ab017358892ee0c063d38f3758bb849fd25d867c3561563cac1532a323b228dc0890
+R = fb318f4cb1276282bb43f733a7fb7c567ce94f4d02924fc758635ab2d1107108bf159b85db080cdc3b30fbb5400016f3
+S = 588e3d7af5da03eae255ecb1813100d95edc243476b724b22db8e85377660d7645ddc1c2c2ee4eaea8b683dbe22f86ca
+
+Msg = 6af6652e92a17b7898e40b6776fabaf0d74cf88d8f0ebfa6088309cbe09fac472eeac2aa8ea96b8c12e993d14c93f8ef4e8b547afe7ae5e4f3973170b35deb3239898918c70c1056332c3f894cd643d2d9b93c2561aac069577bbab45803250a31cd62226cab94d8cba7261dce9fe88c210c212b54329d76a273522c8ba91ddf
+d = b5f670e98d8befc46f6f51fb2997069550c2a52ebfb4e5e25dd905352d9ef89eed5c2ecd16521853aadb1b52b8c42ae6
+Qx = 44ffb2a3a95e12d87c72b5ea0a8a7cb89f56b3bd46342b2303608d7216301c21b5d2921d80b6628dc512ccb84e2fc278
+Qy = e4c1002f1828abaec768cadcb7cf42fbf93b1709ccae6df5b134c41fae2b9a188bfbe1eccff0bd348517d7227f2071a6
+k = 229e67638f712f57bea4c2b02279d5ccad1e7c9e201c77f6f01aeb81ea90e62b44b2d2107fd66d35e56608fff65e28e4
+R = b11db592e4ebc75b6472b879b1d8ce57452c615aef20f67a280f8bca9b11a30ad4ac9d69541258c7dd5d0b4ab8dd7d49
+S = 4eb51db8004e46d438359abf060a9444616cb46b4f99c9a05b53ba6df02e914c9c0b6cc3a9791d804d2e4c0984dab1cc
+
+Msg = b96d74b2265dd895d94e25092fb9262dc4f2f7a328a3c0c3da134b2d0a4e2058ca994e3445c5ff4f812738e1b0c0f7a126486942a12e674a21f22d0886d68df2375f41685d694d487a718024933a7c4306f33f1a4267d469c530b0fed4e7dea520a19dd68bf0203cc87cad652260ed43b7b23f6ed140d3085875190191a0381a
+d = de5975d8932533f092e76295ed6b23f10fc5fba48bfb82c6cc714826baf0126813247f8bd51d5738503654ab22459976
+Qx = f1fabafc01fec7e96d982528d9ef3a2a18b7fe8ae0fa0673977341c7ae4ae8d8d3d67420343d013a984f5f61da29ae38
+Qy = 1a31cf902c46343d01b2ebb614bc789c313b5f91f9302ad9418e9c797563e2fa3d44500f47b4e26ad8fdec1a816d1dcf
+k = fc5940e661542436f9265c34bce407eff6364bd471aa79b90c906d923e15c9ed96eea4e86f3238ea86161d13b7d9359d
+R = c2fbdd6a56789024082173725d797ef9fd6accb6ae664b7260f9e83cb8ab2490428c8b9c52e153612295432fec4d59cd
+S = 8056c5bb57f41f73082888b234fcda320a33250b5da012ba1fdb4924355ae679012d81d2c08fc0f8634c708a4833232f
+
+Msg = 7cec7480a037ff40c232c1d2d6e8cd4c080bbeecdaf3886fccc9f129bb6d202c316eca76c8ad4e76079afe622f833a16f4907e817260c1fa68b10c7a151a37eb8c036b057ed4652c353db4b4a34b37c9a2b300fb5f5fcfb8aa8adae13db359160f70a9241546140e550af0073468683377e6771b6508327408c245d78911c2cc
+d = 11e0d470dc31fab0f5722f87b74a6c8d7414115e58ceb38bfcdced367beac3adbf1fe9ba5a04f72e978b1eb54597eabc
+Qx = 1950166989164cbfd97968c7e8adb6fbca1873ebef811ea259eb48b7d584627f0e6d6c64defe23cbc95236505a252aa1
+Qy = 41ef424b5cb076d4e32accd9250ea75fcf4ffd81814040c050d58c0a29b06be11edf67c911b403e418b7277417e52906
+k = e56904028226eb04f8d071e3f9cefec91075a81ca0fa87b44cae148fe1ce9827b5d1910db2336d0eb9813ddba3e4d7b5
+R = c38ef30f55624e8935680c29f8c24824877cf48ffc0ef015e62de1068893353030d1193bf9d34237d7ce6ba92c98b0fe
+S = 651b8c3d5c9d5b936d300802a06d82ad54f7b1ba4327b2f031c0c5b0cb215ad4354edc7f932d934e877dfa1cf51b13fe
+
+Msg = 00ce978603229710345c9ad7c1c2dba3596b196528eea25bd822d43ca8f76a024e29217703dd0652c8a615284fc3edcc1c5ad1c8d5a8521c8e104c016a24e50c2e25066dcb56596f913b872767e3627aa3e55ec812e9fdac7c2f1beade83aef093e24c9c953982adf431a776880ae4583be158e11cdab1cbca3ad3a66900213d
+d = 5c6bbf9fbcbb7b97c9535f57b431ed1ccae1945b7e8a4f1b032016b07810bd24a9e20055c0e9306650df59ef7e2cd8c2
+Qx = 2e01c5b59e619e00b79060a1e8ef695472e23bf9a511fc3d5ed77a334a242557098e40972713732c5291c97adf9cf2cf
+Qy = 563e3fe4ad807e803b9e961b08da4dde4cea8925649da0d93221ce4cdceabc6a1db7612180a8c6bef3579c65539b97e9
+k = 03d23f1277b949cb6380211ad9d338e6f76c3eedac95989b91d0243cfb734a54b19bca45a5d13d6a4b9f815d919eea77
+R = abab65308f0b79c4f3a9ff28dd490acb0c320434094cef93e75adfe17e5820dc1f77544cfaaacdc8cf9ac8b38e174bef
+S = 11b783d879a6de054b316af7d56e526c3dce96c85289122e3ad927cfa77bfc50b4a96c97f85b1b8221be2df083ff58fb
+
+Msg = 54a255c18692c6162a46add176a0ae8361dcb8948f092d8d7bac83e160431794d3b9812849bf1994bcdcfba56e8540c8a9ee5b93414548f2a653191b6bb28bda8dc70d45cc1b92a489f58a2d54f85766cb3c90de7dd88e690d8ebc9a79987eee1989df35af5e35522f83d85c48dda89863171c8b0bf4853ae28c2ac45c764416
+d = ffc7dedeff8343721f72046bc3c126626c177b0e48e247f44fd61f8469d4d5f0a74147fabaa334495cc1f986ebc5f0b1
+Qx = 51c78c979452edd53b563f63eb3e854a5b23e87f1b2103942b65f77d024471f75c8ce1cc0dfef83292b368112aa5126e
+Qy = 313e6aaf09caa3ba30f13072b2134878f14a4a01ee86326cccbff3d079b4df097dc57985e8c8c834a10cb9d766169366
+k = c3de91dbe4f777698773da70dd610ef1a7efe4dc00d734399c7dd100728006a502822a5a7ff9129ffd8adf6c1fc1211a
+R = f4f477855819ad8b1763f53691b76afbc4a31a638b1e08c293f9bcd55decf797f9913ca128d4b45b2e2ea3e82c6cf565
+S = 7c26be29569ef95480a6d0c1af49dc10a51a0a8931345e48c0c39498bfb94d62962980b56143a7b41a2fddc8794c1b7f
+
+Msg = 692a78f90d4f9d5aee5da536314a78d68c1feabbfe5d1ccea7f6059a66c4b310f8051c411c409ccf6e19a0cbd8b8e100c48317fe8c6d4f8a638b9551ce7ee178020f04f7da3001a0e6855225fb3c9b375e4ed964588a1a41a095f3f476c42d52ffd23ce1702c93b56d4425d3befcf75d0951b6fd5c05b05455bdaf205fe70ca2
+d = adca364ef144a21df64b163615e8349cf74ee9dbf728104215c532073a7f74e2f67385779f7f74ab344cc3c7da061cf6
+Qx = ef948daae68242330a7358ef73f23b56c07e37126266db3fa6eea233a04a9b3e4915233dd6754427cd4b71b75854077d
+Qy = 009453ef1828eaff9e17c856d4fc1895ab60051312c3e1db1e3766566438b2990cbf9945c2545619e3e0145bc6a79004
+k = a2da3fae2e6da3cf11b49861afb34fba357fea89f54b35ce5ed7434ae09103fe53e2be75b93fc579fedf919f6d5e407e
+R = dda994b9c428b57e9f8bbaebba0d682e3aac6ed828e3a1e99a7fc4c804bff8df151137f539c7389d80e23d9f3ee497bf
+S = a0d6b10ceffd0e1b29cf784476f9173ba6ecd2cfc7929725f2d6e24e0db5a4721683640eaa2bbe151fb57560f9ce594b
+
+Msg = 3b309bb912ab2a51681451ed18ad79e95d968abc35423a67036a02af92f575a0c89f1b668afe22c7037ad1199e757a8f06b281c33e9a40bab69c9874e0bb680b905d909b9dc24a9fe89bb3d7f7d47082b25093c59754f8c19d1f81f30334a8cdd50a3cb72f96d4b3c305e60a439a7e93aeb640dd3c8de37d63c60fb469c2d3ed
+d = 39bea008ec8a217866dcbdb1b93da34d1d3e851d011df9ef44b7828b3453a54aa70f1df9932170804eacd207e4f7e91d
+Qx = 5709ec4305a9c3271c304face6c148142490b827a73a4c17affcfd01fffd7eaa65d2fdedfa2419fc64ed910823513faf
+Qy = b083cda1cf3be6371b6c06e729ea6299213428db57119347247ec1fcd44204386cc0bca3f452d9d864b39efbfc89d6b2
+k = 3c90cc7b6984056f570542a51cbe497ce4c11aeae8fc35e8fd6a0d9adeb650e8644f9d1d5e4341b5adc81e27f284c08f
+R = d13646895afb1bfd1953551bb922809c95ad65d6abe94eb3719c899aa1f6dba6b01222c7f283900fe98628b7597b6ea6
+S = 4a9a38afda04c0a6b0058943b679bd02205b14d0f3d49b8f31aac289129780cdb1c555def8c3f9106b478729e0c7efaa
+
+Msg = f072b72b8783289463da118613c43824d11441dba364c289de03ff5fab3a6f60e85957d8ff211f1cb62fa90216fb727106f692e5ae0844b11b710e5a12c69df3ed895b94e8769ecd15ff433762d6e8e94d8e6a72645b213b0231344e2c968056766c5dd6b5a5df41971858b85e99afbf859400f839b42cd129068efabeea4a26
+d = e849cf948b241362e3e20c458b52df044f2a72deb0f41c1bb0673e7c04cdd70811215059032b5ca3cc69c345dcce4cf7
+Qx = 06c037a0cbf43fdf335dff33de06d34348405353f9fdf2ce1361efba30fb204aea9dbd2e30da0a10fd2d876188371be6
+Qy = 360d38f3940e34679204b98fbf70b8a4d97f25443e46d0807ab634ed5891ad864dd7703557aa933cd380e26eea662a43
+k = 32386b2593c85e877b70e5e5495936f65dc49553caef1aa6cc14d9cd370c442a0ccfab4c0da9ec311b67913b1b575a9d
+R = 5886078d3495767e330c7507b7ca0fa07a50e59912a416d89f0ab1aa4e88153d6eaf00882d1b4aa64153153352d853b5
+S = 2cc10023bf1bf8ccfd14b06b82cc2114449a352389c8ff9f6f78cdc4e32bde69f3869da0e17f691b329682ae7a36e1aa
+
+Msg = cf4945350be8133b575c4ad6c9585e0b83ff1ed17989b6cd6c71b41b5264e828b4e115995b1ae77528e7e9002ac1b5669064442645929f9d7dd70927cb93f95edeb73e8624f4bc897ec4c2c7581cb626916f29b2d6e6c2fba8c59a71e30754b459d81b912a12798182bcff4019c7bdfe929cc769bcc2414befe7d2906add4271
+d = d89607475d509ef23dc9f476eae4280c986de741b63560670fa2bd605f5049f1972792c0413a5b3b4b34e7a38b70b7ca
+Qx = 49a1c631f31cf5c45b2676b1f130cbf9be683d0a50dffae0d147c1e9913ab1090c6529a84f47ddc7cf025921b771355a
+Qy = 1e207eece62f2bcc6bdabc1113158145170be97469a2904eaaa93aad85b86a19719207f3e423051f5b9cbbe2754eefcb
+k = 78613c570c8d33b7dd1bd1561d87e36282e8cf4843e7c344a2b2bb6a0da94756d670eeaffe434f7ae7c780f7cf05ca08
+R = 66f92b39aa3f4aeb9e2dc03ac3855406fa3ebbab0a6c88a78d7a03482f0c9868d7b78bc081ede0947c7f37bf193074ba
+S = e5c64ed98d7f3701193f25dd237d59c91c0da6e26215e0889d82e6d3e416693f8d58843cf30ab10ab8d0edd9170b53ad
+
+Msg = d9b5cf0b50416573ff3c63133275a18394dd4326be2041e8d97e6e4e3855a4a177e9d26dfd223fe8aa74564edb49bd72de19916fb6f001f44530d5c18e2c332bce1b7415df5927ece5f3824f34d174b963136b53aef1fb78fb0c06a201a40b2db38e4d8216fc1e392a798c8ab4b3a314496b7f1087804ebfa89bf96e9cdb80c0
+d = 083e7152734adf342520ae377087a223688de2899b10cfcb34a0b36bca500a4dfa530e2343e6a39da7ae1eb0862b4a0d
+Qx = 70a0f16b6c61172659b027ed19b18fd8f57bd28dc0501f207bd6b0bb065b5671cf3dd1ed13d388dcf6ccc766597aa604
+Qy = 4f845bf01c3c3f6126a7368c3454f51425801ee0b72e63fb6799b4420bfdebe3e37c7246db627cc82c09654979c700bb
+k = 28096ababe29a075fbdf894709a20d0fdedb01ed3eeacb642a33a0da6aed726e13caf6cf206792ec359f0c9f9b567552
+R = ee2923f9b9999ea05b5e57f505bed5c6ba0420def42c6fa90eef7a6ef770786525546de27cdeb2f8586f8f29fb4ee67c
+S = 50ef923fb217c4cf65a48b94412fda430fac685f0da7bd574557c6c50f5b22e0c8354d99f2c2f2c2691f252f93c7d84a
+
+Msg = 9e4042d8438a405475b7dab1cd783eb6ce1d1bffa46ac9dfda622b23ac31057b922eced8e2ed7b3241efeafd7c9ab372bf16230f7134647f2956fb793989d3c885a5ae064e85ed971b64f5f561e7ddb79d49aa6ebe727c671c67879b794554c04de0e05d68264855745ef3c9567bd646d5c5f8728b797c181b6b6a876e167663
+d = 63578d416215aff2cc78f9b926d4c7740a77c142944e104aa7422b19a616898262d46a8a942d5e8d5db135ee8b09a368
+Qx = cadbacef4406099316db2ce3206adc636c2bb0a835847ed7941efb02862472f3150338f13f4860d47f39b7e098f0a390
+Qy = 752ad0f22c9c264336cde11bbc95d1816ed4d1b1500db6b8dce259a42832e613c31178c2c7995206a62e201ba108f570
+k = 7b69c5d5b4d05c9950dc94c27d58403b4c52c004b80a80418ad3a89aabc5d34f21926729e76afd280cc8ee88c9805a2a
+R = db054addb6161ee49c6ce2e4d646d7670754747b6737ca8516e9d1e87859937c3ef9b1d2663e10d7e4bd00ec85b7a97a
+S = fcc504e0f00ef29587e4bc22faada4db30e2cb1ac552680a65785ae87beb666c792513f2be7a3180fc544296841a0e27
+
+Msg = 0b14a7484a40b68a3ce1273b8a48b8fdb65ba900d98541c4bbd07b97e31bcc4c85545a03e9deab3c563f47a036ff60d0361684ba241b5aa68bb46f440da22181ee328a011de98eff34ba235ec10612b07bdfa6b3dc4ccc5e82d3a8d057e1862fef3def5a1804696f84699fda2ec4175a54a4d08bcb4f0406fdac4eddadf5e29b
+d = ed4df19971658b74868800b3b81bc877807743b25c65740f1d6377542afe2c6427612c840ada31a8eb794718f37c7283
+Qx = 33093a0568757e8b58df5b72ea5fe5bf26e6f7aeb541b4c6a8c189c93721749bcaceccf2982a2f0702586a9f812fc66f
+Qy = ebe320d09e1f0662189d50b85a20403b821ac0d000afdbf66a0a33f304726c69e354d81c50b94ba3a5250efc31319cd1
+k = d9b4cd1bdfa83e608289634dbfcee643f07315baf743fc91922880b55a2feda3b38ddf6040d3ba10985cd1285fc690d5
+R = 009c74063e206a4259b53decff5445683a03f44fa67252b76bd3581081c714f882f882df915e97dbeab061fa8b3cc4e7
+S = d40e09d3468b46699948007e8f59845766dbf694b9c62066890dd055c0cb9a0caf0aa611fb9f466ad0bbb00dbe29d7eb
+
+Msg = 0e646c6c3cc0f9fdedef934b7195fe3837836a9f6f263968af95ef84cd035750f3cdb649de745c874a6ef66b3dd83b66068b4335bc0a97184182e3965c722b3b1aee488c3620adb835a8140e199f4fc83a88b02881816b366a09316e25685217f9221157fc05b2d8d2bc855372183da7af3f0a14148a09def37a332f8eb40dc9
+d = e9c7e9a79618d6ff3274da1abd0ff3ed0ec1ae3b54c3a4fd8d68d98fb04326b7633fc637e0b195228d0edba6bb1468fb
+Qx = a39ac353ca787982c577aff1e8601ce192aa90fd0de4c0ed627f66a8b6f02ae51315543f72ffc1c48a7269b25e7c289a
+Qy = 9064a507b66b340b6e0e0d5ffaa67dd20e6dafc0ea6a6faee1635177af256f9108a22e9edf736ab4ae8e96dc207b1fa9
+k = b094cb3a5c1440cfab9dc56d0ec2eff00f2110dea203654c70757254aa5912a7e73972e607459b1f4861e0b08a5cc763
+R = ee82c0f90501136eb0dc0e459ad17bf3be1b1c8b8d05c60068a9306a346326ff7344776a95f1f7e2e2cf9477130e735c
+S = af10b90f203af23b7500e070536e64629ba19245d6ef39aab57fcdb1b73c4c6bf7070c6263544633d3d358c12a178138
+
+[P-384,SHA-512]
+
+Msg = 67d9eb88f289454d61def4764d1573db49b875cfb11e139d7eacc4b7a79d3db3bf7208191b2b2078cbbcc974ec0da1ed5e0c10ec37f6181bf81c0f32972a125df64e3b3e1d838ec7da8dfe0b7fcc911e43159a79c73df5fa252b98790be511d8a732fcbf011aacc7d45d8027d50a347703d613ceda09f650c6104c9459537c8f
+d = 217afba406d8ab32ee07b0f27eef789fc201d121ffab76c8fbe3c2d352c594909abe591c6f86233992362c9d631baf7c
+Qx = fb937e4a303617b71b6c1a25f2ac786087328a3e26bdef55e52d46ab5e69e5411bf9fc55f5df9994d2bf82e8f39a153e
+Qy = a97d9075e92fa5bfe67e6ec18e21cc4d11fde59a68aef72c0e46a28f31a9d60385f41f39da468f4e6c3d3fbac9046765
+k = 90338a7f6ffce541366ca2987c3b3ca527992d1efcf1dd2723fbd241a24cff19990f2af5fd6419ed2104b4a59b5ae631
+R = c269d9c4619aafdf5f4b3100211dddb14693abe25551e04f9499c91152a296d7449c08b36f87d1e16e8e15fee4a7f5c8
+S = 77ffed5c61665152d52161dc13ac3fbae5786928a3d736f42d34a9e4d6d4a70a02d5af90fa37a23a318902ae2656c071
+
+Msg = 45db86829c363c80160659e3c5c7d7971abb1f6f0d495709bba908d7aa99c9df64b3408a51bd69aba8870e2aaff488ef138f3123cf94391d081f357e21906a4e2f311defe527c55e0231579957c51def507f835cceb466eb2593a509dcbee2f09e0dde6693b2bfe17697c9e86dd672f5797339cbe9ea8a7c6309b061eca7aef5
+d = 0a3f45a28a355381a919372f60320d6610cfb69c3e318eb1607db3cadfc42b728b77a6a9e9e333de9183c58933daf60f
+Qx = 832cbb7061a719a316e73dbad348fa67cd17c33f40b9000a3d3b691a2a2cd821052566717c3ead01089b56086af1366f
+Qy = 1e15a048d1dce642d9ebcbfac7f92b1bcee90fd0240cc79abd29e32e0e655c4ee1fd34fb88178bba92aca100e7794ed0
+k = 2a78e651623ba604c42cf094fc7d046629306f508853427ba091448800d1092c041bb2323035fc9d19a8d44950f7dcc3
+R = 0db0cc9a2bda8dd7e565ad36f91b1c5756d78164dc8a72a5bee4b6bc45ea38c7a16b01d05b1893d4e06b62db24c30385
+S = abd383edaeda7d0b8de1b54fcd3c28874fed62ab266f1f84c8ba796a7b54e5e0695fdb43ce7fe90ed00fa468d87bca64
+
+Msg = 4672fce0721d37c5be166bffa4b30d753bcf104b9b414db994b3ed33f36af4935ea59a0bb92db66448b3f57dad4fc67cef10ce141bf82c536be604b89a0bc0e8bca605b867880049d97142d30538fc543bd9d4fab7fdbe2f703815cdb6361beb66acff764bc275f910d1662445b07b92830db69a5994857f53657ed5ca282648
+d = 2e408c57921939f0e0fe2e80ce74a4fa4a1b4fa7ab070206298fe894d655be50e2583af9e45544b5d69c73dce8a2c8e7
+Qx = a2b24a5ad4a2e91f12199ed7699e3f297e27bf8b8ea8fbe7ed28366f3544cd8e680c238450f8a6422b40829d6647b25c
+Qy = 2732be0075536e6519f6a099b975a40f8e0de337fa4d48bd0762b43f41cab8deafdef9cfbb9973e457801e3bf9c93304
+k = b10b6258afdde81f9c971cc1526d942e20cafac02f59fee10f98e99b8674636bff1d84a6eaa49c0de8d8cfdc90d8ce84
+R = be428a8de89a364a134719141ee8d776a3a8338f1132b07e01b28573d8eaf3b9008b63304c48821e53638b6141f9660b
+S = 866181dbef5c147d391bed6adcee408c339982c307adc718c2b9ab9e5642d8dedc36dd6402559a3ab614c99c1e56b529
+
+Msg = 9ae48fdd9bfc5cb0f4d4761e28b2073bda05a3e3fe82c212e66701dc4573cc67a829b0f82d7520b1bf11db0c6d1743822bbe41bb0adbd7222aa5fae70fbd1a31f2d4453a01c81e064d775388468be96f6063f8673b7b8d4455fe1bd4c801ad5e625a015eaa4a1a18da490d2af8642201eaba3c611cbd65f861d8e19ca82a1ee6
+d = 1c285da72a8eb1c3c38faab8d3bb4e68dc95c797082b9a3991a21c1de54759071ecf2265fb1eff504ab24174bc6710cf
+Qx = 11acb1b5cc59a4f1df1913a8d6e91cbdafb8206dc44aff7d9da45906b664fc33194d9935a82aa4d62f39618897c86025
+Qy = 832ed0b9575fff52a3603bfe89f312751b4c396da98324117a61b3f525d27b2266f6cfb22be07e50b6874435e380ed62
+k = 2513075e02cc7fb3cff7b7adde46da31c5493749b5cf02758bd5b098a838bfd4d5e4c7fb8268bdc37e219c30efebe878
+R = b3d638b3be45f14f170da5bdc22d2114deac93ab340a25b3af2b5c18584bb9147e00dc6c67a2274f79aa4838793eb63f
+S = 876112bdca2c725eb2f6dbd76d07710a31f0c16d38430cb0817f320a25a9ecfec8a66137d0304612ae29a6a484fd3319
+
+Msg = 817d6a110a8fd0ca7b4d565558f68b59a156744d4c5aac5c6610c95451793de2a756f774558c61d21818d3ebeeeb71d132da1c23a02f4b305eccc5cd46bd21dfc173a8a91098354f10ffbb21bf63d9f4c3feb231c736504549a78fd76d39f3ad35c36178f5c233742d2917d5611d2073124845f1e3615b2ef25199a7a547e882
+d = 9da37e104938019fbdcf247e3df879a282c45f8fb57e6655e36b47723af42bec3b820f660436deb3de123a21de0ca37b
+Qx = 722d0ea6891d509b18b85ca56f74deb5c3030d2a30433824123d430d03c99279572c3b28ecf01e747b9db8acc55d0ba3
+Qy = 7e2605ea7092214f366f3639037bffd89fe103c646e990839d3a1ced8d78edb5b9bc60d834fd8e2a3c17e920bdae023a
+k = c8c18e53a9aa5915288c33132bd09323638f7995cd89162073984ed84e72e07a37e18c4c023933eace92c35d10e6b1b6
+R = 6512a8a2be731e301dcf4803764297862bbfa0ac8daed64d8e98b34618ecb20520fc5d3cf890b7783edf86e7ea407541
+S = 4ff10301f7b4168fae066361376007c1d7aa89a75c87719d0b54711ffef5ef3726f3eef84f7ebc025c110bde511b17f6
+
+Msg = 464f10ec6fb229a51db5fd0e122f2cb8a9a022117e2987f4007bf5565b2c16aba0714e2e3cdd0c100d55ac3017e36fc7501ad8309ab9572aa65424c9eb2e580a119c55777676ec498df53ef6ae78fd8a988130ee0e6082bf1ef71cd4c946021018a8ca7154d13b174c638912613b0bdb9001c302bf7e443ad2124ab2c1cce212
+d = 0661ab3bf9f7bef51bec7dff758de289154557beb9ce18cc4b8cc09a871e8322af259cf188b593dc62f03a19e75f7f69
+Qx = b4f100558043858efa728082d9b99ad5192b59b0947434f5ba7ff2514508a6d71ba54e7221c31cb0712103272b3f6fa4
+Qy = 34f6df4eeb2da11498044635067c2715ed15ae251c78ffb9030d87909ea8539b66394e93109ca54c0406cf99960c3e93
+k = 84a87137edb6894f96c5a8e94a3765162034feb84dfea94e1c71411170c285a80321ec7999e25861844143209804882c
+R = 4dc9d1b949b36e3c3847ac1c7ed114e1bc9cbe76119cf6fcd3f1b69ee6ee54e3255f1bb288fe2f8bd6d4049a21793c27
+S = 56a561d647b62ccae1e6df818b1a6fbde66c82ef0ff69ee415f183e7daf76be22630c7e02cd3fd729dfa490f26824584
+
+Msg = 4e3e0fb96320ddccde8b463c273654c4f7164920b1d63430921d2e808dee403e6420eedda0a557b911d00736a4f8798dd4ef26673efd6d190988ad4929ec64f8685cfb76070a36cd6a3a4bf2f54fb08a349d44642b6f614043fef9b2813b63457c76537d23da7b37310334f7ba76edf1999dad86f72aa3446445a65952ac4e50
+d = 66e7cfdeb7f264cf786e35210f458c32223c3a12a3bc4b63d53a5776bc9b069928452484f6241caa3781fd1a4109d4db
+Qx = 3c7682de540ab231daf21bf9fc80bda6abf7e17dcc79d476c7b7c3bd4d42d386877fd8ba495c1b0333e04fb5fd2a1505
+Qy = 0a1582e4f4d72abea9d3476aff8369c41261f0c5dddf2ca82e10f7a163f73df09473d9e5e2552187104e4cc7c6d83611
+k = 2fa266f5cce190eb77614933ca6a55121ad8bae168ff7a9043d96d13b5ca2fe70101ff9fe1e2b2cd7413e6aa8f49abde
+R = e7ecda9da0c52d0474a9f70094dc8f061d7d6a22210d3b69a7be8f389aa666f256322099b87d16ad35357ea856574dba
+S = ba348eb40a2830ec5a1130264ac0a8675420b1ae243e808a778135809ece21f42c0c881166321102b4f02df4c5c7ed9d
+
+Msg = c466b6b6baf7e6ffa876ec06105e2d43534e0517c07b1c4c9fb67ba81ce09525a7721ec3c290f2b1f65b6463d41598e7a25b2238501629953a5ca955b644354fb6856733a2e5bb8f5bc21a0c803493f5539f9fb83aab3dba2c982989c2270c61ab244b68bfe1b948d00c2ed975e09c29b5f8a7effcad8652a148cc880d503217
+d = 92c2f7ee64af86d003ab484e12b82fcf245fc330761057fec5b7af8f7e0a2d85b468c21d171460fcb829cae7b986316d
+Qx = ca43a306479bf8fb537d4b9ff9d635bbb2a0d60d9e854d5b7e269d09d91f78c6b90b616e4c931629453645a2bb371e14
+Qy = 356c4d7f10e690614eaf7f82ba0f9dc1aad98130c0ad9fe353deec565cc04bef789a0a4242322e0058b46cd02f2de77d
+k = 6ec81fb74f8725ba225f317264460ee300cfd2f02092000989acbdad4799cf55c244a65c557113328fe20282e6badb55
+R = cd7a4309bcebc25a8e10899fe2eda5f8b2dbcf329cd2f3d65befd67393e83fba2f8a67a15c01a6ac8314f9f5e87a9dca
+S = 6dcfc0426bc148e67e91d4784e3d7e9bc3b7ce3676be62daa7f3f55dfdff6d9dc735b5e3e0bbd0785db1f76f7ac065f3
+
+Msg = feac892b7720af80b3c9eede51e923f18d3d0c5de4c31f4aa75e36df7c7c2fd8f41778851a24b69e67dccb65e159dd5c383243bad7cfedcc5e85c8a01c34b0b94ba8e07e4c024c09d279b3731e8b62f9562d3c4f5042567efe42a9d0eaaabab28bc6f11232fc8ceaaf4518d9f3b2bebf020294496b7f6b879e69503f75fecd3d
+d = 15347caaad1067f1848a676bd0a8c52021ae604b79d02775a0459226e0391a3acd26653c916fcfe86149fb0ee0904476
+Qx = e5a0463163964d984f5bad0072d45bc2059939e60a826ccca36c151460ae360f5d6679f60fe43e999b6da5841c96e48a
+Qy = 30f2dd425a3fa2c95d34124217250b39e3b4a14f3e6e415ae8e5b0409eb72f43f78b64d0ce6f2d49980d6f04cd1391db
+k = 1a2d224db4bb9c241ca5cab18920fad615fa25c1db0de0f024cb3ace0d11ef72b056885446659f67650fdff692517b1c
+R = 87b4de0fb21df38dfc9a4b1e350da67547e307f55b5b9dd6615e408afe7c3553a6e02722847367439e636074faa2182b
+S = 375d965753b9ed6c6c08576726f8308c2f8dbd2737824464e71265d47907e26f615bbeb8203ec617520d4ecd1851dc44
+
+Msg = cf2982e3bf174ce547741b969403cd11e9553067e6af8177d89511a0eb040db924530bdba65d8b1ff714228db0737c1756f509e1506014a10736e65be2f91980a73891496e90ff2714a3601c7565cdcef5a395e2e0e1652f138d90d61eaa9cba993b823245647f6e07cec9b8b4449cd68a29741cd1579c66e548ca0d0acf33aa
+d = ac1cb5e59bda2eff3413a3bab80308f9fb32c595283c795de4c17fdae8d4647b5f108fd0801aee22adb7db129283b5aa
+Qx = bc6b1a718284803553c173089c397870aaaecca579bb8e81a8cfa12473cd2057567fa8726a19ed427cc035baeec2c551
+Qy = 14f82997d1129b669f0015350e47ad561b1b13441af4fb44656f15ed0c5706984d66655accc52f2e943eef39cb1cdc21
+k = 8053a46e875f446056b06d4318fa3e8977622de7207cbf0996bf35b0e9b19aaa507f642bcf0be9f048f1af09806f6946
+R = a994eb15b64114ce8a9342d18b5edda96a6d76314a5ac03da723699177d352a4a9f3b7121b11a91e43a6af4025da51d6
+S = 8183ae33a888e99aa76882da0a6705ad102f2bbd9572fad0d2e4d6d70151970469e00c5220e59c14724d771c1384b302
+
+Msg = bf9fdd4107ef5a6070108771ac9eee4f0c8043bf0d04db772a47294f4137e2439d94b337114b074e57e0cb78d0ccf352a2833e9788ee2a1a9ffeacd34f38fcefb86653d70c7dadd4cf6548d608e70acdef6c7530974b92c813798add659752a8c72b05e1ad9c65c21834ce6fbe49d8a1426b5a54270794436d284364fac6ec1a
+d = 205f1eb3dfacff2bdd8590e43e613b92512d6a415c5951bda7a6c37db3aae39b9b7ec6edd256609e75373419087fa71f
+Qx = c9f1f63a18c761b077a1ec35fbb2de635db9b8592c36194a01769b57728c7755d4c79b3d5b97a1a4631e30c86d03f13c
+Qy = f8c4a38770054d5cc9bb9182e6d4638242c4fd16e869ac22e44c4b9402d594e0c6f5df6a9a7de32a4893d9f6588f1950
+k = ecd395c5d8b7d6e6b2b19644e0d2e6086c912c6a0f5b8ed4b94b7290b65852c9741ce8eeb08d8751ead8a183e17d76c6
+R = e81331d78b438b0b8d98c1be03385ba5d614af182f1677f259126cc3de7eaac6c19b02be955d936b6bf9c27c6796e6f0
+S = 17c2b7a8e0fc93909762aa9f86f9561e759ecb88f02337b2018363be6095d9e4324a6d3296046686624b5efad6b52878
+
+Msg = 5d634fb39a2239256107dc68db19751540b4badac9ecf2fce644724401d6d632b3ae3b2e6d05746b77ddc0c899878032248c263eda08d3d004d35952ad7a9cfe19343d14b37f9f632245e7b7b5fae3cb31c5231f82b9f1884f2de7578fbf156c430257031ba97bc6579843bc7f59fcb9a6449a4cd942dffa6adb929cf219f0ad
+d = e21e3a739e7ded418df5d3e7bc2c4ae8da76266a1fc4c89e5b09923db80a72217f1e96158031be42914cf3ee725748c1
+Qx = 0f753171922b5334f3dd2778a64ce2da8295121939beae71ad85e5344e893be0fd03cf14e1f031adec098e0c4409449c
+Qy = 45c10a0ffc0eb2f1cec5c89b698061108313ee7d449ad580efad344f0e7cf35be8a18fca620f112e57bdc746abdace55
+k = d06bea06b25e6c30e866b1eb0657b45673e37b709013fb28fd7373afc8277cbc861354f821d0bd1927e52ec083a0f41f
+R = e8d4a31dd0e7d2522be62a32608e744c3775ceb606dc897899f0c73f1a40ce9a8be854cd506e65cd81fd7fa2c616cb7b
+S = 8151b681b6b6046d3c36f332d06d9ba7751e740631cdb759f88c50a25a8e950d5023df8a15c77243743733c4feaf21d5
+
+Msg = c9b4ff721b3e886f0dc05856ffff0aabb64a8504b1746a47fdd73e6b7ebc068f06ac7ffa44c757e4de207fc3cbfaf0469d3ac6795d40630bcafe8c658627e4bc6b86fd6a2135afbc18ccc8e6d0e1e86016930ca92edc5aa3fbe2c57de136d0ea5f41642b6a5d0ddeb380f2454d76a16639d663687f2a2e29fb9304243900d26d
+d = 93434d3c03ec1da8510b74902c3b3e0cb9e8d7dccad37594d28b93e065b468d9af4892a03763a63eae060c769119c23c
+Qx = a52c25f2af70e5bc6a992ecef4ea54e831ed5b9453747d28aec5cffb2fcfee05be80c5cbab21606b5507aa23878adee1
+Qy = 2cf2a9afeff83f3041dc8a05f016ccae58aa1a0e0dc6be9d928e97f2598c9ba5e9718d5eb74c9cfb516fd8c09f55f5b9
+k = 13d047708ae5228d6e3bbada0e385afdb3b735b31123454fdf40afe3c36efed563fd2cce84dcc45c553b0993d9ca9ec3
+R = a0203f6f2c456baac03538ed506a182e57a25151802cf4b2557613b2fb615ebd4c50ddc505f87c048a45bad3b2fc371c
+S = 0eab56457c4080400fa3af124761d5a01fef35f9649edba8b97d22116386f3b8b363e97ef3f82616d5d825df1cf865ef
+
+Msg = db2ad659cf21bc9c1f7e6469c5f262b73261d49f7b1755fc137636e8ce0202f929dca4466c422284c10be8f351f36333ebc04b1888cba217c0fec872b2dfc3aa0d544e5e06a9518a8cfe3df5b20fbcb14a9bf218e3bf6a8e024530a17bab50906be34d9f9bba69af0b11d8ed426b9ec75c3bd1f2e5b8756e4a72ff846bc9e498
+d = e36339ddbe8787062a9bc4e1540690915dd2a2f11b3fe9ee946e281a0a2cbed426df405ed9cb0eca42f85443efd09e0c
+Qx = a1ffb4b790d1593e907369b69de10b93cddbb02c6131f787422364d9d692768ef8097970306cce16c97f2b10c538efa7
+Qy = d0692028601ea794d2563ffe9facc7273938fab47dd00b8960be15549a9c2b3f8552583eb4c6cd212fe486c159c79153
+k = 2226f7329378cecd697f36ae151546643d67760856854661e31d424fae662da910e2157da9bb6dfbe3622296e0b5710c
+R = 20dcc25b67dd997621f437f65d78347fb57f8295b1b14453b1128203cda892bcfe726a2f107d30975d63172e56f11d76
+S = 51cff592cbef75ef8321c8fa1e4229c4298b8180e427bee4e91d1e24fc28a729cf296beb728960d2a58cf26773d8e2e2
+
+Msg = dbd8ddc02771a5ff7359d5216536b2e524a2d0b6ff180fa29a41a8847b6f45f1b1d52344d32aea62a23ea3d8584deaaea38ee92d1314fdb4fbbecdad27ac810f02de0452332939f644aa9fe526d313cea81b9c3f6a8dbbeafc899d0cdaeb1dca05160a8a039662c4c845a3dbb07be2bc8c9150e344103e404411668c48aa7792
+d = 5da87be7af63fdaf40662bd2ba87597f54d7d52fae4b298308956cddbe5664f1e3c48cc6fd3c99291b0ce7a62a99a855
+Qx = 54c79da7f8faeeee6f3a1fdc664e405d5c0fb3b904715f3a9d89d6fda7eabe6cee86ef82c19fca0d1a29e09c1acfcf18
+Qy = 926c17d68778eb066c2078cdb688b17399e54bde5a79ef1852352a58967dff02c17a792d39f95c76d146fdc086fe26b0
+k = 1b686b45a31b31f6de9ed5362e18a3f8c8feded3d3b251b134835843b7ae8ede57c61dc61a30993123ac7699de4b6eac
+R = 9dbfa147375767dde81b014f1e3bf579c44dd22486998a9b6f9e0920e53faa11eed29a4e2356e393afd1f5c1b060a958
+S = e4d318391f7cbfe70da78908d42db85225c85f4f2ff413ecad50aad5833abe91bdd5f6d64b0cd281398eab19452087dd
+
+
+[P-521,SHA-224]
+
+Msg = 58ec2b2ceb80207ff51b17688bd5850f9388ce0b4a4f7316f5af6f52cfc4dde4192b6dbd97b56f93d1e4073517ac6c6140429b5484e266d07127e28b8e613ddf65888cbd5242b2f0eee4d5754eb11f25dfa5c3f87c790de371856c882731a157083a00d8eae29a57884dbbfcd98922c12cf5d73066daabe3bf3f42cfbdb9d853
+d = 1d7bb864c5b5ecae019296cf9b5c63a166f5f1113942819b1933d889a96d12245777a99428f93de4fc9a18d709bf91889d7f8dddd522b4c364aeae13c983e9fae46
+Qx = 1a7596d38aac7868327ddc1ef5e8178cf052b7ebc512828e8a45955d85bef49494d15278198bbcc5454358c12a2af9a3874e7002e1a2f02fcb36ff3e3b4bc0c69e7
+Qy = 184902e515982bb225b8c84f245e61b327c08e94d41c07d0b4101a963e02fe52f6a9f33e8b1de2394e0cb74c40790b4e489b5500e6804cabed0fe8c192443d4027b
+k = 141f679033b27ec29219afd8aa123d5e535c227badbe2c86ff6eafa5116e9778000f538579a80ca4739b1675b8ff8b6245347852aa524fe9aad781f9b672e0bb3ff
+R = 06b973a638bde22d8c1c0d804d94e40538526093705f92c0c4dac2c72e7db013a9c89ffc5b12a396886305ddf0cbaa7f10cdd4cd8866334c8abfc800e5cca365391
+S = 0b0a01eca07a3964dd27d9ba6f3750615ea36434979dc73e153cd8ed1dbcde2885ead5757ebcabba117a64fcff9b5085d848f107f0c9ecc83dfa2fa09ada3503028
+
+Msg = 2449a53e0581f1b56d1e463b1c1686d33b3491efe1f3cc0443ba05d65694597cc7a2595bda9cae939166eb03cec624a788c9bbab69a39fb6554649131a56b26295683d8ac1aea969040413df405325425146c1e3a138d2f4f772ae2ed917cc36465acd66150058622440d7e77b3ad621e1c43a3f277da88d850d608079d9b911
+d = 17e49b8ea8f9d1b7c0378e378a7a42e68e12cf78779ed41dcd29a090ae7e0f883b0d0f2cbc8f0473c0ad6732bea40d371a7f363bc6537d075bd1a4c23e558b0bc73
+Qx = 0156cd2c485012ea5d5aadad724fb87558637de37b34485c4cf7c8cbc3e4f106cb1efd3e64f0adf99ddb51e3ac991bdd90785172386cdaf2c582cc46d6c99b0fed1
+Qy = 1edeeda717554252b9f1e13553d4af028ec9e158dbe12332684fc1676dc731f39138a5d301376505a9ab04d562cc1659b0be9cb2b5e03bad8b412f2699c245b0ba2
+k = 1dc3e60a788caa5f62cb079f332d7e5c918974643dca3ab3566a599642cd84964fbef43ce94290041fe3d2c8c26104d9c73a57a7d4724613242531083b49e255f33
+R = 12592c0be6cce18efb2b972cd193d036dcb850f2390fa8b9b86b2f876548bc424fb3bc13c1e5c415fa09d0ecfcae5bf76fb23e8322d7eecb264a2ae6d20ef50d405
+S = 11bc9713be88e3b9912a3e5f5d7b56f20573e979b1a75d04ce339f724bddffa4665d25995fe24d32507d8a07c5e10169f5338ef2827737f7b0291752b21237217e3
+
+Msg = 7ba05797b5b67e1adfafb7fae20c0c0abe1543c94cee92d5021e1abc57720a6107999c70eacf3d4a79702cd4e6885fa1b7155398ac729d1ed6b45e51fe114c46caf444b20b406ad9cde6b9b2687aa645b46b51ab790b67047219e7290df1a797f35949aaf912a0a8556bb21018e7f70427c0fc018e461755378b981d0d9df3a9
+d = 135ea346852f837d10c1b2dfb8012ae8215801a7e85d4446dadd993c68d1e9206e1d8651b7ed763b95f707a52410eeef4f21ae9429828289eaea1fd9caadf826ace
+Qx = 18d40cc4573892b3e467d314c39c95615ee0510e3e4dbc9fa28f6cd1f73e7acde15ad7c8c5339df9a7774f8155130e7d1f8de9139ddd6dfe1841c1e64c38ea98243
+Qy = 17021782d33dc513716c83afe7ba5e7abef9cb25b31f483661115b8d6b5ae469aaf6f3d54baa3b658a9af9b6249fd4d5ea7a07cb8b600f1df72b81dac614cfc384a
+k = 0c24acc1edb3777212e5b0bac744eadf4eda11fa150753b355bf96b189e6f57fc02284bb22d8b3cd8bba7a09aae9f4ea955b382063425a6f8da2f99b9647b147172
+R = 183da7b8a9f9d5f08903359c1a2435b085fcf26a2ed09ab71357bb7634054acc569535e6fe81d28233e4703005fc4bf83ce794d9463d575795aa0f03398e854cefd
+S = 0b3621145b9866ab7809139795cc30cd0404127a7f0fafa793660491009f6c53724fdb0b1ffbf0fd51c131180b8a957fe66e76d2970247c024261c768dee9abbfb9
+
+Msg = 716dabdb22a1c854ec60420249905a1d7ca68dd573efaff7542e76f0eae54a1828db69a39a1206cd05e10e681f24881b131e042ed9e19f5995c253840e937b809dfb8027fed71d541860f318691c13a2eb514daa5889410f256305f3b5b47cc16f7a7dad6359589b5f4568de4c4aae2357a8ea5e0ebaa5b89063eb3aa44eb952
+d = 1393cb1ee9bfd7f7b9c057ecc66b43e807e12515f66ed7e9c9210ba1514693965988e567fbad7c3f17231aacee0e9b9a4b1940504b1cd4fd5edfaa62ba4e3e476fc
+Qx = 1e855c935139c8092092cfa733db1292530506eeb2bbb1687f9602c36d97a6714e998892d5d3b842d1896a6ece9d549e9792881a256256137b3dff180c96cc5d07b
+Qy = 18d83b6e93cd287311f7bf7c1d7f9eeabcf0b69c12f2d8f40e333e81e956d968532a37a4c04d761874df293b484cd7053b03fdbc2fdcd3b4c412d6f272fb7c93fe6
+k = 1d98619bdc04735d30c222fc67da82c069aea5f449af5e8c4db10c1786c0cb9e6f2cc0bb66fa6be18c485570d648dafcd0a973c43d5c94e9a9dacbd3170e53fa2a0
+R = 0bf47fabe107ce0ec03e2ad60a79b058e1bebb18568b6a8cdbe86032e71aa30c15766105b2ea952cfa79bcab046df601159f96e179bbcf252dc68ac73d31481fdae
+S = 1f918fec69cd07d90f9d892b7117e7519c3224947f4262f1fd97077dd5386a6c78aeddff3ee97e59ea353f06029f1336f0d6ef5c0f4b17ca59343a55319b7bfc3db
+
+Msg = 9cc9c2f131fe3ac7ea91ae6d832c7788cbbf34f68e839269c336ceef7bef6f20c0a62ea8cc340a333a3002145d07eba4cf4026a0c4b26b0217a0046701de92d573d7c87a386a1ea68dc80525b7dcc9be41b451ad9f3d16819e2a0a0b5a0c56736da3709e64761f97cae2399de2a4022dc4c3d73c7a1735c36dbde86c4bc5b6f7
+d = 179fa164e051c5851e8a37d82c181e809a05fea9a3f083299b22684f59aa27e40dc5a33b3f7949338764d46bfe1f355134750518b856d98d9167ef07aac3092c549
+Qx = 1857cc7bbed20e87b3fd9a104956aa20c6502192910e0e7598410526ebfe1c99397b85189612a60c51fb8f4dd5cb08a8cd2e702563062dcb043410715c5323a0046
+Qy = 1fce8d135284310d2f38c216030634b32cd223222f0d9d8d2b7c55477c4b8b74fc6c96a6092f34b05ca44d3633a5037c2166c479a032bb4f949f89fc1ba5236d07d
+k = 16d9704c0cee791f2938bb2a8a595752a3635c2f557efeecefd719414b5f2aaf846080f582c76eae7a8fddf81859b49d0131c212524d55defa67dca1a9a28ca400f
+R = 1c9a4e51774384e8362876a87c572e6463a54413c7c6252c552ebb182f83e45ace436ade4ca373d8a7216e83efb62c8b41c4d5132a0afa65078f16d189baca39187
+S = 1e92a7dd5fea29a666398e1df5775cbb5664fe6943fe4c1d2bba516b7543c84df584458e53919c4ffab579a26fb3c892a5d1a77b0a07428c89350f8b559e627b014
+
+Msg = 14c69f8d660f7a6b37b13a6d9788eff16311b67598ab8368039ea1d9146e54f55a83b3d13d7ac9652135933c68fafd993a582253be0deea282d86046c2fb6fd3a7b2c80874ced28d8bed791bd4134c796bb7baf195bdd0dc6fa03fdb7f98755ca063fb1349e56fd0375cf94774df4203b34495404ebb86f1c7875b85174c574c
+d = 13dabca37130ba278eae2b3d106b5407711b0d3b437fbf1c952f0773571570764d2c7cb8896a8815f3f1975b21adc6697898e5c0a4242092fc1b80db819a4702df4
+Qx = 0bc2aebf40cd435bc37d73c09d05f2fd71321111a767c2b0d446f90dd4a186839c694ceb734e027e7ee948f0f63e4d3f1656d3d543df23c342a599306909b347109
+Qy = 1f4c98ac03f0718e58d5d1762c920445b11dbdd60ec7f60095809204e14965a4ecb0be6fea06adbac8ba431d6f144c75c199225df2a619a34be99897125b3a10af8
+k = 0401187c8b89945a1e48cda9ee52167789f4121e67482a7ac797899f5d3d2e623aed31e4adae08a8d43e69028fa074d2650317cbc765f6ed191cf0317b4bae57881
+R = 1e572afed754016fba43fc33e352932c4db65efcb84e2bd159b40fc5925893b161effc40240be28d8c07154d2615f605c6f0451b976522d95afd37f46602df7a12a
+S = 030370c1c5352c2b663ac1858b42f69545b2f58ed5b2c007f303726977d3c756b5d644ec6788f94c886f78269aa190a3d8d1ae10e4fd24d937c4556fb9e1953fd6d
+
+Msg = 8d8e75df200c177dbfe61be61567b82177ea5ec58e2781168d2277d2fd42668f01248ca3eb29ffa2689b12ae40f9c429532b6d2e1f15891322b825a0a072a1c68fa09e78cfdef3e95ed6fdf7233a43cb68236560d49a3278f0b3f47cb08f475bd9ab2f60755ea4a1767de9313b71a1b9ea87ef33f34682efbda263b0f8cc2f52
+d = 198681adbde7840d7ccd9cf1fb82056433fb4dd26bddf909af7b3b99da1ca2c05c8d4560ecd80ba68f376f8b487897e374e99a9288ed7e3645cc0d00a478aae8d16
+Qx = 057ce3777af7032f1f82308682e71fe09f88bf29dacd5018a725e1caa4b1e2bfdd894fe618f9266f31ba089856dc9c1b70e4a2faa08b4b744d1aafcd5ae99e2c736
+Qy = 199bcfef2021bc5890d7d39ec5dc0c26956801e84cae742cf6c50386eb289b6e97754dd25a94abf81f1cb1b36935b5eb29f4b32a6516d2ff6a7d23064a0daec94b3
+k = 19d2d74ad8ee2d85048f386998a71899ef6c960b4ab324e5fd1c0a076c5a632fd0009500076522e052c5c9806eef7056da48df6b16eb71cdf0f1838b0e21715fce0
+R = 18ecacbcffd5414bbb96728e5f2d4c90178e27733d13617e134ec788022db124374bbaa11e2c77fe3f38d1af6e998e1b0266b77380984c423e80ffa6ff2bcafd57a
+S = 1c727f34b6a378f3087721a54e9796499b597ecf6666b8f18312d67e1190a8a66e878efc2367b551267494e0245979ef4deed6d2cbf2c3711af6d82ccfeb101a377
+
+Msg = 10631c3d438870f311c905e569a58e56d20a2a560e857f0f9bac2bb7233ec40c79de145294da0937e6b5e5c34fff4e6270823e5c8553c07d4adf25f614845b2eac731c5773ebbd716ab45698d156d043859945de57473389954d223522fbafecf560b07ef9ba861bcc1df9a7a89cdd6debf4cd9bf2cf28c193393569ccbd0398
+d = 08c4c0fd9696d86e99a6c1c32349a89a0b0c8384f2829d1281730d4e9af1df1ad5a0bcfccc6a03a703b210defd5d49a6fb82536f88b885776f0f7861c6fc010ef37
+Qx = 164ac88ed9afe137f648dd89cdd9956682830cac5f7c1a06d19a1b19f82bb1d22dfeefea30d35c11202fed93fd5ce64835d27c6564d6e181287fa04a2d20994986b
+Qy = 05cb83669265f5380ccefe6b4f85fdf0049e6703f6f378a0b2e52ed0fbbcf300afebb722f4ed48e3819cb976c1d60e2ba05646b478f6dfecfbae730e9644c297f00
+k = 189801432cba9bf8c0763d43b6ec3b8636e62324587a4e27905b09a58e4aa66d07d096dbce87824e837be1c243dd741f983c535a5dd2f077aac8beee9918258d3cb
+R = 0917723f7241e8dc7cd746b699ab621d068dd3a90e906aaf0a4862744b96fd4e5ccdb9c7796c27f7196e693d06ec209464c3ea60ad6313e9b77cceaa14767e6651c
+S = 0957b0ecdc3668f6efa5d0957615bcfffd6419c5e57579b74f960f65ae3fb9e8284322ff710b066f7e0959ac926d3cf9a594bdb70bbec756c96910b26a2486dee9e
+
+Msg = 80aad6d696cbe654faa0d0a24d2f50d46e4f00a1b488ea1a98ed06c44d1d0c568beb4ab3674fc2b1d2d3da1053f28940e89ba1244899e8515cabdd66e99a77df31e90d93e37a8a240e803a998209988fc829e239150da058a300489e33bf3dcdaf7d06069e74569fee77f4e3875d0a713ccd2b7e9d7be62b34b6e375e84209ef
+d = 1466d14f8fbe25544b209c5e6a000b771ef107867e28ed489a42015119d1aa64bff51d6b7a0ac88673bbc3618c917561cff4a41cdb7c2833dab5ebb9d0ddf2ca256
+Qx = 1dc8b71d55700573a26af6698b92b66180cf43e153edadb720780321dbb4e71d28e0a488e4201d207fc4848fe9dd10dcabec44492656a3ff7a665fe932445c82d0b
+Qy = 1920b16331b7abeb3db883a31288ef66f80b7728b008b3cc33e03a68f68d9e653a86e3177bbc00014fa5ea4c1608c0d455c2e2ac7bd8ab8519ebf19955edf1baf8d
+k = 160d04420e0d31b0df476f83393b1f9aff68389cc3299e42ef348d97646f7531a722b66ddfb9501bbb5c4a41d84c78be7233b11489bceb817d23060e6017433fab8
+R = 08077aabd0a342f03f912007c586cfedfc63f93d1118f720d5b62b3ce141a60f86f111dfd8fc2e31a6778981f1a5e28f29a7369bd7897bb41240c8d3a9c170e0ee0
+S = 00abc75fc154b93840579457820957e89d1260fee0a4b9bb1946f61ca1e71afd76bb5e1077b3e38ceb39d1fac5ef8b217c4110617b3ad118e02b3fcc2a39ef38613
+
+Msg = 8a7792a2870d2dd341cd9c4a2a9ec2da753dcb0f692b70b64cef2e22071389c70b3b188dea5f409fb435cbd09082f59de6bc2ff9e65f91b7acc51e6e7f8e513148cb3c7c4664f227d5c704626b0fda447aa87b9d47cd99789b88628eb642ed250312de5ba6b25f3d5342a3cbb7ebd69b0044ee2b4c9ba5e3f5195afb6bea823d
+d = 01a99fcf54c9b85010f20dc4e48199266c70767e18b2c618044542cd0e23733817776a1a45dbd74a8e8244a313d96c779f723013cd88886cb7a08ef7ee8fdd862e7
+Qx = 1912d33b01d51e2f777bdbd1ada23f2b1a9faf2be2f2a3b152547db9b149b697dd71824ca96547462e347bc4ef9530e7466318c25338c7e04323b1ba5fd25ea7162
+Qy = 0bbe9b1e3a84accd69b76b253f556c63e3f374e3de0d1f5e3600fc19215533b2e40d6b32c3af33314d223ea2366a51d1a337af858f69326389276f91be5c466e649
+k = 14fafd60cb026f50c23481867772411bb426ec6b97054e025b35db74fe8ea8f74faa2d36e7d40b4652d1f61794878510b49b7b4fe4349afccd24fc45fec2fd9e9e7
+R = 18b1df1b6d7030a23a154cacce4a2e3761cc6251ff8bf6c9f6c89d0a15123baef9b338ada59728349ce685c03109fcde512ed01a40afd2ca34e1bc02ecf2871d45c
+S = 0a399f9b9e21aeddf450429fec2dc5749e4a4c7e4f94cee736004dcc089c47635da22845992cd076a4f0a01d2cc1b0af6e17b81a802361699b862157ad6cad8bd1d
+
+Msg = f971bcd396efb8392207b5ca72ac62649b47732fba8feaa8e84f7fb36b3edb5d7b5333fbfa39a4f882cb42fe57cd1ace43d06aaad33d0603741a18bc261caa14f29ead389f7c20536d406e9d39c34079812ba26b39baedf5feb1ef1f79990496dd019c87e38c38c486ec1c251da2a8a9a57854b80fcd513285e8dee8c43a9890
+d = 1b6015d898611fbaf0b66a344fa18d1d488564352bf1c2da40f52cd997952f8ccb436b693851f9ccb69c519d8a033cf27035c27233324f10e9969a3b384e1c1dc73
+Qx = 110c6177ceb44b0aec814063f297c0c890671220413dbd900e4f037a67d87583eaf4b6a9a1d2092472c17641362313c6a96f19829bb982e76e3a993932b848c7a97
+Qy = 0f6e566c4e49b2ee70a900dc53295640f3a4a66732df80b29f497f4ae2fa61d0949f7f4b12556967bb92201a4f5d1384d741120c95b617b99c47a61e11c93a482d6
+k = 1a88667b9bdfe72fb87a6999a59b8b139e18ef9273261549bc394d884db5aa64a0bc7c7d38a8ef17333478d2119d826e2540560d65f52b9a6dc91be1340cfd8f8f8
+R = 015f73def52ea47ddb03e0a5d154999642202e06e6734ac930c1dc84756c67bbb1cca9f21f92d61bfdb2052c5dd2833349610f68139393d77250a7662ef7bd17cbe
+S = 155c744a729f83b27d1f325a91e63a0d564fe96ff91eaa1bad3bff17d2abffa065d14a1d20a04dd993f6ed3260b60bcc6401e31f6bc75aaafe03e8c1a9cd14d2708
+
+Msg = ec0d468447222506b4ead04ea1a17e2aa96eeb3e5f066367975dbaea426104f2111c45e206752896e5fa7594d74ed184493598783cb8079e0e915b638d5c317fa978d9011b44a76b28d752462adf305bde321431f7f34b017c9a35bae8786755a62e746480fa3524d398a6ff5fdc6cec54c07221cce61e46fd0a1af932fa8a33
+d = 05e0d47bf37f83bcc9cd834245c42420b68751ac552f8a4aae8c24b6064ae3d33508ecd2c17ec391558ec79c8440117ad80e5e22770dac7f2017b755255000c853c
+Qx = 1a6effc96a7f23a44bf9988f64e5cfafdae23fa14e4bee530af35d7a4ddf6b80dcd0d937be9dd2db3adcda2f5216fecbce867ee67e7e3773082f255156e31358c2f
+Qy = 1e7760190dfbe07ec2df87067597087de262c1e0a12355456faba91b2e7277050d73b924e14c0e93b8457a8b3e1f4207ce6e754274f88ad75c000d1b2977edc9c1a
+k = 18afea9a6a408db1e7a7bb1437a3d276f231eacfc57678bfa229d78681cbe4e800e6065332a3128db65d3aa446bb35b517dca26b02e106e1311881a95b0302d15e8
+R = 01c49b3c1d21f1678bdbe1ac12167e95e06617190bdee1a729c1c649210da19e2e210f6689e1310513bfe2ac6c0f4ee5f324f344b31b18df341eaadb826d07adc9b
+S = 129d4931ba457443012f6ffecd002f2abc3a4b65a58fee8457917ebcf24b29a1d3055b7fc62939a74ebb0c3582172ee7c3c75e0b2fa2367c6e04df63a7a91d593ad
+
+Msg = d891da97d2b612fa6483ee7870e0f10fc12a89f9e33d636f587f72e0049f5888782ccde3ea737e2abca41492bac291e20de5b84157a43c5ea900aef761006a4471072ab6ae6d515ffe227695d3ff2341355b8398f72a723ae947f9618237c4b6642a36974860b452c0c6202688bc0814710cbbff4b8e0d1395e8671ae67ada01
+d = 1804ab8f90ff518b58019a0b30c9ed8e00326d42671b71b067e6f815ac6752fa35016bd33455ab51ad4550424034419db8314a91362c28e29a80fbd193670f56ace
+Qx = 0a79529d23a832412825c3c2ad5f121c436af0f29990347ecfa586ce2e57fd3c7e0624d8db1f099c53473dbc2578f85416ad2ac958a162051014fb96bf07f9e1d17
+Qy = 17c0750f26df0c621d2d243c6c99f195f0086947b1bf0f43731555f5d677e2d4a082fb5fe8da87e1592a5fa31777da3299cede5a6f756edf81c85b77853388bb3ab
+k = 042d7c36fec0415bc875deb0fab0c64548554062e618aee3aa6670ffd68ab579fe620d3a9316357267fd3111c0ed567dca663acd94b646d2ba0771953cd9690ef42
+R = 0d01dfbef126febbdfa03ef43603fd73bc7d2296dce052216e965fed7bb8cbbc24142bfcddb60c2e0bef185833a225daa0c91a2d9665176d4ad9986da785f4bfcf0
+S = 16627e2614dbcd371693c10bbf579c90c31a46c8d88adf59912c0c529047b053a7c7715142f64dcf5945dbc69ff5b706c4b0f5448d04dd1f0b5a4c3765148bf253d
+
+Msg = 924e4afc979d1fd1ec8ab17e02b69964a1f025882611d9ba57c772175926944e42c68422d15f9326285538a348f9301e593e02c35a9817b160c05e21003d202473db69df695191be22db05615561951867f8425f88c29ba8997a41a2f96b5cee791307369671543373ea91d5ed9d6a34794d33305db8975b061864e6b0fe775f
+d = 0159bff3a4e42b133e20148950452d99681de6649a56b904ee3358d6dd01fb6c76ea05345cb9ea216e5f5db9ecec201880bdff0ed02ac28a6891c164036c538b8a8
+Qx = 12d7f260e570cf548743d0557077139d65245c7b854ca58c85920ac2b290f2abfeccd3bb4217ee4a29b92513ddce3b5cbf7488fb65180bb74aeb7575f8682337ef5
+Qy = 17560186230c7e8bff0bffce1272afcd37534f317b453b40716436a44e4731a3ec90a8f17c53357bc54e6ff22fc5b4ca892321aa7891252d140ece88e25258b63d5
+k = 14b8a30f988cefdc0edec59537264edb0b697d8c4f9e8507cf72bc01c761304bd2019da1d67e577b84c1c43dd034b7569f16635a771542b0399737025b8d817e1c3
+R = 0fc50939ebca4f4daa83e7eaf6907cb08f330c01d6ea497b86becda43dfcad47cb5c48f5eb2cc924228628070bcd144088c449a7873242ba86badf796097dbecd6d
+S = 0ccb6463c4301ba5c043e47ed508d57dd908fd0d533af89fd3b11e76343a1cf2954ce90b0eb18cbc36acd6d76b3906612d8a0feec6ebed13d88650ed9c708b28a11
+
+Msg = c64319c8aa1c1ae676630045ae488aedebca19d753704182c4bf3b306b75db98e9be438234233c2f14e3b97c2f55236950629885ac1e0bd015db0f912913ffb6f1361c4cc25c3cd434583b0f7a5a9e1a549aa523614268037973b65eb59c0c16a19a49bfaa13d507b29d5c7a146cd8da2917665100ac9de2d75fa48cb708ac79
+d = 17418dfc0fc3d38f02aa06b7df6afa9e0d08540fc40da2b459c727cff052eb0827bdb3d53f61eb3033eb083c224086e48e3eea7e85e31428ffe517328e253f166ad
+Qx = 00188366b9419a900ab0ed9633426d51e25e8dc03f4f0e7549904243981ec469c8d6d938f6714ee620e63bb0ec536376a73d24d40e58ad9eb44d1e6063f2eb4c51d
+Qy = 09889b9203d52b9243fd515294a674afd6b81df4637ffdddc43a7414741eda78d8aa862c9cbbb618acec55bb9a29aac59616fc804a52a97a9fc4d03254f4469effe
+k = 1211c8824dcbfa0e1e15a04779c9068aed2431daeac298260795e6a80401f11f6d52d36bcee3cfa36627989c49d11475163aa201d2cd4c5394144a6bb500bbaf02b
+R = 1d59401b8ac438855d545a699991142685077a409de2418c7ccfe01a4771b3870e76287a9654c209b58a12b0f51e8dc568e33140a6b630324f7ef17caa64bf4c139
+S = 143af360b7971095b3b50679a13cd49217189eaee4713f4201720175216573c68f7ac6f688bfe6eb940a2d971809bf36c0a77decc553b025ed41935a3898685183b
+
+[P-521,SHA-256]
+
+Msg = 8ab8176b16278db54f84328ae0b75ef8f0cd18afdf40c04ad0927ed0f6d9e47470396c8e87cde7a9be2ffbfe6c9658c88b7de4d582111119c433b2e4a504493f0a1166e3a3ea0d7b93358f4a297d63f65a5e752f94e2ee7f49ebcc742fa3eb03a617d00c574245b77a20033854d82964b2949e2247637239ab00baf4d170d97c
+d = 1e8c05996b85e6f3f875712a09c1b40672b5e7a78d5852de01585c5fb990bf3812c3245534a714389ae9014d677a449efd658254e610da8e6cad33414b9d33e0d7a
+Qx = 07d042ca19408524e68b981f1419351e3b84736c77fe58fee7d11317df2e850d960c7dd10d10ba714c8a609d163502b79d682e8bbecd4f52591d2748533e45a867a
+Qy = 197ac6416111ccf987d290459ebc8ad9ec56e49059c992155539a36a626631f4a2d89164b985154f2dddc0281ee5b5178271f3a76a0914c3fcd1f97be8e8376efb3
+k = 0dc8daaacddb8fd2ff5c34a5ce183a42261ad3c64dbfc095e58924364dc47ea1c05e2599aae917c2c95f47d6bb37da008af9f55730ddbe4d8ded24f9e8daa46db6a
+R = 09dd1f2a716843eedec7a6645ac834d4336e7b18e35701f06cae9d6b290d41491424735f3b57e829ad5de055eaeef1778f051c1ee152bf2131a081e53df2a567a8a
+S = 02148e8428d70a72bc9fa986c38c2c97deda0420f222f9dc99d32c0acba699dc7ba0a2b79ce5999ff61bd0b233c744a893bc105bca5c235423e531612da65d72e62
+
+Msg = c4bc2cec829036469e55acdd277745034e4e3cc4fcd2f50ec8bd89055c19795a1e051ccf9aa178e12f9beab6a016a7257e391faa536eaa5c969396d4e1ade36795a82ebc709d9422de8497e5b68e7292538d4ccdc6dd66d27a3ece6a2844962b77db073df9489c9710585ba03d53fa430dbc6626dc03b61d53fc180b9af5dea6
+d = 0b65bf33b2f27d52cbfabcadce741e691bf4762089afd37964de1a0deda98331bf8c74020a14b52d44d26e2f6fa7bcddbe83be7db17a0c8a1b376469cf92c6da27c
+Qx = 10038bb9a7aea626de68c14c64243150e72c69e2f8a1ab922bfbdaa6f33d24fb4542c0324357b0dd640bbcd07632ecd253f64ca2bfbfbf3de9b24fffd0568ab82da
+Qy = 0faf867d95308cc36d6f46844a0f535dc70f9768eed011a2464d2f308fa1d8e72c3616aec7e70516908183ffce7fdd36984a15f73efaa3858c2edf16a784d40e6c2
+k = 14aeb96c57d99677a1f5e4588064215e7e9af4027bfb8f31ff6126dbf341b8e6f719465e4273e91ba32670feca802549808322b7ee108bb20653cf20f93284d365f
+R = 075ead62edf7d86c5d1bc2443d1aeb5dc034fd999e6ea012cef7499d9d050cd97d262095884e9fc89a42e15bd3dee80fe3c1ba10f4caabc4aabb86347023028b663
+S = 129a992a6ff66d41948d11fa680f732b1a74315b804c982805190ed9d2fae223f2b149980b9241998cdea0c5672595a8a49d5186a0ef7a46c0a376f925bdda81726
+
+Msg = 1c1b641d0511a0625a4b33e7639d7a057e27f3a7f818e67f593286c8a4c827bb1f3e4f399027e57f18a45403a310c785b50e5a03517c72b45ef8c242a57b162debf2e80c1cf6c7b90237aede5f4ab1fcaf8187be3beb524c223cc0ceff24429eb181a5eea364a748c713214880d976c2cd497fd65ab3854ad0d6c2c1913d3a06
+d = 02c4e660609e99becd61c14d043e8b419a663010cc1d8f9469897d7d0a4f076a619a7214a2a9d07957b028f7d8539ba7430d0b9a7de08beeeae8452d7bb0eac669d
+Qx = 0fb3868238ca840dbb36ecc6cf04f5f773ea0ab8e8b0fdcf779dc4039a8d7146a417504e953c0cb5e7f4e599cc2c168deda8b7f16084b5582f89f2ece4cae5167f7
+Qy = 1f90b5c15eeda48e747cf3ee8183166a49dbfac6161cbd09d29d40a6854f4c495e88a435892a920cdaad20d41985890b648badd4f0a858ffcbd9afdfc23134ede18
+k = 1f875bbf882cd6dd034a87916c7b3ba54b41b2ea2ce84ebaf4e393fcf7291fee09dec2b5bb8b6490997c9e62f077c34f0947fe14cec99b906dd6bf0b5d301e75ca1
+R = 07aa70425697736b298233249f5d0cf25c99e640c9ff88035ef1804820e1bfe7d043755f02d7a079494f7fa6dc26740c4e6b7b430c63f29c67bbd3a5c88d2f0e8d1
+S = 0e0d42e4ff11cf5be37a9fda348514d5097a662f214687cbfb28ff42d635b13029871ca4f464bb1fbce02d5da4d5fb61b2a071844259fc863d136197bec3a61e7c7
+
+Msg = adb5f069b2b501a3ebb83d4f1808eb07710ac4a7b12532996855a20bcc54b2f76812915f632163c3654ff13d187d007152617cf859200194b59c5e81fc6cc9eb1ceb75d654050f260caa79c265254089270ccd02607fdcf3246119738c496dc3a4bd5d3be15789fc3d29a08d6d921febe2f40aef286d5d4330b07198c7f4588e
+d = 17c3522007a90357ff0bda7d3a36e66df88ca9721fb80e8f63f50255d47ee819068d018f14c6dd7c6ad176f69a4500e6f63caf5cf780531004f85009c69b9c1230c
+Qx = 13a4bea0eed80c66ea973a9d3d4a90b6abbb5dee57d8affaf93390a8783a20982eba644d2e2809f66530adeeee7f9a1da7515447e9ba118999f76f170c375f621f7
+Qy = 12f9dfaee40a75d8442b39b37a5c19ea124b464236e9b9a31bae6780cfd50f7ea4a700154b5ea0feeb64e9b35a1b0e33e46900cca1f34d13bb17e5017769841af27
+k = 18388a49caeda35859ef02702c1fd45ff26991998bd9d5e189c12c36cdae3f642ddd4a79561bd1d3e1cd9359de8f5c9e1604a312d207a27b08a6033f2741794ced5
+R = 15c6264795837dfea19f91876455f564f073c5c84a3c9d76e67872ae0447ba0d4850d8721302b25bec7ebfedd2721de140b2f3dead547042b24b0876117e7093cc1
+S = 060eb74236c189a28ed20bd0822eb22d75f7d97c9043a3c8e3f6d4c90bc8ca02ac4d37c1171c799a1c7dfd2fcbf83406b5e48c051e0fbf0fd937bfe6c3db4e18154
+
+Msg = f253484d121d1ce8a88def6a3e9e78c47f4025ead6f73285bf90647102645b0c32d4d86742a50b8b7a42d5f6156a6faf588212b7dc72c3ffd13973bdba732b554d8bffc57d04f8167aef21ee941ee6ffb6cce0f49445bd707da8deb35dca650aaf761c3aa66a5ebccddd15aee21293f63061a7f4bfc3787c2cd62c806a1a9985
+d = 0c4dad55871d3bd65b016d143ddd7a195cc868b3048c8bbcb1435622036bdb5e0dec7178ca0138c610238e0365968f6ddd191bbfacc91948088044d9966f652ff25
+Qx = 014858a3b9bd426b678fdcf93fc53d17e7a9e8fe022442aaaba65399d12fd3a6a381958fb0f07ac6088f4e490506ec0f1ab4d0dbd461126f7eb46ff69cfa8bd88af
+Qy = 18c18ce29ecc6d79d26a2de0cd31c4b32e84b5e90f6ba748f86c5afbd89618aceb9079460cbd1a8261ed5476973e61bf1d17ea78b022387443800c9247d21dde550
+k = 05577108f4187a173e5c29e927a8fc8f5ffd37e184254a6e381ff1018955aec91a35f30085e8cee6a7555c10f9efdce26d62f2b4b52dfdbaeafc3a30983e2d50d5b
+R = 0344375ae7c804cbe32ced7a20976efae5d9c19eb88b6e24514d1d0cfb728b0f4601098b18b2e98f42b5222dd5237d4d87767007bf5acb185c5526d72047e2cb1a1
+S = 02de4cfa908c73c1102d6fb7062baf54a056a9517701e036c9c51e09899d60051612d59348945f845dffebec5aa395b2fac7229929033615788777306ccad96d0a3
+
+Msg = 33bab1c369c495db1610965bc0b0546a216e8dd00cd0e602a605d40bc8812bbf1ffa67143f896c436b8f7cf0bed308054f1e1ff77f4d0a13c1e831efbd0e2fcfb3eadab9f755f070ba9aeaceb0a5110f2f8b0c1f7b1aa96a7f2d038a1b72e26400819b1f73d925ea4e34d6acaf59d0a461a34ce5d65c9c937a80e844e323a16d
+d = 03d4749fadcc2008f098de70545a669133c548ce0e32eec1276ff531bcff53533144555728ad8906d17f091cc0514571691107350b6561858e90dbe19633aaf31bf
+Qx = 10fe5986b65f6e65d13c88c4d2aed781a91026904f82129d46779bdadaf6b733c845a934e941ab4a285efdea9c96ecc9dc784d87e4d937b42c337b3a9cb111a9600
+Qy = 077853768a2a4d6f596f57414e57ec60b76d3cd5ece8351cd1f335ebcb8801a3d91fb82c65caaeb5c31eea9918367bb5906863ff3ccaf7a6cee415e0d75c15ac2e0
+k = 1fbb4de337b09e935a6dc6215ffcfcb85d236cc490585e73251a8b8bac37cfa36c5d1df5f4536d33659be1e7a442529a783452f7efda74a4f661b6a127f9248aaf7
+R = 09d8f10eeff6178594c89d6e8184f9502117384813243ddf9ccf3c8eac5dc6502c472dfc1487a5caffc569f7dedd14a8ebcb310e9bacdb79fb6655aba026cdf87f2
+S = 0f74236c7915d638708d17c9f10e39dda358faf9bbb821d8dcda0d151aac143bfb165ad0a23a65cd3de532e32cad928728f5ae1c16f58fc16577f3ca8e36f9e708b
+
+Msg = 08c8b7faaac8e1154042d162dca1df0f66e0001b3c5ecf49b6a4334ce4e8a754a1a8e4daf8ec09cf1e521c96547aed5172ef852e82c03cddd851a9f992183ac5199594f288dbcc53a9bb6128561ff3236a7b4b0dce8eaf7d45e64e782955ee1b690ce6a73ece47dc4409b690de6b7928cbe60c42fc6a5ddf1d729faf1cc3885e
+d = 096a77b591bba65023ba92f8a51029725b555caf6eff129879d28f6400e760439d6e69ce662f6f1aecf3869f7b6057b530a3c6ff8ed9e86d5944f583ee0b3fbb570
+Qx = 0fdf6aed933dba73913142ef8bdcd4b760db8500831cd11d7707ab852a6372c05d112a1e7fbc7b514c42142c7370d9f4129493cd75cc6f2daf83747078f15229db6
+Qy = 0ef91dffb3c43080a59534b95ca585ee87f6145f6a0199b2b82c89f456d8bd8e6ac71c78039c08177184484eb2ebd372f189db3a58fab961a75a18afec1ee32764a
+k = 13aa7b0471317a2a139c2f90df1c40d75e5a8a830fbaf87030fffdb2ef6f2c93d1310c9ed7fe9d7bcd4fe46537ff2495bc9c4f0aaff11461f5e4bebbfbce9a8740a
+R = 1c7a21800962c91d4651553633b18612d931bb88bff8b743ed595b4e869437e50f8e84fbf334c99061db123a1c40b73b07e203790561a37df65a660355ba2017d78
+S = 1301e1782559a38f1ca0eebe9bed0f5c7c33103d506a24f8a688f500ee1fe37f97b6685319279e82e6fe43cfd823ccbc123309974cffa76c4f8d41ec02a3cbc45f1
+
+Msg = ba74eed74282811631bd2069e862381e4e2a1e4e9a357b1c159a9ce69786f864b60fe90eeb32d8b72b099986fc594965a33285f7185b415df58fead7b8b50fc60d073680881d7435609ad1d22fd21e789b6730e232b0d2e888889fb82d6ad0337ab909308676164d4f47df44b21190eca8ba0f94995e60ad9bb02938461eee61
+d = 015152382bfd4f7932a8668026e705e9e73daa8bade21e80ea62cf91bd2448ebc4487b508ca2bdaaf072e3706ba87252d64761c6885a65dcafa64c5573c224ae9e6
+Qx = 00b8c7c0186a77dc6e9addd2018188a6a40c3e2ba396f30bbd9293dba2841d57d60866b37f587432719b544d8bf7eb06d90a8c0dc9c93b0c53d53b2f667077228ca
+Qy = 1dd2e5c73ab908ae34f701689f1cd3cf5186d3a2bc941e208bf3ef970e5e429ee9b154d73286b2e5da423e75b7c7b78c7bdf915da92279db43265a0cdefca51f86a
+k = 0d03506999f5cc9ec3304072984a20a9c64a22ad9b418495ca904f4bbddc96e76d34672cb52763339d3f3bc5b1701c00a675b972797e3a086314da1a8d338436566
+R = 085406c0ff5ec91f598bb579ad8714ad718c3e133d5dcc2e67c5d2339c146b69919cac07f3bc2bda218f4c7c8be04855e2ca6fff7fbdc4fc0fda87c8c3081cad4f5
+S = 1b45f2066e583636215ae135afc202b8bf3f301eccff2e1c0198b9aeddf695fa8179488e7b622fc307f601e2f6551815117cc836bb09ef888f8e64a45d9c84ad30c
+
+Msg = dc71f171a28bdc30968c39f08f999b88dc04c550e261ecf1124d67f05edeae7e87fe9b8135a96fe2bc3996a4f47213d9d191184a76bd6310e1ee5cb67ea7fc3ef6f641a0ba165198040fa668192b75a4754fc02c224bd4a74aade5a8c814adf151c2bfeda65165a04ef359e39847c84e312afb66d4cd1db50d41ef3fe5f31296
+d = 1750ff0ca0c166560b2034bc5760fe0b3915340bc43216e9de0c1d4a76550e8b2036e8b874230f8d29354aed43e183610f24fd4abd4b0be2f111dae942bd7a121f7
+Qx = 1b4b8947192a7c0166c0e0b2791e217370836283e805f3ee11cfb78445aba3c5bc39fe594e01916617ad59e7c8e740d8f2d07d88905d3f33bd5e51aafd4943c5dc6
+Qy = 1175d117232836c28e717ce2a55e59f4ec550effde30d18e3d99e42c6aa2283c7b3e7f2f6ff1fca605dde78c3a5bffa689347b4c93f51ba59a1787bb7d5e43861dc
+k = 023645023d6bdf20652cdce1185c4ef225c66d54f18632d99ccf743bf554d04c214c88ce52a4f71ec75c899ad1b3c07c34112ca20b55c217ff1d72c9528e2774ce8
+R = 1e933f68ce0f8403cb16822b8e0564b1d39a35f27b53e4ae0bcdff3e051759464afbc34998ba7c8a7ee34ef6c1aaa722cffe48356fd0b738058358d4c768b3186c1
+S = 0a67368a305508ce6d25d29c84f552a4a513998990fef4936244f891a2909c30d5fdc9e8a267ecbf3c597138f4a08f7e92bee57d5420eadd700fee864bf78b2614b
+
+Msg = b895788d7828aaeace4f6b61a072ffa344d8ea324962ba6dab5efda93f65bf64a0f2ac6d5721d03ee70e2aef21cdba69fd29040199160e3a293b772ffb961ed694a8dc82800dab79367a4809a864e4aff6bc837aaa868e952b771b76591c0bb82249034e3208e593d85973d3fea753a95b16e221b2561644535c0131fe834ae7
+d = 023048bc16e00e58c4a4c7cc62ee80ea57f745bda35715510ed0fc29f62359ff60b0cf85b673383b87a6e1a792d93ab8549281515850fa24d6a2d93a20a2fff3d6e
+Qx = 0ba3dc98326a15999351a2ec6c59e221d7d9e7ee7152a6f71686c9797f3f330d3150123620d547813ba9d7cc6c6d35cc9a087d07dff780e4821e74ad05f3762efd6
+Qy = 18b051af9824b5f614d23ecadd591e38edbfe910ad6cbebc3e8a6bec11ea90691c17deb3bc5f34a4a3acd90b7b10f521f6ee7b3cfbfdc03b72d5a8783a4a77c3e4c
+k = 06099d2667f06c58798757632d07d8b3efbe9c1323efb0c244be6b12b3b163ba1b7cf5246c98dcc0771665a66696d687af5f28ed664fd87d5093df6427523d4db84
+R = 10dc80ea853064a2ba5a781f108aca3785c5ec0aa45aa05ba31d4de671170797589e863d54a3a986aadf6f670277f50355713dfb27d4ec7e348f787910b3cd668cd
+S = 018572bfad4f62e3694d1f2e6ffd432faed2e2b9d7e3611a07138212f1e79e6c394839f7cfae96bc368422630016fb9346681eadc5f9699e7331c3b5fde6d65e4c6
+
+Msg = 2c5bd848c476e34b427cfe5676692e588e1957957db7b5704492bd02104a38216535607f5d092dc40020130c04a3aaf0f1c52409834926d69a05d3f3188187a71d402a10ba34eac8629b4c6359b1095f30f710219298bf06b9f19bfc299981d7e251ca232a0a85338a7e02464731d1b25d4a1f68baf97064516590644820c998
+d = 02b8b866ce4503bb40ffc2c3c990465c72473f901d6ebe6a119ca49fcec8221b3b4fa7ec4e8e9a10dbd90c739065ad6a3a0dd98d1d6f6dcb0720f25a99357a40938
+Qx = 1b8c7a169d5455f16bfe5df1ba5d6ec9c76e4bad9968d4f5f96be5878a7b6f71d74bfac0076dd278bc4630629f3294646f17d6b6c712b0087e2c4d576039cfdc8b9
+Qy = 18faffd5422dfd1b61432fa77b9a288b2b7d546656c0dcca3032179e6f45ee3cf61d6a447fc51731cb54457343a41569fcf78cef42895f4da5efcb14ea1fc065f8d
+k = 0ac89e813f94042292aa1e77c73773c85cf881a9343b3f50711f13fa17b50f4e5cb04ac5f6fc3106a6ef4c9732016c4e08e301eefac19199459129a41a7589e0628
+R = 05bc7a253a028ee8b7253979b8d689d41d8df6fae7736341f22e28b6faf0cbbdebbd2ef4d73e56d2021af2c646dc15539a7c1e1c4dc9c7674808bd7968d8a66f947
+S = 0fd71575837a43a4cf1c47d0485cfd503c2cf36ebcea0fdef946ad29acb7fb2e7c6daf6b4eb741eb211081aed6207d02569f1518988f275ad94c7fd4735cb18a92e
+
+Msg = 65a0b97048067a0c9040acbb5d7f6e2e6ac462e1e0064a8ce5b5bbf8e57059e25a3ef8c80fc9037ae08f63e63f5bdb9378c322ad9b2daf839fad7a75b1027abb6f70f110247da7e971c7c52914e5a4f7761854432fa16b2a521e7bcaee2c735a87cad20c535bf6d04a87340c229bf9af8647eedca9e2dc0b5aa90f7fea3cdc0a
+d = 0a43b32ad7327ec92c0a67279f417c8ada6f40d6282fe79d6dc23b8702147a31162e646291e8df460d39d7cdbdd7b2e7c6c89509b7ed3071b68d4a518ba48e63662
+Qx = 172fb25a3e22c2a88975d7a814f3e02d5bb74cfb0aaa082c5af580019b429fddd8c7f9e09b6938f62e8c31019b25571aaceef3c0d479079db9a9b533ee8e1670abd
+Qy = 0ff5516223b6cc7c711705f15b91db559014e96d3839249c5c849f2aced228a8998177a1e91177abbb24b57a8ea84d944e0c95da860ae0925f1b40c0e1b7c9e0a46
+k = 0383eda042e06c0297fbd279a2ad40559c5c12ad458f73458eebcc92b308d3c4fcec20a5b59f698e16fa6ea02dba8661b6955f67c052f67b0a56460869f24cfdf7d
+R = 1b9c35356b9d068f33aa22a61370dae44a6cb030497a34fb52af23c6b684677370268f06bb4433be6795a71de570088aec17ce0c9933d2f76c7edce7f406f62fedd
+S = 06f07ea453cfa20ad604ba855332f62834657b0b795684d50c1562a675456e37f4dae45f0df47d8e27e47bc9ce9c9cbba1554c5b94b0b17401b73c8d0c0902c6cc4
+
+Msg = d6e366a87808eea5d39fe77cac4b8c754e865a796062e2ec89f72165cd41fe04c48148068c570e0d29afe9011e7e7a2461f4d9897d8c1fa14b4ff88cab40059d17ab724f4039244e97fcecb07f9ffeec2fb9d6b1896700fe374104a8c44af01a10e93b268d25367bf2bef488b8abcc1ef0e14c3e6e1621b2d58753f21e28b86f
+d = 03c08fdccb089faee91dac3f56f556654a153cebb32f238488d925afd4c7027707118a372f2a2db132516e12ec25f1664953f123ac2ac8f12e0dcbbb61ff40fb721
+Qx = 193301fc0791996ca29e2350723bd9aa0991ddbb4a78348ee72bdcd9ed63ce110ba3496f2ce0331b5c00d4d674c1b70114e17ce44a73c3e16bab14ed1ee924202e4
+Qy = 0aea9b288cfb2933ec0a40efa8e2108774e09b3863b3193d0dac6cc16ccaa5bd5f9ce133aec5cd3b62cbaeec04703e4b61b19572705db38cfaa1907c3d7c785b0cd
+k = 0d0e90d5ee7b5036655ad5c8f6a112c4b21c9449ca91c5c78421e364a2160bbac4428303657bc11ea69f59fb0fe85a41b8f155a362343094456fd2a39f2a79e4804
+R = 1a8c23a2965d365a4c2ffd0802ae8b3a69c6b84a1ba77fd8a5f2f61e8ec3a1dcb336f136e2a997252eaa94caf9b5ad6c9ecff5bf33abf547ca84985bb89908a11d7
+S = 1cc42a2dd97aa42b9df5ea430e0d4cb13106dd6da6e8c9315c96ed7b052db365bbde6960c9a965954a4398c18ea7db9593bbfc3c3b6b3466ff806fccac3de6424ab
+
+Msg = f99e1d272d0f5fb9c4f986e873d070ec638422bc04b47c715595e2cf1a701cdf88bc6c4b20085b357bad12ccba67cac8a5ca07f31ba432f9154ff1fadefd487a83a9c37e49fb70a2f170e58889cab0552e0a3806ccfa2a60d96e346851d84b7de6d1a4b8cf37567dc161a84f13421e3412457d4bc27f6213453c8519a2d7daa2
+d = 0969b515f356f8bb605ee131e80e8831e340902f3c6257270f7dedb2ba9d876a2ae55b4a17f5d9acd46c1b26366c7e4e4e90a0ee5cff69ed9b278e5b1156a435f7e
+Qx = 0fc7ae62b05ed6c34077cbcbb869629528a1656e2e6d403884e79a21f5f612e91fc83c3a8ac1478d58852f0e8ba120d5855983afd1a719949afa8a21aec407516c3
+Qy = 0aa705da6459a90eaa2c057f2e6614fb72fc730d6fdebe70e968c93dbc9858534768ea2666553cd01db132331441823950a17e8d2345a3cab039c22b21bfe7bd3b9
+k = 19029260f88e19360b70c11107a92f06faa64524cfbd9f70fecf02bd5a94f390582a7f4c92c5313bb91dc881596768d86f75a0d6f452094adbe11d6643d1a0b2135
+R = 07f2158e9b9fa995199608263969498923cf918fdc736427c72ce27ce4a3540dce2e8e5e63a8fc7ba46f7fa42480efbf79c6ed39521f6e6ec056079e453e80a89d9
+S = 08e349eed6f1e28b0dbf0a8aeb1d67e59a95b54a699f083db885f50d702f3c6a4069591afaa5b80b3c75efb1674ebd32c7ead0040d115945f9a52ee3a51806cad45
+
+Msg = 91f1ca8ce6681f4e1f117b918ae787a888798a9df3afc9d0e922f51cdd6e7f7e55da996f7e3615f1d41e4292479859a44fa18a5a006662610f1aaa2884f843c2e73d441753e0ead51dffc366250616c706f07128940dd6312ff3eda6f0e2b4e441b3d74c592b97d9cd910f979d7f39767b379e7f36a7519f2a4a251ef5e8aae1
+d = 013be0bf0cb060dbba02e90e43c6ba6022f201de35160192d33574a67f3f79df969d3ae87850071aac346b5f386fc645ed1977bea2e8446e0c5890784e369124418
+Qx = 167d8b8308259c730931db828a5f69697ec0773a79bdedbaaf15114a4937011c5ae36ab0503957373fee6b1c4650f91a3b0c92c2d604a3559dd2e856a9a84f551d9
+Qy = 19d2c1346aadaa3090b5981f5353243300a4ff0ab961c4ee530f4133fe85e6aab5bad42e747eee0298c2b8051c8be7049109ad3e1b572dda1cac4a03010f99f206e
+k = 1a363a344996aac9a3ac040066a65856edfb36f10bb687d4821a2e0299b329c6b60e3547dde03bdbd1afa98b0b75d79cf5aac0ef7a3116266cadf3dfbd46f8a4bfc
+R = 1ff097485faf32ce9e0c557ee064587c12c4834e7f0988cf181d07ba9ee15ae85a8208b61850080fc4bbedbd82536181d43973459f0d696ac5e6b8f2330b179d180
+S = 0306dc3c382af13c99d44db7a84ed813c8719c6ed3bbe751ead0d487b5a4aa018129862b7d282cce0bc2059a56d7722f4b226f9deb85da12d5b40648bf6ec568128
+
+[P-521,SHA-384]
+
+Msg = dbc094402c5b559d53168c6f0c550d827499c6fb2186ae2db15b89b4e6f46220386d6f01bebde91b6ceb3ec7b4696e2cbfd14894dd0b7d656d23396ce920044f9ca514bf115cf98ecaa55b950a9e49365c2f3a05be5020e93db92c37437513044973e792af814d0ffad2c8ecc89ae4b35ccb19318f0b988a7d33ec5a4fe85dfe
+d = 095976d387d814e68aeb09abecdbf4228db7232cd3229569ade537f33e07ed0da0abdee84ab057c9a00049f45250e2719d1ecaccf91c0e6fcdd4016b75bdd98a950
+Qx = 13b4ab7bc1ddf7fd74ca6f75ac560c94169f435361e74eba1f8e759ac70ab3af138d8807aca3d8e73b5c2eb787f6dcca2718122bd94f08943a686b115d869d3f406
+Qy = 0f293c1d627b44e7954d0546270665888144a94d437679d074787959d0d944d8223b9d4b5d068b4fbbd1176a004b476810475cd2a200b83eccd226d08b444a71e71
+k = 0a8d90686bd1104627836afe698effe22c51aa3b651737a940f2b0f9cd72c594575e550adb142e467a3f631f4429514df8296d8f5144df86faa9e3a8f13939ad5b3
+R = 02128f77df66d16a604ffcd1a515e039d49bf6b91a215b814b2a1c88d32039521fbd142f717817b838450229025670d99c1fd5ab18bd965f093cae7accff0675aae
+S = 008dc65a243700a84619dce14e44ea8557e36631db1a55de15865497dbfd66e76a7471f78e510c04e613ced332aa563432a1017da8b81c146059ccc7930153103a6
+
+Msg = 114187efd1f6d6c46473fed0c1922987c79be2144439c6f61183caf2045bfb419f8cddc82267d14540624975f27232117729ccfeacccc7ecd5b71473c69d128152931865a60e6a104b67afe5ed443bdbcdc45372f1a85012bbc4614d4c0c534aacd9ab78664dda9b1f1e255878e8ac59e23c56a686f567e4b15c66f0e7c0931e
+d = 04ceb9896da32f2df630580de979515d698fbf1dd96bea889b98fc0efd0751ed35e6bcf75bc5d99172b0960ffd3d8b683fbffd4174b379fbdecd7b138bb9025574b
+Qx = 0e7a3d30d5bd443549d50e9b297aaa87bc80b5c9e94169602d9d43d6d0c490c0bed8cc2170288b106bdbf4c9f1ce53fd699af0b4c64b494b08520e57dc01ab9a8b0
+Qy = 1d81056d37aec8a75d588f6d05977416e6f24ad0117a7f4450036d695612e7bc2771caed80e580314eebc88c8fc51c453f066e752481f212b57165d67f8a44f375a
+k = 046639c5a3ec15afae5e4a7a418ac760846512d880c359bc2c751b199ce43b10887e861b14127809754dbea47f6cc0140d2817e3f5b9a80ce01abd81f81b748433a
+R = 0f913de91e19bd8f943d542ae357bacc942a0967abc9be6c06239a379db8cc733fa50013e0b0f088bce9d630262feaa33b30d84f91bcf5ce9976e4e740fcb112f84
+S = 08a73a5c9c24235e0d9cecaac653f68ce5a6fb186ce67fa058d6ddbbd4d0a8c4d194e571148e8ad6c8882b4e33d2f60fb23dd7d07a1ae60864e8277918f592b3dc6
+
+Msg = 6744b69fc2420fe00f2352399bd58719e4ecdd6d602e2c80f194d607e58b27a0854745bfd6d504de2eb30b04cee0f44af710dd77e2f816ac3ac5692fad2d1d417893bb0edba2707a4c146a486f8728ca696d35cc52e9c7187c82d4bdb92eb954794e5ad15133f6bfea1f025da32ada710a3014cf11095b3ff69a94d087f17753
+d = 00a8db566bd771a9689ea5188c63d586b9c8b576dbe74c06d618576f61365e90b843d00347fdd084fec4ba229fe671ccdd5d9a3afee821a84af9560cd455ed72e8f
+Qx = 04f5b790cbe2984b71d41af5efed6c6893d15e13f31816d55a9c2926a104eee66f1ada83115d1388551218773b8b9d1138e3e3f027bb4392c90c14fd232580b4a11
+Qy = 0660eb160e9bfc8c5619e70e948e238c6fd37739bc1bb657b8e8436e63628f91992be7e63d9a7359623a1340642777b22026feb51116a6c50c54c3589b9bd39b6cb
+k = 1e7b5e53571a24bd102dd7ad44a4b8d8a4e60e5957bc3c4e5d3c73109f55233f072e572c7892f425ba5e64d3cb7966096bb34a47e26cd5b3e3b44108b310d9f681b
+R = 1a88bcd7e2bdff6e497d943dde432fb3f855a7177c466319cb53b701230c299db030276269685857d1e3f28110e690f2f529c8d18115eb381f313bc891d92ad278e
+S = 146f1984ea879274dfd5e86ad92e564a4de081523ddbb1c397b8f9595911ef2e6501bc081584d5340f7aa47e1af036234ac6f27a5ac31f78dd3b0ff1a62693c630d
+
+Msg = 16001f4dcf9e76aa134b12b867f252735144e523e40fba9b4811b07448a24ef4ccf3e81fe9d7f8097ae1d216a51b6eefc83880885e5b14a5eeee025c4232319c4b8bce26807d1b386ad6a964deb3bdca30ee196cfdd717facfad5c77d9b1d05fdd96875e9675e85029ecbf4f94c524624746b7c42870c14a9a1454acf3354474
+d = 1a300b8bf028449344d0e736145d9dd7c4075a783cb749e1ec7988d60440a07021a25a3de74ea5e3d7bd4ab774d8ad6163adae31877ef0b2bd50e26e9e4be8a7b66
+Qx = 05055b9ad726ba8a48219b0ecbfffb89f8428de895b231f676705b7de9f2022d9ff4e0114ebb52dea342f9bf76b2fb060c020e29d92074ebb1fbfe5290a58c8bc10
+Qy = 0415af7f20a6e945315adbf757316bb486c80780a0a3a15b4b9609f126d7341053a2b726ab63cb46feee527b0bf532b32b477e5671aea23d9b3c3e604b9029954b5
+k = 05a2e92717bb4dab3ee76724d4d9c2d58a32b873e491e36127985f0c9960c610962ca1c4510dba75c98d83beebdc58b1d8678e054640951d11db1bd2d8a4ab8476b
+R = 104a78ce94f878822daaf00ee527fbdbf6cceb3cbb23a2caa485e4109466de8910252f92379ab292cac8d1eda164f880c0067696e733fc8588a27703a3e1f5b8f1f
+S = 1ffe23e8ab5a31668a81161a234ea14879771fe9866f8872eb6edb672e0fe91d2bb75c9767a2dfbac7c15c802211236b22ea41ecd055a0b8b311ffc4255f86d5c67
+
+Msg = a9824a7b810aa16690083a00d422842971baf400c3563baa789c5653fc13416111c0236c67c68e95a13cec0df50324dcc9ae780ce4232607cb57dd9b2c61b382f0fa51fd4e283e2c55ffe272597651659fbd88cd03bfa9652cd54b01a7034c83a602709879e1325c77969bebfd93932ce09a23eae607374602201614ff84b141
+d = 06a253acd79912a74270fc0703ed6507ab20a970f2bc2277f782062092cf0e60ae1ca1bb44dec003169bc25ef6e7123dd04692f77b181a6d7e692e66b09d35a540c
+Qx = 1f15c6b1df156fdd8381cd7446e039435e445f8f36f0247475058da0e371bf72753f6e39f98066bc79370b038c39687ba18e16cb118fe6538b7568c5403c251f6b7
+Qy = 12d2b4f46b854eeae75f1c63f55b76bf0c604d47f870c28a50ecdeb52bba1dd9a0ff12e680804ff864111207652da7dd10b49edf66bb86be00bc06672de91982457
+k = 165faf3727e42fd61345cfa7b93e55fb4bf583b24bdc14ce635b6c99dbd788012f14da9a210b677c44acdd851e672f1a48188d6b8946c0efeebfe8a597ba0090a2c
+R = 1ad9463d2759abd568626548578deefdcd8b2d050ce6d9c7ed05feca20167484b86e89bdcc936fd647e0f8aedd7b6add2b8cf13ff6ff013c2b5540c6c56fda97a0c
+S = 1645a7d0e11015256cfb034adca198695eea6aedd44d9fbf496850ccfed950f43fffd8dbf41e113f2d3837d8a5dd62b2ed580112ff05800b1f73196e5576810e15b
+
+Msg = 90d8bbf714fd2120d2144022bf29520842d9fbd2dc8bb734b3e892ba0285c6a342d6e1e37cc11a62083566e45b039cc65506d20a7d8b51d763d25f0d9eaf3d38601af612c5798a8a2c712d968592b6ed689b88bbab95259ad34da26af9dda80f2f8a02960370bdb7e7595c0a4fffb465d7ad0c4665b5ec0e7d50c6a8238c7f53
+d = 0d5a5d3ddfd2170f9d2653b91967efc8a5157f8720d740dd974e272aab000cc1a4e6c630348754ab923cafb5056fc584b3706628051c557fce67744ee58ba7a56d0
+Qx = 128a4da5fc995678e457ceb3929adee93c280f851abe900fa21f4f809dafad4e33b381e0cd49ce8dd50e2e281cea162bfd60a1d6a1c0ee2228e6a011e171b559ab8
+Qy = 06eb0917cd72256992c49ea527f6bb0315f13d8047794a0f1da1e93737703b1c2a74a00441ef3b47b6a2ff789c49ae32d91cabe7b29247aeec44f6c40a76597a2ca
+k = 03269983a5c2bcc98e9476f5abf82424566b1f08b17204d29e310ece88f99eb677a537f86fe2529e409cfef2c12929644100099e0de2f27c0f0ac11105a4dca935b
+R = 1a5257ae1e8187ba954f535b86ff9b8d6a181a3b95c250d090cb4e9c3bfbd03aa64696a76c569728ef67780d6338d70ce46da40b87a3e49bfe154b93930890dfa93
+S = 05b6ccdfd5c63c7db76d3a0478064a2a376e0e050cb093be795a72a549247c2e4adba9183145c63d46479dbbdcf09986a6f64c09c7e16abc4853f6376c9558b014a
+
+Msg = 09952b1e09995e95bf0022e911c6ab1a463b0a1fdd0eec69117b34af1103c720b57600217de7cd178fef92de5391e550af72a8dcf7badf25b06dd039417f9a7d0f5be88fcd4e9655931d5b605452a667c9d1bae91d3476e7d51cff4108f116a49966fb3a7cff8df1c09734ce5620faf2dccb3dc5d94e7e9ac812da31f6d07a38
+d = 1bcedf920fa148361671b43c64e3186e1937eb1bd4b28cbd84c421472394552889bc05509aa732ef69d732b21b750523fdfd811f36467690fe94e01e64c9d5cbbe9
+Qx = 0d33c151d202a5d4d831348e940b027ee32e4b0b9b48d823a05c67ff3bdaee0189fc6680565f352c062e99968afc643208b4f9c7af185b861658a88c4ad0fcc8ba2
+Qy = 0e4441ddb546468ad8ffa6074f137edfbb81e82e0e7d8f05c4c54598aa996a9cde54cb371f642bfdd4ae7eca5b769696030027129a4183da93567ad142a2dff5183
+k = 046e619b83aac868b26d0b3cbfab55e630e0b55c461985b5d00f94ff3a5ce90ff412cebf46bbd84550d2031d573ca27d924624428360708c8d8491c29eb01d30f2e
+R = 08427c0f0ac0263472cd423c0fb554bf3c851b9c775c566ab0f6878717bd57665830767b05b7789c5c0b078195bd943dc737325552d32877ecb04a7c41bd07cd80c
+S = 10bb6652d6a624c40a7dd06828f15774130d02369ceb1a7d03b553e16e17b7fa5b5401f15885d5e4fc2e55c0c7a1b97871ab02f76386b93a16aa6e7eb65debac6dd
+
+Msg = 0bb0f80cff309c65ff7729c59c517d50fc0ed5be405ef70cb910c3f62c328c90853d4473530b654dda6156e149bc2222a8a7f9be665240e2fbe9d03f78a2356af0bacd1edb84c4801adc8293a8a0bd6123d1cf6ba216aca807a7eb4dca76b493eb6e3dbb69d36f0f00f856222f24d9b93ec34c3b261be2fca0451c00571928e5
+d = 03789e04b3a2a0254ade3380172c150d2fad033885e02ea8bea5b92db3f4adbab190ae423080a1154dfedec694c25eab46ce638be3db4e4cba67bc39f62d6e7db2d
+Qx = 1dbc2cf19627bdccf02432b1761f296275230c150cdde823ce3141ec315d7d05e16b2c29e2a67491078d5316883e933d85b4b10d4f64c477d3c4e0442dc928983a2
+Qy = 07562e720807dd118d3d8b265b3abc61a71fce43e3dce0e7b5ae18b7a4cb01ecc00d39c1f22e150a9a8728997e502144f5b3f6fa9b4cb8a4136212b082ca394e3f6
+k = 0fbccd8d7804bdd1d1d721b5ec74d4ba37603bc306f9fce2ec241853d8e07334e6b4b12c4ecca0c54bd71193dd7146507933a20737c5f3e15085830fab9b30ca57b
+R = 181915a3998d8fa214f9715f4ca928d09c36de168dc15c6970a8a062b5cea2dc969b2437ca17b684f78a1fd583aad8e6c762c8f4ab0c91b86a497145e3ca440d307
+S = 15a6c18c5c77f5470b27d061eafdc26b78561941a3b2ab0f5c81d40899fc053c3d9ed12d7d61e298abbae470009c7b2157731c58d7b16a66fa5abaf5e8a1b8ed394
+
+Msg = 7efacf213382ce30804e78b7256854d759147dba9729c51b2759465715bf2c421034c23dc651c13d6cce95f71fe6a84dfbee5768163ac5789ac0474c5ddf4115684683c5f7c204b33b8bcc0c03ac58f66cef2f53b721fe2fac91ad841126101a88f512a7c2ded38549d9f050d4b7961dda48a1489f026c5d111701762418cfe3
+d = 124700aa9186353e298edefc57bec0c7d0201cca10c1d80dd408d5d71040592b0ac59facdadfa8712445f5977ef8d4854022720c3f02d60e0732dbb2f171fcf1490
+Qx = 0c80fc4cecae5d53348524ddba6a160b735c75b22fdb39af17e2a613d09246e3bb0fd3f2978577f6db5d2118e05c7898024808f8eb8e021d7969cdcf7fc981200bb
+Qy = 1a880c93943fd446d4b3923b574d2221c1bb7b645fb5534dda60e827b497666ff586b77921f7e7f605147947194cffd2fef0678880b89cc0bc7fb74fa96d4b112d7
+k = 01a05238d595ded5c61d3bf6fde257dbf13095af8a5cb3a2e579e8e4c550fe31d12b71cc2dbcb295e6c4fd0fb8c22d1b741c097cc59d826ced1a8771f09983143c4
+R = 132762bc81e9922a8d642e3a9d0218affa21fa2331cfcb9e452545c5981c64a8f7e4cc8e68056023b2aa78bead59061d19c7f646c931163a91e544b106b3be8de9e
+S = 0c3a1b0b000c3169984132add51d611e2cb7069a262a6983d2ae72b459c36e6469509bdb0f473600b8686700b08910779dee9ba83f82e755d4a4ef5f124eb09397f
+
+Msg = 28edff8b9d85f5f58499cc11f492abdfab25e8945975bbaeee910afa2b8fc1295ec61406309ce4e09f4ab4f462959fc2a2786802466eb26d3b01be6919893ae75d0fdc2dc8a82e662550f9fce9627dd364188aaba5c6faa1b2d8a2235adfa5ad0dc140f88a2b2f103f5690e877d07fe8fd30d02d2b2729bd3d8eb5b23a21f54c
+d = 1f532d01af885cb4ad5c329ca5d421c5c021883bd5404c798d617679bb8b094cbb7e15c832fb436325c5302313ce5e496f9513455e7021ffad75777a19b226acfa1
+Qx = 0c0bd76b0027b85bdd879052220da1494d503f6a4bb972105a48ae98e7dda8c2d9fd9336f5646385b961ef68e8464e3a95b00f96614b1a408ceaa2c87b077b6a8fb
+Qy = 17eb7eb5c78db7819af92e8537d110d9f05a5e24f954f4dde21c224d4040f059ec99e051702f390413d2708d18f84d82998c61847475250fb844b20082cbe651a6b
+k = 14e66853e0f7cd3300ebcae06048532e19cbb95bee140edc1c867ce7310637651445b6dfeb1d99d2e32f2ffb787ebe3fe35032277f185d3dad84f95806924550abe
+R = 0c5b3a57161098e2e8e16e0a5ae8ecf4a14df14927eea18ed4925d11dc429dda145159323ba970174b194b9b4608a8fa2373b7a825c5e8bd80574e49698285c2c82
+S = 1a0c038a51796158b42eb5b0dac37aff9ab93b903a47e06ebbdd15946e4bcc9a3b3875b18cf6294c33fc6c3693cef04ed1a43d08951e664c760e2cf3fb4e47490d2
+
+Msg = bae2a8897c742fd99fbf813351cd009d3f2e18d825ca22e115276484bce8f82f8c7c0c21dd2af208404d8ef45bb5a6c41693912b630897d5246801bf0775aa9bbac8be98cb861d172c3563dc59e78a58ed13c66dea496471b3ad0eeae8995293e4ab97373edc1837ffc95ff1cc0c1e90e64ea8680b2ca5f1e09bf86b99b343b6
+d = 11abf508bca68a85a54bc0659e77efad3c86112c9db04db2883e76144aa446918bb4bb0784b0b6a0e9aa47399fe3de5aaecfd8894a0d130bb0c366c40d9d5050745
+Qx = 05c0ea363a3a12633ea39d564587ebdd3a22a175ef32b9ebfc7311304b19cb3a62b5adc36f6afb6a6f7fabbf810ee89fdb72854fefd613e7798e9b9ff5938ea54c6
+Qy = 0bd06a85e47b885c08124b55a3fcc07ca61647cda6efbfdbd21b24d1ea7a4c7300d46cd798e76063aa979adef6f0698b15e5b7ae8a2ab39ab4f50b2d20614db6317
+k = 19cadb8c7eb10565aa4567e0709873918720f0e4b42b4817afb0b0547c70cd1100229deae97a276b9c98ea58b01d4839fee86336d749d123b03e8b1a31166acc110
+R = 0667448a8bbef1c810d40646977dc22f3dfb52a4d80928ded5e976e199cbed02fbd5a08546756ece14548d721a6eb380d0e1a71ad0660dbcac6163c776eedd3e249
+S = 0ae7f0a238daaddb7fb4a1707fe5132daf653f8e19f732347134c96f1dd798f867c479a4a4609a568a15b61afed70790adbde13ac5f68c468d0230852c1a2c22581
+
+Msg = d57a26a9593e72bfc87322524639bcaae5f2252d18b99cdaa03b14445b0b8a4dd53928f66a2e4f202fb25b19cad0eb2f1bfda2ab9b0eb668cdcd0fe72f5d9ef2e45e0218590f7ab9d2c9342202610c698bc786cce108a7d4a6730a13e9ea1b470e781f1237d3f84f44abde808516975546bd89075ef9a9732bfd7ee33b6f4399
+d = 18dbf520d58177e4b7a0627674d220137983f486dd2fd3639f19751804e80df0655db6afd829cdf75238de525e1a7a9f048049b593dd64b4b96cc013f970c05ea1f
+Qx = 18b872690c37995be324ddb5c2bd5462841bb062f8e63da248a853de79c3d6bb9a2eb1e6933afda0998ca43491cc807b08ace2d5336a43d0ab50563a2d3d98755f0
+Qy = 002ff31221aa32aa6546f35e8fe5b9361f938362a5e89e77ae130ba8bce3729e912dfac35a2fd21efe84b45b8be2a340850e4b574e1885b35c2afbe196b57c6cf4c
+k = 098faeb73054639cb2e4442cd68e7b3a13f4b3f397a7b26f303afa40789f8ddd3d918f1ce4f0be53c8cb69c380744e2297d7fc01e2b3daef4ce64dd3a2644234753
+R = 09c0e7649f814f70a8416cb78bc4601472a363fe97f5c587305778169677860dd97f87b5ab07c3a953bc4615fc34634509d6a25621bdded33ed42446d059509c190
+S = 120b90e1cfb8a1b5e530df7b17d1128bc051ca4f1a65dd9c9d9d3c59d2f00c7c1e994c52b8671d40294b4d574d2c04475d5bebeacd3a0d3870a54dc7a4805614f40
+
+Msg = 8fdcf5084b12cfc043dd3416b46274e021bbed95d341d3c500c102a5609d3a34de29f8fa9f0adb611a1f47a97ad981f8129d718fc0d6c709eab1a3490db8d550f34eb905b9e00663543afc5bc155e368e0bc919a8b8c9fa42093603537a5614927efa6be819ed42ececbf1a80a61e6e0a7f9b5bc43b9238e62d5df0571fea152
+d = 002764f5696aa813cd55d30948585f86288ae05aeb264ca157cd09e1d09a10515a849b0791b755ccc656a34707be9e52f5762d290a7d2bcd6de52c600ff862eaf4e
+Qx = 127279c88719dc614db387f102e55104ea1c704ac7f57f3bca936f728439b76556730dd7cde2ac1ad0a4c2c2f036ab6f00cf34cb87ea36113571f300713044106d2
+Qy = 134a0786c31f5f2291b83c50fb579ae4c620b95e5a8bdc0c7e1ee6b996c89d764f1b20403e7faa203f397425ada297045dd8ba0e4b155d4900da249e934faab7991
+k = 08bffb0778cbb06466cecc114b9e89ca243a2b2b5e2597db920bc73a8bbcbe3f57144ad33409ef7faaab430e13f4c42d304d11347360c84972ca20b1539cce3a288
+R = 1f8f504e64a502e51e7c129517931c3b71f0d8a63b19cfe01ff7c951c6525249608b3ef5d00061d77eb6b3d69581adeaa3732c773bbb9b919c3e7c71fdc09f44d06
+S = 058044fc64b340604ffd02a5b2918d76fd6fb59ea895feab7aa218e6f1e8c8f226eb9ee345ef8140183a69272582005077b008006aab11597e808d7ff1e8382c924
+
+Msg = 00669f433934992257bed55861df679804107d7fa491672574a7624949c60049b0533383c88d6896c8de860704c3e6a6aefce83efa57c4d57e9ab253da5d15e1f53ab6dce218b592772ab0bc01fee8e63368e85c0639301456fe2d44cd5396a7f2b22761cd03b80eba7883eede8249a2f5db2183bf00550c5c002f45a5e4fb31
+d = 1b0c9acd3eeb618b4b0de4db402206f0f29adc69d7ad324b6db6601b351f723ac8fe949eeacd34228649bf0126276e5aceb0137d00c30dd858aef2d6b6449de2e89
+Qx = 1811c8884486aaa083ddee1c51cb6e861cb830bd5eaa929f72efadbbd1286566ae7e7ba7fde7e02529900d35ee64591652d28798bfc1bed0d192602a9cf5a7d22e3
+Qy = 06d7fc9dd494816cfd29613d4689af67f7d0a2e6fbad5d4d6e0130189172a1ab601c5ca71deaa8bfcb5a190d49da191672ff6fc048e146cb902acec5eae6d87e60a
+k = 1fdc4f108070af3c66c9ba7b6c1f2603a19ceb4760399df81228cfc7eafde1082b5a0716a3ff82fbe84726f14dd0db3376ca184a78c3c60679bab6cd45f77f9b9ce
+R = 1ec310339ff056faeb341c4499c43782078b04be1725ae9a6cdcb6011c46d1a4eb3d75c358225e4ec142fd1cd344186f5eb597f7ba559ddfa954824365d5b6edaec
+S = 005b679a33fdb7e04834f071cd0ac514c04add9f2614ab9bbd9b407b1420fed3f3e02a108e7e279899e43dcf64ae4083c289a87cd7d2103bdc036a95d36800ac7c6
+
+Msg = 4be81dcfab39a64d6f00c0d7fff94dabdf3473dc49f0e12900df328d6584b854fbaebaf3194c433e9e21743342e2dd056b445c8aa7d30a38504b366a8fa889dc8ecec35b3130070787e7bf0f22fab5bea54a07d3a75368605397ba74dbf2923ef20c37a0d9c64caebcc93157456b57b98d4becb13fecb7cc7f3740a6057af287
+d = 181e1037bbec7ca2f271343e5f6e9125162c8a8a46ae8baa7ca7296602ae9d56c994b3b94d359f2b3b3a01deb7a123f07d9e0c2e729d37cc5abdec0f5281931308a
+Qx = 0cfa5a8a3f15eb8c419095673f1d0bd63b396ff9813c18dfe5aa31f40b50b82481f9ed2edd47ae5ea6a48ea01f7e0ad0000edf7b66f8909ee94f141d5a07efe315c
+Qy = 18af728f7318b96d57f19c1104415c8d5989565465e429bc30cf65ced12a1c5856ac86fca02388bc151cf89959a4f048597a9e728f3034aa39259b59870946187bf
+k = 09078beaba465ba7a8b3624e644ac1e97c654533a58ac755e90bd606e2214f11a48cb51f9007865a0f569d967ea0370801421846a89f3d09eb0a481289270919f14
+R = 19cf91a38cc20b9269e7467857b1fc7eabb8cea915a3135f727d471e5bfcfb66d321fabe283a2cf38d4c5a6ecb6e8cbee1030474373bb87fcdfcc95cf857a8d25d0
+S = 1cf9acd9449c57589c950f287842f9e2487c5610955b2b5035f6aacfd2402f511998a1a942b39c307fc2bcab2c8d0dae94b5547ddccfb1012ca985b3edf42bbba8b
+
+[P-521,SHA-512]
+
+Msg = 9ecd500c60e701404922e58ab20cc002651fdee7cbc9336adda33e4c1088fab1964ecb7904dc6856865d6c8e15041ccf2d5ac302e99d346ff2f686531d25521678d4fd3f76bbf2c893d246cb4d7693792fe18172108146853103a51f824acc621cb7311d2463c3361ea707254f2b052bc22cb8012873dcbb95bf1a5cc53ab89f
+d = 0f749d32704bc533ca82cef0acf103d8f4fba67f08d2678e515ed7db886267ffaf02fab0080dca2359b72f574ccc29a0f218c8655c0cccf9fee6c5e567aa14cb926
+Qx = 061387fd6b95914e885f912edfbb5fb274655027f216c4091ca83e19336740fd81aedfe047f51b42bdf68161121013e0d55b117a14e4303f926c8debb77a7fdaad1
+Qy = 0e7d0c75c38626e895ca21526b9f9fdf84dcecb93f2b233390550d2b1463b7ee3f58df7346435ff0434199583c97c665a97f12f706f2357da4b40288def888e59e6
+k = 03af5ab6caa29a6de86a5bab9aa83c3b16a17ffcd52b5c60c769be3053cdddeac60812d12fecf46cfe1f3db9ac9dcf881fcec3f0aa733d4ecbb83c7593e864c6df1
+R = 04de826ea704ad10bc0f7538af8a3843f284f55c8b946af9235af5af74f2b76e099e4bc72fd79d28a380f8d4b4c919ac290d248c37983ba05aea42e2dd79fdd33e8
+S = 087488c859a96fea266ea13bf6d114c429b163be97a57559086edb64aed4a18594b46fb9efc7fd25d8b2de8f09ca0587f54bd287299f47b2ff124aac566e8ee3b43
+
+Msg = b3c63e5f5a21c4bfe3dbc644354d9a949186d6a9e1dd873828782aa6a0f1df2f64114a430b1c13fe8a2e09099e1ed05ef70de698161039ded73bcb50b312673bb073f8a792ac140a78a8b7f3586dffb1fc8be4f54516d57418ccc9945025ce3acf1eb84f69ceee5e9bd10c18c251dbc481562cd3aae54b54ab618cb1eeda33cf
+d = 1a4d2623a7d59c55f408331ba8d1523b94d6bf8ac83375ceb57a2b395a5bcf977cfc16234d4a97d6f6ee25a99aa5bff15ff535891bcb7ae849a583e01ac49e0e9b6
+Qx = 04d5c8afee038984d2ea96681ec0dccb6b52dfa4ee2e2a77a23c8cf43ef19905a34d6f5d8c5cf0981ed804d89d175b17d1a63522ceb1e785c0f5a1d2f3d15e51352
+Qy = 014368b8e746807b2b68f3615cd78d761a464ddd7918fc8df51d225962fdf1e3dc243e265100ff0ec133359e332e44dd49afd8e5f38fe86133573432d33c02fa0a3
+k = 0bc2c0f37155859303de6fa539a39714e195c37c6ea826e224c8218584ae09cd0d1cc14d94d93f2d83c96e4ef68517fdb3f383da5404e5a426bfc5d424e253c181b
+R = 1a3c4a6386c4fb614fba2cb9e74201e1aaa0001aa931a2a939c92e04b8344535a20f53c6e3c69c75c2e5d2fe3549ed27e6713cb0f4a9a94f6189eb33bff7d453fce
+S = 16a997f81aa0bea2e1469c8c1dab7df02a8b2086ba482c43af04f2174831f2b1761658795adfbdd44190a9b06fe10e578987369f3a2eced147cff89d8c2818f7471
+
+Msg = 6e0f96d56505ffd2d005d5677dbf926345f0ff0a5da456bbcbcfdc2d33c8d878b0bc8511401c73168d161c23a88b04d7a9629a7a6fbcff241071b0d212248fcc2c94fa5c086909adb8f4b9772b4293b4acf5215ea2fc72f8cec57b5a13792d7859b6d40348fc3ba3f5e7062a19075a9edb713ddcd391aefc90f46bbd81e2557b
+d = 14787f95fb1057a2f3867b8407e54abb91740c097dac5024be92d5d65666bb16e4879f3d3904d6eab269cf5e7b632ab3c5f342108d1d4230c30165fba3a1bf1c66f
+Qx = 0c2d540a7557f4530de35bbd94da8a6defbff783f54a65292f8f76341c996cea38795805a1b97174a9147a8644282e0d7040a6f83423ef2a0453248156393a1782e
+Qy = 119f746c5df8cec24e4849ac1870d0d8594c799d2ceb6c3bdf891dfbd2242e7ea24d6aec3166214734acc4cbf4da8f71e2429c5c187b2b3a048527c861f58a9b97f
+k = 186cd803e6e0c9925022e41cb68671adba3ead5548c2b1cd09348ab19612b7af3820fd14da5fe1d7b550ed1a3c8d2f30592cd7745a3c09ee7b5dcfa9ed31bdd0f1f
+R = 10ed3ab6d07a15dc3376494501c27ce5f78c8a2b30cc809d3f9c3bf1aef437e590ef66abae4e49065ead1af5f752ec145acfa98329f17bca9991a199579c41f9229
+S = 08c3457fe1f93d635bb52df9218bf3b49a7a345b8a8a988ac0a254340546752cddf02e6ce47eee58ea398fdc9130e55a4c09f5ae548c715f5bcd539f07a34034d78
+
+Msg = 3f12ab17af3c3680aad22196337cedb0a9dba22387a7c555b46e84176a6f8418004552386ada4deec59fdabb0d25e1c6668a96f100b352f8dabd24b2262bd2a3d0f825602d54150bdc4bcbd5b8e0ca52bc8d2c70ff2af9b03e20730d6bd9ec1d091a3e5c877259bcff4fd2c17a12bfc4b08117ec39fe4762be128d0883a37e9d
+d = 15807c101099c8d1d3f24b212af2c0ce525432d7779262eed0709275de9a1d8a8eeeadf2f909cf08b4720815bc1205a23ad1f825618cb78bde747acad8049ca9742
+Qx = 160d7ea2e128ab3fabd1a3ad5455cb45e2f977c2354a1345d4ae0c7ce4e492fb9ff958eddc2aa61735e5c1971fa6c99beda0f424a20c3ce969380aaa52ef5f5daa8
+Qy = 14e4c83f90d196945fb4fe1e41913488aa53e24c1d2142d35a1eed69fed784c0ef44d71bc21afe0a0065b3b87069217a5abab4355cf8f4ceae5657cd4b9c8008f1f
+k = 096731f8c52e72ffcc095dd2ee4eec3da13c628f570dba169b4a7460ab471149abdede0b63e4f96faf57eab809c7d2f203fd5ab406c7bd79869b7fae9c62f97c794
+R = 1e2bf98d1186d7bd3509f517c220de51c9200981e9b344b9fb0d36f34d969026c80311e7e73bb13789a99e0d59e82ebe0e9595d9747204c5f5550c30d934aa30c05
+S = 12fed45cc874dc3ed3a11dd70f7d5c61451fbea497dd63e226e10364e0718d3722c27c7b4e5027051d54b8f2a57fc58bc070a55b1a5877b0f388d768837ef2e9cec
+
+Msg = a1eed24b3b7c33296c2491d6ee092ec6124f85cf566bb5bc35bffb5c734e34547242e57593e962fb76aee9e800eed2d702cc301499060b76406b347f3d1c86456978950737703c8159001e6778f69c734a56e5ce5938bd0e0de0877d55adeee48b0d8dfa4ac65fd2d3ce3e12878bac5c7014f9284d161b2a3e7d5c88569a45f6
+d = 18692def0b516edcdd362f42669999cf27a65482f9358fcab312c6869e22ac469b82ca9036fe123935b8b9ed064acb347227a6e377fb156ec833dab9f170c2ac697
+Qx = 1ceee0be3293d8c0fc3e38a78df55e85e6b4bbce0b9995251f0ac55234140f82ae0a434b2bb41dc0aa5ecf950d4628f82c7f4f67651b804d55d844a02c1da6606f7
+Qy = 1f775eb6b3c5e43fc754052d1f7fc5b99137afc15d231a0199a702fc065c917e628a54e038cbfebe05c90988b65183b368a2061e5b5c1b025bbf2b748fae00ba297
+k = 161cf5d37953e09e12dc0091dc35d5fb3754c5c874e474d2b4a4f1a90b870dff6d99fb156498516e25b9a6a0763170702bb8507fdba4a6131c7258f6ffc3add81fd
+R = 14dfa43046302b81fd9a34a454dea25ccb594ace8df4f9d98556ca5076bcd44b2a9775dfaca50282b2c8988868e5a31d9eb08e794016996942088d43ad3379eb9a1
+S = 120be63bd97691f6258b5e78817f2dd6bf5a7bf79d01b8b1c3382860c4b00f89894c72f93a69f3119cb74c90b03e9ede27bd298b357b9616a7282d176f3899aaa24
+
+Msg = 9aace26837695e6596007a54e4bccdd5ffb16dc6844140e2eeeb584b15acb2bbffd203c74440b6ee8db676fd200b4186a8c3e957c19e74d4d865ada83f80655323dfa3570907ed3ce853b6e8cc375ed2d758a2f5ad265dd3b47650517a49b3d02df9e0c60c21576378c2b3a08481eec129b2a75608e13e6420127a3a63c8a3f1
+d = 0a63f9cdefbccdd0d5c9630b309027fa139c31e39ca26686d76c22d4093a2a5e5ec4e2308ce43eb8e563187b5bd811cc6b626eace4063047ac0420c3fdcff5bdc04
+Qx = 14cab9759d4487987b8a00afd16d7199585b730fb0bfe63796272dde9135e7cb9e27cec51207c876d9214214b8c76f82e7363f5086902a577e1c50b4fbf35ce9966
+Qy = 1a83f0caa01ca2166e1206292342f47f358009e8b891d3cb817aec290e0cf2f47e7fc637e39dca03949391839684f76b94d34e5abc7bb750cb44486cce525eb0093
+k = 01e51fd877dbbcd2ab138fd215d508879298d10c7fcbdcc918802407088eb6ca0f18976a13f2c0a57867b0298512fc85515b209c4435e9ef30ab01ba649838bc7a0
+R = 11a1323f6132d85482d9b0f73be838d8f9e78647934f2570fededca7c234cc46aa1b97da5ac1b27b714f7a171dc4209cbb0d90e4f793c4c192dc039c31310d6d99b
+S = 0386a5a0fc55d36ca7231a9537fee6b9e51c2255363d9c9e7cb7185669b302660e23133eb21eb56d305d36e69a79f5b6fa25b46ec61b7f699e1e9e927fb0bceca06
+
+Msg = ac2175940545d4fbab6e2e651c6830aba562e0c11c919e797c43eff9f187a68a9e5a128e3e2a330b955a3f4577d3f826529ad1b03d7b60f7ad678f005053b41dc0f8d267f3685c6abe1a0e9a733c44b2f3ca48b90806f935141c842e3a6c06a58f5343d75e3585971a734f4ae1074ce5b54f74bd9342f4bbca738d260393f43e
+d = 024f7d67dfc0d43a26cc7c19cb511d30a097a1e27e5efe29e9e76e43849af170fd9ad57d5b22b1c8840b59ebf562371871e12d2c1baefc1abaedc872ed5d2666ad6
+Qx = 09da1536154b46e3169265ccba2b4da9b4b06a7462a067c6909f6c0dd8e19a7bc2ac1a47763ec4be06c1bec57d28c55ee936cb19588cc1398fe4ea3bd07e6676b7f
+Qy = 14150cdf25da0925926422e1fd4dcfcffb05bdf8682c54d67a9bd438d21de5af43a15d979b320a847683b6d12ac1383a7183095e9da491c3b4a7c28874625e70f87
+k = 1c1308f31716d85294b3b5f1dc87d616093b7654907f55289499b419f38ceeb906d2c9fe4cc3d80c5a38c53f9739311b0b198111fede72ebde3b0d2bc4c2ef090d2
+R = 00dbf787ce07c453c6c6a67b0bf6850c8d6ca693a3e9818d7453487844c9048a7a2e48ff982b64eb9712461b26b5127c4dc57f9a6ad1e15d8cd56d4fd6da7186429
+S = 0c6f1c7774caf198fc189beb7e21ca92ceccc3f9875f0e2d07dc1d15bcc8f210b6dd376bf65bb6a454bf563d7f563c1041d62d6078828a57538b25ba54723170665
+
+Msg = 6266f09710e2434cb3da3b15396556765db2ddcd221dce257eab7399c7c490135925112932716af1434053b8b9fe340563e57a0b9776f9ac92cbb5fba18b05c0a2fafbed7240b3f93cd1780c980ff5fe92610e36c0177cabe82367c84cee9020cf26c1d74ae3eb9b9b512cb8b3cb3d81b17cf20dc76591b2b394ef1c62ac12ee
+d = 0349471460c205d836aa37dcd6c7322809e4e8ef81501e5da87284b267d843897746b33016f50a7b702964910361ed51d0afd9d8559a47f0b7c25b2bc952ce8ed9e
+Qx = 00bbd4e8a016b0c254e754f68f0f4ed081320d529ecdc7899cfb5a67dd04bc85b3aa6891a3ed2c9861ae76c3847d81780c23ad84153ea2042d7fd5d517a26ff3ce4
+Qy = 0645953afc3c1b3b74fdf503e7d3f982d7ee17611d60f8eb42a4bddbec2b67db1f09b54440c30b44e8071d404658285cb571462001218fc8c5e5b98b9fae28272e6
+k = 00eb2bd8bb56b9d2e97c51247baf734cc655c39e0bfda35375f0ac2fe82fad699bf1989577e24afb33c3868f91111e24fefe7dec802f3323ac013bec6c048fe5568
+R = 14bf63bdbc014aa352544bd1e83ede484807ed760619fa6bc38c4f8640840195e1f2f149b29903ca4b6934404fb1f7de5e39b1ea04dba42819c75dbef6a93ebe269
+S = 05d1bcf2295240ce4415042306abd494b4bda7cf36f2ee2931518d2454faa01c606be120b057062f2f3a174cb09c14f57ab6ef41cb3802140da22074d0e46f908d4
+
+Msg = 3de9e617a6868dca1a1432d503f923535da3f9b34426b2a4822174399c73b1c1ee67311410a58c17202ac767844b2024d8aa21a205707d93865693ac25a24fc87034fa3a7a7e27c3344cb03b87602c15180a5fe6a9dd90cd11af4a0f150207bf2d83f55b12c088adae99aa8cfa659311b3a25beb99056643760d6a282126b9b2
+d = 07788d34758b20efc330c67483be3999d1d1a16fd0da81ed28895ebb35ee21093d37ea1ac808946c275c44454a216195eb3eb3aea1b53a329eca4eb82dd48c784f5
+Qx = 0157d80bd426f6c3cee903c24b73faa02e758607c3e102d6e643b7269c299684fdaba1acddb83ee686a60acca53cddb2fe976149205c8b8ab6ad1458bc00993cc43
+Qy = 16e33cbed05721b284dacc8c8fbe2d118c347fc2e2670e691d5d53daf6ef2dfec464a5fbf46f8efce81ac226915e11d43c11c8229fca2327815e1f8da5fe95021fc
+k = 0a73477264a9cc69d359464abb1ac098a18c0fb3ea35e4f2e6e1b060dab05bef1255d9f9c9b9fbb89712e5afe13745ae6fd5917a9aedb0f2860d03a0d8f113ea10c
+R = 07e315d8d958b8ce27eaf4f3782294341d2a46fb1457a60eb9fe93a9ae86f3764716c4f5f124bd6b114781ed59c3f24e18aa35c903211b2f2039d85862932987d68
+S = 1bcc1d211ebc120a97d465b603a1bb1e470109e0a55d2f1b5c597803931bd6d7718f010d7d289b31533e9fcef3d141974e5955bc7f0ee342b9cad05e29a3dded30e
+
+Msg = aa48851af7ef17abe233163b7185130f4646203c205e22bcc2a5a3697bcab998c73a9ffe1d3ea0b7978ce7df937a72586eb5ca60b0d939a7d1c115c820171c89c8116b7e2c7b98cf0f14e4c4df3cb2f319ad3ab0ea25ff14526ddc037469f000bf82100acd4cdf94feb4eba4ea1726f0569336604a473aee67d71afebb569209
+d = 1f98696772221e6cccd5569ed8aed3c435ee86a04689c7a64d20c30f6fe1c59cc10c6d2910261d30c3b96117a669e19cfe5b696b68feeacf61f6a3dea55e6e5837a
+Qx = 07002872c200e16d57e8e53f7bce6e9a7832c387f6f9c29c6b75526262c57bc2b56d63e9558c5761c1d62708357f586d3aab41c6a7ca3bf6c32d9c3ca40f9a2796a
+Qy = 1fe3e52472ef224fb38d5a0a14875b52c2f50b82b99eea98d826c77e6a9ccf798de5ffa92a0d65965f740c702a3027be66b9c844f1b2e96c134eb3fdf3edddcf11c
+k = 1a277cf0414c6adb621d1cc0311ec908401ce040c6687ed45a0cdf2910c42c9f1954a4572d8e659733d5e26cbd35e3260be40017b2f5d38ec42315f5c0b056c596d
+R = 0d732ba8b3e9c9e0a495249e152e5bee69d94e9ff012d001b140d4b5d082aa9df77e10b65f115a594a50114722db42fa5fbe457c5bd05e7ac7ee510aa68fe7b1e7f
+S = 134ac5e1ee339727df80c35ff5b2891596dd14d6cfd137bafd50ab98e2c1ab4008a0bd03552618d217912a9ec502a902f2353e757c3b5776309f7f2cfebf913e9cd
+
+Msg = b0d5d52259af364eb2d1a5027e5f7d0afe4b999cc5dd2268cfe76f51d2f17b541bdd7867e23a1bb897705153d9432a24012108979c6a2c9e2567c9531d012f9e4be764419491a52eae2e127430b0ab58cb8e216515a821b3db206447c235bf44ee304201b483b2a88844abaa18bca0147dfff7e502397dd62e15524f67eb2df2
+d = 13c3852a6bc8825b45fd7da1754078913d77f4e586216a6eb08b6f03adce7464f5dbc2bea0eb7b12d103870ef045f53d67e3600d7eba07aac5db03f71b64db1cceb
+Qx = 0c97a4ebcbbe701c9f7be127e87079edf479b76d3c14bfbee693e1638e5bff8d4705ac0c14597529dbe13356ca85eb03a418edfe144ce6cbf3533016d4efc29dbd4
+Qy = 11c75b7a8894ef64109ac2dea972e7fd5f79b75dab1bf9441a5b8b86f1dc1324426fa6cf4e7b973b44e3d0576c52e5c9edf8ce2fc18cb3c28742d44419f044667f8
+k = 1e25b86db041f21c2503d547e2b1b655f0b99d5b6c0e1cf2bdbd8a8c6a053f5d79d78c55b4ef75bff764a74edc920b35536e3c470b6f6b8fd53898f3bbc467539ef
+R = 1dce45ea592b34d016497882c48dc0c7afb1c8e0f81a051800d7ab8da9d237efd892207bc9401f1d30650f66af8d5349fc5b19727756270722d5a8adb0a49b72d0a
+S = 0b79ffcdc33e028b1ab894cb751ec792a69e3011b201a76f3b878655bc31efd1c0bf3b98aea2b14f262c19d142e008b98e890ebbf464d3b025764dd2f73c4251b1a
+
+Msg = 9599788344976779383a7a0812a096943a1f771ee484d586af1a06207478e4c0be9c200d42460fe837e24b266c8852d80d3c53cc52ffb1913fc3261145fc6da575611efd16c026059a2e64f802517ffd1b6b34de10ad2909c65c2155e8d939b8115400c1d793d23955b15f5d1c13c962ff92b4a815cee0e10f8e14e1f6e6cd38
+d = 1654eaa1f6eec7159ee2d36fb24d15d6d33a128f36c52e2437f7d1b5a44ea4fa965c0a26d0066f92c8b82bd136491e929686c8bde61b7c704daab54ed1e1bdf6b77
+Qx = 1f269692c47a55242bb08731ff920f4915bfcecf4d4431a8b487c90d08565272c52ca90c47397f7604bc643982e34d05178e979c2cff7ea1b9eaec18d69ca7382de
+Qy = 0750bdd866fba3e92c29599c002ac6f9e2bf39af8521b7b133f70510e9918a94d3c279edec97ab75ecda95e3dd7861af84c543371c055dc74eeeff7061726818327
+k = 1b7519becd00d750459d63a72f13318b6ac61b8c8e7077cf9415c9b4b924f35514c9c28a0fae43d06e31c670a873716156aa7bc744577d62476e038b116576a9e53
+R = 183bddb46c249e868ef231a1ebd85d0773bf8105a092ab7d884d677a1e9b7d6014d6358c09538a99d9dca8f36f163ac1827df420c3f9360cc66900a9737a7f756f3
+S = 0d05ee3e64bac4e56d9d8bd511c8a43941e953cba4e5d83c0553acb87091ff54f3aad4d69d9f15e520a2551cc14f2c86bb45513fef0295e381a7635486bd3917b50
+
+Msg = fdde51acfd04eb0ad892ce9d6c0f90eb91ce765cbe3ce9d3f2defe8f691324d26b968b8b90e77706b068585f2a3ee7bf3e910528f7403c5af745a6f9d7ba6c53abd885c3b1be583415b128f4d3f224daf8563476bd9aa61e9c8518c144335f8f879c03696bddbe3ac37a8fbede29861611feaa87e325e2f60278b4893ed57fb0
+d = 1cba5d561bf18656991eba9a1dde8bde547885ea1f0abe7f2837e569ca52f53df5e64e4a547c4f26458b5d9626ed6d702e5ab1dd585cf36a0c84f768fac946cfd4c
+Qx = 12857c2244fa04db3b73db4847927db63cce2fa6cb22724466d3e20bc950a9250a15eafd99f236a801e5271e8f90d9e8a97f37c12f7da65bce8a2c93bcd25526205
+Qy = 0f394e37c17d5b8e35b488fa05a607dbc74264965043a1fb60e92edc212296ae72d7d6fe2e3457e67be853664e1da64f57e44bd259076b3bb2b06a2c604fea1be9d
+k = 0e790238796fee7b5885dc0784c7041a4cc7ca4ba757d9f7906ad1fcbab5667e3734bc2309a48047442535ff89144b518f730ff55c0c67eeb4c880c2dfd2fb60d69
+R = 1d7ce382295a2a109064ea03f0ad8761dd60eefb9c207a20e3c5551e82ac6d2ee5922b3e9655a65ba6c359dcbf8fa843fbe87239a5c3e3eaecec0407d2fcdb687c2
+S = 161963a6237b8955a8a756d8df5dbd303140bb90143b1da5f07b32f9cb64733dc6316080924733f1e2c81ade9d0be71b5b95b55666026a035a93ab3004d0bc0b19f
+
+Msg = beb34c997f905c77451ac392f7957a0ab8b23325bd5c63ca31c109ac8f655a1e3094240cb8a99284f8091de2ab9a7db2504d16251980b86be89ec3a3f41162698bab51848880633e0b71a38f8896335853d8e836a2454ecab2acdcc052c8f659be1d703b13ae1b090334ac50ab0137ddb5e8b924c0e3d2e5789daaef2fdd4a1e
+d = 0972e7ff25adf8a032535e5b19463cfe306b90803bf27fabc6046ae0807d2312fbab85d1da61b80b2d5d48f4e5886f27fca050b84563aee1926ae6b2564cd756d63
+Qx = 1d7f1e9e610619daa9d2efa563610a371677fe8b58048fdc55a98a49970f6afa6649c516f9c72085ca3722aa595f45f2803402b01c832d28aac63d9941f1a25dfea
+Qy = 1571facce3fcfe733a8eef4e8305dfe99103a370f82b3f8d75085414f2592ad44969a2ef8196c8b9809f0eca2f7ddc71c47879e3f37a40b9fecf97992b97af29721
+k = 0517f6e4002479dc89e8cbb55b7c426d128776ca82cf81be8c1da9557178783f40e3d047db7e77867f1af030a51de470ee3128c22e9c2d642d71e4904ab5a76edfa
+R = 1c3262a3a3fb74fa5124b71a6c7f7b7e6d56738eabaf7666b372b299b0c99ee8a16be3df88dd955de093fc8c049f76ee83a4138cee41e5fe94755d27a52ee44032f
+S = 072fd88bb1684c4ca9531748dfce4c161037fcd6ae5c2803b7117fb60d3db5df7df380591aaf3073a3031306b76f062dcc547ded23f6690293c34a710e7e9a226c3
+
+Msg = 543c374af90c34f50ee195006d5f9d8dd986d09ad182fcbefa085567275eee1e742bfe0af3d058675adeb5b9f87f248b00a9fbd2aa779129123a5b983f2f26fc3caf2ea34277550c22fe8c814c739b46972d50232993cddd63a3c99e20f5c5067d9b57e2d5db94317a5a16b5c12b5c4cafbc79cbc2f9940f074bbc7d0dc71e90
+d = 1f0ec8da29295394f2f072672db014861be33bfd9f91349dad5566ff396bea055e53b1d61c8c4e5c9f6e129ed75a49f91cce1d5530ad4e78c2b793a63195eb9f0da
+Qx = 09ec1a3761fe3958073b9647f34202c5e8ca2428d056facc4f3fedc7077fa87f1d1eb30cc74f6e3ff3d3f82df2641cea1eb3ff1529e8a3866ae2055aacec0bf68c4
+Qy = 0bed0261b91f664c3ff53e337d8321cb988c3edc03b46754680097e5a8585245d80d0b7045c75a9c5be7f599d3b5eea08d828acb6294ae515a3df57a37f903ef62e
+k = 0ac3b6d61ebda99e23301fa198d686a13c0832af594b289c9a55669ce6d62011384769013748b68465527a597ed6858a06a99d50493562b3a7dbcee975ad34657d8
+R = 0cef3f4babe6f9875e5db28c27d6a197d607c3641a90f10c2cc2cb302ba658aa151dc76c507488b99f4b3c8bb404fb5c852f959273f412cbdd5e713c5e3f0e67f94
+S = 0097ed9e005416fc944e26bcc3661a09b35c128fcccdc2742739c8a301a338dd77d9d13571612a3b9524a6164b09fe73643bbc31447ee31ef44a490843e4e7db23f
+
+
+[K-233,SHA-224]
+
+Msg = f23f784fe136c9fc0d169503d361e9c6148b0f1fbdcae0a97fae1af7033ddef25cb7489c9963cfcb009a8cbfe44a8510a64a073eb1deae4c324ceb9302008c92c69b2dafcc9077fd3cc3c7c119edc3ced36d176ceaa55ac036bf7f07f6fa215e8bb8196e59a5e1c9af4f98b90ab4970885bd7015fa26a09e03c7cf6b4b23d929
+d = 04c1d414696cc3657dd9df73ace56eda2636769ce7082e064c260be45a5
+Qx = 1f228c0a75b057eb07fe7ce8223ed4163148c1fdab61e0f787271f836a9
+Qy = 0cdfa5655d96ffd5ffb6027bfaa04da7b5d8fbdbb6202c8bb79f056ce43
+k = 058f8511089fcd59324469f6736b92693afe26bd4719e198f1f2287dc5f
+R = 016bafefb4933ffd00bd1db6d6c4fac8a06375603adc0aa2a5664083ff4
+S = 03bcb84b8f1990cfc7b88f2b8cc817105cd8e150808e7c87b310cdc47e3
+
+Msg = 400bcb297552bb37f2f8135a9314a35f5126788bb6fa4dc74152731ff64c5dab4b902103d85443dec20e16b1d6629930cdc2bd183d4099f0e96295a63c2fe266f5e9d050c401a8681b4a438efe53cbd8f2f43e2a31e9f88926a9c82917d873f6e8cd5ff5eb8c1ca36126b0bfc8c2b0e85a7c9e7a45f1875ca9c82019ebedb729
+d = 027cb1d84865a16992476c9e353283d5d6a40c349a8e9179d1b1f403531
+Qx = 1191227d064176f4ab020faea61330df5eb59163ecb4ea59c23e6f1f6c8
+Qy = 12dbfbf85b3624b9f56446f840602f9b839bab1368295b3ae919cb07c07
+k = 01a41af270269be052a62a9879638e3432a1479b05776ce61f45c0c361b
+R = 041a5f1d28b70bfa2925b9428ab8bac9fa174d88ae27d754824c7d16ead
+S = 044d359065672b3d3dfe8389fbc6fc751ca6a46820626c466174fb9b922
+
+Msg = 5f74d4b35c49fa454c97c05fdb6b9f6822cf1a2295f15bd766dbcb413d77c910bd8f4147e8f317fac2300fa21cb80134d1b6f8ae8e50518c1f648a28506e419f5a6e8f05abffdb3dd2587606c7e9c223ecff4f46b121216730ea13202b59128a7616bb2fd23a7e4a5aa08641cc07b669641313febfc88d64d99447353dae3f06
+d = 031b443f46c4b5224237fac1022ee1570173f664aba0c84dbaa4246bdc1
+Qx = 05f57b0e5f2e175006f4058cbb4ca9a0cac912c551ef1b94e97498fcc5a
+Qy = 0f3a554d077b751478f8a2b7c2a9cf15effed958e0ac1a9e3db1e023c5f
+k = 07ff6ef3026c5a960e632beeb7313b3bca0baec76cea1fd9b82cedc3245
+R = 0099741698549c32a4e86aab6194527cea703ff869849c538a938585a83
+S = 02ad706c6f5dcff512498d84f1877eb997dfbe9b3d13b339917632d3cb1
+
+Msg = 8f92096876d9f81bcd992369d42d0b5877ac969004d17c8627c58d8b8b7bbf7a37e8cb6afa962b9b043bbbaa5bef4a5ee38d8bd31cb5866b828265a2f4102a616f87009cd346fcb8af5519fb577c60d8792472232f33dc615655e53d2b715b15a2697b492f108b7906e1e3597c6911f8cc30c7121ae338a6b747ec368f8e4a36
+d = 048f6ca29f35f253a4962734357c995920967b9eeff1ba5fd2080bfede5
+Qx = 12b7ca7c21292f8795b2fbfd63a28c5a4ec8c850d6240f973c903bc8170
+Qy = 1be9855e5c5a5064c27d1862010b2fd0d7be5a0180c861a288ceac89d6d
+k = 07dcb9725323fd7668991ce9a907b7129d53fae9016e253c53d057d195d
+R = 0498c4fca6ed7c2998347b464d3e562a74b0e4f3a6c1dc453aaa61bb710
+S = 03a77a13f011404d5c5341dcd2ca44dc2b08f21f09f524045c281fb221e
+
+Msg = 3d275dbde44494c45fc15fe89e2ae32aa26426a17e923e895c7941a5582fb95df4d49873ab1bde358017f336b911b886b626b744806ab8113418473c441f1964159ded1b12122d53ac56573167588e4b55f36b8bca8c67823883a51fb6e7f204d1c6b07ea49b577bfab9ca6b8d51f72268b022e3a4db6f9d265ee8382f9b7b66
+d = 019b940eabbe682f961d9f3d90432e347fef3910e641656825d775705b1
+Qx = 1efcc9f4576047c43eab1c13e0547b1c5ec1cd2afd2345fda72b5e1b50f
+Qy = 0c7b5968af47e58f4ec15c0cd82ccd0b9f5bfde06c7f86fe5cd0105d693
+k = 03f783a94d1de73e4593f5d6d02238cfa0486e3ddf2bc0b95a528038e3c
+R = 013c467531f3f6508534ad072edb210e4182ce5a798d8a46674e92a0b4d
+S = 0685982aa8e2f3e46ecc03e00e7323f3b891da437235cfe9800139ee8d7
+
+Msg = d2fa68e1f7dad02916b12fa38f1849d6d409dbad0344438520b4dd9b77d62d39ac9ae3cdeab03ccbcfd4de703c6e798873671731c108f322b9f2a68145e3e210c9b15b879798e5c53c5022742e9819b99edabb2f44d89ae221f7a99dc84421a6905695ff91928db608f861745f17584d56e34b75c47281435b1b0b34e490692d
+d = 07a884b22e29fa9fe945e9ba13c0df8d786dc87cef0f77f069e182dd56c
+Qx = 11e831647d0ffd53d75e44abceda753ab470b3cc93b457590617d925a19
+Qy = 03db5bd0aecd6504d904bcf9dcce131abd239aeadb9a64a9811eac823cc
+k = 00241b763c6245b83afe61762b161c41467ef35b7f27a9c1066f02babd3
+R = 0514adca3481ac5f99287e6e966a5c223296b07a9456eb582ec5568688c
+S = 07ff6a2f7cb1d2594a11d8d0adb6fe50b4e740f025e7b4333ee26163d92
+
+Msg = 3830f75cf9df4eb2998c7c1b5fe11c1476bcf849c3a8fa7d3d0b5bc2292e5d07465ab8cc9381c575d909e509c5dac49c78817c04e4bef18bd51bb09aa5897f21634633a5ce6d20bb4638cb6c3927351eaec7b62cf4a33956916045c392f325adafb10a88a5f86d7e41dd77908fa7284210071c22aa40ef40da6339c02da05392
+d = 05da61f881d5a0dc085bb93764f584352882923cd237d878220ec624c1a
+Qx = 18d740441eff1f785a14d04da4ba69540cbb469780ffd36e1dfae4f1de2
+Qy = 18072ab30e999ae26b872ef46a9a0604296d02c08fba9477d9e03f0f75d
+k = 000f95c5678fd08dda790cc60bfa578118f8687228a2ef5f31e71a6884b
+R = 074a6599b8cab75e0cf752e3f41288fbc673d52074950edb14f76524949
+S = 03523804351e3224e816cd4fb7191f332585f68053ddb32a85cc0fadc03
+
+Msg = 65b9fe15e6c35d453caa6bad39ee78a720a04b60d8a0a0f049186d2f777e48ae2d657e174df53edb7beb9f7d8f21904ed674add0cda5b62a7308de76c324a144021e8c6d387daaba4ce48bf7dfe9c8aeee2c64e434ece1fa5ddcafcf3e5d0013a1eeec1742a00d384cc2ec0d7eda83bb4dccfb0e57045ebfc27a4f404d03da37
+d = 03fe9f04647f6d82b13ec1ae5a8c2e49bc66b05649ad778eb16149ad83a
+Qx = 158eecc6b8918e7813ef990217c603b28ed1774c740382a8af5c9af6133
+Qy = 1bbffeccd41107c7e6f83e24c822d634a7ec064fae125dc8a3ecc4fc9b3
+k = 07731edfb3ef523a165a1b5817ab2805a5cf88043c98ea2393898e19551
+R = 01fa44fa18ebafee6f419fdb9de0e8365520617558b57e9ee89f2c8fc88
+S = 053f1b2da4cabad04fea1111d525f341417587823fce71e5bfd2353c2f1
+
+Msg = d26521fd41eb5d46ece6836e188bf9cb1b461d011c41e002a935d256654d01725378e845920ec4a7fd3f379df54772493df50d312c7c6aa4e909e7b83f2442c3a5e85c37d68aa015098ecfb0a5e077370f4576f4bc63bf37e1dee06d780a3b6949af5e21c2a0960fcd20821ef5f17bebf5fd5b3bdda260842cbbfad45667287a
+d = 05ebce648ace4cd555413de6a456fc487d14bf4b0b9a72311ef480d2f26
+Qx = 020b46ecbdc36b4dc01111932090ba185eab2cdc4fa89775f2a6177c592
+Qy = 104cac1c800103c79642321a216bcfae497b037b29888cf9f70c507114e
+k = 027733120626e564b06ba71c4946c9c8bfae43f88511ec6352d2a52f407
+R = 0592de5184510e6ecb7be8a011f862470b918354a1ad82458cf716137fe
+S = 010a9c5fb6e4b70571a35c56744b57baf0108728bea2bf639af1960d1dc
+
+Msg = b778c021b1a92c41dbd09963da07018075d73e54d62df5c2b7bf8abe137151650d1c1c6abce7eebd8f32e8c3e6d1433773f257bb3ba4a4fb6a02c0db1e47d03c27d3a90898ebd1927c21df24c4c5443ca5b81f8ef2cc0f5e8b3d08f472bf07085df737adaedec63d99acd77b87ba98225f198b791124ac2d9b191cb9251b4b00
+d = 056653c2f85593f789a926ba49fa3da9d7f946d8f1020508c5a527ce813
+Qx = 10d65f6f5415dd86a83bb10118abfc1b1670a1664eb6dae99fb68b85019
+Qy = 12c1e673e575086ec1e76b90d59c2cbd2727f726f88298552b678ba7e60
+k = 021e26c098c9f9da9c782857fe640ff6abb21caf20a093f2277845bd10d
+R = 01d67cbc8209494dca1a74cee5d9894f98f03728214f7bbdac29b0c0e78
+S = 02215f758fcf0d8dd603e79658a8061ab45bfe6d854e52ea7074fd5654e
+
+Msg = ec14e07f615960015a489ef999e308b42a4c571473b9bd64b433dabd9a1b1ad02e33eee9100064405175928a94543a80f440040afa2965b4e5f95f768e7fab6d3c0a5f5e1bf1df7822f78384e80f2955ea85f044ac60537d895747979f935bb0cd3673193c4a32dd7803e48d7daf70a71bc2aa97236615b6411e28fc9a652145
+d = 049a91d320783cc70a5952c32036cfc75d41f1aa84127db2dc759fb291c
+Qx = 190528df8fc3ae4db6e12930f176ec9c833d1668ac5808f1046366445a4
+Qy = 1f647d55ce80b18a9add47fd1a8e4aa725297d9da03246f5c1ce503dd56
+k = 01eb80e2596d6c01431e7a4fd9e22903ea85547a31d675ff157a789a137
+R = 04523776d88199ebac2f96f9faa434bd81bde770ad4458ef126fde9198a
+S = 054665f31f92f8897482d34fcb63141a7539577037c84496167e9d3389f
+
+Msg = 89c645339ad0eb850e4e2fe583cee175b35feb02ed7541d7e9aace24cdd3939584f73ad39526de6399c86b36de77a018e2c70b532bd0f032f9137d10480acc30c49f9baaa86f9df0033b77e98b485bf7a69cb5c281e527d3ccd1fce2415f0dda4a268ce68a0a34b16afda54ed922cd6810ac8dc766df2a3a6c5e55972e9786fc
+d = 016a20016602fc7088a60469843e1d29ad67e3c3cb9500b1e2a00d4050a
+Qx = 04f157541dc3a8bc8a2ad4dfb3933039b67e331b7353a2fa9ede322f4ad
+Qy = 1348a7b8c9495bcbecd556870715faf3d543cb8f2368805473bca17b82e
+k = 01df1ee39217d7f0d838e8b2d30a1159d8003b06e50a00d637edf08d6d1
+R = 045d16826bbc425637e7a05b826bc907f7453c70141d1bbd2cda63dd490
+S = 01ae1703cf179dfd1d5407ba2b7324cc7cac15235ee9c3756177444e122
+
+Msg = ace14c4b101d2d8453c2bc22b756af016b5de537df9c3e639d208ad04ae0bf6232dc90b90c33228dc85de956db771ffde05fb4d0b15e4f218ed2771d703ae5bf981252a5bcd60c16f14483131a481cbe04dc0adb1fb8aa32cb48bb5008e8a8e5c7b7465be2fd7afbc811cf5ea6293b1a464669b49f55f57b93a8707e6042fda6
+d = 00ba922149bada2551b7be1c3df076f3f97ce93c13c50c285fef3f42363
+Qx = 12daff2cfab994b9d1d1ba73bd2f8e7883b2d92f760b0d16351ec125fd4
+Qy = 115666f7c65b95ec2d713c5ab1a3eeaaf0f931b1859733416c3c778aa2a
+k = 07fc7c9503fabba0972e0e8892ec6331e0812c6452d211c5561fde79048
+R = 06477ec9d8d8d45418b9efe7ae47c0863ff94c43d8f392c079b870a7cf4
+S = 06b5a5d020b3d980b9d7880130802435ddb4e7362e36a70d193f18a7fe6
+
+Msg = cec2ba0d1772c87e87d5bbbd67220692bea4301aa1a66e8dbdd7e651d45c26dc2a0d45cfc32c34d76ae3e1c61db7b0fe1863457b93937d929e6ece7462ebd16adfd708353d6f7c27aafe06593c76da7149b0cc574a4290b0d8fe219f3eada7082aca38dba3f78ed0d5942d095fa5556fc8bcef331ff0a6d5d1f4e6c51d4ff5af
+d = 02d635e12a58cc6dea44e71e87c37f91e8d08659f0b7955d24f65ab55ba
+Qx = 1dd33d8224ffe63a32f2de5d4fcb0e5f1fca7ca2ade5b35ffbe75cdc658
+Qy = 0bfbe9dfe13f99258c787af82631ce2133dc73207c579b29869c7463943
+k = 04ef333049c575d6688aa04f87a6162185e4a57bb752a7f903e3aff86ff
+R = 01ade04af08ea1c1877779fbf6335156b1a1437f3e449f07458d700c67e
+S = 010fa82467d39e5ad51cda8fcedc72ee6a78dccd0c90544814e53ba9cb4
+
+Msg = ffa13cd0f51ae2643d5d4edecb493ddd653e9faddcffc370e7e958abf726a5d67a2ab36cef42ea8ebe22a6f01b9c31f6ffad01e6894487d979acb5e618f765ac0ec3550ac5dbbcede8f9fdbe52fbaba5c087ff382b6d7a09b2b5084227d324d98ff98793040884799b96d2ca593201f4414f18c43b51c53c5e5059e0641aca02
+d = 0073883e5064e06814fc4de32e15f7a6cf825d2daf6eb1df8c83e25d80a
+Qx = 00d3c79d627ee0d2d88f2de2dd082112c20dbc5ed66089454f7b8fd9f81
+Qy = 1a2580e779753bcb023acba1b0852492b989c767f664c7047de8e6689fb
+k = 020231e05166271f47a91dd883c580ee313e9a07195ae511f0ee62173ec
+R = 0303eb4a0df97577c4cff531b3f54aa282e76669c0c5ebf4c9779c9bb82
+S = 0692432a7dfde09db7743f08130b3d3327dd98cbdc323627603518f70d7
+
+[K-233,SHA-256]
+
+Msg = c73e3dbac9513d0361dabe94071faf03a11cba18c06d131a172d5f0125b01a5eeb6055bf72c7106fe3f4be3bd2b1771cbe7f85366dccfbc3bac20538510c3f51179cc540ddafb2f3b05a0d276899674ab1d7d8fb4f6838f04e4f9e26b8c6af31540f63f4953c85840af4c57dfa78c704f637dfc8dd750fe45e2c1e149986d127
+d = 01532271bfae8d4dfe60f69b88d3006d58e28aacfa701861cde8d624db6
+Qx = 041c1ca965338976b4c45c28b1cb64836b3b4d3e7ba2b1323ea26fbcca2
+Qy = 1a177d042fba7903007db122eabc459e37c2c7fe82e42752b267fafe4b0
+k = 06a54894825644901baf2ec3681ce5aaf93a18757d93ec9cbce7ccd9d65
+R = 03edb77fc7686b520493604db18fc69edb4cad8195a958e27ef289c4bac
+S = 004337ecfac57abb9271909aa43ff4e32851df7818dcd87216d051189c0
+
+Msg = d00dcd0f3212a3167403abed91c20e76f5e7a7678a4fd970f944d11e6a8cd149d0aa6fd3164c5a74c0f55193a4fa3d8ba6f99cabed10544625a7bd92b3e0b46edbd4a269bbc10518c5268c3910a2aea567ccd32d4c7a0cbef09ea42c20b636d1f711d220e23dacdb9d1146e0494401349749e5ed88e38295232a7effbae3aed6
+d = 0550406c0db882c6aee6cf3b6baf377375208c3e90cc44a067cee43efcf
+Qx = 073348eaa8f2885fca3baf31830a2b28bfe983e3046418561f62ac5d247
+Qy = 0033de5aee6d0bd4de286f1de1e80bf72e5e17083032bd4dc24577b6d2d
+k = 05c0e7ad0f9bbd522c862326a5734a766423fff7efbe57c51c315fa574c
+R = 02103f1a0200883850b6476c7d7e7d2b3e2f60923d028ee6f8227b1ec48
+S = 007cbbc3c6295ceafb3d9cf8411f85a045b11ef8472c5ed45346d26192a
+
+Msg = 3d36221f87157ca4db84884b8666660c4e2b6af330480c516cded9f3bfe132543626a39bb6aed1964eb5c33ea0b95b9841665417679fceb95d199d55accfce35dd3f2283c1a7ced57d0c4b9ebe3da6e1ff2f979b6440db27caf9f6a4bbfa47e20d29ae304f4d0551fce9cc4097eb2fbedb9b24680bb17d207bdccdbe799d5b0d
+d = 0257dc63752920b6854d6c2d1cca68589a38418c3d036e73760a12214ab
+Qx = 11a42e9f66ecf030d0446cfb751136347d4df0ee4e031058ebdcc04df80
+Qy = 0fb7161fac8cc5ad7bc4477a39350e419776f76f184e28abce886ae9cc5
+k = 00391d36c4044896ddcd68604d5f677d1df298f46abc00eb12f1165e8a1
+R = 04e19bdc6755a603085b66355256bce98d5fdd49b4f06b628e3e185574a
+S = 07697b29ce5546de969c9c4bbb5ea65f712d6cda3410f3dbfa0cd5b1a8c
+
+Msg = 033d82a42d0eddf58fbe3e91ddff7190e3f9fc2b1e2eede977d2c0473b358b5fce1f981ca6f88fd61ce2f79e453e3a2b77d1baab2b970ed28d5dcff58873a620e195085e61c4b8480d829525a1a944e8a4b63352f0291f0311f1f98ceb262804beec1c74947618f8e3b067866255878c2502966cefcdda4f5fa2b13d92ce7840
+d = 029025352297a7be850f8852411c09259b83219135e0e8949c1bd5b94c1
+Qx = 184345e37f07077cc8df5947c1b1fcd8404b3c31586d6ebd91b240cf42b
+Qy = 19dbc9091a5d282fd6e62c34676a06a425e098567b990c47e61ef14d77e
+k = 02b2663a449ead3f8cce2459e04cf84333376624d994fd9312401ae57f1
+R = 03af223fd3a6b6b240e59dca83ce2477a577494438ddee3fd09632ea67f
+S = 0606576d89f2094572f0bbcb58a15d9a4bf10ae3667d4e35cdd8da32102
+
+Msg = 671a7c81b64b2919722d7b258bdbd90165bb757b53106e0af03d0eef27452942f40cf52bc95cc7f6567df2613cce795f8bcfc723b2735efc35375c001d37c58480d89343697146b524835df3dbd333f7c06c98e36d3c4592ecd1f34ab57c341bb0f4c785f5b8372775f74b4bce60763fad1788e77ea158d735a64861320b36c6
+d = 02dc82d0e69e498528925c0e62a13fda9af8cefd047c10c3ffc2e41da3e
+Qx = 0e5463926235ce53a85b489c3c278320ed986003962a5fc7ad4cbab0d9f
+Qy = 1453e6edde95670a4653186ebd8246c28a94dd84f5a669bd3293176f1f0
+k = 034a8dfbbdc98bb1d9b175600bffd866306dffadcc4bbb6f24e7f918da5
+R = 03cf1407445cf1a619a280e139242056c23c58979f0b3f0aa7e1fc074e2
+S = 02e55f27593f2c76fafccb71493f14daf50073b35cc85f002528cc6d691
+
+Msg = 0ef677f4799298f4aab73b7393598041f56e902ced1726af49657b6601a06186212e3ee8cd4bd33b760dfa2ea3c38884f94358d51dd479f2ccc8b0b352fa4e44fcfdcfbb24919d04e6ee1108527b8e8d60e8d1b467c30c18c5455e5835d483161d3fc26b4a67d6df9e3ddd9331247cb18450188752a1ca219f3396a872cb13d8
+d = 041535fff5d279bcd744b04e643458ce20b81df8a9e01b1181d52bb14e4
+Qx = 021e1227457be78e49db22335139a136ba290d34871f90ab5e6a8db6ac1
+Qy = 0df43b381a4d757864c39ce8d0b64d6a32e9e8be30f92a10a252d46a2e2
+k = 03019bd459b34133dc7331caa8976bee67f76db3a45b1793cb545e26c68
+R = 0025611bd4e3473aaea85228b2bf37eb1b4458d8166012aa098d9c1cab8
+S = 07acd38506e984fb7f1607b50837018f9b4246623dcfc9d7aceb486e76d
+
+Msg = 9290df0cc50c3cab6655f3a6de1f4cf613d9bc06ea7c99f38038369ff2fadefa57a3c7ae7940c1b98bb1d03503cc271f7a891bf38eec93c31dcec7892dfd2e1ab337bedde3e5325ed8d9cb7fa3096f6fafc3beb3a66cba66ba826d1032debfb4908cc9dded8c0099c85072daac4373fbc428fcaa9a6da02181ebc33f0cf926fb
+d = 000ecfe580a624df66c25e87e7689fc3b471d205970ff9ab51a64aa12ed
+Qx = 02ca7b9c98bb8106ae14a87d5f9f7ae1f99a5524992116e68af89da6daa
+Qy = 0a2fbee769eec313cf3c8519d3f96167477f0f06dcc470408e3f637b6c2
+k = 044f065c49bb7ff0772d628104bc2e222f1fde42aaa8b9345d324d7f936
+R = 046301f3f07922d338d5b7d82104597fc50941e4bc0a15ab5e0408f9fa1
+S = 03495e335905b4842b97f00b344313ca7d6a4ff60cfeaa5d589e0a31782
+
+Msg = 855c7be75fda372f062709827f333630acf28954a62a5193ff675f0dfeb63f32bca418f7cbdb346bf388d62315b19a592267ca407120db93d4e3d7125b867c4c4670b7a57a76f61734cead2caf2425eb9ff0a63293e8cd6defc9648257b401463f4533a2425e0024f1ea93365eeee3c6da20d25928602ec8b426f9b39f97f3fe
+d = 013c72c73358ffa168423149ecdd897f0a5f75a641de008649f00134944
+Qx = 1c70e1b6c01477f95e718f193e13c093b101e9f16024082ac699ed6ebb6
+Qy = 1f8013a88264266cb5cc5bd38e477fe0a1aa49ae4a5ff94cb58439a7c1b
+k = 07ad8a117f34bf2fcf7d689b8124e08118e28ebd172f8c220d57d3f0b88
+R = 012bc7d380192f2efe55625e39927ef799993af9451c662b562a239dfe7
+S = 035961b27e88d6731220f70e96d555f63853d14149df7bf6d24fc29441d
+
+Msg = 9c896f800281812ed57d31623d563377a5c725cec84313472b90e73f77d400f5d4fb236255741b73d46f7e5254d04099bec274db8a9af5fc7cc220d42cc172cbd3c3595c49ff74bfaab7b5e46c90855b611f74753ccdbbabf92e011d52e9ba753b83ed2a251a632e1bd5c6d346e38e743950c8ce0f394a837028575fa44bcc26
+d = 00ac60e2e70b7c4cda64071c7738f68773c94df9456a8ec3bbb468fa7f8
+Qx = 00109614a2ca27b7a749e53777e0f3ee2f57013ee83ea539ada6d98d8a9
+Qy = 05668f4b27213a8a024455b398de2cd7635cb620d7401f5deb4fa9ab2f4
+k = 00098489f0966e27555268a94378b7b8685ac610fb0964694aae9aa716d
+R = 06d151437a0aac232a472af038b0fac095d224ce0e5487510e30c31d605
+S = 0563dbfd021c1b77f980530d0120e93c9ee4f1f092a268bd8aba7d3110e
+
+Msg = 139a14ead998d1a962fa47c47ef2953aa136bd912fe940709b8c560bc2a0c4bf8f3aab30a8e21b7d5f487d30b0097e3da723f11b5cb4e8c5724f5a2fe0d68ee4bacbb85e5eacf18094d2a8ec4506cf8497836a4a905059a998ea750adc54c27c69cbd0b0c1f9743a62f3d988f3fa0a9865a73fc071f526623085a2ef12838888
+d = 060bf720052e8b9508a801340c213cf53bbecf4975faee63d4b44fc647a
+Qx = 196e37671def44b35c9e8c719130389b40c7ebc0ed5ae354dc73e0c40c7
+Qy = 0d3fa0a45a3cc5dfb61085290f6d18d710ad5d0d3ab31ce65b0e6915a72
+k = 0729c7e1de10e92634857a65a2ed75103df6bd4bf63b1ad6383c37a0435
+R = 06808491ffebf088476de7daf541bca3fd943d4c2089b848a130abdc0d3
+S = 02c0dcfff06a07e928c15a1fc2aceaa4b4dd6fe8eb67ccd4d01240f249f
+
+Msg = cf4a8e754b23d0fffc1c5c80b0cb11deeaba3064b315bc2cee96db5b9881baf90d30af4b69066f757b3020706def77a5fc1632d96bafba22a9c8cd3b52d535d941b3c7cc02b7fe6b51639d5e2084478ab3a29d2f5e0e16639fc2833a47b58e2c3fb5b2ea1830fe2ff68e571a8f281617a23d9a28db1c64ddfb1083d055030e5a
+d = 07cf3c216592febd8630a478b5b3e3a605084020322adb13ac0a626bc7b
+Qx = 08eee2ea13a08d4e4d71ecd2547f6d80b8f88879c9edfab5a675831fef2
+Qy = 05117c0d8a0442ad7b95cac1a984dfb9efbb7eb3c3866955da60e6cea8a
+k = 038de0be25c23cbde9ed9fb259cd9a06b69bf15dafed723970dfcb91307
+R = 051c9c5fe50eb81a11c8e7b2db145c6b5dbff2c51def56f4981774c357c
+S = 053887c6cc2f21bff461c9182c17f634ee2b301c3cc4af0bb1d3075f74e
+
+Msg = ae64030d4af9b36c8d3a6af0aff34e5ab201df04274691fb420b7d5c40c401ed7f3ade96065d34f2490d17943e27156e7bed83cd7222d0d5a73d167855fbe7ff6c3ed87f20986ad8bbbd80fed5f9705c6c783b423f641d40ff1f367f9648af5a79ea3cea0236997558bd9dcb011ea4dc64d61ea1e1f85b4f696ed586bc7705be
+d = 061eda5999e5a9ed4485d2a0ac5510549b76ca37df858ea5d95aeed571b
+Qx = 1642d56359cc0a5f261fdc405030d45b0d6f9c08a182d354bf2687dd9d5
+Qy = 11bf0dcbf62749a99e4b02b284aa7a6479b59b363d25319a5315423a589
+k = 03094fac5381a1b31e53f43a537d9e22ebe6bd2c149f2f69d792bd56f53
+R = 053c8c4f9a30e0500e01100bb97c00ce98f5cc6578686daa1bdbd679373
+S = 047086a88ea014f06d6345608bd0a6010e650b9f6f984b6efea9a4fb277
+
+Msg = 94a9d9cd9efa3e4ccf2a37f904dd9cab5624ec9393cf8816ea591c5e70cccd2f105388ae133708fb974998ae61d218c71785f9eb808d1c28d953cc7eed00dd9854b6b4568c5ed5ee3df3b58a1e04c64f1c87fee4365ec9aa41b08a6bae234dc43a0bf2f61420acdb891a40f17f246972afee75a4c0b249dee0fc8f9b9c8a243d
+d = 07e7e73171e4d2f2989dc024757c186485435b82544a448f5cfca05f281
+Qx = 181c8cf579d9259020461184979757b097d5a94245a2b9a1f8a6931ee0a
+Qy = 14baf1b761a0af3dd9c0521c6489f9a778da824283c94087698daa7cf78
+k = 02b57fabe6b866fd25ad8802c6b02b680c137ea9b623457b35a24d5a5f3
+R = 07421dbfa83859354345b9c3f1ce6242605094d924a4d38c7bd952e3910
+S = 05ee48a3a5119bb3433b53a625101492216421ce67fc04dacf947ec600e
+
+Msg = 4db998df7b90678b8aa4ec6233c9b4629800ad1f3e2cf8f7afcac62fc6982dcb290e44587015eca8dfe77dbb4a80f9bffe75b11e961e70deed14555db6dae47d49e73004f000eb8677c18f7e8234bf0a5a104266167a05ef07152e7acc2f0368b37efe69c0c2feb51eedf7338cf9ed398f066cf1f66bacd89ab9376d41da35a2
+d = 05f7270764a0444c7159d2db867930fdb0fb9fa6b8fc80ca02e11753095
+Qx = 06806c7164a09e11629e16608b7312d9d988acefa626fe8e34e03203d11
+Qy = 19c4200c9522618dab8a16e217beb3011599ed6cc09291fe9d451f0cf02
+k = 04a8958c80481a18c6e0893da9ab2d48fa6ae30a0f1d0512196e658eba0
+R = 01d301da51eccd15e09ce0bc2d0bdcb215a43ed13792084e2969260d46f
+S = 031f96a2f322d27d0bef23ba7c457fdc45a6e612f7d13e9277d36c8def3
+
+Msg = dbf9b8a4ae316bd2df0c80db1cb5d7038364a2634925ff957d7c03511b57d486274b2ecf191746827c325a14dc94daacd66ad86d369e3f598f176c4f0eadec7e9edd13e34043efbe0a801b75b8186b4a6d89ceae4fb250ab570d65b6dd7c04382738fe3f6f6c867a7d84b35b20720cb0036a5d81a87126f236833831d9ff00b1
+d = 0179b924afa4acf30ecbe2b3c12de533a1f9675687876a7e5e5ddc8e03b
+Qx = 175bf95ac8e768727d3b4a74c2b8a04b221247a3b8386ddf35fc39976ad
+Qy = 122f32f941066150c151b9db92b86f86a10cab0828a77e4f0d5c4026540
+k = 0210c75a63699b424585f65497c6e46988c28eff3e0977e3ade599581dc
+R = 06087e46c0677e3ca64a0cf030236583935d0dc03c896685dc6e446d9e2
+S = 0252e42b8f03b085f38c6849bd420837d985c9fe14750a654b584c4cc5d
+
+[K-233,SHA-384]
+
+Msg = 986d9e5d636526f4deb7545c037fe81b09c74496ddb8e42e61650c74b6fe348593f0cf8f8eca5e839baf62f17bf6ad96ec0c71dc44fdf11259dbfe7499157e402f6bd5076972354150723afb632799a990c44cd0a4fa9609ec4db133e3b4700be3ea4a338e8ba1873d345e80163ed60d0de274d7617a8382980bc2138b0a2a01
+d = 02c9eb4d392d7f2eef606e1861183acb1fc753d666225f0f154d9eda147
+Qx = 0d58fd7b5aa570b1c4b2190ec413fbcc9ef44d33ef191b6e23abcb38690
+Qy = 173e85377bdd8dac58222cd1d0f7ed98d73d6fb6c2eaf34819b08ececa9
+k = 064f9fb13784c99185f334700ccfcc4ff60b7f4d613c3de6dc5d1b8dd5a
+R = 03bff54e3610ade656bbe002867168db1b521c49225eb9662950b01955c
+S = 01da3fd8c08d8e17692059c669da3c7c4c146df6d3cbeaf34598d28eaae
+
+Msg = 68d0be2883598bfb1433886aff118349157708690380c42b8919859d96db069c7fde6e117a3669f2cff94a0f1b66b27b09e3f1b24d26299e11552a084be428446f3174da2e0414655bdceb38e58fcb065b6661190862db39c6545dead34a03584632e988d0459659dc7c7c78d4d00fc2aa10465cf24b2410f14e2a62173c9962
+d = 024661c89b77b2c743cc175a6130904461138ddc4ef771ffb9fc2c8679a
+Qx = 090383de7ca48f1e71a43845565a9f0c53d2c9f8c2e0f6c4ec7eb6437fc
+Qy = 1676582272e7ebc9fd56e1010a570d744ae4fa70eed3e6eeaeb0e0eda7c
+k = 05cc5b36c7300a1cc3f624e9e663861b4e296f7e7a27e8f8f0a2d54eecd
+R = 039c6f5b484411c434ee161ebeda7aa21b7bb26bde0301d9ff92921337e
+S = 02aaae737aedecfd5d53af56ef154ac6430a45ff03a3495a34a5fe0e97e
+
+Msg = f0ba0407485fecd7337f4b22236533a926cc744a5f06dd08276750196f1bf7ea7984278f789f92dd07e36895a8bfe297ea43d4a1177c0368900e3b969d3083cbe626f0e27e7ab38e185c923dff46d9ba187b2acb9cf4b23ec8eedbb8044b96b5263d956e50cd6240c66d5d96517130c743752404ed09473f05d0004dc5971ff5
+d = 0065e20e5ce534576d7c17616cd4ede3bf4f500894850723bcc9f895f4b
+Qx = 01413f6dd5349e94311f1d25e400b69c0f0ea446294eba4bbeb10278b85
+Qy = 066a05055d856621161d4f0e33dac82e5c0cd91ed8aa56e9abba9ec80cb
+k = 07377147b59dba008ed0e6b366e511f94c7f7c9088615c6d46f46736b97
+R = 05515a6bdfde3b4b78489194d39f4bb439f58a6b3c3f9e16c8a71590b14
+S = 00778f79083d11efc8ff959f607c4cee7cc8f38b855028ea248fe291adc
+
+Msg = 3827276694e413c886129c452c9a66e7d09dee84f5f09bf34e4baa308b4627e096c7d45cf6ef45ba1d9a4019a60399feec10fa80e333e2aff1251c85ca48574d9b9e1affb9666828dff5afcef3edaf5e8cae823505a0c73afe76c1bf130399fb06b092ba34ab0ae15ac6c682f9ee8479b065ce75b57213b8aae0f55e4e386de5
+d = 014c85f66fbbd653f1e4e590cffe62c343ba6062df4b271fbd02e5d42f7
+Qx = 18930b4a59a1c0e92febe650347c49e29a4e83cb8c507e30ad835dbc94b
+Qy = 0a237bcd130235e34b4439293f15e7a3913d659089e38e5619fa52e3c0c
+k = 03c1f8d076fb4fbea91a97800607b2db3fb5a45149c0d30dce79f07e963
+R = 04b9d2c66d8cc55b64f3f62dc629ce8e50ae0bad8a4d14e8b6567fc87e4
+S = 00b9dfdbeecb061a455dd052258f3828d4b7174af972c65bd0043a9776f
+
+Msg = d1afb8965b48d66b9acb1ece674d9548f83395275f2d8135554cfcc7ceb96450d850dd874529433883709483d0743798db5e0dee955a4f30ba328c7934b8dd9207f3c336cf89141a175ebe23d2faed629eb4236a8aea8300604c3eb7704512f240fda66acedf1494a85058dc6a31bf9531958c332b93cfe5545046876c6b99e0
+d = 030ac7a78593b570b29f6d3d267abb6ba7e5870ee1c8ee4f1ab2f141051
+Qx = 0a409e90eb4314f95967607ea3de9817a0fdb439cf406135262624e7fac
+Qy = 04b1dd719434e8dfa5861887736f32ecd635878ed4b9e290c423da09059
+k = 027c4987ff872fe499039b4432dc889960ea8e3f07be42e36a5827b3964
+R = 06829b5e02b5849689d152ceacdddbfa8f68d782b3ae8da23ea48b1acbd
+S = 03dba0d2b4400495ee098325ae4450b32b83689349e82a69b799dac2cbc
+
+Msg = 4f95b71669fdfe5dc46d4b951b085e099de349fc740535175337127910acf24e9a0e4b2f23196ad23880da47b740d77d74fe9bcfdcc44dd7d8d1a181ac290de5cf4da22d5034cda3d8020bcc776dde8cef1786c9ce4d2c2cfb035da61406af745efb7ef1a55f2eccc5000319cf1d6380963025dcea641cfd15a3106751fec286
+d = 06d7516aa040f7d559cae248e485834e8d9bb608279ed4d4f7e1dbcd2b3
+Qx = 127a92888fdac8d4ba9c0243c9aca516bcb431911254bc2cf51883623a1
+Qy = 0606c30fbb9958fb1140643f32c5dd582c2319f71bff197d58ba3e598bb
+k = 01104b6ad82327b0445e75cff0efa1281d266a9dfe4019ba2ed22dd6976
+R = 01f247b2850463e362ff8879054d3459b2cbae84b9d4bc005a2ccf4736b
+S = 05b3dbdf04758d546e54c43ca5973bd8ceba646a4dd5d17ae5d2f8ec516
+
+Msg = 2ad9e17780c824c4f2d1e1cbf19ab85638f2f71cb4fa3518f08085b8b358f54d4f08394a5ac29cbb3cab828c5f07f41eec51e6cd61a5f2cf44dbfa46834370cebdeb328fd3bf681e61011b5c2ebc8945ac7a2a8467606051008b15c89390e111999255bfe28634ce9bc2850a2b55a4af1c4c2f94403c78aba1ebc87386ab7b32
+d = 0137050d7b455f43a8dc2516cfff5a91062c1a2727b27df41488f3dcf18
+Qx = 15ccc90a5f3906469e3ecf7a70c429f5b50fd0ce74065d41f1bd6dccc1f
+Qy = 0fe5611b8b1b35a907bc188ad2b1fb7507d1043d148283911af3ad782e9
+k = 04881e879d7c76eb2ee61fe1844567316d7efaef047b96979e6dceb7858
+R = 03799e90bc64cfd7d0246a7fc89a4d8ed0399277cab2af40fa2ec8196d8
+S = 067e8728f4d8398e4e1c25775620865bcc2d4cfe635a1f4c6b7306f6d9f
+
+Msg = 958773c37d3eba003aa5c489f72118b3022c52b93399e9d8001695664918b86893f4922c7b6e55b1855ed0fd1d8de5dc61af403ad660fec60d7c44bd0102c069957ed804d0d416facdc1a95355ef58554606579ef89b1842f1055cfa2ae118abbc485356824cc09dddb77d0671cb3011b33bc86cac526e3f6bb3293c7bdca1ff
+d = 001fd447b33a2ee3595b9f885c290d241422afdd74c3dc4981955a7e9ad
+Qx = 0e706408803188263cb149428c60de57ac757f0776e5b27a2d5a859f58c
+Qy = 153b5e13f17f0178cd90427f7d608a5659b9e03effebc89da65d59698d5
+k = 0339300c00cf7e8c6195ffb71e509613018e6a417782e4f52704026a510
+R = 0227c80e36e3571e1c783358c9ffed237b251332e8ed05a8d3b454c53b5
+S = 0679a32cee8ae001a18d9a9d0ed7e99e5ae67ffcd54de7b48c62e76ac8c
+
+Msg = 9cb2c496b1bc7f040228571e005e7e936e48e8f469e295edf914f5648701249a20bff6b98b5e862603dd9f12bb71c160aafe9df02e2e383e9b8a9a9d700f4425ce408feabbf754be543f52204c849fed6c9d3e36e03dfbd9e35c18d7bb2295f1c484a66e73440a0a5aece5fe80b9ade9321ef18cde3eb2db15e4b18e788b0441
+d = 06a061e10b4a6e7001d95411cb31bdea9c84670a59ed61b14fbbb05c8e7
+Qx = 00ad2b726b805919cabc90d058c78896d2dd8a78484c1fec5bd5fb0e07b
+Qy = 07e048ddb487f667633d6d030338ded21a2ac5f65373ddcfe1e4a3424ae
+k = 013b4a86b70f0e4de6efdafd7ecc993f0d6f231b3d743ee5adf82db1515
+R = 0541c2d3b2c6f0655dd415e327f0ef07b03356f8047117c41e704169698
+S = 00300f45026200b8cc84fd564778281bd1d7e03727c242a249d9ad33338
+
+Msg = 9a4bc0a029e97742ed3bca207d5912cb568e4403cda106b00247520ea02008b14c041b8c9b976294252da835f4ff27456039d79d90315abcb0b9b6958a22352672e229665457ec79571ca80447c8ff2a86e6af3dabe7427c8bdcae65e3c6746a56079ce2cf8d22235180f46646a21cd9e86032cfad874cb9c67f882fb037a13f
+d = 027ec31ca31acb4d2fbacb49fc085f1261b0042cc755cc97f9b199e7a37
+Qx = 1d521f7abc2fd3b0a10732ed641cc1b7fdd7b49cf61909b215220c5253e
+Qy = 019e9095c67af1b89ae6c486c4f9889c3f2994743eafe55bd9eafe438d9
+k = 0151aa44fd97be14578d68f87dbb884c960ab59d950c392e607ecae6bac
+R = 07be427f46958538004186d52aa50a0f83d184a9d2f4da2974163854eec
+S = 029d4ea73ab5b336ed44556f6944e734e531a5c71dc6c929e7253323906
+
+Msg = 8d89e22cf802dc68ff22d43c436c79311e705ff6fd845e77c880f399f403e6d5e9e2b35511553c978171189e288cb2200fd95f84ec5ee9865c0eb9190aff6dacf783ef200e82027fa992741876456472bdf27f2bd8ee55db15408c957a120eb64cd24d299818726a73fbb0697eba726a326719765735b37a2dcff0c853c906bd
+d = 04c6f4d88e5a4f4f83196f2dda9dcf2a66eaf94d50c851f59bfcea1d876
+Qx = 1e2677c1305f545472e373615d195d1f7a315f592e26fbbf44c42558050
+Qy = 1638140f48bad525625a87d0e537db5500f034e71e60e8a8c48eea04108
+k = 02185d8ec6f35d5c3f965cd00597d93caf45bbe186d4128bf877ec304eb
+R = 075199f4d8af090e4666754a7dac0c1599c207735c0f54c9f11e305727c
+S = 008cadf59a224f812d64c2f492e7ad4a923f3463b878dffc75eca5f8fb2
+
+Msg = aa1bf5a79e5339fb9ef6c2817bd95725551d064bc5064d6586c5a879901adf808dc2ef7c78ec3b434b84569988db58b5e8e9782b1cbc2cc7c9b68e66f32d4ac4ebe7e75b345f654c7b8a5e650acc9f170f75b7aaa3957cce248cc69cf93faf8d72abc6fc1cfa9ae2d18a7b31ce720147e88e84f6563b2197882fe302449ac5ce
+d = 01aa169ea84365c22981bb766bfdad27e373440850569957544b0f9332a
+Qx = 1f97d91302c70798e2278348e36bbe01587e0031ac3c422141e3d4c1504
+Qy = 0a95108f6b7ff41546c98f4ea4d1b587a3280e49c6cd0d33abdebf9a1e7
+k = 03c9efc0f72d88168c2b1f7fa1c6e275839303c2bddca136dd19ef446c9
+R = 0639d1a1066465b4b2f443cd9677cfe3bf5bb33e3e9b14cab2d37f4a859
+S = 04582792ba78f782f112711ceaf36f5f0774b92a6fcaee327d687658835
+
+Msg = 475664d5e22cbe0da0d0289ca9a666a37270dc71c81cffac91f6229fa39315c1d55f7e0a89b6a7a07df7d391dbdf8fb7af63d2da46ecc3b60110dbcd842da97f98d2b67f562b0364ef8e1c589519024177c8ea079794f271f6d35554c0e9d0a39062383c95721b72f4e74eaafb6fbfbda02cb670a7c4c94f67b8ebc6442e84e3
+d = 04a665b92c0c33a3f8b9eb4b0ec061d40b603de36c87096455102ffe57b
+Qx = 0f0ac5238553f0cd74e6f34f7f82563cb01138e5c9bac6d5e7b8b7ad4fe
+Qy = 1903e9fd8a5a2aa32913b18bddef20667061f919f8d61a5b3c814ba4aab
+k = 070ef25950a795b5e22fe4cf5402f49029c5d97cf9f57f0806c0bbb5855
+R = 01248dcf1993ac2eeacd062f853ebb4b2072357e728f0589258399ea95a
+S = 069800eb2e2b3a9162196dbaaf67cab4ae123ea817f223acb6e889f6d7b
+
+Msg = 9e5397d94465390a82a3c07e3ebf21b515776d18b4463aa5810e6b2f96ca61e92d13e034fa853c3fa45411f51f79df6f799a2c6906e6a5b7896a4576a4464f9e0be2b529a43e1f503fb640d79db6b68f3a3a7deac1b5832fbe86673784ff6db1f8438f7dd332cdd1e7ad9df8b6731aad1b6a72bde52e6bc62d80b8da57822c48
+d = 00531540d94823e19ab2b95cbc6e7492e1effcbabce875de6ba96f53aa9
+Qx = 031ba225249916a5380235220b9657162eef43d59ccab507639e19bcd6c
+Qy = 062e85d61366a73b62255c741a065708701c8fa024a15401a4cd58640b0
+k = 05375df0a23646e8033ec9e3ad269e7167a663b97b4f52cf18fbb5f50f4
+R = 05bdf7d643ffde5ea191553a9c99eb42fba9a8b6e2013dcc520298d224d
+S = 06cdd9e0d58bd4c5cfe66589ed7c7d15331f3e164dff562b6971af1a41d
+
+Msg = 3cc4c4192f317e52df6f8cefba6d4cd823c942aaee11b9a0ef5de5c2d181073b7085a55805e9554def8dc13eb978e7396044d4f4a14be2c7605998c062095c929b9c23b2b1b2fa73dd19a0c0af44ca4789f9841fa62dee8a5f91b3cc4b3264f5f67334c3f0772b30bd7431c3fbbf1f34318ce1889b6e8a76ce6d42079a451e56
+d = 022a89addd8b85809e87e0aa2c038593ec277054842854de1197833a51c
+Qx = 08e760b282d0ae4eeb2fcbbfdec851468fd8e04c4dec71fc2d5d3a98a13
+Qy = 0849a56b9b0b0a1ede6b9f9522685e7ace3baa57f72709aba705814d138
+k = 05515b025d6196ffdc8bf275479d72b29a752eb3e70ebf07d4c4e7bf74d
+R = 041902f9b7bc81d3a88066b03e4111ad8ff4d99dd868d5608d1f43eead4
+S = 059adb96af9f404d2f04d89fb39cf38ba5689f47bda749ae9aa1ecb097a
+
+[K-233,SHA-512]
+
+Msg = 72cdef5bdf710978e0aa334b86b8ff4a58630da314eabe98b4d611aab56f55c526983d54d19bbbf9ddba30a84b18aa0bae9f9503e9b222f842f084db83aa39625403213ca321cc0d9c8a136c826e6ea4ec108b913dd0a9ce9d5b8c7e3af53c3876e56a2037ebd6d99f037a097111c837647bedfe4c494e4288ed6427c15969e3
+d = 01df252a11ff97b4421b3a2361db94e908e8243cd50d9179f9e03e331f1
+Qx = 129f011fd5fedf3526f0437ae800a110435db907af60e16912d58523202
+Qy = 08026ed86afa7ec80277f322dfc8cf693089968ed9ceb8c95c930415a23
+k = 04fce14bc83be6f862f06680a32e9a51d1a569fdf1d9b10a89eb9fef4bf
+R = 04d7b8d19dd9cabc3c2245a9d2c8431c3151eeb6f49676a865e78c26c2f
+S = 0373e69da1fe35ce41ff344447fa7ffe6fc71e28dc68244372745739fc2
+
+Msg = 8e4eb88c0b2d525b2c58b8e00f32def90e6dd382301de49e0ac053dbc6b61afe926d85193e2c4948f7402a3d7c614cb2c58e060362b0516a1ba4a7425f1b3d09aa20d4c3c8993a387a3248aeec51e6efa8f558dbdcfcaa13ee08413227c8351e3107e9a3e3ac124224aaea91bfe50c11c1c8ae582e718f50bc5d5c06076517d6
+d = 01d7125c299ebd0dbcc050f07de931c7ad0450af590d0a2d0228a66ac5d
+Qx = 13ebde8790a113bdde87c11ccdcbc39e354b193d772921b86657f53f74a
+Qy = 0aae910b0e22f1a2505f55fef2eae47ab6d47db6e49190a5469b4b6dce5
+k = 0113d1737bee59f9f477f71f77a0ac1aea86aa67002c34a1b31c421cd7c
+R = 066f9871da9a22f07c9b2a44fb6c01ac74ba17649cecc33b729afcb488b
+S = 037fad90c288510d0cd8e99e5d930f4fe197df779dfd6088da48986c601
+
+Msg = 370fdd80f330311dbb3959666001bba61cdacf20f72f78953d946fa6cba02d24b5003f5452d535609e489b9434f192011f99f918defe877d51349870e7e75502f61145f7c261dbd2a0840926d824ebe9be3c5a77a3a84340aea930378367ed3615a47e3f792c7773f83f91ebea718a05fc62e9ed1d78629b2c27ae44fe8f8d4e
+d = 021238e66119844b146d40e48341f522f6ac2f9c8a0b33aaf95a3099a41
+Qx = 1dc3ac1ecb670f867337b752cdbf48bed9f32589366f7c6ba7424af1d66
+Qy = 1e3a38ded8148bf45484ab6b77e0beff759812493347e32d2d54a322a2a
+k = 03626adf8e70506e74ea27ce740f7eed1c8b37d50415be6a2681c67ad2b
+R = 07a9c9056b51f1fe3e7733c6f54ed96662aa7f5a08a961f91fd6d0276df
+S = 05e7600e9fda45bb966fbbb5a9404af961058a128824b6d84d9d47ebdbf
+
+Msg = f86c4433787c3ec3cb1663389ccf53d62f9425274ccef05fd14b1b8fef676208867764eb98d16d006ee6ebdc27b8d9a8ddd303d941fdd82b630694cdc698bbe6bd524411907834286c94b24ee199fe6d646064277f244b7df3ea2d9d52a9dc6a33d7c8d6dbc919da0fa987a67621ef0829e48310e0ea2bb86fedcf4effc0b94b
+d = 015e1bdfdacd87c42ed439f3e243abf27fd42e54f3ebdfb47f60dbae5fe
+Qx = 0fb7fa51c1a96baab65fc85c3b769ac84ca7b63a1fe9f507a2ee0c49395
+Qy = 05d450aed449f8f1aeaa9df0131f696c2bcd4528808d2f52b6a73f72811
+k = 070ca3f5dc30c70e576e2d2b30935b05b6e68598eeaafa1bfcb9e156e05
+R = 07e3cdc4207456773aa52b44156801b316a7ac850b3a9e717a9ae7fcdb0
+S = 07ad6de3ba8730ac887f045cae80fe2fb5237a8594e7125c4792d478594
+
+Msg = 4117d593aa92e3eae1124ec7482737cd3573fe5f0f2a5051a7ce86946a2abb9e47a0c6ea75b262689b0b486476d2ab09a20efc2fb921419b1811b51a2e15891ae9e45a17ab4b96c665c6c423fc00e2d66df5804a164f0f3c958df6f25d7da6829b1fe162a0a8cf130858c83f3555d6ad627db70cb41303cc6380f7b3fed2563e
+d = 00e09410548c17bbbf28a68c3963a52d39743a4f1ac28e6dfe7a6ede281
+Qx = 1f5f36a21a3b7fc5ea37528566da695922d7d9b7e6800af9c1a00f68242
+Qy = 03df4e2ba0c8648cb1fa19663f31786b850e6b80068b8c007f41de08608
+k = 03c0a2a4bea270eaf66adfb297c0e3213254cd87b11edcd90cfcd6f3104
+R = 07b684e337d6778f84bdb7a6835e91877b41d6af4b76311258fbb8339d8
+S = 064a0c22057a858b153ecdf4d275cf5523dacafdfcb46423b5613c85691
+
+Msg = 882ecaff3ec8f4023df5397167f238869f78a5c499be19aea85c7486e73f66f0e08e71cf85f3f1b6f6a70796bf46a18e6b555a0a87c2088640ca73051b3dd59ebfef922be0372208fce602d8001681297b285701dbbe24ccb42541b5db4aac1a1c7f407e11c83db15b38cdbc25e930fdc6558f64d9503e214571a435d890169b
+d = 049f5bea6e72d98579b78cb07d89f64503f8759dd7a73cd73713c120428
+Qx = 0974dcd68cd85117f363812a0473e972c89551e31c74c8d99f1073eaafc
+Qy = 0f306c9051cf3b84803307beb3dc0d34a9758a4f535100e846462a49053
+k = 022a5564b468e706762e3ff934aa22d9aea0bf2b116b61182c9f7be19fe
+R = 02e050afb84e1b0591fb64d46dd7d4a939552d68bdb4213f16c5d7ec5ec
+S = 063225df0057d5368b2e103eb2181ff5760e6b2a9c13c83da042722c3e4
+
+Msg = 99b3b8f876f8359bd6369ce84f9261581c52d744b90261a1427ab9e447e6d833b6b3e89af8dc770f1dd55692d01c8bbc4277a729fddfa7cbdb2ec99133201dde44ac691a77904ca816feb0a1aaacbb9fba85048bc63d73506eb908ecd697caf582747051a3a38ac8930c9a4365f407ed94ca7f2d26913c53f4c010c7ed9d7ca4
+d = 005eaa818690d1ca4838f0bc667be5721d178c3869884260fb230277c3b
+Qx = 1f7b3b50167cb2ff7482240bade95f2850a02805742e6e29eabf7f9ad34
+Qy = 0f8038a8cffa0f798a01e333251996662bc3c0ee56d94c392269b63edb7
+k = 064d518f7b8c87325d8edfd42a52793d87ef8db283606dd676be8584562
+R = 07128123004a515e277dd5b571e31bbc877cc966e27ed5b2ab2c16e881b
+S = 051d70485148996ec30f92097e4a12b5edf804e03e312072336bd912268
+
+Msg = 8c1a83023930a85c5b2f9930521b8b8963d5523a3323d87f862a17d3505ccee01246ee1029b8b8c2b608772c4096d1e914cb398f027d91184a8e94e4feeae121eabb504a2a35c8bc9294edd15ddd979946c14c792ad787dc2d4deffa284830fc90b3f8c0ced6a99fc6de7c41b9ed261402a6b3d702ff86a9392731ecc37430c0
+d = 0603d89cd2f741d734587e77554fe6bbb1e5739d5ff73084d4de8ed69c4
+Qx = 122f2b7802917e4164ac2f54033621c78cbc7040217e5ded6b9217f95bb
+Qy = 1f867df743e73806957066c2ab45c04bf1af158e146a9d1eda9e974e0d4
+k = 076850b8ca9e454bdb320da624c0dc63e14ad279185e4f8c9e49905666c
+R = 04bc63bafd5bad022fe5db246680a0a0ccd0b50ff50482d3849c92eec7e
+S = 07b6d8a8446ddfc64392af0aa1763d45877023c0be9ec78db47efd3c366
+
+Msg = f3c9dedd7115339dd3ede7d8d06a44de66bf80b4888ab7bc386cd40a92789042440a13d2cc90dbcacca5feeec1e0e3c51724146e2c4904ed6b05c7b4e9b49d7f458ada695c5d2fc36f1193329b87c1268aa38eda9151430aa0bc004e5d2a61b9390accfc699f2efabfec785eb34f52b1beff1e4c5492e922acc348667d2a3986
+d = 07977b3aba53616dac27b4d74930da23966a88ad98f1769674789c0be3d
+Qx = 0aa61b4bd2fa9c61914ae306d69d3ade7d6cf621399e5791dda8a054dcd
+Qy = 12e8d9274d5593f5074c49ca34a7e2d64f9d9ccdf42df6087134b811762
+k = 03b8ee56bebb59207e107bb0c16938cab707e425f38b70f0bc918fc1b8a
+R = 068502a3e5e51f5481aad31eb6614152f4957eef1becfe3a297b023a94c
+S = 07b6b43be63aa79c10876179703b69caf9b03c5401b999a3c5be4737999
+
+Msg = d878c4ee0bd6c84652d7f9e68df7b90cc78776d8d1b60f3e4d7465032bf401f1527ca7bfd4a3dd916e13e93fadaa5e5f20c9f47d12f8fc922a9a3aaeeeef294c221ca1adf7df85b888faec8002f17ff202da1be837827619904121167bee2d2cd694a263d9a99062cada3399dcbfcb283597a96ebec129c65e0850ec4cb4e2d7
+d = 050cd20e7eabd29008cc977d0a17e1195d79587b8f15ac2447e15daafc0
+Qx = 01ff23ff4ea1f30663b17d8f1c67ea37b8c5df7009d0c0301db483803a4
+Qy = 0ec6bde92921b83d4d84be8a67a23e1718e575101b93d9a800550a20e7d
+k = 041ba36d2e810e47c3de583772e9b5908c257b2aec232d855669d4dae2e
+R = 079e96ed1dfc4e31774159ef311805b5f8001203cf37a72921efaf5cbe5
+S = 00b8abcd623b17357f65ac365301a8823365ab948ae3f7fc6a4a0b8ab5d
+
+Msg = ac3c118cc9cbc8eb3b74d8ccc9ecbd81d1996fb25ca43c8a43bffeb244f722b93c9e969241d45d5b81fda0b399f1e3623687190e428dae077e54cad1eff75ec2f7fbb9434bf716833421bc2634885677579c237340f76787b2eb19b446d56c0f2206099b81493349f4db0ecad0e2dbe85dbff7d7070abb3d3b12ef0cec828af4
+d = 02dbb24fcaf9f3cd5d50d209937f0e2d134fa20ee3c9c2f1fff3dfbf302
+Qx = 0a07240c52e385ecf75525201f9810859123bfd8ce04a5e8f4dc4ec88b2
+Qy = 09bd811196ca9ac45b28031b9f65f9a5c4ec497d995f7dec6eb06dd2874
+k = 05785beb1ff70c7bea89b1fa14be09332ef94b09eebcc9fb1150bfe0d55
+R = 05279bb1b1ad8174e88bec4c723d65eda768c1d08d1c64c332a240a284f
+S = 015a90383c2c40ddcf721067b3435915a843f9c4708cc133fd1ee53f442
+
+Msg = 700313698cdfdcf0044ca07bf9e5f0702ece7cc66e35decb28d5f8cb7e7e5367a95cc1728a90cc9a53a2b5fcd4702028b742538e9b386f5d8b4a2411579ed9553021a95bd00a73f03c4184a6145aaa367e3af76659d677fe7a2e98f9ddf4aa20eb8d1a1db72c3f5590598801be7ebf44255fd7376d89d998b7068bd1296fdc38
+d = 0047142197d3d43fa46545b547968680ec81688589d1ec8d7c7e90eb969
+Qx = 179450d83cd6dd1609830ec78011143eb64d2d1509ed1adfa085a58d786
+Qy = 03ee40673ac564c6b5732868d0f8a57727150a23c484228890d768dae54
+k = 064f8892245a198c9c819152edc168e69dc7b562ef1f54dcc1960cc7db1
+R = 0293f2f989fb6b6e7cf304faf3f63eef61ab89a626cf8152e15f38bf93b
+S = 04948643075cea6413b1c88a9bf11aa176611f56d027f2b165d00d46e87
+
+Msg = 0374673e1a685bdee55504ce3cd333f70084dd4ae685464a16924eccea34531663fda60229166478b30193459a3113253cd6494dc26154156252dc6e822552c7c04d790eb9f8fcef2ea8dd79e72f881f7f20fff93cd73ad303c0918ec27c6486c4da61f82bcd55422d16650cc68bfd4b0132c1e7075bbf17dad919095860d445
+d = 031352b49ecde5434aac05f898e6ce4337304845d748f114c14319fe97f
+Qx = 187ae6bc9167d9c69ce5544ad650055cb9a4e69c1772322d5722e68e7e0
+Qy = 0042187e9d11a921adafc694b5cc8da9226ddad1b65f764274954b17333
+k = 0761189e63fc0c3b5db92b281e5a4bc0d6fdb30bd14f8e69ca85a211bc7
+R = 0453560e6e725a2bfe0383884ba3b3dd0816d8522d9e0762f781f6b6340
+S = 01aaec4bd98c765e4830de6593280779d1222918d4acf08c8fc3d0aa351
+
+Msg = 8b237085f135d6e94592f8d855ca397c8c1028236a3b412adefdac888245874f586d06950ee18118f751bfe26f4c31465ec34b578caa44cf1b7109ac4f6eab7f97ff9699b34271df035d3bf58a2ed4bcbf7577cf8e5792b1945ebb9389b680baeb8518c8fdc5540e192aa4fde0eed0d7c82be2e362b286f582d65752c8db7038
+d = 0176f124c24e4420f6e726a6ca25f09dfa0c5a37e5bf879e7bdd36c3b65
+Qx = 098c37cbd44aac5d5c749524b840fd849652349fb3e02cc8f8fd0a23790
+Qy = 151a9a88da407ae41e52b3dad1ea6031c7a36bd834007c0cb1e2c2f2f0f
+k = 022e299985cf289f2fbe2b1b270fbf12ba818cd2b506f642e659cd541bf
+R = 0686ac0c09f90a077cb446c910e07fdf23e845487d0333efc65b9b84147
+S = 01688b18cb42082bea69f18511b0fd9fa35da83d738763cf13ef92a119b
+
+Msg = e3a086ec15574f7017b3cd5f5a47ab7a73980f11074333490dfe9f8ad8926f9ea7c82271aaa74e77133b1025b0b22a6900fbb71251bb6549341a23d194e79d03462cdad52ee0d1b6f5d0d14e1136026961fa3467ccf0864bf7ae3fcc3b68cb35df7324bd9bbe58fc8aa9f63c19feedf19d935b71bf5981c74fb2a487f84e453c
+d = 0755c48c3dbaf71042c58cb137f3632e3cf9d90b7b9a58fd378feef3d19
+Qx = 0bd9a720553afbfc5349e4a65a21fed0444c30304f7018ec1ff6fc8d1f9
+Qy = 109a1d6b9cc4fbd0e888d0a2b6883fd06a5da347c0d4f7882fd29eabcf0
+k = 04fedf8785c6648798748504b1c9b6a066ab6606bc9a69534f93e908f4f
+R = 001e71744a1b683858444da0d270f43b0d5644424f2b38ef48a639685b3
+S = 07ff8199ffe723abacf1947a828e8596dc49ce655319087e4aca6ca34ee
+
+
+[K-283,SHA-224]
+
+Msg = ef90f85fbda05e693006e4c64e1dac56223becaf0890f73b5274e6e289a5a1de2c141b825c24d595b3fd18ca855b5c1aa60dac6b5356275b11be670692cdbe5f282f93ac7b2e410a96cb9e9f80defcde98f3449f99e192bfd62040421a0ab8f99acb85369f25e5efbf81439efa8a5e1d9cf781355a0f47b037b09fe4086389a0
+d = 1e846c830a8ec04e8572d1a9d2df044ab47352fb346f67403a3bf87243871b164511c53
+Qx = 12e43e20941f2641154bb66a56f2e0428a7ad22d607fb8af658df0b382bedc7d5ae22cc
+Qy = 22f226cd65052071066963b112aa302973fe2b5fdd7bb827d13da7634dd2fb9e3852ddb
+k = 03a76f87ede2b5d40a0f10e15e90e29198fc3a03943efea39ddf7afc37ed4e18832af8b
+R = 1be2c776c707098438fbd0561de578e4b9449f955a25626f2fbea257fc578ffa1bbbb70
+S = 1aeef69983da1a535b10a47e66d890c4413c7a8cd6a2511a1a670a4c573d4808f46e23a
+
+Msg = a3ebc17c867cc9c7c28797f6364f6574b80c7ec5b2d8e1542a6f5db8568c15032f92cfbceefa3fe4ee654f690b0455ee5d38dd84bb8665ffc1ff8c849bdbc4aa0ddfdbbca4eb37972fcbcee8cecc1aae21ec736ef61781716b60247b7551ec4e552d0b59a53cec5964c67cf7988787cedf769eabcc9cd5243f58034d96f0e43d
+d = 101c5ed48231a56ca0ea85eb45de0e395e6df2efd4987a226ae36489dd8b2dfbf7c465c
+Qx = 7011260f504d809baefb54af48c890f94fa5984c8bf228baa4b6ea14d46372390d1a8ac
+Qy = 2bbfabb680659aa2611435c4058ed773467a41cdda8250f3490e4f491f1bbae452c5c36
+k = 12a3c7f0b3d64614ff97133873d75c7c1406e316e8cf60d22139dba462055baffe6c8f5
+R = 0a9933496d60716a39e1c3f3bf22a7da546eafebef80dc6f25d0c109ecbc430fdb3e80a
+S = 0be56197a0098b022a7914c10f40207da58403d6c7d04edaf7efc96de740cd71f67e0de
+
+Msg = 60269efa4d0ffafbbc655f6f00578eadce7fc0a7eb7db923dca49b6f2bf3e13f7f829cc6133e022c3c92143c075ab9ced0531a91e6e79848194ab98bb852f40c84e7aebe71fb8bc0fd1f97ed5bb6bad6783d8dc048df42738e841d978456e055e1b8a781dfecfce2218701c7af77e7894ccac5bfff360aab0b6136b978bc39c4
+d = 019679dc589440b11f82b3716e5b2a2bd42c3b1c83e88a28e304cf5148877faf760b4de
+Qx = 743ae04e4b07d154ca0749a011c97a31ac68d8e1da3491f331136873598896e5320ddcf
+Qy = 776c05891c27fd912267ac166bc9acbaecbf80ccdd887aded2d7b8c2a4a5d139833aad3
+k = 099ad7fba5284e406f6cf200a39e398aa0426448c09b95e691f653d6096a63adbd39965
+R = 0285a82340d9a6d96ed9ad0fd0916216fd20edf979df41a55835ef8fafa00d242ef6f11
+S = 0a8548b405c171d2a428507f7adda4944bade7cda6dc580b1d3f94e15d7e10f0a08e008
+
+Msg = 59d704d5b1f3a0605f1497f22f71b8f45b26138bc86371f00a4517554e7f6e7fa5d35189fc656ce68bd2cb8510fa3e3c3df815dfdd749b2b6ac997d443f3954c7a927e138b579801ffd035cea90840733e7884ccfe43d8d3a4a26b430673274aae312abe4ac1e1d7c67b73580fedf2d8de46572493c9205ebf0e8b4d75ccc88c
+d = 1703c21fb1e09f8947e12fddf166fda6f685221fbd803d75a0ae377a54a1e494e6c5e7b
+Qx = 767564e13ae544dab22c3763c5d330a5571e07ff8f2f5ba3fd729379709b1fb184f990c
+Qy = 27f9e5efbd1ff6ac53a6174670eb463b12f70a603354e25c577ea292b13b8e5f022ac9c
+k = 10d875acb4d0dc211a82e78c0249e74de16768003b53830bf5648cf911fef6a57f8f048
+R = 02af92243b9dadcf21561ce32ca0744810478f8d5be8e0f83d9632ecd8e86ff467268b6
+S = 1f6c50fb3bdea228a6b623be9e2ea2c371dcfeb0e604ef1029b6766c43b193d86c02f27
+
+Msg = 12c8fdba3bc5f68e13f7ff8e7bee876fa68a970afc6924314dae0c2482763ced8d4752cec29ea288d350acd8a06c69289ae41ad345a1b88bcccaac903f2bff39015c289a8ad608606bfd65270a7bcdb5fb10c89bbc2d16dcb91fc9735d66103f6b1f3575622cf4d8209290315b033ee1f79968939410f465a2d37add46af2d59
+d = 071de8eb14cbfb88e61b908990ce08b81e624ef4f2cd9cdf3dd7ca9097d5ffed9ae9a71
+Qx = 136d50e1aa8203a0cd2c2d545b81d00b95c6b43b74b1fba3a6402abf756d38087affd49
+Qy = 46bec77240de7bde85ca4345f27c6df341c72a4eccd2cd495e86376c183ccb34f271cd6
+k = 1d80734927505d8d4818b3bdf1aa2e5c557e5f717a5b3fb856ca9a2161bfd74a130ee38
+R = 07894bf10885a698899b118f57e7da22222e3d187a0aabfb99fac0ce0e134b6b44a5f90
+S = 07b4a87592004d6ef8345415064b4b4672db2943c7e6098a9e6d59ee3324847e753703e
+
+Msg = 26013a3ddf687bb2f37d9700923906f118d5cba5d8ed5113a0e3e84cff00918125108f74f4b243e351aa5d07fa7c6ece29f5700f23e50286447883d2a058c3258a12e4ed8770cabe627ebea7ef6e8c77811ed7d9a19c53287093e39226236587ddbc63b7ad5e7ad9895c64d1d03ee432d45a067afe27d4cca920ae88a7a68db1
+d = 1d156eb15762ed00c4021884adbfc2426e910b18a5bc474268196f4b74e593a8f38702b
+Qx = 0a99b45860615d7caab2f4e9bc01196a61f52f95c6c7fef615a4746d48553692d5fcf13
+Qy = 56f81a0088dec1382f8a3a863901d3443c8792cd13ce13a8f63b02d107b66d9d23bc492
+k = 1999524ce9525d85b562fd13634fd9ac50fb76d83b9d72d6976d6fbc47af7e1f354eee7
+R = 067748d49389c9b87a85b518f84f41b18f52569ba531985b8fe5e1f0cf9cffa958da3f0
+S = 00c44a583c704f69160c6258332f3121b022759b163c74c7c96058fa8e3a9928afee948
+
+Msg = c4dbf70b9a2165e7279122460d05ceb8e43e03fbe2ae7c314007fe2b1d8567cac727a10fba5cbead0ddb167d387da8e8f3d6bc0ad851cc32885809d07a776fd4a95a979fe3833610af89df0f454d9edfabe12495a118fe83add5eabb2acf54ba7ba7c4be20fc77478c0a0f0726c4e60317422a612a234a7567648603b63f1c12
+d = 17d6eb1219cab8577168be86b61f372b27ca70fb1f1a767947895c185344e966db17aea
+Qx = 65d8e43a290a6957230501509b95a208a6c37ddcacd1e882d97c73c38b2a256caef5e8b
+Qy = 02169cefa6ce170ce20a0b5463f5bd146224e0813acff304307da88830b0777b86cd3d2
+k = 1519e37a66b4e665b2e3e59b8e836869a886c879aa1ed47901a6c8a8f365efbc67fb410
+R = 1734a8bc9a13f51d921a297bc6b2d38610c20b32b0adfd5efdd01a4db5084f3b0697904
+S = 0f9f00b25a33b166f09e2a819dfda80d87f6a2419a7b4162e435ee02c0fc10a669df6d4
+
+Msg = b1d53b6af1face9b59af11c726b0099111d1adb3666209ba46b1744a528ed0f72be5a1b82423153b896384faebef0362343e2a4599803c08b8513708938aa8a498145fca1c63ba41aff06d1a18aa2a045fce7fcd7e5552a2b98d0df97b6876f06a9cf52a7a40fb737996adda97c3cedf7fe421235ac6951060eba9c0377e72a2
+d = 10ede9be6615b3b2a294d67da78127ffbf3a15bdba6f4fd78be7a60415b5d1a097c0cff
+Qx = 6418eac385ce94c1982c216ffeb0b26f9c061ccdfd785ded75efc6a329385898331fda3
+Qy = 7d41f9cf1248a37fb8baea7f3545bbca707a903966019ad56e4dc810b6863e243968b48
+k = 134ac4de6ed71106d11fa736960eef2873223aa87b1c5bf5c823de6c78092cba4726ec8
+R = 12a37587ddf224faaf8dab61210310792d4ccef650c98155a227bf468b7f323575115cd
+S = 10982c965331cf8529ef6adfe17dc3fde63dc2a557cab451d7c9408a089229e22b73d43
+
+Msg = e78f538b1ac21602b00a09e3db243ef4803b447329c94a1476cd91a88ff790da71421b60092c8a6e55327c7982e7655eb1fd6e40fa9b9fd2f10107dfc585994dfc5bc2143d18794a39f7f69ae679b27dd11ed22040d5e93aa83f71783525a4db0c3fd7b43e57dafd0033d5317680df19c2ecaadcb37ef896c61a758a5e455206
+d = 14f237cface123b64e8578ff33f86bfd2a8181b9c81f36b9ca31e2a446f0d91dbbe2249
+Qx = 7aa347c03d8845f1566bbc3fa1d66ecb41ed1dab0a402405d8300591a1f3078f9fa532c
+Qy = 63bd10274437c2690ed6df60ea632f3d4faefcc07a72ae8d85c2f999bafd373053265dd
+k = 0570bf3b42aa44c11603d94e14b524b8cb1363306196924082ae71021707c3138503031
+R = 10f7f4af1c1e3f9e8e0c95f991c348bce6725f60aa12ee7b398be64728242088a469a58
+S = 17145a39fa4dd237e31a98daf3974138638b9462a31b87ada3eade6bf7f597195eb28b6
+
+Msg = 8a6ca8ec436d2c706fcbec6486b5665b21c174edee7ebe108211c388b1219a8224179f7438e0bb7d6e41ac4a67337b52d4cd9a069fe6c88960ae20be29c8060efd7c62cb7a9a37136a250e68f253e7f27755df53ce7c570135641ad49b43507e5483e17b919cedffdc0d4913b1d5e0ca0629876c0a551841a0fc2090d2857cce
+d = 08dbecb26587cb2ed7df2404e680fcfa5bf8cf6a58e87a350a1600211b3c844ca86daa5
+Qx = 66610ce348821a77e8a6eb74a675ad9312b2622ad2e1e6d8dcd0be8b27d8384844a7234
+Qy = 014c15776bbd144c0c24bf419237db9401fb7f97a7c4c0ef50a9afd27c3964088f79643
+k = 0204586a9314bc14bef8ccce8b9ca3874572b375d01c6b4a41c743c16502a27e91a9fb4
+R = 0fabfeb17bb8c1a57af7af81d99cfb7b0ecbf4e5e4a6ed483aee4be8ee4c70c2ef23941
+S = 08071e162dfeb068e3cad256c3603e07ae48b35f1bafdb726cf4ce32844e1a2181f23f9
+
+Msg = 95bee02b423d2c6e60252da4632f693a2d8f6597b4f9c6e356f670c3a9e4e80063e92facb6421d0325b99dc150464ed2ec1d0bac72a042b35d56d33d2fda686a75d582d4756522218b4ddd25ed45503d90d3d185cba6cf0ac211b22aa4e1318a8316c369186f7130446dafad64f7966f5414f43af37a87127534060a23c6165f
+d = 191badec2d28cbbe62c072c6b57eb5d4644d0c0b3283951bb66096cd15edd43a1bbde53
+Qx = 020224b00428031056ed370147c51e68ffc02e7fe269ca15b22310a2974d383c6c83fcc
+Qy = 1686568fc4768158e75b4ef0427d8e262cd0638801ab158311749e0f432d5b69a667f0d
+k = 03b1b6ca5e627f00176b599b68fe54e1b5a272c323a06b55e4871875c0e729c4c79326a
+R = 1ade251b9360a6ca1b48c2fce0768a01193a415bd23956fee1e5c4c5076b3571abae082
+S = 0adff25020af4e2b4908a33ce1d75c793934921267b6c4a0542924300fce40fc0031021
+
+Msg = ccd7f7c0e04d1ef9a3c5617d77480bc624beed6582bc28e9e3a369b12144fcd96b735ee41713f4173b64b28c6102d82dcfc7876e06e76fc497d1d238bf6d85bb5feca630bbd0c0f0fa7c0c72e28e9259087698973ac66244bc6e69c04deb22eaeaee7b20da239ab6333576f01349c76f594498620933b8969450ac2bae66db8b
+d = 0ff5e3d66eb57fd35ba4472effd6e7a016ca461e39000a7125e99080f6ab6ef4380dd7a
+Qx = 19d8c1d9aca39de0e627981d21e35a628c35fd4096aaa86f61625fcd078f0400f615cd5
+Qy = 52ba2854ccd64407f6779c5e259917b251c9e34ec0d95c05488f30802b82cf4b25b5389
+k = 16c9cabed653c57676ee46c8912cbc507b246078834f1667d0708e4c666346299c1fc03
+R = 12ac0ec9501ac91a2b57220e9c00ec6e815399ede94a658c36f9e89bbf1674316d65dc4
+S = 0c9480160c4e9db4e82b4ad26cb79e083e9e2056e68a2ea554aca45802bbb188389bc4f
+
+Msg = 65e9124a2606c8784c9489add2999f4cbe6186395df20838d653b263a207ec46995d2685b55d1874e7ef05a6a3bb5b60a7be6751ad568cef1bcea2debfc494d1e2ece0dc8028c88f1b2c6e4ee26b639c5e81f6448bd25b73ec4608a8e8cf4e0155c29b6f0a62781493b03bb7384c9808529d5f87da6564ae196a365bd282f46f
+d = 1f3591eec4a8a3fe6ae6debe230d238a6b73cf3791cb735add1abee64239bb100f15166
+Qx = 483e7e2b8f7ff95b86008c3042ab83a4b6a48f15ce1cedbaf3b586b56ab606e6f23a4ef
+Qy = 287cbc8c609426f1665976e8120afb8de96b43978762ed44bea5aa1418b9af6922c6066
+k = 08165da5f5427b38c447382c8dd0940c3bddf8f048185e6cad260031f7c0a2ffb83027e
+R = 09034633dbd735cec6208bb6f4455b295b7d730c9301bbd1c0e9f101399f2b3425a13fd
+S = 0204ec149b416ca3467e92194449cf2ca0f41ca1fde79145f3af856085b298149a3253b
+
+Msg = e793c60fc725fd537d5fd38e9b4fb52e268722ae6bde5a058de8d20db301f5e8d8e1ad85532198835a04b76f27ca3c972be5617a55677cffa8219eb64fe53ced242efe1b889990979227dbaaa15ed39d3b6be8c5a3237ebe12bd96f333d947f80048463d3859e34f865d83faf03894c2243a06cc96788ed952e606c2d8948271
+d = 05af03cdb45961e7ff35fb0146904ddd6c2bfd3cce814073d3aa56eaa9f13b4f7423926
+Qx = 70bf676b9b0db558eeb8bb94a1248bcb599d1e8975ee13cd37dcb78af19307d1b7e57d5
+Qy = 6ed9bf30c627062b99ff9d05ca03441b6194c34364cbe7b73b46ec9716ad8a9970cbc99
+k = 192c7b1fa8f221edecbeaa51447818474dd9fc89e962e8e87400938ef0dff432a6c4b86
+R = 1df1a4f9578e9cae8102aab5eac70eddbabe4ced99b5bab1b1dee59c41b81e392968c14
+S = 0f2b1319335ee497fe3ebf1891a71cded59704365774e1ed9950f79100e70950783bc7c
+
+Msg = a57682d21cebb48190199e9f57493696eae3a59acd22f64d5ef4729decf6c2615b326817a6bc118bb7234bebfc7276dd998838c009a7348e46431574638dadc48538d6048d572e50d9c5974d2049ebe1837dd857bcd1447b1514b62808a4e7a88162ae1bb08a0f6d3db6f25874c6cd0cd4ca6333f1bd57bd192ef67e4616d182
+d = 1ec9710ada06e6270720692a06d488ae2ba863b905dd2fc323e7ce68dedacb35fc8c7d8
+Qx = 5cda72b5b068f70b3c431def41b8ca1d4381e8c2fdf0821cfc17eceadf5e3eabf7987b7
+Qy = 79ae508354fe31899cda71e01cbc80e5192d24f1f13c954208d2ab8412802407ae3763f
+k = 04f7b9372a8fed536396f0b87d4b20494786bdb8db77200c1aac1896486a05d3c940cb5
+R = 072ecde2a8f506f0fef273c8915a9edc29e440d48fc6cefb50e7117492fb4a13e123bed
+S = 0010dbd6229d770c468f5d8bd20edd6928bd8824b7fc2b10dc45fbd3242191e7557b984
+
+[K-283,SHA-256]
+
+Msg = f646e7334e191c2bf0056d3bfd23f03ef7f0777b923f962519a8399d311b8f68414c689ca34b96871fae99eb7ea534fcd83e788e56eeef817cbfe33677283c736b99bf6a626f9515291e842bf99f694e4e8aa7c9911c591a87d5f112b3d96b064594e2b368e6d1bf1a1cd343d54916a66da22c26355266aa2884120fffb8b94d
+d = 0668de088c6913640fbefbe6d2c44ab26e481802dbf957044a4957c3c5d0a0fde331501
+Qx = 0d3a50cb9d347cfe45d2a313813fec8b928a9b1defca6ff4b89c4787717f275c6b7337f
+Qy = 762e47b0669f625c39c74d50e2b46875ef366b7c3b005c16ede69a2fba161faf6b3d0db
+k = 0b24bf54795fa02eb9527f21ead5497a6db2bcc7849a16d206239f830df313dfb7a2716
+R = 0852d8b6fe93b0b36af5d99530eed08669eb9a25972fbea59f32dafe88b722bada98ab5
+S = 0e5b08d410f2252f724dfcecaedb37b92a6c09cde646ff6237007f4199068f945ebebe2
+
+Msg = a2d7e69ea381d3edfde4664c56c4cb140d01cc4425df757975cedc995b89640dc016ab419b137ff25a6a6d64a309b23890439d2ba157262393cf93d15ca1b1ffd19373ef12367f8898aaf56d5544c2f019a4854f69b3d8d320e03135bb7b675e588a5c3fe4b703938fa0f964916501297cee2fd04af767155c7739419f9dbb7b
+d = 0e6af57cf47de1e6f07041eb5e1a413fb7ddd82f8c7f7ce957eb28a118004930bec4dbd
+Qx = 21e31c4e4d412a261e40483b9106bbc1b0d7e7414e53d7b9fd84175229c8cefbbf6defc
+Qy = 46ff2dc601dd407883af7dc71a6ef4286cd3b1b6ccee4fd861865bff8fb38ad51b63d49
+k = 08f9e2113d0b223c04e678e8ebdd3aab4816681a9ef08b18a38afecc57d79c971421469
+R = 0d2c9113a18bd51008fd327a55c214c9584b6f1b816cf3b95e7346080da2cb07dcef8aa
+S = 19167051872759c36ba9eeb5d620cafd3289e8b7660fc847ff385b5143b3aca38780639
+
+Msg = 7088f60e9375ec6a42f705f851fc76cc833c4dcbb3352adcce9f59197c1b7121e7aa661c4f8ad9f4ef280af3a2981e90c01291f7d1cf7d3ae2d96b37fe6975e11b7c6c02b8ef044d1470b1a26b9c72e8c4e7b1dd83c8acc9542e2fc7d211b87841dcceea2ab8128d0ff7bb622b60faa4a89ea7008f7d55f8f9de675bc4596fd8
+d = 19f9b63fde8c6aa6177f2a38981505d04f8ac62bcc21007b05615d028cfe851ab9cbbc6
+Qx = 5a3e567b227869f948180547c2713703c90698dc04864140d22b24bdf81b3996829aca5
+Qy = 5b2ba535040afed0bf6f9d850713e54013729bc6dcbaa336ebbfb9c461f7ac61af48001
+k = 051e20545a0a98dc3fec59e4ebdf101c6aa2768f344c1e19424c1eaae4aaf7ffeb5205f
+R = 05fb3329f63587e8febcdec49f92de88366a9f75d0b9a0f374dadc6e7a62b833753e990
+S = 12edfabf1ce434c850b58804f1f31f8afb20fbb36ee69b68668e231e4c04fa75e658478
+
+Msg = ffd6044ab991849939e8a29184b4d0ac3e07acb63c7e6b886df9e8254073fa800d5910b9fe34fceb547565a2344eed4de394ce2251ed51ec882ee9207eb7340464c742d9d140fa0964f6bcb1efcc2d13919af4f727953de41b20728ab975c1ae0ce784865f23ed1325c68daa95ed5c932893610179be94f13b9a4149f09833b3
+d = 17704c1f436beb52f7ec97192e23e206ec09f9e8986e06bef71467c192bad6f0066b3c2
+Qx = 329294a36ceae2b2c56bb6e21e52ec32af11aca9ab7785be9c2d79652e7960c0cf7a8ae
+Qy = 658a89a48fb95cb7028252fa9792d91b989d7cef3fda8ba9c8e4ffaf19269f2a69f0a24
+k = 0aa8d2e210ae40ba1f9f051ad85d37f7cdea43aad890ef802519cc5773e9a0984fe5d6b
+R = 1908e3a2740fa04ec0b23c964c4c3cca51c4603e7553461dd02f8319a7ca2ca09d0aef5
+S = 12d7860d7b438df4653fe40fb9e986cb035b1384464e061bc4ee3bb29aec74d16b0a694
+
+Msg = c9f81c9ff7d80011fd41f2de97a6c1e6a22cc2da7b2b9e4c50e1354c3e139b44529ac786ce795fc501dcbf11a935d4728a7bba44b4e86b5e5990fed4d3e24fa5ab6f303e1842918f156e00dccebed6897c852207ae5941c630014a41696882066c2b296d39cd8658cb5830eee78e29a00335a99a0ba90722ceca5a2e9a99a2c6
+d = 0c7d1ac8faa689698f5c6325a3b3f35e7730bdbddabd0693f2bfdc5c838bd62f84508d4
+Qx = 095a930071ce56f28a79a66b751283c756c4f2566ebc2a10770ca60cced6914bc9a0d77
+Qy = 46f70021e7a949c7f55b059d4c8e81ee23b13809a35932d83b8398fc8684c5a90f3ec71
+k = 038ae832c25dcd30c1ee3f5fbe84bd8779c876c0641907695aa598132b0e581ea528332
+R = 0eb27c86d3ca86ef53aef0465d257e6b681f891a6357cfbf51260dc6e35a82799de0e97
+S = 0e8207959e8be94e7407543df80d38d9e662106ed68e1456dd1826602c5b73f27ddc901
+
+Msg = a60de761eb32490184dc1d29e21fa33889295ca587b994746874c7289eb9c83e9c7bacbb4066c761a06b65ecd78d701bd41f305cd7eb258c630f3febfbb0a367ad16737b146fd793dab23562e8001cd113135b1c981d1ca23eb3be0fe3e24fe3fe1089caf9fd8f4f0d1f90dcc7dbea4a9e2357793b65daf342b8e6d109c6dd10
+d = 1a173d158866db0ec665ee632b5fc397893f6a44ee17c348e7452800aadd8ce676e7fdc
+Qx = 6a9369a93e0b5165ac6e692db035495c5cdd6df243d9756098385ad616374ac1e1efee2
+Qy = 32f72a02c36954cd8221126e4eaec02668f454214e4508cf72b6d945e14d9b7c5d404c8
+k = 0200713a78f58c755db4897f9b7e52057a087816a07fc388d66d34ea9e0bcf2f47e182a
+R = 11a26ee24610e705a42329f86aaa80d78934b4bbf19314f06eec46067d85c8377e04d91
+S = 077e35add124574e98e0056bbb106cd28ba8c3bc0c47063ceebbbf2684983a2a0061950
+
+Msg = 2cd0320cc73120ef13e83c8144b270c9a1f2049a9250ef7ee83ccc7584025140a51e2227a5ebb824deff55b3affcda63ecb1fd3f337c67c08054dc82fdace0c4bb9cef1bea9dd792635f655363d05903cd6b5ed50ee669bcd8157509366cd85aa40d19593265da26e5641590ccf04672a6df52badd4b99964a8643d9687b499d
+d = 05523cfacf4ed3b74ebc30f608292e45173001d80cc801f729c5f71fc213b243f041ad5
+Qx = 410751ae7d8bb2295f584ba3d55eda41a80b8520b02bb4e5ca669a1003d6f2829e0a01e
+Qy = 5fe16244f76f0c8b24bd3ca3b53c697097e3ab0e2b44962ea534a655d6c7d80b857c21e
+k = 0a634f4cef0ba37c9ab211c57fe6574c67933280c91c8b175fa4164755bcde867fe1772
+R = 0b9f6946a578ee38433e98478a4c31b67e838939cbf128f023090c4848471482fd1dec7
+S = 157159e15a2d16da2e913c5ef00833a8e5513ee4e7d6cdc849fd822c59886d0ca3695ec
+
+Msg = a743d8337bdefc4753f937e869a36439da1f8c75e1278c3f6a4a969d93787dac93293818b1cbef5b8636e1a6cb3acaac1e15dbe0841c8001512b689292f3f4805997ae26ff52f7fe1842512a020c448ed01af2a061f3638689446ed5f6bed9fc70726ce4104bc11142de63873fa7039830223e8f152996388417c48e0c1fa81b
+d = 09f6bd008c04b8823ccc3ee7d5aca535c211f35e9d9e7cfaec518b98647fbe6d28283de
+Qx = 70019957dac0e9be0fce6abdfc00ca737096ba2d2bea9ba570acab6d73eae2132d7eb06
+Qy = 559545f82741ddd1cbb9dab0cd06454fda8abbd9d1eca752e57ec05498b14e4189f1b9e
+k = 0fe407c226fb15bc63d37cc9840a1a1fb0ac4fc2939fbbcb6e1236831379d367669ffd9
+R = 0e96e301bf1193dfdd2815597e016e0a282d6e8f9d1d67a7f7e7d05288594f1ea92584e
+S = 07488687f13c3a2b9ae90536db7868f2bde1529ccdc0c84eb85c53ea979228d1fda7c94
+
+Msg = 6a7a3ad614a3a09d2dc5a80204815d0c6471057acc0fa73f3cbbf1801902c3e1cba3c1134a79a8ce61994a94a5afa85ae1a44b2cdcf5153f8625713c872da36aba0afcc5c2f26636dc3f60e04c256a5b023e20e2e7a3f7305bd5b3033fcf05368589f19021f8c9096a88679904b657bbe5b9bee67d6e53d176fce1de9e54c64b
+d = 150d2812505c82584201e93f6e0cb875d29dc7bd99d9c0f98e0ed20128886e67e1f1071
+Qx = 12c7750172bea15487a05580891aed51bf81548f4b65c51c6c54b990bae8857a20115b0
+Qy = 3db9e7a17dc8b24ff080d80842f0488f17f7d43a40ce6ffad52c65f5a875b4b33efe3fd
+k = 0c5c52dfb50b210ae13c2f664d958b2491bfa91ced638f925941234bcc4d66de1eeeb73
+R = 03887a270eeb515a59a7387d8acbb4e72dcdf13f317a6a93ace5cc98d69a79c64a9e7ea
+S = 0e922b2d021cd71e213bdb36ce3ebf56a34617d4dcca30fc05f238a1c097e38d7cbcf91
+
+Msg = 65bcd77a3ab345cc99b9c1300755288102a6ccf140bc7d1ad25df246ef01fd57a8614b352033b88cc6ffffe5b38b99ecf03baa365ab5529d6751a3c020d0198561969aade09091434d84ffe13b46df043d0a61e20a08e9c32b646771fea1b29e202d40aae1c7079873c3af494ecf6ef5eda855736c9338b4a5c29a086a8266fa
+d = 1b3fb9e1ff70f94bc9d7742ea535ca982215af3df381b5ebdf1db40c7c849a7978ceb98
+Qx = 769a897a443c41ae7a8c1e45290ef39c40887ab8f4aa3f9ee8f3096921222ed7de45739
+Qy = 72621bfa30973da61fb6d363d66db25daf818ce79dd3268ac0520fc99ca7917fa3a2360
+k = 03fa84ee38587f9c848b65b07c47551e27f15e7a87ed0ab705c99c8b7a4ee9e86a8e4ea
+R = 11b214ebe67eda2bd6e84c33be05c4373d2536e2cccf152e56b1569cc96d261e50910cd
+S = 0e100646cbffa016664bb57c1a67108645238573867c0b595c46e6053f844e5482a993a
+
+Msg = ed1acc360d02ee6c36bbc223d91bc1d2009a3e8f8dfc4c3796cd8555b0d2b46716f4c8058bf34c2d4954e098274ab9c2cbacff46a0578a14e77fe104196cbc6d2753e3bb5422b8b79fd004ac0aa920eea94925c016ece16ed4dea916fd92563ec65692a61b28ee84bef0007120bb1e31bb75b8ecf68406a71af9a18b4edf5320
+d = 147fa46fccf0805d14c1b84ea59bb8b8283d54ca0ceefb29b5585e7141340c55b7232f7
+Qx = 4ace4c65ce07fe5ec22c560bc553bd791434a691c2d865c52b5e38d541ef191ef419067
+Qy = 76250c829de137b6549d22a12f196629d9d34cdd83758e5daf45fae41872c9b15190ce5
+k = 18c4f89cc022236a0da6105f19c6661a8325d36fa285e3ca71c1a4af3dccb016cac186a
+R = 0271b421fd572de8a71d1b18ad2325bc0fb58cabaabacc1f015ee6b14bec49762f1f8ce
+S = 12e679010ccb143b7de0c3f6c82cf99a961a4f154be6c87abb111cde2d721d864d7a1bf
+
+Msg = 2debdb95a21d72b69c545988727366a42b819ca6398a82129c5e3772aea93fac0aae9a27b11969ff0ffb9dc0301132ca2452cd863316cf24ae7696422d4dc68e37316161abc146e86f04b72d9a27a350d8545cca245b2be43c33bb822dd813d13e08a718f784845df8a4ef49b02529871ec76bb3fc1ba31089359f2ede73e767
+d = 0fae097ea56b35a517be5480802f450eb832b244558d0cc922cd4a5b40b84d02ef11216
+Qx = 4f6bda2dcb9560174ffa54f13fa5edf17bebd41399a1dce1fe13e82a2b487eddfe25a19
+Qy = 76dd375f2c5f24c342a8e2491271cebf5b97ac666aacecc8d693a85ebd2a93eaccd4059
+k = 05e3a67091b9e10c7fd20fd70d51162e5d78555059802d0c3b133f49b89f37be6a119ad
+R = 0ddf93ef8797571af3cc9a66660c569445a2b5384f95a12d680c570694bce49bf2264cf
+S = 02f50d68bda006b88798d87c232f5ed1796c841074f063da03a471e0c00f08b10f410b3
+
+Msg = e4e0c6c8fc01244abf81e139c961b6a6e2d95de5dff1083e8a48b40e3e5b9ed909152c92b1cf2263179629cdf76ae553b58bb2e9223ce4f9ffb5f170f5f0c5ec97294c34a7529a897e9397f71198cbcd68bb4055cb8cd6b690290761b3b73303f82788379df145358afe28f2997d191d968929b7a4b9a0f6228797dfaa17c613
+d = 026cd72e6ae19b3f4c53493fba1e8082a8df1fb7da6dc111b47a41f713f49b33f618d0c
+Qx = 1c411f5e298c9b61023fb26765cf4132cc78ed77c07c3e815fd43032cdf0ae8b8920f96
+Qy = 35647b4c0807b287014043560d70c9b14651cddff4bdf6d44ead5e87720294ff8954406
+k = 10e9bc449e8480474afffd20b8acd6dd08344981c4a6cc789c5338ad7e486c526d6c4fa
+R = 0e81594f1064e018aa3504bac75946d77f9e745673043417a47c0c82488e224cc4104d7
+S = 111bf8635b1bc3f6cb7f9b685077b38d67160d143ede2bd8b6ae93327d7f55c5317f00f
+
+Msg = 04710947b7c90855ba4e59107b919d4a1df22b503c5c4c33b286b6b08e451e6fbef8ba40852f9f0ee62c9217abe6156bed46ad6f0e25f70f528f3a73d099338c578bebd6879d810e6e173c2b0af1f7caacb3531ff0e6a7856e4c84db355d110febdb21c683223eb5990ef2038d462ddb7962bc0feea5f850954943d53041f66a
+d = 198e13c7d95bbbb6e226688719639bda988867764ffa9b029018b5547850daecf58fe1f
+Qx = 30b511d719217c485866273ffe2996a19e0a670b7a3fb077944a21f63ca2f22fe5a524a
+Qy = 3a4d9a808e8d77c9dfcec6d033139fc33e67d7c8dfd7329c895bfb77f565391c37c8d8f
+k = 1721f1ad4adf3c32614feb7f8df3374e24f76a32e27854a57dcafcbaaa3082b13e461ce
+R = 14b2622432adcfed7c2ecd2b52e43be7f611680ceb4bedbfa9dd9af54532911a07440de
+S = 0ece991128b10399188b18933c0d185e85d111ad401baee5ac376b84c523f130f70fee2
+
+Msg = c62d07bb1ef756b6b2fad355c66b5be086b6dc387b37cbc4a63c841dba3fce65b09d3de8f239e3649382d172f065b78f8a53e0283cf345de06b4ee0b4b7d8611bfce92a7d993b1938419afe817611bc6df3ef74191e7e39ca2339fcb5b5cfee3166d09cd52a1a7d3779722aec328d326a11bbafb6aa417920225ac453146b9b7
+d = 19098a39956747de24ded56435fa1e6c30cc2b8088fe9a75f5d07b2f5939c7a60db64ad
+Qx = 68cf5a2023753717d89d12d6861c8411e6081c3158339573dc5598b1700148d00b39dc5
+Qy = 76a22dcd4ff4f062eeff83a58d2ce6a1808af8733ae254f5157efa8ea35a85cc744692b
+k = 142e4907ce239cdaba562d1fa7305bacff05a75e2927800c7b7ea322b47c9ea47846e12
+R = 104620d752b73379e1e5d35e5b24a793d7a309685c00f8bdb97bba9876999ed9c763d0b
+S = 059cab3abb0738d8af4ea6dcbfca6d0ef11b6e591ca109b040347d7d4736724953cd9fa
+
+[K-283,SHA-384]
+
+Msg = e4d8d49c9bc566261d9134d5e237d9cbd6b67d2619a9bd06b7c9c139e091aa10682cbede114e1d4777d9cd67a16b7d64278e99eed62bbf25ec5a5a8fabcb0a3468b0e73fd02ac6533e04b1110d29da3e34f33eaa228b78341b357a5d892a61beb2168c3bd5e66bffe3f2080a1e246f55a41ebf9d579e188d16991aa060460d6a
+d = 1636bd2be121e07ee83ac5e880cfdfca6a56f2b9d0badff003e872348368c7c2cd96b6c
+Qx = 007acf46ab68744a9baaa33ebf6be20c1c093242b0056bb9885d93a4a9bb4640f17b2ef
+Qy = 15415c1b671e98f00c1fa364bd69cf998c0ae140485159b0a341994a4e27000e108f4fb
+k = 0d0d4886c3500bff68455c41f5840d0313f33ac0155a693d27c66fbdb12791c2b5f8552
+R = 0256b8ff7d37fff7dcc8cc4461984a9bd9661643fd3a68d07fd30d426d10b8c7f4dfa34
+S = 1f516f8ed4372780380a798d2da04d691aec379483bc0d10560ca79edaab453d3e77585
+
+Msg = 2d1358fdffc14630fbc421b443d3c22ba10ef34f15c6c5bb3c73a9b8714e4c411de69b9cd6628fe2eba5efc4862af66ff916505023e0514f564164b389ea422d0f1beb92adcd65baf43556614eba25e43852ba65af78f62d64b36696519ef8284ef7316ea52c365b99f63a39e6701f81ad520d7445cfc0113c38ecdad4bf5b7a
+d = 15e5f555119c19b055b15b0c0d2813068bfc184f864e250b202384f5728bbbda1cb0f5a
+Qx = 13cae2f0c3ba04d039c42cae27de4cf5842a3e24be35d7a3cc7f05083f02951cbeaa63b
+Qy = 5d69ad5b7d64d6b19772a1794562b1fa5c2fea03909bc509e7d47b0e8144acb3c26fddd
+k = 1b881d95b7de9aed9fb5ff0085ca4da2fbd413b9b947066c98aa0257142c9000bbb30e2
+R = 176f9e3c9e9f98b2f5f352ca74310badf9f598f4d42cd2b26e5ea0999ae31e3c678fad2
+S = 1f2dba4e17470cdf7e1815d30771f352807b38080d44465f86044f5969b017c9059daf3
+
+Msg = d6336faa5c3e838f4fa58626eb353d4cff9ba8f0aa0e6c3d0d850e8b22f5b0f047afc97767f1afe2040b85d4e401ba688a4da7a0caca7fac450899092c4fea789231ba9b07782010720f45d16d353798867dd7fef4a324520014ad5cb32684ec50cab742b750e05db040ff51140e8d740f6774a059feeb493b10d8ac722f23fa
+d = 190c8f17bdd38669e345440d2c7631d67cee9c6548c4e7b9452377adb9303430efeda0e
+Qx = 3235a8b7981b3ff376b6b0959a42cb56631fbb9f82f1694b9e273e6b7131e758fa0d370
+Qy = 444e5747420d7f5ffd6119ef43b998d4ea4a58da13ff6fe7f241ccdfd4b6fd33aa93e3d
+k = 0b2a690793107257d7bdc37c492eca48c4c9650ba0d657e6eb62042b16169fbe27f8984
+R = 168a83fcc67e0c155f1fa2329363729872e254f2e0c3ef85f3b3c84fa3406de4191b6e8
+S = 18c0f8e6b486e6d7d16b4103506d74bb2021232c0b1638858295a63ca35e0d6d26a6266
+
+Msg = 07384a3f650bd270b14ca388a441af201b7767a2d47e9033f50cefd3af8257ecb38f5267e141cbbb2ab7327d8fc78cf27198ca3543d39553e178390bf1b921618432ad895e4f8153783a7ac22f4ca3cad4560e64f1ee4a7bcad05df98ea49a3847dc2143b27c243e48be59c869a547988e2205358e8db98b635ca21b745df4d2
+d = 0dbbc2a0409ca58a9e39e33b95fdd15080443c1dbdb5874bee991bd1b127047f08ec9f3
+Qx = 5a687605e54e49e3c40fc5ee8fc014a62d72e8595280a66ce7d367aac2df4d16b98deb3
+Qy = 30abd03dfc224f459dccd1606287cc30016be317c6207532a0725c957ca5fde692a9c43
+k = 16bc5aa29cea64ce3297172f36fe4ce820c943908c21c9967697db0cd93bb8a12e42348
+R = 1b1fdf26a6eb2d736b8c1ab165af2ac31a4c206c5410f61ac7805a68992dbd62b457708
+S = 14e9a22ce703d942a4fe2e84a4c1c1b44538a33fbfe904bfbb17af6490d372acae4668e
+
+Msg = 824f26dcb4ce0ca020982814d5c727e629cbeeaa818c49668f8f6d743f0d0ad362b24cbac48027898f386889ca5411d7d1f9afc69493b1d9ae4d7b695c9fa0a30bb59e6be2cbff79231767e96cd8bba349fa2f97955d56f05430ab4ebd007064e3d5add94dfe255b6deff19650883ce9966e1a2affaf84d9540f65c87ab1f936
+d = 05495e6c59ca1873f36b756579632fd47f9fb95b64f52589d70f2739aa6a3bf8cf8c198
+Qx = 6df40d8259be64c8ac64a28359290bd52e843f330a68c2b605ba4f777d7bd7a798e9344
+Qy = 458667cd7021b291c3415d64f9b054db71d3fe20f232f2a2286aede89ddaf1ee8c68aa0
+k = 138f05303ea63bad47c4c9a9d43c52c264725a668db5b631d9892daa1b71f62656cbf73
+R = 05e35c1f3b30b43cc9d60bf8779f3b31e053de0a390da50ea676dc9722a17ef00d68aec
+S = 1691ecfb826fef1ea0895242129cc3e9a14e1f84fac49d62ffc0a3455ad9c97becd5980
+
+Msg = 07de1e4bb9be15a710a74806d4447b093bc08ed04392d1bd5abb414f5f4b4d9d43520d0e46fc81c2a97e71086b28e53242449ed37fd7ed1c5772dbabc430fcf82ad20437b38eac15820421e51912325c872894452c3f8a10ddb040b35308e583c155c3707b52df467c4945f4e1071126ed46611a3253c297f5cbca9e27f58448
+d = 1724987c9b698519b6c225cf1261b77d0300045e5fd774dcbf13f285e6bd74512cb7edf
+Qx = 46adc9bd5f0cc0d8bc64f4ba491eae3b7f6fb4229bf94b804807c6137787adc0fed4b2f
+Qy = 41375e2c89da41af84529811ce7aef26b983ea8add6e37c32f2b00bd47f23f25e5fe194
+k = 02ea4ed0e87687a50dc3acc7f4c089040ddd367d1a3f470a711501ccaad63c201b87ea6
+R = 1be198a1b6e91453018513902f0a8a085c76a2798a2a0538ede30dab65afb6b9b0496d7
+S = 16342f87a813780aec006ee218a615c4e1c78c0c759d48d4094639b5b4c32a9658c4d9a
+
+Msg = 1edbbbe71057bf7d0bfda922be21a3a4dff57b017ebf6fa99651246cd173bdc9b11eefd048ea599c1f98e907932aa04f64ed0a007831f30daf186c88807400970904d6090b2cf181e0f65f03b4234aceeb420867812562e47f452152bb1ddaaa48487170d06e47c5e9a7c0faa4fe494663d2fec22f7665ceffffc214b21c6b8f
+d = 1a5489091cfd51a0970508ee3e8449081ed175928ff8386592c83043a7911bbc2f8778b
+Qx = 0aa1562c94bd16a3f8a1d6c465908ce3b83ba6711e7d8b0b9353d3c55d13dee213aba70
+Qy = 103a789854f63a139e31348f1b2608f1e71c88b5d42809f2460642ff46a470ad8573543
+k = 18435a6d3bc02b3019e1b156ddd6f3e1bb9c5af70d1a2cd2089e677cbacc21624ec8947
+R = 031f561b668aeeb4df43a3a34716c4e67232f56959104b7237b26e3c95dd40e15eb076b
+S = 0f2ddb6e6d18a7393425c16b3e5a5aa232cc48198d63e46a601cd3ed221a8427178a0bb
+
+Msg = db5cf1de38a5187af11c1f0f19a36db52f8417de997229e83072fb51a3b7152a3b383e9919c1b8427582e53d4e7e25433d46cdf01492021c237ea0a87d38c71634743115a6b2aba66d3faa8003158340a5078171e0bd55a6e5d8c7fb2631a31c1204e1479bbfe79ac70d5e5823af502922a900576f0088a33e42ec3e26c0089e
+d = 1a45ecda0788fbd7cb7a716dcf4c6e83d4148bf63ed58078690ebd238c00329c462590a
+Qx = 7a1e2fb4e8e79e3946086fa65042362418db0dce51541121c73972a435aecb99f634023
+Qy = 06bb02df9899ac3f207732fa7cdbc36a60c17592af7ce06b8df4255110e26a02b231800
+k = 1c986f88ba3d5109c0afa2c213dda8df462282f024cc8efc758a5342a0de91c40452443
+R = 1efbd9e0d912e170c9c55bfbdfa6106fea4a4e013e7dc26628a1aea4f6b806a51866003
+S = 0b1347f4f85adef612f5c3a436cfa59eaced5c7cfdbb69444936d71812a2ab2461bbb5b
+
+Msg = 4adaa850eec8272d25d76600aacf2cf66e754f6c5efa65c55a2a31b7bc69437d9a7e47c6f51c5da93895a45221f5f92c2e20ee6a95eed3cc7249688261a35d82872284900eb54dd1df6024ec48963ce43e8ed8b8cca8ed22beee8f0aadeae53726cca05443316537840ab824cd1b595f36064e9a19333748d4f4972178e7f5ae
+d = 11461776c33f20b176dc8f2b0cb2446a9b69e55b6c7bc7457a7fb4639116b452b79661a
+Qx = 043ba7157559659954ac58b44f19262bef9e3a00829c70af66d07cef08ad899d7f8ec23
+Qy = 1e8dd9c947b5a6decd1a26fc5d0eecc9605d22abda747fca038571bb37036d9034e8061
+k = 18b231de7fc499b461afed9b80f4405bc005011865cdfeb25570b7c0ff79b6ae94b6ce9
+R = 0fb203f47a4e2e9365ce070ee7fd4540f3f7e9ecf69b4400eeded0f5a7bf6e5a5c6d004
+S = 0e635dc65233f27b8350db22b90a3b8611e6fd1b3e0f515e42fe8788b1376079816308e
+
+Msg = 11d212a99c39fb5e4ca0096bbe6c81ae1490e1b8e07374b4e773bee4fdd24a3c13d653919db663d2c32aa4db140c4ae2d472d4f878946e527ad33b3dc93012d97458f96cb622ddb56f1ce7c2474ad0d5291dc35545de47b7053d137a8e79dabe06757ab53e26eaf751111bd27690e57ffdab5337eb6f81889e9d1b1ac729012f
+d = 025a65f627db2b4d6cf83c5b0c00265b9b63f7656c5e3382139e4992bcdf3cab502844a
+Qx = 5a35e7e0b914a3e01ce3a885192d2ecd27418e09898631de122db0c48e8b58658720fcc
+Qy = 009eab47197d5f56927848855b6ff96db7c36f810ee7c89b305ef780ba8c993d65537ab
+k = 18516ceafb61cf2c7e7c511a8918bfe394c7fb2fbc40fb3052e156cd4020fc674684f84
+R = 1892ac13b86ad00e38ce2427c8c78c93b08605a75ca22b3658132dcf9d9df7c4b5540a0
+S = 0437b33615c16a85ccb8c4769ee7c5f94122d31e2b5fe66291b401fd90257ebefe33818
+
+Msg = 9e4ec74c09528fdf3153a0f6955f20c70915ff524b2e19c991ec4c5b41ea9185e3e876a02ed6f27c9b3479dba951bee8680c4c99be1a626808114408856994be7444ccbd5ef9859fa479b1050bb836034e20c531b4d618f5843fe1d4b613a731895b489a2363f3f5397d5ff964cf037e9b11e3ff5e1c3d403e5a46b8387c1241
+d = 173b28fc29f10245221a907778708b3ee62e0480aa9051d4c3eb4e8d552e6aad5509943
+Qx = 24bb9bdef975af892ddc1bbd31314926a9c81f8f1864829edafdfe2744e793c100c0483
+Qy = 28ddde61b4361ced9c391c86c28ece9b902c48d14c61684962007dfd69d0468dfd65e7f
+k = 199af64f79ebbc5b789d4676a07c224e4f6fd33285e5a555ac90cf65d0b669bc58ced4f
+R = 137d746d515b90890a413685bd9b26a1c05efee4c11a4b40bb621c9fa2580c46c20a687
+S = 1647f70ab7c68a0f522420893a466940ccf79067b323d940369f8b8694ccc3fc0daccad
+
+Msg = 5fe8253d2134c434cb0866796013722e82184638b024a5a30938039929ccd8415c71f71f239c5c5a81f7a9cb493dde209f189bcf766c17c6d9589cd0c7de7f07ff9f24d2320669b589d084f8a8ea71127b9760b7355b162616afb34bcdcd416f1a062035102e29b70069b2b4dbf70179b8d60bc2ee5a455efd40194533bf560a
+d = 0624616adcd45e1fdc6cfeab2b17230d73d91fe0b39f4664f3c6891554f9b8e238257f7
+Qx = 10917ef84bd5c0b36c97cb5586d3057a34f2827f239cab2af2e6081c5bdffd48dccb0b2
+Qy = 78ab47fe1bd3e28055c688c78e617ddcf6c5060123e9d65c562df2e94cac973ab3b1807
+k = 0795e229185bc1b3d6d69b08189fdd7a822cd18ac55971e4b35e51838bf12eacbc50e2e
+R = 185483378a162b8edd6a12f44e3aa4ff829630fe3a1c9ccc66e34775f69bb6a94282489
+S = 01662cde6cd497be7966a0a77b0626ba3c4b82e20bb3f2e839178a31aaf440aa0e059cd
+
+Msg = db49891838fe23f0530abd4a4fbba5ea970afa5747f6a0a10d2cf4d841581ea2178705c1203f00cafec91d0a72d25448072c9cf7d7ca5580b39f8589ec63128faa95cb0689574a6bebd515049a1eb9699922cde0366b5cd58aa8f3d3e847706896f7e1cac667fbfe94b2eca9e7be79a810806ca4bf53f219bb30532ca2254c11
+d = 199757ffaa2c59e198d66824eaad37cc42d49b2e241b6a60382d05e425e800eaaf32470
+Qx = 6ad18bdb3e51cc053f56b9f9c35e2d6eaecbc9749f41a9ffbf54634838d7745ca064890
+Qy = 5dd77c42b31aebbbb46277176df08d81919ee0d9ddf14c3e4c0cccb207bf649c48fc8b9
+k = 109d6332ceec5ea211f642a746a6ce055986b4a2feeed7e847904f7f411bf8361318d92
+R = 1a49fe690a34151056d290790a6bfa7b70958e69e9baeb30c55efc61dc5dc4934f2fc95
+S = 1710a4ba5b404d65f66a8fca2751a920224db0cc0266f7b0bc054069ea4cc51b1f017bb
+
+Msg = 29d385d09c1142a7c181fe4b6e6132e414c15aa8605b44208c0399464613b966edcc2d46cf203a3f85d943d8eae658695dac74366224a0d0348083bec0106f5eb8809ae8d07f792fdd7c48fb1a25d5ef3bb9acd40b20c61c821024a9acb2ede321bd2d0dda849c22d76f421cbd8d51565d3c4266f666455ca1c0c3777aa44107
+d = 06e51381dcf21050aef2e9b97e35303cf3bd91956854ecf9b6b9827871d2efbe8201c5e
+Qx = 52fee805d7938b8b97459b9fcb4b80cbe29f20a9aaebc07ac019539a4a966c5ee41751d
+Qy = 78aaae02974de6530f285b4bbe87fd5d0c9a2ecfde5fdc9a3303e4b988f673c778004bc
+k = 0b426ebda6628125d73efd84e6bbab6c4c8fcf7fa29ffb3c8d6b0a861dbf81cd18d088f
+R = 1270045e963b59e4a4f1237c2240a5b26a7ba8e28ea01326fbec00e5d95d40e859d88b3
+S = 1d721477ee1df1388e1b7f92c048e5759c060ce1291098a2fa647974a62a258a189b4cd
+
+Msg = 774c1cb8fb4f69ecfb5c7857d46415568d88f1f9f05a4bf64a1e1ff6d64aec16e1d09292010d1f067c68dddbcde06ea49be2ad3838053f0b9c0c2383edc451ef0188565118e7b3c66a4fa372b96633dc8a753106283b02d0322df273d58cc9bd061ec219f1e1a9c8ca1400e5e39c1b2c254273377dc98a1a2c44e5c2a5b89167
+d = 018adcc22cb9a2db64bad3d60f1608c353e091637b948914115ebd43679904f955c8732
+Qx = 0630bdd8937e961d5396f9ea5310123a340ba316fbb7d79bf8573f27a0065c6fd6f8890
+Qy = 737a0ac1116e0e2979f973cd705588a71cec5e2a9f22e7e81fc61a4375624f55a6182bc
+k = 10a0c04762d02f9d3014bbff287864743426cee14daa43b22149ce73d1ba609c0ba6be6
+R = 0ac29b041a6b95f9ab685470f50445d416df5f7ee06313185794f2b542fcc00606bed69
+S = 00a4241b97b6ccf0dcd533a15867f5889349ec353395d47e31c9eb6b8785736b3e285cf
+
+[K-283,SHA-512]
+
+Msg = c406aa4295f85c854b4db2de5a7a2defae53a319866921a3673af5b48c85ef22f6eb4cef892c790d8e64530fc20c729b2821b5f5e515560b1ac764106560c3a6a05657e34cd6deadfe2884bd288cef4ca92e1f25adde7d68a30fb0a1b3678156ced62e466718e68e9d67099ad82613b8d06bdda1a7b867c2455422818ae9eeac
+d = 1898276f159c10d92d8d4b6ae214d68c72792a4b5f1f79936ca3c063dc8d9a88be439e2
+Qx = 394cf9bb273923c88be7a1c49412ab8599e0cc5509926102c122326bc0b34243f7d1cf3
+Qy = 72330906f47e8fe95f63d0f0aca1115e77fc702a923c32a16505bcd9021da05fd9cf63b
+k = 058772fbb30227a136de616ace4a0334be0996d60e9772ae9bf672b7c38fe3ee1b24f98
+R = 10e0cd3fccd1728e99e2294efd6dd4797b6492ad95a789aab7fbd177475a047f1e5d38f
+S = 0c5e0b2d1991718355be14bc57e2d6ff9fa63e0812b9adae69f64da610cc6cbe36fe4c5
+
+Msg = cb2809152f8258660933472c06ddcdb65f6d5221fa29d5b0efec9c2a7914dbbf9ce0a468ce146fb333d26f510a87a6bb01bf8816756a1b5df81c5f65360957cae84ba038e37e88777580e91c34e2f5aef4fb55af7b81ad28aeba05e0b1c64a15381a6719fd2c16e38a441516e1b394952d984baf9e051b1dc1bda2e12f8ba5b8
+d = 12ff37c808c3cc029a9cfbb67a5ed21f3bf362b49270d4ed0f1e38fad25ebd79f112a50
+Qx = 0cc00fb36bf62e777a9f6048761e53633b92866158200c43900db95aa1342b576029090
+Qy = 55d7e57221ad939f5639282cbfc203114ee69baab4fdf194f4d2a937d8a57b70b54a907
+k = 163d8eec726d01a1bbb19995777919f68689f7c2920f3549fef966593c4fb012a5c3a1e
+R = 0cbf5c3bf1ee58869e1d3c15a05c23217f1c252da97f79334bc79efe3f5c62164669ac9
+S = 1fd51644f471ea497b0560b65fdfa2fd0a6cef469021303f97753d22ce1993d1ae5b96f
+
+Msg = e060af96d4a7fe512bbf26be9a27bb6a8ff37547d4a7bbbfa710db24cffcfc760dac120f89f642880db2df6307f9ea5441d5932d49762d182b29d8e7fb067a61ab0df622f75cecc917e27d0326085d34581e052c85f50a37713e27518aed7c4434f86970e00a0a4b8503989e72614131b7164c1bdc82d2b6aeac0787f9838476
+d = 02b8c1fef9c6def32b5f4127273ce384b6add4aecec957c1662f52334f5ee97f49852d4
+Qx = 36a4fe1d77bc431012d25ff49fb5468f975353be70e7507d71966a0ef433df51dc32324
+Qy = 58d705cc883a690641f0ab85af4959ef4258a7ba9cde36dab77c125a1de1d395366584b
+k = 0865f59502382b324e1dbd75db150f342336fb19145fb43a733971da555ac5828a3457f
+R = 1ccb2e56c02cbe8038bf78dea256704ee6e51054668ba8c2ba11aef4ac6f9320d46ee8d
+S = 030e662c0e7d47cb3b835c63599d0c9c2e77ca47dbecd7ac834c2babeb039eb630cd0ef
+
+Msg = d235c31f0a82957a087c7597673970aa39321d4c2640685a03df8388b5eae4825d1fee29926f416d5e62a2e9ca1ea7cefffd31607e750fa9675983608e0f8dc895371b190574d065c5c0c23ffdaf49e65362914363a3fffbc2c1bb487cbd4f69ec22dda5c7dc3bbab805c81faa85787cc176bc0e5703924f395d8c9e7e7701e2
+d = 0afb1c45e9a9f02942b8e04da4b815498454dde6643de186625a98b3c1c6993abc8bba4
+Qx = 02fed49c59e9d5c09202a5dc29d8dd527a870a180feded66ea6fc94ee094122ae97656b
+Qy = 3620820bdd5910037f5877649be38db3571a9c6ac632602d2013d0d5abe1f00133f6cde
+k = 1fe749d9916f11100af525ee343b3b74a493f92339e432a482dc8e86ffb5affc4630037
+R = 120f6f13331cd4d1a5b9707483c74dc0722452062cd4534e94cf40840d22ae263244a51
+S = 0bc2e37a481478f879de612cf4a833f7e12b8df33f5b0d6ac5f5aa431678ff053e2bc1a
+
+Msg = 1a2559777a5fd8f269048feda82c4d9fceca95803f84a813789d6ed070422240e443789c5231d63d5268ddebc060dfb99c4eff2ff115d2984d8bbc5c05314562ea6864fd543e7e0a3b8572c017d8ae3563027d79bbe164d40a5bab354720e45094b9b26391ceb55339592fc2f10b97dc9c2649f7227648f5cd2fc46d78d31c0e
+d = 0ff537d73a4da0ae3a4894016b71dccef3bc886f3d24a5abb7dd96cf8fdcbdf0fdc5e51
+Qx = 01bd0537dfb29f727f91fb469c31164e1bb0ee192a5b89b880f3fa40e3e5437f0d2f9e1
+Qy = 6df9bab2f9198494094a63f2ea091f60108449f0741806400694a93702f61fb0351a81e
+k = 0bbc511c6e1772ca6cd1cd308126c18c5db498055a4b3f1cb0dba3285f6d38b083e647f
+R = 1ba756f3c89b732398b90bfa2f92b2a77159c530a8020b75cdb9697c6d75c18d36040b4
+S = 18207cf326bfe97d657ac4197ee5c20c75431ee552681a92a5815db0d984fe597700bbf
+
+Msg = 658c0d3f764bbc952fa55a258bac16a5bb5184bfa76cee06baf9ee6b9ac3f116e08bb2406b1dd4be487b057f3b29c2043ebc33019b2017c4deccb86f50ff15fc9248ea5fb64261120b1960525aec3cc18827c23291722c5add8a3761ff8516c61956c62b8cbb13f3d92bf3eb45a70704c01bb3625d21c38ffa83a6db086ee968
+d = 16000d2e879906d1040b32eb6ba3caff700e5565871ac75f10c5c15b509964bbe5e14c7
+Qx = 2ba89255d1c89e42518662611e2efe3b5e3b8043926ae9c43974ee2986185269246a433
+Qy = 2b87762b9ada81bde958d1f9b81246f49098695391ba3b4b3b9ac5727f19fe42fd07946
+k = 14e837476e628007b2df21b5035a39c24cd4869bb52dbbe13c9666ddd8a7e3eeae29f65
+R = 1b5091fc755c0f908ee13ef9bee40dd16a5710befd1e265a312e595842d52cc135fd722
+S = 0fa25f43c3c074d702e45d216e3704d942e9d67b3c0728645ac6c53b9be7300061e5fe5
+
+Msg = 4f10001e3517c2c1f973b555f4827681e096d860c4db08f1f4aef8000c9c24bebe59f8bf3d7d3cac959a1a5477bb0ea43f2e746b5d14ed48a58ef35484b0ac786d2fec669f945e846ad73e6b77a9e47012a951b398941566330d89125eb3c1fbb2f06adb951ff5f047d102fdf28b5cadb4a3e1a10412eb3474d2ed5c3fce78f5
+d = 019528d505bf0584628d0214bc857150a929d3f59619bf8f3acab545fff0977c9bcdc97
+Qx = 0cc8863e1443e61fedc61abaff87d80450345489728d78c333b36fa28d8754a29cf3ba1
+Qy = 0205ae70c35396c07f9f96aa7c59cf8a28aa2a365b4a1b68e7414d8c4ae5220c8bae9ae
+k = 13d555426101fa3c239b7830fe0b6cf08a1c01f9a991f806c84baae20daddf5dec8f868
+R = 0af8bd9856dfd783217cf81b09b464614aa824b0298f35308e6427c679607853eb66c7d
+S = 0e6c1933d6ce25d0a00effbaf1db2cb2542cbe7521330c34286cf3bdffc20c001cd7722
+
+Msg = c43ec3c3232cae59bdea7cfaf18a4672035dbd2b8b6b1b44ede376b36cc2d8baeb921e416aa177f5977da8bf1d713509e5251278b6622790056271715cd5feac58bee5baf50b216e8eb886279c5a384cdb696470275b7487fe9ac4c506706f6b0f9809d1ccb102546a4297d2017c2a8df9f02f30d3d1bd9aebf6a92a02e0d202
+d = 067795ce117bc0a389397fc22a01cfd9422cfbfb5aa44131938a8c45e48e1d5a718539c
+Qx = 07924de08acfae6260009cc2f02daa2fc2a809e6ab4cd8858a9e9c2c15b17e29f1bc5ee
+Qy = 04f36cc2d36df63474a579b96f6e59b890782ad8fa865efd80abd798ca2938bacbf8212
+k = 1bf3242e75f8331fe70113ec8e14ad0814850bb8cb262c7d0a44ca69de52d32dfcabd0c
+R = 145148d59c5be2b6d39dfa33e904c161456822ec0ad64b9dc52befbd6496c9303fc062f
+S = 0b75c3c404d694e086c0f5aafd534e7d8596601f675b2fac9384fca6084711e35149f9c
+
+Msg = 9b7d675a3d2cdeb280ea28289b5fc2a3ef6b535ebee8ad242fb031e2e1f364e8ee806568b2f8627c5a5b4f51f4f65c71acdc1152c08b9211b81907b551e0ff47f5a6aca45dcfa06f09bf195d19d7b165b52111b601fbd97b192f62465f8ba20773b1599c8041e91448eac7a5763ca0628f40768324c5304e1119ca6a1fdb0778
+d = 19269dbfe4184249952a651a507584746c5b62c64cb3b17e0158aaf4d086a4afb0330c1
+Qx = 6c60a475f2a3635fa523e1b138edc36f51e94a34e75989c2cacdf8949115d96f11ae752
+Qy = 494d5e23ba9071b3e52c58b1d0740cf90cee7b084b9ef7a4a7be8aa47ce7b3d97c8c51d
+k = 111f4dc771b6ce5cc2f42172d3d70fe77c73683bdd2ea331ff711b7e9d8c3e4f2d7d6cb
+R = 027f224c01847c52ebc180ae81009923ae3453be1e0d94b5c2934603577f36653ecfccb
+S = 1e7b771631e5e72b7ddfb9c73f684b93270269ba4216cf3926e43b2ceb49756e7e7e0e6
+
+Msg = f4a08daf8f66ce57a986f14b918099bcadcc4308bcde7c169ce8536a40d94a928cfc0968180a2c2a242c59df73ff79a03687998c421cf9a0e661630378779a4744ae2a6cd24ff61d7fcd6c11a4c8bcaf358075e96f864df0998ee98ee393b37bb38747b70bb7a208740959b45174a60153ee566e0f62528e9a5e4466186fa650
+d = 03835814de0d6441cd80a44e40350cc8bd62ffcc81e939a4410bb9c9259e30463c453b5
+Qx = 5ce9f6c979bc1d6bc41f41095b7677cc184da8918265a7f0e5b9dbece2ca9e0667cfbad
+Qy = 39a395aeaa04f5168de809164285974d306e474a610d89fd401c375c9b73f0d23dbbcf0
+k = 0b714d734d063aa81a389be69c56dcc23bcced3517e330572f79c769645e7dd2fd55c20
+R = 0e4d4494f91e79f2b1d1c0e22ebf744ef448f57c951f1b5f4da3592fe60008ab00f5f7e
+S = 02edaa4d8731b598c24b993dc5bb4888ea3c2dfe2807daf88170982667e69b76a8ecfe0
+
+Msg = 864647405c70939fdb4c026bcad53218ba1d438d82c9138f0f0ecac815dbfb242307cca52c84826cf6556c51082a23f14252dfaea43ba229f7493db2bf8ae9cdb0228dab9e25cf385b504b92cca94f813acceaa1f18de851b8936c4dfe9e4e17002f02dded6b4c231ea5e614ab46fcdd637b8c6193e8d0c2df1b3d883b97e1e8
+d = 0aee83dbed3b703cb6e60d51e373eb20e298ac005fa6a572d02fa1e6da0345558ad2a46
+Qx = 0dc25760af992a8ecc108373281bd0d246f95933ec943f6346c1b2b941a03b33951f622
+Qy = 6e35f02d225ba11d2ed7ea392898f78ca0deb2a47871eba6cd2be7440a410d910097de2
+k = 1df142187f8b27f4888075a3784aebe0fb7d80b0b6d3497a7adbb88cb6bd26cb82109c4
+R = 05a530bf1135ea6d599928cb0383f5d391d19be333b1577ee4eb6f2a78b54e4aac0e09b
+S = 06f3033cf392f698d1a1141cabf138c411f4e20687920f2915e17e805e8657a887c7953
+
+Msg = c87c8f3ad5c28a027b28ae5021dbe8d425f74181d519451f1fead7a1f9dd102fa6785b147b610610cb59bfa91fa363bb79ea602a7d7e1439f874c5dce748e5c320560c2d9676f3a948754c72b6db249478b7e19c9829ab4de2e344535d3e0b7c20c272f82556a280ef491524b255c4fafb9c8ecb87b0149ddd9d7bf6159e3337
+d = 17b65c66514019ff935e9d571a4e68e9ee4463b7b9a754b93f4f7741693f4399879fa8a
+Qx = 5bfb704629596ed05096783e49864a11874f319b4020917f1ba700ddb0606e6e72c1793
+Qy = 69194592be64c33c2f63771af0e4100d060e9750031048002680541815b311ba8f7ffa9
+k = 171b5c698175300b95dfd5ed8d3fd7cf4e19105ed7193b6013103555808743501ee8c46
+R = 13f001f287dd5c7ad9af8d0105b47caed66ede41dc1e121a602610ce20e41af91cbe586
+S = 1433d5263d5233c40c0ca526b3657fcce8cb88ee65105b5f5ec82b26e12bfff11c8812a
+
+Msg = ac7da7611e2ade20aad64b418a16e02e79ab4894d758550210eb10013a9b5533132be701f8843c840807c4167c38d21dff168d3baa65d5bcf285b73dcbb75819f8d7a20a849de335e19bae2aab2ca560b93d340731f291599a5b28afd7737460d291105cbba6d0290e836f6f6c1113d1b2faf90ac5de7c64e25206d79380a4ed
+d = 17d2071f39ba35515a8ec977ddd36ca15983e15bcda626f15af61d87d58114f4c80a8be
+Qx = 6f09c255fdaf78d7d341fde4586526fcdec34a28448c7fe65685a67b6c33564ce9249a3
+Qy = 24ae4483fcbe3f823a7ce53db96ef2f6c68670e107e68cee4f358dfa844112d6b2144e1
+k = 1403078da10f55724fe7b56dfc55990507307386ba82ca8f6340d33769ab1f6ca894bdd
+R = 0a54a35767a1cc77b2332b04694404fe5a31ed8851ccc2abfa5542b0f5acd9be9b1f02e
+S = 0577e0a1937172a6d45177c2b328d72f75a08a8a774a31151b89fd451d531348695d870
+
+Msg = 5757c472fa2f81430dd920f39b61066a28c870b80e6c96f822f8f19b398c3574d159cc22120454dcd7e97be8211916e4bc8db365b2dbb99a6e597d06e6645046a0abdccbd06741e9c0eedf33cb78d78a540c2a390719acc498331e694e6b0118cf4f787b51c7b7237458a6149d6dbd0a08bae8097e919f970fde920485e9a0ac
+d = 11504659e12235855fe55220287a101e511d39a627f8a0d414446385d4a88f31507fe74
+Qx = 192fb9bcd157c7ef385d48470c3173ccf1ef9650da7d680d8473d45ab2064a073232ac3
+Qy = 14ddf872b711157d121b0a61b88a7eeb7cd260f1f82ec5f62fa2681e28c7f2640e305e7
+k = 17e10962721f041946bb5ffcce724c9f284b1c8970f974a069c36dd4391adb8cecb8bde
+R = 1546450d25e2536aa14b8751e3b3e7eeec8a6c1cd967ba0f03e6bfe64c0a59072280636
+S = 0159c8d6499fcfe8ac7b2e84990a714d7888d883c16c016c4b165f36d62c3493afa67f1
+
+Msg = e350383d04af0f4081bf09b95d1d53040e7acc64e56b13b653df31dd119617b800e0cdfeb935dfa5d94f1d7814688d8ce41021810958759cec76560e1e5c0581456acd1a020165849b2203f1c11d318d816697f36a86b59f160faeac7dba71682d3c031d0d547725ef69cbaa28345512e38b75ab011911d8924b2d17a857a96b
+d = 16e4cbabb03215767249ba2a608708b78d7387be9e77f5efd2462467fa05e8dcde2c036
+Qx = 112b7ea5d21df8ce52772a1b76a52ef6f0da62cb7718a467a034618b7ce701a05cd2467
+Qy = 649e0ad181437b4eeec87e202d8fab1c240f9dd9b31311284c24d89160b1895be541319
+k = 120e4bce412311d3e7adb36dc11d4cc1da8a4b9d6cd5219e772b3dc2b2b8ce08833748f
+R = 1ff2d53a8e6c1c23807eee681156a146e8f2cc1a8c262850dc69dece31860bf094e7f73
+S = 1e8906c0bf2a5f922ca271def90d704a1425e5cacc64bc5761b000c7df0f8f9fab51f2c
+
+
+[K-409,SHA-224]
+
+Msg = f153cc61981a46d8a47d17d29ec157fa93fcf644beb84558db7c99c57fb131dcbc5b65581ced5ff0b29bfdc66ff703ecdd4290f7c353c02a3e6d6867f33f3dccd1a0b6752b8a35fa143f8921a5078af9c85b212564c5b795da9858c7955095938fcd10c21e35e1abe905e84c8b4bc05f2a06091ce876d9519b96951d08c7ac9e
+d = 011c6528939672bed3e8c905b7ba594c3ce95f37fb28044f210cccd01dfdb42c10e8e1a0b5d6fc757834ca7f08e98cbc52b0edd
+Qx = 00b570ec1fd09d7b4d102f83cf37129d94c9cf2f982b702c5d1172bae2df558008518493c08dac6f76a6646156f123c4f33e798
+Qy = 0e3cfe1aafbf25a5a4536d6c0cfe13a540b4a3c97d4e7bc6c0346addb4b0c32dce089a7a5385e8a3e67606b45e2062c642bbbad
+k = 027cecbe83853037cf46aa98e1e1e552a96af0bb24e57756d8239fea5d769b51b83f195b7801b562259ee644ab4047764d130a0
+R = 06a1601e07dfdff9d3b4ffdbff124b717403490853099fb4a00ea98f84ddd64e908f99b40a2ba6ab88b2491a8d948fcc2f207db
+S = 0741d27c0dddca3641b56ba1e9bacb0da1fcee46b9e33ecc6990b98cf0db74668ef1009a50e5d55f80e6642ea48689a529c8a08
+
+Msg = 258c91524423b5c876432b1930c7b07b56eb5e3945f1e2296a4e5bfb9b9123f800ad195d6104641b1f1970bca553c2032f83d17252e52403a9381c1fc18eaffdf026f7537aa27d84c5e3d6e39e651a92a41139cec5181fe794457f556b390943093be719acd23fa1ddf7ff0aaf0479484a381a309b4f681af74bf97caef08c22
+d = 07e3b714496dd118d8f3f597961eec5c43d0265bf85723b0b9b0616977e0acc2cf686cb6afa6cdc19114e27ab000e762dfe467b
+Qx = 07dea0ceb73b9bfaff7147a36436cfa7955eab02ce7fe9b60dcff3e088c5c9281be5907de3e06ebb2e21dce8bf3ff85feeed500
+Qy = 1cfa9b30af20612666e5df798f91eb4647d8f5e1747c1b18adc6b73a848d987434c56d13ad78b775c4096e9f20d4878bbd9572c
+k = 028a8353c05129dcaa7caf0343130bf2e2186b9cb5ed0a27a565e1c24eb882617cc299d486be76fe0f8f3c52678b6992288d7c8
+R = 034299ca2aaaad51f12c90e8205da305523713516ba6e7d245eed8ef94a1b2409b98ae93476aed6c9b9aef50406860b4e490db6
+S = 01a1adc76c65d77ea686d769dcd007c0101b4cdd0934402fa47dac22f8ecac28fc05c2f6763a6781655ed5e7d84c41157255a4c
+
+Msg = a16a0d6fd57240fe88c7c36b9f7f9040cfcaa9afc4beeb8300818c5f90cce73b819a12c31d42af33146399cdfa4ed4954d068dbb0f1f342269dd29f1fe357e7224304b67b0f924b794780fe7e6aa9dfa3380252fe7177b43e7b1789718949b9ec1b943c83ed4399491482f0f59d2cb8050ab6f8b5854d76c50651428cd29c40a
+d = 0182d1e937b037bf7f84144f7d4c94c935269c9aae7d500aa459a7a0ec113b232dcf282908eee4c84b8106cd38cdc41db3f89e1
+Qx = 0bd4f1ee6a967123d70d488dbf0fb43aa5e93dee5794b4492277fe559776f740754850477e275cee9f1c375403a4933dc986920
+Qy = 191a544b98ba954cc6e060ba26a52fecbd1f0dc7c15381004cccb799a9f7960a3cedd02d36fcaeb0ceb844bb4683998d776dc5b
+k = 07904af733742716366f8ba07086f924697ac8a01bb4895bdb5715081ee89eaeafbff4cec44eb0ce14e774dba71bb9b091d2594
+R = 0723b2068957c4f2ac1df69378fc013797a3b071de30b514c3e610002dc8bfced32bd2f9e8f692b653e736696cf818b0ecc1e10
+S = 058455b8f9abd5fcc28a4ef839ac0245c3feda1fdcbc3c171b6928c6abc931e8b0ec34382d63e414657e9319d2965fdc9eb74cc
+
+Msg = d02ff569828fd1add21f6bd1c50cbdcd09222e458ee79fd5dfdba3cbb84e9d926fcf196cccedece77d5aa17f8c8cbf3a9facf0f02c71d5c1c8aeda9d75f6fd7b6f2c5c70dff992ef6e02c438fb3c66da5a503b3c39acbe2a069da457595b542190d818015d462670b0807c401e36b1bfe05baff3a8ccf8d1f5f8de7840e87993
+d = 07ed09428f460724c8a5225a31151e031d9949493fff5703369c401762345d002c4ce424294baab22d9e71edc4f854510cf0e6a
+Qx = 07fcd003a8cde5503f5582a42738738ac7efc6cdb3813a00c072fc114006be9881c0a881ca35988dcfb8088f3d07a03943cf230
+Qy = 0e7041e666c1bed3b80a691ecff60ad4afe3a544ce58030bbbcc130045e2c611d65f322ec78aff6757cb5df8ad54ee8a09616ea
+k = 02828c8c4bb1722b0f03262de32ca8a605c4046badb20d8eb9f19aecc5c69f199aa48d09b61f285254425cb4bb5e0763dd471bb
+R = 06c99d796c5d4fa21c5cb7cee0b7570edc9d7e9d7c3604f5ca3766b17e44bc71d8a74ac268b8713cc2ea0adc3dc1971c062b4a1
+S = 075962e0ccbda2280e502559f48c8d37704964f67f8cd3b443b89be740976f1bd929c175560fc8cfb282661c0fa792a5b200401
+
+Msg = 57befce973b225cfce7f996fa5a1a43acd160681b88a87b7de04544eb7b6a719718f1ca7f559b6531bfc18fca3836d2be7f7a6e48387b7579a6845796d30e46f0dda9d82680f8c96c5f0989741adef9762c3db763cae2699cb6c112543635e20ed5cfb4b55ca2ccb32d2d13936085a8ff95ed658a54be73f80c912ccfe5f0ca0
+d = 0390f05b9619c27b800e99aeaf61ef7f6249367d5cfaeae3c7b523a8b29153eb8a77132f6c4412545a842d6deb7b7aea7e2bda5
+Qx = 1cbcfc492a2a6bb8a7341df67ef2bcdcd706afabad5e7ed1d63387ad9b0dbc47ed17b82de6de936752632e43c393a93fc5cec0e
+Qy = 111768994b2dfe9677d9dbc45d4b55fbbafdaaa2b2638ba1605c35301fa557d628a87d0a7febcad9f8eb4b51fc9c807652579f6
+k = 00b8d236a9f8edba7b5207b4c7848807b933b214fa25cfc5a0e73f750d30051264bb9f6702837b0f65a451d4ef24f047ec4e9dd
+R = 076bd4755427fda22a0f177624477c59de12a12621aac274b980b5e1ce5dc700591eec13dc5bb48c5c8643de287a07a48a6a7fd
+S = 065a5b0a00548bcd7f59518f122d79c7552ca6097f3867604b462201add5f326807f0e8779f2177f277e5ed25253885ca81220b
+
+Msg = 4277ba40cb462860ca722cb4ee71c61836d2ceba18bc91f3fad7dea478972c6da0ebc02815eaaada1d1a5e93d7ab353855ccfdfc94a5742fe18daee2328871e06c1ab0a9a989d1239df2d2d27f96c415e7ef9a941f06c6790675361173cc229aac7045f49eaca207f59c497619ba32e932b5c1c6576812ee5b146e2cc7de5e62
+d = 007d18652732596add3db31f7a0ce6020d03f3df58131b0c7c633faf619b8210cd309d6c0c4083aef1a1b6d2a756adad0bfe344
+Qx = 15ad0682962b4dfc8901a0dc77d548ed616286733cd9b3ede937cdf4401ab8b3e3516d466ba43b6ab5356c4e72845767d55d27c
+Qy = 17e4de3288ed44b48e7c47b16e2afb513c9763d5bf4cbf9a357c128c94a758e3ff946957df461531def2b8d8411b81f45f0c2dd
+k = 01a896c30fcfdbe583d6b0119f467f47758ee01d4d601eb698f444ed0f76515c2b8053b11ae7abd0eef7aa61145a53d12d560d7
+R = 053b1cd57dfdd8d1802f3e295e450a155c366bdc2bd222d18a4d08369c25e53f1f633958b22d80755ecaf8362d548b28dff1ba8
+S = 069339fc6058762a99576a96e76f75275f848102bcbc281e59fda26c98fc48a3f1061755e80740a233e03287f510f4549bb1874
+
+Msg = 57ff6792ed4b12220d179bc0ea57ff217f322c85bd3676a681d32d7e4a3e0c8e891fd267df17caba5992f68c35ff670b60b4bbdfff82404f6ed996c30539bc395120f97d4d7a652eaee82bd8f9360bf8bb73748b8bbda9f9480eb54f7eaf2609d4259329e8a5ea020521e7dbd3ec56f23c849932cbdf2875f5d5c774a9d6b0c9
+d = 02a91244ea4623b63403dba807d60b914ca3b901a2523244c322f2f11251446d3f15e869d086ebecfa1a39ce304e8b5c8de23e2
+Qx = 0b7ad8f0a52ec21e54e28ef603d76652dbfecc7dd2427cfaaff3d280f0d1f62187d77effcb433b5bd44c3d0c0d26c38d3f5930e
+Qy = 080641bb0163130be4444f79c500ceb8d6a9b2cac42d21d31b2fb29da075bd41c6613f278944adfe92d3c99d494be9d4714e9b6
+k = 070125c89a1262a88f22e874c55ed149de6d961d6abaab2d13db9174e3cecb8f497529957058a0afe5361ddf9d3a5a3b923c7ef
+R = 01a28cfad13969c6449e5a0f879e01ef7dc1cdcd0bc77d20f3989c588a9cad12a4b52743c12f4f6e2154ad963bf234ec96263f5
+S = 066d7f0b364a640c6c620e3d030448d155cffc9ffd46a6adfa1c13e1b01892463a4724465aba3eb07009fa604f3af18109cb72b
+
+Msg = f85113eda64478f460b60f8084220134933de049200a5f37884da7901471542e26690a5fabc3cbf9e679ade71b6e54d869bc136c3d34cc4a9efcafb777abf046b5ae5429136112a9a36a475121eb1f33f1f43481286fc1ada98a41064a1fa38c89e99a93065bb2a119348a9e452497fd5a0d2b83a66b09da9f47a0583732adf4
+d = 0068c56c6b5d50d1d4e13d3837d8c5e8ba2f825e121b63e97603fdfe78bb6899600ff0dc87b6b3b6868ad0d2f62b7b7a31603ff
+Qx = 0d9a4f5992308013573f97864c23b98d276975d80cd6455e9f0d8a62d6674f3aee3d27dec15903da4e9d5908cebeb765ee02c80
+Qy = 01f61189caacb05dfb982bcccd603a769d0e1be8f9223288b5426e7f88854356fe825f11a88918085692f33b0f4c61ab09a861f
+k = 02ea7f0d81fbe3d4c865ff5315d1cc38f9e9a8653fc91dbdf445b62fe09b30ccddf508783ad87c8a48a6ccd5c9e817fe2977f90
+R = 02d7847479c16c4cba834ce5962724f185be06cc04a9a8d710cc72e6063a7b64fbf2694f5b62de65d3d347d34c0dbfd5a4d93b7
+S = 069e32bb19d20e873d0e62b306db4d5663576e4b2fe75e8ec79b7a63f38c8f1007a817ce30612e8578d48c63b04b1d34904010f
+
+Msg = 42811e9ee6dc509572e1cddbe5baf00afeb0c5c13e3755b922eee9e210001676082bc9edc3d78db2b5bebea7a2c0cd2b369226c2b8f83b28f33fb513407ab9d287d14b112d6c3be2493805ace5cf6fd366d03cfb28f4ce3f0f060880db64d6962e997463ba7c05b6fcd1e66babe4b94afc5c2d38c7050c69571d27b66ef0090b
+d = 03c88084f8b78446db431bd6e240a0c050813d2a763675b0ea869cbe183df697146cf29c03479af3d34587a95cd257027fbeed8
+Qx = 15a09436de00d8d129e297ea60e04b704c0a8183d64a77d1c527189e25e21d6bb62be8ef5eb2dbd833e5f9c7d5c3e69c9c01882
+Qy = 001c32ba376d2e9de28fca644b0d567ce1f4ef0aaddb2adec6213d03bc8cc99f9140005bed3cb6c3c0f5533275734aaec47404c
+k = 0132f4763959863a32919eb591799ffb8613797bd0b617c73654ec9eb32e2fb86631b66e28e1b4cc4aeba65ba8c75aa1cfacd73
+R = 05fe0ccbd430d9459e0093cfe2c1d1d3edff8c1ae7111299d2e04f414c46ed2cc88ce9cc9e23e187e87ef551de993f52214d609
+S = 0557acfe6347baafe031dc16032c45559693e2793d9b6d372670b09757c6f4a3e5ae5e55264137d1859c8d9f8f03c25de409bf9
+
+Msg = b38f76ede7441ae0887e689d556f43155b38dab7cde487ce9ef9a46f2957c830d4d28006873fe2368197a6931f6fcaad755102686a457a7edccc8d344e2d2a9162e3d71d41c09a022539ae6d404955a6ad748231aee1f974d4f159940532fb3b1fa0254bfc5805d2fc68696856fadea386c542d3cefd1be3af04ca595e54be25
+d = 051af7b63bf3297ae20517faaa1552f4fde65819dbbff6a52721611e5b7dc1242ed6e69768cdc37ea8cdfd1a5971f06b84b5803
+Qx = 09cd1280a2a79b182ddbd1712dbfd12cee3345a89636d7673a5fc3e1e51400603176e27d538e90005625aacf5cadcc8a8c25532
+Qy = 08b5aabedce498476b4c65ab3cdc81f819c2db670a7236c0357a86f9087b83e7568cc6e5139fb92f81975756d7dc4f48be87df2
+k = 00bba308a3eee9e3ab6d2482bb728bf44cde9eedde15af7300c57c2c1e6fed2ee4e404aeee3923e7871a2ff4ba6df64f9d01a87
+R = 07a9e69664b7b81edc5d47c014696d194b2ca4705b2e79af692b285ec476169d041dd9eef20f7d496fc49b8597574d2602757ca
+S = 01521d7cf6aeaf1c8dd54a7776cfac02967983083770346d9768a2629d606be90d58ea82377413a0fcc3e4e66f05a0d05d933ef
+
+Msg = 356dc86cef7979148e995fc5abe2b14a7d5e4e42c9b3509b4363bb80c581a66f4e7e4aa53a4bfd37f9a7eccf75fdd726f348f6a3f779e6599f61bd1d668517f40453b39bcf35db0852a6a6218198f52b7ceda2ec55fca5abe8e5d93af9a42b9ae4de9530c5870211bacc27c39aa094013db703de2fd3121f08d7e97dbd4e8946
+d = 03d65bdec48972d03811b78150a06956eb22d337dbec5416bbd8185a6322cd8c0ff8000210dbd1326422289071cab65175f5d10
+Qx = 00c9c1bb0a80c4b4863d78003e21ee60fc553ff72968c165f6eb6940250a6cb7d545c6aed3760e42370df79b0d37c2d1433c486
+Qy = 01a9d994828ac09a86c18b9758b3f6b91a5775931a7a6e4d8b052204c972b993a3b420eb8ff7e91df77253a9f5847c5968b5636
+k = 0156d12708324cd30037753c78225d183723d3f15930f23bae854f121094bfffb5d7dece1fca93bbe7457a2237760aef3db8e3f
+R = 071466e80e2a7cd8e6cb6dfde259a08619f880a71899c58bd4cd33c29f7b321d269533720101f2ef70f5b8e8f05c9cbe1ebc303
+S = 077330e08712ad709f855d92355cfb7d565efd806c6a853712916f7c943bfc79e496366deba79ef7491abad23086db341f339e5
+
+Msg = 06fd39a50bf25e89f1071ff81fec5d1e35b6dd68990414ee403dfdebb792627b6a4ae3d2236c159e4441ff90b61ec87b1592c538515f0486b19e58583394a05e6411e69b4285d6d6589982ac0eeb2c912c4948789cad741183663fc070943389d4e9a1150b8f6088fc50605915e9e24b2d98a1f539024770e4820e14ae42ea8e
+d = 01f1a8b5f35dbbf82c102df550c72216a243f986f0325920f6186a16d1da74228cc02be6024c7411160c183c923c743354f9438
+Qx = 157ae8d90fe2416f70a7ce0669acdc0b5064ba650cb5416e59e6672e45b591774ebb2f793c3a58e953da1ac08272d0b949e7b50
+Qy = 06d49b9784f8423812967b857e25dc3af1312a6ff29579f6acb6e155b6848ffac6fbce51bd2d41a22ef955f690e2487a4bbff00
+k = 04cc45e00847818397c6abb3d176cb8bd77814abfc253e3b0d799dff2c3e09a5195ed5e6232873f2783c8e670b52a839e06bc30
+R = 067b418a5395216b83ab00d5568eeb62ae0693af2b0e4d052c6feb70562dcc06ef852002687099dda114477871b924775e8460a
+S = 061d1e4d713689b2036272ad41571759b52a78e0f8a84d1f3a277aaa33ad558f0b71f3c5a99d403e49df1afab66059db20f9f32
+
+Msg = 6daaa41150ea252a3e966a338377307d909b95080e006f13027f2be5059d9208930c5a329994c0b794ef50eb059bc6c215f68cf42260bd410f9bd86d2ad5ab7179c7c92de4a93a5f6aa17de5aefea815e7c0b78a8cc53c21dc4dee037b29c9df4e12343109283ffd5d8a3b81fba1b5e95506c7e01ac056c86dd0ee23bc21af0a
+d = 031dc621200cd174193d95e9092ffb86189c52cdbb9ed937593f2cde7c4a0264b9100e1b8407336c8dfb5520d28a18dc4e39a89
+Qx = 0904bb904d50bff09bae5dd21f425c808b41001ac917b022f7e1cda6e46504781a69baab4a6f0f100c4fff9ced26f871159cd30
+Qy = 15cc300b0efbac707635c72bf855de4290f1b8b70c16f9bd0cb771ed5c760ada04d0ff648f118d64e0aff6a6de16def15cf7437
+k = 07e32b1fc1cebeec3d84f56a67c8ea2b78723e7010a725ca4745e849e573e8e4a4ce11d1af4ee508b80fb5336de3cb53161bf44
+R = 071cd81dfbacbb67be5903cbcbe402c0420adfa9d14148bea600b178fd06278572d34eb46d857085a2a4f48cd4ee9109d607dae
+S = 0347b1029e67a6ea2a45af1f7410dc951db813eabfd3c7f3e2c294b81e1c54fa8c98569efc580b68007bfa316424ac6eb353ac2
+
+Msg = 6378dd1c12c5197b57d47dc46a67949bdd1e0809004e94d49b0234126a08ad5bf8723ebfd132145813136d8b7dd096f56c34248f09a65c34f60c2f80f9a51b3795f3d2518b11aaeaf6dd45a323794080b78f85d629e5fa719b6ab0b14c78cd908befeaef0dbfaa08cec9318bbcb376d48b11b68735c9554a45293db5e9239ae1
+d = 016e6750245a88340b0f0665b890459f8038e9b1366f2fc1326245a88d4c523ec94429f21869ce3dbf75126e58f77241c99efaa
+Qx = 10184fd47e8e1e4d534ca1cf67f15bc8a80921b07e251c22eb88f25395e08d7a9283774aed204fb5c14aa13c63a94ee691b4ff4
+Qy = 1252ad972bb8c0b286c222f42f7d42ca6561bac5e517921bda53e51043f13e711da8a813bb6880678e4d6a16820bab819d62e59
+k = 07f18539d00152f5b9a75d4f114812b87024e8a8f9c9a8d12139d0a74d87986f4305bde60375918ff2dfdb88b6deda640e17364
+R = 0735a15e7bd1f69f4e90739d42ae239a8e9238ad28b63ce291b57cb5b99922fbd5dbb7f74fcc23117243efbd036eded6ee0f28b
+S = 07bb3dc77cdd4138a02e2d5fd4f6ff8516b4c95b8255c629132ea8705c399fc60f8fb660ed3aae52db283aabc3626a5559dfe85
+
+Msg = b898d0f9bd80e083fa541f457d14d853bba55b120424a95e1d9511c8833f48444329e0349d68204c4b4581ef1c4dee23ed0a4445727a72e1e6cde422f7c10ae132a3fe681f9d741fda263e73f7cdf10759467c9d76164086abf6780ad474772771eee22d195339bb8f6235e0d992bbe282b13ce4fe01417f507a2c4fa155e108
+d = 0788fabdafeebb72f6385301e30024b56639e629a400f9c50d402cfc9b5817844f06a451fbda29c7ece41dc9ffcfc625fe0ff0a
+Qx = 09b2c36d221d18189e1617cb2f2ddcd64cdf8a42ba6acc55f04e9722b11588f7fa861a3940820d9dabbab631d7fd4106c60f37e
+Qy = 0da099cdb10dfe2d7c0a16ed332b459e7be31f44b0b2d595dc948f0b073ac4e439f24f215fba5ed50aef3702731d6561eee1986
+k = 00581369aca680beb705f52b6bef075de83ad29034c3d6b2949b551a0bbd100897a079b49d41d5030e1a6950fdb14d70dbbdb41
+R = 04f62415c99c8e6750f9c41c31cf050eb58f61f62eb0b0023d61dfc30e7879d4f5a87e88faf55522631a29fb69d16e15c354323
+S = 06df238f34b5ae664860b43ea11defe3120591cfa371367096006c03e83d372bfb70da6f789665136b7dd1c59894a2fc5038c4b
+
+[K-409,SHA-256]
+
+Msg = dbe04561ea8579672a2b3afa94426a3cbc274b55263989d41a778bcb082da797d84d930ca847a481789524940701cd5f1d11b460bdac0bffb0b3a3abe1ab689c519700de85a0a571494ba0cfc3c865450eba7a9e916b7fa9df55e8a1c246c992e6a0b44b78274e008472bed8d8411633e6520e1a906c5d0c8aafd572fe6f1f64
+d = 01b8dfd64563dc219d6eeb53f2e3ad1d771140d0960b211dc1f757af5e297dc7548d6133ddb574711d466688f80dbd65a7bbcdc
+Qx = 1ec530638ea0663cd3a9b237dd66402adf50d3094391f2343d7d6c52c1d14145c245464a3b771e4b1894462fbfaf440e53eef7e
+Qy = 18349e244b24c8353811c29a60d8e02caf195a424aeafdfd0361846d5ce5eb83da1901700f00fcb85a0c2543b49a8a3ccbac157
+k = 026a26cd09c9329cd45ceb4c798846dd81af67759794f5cadab84de19a835f8a0ae49b12853b1e92822477a73891f85acce4216
+R = 04d83a5f9dad246717135bec6e386ec6b73be9ea6d1a17334ea2003a723d510914167d136254d6cb64b16ef7eec5044b8f2ba28
+S = 03e81601d0c66b507a491c530075edc5b09d770633a4c2355b3b1c7df9b200ebc7dcb706be1696aab70d4c6e1c4a7e532284670
+
+Msg = 48a8300820fea2ad83c83f7d6b24192715329c3f159d56644e11ed25efcbd3d31600a813b909812987b97d1087e74a63b4494cc031c63492b6615e9d6e5b36f62cb2ef88b9f736595800de465789f43811165a5fc093ee6d776008739de8de2a84e878748641be8bd52e5b891c4145f52bbd46644852a43108e93d86352b2a3c
+d = 0422131829608ff730c24ddf7e8b4a2600eaa9681eaf45432daa7d41fe2fb488fd0199d431a1ed823801ce21f4f01a4dd4248ca
+Qx = 06ff24eb0ab812303bdc9a23719caa789eb75775e686b9511bf6e07d60447d1601a48ae7f3041cef5aaf3ed2adb6feb422fbc54
+Qy = 09a351fdc9422a81ebef5407d0d74b52a348caf3cf6e1c6c2af722c408941de154619a1d54bc23a9dfc0c4964f3936d62daa6a4
+k = 0313ec63c34ed325d770664aed3bfd1a16eb636516eb686e806b0acf6f0d117998b30fd52068a36f03d0db3ec13e6989c6f196a
+R = 0088167f96d807bdd61e65fadaf0c56b623db42b831909d12641e4d00e7bca6077b36cfa759fcbbf087c31f294f20a09e0bdc96
+S = 01cbd06232b4c73cdd13208dd254ebf9351745ee6196e3a94b9213e931f141e4cc71f3d318a67e7b8060e11e88783fca0be41cb
+
+Msg = 276e3a986ce33256014aaa3e55cc1f4c75fe831746b342eadb017676b0cba7c353b3a2b554522c12e6aeaf1364cd2eb765a404b3d0aa61258194a30219d76d2bfa98ad20e7e91756cf65e50d7914157f283f2ba3930c0ad3a97532cc747b1cb9c806fff497f0322025a3d02ff407fc7b5808585b91d95523c9d5864efdf7d983
+d = 0095ae8e4c7e55eb5da01acc05ecfe72a4dcd8ec152f1c8dc165014f70eb4e4a7861aeb2b96c418b2d4db58659e76184e013a49
+Qx = 0a3987d7262dc30e8ec11458ff7091ca993bc61f142ee535d544a2c88a47f9601107619617a5e65cdd6d5e1a034aaa223044342
+Qy = 1fc8af29d5134ca9baf92041b6d6aefabccaca4013c55c1581ac05db6141290235ea09650a289907785d282cef1b9efb381ae66
+k = 066015a77c99015ed6983bb379772bd90e03b9c010e695853ebf8e461a20fc12b20bdda47eef856f162dfbd9fd4fc1ec49105d3
+R = 067c49b96e5bfb6a6d625346c3ecff13b8c8b7e59c764b73b256ac970aa4056460000e599a8195f2d235a75cee8e5634acfa7ed
+S = 03ce25ef1af0784645f0579da381542f5b8aef377e5b79193314f84853e2a07a4f1aaa4d8210f3a3c249a879cfa3ea8af43a929
+
+Msg = 6a4fc1827c3a7256faa8ec6a0f3d23559d6949f8cc20e7f76111dc4ebd59213951cbf0eadacaeb8862d6baa0cb298645e4314b1c303bd0d5e9893304d4b7fbd36ab05fb6a5edc3fef763e3a4124d61539eb616b359c5cb55b5e2bec50c91dd95fc39ddf521aa854216eb5a707819fa6f067b316a17a3b146e7cc2dd517f7d63f
+d = 006f2075bd730f34df111ebda919167b1d3358ada32cd6747cb3353bcfb814a77ac70cd51b31a0e538539453bf9eaf9d8b384c9
+Qx = 0bbc153deaec0bcc36c03d24afd20dacd9e78d104d94c279278d04b597ccccae43cd3e64c9e1e58fb5408f376dd7827ede9dc3a
+Qy = 15ae0d803acf12d9d3fd41f74357b1c93cec0480f2e586d0e18f15e569d27d3d106e192ee0c1c570351eff1f463dc07d3bea933
+k = 0314330098250e38145d11a48f5043190c6b44f8572ae57cf83b1f3c4c03ce38b90ed5e157464c2613c82943d78c938fcde89d7
+R = 0160b20c370ef4b9cca3f7dd3c23f70efe6bd80751ca021731bdfb0f45ae07e5f2144c77795aafdb0c3a92ebbef75fb2d334dee
+S = 045188dd2402ad36ae4278a9910648ed5e71d64737651c133aa89850e3bef2207d58ba4169e471a4737962f5fafd50a37a28e1b
+
+Msg = 4b088199bd8c94775d8ee508377d672dbf50f6d2c7370e99821ec8f9387492fb2eebdbea473ea18465565f79e2af418555f10c4a527e05a9e20c9c00b807dc8b350cd4ccc2d87e91f66addf02ce4f43597aa258ac6fbe9365cc2c8e8bbe5c884abc929710e8423cd6722a8f473bb55804159a92a3d8b6661a536b4fb9293bb0a
+d = 03887d284e9ad17d38bc6da9d83c192a434c509340a7f233cebb032b09ab7c4c6e8730b4a80844898616c9abcd16b753c6bb4c5
+Qx = 12a6d5c5690ebf14ecfa54ac97b73e88e16e757c34c6bbfdc9a3a119f298860d330af295756dec41eedeadc5257b202451faa06
+Qy = 19f40ff28bb72af659d5319286fe21f01819952d471ce2433ade745042a47c2dae798199c364ceb99029c2dd5cf57ef5daa2b00
+k = 035945b45221300f83c5fafbaf0645a7386e209d025b3e1dc367819728f630663fb732b251a019e08dde0f64dd3f60a10065c50
+R = 00c323c86e8cc548123d1337936d4be948bd4bce4631a2194c2bf04e1fd714df2c90e3681e41a21d58d9567a5df9fc478dca8e8
+S = 0493d3f4d22cf8517c301f15bde52cef17c05fed2482f3ef15cdbe32c5f0975e054d45b13faf906896201942f29e5693bfbb229
+
+Msg = 848a13465ddcfb2dc14f7bc0db0756832c22dde1e31e4d8b3ae0dd1aafbdf15e954889e95d3bdfd6e5ebb6171fad62592c23277a89e8ba53978c9b1afedfef7e1c3f6d9f31077530460b47834b30bbd84a4da601be988738aa815d3d7e72043243a5288751ee08b4815a017fb5d9bd55833698a0d526b1ed79da35ef0fac93da
+d = 02ea5430610864257c9dc393c3addcd0d8d5bc8aab1067643b08857210464428aa85cf1ae6c743fd2682255d4c8eaa46ca21e73
+Qx = 1e502d3f47823ac7207861855fe6f6aad1fa4f2149bff2643b079da23fb270599f744669b3c8ceb4cb0989aabd43d26d93c8146
+Qy = 0cdcfc138451bb59f34dc82b8128088b5ae0cb8a77dce1895d5ffdfc8b4be24a206b9856954508b82b80d0163b276683489074a
+k = 0426b90275d720d19c6ef5c8c74c568a636257740530e3ad10de0d518c4eaad8bc58cf4506cf5cdf7f2b03edd1caadb28fa3787
+R = 0123ad87c094c4ccfe4346dadad54a6b1ee1bffaa1b7b9094fe2e6ae785a2b77ce3f5e568e43e8b7fa997206262645f56078657
+S = 00d56cd5cc64736ff7ea0d9840916b1e1c94e11611f93b1b11c2ee98c79d92a8af1a560c9938dc4bdd0b84252e259ae5669d1c3
+
+Msg = d1850545c04ea65528849973c220205c35eae98826d169348970d1420b4d872ce233af1daa9e62f6a562544ae3a0633a954a493e9766dd5d87e47486559fdf86229a7c9e1726de21895abdcf2422d438f4ad98d88b45c56742694ad5e11894253270997c049f0f419842482f21c792fbe5613e2defecd485585f1835b6f4c578
+d = 062c757c92eaef41f5d81169ec4968145b5aa2bc1d2a3a5fd000634777748ecb93677b3da12e3be33272a8f0a52300f4a5a37c4
+Qx = 139660fb8bbba59e8f4e95e5ee5b97227220f0e1b293901fedcc6dab86e7c5a9d20c1a097ee2e926a934cce679fb8dcd8d2ed6c
+Qy = 08ac510ddf735184e8fa9693da264194fb78da5d1cdc0bf5faadb33950ca191fe233eb8dac8adcbfe15b4f7c09d5ddeef6bcd1a
+k = 026868bf1764993d650aaebf117521cd146ea20067cc14a5843f726a3d68e41c3fba82a83d406b2275b3459748b3bd1a8d32f1a
+R = 05b17d13ae4d9535d062a2653bae4d15b9b859a87c33e175adc3ef04781bced888f3e93e9804b2251a40b9344c0f8c6bd5be0ba
+S = 01ec3322c5beba4423b13a0528c71739a6b39f7b0e0e58a8274a8386167cadef51e5560a3e9d97447e3d3c06288459fe6569345
+
+Msg = 421c9784d6fd507c82904e1054edf9bdd1efb58a0b211340086069ad38b7b0dd15c2345fa8767ef71254ed1bd5c35f742b1d3f4765ff9007a5477ba9e5d3d5a5cb5fab4efc1cad73701d4776c6c4343f42b5d94a9eb78ae428dfe5fbdd8e6ece09d5b75cf4346cf27db856352225ab04e6ea56661554fbc39916accebecb3935
+d = 048a313c0c11489939fc0cffc6ccb9f179093c4e13141b92dbbaac441b7ae878c9d412066e95615174a24692555cbbe904a14cf
+Qx = 0677c2d364fa86b8b0c79af754e675ea3e806d5583e62087e01590b824d2730e31326591167f02bdd29f8178787c4e1ba9d2496
+Qy = 0e7f78c423baeebf6defe9feb8ada8874cecab083ca2e71d9d8a3fbe846eda69262a1f5b4a3baccaaa4f2cc87220edb1fa6b6bf
+k = 012b8df87dd935775b80c62ed6c76974fa5772939a9e7372cb74e033fbae4f78d75b8bfbb82240cf91009b5bef4d63ded04cbc9
+R = 000590a9e8de60b5cb181a1c11c2f6115c66b05e71e0c558ae203ee18e54de68016f4c7ed2f01cb0cbaf1bdc45218c0fe2b1552
+S = 0521844eee9168a501e235de5fd19c84f052445fb0e68bba687ace45d8630070ddd3b73034d1d65788a51acf91273fd187a24ed
+
+Msg = 7910bab15b6429947655e33a67f41b76f1d7b71534f8904d6a0472c2faded038565272d0b5f51aa915e0d624e9ff48d50ebfa2f09324864f26c29ab73eb39b436c5c459c7cff4d2b62992e3489cb4ddfc05d7366b161a463aa1b782641d93507de43c8cd0a0a0a9d1c644f4554e3edaf7fd794248110ca9387e73ae5d00d299e
+d = 046e2adfe5d3549e1e6fa1fe69a7cbb4ac9b111c8903d544268f8318b0b47d4b78fe3e56eb5e639ad5382e7cd5bd4b2c3e70ef6
+Qx = 12902439be50c97aae7b40328984934d6c843415f76f3821c8e8323aba96ee41359e2ce5ad3179063ea5e2c7deeda4d728d5852
+Qy = 1eb59fe96b269cc973b1fe1f3720aa9aa6ec4cf303c5cccbaaebe6ef7c9f5356ec5e76b26b09479d9831d9f5aa41ae1d61f4c47
+k = 031893aef1baee0e21b50cff7002435b058d73dc4d8301ffdcf1e0c315d18c2b16f282e5b294dc88369b25e2a1a19abffb578ab
+R = 039281ef10b9a2664b755a2db67b3c410276a424edf7681a5c97244eaac5826368a8095f1b9b76f8e490e2783694d5bcf3565ea
+S = 039edd50721dd35d1704167e8cb609f309b9ed73d3c1eece181f9582aabc647c5ec8bd258e5802fb0647372e4c3929cf59ae2d5
+
+Msg = e6fc96e060b956c25d50ad25443f3c30a12d199a47451a49ce88307201dfb15ed816982e8888a28daa92eaf3c5584ca6ab2ca9e14577f84396de2e0ac214b24a2279f5e7b344fb7387e9afc8f0a2b77a4d024a20ce6183499b17096947444bbb753d9b39e5c694239d28f9c454bb05468d17ab564ee6cea3741747ccb7f108af
+d = 0480103fd6180a431c837643566706e2b9597de0a1346a224d176a5b2c54aa4d064418ed654a5d39f4773fb509f86473ebb373f
+Qx = 1d39e2772ff3d26c5936ab347bd5a2940ece42b1964f030c59ab453acd7f44716ba9d88f0828de1a4e730ab27fe1859915818c6
+Qy = 140b1b66b0a87de29ba2cfa799d944b3b898fe7ac43de68b01fb41464506e2f014e0d11bbc0c24996428c93bc1a5ecee5956bb2
+k = 06e9bd0290548d35168f7db7fc292bc161a7710b78ac49ec6a42c9423afea1310597e5978b22b4dfa192489323b2317e4714d37
+R = 055dbf88b6221dff098345226d59d396b6773611ca6e747d26d5d758760d830693df0f5c602859f9caffd0dc3790dfa08c527c2
+S = 03e679447b622c4b06871f2337f5a24150e76efcef9698c6fd463867508e9d7b803667c32989a881c98a90998944c070aa58b17
+
+Msg = c8a8a0d41f35537e6fd523ee099eb45e1ad6ab54bed4d3e315e20227db03292e39dc1a91bab439c0d20e36e7fea6ef08983f390a6b5551ac3b4f1895220b2867fab95552cef9bd8702962839bd9b2c72772640e7d3be3c5889d226acbefdcb448432bc503e5a5fe7ae9ae7696c720a799f9882c64ae0385f656074dd8a6821f5
+d = 013c489e8311c6bef02c8f58903b2ba2a98a27cb935d75a30d320af9a14fa3cbc6adcce09235a9eaf333dd05f4b2f1694985dc4
+Qx = 046a1c0e7753cb499d19b2805df770ba54f1c6e03611c302c73c72902867c51c1cf9ed154b8f30f72002421029de7ba2d8fad22
+Qy = 02aef9c34c7c8216a805a58dd88185f40493086213cb4c85e4d226bb5e892aa37be353d9123e9900f8b0790a43d55a19d78c48a
+k = 0491dcc881731112ad5e9e1df459c27381a7bf8270f97743466e178bf5ca903971b362b73fdbef8a75d4292e63e225396c7b32f
+R = 048425b76147427b8b1969bba3809dd70f0fda24cfb0e92509a7824f027b61cd38441a691efe213f3c331da8c82f94bbde511d9
+S = 00df36683f22e9e86c88097d75409ea297d391550440e4327f67b7af1b09141a0e7a1db40c4b0bf4d60376a6636dbeeff0b6b91
+
+Msg = 3407cd6d2845197cd7414a30fc3df7184da204222ffd65c4d16a12cadabf603de8043ea14f5e6ddcc22d3572dc06dec1a23cd924e1847ae285ecf01754e2d1247876431eb98e897e47412a2330bb32990f9714122109e94b38f82cfdbbf2eeb4c6f88f5dbf9f0ccb47939df8be321dcd9bfd9bb99cac9f94885fee7d443fbd87
+d = 02419bd2200f8e1d87db848b0379741685e680d9affe693eed49d82931030b6cb05d21a4965f4e1df2045c8513a8f574ca9f2e7
+Qx = 0641a6ac72455ceb142e00d6854acc5f8b86db7bb239a5054c1ed48dffb6d050458ffea8adb68613ad3cf5977ea7330268abaa2
+Qy = 1a954ab7d62796e5aed370285d3bf91ddd34eff3b995d04967db41c2171cb2157d85032c998795ed476c891702d63ff0108f45a
+k = 02e9928f427a86c4491a47b31454ea7d497435af81c07bc96fa61f4507494fbe4ffc1fffa8faadc2a44c7e69c4f976661750f8b
+R = 01e8ff4cb8c58fa48aaf61488cc4118df90e8c06cbd88234cc920e5795597ffdc0ab967fa7461082a49de56f02f84cd9d564316
+S = 06e77ac43fc7af3c126f997fe15011fa87a27479fbd5af48e28ccc2c1bedb6c0695291dd67beeec3f17cbfecefbea46b6325fdd
+
+Msg = ad43f8440071285d01fd79244907803601aff4bc5d14c77483a87cd742144d41c68269d76c9a83c09d2178bbcbdf99f927b378497ffdc907a75a3b0ad019e69758dfffa480871eb6e1e17c8539373de611a557fad120d0bd147f8debe5f09a02e56fb607e9c1253ed592071f042e42fee39775b407225a2b86a950d81bb7d7ef
+d = 0722951879a65bfcb414e11712ee9431eeb32319e0ff28601112f89276ffc2b96eb65c7fd77d023f09914a53e2aae2c84652bad
+Qx = 0a0304caec1b68b34c822a2a031145677fe515dda977f6932ea2a3291c6bb4fe8f297b7d3c632f9b3806a8cd26e32403c27fc7a
+Qy = 0012d4c3231898a4202f3f251802c690353ae9cc28ae5089e259149bce444d31a38927dcb42ed613d4818e235884749057ebd02
+k = 0331611e81d3e6e3a24cc829c1cb9087a8c6f64c286e5f1acfb1ba764eea5ca55be544d3cb95fb98407fb6c8f9eb1b3f7ae7386
+R = 056901f11ec69f91b31f7f41f7856752568b7d34ff3af1a2259fe15ae0b01391eeaffb629976525fce5d182663b7b23a8001bb3
+S = 04e89c3155afda2e64c749536392554cc299b70020362e6701e3a649f0a63ae5a5da4efed5c73b5e8098c0cf47d6f4c45c6fab9
+
+Msg = d61a3765229dcd0b4fa6c57280f851ec2bd54d3ee2436935cd6d94e0120d0844adda163995fbc4cd9d7275da859ad8ebf30af9efbdcfc31c7c9ef42bce9011d37cf9d15fb018e117bbc102f7d05750e5072f73d02c2f45509a55627a78cbd9082cbf36807759d1fe2ecbb92ab30cf28434941712d38bdd100955d611987b5968
+d = 03f5b5a772d24bd5454bf26759dbd433fcc7bae4f5c593664c4d75da0cdf9430d7d9162bce3d7f6e13a344259da5a7d6a1635bb
+Qx = 1ca1441b1f6e13138880196e69743206ce09c439a507a11c0fed069d4ed23676b27a3a337c976c276809ae725229c9001708742
+Qy = 13c47b14e3069af070869c12f0f39e35a6f334d98210d33c9da01ac80057911f5a392fb5c8cafeea01c1953e97d47e744160243
+k = 01484461d02c0337e8113e51aa7d46330f57d423b79b580a544d372524a853db9dac0c0d16f733b273bf888271135a5162e70f2
+R = 0256d7ab133904a792987f8cea69e8e3cc674cd3c577f40ef6f12b31f52ac6366a2a3ea2b2272c7bab8be00ca0d17989b6801a5
+S = 020d82cb9b3b1f25d993fc18b7303db4cfab91c03a97b249176f9bb2aa5ae7f589c74060d25058c7acb6de1e888ff44481185b1
+
+Msg = 1f3c23636414ced48fab6763eed5b22537968e6bf08c178b3d31fb1f6ea773c6979759701d94bc1bee7c354272811edec58eff50c93331b22723d460e56dbee90466b894354777b23b13a37d15a84c762caca70c01518bf34d0c2f072145d274b3b6c932b48bd815fe81161d8507ffbc2f783bd212c29b2887af6d2ffa9d2b4d
+d = 046bb4a141c9099d531dd23ac440eff1f5b10f7cf34920b6b702311d490d25344c665ed5211d401def24986c8094165d10f8934
+Qx = 13db47ac0e33af0cc7d74f6ce647fd80cdc1849b15c349bf501c95893be5a440f85b9b029713339fb888d7a93632ea4e0bd8136
+Qy = 1f26f7009cede02e054d6499c9280794184e212e3e1091032fe0e3c189de26d04aa8a5909569017cf06ac2a20acf579ca81f3fd
+k = 046e55a908f13441bab63e5327ac346781399d5a9035a72aa21df708b814b67e420b455e1410014cb53e6ab00f526ceb396bcf6
+R = 06db7a7b03d6a85069a943fcc332cb8c54ac978810374b12eaed4a5fa5342c8eabaec238bfc6107fd03d75dc2c6d258c218a186
+S = 010a4115161765dd0c22a0915a0d8cc01905de91d3f08c6d2d85a6a92e1dc00904f3be67fef000ce19f57157deb9afba7582b59
+
+[K-409,SHA-384]
+
+Msg = ec69f2937ec793aaa3486d59d0c960ee50f640a9ce98a3becffc12d6a6c1c6c2f255d37d29f9b4d068373a96beadac98fd5203a9f229bfc70bcd449640165ae5128e3f8d057769e28356e73e35d8e9af7876f608390090892c67391ddfcc1c332aa61efbf72d54bc615998b3be8ab0a9d372784bea48c9fab244482c75cb2de3
+d = 06f2c6e9ea8109223d9a349fce14927618fc4fa95e05ecf9aba1546619eaeaca7b5815cc07e97ae8cd1e9973ac603f84d838393
+Qx = 1f5a9824584cbb0d5ed57f677caf62df77933ce19495d2df86855fb16456a50f157d18f35ff79b8a841a44ee821b36ea93b4f40
+Qy = 1a88299000c07a9ad0e57c22fa8f15218cd90ea1de5b8c56d69506ad0fd12b513ffbd224cb6ad590b79c7677a8eda47a8bdc484
+k = 042325aded3f71fc3ff0c84106f80a10af08d76d5e710a35d462e880e015a36d063599573ce2044537b9f62b51ed4fd2ed8b860
+R = 0667c74ee2d632aed13cad47e0b46a5176940652d7da613e4965876e7e22d89994bdeadd6b5d9361c516fd51a4fb6b60b537e9c
+S = 026a01220a1166a4d0172428753e98caf0aaac5b0a09c5a3f11b2645d243991d141f59d6cc502ac44b70e7c48d6b0d7b6ec4869
+
+Msg = 70e11efc78d7f079ae41ac3c31c96d3220f4abfe23814a2a4a78d9b1a25e838c3408bd416062e4b0a5cdadf0c6e16a11e00f59711b417751f5e4b43ecad99efbdb2a81c91a034e89edc94eb552c3eba62808563cdf64453a1db07daff8742aea4a9fa738e1322da316b26dbca2954b2bc0de6da7518d28e6677dec6ba8af4285
+d = 004212b7fd913d794fc6bb33e0276e349c052c969ecbf6afc89b28f75a599a9242acf74dec9f374361ba296ba42a38407f9b7d6
+Qx = 19220ebacedc60762877881262c0c3dc0c8a709fe2ea16cdaad3b680d7cc8aae8617f0acc9b5c9861ede651481f39927a24ecb2
+Qy = 18afd77bc7fe54266275fcadc0fe8d4c0dba7a1264c79bc31479f4bcd02245cde991791a7b7e65fbfa907457fb6d450c0985ae4
+k = 04c01ff477786304b24cb9c95ed70ba376ed6e4f6b3ab2f99ac575c92d3801e7f43bab072268705d61d3e2fd881f754b9c84235
+R = 00987cf8ef2b382fb25a6a542e688aa96c098f5d16be0c7d46e961b4a4152c372cc0683993843bf5a04f81e6068843582fca48c
+S = 036fba32f80cd2e66bf31baf87616027c5b107f72f11fc766b42e2774e29e10e860577c0d3a27a3b49754e6a189680b7a638408
+
+Msg = d922fa515e3bed60b517a2d37cafe4c041e5ab4b5c8d8d4011bf9fc4013dd8abf7add71fcfde5e71d6abe76bd0f749e960cbed55711c87b5629a2c39cff48ed7d0feaf5cc4765e576a4959521f9a45fcba0dc65ae618826447e02ce6e1cab5ce8d6c96c3211adbb0660de7df7453f3aa726016941d00d8ee536cc106a603d126
+d = 06baeebb5ffc89c94c3e8b37b9b0904e7c4b251d204894655bf3b1235710215c29820b9d401c9ca7df1404d2d62d708aafe208a
+Qx = 0a0b2a185ad7ddcaa0d8d21b643a14948d3552e25875506d64e236a90d274ad1ca678e628acc208bfe6b56c02df9f5a36aa94ec
+Qy = 0fef210c7137237da8ecfc2f069cb9390c132d1c6ce961f2bb3ca925ee727c967f8a46727c8811c94ef66f20836c661a5cd1c59
+k = 02185be104ad16abfe4fb83de5db067d37ca58510b786b109514debef56cceb4dd6ebe53b25127b85faf9c28b56d6586c26d60e
+R = 0404831192b4bd453c0a7e850815ac3fad88c7a2da27d29e83ca6f22213635a366018ac0038b1fb1e4c512cac15b614fb69b3e2
+S = 06f677c361547c91428d0e200dd00777262a138afcd828238d132c56b2c232e2b446cc693fdc4013f05ce7021aea5b5b2f1b34f
+
+Msg = 4f64d0f6bfc542a0d4347576935bd68ca88524ead03b8d2c494061d0658e6c3e14576b5bcea5f2f992f54cfb52b5c7cf1dfc517205e0454510eef1b7054a8cd06ab53ed2468193f98ff0dd62faf076549ab2a270f259276d5729996c120792c6f466a74ab65035bf38ff2c055b43e2a8b8e2449a2375ddbfc18242157bd905f8
+d = 008e5f66ba53e7caad1feda122a80c32c82d2c32a7237b8ee8ead44ea8f2f01d77c7056b9dd60b92d051f060da8532c1fd0e8f4
+Qx = 1a3d020a0c7e3f3fe5b3d9fa6b6148cd0c481b4f9e14dc85aeffff35e62545654fc313f930ca2e33dced28ec28d0fce6ceaeaa2
+Qy = 13c1ac166c3c088e8a4a9d44556e3344e52e8741ed1a8b526a45268086e2fe54c24d398553d509439ad4957454eb68af594e683
+k = 0095caaf063abba5073aa7123b2c0e1666d29bfdfdfb0c484e18931d756ed0845ea15dee1e9abcbbe4576113a8806aab9476b16
+R = 04d6e33001933221e9eaa78da5874f639749c7396dae90f2da4ccfca15b50ee9e50521cd84d78a098e0c383fab0186b3dfe1b3e
+S = 001e17cc7baa3e9ff4d882da970caf7d55b4e0fb7f0cdaaaa8290fe2fc9cc31d51b34b5dcc825bf6799ce22fc95382d46f3f98c
+
+Msg = 7047d478ec5282d55db8c19c97af10951982d908c759ff590f27d57e2664f08d526cbb2bfde39bdbb1aa3dca5a8d3feb50b868be6651f197abccc9d8040b623de367e2ea1d20ecd302afb9e273f4be9f3f64f2c2eb3f92d5e0e375db6549da2a589f0604bc7146562ccefd15995a7c4208f640e7a17afbca69cda4e173380523
+d = 04ecb22b44e809f89b16abb10be062c89b41ee34e110403e42a20ce59a99afdc22f6f6dda56e1d9d1b8ce1d057f390db111def3
+Qx = 0dbb4a6ed11f36eb78417269c1b1e9725eba1666591afaffb5582c8b4d5bee1d73922b0164a05bf21a12052171abbdd31305552
+Qy = 1eb385afe8588ceaac9f39a5cb4455e02bca48f3d2242730e0f9e06ff1db24344379f96356531676cd5af234a120f4b61f7e041
+k = 01cc97a718ebeffed4ca7a9a4389d6b0fafb73ab000463b68b5580267aec203b6231cfb5afbf7ad8192f0947c7f40d9e060ab32
+R = 021a29f56c31227daf0dc5dc919434978943b80f4b18748bb5f7d6702153b966a0a4af6f209ecfa3aae0e4f32a1b7c6ae58a55f
+S = 06921b2e2ab81517a0785c4ac3be3d7d4b4c917d7a1e4313b123ae96056a2a4a66d9e00819d8c1cca5bc0d75e4e05477c1fcbff
+
+Msg = 1a8384b4771a410663e56eb36c5d9ede8d161a8fb0e31d3f74bcb017b9e31232bb2e2f4c65a2d85bcd1cedd93ef08d4bb4af0095731574ab3f2762788a1ba3bf0ee46684da8d9dd384432fee99ed3c69213d790a5d81b351063eaf2bda71ca4868ac36be1b571024a8bf09039b347fa996d5d161078314e24b7d073e05cb3d48
+d = 051f9500c15ae73d6d479b9f3d2caccc2039d8d03820befc2aae3bbaf65d59bd9cb3c4e3aa8bed5b3acb70a5566047ffad80729
+Qx = 0ee8ca7f55225760c515bae053ebbf4ab23567f95c7091fee2acfff079eda297ec6a7e9d526e12e5976431f9d7e52a2318ddcd8
+Qy = 185e2c17705a2555fbb8afbe8e41ced8ace95c83e198be3c7dcdeac8c2c5bdd988800f1194e553bd0348ebe6c29c16f35d50895
+k = 073f96451cab2d3ca9810e265b3461e0fbe7f32fd6702f06891b97969b133eafd68e53b526b5e32b0d06ab61ecd75e1bbb21b7c
+R = 067d55e709f6966cb2082d8021a313850c53305a3bcc926b6f9a122181665328fdc8e05a88de812357be85d22c61c919876fec3
+S = 063d5ee4a63b1fae39f266a9f826754f5bca4d7bd414dedd16858b5c6ac2d4162e28ab57215c6713320d3d6960f6b55e3f1897b
+
+Msg = 43513d6dd8bb0af7a6f5a2b35f99957d335a48d54f2c4019ce9518b35441d4935518976ab1df37110b5b53532cd9e2c66d9f87ae7f683d7efdbe1775a6c15eecee84c6f879999d0706f6779dc158c111fe8d7201983883bc8334f51dec60004eb1087347bfdab20f8f2f260556681e05fdbb8a6139857fd3bb2df5bc1f2dc143
+d = 00cf01dc4462cca764f4f8cbef48c51980737b9b98d1384b8de9f4c733829db7718a9b5eaa46a8475c2144fe4454cb8eeb0a443
+Qx = 0806457fbb7fc577497c937600c5a9c4df2c20cf7dad4510e5ad617fb2849bfe6956c3efeab6b805cb7b63bf5d1c94e5ddb456e
+Qy = 0915071cee2094efdcc155f893da8d83d9a5c234d0f04f738b7af5b8fddaf1d3aa152fc11894a13caee0009bc106a64323e9dda
+k = 024968902b50febf13be11821d0d316f2daaa07737af45ce2e855aea6ed58f226d2279ebe4295c5d7674104bff75b899609561a
+R = 0549f18f1d654f26ca134df4707694e5d9b3693bb34ab5123ce4d9e4c2b2d9756ddad957a4169fc9bcea29944903080f6f5d01b
+S = 021887355c6360bc4ee59f1badb5325763e9428e60b31a7abed06ef03bff0b1265662d604dd2e0140c355c70fce1b56ab143201
+
+Msg = 752300bc5066d0efaf807183a41725e349907b7339d77c79921ead3c685b616b0eb97e708f3880fce0136c510c8cb53b22cb424af6f1c34633600939a0647c02d8f9601f9416f1d24a51657241fb559c25dfba91402cea43bca1a13718b3945b048725f3df560e6717cfc6ebd894e29bff1e0c7763f15b8ea93e67385f059598
+d = 063a9a565497974c6dd459bea0d1196d74f263f333c31b7e8591499960e1cd79e2ef4cc8709f6d54713f873b16e7b0be42f71c8
+Qx = 18872e9d9410dbde671fc050ab88101f01d146a72d62b630b29790b20fc02cb62cd0ebb5b453a46c60ec2d2c66de8715c320578
+Qy = 1b6af51db1c42b743b89be0900d23f7da80b15f2e7a2a965c7bc13800bf58589560af4697f873b6155194badf5a19a653e63da3
+k = 01d3278e6e78386146fc15006258d7a62a1345db3c2e44fb8d3bf8101727bef254a9fbff157072326a85b5ef4e17c5b0212bedd
+R = 07bd5b54d9c6d6f9c87f4a66472be2c4bb7f521ae56c1dd71781d95440b0a151d206ddf627e5ed3f9c7df2fc914a78454e97616
+S = 075e39ff66ab0e0d1b46f9679b95d10b692874d45fd6898c569aac28a53569646bb29f8556e529ef83a15c574ad5e1c82878154
+
+Msg = f620603489944769c02e2f902c2299dd5f32b5fb463c841b7e1fc0249a85d2c31684bd3daacd97de8291c5d39e84d6e59d3dde1b30c181bfe8d31b8d8e080bd191690a67fa00024ac8c1b10981b40d4f88789ecc58fc69b15417fff34834e23453bb9933a43d08afab74d056f366b40ad167b51ee5f008db151a12b467d3eaa2
+d = 041074dc186193d30aac7cc6d269b938ab40b257d095e54ba79967a377a91b8f73671470cd07f0a3d1db7cf0a31ba9070625e43
+Qx = 18fe9848dc599a759d90530480a6f11d052d2ce21a7275769ba02a61658c3b69ecc546aa6599e6699353ee1d65ce533c69fb218
+Qy = 192b9c41bfeb2af4f29dcd1c43d3fe72a070b5d085d070acdb8c02f0dba00c9471df1dcca1006709676bc08b8ddad97310e25bc
+k = 036447681292dc781f7f4ed60126945354ad1df5987266038c5049d698b2ae12965b6fc58f3e944c4751406087859973d8afcd2
+R = 0541c22a6cb984cafddb3269ba3ee56af64cb36d03b7cd1693b112a7df20f0422219f85c6820130ad53ef69fb66f3326bb863a9
+S = 00fa66b163ec3582760b048ba9a0fba9443d7e908b67d749d732ac9b6e89c1fcbc6d3ff4e02a43ee41414b15ead0cb83749e0a9
+
+Msg = 5575f610762b42ce4e98d7bcf45a7a6a0d66ec7f27d6b8b17f1961249d905bc7e58e2ce0806d467f106b16285dce4544c72666d08b5e2276cd0c4e13187cbda8aecf57b1855afedf8fad39ee4fe009f204e60bdbec79b123456ec2d85631d382b8a2f2c7634af3992e4707f7b4215e2c9d3b0aa8fb08267953883a4213669d33
+d = 010820db54ccf0226161aeaee79cfd2797f87702b4ee91adf8543b3c9e79579d0df8a889e366ec1e0718e039b87a37c24d620e9
+Qx = 02eb4e313f158ba7497130e2d64804ac45a7db207c55d41f39979e0303dd2641c81050fb7f24f2fd2485b90f60985cbb15d56be
+Qy = 0a190fb6c81c104164578da6bd4f2b193cd11935e1f87f14e824c2bf8c82c39f0be1a6de3dfc6dd68af8cb14f6a78f38773a7ca
+k = 0118e911f676f004fe581d1855e5795e5f4ddb33fb8d409d557aeea87895b7c23a513ca0010f98b3a63f2c65da5e3b6c37cf5f0
+R = 060c7f7c47c16b294867cee3e65eac8fc828229a5d3adf8e68e14dee620e9d4e7b78c8b902b5042b5f19c94e621c52836c95ba8
+S = 008d036087b23319553faf835b793c73204cdbe2c1c2463e74de8f404e66ff15ce9384d26149e7300ed1a109afd1f915edef912
+
+Msg = 81cf067411dde2d0ab04fe5fa1e28e6975cdcc571588de60a35bd956a535fbbda4affd0803d244f3f7e6902a2c9a7ef2488691b6bef7f8ffb33be09ccae4c5285265e4957f7928ea5cbabd6823297f59a7cfc9939a49f26bde74c4c69e2d38c1efbacbcfdef011213843158072be84ed3c1781f67a0e2d4e9ba76a585c17fc0a
+d = 059d2a06e8bfd5e14a9bc8777958b85be5e97af892d2cdeb0ecbd2d5017952b5042349db5fedba2e26e7b85bbb31ad313d99434
+Qx = 0af276952a1216ac88ca7a194f5b27b7c98c78c42f852dfc1a2cd4c1a477ed16eebfdc90f613b6e264576a35c45f49aef8a564c
+Qy = 0639625074b69346dc6c617d624d63ce415a36154a817f4e18c59a3b09e01589407077b19bbbdd57b04ef8fc2cc23c673d52910
+k = 002728f7e9b4772ab790af0be9ed5b3eab697c4710249169d2a5782ab3797b8fa21bf8c1de659e3060af5a286353402ab982320
+R = 02a7027c6f94cc236dc8cbae35f9c38102a663b84f66143e2fbf9a152b1a6478bd803bf3171f933f63509d539a54dd348002ef5
+S = 0549ecf85ca1bae6d9f0038dcef90c93121a654552780f5583a7d44a73a9360c6799e76a632bc8907ce4626c0439f1518e3a250
+
+Msg = 8ea18387940035cff2f37278d321b344231075db43c7fa7fee9bd3fdefe5e8f03e7af9deafa1022eb108e19ec11fae34536a4fbac2e8c8139a081a997c080cbe8f3e2d2a72ff26edcc5338b21372fa1498e439e4d9bb12d51cc539f859047957b1b1f1fc30b90231eb06b365a4d404a1fd5a0e5cef171fc95b04d0b557d78ebf
+d = 0405590893cbbe18f4ad99df28b5f9d17f8f1882269aff0b7eee9392859d68927a99c942a3075269ddec6d69c0df2d76ab9d801
+Qx = 06ce67ace45a9cfa0cb45e8e1d0eeb44e94bd7527fed6b563f1069140a3f36e010f85e1ae5ef14d626c78465cae43230090baa6
+Qy = 1a66a58d87621b63ca662130ea342db029acc2d99bf76cf6ec4e53ba71bde4b00e508d332081055a65fc6f44a96f4e947d729dd
+k = 0035f09e0c15b41c958596ad3f5c4bd4a3685ac94f19fb97503fb5fa29115cb18fdff4bd104535847ff36650b7461550dacf2a3
+R = 051775fe1503ce80b3d581ea3e5ba761665568ce0eb7d6a7163d8d025d76002ca7bcf6d688b6477ae85d09c0d4017aba5ea8019
+S = 035cbe69edfb6fb99c9e45240b7a587c3805ab2ed6b0399c7dd8dd76187363b2ba1def66b2c3dae4bc2e40d164bf0f4837798d8
+
+Msg = 6a253c1aa17b2b1e6624afc8e7456d366ef5b1bd78e740538260f395481148a64da0b6a58cd53d7e06c691beae1a616547cd95c4d259a371e51c2c0e334c8a5311ae31e4c7af325686ff9f7a36f731010ee1a9b8a29169ceac36a060dd23611dc9713c615424888bb574ad5f5755d7311bd169336ae986c977a394bf16487c4e
+d = 062bbb4f565aa0f23b88ab9029d33b995729d10fcfc33ba7c4051e2fbc72f15636a834e3ebfe604b927cdfc89f53c57f36890db
+Qx = 125242acf14c7e08e9f2f0194f734841758b1eea1e37ba80b9855a14100a5f0b57bc52a0200cb640121d96769e9cabc45362f56
+Qy = 0dcf52cb899470943a37d260aa85fe83c3869c862001021660ad09b4d73f7739ad331b3566bffad590534207c6db9acf98399b5
+k = 06095b4ed8d51e37f6c723648af4cd4585d9d250d7519139f58a93c75f197c4bbd1142da59769a5fe178415c677caed1c3da667
+R = 041b212a54d4396ddea2898dadc363ac3ec5385c9b3b8ef1ea17c3d2f751d4f79137238548ad759b5e1700d7d78072df3bf84e3
+S = 0149242afc524b0c3583037da153f539aad85aa0c19c6c70852e3c3923df8c3abd0189a2abba872932eee2e6f45e02f98e810bf
+
+Msg = 0f91d0f0139faf3b90a3d4bebd7e96ff6bb6f90f6c68321fb392637d8ab2a60d649a7b7364ee6e4e274e1a8d342caee36cc11c56c54247fb0a8e8ef81ac4322b454dc9a195dc54567bf47ec8d4fa4cd32e76d78ea2d08bcbce3edbb68fd8597e56d5a9f2df4e47b2701046df89615961db601bd8204584a6a6cfbb627e2a1190
+d = 03fad7031cf8810544a3e4bd1382c0a2e22c5a9fe4804ce67b27591fc516ee81dbac841d399327168aa6abd79e2b5ef85df1528
+Qx = 1ef0f918c683be57eeab95d5d1850bd492ace7f4b37785863647774a028e963ee2c0eea801838aa8217fad75c5780f1c36e8d4c
+Qy = 1d5dfc69bcad46bde5539c58ebc89e1db2a3f65069ed963280cc2cf228b2568bd53c6e0e164d6b63a5d3c2b8e3be9d5139a62ef
+k = 00eb16d784e2aed724cf1e4b72fe76b00dc80948c07f9c7524eb0e83bc59c12a8ed16fa7ff21dffb8bbaa82925848a19c93884b
+R = 04a07e79b4f771363ad4c46cde0aadf3df4a233740a89168c97b54559029c51dc2c79b7cc94a0e4e3d2f94e376fe47993da28bb
+S = 0360f559d37a777119b2aeebf00cc17e2edf04a2cbdf74366f5d34368d2eb2c92958e4dc2b7453d5a509407a4d4643cc0235f57
+
+Msg = 50c17c1fe4dc84648e5c3c3ab8f7c971d4c58d8d56d2b5ddd92e35e6792111ed8dac7644ac8a07ca8bb4e38e071aa47b22ffe495e9083f9bf781ac1b5fba571862c909c7aaa7b8d05ddfb7ef61c99700de734d5658f44ae9fc908c85a2dac8e7f854d6d24be805fcd7f873a91252985c5c73129c60177ba8fd99daa87b25a073
+d = 03db41b4f637fe7977c90e4f1a21799baaddd1826c667102414877138436cfae1b9959842b8097b5276f15f2b982ee59df263c8
+Qx = 18eb25bbdeb41c5d14edc675fcac8a523acbfadd6456632bd593ab5f694a7734b163aceb6e6b3d8ed83fa1cf7b5adb9871a6626
+Qy = 14975abca1cb769a243936e65123167e535279197a37d8c92c7b138f31cad4e95c5f62b06f438f94c1a61634b34be7b96f09fbb
+k = 055fce73c9c385f007256253281c6b9d0930d127939026495d0a30f25f77fdb6b334043c39fad4223852f7101fce72746ea205c
+R = 01d7c26e0236afeac032fc5f3dbffc8c03b04417b514adc26d6a4f697b4e87a008d5ae97544a274c25ff66b98111d7c651c9381
+S = 07954191fad321e7f2de95a87d5a9c4527e658ef85faa6622d5f34f8bc2b84c881ededbe0281456e9b70eaf7a207e253d216533
+
+[K-409,SHA-512]
+
+Msg = 3583a3226e2dc463a462fefa97024e6e969c1b13bdc1d228e2d7823d9f7c09012390c2535baf086588000e908309090daac6e6d2b06d2ede6fae838ed47f30b5b481185f607a3586f6dea47c8f84e9d3b96d5b0ebae2462fde1e49d84d36658e87dccf5e30c0937feefd8862dcdb1a1ca373f6ae41641502ac54df6633a8cec1
+d = 065b76c6093d9c49591293471286df1a4444e60d9d06cfa114e175afb5f119d2abeb273b0596019a0ec5db5b5869f2cc827b364
+Qx = 0266321fd15bf6b1af862496f467069819e3860f74a07825e68f3d023985bfbb838a49b6a41b6515cacf404ebf12ce0bd3d6d70
+Qy = 01593c7a8e629599e63d3282cbea78023518277e6731fe8d88cbe525ded554b51a7f8803ab9e330f210619dd07df8f67e1066a4
+k = 035682af873829e16b72bb86f3ee99b5d9f052e4a631b07f87d3b361c8d8260a877231dbcb3f4d461b4a1d4467824a26a5a6414
+R = 00a483dc2dc6408c256fdf63b04d71d3c58a08db7167da217f466cbbfb2d68444c10e87a9a1bb04efd71135c00226e58414d407
+S = 078acfad2f2492f74b0281d53e4224c7544588ca9ceaeb16bf759b20c2f3d3ed69c64615c247213d51800569dc8b00078de68ef
+
+Msg = 60ca58462d53d074b370127132f4e59f5eb8d15594dc721a94286afd082a8934e52462c9c1c3910f8b50d7aa3671dafa5972958d876d7992467b2fee3795a6f9d8a7bd3003a8582ea8c003aa1e02c08ab6804d85bcfa13a815d75c938671f0af0706c68bc70a6155708ca755cac2fbb68b2952208d63e0e2e3d816f04c61bc03
+d = 07e9993f3fc1fdc4c376ef77ecded96006ac1159740bd1b2dc6ae3d97e15a67383f1fc931e460b9af3fe14a54e47919667ed06c
+Qx = 189b82003b546f94c066963239c7a590e064b88bb4548678853545920e413f2be32125e40efb82d2c9582d2d8269c1d408a7ff0
+Qy = 11583b267727ba6c1e17a244ba7acdcd836986089860ee312b6dc2d88a984b1fa232eb0419730db8fb94a5e077009c1d55979bf
+k = 07574dbe04e1ac2bb34e40f32d6f6db364a95cc5770b79888d72b74bd4dbce9fd91136e9e1152424d76688dc995bbf2bea34175
+R = 009e42a63b41877e200829356a2191fbb6f2a9a234be58c76b0852e4f348ca61e7492f90a37feb8b95a6dd6df9d1a2e61c63b4b
+S = 01499fdcc804fee8193de080b085b7513eb8022503de5f64dc12c04c0ba24af30e30f63f0e3eac2c82eb20c6672336f8732ec5a
+
+Msg = c749f9bb92ca9957ca6d0124206ebf65e860ff38a225e241950bf4526cef3f4fa9184ec83f71f813fe852dc08eca6b45b14fc7f2c6a19296529bfda007efe9d0d26492de2a902b45ed39603e22f0a763dfa5deadd97ef6feb859d860baa2cfd1d066c0be0f9f4e0e2fafa69cc51b12e814ad2e33b0acc0bcbe1df8cf018dcd4f
+d = 00c11e2979498695c660a2bdfd105b115bc4ff8664ea15cfb40c725406c6fc9a13027bd1d72ffff6258f29e4e19b845243444a7
+Qx = 0904a9bfebc23607c7c89b7aa89315343852cb894f54fe42ba4225285e58c6bc318b55691aa6a6ef22eb11f44cbda89f157d7a8
+Qy = 19cc1826280e54832b455f0ce0cf89bdb62e973a8e819fb776b1a202b4f207b8baf9072929c9e3f6a8ff996d6d529de899b024e
+k = 070fe023c9341df9348f08882bef47bd8dd7f13db7215d1cd52cdbe7919031a62455ca969a8cc6db0a05a0b4befb47c142c4f34
+R = 035e7130d59d92ff8c4f264fb2c346e052bc305c7f57549a0fe43cc7cdac6aadf2ce1939222decef4e1f900e3c2fb2c52bf53f5
+S = 0008d5ec1ed2091309ac11eb88157ba5122bb9b5c858a46769a130f7a941818445664ac78325e0b6d2a11bc89d08fe0e87a5bcf
+
+Msg = 4de8414780ea20f7943b1f1adae5e3962d96e828fee43bdbf2831bd71bd25df2976a3be37a7a667c7fbe1200de578920090d131a750c9bc09bd95b261234ea8cc25423c4ddfff5656d6b32da6e2f6f530e6673a8660aeca31273bb9a3a21bbd7031a2fa71ba37c004d3d1c64b2c0798783e47b2efe1a208959ac16e35d444245
+d = 068dfc23c6635bd1fa1076dcbd456ad6e8df7ce7c1370fe275803befc4ffad007fd062a61cf1d50b93aeb9afe1aab47a65af82a
+Qx = 05591f8cb59ccea17bfbcb74e69f05218d16175f0547ab95f507ef8d7426c077b52b82dcd06baf6eae7a66bc72422236e589e42
+Qy = 126a01d5c2331a2d00949e07ea9242ebb50d830b0aaa74bce841d4e43bbaa9e9aaa01ba25db7a8a2f4d72977c0f016f625cdebb
+k = 070682c9659089a703dd9fcdf2f3fa0c1d1ef5fae3f8f1b3dda55d9b611770244f8926898c904f6952c1847d287bca21db4dd59
+R = 02734111e3b736ae795929f835701bf290dd50c0fd625738ab2769242c1403197a3f4dc29ca618c2e292c6bec6dccff71adb698
+S = 0755292cc5363fa74e0193a806879d3a275b4beebc97250fb230efbb8364b2a30098c0488bcc6e20449622d6a5fd2ae24d7abe0
+
+Msg = a081d54232f84bb19dbd52ec3812748e2e6486f6cf1b177b27929504ca878036547eb43531bb5b3edc81bfe105370427e92831d2239cca0106d031d9fa8da9cf89c6fb6401377d5936b6329ccad854e5567181b8f16a37c35f333eaa0ffe91d727d183fbab935fdac2d5670dafb3fba59e4fa2df1746c58dd8360fa08af7f4e6
+d = 040807fb888e1d9fd33604546656a493629d94d4a0a9de2608962225ed158167f9e2438abe2d12a11e2adb6c2b66ed78215b0b1
+Qx = 1787c0e6c55acd69bde9b0a84d6022796d5b5c60fe5357bc0fa4386c16f61b38bfeadb6cfebee7e7701bde24418b8b5642afefa
+Qy = 0d9579d271ba3d5e2327eb863cfdca397070055b97714e385ffc2fc23528f696dac1a4d0e535641f6c876f1819f2672a8c31cdb
+k = 010b8f5356d8a029659492c444876f1d274b82681d4f600cdb5fb2afde13598ddb71676d9ed86e83351c70678886e8237a865d1
+R = 0304f43f9705d189f47ee09a079494030b0756993a93e4c6ee6b5e664f63431f99e505747c24377e5930f13492483e6cd06ebdc
+S = 0580d4707c97f0330f908042a6cb2a2b313f07bab34774ee03bbee63a4ff881b68def47cd300fb49deb49829bf486d1efad39b8
+
+Msg = ea60266f1538565b3ff42fa4bbfe319be070329059c52c8bc04a7da2824f209c1145a05e551ea59ded8ca8439c328f6907da4e81d658937df614be98c7b8648818ea80ef40e49aaa4431f4a211d62acf2611f5d60c446b2b25745078c643859be1b12b3141a09ab765dd63ea1f2a2df015eca0840087a5db378c4c4cce76cba7
+d = 033bda0a02badae08fe40c239b9d59e5bfe1c4d4b9b7a5acda6790bfd77ad08dde5e93a2da80ec54a7f88146d72218bbb88aa10
+Qx = 02dec536832c8acf007daa66a47e4eeecfb6991a359f8c412299ef56c6ca2faaf18c4db708493e84786a7837ab74c5fe0644cee
+Qy = 0906c8f603b579cc2384e0803d31d577f7c91c55406db3b2db91bbca323fdf3cb6d010617ad1aae7bf414c4d974f22e6f05af53
+k = 051e8d027e62db2397e4a807d98a24455a76eff6dc259ada89e794dec1484b44724894eeba842f60b73287642570460896dbe77
+R = 031769e6777444095d934d05dcdf82405c43ae91ad5fa9201568ae2aba25712717f1af2b8f49f6eef373237bd70c34889d0d271
+S = 0023498aa50ee095f33a4081bfd70a9484089c85fc7a4569f560ed67243745c823cc0217d29e2938f06ba9c8790650d10fa5b1e
+
+Msg = 82f38c9405ef0d26bcdd5b3fce4fb0060c3095f61403418e17c337933f0563c03691fabd32ab5e896c593439e7492a9970ae325c67196d9e83fe0f9780409a930326f7e6efae035ef8c321cb9ad12461edd5cde66c04739fe079db65406b3c2d22f2d04b1a4335285513d4ceb901d2ca2ad10c508302266c2cd6079ff14eff4b
+d = 04ff431769d26b8837d3e1295f5464fe82be29edefba76323e92078a6483ea0daa96221549102509a1bdcfd46a5a2e5de10c39f
+Qx = 1beb74d427d849705cf26e26312446f27a7c5ff26ea9dc1aadca763254fe53a622de29cba4fa81ee2f9e0319e752f72be46cc7e
+Qy = 08dfcda35a00ab77c3c47dbc05b0678cf561f575369507097833e86e523dec879e0ae9583b4261f7a73c9dbd417accd4ae6688f
+k = 005aff3ad332af23e0dc38c16853252825076d602ed4c6d947be751af5dff3f59611e6166c31740b5e5a167260adf2a5466289f
+R = 035c4e8e1858b9694cfef3e864ed959638ba309ba2066a28fb9d0e02a66cd4c187dc6fd8ca5fabe68acbc2074168157b685aa6c
+S = 04ec2db89645018f9845b7ae31b8418a767e3570d401f41db18e424fe861bf09114d78606a056617613447d125a283be5bdb6ae
+
+Msg = d8506fab4f681ba4ae86066aed447571eba4fe04e6585fe3be6af2ab1000a3da68c5b0c711a85ddf3a40cb7c8944eef81f2094650459e14f5b848e6add7e580b0198070f873eb3ed5d0728eabd92bc1398764b94cbb4cdd7cc2027b9762dd10782658cd9e8a5022ac062fec535d892198c8a387b3d2b6f7c92b1af6ab7dd9e4a
+d = 03f85ca1169ca7e9df44cbc6bc7d2868c9d94e8f8b699a42ca492dca0914eb5789a9032218dcef7f95f959c9554a1cd83360439
+Qx = 0aa3c77dd4324258bebe7da5338c772d3496e3fd0e57f455459542f1a1c5b47692f51c3815c9549d0c23fdc1ff610fff6847ea8
+Qy = 05e626d6aeb86dc51f3b359b10862cd33ac9927e38127f7f17426f2369d62132a2a62fb6b8354c5ca0b3e5c7c87117b4f777a0e
+k = 0495099cc73c9930333ae3f9d0b7057d7c70e2bc7c805c0c6a44404739b3fb68f9fafa53033b54b7ad7bfaf4bbf7baba0dd5a0f
+R = 005612fe87c6a3a164d269da902aa43c5a4e0333770ea6334f05750be3f31ee758d169291e15b1540d40b60d1bda279599f254e
+S = 011a633bbc058550a597585bbc9f33099eb517795600b019255f649493d4a6dd533be8b0965d9f9d9698677491bf929198ff34a
+
+Msg = b3f30d34f252a4c26f396079e773142bf61c0981d912333ade3de4e27cbc72cd8a16b31807f0c46116f87accb854487d83ec8c6a61565e6fca145eab70048245db08616779d7047db63aabd90dd15acbb05eaa510072c151c0518f1b34582b95f43ec7b9484b2993c176de79e84566764467f72392ef31619426d159c91816d4
+d = 03a97deb36d68f81f50c8829d412ee5de7f9d775633cb69c09dac558182039e275fc258240517a7c4aa592e364765321f27cb12
+Qx = 13f0f4c16a47ec3a46e7a088c1b6a63ef61eaea46aa9b2c532d8df84dbf64991bdc2c81ced3635e562d1403dbcf6aab2f8aa9da
+Qy = 03aaded3b99a454b820fed989dbf6430ddcda67db58e356397d06aa137fbdb365ec43994abd9c0a9fadd2887da9539bb4ab3c44
+k = 06620ad14a5835b9e9e104607c317cc599416683a60ed8865acf78ae1e861246567cf9d91f759c2d4c82cec835a4784d3c231f4
+R = 068faabcb7c716fd73f129ebc6625f5b4660a88e47dc7dbcebab321051a61e46b74409e2b0af420e1671ef4efe04973c43471ff
+S = 06851e5da033da0f28a89dbbdabe93ef11331c55cc03d5b096c0522370be681241fbe71d1349f219ce57761c85fbe208ac36a36
+
+Msg = 0fb13b7c09467ad203852738eda5ddd25b17d330e82c279630b0e1f0c86681f67f6e537fb00da9419114973c8559306de58b0387d86e52d821d982a60769d2f15fd5ac2ee6dc55d8ac04ee247282cb2866b8cb8b4d7b4b6cfb33bfefdff09a73d727193e5fb939ff66ac5fcb644a44f9083a790888cc538c5eb435243c6a34a8
+d = 03b1da0ffed24e1a3b5ba22bd684337f6b08053591620541bdad50c761d66201a2cf21a4cc636426456525b598e96baf97d9851
+Qx = 0116a1790e621272b56cb4579ffe6ab629a2d077b779b73e039d74f58c476283c110bb18b9c9ed63de7288dd678064de68b7df6
+Qy = 122b43afccb88982f2e07ff35468178572bd72b644322d9e1ee68f78880169a83a5bb88c6c994762a7e8d80e09333487ac30fa4
+k = 06d7a24f0fcad549e9c36dbc70ce264a75eb37b74db98b1f6a824ad1e5635be9818f45c7544927807dc0fb3bb5fd38556e8656e
+R = 0232339b50bdb772d15f2cb8973f6dd9397af45cebb69adfc089bb802e9c4029dfb2078a8a26d7197de10638ce512e5904ccc5d
+S = 056add03244174966d53105c570e8fa660ae8c5d53316a24cd26f24e29e4b7459f4c9daef07442247b63665f97a3c07d91a8706
+
+Msg = f9b8124281628cf4e1da0cb4f021c8d19d815644cd80c7c8de4cc62722904ec4cddd26cc4891f30b15098a25ba6923c6abf4774deb6e1883fbb409862f94467e75a725e7154be860fd58347577c83adbf18535c54b102220197afa062cc1c84f6094490ce488af4a08d2c5b808a2572e18a59de96c87162f88413795351cedc1
+d = 040bac7e0d3b54c7753c79d43469e310d876015d948fac4e3a9765444754476af72330e88d79ee6119697aafac8435ab5690754
+Qx = 0bd4fe8daffe47bfdfc43deca20b15da7c999084bee8983c62e3dd33740143c38d8f432cbacea51e6f53994265b2d8f4c393f6e
+Qy = 06d88c33c31f4e143b13bedd5738bc1191fe6815a099fb7b44617fdeb08daa0cb74edab7f9a8c67ac1e9c0f0fb21a9f02ef4b6b
+k = 020f2f6fcb3e471d47f21fb15301784f7cf3632dad3627a9ebfce587c0097871eca580bda051b100f991aa6de5edd3a7684e839
+R = 014f8884b5107e9ee5cf6f5d137ec9d59a85a6fa0431053d58a1400fbf0d518e8910179da1160de2c6cc8ea8ba8f3af8e0e1f6a
+S = 019aa8d55c8d876989f9b9559db0576f91c4610dc9187c74aae2d4f212cd94d90dd81ee4483d88d866aec1ed469c5e3eed7d90c
+
+Msg = 4e3cd6100520db050af0daa69fe3cfe6603a223d4f2a6318fc5836db8640d4c7fb80bb781302036d2d6fb8e552b4eaef3133b98ba2d36b9ef0b86243b0391413c73d48ecbf1d19170f1b3b781b35ffd316afb1d55d1dda8e91eed5553780cb2714a93e7ece698b832e853e2589c5ba2b8a997bbbbf625071ded66762af8cad42
+d = 025b7eb3bdefba3c5134438caf968f615b315204f348006f82e8d61057a8a8a853230cf0500f9d0b8c1551a59b9184862dd2ed9
+Qx = 17d2029cb711e52df416c54b63a95a66602a1d15c3761d91071964e0128c91ea766b3d409f72d9fbb5161a459c3fd7990f87d88
+Qy = 1e71a9c66a4d4dcf199aa329e44b99f80640fc760fa7326f29c273aa13b153df5277feb3c049e407630173fdc9f735d7aee4e10
+k = 0575aade2692534b5a1a17d36c36973d24dc501c75c3b0b497a3d2fec80c67be7107988e47199d4863044fe9176762497b5aff3
+R = 024c6004fa92cad446b8339917f517f04d22db47b3f9bdb83d863dadb5431866ce21b13e780495bd66152ab33eeff8830cf8538
+S = 034aa568aca7be851d276d2235e42b6624df1cce2b97f6413dd3fc506f0f18483f95f911feb0eb220415ac593f2c93dca0808fb
+
+Msg = 5411708381a65bef4381c9e13a04cdd5ba0c15829f7f25ccadf695f635384d8e4704cb562741747831b33852567f42fedbd190d2980f1bc921ce01c17d659d4bdd7eb787b3927fcee659dd3b65132496c687f2249272a473d46326e66b3cb78dafbb522390162c168f73bdec88adb145e6afecd561979846ea4c8cee38dc1686
+d = 0673b3a2985c95904732632e5d988d8d437a60db13215bb6aa880b348f011c609a1e860461427a8cf0d622abc47f910f5c97ffa
+Qx = 0c4f1c0cdc44d867ed38d093eb967bfe285df897868c83ffcc0c53463e3852a1b2039506d9508bf01d0d79ae537e42fa2070a5e
+Qy = 0c2bd9343041c2c4100c5d795ef355c796a6ea7954cd729e11063b14a27fc2c3a9ffdb3647613b44238eee17d9cc49e8c5dfbe0
+k = 019a9509f5f6d947532638a3c80782b556c553edaee9ade91e457f7b5d2c9055572fb116f52cf4d3a2a0eca72fcb32b2f58e952
+R = 02def440e968d17d9904c5640619af2f447f74b7c067537db4a15be87df4fe68f44897047fa8af146462ceed4beae36d54e1aaa
+S = 013d5b00fef639c556d66420090c2cab1edc57b7257dc35addd62a5337300e94ea7ee116e06b744da1b575d90da81e8ae2cd424
+
+Msg = 23757fa60fcabf543e603d8b31ef0cc99b3ed16b4816a84e01dbfc858872fcb79fd03d2f8a1d4f28c25dc42a39e20c34f81ebccda1682ee9bd22fe323e7f8ea90cf4a2a6ebb634cd1153cdc35f7306f28a2efd822bf23131baa1543d0ed5ab4c8168d3199983fbee117085f90550ec3ffa2b06070d3add1d707fc2593285ff58
+d = 00db7dcac414010b816236cad584dabeaec1da76c97182d1b62f87bb7fe2946a64d10430571b2b29ccf2ef72c969a9f045f1f3b
+Qx = 1f2a6cbb9c1fabc8db2848c74d918312267888d822b7dfd1634a543dcca4be7c997239f6281d1d8b5da9adc694706b7b19cfb0c
+Qy = 1bde57a2ac15f4e6b26a373a624588a3379c8eec758f3c68695e2eb1856075d90085f43283d982526c5e57913cca5e2b4169f8f
+k = 05a3d856ad1d6164993cc59e70f8551e2408da92c7e6cd52df51b37dc22e9ebc42fbe6b83c332eedffd4086a382056175ad7009
+R = 0489b0344ae4278a0376dcc64ef9ba8595bc2fd62ad22d42fb431d2863d8ca353cd9e59de4ac10108fc247d6ee9ef643f6bdb3f
+S = 06aa27335e15dc910515385764387798cd4a9b4cd6d99d7c42e07fc04e2bfedf8dfaa7bda396f88253357d3e2545e895d9aa3b8
+
+Msg = b976314d2f066f8893307a726f450dcf2cf865c170e90e6908ce9787eec48e1e2119a731b2bec3c12fd4e6282a393774251bcaef91af6ce57c63a8b45bedd72ab862cd169b7c84b8f6a72084ff823a96f2f8eff3483a7ebfabdabf0998377c5a6836d88135cf61c65a0ca7ca57727da68047dc635c17ad13731035fe9a6402af
+d = 04717efef16e1ae267e155aa1daabafc68515aa391dfeb73c13d01f3132bd22c984228dddc4dff4c39979e7585acd3f730cfcfa
+Qx = 1526c58a3de46c95cb0527869f7d637f9441cb5504e6a01f339907c6df3d079361a41571cf0a0f11996028a41682dab5decf786
+Qy = 1581903be8a19bf8bde1d89bee0d436f061ca1a3ddded4b7793fbc32ff852671103f34e16d469eacdbfa457643d1b18dd1c4107
+k = 05c846bf61c068b421efc472469ab1ff8d9f34847ae0065ba6f4a000be53727b3fcf97a780362566e13ebab84b9ed5f0cbbc225
+R = 00aa138e742ae81eafa820632f31e87bdcfce6b909d85805e46d87d1cdb8b968907470c7ef5806accbf6245628c70d264fdd95d
+S = 04df507115384327f7b8311dfd1227c19a6124cb9bb5901bed45d8d5ca45db0903f53e7bbf136350e66bf2b4f3d978f8bc546a5
+
+
+[K-571,SHA-224]
+
+Msg = 964ad0b5acc1c4db6674e86035139f179a9d5ec711b5bae57d2988456bb136d3aade7ac9ef10813e651ae4b9602308b071d75a934a6c012eb90c5eb9b2947b50fc97b1d36c5bf9eb13a7b06c94212c3dcdab402a563262298defff62b836ead1f78f9d20713710fb48115cc5045ba15140fbb4bdf516e4150d830d02cf30963d
+d = 19cf4f4d06825499949f9e0b442586fe1bfe3459813a2b92cd8de0f775a4735e02655702ead8e60824180761808d9e816d60bdb0238e1e8039ca7bb63c92e1cf8433ef447e64ead
+Qx = 07b9cb1728cba80367b62872a986e4fc7f90f269453634d9946f79b1fedf42ca67af93e97ee0601bb3166e85357e8b044e39dcc19e608eaaa8a0066ffc48aa480c0e1e8d5569cbf
+Qy = 580858ab9223c2b2ea58df506d703d64b387a78ef43846894e7a2e47c02252bd2c1e3d21ada7c21d50a08cef0f9a189c4e850c058cc57c37918251b5aaaff2321d7355b6b555644
+k = 0726d5e317f888dddc94c73acb14b320ff509908052868f8c6b14e531ca467c1f7c8287476674efd0d636ca94c24a69d15210bb43a368a11d3453d69ca80430cbfb8b6e45d8f21a
+R = 04ec6205bdd8f7eab414110ed620dd3fbbda4cb3ad9e5559a114ca9344782847621961a3577cbbe43d94eff6ffc8dd7dd09c049239f026a928301ffcddcc910bf196853edc86d31
+S = 16535b1af98a75b9bc0f122ca3ce23a01800fa33b43584a94fd8a8d6f40077eb739f07c9f0e179a157a28023735fc8da2e2ebbee5f7308925900e657fae7c3b321f14fc45346f89
+
+Msg = baddec4794effa668cde267016dda67bc70b847919a9aa595f93ba9dc27354399ef7a607fbead31e57a8ce698beabb10f313d393980425e67cf95be45d512f00e950c0c5409573ddc3d556f23daf056259ee8914e860562a674311452fed780b3e0317a7fe93baa81fb98df3ae4328b28ad0ac8f8ea33efe24faee658ad026f6
+d = 098521a732e72ed945a549afc92318fef7156ed1d1ed9bab93b581478cb2339eb32bcef705c9bf61cf2873ddbadff8ff3806740a2e30ce67d1807a8179dfd5d952e6f8a583baf81
+Qx = 1e09410bf4f84d53a2abf8d106fc64e643edefaea263dc98c308aea16ec75f083b3e6b442ab261226c59ca5fa622db68f5cb5f2d1d465b01d0048554b0ccbf67c0aaf934d2365f6
+Qy = 361e5b43d313a62c7b3897c7db8a42116127138a1009f0bf9892981fb4fd6ae231b8940e7509f96e2a49285143010dfb4516ff810a91a4d9d2974c522ff343e93e8aad00aaa78b9
+k = 128056de96666acd09b93c5db7ba1b8fabf57251ec480d42b702940b5847d2a59b04eb5101bb3990c3ae2a41181f19a2afcf08424f8b922a95df6b292b1856dc4a9dbb1c717ba5d
+R = 163483a7e0d1012695ce0c113ec8fae3694bccd40fc038d4038f81bd39e71c969cc7f0af8313a9fdd3d028ab24a43279569dcba73fd78ad74897964ae715928b1cf7fcb779b12af
+S = 10aac6929432a6bc7e12ffa86e4d2421e0535fc44a1160fcfbee477c29a987e783a7f753eb2278ce08954c7e90284d2ce7c42de103a9c59d8e4c459b457688ad515cf156cfc56f8
+
+Msg = 7ef7138fc657492d229054f8a50dcafcfcd1dc06f1c16640af3f658907e2969248b54416066eb119adbfa23b8dc578aef18bba79610b9cc109394b900a25e55a779230bb858b2ddd9499a7775d392328db9177aa9571c2f61dd52010b48502154e914a0c55a54edcc04a6713cf7bda8744a893926118b09df877d1a4f3d95e8c
+d = 0336fb21549e397a190beac38a1ee10f0551952da15f71e11dfda415e5ee08da2356f114d450c661f52b2b32cfc7b9be61732672691a079f0927989b7e9f4efe6095a242155b641
+Qx = 316800fa2d8f8f3f9aa87ffb628dd7b2f63d4d8389ee86ed41bd4c3eecd3f3836ba92e2ff7ee5626213f9ddb41b43561c5dc0bcc3df0a872e4b8026c09c7b52b89b4975a43f60b0
+Qy = 207f956df58f75286232967dc1d3e6507634f45c0014c48b42868fecce5b9434463abfcd2b3722a7f5ed25607270148466f6ffad6a8c86e538640ece80e84f7368d33c68807fed6
+k = 1517b3524b6d43dcf3964f7c35c89bf14dd1542c37606452e2035ff0bd0cd1edd6d7b801ecb1f573e957131c0b3f30d5006f6e4748a11b9db10fad41961f4ae53e848c6dc6e1a52
+R = 1ffd4865dae7387ed797c5ffe58a929cffeab521e48284bd7d4427d5856e9d2582b91363f1d353a0ab1aabfc132a778a516d4033c64cbc991d724115d72ff8e94ab4f95a9514843
+S = 10f010aaf1bb714042fb8cf06a9501dfd1ffa598d6b3e68e7addefe00e18f3a5db8414d625e374d9ae70bea43b57c6be4a590c28e50a548cdb2e30dd9d6e3ed1d9cdada9f8b0049
+
+Msg = d58e1ff1d49a471d0567ecf8f29173dab5fe5f6184ab4cdd095c231fa7b82551f99a482994a46c3d8ebc07297fc9e952a5dee7d5f199b119f6f8b250f8fba45701ac252db725e75c4da27ad77d59a4eac448e54a277986740dfee6596811e59afc9755e53d24b826c09e497e29e69a22bbc85be11763064e9ecad7ae66458ca0
+d = 0e287ebfd9ba294128cbd484fc5121d271cd33e685bb1804f09b40aaacf64b5a9f2cde9b30a4a02d3a9bda97d92f46bb8787b3c61f280b1e1a0680f1f0679d3bb34d53725d62e52
+Qx = 52903a7afc17cce078b4b658766a67f2f75ac04e296757fd762fc05d6a7b4e4151598a872eb4618efcd06c43cdc3e54f437c0ef1b091ab5e4927d3ab4227fb24d4413e0327abb84
+Qy = 385e808bee8dad1a1b84d644aa29fec324dac2242709421479fa7a712d18b54db59778724ccaf4e51a27da090c6dd0b7967024db0a8684944b77295c9624ce3aba24ff48c86ac85
+k = 15e8cb22e371965801d99407d96200015ba58fd7eaea52c03269d8a374fc7aef17fbfd4480d29b781292e179936a68ed175802f34043018ed1d6b5a4df667d859cd2ae53ed3cfcf
+R = 0d3a57af73b7504ef18c03ed2c52aefe1d1a3f0e27f78c11d45e9825647d5ff6e97af51a5e366e52e01e5e832e4264a1d5b6967cd9debda59c955568e4c8bf804d843a49a0c5401
+S = 064fd7ecf4470f07b4df3b3046041e49f310a463210571606f00a1915c5220a27bb7a28cd0bcdbe374651aac06d4d9e017e31879b7819301eabfe3a7afe4b53f75ccc465815b4cb
+
+Msg = 4949ba765c14c31f68ee0ca26bb42ba2edee63537de4a6f5c42bbd862c21288d6ff48145260365193c6fd2b56dfb014da26b8a483776b717c6874f627c9a622154b824565b23e178240f53ee9748c45759ba5c035b584df0f09504e95eb9bce0301653aadb860bb25e6ea6b9606e0ec3bdb8089e6aa0d5763d331757490715f9
+d = 149de496fa8f88b2741864d0c35b3df666b87179b7bd06cd426a45f13bc87ea9f50dea85e1fd02a532630e0e3a231cc3e7fbb7c7ba85b40cff1124e72c677c6a3ea6aa40ffc64b7
+Qx = 0bb610e4308e229e4b4ddddff5c4633ef2ab40bf74514433bd068c7d59a6260ac79366dcdc039d5585e660a4cbee990a2cb55a99ea3d26dd9df856b0f3ee5b968bcc349240a9a2d
+Qy = 3e3ef4be63fde6ca09f12f8220e1d9b5016f267ca5aa09a2dca8a0e0feda9647fe0e1f7ecae7147a10ff893f69a4f74172c6e9a62f0c5bd96d49b47379c9c84f5ef8e59dea104bb
+k = 1cffdb963c2c8b8609809e998075299776b44d2808df509773f310124b5f318d7431f1ef8b38fac5cd5580348abc41e6e6396767f4780656361dc9a71dcc8e7c9239d6eec5cdb94
+R = 0982b9989c92e1a5d25dce832bd8a3f602f0eaea69abcfda285cb3841fe3f019503e6faf8a693712380a48a6af8844b6bd718f0edf3b57662a4fe82ee28d036ecc4cfc7310871c0
+S = 1678bec58d69def3fe35a64810b27fd06bc29d165593990f6f42c4c7676fd5d4a965fc92cf20ab8616c7ac7b4b308ce6290c5e8b4edf6859fd6f6f01878f2601e22acaeb5ce1f36
+
+Msg = 5bc63e5c50b1650f0ed4a599960f1e4e11f6c151b2123fd71d9e3c44662312a74b6854290628e20b30eaba81555acb2fb49b640bdab2528619c7fcad0f2a2880c7ea232d427d7c935fba2313370fda8863a7e7e203d63ea15d0cfa083e716ce6068c63fa616ddc225c9e413e694cdf6b355cb1293af5d6cdea51168f5634e878
+d = 17605d7c5873d870462375d741b4bc6375f3d47f7f5e9d998917adf2137a81e63b66917b3dda8968930c4b850f2270eb3187fc756e2beeaa67fe0d73053e6cc0ff0004a21250551
+Qx = 0d8ac3e76c25cdf4902426569763f4ae0638ebb1fbcee6e12a4e0b89d6d451cf420d10441a0a9984710dcac13bfd7ba70370afdfb58e2d982ac367e178f6834b4cd2d232e7f246e
+Qy = 12b5fd5b686e58df08b695fc333937eafad6006be5a7bfb1426206102a79bc32fd9ef46e19869448fed0e917fe059b76c8b5a9c403c3921ad07e6c19ca7bbfeff5491b22f8bb961
+k = 09179b3ea906137dcdbb97b27f3690bbe3bc4f1f57c46ed60b8503cae97602717a0724e055a5c52199ae3f08f1586b87fbbe514667d2eef2fe44092f3c916976c7b71eed67e8fb5
+R = 05b28342703c83ec2df898458fea6f71030e4e9c567d140ab09cc95df29ccfe199837cd58ed00d07241988bf3c863504d065ebbeb8ed11cdcb02da0a945ff38ca58d629f76832f1
+S = 01442a5606791569749b5a9f20ba8eaaedd1a2ceaab2ef55d5d41271ba23f6a5b6a33c76763fc99b291b07283122596a3331fcc9ac038447f3e0cb54872c140300fea65d7809191
+
+Msg = 610f6633718e49d232b3798654095e2efa0de11f41258b27aa01956480c870d901efa77e109d5f95f1f5101d3c90fc51312d9b3019d2e42e0067eed7b457dc7fbe5466923b62c83d7347e4dada571b57813bb9c21d5e308519b8eedb7a7706508ad04aa69698e03636eb30fd9fb363ef3a185756494ee01175b16847f5b68076
+d = 09214dc2da0967912c31995cb8f5bcf4bfa832c5a2d3610f3a9857e5eee7c77100d599d9ed003b4106013155dffd6c48859b846e45e0ddbc5fe24f4891c9b2df51407e9cddbd974
+Qx = 64376a92c1227c1c479260c7497147760c103bfa5be95ca1593f29a851daf2e5c3a5c73c1fe3e6e2506fcea710254ab5eb2daf8aaefc19cbce7b1c4afbaa2fcda1ef85750fc0a3e
+Qy = 70638482e5c7c17a82980b863cde11294c0df717bfa4b9f884cbbbbf80a64dd2cc7c7d89ed21e10561260d372da2fb726de71863f0f60e8ad0fa5e74fb5d29bae0cbe8ad6b32f6b
+k = 0621176102c6ebc2c810eabab9f60feb71083c07751c66f719370713ec2de9ee3957bba8d768b076885db1f226a9d37588abf1b141d81b70f0af711c52edd30e92e34a1d3ed214f
+R = 1a21d460ae85d0703b4b10a2f77547e45135048ffea590ce86e0a1c049f8a4aa7b395f723b7480cc84e33f4772df8f181f3919f3c0b0b4f276b0f855174103a2f7bd757584425cf
+S = 0b56bbdf6e2be1b9e754f9b48b3ba9a13403c17c5cfcc4910112704aceea9a34209df406ee40e0a10cbc26d03839f95e775e80ec5e29b156fa277a5ac68abd99c7005ea6ba2695b
+
+Msg = c548f0546cee0c0400401cd540a0aa9377f27ac64492e6baaf38e794db4df83e64ca3d83b67bbb46a6c269c04c2725287cce0dee984a0d468c9ce495a7e554a6835d72c7493bfe88dbd5a044a148c89001b8087fb03e57c2b7212d0b175d616333a9affd8a1802dd49ba9be3ab6c6d9f99a5578d26cc4707a5860c6c804d69ce
+d = 042f2682e9ac8b76f3c0880e12c292524601dce9ea6982dcf68bfdb0d3fbfb50dc9229e54149ef09b95bbf624eb04ce1427077f30d8536be9f69970ddb449ca22ab8368d2689ed4
+Qx = 116135b273ef876453b9c4c39e4be5a815874857f4a72602f0d03b4ecd9a4ad73b90600c71111e317df0782fc92e6ce2b194c204340bc11e68cc22ced38e99f90dbaf0f917e970d
+Qy = 36dfa65a6e9d0ba521ade7daa2f6b01e1d14fbe7b5abd29ae71c4eff66c390914bf46f09f4ab8a06dc0fad6fa257a85f993d6829b5e0add5086b8fe2ecb8027d08eec1bea981cc4
+k = 0bf116711b31ca347d41a6cee5aa13a74e042ffbf79d2ae9448598e6950d721b3773ae6f25d7b49ca9dbcd62feb011d5d556bb9f8a55a7acc9a3a166a4169351bc31a293db68eed
+R = 11dcb7f4103e814439df22764f776a74aa86ce9717585712b224803f0ff193d5f541d94142812c726b75e8c2c37f2a4c33db6af118af73d3ec4fda49cfc911fef1eda9a470ff200
+S = 15fa4ada3a6e95164aa8972f14ab7572a3b898feb6cde160b8f25094f67343d35e6efdfab18793f77e09e5a42f56bae747b2b66fa9fe1e4a97e5e05ca743c058b1024cc848393b8
+
+Msg = 9431c6c5237f6b4b35682a0c32f68752035c8b295a1763c5dbdfd73466cea64a00ecc11356d02d2a9211dc54548f5db1651e4471898402c887fbf45005a3bda271df0158c98319d4d6751b8ca6b07100182957d5fe0d97c4e2294406f83e9afcae4850bb089f2252490417b5afd8f07f4c795fa84c9c7cdcce26bd97273c0072
+d = 17ed9a9c75cf66528428e85b0f019e3488af8b893b12023ff1b4ca9c3691b74e594539afa0f4d7c3863d15399b862f15e27bb077392d6bbd546ddfd46728c75177338466eb2f4ff
+Qx = 760779389124c702686d8d7c25dccfa74fb333317bdb414965d2c271ca5e687c4cca57e6f6149e1714551761abd4d651e7b04451d8be8e58c0c9e361fe0c6771e3d547d6ac3e8cd
+Qy = 52d5725d14b9aef93b83d638377f5a19e3cd6e3584121fdfc2c3ba1a588491d7e9892be081c9e7585a15b37a9cd4c204054dadf06a9f4ebe98f95f6554941982faf109c2af98c65
+k = 104ba3049a642d9b49c4302e9173a9efaf215b67e060c5e9673521641c9c2a5b14bad25a448e46faf73810979a3a50104ec8c5230a909ae588213161fbc10381d7c75b35c84046e
+R = 1bf3e89fb0beb1ab854a5513278dbd8b9c6b05c94ab67145ceb1ffcd93d1a2aa374db46ef327043518a7f272b957dbbf9d6cbd6708f4c89f05865932b7e816b12a59647d972f6e5
+S = 13a8c121c9c170b244ae3a55aa2d53f4ae5af91b1f72c066207e3f52e44723bd4ae419d24821b83648cd64fa70536605912a5a9319dc446a6b2b639cb99ed2485271acafc2bc988
+
+Msg = 417cd5f60416f17081d2c70e9a510114e08be83573bf9deae75fbc3095dffc8a7f7325f61f9d6565381710eda871388cb17619e4448836076338ee309a2bba5f737319002e259b4a875cce1bb97996101c9a7abe0278dcac203a712f0809eb3c4b85a9c380550ab0bbc5067a8edfa78abf03c09b5c08f21714e1022ebfcada4a
+d = 1bcc09b3f2f1d26ab9955bff7e8c0f85c8a61293511a196b53d7963f4a4503849c96fb4daa68c9852ad9185e01a35f0bf298e34a09ec352cb6da34f89a1f23e8ea27712a8f43aa7
+Qx = 1326341764a4aea222e7413a4a6f7bdc0c35ba246e3c68728ce06bdb19f2e1b9102add88a8511130ff48c0cbe4012ab52de93329670a319f6b1e7e7dbf177667d4a98d3891ec147
+Qy = 7a4aaa73713bf8fb3907d49e5653cf82a9587518c2f8269cd1e556a3be3589dad4c238e4c80681e141be93c318f0efddee3e378cd46512d778b9033dc8706bb843a3c3546e76e4a
+k = 13412a98a2c14a9672ecd42db9c079a689b147ad91869c3d45a7046aa9dfd3f31edb43ce6b84e9edcd7e3ac6b96d89f13878cf5befb052a6f8a4e5577bdf916adb10d908d5e99b0
+R = 11c8a92044a30be397007a71d9af3e4222556a10f3a07a1521c1bcef73b4ddb94fefdebba5944d5bd91313560718a8f520bb5cd5666539756a5e9b66a1b2d18fde5ae72e61d584c
+S = 1ea510e23ccc7596db529dfbea78c99fc78ae53da32ad7c7bdb1df01039310988ea601828fdfc59a0cd237110cfee9de8711c073be44dd4d04bca4b1cbec278b1a9ef175d93f70e
+
+Msg = eced8c412a153a643ccd69596389f83b6a36880286f8aeede503452bef8305942d95734fb5733f37ffeceb1c2dae7b1396c3323de11089082745c28a1756f784423fa7ad68bbfbf0d93ff8b7ad62220500df6d6895788402c1f5c69c06dd9ef55e2401cf297184e411be87c1bba657f847208c0e750f94a3df92f253b377b4da
+d = 0ec52fc3d9c272ca80623e06b15c35f349b13548ef7ee400bbfa04196850b3b8cc7b239238c827f9b0a3160cd97969ce21d66752791f5896e0385b0527d4d77e4b9fc70f04d73b2
+Qx = 5cd2e63dcd48fc793c18776d030398dfe3f8b6978eec6d23f49240581fe1e141f667498421f4c40a9430587fa282441a78bb641894cb79d929c299f1aede218a0078c247f740252
+Qy = 0cd2843ca87d98f6336c0adb97bbb9c5293a03e5b86d5534e2849ebbd73dff837ffa488fad7d134908234d0d7fdac8c7fafb4729ecf0516c42995fc9337f60db2f36eeac69a4e42
+k = 1c40a15fca0c959852afcb4ca6cbcc99fb680950c64ba18ae5388bf783052b6ef3730b1fb1487189ad983b6a68bcfbb707466092da52ea8893d8bc4898eb133fd771e78379b9c13
+R = 14485cb1caf1527350587d6695ee3df2b21c13084df0c093ca5109d7c192e7e5df2232ede11dbe5ff2f46b13dc2dedb709a0fc1641c1f32857040147599d8f179fea6b2f2417646
+S = 1a16ebf12c11d2d0a64b7ea124623ffdfe2650fc9603ded571e76dbd7e3b27cd32fcb709e2ba04aee0e8e1b942a4e829cd0c9683aee67eec27d4244a2cefc36f84f7de209e22a62
+
+Msg = 30e83ea39a92036e22b7bed7639eab5e5be1d00c20b4a9b9afa9a0d1653369cbef363c119cc6f921c8f84663949c8b8dc9b743ac2b1861a480476e9b64c8f333f34b6fa0e1ddf09d49618ee4f3c1f46751b5595f0aea413d4ca46f3c26b974b112cbe99c813a96a4423764c069454946f213c5f066ec38108f947abeeeb02fb8
+d = 06403de7627de22d1dcf6b8da5af62f9ec59ec065cc1ca1311bb98aa439a6d5985619b17c17a70f59e17cf180ea6828ef57f5f1f8ef05680a9fc12ab7faad5af61e4e11fb45d341
+Qx = 5575c329d73f261ab6897153d7261f87e9730eb5dad49c05d782cb02e483fac4a9ddff31d2fb695a62cdc44edef6398be8f4f84aea1d63d0b3a771fe91889dfac4780063d258325
+Qy = 183e63ee783abbd00547567bb99e9b578ad8ce63d229db41c6877534487568c423d4c389154af9627708d8d8f863597bc668e88f9412b21a6696d07bba06fe7aef93b26950c69ed
+k = 0e751a4918643ba3e68bd9406a4386e876d0d66342aefb4ef75bc4dcb8cb2e2d9f8378bd02c388c776535ba85d24b206f5bef4b2f23a1c99fe2f2e8ea201009ca468e5b2e21dcda
+R = 0ad6792fdff4c621219549834cf03808645171d944088f5a6d3cf1bd826b5588544a32f231e8428a03ec02d6c1c1243fb6b79b1cc6d732be5be8f2cedf03c1e5588822eec559b7c
+S = 178b64bc5f9fcedab17822e831fa52d49ed10afef1c5912893df4bd8dc960b474ed25883ddc343341b696fdebd06e177f234ea45553cc83920a8c799ada2deccf1ddf1dd9aed863
+
+Msg = 3ed244dc16a5cb292db4b1433b0ca3226913f07377faa20c6c1402cb4d026de808ca74a6d4ecdd7c4e662105bff6edb9fae0117c50aa053aef677c0750c7a446edbb879110030758912e8fa666489d702d8fceb719963b24a256429bbcc869a1f4ab9de9db89263e3684d4daa1df2ed94bb59dde2abba63793e5f82aa2e4db83
+d = 01fb980aef64254aeb9bb613ff2fc6967503db4bc1f337882f1566cbeb57489cf32e34f310549f41cba1b951f487453c29753a184e33330e90d4b973d2e406c99a239a5c3f96233
+Qx = 36ea761ccc71ba55aeab229aaf874a7c2d1ec15d821401e2988dccf02798c4e7bea80d9fb8d30be213fc80475a17f45d60c53249b66858d29c73e73117162934dd71096d746742e
+Qy = 49bc28f4d45d29c3560915698d03271028f56c29f0ead0608cb72dd0b62490f95bbd67145a6c0adff0d6ef396b4deea6a5e2a33f242bf17e907b136c039c127d6012c88b76aab3d
+k = 0ed404ee6b59ffc445b16f11b9b1471249443f8a7309ad8a662b7cb44c94866828c906fd64784c699cd29d3d972e5db3d42157452630f14536eca23cbbdd1d37e199e5a586fc352
+R = 1056938496df511d745f2cb88acad279ec2d58bb36498fcd8139d426d596de6d145b765a5b3e8366845fceae91d14075356a32515134e577937ce2af7e732b4e89a9164d083adaa
+S = 0d5156c776f2184babd69c1f200b8bd94289d45a2f8b7cd8e8afb1455e8901d8c3ed14b7a23b0976b85a22b86f3ccff4ae91e286f696f39646188b675895684f33f0368098fa7ca
+
+Msg = 40343935d9423ad30f3fb1832bb08a5d20ddb3a55b59057cd275320db4a5835471c96cfb7d67f41ef860cf5879897b8dcf307bd1a52a6226847b768ea38ff1858f59e64cd635b51e6863773cc6c64b363ec47ca39266422406264668415c189e2f92447ac4c63ee5d74e95d1e6af05016917ad237f482ea0b02aecadd370a8bb
+d = 1d96dc09dfaf602789c1dffa5c9ba130832badcf180429660daadf4cf1be5cca92fe9713173861670eebfe3a0ba25bcc76aecac60a756f07b69687e05c7e25984a39556469f62b4
+Qx = 452b1cd70e3c88bec1fd0e4b8f8e9bd5f844ffc12f3d6769eeb1c9ea90e599619908682eb5e43b1d6eea63ba9353fb64b59d6549d19cd95f2f54156c81fba53aa0dc91244e7ab8b
+Qy = 20926ca366dc657d133f0ff9149738738ce68f3cc2f61dad590e2502e8fea714b89543f43d97b46b7075c58375efa379cde208ce769a16be9a377a111a8ac51459840a223f34695
+k = 1dfd064dbe64c25a832faea1819cd836d22583fc40b2ecbc19b1f5173c25f33ca8cb7f30bcd619ef73a4c14c46e610c8996059612728f508bf7db7ab3191ad61955e8b1ba409692
+R = 03cbb0ae5f7c0978ad8c10c4ff099767465ed6fefb7358f3eb58a79366707107cc88b305661526f2972bd16923375dd898ae72e81f290b86cf9a4dec086d7ef04d7a7bba5087f8e
+S = 09f77a86f0da4e35c395978603cbb9c4dcccf126b7cc924cf62732593bb1aff0dabb6d58321debad4410dbfa1fb8fe249bfc336db7669e4ee13485ccf8dbde01ca4cdb9acfe5e74
+
+Msg = 274567f8841183e68c4f6c6b36c5a52fb0e88492e4076b9cd768bf571facf39dad6affeb68941ee326ee461ce1f33c26e4bfb3c9e0cae8241fbcc14cc69c1af68701fd0be3def1e87b7d52b682ebbe1cc225c1bd177b0886e3698a06d0e410a1f92c9bdf7239189f6acde0d0653815a72987671b415d1e8a70e685d6e5b14c33
+d = 09d98b32c8eacd135ffb8e13223690ef02c0c1f29ea8b4da193502c8cb3f39f9eed608c02fd457f2fb685ec4595e8fc8f388d26778d225d2b18c9bc8b199d8b65c0d1a6af33854a
+Qx = 775560724ab7d98407e20af12b03634a757037f8b3854957e11900d58460ca20d93ef06436921f8d4481ff9123a9eff3973e17d441511df3cd88d0d6dfc8016d2cbfb8963378463
+Qy = 3082aa4a81d4e6f0ffc94511327202f2baed72c08026e05a288eaaeaa36a1a4961f400b4712ce68778ff38be43adc2222a986ef0fecde62f861575842429816c8fc77797af018c6
+k = 1f4acd3430931ecba5e9d986c6712467526ed94a0bfff36135da3ba7dd9870ceb38fa0b658dd391ce658774c6725360dc20e5ef41daa9cf52fa863840ca91053e7287ed29ac69f5
+R = 0502abe544fc3262663524cf88a5bc256b20829b7bed3e2779f559506adce3c4f3a89e18bfd31819f78ae3809d9d0710c6591b2fc90039328678aed9df2fae38a74b66f69295d82
+S = 0b2f055248d9633cafa4db3b3cef0b76ee02f6bda3d508e19c68870e76a02c69dd1013a03fd741e854cb34f815432bf48138203177141be7209e957f4db1a958fcd45421a213c98
+
+[K-571,SHA-256]
+
+Msg = d9c99b8da92d3c2e40dea3c4025dc37770e867c4d2746c4d726b6de24250591a586c166c88acb8ed340e161d4c81b9d14c919a1b06f1feb22c5ce5fca2693bdaf4994ac72c8983c87f331473fd094eccb3d5f3528e69d487562fb5a65c150a8217192f8aabfa7adcfd0b6916d5000248fbbddf1ca2f38e3d9ed2b388998b7cfc
+d = 04d873ac744c4f68bb044783ad69e1a733cb8b8f483f2695bbd90c4211282036ad7914a53b25c3e890c6824643cffbdc4138d7ff457e3fbb99387494eb5cf2bdf1ad243a3a1e644
+Qx = 4644456a4e5c543af7a086640fa9ff6627c2d9f17066d255c3e805db31fb1ba895682e94f6ab96d6ca449b0c3f76bfd6593d182f422689b31d9dc3bc0b70df210a96d19af9ec2ac
+Qy = 1d38f8572a06ce22c1586a8329f9421414b334352f1e8b961f7e0732ee01e838eb975bfb2f62132bbfd9acc6ef8899b4fd388c2b59e564fc3670da7a008ca016de678d6dded137c
+k = 0b050aa7266201a42dbee063ae2a21398ee1d2a190de9fbbce2468836e416b3ec18d7340c81fd2a5283713f9aba33e8cbb105eaa2abbf0b687fe2713921bcbc02a4b77df21f762f
+R = 08351115714bc8f29b84a6e3f0a23bdc219d4271a9ee18bdab54c3acc9cb3468beb1f89b0f981da5aa7d7ec7ad451bc5e91bc98440fe20f5877a4e73614820b9ab6f2bad3e2e609
+S = 0c64baaeed68178f5a1d8f095b0932fb73f9a02462df5e8378746ecf17d05971a0a287d5a8e0317db055b02d4f4b5864597d0f9a9cb1ae68577dcaf7db09c55bf3d3575197295c9
+
+Msg = d2b88a01fa17703c99e5b867c645e98feec0d6d1afaa20a97b5fce9c23f0594460142af4e36a5739b8d26d3ba35a0263caa5429b4abba157f359fce701c43372500fd2ae1bc2ed80bfcaf8cab7016ff93d4a27f565b7e67fe7dde22bf02c48be12114fbff2421517c825019c0ccc72d927bef156140d7f0e9b6ee37af78c3efa
+d = 18d2eb947297a054f8a789771dd875b12b26ef057fb91235dff3b062916f85aab3365609bd2a38a861439c8514e33f174c198139354e63766942f605107cb1b9709b782622b295a
+Qx = 3f6454f1dd032a925c6bc3e1c62892c1dfaa700d3badf83f07c1185c31ea817641865a129572f3351340fec331f5ed466db7bea3ffa9723c951b518ce6f3c9263a7bd6866c8b0b4
+Qy = 188877b68c10cd6ee543cc5638bf0f82db25b9327b2d81269dc61250eecb976d6568a9df29277836b97973e3615e0a4345e610b33909c2340a23c61dcc6e2baf2bc363a33381802
+k = 0ec6af799d92ab52c51cebda61ab642d4876f374edb17253a1de3e880048355e58367096d3bc0402e4b93fa6a6c8d55c529b9fd68a27962c19274393ebe1bd0b1197a28125275bf
+R = 095c42b3ef01c0f9ab96693526e903ef3ccf0d843776089d15e77093fa9d010872d65cee1801f821bcce747ddc5875eaa462b00424e6cdf0995b87c6cf33c37d4463848a6ad7fee
+S = 0c4f0edd4b2dff4f9fd1fea5addef6d483bb51c27bf5c7aa13f9482243e5ed5571bbe0a658543c69b731de56b6b34de27795095b3676375cb4686b45d48010fe8c941208cffded3
+
+Msg = a704a1428cc894f958774368979fe075353b56790555386e3b043dc6a2919b94a11c7f85883f46b4d47b324d349c28c667bf9a000daaca1d7191f2a0fd97a4867aa9f72422134a690625408a9ea4b723704690b69152655f9e9dd5fa3dd94814d97dd4f13e85c3f9bca769491c2461fbd17e28afac00bfa81371d5039013da8c
+d = 0594fc0b7a5cc0216d2e78eeeb6394c8225de795f4b73bec48b2f4ede185ba622b59a16dd3eedf8cf2c94f2ccd6dcd205f64c97cf1b7f1e34129e94b5129502909f43940dba0746
+Qx = 271cbd3e0d73ac19b975559450d686ed67eeaab4175435b2801e8989966d7c5ba81ee7d749e43dffa12efba820462bdb274a57d04cd7e92c180cdf555686c78aad58444d5f17129
+Qy = 7c407b46e93d4c2b12c967cd3e41320ea8535a2ff24372a5791fac9e95865e14d545dd3627dcb4aad2350db248ef49469ff4d59a879a84a19d1c0e5d7ad3db432af927c88aa5d48
+k = 1e730d50a9747c7c1ce2918fda7575bb81a74757cf9625d0f0619aab7f1eb6954dbaab749e573290406e599eddd7d3376dcb3fb98c116ed7b65729dd04ece3eab1d7b4bed52326c
+R = 00d59ebcfb30d7b27c87d56ec2fc9286b04b39e68dc49b395f374e19647bcc58f2fdce1c0dc815cb2aad55cf863a4786efd6c3a0ce56c1d92aa20a19245e74550c17fdaf7a08340
+S = 134e80d63c9b328e02ebafb75eabf0fafba886f48b25206cca9086e03658ce2047c94a5222a206c6c5a57ddb8f59c5ba1408fc56668066fef4557124c430cbd1267455e0b31a8bb
+
+Msg = f8a87c4acadee27a908718461e3b45060ae4ebb009b10a15926460bf219cb7e75dc3a993fb9a741b94e2fd71615c50f6df958568f452b2cc284f0516816bc0d2e2d45f663155660a26326f63f4aa42a6e1cc8462a2ec620a365257ec042f55e4047b62af689592a1a072553ff174dd629a4f51837780ca232cf479a68c1ebdda
+d = 0f000631106c5851e8ae0802b01e7a8a8540b427a8a3956a1d36f0600be89318032320cc420931d825cc964e823745c60aad3437ebc1c91d32004472e9677605fb708e5a71a0d83
+Qx = 34136cc7b8e2dcade5cbb9b3d0e0857c485ee791f862273749b5d3757d072bbeccdd8eb81c67fa6927c1aa54d823193c370fc596d0d903214d7967b905292f4b96549b3dbc9b47d
+Qy = 56f69b42b29ea82b9f2fc377e874b58ee785010bb7f5814907fb5531789606810b71613a36035cd257864e414fe0e6ea353f398745df87ccf25b3a25cce1c78f61f5039d66241e6
+k = 009781f5d960870a289cc20f6b1af56602e5e12d9a7353e81b89a90b0a9675686f15511157d9fb70b82e8b2e25534f8ad22e14ed518e62a88f1ae21c56d4ab7763808851762d3ec
+R = 0f3eba5ddbb8c127419fe5e8cc1aae2239bfbcd2ab43a006020b96c9e7db832fb09e0bc887aaf24848491d4de935b78141f426875f7dcf2937748afb303ec5eebd01b6a82a8c4df
+S = 17acc35bd81cf24f983072585ee1e096459b408da909fd82b5ea86b77154ecfbffa7fe97271f50b67ca3c29ce704b28186b831300db0aa0dd6147d2d160e4aff14348ba76e6f711
+
+Msg = 10b5438294a77c7e517ecfe8f8cd58d75297b14116aa93e574996ec4acb21837e6297cc0e7e7b5861e862062f192f2206a01b1caf42c6d7181d02c7d62b76c2881f8479449b02d32c6f792714d8f70f0c75e81c7d9abb996be87f5ad9a01fe42b75855558d5f00df392b62ae0d258f3f67dbeaf07208952e679a2c573aca941b
+d = 1023997206341c6147c536d034a9c38b4012035dc2c9b7ef0bb9cfe65e7d788296f055d508a1fd957b2dc7f9eb10c27790f15f30d81670945e54a508c57b70b46b4a09f4c769289
+Qx = 66bd3f503cf42a20cea4a55cab75940907f38fac7fb024c55245f02d72d80336574a72fb248b1b61e3205b31489ed789ee78d88e487db3f5a1cd48efa1487916b8707e72e4be7e6
+Qy = 10b6e4330af0270abeccf0901dad2f8f64f4993ca93a7c5281dfd71c6ec405f9a9bd78008fd22fef76fb79e20a571df16c4d97244c7356e3ad16cc489d3a9b2e3fdcd5f23b48e26
+k = 09137bd8436dd126924943e8599c87f64564297117766580e6344aa3c02056c811fb996f264ac4f8f0cb33eaed5ef8f120d43a1d2b3e5e34697765ff9db4b4683ce5c1596d74723
+R = 03b684a66e92d352847f63196181160db3de7a304b6e43679340eaa9fc828322b5b9c16a1772c981ff0febb474488daf998d4acd867e78019b61804bb675a98cef24fdad088afcb
+S = 02649a94d2bc243e997bdf27be7d6364459c38845c3bc8d1c8b549ad4689c8a4b4fd55193ac769b1da607dc96458e2f6abc602bb4048cf6b0933da6785795d04d10f22e439748a8
+
+Msg = d83a52d43216fdb16b1b40469863ca8eff4df9fa358deccb5ffd18b3e22a9d654aedc98f3dbdc4f5b4e56b4299e25d8a5a38d01b34eb93de382df1ae4d1c7f966e84b84c393d167aecc6f1192c4b42cae83748b1ee3d9147ce7de74cebd122695b455e8082f86e3e488fb0f51b3b7edcd579940d1cb9d045296e5e38f201b7ef
+d = 11ebf320ecf6a908ea5b868afb8e22246ce84e743e1076d6185ec65dd79043380708bf8da4ba802c3b93b8d15509bb7d7de9dc29f1e9fb0f0f2cb97a26698f955b1f7ef668122be
+Qx = 38b2760315b0999f9629922bcdff65cfdee4938d4aab8cc3d200aa9c1db843fcbfeb9da10afbf10280110c49f0c18f15c2aac4f39af35a79557c68eb6cf6afaab973538b98b0a6c
+Qy = 7da55796396e919f9b5967608af06bd01e8870354317e76bcb8597a379129e35bcb69bbf6b38911a03c3076f7fbbe9b179e078b442c604519e330282f6f6c21aba515d6d73c0257
+k = 1c219274e54a4c5e1e1aee3bf805a7002bbfe1c030cd4c8a1617dcea2a14b1d537a64cb07c5a1385edd76f3e4ea9a38e38b458d2c7bf8eb56a57fd33166bf59a8af2e9639106929
+R = 08677167a7ea1aec4de76d1c5effdb5a1655965850bd6498aaa4fb3fa50f213fa4d99caf4145b4ba87e34797babfe614dce6ac21d9c13dd0fcd9802b1414aa92dfa18318c7e57eb
+S = 048d6161a3739fbb3ee1c223bc82a46255d10a86a605f6c8e1934b13f1a8662f30f8e95f53848119c61f08037ee5a2440c8faa11a6b1800078ed476b2a3f4cfdb25367c8dc2989f
+
+Msg = eddf5553ed4db6e8ce72cbcb59fb1eb80671c884ebd68e24bd7abe98bb1f40806de646f4d509be50a3fabfa85c5630905ce81abfad8a55f4cd80208afffb9056bc67d9dd7f4660a5f924af2a3745eec2daec39a3fe36131fe9eea444b92d31f6a125f12125159ba095f89968a7028549466f41ad45668a861f671050d2a6f343
+d = 0746d5c824d78f42a1fd63d8fcca61f154ba3e75788b7a0b87f53e5420e23a935b02eaf67bace8dd8a8e7c1caee30154c2428e0a437cf12e235f41c416f92fb54528865fd4766d1
+Qx = 63645fd3810e2458d15b43287f329c354b07324c0707f19847c544f129e4de1799996f805fab7dd356567970e10eb21d875e8ee7bbce56c666511f9b4a4cca986683e937d6f0b3e
+Qy = 595485c9a7f2a97fa7f8453df13b75682931fae10f3441042199fedba91a58c105df57b83d2a3911a2d34a2d41e451d0d2549b0a0a65b42aca40aaa618c252baec171da7937d812
+k = 0674788e75eb9d5ceaadad9fae036f129178fde1a584d73cf284acae3b4cbcc208ae7a5d35aa473f4e1201c19ee5bbe685ff9218a8e2188f3428ab45bf09b6b600fcf81fadd8d69
+R = 060d6dc42329687012a93ffc5b846b4dce3df46ad12eb61437832f81f4fcdea7392582fd75e701e106e5b83521759da6a22a21addb63b73783592d3f29347f3d484e05c19db148e
+S = 197f3b2d4f3e10425f4cb60dd1ae84fd8c87f62a2cc822342d5f0be4f0841623227c5cb0f8bf83fef483a061e30ecac86cea0210036083a99fa1247b49e19a7f401a815cb68ab3b
+
+Msg = 3db94335f6d1a125309622c0a9d71bde1da09371f0285a93bd0aac255fa8f10a56074e0f6057f1b1aecf2d86a2319590ead96a2ad1336fe844e09339b456be32374ba2e659fbe9d0f2cdd83444d117d2ce3204ce4b4294dd05405634b84747ffb4227160c4e5c2c9da9815b0c6d20f55705f16cdbaa13d107ae666d707ccbe6c
+d = 00670e72ac2de50dd2cdd975a6cdab10ac45e37ef7a28c685d77447051496b5e161f8b1b93f6c7f32fce8ea05e94ed35fd7cb28c44bf51ea29cbaf5aaa31d6abca30a89430323dc
+Qx = 54db4acd0815aa7ebec4f7661d80465c64f1fd4147507549352bc07dfcc6041ad309bfb1434b60f73b3d61ebde91f849004d55257e98b6ebbbeeabe960f9429a55a36ff75c1124e
+Qy = 5b6f36f76b3b3c780b6a70bb8ea150e9cd6895ff6a6765a3516acbb4f5efa91434def52dd0ab81f618ff28db10fcf39264be8e7ea76e06516335ac5ae33ba5393080f114189110c
+k = 0f74a0ec1a7496043d78891e308c82b4660606642ea669e4406683d44b79dd6e6a1b810292bcd6a9f59bcc2e590518bdf2e9224755654026d85cf2a3d9768d909278448f0d63fe3
+R = 047d808febc1065646e6a5608d62d1445d922084487a64e9ced5fafff2977eb3a7e29984230946e3fc77a766820747122fdbbb9100c591ad7c9dd29d07efa2e8a43357e3c47762d
+S = 04dd6c8ce75bf2792ef227cd5a3102d30a9a31690ff5c21354f8dac9f826c86ebfaa04653f0ead103b1c8ea59f0a78f5d4e8eab597ec6c028ebcc57f4ce4103ac14579bd6e15166
+
+Msg = 69166ba40768d0a3930325405edfd85f3272f7b8e600b0b319f070274c91f9f03d0e6ec4bfc7b4445e91b87cecabfecf5e77c7301ee3c6b0affca2fa02c92216698705eb75443eecc25438db2d2fb4b24f4195d6b9c05c53e0868d3e58477100607ffdc31b18c40b4ad7202bb034e58653daec0f6b33c024d42a3fc84bd8f86b
+d = 0369a3bb96f884983c23281bcd04e24a3e5f6359f81e3c8e46f3f6b865eb6bdf98a630e90646275c587e41b546d3ca7688cc207afda15cf9b25cf83bd6ad27908647f3f9de59de7
+Qx = 0eb02f6e741b3f83a9dc50853828b8a6e0861ffc644162515a264730c662ba388ac0d705f8b36f5388894df5c1bbc3582c85de141abb7712caadd2d616da589bdffdd9258808a41
+Qy = 5dbf831f450da6f8e503c19a7788c1317ebe556a458e2bfbf3137f986c9c966a14ca90344be1b76457159c9d70f13af7fe0013cf605010a8a3b84bc0fe187c7d93e4cfb2639de57
+k = 0ce22f7f2f01355280ba2d2cda06a55771e66f598bf79c65171e08a98f1d954e4beb3ec77ab06ee60c5fd156a7098023558e3d630641579cc179739bda6d860f8ba1d5ef717ebb2
+R = 0ae86b40d10ca45c20bdb3db55a6dc12e9b75754679eccb44c40fa57351c23c062282e1da9e1703176e4b8f7f224982f2474494772a20269c43a18a7a03fd12d8ebb975b83ade0f
+S = 15ff7b34c3316d9e7ee3d7b48ebf97d98453ca32f3fc67fd08761d93cf34cfa5a2314fd0752d263c3eb7cf842aeac395d41ad3c04c1a9d3808b4fb7489e880d130c35a26b702952
+
+Msg = f64cb668b72f1e6dd026a478505c0eb33446ae9a2993bc7648aaed02e172fa9a0e05eeec61e756ba246c1dad7e85d3f01baf734b1905c5bbd1b08d833c2cf1e079eca75b866d705c407eea8618d23ebbaf269c7185984b3bd4117ecfb295ee6b47eecc8d3a78bb96552f6be314656f91caff793838226662c75cd7804b6bef79
+d = 026717b039df834855511815d5665ff9b654facab469390ae257b7f0eb4dfe66ea0dc037242ed0c13bf229b8f7ff26da9b55fe4750d3451c62804aad493c179ae45d08ece5af085
+Qx = 191a6d1ab9cdda2d593d5598a966efff829c04c421804c2297e658adc5c9a6092e146b25c730ff7ee65cb9812ac9ea0c18dc6b60deda948b4b7568e8b8e14411a6969d7764652ae
+Qy = 3744af98387421d958b26971d21928b73bbf5b0f0ef183e9f606d0348fa715f153a60b6c7991dcefead2ebb875d0c1dbd3665dc42a241c565ea0fb0e6349b4319c3de633883a516
+k = 0dcd28cdfe9028a4a6df1d41019bc58e4a1540ca94b717d258f2afe8bec560f3028e15ec1e8bfd422415961516659fa2b006256745e85e488c359e8cbc94cd2592bbb892a19c45e
+R = 07ba5911415a3d21a3d98b400f61eb63ddda689bfff0c8c3ab83668b1e4bf8a703c853d3585b8bdc29aa2fdc41d5e7534850f4656ec949f0a13fd18295b662c9829723e5a7fe3a1
+S = 1b027e38283d74c962fe0e7b58dfbf5e21ce1d9c91651bc98284008f44fddfe4cec9441994e690d72a8ff3ba2b538718aa678e7de046b653403f3b7c064ee07c9c3c6d23e1b068f
+
+Msg = 51ee0b98eb6a3e3c1afcb35a33697c048dbf61374629ac5702a57801fafbea4d6fa5a26c9d1b79d1c58257ac0106387fab2d4a1b7f8c0dadcbe7c830613531b3c209bc17f792bdba1c1fae1b7528aac53dc86c2094b40194577325c05d2258303a2d17c854e7449489c43991b6877a50692a6340a528a6b188440ac0cddd4c4b
+d = 1d642f2d393ed4abea37173e4a79534af87adf534ead4a0a1c46fb047619221e3577e6b8bcc776114d01159c736ab78af3e53feac339d7afe58be8e7a8ed290f1dad960f1b5de94
+Qx = 23d1ea50229b70b46578df6904fd528e9930985426eb2f1ce10eecbc0c1658395948380c4047d67bc4072be2a2624d62a301da41a5265f040642d1937fbbb7cbd205e1db85b8685
+Qy = 625c82ccff6047b1ef4b08f1913f7366c4f6c0312c21e5ab01b598d1a9618cf5c22cddc64a4732b477dd5c06e332b846c8015a2e5a195326bca46c29cedcc2f24d37ebdb7c2eaee
+k = 0c9066831d61a4192ad9de23efcaf578a5d5774960a2b3e3e292e0decaef62d1701b86ec6183d8e17a699d418ef9d084b982c97a55bd76c8b038ac5c639451096ca4d331f070ad8
+R = 005778acb38b1961195d38463abd9c19d9e07dcd997f19676633fa3c44caa44ad1a9bd63435f3138ad8f22a731e749a81161c5448eb462fcbcd69ec2255cc2923ac697ed319316c
+S = 1a1aa90113952608dd17dbf391ed56231ecfa7d649f3274774ed2b6034a2207c05c6d8b6cec480ae27b58495a50b1e5b74a17ce6cf2e43aa273c2b813c0e6c79976882b7e4b1c93
+
+Msg = feee50aeacaccb6b1c3d95c6524044edb78322ee836d8159c4a4c2cc6982480567c4c6cc4806a564876622266e1ebd45f2f4be851b79da025bd57d0e6acce1ec1c8c255eb89713a1e4897d4ee0f7a248b9d4bd3ad5dc0e57f60ebfb65691e164bc908956a019083e923cfd33dcf37c735af3462768a1e14a8051d7aee74d5228
+d = 08cb70be29e83f697a3e2f67d86f1c1ec9a163b5335cb4a06004b6634948bf60b8ad9df9b27d2bedc4975265ce44a7884e57082d521320ca4372d38fc77b18d3fa05ad8aa5c43d6
+Qx = 4c042bde9e90b38b48e60551d832a7c80377a81e8c5b010d0e491cf765c432b5edb0771aaa5f672edf3ba108dc71459d245ad60f3884b8cf33f8cf797f36b20e4be39c8389e66b4
+Qy = 75f2454c41c0323ee1a640755077d36a65be7c2a014db36719ec217e21a9c004bae5befb499bf6be67e82d3da70475abf9dfb751c84c409fe838cf1c6ae109d27f24d75c02cc5b3
+k = 186f16dfdd7a71f20a5e634ffc465356914bb52286d3d5ac00f3ebc02497112fcd592e1ecb2ebbc819e07ea092e465e66f3e58da7a2ddd41c8787f57c135ba4c168539b4743c3a5
+R = 1c2140d294fafe3d9effb33ce73bb7e5485c93c7aa9d33b7535c7053831a1dbe79075713794c87e52bc887ded969d2dfa6a1e2630cff96760310e04cd2a75be6fa020a12fc84d3b
+S = 110aa165707b7de1b3a8e05e4502701abb5ade0a27deb04fd93c6eb24ed2b67ade6c49d78e874d25247e948f704d3c5b925f84c5b07c9b289c4f8507e75d0f8927c6dad6dbce885
+
+Msg = b115f7370d6a93a90fd9dfdfb292956be34b61992ce1fa5627c5e928d74bcdeea66d4040c473306a0070fa8363c4303bea32f73ea3639b5c6676fa5a1d68a2cc1f91f00580d7453a23ae70af4cb1f1657aa82c5b305374effe5d67d559e46a6cee6360503d21070506f1af30bb000d2f2f85caa6465810f89968f33abae81cb3
+d = 1eef463771f9c6285f3257691dea0844687606d4dd00b6020517f190891cc1be97cfad21d147ed8881b5a6e19b22ceeae30e1132476325f2de0e9af2e14c80b8c780a9d2d6c96de
+Qx = 24de3ebe03d2d91b88794a77635aae6743e597410ae10c356a51e3af88fa7f9c4d648c7d1fdb887c8313914ed554eede282b24a2e66aeafcc0cc96907bb2f3877eeb97df491bef3
+Qy = 1ce1f9fd4d7d3870997f34f54f2ba8f08ac94ea94f74a766f2dbc02e4d5149802e3135a2d762e3b8abb01461968f1e88cfc8c7fda49c099e392e80d57f0c14de9c4fa1eea25732b
+k = 026b545702baa340fb6d1bc2bb96f7fb1a77a2428cc122ea380a258c747d4e0625bbf4e3dbc2ca2f15bcfea92f2417cd5d22f2bb5f38a9ba313b3bded506d3e570dcbcb86c2debd
+R = 091c162d040a12f08a416296a43501d92e2ecd6be302b5e1754b9ec119fb8a572626c509855c7c868a07b263f66070ac986f95e4c83150a5a492d5ea8a7f8ebf556c17ad2bcc996
+S = 00c217fee7bb202d6399f6b1ae4e5811d9361573ed4fe1b3fe5d474cf06d0236d59dd3580145dc0bc7632c721b6463c69490a67d1be1fae99e34318af6df939f9f7f36a9bb8d5e9
+
+Msg = 726782eb0d9720daa64e4a77b5d8dd67a1a193f15eb6b5162e3d89c925ba63b7c7e1c4bfc8d6f11915b0e14d16ab53ab015317bd5958b0beb6074199e05181915496575768d026c23e92e06016598de008c3718aaabcda8b68bebca0a73ecfc7327e8d3646106b7d114dabc46cfe56265c326ee56fd2ca87abb5bed8f997c735
+d = 13bd452b0880b101df1aa65724fb60d5d85b37ed5419027481661a3617e0fb37bda1151b9b5b41f908ba832011f7850b75a07b678e5b8cb35c5fc8b94a625e4398cd5ada2b04cc9
+Qx = 31d88b62d2edd5f6ed29258c143bbcb3d29413afd8f86873698a9efb8d2021186415d301599232989a0df5ea91ca222c5781314f200c708de30751feadc277d50e64842dd355ba5
+Qy = 1c76f19ceb1be48f5540265b8b018da62fc225cc0d2d1675bf7df71456cc8e35b002a220e2e80691600a2c1ae31e980d0cd22b4741c25bfbd413f10b375a4d8adf70a65c48ff006
+k = 1b9235221a6df49e39b4cde6650e994f624fcb5084daaa62aef54bc154949f4da9074636c44f50ea40da1a3f01bf67e9b62a725ac0537a4e37ba33fdea8ba8b2286bf82901a933b
+R = 01dffcb5b5eb23694da4978419110ed2bc7961c571a2e68daebe21e598c8b483b34f3178978708db6d78455cc1fb4f73c5ab7607cbb4f05d4d008c7bbeac88562fdaf7a370ba394
+S = 057018fc97d7b16d69af2b7dd4a859f09dc178a6025e1bd6839ec7c75c0383c59eee7079fe61aa6bfb3e2c780d4ac0ee074e6b13223c239aa60ea1187ca4937864f89e2c65056b9
+
+Msg = 1c2418243fcd89c6382b7c3b2a8c341f26d08174a9e9296c4a5c98c5793a0fa48dce51e30811a96b515aa22bf9af89a43de06d696be1e531c5dece1f69fa6ecb7f20be063c602a16454ddafb14385ae3f8246c3f989d0566e06e7ed1864502896ea19df8393259c4dab3b3380a4a80b4103cbef4f38cb69198b7cf74ce94883b
+d = 1288141ec2244e4bb3f62daf4ee588aed09ce22be55e3d42e9085a947c1f8cd16533635d170bd64ae0b417346fa4670c25d41387acb2a8e14407a1931d9f7c5358a14eca40974bb
+Qx = 7ccb7b12a7d6997ed2a11eead3278a3f45ea284dfda8e17f6d926ddd6881a44d02a0f7504dadbbcb0cbd6b85c113aa0d3b4efef1ca151cc38cab1aa8360a6d22e3d6fbc0ed980d3
+Qy = 31b85dc2d2096bbba6c465629ea09ae3421cacc5581770ce3479070f23b3aa938333c7c691d9cb93a4533b2ce389ae34dbebe8f333cef530abe17cd21448f701608febd42d9bdc0
+k = 1e411ab53c48cfc1ef9eda97002dc9181a78352de13fbee3bed86cb00c10e7406033fa0ea97b50764b0eb2dc6eb8ea83e47bb3150ecb9437179c124f15fac6ac19b0c8bc324f171
+R = 14420d78f2f9f1010018848b0442ff6e6203c1dc06a4d523802190f462ed3c11c7aa7678bd03ba27df01cacf4121309551877d3a2bbcfee116c59926daafce55a4e0a7d69c5c938
+S = 16de0b369c28ffa0bd6ed8802a503929cebb5c0a4bf0c0e99b14659b48aabfd08bcb64bc2e39855d7d514d7525b3c4dfd2244f37019b5f86254cdda599bb144c8fdbaad5525cfad
+
+[K-571,SHA-384]
+
+Msg = 1de4b642ec7220c64b91561caed7832044d6e811ac909f3b199cceb0d8a7db91bcdc801412044f5c34b355b95a2c6170fe497f6d5259bc20715a38cb0341c88e93029137e94d895bab464bca6568b852340a5c5d6a225475f6eefe2fc71ffa42f857d9bab768ccaf4793c80c4751a5583269ddcfccf8283c46a1b34d84463e61
+d = 01fe06b94a27d551d409b0eb9db0b163fadcf0486e2a6074bafe167f9a3b4ce8ac11f42cf72f9a1833a126b9473163d29bca2ad139dd1a5e7fedf54798bf56507326fae73a3e9a2
+Qx = 38d4dce42bf8fffc39a5b6583a1a1864de288ef8479449d599115bfa35b37954ab288ffbe81e69d58693e2c8c81639df12e4b36f62b2ab042e92a0715b518c63d0ec630051d4be1
+Qy = 59c72c0bfb0ea1ac5e2fdd4fc380d08037a3d0eeed4990ff02e6cf5a16817ea598085e28f8269da86c547e7b34e16a06724ee73776529c5b5dea4ce3321fb168827ca1cbdf8856d
+k = 0a3b18c8c9f17badd123c674869ff428d533d2ecb8c74f9784220be7a90dda591003df5259c5dfb612ac7398aa04cc9e82863eb0cbe66b6e7f45dd15dad252f74a538d5f4354c96
+R = 09c368c80f697c1718c55482b2c6c5c0edd7257a3a53f7193515629aa40a9716cc889d41c120516b54f3a106a171082364886e5d3a1e9482a103f072988f61de68f034d658bd976
+S = 0e782ef47b250f40c56e3ac4de112347174bd59fd4cc991a2b538ca90cdb222d048fec62e2773492a1d327152d1d6591740706fe2f8e1d65de888d47fdf173b2645813ac0fc3078
+
+Msg = 70279be7d7ac72a32606642ecd81b5d4d0f95fbc3c0b07d85c16adf2788601e44dedb8e55e0f9e0b4ca3ca35f5be7511b0e69224a05204af67aae11ce154af6d594d47f6e3142ad183969544aa95cae1edf42bc699137f60178c12b10a67698e37ab9f3edbfb3acdf1b3513d62fe3db33b16cbb4e1f9dfe732c107f9d0c953f6
+d = 09cdc7e4945c485a41728f83d5188f539e372ff4fe38fffcaacbcb4522428e4f93ef4972556f4398fe17bdd885768f0fb5590df495badc794d4d274e22f2f4a2535555922fa43f9
+Qx = 3c6f046aa3007ba7f883bc1e0bb43a9a0a1daecdea3e2b6c10b2481d11a834af241d60cad7cab27b677c9ac11f2e5b5226c0a3de13029229af00e5a092340af9b230e0ed992acf4
+Qy = 6326ffcd62e1a68b63ac680a743130b1440bbcd3966207dbc8a8f4336eb6a7986aa53cfa4fd7bf363b30706b4fae01568020b41caa70ee3d51db982de66b0ee39777da3fecf5b01
+k = 0c717523a308418eeb2aeb816346b74149d56b9620774cab582f01681bec73adb779bcc7462fff35685a4e1e114c8fba474c68fe2650344fc9cf610908966a9dd1779f76bce0cdd
+R = 0061067f377bff6a9be30c9c79d8abb7f54cc8f09eaacdc190beb27b1e6d297cd32b043b31feb49958745b78e42ac074b8722e1a7653bf03611d87c44fd3891ae410b23a2140b83
+S = 00edbe756a5dc78c8a29baac9e2059154294e3adac9a5adeb7b27ac6e4d4086821cbd55467266946ed8f6f03abff35b59434afe84067c1daa1e0bb62ee7c56b85e7f831eea99047
+
+Msg = 4d7e0ad520445b6a5cb46b7c77fbd367614044ae6004494c2b3a89089287e2836c73b799cd8c90139eac427ebe335804c3788f3728ffb8edd7f49a4bcc76a9e24ce3c2299cea88c04645b82033115380f81b0c1d823e470631008d350cf0c0dba1915519985b8a389ccd8c809dbd5bb5051a79e631916e0d052d9b6cca18e0ef
+d = 02bc753d007c4491cfb8ce0a6c96455acd16d37e02c982db216b8cc1afd6d10c6be4e15a3988b8b8b86b2b5b59a5c1939889024849317f27ee08a06bd8e7524d4ad83a1de208564
+Qx = 0ea922b09e902ce3847f14d3b3afc5562dddf15811cb2e7b9e06e1b919d795f8451a3dffcb92b418d30bbbd1a7ccf827ea0f1f6554387fa2fc51755799040133d7a655c7800b713
+Qy = 1f12439a0c0df9f6ef08e89eb1a62e2cedafc0460030810b2483ad9427c48dc061e4640ebbd9b4a398841c863a6e3d510e5c66934d66b317b1640bd05018a35677c6ac2c7839706
+k = 0385f9caee4731627276875dd8d725fe79626c18841562e8a13fa7531c7be9adca565c22459d519d643ea22478d7c51b4c286920b050bfa54ab7d42966e389c485b52cdb4fa1a0e
+R = 02ac84262fd121bbec43e81021c0f0610fd2fc0b26d66581ddaa78714ce58be46965283851241d792ad6bc79af39f09d2d4bda83996ab41f1fd206b8293cdb6c4eb9d96f39efa25
+S = 1d9c9bc330adeee8f58ebfe8c1ba401d4433efa04a44185b0e8e20b634691bfe058770d074289e636af3e96c118edf31d72b5766c30f6fe84ade42f284fc7f2707bf27b3a309638
+
+Msg = d49903f38b5c9b17542310425e59377f61f5b4f4740cd97371ee2116083f7758e69e7e2c1b0950ec6b76f96e3c91c721d6f2843afde8c7505a559c8a64bca2e665aa1131b75bdf86fb5b90581c7d3b61c2cff88f3fccf356ddf5ed282e27727be061b6925c51ea7f1a495f471dc8a5ca1a88bbe29e92338d3c9361460398965a
+d = 02082c6e61d0d72f040905d8c1c20d47b029f41ec68d6cbf43ce97c3b2a0a770557a33cb803c432cfbd3958fda30ec1bba77a6613c318597a85ad02b26c44bb77ca96d9cc1194ea
+Qx = 59ff339d505b307e05adb45aa314d47f2450e1b1aad840b5550a67c11940d0e78654755a8e28fb651e12e48c66cc1ce0338114bc1ffb00965b342ef3a3caf495f1d73a69c3f3d17
+Qy = 724e9474e6de57b9f8cbf6f6bb4f73f5769e6cb0e006a34c2510b379995c9e054cc4981c709ca85a3aebdf29090ca07dce5bd3c313c6153b551012d72a8f84600350e8754bc4abd
+k = 18d65ca6c2ef1fb32dddfb9ad4603e03c7cb1791a9ec7b41266cb68b6048aa111f5971f3cbef3f0dbb9ce409b59c31cc59bd6f100ee5247f8c36f26ca77cb252331fc3be7346b5b
+R = 12853f9d695b8ac4431c1ccc8498f3fc4916eb6a5e66b3795a3693f3f5a29ad13e58dcdaca5774f1f295e2d2d3c63c69abbcd9f388a3383371028fdcc8bd77f7554d6aa3f0431e8
+S = 0d1c324afdf01ea19e9453d2b7397584d773716d6a08b6e38f9a9fb104122ecfcc9de7bf1e5a6cfd52a08b7cecb002ebc21798d474f035fe7d4554bf632f237bce14aad88b47d4d
+
+Msg = 0e3f4afc3e7b25c1bf2d98098a5a87db1224d9bb45adc6e434732b8722a708ab80a1f3f6ef3c5aa70d2e1dad3e4416b12cc59171f05736c4b58bd084602c344f2f0bf3cfdcfe04c64e87597a99de23ded64b33607f7c273ec321f6462518715b11e91361e89ce5415bfc2ef520bfec378244a3bd2a4b9b6b3d68815f2f75baf6
+d = 0e298c93351323e2c5304015a4878997ae4e79d1c32f1dc64262e534d4f2c4b3e222356ffce746763373fdfb936fd330d3214a18c07f1205b20c9a941331cd676040ba1fe3dbce7
+Qx = 6ee4952a83477d89ea05ae63d5169cb0f7c7ff22f15728c6d69dfb30d1f28158e2667f9342cfd9b32f2fd537dad47c190d82f72c03043f2a9c5d97cd09d07ed4c35b96104042554
+Qy = 26d5935dcebc0ed5a07b7ffa50de3c8aac309dddb61b8c560230379696d81d72bda3c819c46387e7f026b384bb0f7b2ca90c402bb67b5e37d343cc21a8d1a0f822dbb2766030d73
+k = 12d23969d230e0e2712f96b11e196202dd3e6ac755c824f92b9c765e3fc808d4e7236c8a3c06ca2c8272c7ac953fdb936db30d892246cbdcb7f98c43177e1c30afcc162af511364
+R = 022f6dff5bc1eac1ef568588e2e512103cf56ebcb610e124a125fb004064a28291c19e83ea08171bd1b14ac729392c7c46354e795d63e3bb087fd100642465efd817b79924408a1
+S = 1785e1fd773446e3b90b8704cc2723b8da2f99d1d699e817c3c4622015d178b0cebc19b3a6dd972f75eb3828a386973c0a5e67ca192d69f1a84c825d1253f1062a990c3f1a947c7
+
+Msg = 8fe32671f6927272fd3cd8dd4e34d44d27fac8c88b41bf9a48039e914990bf06d1633b38b9200ce1c2a275b9c55498e5da2d0707322c3ea0a0fd7aff598fb801628264e13047c8008153e8595a0dc95d54e70b882ac2ac9314d2b78e7b93922da818d7075215e354708994af66958954c92c074d132dbb2488e5a531c755a8e2
+d = 104f4ad56594c5cec2a988c5596d73adaa5a81802b40110dbae698ddb1f0b271fd1479c38abcdb9b234e69cd0da8a0328d2135c287d5b130a09fa0b899058e7800eb2dfcee95c1a
+Qx = 4e8151aaf2aa6a6159622baad134be41c404982bb0101e820eac8f0a52166546c53927d9b419604e9b025757eaffac526d4fbebde5fba0841c6812dff2e9bab5054d4074a125ffa
+Qy = 4413639ad72d6eba870e1760c71966544f3f881f88880fdef1edeff47cf6c235e8dfef1eb1d8df51f9c48b985912f1f70b61fd3d4b859e052887560872fe6e95db0f435778d5c4c
+k = 0cccd1bf3424d8bb0513fda3db93e81bd34175d84aefafd26b37eda9e767618247bdc94ed2b1882bcae4c83eafc30a7a4a80806fda10a5e70b8827287eed8eac2721939a63c2175
+R = 05b1460e856548287683dfbb93efc869e80333a9ddcf292e2fa3b3c8d430563a01340685c6db1059aaa8b298c8db9e8281f36e3a9664faa17f413cb439ef24cbdc1a4d58872ff6b
+S = 0c6faac191c95738f7c6ad0eceb035e5d22ae85e4bd0e27f2e65ab293717c0491be3d1b5ace80f4cb4bac7e33258706010c2aa48d84c9e39c95e30805fa7669c42bad84386f7754
+
+Msg = a8fa01136a0a78313a5d160c32fe5d1805eeb3730c18ca0c47818e82c48eb4c9e5b2dfe3ee5facef9ec59b68f4e6f3213f77fba9f8ba06dcde546ae348d343233883894f4423331b536f62373a495852977a51cb192cfbec04b5582b4ece69f345979e234de32da7a120138a057a7119735c4cb19099bf48bb202e7ffac04def
+d = 0c4989bf33b3136bcb4ba67906eaff2bcbc6567635aa4b057acb7353ee87ba3cb4cb9838f8f679729d5c6ed98e6c4199cf58605f009c6873a1b8321f83cd3c0973b7a3cfd9dbaa5
+Qx = 3871c7781f2b4f653f0d49a224576bd1e5363d5171bd21da89f590f49fc212d8a57ac8a140d923c2949ca287bea803afd763f15f909c099a07297e8ba1b37c70e1e8f0fd1fe9d1c
+Qy = 5806bd5b4858ba0814da2167d232d55bb5c41ea0a36fb28a0a151c1b79b22cb16613ccd9dbf92174e42578ef88f4da6eb44918acf427fb7e4022da3376243e75410ba6ae012ddfe
+k = 0a9eb767077886c48bc54503a0d2d62f0192d3581bd9ec253107092c22f68a15293d7c3e7aff56282f0cd35e86a2b3c55c9eec079201d99b5f49946780ce6aa18b225c2dfd72cf8
+R = 03eec6ffb390ecb2af4f5ca17fa8a7fd6938667b319f0f61e5c7523efb77afccddddb5114ca8c461b1c28dfe7eb85ab156e24e891cc6f9511d703e8b3c8443d04fd8de80f5d65f9
+S = 10cf3156cf71dafea6a0d6abbd503d72b13e6a684076ac900f390059cf3fc325966b3548b58e14a82bf291d9689783b899db7d4baba524b0b63d31f9900a84fbabc2ccad95742f3
+
+Msg = ba2d83b21c783d6ef2f3b7b10e910a418a9b9f49ae0fd37990335b3a3d15627846c9a12a1f31a3d0e062ad1bec5650606ed4dd06c30e50c1e8761a29f4ea1a20f74635d5dac22e5b787ac10f4ee82b338a641484f91771c128c84d31cdab0a6b9616078c898665655ee9dd4ae73d33b94bf091b064928b959623aa71ff73b4db
+d = 1a96f2ad56e31397e236cafc108087479c9823589a5fbc3dc7488d0e5d1199cf245d7f21f524cc0e8b47feca14c93fb760e631434a91188b32965053942f3bd39b3714f9d6f1a11
+Qx = 0195bfb66e20ae295cd22d59b27b3880a890fc44ef5c720b568bf7f72266293841dcf0572063a96c62736d9d4a9cce31b10c03016305a409858a79070477d3e989481ec555c8146
+Qy = 491122a199176e2492e07fae4ddbf02d2a40a21bbd99b8f742b546db2018cac27fb4b1c03cff55f61b7caf13b0f3b097ffc8e1549eacab89225e0cf1e96b268eab7f9a1a69258f1
+k = 097e28225aee5bc9a970a150502dd14bee900d3b040b0da9cb52f5824e66af46a991bbf6423fe1e089cba47593af555b07b45e47b0f4141b0412ddf6e91153213c5b8645ae7bab2
+R = 1439928b55917e93d59341532cd1f9d09de1f6e0d9a04514bd4b692603f2cfb75a579301b39b8cd92fbfc8832839691c23e0ad3efd3b4c7c3e9a366c1554c6dd13c50dd087b3055
+S = 1fb432e72be6fc524a7106b21d03fa71852c18c67edcb8b265db3b144214e7e6d10caad91f81616e03ae7913fea1e8d11e90d54b17705e8d04c8c20f0f4f46f117cc423ca178ff5
+
+Msg = ea2d5f4e9797bfc2f33f0fccaf530db2bdf8abcec00f09a0338eefdba318221ec0e050cad1a85c3f76b784c6e8c18da2b062f333eeff18b7b781e67d6d0a4368b8231a892e0f4103012348e5df53ac745e4d34e2cd1ee9369f97d4801ff485fc144b2007008036bbc07cb1c302a00054b54f3713919191e1d5052978c9c2895e
+d = 0c08ed8e0e0f8b0d0714b46a2164b933f8147692f18da97e5a108c44d5a5cf221cb50536e41832b83bff4026c6df156386235cf5e3e9a67b7cf9b2fa7707c5e0ff33a91601b8e34
+Qx = 2d516bdd1914c83aec1cb242710ed79efa61cbb31dcf8d238d8f5e089158b2ee2bab407e01996a1621b1a869a98227c12296cc2a71c1ef2d0f26bd6614f2ac77008048abeedafcf
+Qy = 151474bef5965c455eb95ca2ffe1d589107dc251d22635f4a9fc7270358b64e4d2b81666b60c4a5c49902b0fa9963197b22f90a09cab97007842816f64fc49e351710db84980032
+k = 01125bde6086753b3bcf29b7d5a4fb0a8abffa6503b4f0b39960eba226062bdade57e4d73e8c1621792626203e83fd5c231a53b0ce10890881460802788d481f233466060f73359
+R = 199a1e40229786b966592ae6e275874ace23d5605d0c3371a4f9eca7ce4858927958bc1c2780e9f2f79767c1c72117c79c408f972006841cb621837ac002cc6510e0432d99a1f64
+S = 17f4e5e23e494ef149e4abce2d8a1ab10e3e6c2cc93998fc63baed6565ed350b220b282855e2824f398ae76b8679201b43450f62237f6fec643ea659e6c86abc24a63d82d9bf219
+
+Msg = b2293b0a09f41decd9d8e637b1b08c2efe612f33c9c0beebb6e05033c6103b958f8aacd125d7c810b4c287349f5f922d2c6ed554be597fb8b3ba0e5a8c385ed8ae70d5ae19685298f20e8d844fb5ad98db12ba7e5f45baed9045c3e86b3cac9bd55b614b82fd075954fc59bfc6124cbd68edae988596575f379d8921b594c75d
+d = 144090a0ee38cfa21fabcc24d35139a99656911ad4f6dbffb77dbe74e7993edfa9fd63d2c4f6bbdbc8ec21ba13c9f4a3576b5d6e3abeab5af5ac81b1f2bb6d4c42dde645d854d9c
+Qx = 208729b3c7abadfc221cfad8be642588d5d1c20989fea731cfccef25886905e4b1e61cf9548d89c24f5706f5243dc8aa7d5b2675c2c6d2755ce6a12e5b12c28a2cd9c597b7dacb3
+Qy = 3db73ee445ffc0f6c77467f3add3b1e97061117e221687f5589a030f5248bb959bc2ed98c9fb66da8679dea3949b77652dcf83ab9c50a00f6a9c22bd8d16e093b2deca4b0c7596a
+k = 0adcadb26626eb9f8db9ae98c6808840b65d6f886a3f0c45f0b993a8bc62bb5c08dcd87940dfef4f220f5e50234fba3a55e7127fcbb967ff78ce4fd6938a9bb653747116541cb85
+R = 18f7fb6ee028c3dd754d6e7b687560fa269b5a5fabb1d98529e0a27dc66bdb1ed79b7b5c64fb71e767d9497b9255f26b8150b9903caedb25f51594f5b7ec2870515f701bd68faf5
+S = 09ca9519388402d5d96dd9ef2d4ebfd0ebcfa58bf8c1970d04851b2409671c9d5e4aa833555df374469a4d277aab93b8df8d553399908c930f81c2d9769f1b30a13f61c02b16852
+
+Msg = acce54270252e7d9e983c08c993cd6b7e3caf482a9149036afe4665bd3d0662a6818047187872862d5718b8ac063477f693caf1a9baa8bdf2f36d411a796f2b46ab56f66bc94924229f8264016d6769c85d9bbb7d6bb042fefdb8fde1be026b86af2017aacfe38c97309b4689b23fff94f1de880064f1d3ad9d74dc804c41f41
+d = 1df26b672b2e3617b6b6c631d3c6be0cb49c0a690de49643e0f416215bcdaefc03fa9c708471f1d87476d58c8f147517ec8a14aa945ef001fa01984d5c3d81f7083ea500558fef4
+Qx = 767ca8fe8f3a7addf01b230b99499b33c83db95db05e1956fb1891fed60406865291d79b0daca0c307a3ec8b1bf2ac2cbab728c6ec65c013e01775ee21a29305e9403f72883a138
+Qy = 0acfb786b09e5185dbd8abf831d12967107dc57a040d7c800d904b530eed1e19a8e52e653fe8bb824cc424d7254532d0fee62e8ee7ce8e871cbf6e4ca3bc040444585b9a4e397cc
+k = 13e5e47048122c8301258c638bc0f00f8f9646cba927335535f68f4f4f51f23ac5398ecc21eb0bfe8fa6a2084e11fe67587bfa791cfbe2527797a4d98046f9df37662cb7e86a5a7
+R = 164b3500ad14063101b6c5ebabba53dc5acb4d6771d3b05a505e6a67727ca8ff73d996e1329c0f6d8f738237ee0f0be415003e2db515ef93931e09bdd853b9497826929eac9e9a8
+S = 06b65511990c061a6d2a97fe2a5053c775ce2bc5471865abb7261d0436a04b79baf41a0a852a57600cd4c6a114b3a8466f721a684aac2592640bc149980545daa271fa9b146f2fd
+
+Msg = e25274ded4840df0d71d3369007118f002b83e2d375c78f7e29ade067db15cce21842611f3f015db2efec57da77cb9d16eb1e00a8c1444d48dfda569e29fca1ebf40a22fc646a9fd44460f0e473bde487634bfbdac2c312f66a1c2982c6fe76c54ac72b6c8cc9345e47cb319a974b3cc4bb40634df74b4ad7e18adfa9a71ddd5
+d = 189918b832e9fa30161fdd927bfc267f6405335df3d66d225e17173af52a671138883bcb94c4403ca3e001fcf09ef4c6488934d6775af2b1da30a8f331579af2d0fbb530298d8f9
+Qx = 53e6b43c0551f32b7b34467d188985600c5c0ed12448f2e763609f40039f92002bc8e70d8dd3e337c3507fc996a1557d5f2fb3132507e49ce653482cdc86f6ca5903b77fa1619d9
+Qy = 4a9ac78a2c23be0841b96cdb1d55862e4854b530f1fa3f469ba9f7185e3f91c28d03c27d9666345bdbc7a44764595b303f49cc43bc2d0e944862913d280273cfd00e15b6b55f85b
+k = 0b47a185140b583c330c64a10d50748e019134bacf153cb4a23753f140a4d607d5771a8f0f535f9c35baae5ab6c37a55f38acd12f15be18d5bd9662383b30e4d0ce487e8cb553e9
+R = 1a2ae62cc9560590177aa544945377ff6ab1b34e7e32a25140f99996c130e170015636647756a5e8522c936eb1389c206ac74c012941269165f3772373047521f69510c7f3e6acf
+S = 1d86f4a6ab2bba7f6305c2df754652bad40d7c273ba2aadfbbe65c07ede4ac0e65fc0a37a0139a6ecab296f58c6c2532701bb008bd9e1ecac2771d9384aca094537fcab47f3ef06
+
+Msg = d8a4aed87c316012482819b03a1d91691f2ad11a2f46082497ea8f64880d686891f7da550b2ac17199c657d4eb9d04d5cb8eaa180f743b87d23b1c86103f9e9bb60f4e19f0ff9d160f180aed7735130c03adb62502e69be5c624ed7bda2301f30580ae0921b02e103a638f5623c02c186e3bfe6ff134c762a2bcac1f879a9353
+d = 0bdcc175eca3a399b944eb0334ff33c4fd130999c8ac0e7b52ac5b774fbad53ccc3a31024f5262b2eecfeb2104b14bb244307effe3dbe8ed25686dbf46a42c4b6f8e34010ad826a
+Qx = 7ab1a9279a8408828c2bd21ae6c643ad82633d636d36fd91498cfee49c8a635313f56993d02cc46da3f5b78fd243516cd23c14a4c8d79cf27dfcb05f52f0cee59cad5646a9389b8
+Qy = 799beb1ada93a48819ab70b74c36d2dcc3c5cca1f7a57ec58e643924c3ceb7a90c9cd9bf7ec762a2c428d16ef431a45cd5d069cd828601f903cb0a28182af2392b5ad12ac3a24c6
+k = 04ad8d2759df82dd70ebe9f3402d3d533a1b4635dfd0024deeee52b32373550f550b9fd4126aaa6c3a9b1f352c40c86e13f78e259abb17f85f0041e0cca9e2ae59f4ee3ba2fbc83
+R = 1cf9ce41dd5dbc3bee9f46f82e4bef10cefe79a87e8e00d002097045b9acd46364560e0fd27b0be6655e73b5cff272c8764b4c80ce0e1c91a94b8d05209a28b553f589ee2fa1b11
+S = 149fe587b144c37df2c48c2b7749c509421cfebab734003e51383cfb773c3ef5a24fbac0255cb807f5b95607121c5848d3f9656227b61d5a14042351de084d9b88745be242b6158
+
+Msg = acbaa5ffc4eee0850075c0e502a70cc7a897a919f5e7bca4e798385601a26f411fdae5466ba9f6b6d8d7f819a749b799fbf4a3bda9105063e74914e8583ed8b31ea4d22164bee6f14bf53afca269b901c80cb3265be32ffd4ca4bc4ddb83e11eff82ead6d75dc4aec8e5c67f35d58a8a156cd1c0351abdccc0c5396c8fbe6920
+d = 007ab5a55a1d8ecb7f5dca2afdf9ef465569a4b0374716f604ad42a6e0271e934b09655e8e2529784b69b2894bb399b02aeeae30e9e7ae70a2a8e56b9e775bd978a04c728e3951e
+Qx = 2df88e368c8162c1dcea5ceee3a4c52cfc8d6121eb81c31236ba26dfd1874c61586d2daacd96cb5ebc7053be57641bf53bf2651cfacf370cf470db86e1470bf285c7166c197e094
+Qy = 30067763f9fa6a9082ea16dcbf53c2b6f11c9ba1817198e5a4e189dd98141ab682ba4de0b3f873ae54efc080a2a03f755efeba3c0ade8ea67228b1a5a11d730302f1eb7c6bc3737
+k = 0d3dd75ec61e0f87737812fe1ac86ba336b1512bb9f7ceac2c7d1a5b4d5dbafca57a5209028cef9468ebdacb2a35988531baa094a1c901d9650f2c5d8e03a1621fb33ea85e2b506
+R = 184a98dec91b9afe52d4dd6b2d9f2d7e3c42e8e614332080aafd2621136ac7965beb4e8f97b222c1b2e5448b79534db4e710331a2f877f8fc2a9259129f0b24d24289495da22542
+S = 0fa384a04c4b0b0745abea373aabc09404a6037f302e234e7a2840ff39c2b86ae37c814e8bf3f3f7cf743748f2b88d02d66a3adef2028de94013c07075fb73f00555aa900337149
+
+Msg = 9a57b63a4f418404e8f5dcf3052b9bc04a4f6d2c33bde8651506d9cbc5542ffb9023292dea463111fb78913ccdcd182faabbff9164219b8900c7f9fb394f7d9678f77b18f8d58526ec64d7c1328953b983a7c416583e05a069cd76aefe26e5f5687b70abfbf9f58f052dc0863b4fc3bef805cc3bb05bf76a83235af9d6adfe66
+d = 1e7d4da72b1d82e17a066fe387f2a0a7fa4c60ab993ee09710531789186077f2f32b42ddda497d5fb57356383e1f96973df043307f0b6519430c3f0d40d62954032872fceb7dce9
+Qx = 37c59e95132f0027f661511d1bedc3018bffa62aad7f44d7370f5b169d683882fca3dd0c4260fa8f72a47a44fb0fdcf0d7776ff0632378022bdd223753c66f98dc04904344ac741
+Qy = 2d7f19468b8e4f32eeeaabd6e402a35f38dbb9f2476cf07881d8bcff170b0a6e1ff8cb1bfdcaff734a32ae9bf34a909ae7fee689e3f1ae777812a45dd46ce13fe648016353c6bb7
+k = 18ad70fb9c5673e5a39b3a1655ff76eb84519555a6cd88e86a26f9448a54f04516c2449bab3f75e74a8d15c69926ac43fe01ebbe7e1c97e73870e3cc4c0ca431cf614f35659e3eb
+R = 12abdbfb2eb08e326289fdf5615057d912749db4f17848c1ac73bf6a51fbe3e1b2732d4eb656715a6c459c6c3065b67b577f21b8eaca7d657c3b3171e8a4849f55024c69487e50d
+S = 09609da5049092e0aa8ebcf10c204de54c968b09b9bfb3eff90b80bc675d557967b35f52e459f37fd198a83a858e5d7f9f5aff8b2ef7272b236dba5857e88515ed471a60bf6da49
+
+[K-571,SHA-512]
+
+Msg = 97b79c76d9c637f51294369e0bb52c4189f2fd3bd0607f91834aa71b3555605a89ff68e84fb5bda603f502f620e14e8b0c7affefafa2f0b303009ee99653ae4550a05315e551dd12a4d8328279b8150d030b03c5650ed4f8d3ba7c3a5361f472f436b200b321e7863c771e20ddd7bdf739c51de3676f953a5501e4477aed1bd8
+d = 15b7271d4319db5743119c8103a7d4c6d57e9c62f3eb93762156d2ebd159980aa57cea948e416717d715a2e458851f1b2e9ad4172bbcc53861db29c3ee0ba8e82617a5866170847
+Qx = 03a5b9559b2058299161770166766aa65e151ac6a22a90205afd27de5eb99c5b1db369ad52f09141d3bf08884b96414c283b2669ec2a2a60c960a2f03d425dc4c229c0bb369d90f
+Qy = 024f3a9cf3dd257043dceefe6617a98e222e1cc820f3e19e63c64fdcf7ce8d9c7af7323c9aaaef4df02e498597581082fa3767c8a38f508f4ca2c1eed6f298dc8142668a0027490
+k = 0c585e425ae4a34f9b7b9205f095ea07599716f1eab1a8bbd934219ad760c4606ebbeb06cbfd3952e045a040b8ce20603aea4f965d1b6e87eac7a61672823fb2de7767e3466c730
+R = 129162cce6fb05e1fc8630ec6c3a16d108bcd251719d89631497177e6fe6d1373f114ad9dde6e04a4ee0b4747f91c78703012e5a058c132d54f2ccccfc0f9326b27d60322b497e4
+S = 140163edb5f3c4b49228e4614bfc6da9f73674eab82678ad9947b2a635f733dbce99ce3209f613e2a75e62ed84db4d7d13de6d789b7cfedc0cb6a028d8316db8831db66c91791c5
+
+Msg = 564ad0e37c9c37a60872a4780a723d08d1159ddc77bd834d74c1025cdf3cbd5338c3fc07a904fcad9b979b2a2ceb1a0139af35e5112305fd662a57af6312624b9bdd3a64849f95f59a46ca8feb2ed56f87f258518947474c1729275c4d89b7dd286ed65f286cbac76002cc63b92a73ab6bd13c4adef282f32297e441bdd8fd36
+d = 07219ea7917d174a5386df985d0dca798ac9f8e215ab2f0003aee929a2dbd91e37fedead0ed95b1e8aabcf516bdf54337b4aff7ace4c6b3179f2e919a49db50a41c9d4d58d4f636
+Qx = 2fd7f6ea770e0a6f1eeb3318b6b609c0e76ffeaa34e75f56910e8f658b70940cd7a5918328473b279f882816955b2e3702c22e0b3e03863f8d99c64f3a2c9d1c68f59a28eaf25ad
+Qy = 6c2cca84218aa019326cadae9639069dd27df4d1e95a4c8e7d7cb426e70e2d38650b382e325dc3835afa719145d16a29e4ff67de37ac8949641f0d140072f59718450a669973206
+k = 03413376b32f18385cced4549e231e514eadfe05fffa0b252732f5c88d13d9c6e0c35be3dbf72029be5e4573b8f8829f6efbf58a12b5c161bb7055d1944eecc93f82c12c5c56d9e
+R = 1c45c25f3e8eef9b92142f12e4119842122ed7672fdd82c14b3c34ade3243a4c50495c06b5984d0260376c4fa44c60b2e34b0084066d693943071bb663a44884927352668efcc62
+S = 08cdac0f4498173bf4e59de98ac9a26fc2c752cfea7a5b75141d4e1d019e25d70a717ac3ebb82884436ebe1007b0488c4ff29fa31fdf02f77fd99535c99b69c9d4e5f432516da77
+
+Msg = 072ed5b14754fddaf54e20da42432df49bef38f4a3b1841b2db457ff86c44880727aca945770adb41269df41fc17f6a687bcaffaa45a3e59070526ed53b8dc3b78cf9a80a85461eaf4b477e44d5ec4c2bab9c05aa747a5a520b35fd09e8b44539d060ba1c3470267e0dda111b15dbb587614a46e1e477127f963a16cf3a43ee5
+d = 0bc623152253da24bf8d752bd78aedf7d5f6a2f889453ccdec14e10753335ea8bea83fd181a1f3680ed50f2324fbeaadae160cc85831750e021f3e44121ea1b1efc29a7d0069479
+Qx = 003f3a6cc6964ab2f6da95c0a2a7b75afe4f77faff16fa28aa67809afd9495cde1f5dce079ec4e15ec8c1a2095a12e8adc409fe8729d865f50ff31ee75d7d807afd2c15cb142be9
+Qy = 76b15c1ce931ba06dd56dd8e4f544425fba4f37f951a188c8e7eb13a2850c93b8ce60f10b3783647a2d053e2764a957656a184a385e95c2013685d4954a2b2aa20e4a15dbc43b78
+k = 1e091f4febd694879f78e83842572280daa48db65c463e66d9a7ea57b82fda531f116800530a03cef2cf7e5be5eeb6e420213ff757c27b8e8a94513e417f4acc62adc02a76a4fdd
+R = 0264c499f7daa6ccaaf191d3502e86458ef088c9bf2ad989851c221364b24a1a3f4404fbd0eb44a41938ac6ab67002faba0bdde7f44ffe6bc10def8317c4e2807c3ca711cb6cd33
+S = 1b91c18fc55635c5e3cff70503e7a49572ba52b11bac193230c88d6eb65eff6b2d9a01f53ab0eb34f5e208538136811157f872a8255b4d249b6ffe021b0c0763cde4d7a7e72b0b3
+
+Msg = e660dbdf3e61af39b83b95d3f1970f66d616f03273f7dddb98f768452b21cd39604a31cf80590d4a5e4b0d4917519e10fd325dd4ab7a52d70d154506329baefe0d5816f514ae109483122b4fa8fa1ebd7fdf1fc4e21e8d278a50c05d81c8f489596633d949c6c8fea96fe91430c01522a5afbd5042be8aa47da04581b2bd21cc
+d = 0645947d981d258f2954558c31022a3b6ba5fa7b675312f794cb61bfff1d9ce87267e4a1dacb7c8fc58624d31c85ebe22f80d26a620fed5df5bf38515e0903f0b69a606048197d8
+Qx = 2d03e05c4b555943fd69a299249e7148e99633b286da69bbcda64e7b06ce9321d62bead7b8d095a68d9a3ab9e9cf1aeb1d8c4904a073c21806830451a79fe7a907b32df15ea4567
+Qy = 23cba4f6f1815cbe1934734a901206596c6f482011f6cb6d452329f9412d2ef4566429e7d35f2d247eaa7849ee141bb16914b64920fffe6b7923cfb19759fed6e1f80d6c40a0ae5
+k = 18955bb752f0af7d7aaccd0628dcf1f52d836fb91dc78b0fecf21ff5992d9c1f891f0eb3c139803b88736ce10ba4733a523854c4ae9ac35421beff9b20e0c8daf90bece46737579
+R = 110a428aa96277c9a13d4529f58ecc57cd7209a7340b4a78694dd9ec800f36c9c306221fa110e0b3fd65b9dcb67307b7d7678997a3143c04ba96d72be83a1cd6b01ef22acd0f82c
+S = 0b7ae2da5cd36006a92a5b2e6369afc2728a93edc845ccb1500e551be361f8658819f7d3eb82ad41d7f2beea1a1cab6f103238a6025acbf03a2b08339841694022c17db8c6c6886
+
+Msg = 8c9acbdc431565feae60e08bc7da113e12372ed373f1e1fdd581f98c8a7b0c79ac4aa42c7ffbc963fb4970fe26c5b5dd314b7051fe971c1186ebcb5650f7f7011a924de893f06961b8c75da7bff331847feead4abd2e8b9d6ecbedac18f4eac207b948e6e4215e4d5cb483e5c66ce7ad788cb89604d3a3e051539094079e7bdb
+d = 14cf93ca69d94ee8fbea0c8da9d76aea092b73073d8f5385b65c6dd4d567fe86bc2cfb8e8be890c3c6cd9abf7dc3a17eaecee3d7a9455887863e496c48dc3e47821bd3d825b6bed
+Qx = 3dfd1fac02ac4bd3e3017a3d94f29575238937824f80ba0b2eec185ce8c641e9fc72194323c779dde8c4fd6e748e09d66e82c82add75106a0e1739f2b977d40ecd3cb15a1eca420
+Qy = 6a73dd31226adba7ed8d08476b5af10a806fe8de72251400a83f6c9f6edf5e0cd6bd1fa8f3595c3ab32b4c4548729c455e4eaf83230e1335cf181cfea6b6bfa6cd4ad75ac3278cf
+k = 176972d9402d5d6c9753532e5ea907f256a872c100f87bd390c4d610bc00c408a97bd55dff2de1ef2fa8b9716e33a5a39bb6ed2ab541848685040656ad0468b360f42c3742c1fd0
+R = 00be28427524a3b0979cd82fea407463647a77ac45c489744a9998b545a13516abb9213ab0d89a2f5f872d927ad48dfa502de95524f94f34b174933f3faa7b554a1c2c3a688a0ed
+S = 1d49594454516c1876f23f2ba0b1fa4dd8bee028bed5524b7635a2df5b8459f4832b3db5f6074cf07c169cbfd9099a85ec2f5c42043c5b851c81a71c87affba34b11eda67e0ab69
+
+Msg = 53ef87d6ac7b9698f40b3ea9f3442e7b64207b140b7f66f73fb7d5f8f98452d30a4e493b6c0e3268371e88e612b818d4d847f032ed4983817d020411a52d81fd2a17b58ebdec199d817c2a8ba77042bbd747a6fd4bcc7e844ea829fd8461b389aa0b5957d92962b6d4e86385a8fbca90b8fac40944607117e9a4ef6dccb8fc1e
+d = 033feeaaaa28f16bfaf5ea9c7319cf4561ba4fc55327a8477b6cd58ef6ccad3962ee1f3edb243f3a04e7e49c8e23509fa2d63252adb186b8bc7e9255cd61fa9bc45242d42da3a68
+Qx = 6fc62c39bdd41ef7083ae10dad59e38dad217c55864a55a6a80bffe2f5e7da977d79db9ed8c9ac22d6f096129a0c680ac93fd77da4ad96e292a19b48454f91c93a3132559fecf07
+Qy = 66f1f737ad3af3df674637aa5efbb844bbc441966bae73973481628e5c2c67cb74553a7c8f2c5fc478edd8265bd6c99d6ce122a245e46fbfc21992b950f04cbda5eb220261316c5
+k = 0a5b86b76f98310a25111cc3d1b0b70fd0c20208cd0bfd8007cb569a187c3a97edd8e716aac938900c3ad8ed3a0d091a18555ab532b50f25184454d84af2beafadf754862b8ec74
+R = 0de2eade32f537727eeb82dce610b48106b277d15d8fbdb77cd312ab9983ab21bed05f05186a5cb2b530ba72c8c68b768c26d942f9224c6e6b9e7827c48e129833cb679c70aeb29
+S = 15e4fb92190bbf8dcf7548057d1bd5e5ec54a6edf54f6b88f50e96ac87ed7a7b7c0fe1e1174ba3e822fb7e7c083948296cdcdcfbdc4bde036a07f84d210001ded91c554ace71efe
+
+Msg = dca1b7a9a313ead11c2d54739d9017ae27f9d08b3544e418aee862bb57e427636cb6aedda28e10f12aa15d2355f4f8ef112a86fec5dc46e6acef693cb8fc37c3e4885f3be3d3ab31ea4d73a0de904e95c7135a149f77b621d642f9bd8ba192d39cfc58b6f19a797c4f3b4f3a87054298e3ce5eda0ff7f44f8134c9a108285dfa
+d = 05613dfb53149bf5fdc4e08ccc1c752b0b66ab43aef2d008ed40f3df40fcbb2938d2c41e3ea2dd4428aeba9059a97efe5593119673866a19d27a2ee37dd357e22b6bc849e7e22cc
+Qx = 7ef12ccf6b64c7ca64b5da45937281ec770ede572b9a8eb685f3614bc358ce550195e74666af9bb54379c1fe1304b76430d1e51a9976bba02e5781154c9bc187a31201ad99cb48e
+Qy = 43d4ca20f06b26d75be1454e96f0568bd740165a2bc6e5b8429d557a79666bb7b9cfa597d392cc5b8ecd180c37f9fe2088d7908e59ff644ab05568d974ab42ec9e01676e1b24169
+k = 10b4b67007af35942216e9aab1d6561bf7684f334a80c7d909a6154cfde8ef06a148af104d534d7dda59b5cec7949de4086ae669edcc4d68b88347d2445edd3037525c97564ce78
+R = 15bfb47a27c6970fbb3256410d5c2f6c04eb308569a966790636899fdb3122f9e3015455c4b50a6bd8cf519afc22ea845794f51e6994214feacf48322af48590d02cc9812960917
+S = 090c61f6c64381845491dac81d5273d58c59d9cfeed214527a52c8f23b0146431692a25cbfd77abba22d4bc61ef24093c593c827ef645853bc8deef7c3b07bae919152b90c17f4d
+
+Msg = aff61d62c8f5c31bbb7d0a64a6ac589e918bbf2f13e7ad13abb9ac26405e267249a7c9922139bc28140833e10976b87e91cf28285274b2b48b63d24ac94c85c70fafa78f8ad05955c0ce6c02b841ee196dab12306e3e3d6138371217e2b474f7e67a80bbb78a47e374ffe2c9f86292e471c551da50d46e7b5c8331029f369767
+d = 11b92c8b72b86c51903387a65aa206988d443d1988253329ad3a89c902ff1ef8cf73b7f2e4aaa352443bcb833712d94c3e637ec12cbe4c2d4606878576b17fae1512fc77785b737
+Qx = 22440b63bb4557996b63faf19d9f391c5085cdc2cda3755622a6cedc676222ceb5a56ec36e220e507973c0f07e4b2e2d565a69967804ad311f0658a9854b1eddfb5270f4a86b769
+Qy = 50199c9e443555123f153249cf7256dc3e82c5d8cb611adca0cd4fbb0a9a90296bfa770c1b0c0b43e4363b0227273a9ec9f00ecf83afc605b0dd2e5e24f739dd0b4ef6bb11950a0
+k = 0e5ebd85f5fd9a9a81067fdf51b1906023e68672d160ddcedeb35787688dcdc314359ff5347907b685a718ce38a69be17de292eaef189fb9ee8c63271bd6818904cd246503dd227
+R = 051387b0d057985dce86cb962bbca7d9a047f70d96c20539ae7d6b7cb8bffff606f03b8315f15a53049c6c1c227f86d395c2217d32aec32bbd406c790a6cd2706775ed8a0ba1ebe
+S = 0c7f3b7e4a8b65a58c1280110f6c2486cd2d2df7d48b49074e98accdfca4a72fa7d43bc25c6576279f4a70f22c98135ba79158bcc3452940963b556304da8e1ae88973d827bee32
+
+Msg = 721017294f17ef351e41256b57a64a79f3636628c4bcbe676ac9a2d96076b913dc4b246c9945183ec9bd2d251441b5101eac44e2fa1bef59dec03ccd7fa5accf3b7d094d68dcf78c8de4e2f19f56bf0dcb3b66b9421ec3f8b353b9fd74feb2e9affe0bf9aa421b6f03eeba3ffd58fba56b3ebd094880e50de01ee62a108a24cf
+d = 0c3c90d5ce4375a08b85575faa78ee6bbd9e5571ce5a90582042617b807339c282cdc3b003d82006264b1c08c20af4ad4549fbde53d262facb98d923d81b8eb6093374b6a1e84cb
+Qx = 1d900b4f64c07cb959049f2bfa18012f9bc2dccec5a73e9a48a9d5d65499e31ec4a1615c4c50177c032d388263eba1a90e07ea68f081e10272e88a41389bd2626961b646c76ed8e
+Qy = 5c094fedfb5b118accd64d5d46ca2ed92b3123a62042a556ffee9e3bf709092fff88231a26917d368db51d1959ad3285c7faac16ca57677651b070aa0abad96f07d35c5fb8a0ee0
+k = 14d4070307cd269cc1a3c048ec0847edbff46f64c1ba5b734d8a800e50a0a02af57cf24750d292e2c247ef1b860a9d7b5069a32f5b0546fe9e019e04af62316eb79507281fbef6d
+R = 1cda7f743c47ae93a9fa533145feab4c46252afabe3d54990663b5891b4979c645ccaa05c744420ed6fa235952f370f5aa187250d7b069aea1123f19f0f18da18fde98100ff6ff0
+S = 180b4163f2eba6e3769d8345dd8cb003ea120164442efa885eda5bacd75f8d705b7f1bae2976f67cdfe984430e36f93455ee7528fa6febfe92e42a002da165c63dba8fc589e7851
+
+Msg = e2d1f33681759adb7954bb5248b0db3c3885fea0d4c1c0c226eb1e6d2d3ef1b9ac281a0f1c2fe5175b67114b6a501e2426d1454bd5790dcbc4c232cf06b017de8a9bb39e6033f1edb5003e8de3b44cc3d6150c3c952afb442952483cc688908337b7c1a8b5c9da70937ccfa98b2b0098c530ff848010b8e8ee0a8d65283481a8
+d = 10f184c16228d9034271332178ed485d10b6aa76003efc160d63fea26fbbdf5552205ac7df0d8c852a1210cf0ba512f20b798827b36ad56b12a826fa7dc1db45aed264ca6822659
+Qx = 2637543ed8a11271bbbabb2cf72999f65df0104758c2fd6fbf3e1c5132ff1c1111fa5504ee86bed8f219d5025f8ae07055a7849314d2d439408ea2b2ddc40320c57f5d41255d0a6
+Qy = 14e360137ae33ce6930b844d42bcda4050b25f349e9e19fc4fe82f5e4f73cf9bb50212ea875a5735faaa1d5494f1685d6c8177448dbf356b408ffc2ba0726c9befb9de9f0cebe32
+k = 1146574a96394c82972eed1ab7ec98bd08f27653c565f0626fecb431ee4fc6f830554df35fa62b5f82eaad49524d3d4b0598cc7a2181ce9860e271812373d21be9536fc181c3f12
+R = 0dbf465de2c5242fb527f6e4a4188adb96a2030ed8417cd9431365173f569bfdd3e420f86947da10a703370d7f38dc43e2249a2476690829545992645c9c83d82af8adae893780d
+S = 1499782e0163f80de68e3a580ed08fdec8d6552ec69f186a74be89480be28a0df6acdf7c65a72f115f8a59fbc28bb94af64cb3bb3cab20bd25265237a010370d9a5c781c1e26f3c
+
+Msg = 414fc5d2bd56b30040e105cb891788792da595583b11b8fcc7320f40dbf64d9263532dc57344dd17573c95eedf851668b5d552e8796af205f3a0043af1a829fabc2e93d9af9091fdd9e0fcbcc9d6d9ec960aa60e4e2964c29a2f375400366480e513f63d124db7745847310e69a38c8455e4e602056a6a4a14a8694155e0a9bf
+d = 181baf9d497159f837cba58a11ca435c442e5ca792ea559bff9f6a1f562c05bf6bb5914afbd1bcaea75b35f88bdd832314b249a5298622c89462344d3f28a44ba3d059df432fc71
+Qx = 6f3915f884e250034db97327470197d13f0716d1d810e43055757460dc252f5281717b3ef3fdd51085e65a0e073e78b697a21bc33137213981fc05d9b34caf7dca7a4f99be78596
+Qy = 47a96ab5ebec6201b7c65ce7a6e70effeaeea1c095a0172e9e2c7bfc88f7b05ea575076caeab189f810258373cff2484f4fb9c8167989f61aa61ae27113b5140c95f7faa505d2d0
+k = 10e9e6047651362accc816389b26ea6befb0e34fe7363126f8c4ff9333266f46d63c4d45075480da9ebdd0f8da7224b470d914ea1d68cd821f563b574bdeffdd0b3ed73ecb9133a
+R = 00e36644cf0861f45b333092d44fdd99f56e89bf3607f75a06920dfab0ccb1831208296aa2431bdb75c5d50f15bbea2e13d185db6d7175c221858fd2b22afbeca7431c290b15d3f
+S = 023ee3b9ce817eb0a6733c85062cc3bc5f1ae62bdf3a74e3ec704baab05784dbb5ed01a6a2a73c80a3e754c013ba886108d9eed2bc210f29a4774bfe5508ecd876ab47a8527c530
+
+Msg = 3b592cc8972a4782870e079b82a50f84b4c2d8ca90bd500d1ce5678982e266c391c556d8162ac3aab967154d072dbc0ba1dab5545cf2651753dee2881eca5abd412fe624bf3f9d17d33692d21ce23ad15ccffdfd250cb1949e73c9e40a64ebebb03852e92692dad1d7baef97fe109f35b7a492b343d4b643a4a7b1723eaecb64
+d = 083fae86ab96bce99a53e50b7eecff38e4e25b21c4b0f6a4986915de245eae24f16b6a00a4db159ebc27f5a6a072da94ab6be5bf75f5eb3f75c4452bf4ea7014392eb1e02706fb4
+Qx = 78003779e0287bee54df31f64c58951df7999b48b647a6bac416f844485a4cd7a53a64170f9d2d31fdef0194a0c262b90e5bd33a1782d2ad56c210cf80abb5fb118cffd71ad79c1
+Qy = 73f89ebdf0e255205a7525cc12b7e1c58303ac3b3417183179c216ab8e47f33d0af3238e3ae64d418ee89ef3a2cb4bc67a1d2fb1923947b9dbf3f4fa39ff82327d0ce3db24d2324
+k = 13d126fc4033f537b00a81372031026f6a7a2062863a68e36c6909c548833d1a8f5fb5fe25c7d9f2c65b1dfa974630204f71e96d657095b93cb54b00cb88f32adc08eeff4036654
+R = 09be9f4bcd7b8ef111337fb665379509b8b17a2212a80d5fecc685f1f362c45f930acaef9df47c33c6028cf7aae424264575b4635a11edd6b005ad26cf2021051501fdd1b77d2dd
+S = 0dd196343ef76bec527c5929e02fbd5d02d5b0a4b5f2c8561978e600856de56d42943f1d74cb81b67010bae98de0efddfcddea5d354c60c1fa76138801f6cdc5bc932c136309b6c
+
+Msg = 0079a02cbab3dc02601fcb5c8607d555beef7cd71a66911ab6514a4ae21c5a9c0e166f8cf5fb198ec5a49a96e17cf041f35f00406b79270ebfe56dc6b8417d2529fd625686ffbc8f69685aefa2fd30a937c02f25b48be4679e6fde821de928b33b12470867def874bb8c7c8038ab6594346a2c44b39210d3610994ba60a05e06
+d = 1a663efa7bf4d8479bc535fad71e9b5e4f4281aec55967baa008ba17ac2f89cc3398d30573edef29d590fddce8cb157f655e92779f59e7a18d0327d02e7daf4c1216143b3688fed
+Qx = 6b4bb31856dc516be60a0d2d9f42508738edd4f925eca9c72a13cf136720867babb38622fe97df70a1edb35735365f34c74baef9aca539aa1dfdead3324f41a16ca69bdf86b43f7
+Qy = 6c4a91d3fac9e7647a6aec6e4369158bdcca2275866bcdc5a09b2f0f1eba10551da9613eeb1e8d3233316b62a5f4641d6aaf669b975dfc511f2437d43c9eebe53c5115fb4741b80
+k = 0a843d0cf776878fa9ceb163d7aaebd29ba3aea0808c3459036b258b99ccae4e2444bc3211b5898c0769b7d7e036c07803497e13803132b3c6301412af3be8eb4a853e939a247a7
+R = 00356e282c096fe1690fdac4c0c66eda155ec42356dfc4783cff0160e1d76b33a99442d4ee0e3f6e1c5bde4a16c8e18bd18f98a178c3fa4a560d8fb8b4b1d72663576f8baf8672f
+S = 0c5018c1383fc3847819726e1e940028892e1abd164b413293fe50f219f2059105218e4e3b952b912a3258c4ae52dcc03ac5f027fdfa448a8d58e3aa5c21e790b3b47bdfbf21175
+
+Msg = 88573bd94ef50459814806efa868ebf92b066fbc2f7a4be9d2fa06b9dc1a72f72d783a6bcbc107b18a6314511bff217037a2252e7a5cd34cf9d5b2fe9c7846931f0133b2e95876cb800dc4ed7c4a4e4cc4f1195acf99fb0ec224b1f8fa8af71f72d390eca9d6be3879032a318734a63fec336c79035a43f70271def10c4955d3
+d = 0088d1a2c0219696a94337cd56516252b74139ea0733b17fdcbf7692c3e5f6c3989e5da2aaed7468e65a5d578571928ca273ec3b6aa72cd196f560f05095cdc8346e5d31c4c2e0c
+Qx = 357801cec0888461ffde22d83afa9ca008ac88518f4b09074d29a846f5900e024a8e5947bc25ed0e5c980a58fd5e9aadfbfab31db8bec575fe886deda80134d91b3de9625465302
+Qy = 710806c7ed33f6879374c59ea144326f5948980c8013144345c5070122c0ddb7e18e9f752eadf2a9b0854dfb7d9b2f0d80ff0ba46197ce6017885939e9f59b642a8fa41639ea75e
+k = 16940f69013026bafb6f400c037272176b04e35e9f1563d382dc9982968a186e3e1525775d27150b34b8ce5e70b537f0149ce1a521d056b52e75da7e39ee8a529ed987c70b8234d
+R = 199058e36449ee1a3388d7357c9c1020b2e4c02144aea14b041bc584a752c94fb6e474959b24bd2c0c104f5ecfe223ebdede672298c29195033aaad5db1852ce4dc3185ba2409a6
+S = 11f3defd9b442378c461e2c68b239d2e4afaed691238c5ac4e0be46ebd461639a60176f9884133900f988e2d730d34df5e2bd8a14681014c0a213f8d233b3c50ae3064fc38d1a19
+
+Msg = d0e02045ece6e338cc8ab41d4a064c982ccb1748c48fc2fe0a6f10bdc876094358a6a90a45facec798a83cc95c6795cf0f0d7c66b77e22cb114c1432bfdaa1485ff35b6a58107cac3b7e58cb4f6c87c68db60b751e78f1fdfa54b8923b98caad0a4f31226956d065c083ace5f1e9e91944dcca51879d782e40358d58ca758750
+d = 16cc8a0fd59455ed8d4de561fd518df2e008f7dfaa5f7f29ac2489a411e233917b43eb3ebe2596fc824be58871949545e667dbcf240dfb5e0c615ade0179d9ea2a1b1ebb8ab9384
+Qx = 2477e678793593e2abe837961895c7ecef71af1feb882ff27cfbabfa0ba3ed771b79223e7b2d2388efd371d5c325854cd60e48484f818e1a8146fbb780cd6ce06ba63c0db67df8a
+Qy = 01b696114838bb972ec6d536abd809d3a436650191c43b2bfeefab2b400d5921a7eb78e307266acc190e05f3869017f0a66f886bd6556c58aafb1042478cc768a4f86758e9f4c32
+k = 1e1b851bb95d2913d6d35b756d49fba6f4c127dbed80fe4068260cab89c1d42f7a6843f731e83b379ccd8a4915d2e29550f3f6ccde607cd0b066dd5fa41ac2bf37bdcfc26cd4d04
+R = 10d4291346685fe070b267edad91154df83664dc115f058ea036c712929634d53662586bb50cb6473c2170db5d4ee43be0c50532015937202e193d15d5189870691ba65aead7f3e
+S = 0b2a15f1ef00204bcfb5108d8f1da96ac3297aa041074b68989ff5b6b276380de7887753fe3d416ba691ba0b2ad7fc065ace02815b2323fe17f6445b0fa66dba5d99d8e7d557cd5
+
+
+
+[B-233,SHA-224]
+
+Msg = f1b67fde01e60e4bb7904d906e9436a330c5cb5721fd4e0a3c75b83dade868736bb1d21cfb1b5c6407c373e386ee68ec2239b700e763728eb675a153b8ac44cf2a87be85fe8ed6683430cf4b7d718891cbf8d583d0a37cc952cc25fe803a7aa4fda80f05541a2f1f2601cdd0c095f7110f2a84f7d641b8531572269b21cbe77b
+d = 056673197bfeea9bd7a8b820b4ae51a50411bf118a692bb9ed3d304da53
+Qx = 03489be62e53910c20cb508de019c3e326f65051f26749944b4454f156a
+Qy = 0f775ac38baf19499675725e8190aeea16f52346b1c890d9583b38c7521
+k = 0a6c9914a55ef763913273b062475fd0188eb2d5af9c8c1dd97cb3cefc3
+R = 08601a42d7f7eb047e8ed9820ddce665c7277f8ef38c880b57109b7160d
+S = 026d6f50f0508953657df5d753c595ffb8e1c19f8d092f8ce8db54f76d0
+
+Msg = 1d496d96b533c632ed6a91f6e3653cdffaa5b8cc0008b35e49b2dd52fe261105c2ec7ee71a4ad5d51fdc3d36d688a3b7ccb3b3b0c3a65be17b8d8aa172e3005cfbf37a2d1b1a6e268c090c6f318e7e96f9ec9b9f5a8fbcc7558d89e840f7e76e44bed91c26ca48e6f5cbc253ca2fe8cb81c484cabd24070e488f9c00cd96ad4f
+d = 0468f01d483144e514ec257f2e5fdee28a927f2adb19714c1f3524dd0d3
+Qx = 16b3cad89cc42b80bb730431963526e26ae3b415b421575dfb6ed973e17
+Qy = 1acaf7de06e20262efae01fc80969cdc1a281f68e8c8bc0d2d4fbba3a3d
+k = 04d261304678301985f5bb3f6ae465f11c9fe0e5031b31f194969252703
+R = 0878a87b2867c03f55726ea2a6db822788f4aa4e9ef609997940ee8c8b6
+S = 03545153f0554a8f55301d4b948043de3057cace62c8032c8ef8a11dbf8
+
+Msg = 723400655027f474446843645757f7e2cd466bf97275067b4bc4c9d79bb3b19b2421835d69db916f24b77c381fa771fc1e7a19d2b4d09411ae55acccc615b16fd24705762b441ab67083a921fd4ae569ce0de69449aa96f5b977ac7dc022fdc8335656853796f54b3fbd118577f98920624eb0a00204f1ef83827245c06646cc
+d = 074052d027f05465a8083a59cdbf32600224e1f563f653b34314651517f
+Qx = 06999290db440eb5b3291bd4bb4a1af6386654fc4d275ef136c0e03dbca
+Qy = 1fed0b1f9284e488c7fa2a010766c340bc25dc132c7679c2598e423c3c6
+k = 06e38460379ac3fb13f64d4de654d4fa30bd8178da0bfc29fab2a1e2e39
+R = 01b18bafe55e5c24fa2df4c09112b44d24e78dd09557349ceb1b916d280
+S = 0ad7cfa003267a6b7a99894f75720cedc9cbf820d355a6b840709f42f62
+
+Msg = 155860cb31a142082bcc0bad828d747e916392d21f1873b3a3c1d28ca3ff9d45ddb66a712e3856b6afd07c8d2b2a7badab296a9775b03f6fec0befa2d8d6d00fe3938df244ab46e836a3e686c8b4f918da49f0bb3940bba34a9aa22c7caf02df7758b0de01d9f47af6146344b9be3842d9c055eaf0fb399cd8db95c544a62d8a
+d = 01856e7544223f55f80de72a6ef3822fa8fbd68eb397d06e2d76ddd35e0
+Qx = 1a117e52f09080625f85fbaad8ebe0d3ad410f034242bf48365e88ff735
+Qy = 008b8bb7958d191265901a3f15b2919142505efeea13df6e42da8b0dc1d
+k = 0aa106ad1461353865706bee9aa092b00fcf1b0108ecc1266ad5d8b6579
+R = 0bd6fcf49029df32fe0fa47f39cb9428d95d00a84a5afb392d7b4b365e0
+S = 0b17734befefebf03d1c79e59c12ed3c57e7d120dfd993bf276de559588
+
+Msg = cbd6e305cc9f0dc90caee6e65a74582e9357bd25c78e33a7b14e1ac7e9397ff4466f192fb432143e6df6d61a0ab808ec0a361a6d95a357a38cd3e241fe03ed883ccc364b248ee2a08702110745c2688bdcefa33c1a45b9c8b200e45cddf3e3f66b8d37eff07fbb3366ea1558ef304085613c56707095724b3e134c7a7d3f8dbf
+d = 0860aa2b589f2defc617be73e191502e5d9952bf60547fef19eeccbca26
+Qx = 06abc5619422b7d548c612e54df0385c293632d4d97c21e2e15ad98d0c5
+Qy = 06c36c072603681c1b03f6a023c8e987f39d931bc2a200eff82239ee38f
+k = 084fb252dae9a96a44212d18e15cc52d179cd5e3392ab9da57d04cd5a9d
+R = 037cd554e7815699f033ca9187ddb116777ef847b92353f613152c4216b
+S = 05f806dd062043420dd056998bdb9822b3177406a536d766c4aacdeee81
+
+Msg = 812a218ff1ee1472c189f63386e5b8ab341671c3a4dad27a8c6249d1c0f9a29338b471b6179f17a078b6504e804ac55ca3b13e68a623041bc1a092ea2adf3fa1124bbfeb161e6d7c483433f1548763b84da00352a6386e1339f674d45dab13898147ede468e0e01d2c4e0ed66b395a16cc3ded3e952ac739205f35a83376cbce
+d = 0d0dec052a00ccebd0c0c5d9a08272f75744a2582cec7ddd924a2b022b2
+Qx = 16bb8c3d319b93731f1055756e57bd56d50b6b9ffbe42735925cf6f7675
+Qy = 09dad7b87a749df130b45d9cac8011101c15abb7e64bd4fbdd94107fa31
+k = 04098547601430c723ebcb04b23e0f1ce8b1f79ff7ed3d05ba130922b01
+R = 070ea6221c0d62930b019faaa856ad2c84c3989ec54040bffc42d8dadb8
+S = 0aa20fc58beae8ccc880e7fcb48a471faa5baeb36bbe5aee71ed9f8adb9
+
+Msg = 0204b1fca831919e89e108cf140b3770f531a696b1d9a4d1fb68809eb10afccc257cc90cd36717c02b2f3d6d3d1d8a93cc5c48aa7ab9f9fddfe121ce9143376535a0c65e247c6558eac49fd1d6d1bf431ba918c471cb3d536ad485ec51f6471a340ac75f160c4c54cd3ffb9dcc123124b42df1fd2eaa005e3377c5d2d55938c6
+d = 08a017d717d6d1213f2b74c53281b07258738c0c7db649ea1ac46b9a3b6
+Qx = 1eb379e27de6c04c5320cbc18e79ed9e8993710ac70ce823f1ab5762b67
+Qy = 0f552192645d350361762aae79ffba39c33c2c5c0df208219f1b339016a
+k = 00e4822b2cffa327a8396301b21554da6fa52f418d67114bd58e850d935
+R = 0d64dbdadb4ada2d3a8892049f7fda3c733030522b44cd72ab850b77bd0
+S = 06fbae2d8e4fc04abd8a6e9cb011974ac851ec108e38f9c72603f7a04fc
+
+Msg = 2033eb48756638cb56e2cc39a3e775cfa11fce86cf71f04487dcdbc7f262bc8350a30ced54d1fcb697b28a6e96f88f782947c997872307ed963e1d68985f756435af77f57755cacbb4c6b50ed419deec9f39f0a549a13e54254fa0a5832dba2d943ad4aed8688889a2dd29dcb4ea12abd6a6c50eabcb3981c3a0c1ca5f0b9629
+d = 01b56c14442b084cfd22aeef0f8028ec57c8b571c9fc1e43de05c45e47f
+Qx = 0d450c533b13b211b8c91dad0738402a5c811460426ee2f35ae068f2c12
+Qy = 15e1c9f9d398925c619f8aa0bac746eb7907d3d510814cea185a7efe771
+k = 0dca09773730a2758b7f4d9257a8e6bd942c141e46bde5ca54a79468c4f
+R = 0379773ebb7a2860f3422d8f8f714b234e5abd8860defb19c659c9c6179
+S = 0cb9272a27661604425ab84632f586048483b9f9cb80b9697898e745117
+
+Msg = 2986ab1cfe8873009e932dc68d4727d77ccbbf378e43fe4aa7c54416346b036b89c0aad1b82977c9fbc39a00f1dc916c0561d8dd70298c02b6cbfe572e0ef2058641e841c6875e8515f3c1082765e046c90c956d984b76e0e8e6eb433ce26c1757ac5b13422479141971c20102e9621d18f51096ae3173c2753facee2862d66e
+d = 05afce37c5594586ac46a34ae291f591eacb9880a7de92701977f447fbf
+Qx = 02a069ef14f2989d2b715c5006642ba966cc84df88bbc27e713e15c47bd
+Qy = 0f001f60b8a8102a971faa2c42d3ea9cec37b49c7e6ec0cae9f7fb35713
+k = 09756db630ed9b708bf1ab8aae6a7559bc235c4e9f4002ed26e2f019aa1
+R = 06b9b2c1d214373647d9a2d24ba69741218064004614368915d5cfaacaf
+S = 090dd607329c27483fe43b7be137c3f51c23217c939baae40b53e65af2f
+
+Msg = aabf5aa90ceef91c2155f90660adbcb0eedb996f5242cee15468ae217058ebeaad8cd4ff8cdc754a8ab85ba43c59fbab6386686fad5e27ad3848fe52191c7e4b203720841501792a625aef2acb6e36493b792fa55f253effca682946ad8c77e01f44e92ec3c258d0dd98d3183f4dc4a0bd3eca183794abd6232a6f9e4add8f57
+d = 00696df05dc7a54a9908a73eb18416a155cc8df4ab26032539d86eae537
+Qx = 08f9f494ddf8d0030746a8c0b8d215dda6cc2724f411a7ea407629294c3
+Qy = 1ea2e9f85f06412d29c677aecf624a83c2fbd86482dc0d564906a91d97d
+k = 0d62b06628d3884f0a329a7b6b4f832fabea4ebc85ee03e63f2967e7810
+R = 02e39824f272d4b74810594810957963c777207217e53a672010605b9de
+S = 0e64bc44af64b6f879f0d32f814acfbb98795ef7b2f246b3f91cacb55cc
+
+Msg = 29ff209eabbde02b10b3fd559671fa53e418750c32c4a18d31cc0186d1077581bbefb8770ed079f536e866414a07431ae6633955bf42a2389b6f8a565d6e4ffb4444336e0030093876a26d4e3106e9ac697788e41f8a21c755eeb86a7c60f18e5e1069f16408a4c375a6a68d42959f2fab7ac09736c7b37c80c05897d8566ce8
+d = 05ca31e88c5b2e96e433af2023a66095161710628e7bfa428944d6676b8
+Qx = 08232d4bbe25536ea7f83c145a8d2b1cd72c383eefc2adaa1ce72c7dd9a
+Qy = 100b738c6f1551b3240293ee8e8ec29fad0cc485ffc2cfded96b68162bb
+k = 0df9e1b418ca1d41d749ee998446ba1cc54bc8bf72eac6f30929b40b5c9
+R = 0d4248e0bb60fe46abf7bdb2effe804b9d394d8a5514a5791e149d435d3
+S = 0b89a459fb99cccebda754c4b2ae264c9aef7b5b610427f42c35dbe7d3a
+
+Msg = 97765d876c80819f4004a36d09ccba78e600efc71eb7e869d3a00f658d2ace6769c7ab1ef590f41fb070aa8e08615e138df45ffbb6473d4a86ba5fdf17dd6dc9ea9ee19c0332563c99e6a3451c211d286d69102b47bfa6e07d468d9bde82e5c2063fb1ebbbed6086f542cf68ba46d4f214634afb1146dd5a6f3d50912ef5b824
+d = 0ef8fe84727a2ad8bf4e646ef28a492adfaf785a3a2ba6e6f985c649a8c
+Qx = 03435eb25ce9891a78c120098992c666940103eefd80d9bd64f1d4ba37b
+Qy = 0ddd6a4a01e443c92afbc247f634b85f1c858a2aaad35a26f57ad4c9126
+k = 09753a236759eb32e13f19b9d2ad06f7b4db4ac7b1df96813463d0cd557
+R = 08408fc46149dcce0753d7cae0f50c8c5fcc97acf7a1a02a9f68c0b80c7
+S = 0b5ffba104acc6d0cba87523382ff928859718122c4d0d2298e74985d89
+
+Msg = 21cf768d087d1e4eaa8a05e2008020e243116206d675c09be42ef2bc93617ecbb0575c873c6510ede9979215531b62126552738862fc4323d487992754e39d8f0d7e111e165ff254200e05082f59a57ef649bccaef6f980094fad3b7ef93bceb161760e200f0a2e396fbb6b6142dc84d872311bf932b84616b22231747937d58
+d = 03edb94b8c62f9af30c14a790c0f5d65e362a21cd8569b9725916d534c0
+Qx = 065133691b888cd2513964b5a905ed9334cff6367e25c09db1743045d58
+Qy = 1408e1ac721bfe2198086c1834d484b6e5692c037e09928cff87f4b5a88
+k = 01d8f800ba05d8173b0f1bb3aac0aff68c6b24cf98c28f5a69b0b5a52cf
+R = 097c07d4352e39e1878c42fe97ebd4c3ba5098706879fad9be4bb2dc2f7
+S = 0bc669db3a488e613665cd26da7927c6b6a073ba6b0951c00d22ab1ffd1
+
+Msg = 7b8e58eecdab3e40212bba6bf284f9379265b3d2baec3e4625aa08d0ced851da193c292ec793dab42732c07b4e94d8b19c83aed796a7e3a6c2b954a7a9a1ff9b2bd4ca62592c8b68f709f1ad38a5c8033ebb3f33d176945bfc68e9ef2b0cee2d45a13ce89d238a33c09ce2c0c63c4233aba5717b85c4c161dd7648a41a5e39d8
+d = 00a7519be62562318da1b67d22cf8e720353d22641e0cee11c7a352bb93
+Qx = 13b63dd8ca9044a3e518a67999a781a5b62994b6e20454003a9bdb8715c
+Qy = 1a2f9bfaf528b7f5bc8c3b02eccb71666c83e4a598b4077de999d90fe27
+k = 0992ba1a8331bc4d88be7dee06f96098bc2ea56668f345e187f32f38171
+R = 0c55b45bc7bc3092ffa82234b06ad45525b45f8904011f1bd6cd356f0cc
+S = 0e6163e70ab56d43fa27211b98b48f1cade127237bec1c6556020d39990
+
+Msg = f8f268d2b04fe47e5052c8d0d653787384b9654f0bd2138a6f52b80713feeed452b976a90eea4edcfbb62d04f3eafe172ddebd7cdc3701ecd6008e3d82e8eb217b13b5228839f61075159f3bd1e1409c08903874b6dfee2789dd72c208ae769ec8c7d52552a2b1fd73dad24de8b571f88e2184d0ee7d063a121187f97e746f2f
+d = 0264022fd7dc2328a6436b522793ad9406d7a586667a0daaf1bce927338
+Qx = 12d7e7f8519a7e357510adfca2f50182dc5fa12fb2a77409fb781ed500d
+Qy = 0ceaa9a22b7ef9febd8a9962ce21d83fd2a2a938b9d7a78d669dd233974
+k = 026fb8fa6e746106500dd29ee32bbd03b94302ec3a123356b23b3055e51
+R = 0f416418f7aa4d437e7606afedf961b968a67d9a1524d60fe3f6df4d3d0
+S = 08d3afc975a8147fa8230fef4b16e3024180a9768702038f955357ce8df
+
+[B-233,SHA-256]
+
+Msg = d288768cbd066fad4bb2500b5683fa9e4eaedfb3dbb519b083f6b802efda0a022355565c5fc6babeccb22f3adbbda450ce5d633193d1431e40c0fe631a295cf85965cd3f5937b31866bd6a5300eaef9941daf54d49832acfceed90e572ef34ccc94eacd0fd6b903fee3c572b963d21e2881656a214d2a4c125778dbe3bbeebca
+d = 0da43214e2efb7892cc1ccde6723946d2a8248a6b4d6c8872fad525ec3b
+Qx = 0db09738bf0a0dd777f67e82be50dc8c2d8e91598bc0b8d4486f67c04a5
+Qy = 08ef463e2f37ac7c3d276676cbedf17ae11e767ec577da7ccd90cde3b74
+k = 0249cbd55e307a0fd10a0c70b1c0d5e2416f4d7f144779ddc11911f4a08
+R = 04d1c99f9d486fb92b132d68c0173df891ca757572f7acc03cb41d46bbf
+S = 07de2deeb58d55d65fb37f600d916cfa49f889f02ef53dcce412703d1c9
+
+Msg = bf0ab46e0a756c11229b0ea961f8d57218be5b00ab8b0e91d7664cdf5e0341c412c0e992d26ab12115197db39df2d1a6e18ed26a91be461432a2dfc21d98cb16003e339b0b0b1f100e4e6f4824ddac5442f22a1fac26326ed8a89cc91343d7223986d485cc8c64424e84d56be536c57e4dc5faee459b1958efd79e07e90a9811
+d = 0aeafa49d776b61f6a30d66ff64bd40dd8d79891dd5293c1b5cd3b46a7c
+Qx = 1ba1b87b16122e6939da5dcadb8902177a9f9ef09194c8695008b80b588
+Qy = 08f51ee5cea1f4fc9c44c70df57326ff121268bf4e02cd9b2626fe7c1ed
+k = 09d640ede5bb60b9aa78e393ed453b1643f6dade4aa20e994db53e81fac
+R = 0277bbfb7479077d5fb6813670fbc7f46055718199550130b122a7cb8b3
+S = 0f8dd350bc0bd2d84cdd374c56ff2341de4102269a1e80df7e35969d4cf
+
+Msg = c7b1eeb7c19eb16e7f42b61d79e421b71de797a6cab4e0baee522fee7acdb533f7bbf5855316544e1b82b4f2a18ad0a2311e7622549332122171f32fc62a90e408207e0fb90d1b052821dede9c41b15b6e07d84d5d7b9e31e6396a8ed229fb6232b3051298dc5321aa589f4e289d27169f14c8cc93644916d9b72dbc92c43488
+d = 0e95db309f4305b621f51f93588a2678cb19aad0932f365fa0aaa3a3895
+Qx = 1177eefc44b6070e2c41537e75c91e2f08908c0d950bc90cd2f4720b335
+Qy = 0f751312dde55b1bcabf31665deb6c12d043d5ccc89800622a557a7ed37
+k = 00015798ef57a771d62d194389817c93de1b225398fcc0d2b81d94054a0
+R = 0eef7161a167f69a6c89b0f173db2c4a7033b5d801c0d89642ce65e377b
+S = 04043f8985bbe0221fd595f9355c33e1930b5e10a1452e81c31259e1e3d
+
+Msg = a738eb074e1f277dc665118ca055e6328059ab26da188c16f56384c566e43df8cff3d2a10d2d15c3c1406de8f734b20be5dd1ce937a4289f0ddfd7bddabd03586556eb8233b8feefedaa1f49bdec6d45fd562c2a83fa9fcfc2013bdd77900857199e51fa9c7cbeab925ba8f6c3c5fae46bf8e9c574b302f1e5f9c44400152a78
+d = 0d4319cc8e409b8755880827f3200d3f0f1c64d6356fe74eb1f5aa42499
+Qx = 0bf65953f2d08477f7fd0428c31125184e3bad4d5da00c91991949e0562
+Qy = 0f1669d0d116817d625128ae764b3fde956432552d24d98f08a12925afc
+k = 05e8704febc38bb8ea76f3c6433c1f0421dc5e5af959723a5a2f0e9a970
+R = 0307c0b838c65d1a47792cb367253bf7c9f627435f1c7ed74494b318446
+S = 00031a9b35e935be6620243f4878a38d4e617fb25f7a4883893366f39cd
+
+Msg = b28103d77e5457c42e026e713ea6ff03722a36512da17197140117442a976f9e2139c54a759fc26af5811b455e5a0d3a95362d9939c1e738045be9237b469ae2106ceed7e7842b44cc0a475d5af6d781e32ff1dd1f4e1833dbc7f82b27dc7e1562d0e29213fd8911105104a7a16f665b926aa137f70d868c90e72f8ee2c95b64
+d = 09e556c945052e5954915c773b2d47970c521fcc99139269c3ef46093b7
+Qx = 0db68c16ffe64bede4a849812df0b8e202f74500cb7d5349aacf7f3f026
+Qy = 084b5892ea74835e96e9dfb1bb201a4dcaf32da25dc00dca019d806f5c9
+k = 0d0c9e0b6d4526d5f6494d2c72f812fb8d26e17c7a44f6b5e3f9e684cad
+R = 0a379ac253f3aaf94cc49e91fe3f2908107a9e1a4d102e02395eb18cf08
+S = 0854c2f6ecbfe95cfd14045faf71ad47561e365c1dd5f515d8817c3198e
+
+Msg = 463d04c84521ae671bb35c0a7acb3ae509b1b0470f39b8fe7ae5f3c9fbadbeb2bcc3a87e284cbdff07407a351f7ba743aeac50c4a1fef7375b90eb4af8ea2df040776bbf3e4389e7a80bea40530842642b9895ab9ef5ac8ed6c9ce7917d7b3ebcf80b801da845943313988c1970e7748cc306f914c37414f8247d648b580000f
+d = 0becc76f8a77615c4f92ae1f91645bf5bb908e75ef22fd544aae63a3c8e
+Qx = 18cd93bfe8fc8ceef2b9be14fa947b60fb122f5099cb5bcfad0cdc601e8
+Qy = 16de11e673011e30f6fd92025a60d7938412ac63b19d23e45bbf53c6c4a
+k = 04e75a7b92c42ba0581eb1201fa5b3fb2ac82460e953c26ce6bc60e145f
+R = 067bad23ecac0883d218b1368d822b3bf9b82453c0e5f3e336777c6a507
+S = 03788a331249463533384a61c47232aee6f057634c37560ee25895b2a03
+
+Msg = 8b2379b5553ae7db6023cb010e26ae91322bc3f94dbaa369481936f90a886e5d3827d995ccf03ca59f46805fbac0337d31a8f117cc7044218a934d5bf507090e7e21178a7162c8fcb39111e6967803dbf9d752f3ae737ba024d0f4f7627e08be58efbe997a164106bfe37f67d2f19c0fcc7a6c7eebd96a72582a9c7bdf881896
+d = 020572c2a3dc3ea430cd8cde9d642081c21658e8bda165550cd9a5d37d9
+Qx = 16117486794f14d171dfc3ccffef0396cc9fe5aa45d6d39ce0f252c4168
+Qy = 1b6a12fe2adb279dbbefa4eafa273a2ddbafb2c6401067a5ef5e859fdcc
+k = 0edc8d0b64496da309b10630e9e5917c9a807ccd7cc7bab14360873eeab
+R = 0e1fdd3b7849806fe587ad93aef737ba0472409b7239981f0d325785fa2
+S = 0829449a0c39071a832664e8148e762efc36fda9e030e0d062458728273
+
+Msg = 3090bf7373731cc44c00372c1ac59280b0f36e627ccf763fa68a7be37bb0ac8cbd4f70db54fc652566c78ad268f78f015e4bb1e41516fa56ac303a3bb4a52e1fe897d8338db5a6e37cad685e704b994504bd231c7dec0002dbd907a7ebfa809833e32eb23fffdb44fe4a18e11fa19d67356cfd703cf39a75b1a290b8a7c73afb
+d = 0769cfbf2dd8248ea1e0ac9b275c9d6ddcf923fe762079b9ed62ccbaa89
+Qx = 1aadeee0e31ba9505da3e195d883643d260dac9fe5e86102c8ed7f88eef
+Qy = 0d925bd5fd700fcdec60cef9c9fdd304faa102d9d721b4f21291f8c96a4
+k = 0f2e203410107c075e25c4adc2f55dcc277883d679ea307df7d52060fa3
+R = 02fc0975c2e70328da4a0ad2b8bd344a8171c2c500c55b1c92270230c27
+S = 08871b6791f7d03796a3aa537fa820f0eac8f2463c9f918468e7588b784
+
+Msg = c37389cbe3f46eeebdda343e354ccd543e96b0c2a87e057aa6b9c4895a403de706d658bbc9066c140e50fef4b56af2db1f42efb70b8021254649983f1e11d04d6b10169d5a1c2093b6ab89227b88a30537c776bb7575749c3ed87bcb29effd8e4f17915b4d5dff6cab9678d88f33abead1e73dbdc5c3307ff3d3b2d5fd7bfa83
+d = 040ea4a37b388f0cc464f7e2bf92173107b268ff77a8acf5f517b4ec0e4
+Qx = 08acee84d29638a7285654d20f8e0653c7386140aba0bd2fc157d517643
+Qy = 1482ba5ebb82ba46654aa1eaa6a5f01e030177318921a0c99fa3f6eee9f
+k = 0a6fbf938e9cdd009c838196ffeb61f7f545f7e7e9a6cb18d1f595a87b1
+R = 096a80172a7b3b65c0a8acfa8b89cedf9cb19f6eaa5d38436c300b7c0f4
+S = 0b7bb96ddfc9d1324bea96836c557cf88d6ede9a93ada8fbfdfcfe56244
+
+Msg = 8884def8c3b9c5f856b9c2352c85ea71aae3c8d0e84ca74e70e404a21467159fc9826548d16dd1ec5a75dc2c23ca37b30312f25e1194e0f9385a0499db34c855412bbf58979ffce7fc3afeb7b8dbf9898df44023200d809f520db99eae315b5cf85674fab008a20340fae8f6974034fd3e55bf08c5522a460680218f9757e368
+d = 037fc7898df9b37b5390537352f5c0b8de22659166c19d7d4df31c3938d
+Qx = 198674b40d2a68ed94d5b2c51102393d1332404f75187130669b9de0df9
+Qy = 13ee77d854a60f1aa74041ef1fb58727c09f13039bb4b33a818dfe9af2a
+k = 0cf92eebec59605b1d45848f5d06e93ff2767dfa282929208ba801a9fec
+R = 0f7bd93dd4df06219fb974a4e85030840c7d4877f131adccbd98cbd25de
+S = 0c2c4a864459488eb5498a06b0b56ce7fc98fb29b1eb9b6238da8cc8f52
+
+Msg = f1fc154d469433f56c2bd42aa52237a4a4bfc08fb6d2f3f0da70a62f54e94e3f29c629c837e7adf0474fa8f23251b9b349a16848942c0d9cf5db1d0fd99527020dbe21cf0b94a9aa21f376bf74da72d36f87b306b0696771efa7250c6182b426a4500ac14de4a1804b38db8d4f3beefb8c9bb619ac82cb63fb37c2e1d22951f7
+d = 05d5069425e7a9925d2cfc6360a708147b2c1b55ede243591885147ef3b
+Qx = 1f35f161ce0963dca70066b3a6de2a74ea1941a27cdfabd9e433d8084c7
+Qy = 1d5d9cca5b741b2321d8511a777fcc2515c99ff8d13ff20266a163c94b9
+k = 01b9c83d36ada7e9367790ee850163ef4420104e0dd3299ef6d65191d7c
+R = 0dca4e804bf74aa496c15025acb4232c637c9b81e9e26d6f2065d6be21d
+S = 012014f77a4ddb7b266abf2c65a653988ee6f913e700f3f83f3e78c88ab
+
+Msg = 885cd348f7983a0721f96c0e866821223d3e5a95178b16d18652b4062b1b2278aed6f54ab06f7e37ae6ce1020aa3eb812d215194bcd212302da5b971fd86aee1dcb23057dbedb569bd0bbef80df538da69ae2358cb03bb77c64d3ead475c8c5ae5bfbdd75684b421a26f1a7b0c37548fa32d805acdc91230dd70a48232a12846
+d = 0ffe3e7b82ca62b96e057ee072a4718ca20a6cc9a3e51e4fe8ed7b4b9f9
+Qx = 10f774adc83c1893894855366f1db1962bc697b8e1d047a01a08b12da4a
+Qy = 078c6ff634d5dc8ffc4d8b1a53bbf94046023095a8c2b41618c4330a4de
+k = 005a4a50de4e97280d6ed1324214d91b271deb649a2dae18d21a0182022
+R = 04bc8ba9ffbca81b5f19f0d8b1306900ee642bc5cd9a9dc9867a4531b04
+S = 0353567acc062b83459017c70cff4f3b8ef0925032b51d7300261408549
+
+Msg = ca3b0e2f1c7db4e73c699f06e432bb0f63705ba66954bec4a259bf31c161bb4861476e2f2f7dde9d841d1ea6bd0990cc793cd7a10432e38735c3eeda7a0d786e8821239bdd6c4972c96c2cf68ec5b935391f963a50fe16af2719c9029943b539ff0f1f5645962a6ac46c75d2037fa0c7cd46deadcdfc66e1ddcaada3a376acbf
+d = 007a9cb5ce27c763646de414ca2a4dcdb774d69ed2bde7a817baddbc9de
+Qx = 086d4ac1e3d54f7c154c5370f5c9a2d22cbe8f794df68974706bdc9172c
+Qy = 17770a2ccac923423137731a14e97f6ca65a8cb3642eceb4e70c78ee929
+k = 0538b86e0a899281ab56d28f40bf3b7435f9a57e334a3269233766049a6
+R = 007ceaac3aa0e260c371843104f5cb91a057741b38889ee796e69f920e9
+S = 035eedd44b036b843deadb8e8df9d96b16e719ba350a634553457ae71a1
+
+Msg = 4b0a31b746763beee77cecd318b90acf50fac4172cf4bfb354e5a440f651cb89d7a515e09ab19e9850803ab9167c2aee3b395a5da10dc9aff799d73756dfb0a9961d93bc32f15a96bf13962a03d5bd42ddc8b5928def7fc48fb063f42866fc5f96cf88fe0eb125b7c01906ad6a7fdade28ccb0a421ceff50ae03a974671b2c27
+d = 0c03fa9e38dc1c697f70bc6381f2bacaf860bb5632fc837f728da959ac9
+Qx = 195f386c7efe108fd1d580f0a77031e180e45a23911ba983217207a904b
+Qy = 1a6837095a64f71ec53ab1c0d9a3a39d69a514065d83f1af26870e41741
+k = 0d4f48085b367787a614b57c06ee8018b2e95e989c2e8cf355e71db1091
+R = 0391710f815babf07b6287b7aab8b9d2ce04bee2a144f4d4a46fd17cf77
+S = 0ef29cbd771b8a6f414ecb73b7937ffe0a108593ffc6899f28d4030a9eb
+
+Msg = 3011d42792b21c0f1719faf6f744d576f72c5fdfd22b1a520d0e8d47e8c2b06823d853b13c9fa039fa30a6f2e3e27bb2100c6a35f55703806bbf0f79b09d0f629f8042ec63fa04062f15f2edb92b19237980005566f02bb12a40b4ec66e4ba6c599d928b33f72d7437c0e399a8e6a9068d1fef24917fc4f9ab5464ea6684dde9
+d = 087dba00e3fe4802e01718017510094924496bd2785d4ac1a352c530473
+Qx = 1198518db2d1255aef955b9b80471aba60cf6d8fd1feae6d8e048ab1403
+Qy = 1833332a116214e4d9fb37c8e0ab7552b87348434a67a0c41f73972dc9c
+k = 0378578acdfa572b1de4e032158b28bcf00ab7dbaf07b0e772c39603216
+R = 0be2cb45d527a7685139290f1098de975b69957fff2c5c29059ce417950
+S = 06abf4afdcd2990121723b94ab8145d01cc4917cd70416620ef100c67bd
+
+[B-233,SHA-384]
+
+Msg = 05a5d3a3b79f4e51b722e513620c88092a9bb02408f5f52a32e782fd4923f4fd3094fc5536caf4b645d830260eba91b5173f3833dd65600fb9e246aec968b1f6ebdfddb4059fb2de7e636ed60bb7affdb74aefd158e54485d5f26be373cf944c6570daf8fd7e4b77fad57300667d6decf5c65db99ab8763bb4ecbb09fdf47e3a
+d = 05a387e7affc54a8fbb9157b5ebd400c98e2d7bd5c3e095538987d4f8d9
+Qx = 1a97224cafc063967b25cd1a43283daa5411f3eabe9386b8b14c9768c29
+Qy = 02cefaec5141bcb084cbc9aebf28fc59780897ad1424fd439eb43eb911e
+k = 0fb7ec3804654b9c3675f7b3c427f6d01f83872e96de2742e59c93151fd
+R = 0808d829d78e65eea47122c92f8c2cbf5a8d6717a057ef1659fb6f8cd3c
+S = 0ef338e09dac0b12fa6109d15924efb694a0b672afb4ef05f4e6f2f7b88
+
+Msg = 247a101c8196eb93a440280650ad463795690bc620e46e8118db6900a71eb493d03fbcf2f73a79bb47aa8e2d8c87ef70e4cfae36fae5c45fe247d8cd0f7d0718dad106526945014b4f3bec324897d8e1fa2f457b8a68e61873b7fa0350fde3b87b7b001c13953c2050a24f71fb77eb455053e49200ebcbba7299485c0f1a40db
+d = 0adae709a930d6f5a5c0e3d8ef4aab004d741d23f0ffb8287f7059890c0
+Qx = 1541eaf3dca942957c48d693d2eaf2a456646d2fb3eb8df1779b917a9b0
+Qy = 09737958276dc31852e57063119f1d2d061616b6a2fd35b4a1a3f046954
+k = 0390d5ed395f8ee3478c2765525c235587dbf5bb2316df3a1e8c664185b
+R = 0ebcc4f84bf2deb9b3d669158998fc96d7516580675e24348ca58d70d2c
+S = 0b99462b85e6ce6b46e5aca221250ac9de7ccf3e63b38919b61700be866
+
+Msg = a16678c71976a3ce3362ca379b3272b92e8ca7085b43752473db34e4d6b61eeed3875f49f3328366fc9d0644824e0104817de458e4c1036636b18b83dbaf063f2f99818959224906571c7b28873d9c702360888df151e9ad1a7003e6130033203acf8a69889be6ebd90816f2abf0764f10be68653b1e56766ecc3150bef8b042
+d = 035d391411e6d679751092c4ea5a079c591e77ebdcb57c1d9006ae70d90
+Qx = 01298e6f1612f90dbd2eedadfa8ecce22dff1da2d1cf057c41bd37d4b06
+Qy = 073136a1caf7dae2aaaac571a900135a51ef031643e9d5f01934333b864
+k = 09e343003670f61db85aedc0249db21953d232bc45488c3d6ceaa6072bb
+R = 04ac435e88f8e487b9b217e7d68fbba9bdea0b9685769878818f25e661c
+S = 074d8f4dd58c922d7e79f30950bd54c10c1cc52ae3b8d00b675c8e501a4
+
+Msg = bc2f080a7f0b69a6b142b8f3fb481a43bd71d07418df4f3b802568073c1a8d35729ad197f34a4e941a6dd511c63f201d1f6c34a1b66545bd5f43508c10bda1d6ef60ee5bdd25dde975e50c61f76cd36d50ee3bd8dfa2dff59524db9ef12f1e28d109b552cb42f021963f559c843476b5c889fc567b7840297c5a480e18c221dc
+d = 084e79093f1947d6ab9cf399782436e36ef87c59a4c090930c9a74ddb10
+Qx = 08e756774def210e2d6f76d6e4b0b43d86adca0880f017abfc911bafb5a
+Qy = 147e6a20c1aad897829339630c5edd327ef9a7e40795630504318cb71d6
+k = 0ce780ea99a344d67de7921feba6ae062817101068266d5d1a140d2b49e
+R = 0fb2474b854b8e5d6920ed90e69b5b386a1b26a947b1cf28a13f7c5d3ac
+S = 072722017a67ea6754873f833fc51318d41d6ef598d3ec2d3e0eb5bf41d
+
+Msg = ea71cede8b63ddc5648eb244184bae265cd65d50f77a9e25ff93f02b132487c08732544cb88936d4fff7c0fedb39685822dd1c9be1158f647c605c9bb5f6a1ae34722fa08882c14b36b6c93cab33c9a269c7c10f755b6453ed045ea3e56f29e95a9404ba189a0b48848120392b4dcac43148b706c3d9e4c03db410cbe5dca3da
+d = 079b6be015b8006f86fd81c2792bec6b42c08bee2d295cf9dc214c326ab
+Qx = 0e24338d5e33ad12d41eb623ad0905f64d5b75835fec4e693eebf9bba10
+Qy = 101b4297b5b62fcca7c61637a2a57365e911d3bc7eb0fc7adb0a9dc7bad
+k = 0f06b001e5f874d16632e3c8d49f13d70f48ed4eecaff9d3b741f9d02e6
+R = 0de16d8fd7bb1783a2cc4b9ac1563eff3f87e4e6d75e6a32a4aed1ecb02
+S = 040bdb1197ee8ee51e4ecccb8d42dd985913809c131aa9224049425a052
+
+Msg = 319b41d16e18059a1324c37161c937e882192cd949c420ce9c59208a0ac208ebb06f894a7fd78df2a3c5f23f25dee6595d3dacb25a699f115dd482ccd36fc54ba29dda279335424c86b07a1b1fa76a5411bcecaf4d37065b229cdce0bac75b666c6626ec37a716e9841be93c907f87453ad91d36846561f284421a89013b88c3
+d = 0ca9d751a060fde64336cdc88122819f4b3cd1b4e7df42d495197787894
+Qx = 09549785f4f9c71f20133f5a1d409b244df55445beec404cf8cd4d2cadb
+Qy = 1b246647d7570f052840d4cc01182d1dc3bf357b25e5966434e1c3c2a30
+k = 09e99fe741cb23f7eb039f5df8414d069b5c2e3c144dcd6cbc6da56ef43
+R = 0cf00f519c18e7a0fcc84c1e338158399f16929ad89842ba97a4afb5bf2
+S = 05854ee1a6aa5a6a74bec0b4696e80aa275210183c86f45dde7002d7ae3
+
+Msg = aebeee215e7b3d4c3b82db243a47506ffbf2263f6fe9de5b69286e8649d9218367c36ba95f55e48eebcbc99de3e652b0fecc4099714ee147d71b393de14a13e5044b1251e40c6791f533b310df9e70a746f4c68c604b41752eca9ce5ce67cdc574a742c694ada8f20b34d0eb467dce5566023f8533abfa9688d782646420c77b
+d = 01dde4b2d49338a10c8ebf475b3697e8480227b39bc04253a0055839e9e
+Qx = 0504bd3a97baf9852d6d46ef3db78ee7555db752120d020cd056b1b4e50
+Qy = 18dd305f6a15e91fa46d2a6d30f2ec8fbe2baec491e26d9a2ac81155c85
+k = 03b78d2772b8ce01a00ffe2e6be2f9e2ca2c89ea3b29bec6d6cf31afe33
+R = 0c0c51fba155f98900eaa2d2935acd615e917f9dd979dc8d92f1d6e00c9
+S = 08c8354f95e24ed13d8ff3755e1122dbb4117c76b21b3bdc7f4dd856f8d
+
+Msg = 8d353a6b6f35590baef59b638914d3e934d0145b045d221d846517ceddc8ff5e3d28826d3459f8ce1260f705e80923f39abc73d5949aa7aa8ad1734be0e992bff0c9a8f4cc9bdfa430d4cf52e29d3737b0cd3231b72b16e15e1a9040b832e4a920b4a1d94c4964ac6c8abb75bbbdb10825f882ae44c534c7154c446421a04d87
+d = 02c8bea2803fd746c874fa110a716538c179c82712f38d33d0f6d037e7a
+Qx = 0a034560353561cde19db89dbcad5c9dcb74e239efc604e86ff38a0577e
+Qy = 185e0b02c48be2e90c916a7c8ef2b41a57ea8d4f21d8cd3a0878a03875b
+k = 02e39f851c57643bd799c4f3b2fcc5eec8ff7f9e9e279efa647f969cc6a
+R = 09b2ad7efc7ed60d9cd3dedbd4159b1e05f05ce5ec2d2cdf7a0e0657482
+S = 03fcbd4ace6a140c8bfebe36ff30848966bb0d3eec323cc8ddda55faf00
+
+Msg = 847f134b90f10ba3636ec24f36a94111f26d58428fda5bba4501e58c7bb55809f52320cbe9e0df55af1e40bbac9f3eaa26a55d78b60621d4356d090d98363662f406367601eaa9eb9568b1a1b319730bad7bf6a7ddf1b45eb6922faf8d065c540b671c50df758ebf8c4aca6f01878e5e0012dd038c58833e2b13ebdb9a9f3fc3
+d = 0b9119b3b4b30cbfb98ddf0a4f6953417e515fcf0e5a94e83ebc1d1d14d
+Qx = 1be65d340f7e99067bbbf961c2b357e1fd47a74393cae5f93a40c5dc280
+Qy = 0c04cd8ca3ee253b99e44ee6bc0e52d2f016b16f59c738b9f2bd8c1b9d8
+k = 02c851ba0123ff0543808931ab3857b5c15d7c10c343f232913f6e0c92e
+R = 0ba2b33550878e223cacb80e45e382dae84e76bca5a2ef8371b84d08572
+S = 08c370f82506e97cc15837f59e9779448decbd87bde0a463bc14b18edca
+
+Msg = 99d23950493bdd931915e9f9b65e4cd1329866c0071a19d4f7d6fd190689275b7b10fc07503dd1c27a4da274dbeb3aa5cb0e71e9b7b03fc2697729b7be913756e6760098951d7015df181cf14b1e0b954e6260276af553e3e59907794b863e941950718ef154669c5c262946ba120892e0239e05910c2194f712db46e37e53b7
+d = 0f4ab2a573f3771d1e4222e251faf14e06cefed544e804c299c9a8395f5
+Qx = 0b1f973d6495d277e24320622b9b99fccef8eb5c1c6952f35b82d4479ef
+Qy = 161dceea4d3c9caa4f640f51b37fcbd5b8932642a94c8e7aaed5db17fdd
+k = 034ff28a5ed6958514c603b3af5a991e2e9b4cc2c0a7aa73ab2d70bd05d
+R = 01abe4a7b27395a37089f91eab27ccf29001ced1bb3348a6f919d466477
+S = 057449e55d3f2a4004d647ad6e8fbbd516adbb4de40b1a872ad8ecf67e2
+
+Msg = 7bef2487bc2bbbcbcc1570bbd4ed437c0dbcbbf63f666a3355aec49ea6ef593da25aefe9ae0d94db50692475425dee3c88cdea975794ac69142c25732f3541457d68d9101c8be069f2b515aadadea2019dc7abefa6c12cb3f76d9f4b5e46546f77eaf636aa8f2329130922111151a4df913d18b7cf9d0308f01ad84d878adde7
+d = 0f4649cf30d4a5269296a45977de2652cb06d3ca2aff4475bb24517b927
+Qx = 100ddcc8e09ba2122a6535c6a0a2dae83abf9e17687b5f6aae7ec6a2df1
+Qy = 048f5587360ee251925b7ed02de82307ba219a707705623727f98346a26
+k = 0a38b2bd0e9a5044db19d4312ec88d19ce1a9bf0eede8c357f898b0bc67
+R = 0d0ebabc8761ea215808a2c3035b14b614f64be0c2741b3d7789a8659ff
+S = 0f9e742bdca44c11bcab196f910c0d887e90f250817ee7027f6df8207a0
+
+Msg = 87c717eef6dd3c7434b2c91de05723783bef603d170f654b49a04b067b077c405d2d757ce780101b930196ca4261efcfbd3fc1ebb762cc0eecf101072988aca508c41581936526d3f337053000dcf77b16172492c5d654c6612bbd2523a6ad5966d7091697a29ce882fe331f79a7eb59e5a3fe536263083cc59b8133bfd33c1d
+d = 0cca24ad914c24c011f41f80d27ea41caf41fcc8dc9dc6dff5248b2b474
+Qx = 0175b73db13324a678b8afe086944a7ad257cd33fe9538c59b9177d1064
+Qy = 16a98ac9e0ff59de1ad94b50f8c709ccf4342f983c7530be64c3f1548fc
+k = 029c83def3a5c386b0bc3cf2663b8f4b02f26c6e3e14fcb17e9460087f3
+R = 061df783609ceb355aba3b1753d38f42434bd75c8354029966e7a788be0
+S = 01e8a093f53a1d73d5a994b97f2b2f210125ecd3dcdf77c68ea3199856c
+
+Msg = 9bf48c2aebf473b3a4a928b3b6a4d2fb7e9193c9e60bc2067f9f03083a8cc7b892bdbf05601118bcc34dd283e7be996bf19b0bd36727eb9d65276b6517bf0c77ae0a9091e7a9e46182a2586eb22324939801034e5ba94ba30d1bde7d8fed51eb71036fab6224f8ff30a008422efcff7ea239ff23b9f462777e62b41b396c5dc5
+d = 0f5e12d536ef327e3b0ba65ac5fc3f7f4880f5968f3340eb8868c1d47da
+Qx = 0b2910f5de9475486b3975ce91c02187e8803e68586f3a1df14df67648e
+Qy = 0f28af5363ed851c42daaa810afa1fd0d2e001da7764671fd44fb6737c5
+k = 02a018753965bdfda98512c7f9da3e9235a4a77aab9804437b652182347
+R = 0b6fd02b2d84b7baf1a5eb592cde667ed6d4c2c821ca336027a72d9abdf
+S = 02253faa5935885945121a374010b2257123cd5db4c54a2aa0e08c8197b
+
+Msg = 716d25519ae8f3717da269902be4a7566d6f62b68cd0faae94bce98c8a4ac6f66215ebac5407d6f64adf9d53f79f02e50921b6f0e8c805926a839443d30d9294eaa802faa7c5471d81fd1db148cdc621a8dd0c096e06fb0b71943337d5325e1bca77062684873fe904ed9012474ceae5b138e079f941a665a995026d13d7eed9
+d = 08c30d93536b8cb132277645021775d86c2ba8f199816c7539d560ac6de
+Qx = 0d69332763cf533d48e56065e1b5255790f8c0eb23471fac9b945e62195
+Qy = 0292df8c77d9a6803f60bf0722ed57ae2aa3bc816403b000fe2940e02dd
+k = 050967928d6089da5b16c88b7927de210325c8d8f5e727fa1ba3bd95b5e
+R = 02434697cb5c2ad95721943154bc81e2ae16332fa6629788f505bbc1522
+S = 09a5a6792b1b9c2e200ace5a3d50c04f69084dd9222c021ef5fce14d4b6
+
+Msg = 01e76755007b2ee5ac9e1d4c8adabad6d0f9c1c08ac6e2622b7c1ead89bd3ad0921b9525b49a780a262fe8fc0904a80391717ad7cac9607de55f7c744af8a132ec45ce79723f4a4a8c8b9ef658b360bd3890df164c9f1cd74eafb74feea251a34514ff2a57ae7a6d4bec2067cbf6ee4fdaabf13721bf9ae178b9034ac5e9665b
+d = 0fa3f15a506ccf7b50bbbad0a54d3223f5a95eb54f0d1f4e5d0cc21469b
+Qx = 0e797527d57fb3a18c71d1e82e7935e37e719439952d4b972f0c1e0c835
+Qy = 0a345bef4c5015e97a148b8991bed4b7ef48947b12f316b5621e94d49d5
+k = 075afdc12d4d50a7495f5a7d309696dca23e9356a0cab11c3b3d7b8c54d
+R = 0960ef460000fe8c761038bab7e29d665100494d0874b6556862c2808aa
+S = 08d3c004426dde6c18b1c9ae00a44ac947e36755d8c40eecf47bfa963fe
+
+[B-233,SHA-512]
+
+Msg = e95abeeb2c51a8cb75ab74253dbe130b5560cd52e2a63d501d26e1458aa568aca6694be91eee5fdfcf582c47c1c727084ee2b2c810281cf9b095808bf7e7c668eff00a6e48b06df3fe6a445e092c24d5687d7d89acc8063275caac186c441bc697b2f67aa71b03294e1adeb7e557c296dd91304ba0587cda3c984619f1eb4f2b
+d = 06400a4830889115aa88b860b3fb65905b01fd126c4aec2785518c2543a
+Qx = 1a2051662c1681bbbf6bccbd33c44c7c7fc80b81a1bce14caa36a73f7a8
+Qy = 11583d3ba8f22080488471d8103f868100a97af94809b58bff1435b16a9
+k = 0ceac6e5d10c55888b9ecab8d3f6ada7f4d0bde2f109699157d194efa42
+R = 0c148f2337008ccc3e61501dc5df3ec95d3596d97eae96a7ab085a915d8
+S = 036d1debebaaef50243005e25c791b9674cd6fa986dc3d32e089fbfb2ec
+
+Msg = bb8d8515365d240b2071daef0d80558fd3d0e059be9f6abb7b7a0a5f47e2ddca7d1b3b5101d5c583143258520ce8db0a87f877a395615c9bf879ef46f2f20f68bbc9706f82781fad69019396b27f292cdc70fff1772e90205a2225f80889f9daece1d03914d8776ac5bad24d8fb190ba10a2ca17768b918c2e079d83734eb372
+d = 0c7b73c324250f14fac0edc941f79bdbc6933ee8f64bf94b847bee5eef6
+Qx = 1af7266ee56bf0518f2875d4f4d9ec508a01769d9c1fd0a885a48bbd80c
+Qy = 084167ada99502475478465315bf8163870a9ec1b43f15d68f0304ab03c
+k = 03badc9b8098c3b4d7e943a2365093028b579519031a8643b50c0f81eec
+R = 07ad4fc96c21963395f56eb63e1b0b4d2c93d827626e7bd4448697ded97
+S = 0e7504e6a9f662472e3e6f18a40f7645922fad2ef7313d600a5a6ee314d
+
+Msg = cd8b2403435fac9caeffa21b55eaba52d7efee0f89df7142340cdffeb89556303ca01a800429397e2ff6c746743b6bc60a87133274282d4cac02e4ca90ad95d80c93b84163b96296f67d40b2a1124b2b6534ab6b60fdee312fbcdf468d0e84eb85fce4ff360136bb31ced3998d29cfaa3ae685e638ee272058f123c4f35f8b6b
+d = 03db7f28e161abf52ab0adc8c4c8544fc989af081303b8688f22b7b2eb7
+Qx = 0ab94312e53832265b929f3d529bec33dbcc5c17b969e0afbe2d559ec39
+Qy = 1d53b2c1be229e2c224e6e9fcb8bb0f044f3f9f5677c60bc9454f36eb06
+k = 034a8f980896284fe6d28b0b49703f1384d799e3f11a04b1e62da12965c
+R = 0e374fb355f30d7e427bc5db99ed76a914d6e286099c72f28c07302c741
+S = 08d5ffd41f8a1fd3de6c433635fddcfc2b21809d91496ac17571afbb856
+
+Msg = 4bb08eeb202564efb5bda40777d71f1bcc4c7c10b611e803e5c570876f3e319e9e2bc2d32031c56a32fc0d1fcf620d4e4377d881e9e1695bcdb78acba370b849115b86c1c4b83edfa03299da8e7fd14c7cadb81a8e4911c8e427e32c8c9b67e317575331967cf58085cff0c0d48ee0b8e7dc0b49687bb1c70c703a5dad08ec81
+d = 07e9d2fdd017d6da6029e88f78927d9ac9437f542db1f1fa99e32bfcf1a
+Qx = 18429bf08752aa470a8f0801170a7ab96adfb168ee8212d76ab0b994e46
+Qy = 072a5071ce308d7daefb3e8f4da4681842ffe0f35dd8b071f0775c83f82
+k = 0a0f330e011d34714875500b70c881ff6b1c9e96da930eef75ec78ac120
+R = 0439bcdb86d40e8f64db5dbead95d85d6a771d811480c5765ffcbf75422
+S = 06c01f64e2812d18b0946ea4e6599e8cfca0a2b606c3c35c803ef2cfed3
+
+Msg = 0bce683d835fe64e6484328aa13e18b0956f6887b5e4442fce36ff09aed015889794e79da8aa60b4be565c78685674c51e1e7ac60db6a763c777198a56e382a03aff8b40862f961ae23e8b8683b76a5577769422418972ab0049119382edde9e752b42e8b93f403c1ef8665d7ce8530ce4ed9ebf6d397827cba6b7645e177231
+d = 0c94052760fc74c2b405ee4dd5dd2a7d38ebc16df9cc32df706075450b5
+Qx = 1d2a5ee02d97f82ea9c8833b825cc57b0cb51d3f2a2cfa7577eba676eca
+Qy = 149c68d98d0e9cb242962326a26164f3e3cb6d81b51f281474b0f8d333b
+k = 0fdd3ade90da682676d40008cebeadb9b2378d8a821e9e9428018cdc768
+R = 0f6d244daea95002daff2ff6513da694eee58f8b6c2d47ad121be87559a
+S = 0b04788fbb5655a053d0fb7a38c39e1fef68ff17860442ec8b8ad049842
+
+Msg = a6defc770426daad4dafba3bbd2a69881334f7c31269b297e440926db54cdad3fd7ad200f5ada2b72ad221ad99a06ecac9c2563a8deed89f0d0896991d1a652f6fa282affefbdb1c1985652300d1792725071631d75a182b683a48448063c7d2563ec3d430e0fd3acea33a35cd38ec0b5b07af96af71d0bfcd879d9864ededf3
+d = 04076b93487c2da8aeaeb4725fb53b7b41b465315335c18c6ca041175b4
+Qx = 158755fd290910498f6c8eed83bcebcd1fcafef4878c860da118efa250c
+Qy = 1781fdae501c2c147eca2c6c809d9428fff2f853b57c7d6add70fcfaa0e
+k = 07debe933553ba3420aa06e1bc52a1653f8a19b59c0bc9c47212389442e
+R = 09e09c6d96e33c845535468ec7f5b79cf30123538011d0b5ffd935d168f
+S = 0963bbae921317666f5852759e9ebf05cd026a5d9f026942835ff0daeb2
+
+Msg = 7803cdf4758c199962b62943f475c6c31356f5d9b997a12e21146a2399cd0dd3b97a860b2ce639e2801571599136d4a8cdbfb12fd1a5ce22374991e090533ff42823a2c58d2076b772814eea7fd7a1fde68263ef912681c72c7aa3e5a7cc44ee8c65e72228b7631e600121ea35bfbbc783b6ae3c0c8f80198ada218be533760b
+d = 076ddd73ee4fc1f5e6766e229cc7236cdfce312417ea291f7c3328d5ab1
+Qx = 15185e029c0d4eb5102e0fe900ef3c921acc744feb44570a288015d0908
+Qy = 0ed56bf93394a434cd84b521040d40452bb39755da5e273a05e8c0ba792
+k = 084e9e4a9c84a602c18bbb6b183d06969c8b8538e2ff901f1c2794d5eb5
+R = 0fde8e9b1959477ddb3423661df1e7182e4b583849d6d17fafd7dc5406c
+S = 01a12bd30e9c8b74912c670c0845ff5ecc77f29797160bd4992efa61f4c
+
+Msg = e789461e1dad0b6e21abeb6ae2e96385549d1bae39415188c8f833233da6a3328144c97ddb36e0ff4d9e19d84f869e79e609c51b32de59892fb0446dd28cc164a3e53534c950d26f87fb74e682db2038cde778bde06c3ee2eca2a077d8fcc2b0332e352e0e7e6487444a8ad60e78ff213b16fda9faf374dc6d27b7a3c4c6d196
+d = 07e1f8988ad804aae7d09a99be19384cc599e7652c02c391542be74b17b
+Qx = 1fa4751e507740a7345e06a8964022fc6caa901cf0c2077a2c0fb86be8a
+Qy = 0683c593a0bcd123d958deb6b430d49d5a2386d44706f4149dc526ad896
+k = 01d288de55b90dbe72cd8f1f86a3ffbc2902f4b5f0cf4e641d32aec6f20
+R = 0048d16d87dbf4fb8e994dd874c10d5d16846b9ce2cbd43d09df62ca970
+S = 0e2ee47f422095d629c188df97e2839fc6239b9e2dc26baf8161b037236
+
+Msg = 9b58c145d1b6c887f2b25fb672cd49c3a1117224be697c15182d4048be92968a6500f8bcf747fcf33145c13a8d72e891a6e0c4c7310c2b62f3181bf586fe32f1ecf4feee8c2c8bf6c2bfdf9d5f88981ce080095c93e49a772d8e7b59f9cffccec3ca2f212ef4c6748f64e224f4f098334d83108bf6f8c7b43c5eb549f1526897
+d = 09b2292b0244c2aabe8b43d95039984d504ebe05eaff318760e4dee739f
+Qx = 12618d89f50b7f83ac470705dbe9ed81beb03929732a3f2aa7a636eaf59
+Qy = 15f0f70c808e053b112a8c32ee422aac2b926c5b6a279a787fddf819990
+k = 0fb38174a83ceb9236fec8ea39be2b3c77c3dd2cf42d140e27838202d08
+R = 084941856a387a56022727f81a939d77d12b01dab603ea0cdef6d9cd6c0
+S = 0bb9fc30595f94d664a590ed4f163e4526809819baf96bbee629ff86bd9
+
+Msg = 52310a901fe9681a23dd6e02f12974d57f2c4f653322d9a0ff8b338cc6c2bd9f4765c90c6b3c9fb17df3f492e67d204e39d81a8fdeb92c852a1dcc6151ed6c63049037235c6751c9a902748163a567b714725b4d3995e0edbde03215c645b1a1da3147f7406245432800c50f823a1f991c863427ff4c68e4e16d1b106ee40dd9
+d = 07ca463b50fdd92d9163f1c2bdfce2ee45ba1437b79162e3e959b814cab
+Qx = 08eeeb146216c73ccff0096e1100008f8b1f3f0c5754c0abc4ed39f7f63
+Qy = 18c9228b11888edd66b2e661284f583a0e8d3c3e922932cd9fc1568f959
+k = 0025291ec0dc2b0c709c5e69695980564552545c2497636b814aa049ccd
+R = 098dc98457ce6e69f77123d5d2460ff569786dd60fe07e847ed5bc14da9
+S = 0cd320afad2a4247fea5b74d78dc3df8967ab3159b4c8b191814d368dc2
+
+Msg = ff419c011601cfaf833067cf28dbe6e935ebeddf8b5111a97f6eebf3bb28376334f329cd877a134b074790a073db766efe018fce666a34650cbac285ae856fb6b3b8b96877282bc11cd9f9c8e510ed1f69bc2725a44a1d2b35de1edfd8bc9d20c7525ab0bbc27662a7cfc1bbd1e0f4fce5b88411521e3893e027cc8c73acdabd
+d = 0c3844750f63fe0c2e930bc38fe88522f4e72a2fd0db9778ade20e939b3
+Qx = 075acb00b5999f8b272a15a2cbdf8cb630dc3eeb1e78e58f58e467396f2
+Qy = 16711aca424ca335878d273eca75d804d3f009a1f3628568530ef265eaa
+k = 0a63e7a20d100f14b8b709f0a6c383166c2151a36dc471f061b0f20dac6
+R = 04063be9d8e4f0f9afe0c79374c69b36910b5d2b1010e0f4db2e4cd23da
+S = 06a6eb90659aa79e4a2360ea9ffb99a415175dac6c3efef104bef6fd57e
+
+Msg = 05a89c4824c5de66587875011e704bc6e06e991ba8f3aed331cfffe55aa266a08c729f77b8d082dca4d286b2d451ea838d726cc2cf298fddf2d7376714c5e37b64506f353917caec525a1209391449c078c5197a371feade74f8fc8a1a1d67576edfda13c14ad324342fc0b09277941dc072ec0d39434ff1cb91fc59478fcde7
+d = 0a3bea235dea86506be4476eb7999dcb8e584a34238c4a894ad6823b93f
+Qx = 14093a072c21c44d1c4beddc5c8dd9a2845db0935bbb4e1c4edb0aee032
+Qy = 13286ed584deb744c9c35d7ae7eb9cad1c7ba2b670642de0399b230716d
+k = 078eda19f0cced2f84c1a7b354e5a79bec035b8bb279473f32d60f5d17f
+R = 0964e817f0cdc251eede4157a9bd830c476627c3f27d2931b4f593b0178
+S = 08dbf34e597ae06ad92b13900a4944e54a5bf0f16f586baad157da6dc96
+
+Msg = 13e6b5241365d9d0ef9e8b05cabb3248afd221ec02eab92284b98bda3d9272184bfe5251d35705defba5085381430e99b33a3ab77d7870e5102757d065862372df2434a25556b76e54ebc39d4e6c3aba5cd6acf0c335756f7d9385c1068d4cfa37526a9a58c0ccc7f87a8189176c5d4f201499236058ec061357dcdb5acdba40
+d = 09a367cd1cffd8dfcca179e167ea437ee48e9b6f42559dda9224701d3f6
+Qx = 1052d751901f6f8e61858d3b15eb59dedd21e4e997531ef65622d575029
+Qy = 112737be67ec621509d73cd613d7b448035397fa66eb881f90a6d531ea4
+k = 0d8dd8f1cab623ba6a4e840962fb31de97a4d14aa6dd34dd21154105030
+R = 0a8276d0f069f34c60b26a55d47df69e4c9ae2981afc59e14b5bfcaa498
+S = 09351c4b3a06b839eb2e9f450d9c3d15efa45509886ea3f2610ee1dd156
+
+Msg = 139a1a5090b97afb8fecfff8745efacf7dcf91a4393a7b629564e598d58d5be39c05c5830d4c8ca85d29e9e2c31ad0447864e867d0ef4788ac734f8d871daebceda98d449308c2afbe97724c3af8a468f1925065f39e52ba4b7d15728a744b1252a20476dcfff7bcb82aa72c209e72abb3c24419bc26191390ffed340c1b9c6f
+d = 046f4ad2522e78b9b35297d28f361fb0ce82306322aedc119251d8241be
+Qx = 0b976c53a966e0834d5f6bc3af10a5f12cb6d16cb2303a3c6cee7d35f22
+Qy = 1a1097cb56662265f4f2f52df375d70af086264752477c34c6af522f1ec
+k = 06a0d21e5aadcb0c9e3f9fedd2d896b0236dc90e33778fb114e970122bc
+R = 068063fe0a31b7e7925cf8959c3486985d98f58224d5f67cd0218af192b
+S = 0f11a22ced98173040062ff9e69d1b2a1b5a939eda0a6944e96fc62fa4a
+
+Msg = 3315e5cda5f252e3291b61e493ab919c20a8af1286d9660cfa2f5ca38b6defe19ebecf820787fe692d04eae8a5f5d37abfb593309569cedf45efd0cecef6951b718924c8380ba52e8ab8c9bfb2261ed5f01cc5a5f9fc5fcdd269a0f122c597afdd9a836cf8f96838c3e8962c1788c3ce4128719b3ef4fc88569643dcad6da16f
+d = 0ac82137e9c7a5ecfb8b1a7df9ab50732934566a392a6c8915ee8ca8144
+Qx = 00f7f835f8223fa6c49eaf6650e33dc9d09e1d2bb098925d908606570b2
+Qy = 06e659ce8623767e8214b076d7588746bfdcbbed59b75bb19477366cc78
+k = 080655784e3e31c6a498a63d4d84f7e5a353a66641ca17d4e223441bb1d
+R = 07faf31d1d31ef4edac1c63072350536df84c417e0ef808c6be39617e74
+S = 089023aeb53ddd3e475d11c53479863739e62dd64348646581012784689
+
+
+[B-283,SHA-224]
+
+Msg = 067f27bbcecbad85277fa3629da11a24b2f19ba1e65a69d827fad430346c9d102e1b4452d04147c8133acc1e268490cd342a54065a1bd6470aabbad42fbddc54a9a76c68aceba397cb350327c5e6f5a6df0b5b5560f04700d536b384dd4b412e74fd1b8f782611e9426bf8ca77b2448d9a9f415bcfee30dda1ccb49737994f2d
+d = 299ff06e019b5f78a1aec39706b22213abb601bd62b9979bf9bc89fb702e724e3ada994
+Qx = 405030ce5c073702cffd2d273a3799a91ef916fcd35dfadcdcd7111c2315eba8ca4c5e3
+Qy = 75988c6602a132fa0541c5fda62617c65cfa17062a1c72b17c975199ca05ab72e5fe9c6
+k = 2af633ac1aee8993fc951712866d629b43ed4d568afa70287f971e8320fe17b69b34b5d
+R = 165ce308157f6ed7b5de4e2ffcaf5f7eff6cc2264f9234c61950ad7ac9e9d53b32f5b40
+S = 06e30c3406781f63d0fc5596331d476da0c038904a0aa181208052dc2ffbdb298568565
+
+Msg = 44adcb7e2462247b44c59608cbe228ada574ecb9f6f38baf30e42b589fb9b157bb0560e5a2aa5523b71cc0d7f583b502bec45d9b8352f29ee1842f42a17a5b16136feaa2efa4a0ae306402940ecd6b71e57d1467c98e7960de2a97f88b43487e4f4016af1292381d70c18c7e6eed99a14cdeb5b3caf73688658e4c5b54c81e08
+d = 09c2804f8cab768248fb3fff8a055b3f4585c00de5c1615a19f9425b9432ea09afba8f2
+Qx = 2570ff62b03a5124f08f752aa71ddc57944cd94197fd286d5a2a107b116d7b8ff1b0421
+Qy = 37714d9abe9aa0a9668fce89a3fcd5cf2e4548102a181a777c9b3f1008ac6e8d3a31a2f
+k = 0dab5ef658ae3e2ce2bc5c88a8b8022a0ca5eb8524815ffae414327e3afaea5fcb8a7cf
+R = 2d99f82d92c9554722bb793988af0fd0bea776c5608f5939db7c8634eeb24ffd381dbef
+S = 27ceb1d01ec9a3ec0e74d79e08024359e117488020de6458fbbcad28b173918fc7d129c
+
+Msg = cffee6252c7eb6d91d8fe100a1e62f0ad9f862d78ca2b747a6c17b8c9ea8980dc239b3b673310e6e7483582399163e39d889abc1a613fe77849ebc09b4f7f4fe0688b8a9869ae918a88294c7ee199be50ee9460db14725ae70b449d0cb48f30e7d817ec02c0cd586119341dba0b74f0279330807cfccc99c8c340b72c1764a45
+d = 2e625a6bc6d0ce7c06231de827068bdb0abc8ffb57c82b35ee3a0f873b9473905974d34
+Qx = 0458bf39974812a4e0964c31f40083300454104c0d65f22c5688bfff3c256b7ea958900
+Qy = 738dd33e32b9af93ade2dddf4147187a9270543afdfd66a0f2a53d6d3d815ef59795f60
+k = 0a9388815c528fdadcc5d3b125c7a38db57fa8c163ba795ee00e8e307bf760619e705c9
+R = 2481571400ecf9dd31dbd9c905fa1006cd5bc7afae759da3312ead8d5a7dd0c25a37ab9
+S = 13952fa427d348b6347b9e93d4cb2c4cae3429dbea6aafd1e58d5a34805098722b3b8da
+
+Msg = d058ab5dc07228253707ef224897ea0fcd09c3d5cc91fdce9e03c1c59c53fb4596be2ed929c7455e67ac7f4891aed3eb06ad88f2c4aaaabff045b959f900d1019d706b60526375851bb891494e99995928e4cd51c9616aa651ec77bd7e398916bb9ed3156391bf7fb1e29181e2b011dae2edaf803607def2ac6b194929a57f45
+d = 376ac24e1b86f8a55c052d92a0bdc6472fa03acdcdbccbf7c321ec0ccd97aa0a66b4181
+Qx = 7247c755b23bddf944e29348da82495b4f61d02a482c6111d8698cc77e8dda4c341f20b
+Qy = 0f8c199138e1f4f8344facd90ac62d55f3c9a15ba7a672ce40241aa26419af790cf7dd6
+k = 25d07c7afc5a335c2bd7863c1965a48c12f2687b2a365a7c2700b008ee8a0e8e35a68a1
+R = 23fc2837a879b79e470305088acf596eb0159edc2008478cc4c3841a1bd66fab34bbb5e
+S = 0a909b83bf77e74511063366ea1d1308a8a544864783459a60fb2669785ab1af8f4cb06
+
+Msg = c86f2cc7ab5df5cf1a236fd83792769474cef464032800ffe98a44cf29dbfb6f24088160eb31a11a382ff2a49f3e05e983462f5304272f96c0a002b69af3d233aebe867ee63fa46666760a6889d022c18645b491f8d71b6a3b6b4ef058e280cf625198715b64b025bf0449445d3dd7e1f27153926e617bd2c96638345431d1ed
+d = 2b50a6395fc02b9ac1841323de4520292f913519bc0d6a471aa28021322fc4dbcd7b802
+Qx = 696d5ac4bc40e679524e246210b7bb0f93ccfe7dc506ba87be3fd018f829c93e62ad1d8
+Qy = 65953e01d9db8fc5d64516d864a33aa14af023e601d69875ac0f7af92a1e78aff0e475d
+k = 0aa25b43329de4e7739fd9134e4f4b3d68a64e55af47a2f6ccf71f518f19059b68d34cc
+R = 1338a5dda5fa09667604a6a7666b0e54e6b688b98b31c25d037ddf55ee6bee7565dad09
+S = 00aec025232c16e778f90785ded5348f3d5345b8344b2a762480383777328e0a0b11cb3
+
+Msg = c1328d8d2e5b6ffc850a9600bd6482518ddd9cee3fc9140febb72bcd444b0cd7e8074587d51b62cce4b3d4f34ad3355353fabe363369cf790db2df9fdac3a0ec4757e2dfb3b683eaa3e26531691ce765742e1c0bdc0e1028d347b6085fc459df0989c6a144271454eaffe413cae2ad7c8b2371fd2df1afffe56df727009765a2
+d = 24e5889722f6c35e18ca47effa9e415b1ba790066a91fb3c9f7b001ce28fc732b09bc23
+Qx = 7d4a57e6aaec6b51dce5408f6a7fbe9ba9d55f5abe2da55fcf015ca25dd74eb61c1556c
+Qy = 2123390178b2992059151afb51ac652b364f562c65451eccc65d968e9e7210921c93c9c
+k = 320d2a7f48cf3583e8d7e712b330d40ddbe4b6c128be5a43d72bf57d4227603762de7f0
+R = 09806a8e70742c6c4a9ee6f77fe7a36489e1fe8c442ddf9cdcfa61f019ab9b41241d949
+S = 061fda247ba7c198aa532906bc01d509088d6c2ba0f14ca3ecc5ba36f3595db1df3e64c
+
+Msg = 7176b7013ea27e94281977eacb976bb31c753bf80fa09680a29128a6fc15234f79f0e9900aff3217ce9be72c378042c6c34fced0158740073d1a985fa25987fb218002e425868fda5a47de51abfd04de34e2b8634cebfbdc98e80f93d94096193eaa82dc8778fc23f3765c7acdad94fdaa272df0ff0f28190c10a462ee78ac92
+d = 056d15b81f40b6378588a5efe43e21b95e18120d514bfdda0e7759a1d0766a8a35ce5ac
+Qx = 306cb78fa576bdd2f43cf7b71d7e66a98b850d87ac087dd2e1ff62596a2e8d4cfff1344
+Qy = 3b1e3b12db842e00c2faef04d3e39cdb71546e4e3ecf21eacb6131c3501fa30edcc0b70
+k = 1e8969d6cad41a40d8306d2a8db3290d547106eb59f661e0d0eeb163044a92aee4483fc
+R = 06786637c3bd5a95eba5ce015f151d99845255175ebb9e593d912c75cc45723612c4ed5
+S = 384471c17c45ddcf62b588993835bb913be88f7a8e46e52e211972ffb3b7768410bcb7a
+
+Msg = 4c3642ba040a9955b9d50dcd1c936688c17c363854358afa8ca49c6abd906dfdc4d89bb4cab0bbc363fb5b74e1f004d4b09ec9dfeed4c0bfb482a9061a1f487a3d79195ff7b65a0504bced3a28db0ebe8fcf8ab1ee4a3ae91324d15d890ac4c479144dd5538d2e36d3a587769ee9cd2d5c6f85a03362a022fe0efc4a3902b71a
+d = 12fb2fb5bf5f7e42a500154823a174ba2d05af71e3b0cf47fab46e673ea1822f1563def
+Qx = 2414d172d74a6281169835d18bfaae91f1f1cdfa9ed451884466e63160ecdd4a2c7906f
+Qy = 2d892bb19b47a4fd9d851d3b101ba99acf6d11345596635cedd5d7557427a2896a913c9
+k = 20786f42d77195bea5761f86dbed8b452f858b447d2f3775ba2a4865d738122363b50e3
+R = 334507412368f08bd0992a5d56581ea7139e8adc88abe4bd80dfeefdc7a37a481b18609
+S = 0fd8404df06a02618cdbf6c28610d5dfac9907635d9e5f2887f11a7f18cb8b7ac95b5d5
+
+Msg = e471f39c18b081362adc7da47dec254dab8d765f005ac574640d78c14222639245563912d942f3be212ee3cef134407334c8fe3602fa0e1629de5331643d76715dc1b0ffcebd484d86c5211be4b285a31688b205fa988e6c15b36daf396ccdcc209c7dde2a732f5c31c84c7ea041408ebf15e56632583af0131bd7f531b5fc45
+d = 30096c54fd480647e017f8cdbbdef292e799f054e3279d228b09816a757566a744a8266
+Qx = 2d4b28fec18cd888017fd5a27a375131bec3aa7195c0a4f255eeb3616437079e356a6cc
+Qy = 27c607dcf0b068418eaa7de8da6f9707650e8d95aec571f7ec794415fc175061b451519
+k = 36880905a376faa594978713c2de1a90c8e27baee65bc60b1fa6508fab5abf843f66ecf
+R = 295193f1c64181bdf749987bbc8ff2a188126131f8f932bb8ca952ffa201f109762e18a
+S = 381c496b4035bba880225dcfe74fcf101103e38f9518d9427c74a5ec86ebf8f7183694e
+
+Msg = 8a93fe53e83075c4025228540af7e96a588520da34e3eadeb99a4ab2f3dbbb8f85fe63a3b86c1f4ec912e665ca05b43e869985eae3791b91205afb1380e16c25b74e6793fa63e4a55dcf25dc22d03f09deddeb9042b620434111afe08c5657c7d754af66ad91a1b5423301b1e8e6389a1404060d1b6a99fe0f89598482979e42
+d = 0a1b7e9c8c2dc25b494b5ef3195b294e41cd3c2c35235ab42542bd3e2a52d5826662bf9
+Qx = 6232063dbb66a56e2a92dbdfd9b3c136eade9c214d831691d9b49c56a3962d20f14b8a9
+Qy = 1b47b85bc223fde1918abf6308b74dff7f3e686af9c9d7a1855a1b77984d258c1f9aeda
+k = 29b4221eebe151fe758218138535d81182c991c3b7fed93f9a6117e98c1c2f97e546937
+R = 1f8040fad671e2f32a1094413ee955ea5426bc906b8e034d87d7408e63db173b05afbfa
+S = 22a353c431a9e9315ff69facfa4e15f6e6ee1be2750472823db31b49b17fc759e6b94db
+
+Msg = e193a8ef6f454ca1aed38bb67aca6d08280d421b196d89938c0582b7cde74dafd71716f3818940af412d4a7ff3960a8517aee108ae03576b68ee7557d35e6f1ab823d124de7243dd02b542591f62c80d822608572889573e4c9dc62f99d68e07800da6f83cb6f5e03d1f2ac15f90e38b4f25e0a75e354e4b60cc81c0bbe81d39
+d = 059b1a8fb84530bba7a607ee88310e31bc6ea6a6881603567a1081a05a3a9ff87e719ef
+Qx = 0b9a71aa3cb4cff37586b1e522b0e332ad5962eec3dfeffcef3851976baadf611ae5226
+Qy = 6b1bf0b43b406b5edc6782fd391d9fb070fa3570d3cd5b2b66d7a95dbc45ccb1626172c
+k = 00a77307da9845ec4572a24c9e74a17b76b6393da87a9d7b1b8456235473ff39d243ec7
+R = 36721835be490b5ffc4a42bee3c6d231417f7038c367efd9ecaf7fb3618ae8492906de0
+S = 237833bcc3e4a721e2079e579d1aaf2519c01cc238056fe0c0990dac7fe50e75eaf6f96
+
+Msg = 8a99b9db191f6cabc88b430bc2293e6774d5180f019d871839289e25aec29379f14606e742190b7aa062e3b29fe0254146d9614856c5140c7315015abb98ac00da2c7e33cbcc82c24b797366f12767322c4381454d9d1eeaedb616b0ea5c66d1422da459f18081f4f966d05ce279c6ee69b1bf94b8388d38d4b770d9ed69025f
+d = 30ddc2c7a4ce300cc2b75f0f977033f16c1f8bb13aae3d494c381f9a6dc8622499ae4df
+Qx = 47bdfd7c77ae0c53e327c15c30d90ab1c9b670fe2241dc0ffa939fec3cf6d3c1f493f3a
+Qy = 6a286aa2310a4d0468b62f3144a9da2e66d15bf86f60045824278e8986ff87a27611920
+k = 38afc3d11c66eba3441a5ea298fa593eec57b84ea29973c306ac9d46bb8d8e2f4c8b049
+R = 06c830f6c0be99fea4712f1c75f5a4e439800dcf062a16d93135c3255d3cd04bef5bc7b
+S = 1eddfda0d0e02d382ae243e604f76939dc21f3ce106243b2d20aa562b78e620fb456428
+
+Msg = 5c437b331831530aa94623b1736f00b986172699f0a02a5e5df0008bf25341787e2e66046f2c929dfe0058c3cb89fc5bebbe1025bb1edd1ee31522ed568e7b5b4ca3991afdc76a68cbc2c4f81863e27fdaf6a564fab2c6354e5c657de81390f8a4132669fd24a48580c716b5b7961a9c091f614d11cf45dfdaec8946a54a11d8
+d = 07899928922fbfdb5407517725edf231d15a8b62d90b7fb6d8c8d20424850dc44f797ed
+Qx = 614257f54514cf37df2cd78850658a85ee362764ab8186423aa0f9a1ff486557f8f167f
+Qy = 3ceae9d1370df045d20f576931ca63bdba8885f463d5c82e5edca5116ed3d2c2b0c4861
+k = 3395493478e69e6e1088166f622a4f9ec7feb998aa552b54bcf0fc67c06079f45a14993
+R = 3f31ad171dd59c9deb21851e631f223584b17f72a6807d5239ae31373512def954d5ebe
+S = 28f095ae43ba5bdd899573ce6823eccd8e127c6c03cb59dff43c087ca24e1ce5504d1ed
+
+Msg = 91aa08567d8da4c90684dc06068f69deae240212842ff1786f04ec41b40d9187aa92c76401f9fcedced62876a34df82ad7c1e63b68bb2a972257ea8542bda6a7f1a020c9b122943b6d651abda8b8d322a8fb762eee376daa2d3637a71ed6c4f5cf96f61c0da2d6e1dda3370d80e51da2cbd8aef3267168c67359523faf910dfb
+d = 2a2af63d1171930758bd3e5bfdac62cca1a83a3b55a49b3f80cf0d9ee4b2082757beac0
+Qx = 7dd6fd0868ec478e7e5c08965fa4f1efe8db4d0c04f0b6c63b5dfa397607a0d9d5ce909
+Qy = 54ff4fba9058179a2c61951fb4955cb637b01267f8f08b3aad614738c562f602d498f04
+k = 179482dddd033e8849abfd4991304137044d7433d7bf858a794340ea1cd66e736b821fb
+R = 071f4cb000ca1c51c698c867a78961e6d7defbd60109f79d1d165ed045a653ddebabd10
+S = 1e2975f4a1fce0b3b0e13c3f50005fa664ee9319cf774d2e107c406d36158bcecb0e5bc
+
+Msg = eb5297bf408c1a55e400a20a3c10acbc5c2bc6d6ccfcc0941fb7a6fd4d2834415a6df86c3a6c4b867d1215aeb8222153da8cbbb1576c92c07ca2c36d8f243fd911f9a057e39ee25832454e28d7ed52a8d04169b9b9677a16b32d5d211b8573a8986e9bf36d7206417ad2771daa11bc21fd7ee1029b65ff7c9b2705a6dc9cf9cb
+d = 35994e89e13916ad82608f74a639e6aceb756ff913aec440519946d6434af9a60a6af49
+Qx = 1f7805dfc9f90d4f8a1b241dc9d68aa41cb77b63d530cb3733cede23bb87ee5118e5bbe
+Qy = 1c3f1aa3a1218de78a94ee8f88d3f787fdc68674e31792d919dbca681a6db1dabe89b61
+k = 2116684a4307c67a3d8c1014b33b928a962a8daf86c4031b0c1d47315d74bad7dab2aad
+R = 33cab952e9382dc074d666f1f2ab2bd72ba394a404ce2fd02a6f7a4dc096d713827c94b
+S = 33b2886738d882146c0cd715701fe4e8b94b0d28c73a6b79d2899391119ba910bcbe3be
+
+[B-283,SHA-256]
+
+Msg = f415d0adcd533dd8318b94560f86732c262ad2c6dff9dc83e2435543f429a2158cd2fbab0d96c027f71008c4895ecc644c2ceaefa80937f6cc6338d15d36e459a16bd9387a361a6d800acfd834ad5aecf442e30b70f5bfa164747cf9f89325b80976052a83a5e896c00c54f81472b14329cf23bec10a8e693005de2a506ba83d
+d = 29639da33f48e4fb0d9efdf50bba550e739f0d2476385cba09d926e789191b6fb0a73ff
+Qx = 770f9693777e261db9c700eb1af0b9e9d837ce5eabd8ed7864580bfb7672ced8ffca598
+Qy = 68aef01c8126889204aaca8f3ccb089596f85e2aca773634bc5775ee4d27c77f2af83e7
+k = 32a930fdb1ba2338554a252d1bf7f0169d18750a4ec4878d2968c5e735f98b9d0c25edb
+R = 30cd65f1097d3fa0d05e1d6072675f1377a883b683c54b8a1f4960f90d68f3ee8c7bd98
+S = 15c61ddf43386a2b8cf557760200ac06a480797e21c92e45e6a311e1a508b03c4d9632e
+
+Msg = b178d86c9335b85e02178fc4551769db589ab91d823fac219c7e14e2f029753b203962389476723832f8d9631dd7764e6dd35da290afa42a794476f5c7727b3688aced848dabc9954201578cc7b25801710931f45cba1199d3788d64dc0188412e70723fb25b8ecb6718358150c4037b5b81466dac1686cb5270bb1c72d34bb1
+d = 0583a7ecbf2a975a32d07428d27ac82e5dc13d1466c4fdfc1e6a05a8d9a289f1010617d
+Qx = 3775ec793ee4bff15027c70d9bb5dedfb7d2e41af8895faddddd4589cc5a00bd222b3bb
+Qy = 300f7cd572d82f2f0a2d99a83977ed2034e03fdd76a0267455a524bd8199424ae5b81ca
+k = 1e58b1f66c927f4ae16143856d67193d889debdac8eb03936f1b36d550c2f2639e13f8f
+R = 0f897dbc8ea12f4370fcd08e8700e5e4c68dff97495f401d01b782f2ebbe259bc0dcf25
+S = 3c32424fdcca39f411663284658b8f0c1f950f0cea4354f02f4b359f18e3fefac0976e1
+
+Msg = c8bfe9fa7c848531aa2762d48c153cd091100858aa0d79f994fd0e31b495ec662209a9c8761cd1d40c3d8c4262cf4dc83c4a2549a5cd477726ab6268b4b94a78b1c4a7e700812872d7f41912a723dd9abc305420ea1e1fb1fee41bf643f3a24abd6e8fbf6fde2475e290527724a6f99fd75374bf7cb01b34d3e60d8db33c4de1
+d = 0f817ab1b49131fb9bbe8c112c25a36f064efa85de7506fb9cd29d81b326bf276277f7f
+Qx = 2b3a06e07fce1848494d3227ff77d1c43f4ec3c037ad73ffebfebeeae87d3bff7f7e59a
+Qy = 75df52e6a34229266ff28b1c217538ae23b3912e4bae8de5cad9b57b7c1c9ca8aabb2e8
+k = 0ac57fbb899193b88fbf4ff2c502af72943b133e8d40459a833275212f6644f566f5c58
+R = 3e13307d5fc2b7ad24e9422355150578c78e1c99a6f9a24f9ca2e8bc6856936c5c4af2d
+S = 05e8b77b580cdacc2660e6f8a1877d93c5983d135d63ca0e0b06aa8daedf855c9f661fa
+
+Msg = 9a5f563d0f9fd1f31f3a822de628ae970954f4e71292492d727109036491c29e66b9b0f2c90c26abe94c08502f5e923a9ddaf6a7d91e9541ce90d0a49f03ce4e4769753d5b7d922e1ceaac4b4cfa4262732a09550aa076b8ff9d46a50fa17de17e3b6bd606698464d116fcd5f1ae11bf45b0c48d3b738427cb47b0d1272b03cc
+d = 2782af76ffebf3e2bfc0576b70e4f4bb87c762e2bb230d278ce776310a14f5b678f29af
+Qx = 00dc21b3be7efaba5c7f9f22591327f0f97083d4d844415d3148d227931256d026ec9d4
+Qy = 1276f1d9e131f13bb129a1192fa24602fb508c9679ad2124e49c70a891777cd601955fe
+k = 0255972b5329863f380de945574793beb0430dc416a8f2543330a125ce8d69f72dbdddf
+R = 25bcb54e188aef6e362a62fd88daaacc8e697dceadc8a6b6f804ce4a36856c8da6de97b
+S = 1e12e18e1e281606c16ed1f49804f8cfb33c29b0ae92c072d5c41ee3e6836cf1813d722
+
+Msg = 3d6b065721da9de82cb33ec2c27107eb399b1e69ac8fa51145ed4147e20d72e27434104e76af988a3bc94f55e36677a05182fe2376dbe38195fc6a30673a4dca87336c7304f3f31d49216fbdfea00fd1e105d8b0c13ab11f8892e0045e915c17dfaab07b24ed21b06af5a8cad4f45fbee5a25bb6e87466a7bc422c0bb896440b
+d = 31b827b88f14d3822244809096157df3c0aa99da90c00cd9f0b18dfe306f6881834e6b6
+Qx = 7b3ed076a2901ab2625bf05fa6db10a8c156412fd2d26741738f5eeb6a9189157526946
+Qy = 6a8cc2061352c36f264d23dc2857fbe02af34397ae5130c582e885f50f2c112f141c07f
+k = 0b36f5d6da409c4a27f38ff9686cbf5f4714f4e17234fbee6e6deec97c9f0d4c585d42d
+R = 356911114c9ff9ae4f3a4fcc5379c987b9d298554cdd39ce124f04707e7fd1ea25231e9
+S = 13c0a321c4c5a1e89dacddae38a9b3dda32a20627e53dcdf28ee26a550797c255eefe6c
+
+Msg = d125f0e2e6135567adec9e77da2afc6862e28d618416632ced829d14ee8b61116da59dfb44098a40a0b927731125617e3d2f32cfbd1546a6e758c1ab6597e75db07add52ecb61d37da2e9ed04df95b36ac249f4cbd794cb561655cbbe4b34834c497b3d392d78ed0db8db683aff0076fb6e43acba3fa2b91210cc6cf3fa594b0
+d = 27da4916f1c471cff80bfa14d12aa10270fc3b26caed010c0111f6e5a40d914a3927763
+Qx = 7d8202c88fb915446c521884fb756375a2b8d178f6a87306c1c8b67b926e830c8285c15
+Qy = 224dcebb8a7c46902532870ff855c780b2884dbce2956cd34dd6ffef8dc365b96753449
+k = 3fcb1e759418e4539f9be76354cc1914ccf9a111338890eef723431925fa132ebad8695
+R = 0d4d4f23408db58a72495aaec6dc335ce85309fedccb6ade053c23347abdc9e77a81aa1
+S = 129b6b322573dcc79704d08921cb54f31c571573da78cb09d0aab40c4036ee8f195d88a
+
+Msg = b380f97687ba24d617a42df1b14e5506edc4b62dfec35ed9fd886bb769832cec7f9adae10c21b7cd9152588797b4efc6b2b30a873d3f25e683ea9be070dd69731949a51121e534fabfa3a2eae0ee90a454182248bedf2595cd47ad08614177d58f7a773f5023b538f5f568682c83fb60e3fb1aa859948d01bf7b214e7f2dc719
+d = 10608eb51dc0ee97d6e488a23c582ecf0ea1df9a24db77094d87b3fb6ca98507280a934
+Qx = 399b3e571caecdfa1efb243323159a45618702600b870954cd614e494bccd70e381f68a
+Qy = 2e2fc57721a500611badf48fb435a6e399cea356d281e853f55ef2cf9fc5f70dc8b3da2
+k = 0a8045b4f55115dedd8d742545f9f2bd6e5ab81cdbd318747aebfe9f74b0cbc964b6040
+R = 2d022631bb7e05d316a1b130faaca5af5eac67dd25ad609e6e2a067ff74fd4ba534db2b
+S = 04595f184068433962d250394680701fbd2e2bd613a47e5de68fa1eb83cb08fb425571f
+
+Msg = 3f9ec57e4228e1a6ec49df02c58d756515305e48763ba1dc67298be9a1548576c28c82b4e9b3f62357d9b3c522b16d5c496a39effbdc8290edd2cadc0019e6b9fae1e61238b13b6265ad2ff413a5a0684babdb0013e7632051455e6fd943815213c555dba96cba8911e006bfddec6c3353065004538f37e48df9e339498d85c6
+d = 123f9eb8babed548df08cc3afc1d3b3bbed52b538d4654f2088fe76062fbea75b85a560
+Qx = 3b2e980ae7a847394720a9cb982fc1e41f9381b0f2e08b87fdff1bf891b9637cb22485e
+Qy = 4a367d593edfaa4e17113b6b1ea3ad185b3155b1bcbd9f00f4482e509b43bf7eb67a448
+k = 2adaba166d703d4d2d431a26200acea7fb47216fd04882f91c5730a55c349770d58a452
+R = 2c83e6a7b4fd48e1ba4fda8ed7891425213764078926d8862d0eb64765ee2900b3deccd
+S = 3561a949d583b7de9263d07ac427bc175b75dc52f43f3ebedf996218c94e51684ed5f9f
+
+Msg = bdbd7b7bf3337bd9d21a3c6db379f95408c17e49dd394e94737ceae889f45dc0ff5d48cadc53703a16b5589939506b548f8dfd34c577c084f372166cbea320c8fd07c809b211e0749ea639e68f890affa1569b66bd763c7c710989e491011371eb1d93ed9479ff0216b7f79c901a2023e2cf80b565d1c0517e73117190cd2f02
+d = 06a18e626452111922e02e31d662f4301319946a204ae8a34f06b91dd1b5b96456365e3
+Qx = 77c1fbe6a645b85fa0316ae412e8dc558c7c066d9aba900650749eb7b14a149ee57a259
+Qy = 1b2f3002ff4936653412c8ccb8a67dcae18d78dcf6dcaaa75061013d2134af2c3fa0e69
+k = 21bf4ca10d03a93d4675baa26285aaa554836bd0bab6e7fe42600ffe9137d5e304847e1
+R = 20702aa5b5cb45cbe8025b4ddda0a42a1ab746117d45382d018b2055b62791ad91abf54
+S = 12c31f9bdc096236d3ec46c4e6cdbcea47e4fba0e28d4df0fbc19e8740ce6dc0577b242
+
+Msg = 436b288512ea57bc24f84fdd117da9dc1858bae8c11637f99295d88fa9d05e3c053a2584a6fe200ad190b3077d9a1608f660349dda405066c1562f6897ef69b6b674d6bc11fa470d0b96a7cf8f6e098c9ac03b0ef415aa045867ac7c11d16cee78ecf08850ccabf70f761682b561d0d0e4a889d840dc74932648ca2fb58259f7
+d = 3307fd717015b12a2dc76ada21442ac1d97519f66898b214c2ea317ab0f0905e819e4e9
+Qx = 4ff9b8d60ed177df635a3953c0f5f5c0254224bc48d34329136706d6e8fa1b16ba0916a
+Qy = 2e50ef73f43ea9a5ad07c6bd68a82b7239534e195ee929aae7788c073dbe9e968c2828b
+k = 14d8339f610b348f4639ac20dfe2b525517218f0c71b1908d407603b25f19971a1b5b4d
+R = 2acf3dc4e3569e5038fe97920de626ddb36bf213afa0f939785dec8319eb8321234c574
+S = 01db40fa416527266a3949211fd9fec158412c447c392ed6a7c7f159a1129da864d33be
+
+Msg = 672faa156dc188bf16bf8933d65e091c633f294486049ce96a4a403dca28a149f4f840e8bef47412285363e9e89006614b013a41baad9885f1d9980cc897ffbd5f8a7d0e63feaeb42c07776efb307ed680ba1cebf470dd9bd8a2a9efc2b1daa569524394f9a50398add1a5bd2f7c263f9e63c2d49461acf98444fd23341ce78d
+d = 14f9f412e3c7d770626e800d43cfcbba3ae6aec8563af748e8a97b67d244334b6e6d2b3
+Qx = 2293b37c84e7514564635e517bbdb9bda0b4a41217ca64c38e94a4bd00753255b4cc389
+Qy = 088c10bd909964ecfe10c373214544c6f60ab85b8f5545afb0fd2ac03d036db7ea9e67a
+k = 19b21a4d73012dd2a2ec3ee280a9b855b89e6ad53438431cdb5d2cec0e5ba21300e9bd6
+R = 3baaac69d182bf1a12a024dbc9a52ba244a654716e2756c36ddf8ca634129cf9d2b23b2
+S = 13ed92730d0a6d75f2a4a56b39f82d063e1be988dc58f0ba5f553fa88b6510116005727
+
+Msg = 4321334cc8ee44f1cb392a4b280a95561809dd3639ddf43b6e11cb73067597988d95b8643d86c76c3c6b932d9262b9b8b55a04fba0666dd8b8ff1e8fdf799ae3945b6e30d3af3966f1a6d634d5e012710d66cb447fc3375130968a2e1e647780aada2609d87247c90338dd71c3bcc3902311caba27d5d4ea4d73ccea960d4bfa
+d = 3091a6a8bdac1e43542dce752694972e734dca31c061c7d1000754296d0748055db3f09
+Qx = 5c0761d01020a30c478617313c67008a1332a0e6f295c5a9f01b3411eef585a9dafc693
+Qy = 0eadfc6f7bb9986b0dd221b77b54287042ae8d1ae5788706b79a354fe785c66145bfe81
+k = 0afb2e2e29b26a686368b127e38c2f5726fd55a13e9f87cf00e831d3fe19d9511d07e81
+R = 2685f634a8c16ee79acf62b7a1fb3acaec0db47c6ff5f2c97a804e9550494b128b2287b
+S = 12b545bd76b8d2cdfc5452291d5e4748a5e981c400daeb65c20812a65bbe936bc613219
+
+Msg = 2087e22094570d39fa937f15a3ef0601709a66666344186a33b487d041793fbb9709a95af250b1df0762ea98e911aeb3ff1fa19f0aca53fd4179e454e0e91636e55cc5b17cad9e1575c82ad265dc34c4a66b7a31ecb9ef9dc756f2ac1d9dab35369a6bad4a0f47e629daab91addc6d297d1e5d81477b3966d8c3b607ed194d88
+d = 1195921b91353db9bcd00510efffe009c94f6bd8d790f5fb3e5a0101c9ca5d21c6ef2eb
+Qx = 5dd8aa95e24c054d508bc5081546677b9a8e8dad40d3f8a184af7cf07cdb09ffa2e0498
+Qy = 5032f208dc3bbad6aaab63211e13e17656c750c6c2a6e3caaf55a7c30ae5ba241d8641b
+k = 3223c6439db7255e89c28aeb046e906ba79f4e9b8222ba5ec201b964d3666301f74967b
+R = 0fb7e194dae6420ac447e7d4f882da3c4859f53a948833a0a08f918acbe03c2e915d1eb
+S = 2336f1206b46b3166b28918bdc1c817b22ab16b355030cfd635ab3dade20d2dbde08b6a
+
+Msg = 15c7bca449a73b03bbfa783f5a91ca0b7916889a5d99d541e2e8593c3b176a5b634ba20b34407fbd94ae1c1398f5313cab7402f3bcd7ad277a8c66d09a6df5dd086b20a0a3823fbbb80980cd86bd13e527eee15656cc977103e80113539e26695addd9eef6a1f56986168d9a53f8b5de833f8962c3826cca106ae9e8c00208d2
+d = 29dc20446e9abacb43823e12a83737b46e6e577466b5a3925e0f9d496824dadb4d4b50c
+Qx = 4b3c1d41d8172ba15fc92d9586f29716821ea82274ac8e4fb3452ccca3e34925f1e736c
+Qy = 23e22cec962d759bc659841f259de954911aa289e9994bd76a30149a73711bc41b29904
+k = 0931ef56f08c379d1ddce0649f45ec21eccf3dcfa178616f45b200a06f82172b91bffe1
+R = 178348d533217543af694c8d3cee8177e22740b657bc6ce6df9e57f0c1f14fc9407c440
+S = 3eb25dc4ed42495b54679653ab1cd4d61c854207994a7318026afdfd44c89cda9247388
+
+Msg = d12fbb82ee7a57eaf76b63fd6bc6c0a65c85f135f019d43ff7bc295cad15d53729d904fed63d69d3ffe8b82c0ebaf0399e2717ece40e011f710b5db46aa457c23b85545953398b814816a1e7a8ab5b0b14c4a0451b0bda9d0d2ec4a374bcaae208b7fe8056bfa17d6b7ffd4ba2e9179f49b9cd781b0c06f6ce3eec26cd428cb6
+d = 3b9b77d19a42e9a555da8ab70aa5638890b2ed21daefa28ca6323fc658662dabcbfaf52
+Qx = 632fdf8ebbb755c960ebf8fa5d6b679416e488faeeb021c0782352279a7ae00eed33094
+Qy = 41aa517eff6854ba04e2de6794848823e53ca580353f2b25e45fd4efd3a369cf80fbe57
+k = 2450beeca6f1ebac3e82e3aa3239a5031f54ffe65fa6a45e2bf2ccbda448a2cf6988141
+R = 28664212774e23b6513f73a9b2da97f5eeafd10efe742e314f6913a6d0c0e3e581cc6cb
+S = 025bc733edffbc1330689e7aee0dc121b64a72dff19e1d7c5990206d6daae5bae75d0b9
+
+[B-283,SHA-384]
+
+Msg = eab0a37915c6b43b0d1e3ef92e6317b3afc8b8301b22f6059da8271fc5fe0e419ca6097daba213915855631af64e10d8382d70599d903d1535e25cbf74da3a12ba2f13c33a8562e0db03edce791f1d39af8850fd1feff0eb25f9ad0a86dfab627b96e65831bffc5f6d9693d20493bc9dd6eb3e9325dea50b055768e8aa30d49c
+d = 0b9f8f3e89e9c1ef835390612bfe26d714e878c1c864f0a50190e5d2281081c5083923b
+Qx = 542ea231974c079be966cf320073b0c045a2181698ae0d36a90f206ce37fa10fb905186
+Qy = 7e6eccfe1303e218b26a9f008b8b7d0c755b3c6e0892a5f572cdc16897dcf18433f9a10
+k = 31789e96e2ae53de7a7dbc3e46e9252015306d88af6bd62508554f89bb390a78fdbaf6b
+R = 0fba3bd1953a9c4cf7ce37b0cd32c0f4da0396c9f347ee2dba18d636f5c3ab058907e3e
+S = 15d1c9f7302731f8fcdc363ed2285be492cc03dd642335139ba71fbf962991bc7e45369
+
+Msg = fdb93afd5dd1e3eaf72c7ea9a6cddb07fc2054499ffe152cb2870163eee71ace5bd420b898cb4fa80ea53fbbaece2a1eef6427b632320e9c97e38acb16b62fdbf6585b54fabf0a703307ca50f86387bed1815a05b0c8991e0743d10cdf49c8facfd7ddeb8d4a7b706b5a29e1d00ac88b0ee88b3153185495ac8388cc70104154
+d = 3a30a1c15b9ed71e102341f97c223a9b5ea3e6a335861c3cf407ef691a18cc639dbe74c
+Qx = 40937b263c87461eb5d409008255d4e14c54d7a86d6e3eaf2ad9c559f7a6b9d2582542b
+Qy = 7562e3a04f22ad37a1df0250215c163b45a6bd04a4b96c30fe2e2b7ded5486b172ef09d
+k = 13e745c76b33e6e91f47f8423653b0056014841f4df890121655ac2044f3a6d58b9e213
+R = 22467497bf1b5d29476f24aaf5f88d905be7900406c64033913fc88601c62063a924456
+S = 19cb024c7d6be51d15337a207e66fb0e473956932faf6d755393dd5a899bf63610ff887
+
+Msg = c78e35d1a5b1bbb0ec21e7ba7b7c74c859d88f3e100e40ae34128cf093885dae4e87cd09f3239dd8e79e25305220880dd352a650225d9bd193b9b84e488c458b0b5fde1af941c0c9fdf952d2fa41f665918dccae27ab7923da4710f8c27ac8ed424992568dd6f0a6c3ecead21650ed162e0292104eef3c2d8551be866a88d279
+d = 083330123cc64c11888c1fd388629d0b329a50ef31a476b909a182c930ff02d0c389b93
+Qx = 2e3a3e712676bede22893a8911ad6a683306e86487d24585bd6fe4f2657281f0bae2dc8
+Qy = 773889a95e9bd579be379fbf84dc8d26d47335253356e5b01c09eb8ed57474d6c0b0491
+k = 0d630f20623e93c274239200393cc552d03da6bb9e74f4a44a518e2642e84e761dff7a9
+R = 27b8997fb98ad04488f5dc8ae5dc88b2a3231fca76d7320550c74cc540110c0cee5d8fc
+S = 1824f1050e85d527847faff236b7195965e7b93343ebac889b23425dc27226d50a5266c
+
+Msg = e05435f695997229cce314e50065f3c5f71981988dddccaae6efb81f936b22cb48813f506d1edf5ebd69b0be34f278592c5935f0f6db0cca1ef9d62834fbf3c4c03f4da0596cb4d67b7b767e85dde7b7c6fbef7d89babe6f97b876b33594a9e36ab87079861ee556fb03274ad4af527342a4794192b8933f28c6220f954c77de
+d = 1dc2b656c207eabc9e0d6272099babca8d149c9c4258b779c2f06de75f76d77505271c0
+Qx = 2b03407b65809825a32ab50f1b556a65c3bbbd65cfcec898514637ce606182517fa1a4d
+Qy = 21c97e293ec74dee17c89b962356b7bd50c7b23fcc30ec7fdd0a629d11373e28380a8c8
+k = 2d0dc9317a2af5a7d0a23c00d126b7fae4c06bda0a5c50462ba26bddf575adb091d0e50
+R = 211c396875b5dc71ba87ff2483b0ffbff60cc3656132fda7422a81964f1bfbcb5ecca23
+S = 0a0ed7bf1ca853b9b19924c706eff373b97585b692b4b535ad71cc4362073caf8f61a3f
+
+Msg = 0f9f36477076c4b5a7d1ceb314a397fb14646695b0803e36e98908c8a978770269f165a1fed8f4b655d4efd6ad283d7f5d51b6e1e302d360e8ebf4e887c7523a757ffd55384e114bbfc6b7a0ec8511079507b919065ca018573418f9e394854c5704227772161707b4d0246ebceb91192f0eb2ea994ce61fd98a6d14cc8246c5
+d = 0081772348ff2d7a3fd57fe703555ab2e14f5d203c4cf0292f944e827e884d95f3b1d83
+Qx = 3f7174e88ffa8bc0a770fffa4bc30a436fce331dbe7154f6e2fc0cdd09e76840f089b3f
+Qy = 561e6aa3feffb2033ea716ae94b9a7402bccfed1fc4a137cb96fcdfe4685314f73a8bb5
+k = 3a8c40754ef7ddd0e289b2cdac5e06c72dc3d6ae9d0351d9295aedfd6f0e88809674bae
+R = 1443b46c0e6bce31642dcf3037e25b6ba2b42daa9a83f5c0bbfb2487ce717c37b91f46b
+S = 3f59d5a925fe19c795b4992c265a3c61b2452237eb34efb9aba30208ce07d1ad47e2279
+
+Msg = 1d38b1c342b6611dbaf412a66c1c0b8397692755f576df33b31c2bd12b7f0707cc423376391f7b00aa4e7b7fe54532e2b39c3c5284b9c8ccce48eaf9308ed338992f1d4ecde6cbe352e46339d7d602942158387881d9b493fd40cc59d4f9b53ee4191d42352c6f7bf32c331f0c5afbd44a92901a4b713c7cf6ccddf7de4cc6e4
+d = 1eb6bf2ca1b5ffe6f6a795733eaeed12de6e87c53571e702635b9dbd0d96b47df4a005b
+Qx = 0e64dbc1a08acf6ff0e820593cad79a46e3bd818ddef5ca0960fde799abacc7b840eddb
+Qy = 6115d3de2bdd011ad053550471368581a5f125eb0d32090646fe4407980a42988e551aa
+k = 3b28fc6d0e4a7fc449b811b78900fb9f89885f4d4f70cb5a2b3d4f8ab87bd5448f4bfd2
+R = 2601923909c8c953087b0c0acda57d8c01f814dc9722171d8409d0acd2fa4d9c1314693
+S = 3eb316cacba93bd473a4b4acae4f2b5a5b2ac9856519032e63a0c718698956e8f35673b
+
+Msg = 3353ad05ef90e9762bcfedd6ef44a1e8ea0392ebef30cffd48ae620f3e567e1cd44882d514e7c6759200d4bcab18afd3038c3d3f8c50f7bba32a04eee5a4b1cfb8c349939e4efe0a46fd047d02ed000d8fa1b98b0af5586f120d9ad174b3aea33905b979ece1eb3660b1e070c8821b32df41904ad68bbd8ed247aabd94066f16
+d = 3b2a3e65e5a306bf8e3955b60e856dfa9bf68c1275a678ca056207a0ec67c96eb3f8309
+Qx = 2c542cef892b06372af7d9c321ed5309995c1cbbf1a466e70bd30f3856ab7c5d18f4e3d
+Qy = 2a8acdc12a7cc0b54f4dec9cf61c484a5cf86c4cf6cb5ed615479123ef1c6ecbb6c7ae4
+k = 09bb5e49188621466440a0841b007525000c2203d9821f4c6afab63ac2b97cb5e2e3dcf
+R = 00a09da1c4bedff47945898f4f4ee9a0857bb56be535544aff9d729ae44e23d678fc71f
+S = 2390be08ba0861b32ca35ba27a0c8dd1a4e96d28cb007133a096b52afa0126bf2a2abee
+
+Msg = e7ec162185fe9a5803c6b03d98041422315ccdac67e48fbd07a1ef3c5661158710abc6791bd0a75d56791b4ac0e7695d53c5989d9fa6a3b037583b2a80d2b154b024f1c36b63548be9afe1d51f2f68b2ba94d4ca1e69a35ac10e15ba72242aac20f7526b12ff9d3cde9a9bfd70d55adf9bd92c66d092d7d08e9764c84bf7f329
+d = 1fd4d1af0bb7c79ed5fea7bb45574e46534387bd916649485ef15207352d7302e81dc01
+Qx = 77057d3f93011440a78718a3cfded73e4196e7fde96e794465c51be8b679f912c10edcf
+Qy = 59873441c590c43e0f00f80afad5b0166f94b62214ea45da29174874e44356b29eda6b9
+k = 3f224b35737e78ec5bc9b081a601d8fe19e33b4787449d3353d2ad225358211cf9f7f0c
+R = 1a7bfe92c30ed1af478282786bdf7b5b89cd0fdba5e534bdf13899dab5af108803d73f6
+S = 2ba14810de4f5cf48b56e94bd6c439d230dfced3cb698c77627f59faff0ac5a42c43067
+
+Msg = 87c8f2e3f4fdebce0ca9300fc1ebcaa934f51a12b6b8f2cb6bb6eb77965468663044afeb2a1334cb5a81e74b8427267f8b34b5e9ff0cf157a9f18be2b1942e32ca61dc23ea13c3f9fcfa16df8fe05e067938b6994982676463fb12842d4ec532cb904cf222aa805dd0d86ab9a33a83e294c6d81e8dfa273835e62e9041dc8ff6
+d = 20380b1136b5283e9b7f54b7535ebda33b129ceb177bf5d3d07b1daed5edd9fb3862530
+Qx = 5e7d0931db006c6abe04671d1aede760f2b1ac5c866570f8e5a24ed356fdab49cc5cdea
+Qy = 7004920fdb0a744cc545068bf82bc5d7a46edf9265fd7c5979b9559f5421c9a98f6db89
+k = 3cfbb1204caf6011fceb8d4be987d9a41b81bcdd95b94919b220647d0e7a18feef4cd01
+R = 07096beda28c20d2e62d9b0750142d3d21b54c38c7fad1ed65e4f9b386f3dcfcc43a3c2
+S = 3d0af02aa39e329e4c39f2a1d6797f0e3d14554dedbcab9abbd158273a3c7116225abab
+
+Msg = 2ac53e8a50c4afe3b38904255b7cbf150c5f79dc15932dc0ac9aa631521f68a0d4b6bc5a04d55c99a36531fd4886a23a8d99f262ecd2a9feea925d7a96ebe9b6979a207b7f9378afbe404fc8e959b0333572a2c911f8743c0ba64eebc7ef12fe5435d2cb0e5091ae518b6e4233489efe3c16c6f21abf4e2c6808b733914e5a7d
+d = 19f815b98836948e0a0dc9c30828c31b13e175f1e79f23d084ae1bbe64823f4866214b5
+Qx = 5109d8ce934972f5520101730d0a14b99213ea17772e3e7637d622a5de13fd2ffe3bffa
+Qy = 502927e0c7baedc4bb3ed2bd1b15fd2d06dd43424393b246dd530d5d8598b56dfcb3cb7
+k = 10359d5cd8a9b7532c9902bbf1cb83d0d34bf37e73e7c0f5729b62a10bd4d8faa0f53a3
+R = 3503410a6feec71fde2feb14375d50f99ff9a2c8bef47e676bcc6c3045efa9948891ab4
+S = 159b1f65fd566ecfdc08b87e4ecf99ceea3088a750e2c3c9d868bb432de6a61f289d06f
+
+Msg = 0b201469cac4c078f587edecdcdb6efd5752cb4a3f43ab540463c4d908c27527aa3592f2f9acad85dd94a3c056bd28618317ebdf2e7dd6c5ad26fa3c31dd8e5c50c60418d91c93bcbb59ec1adb1db791f485ded78a5cdcddd23dd1cfa4f13443468d8a5f2d648059b9c4470d0f4fe7733d56a28a2c24456b6923703ef32cf0b8
+d = 01854e954654e726cf4bebc0e5a840e8809fd716059211c6ffeaed36829808363164684
+Qx = 7a6e7c542860e815d3fa24fbaf99989e8b9c812b08399056ae4f9a850a6711a7385b622
+Qy = 0dde6bff33891a64744dce6456600f5a6a11049906608e77f8afc38b922972c805af258
+k = 2c9cfd376903122625c7fdca50e93d4c216f0c7d07f33b3b51e54e666e13b67dc89d290
+R = 18321f9ee35d47648060213df1275ae89c2ec7d17abe8093d8a431ced23aa61d3f8df4f
+S = 09e5a05a62b006a7787c97be38df6fb9fbc1433aa2241b5a788fa727229a18e07d7a8aa
+
+Msg = fc5e4dddf4c4a328b685035ee79069770fbebcc56c14e31afb4bbcdd5220e025f31eba794fd6c05e64f19678dab33ce4f084bc32790392f14bf35669d75b6466b4214ec30d58ca90ae285c9058f5804a1fc9d7a995958f2a0e84ee52e8a78b601bec04ab607ffc2091749cc548c6754ed14e2e5f92315bdacaa7a12823ef76bf
+d = 3548f8020819588b3202f4c1ac62eaec6a47c2a19b2900c5a3cf5b4ba5804231141c647
+Qx = 38563f2482a399bf1c13f42f8b85ef64a3599c22da9688b97530718bfefdabca3ae8637
+Qy = 5c4aabf6d8a90af345008d5a244d0671cbe1afd08000c4eb37702a9bcba6dbc058ba6da
+k = 32649876d776117003305f0ec9cdab5cd84bbdc747d3dad5d8d54a8fdc84d519d50df45
+R = 1f5160851981772c502088eef209f7f89a7c8ab35e630d16330bec7723e398fb37c84b1
+S = 073a7333a7037e1257d4d70be87c30bef770f9d728dd7e2615d47b399ec650aedc867c4
+
+Msg = 284cad790e6207e451a6a469cee3befc3ec43e047cf91b9dff1485718aa29de36a43f7c51eacd8589f0c3a96ec18e8ccfa92941b50b2132e3612d5b45e16f60d411d1c53e373e1ba451352e28970ada9dcb9802102518a385dc571dcf6900971b00346098a58042e0d1d129bd6801fa640a895a458a45b31318fe63ebb30c6e3
+d = 3cc4505005c41142308f1489226b7b542e2e7f24f1d3089ff6b92a4b0013f490ad52e60
+Qx = 280b77ddc6648d9cc3f5557d406ea2a089c8179d4320781b2eb76ab07fcafd2535b91de
+Qy = 05f23bf4171aabbf0fd50049aa017c0dae70b065964c685bc03b958cee2fc3249149d31
+k = 2ef488215648524f6caf85233736eddcd9d1d838c6a2799c3a68580492d40f9800bd119
+R = 3e8e13db22c97281307edd4037f0a75d2c70a070614e94e02c860f36a53aa738fa0db2f
+S = 356f2651b51a6be0c697300a8c2641bfaa1795397eac208385c3729248e36baefc173ae
+
+Msg = 6d46e57abea9d115deda48b69fe8e0b36144df2f6a659509ce1b514c8cc4769d46e5f71df2a084f1db4a22fdd3ef0c2f90394f2898ce291b9f279c0664aa01419f5f6bee1fc1299871b27ecd57a5ac548f99d01871b8c238a6b46044c953b2e78e22346a0c7663af4db62799038ffb5c21ee512e26d01e70a4ed967377ab8405
+d = 144a2fc8e0aa63506e14e4307df36416f963dd9da78655832f5b991af8c3eb97df78efc
+Qx = 3fe8867b560bfb21dda517b8f4d50578a11e1d0ab7ed4ab3796580d31bdf710e8e22284
+Qy = 5a302baa3795e2d132c55d90858d14d4b17aea0ab70632b135f94bb23112d163357f8ca
+k = 0b5225132f19419715170f5a3f26919b4127a05b4f0406f895af1e4bba95786daf95259
+R = 0651d17b00ed9a06bfc6a913883b5cdf51bd5f2dd22307cc5ad3bb545f623516232bb6e
+S = 01128d4784fc0fc050af0b97f859616d764b22f40734ba65aa15e2cf80e7bba3d15f42f
+
+Msg = dd750b39bd8753f4e473c4484e2b36ce2da7576813ebe05861c339ffae1d029bc793173ed394091c00685ad82f0550cb21ed1c68f0c27cb7396922239cfb886647af204e88a9101b7453a8ab662e270b87a8a13f2fe61d695597382cabeb781933bebfd7d0dcd33f77266e43e32d937f2dc89f67525e522977ce73e9ad36c8e1
+d = 24ffeaf139043ff25a395e4c560c7680c1c2155191378917eb25194136b4a69597dc277
+Qx = 0402bf61c0e36385e5fa8371a553ed8652466fdc3ed9d4a3ce1bcc567d1f451f6703dd1
+Qy = 4dbea6f67e1117116f30fe42e84383768b0da770f8a2b4cd8a4fec330a0034554a13808
+k = 3e4e78f012eaf1778c086a3bbd9e996da0ddde651236ebdb6348062f56b36f63a901561
+R = 1e2312720f6fbf44d7a6449a7f30019c38e69f2e6424d4bd1054f40798e9fe58d080b86
+S = 379d1b610a976730dfdf3300280f1c61109ad13c788e8f8f9a8d5e0130ca9482ee417da
+
+[B-283,SHA-512]
+
+Msg = 4736e59fe5812f63737eed57a570182c065538abd9fb0a1c9c2059199e7052ba57d84b5fa1cda2ad9f216610361ce1dfb9334816b6bea509283756a03aaae2e5b0597f492d078b6b015a40c9785dcc5d2ae266176980db04f5cffef40e16661a50ef871c5f531d73fd5d114fa19bae9dd2da4267a131fc31849da38c2b78d1af
+d = 1d1f2e0f044a416e1087d645f60c53cb67be2efe7944b29ac832142f13d39b08ac52931
+Qx = 10b2d7b00182ee9666a6a2bf039c4358683f234ae41a9e5485fd6594e3daa880c0dfe0f
+Qy = 0a419b2f40e573dc2dae4b22e6f56e842e50d631b6126153178585bd05a8b9e6e87e4c8
+k = 3e4d36b479773e7a01e57c88306404a46b6e62bf494b0966b4ed57e8a16169b9a1bbfe3
+R = 30513169c8874141cdf05a51f20273ac6b55fe12fa345609a2fede6acbeb110f98471af
+S = 33fd50b214f402deed1e20bd22eba71b156305e4f5a41ab9374b481ee344ab3f27f4bcd
+
+Msg = e573fa7d4bf5a5601e320130de91f4ad87eb7ca6b8998488afcef69c215b0cccd221b8b66eb0af9d699af9ad6c4b4a580e82941f31e4c0a9bd83995dd076c5ac9bebb34481061e7cb1b26f6e8c6b26ee4bdf9887f7ae2eb9fad3115a21dcc96acce85d23a040c0ebbe0a56e75714dbfa803d6e279b2f4280bcb993f96ba321e1
+d = 1337362609df74d25f7adee382225e6a04dd6ee4c6b45fa31499ce9edb0ec046325caf9
+Qx = 287b288ce6f65fed9f95c99fa4b8c1aaf6de65ca563df30ac67c1066d2ba2f5a554e09c
+Qy = 25567fe183dd400d256c333da92dda2e364afe84492ede9fa0e913ca7f12069b5a44b48
+k = 31b84ec438302155f2e84dd118c0d8479267f8d19c8c5d96d21177e20b23e0180dd6d33
+R = 08133e49644044bf9ba3b4c8bdc3973647d650c58fae4a7ea5a5fffabafed56e759010a
+S = 1d8cc410cd04b188418b20cebc8f66ab0dc29a42f9067aa2926dbadee39abce79deb396
+
+Msg = 7862864d0d78b44e2a28af44a0a16d8e9b1b8c4b794db0410c0a863ba011018ef43e1e11f2fcda2f56fdb2a69cc817df425c9cb3b458922ba00d710190cae16d61af3c304a42fbb3d0c4a74a297253fccd70aca414865b41f68b01c561be281265fa89f63f975d3101334886e85929a5a47fa8dc459b663548faf8ed7484958d
+d = 1be00aa0afdfe92e24a2536594d4b41701ad4dfb223aab35ff49310bdba7566057fe8ac
+Qx = 13583d8cd163fdef7c11e91f36c1d3eb2f7957d219244db883708a7c5777611b0066812
+Qy = 7a1f4df45073b838277d8da7daa7147b0f10aa98b5ec02fbbf97c89ee17f3a7ab4f3f27
+k = 26b42f369ff9b2740147914a2698cf1ec9bab44caa3b5f05957ceb9a32073729aef0fc3
+R = 37640dcfa11483b3754ea027f5f239500894dda4f4c8308f0623db256eba2113c41ae61
+S = 2096767a1f8210b175334fad61b4c7fb4e2d6c7811b5d22521af7750f101077e2fd4e44
+
+Msg = e73c96d1a84cf7cc96065b3c6a45db9531cd86a397e434072a38d5eeb9a90f62bf5d20bae22b926cfe967647d2bbb5dd1f59d6d58183f2cf8d06f4ac002ead026409ca6a1f868b406c84ff8887d737f65f9664f94801b2cd1f11aec336c0dbd4ec236d1cc4fc257489dc9709dfa64eae3653ac66ab32344936c03eeb06d5852d
+d = 12ad0aa248db4fbc649f503e93f86104cb705d88c58e01d3ae0099590a69aa006aa7efb
+Qx = 08d262f57f9528d55cc03c10bd63ded536bee9ecc617221d9892ae1a75b7cdee175cb33
+Qy = 754e40e8823e89fe23dd2748fb74e9e93c3b33f188f80377a32bc66f6a92da1804c04cd
+k = 2405a351a3bf9a6dd548e8477452c4d9d719e32762754cd807a90abddd3ad380e197137
+R = 28c5d807ea1c3ddb7f2c90f3af644c5d6a2757336ae46c2c148752a2fc150e8183cfd83
+S = 397c8c52fd67b99792229194a787518db5be8e8c291b1a30e105b00f108ce41f8ec8fa9
+
+Msg = a73fb0aaec838d011110d49c5e94395ce07408917bacf7689d2cfe0948c582214b263c6b80e0a55f1e159086817605723740569eeaa1bae96b979679165c5c35ef2142525e943e595e6b4b160acd7ebe41de19775346363f779b1f80b6d5f0785b92a648028e456af8496102d19dc6526247a654bdae3368f075fa9ee92b2f4a
+d = 2cfbb8f340cae8e2e2322829148981cd9e509b0c65497fd8d9da5dee9dcfd39b0f7556c
+Qx = 260bb17da74429f049f3a7eb73fea9cbeb5b14ce553d7772a365376d0114ed2ef3087d0
+Qy = 5889e41bca54c09be20dd406a6e1f11f9d31d720e0c4e2e88f381ba89a97f12fa9faff0
+k = 3fd7cb455cd97f7f9cb888444f39569114589612b108657ac59178ffe31a33569c9f0bb
+R = 048a10915fd3bf9ffab1cb13632359466ccc539128cd98c6273d5d8d26c64d57520394a
+S = 2d0f67f9baffbb34094c5fce36f47cb73a537ff984c89e38d073678c21148056bdd6893
+
+Msg = eda775984c7c9f7db47af30dab314d070fb77e9b623baa6b73e2cbda800f167b20fdc2e7219391efacf908f4ceed9b9b6bd3541b52ea087177e18c97391214758cf6455311fad336ab56cfdce57a18add8cf85b0a0bd6fa7297dbaa34bfc8585b0f06a0aae055186658c227e19cddb65de88d260f09f805c2e8854dcc524189d
+d = 070e82a1f3fa6158d15b7346dd56150faee5c98c9d07c996e01a06dc9b211b12ff62d60
+Qx = 3d3ca5fe316a0820e84a8bb5d231bb14c810a87c7392d7f960e7cecacc56c337f88b0ea
+Qy = 27ac0ded5633a98ec5734db9de1399c83a181d522037266d856c83e5c8047c4eff2c4e3
+k = 311b23487750c3c4b23b28424c33328c39d6f594d2a9b459a883508b985d8aca039a2b5
+R = 1465736c3c9e30e895b1544690e05108ca221cf2352ee4af1b5ee4130029a82b277b076
+S = 2819b94dca3a58cc5a96790871640fe0fae38883de6fb4712126c1c1cbfcb0c005c5af0
+
+Msg = a4a13e0bfa761b9bf37fade6570d41c161e20558874911ff3bee38e5649849b159beccf321c6bc7243f99c01a2fadbab9e157e9952ca65d8ea676c74fdc976d00501c626b8465c6cf0e4fd1a7d1260aea987161b821528b0b423e62ecc5193a0a49442b0c3e4ec9c4786a3a86b199c07dd3a17033d430d2c83c100f54e0a7c31
+d = 0b471bbc5f7a07996e370da4a09e71e2119ab3a562a273f079401951fbe4df39a4493da
+Qx = 333e9d5e077bc64d022e49d5d207385a19282aff1b73b307523b0f861b4ce4219308c82
+Qy = 5414e431f3b90a2d4a454d073cdd81f8b224180ac4139104166ec33ab33d079dd147ebf
+k = 3e431c39ef6f4b7674a1bf414460b58998ed7aa5b1af7ddab746cbcd2ed9f42ae3827d8
+R = 151df78c0f453d396d71528032933566e176eb7f6910fa9df2e9b2f5ebb6038777ef209
+S = 08a1c4a1e21cc63fc15a78f0a11a1bc7a59a5a31f57091a12896fa670dfdc05c04053b7
+
+Msg = 7ceda7a7248640f7055309ae712c19d741375d6a7e0608e07f0135bb830dc3e8863ee9e7a75331a5e1bd38c42cdd484d4f45a26c2c1d4e05ce0d0ca941f4e94ecc6b371102f31633629e9861de558bcb6407d66eb91f1062ac0e0409db68b9f2855296a7f42fc92359a7dae16c73fd2dddea52bd866a4d501aedd8fe3b3ea733
+d = 3c65cf80bfb507dff52f9bf2f93df0642020d41619b3990009409e7210fd7130ac44ffe
+Qx = 3beb5b9b8785c5601093086b709c0a05955be42eca3d217e625349e5a875efa82d75ed4
+Qy = 07cd4e64475d628e6f562f0ac9c3f91075626063a52c2b621796e557799ab2f1ebf8dbb
+k = 16212ce91eed7153fef806d2561912be1d988410641d5eb72d586cd4e6782deae4538a0
+R = 26ea04dded2cbeca81e75503932982c7fb5cc7d38a45a3fff8c4ed7f844dc759d8da302
+S = 061d3756e3da1c7816f0d72a8c84dd1f3b93624b631f5051c801af4e472fcf82d896c18
+
+Msg = 609815edfd58c0e26a4b06dded831d2f33466a130754b96d8d7c3b4d99fd4b0789ec719bc25338d0ae8c5880560c02687d352d77c291e406eae865c3b26d00f2e63dc644ce7e01d6e96ceeac8bc1eeb257d36cbb25d89b5fff6e30b6051506a0ae54cfaf6214f30985d54cab78f708029c1fc0175bc58e888db89dea8d300abc
+d = 0f4d33a9c7e6744ab3c441828bf0f1866ae1c042cc54abc754e3801263a96cbb3955dfc
+Qx = 4b925b97bbe67adbb6e918acbcae0ced8dcf11d012e1a97875b750bbb7d01945bd64df3
+Qy = 4591cc9caabc0db8fe9047e6b1f8d850ac4389fe67bb84f6846b631dc3524c8dbe6a06d
+k = 0483aefcad5e382351125b333dcede8ef50914b1d1f1843b075f242acba18c290c742cb
+R = 1fb791c288e2cd52d3837c56b02fc99f53a6ee27ad6dd9c0a31ca08d8fa64eefccc5c87
+S = 0a041ca35422d8985c1c706dcb0b8ece64b65285bd0a934cdb41fc08223885147281869
+
+Msg = 82d8ebba707b72655497320200ce719520c1ae7f46f38122958fd99322c25c9f4d4344bcb77a6658df0eece5df163412ecdca58475d56b0c2d14a0361e4cef458df146925d473a43692b15e9bbec550f1bde3444f2a5b2ecb55d2abd273ae999f16a32333529d94455e485ca4585e6b07bedbfc2bd1eb766abf0d28bdb1ae6ec
+d = 3a4824bdcea6a144d85f1b194431724cc49849b6cb949b4766d641ae95477d1ec3d1464
+Qx = 2c9eb36eca01dc2fe921933f4cebe8046b3679abed80d2f8fbcf8f254bf17be3d551a56
+Qy = 34c836aa4e946425fc9f49f3f62e33d8a0afd320292a34d0ef8bde8ad79a10e3f95f2f1
+k = 23d8725af57d835018e8737fb4e8b2eed3ec5a83fda137c710fc1df875416ff82fba90a
+R = 0d9f57ba8b6a9a1cbba67adfbb938211ed2d267468f79ad39ea1eca7271d135bb67c18c
+S = 0f09a600d97c69ab521bd1ed6bcf0c0f69255c334e0aea06c68bba81d53e810cc553c9d
+
+Msg = 9c6fce18a6a96349b10c9f2f5f1505c8ab727a650b44bc0782a5f39fcb48b45fc7c1b82180d5f229b8abfc807071f931d333d265fc940c93fae7520d8d40ef59d7c6e3678c6a2ecde52b6a8827b1ffc6ed269cb9832feb20e593a7e3d4708309342875199eb2ffceba7ecd707b122516c815e83e27872eda812e3ea52ee3c4a8
+d = 27ba543ea785df1d53d4ae4c1bd0a3a994cddf0c25d2b4e8ff17ea7aa00619e858da1a5
+Qx = 7d375a9e78ccee85fd795e3fe6bc07f50af3456edda1ab00303f6de6b5b02fe09859c63
+Qy = 08d0d54ab9a239b5ff955452b32bfd2372fe095751bea4b56d52f79b4fda0fa635f57f9
+k = 00ee7010af4a517502cc5d5433d98916f6750e8a9009ea04b8132268673d4a02a3e2031
+R = 3c147b66efa47a842eb90371eeae907f0c813ca0937e488da95ff8ee16d389f3ab902ff
+S = 01469d005eacd9ac84a140c93ed0aee09083a4822730a28df35058cad29267eacf03968
+
+Msg = 5eac15a64c7653d125605869012b8f036804817aedacbb5a5248a595ee0c12329f91e8179c187192d3ed0d4ca2e202d8d4d9c93ad3f3ed931121c193af5b47a8a5dc39775b6c2d702708e5134f77a31bd62eaf87e39e6fd3f2b9f782c3057e162dd53b3addf92bf0ab99835c7f6649abd1c5322a1ebb2ba313df9464a74c14d3
+d = 0708d0907d14dcd5f40e2903e1e90e48a0ffaa6d4d9b84ca14df4e985c294f74eb9f2d2
+Qx = 6fb0fe1c3d5bfee5399c98518bc3ff135e0c351243fa0540717a9b1f7990eb8cf43597f
+Qy = 5212fd4d6a50c08cd99ee5988103fa639b1123c878d416cc553639bdcee1f8e927bdc8f
+k = 151465f40204d76f3bfc2e4052549869c19da82c678c332f536ef24567ea034358866c8
+R = 0803d3e8c876d46a9198f2f769faa76c4f66bc5ff4298b9640ccb8e67ff8d10f86342c4
+S = 00da3344354114d163d14d4c288785adbf9a8b31371c6e4420383c80ba0a430019c6acf
+
+Msg = df735a7e60bc267b18f313ad56bff830be5ef119baf43ce27c6368ff1dd89f010afd4f48740b11c12101c5903bfa71d6cb3d6462cf875bbd55a570ffedf3564088dfe8c8d3148231b78b5adaa6c53696737d4704daa59eab8d986fc6e519e81540f201e77b923a6a4af65d7173635b3b19b2023022186a7b8e869e1ed51717ab
+d = 21fb0a6b94080da8b8299b87457dc09d21bc430ba5f3359d92aacc1151be9941739567e
+Qx = 179831c55ead3d11844fea2e18d25cd4d658822e626550aef1afe37d88aadbcc9bfd666
+Qy = 75f8087d759ede340157667c1bb12be272b8318aedf2e8f8b487f4bcd12a50ca66f9281
+k = 37833e9aab843a6b967264fdb705b419ed63fbb09c12170491019acc7c21b9ee28a00ba
+R = 1c9601440d109a3f4eb69a1a669bdaab9f4222a34a04ace8ae313b10bbb66811bea7d5b
+S = 3d2f9ad7595dcff69b65f035ce600f2667f8499d3bd25f789d3f3c1bf83d2855f68eafc
+
+Msg = bb107b0eeaf175a786a61db923bc6d51dad5e922e85e57536118e032167b197b1a1f62d9bbcde04922fde781665c1094181c16ac914cf6fbbfb27bb8346b2134f05c55a8c6b9b481273758e380666d6e22c28577c29446cecc5c3df9ed9f1be060ca55ab2b7fda36a147aeb46df0275bb923e0876b703452fab42f6b7ad2ceb0
+d = 2c80151f91301fb6b0c7685bd172f20515b46bf94dbc4160d0720fbaedd40ec00084447
+Qx = 4a62b0c9749ae9ff00dc1d50d2b4a4941741abfdf13c8e416549ea27fc26b14f191f243
+Qy = 2c9cdab7c6512c322bd200167eb9657f8e8c84864b57480a80a3c6efbaa289ab8cbe4d8
+k = 3df951f8c4490fc7c2d50a72a93e0e82c5a20be8d91afd890d6846bfd146169ab58b382
+R = 1f2accc7f7c4b5f877e12cc17b227e1ba110577c9f4e1785e6dacd8491bc6017129d798
+S = 27a167e6f2b43ce9663b810ed4f8ef15029fb6f2be2ddf25c014d844953f501d1dcf6d6
+
+Msg = f47e49ae30b09b7666600b7a95e81b0afa1553da5e01fd917e4ce1b58dfaddb8dc8c03c0f5591f533610deb6a7bb5faf5dd1ec4103a587a1a4c58a110a706b0f301a5c408b3d984c210d5b4a0b347d2b5447271f25b527b3c7864f7cdfa735dfded47c63b723fa0f0413c57a24ffde9a95c35f743f892ab1ed1df704cde82d9c
+d = 1538abd7ce8a6028d01604b1b87db3aaf720e04220edf4d1d28c2d731aa25f509e58f2f
+Qx = 3076b5c3a12b8a2e1368c7e3458458dd7ba6c5a6dda8c82cc6b30d1ef767d36e015207f
+Qy = 369c7a80cf01e9f32c08f9924db08a7d0dfa5e9a8e0e29b57f5eea8506841e6e3da04f0
+k = 3f0052ba6ae6bd7a7aeb077a764d21caced6b241f63616ae4e4f0d98d2bfc0e44dca592
+R = 01281bc0bd36ba1f3e1c262d98ddf4e9bf1d80dbf97db02089fdf1d2e625abb5733ec3d
+S = 076db2215d9f33054efb397c449f05db198d38a24749f046ee20032f5899dc142052e37
+
+
+
+[B-409,SHA-224]
+
+Msg = f2380acb0d869d1cf2e25a6bd46ebe49d1c9270624c5507be4299fe773749596d07d10f7c2be1c0b27e86f27b4a6f8dff68cfe5c0b4c58dad1b4ebec7bd00ab195fdd635d9fa8a15acf81816868d737b8922379648ed70022b98c388ede5355e4d50e6bc9ec57737d8843fabda78054e92777c4b90466a5af35dd79e5d7a81ce
+d = 0beb0df3b0e05a4b5cf67abef2b1827f5f3ada4a0e6c3f23d698f15a3176cb40e85bf741c9fbc78c9e207fa7302657527fd92fb
+Qx = 1da1761981a65cb5c77ec50ebf7acc11eaf44bdd2f70242340ec26ffada7a4b5f661e13d6e7ad341cd7dd1ca491cb7a0b580be3
+Qy = 19ba11e4c4f2f5507d6bd2aa2f96b03510a03d5f8c38bcc8acd08080d9effd1f8ae5a5586603b2e112964514c831bf786b2fcb2
+k = 091e575fc79444fd2d9021bc267a1a076438d73464726bd0fe4ac2884a374e71bd462b1516b3e97c3202854bd0a286214b9e92c
+R = 057ab9d5cf4d18f05eaf17d3b5a4af96c3eda8ee48acf5e02eefdfe2f542cde32a37c04f285794ddccbb14383a645db040bda81
+S = 05275de4157b32723366a0d63831e6512241e3e4416f3af02e22da8faeabbddd761160304927a71cfff4d6e8937347c9b78cd3b
+
+Msg = 22a97fc0a9694dabc6f274ab52eb592dbbe8beeb646ebe6cef60eff341a13017eef980aba6d24ab3afd976e2f6a84cf652654d4a54a36b2f2f62fab8858f8b0479a48fe9f47f8fd5a4a1f3141a91cbca186507b2bbfef5e4c4d2df525f04ef7c4720fb443ccad540f03a2be468d88c9545d1dad579fd7cbcd103bbebc9e9f961
+d = 0504865a30984a9b273d1bc289d734d10e0aa56e93ab14720f1a42a27d8cc932cb8804b963175de6fe57d8eafa8ab7ea0592dfa
+Qx = 02de5872c40a79d5238722fcb94d5158009e28fb41ea012e92028dc3c87855fba71f50e6d0dff709867de185f9a9671e7a91e2f
+Qy = 0fbf607f69609ae96982bda3f0317fe46ad1e0207030fdca702cd97fb5d5732f3abab24b10669875a64bd2a74c8603897c78d22
+k = 032d0f950d10d028db6e9115e9944e7c768e2da731df49dc9128bf145a747662de08cbe0517fca6fa185abdfcc4e3ab604e196f
+R = 0e7d16daa689ddeb08074285f5293bd9f1c051ca5589e69e4b62c32af110b6f3981d9624df15c7cac0ddd62aee9c41c7b6d690b
+S = 02f6bdcc551aef0e4e8da2df38288dcc29fe600de2f8b6cd8149f88146150790915148f069372151c3bdc4d719526eff252e610
+
+Msg = af36c04af0e3fd64bf52dedf52fb788d2d1bd67fe05d98880cc7ad3c20436abf02f637fcec209fbf888903fdec8682717299f8a4386768153b7faeb6581db57fb9aaf4615b4ea8d924198fdd158363a1f40312527d6bd14c13d19985b668c6b88a7548104b1ff057d07082eea421f50062a315bc3866378f2d2d634f03fbc0cf
+d = 0cc08a4ea5ebe32027885a8c212870e7c45b6c610117994d6a42a284c05199414a3a0e8e6645ac5c2ebf21c505a601f69c62b85
+Qx = 09d2beb607f2bab64451327e1dc67f04f7569ffc0c67b410c6db06dc04edddb1362ce8d8b8220be77c447640e7d0c676e5ad1d5
+Qy = 0ab813e800e75b6012faea43be56fe9d5a22cd46fb1f4f1ba65eab19f75f2ce9d8187e4940fddc485c42cd18d40d47415a80b02
+k = 0cfcc307f847eb696f16af32502690711ffbaa2e60e75f80cbcf7704152d5eeb9ddeb701952dd58fefb159926a83245fefa6196
+R = 068d1c646dca56393caf3239d9fb30d1dc56f991a8dfdbc0a7b69d273aec69a53056d9553e105c7917e522ffe446cbea23227c8
+S = 01db30aceed2b126cf45163b9d878a6590e9ac8284a31ccb0faeba2202679f181eaebb664b5537f408b693800f24da590082dfe
+
+Msg = 6bd6f52a6204b60f37929aeff28c87ef61ddeecc231e52a7772275f9329add899c130956f8c50ac2698aad3654fdb49b74a6427a62a11eca0a8ee8b719b8c0df7b9f0bb0af5fef4918a8c83367d29fddd04b6a1ecad904471e5b59c8fe3cdb06b4f8f96419518dda960845d83c49a49f1b1f2fd1d2682a9d60c25fe3ce982cf7
+d = 07156ef0a74ee1119532a2a7e8c02be1559c3c21897af9d5b34553c3d0feca4a8d5929d1945df824478e0c0b92a6fac8c84f639
+Qx = 01df419310cf133408e9bdb32fd85f8f0950263e1886f2e2e108a596e7e76153ec47bf9b33f69c1128dfbf52557f3c382de85f1
+Qy = 16a15517a811c77cc67ec4fe2bcba1290e4981880c071318aee28e30854692ed2d6bfb71e6e74fa97af750889ae8d010189733c
+k = 063f127c38160e85acdd4d5dee1db1c32cd9da6075b2d2f46b010636e374e0262a0453394aaa8bbb5fe7b2dbcbcd62ad601cf51
+R = 0250cf50d52a5950999b9c0ddef219218f76dd9f22a2213def9ba98d258c2f8359d08d0efc208e23ea3614c9e27b2e4576b9c12
+S = 063479550873dea8a3ec0306ffa9252739c34c87bbac56d3d9138764347d5220bea9c27d6a308dc2ec53724d6d3ac4862d1735a
+
+Msg = 0eb8de25f63abc9cba16823270e9b6f3fdedf0fb90f6652a34688970932e3ae98f6d3bf0fefc5f247f72960a6975bff1f1acc2188a1775fe8974b2bb2b4c8d226ceb735113a14009e8ce66d58808fada4e6f697fd016829913352c0f659b6be354a067df00cf74919580750aa6064f21264d89dcb28b3b2d4d699115c36d1310
+d = 0a95c7abffa92e2c637611ccba66ff9d2ab121b40a85c5b71454cb0dca1f098ce1be8d9ea4933d1a91bcd270c5a33687835d6e4
+Qx = 048e6b8614c0c7156dc41884e17e36ef528a493c28c9e6275c3454d83beb939ccc74952732c18424ba21b8ea9c528966c692141
+Qy = 00ef9efe1145029d8d60d14dcf079d43e3cea0e18010f680bddc2729ffbff9a981cef2cb595a69142b25a0a39863a929adb635a
+k = 0f43af45b0dd631bfe38d85979ff1612140b9cf80b4504857df17279d9d8ea12d5bcd2920fcec81326f15832df6774b9c4bf5b9
+R = 099f403ced566fde4d9755258445b6d6c2a4e234f99425aaa78ef118321f8579fb513ccbb71cc2732e31668a6a6bb0fdc7f4018
+S = 0d8568971a4f219d6d3d8bea6aecb4bf7de53886d2e6bbb0f71d054c63768c34d4d1883000019c59168fbb32f4317330084f979
+
+Msg = cad58ca7a3b9967dc0ab62a43037764f8074ef9177d60bd98f623d693333971c24a575ed03cb61f4dc2e3d6285fb1204502a540f3c0bbbf23f5bbbd1544f322ce35d949d8b1d8edeb82e90927ac67ad49c91007056bf5096bd690d15ac00e1874fe33293d8003a4a2b094078cf09af799dde384143350c54a99e1f99cc31f2d1
+d = 02c438b07c6e0685d1f94a4bbafc013f8f21265d893f54e54c3ac2071606ad1ffacace0b8367aad724b1d9508c65ce52282e397
+Qx = 1fca66bdddefcc3c2072ea32f026c975a2c392dd7ed7e93e94a810e1125ec161bed698d8305830eb66fca5eeb71934ab3fd79b1
+Qy = 189c22a2c9f1fd7624f805fdf4faeeb931709d745a3feaa3cf04824f5fa58bbda144d4e96d83ce1e3282bd5fc9c50bcd68f5408
+k = 09230aa7b58505e2dc2f205b70a09cb9f4d8272f465b7380195ede0f7770af2a33f7623c310a0520e7436835cfcaf32467f154e
+R = 013d0e70d8f4b1563efbd3c46feee15b88358562f769046f39df6d00477815e6b8763c023807eda87a86338c7b64214784fa2cb
+S = 0662f43fabd03a0c05ebba700203fa2188e16504f8655bfd0fd090b109e68220122dff7a6cbb8bae08612e0d516e9f95ac15368
+
+Msg = 281ce2643799bbfacc7d5993683a4fa656040517854f3c2dc7c4f8848dc305382e34e894d433caf12d8b493020a6a08d1fa05b08bf6c53127ad5f33bbe75b9db0615e3dd94408d028dcf3cb7598f6e7cb4c787681dabac7cba2cc06fccb7506fece6c7c1c1bf622d525ae9737085ab4ac578905950002024f30159cf0d99f50c
+d = 09e8658f8f9e6cd98c0f4f0fd20d64d725653aeba339504def17f3ad12a63dc6157d80804e5f43f4ff48fc5573fde2c615ed31b
+Qx = 15088531d914113a25f1598ba1d3cc611e27ea92ce8dc807fe8d446db14ef62ae2f06c293bcdd739f916cfedfc481fd941b4feb
+Qy = 0a9135dc1b0384e7169fb4648973559e508319235a3f41ba174d5f58307448671cf22a3649168495c36b0bced09ac6df98f14db
+k = 0d398fbed52228fe16d32a6ef539e4ee3858a1df327bec999ca25cdbc357de5a75903909973bbb0a5d0269862a74623a38da515
+R = 0e38910abb3d84b2b26ed17d2124f4787dc5612942e98521d9f94baac3d14159eeef9e09b9b20c807b479ba84640730a4ced4c8
+S = 0e370e575302ab0d8d08d5270fe89ba524b5bf21e43e70c4d335ec1525ff5696ced37f0de17e109fd833e5d179bcd4df42d7882
+
+Msg = 0c061da1a16f2be130ae3b20b89745e840bee09633fb49671db28ec9a051545f57ee07e2410ae7ebc61c9af79868d3047705bfc64ac0c04ef0b286e579b650c7165443631e49e6a53c84cefa5625b1e1035a6ed89b8e839540040151132a937666524265e099272c1849f806db0fdf2be64960d5b5853965099459968e5beb32
+d = 0c4c13f65eacce85a51881caa6f82d9e48ec2ac574947d2751823a7f072d38bd9da0cdf30b6f19084a6d291052e7bbc2e1349e1
+Qx = 0af93430dd77e6016d1b076a52126a729f77e34bb3db11328d9edd56e29a7a09a7b6a54f72076fcba886ea78ab6ad81de43a821
+Qy = 1419e1bc339c03a8b4413ff009d76f9a19e201876ebbfbb3dc771b7df07bc19eb893ce23e40c679d7909c33af2bcd7d6306c0bc
+k = 0889be0918e7ef34d3ed226f967301a10fc30111b3559e37f5fa5a57dd5c73ff672c5279d096c5b04c68b71d55e549d019281a5
+R = 0a4bddba9b7a402b584ceb82a54baab61e81973b7347e6dc9e3ce0f1e50dc21c9569d8ecf8a7da97c38e92e52636eb13d3b4c02
+S = 063c7291656466f7bd647073a50f410a2cd9e8c938aa1fd3b28ddc1cbdd7b78b757689dd661f5173f79896780ac3fdd4f3171ac
+
+Msg = 74ac2e1303297efc3ed8e624722df505df55b7f33964cc0d270604cc48b58205d8a11952232a8feb0079baa30d7d33660268b56a5a3dd90105f0703abef8f6636a99bc63bd47d9df100351bee32d8205dab0dbd2af36fd173409ff8d1fb7b24570f3c1e968458f58aea5aa2f46731ee91ffd6d3a060af6b3d5020daf1362af3e
+d = 0da591461791ae7847e6d8dd8df46a63d3021644abe9520e158406c96540d8fd82ecfb1c3f6f5cfd7688c7656cc3e3dc94e586e
+Qx = 1f48c95301956c62e2fd931df49953519b88ec3915c8de495dcb4ccba97bee023b1a6cd9a66dca29aeef8f4f1117eb954e47cdb
+Qy = 10db6bf78cfeb92d29a922c4b05daa3cdff3917ba6978fe738296956ed141c749a938ca9f8f13f711aec930e0f1948ce7daf9f6
+k = 00576a91862cd63acc067563626977fee6f074d5726cf4f68e80d25029d4b8efe5ea845745c45e4cd42879e52854c3f385a10b1
+R = 0806435400248ec38a6d362e8b2cafc3f3bd46ba5baf538cd97683f76a733ba2b4ca85fa7d13b99f4076e7616e68d66f05ebd8b
+S = 00ecae395fb324b4366f238f0df22d011bde5db6b0cf4189e3ad47101067ba87336ca47d637f09f7a40a1bc64de8c4aef7f497c
+
+Msg = 2afd17344552ccc577b0118caeb7dd56a0766e25f84df17c0505f9798931374b48df89a48c64e199108c36e00c0bf00a97ccde55787bb97c6765601765ab5417f3e75e35a9fe5e0f85a721d9f08440ed617afcdc200b318940a1e496040a6ad9090476b0fb4fcceee77b3fea11de09e7fb14853d1fff8ab12d66c101257e2d4f
+d = 0b5eb943f0dd390b737510e2bb703a67f2dd89dc9f6dca6790bc7a260cb2d0fb8e1a81ad6009ed51010e7686d5b48233c6c1686
+Qx = 01ac00da454bc329f7c13950c848392cb4f31594fb7837f0986f61601fe244eca3db6c4f92accc2fbd1a4b8597b70e72d88b103
+Qy = 09a364065a9f67a0aa7518b75a0b4a9140787a67f852fa31342d6275c14713d484dec3116b9dbbb8af1d4945639997ded09cbc7
+k = 049176093dcde8549f95a8f1d1c87230046fd4b18a73243c3599815d4df8387a843bc8fe1fd67f3c6bbe394547e11866f41acaf
+R = 09d7c4ddee55f61c5c4c2ac6efbba6164900344004976381c7b18c1de541a97cb58e14d14b6e433c4eb6d4bfe6d3e0a4e457469
+S = 0a9acf355bad544b3b120522365bcaa1e1dc6f1d3df1e30d3beb94f639e26147a81d154a684bbafac965bc39974c505fd0f811d
+
+Msg = 174b2b083541f8284645a810801e72631a11bd7bb805f684a7159e055afc44357f2c80df2b7853678d34a04144e0ede2327d03db6df23769ec41194a8d9d86af74d51c5bc11ea878c6a80689af71d3fdaf1c651003385332a512e03dd040c33d9c328ca89ec7ee9026bbacf30a7f3a68e0d894fb9f7100ffbc64bf17679dedd1
+d = 09cc63f32152284fca27ab2837bf1343144336a1fdf15b9727c47e877ac69ac9cf4c97b4bf42f1ab10d73de8597a554ed099efa
+Qx = 044e655ad66ca9af330c33bc6d00ccbe4533a4c6a44a3f23c921b62eeec8cc1918e19956f3ed848fed93a7fd7ddea57096d1f23
+Qy = 03a71b221c85607821cd864af6f533f216b641ceae104b8e16dbfdfe7edcb2cf9ee0dc1679b696149ff42a051c51c861a3c7530
+k = 0db9bfe4c2e659006d31a7b44eb7bcd6dd23810f27c74dd587ab9af23aa5962dd18aef1e95da4ebf4aabfd558cbf72d2951bd44
+R = 0c3b91bf0794eca7faf227c4ee4085eac6d6918803242bff4da9c5dbac2e23fc32a4d4a192d7737be22810812558f820b0a2c13
+S = 03120a558c0edb58ae7ba36e886084801e7604558238c85a199af6c9e7506ea4e748791b04f3a92354a4f1407837d87faab66ad
+
+Msg = 758df71a952cdcffdc417b9fffdfb57582ab5c5473a8bdf0c2101953b023b77824263353dea0e2ede1f800a5757ec6ac0e1e4e3ab5a4cd85567d2d19acc6b7069a6e7368401cba2b6e642373654bec0ddd19fbf032794c15b7ef7e714e13e36875262c01e77766ed53cbcf735936dc9b33eaf2152a396349c82ca0297dbae4a5
+d = 09950355e8667bea8bbe3a2c4988436ab5394551b375e27fdc0c1a1d1b07ae957932f428f1aca0a486e54cd0b5bb0a5c5650641
+Qx = 02f623f81fb9a299b71ea8c58d5bd7d89e7be66ed8cfd7370de515eaceac90364438338a3fcf9981f1b6f0b30bc61c4b7c15791
+Qy = 16130b7c4061422d70b21251fa9c3d4e9636f5a08cea794a0fddf74ff5ab1b750cce0f2768d54fb2fb75e2851c2296b39c0ddd2
+k = 038e8c70cd35591012f45f27980095c4bcbb3bd36bec594927968d3747618c7f5810ea9e0a126e4d3e1e08185b031dbe0b37e5c
+R = 0cf957d59b03aed0e48189d2b9256b5472c8a48b4911f9cec14adce5c6b4aa22d093a116364bcae01c1a739a4023da12a29c058
+S = 04cc2c22b243064758f52264ed84e757ff67c4f6596edcfe956b70f777d865d01e529f0a8a9a6e1895168780ab60950a62d2d2c
+
+Msg = b96d9f66b2000e9408d602096f032b112f0e05ea874229ab9daf6e05bee49b4722e4f2d8bf2eeaab9dad94438c76b7cc64dcbb59cb4e03f9ac70487a1d24d8d6b72d7462fe738a17edf381d52179b3acc0c0177c113eb4d10e8e78041deac1d56abda0ddf892edb8be956d285e7236bc6794168f8a180f622dd5f2b9e690c275
+d = 0a995493d6971c2d7e8fac3da9f8c0b5afd877cfb94924cfecc167f9d87002136ab253e3a4f9ddf5c9c99bb1dc1af0c6a3a3c4c
+Qx = 0ac0e558dbca0fa6f013b7282e02717e91eb73304b4f7ac5e04f12f55824c441faebe5bb5af82189044827007bffb1e26557941
+Qy = 1178bb726242c718b416b21cdc9fd90b31ba6a8350f9b4ce3a188b1b5dffd0e8894ae6a417c4d74c920fda585624eed4c1d3f99
+k = 0d581293ab1e509baa50852bd3f21f6493cc524a2c16206e461e320c7f2c1c201b9d2a1dd4207227592a6457670a67cb72eeb58
+R = 022624cbbae5214d2c29e273c334b9ea78e10c7efff3611574d5fdf6f67a81472b606e0236aa47106097b9147fc1b56d062966e
+S = 08895d107ba789d88a17c30a537402591ed788206487697a72f69285ee5eb4f03cdad6c2604e174ef4b9bb919d8b39bee6231c7
+
+Msg = e7ae60ac55e6ba62a75d5328bbc15269d4638764169de0bf0df043d15f9152bed909b1fb8c7a8d8e88ac4f552c1092b62db00958a3a827f64896f6de4bbd8fa5258d6c36e3904d82d3eacf6eedba50b0242eb6b01212288448c3a9821c4fa493869c01149ff1850e8115cf9de1618cb8744626b1951d1de305745507c8b21045
+d = 070daf435cdc26ad66c3186267ad12d10f28d32d863f950cbfcf042fe9dfce553750ad098f82f7f1650c1126b3e4451bee6e11f
+Qx = 19b41af3b557c274cf117d501ce7ccd04d8bff2dfc737d7efcd7888f2dda24737a6788f16b3b6cd589d3f65bd95194799d65659
+Qy = 11983077a2c371fcadbf47b10494f6ffc7ca8873b3d812c45a87c48e1b49edacc0ac37e5038cf1aba20360b74c0903c23a62331
+k = 043fb8cb87591747d12f4897dfbbc79644b87907bdefdbd7ff0f6f2e7970c7d40bb2fc08c17443d029a92487869f640607af460
+R = 05ea3493a8c04723de9de2cbd523481e3a8593ae8f010ecbd5add6db5a82d9b13ee7d24ecb417419639d0e9f4e68d14f6799829
+S = 0a9bbaded0a2894e384184e166bc06e1b2fabdc70536caeb3d0cd46b955743cfa8ac6edd03760d1b613fb445367734fa4270139
+
+Msg = 666b0dc2ddffaa7ffd57ea3b2768f02d4b77c16fa007c6d1918400d195f068cae2dcaa69817e6e4c70d5b29c5598efe2d957bd12d0fafdcf5ac52dee80a2d46e77fc18cce2a49bfd787ff77b942c753974d22434742bdb494590d17c42af725b1309e54566276af3bcfbf5e174d3cf191b85903faafa1583282c97e66c5da6c4
+d = 0f8121980dfbe9ad0bf92383c7cab95fb72d5caba96e1de7772c6a179e85414802fbb86d725401451329287305570ec7fdd873a
+Qx = 0c62f4e7eaf3f1bbae71734c86b8a40ed1297b9ba1151729f9363824425193e8605c2bcd6094aecc9d7ef2a41aa6b12877291cd
+Qy = 1882a45555b68596dbc8bb093dbf1aab9900cf46653c58f5656f3688fbc72c5236297be2f0586a4031279b9014f2d3655adef41
+k = 0b4b5b19922bf6a34a00454374589f9c89745eb194b0352061a79401e23c0c0e1fecd7597b5a7cc1c463b76cce7ab921867de00
+R = 0f1fcb80a4fb49348fb326e808d8ed8c21c376f0713429a22bfe16d68cab0295b21d44029083769761c4fb853662d440eba4cfa
+S = 0252a94a40008cc2c1a69113d8e14e989e7fe13918a2852de6930973a91784eb35e20d8ae150a88c459167f8ece998cbf6c5eb7
+
+[B-409,SHA-256]
+
+Msg = 3e967cbc2bd936e0b6125dc5cf885735bdcd2d95b2f764de6931c4578ac8e0e87abdf96375481df67dbe1b6c43537e84ec62bfca6672cc5f3ea4125abd4a4119edffe04e42411d338e8b10abb1f1f818c50a9631a3f89feb5be5367bdcb0a8a82c96a427ba6ce99f9631d4411a2b7f5b14d32cb3901dc9d285e4cf5508940942
+d = 047682b2e3bcb5800a531858e8137692a9b1ee98ea74e929ce4c919c26ae3b3f1d4122d07fd9a70d8315fab727ccb67004187a3
+Qx = 17ffffc1d2009e844f8e625a3bf11749a8b4ea0b0fe3532d124112edddf72d518ef577f160962b88ee38b11445fdd356a26bcc5
+Qy = 0ca356fa8e90325aafb1826a694a55a80b2af52e70ad8d507d48946392da8b9fa27b8ff6927fe5130c69809d9a2c4b1d7eff309
+k = 058edc8f3665ff9166af55e69aab9d468f576bcc8f652e950082a48224b4923cb9396ed4ae06f05bcf7797352035484fdc501fe
+R = 09b46600fb3b8204d4cb63ddfaad1482dd8cf8652f63c926895b8b8ebfe27295c052b3bb81dddd8687f4864f258a433010c89d0
+S = 0832f7674eea791b5f17db7cf9e2ab13253d870c6ab46ad01cdda30e78db8b8f51fd377dd55ec7786ccc92b17364a3c17ad5be4
+
+Msg = ca1c90012eba4e7c5f01d8cb3814c58f48c03a16be6ed86934014365eee547070b870d1d26a872cfd28b60d9ee0a66dea223e9eaa90ee28076188d6091f26f665684f4b486af70669555db9058d485c677b2a34d4a98aa8d6f43bf6f44aff2a23c5d765e98f0438ab81be0585a5be29daece5d4116f44ce6062753a3ddc505f3
+d = 040cd1a06233ac27f3ddd108de7c6c0982793ee620d71982697713be9fd5143658929924cc88747a680779bb00da8a44e1e7d3f
+Qx = 164e518a6719b1ad61a38a214ebb06dfb0553bc760799e668b1d0d098ae3f06dffd9b84c16de90db19043d72bed2601fda14b1d
+Qy = 18e022ceb850eb1db59e6cf63c4a7c73bea0b70448a7dea77d5ee8a2e1a36cbc46454bacd5954792de82f3ec21ca6a509b0c7aa
+k = 04a936fccec003bd9e8eb45d27c0eaedbd452e6fe99abaa62cbd0739bcf259cfb6884d1e60b82522c6146f081663f6f863576c9
+R = 0dec1635f2698d4666df2c217fbe3e644d27592c5607a5549c877257cba7bee29a8cac75a044e72d039747d0d18de1c34acf072
+S = 0138493216ffc3b8aa2e0c26f4fafaccd6609e6b15f767da7c907db64b5181bfdb447d73ede786144c70ddce7df7eff46dee4f2
+
+Msg = a54c4351ebdb075d6a42a787647390f864b2bbfd8bb3d0e0ea9d767200fa344d1a9ff091bddb186acd69bcaecd767068efe4d752d185bfe63f6674279d0e7192d2077c400bbc0d5599ee28507c1253f05eae0687b965a015e1f3a292b4650106765266f5c95b77ad2d82a6a6e012f233169eb6b8d83576901cfd4a927c54d7f4
+d = 01ca6f752aae4eb7fc9c73a08d6fbd96bfde5030d759a2507bd45b6e1d1487e53abbe98fad4f41976364e0a1d830910ccf97abc
+Qx = 0f6b7220bd24652572b37a0ff25e75f72d583c71c159857482ca9944b956a117a6b2ff96614898757b8a587e3c2b78d9943003d
+Qy = 118fe425768bbf3a4acade281c41c745c9ac946c2f8b95d65787fb6b64deb71e6b38fd8c721e01c87efc7c2a6d8066fe3b35a0c
+k = 04963aa161b5ffbe5d7e5058f0b1457ca1b9cd61d731a0470beefe5f8998904cf4594f98dcb41283f66e2b07c5c5d6a6c587826
+R = 0abf824d43d993107b552d7ded13f49ea0ae7bb845e56ad7e53cc5f9d64f99f9f250e4305ccd9f6594c92defa7f6860fab1c349
+S = 090a541f1844357f618e5ea34c0398ccbdab0cb363e266980ad304dfd675bc81c0345a4d723fbcc76ab5ed4cb0ba0af1b71bcd9
+
+Msg = 6723dbddc8720feeb75e2a061b7fc49079f999fbc79ec8a8e01ab8d35b438b7049da5a23c49a58101742791f84f45d5f5cf551cd7de6926a0e2c4ffa1e378f038da597368c62df8cd8349bf046de46d02183dc05b3a3575f5f232dd2970057200e2c9cb60eaa6b4d72f8b73d4d40b98d1cc801d1a69cb5ed780a75a4064623b2
+d = 0fb9b1a9597d216028902abf743d25944258b48c9762d4589fe660396130b75f6006cacfde60f6204463cb8c18b032de1dd68d2
+Qx = 19b07f7f4ba100aa9e749bcf93a2c9955c442730c5e1f6f72c1b1d132b780d92f414a533282f7b66677c8cc8a3d5ba8b3cd3cf7
+Qy = 06ec6e9c495ccf600f8c19597e9cfdb639406b04f57a29dcd1a7a843c2c44e8321bb8508953e9c0503f77d36bdef24d5d39f85b
+k = 0757f6acf74eb02b7ff3161b476dfd8349854154186c959179f11b9a15da3dface40ae6ed771096e053976866433382e640283a
+R = 08fe276e7f63ce5f85fce19d1739a8a9986cd3c3fbe26fd59324efd98826f9db3b228321b3ad1d96145ca23cc02616d9e9d7aa6
+S = 016e06de8e3e0abf4a4f52bd2f827ca4c57412adcce3271fb4014069713f3723a038bf560788d8dd48430d3b30faf15ad9c0d69
+
+Msg = ed53cec5e5500d62d38c829002916c657674ede4439c6f405ba672327ec677490e656bdd698f114c2ab5e6a1fc94a1a8d64466cfe9eaabd23a8b5c37f76a3c0decdef73b3e7b751cbf3b0817f4079560b5ea34cead88ba374201236bffc48eaf289bbaa4e828afa7d732473c228ad00588c9b443d65b998f21c3d7a9e9196c08
+d = 032109202d754da290c266f74f47805a06e6b5c3f721a72fc97a3bffeb8887e0c642d49a6bd034847d0a5ba09239c5dfdf0772d
+Qx = 0f4dc8b94dfe0a27d4d41399005b242c3e5b14bc7cec55ff3a1561c894d73f365fa8fa2ccde1fd7bf3760b96ab2db78d2d50b03
+Qy = 13ac66e95c335b71fd1a98f101a392dd4696a806239fbdd0708acc69333febb48d4b649f14f42841d66ce03f1fb557a361c12c1
+k = 0b010ef786c13ece3a10eaff79b93ef3899aa385dcc1914e16abba90de0ca6389d664082fa727fa7c7907dc4c88bd621e6124c1
+R = 0488b8956c5999c317830206fc8b9f6760845c31bc4ba77584925dfe25c05a1e7d298a62e9748c7278eba622713df59accdd78c
+S = 082701053ddfaa376c99cc42ad4587d84a358d9d8a9533888cc382623114aef51170de77ecf64af02e09bee203851abb22f5d11
+
+Msg = 13829401bd41e9fe01329e9f5a002f90f1a6ecbf25fc63e7c1345f265ff02e496230f706c6ab377ea52d8707b54f8fc5c7f089044e2bec1dfc66a07da76ee12fb9ea0697d87706b0ebf677600bd2fe117f6cdefb8bd636a1b6b97549ee78f992c24acdf3a946053f06fd012a9c703efb8bd929a66aa74b05d61bff0395232b00
+d = 080536e820fac59b3203aea928475043b2576446619001647e35693a9e65d15236c3cbc12e1bbe0eb305973535c882b70197a92
+Qx = 16d7448c0afe992f8c59b19d6cec64d8fc5b10026a806760bbdbbf0012063f46d31e521a34771f826669c4d1ddd58d3aa13ebc9
+Qy = 1a3742a6f231546f0704345b9b83c72d5036522449cf60c1b3bdfa4c8d36e499d4ce62e6e7bb05c6132bed1ae44eed17414d2da
+k = 042753a515e607cf9992dd1f249820dafe53993b59b1e57d8f2f9100f609cc15713d27f5dff4007e078d6da1061ddd36c169c21
+R = 07eeb1cc19ac45f52c0b63ff8ecf4f4f35958e86cc3e3a071a35446d490a426b48b6c287027b003488573a4834a06dad48520c3
+S = 01410d85f3f2adf065b60a126170c43e34e0883338118cd33b0b3eafea1d142480b236ce49d35fefd1ce4ad3d25e0cc9268b1d2
+
+Msg = e696acdfcc96a6c088069b7595ea9516a36d8fe04dedeb789fbd965db0cc64b7017a821015f6210b6989e515def5a9605fec0d337e4ac59f3101a505168bf72ab6d98ec62a71d2f94071fc05b95e98d4efc59fedc138e3e49c5d0b44d1f48f7b1e7c1944ee189b242950d2bc804d31c7eeb45283c84638f043ab9533976433a4
+d = 0b05e5f0dad9583ea18fb8fc4d8c75fd2e3cf9e92cdd9b737485c953620d345006c31c288b380258b6500b84f729ce6730e5303
+Qx = 157c083ad9789966905c212dcfd7c049a8ba3863fd4886e4b118b3f06445fb0d4745c2a8a1193dc68915722089d0d382253b675
+Qy = 0867e8efb575800f834c978ee2ecf0f84f72e75dbbac86926b73fab8b47f38eee17a63baa02e3edb9d4f6b2fd2afc88b6de36bb
+k = 0c72eb08acb1d422999ee8d51f9ddef9f897dccfafd886998edd3ddf30a638dbd0ed59d68885ce242fb838f022bccd4f3b5f854
+R = 01f4dddcacb088f6e24d331e8b111e390735a41e1fc29da8f5ffdbf7342f4b9056786f2a67159d1e57570bd69d69235ec562416
+S = 0809840df1ef8fce9b2edf8f970c07bdb5fb755e9d5bacd7996275c4f890173142c39299ce9eeb51d21a32acfc7761d5a2cd7ef
+
+Msg = 4058b9a8cc15ac148909eb97fa32aafbb6077b168dde91a411dbc973df7db056dc57ff78f0abcb70f70f800bd752197d681f44df4a7817c0e7f60f8f65489ecb6167c14b525e91fd2cc5d8b80ba380a83d031d5827c8b1262c687c90ef0e62723d9b565557f9f6fed0db48f3799274c2cd60a14303406c35802cba6261121296
+d = 0be1d277813e79051ca1611c783d66003ef759b9e104f32298017fb97667b94dcee1ce807dc6b4d62416e65d4120523bf6a4edc
+Qx = 1fed0171b5b3c6d9092a6592944680a08a0d4f99f08a3ad1c22b5bbf11c0e4ab3cdae9526b0ca2b1bbd961362faccd5caeb1d37
+Qy = 1ae7d57db848e5c86c31f542f1995c76e916dea9aba882865febca630bc6a10ceb6732bd5f07f51bf2f37ecae7b7fbbca618ae0
+k = 09e3585213c6d6706524e3c8e753a2eb0edced626498eacd842d44a73c602d801a079f94b781ae1ac5d44209e8e3c729ed4e820
+R = 01098d98cf83c705515494cdef8c3f50ea8316d95b3ca5f9a1296f09021de57930184ee4b9f563aebf5fd0d5abc0885cd24c0f2
+S = 0d9706f4474a8fb0c701505516699025fde546a21a3fe519a173a3ac01f683d40b4db2642330bcdfe188693b15a476cd9339ae7
+
+Msg = e793237d46e265ab84ba9929b196405faa3b0e4686e8693567e53f68e6991e57677974677682a2510c4c35b1968a90b32c4941af7813775c061c008a60f9f671cf7419c94253d6106b61e65034497f2d273a5058379bd986e3d917f708f0a2bebdba150f6d78a3af9c722a2430ab0f4bad602e91e18aaf258e3785fee78e4502
+d = 073c807bd7e07379782ab790720de4ae5106f16d34e80ed70da5b1594e660c9b775db94066b93e74f855f57d88b6ecc6228aace
+Qx = 0301526b630ac3fca5085f633deadec27af353233e6f241772c7fdbfa42e47a04b0d3ae38c04eef2109390a71fa9fda652343cf
+Qy = 137eacd97a8449ce83f19a13a248af52e512cfab3e2ce1ceb789874cb08757dd9e47ac21b5c0846498d8d7cd90122c437602d52
+k = 09245ba1873114ee2a3e642c5b15049a3566a2f003cb3d25250028655fba98203feef5f307a9f4c77f232976d83723f2621eaa6
+R = 0c8136d4b998ca0544ca1430abf55601f259aac7756c75d1371de63d1471053c789833c5cc257e323a71f80e21783df4efa169a
+S = 0e2ecc6f0a418bee5de7c2418c4ad85d981b18048f94865821de696488ee19291912ae7da1cf5fe9708e2beb18e6cad4e3f7849
+
+Msg = ffb8bc80e7619a562d8506eba7658bef0c25ace3dc1d01bdc2ef00933d4fa07b80364e5e5826074edd46a707dbc3b0ab19eec7ea8990839d7fc0a80b70661204c52bcbef57c1a7bdc861c10766033a82dafbead283d911a9502d5f9ef0a39d35ef26f3616212d4bafcd413ffd18b424fe09b48ba02ca5d97ec996205cd49d22e
+d = 0a68379b2296a6c944ad5dacb593b302d8ef0b05873ce12bbc371d705f308c739d21f343349524aa72f05341e64f7435daef112
+Qx = 07fa0f698535b011833dac1ac96f3739ecf0c29f7fc1f8bd635f4f98daa70a39310611ef51b2fdc8b37eee3573dc34cd2528d39
+Qy = 0be1a9dc30dabee3403da4f2dac6622e6fb8496e72f3f17c169e7b554efd84ac655e727ae9520feaecc752601d5391270cf0cfc
+k = 0630547017103c3f97de48ab6b942db94b2db9ed7dab0391ea9e71c1b788c547abc90088de5b3e36c9ee4280bb454c7c3710999
+R = 0916aac91ad329d6f330cb051941c781b9e59bfbfe45c4d4f6ce0d1aca982e1c612952bcea06784c57c121b14cc0dcca783d0c2
+S = 06a83d93f9bb81c61ac290906d74e2d3b964c39b4e96370f19cfb4a55a3f7901bca3deef4bb79ca6a798fb9b3a9b0137c5a9324
+
+Msg = 946bde90a5b903dd281a51d7fa93d80f3fed07eaf50c18fe9fac5acf67326bb18effa3144e25c151efc006a50a274ec6c6a5d573051c4e2d117ceb0fa125acad07a10fb6534a8e5f5b3da2a1136779c51377bf76c3a4a93c0c6158f729f2293e414fcb952c9509f228c804f0adc1daa327a8991d48ccf4f3957c5f8ccbe3ad4a
+d = 026046bbb269ddb1ec14ade56175482343a21b7c265026cef3c7d6a1ae0f6a68166b9e6c49a6e733ad2ad64df7137ef230038fb
+Qx = 0d09d8118519f9d00df7514d2ff99483473f680b750604580b61017513870a3cf1c403495cba488309e2c084079d53139a36953
+Qy = 0d25e41038c18e4ba6f4e9d14f210b71f27b8ef2c1d4cdd5f63edf8fe11d548d070177e9ddae382fed2b163ff2b58546f10a99a
+k = 0d6b0e5d83155a035248ccea95feb0b4d1af818e5ac6d5f41f1a255dd8b482a94de0f4e037b10339d1805dbb6b22af6ba834219
+R = 08059524790304a37f2a0d57bb2b93cec79a827b1fdc9ce2d7dfd4d277e0f71844d335314a30bbec5598a399e197a852b5528dd
+S = 0e7870e2a0ed16cf340a04fed4d2048e4e231cb8918345e1852bcd3e30413a2219864851121a34fc98dd99976e2b20cf1d1bf2e
+
+Msg = 07f3fe1369ebfcbcacd66675bd4ab22edbbff72e68709cb57d4f590e49440f01691f490c58b5117bd24aa2fe2101b59c61c417c918ea08ea34bbb9b8aa17491ae5d9329affe894f42d7586017877fae3ce35bb80c97f92a004380374ec91e151995166e14ac00505fd1fa810cf02981bacbcebf5f81b2e633d3a3db6737890f4
+d = 0bbcda66978ea526f7bd867c3303b625f11b94dd9ee6e2c2f8688ff07f2bba83c662949d47ad47fa882cb7d203a7f0ef5dbc52a
+Qx = 04cf5bc624553e833ffbee05ab863e5def062e0d57c28e71d758d6ffd3839504d7ed9d3b1a040bdce8e187ae0b4ca23aa565b01
+Qy = 0fc1a15b4f273737eb92a56928395f6518e05bf946afb65ebca3787f7f8bb3d946dfd26c4831cfd171b4c66c2237409ebf224d9
+k = 0a2cd205d957a20c79699e91684cd22746c476a79245f11e7cdf7e6b74f07cf2fd9eea65eda97e8994aaf51942e15695545abc3
+R = 0aa1da120fc19523e8162e6018e4ee053eb680ebc7e31d00db34f7b177c74c5e6ea344bba3c39ab7ebcd92996a1c156180b7dc9
+S = 071aa4588741208344b323642fe03f1cea73865ba645169df9c84bdbf7488829b83b8da172f1927de1c8cc318ede545c748c782
+
+Msg = 3a1cb13438e3bac9ad4ab1d319e90e2c9f118dcf1eb54d6333c674a665d41451f93cd4a9334cd057a44c010edb668254517a63700a31eb0ca474c84873e486f2f8e158a1a7735362ea0cff8ef17d959ffd851b21a91412709b3c729474d2cb40f6ca0e397030eb2611b402916e4b656f0fd868247d80be3ce33d52054b7661f0
+d = 09be3dd3442e0330750f0a6252bf9cb317f32f942ae516a4038dea2c40ca6484fb33611bef016cc64baf166c122e87c15466fd8
+Qx = 0f05a6fdbe6f80c0f5ef3322d8accda4b9ae28c91b6198b888be713afa5e652e907e5ca9aff5fe77b6546115b4c732bbd4010fd
+Qy = 00923d07aeb8c947688e7d3dcb16ca69440e2a89539a41b8fbb797523d3b766b46d257b87472f5084992422cebdc4e45556f5e4
+k = 094fe051a13ea8dbc89c4cc5511881a48ef5554de265f0badf8741ae5027eef25c617bb6a3f454a992fc68f5a548903809de09f
+R = 0162687730f0ab2f57e348476d1fa4eaf13199ee44f44dad5807bbea4e5ba79e92556f287cacbbf1fdec9a8b78f37e78e52dc1c
+S = 01acc734e2d0c81a56ee8c0465661c365edae56228ca43184ea1d7503da3d38e7607b1590f59f5190e5c7264cd0d7a39be71069
+
+Msg = e58e7b881a563d54772125b2863718690a5276c93d9e1c5feabbdb5d6f7c7293ff0f89805b53663bb417fdd46874b8e6a466e7e3ff6737930a0662af1d5879b071b0dc4d014778dff26a2eca5992e763bf4c4698c382ac947215aa116515876008a56e5bf547857049c38a2d3737ed3393705fd346897c3beb80caab88e5b8cf
+d = 0ed321fa283c662e87eaab99b7715e6cdc9b42e14fa5bbe2c56fdfb381369191a42da7e574839f90a85577485f19446fccaf6cd
+Qx = 1bbb34e6bfb1c1335c48e8b44cddd8a46486fad4313581df216002b382db1d58adcae74af0d38445cac2f6cd9e2b439d106f595
+Qy = 084473a5da9f910b4807ec5ff450be353a187af6ace821b18e096c47752b6336dbedfc4b481e356e689fd9c03ffcdbf3e4ea39f
+k = 06ae69e55ac1f7b0f844f5ee0b583e652e0e5bbfa4eae85c59eea1485148e34f4d33c9ddd7ac071a28ac0a6191d5ed03e88bb86
+R = 0c3509b6c0356e4a30a82fa7411d1fe17ed190b7eebf9310c44fd568494c894a4f4a1a09e58a4d030d47227e54f7220f3f79f4d
+S = 0d44ccff47d9fe82627393c03f882d4b98633961a897381ce8b2cd18f38d69742802d18e6c988a23eb425b294f2c1b84cf42cd1
+
+Msg = 8889ea1da1cbed98963941f6ac24f47253ff6af52de920765214f2024aeb04f7ad46936830a8eb04d95aba64ed7cda6ef242f454b67bc2de38a46b6524bd5c96739c4b580e89829a61a8249ec8dc27a50f43b8554cfb6f4fa4ca6875983d4b60a1c6b49f32ddff6fac0cafb64d55c6f594b195c207a9bd920dcf20e0080920bf
+d = 0396b805073f3c3b552b1024dcf35559ac44f255b688871a3c6657f727a4b09f3806cbb75d26a00ae1728be632387e804775a8c
+Qx = 09957f897a17241eec5b8415ed7ec1bde5df11583255e0a8136d076d72ef377ab3f553d6f56c054332a24098aed6d12878abbd3
+Qy = 1f58eee295765e8a55e388e235e833bc5cdc5d51a1d98e13429bcb7891b25487b7fd8ed804b1856cb6071cc28756bf00924bf1e
+k = 021959970a6ad070d1ac518493e309289f3d9d6e2a8933bca715f53cee4ab9000ba2d0147282495e15e63f258dca87a5db7eaca
+R = 0d1ca34413341c115f780e647519547602e0361ed4d70402f42d735353696eac6e4024ed2eacf9577252d40c27297e9389d1f7e
+S = 08cd5bd43794b32d5bd2ccf7ae4deafffa0e0deb92b1eef9d3ef807d456e459f92e9f10627b7e7574ebe3c2faa858bd3e62e187
+
+[B-409,SHA-384]
+
+Msg = 55053af9370901e38622734a5bc5589f6a20e258627f381fb0c366f3dbe58394e5997e978eb7ebbc530f6e6186f48294149b8594fb551c31c50521a8c4d67e5862921695604afb23977b6a69b21abe75966fdd11bfbdb6b51ab0a474c5fa07c4de7872a3bd81acc417655090558dfcd5af449b3347e61fa9e839bb9457de64c1
+d = 0a8fe323f6736bcabe971c7d964e75dece70cb54561da48a11c40027ebddb23e41c7b48600f569500fe8ea2abebdf480171dde4
+Qx = 020f2dfee967949643b6cb8a3810524044a4b873a4984e9795e4dd7976536a2d748b8cc636ef5c8fc92aba5677c4a0951a33327
+Qy = 0956ec5433d73162c9683558f0dfe8870cfe66575f2c34c765372c7c3bc3b291e95c4e3665e4ec5e72131975f0b1f5f30b0c844
+k = 013f26e13d43ba05e01f92457374fe2ad1ccf94ebf22334447f9360f7f9748bf3665ec3058ff6184fbfdbf7de9e1e2131cd3991
+R = 013c4c290cf89789bd6dc523deffa20c94e92e88a76eebe88457e30cddb066c7a43aadeb0493b264cdae67532db7dadf879d991
+S = 043bb7a8db3d79938beedcd6ce02f375e26ce807a2afd4fc446f372fb09a69fb34734df5dc8f6393f86577a8d29014494379624
+
+Msg = c4264330534a6c2bbd8a3b757e0912558302ce302f835ad8c5474993832fd30036fdef40b10ee37293e871db5b0b149654f9e543e22111f9709ef45732125f713c031ccfbc9a2f3aba160c241d27be4dab87ab2fa9a795752ab2daf20f9d06a98d90d01c07133adfe83cb11d5176525e1bba6a9ba70ea48b224d46ddd8103f65
+d = 0105938ba9f25034da3e032dee121bdb192ac2128b50a2ed4bca042e96cfaf4660c9d35f3e67bafd4c99f9447e6dc408e0c4471
+Qx = 0f1a9243920d7cc26741eb828bb55e34c140b0e52837792ed6274a9aa6b5534cdc5c596a1141a746dee380c0d9c2f77094c36ef
+Qy = 1393ed8c609751550ffd077347712f3b27a869cfb1b532c5b19c381365ae5dc8fbffcb2182777a17690616d71c66524017d861b
+k = 0fc52aa8c590aa28c5353568c9dc69734adfae840f1e0642b57863dc7f4faa37bf3ca789a3d7afb32c57f66a61780e253f50af4
+R = 0c45b1629bbf3273c0e785a28cb8187ef387502ac4438a3372a5c72206a15d7c5ecf9203ecfd7e0ac910b6ceee3be50c6664f81
+S = 0a0c2d31a47ad5f9dc2d42dc36714cdce47666f6e2f05ce0e7136f166647540d1e5fbdc7c9fa0def8962f44f2f8bc9addc10057
+
+Msg = 3236f1ad164e1b25d828f5202e3513c80c72a577aa9af56f041fd96cf5a3363f4b827723b1511a2f16360e32eac90ac55f4ee1146791420ef9e2af333c17d157b00e43992ef6f2be2d2f211361e468413dd93fb69232f0a0d110bc5fff361c0410344aa0636bf809062c73a7ac7c142063912b6ad7e1626fd2a384f35faffaad
+d = 0ce11677ca818537dbaeb880fc967dc8bead203a2538a55e756679c4a9e7975b9b3e6aba4e6c6eab4152d0c0939027e9b0bd92a
+Qx = 023c78eda396efa28c92b120c4ca1e19dc6c467234f9f73701d8966bd0826c20122af5f7c9ad5a5b855b6dc517c22131fb0b5af
+Qy = 1ea47619f91ed4a010dd49ece7ec78c5e98297220b4c239ff4a8c29aaec008011acbf7e4f985c02311ca703bf4ce4ba43412ecd
+k = 0dae763fced0e498e3efa1c6c412a25774c9bd6cd4bce25ab0a7266705cdd54040ec55bd7e6708e71b09ffe9c19af9a1ed9c878
+R = 0a70694fe5da7646184b23b4b434bca1b754257b8e7fa9994dce4a7a92b7ec8c7f8cc69f18d17915c6bbca24f6621f9563f7c35
+S = 009e6ba97ac2be8537afe7f8f8b9cde8841323b5cc63cf2ed46a7913096ff8d96040296a1bf9aad691b60e1f18233964a421fe1
+
+Msg = 6c400ed098d8369dab6fde3553afbbd4d47836d0d12dd16015f15cb8d067a39391c85ca4e78c62b8b72c1592349ff8dc52db8ccb7fd80c085fae456dba6f4a2378e184dd59238c92cf04e40d43a66b342d2a1325a0bab12b1ac857f0564c27b35e6abed02ff5bbbdc3770ddbb2ee0513df48bcba925da6d61583076cd3129603
+d = 05a239ae0f40d76d8d3589f1662b5ca12176a4b2784faa8339b54e96a1e1294433a4d83bf904196f939bd8b33bdb4be340ec703
+Qx = 09d03b7985647027a17c06b30ce9fa1b43d0484195f584fc347f7003802613b524cb5641db3425ab4b3839e12c012853ea83843
+Qy = 0818f5e270baf5a771627b098a6f9ad8a8262e331c299fa0722a0df6ca09bdb9c92d22d72a73567cd5497d06639aa47349df207
+k = 0c22251c73998a3a49b3fc65acf01438941a8885d1c5072a5d41d779af70c044153fed4080151b524af402a4e8ede4448b717d4
+R = 02d3a7ebe5de23e0e601c6e41616bf2a9a7fb6193fef8e3f0a7fb8128a925f7bec3833669d1a304652b7bb1af5186b2f612da1e
+S = 0b7bb17155068a8d9b3412d04d407556ee133e1a704ec5da87ed19dfde60517501af345e2e744d35d844f8ac8ad08b13b17c498
+
+Msg = 039a149eaef2de30b0ae457b376ce6fbf88afd4cfdec02d3c5e00400d3b0484c1cd6ba74db5de65d6f2fe39871349b30fdf1ef29bcbb9e182eb3ec5629d07d98354a5dfa82d7f0db3dd10d1510c0dce086848a198893ca5ad24a663494f0596b4eee86199ea85e7e8f2f76e7a6bd4a052c54287f61b391f1e52f96b606151c34
+d = 0077390c62ac41aca995640fde0c79c76f4ea8a8dbb22323ed812bee837ab8798c5d0ba976c7aa634d4b1c2c155de2709e7352c
+Qx = 1a9357770270c528f2af991c447bed86194d458f693a871ca38f271a9e6a566f5b9ba3ef3d2f9bde959e42934c95867b280e9d1
+Qy = 01f3a0516fed36d3622fae3f44d87c4bc67cee0a995cea242e530451d43781f2ebd163f6f521497fd7a1a6c7b93d33b77083a5c
+k = 02555cc113c8516d741b47ca41f53ed07d509845f140dfe7dffbd01a3f751ea9f22e12c939a2ecb1827c0e56b1b1c5459b66aa2
+R = 0e88333875a507520d0b62b35146e37e7ce4e2f2478a61adfcbc6e1aa9fd0195a4960c633d9d6aa9a79323b7ee00ab802768436
+S = 094595255e8862d14980893c095608113737f42b05b561771f56ac1d54eb521bcefeb3928917c07c1bae74cb9aa80dbd34962d0
+
+Msg = 08617d04fffd6644c40f7dd57919f7dcf3c888f4147535d12ca658302305bb8e220bb17ccdc480254004b9035b357120580882ef86aa5a061b2850100285b7d61588a664dd4f5394f5478e68a80f610c9204d056009c1c9e902161eda33ef61aa902e96b6f094a9f053135692182943d38b9763055a38739a2a2d133c5dbee89
+d = 08bf23b09fbbed1b55769907aafb97f4759cec98649b2c9da5157517d4f85bb70157076b5e4aaa7a940af042302f8be06a84ab6
+Qx = 0883c31c474333f74ab2b86f3eac865c4b2b54975ce19c5cfd23682d041ef3deaa43c9f9e2c194ccd3add6677de31fc9e07dfad
+Qy = 0a5a36b54f4eea6b300491ca22054280b3f09b202b2a6b55df9e3271c763b6d8360a330c16f936d69fa463bc0c4071707c9cf95
+k = 0812c83aa9dc4139f8c3f7c55509f9e10e6cceed30e16afc028b1904b4d260ed0e77acc26e711a7a8e24c75fd780ed893c0bbca
+R = 0fce07c6f791a05de29609b59d55b7062e82fb554341b2b2a8187baecb9c95b01ca5dbf8ac88c60babe10af2edf5985b35e10db
+S = 02bd026a3e45ac439647a483261107829411c1b4a9ab603c080b92f605cf742754b654981460cf7aa72b5186b59d224dd015314
+
+Msg = 34c959f549a307f21b850ae105f41299b8bc94fc292aefc61aefbe0a1bf57576ba8d9b80caac635e4edeb22530163fa9629665fcd43959f68eee32482f1845a78ed7278e6e43d09ed6fedf465001afc0d61f1d2e1d747623e82a762576b879c7024e34f43104593cdd691d53bccaeb8f212dc29bec6bc94cf69d0a8491db124a
+d = 0082ad05d19b8e16f80e53a4cccf6869ab5128c5e622ed146fa8555985ccd2aa3b9957dd374586115d4d75b1c01cf98ecfc3646
+Qx = 04428d05366b0a46e6578fc7528d185a3f85da06c4179e9c9055dc0a7fb4afbc53c94954f268e36d2ba8731882bdd27d9684c81
+Qy = 136ba6048ec672601987e9b7402fea24f88c1a94717ed5a83794add0f31680592d6cafdec147dfbc400e73a6ba1d23d4cb0d707
+k = 0c00c897edea7bbfe1913e3da303d64d0d657a83c1eac9c111722b17c65391f2cf67b78219e748ceb269d6c65f01e92e6952979
+R = 0624c5bcfd8e0ef22ee6b34a8b26bc051912cabac102cbf56c364a743e8150195fc55a3fec90a8fabed5eacc1799b565745bfd1
+S = 0cddd4937da8176ddf0de7f52a4babb1f6fccf861533f796a487f35d060ad9ed4435e5a67166782b53c20bc06fd1b36c265c1b0
+
+Msg = 514f4de08a6f49edbb6797c9dad6d33bfa367cc1a1b58a5becfe646c7f3352d5c5d95f7456e7112c4ddc746b9076b9756ae3916c07bbe6d3823895774a42d25d44b3309d18bfe7e3ccb1f85dacfec1654778c19e2981a853c1f40a7eafd16d331093110698c957fe9f1d86582706a6885543248b944bb70cdf9d2ea89190cb02
+d = 0af7e581aa4f9be5815f0c447e39de00da9194eee5e5f609668b9b69930b5b48a948614c2250260d1917f0ebcb00ebda4bb52f8
+Qx = 044703e0b49437315a64e397085ea2ba3f2e2c383b168f31a922e5916d590344906bd2a911074b7481aae7f3f8f4807b110f2e1
+Qy = 05a13607a3bb89a2a88e27d5eb5cac4eb498d34e6ea861c80271ed0c73e1fa893adce0c1982b8a8af6a0249796e5276d369c3f7
+k = 08e7fcadc844456f14ce9354b218d519d86c0c5211d62904c937d6fbe8cb16264d7d41d98a15e9f73a636ac3739770738d6b46d
+R = 07aebfd1681bd5a2f995ad4a709e8681da742649c0530684fac251494263e98d67247e1e4fc174b409e7e24a7b055500920cc82
+S = 07b83b9b5133aec165316021472307b8b481e6381754a9d0b4f9d683c2ee7cac94ed4d8a72cef61fa1f6349b6c4a54ec38975cf
+
+Msg = 4e5d16cb1dcaa1abab1e371e1de02f31ef4e0944dfe1fdec45ab64326435b2af9aaf1a6ed8fdf1a6ab1182bb53a844c7cfd66da30aec0d41757f5988ada0017c4ca752597a9fd3637668bc1a92bb1556553f28d66805bb47f1ef91908ce098d452872da9800e77e1fbd43ffb0ed6fe6a62185d4be73ae96c9241b82cefb2da22
+d = 06d14107b08354e6a41d7d7d50c004419db8bdc50db43428df5e86084551237223c498bce71a17e25695bc438c5c09e009c60e2
+Qx = 088c1517355cd417a698b648508fd07a457ac13a49d1bad17dbfbc9735ee58343316e3eca570bca130c753e17a69fe5bd7baff3
+Qy = 1397a697d2113d94daefe6be491ed3edce9449c707a57af3a164d172cafece564d686fe0d25725c2919c60889af4d0354b05117
+k = 0f3bb2dd9eece25c56159f501af8b619a8c279d7ecbc08ee2af6b82ead80375e9c07227b73a10918d8c89d1a2b12cb76427a7b4
+R = 0407b224d8d9c0f11a8e09ac8d654dc6e1119e2c2804510a84ec61f9017899f9613e37d8166e0fcaae16c3cc11e9f739968c687
+S = 08c2bd7d02c4c537a308fa40db786ec64fbc2dd4c142b18cf9bcad66199afd4f44cbf221adb3837e84173d174e9c0d534720ad3
+
+Msg = e29e75269754ec1194270f5c9e8267dfdd8c696008b5ebc92bb840981fd065672f07f6a0f1b19841adfc51b478371e1a0db9c3346a9f0a4ccbdecb7040191a00ddfd0a8faa0e69fcf544319c0155d02797eeef99fabbc55078f9d852927c23fd931685424249b87ed0c70a4a3e2d3b9a2f92830e7d8f7650c0bffa8f8986b7d5
+d = 099d96d2dc9c79549f031bd5346cf6a8544c312a3fbfc560dc8e378efdfe025b0e6e61e09c04c8bf4133396f993b0906c33dd30
+Qx = 0883e00d72c60f22ab085a90901ba3e8a510f19c3d62dcb3ee5066e0be094cceb30bfbed7068d0bfdf634a53e2fd002dc9e454d
+Qy = 194baa5d7ae2399965fc4009ea83273676e66a56fd35a5939c26ccaf85633adf78b33dbed6da305979077418c625354c7fb6283
+k = 0c213540a452c4f2ef275dd844402dd5ea590f7df41ad35523edff09b7fbb096f8ae8a4baee95428fee03a9e6f6a14ceb90e289
+R = 071779b477245007ba1ef5f05446c4a08d1c2eab550db9c053e4588c9935f07ba87764f0fce14d4a7b982ebba89cb056aad8cec
+S = 08174bb56cc85ebe7bca1de1f44cf93cf478d7fe59001c5947c66b837bd3a6d116f99dc4f9acb4f378b0321228518e1ba0057e2
+
+Msg = 1a538eb447c18494ad5a5ad27be67fa60eb2c5cb2404eec1dbd7244cd802b17ca5497e779d5f779b981b165dab53ad19fd7bf2ea7dbb9b4baea782a43d758202f147e59d6b6b8ed54f4ea084bc18519943f6894d603e253ba3e8e339a6933bc3a0a47126087038e1c813c3f2997aae321b7c95a802b4b73fc7db95897b7c91e3
+d = 049f347dfd361a65910e97fcefbf60013a54837f2ae657d65e02397f59dc6bca27704fed3affdc3d833fdc621cc5e5f99b92a63
+Qx = 17942b58d42da750a366d7e4cf4cf465c856cd911e5352b50bc8a12704c1ac6ad54f9465e4fc5402b373d8bd4e4f8519341f133
+Qy = 10abcea49c66730ddad7734eb1311b2626b75ebbb299a28c9d60937e6833a9b3dda052379fbcf7875f18680924274fa1764158c
+k = 0134c70f031648bf470ccca4ec19c837051bf700c851df564ef3ceb99d7d41439293bcea0c656c0e5361db92a03def51d7e4f26
+R = 06c0f9935abc5034a8b0a05e8d04de699b5916cb367e834f13642f0003510bfb68714be75c9e35b5e593eba45fe151d1df56d40
+S = 0930baf426b33eb4afbed64869a22712591db11acee7c4d3a221a1e98048f05900fe14816006854cb90631de5797f91176fdcd7
+
+Msg = 7502c755bbd385079a4001b8cd653287dc3054f3b57de19d0ff8f63c0308c64c56f035117a8971d43654f89b52e923947e4760ac72be073136da70c5ad7ca1658cc0a2d2a880d3a0c0fe636fdb27b77ff260c4c1ef8a18da8e9fd777d732a37ae9906e6c4f381f0a3d941048d5a1f6f2cb8593873fa4bb1621a44bc2bebfbcd1
+d = 0dd226de602af4e9f8e25784bd1bbd4cadb0a8aef525d5e2d57b9f3555feb698765672c5099a7d6dd5faaded69d8d68b4804f26
+Qx = 07ee34cc7a24e2e693f9409f52796427ed86fa71bf88c923db305ebd5a83bf3b6f7612847f16d00f4a25614299a2df92bb693c3
+Qy = 1f63f177b54f8dd5c907ff318b66c2bfc1cee09348c035a4413fa3cf5acde0db1c8af4fb8deaaf8a3a6f8f06b0acfd20c6f0049
+k = 0e19c21b05c82dd8c873e5f30c1e3aa9348327f959a4dbd9c741e233c649a426cf7bd9d8e93232e496d0b93ce835f80fbcfdb2d
+R = 042a3907a480329a6169b439a6945cdbe8e4572779c43fa6cd1f15062559dae9eda2712402ccbdf03d88a8a68b691f1f16f8f52
+S = 0d09fa4966d171a662a9ba6827fda830b5404f96f635edd8482ee009ec5c7b64a2a6c17793993610ae8297efa9fe4c35ceb5001
+
+Msg = 95eca932d03f1df2e8bc90a27b9a1846963437cdafc49116ccf52e71e5a434cdb0aad5eccb2b692ca76e94f43a9f11fa2bdf94fe74af5c40e6bfd067a719523eea6b4e65730365ee498ac84c46e1588b9b954f1c218920cbf71b167fc977ee2a89429590f43bf637eecd91b0ce3be2d66bac5847205f76c06b914a970f543e59
+d = 0b6fdbc9c8c76cb2b822a940d8675889ca6f5132429da795462381ce29313a23bc132976fbeb346ed4c691e651028f873ce7971
+Qx = 147647d267afb4bdadf54baa3f5131e79dae8103f5b2ddf70e4652f9fc5495123be97215b811554241c53023a247936053288bd
+Qy = 15205cd5bf0c5154b2dad8367e1b487689b898acbbf44f9ed67a37babbec739804dfe737b324ad663cd2cad79274344397099e7
+k = 07321d12d616dd2ee5f843d6ed7e92d18968b3a76c0e4ccc167790afabad1b7c0dd53d82aacac93d98679b203bad88d5ef0cd75
+R = 0672c5607acc646c67456ee77f2c02117cabd241f728ace5117626bdf91662323e7565438f46a3e25c048a8e2130e27fa1fa2d3
+S = 064aaebf9f2fcbc843ae1128eb6c7e7d1fce2b9901dae0f60afbcb08c7f2ea1b550e159947deb87dd8959921846e2923880db6c
+
+Msg = 8ff68cb00d03e730dddb05fe0b2344689529096c3da6eeecaf097f22c7fa340593106b1f6726f06b7ce7358edbcf801ead959438a42f94cdb467b3cd5b17fbbcf75739805f9eadc869c33c604cc58f81591b0b8bf4d42bd53a801f0f829a31af6c129fb4f20f1250f959754eff8c629b85a716b6a18465b6495798c0c5166c8c
+d = 0203d77fac64591eb9a18de20a9d5eacaa1c3ec58a5ecdb3008c2d642e197141d16b3a9fdffe61429264f5b420f5e9926659a4c
+Qx = 00f66ca09d15d0991b48ce7afde9a148565b73807e435ae0f16c14cd439454745f8ae153786d7c40cce3f43a8aa4f0564cdcbc3
+Qy = 00f4c919b7a97beba2559a8ad0f85dee40e8df28e23732d7de655262209a5170f94791e255e77e8c8cd64c8c9900092e0ff9d5c
+k = 0859bc752300d4ba5014e302aa4cd2a979b3097dcfde5c59f4bafc5bc8a99411174d2ef3f7377df5a09269e3d9461be61801942
+R = 0691ea76acbd5e8137924bee13326ceac8231688af8595718e210bb857d6619c152e1fb46e03fa83bd6b5d81e2463f9260407eb
+S = 054df52eb86c679d8f8514a09f5a3062d2424cdc19fbf6927f744aaa8c444223f1c28ddc84b1d135a886eb7ac7eab3c7b0a42e7
+
+Msg = 01451c4f09720cd53377a5ed04c907a735477378ed960235a833049d6bad6e6e89958b4c4249bf0f6d4f043530c9e5426deb0ec3a12b7feb4860757b41bf602ca95655155356ec35a2db8e2657998f56529be4b714364f83a140846308a2973907ed7b08e935173ebbce5e29afe1444cd51c92824ede960056439555e7e74450
+d = 057a2e6a59d4871c3d547690237dd9846d6d5dc4ec0678aafc9c8669af8a641eed67bfea4b05fd6b3b5357ec4d0caf352691ea4
+Qx = 0351aaee4207bdac826ba17e3b08dd7f94c0c8ba0d9829d7bf0eeee7e6375458b5457bd787f0ff38564734b3a0412bbddd7c371
+Qy = 0e09c4dfbc33d61d69b5a8517baf5e4e1614920cbdd89bb05f0420be757253fb92308dfe1de8db822f57b67b393d8a70d989b26
+k = 0fbe560003dc220e4c966b21c874b828874a33a93bb69c49909376df67e5df1652fd91a1d73c7733f26c121e7a3b2d1246c9a61
+R = 08b85cf3a14fdfc69cd42750baf362286940994479f6ed7ce1d87af12c5ae075b311754f1d37d8ed10bea092bd3d9f7afd2f1e2
+S = 02360bc1f7a98cc87ee2a4feadb98554cce59aa0fbfc087747c7253e54c38815cf91c8517f5692f95bc7c3a713fb6ac43a34f7d
+
+[B-409,SHA-512]
+
+Msg = ccd494ca005ad706db03a3df6d5c6e876ef859ec77a54de11fe20d104377df1900b6b192126c598944d19a2364b2ae87ad7fd32265d59e1f22be5833f20767793677b628f18e9619f8ca32f3af3b41c31e87a98d1527e5e781bff33c1a8be3a82ea503e76afec5768d7f7dd1f17dc98a9e7f92fd8c96fca0db518bd143d82e6d
+d = 00a3da7a6633608fcee9ce4253bbcec08d41ee6b00178ceb017de74e24d48fd89107c9f2db3556063abe3cb011938f4b4871795
+Qx = 0a6123b122d7d0d766897b15ba6b18b3a975d3d8058c9d359c6c6594cc0dc07d9ef6033224b4aed63d319cc2747c0660e38897b
+Qy = 1ab5fad5e78f380aeffca8d15e60731720184ed456800967b2ca47d482957d38409ca07ea798bd892b529774e44080eb8510e6a
+k = 0da042642b3117f30ea5f4b354047b164bd128696b8c00cc6fcc767246daf7483284e411009e05218246830940178cb4ebabf1b
+R = 0e4ce613e6976e9e1c30c0c93214a0a37f0632de85eaa25464b69a251d592560b2039fc59b15ed7045c29c268693d7c9e06d8ce
+S = 0ff3ad5ca70aac94facd842fecdf6a28afbceab80b549507954b7dea6da06d1facd11e0a88e9c2a549e6971a08d1af75aba8363
+
+Msg = 5719e50d939a8d74efb444eb5a77cda48cbb59e7f976cdb2ea2848bfc558718b39ce27b893c229db94bf77992222d1746f8f52f858f85124a28193ae0da039c53d484681785f3367f6516fbb8a86560aea9e3428551facc98cdb1e9df8e2f37db823a7abc589f667b5c93c4c47061400220a2014197d514217fc252cef5a2433
+d = 0384723c8b4a316b450d1fce0b2645912b8acaeb3cad50860cca43bdc0206ed5b3b60ebdc29b3eda305d0d60eeaec261edc24d5
+Qx = 0fb89d87ca4282ccd048606e4d321e7ca73244b4d0c9d3df87d54e038a14939138bff33c81a9ddd64abdfd698bf103e45c96f97
+Qy = 04ff7e1706688a53a5544f4ed0f3f5e1f0fbd6f21174166d25a690f260766646cc6fb39020de9327199225e44f3d95c5984fda9
+k = 03a9f5f26eac81dc8ca0a17acc44322d43bfd18edcbafe24113f5e5fad0ef0a3db75ad1b2422c7321593e41e76eb2a767a14268
+R = 0c311000c27539247059e4a8d789ed4db93fbaea021272a90045bf6fdd70f4f32cd1e195b99ee6f03f4fb57c3a115ffeb459af1
+S = 00db8bb46fe0f99b4e6e1394a5db283e310b24d6006319986dd2c4cc169c775c89d4ad98d0fdbc3c0bef6b7fb6b43ef21049bd8
+
+Msg = c84e5702a339259a61b5ba8ec1957f23ffc4f1eeef3a58f383d3731bbaabfcf49ce2ebb597960ac5115a2af1c62b193d4ab6c24433d5f168a1752e40145f19aeb6dee889a53a4fadd13eef60e28fcc7ed6a9b8b0ca286c1b3d66a4b2c327a629d15c148049e3a0ccdccf05cf22c31956014595e417060627c8125bd7c00f8850
+d = 0bd3136647572fef3de51b12e64b36460bd3a27dc660c164fc705417339cab21f9e1f9be0f3da926df459c5ba58b701d306e67a
+Qx = 0f45e18834d1933a2a26e95467b6db85d8c3da372e607907798745cd9847bb8f8b51f996c7293b51550144f227933ba26722685
+Qy = 05d8b108eb3591b164745d116c80afdd4870187061c75af9b0c3e87dc8262586af14f4d6b1504d274c07c8e89247196d8ce8166
+k = 047a494645b99a3469369b72cc918708ebf453957b49ac4e209f2edd7a4861d014543754e37e1d1a0f477951a0ac2b5826a470a
+R = 09de9e0147e1a268f80836d7db43779ce12e7947caa851d109273ba7e7dc7fc52c601f5bf69cffd5adf0695cd7db8de2a64781f
+S = 0561aa76e1e9f2c1d4aaf6e2da143f67166f09199e1705b631d650528e94d643768cd611467284a9f543e50520e3e738e5d56b9
+
+Msg = c90bf11d04a708e64b6f94d4cca64b92463eae878c377b188c82c1c5f05a038be20eca2e18034d46f00d9a6fc73c4084981748ee9d2915d87aee4e2321f4f9e11c176f01281913e324700d9cb474b7134fcc408fb4a7006acd9e63d4578ed4c2729d8e0d01b1e6174a43a024ad261eb644ae98979c3cdab75af357f6dbdf5db1
+d = 0495be0b0a9d357f6155fac008cec90442200bb842d89292fde38b7256e4117284a60249b3101b3f19f778b680c0d1d7422b84a
+Qx = 11119cd910d4e962f54c9776c9180e7eac2f71cb9748ace4b7dfd2d2b3caef4964c7a55caa9763e008de600b727068eda9b9865
+Qy = 000b48246cfb7c86e9dff4ba77a3a53dbb1cefa168026b8929c42c3b0251fee5746897916e50f07dfe8b57baab7964447a2fea9
+k = 0ad4ab5ecb84118c33a4b06d1a9f5d2c4f1f3dd1cf71af596eea771f851d0371d2d72593c926d7b69b39cdf72931f6bb11d10cb
+R = 0e959201622673d81ca16ed94e9e5be3f38bb8db48f9c09a585aa31ff39f14128d79d604a5f93c80aa961c85bbf99e276937f4d
+S = 083099697856c780936ac01aea5e3a4d9b6e183639cd200464a5cc05232df30ff5220dce4e2af714c580d561b72dc4969166a6a
+
+Msg = e9b2a33906a1079280100039787377c2971c378b92e70a38ab41dc23979d6fb0c41e53a21b37632407adac6f212341cf6af8605b4978c85c9c16960e1674247f1795cd73b99ff28cdca024f5078490513c77114c2f52288f5376872c331151d7b2c08f7794f2c1f9e0d849d32d73636f0aa899988ca561a76f74543b37cbf3a3
+d = 079626354dfc4eeeb51fcf232ee9e6b0130c9bd40f15ed45606bb7faeca8f359e0c3e18bf12769254522fd4077eb24bd5454871
+Qx = 07ad047bb38bde6ae2593e1e41c36b7efbce1e0ad08def9b23d25b7ea9aa336eaf10217df16d32ada4af03dc193d44e6c77e677
+Qy = 0d2b9466ecf321605b9f4f9528124108007203ac32cfdc7cb87e1790ebf4bae497fb87011e0a81068e66a840d29583bb970e24c
+k = 0074548d1a3df580e45babda6096f4c78cd70945ff190d9da463fbb03a511c45d45dd1c46dc0b9521579fb506bf015f8b835680
+R = 09e04e9ffc2cafdefb600cf61e803eb78cb416304210165fa7c93c1bfefb02cd4a255512622d524141de02c2cbd193991dcef67
+S = 01a7960232455f27768acd825b8ef91d4efacc38684d05a900a8512682ce19787033cd08c1f2412b481b88ad02dacc0ddaa0ec2
+
+Msg = 672db3fb8cc8e5f831be700498d3ab3aef14b7548e8011b21351215fb6dfa09460d18f52c02c8815baf396d856a429bb9afd602a10c213af34db80447f4c06ab4bd28873c88eb9639b199042d4b2cb13cc364f734fd4ab7bebede7dd4da63decc0cc1f84e34d760013f66d71641073f16c08078880b67230f2d6c6bfe17d206b
+d = 0ab42bc7d0e3c23f8bcf928e25f9f027b56f270398a1d37bea0ee5426b944a9c9ba6d0d7796899543feedb470f70b2ab148234f
+Qx = 1415fe81100f208ec8afd5e882e5773a0c1d46e44627732900c7e1722cd77b3ae24438a8463bf571fd6bb422d7c583439c07cff
+Qy = 19c3ef3688ed397640e873dcb20cee9755437d0023646d05612e8c360717a2e80e80f2b85860d71f9876f3a68548da7099f601d
+k = 08b44ec25214602de46046b2c94a45f64e9d0903f6148dfedb76a80b8e6314e87bf7dce8e73b14bb274a88fa39136a00537779b
+R = 00ec4c5bc88a959a1234413026700bf5d4287a0263fe75daa16693bf74cb5071a64eb18778da0a31210347aaa33130602f6b597
+S = 0b6c29b9177e89880f3eee3aff204b866020b3bf77d7c31204af383d9770804660711a8579a3f1ffe325f225fc7e7894ecc601f
+
+Msg = d7fd06b89226cfd66671ce5b4b656228c52d986afa7f6f30161680eb0c9cca177992a8a8c40167a64165c518c55f678702125709361b536bd928567c97737bd750d0e2e6e0c00296a6ca565f7c05cc8c54ae7a4e0c334c6a968fc18a959c18ebbd924457701316a4e999fb11084520dac68dc2d69187134c40891af0355ba89b
+d = 07f7aa2216164ba689459ee5d5ca29e70ef75a5b2a4416ab588df1dcb9164330c0b405a9d80c3acc41c19f58e24e17ecbc0fa7b
+Qx = 1decae837c7258ea9d90314ac87c57aa6d49828787054cc068edc1955245271acae72dce5c9cba422bee54f22e11810721c1ed5
+Qy = 024cdc9e1b27e5d4bd024654df000bc9a0181f7c0f4a90572c75e16b679f4362446993f9920e2244527801e8f6b1e9398bd8382
+k = 0463202dff25e6b9c633b60a3edcffc1a22031cff44dc1b0a5769214693ba02038fe5dcfb4a48db7ec49b33068061616daf2fa9
+R = 08c06b72b73dc2655645892447fc0c0f8055838b194e8fad99fc6bd50774e1ed08313eba4141018af33af95a3faa20b69bcc0bb
+S = 0958f104326df6008135bfbaf5c2980cba2833af1b4f04b5918bb51ab0a0df637d6a4af902a5e07db3022c134c72315f25972c2
+
+Msg = 83b7e9d3ec638fef51d2885fff5490c94e2509c126608f82660e5fc523032f3e85d69d9b76af145f6bd916dda35775abbb6d1902bf38880f8b9259822055c5b1bc726c51029972cf7474cf2a812f3251aa71813476bff55598d079f075a40c6c41498bd865ce960c518bef75a873b9d010965f342dc4b35ef5c5972efe6fdd18
+d = 021d84f070c6823a70f1a74225a472118c93ce9dc509aa6064051ca4574939dcfa96be862069424bdf1a23f62f2868326422e64
+Qx = 0f568f018b0dc4400bca3e9e4b0e5bd5245f15dc7acbcf4360b0be2ea5abbb87a3cd76aa653d32858438051cbefbcc4feee6f6b
+Qy = 1fdf1e1bd7a2d3825df14f8bf8d5de825095663c3014f2eeedb9bed3c3416d56f805b623f40b847090d6b4b3bd5abc98ea55e48
+k = 03344dc1cd950a9c3d039b6fb6af8c5745395d2a3343d86dc6670580e331d59f6c0034367a6df52423a625d70292893961ceddc
+R = 0fb010ba41d651fcc854762fa1437262eadfcabb95b9502a40b50f20cb34fa19ec570dad2e0521809ecdb2bff3f4e7055c02bec
+S = 05a9c2dc0c1f946ce33f2f434c156c236b09098365a7f31e238b4685e7cd8c86a0b2455e5c83907167c1324bbb37e66e0b2768d
+
+Msg = c62c7bcc860f0e175128e1127dacf935ce62ae794cc4a0ce7966bceb023ac0498641d7281fbc86f9ef470bbc77f608f83f8d0dd6299cf08f2cdacc7a9642e4246df131820220e5c05d0dbfceda7f16b86add4793e9b6244d96b5c07cfa23574ceb43e8e8b5483192a92b301aa3b37702b8f94f0129d8af1617896b34990c9b02
+d = 0b6645344d17528968c719091b6e2072388881dc10bdb4c7fbf41906cadf3699b30f9c1dbfb4796d009480664e6276c0359e5db
+Qx = 0b164b075b80fc8b8ec785d5c2ef84d49f2f4d276546c9cf2e17ea4d367828e9aaab985c5cd0882204e293dba0359d47d9bdc05
+Qy = 0a0c61f181d5d06ff20d0c41cf6d6cf7fea860075cdcbbab2efa0950e2276dafd4258a39c0fe4c45f3c04f76efa7d41392b4d34
+k = 0c497c621c5cd230fb1e4a4cb3af1cc9d8edf4af5c4af7f15c4ad0a8835b54de52d83bdb3433808a67628912a85c5d00aa222c9
+R = 00b22e5773aca4d97d2da846c3947bf9cf2474101a6f0d39d31629a6aa2a4c3a77076a671e37aeb4cee0a94e82e914c8c553e04
+S = 06ccd79ab93e344e6f112c1e4a39e8505a2aaf5cf85595cadc6ddd1afb0b1583d9334cf1c48f26e5baa38e05b6b52f9f12c141f
+
+Msg = b5bf38fd9e822925254418475a1ce762a94e336f12b156b1625a4574fee11ee472d537ef94b4a4b1c0a73b0140d0b818cd06636653e6c07f0f100118242a7703756f1cb1119b3477c4ced99cf45e07e83b7f2749c1a5f8d8c9272d221fe17f7c6a5fb0f8a16af46f232ce406aaf565c6b2766a2f6528c82e74fa1c0a7fcfd49e
+d = 0f8c2f770cf5f8e1f900e996ecdcd84fcff5cd959777fd005d721a419123221a3237e39834b270d37752470deaa6cea023c5058
+Qx = 1f861984fa06f15b801216a1c33672cff43740f0f736b4f4abed5656a1bee33a2aec431680942f2b0b0dce9a9196b49263fe183
+Qy = 18633f4e057bb6d70a434f919b9ce4b7d9e61fbf46c1d9638100d77881755fe9829a69d696d555b1a26e25ac1a1c27b40f909a2
+k = 0bdd99022dd964306955c57b226aef036527eca481622618fa7395f53e60aa95a275f1f2d6e7354d8b55d3e83c85819e818199d
+R = 02f1330f41a86c09205004215c24f42fe582da189906fb23fbcc52136fcb4970a33b896113eeabcec8151cf3b150eaf1ec2dd88
+S = 0439507edbd36ebe4fa5df34d220c1441e1a4175c9b0373fc85669facebb5bda7a4b415c269a7add207b461525c6cc94b7f7b22
+
+Msg = 6d3474770933ec01b76be789304b6fda423b12a0ae8c87a5ea8d7ee9f71300f39440e1c7f5aa4b47c1a8628cfc3a490b15ef292a741344f40a8fcdd02cf3863bf3e32d53031f503703deab17fc52b3d4032f4e237dcc27231b85d3fd60b49ed7ee40c3344948d87c3f47564d20a11d50e4e520bd16c8701694fc70901a5da625
+d = 0144adae951fe897d5812ee4a16c0be4c86c5e57e615c398f5768a1223a9be20fa82ceccf8a16a31432bbfd17e594a4cd8a6a07
+Qx = 0bce072255f7cbaf565f82db122e9c582ffcfbefadab6d79680b2506792028b200ca7732a98322c290916c66c8a8ef77df6a2e5
+Qy = 1b4b6f65e678223bdbe5f8ecb68573ae3d7f111dac37d4fe3c0eb768c461187fc5859b13452381fe676257aa445bc7f38b4919d
+k = 0128c12479b7f0630374880b214aa26e4e8626deca57148a6c6a0e37a97e89da8acbadbbfe7db28a0c5bd17303e1342af711f25
+R = 0a95124ec95e35747fb568e6659ff31867a4cb7c00985b36584201d1bac0775653e0a8b54cd9a9067ab3de434bc2cdf29ae287b
+S = 0257e5410a6f0bd94fb3b5b10500fb45b501a3734f0c718035a9a1516d2f88e10d1e38b70c791028e262e0c3128cb84e6064ea3
+
+Msg = 92ba7aaf71f625f7a2e024058dc8739da3567c306da4a812ed9e1542b7d1e982c16082166a59720203f4524c3bd463a662c26a82ec7b4376545206e650eed0d3dd7909dfe3810981393070d15c45dc4a75a8c5bdeba533cad1ec34fd20466a61e4cde3b25af9a80a9a54afdd7de1cf2a74ba32d4ea0082a037775413c61a8d1f
+d = 0a51f065fb32c55bf4ff6f18ba9d488d35d9f8da593adb0ab1632533284e0adc43ccdbda9d9507b9862ac63b5ae7b0f78b479bb
+Qx = 080e2f7ef17a11ae66172cf1c18eab12aca4c2ae06b8106aa1066677a93538e3dca0626e836249eb884a382c3b726736565c3c3
+Qy = 1e98d37a17ea736ae58eab093fa7dce3f10791ee9ef5ec00bfb27bf3c705dd633badc94642c385dcc276f9b1fd5e01dd76ce944
+k = 0d5cf7b3d28459db8dd69c314f6464f770c31f239a12656368c84c64693f23733661081d20dca9bec9c9659a8124b57a71ffd55
+R = 072ba8c1b4bfeca62e96a5649e851e9a311d7685603a11c1c299f5ed8605adaf27cae656cd31335a7ae363cbae5dc7a39512c1b
+S = 01bb9819d25a211548461de4ff973ffbf475230baa161558d9cb7ee6f2e682dad21a465fc2ae058121224f8680296d30e3692cc
+
+Msg = b3fb9e48c333201324755a81f3ae5d4f0e2ae7cd24238fcc66d858e3aeb1ee03328660d6399676eb1b7d8285ba571e214d935bb45516fccfab57b8eb4c3d5f1d7357c768eb7b5e7b5710f599614bd4e92706eaba31f8a5e7e57af7ed13066af50b4540ccdc126b677789920cef8543907f0ba9dc92aae343d3425bd784ef483d
+d = 095351c0bc07acfabe6477fe85f97eab520dc96bdd58b44b036328ceadaa56a1904d2217c5fd25155ff2aaf9005a3e2687fec81
+Qx = 1c1311230cfdf5824323448c68ead5e5885ba540a21ff90b951f85d84d78e26da035bfd99341b5901e1ebb18648a8dbb996fc9d
+Qy = 017a037929496e560cd1c936d9eb15f79fbff737201dd880a69dfec31209faf5bd2846e3e664c668ad3d6500c5ed620f1bcc970
+k = 02234bafb54cad0d0d51f4b8508dbc8d014c303d90d21bc3f749ed7acc42f0335c5ab6d60002d3bb57cf07018e9c13b92c0a39f
+R = 04d0609f06320d69870a3e66f19cd46a2e0e3e13fb8b7785163a7b567bf2c0f437b4e30cc67da288a3b34ce3110f6d87affe0f5
+S = 06c46d0248f7c309c1e5b80ac4b1459bf897e42f8f037031f5bbce0fde50af50cfdc4f60d5ad3d1af152298cfe77dcab287874d
+
+Msg = 9ec5f7d65082264b8a50be772c44277a73ed19199eb275fe5976f9799d8629fcb4a59a8d55074cd2eb2a0e02062d3f7cdeb05e62931a24fd1aaf14c257944d1b42eebd52726d6fe281211b39038e52baae077ea4df89675d860d6ba5a0f998d049614201b872e134367acc90066ac602e478ac3e43c3ddf4b0ca0aac1a68591a
+d = 050245c1682344fef23bd549ac8d1e8e44b2840c43eec1cecd33daa4e9ef6b53f496104d7432e14248682cfd6f5b4853b65adac
+Qx = 0d2f8fe524b2108e375c9603598b555d6c4c7724c7d11039178037b3a4dc82b66c3aeffcccd89cc34dc2b2f6695892323bdd805
+Qy = 1f98df95fc1837ec4d5239cf55e97d6b489b0a8d7bf12c1ccf95f689ad23e46dcf20dbb531f5179e754f0c29c8757a1dc67493b
+k = 0c683f98253406c6587d87c57991fe5caa3f43b451875859feeb81176b732f1c1eed0ee44d1905d41922878617e03dac53562a7
+R = 00cdc9bc7d670a1b6794fd7da82d2ad1a0e92b82ae32656ddec3aca4de75f407f20fe782daa0004317fa3f12cefc48518298d5d
+S = 03ee7c75810c2c05946b53e2f24feaa697af35174402c069b9fb03d89d73964c997eca4a5d6f9482cb23c8ce337a374ffc3e186
+
+Msg = 61d657bf472676301503f6784b7286fb39fb4186bb88abf1edacb4a2693d0a1e2b77bbf2758c84f2cbfd1753e20841b1cd4b456400d53f4d686e666943f9b6ffcdb77f510be97536e9698fc84ae347d483bc8984548d1cf86b9b40d360f9c0dc5bd1c55868e26fce1460ba94ef5e94eb63c9f0776a0f446c0cfd4106d9f36352
+d = 08d3b0277f0e9fe54581d3a9499ccd7f015c08339591326859af969d2a26284e3b3beac4a0b74d324ce5cb5f38c7995e4e3a41f
+Qx = 0ae18564ac04b54769e17df84aa54903df58decb870591dad73dbd712693d901f3f9ad43a71f23b77705de2b4ec1c3bc616356f
+Qy = 19810f92e80560979ac6e72bee505dcdef15b4146185d2f8f5a955a4555523d982c34bbfc1326024410dbad3349e4c4e01c242d
+k = 0e52dea77fc59298cb06fb1401d11c662a04500f0470965c4cfaded13b339bde52f4fa04c76a955faac16784f443b1ad9dfa0bc
+R = 00c917d487d2aae1651d76147de2a706a01c8b3d223afde7d20c9dd77cc2329bd3e0e4fc01255b7c4ed1baae7d26667bc2e9ec6
+S = 0058c766fd514a405de91a4b9e99fc0b0146d954dc2e2decc2f3f066d0fe192832ad37a940949ca4e9abae0602248b3b56100ce
+
+
+[B-571,SHA-224]
+
+Msg = 8e14f713a2c427b1f79491033994f76acbead614d12e73ac6f3f518f2052a10c1273aabe628ab38e0d3d5f8ff254802e9f44a51367bf80325b6fc39d907a37f731372864747b10749ea5cb3d3a83da39c21a7b02885a8c1770e4397cedc958e4baa21d5007569dc9dd1e45d2181709d900a394454090badbd0cd9c2cd2369aad
+d = 0f42afce7f7b3d45f3f925ab29fc3882a89c9f585177887584703cf8bd8fc572e677adfa55b402446fe1e90dc855358d92c3267c35be9674b40c2ad5ce8dbe6a533c44b0ad8d2b2
+Qx = 63dbcfc2d9171a7cc1835c1f56ecadcb59aa6d5852fde264ab25603f06817a20f2787446445be8b2ba05c70fa25d9b9e34d5374febffeb536facd3da52d43d69fa7af4d4792c792
+Qy = 7686e0629de47916af19f9013f65fa3b5f9d196916cab2f765aff31adb5a959515e83fe3e00e91843c532041ba15f047e978bf2fc69627bb5cd7f3ecd74cdf1a8d623c1efd23fc0
+k = 3fae665eb7a54f51c522ad5721d9e2648f13f3d84e3d64c8148d59c662872b5cb7d911c27bf45884f2ef717d72bd0569d9901f2308d9a68d128c042effea148cc963a8252f1426e
+R = 1df705ef13ce900ed61babed02e121dacd55a881ae32bd4f834fa8e362d059223b29ff3db835fa2b2db8fdb98c21dda5ef744cf24d0a798f501afa3a720a238ebd4fe3976a179b8
+S = 1b1e98db422fd48f1dfa049f38865f8bf9ec5618fdbfb50f21cc838051a1493e4b1e4f9ea81156481e5fd84124fbab740421173862c63920e3a833aebf0762e7b5b39a1591d27c8
+
+Msg = 38b60d27ff08fb191811036dbfd5b39e1cc3427ff70efb67c851e9cb407f9fac6f348d289df98d055eec73299fcac068bd0fd9ffa3c5d244659e4f714a58d79f6727f323a7ee26369000e90e34e106f99f5ae2ae1b64ee89e5a1d304ef20c071a7773e9b977ed3d49f467d300a881c8371041394910f9c366942449045568f01
+d = 2f36613043cbf53ad36e2b38998bb867503359ae082d07d040e5a10a43e06ba9c91e7c73308e41e2391b65e634f83b162cbdf4e7a44ad818fb93a978af00f06be06731d8c5886c6
+Qx = 0fe1afd356670e1dc6bc195f9513f1dc6b03017416b5252c7b56153da538422e557d9918298ba6c78283efa0288c0ac61298846a6f8adf74df21747cbe7c18a2b825a330e843cd8
+Qy = 18b7659f0a7e8e7ae5d636ea4d1d5f3a1f846d4bf3dfbd96c6ae874354db6faedf02f75c4d1d8bd6a3b61e70ce58e38ea5de8cc16828f87a0667614f6640a3023b7f4aa93fba577
+k = 3fe351ff6ddf50752f7dfd8e5a72c9faad77dbea303fd97dc939eaad3aa7fed466fc8939a7a6bb7abee63455284a5338e59dc067236dd699bdeeae1424d993a9c76fb2fe9595423
+R = 04a0e13a9fde9f2fef417199f8584d0f60b2f04aa6b7524cd2a2826d63043b2188ca977c9567fc1ff292ed480dabc01589db8734c15aadb4ff54a552a7d9e66829fec1dc919dae6
+S = 01bc7d2c4ca9300d7a3001755ef25231d2852a7b9a3e91baf21f2a2bd2ff305be8a9de1d1bcd7bd9eac4ce12ecf8a91c0a409726085382fb8d2428adf1b42b37b50c9e8e0535d7e
+
+Msg = 21709eeaf9e1953822294a478dfacfb205fc25f447a73a76a32601c00784cbf2f9ebd41c22721d70cdb3842dcaff4a4f208d41c0816990e421cc4b8538ac2f347cdd0aa2a39f1aa26ace8cb6a606b23f6244894d4594a0f6a5b8f6a695fd66e1a41e2eb6a377017177fec56bb58c837e311cd04c5b50575faee32606b9636ec1
+d = 2e74948c46930cbcd9dbe2325539c7dfdd910f309fd610e6599d425aad9ae230a8d4681970a14f2a71fd08030d0a40ff40dade7de1b06a80441bbf7e2fcf1809cff39c7ef88bf9f
+Qx = 1b75f2d281592c288fe6d5479a4e21ef626471819850cbbdf814593bae7e6ce2a35a978aea354649d979f161543fd4c12dae0efcdc2d95e82ae5874b9c04a2143535097b8a17c68
+Qy = 0c7160c2efa3aea1d18afc1a00b47209dfc750a5317ddebff04bc4d181f238d339a7690c24e55be2cb0c01719d34ec986a07727f2e412aa72434efef4d64ecf7c16e2e75ebd7ad8
+k = 0d3ae3d8e5e01ad838a7cc9a4d9b3e41eaf9894aed1d1ba597458391d4a2ae38c5d6efdb4d91761a415812d77fd9ceaebbf1ad49c282e693d71d89f0e2d1bbd94698a47f1f30890
+R = 1e2e9e2633885c85f70208de30ae9b7f72950e2de980607f6d0e73fc1fb2a4a8afc6388206c11b081540bb528a94e5386ce77a2d5c7830fca19223d57c1efe7ac488e69ae07e660
+S = 1250d1b920324919ef81865513db461409f6f8ad82f658dbfccfae4425906da306ba10cac84cf5379b6c1d8b252f3c6f86439413c617deadfad38a234bf2b0050fdabf7719bcc9e
+
+Msg = 3a131fabf3dc97334f212fce41c44300440d16de1d6060450875f7276f53c026e2a511681b5a8d75fc0d578546339542833145f7ee13c708df33e584445a75a5538829286480d339be7c777c03c998a6d3f037b25799ab2d541021502a0b02a9b9c337a8b176c4f30e5b186485a6103b1d1563ad4ae73ca806a5e4daa92e9100
+d = 1b5fab1d36f6f6d559f65d8b01edba610620fc3a38307b1fb1c5bd63e7ffbd4a9098cb8bdf50975a873f5d047ee2b627b090897a7fb5f56d3f4a0f3528179e7c969926fc0d3b0e5
+Qx = 5eb8c5a2bfc86aa9a82830d665296f74aeffa9c5b38750d0ff51d01c2dd0fb6f2209f8ba89ff07297ab9b1b06168757f48cb6eee618a7b44f1b3902187c33208288f35a06665920
+Qy = 5334c203f4ee44fdfd5f99686b18696b3433f203dd148324dcfaa03a0a250cf606486ef11ebcc1ed1839a76ad70909d835a4b30a014104a6ecbb284b33f50bfec33d8b5ede85ac5
+k = 243889e7ad32076a3ea436356eb572c1b4ae402d0218d3ee43927eca0b4fc21a19926eea35c37f09de4766f54e6079c34fb3c174afb953be1aac46d675bd300e717dfc2d0c3fae7
+R = 1d87b52dde9f502f02a502e7a331ca6dfc6204922fb94886efbe3013446d08240f6dba1210a76eaf804562aa92a14d220d59b6310d6caea0274a5e1e8aa3c6b57f239191a71fe3d
+S = 2a5342df6908841b719f80ff905cee0ec3fd8be46396922c3f2f142393714b97128e083907a3a2343f0cf9aac73313279ed29eb44017e2a1cdd0fc86e4b7c536e9f7eb1bbd192a7
+
+Msg = 679d85a762f2574b0b31b516270b7d33d5e166c83e91a0f48e0f3db20b52f42f9e6ee9648cf58267ffe3b713723cf3df52b5fab5c14db1e7189f7cb7170bc6ec7cc71946745e152b39180f828688a5b6c0b2957ab94283b90052a3c6e36843c391aa8810f9253b639a8d5a69aec10070603ad7a99dcedb544858d057a1d66b89
+d = 383e70c71b431eedd4574f65d01fb0304f7744d668408c847f7899eae44770a7f3243109740f177d7146a27748886b7b77ecf3792b512e8d8e37c3bf4ecef2b1253df7066498f01
+Qx = 769dd91fad550980225877d98f7c86963c88be141f91f7a3f1607e0cc6dab767aaa6ceabaf46b65a7c80b6a494b0dac1da5d2fc8c5b07ef7085ed1bbdf4273da3665a6517ea1e5a
+Qy = 282fb94b4726472248f01ee43607f7ef969446313e849998fbf0058c8ad5e24457006b84fc0460b74d86ca281caa174e69fbb68673e1d28ccba17eae045eabc1839870831246a14
+k = 336909099a1540e6f69172d55e0c88a1afa99808005bf09cc803ae1e4e4fbeac2f77f984bddb482f1f13e4430e25e36962b1a4cae00f1fcd7f2c7a17372c91673d8286f9829bbdc
+R = 290055d578012a5b7d88fe2f70581a0fff976756b4581875cf5db07e01f09c0bdf6ab70ffb5839567583d53c68e31a27c3fde12bd4f1e1315af2f742746277b1fb1349141ed3043
+S = 1480c63c8b90c7b51e092597fd8391a237b07f0ff7dbf615e6bdddd5aa880db29c9b9add5bde7e0e81d9a37f852c26f21d750cd2f95520d16da7404c2c3feee1489aff09f298d7f
+
+Msg = 236152ad31ce2ffc0dead3c142cf6c770672cd2e75af4a82fda1a72e1c775cec9b481c6f3e411644df7e7ee901c501405620af4b6e9667dfd46091788daa95ef2c6c9f5c240c06b15cb0df51f5f058d8a7934bd7845f007a35f99fa97200b20f3b5b14fbf1e372507f3b2f377e8d07d30fd3e222f398f26d8f428e320327f901
+d = 02261d4ead21f02fab19bbb0da8c272286704c8f0c6842ba47ded121e5cddef79fb34e6b9694f725ca502949faecfb21e3cc062a2b4c654bd542d9a1fe8d97bdd0905c510aa0999
+Qx = 3ef03980ea9b754b655948da63469fe526ff0ba2c0f572981d02f5693bff620b55b8e9e9f9d553a78a0138072369775c7976f028631e65887cbed62fb447c9f41da86022f4b41ef
+Qy = 4446eed90f2716a7aedefa1385db9f5f803434517fcd80571adc9b7f086c9787b76306380a375668b05fbed30922746fecc0cc16f189dddab676516ed1fe4d02855a34a90975389
+k = 0b309f6c53dee8a8956358df45e72126ec76266d38babff185d4db1d449c8fa9baa4b0651af5f5b0aa70dee3dd55623060097e2f94ed12636961a7c0744b38f2f137bca239f974b
+R = 2b42395206ae79bd9df1c729856101ec3c4a719616701f836c9d69b542b59ce973d91951853f89a0717abd4b929bc69e59cc379c941349dfb4f98d49f9dff572c614242fd370e56
+S = 1ecad482a8eadec6800a9d876a382125eafaa7bbd950fe5f0588126764126eb1b384424015c52ed6a335668506f25124aa78d98ec5739fe282af0c143c07da0fca53b9733e159b8
+
+Msg = ba3f02c4847fae035d747db246fe4e82fb9224ff9cf568a6ae548f5dc2befb2079541d2cf9aaa6b18c281a05e7ddfcdbcefb25f41dd91cb3092b3343e16985e91c912215cd99ae4a099baf628e33a7b277e3c36a13aaef85418fca99f64d73b789f23ecbb76c3095ade0a5f7f34836a98c5be933b44a94a2eaa3f99b1d8e7937
+d = 316c78f289e1860bb623082be9d9238b88e38c5e978a868bb90f776235bdff4eff591877b7f350cf14c40356922b2b6aa51d64990360b2b0e44d6941b5dd9492b4f4e1f42ca163a
+Qx = 6f4137a2c63b6b79138027464135021b034f97bcb2493943df6be844f1657a97632ac80541a3b43ccc828789517efdd9f86ba171c1262a07a6b337bdb0c8d5f018302a8046a1a8c
+Qy = 425cf553554d18f6cc97f0caca2a7eebbf266d57030014273f701562d5b1444240b9d22060ac9bebb37deec393cebdad21ec7f13fe5c7f1752b4261cc2feddeb737284a6eec3663
+k = 1e0321344bf364f1ede39a49c8051f36875ad78e4b080ece9088111739041b121f3f334c6e923777fd716a52be669d6e45f381da11262fb4d09ad66dea74ca115838e19fe94b7f9
+R = 04f24ec978c52ffc7675a09334a895e044eb8eaf04d26c094d7607b77ac4168a02a972f577880a0d0c73f218815e3a7a70c91c50734c08d374a15fb42fd13367dbbe08fe9c2d4b5
+S = 060740270df0e1fdfb8e829c9601b9901223b19d07e9d7d422b9bade88a50fd6d4ec96842afc45900a0107ce85ea6d083d66ae202dba3a32e50c7c3af951cac7acdc6f4c406740b
+
+Msg = 6d0372b40559e075af56af853cbe18ba2d471b0fc8917764abcc69102b03d5bbe1fc12458215be66409c26c89f67c72a8933677a07f88993af6918acb074fa915fe883b24bc3d191ff1b08852f07eda98977e70eba072d8bf189cd545230f59559ac05f1fa3f4e65886d0bc274a6e02e2399812b2bf91abae81e21279c5de996
+d = 2c1bc13f8320d97a82f3d9354e195481902214e16a4fd89332a0499208e91d50e5cabeb4927ba030cb42f5bc53b10f500fa646a8c88508cb0d63ebfce5c4bd574c527d686c735ce
+Qx = 2210791ca48aafed20de84ef9896a9c7584081f850b75884908c7b3dccc94e221401a6ffd982f292a9d5f9c1d066ed493da948ac7e93977dabd7b820bfc0fd21cd8d99c072bb69c
+Qy = 33574c6ce7da749ceb480b4e00bb1a58203bbbca5c16923992cc9767aba5483e4d46ed39e71000a1fe920a4c1c211a14e63ace03635a2d77e72808e0664334890b819b3caff64a3
+k = 2e3db2d82c4b9de2bc0dd0a93c1c5b385f75ad03d0da527a034da2876b42e43cd88dc64833efef54af902d85c568bb8e71684bb16b28c32d80bb3e9911cb1b74be6ec520d99b381
+R = 065f4715e87ca3541ea695878ed5ccb7d2ea6eed5d6fc5ec29f9aa8deb4001cc7c06185d6ab2dde4347344d44f8300a1e92513af4690d713762336d2e6a94d3324a224f06eeadeb
+S = 20104e0767530ce2f4351af4977b52339f34d13e458de0482bcd58ab38ee041c9adc7b05650260d919b2648e2f820407fd60a8d6b4b991b86eaf29c2c4d12d3b0b45cac2ab22c5a
+
+Msg = bbfe66c82bc060bd14fd0e40769d9b3a026eb447550dd9f118c30d8448f725f8366edef042447962ba7f7f833b9e9094d0ff600714697e632626e7d12a592e040bdcee166dcda93952323191021bd12f3b1647d0f25a41739994659dcbb19333ca30f46f539c6f0a5c354cda8969a1eda572a309950c84c7607eb8ac20163912
+d = 13bd80eafa67663e75d7ae139bf285d2b9f1e03d8e32153c73e26d06e86d7acad22bde9f121a3f1ea674dcc1fe67bc7f5398d5e92555056bc046a02b0ba86c2a0dfe32e91add5b6
+Qx = 4c01fef7f2fd8ee61726af1a2d046c7ac67716403b99e021082e96d733368c6c64d046986fb01a6b55cc930517762387eb2fa4a8eda23c700d88065bced8595188760170881a329
+Qy = 189bfdc8e7a710522ab5416182c9579ca255c5009e6ee6604ab033c1388639c0f7aad84642290954db9f4f7fbffd17481eabed38151160457d68ebdfd8695b5035e4e6e06532c0d
+k = 3c5868345c5314aad5ed3a74488a85b2f049396022cdd1de855a0b33c2877f72e871805af3ed8fd7e7a392c4ff63acac6a6f0c431ce7af680984e8c81d0350abe491a01f0f9268f
+R = 0c7e96b9e9a5935ccd51b901aadab6e01ebde44f57e6f0b84e7b58ab4f62ffc0f3f3f980665c581ee3de233ee49d11599529348f1ad3d362837c041cf98192bb324f577e973e1c7
+S = 2226922271fe8307bf597742618ea9c1c271c22c25b49aaa7c9292a81ecce2a55250415ea2ec8ffec54bf0508e64426cb9cd7177265fecc40e056e96cab661485e789f0c435b72b
+
+Msg = b35e9bf686717ce3b16a59963a32a2116130453b161a4e7ceb27b755856add836d779696edcaee3b5c986523891c8836109d431e55c23afbca022437ad19e6777efabb6da3bba1f5f44f905395b4cc7c9210590fd38da621582d059598e5e4569e904358e0dfc0dbfda4ce75538aa97480912852bccd433a9b96c9c66e9597d2
+d = 30834b0a4284097cdda2ada6947c6c281f7290a49b56becefea1e2788ea3ef78fb96807633c47c25138341768b241164ce0d42f7301728b928be2c047f2eb60fc2f844ab77306d2
+Qx = 03a21f0d8e01a64b235cc455c291e3fec8de12682f05544de207d910c7c24c4cd56f3354500d994380ebaa0b49a7604c6233a9aa24934c550c0e609f65fd4073cd6c1ee4170d77e
+Qy = 67c83513e4acbdeb8343b3add40261edbf7c8fe0af7417264830edabfc40200283b92484630741378b997c3f8bed7285decc6ef8633aa804b3846d3b4517e5ad836dbb1df475818
+k = 0031afb24fbc52b01480754837cd84a5165d5f2ad1a1d572b92ab546c049413806f0f5239a77c751af4d57a84786ed1c11bc76123a82e7db3c0495b2fdc5fb9c8720eb7afb640c1
+R = 07a222cddfaea617f1190a0bd88af4d1983d2543dfba25c5036fe24529bbe2e382de89dc1e36c1f6df59c8291d1c4277198084902e5619b64128c265bcf03b7d8cd6b663c225f11
+S = 1ca84c146ebbd16300b813621d503d8c754e4b11446d5ee31cbebc71f4b85ed09c5c94bbdfc3570e8882ef790393234c5ee9e52f7d5b74ff4171d930af817eafc40ef203a1ce613
+
+Msg = 57b5ae7e95c638b258d1e09b3fcb4341e203f5706862e199b103c8fdac72cbc5155e5cf8b300a0b3fb0ce1f897c45f7aefcc528182f73dd450cd84d5fe9eadff3f704dc2a01b4e847c22df430efd1c66b0199f3e5b59348af5386962a5ef25204fd230b54d58d7fae801c086f8f405d3d0aa7a9a9da15c22b868817cd897d853
+d = 0c81a79ced1eaaafc31b69a40d9939f4e484d625db6364a8e589b6b4d336d458b44287ea6c6aa7661113fc07806b147ff98216fa0c08708dc9d651821b922741deda522b4e436ad
+Qx = 25f9b767b8796466c1cc8a1fe6286d591c04a0d115133fc7910640032b898a5c86547f57794e5aac0148996151d3ecbe0d5939dbff5722679ecff378e3f21bbf1354b1eb294d1a3
+Qy = 074c2b91ef3472e60426d2fe182ccc678aa0abb8dda15a428e4f6f1ac401b015b2b7d83535a0a92770cff7666659e1cd33941bea1168cffde82db0ea83668c2d387e6f4bdf28cc5
+k = 27b407a29553203b829a87eb25d6d140e41184634ae1c64c6ec38e9012d0b06a1f4ad9877d7ac4236a22145095990233e6c102a0052ba18cf6e47e289cce4f2ca21514d8868bd68
+R = 02416e11fe2f8e4738ecff1710dc827f4e03c8e7f04a4f52e755f0c1676abbd122eb9751ec1fdf6c7ba04b4e29f8dee52bff7e9e726e28cb3de6f9abf2dbf58c0519ccc7d70f076
+S = 0b96f107a26097a468c1d410bf90e223cd72c5ec98d4ee4ec2e32259d7670d7e7689e62d36549086139f6111884530e20f908d7be1edab75180c81a70ece341f7eda6e4a43a5ad3
+
+Msg = daebfef74b452f039c999ba0528be3bd9e16deb5f46f6eae87b63db8b89952c949fd7db08311871eb2596865eed107aa065f030226ea675ee3256c31a3f85ddf4c21760582144e07af208f33c5f47cc026db5403186a65a47940691ea2d74ffb1245676260ef5717dd879d8b5b72d96f87fef5f762d4fd17454cb5ed83d8a11f
+d = 2f24670c0f77d2ca0266a743023d2c7413d56d0b5ec77b454ac59087efc4ea4d46179e10278e4ba416ffd8c3f9786ed202faf8251c0ef5a9ea5371fbb35b7afe3d15a9cb4bad975
+Qx = 2da72b8ae64c5ee717c33758ec26153a342936f9d41dcbb136590e1303b0e220ee84c8a06b83d4d9fc924b8808de94dbd780cc8243bc4448efd27dfaa1572aae6abe574be664939
+Qy = 3b3a95d962c48a81c48713247801e4ee630ec7956c9989023ba16f02f5bd1ef2edcdd1c8d314be933225c64b7f8a80542b209b944e1f3fab95795ffa134e7e28e82307dc62c2962
+k = 2bbb9abd2732994011c8d294c5342e8b1f7f3c1f5718187e9f75832604b43bf75abad5ddc85e8d92cdc42656cc9f3349afad3f9022ccbb4937d9ffa9cf48314b604e82bda13475e
+R = 3986059f2e096a3675215698e23b53f471c578891f6d721a34a0d231d16348d5bf9853c79c4f4aa94642ad06cb7bfd11f724800cb5477636b6fc0586fb6efb8eb9bbef62329a884
+S = 2beda064eb3ffa1c3b5336613704b3bc3d4ff7b0e977df16477c7e33d480d678804bbdc08088186fbc4764be398a26c13f88bdd23e844be0d7ce598bb87c1b3430da02ae96b3767
+
+Msg = 62af0493ae79d71b552c4647d1fb7ab2f282a91cd44aebd8ef344dfd77b521b0c0a3f72e4513c8ecc0e4b84efef3df9482a07ccc1b740c571c5e69cb913740a792aa231b9dc87edfb72bac188293c6c6e788cb3dff32e8f483f8f34e21ee7efec71302cc3bdbfa47908a135f6ef3ff179dcef26d1a3987f7be967a6c0f799b0c
+d = 20985f2c6fe3ea04bdbab66a8b6167e5969c073b9d53cf3c77cebbf73f4dbf75e601620ec9c3107bf3fbfc6c79f8f063409bf8fe1d14b19e323d857e23dc05157d270c7514137e4
+Qx = 010712d50ba7752962b140cfb943d9e8dc3bfa497bfe81c42606f4da5157656fe2ba5cfd33ddffa0f27fabef8e267688943514df45e642ee0454e05b49f7c00f5785777897d225b
+Qy = 1a2c7db6595c6d4c55110210c564cf102739760e7f5a29706fcb2515d99ca00949d5b4f291716d0aa1e3a47efb9632410f60e2fee1ada47171f902f632bee85da75c7f3c895c24e
+k = 2f26eaba6452e687af452d5e1208fa011e4c84ada92a38f0a204a254641c23ffe1c184fa8bfaff047db590ab40accda408717e4f30811b75cf3a5877ef99279476ab924d92565bf
+R = 1280adcac1c79352635f4165f9c5c1b6e1e6e33bd74d781773f483f637462f80340f8d22cb24c9db5e49ace95a676df3dde53c8721f672006382ff806410bfcdbceda50e53285e6
+S = 07dd52973ef30dbd480047732622fb1b695fe3cfd080264d2aa30a6ff3dab4ab362518c4f3de4fae042fce78c0c8fa0e763eb187eae2ff8f2e79b3f38cc3c1aea897e1f28b71a19
+
+Msg = 566f17851951777ebea3f8285610cd8ee5f882a68e7a4205e6fc9e2d66d210ee2505ee73d6503169f7b903012d43e7e99efa493a8e6ef926b16b9ad8f52156840ab561fc6b680120a88714fd66d1d0742189bf06c155e1138ee5314707173f7352e2cea0fc26e1553643f2490428718e44afd8372cbb7bf5b88234318ebf4355
+d = 2b3d641607b8a141f876f6d285ee46aea543880e772dadd5dd83d595b9643191d9597218e1d6adb081df133304037bcd2c05c24a54e6c4cca64fb2cc4569d6882315360059496d8
+Qx = 42f2bffe25142ac6c1af26643b0f1c317b34950a8a0f112a0cd4ea4131303674328e0bed5d9bc7ffcbb9712387cf67129365b4fa8a9e785b787c170463b24f6a7962c1e003c8732
+Qy = 070962ac4d3220f367f18caa7ceaadcb82fdba45cd2c034a97aab71f7f7546c09736cb080c10d9a95a5f984aa4a3ed32d22636a7b3d5ab29c86d85db59f6f17ba29eb220bb141b5
+k = 23d7021f5376e7b11be07288a0e47b4326c026df80d7e08c9a0fff11deccdadd479dad503ef2d4fa3f0ab2aada604b57fa7e09dbf5c8d493070b5faebb27cf68ad0b78bb6f3a9aa
+R = 3059720e7a2dfff03789e7a514f75f2af5ed18cf1568fa2a5354dcddc9d3c7a90605e9b9a3d0d6fbfebddd615cdd52845ff922873079e06c4f349f7798410ee18e0c69045193668
+S = 1cc40209692cf5f8ed8b82372c95033e4199d378a28b9edcba516820ba21af1bcf5c5df2ef4146b91fd37dff89ec8f9962eecce5c5e285d76a5f03eaf99fa132e98cc40ad66c296
+
+Msg = 25155825fc4f9a1c4dd1db837008e7e2594a879052431f5bfc76d0d2565b8fa726008befaeddceef73f3c60fa2cdf6d9a70e56d27210bd013034b38861ae49640ef208d3fe294ac4362f8eea44f58af3af8a9167a36b5acafb7ec95652d5885a0e08067ce1dfbb45a0c89ad1acb53eb404bf88fa5c3c463a0f912b5a2522a0d9
+d = 1afeb5ca87c81025ddf09c2b2c5ee22ba0105c0e619b67a324467485bd839030d149fee44d8bac6f5902a1245a50c3437046b7c89a84116b2147cddc645b6d2fd24d68e8d53bf5b
+Qx = 119c46988a79e3ae8833ef096b0a1e2886c4b114ccfe881886859abc031df2b1e75818c82be8c5abafcbc5d7b3b8344e98e3f413d737938845e6eab5aec7e507f7baf0d339a362f
+Qy = 3190912dfb5a1a31fbbbb50784b18051489a3cc0f44c42c71d3a54886ecf40507c3240395e8ced37b5253b915fdedd38f75bb26df2a0a8edba865f898a15f2d96f632f7f0638864
+k = 1facccc127c856db1994c4d9e9c76de6bffff81a88d7aa0ca1645e250e07674fba73447911c5b47a1aae815d5e96164854636d3168d0344b2d2d913127011b6434d5a5e545d3bcd
+R = 21da49326f39577ee9f65cee64006525de88a834365a00f4f8cfb9a01dcfd6349a3d06bf95990a2c17b7e95cc0589714b7a795c7016b29bc844ae9031488ca354548976eed68415
+S = 3364def38a8ee3116cbd971794c859776107154234d8b198efb19655647bb9228c7c6be2e703672f795ed37481e994b6764d0b7c1bbeb2bd1db90b34f460278a54bd480bf4e9adf
+
+[B-571,SHA-256]
+
+Msg = 29acb0fca27e2a10d7b9e7e84a79af73e420abdb0f80dd2665696638951b52dd39ca028166b47a3b6a2eaeceb1a11c152383f0bec64e862db1c249672b3770909f775b794e0b9b28a5ec8635a996d912d837a5f22471b40ec2e84701a8804127a9f1a0b3c96ff654700bad3167240c2518fb5dedcc1be9f56a807083e587bc56
+d = 32c97639b69c7cdbf419286d0a1b406d9b1f2886521a8b979a36118d2a368aace5b02dd8c515f2041e6fb9f026d1e82e789dc826a56d2ef732b1bb0f49be2b696ab5d3d5694a2de
+Qx = 0087ff1d8a4644edebd43c2d43d49e140940d215f272676fdfb72ccf58a12021de3d668f2766848044ac404fb45cf6e18fc6700f87aa53b4fac1e35e1731814f8a9d0233e2942d7
+Qy = 29fad3638177541d8392111064837bfa77b4455c21c5f7652e3fb302f4bff4a35b74de8aff3806538ef9ac86964cff755a81cb3002b6fb241ffcae8ac9621b8e034967d650836ee
+k = 16a06e3d25873f6dae16bb2e569720ee9c6ae7b5ba36854c321a80be8b4be502b895e1a3d161b001f6cbcf53d164b5485d8a5efa0476f581f9c79b3a291025be01a435e2fc5ded3
+R = 347138a43f3ed1a1a26f5f11549eb8a41f64aad302b6383879886216ebb6d08a4ce270d07a5bec6018eb313430ff017c1bbf78556436d9255e97aba1481f0f16b85e7320df79d69
+S = 28f35e1aeae288122b043deff9ac87d39478607da60cc33d999b6add6209f452f631c6ce896afd92ab871387f5ea0eae5f6d5cf532e7a6ab44dcf44acb1fd1daafaf1ad5423d8e8
+
+Msg = c92d67cf6536f5046e15b02158da698bcbba4ff1e4e9e9c882cda67f817210402ef917ae93682c9c3dd817b21b73c6c00b7bf92ea80ecbbef2e67f4f4379d078a2b0f297742b2bb9c3fa3297a7e8079f488555bd37715eec92b4b1cbf897640ae8a1d2a0fbcee5423ab31a37629f98630275e35094a896cc574be0a449bb1bc3
+d = 0f93672159276c5a293582b9f49607bbdb970112f6c63b2b3b5d32ad3c8240c86b1af13a8dff6502c6b6a17712cfd988f8cd23a60693d64104143b3f91adb37f852e9e11a0ef110
+Qx = 19dda59a839aa2ed28f69a62a3e3a753c6fc789fe0d8551bf59095f009d0327386e6df5437846c6803df2442e0359a367d04f117e3965397576d4287398b4b8c92ad278df4a447f
+Qy = 4159ced60503f7cfcfcd587bb3608699f54693068101a838d575715de02fff81058d025dbdda430e176f60e423e6fcbba889914f6409ce51d51e89e4cd7bbde6d24404e5b043e79
+k = 10dd216d4b3da2fa6a75de60f722f1f128776741cba002c055d1445581242a175318291fae313eea11fd905b20d26cec845f57a3d5bf23ae4dc93d886c0594f1cf7be4f59f3e3eb
+R = 128d5c00a48c7352eb980d9c80781f8abcfdc1ddae415b7ac94b4d85c3d7d4f7316e2b3344ca50c6ae82938bc728e640e59e2d733f0c7f7025e66c15c81e98a845c1ed4843b589d
+S = 1ab59ce5e54bffc68fda96c920b839fe03d1976ab36978bedd973715ed631bfc8e3edd100043ac527aeb5ca121da848bce4ec9799f55b22454e9af32848943058b257e815b04056
+
+Msg = 15413f614c4551e3b138b64f66d15f8964c40326a42b0afce820778eee4a88edb127fbf575da5263e5a2627b5461d311813ea868e6417615e7c4938313675009caac28bc7a2f4c0bc37572d9bf36a3b1794294e09c0121ceecaa4b916df45b0dd31225415e6c87cfeeb092a008fce2c543cd62365779ae28f29fa02a15d9dcd5
+d = 3db080bc99c5fe7e06d5032167af56783cb423fae59fb5b3c6bce5fbedf56b7b39b17810e48ea9a172881aa1f42f5e267349b60294d4a208b4437666b44abcfee5a1829e9467908
+Qx = 59d1b3f680da784b49dde3b361eee819d67339447d7bdf7965550264eb63bcc7674b0921f02e15d45466dee52b4c0a50c2bbbdf226af1662086476a9eb1236e3d4c2b6219af1bdb
+Qy = 4e3466200dd6ecbc268cdc1937ac5123cbe33f32110cfdb8b7536987ddf5c9ef2464d2334f315b9b489cf227a6300b6e054fe40d36c057a692f2fd3e762624069e2adefb65d24d7
+k = 37fb32a902eae0c5d7cc9f9018a5d1a906a3d1b9adf5bfb696ff63f105cb2e736d9bc1961677fc897fd3a9e9bedd370be6f25a03fad425b5a293c66180df78db33aec4a188d3db6
+R = 3aa8ab9fc9073429e52469088aea91f00cfba271b9dbb84818460883effa0c51d6a48c1905d6f58d1312af073dc8735c29957f30324b467797acf86e028410de016338b972013ab
+S = 198a746411333172daef76359e7ad23035a0f5d14c283cb268828bd876b96b5f767e0c1e2796def7a51429f39ab2332ac25d8e4f263f8dfb9c4c98da2ccc398fb3bb9a6b28ca28b
+
+Msg = 9f901557451ae2f8ec79b6d4adc794cbfd9b2e6d28f19409532d91682820205308b41498a4e1ca247a2baa8da93de95e3c0f7afd6ca46bafdbdcc6d3374a12684676a50988b86a960a82180648c8c1e38f8fd9af604c7be3be4b24799f4544ac96d6360cdb83d1d0847fda21642934fd6cf65385b50d86d4656987901fb88d0c
+d = 06ee767f6f36bb8f364f324d8346455c899a49237d759003dd52cfa13b9baa4c71347b134b24ecaee32d247c34e3787a0c64bc5d299b55c86f64b47521d22f2c09db225b0c84cc6
+Qx = 3f971125860f4598fa310eb7a8c6b4e0c31bb721fdc17ce6df9af557beded6006b8eab10ebe7f3c4f3d759d4a87dcfc1fb767ef87beb1f5c845e3f41503a33b28b2b5aa1644dd1a
+Qy = 3296062514d4e89d2105dda5bd65a315b9770c45afe4050d8c3d15001405b1e32be5867ee90cafbe4e239dd44d030b4fda855182f1fcf80963c1300cb842459aaa8c2827371876c
+k = 2b247e2dd0024f534ed2797110df6ea4ba166c34d91c94e43b045c0ff80f124bfec1cf3be3da7c58389d352c8c5c1bc2a2e876a7e56301b1e688a085ea0222697fc63141564365c
+R = 2858eadd14373aeca65ee5a2cbbaceae4b54a50e0941a696406dd86d05c07c5599379c066b2288d01b2a43c9ae34bcb8c36f59d490aa8d066fd3d7e539ebc620a7176507ccfb232
+S = 33c20d26dca20af2c56982fcfa6f085bc5c317d01f3b1dfe0ade1ef6e3e960b18b626d17d6696c936f04090ecd9606c2a6ecea1cd1883bbbca8b3dce3b0acb2688fb2834aaf922a
+
+Msg = 959fe5a19d7aea2ba611c7203e19f8e3f3cc101e03a98f91adfef602c424c580d5a868659368a930f9883d699fc633bd07f6cf8de474937db0bea86fa7cd140ec2f202663813033a757b93bd72afba15be5e47a4eb93e8a666aa1c72c241ca3922547d63fa3732fec54afea7ade84302e2f044275bb67433fb6b125b7913143c
+d = 38e2571d9f22309a636586d62863ed67a70538287f3ef88b88c3c2fa1a2900d48c342b6f15c26b8e7fb4875cda4093b7de7ceda48fe1e2cc2975afe958040881de61f309931e48d
+Qx = 5a221634ca85059543e2caf8bdf79c43bb78deb35e9c89e07d553bafb6b31750a1d85ffa7689e528c11d8a3dae442b4fb2a4a21238d636eb04ccc04c8b5d794b0a213fe0480b1d2
+Qy = 225ff457b6cbc12d152b08025cdb7e1e921ee553add9cbf83228d678d5a9f5d3d1fb4327a74c1dcb5d69a5b98f3ed1aebef0af09bd49d253a903636ef5a66844c500fa221470f2f
+k = 3b4de49d57040141f3584ff596eda457e2835085d350b75391d90abe728723e1d1ac6413979d4fc3eba98d72a01248e6510c722df15df876da881ad50539e4248facafcf311b464
+R = 00f259038b4d3d036bde101aab29f4558e88e604c62f967bc7a35eeacc6a56294268f8ab00a34f9a0319b07754f502c98718e8b5c91093cdbff2c8496fd63d6fc2c50a35f87f423
+S = 2350d5406922e8822a91f7c95cfe8524f017a14cf7174ce534c60aeb351510d06ac20dc1249129247b21c72c14b02b710c26c10899bcf995143aee632e294176e903645b660e998
+
+Msg = 97b9688d9ed5101b8cfb19e84b89cd644262ca1c7ee18944e29ddd3b4cca78e06338b270385b00a5e8b91ca5e628de3bba50e36ecc695b3ea737a9cf8b36871c473a54ba17819f49e730c0f253b0c769aefa6c16366fd2dd612f330e95fb119fcf3bf7f3e254438c0ab635ec04a8b2424a05b483ecf65b74a93636fbab7bf1d8
+d = 0c8f5736f1ae65592f3ca850f43d06441aaad8c03820f3b08d8a6db46488dcfb828459f8b3f34af73cce8dc7a5e3834e085a64523d890028e194214cef4003210e6eb530005b01a
+Qx = 667ce3db45b8772f717ce20755ffaba968aa1314d75c84073042436823fb54bf8dda34a6bb45a61d610745b1fc10eb0eef71c4f55b26acceb442d822d6e2a27761c73b740f47289
+Qy = 56035da1adaae894e361f5283b3ea07b7d9f64a298be11de9fb487c2479b120381f1c60cefe5d32d37e4644ac86a170f82b1c4443eb71b940b21c7a016b559c6c79835532c276fd
+k = 190468668989a607a3aa966cad071ca8e8eb152b0dfca9205bc9417a3d612ca1105c7b90340b04acd96a5223658adda16bf6b598ea9f32a2f8d1b61c2c2bdc08d6a49de246240b3
+R = 291e1fb18edb7a93badd6fab6f56ee0d390f3b6d298e97312d5277358511fc7621534ac035f3518cb140fa4ad5ef7d889c0d5f3f52a4e4d06bc9f647f99695531f85a4b76cb1184
+S = 2d916734e02b0a98406bb5a9723486a7ed40bdd0b39c4cb802af4bafd519803d23c6bed59a80c256a14eb878229942f67e0b8159d5cbf24b719043171b3958fd669adfc72eb7289
+
+Msg = f08b250bf4a3980cb455338b3f4173723b3f44c97bacc9cf550149794a71426e398cb4a74bde141d8b7b4a72942f1c069676a9918e27792cb8f085ee037c78e3c468adea5123c4c64d8ca6a39f2f90140c5d2d80b669cbf0d1ccb466b18ded83a1d5f042c36188a04111c34ff769abba9aedda40a87be1e24b700225e2078056
+d = 1ee68c3994adaaa9e0d61bfcd3bc1cdf198d3fbfe28a44e5dd518867ea04b20e795eadacc48bfcf8e8216dceeaa069b756e8e99ed87b6b1d31154cc9310bc3b4555162a890b0c6c
+Qx = 3efc83ad15d9bf889c9afbd769bdd1dc8925b0462c93868d85ca7554b540d8c3ef7b9a63becc85981972eee8a70b7f948098ac050ad594ef2ec249cc3b557844bae9cb2cacbf397
+Qy = 42a012b3a1d9e46cece4fc3460a2bedc9af4ce0289e95f69550eb3544f7c105b5769fa52234ac88f9045ea5cdd4937664846d26deecf511ba6996ce4072e763e8ebdfe709660888
+k = 031df03a6cec2346b92d9ae7d3d983edf577d9a1bb88098f886f38536d8d8cf25def57726790604e674d036cbcb864bdedf8475ba9c850d510ef93b844c037e04348d5f48098c20
+R = 112dcafb63bb125d9610e59883df481bfde43589e46656b5952cdd72238cfbcfee79e9165e3c9b89c9ffed12d303225ba2af19e00048e20e4edd3968807e4885003d148403321ef
+S = 2ded1456df54a24214d8c1d3fb314db52b046ca31458bed69bb3aeb6a9ece509ee521fb8046ed43accc7e605440a09fd96db659c98a7dd606758c0c47e47acfa326b9ed73ba4b28
+
+Msg = 1cabd16fc29d7d919622810dc8b23c770b790b98b119eeab1b20900fa94fc2ebaf76be4f5eea91fc5276c5621c8677d4d117c4a5a782ee2ca1d5b0db997fdc8a05b6b3fbb833d7a7b81c3c615c2a662929760a96feefcf89e46b563314c9b77c86bf34438458b43b694ceba741b97dfcdacc0ed57652ae62856ce10ed2690770
+d = 3a6fbf66ebc1365ea7699c72cdac2dd85907ec59cd26e2d18713354b619ccb83b7fc0db9193aa8493c1855f1a83fd987cbbb65de17c59fbe79256aa5392f4eba045346e9ba26592
+Qx = 559dd556241f9b11d0f91c5458ef6adb783f9f5051bc12cac9f0b214f836f7b149d00ba8218e873410a50445da9fbf68673f3282d783988981fb221d0579341892ba6824e0cf4a5
+Qy = 05dd0e594ce41122882538e51e9bf29d159fcbb8b29b97c5546582390ad5c59c975271c58ba1e75d70c3898fea929ef7316ee830eeefbdc69bd80d7b0e8133b977cd573a3b422ee
+k = 1c5a193179ab859ec1166575007c3cacb30d31f341a0e82ed6d4ddb32da909dce08acfa10fb14183258caa743010fac6f7d0fb1f8c8f55c246e49a97f2bf571129144c23de8d68c
+R = 2625d0bdf37396585d22811a12ae7e0c3f512ffdd0bf4d048379434af46c03c6067dbe7c271c417ac5307123bf58a9f2064bd2b3a2d4b4efa3027959bfe63e13a851f46a21da6e6
+S = 13f16b211b314a7e9918f3254da2f1aceb5340713985610f03ec1d0a33ecf9217d61076eb153d8f27aa31aed3c9b165be52f8d857de362b2c88db5dccfd708a996a46b76b4ebd09
+
+Msg = 7bc8bbf5ebeacf40b3c82eb6eba5d994dcc6a3f2e12ef741f90f90e176d20c21e006ecdaf14cb5beef35bff46b2c374d9ee224516679b1a9e9255cd8ad8e60ed234f8ee7e0fc53c9021488158217d4b4369cc597d6053746efa1e73340bdd73c1bd2eed57b92426fd4d278d6a86e8be0f0a66ab3dfadefca8831b2f488636251
+d = 145748871a0b5c1cee628de04a12fd68ff2b154fda96e47afaa96389d66d22802968584f6753d36618d49ed205260f09d3f5ccc2b27a34390ce58179b9834ff92a86d66ea0a97ca
+Qx = 6cc7ce2782dd67cf1fc16f1b24ae46fd085b969d936fefc409a9bde354cfd33a154a3113e837cfb88284d75a96f5fbe85274fdd0990af4a033a6c40b904a5e0f666e4d8b8bc3532
+Qy = 7adfea166087502657bf9e2c437beb2f62dab041553a06411f6c9dae83a2a2749a4e5a2a36fbe23d40816b1b8d206b9f5cea20ef200b9150061ca22fee2076e31c88d60a006ef4c
+k = 26c820dc92f97dbf545f51db7d5ba649333dde38eaa47d8a7edad9a3cf3e6780442db234632458ff17e1d7b70019916708c128601ff547ac84dfb0173cf0a3c5d69ac96c3d7d395
+R = 338c88d1bbd0b93f3f1fe1ccfcbda65fa1667ec471730a40eda87f57b3eb63d979d8d6d819b974619799c90b09f33c051b8b522c3a1acede101857265ce1b58cc7eb5698049f494
+S = 3637bf89f9b66c7ebd8f91a8324eb70a510284b39f0f2e45578f26f5f1e4504ad70a389427f4d58960cbd918c2f8279de52096e25a1b0b0c3929fd5ef56bab6cde7c0d8e9d2fb30
+
+Msg = 0cd2a45392871c0c262e7e6f036946354bb41f9c2187b8c4d399231280682f3e0a09731fbfd52c76ee63b9828c2d731f4cefee0a8c46419c398205b2ff80c67d7756db300a0a8385fa287dd37d9126f75998ae1cbab5136560592118db52fbf102b7ff0a1ed45b8a91a7d99d13a0f7fd4366392264aa1248d7324901467457ca
+d = 3c71911d24ad19c20fc1d8a044d63c9bb417abc3778d7e6234c6af79b898cbfc2f2787244708d2fe203be786edbdc4c9b12b413156b7b0bab0be8af895d191d853cd58aafe1ccce
+Qx = 6cc47aa586a73acddbc91398ff5782457e6da2b10e265153c678789d3d7fcfc485b03b089eb67e6d6955d5c8c7ed5f933d84853576e76fc60332e5f0a62c3ab23690317bf1b423e
+Qy = 15604d94ab9f2ae1d74fe46b1a070160513709de2ba8e74fbf9922e9bbe7f6e743b25701a13f73eae0db0c98dc80c5f8528e16610fcf18f60eda3357ad5878add2554a6befc9d39
+k = 3681fcc5fc1f0d7d413abf2e44cb5cce9a4a252ec449ec4f550df4a172305eecc072454efe2040aabaf4fee58ed19c9090061d3c4835c5fec38996f013e5512c0147cb14a4f0fe7
+R = 0d3c26796bb86b1a20ed4935bc3824bcb9742513ce91a66dd523a3c0d8a5abe63488aabb806b5b113e90d3f3c80e3ffa01ad051e6b0d4edfc641689953ed65fafbaf3e554be31ff
+S = 2e3129ff95b06c274f7ac08882dc1da6660269f3dbd21a3e48377a628f6d81326084bbb8d32b794fcbde8e574f853636fbbaba480fb36960b0994210bea319a99a46e29b79217b3
+
+Msg = e97092625b09c9ae6e152e1cbee207d83361f34cb9b0e727c816a5ed851f12f91fbf88ad9d4c8f9d07350f5d828fd8574eafc768bc72a2b18aaf4d2b48fb10f7c3431137b51850154de9706487d69a40a8f4cb2c799f48c5d8f518aff752500de93cbb94ab04ae1e0c7183a32d79a27291dd07b5fb6e6a4fab76e85c3a8607e2
+d = 18bd74698bac36ef11add6b3e3fad227ecd868f370ec04569462565d2f0af2340bf793486953a7b79ab04f0ab1f0e4fd16bf6b576cce677d543e73aa8edb0e50372f24ddfbff966
+Qx = 231f891e63bc1c43377faa56c5799eb1c877954ca2cafdeb4883ae40bd78816ca5634f48f5ef5c22dc7d3d0df208bab4149815274d7b134cadb700d166a5e3fc73e9be1bab72522
+Qy = 469ea29ef860adf24afdd386347763008ef6fe2488d902c4d513bc0183fc52742782a6fe500d6b581902ccd4f9bf077f975bd5fa89bf240723b99f726c9fab4f953380745ff9e17
+k = 1590570de563ea96eddd900e4a0a7efa2e4a0b389854e96af32bb7555f098a8cb52d160abcfbde65998c34f91338a40d40cc03e4a9a241d3b16b0e893d3f7ffdbf8912f35c7f538
+R = 32402fbee4831b16d762ea2cb218279f4db5e20bc8b6e2e53e89a2ef3646cfb0abbac36116c8c708a1342db2fa0abd39d149e09db57aef65ad8092f37f7962f98c28331f0f20b64
+S = 2d1e38f40965e2697abc7df5896cf051ce5646f135d1ea0bb470a43250af8df0abf2a04ca1e0f1f31013025b4136a8a6bdaa474bf50752c571f883829bc3a5482ec20e2b4a72c90
+
+Msg = ae6723b8df5d6ab5fcfaa22d32fdf106d211514cb1892c7c43ca6cd85c2532f85929c8a259ed251215063cf92e1502528d1e22d5cf67efa0b8ef21e8eb2f5dff881ba1433e8bcf2b6af8742ecb2bccde081e534615a305562cc22d3398f61f277d8ca785842bda85d8a40438d9bf1aceaedcfc22c85533794a69cfc320931d3f
+d = 335699bfd058ee2e6163f55d1816bf3669acea8b73be9c4ddfe775230925e6093cff7a66813adf22222c8376faa106d85ac9f3c67929bc58d8986795b6d35d5b9fa546dceabbedc
+Qx = 7995e02dd3d40f9bc2e6f4cb1c0d29923c9022169e64532d1b357f36264d18059c44a8617a6f1136e72648c9051a27714a0dc833428762275a1b5635a3ad91e65d2713236c20f50
+Qy = 6167d5839cd4476a638c50db218979a93da44dbf97281d90daa8b9b530960c689279fff6c342af97880db1e9c5ae57b91d7be727fd1c6210ec59416d1b675f4dd666e0b121d144b
+k = 3f037ebe0e4c3910953e123becc09c0862490e7f590245c4cdf9ea5fce930a7d7ca5d17f5689edae1ce706b90efdf84cd82e06e4ab95e9e2368db91d50110eb91cf44e50cdce2cc
+R = 2baaf025290897a5d68c5e63543256523fb086a6f1166ddfd3d50fb307e0f0cf78b5fa895f8b71944a7b67b8afe5f3e10f2d248aedf573860c42cd7aff258055ee7cce472e8efb1
+S = 0f4d239f5af023ff6c94ad7f66d43201c7e40262cd92467c4ab54be8d2b8e6577d14375064fbd00a6327da62f03f75262392add0ec119d820205065aa6238433fadc8d1734b8481
+
+Msg = ee20c6b61886e02ed94359dff3559522ff550ca126fed4b2240ea7d999a182b7bb618c50528fcbd261d5e497a991fbac0cf4c105c0f664d6a00a9001c1ed522962fb44dd4159677ce8f1531019f86457c055c9cea6247086cdfe0442485cbbc4386ad002b4bd39a1a187752437f04569705cb7adc0c68f0fd059d946deb63f0b
+d = 2c3eaf801330b3f1b0504f2399f1d24455db29911f750c246ba0a134c3b59da8b3562911197764699a92ea1d95a2aac587e24f743df1dad3e1cf7edf955203e24a0225717f8d2df
+Qx = 703d69e2dfb13fb6e695b0b30b31d89c8789e8523a7eea15673aeb4f1909192c06c27558eb55f0315f395b1f3ce84d9c304905cfda1d119bec33af9ade4420de2edbe75cc5460e3
+Qy = 75e35b2d6a8550969d49ac5d656afacf68d3a1dc6d17666f46ce3413c855b627f0891912e373af2ba91211c20f067d66056e6bbc0814ff3921d944008b25d8772cc8d696bfe1d09
+k = 0a9ebaea478893aa0e3bbfd5d007bcec5ad787d9bb5a8e9b8b79865c584966f0bf040d36f62a8e97c123d2adb7f38eb49a86e9c2ce1294d04fef1b6fec7908c4ca1a70bd1699a9e
+R = 2d495eb5f6fb187a0ee1fa772ccefbb969e854abb445ec19ac3860f40ee65f53b92f6a797003574bccf0b9de8014ad4e5745ed264eb3ae88040ef6518809b4c66f691d496a85d51
+S = 1840b2977ff137f2a8f2f7c25e347cf1262fd128e008e30e4752315deb5231098c65e9a585496a9d6b5b56cd0b6d7dcb7150a077fd199be2d2de0262aa84dad414e100ac6162346
+
+Msg = 734a9eb8288e32f5a67cc1d88704523ca2c68b798d90e188d871d9f50d2da2063baf1ee6685c45832a1818aabc9afc0bc935e97969dc983a484f16d2bedb3c7c0b8221408be2480a5562d5d1e5d8763d1e474bf2826aa93a68c3b870e3bf34f4941cf590d88e1f5a8cd782a33992213f3f6b4b4f6dbfb3c3c8f21f5eaf4ef609
+d = 1c3ff067497e5d387f31f0ecc9c67b3c0dd6ec8c81318c492aad83c9dec6c99e4fa47447f6f7082d636c2591d0df940b947d0a4ae3778e2b7cc8fb92214638399def894ada276b8
+Qx = 2e56655e37b3e753f35eedca95f8ec07b7a3d3e14e365ec041cd9003bdb78a7a8b8ad277a67da5d63dcdeb0ee8d8efb68fe61aad9b1fbef4373ab13c44efacf68cc499faf5b5dbe
+Qy = 47bbec643d74874b77f0fdbbd2df3f3ff0d35f4b3e1534b2c4d5c76b8cc51693a70e17d1d4cd64713c5c05966c826458fb5411ac840ab5998bf3cd64a0769c3e075259a70aaf94d
+k = 149848f4534eeeb45fc38ddeace59e8f83f0bfb4cfcd2b8b7acd0bf19303051a6a8fe75d4cdec1be036645beb075c772aef4a58785c16d984eb43b9b0317446bc3b3abfe7ec2cb7
+R = 17eb68556224f995733077501ed295088cc1184fa3872f5f11e97cf67c7bc1febebd31206a406c4479b60246a517cada5859d4f1aeb98dfc108e96e9898c6e71e59e39b6284895e
+S = 22904497dc7a98fbe117e4427d74f4ecfc4e14d4467c99227427e3abb8d3dcc406f3704a7783d822ec1118a1d91d5945d5b902a2ad325bcc9c17c68ddf8b5323df9c2bde392710d
+
+Msg = 68e27cc72fec8f3f1f3882c6efa08efdf21d74d13be5171da35ef2855666ad2ea6919d21dbc1cb6d296663dcbceeba2fe47a2c6507d3d4a67a61b55b0f81c93412d7e1fbe15a590e342a05f55daa55f8591171303154e615e81189a523b855829a5c96621ad118f522e397e2eea05c2603eeae6e3591215e29b2289bc384d8d4
+d = 04b4e04281b210fe78d516a5b69f878b7fa058941ee9ae8cc63b061d1eb9e12c3e0ecb8717ff4623ff5bbbcdb53c48adbd9c69636506ab929c5507d7ebafae5654aad65a263e48d
+Qx = 538049d071158c62f0102fb664a47431afe320474a173463819d5f83f6737b43880ed378470d774d32ad59cd9d75e5bb06b118f1297af3f6fa910f40aaffe11e46cd56cbd29aa51
+Qy = 0a4a843af9841e2427357bdf26817656637bf4650e443ef303dd458ed092dca3cacf2857d10aa190c256467ff834bc804f8557f6c3bdde89927a5f2bd55bb9d9f1f08a044cbc208
+k = 1191110485f56335f0e65fe04b9ad8fac1c3573cb4690db3e9f62086312d394b0e354890c0f74e3df7c43e718ecf18caf6904e03bd6c0912f906de1d2bb4c49823bc6c0dbfe37f4
+R = 0dff371ac365cb7de248ddb2b2fdee624c527c6c1908dd287a294bb43a4be94c130bfa83710b0655f21695dd91703acca64fe2e7927eaf9c2b9b230de8002798224f9505379bf34
+S = 2f30f31c863bdd68fae16f97fba756e033eada18cb0a23d7d4b2c9ea3c832e61b52185fcd654d9eb281b92a9b102c3b17ebf02422a0e4a7a56a73974208371ef65434c38f4d7d1d
+
+[B-571,SHA-384]
+
+Msg = e67cecedf35058b80787589514a9c81c6b9f4bced4260411d2af75bc46b8b2c962dc9d260dc99ebbf8ee64950766efc0e394184bdc8e2891d66bd3300ecc880e9d6a3d0eb615322378afc3dba89938704e9a8d0c949d4bae9838805c00377e3fe5ec6a1a98ad7eaaba6b500973dac48b26b7fb2e1b9889f8c387de535d4b2363
+d = 30f2849a713aeac95fde5ce3af853e9d070ee60709eccf35a076567be2c43f0fa34420b0fc097ff577221275a3a56e759efc32183be2d76058a7d20e5dd59f00415114d73a15b8f
+Qx = 6d4ed3cf180e0e307745faa49247f269c3fa0a69042b3b78ad645f43eaa50d479622e27429a6b6b1889944f85975fec8018d3321ed38f6c7d91f2efc98467a027ba4a02c7f231b4
+Qy = 5f2ebf6abf7d53fa32865a9b6ada9bee51c1fe26cad74dd6ef78f13872f340d64170031becb5073001fbca373be4e32ac3425d705ee942e6c4e639bf72379e34776680a387a0c6d
+k = 0da9d8647d0950f558a3831b47858168b3379656e603f2bd44046ac7546892d1a7318c5a9873c6ff85683edd3881a0f1af5501d17939f0825ed37bfc9a2d95faf43d3be92b237ef
+R = 0fc7eaeef74806606fe51882c6928a06bf552d18dcc4d326d44a540abb728146657048b20e5fe2868beb5f04f32d43e9ac23a7f22c6bf325bca24f5e3161c868911ee61baa8a3c6
+S = 33d63693268f3762635373fc901fd72e525965ac17e2cc009177f03bd3524107b30e4c6d80bbc4f87fb1f288ed56812994541fe063f1d91afa7213bed8be5693dc6c17ec9a0714f
+
+Msg = 2baa1ac3f07e34b67b6af087400f261e138b070c8475378063286c16fa73578303380236a4af2484ea01ba56c1c619f6ae4e5e6ac2594c8e5aae7e7f196f96fc5d0f507bebedd4d818e77b9120e5b4bc01c7ab6339e88b71d0886631cc7fd89659bf513faf149c61eb14d55060c8dfc7e6e4c2b4ec8edaaa6bc36eca50a6feef
+d = 2ebb73d04e6e5361e20629e3ad119b33db5163ed91fd9a8aec4b774898784b6822a08992118a8fe6013094bad0be1e9bf01b27c069e4335bff7e0abd28a10443818f6b825e9cef1
+Qx = 01710eb0167e8c948d381e3a75aa1e036b70c414f69260aab434ee20b6724dd7393fc487b5b3822e5e8065b06d0785a4a7be7193352d5b9eee66755ba106ba6e40f98a08c730a0c
+Qy = 6006f98fc25a641a7c6e67fedd37aaad77a9102be3e1e7d32dcb4c68029e623a42f4ca7d1ea725bfd475756b80e18904107c460fc03b9bd68aa46f9dfbd60618670c4d9a68a3287
+k = 1861e2a356a6fa8096418cde7fa17f1b893a7b63810f3fd807a82bf4c745aafdc4963eb7a0ad0488a776e915b64d2b684e46d244703eb63b77835167908f2d6b06a2ed7b53f0717
+R = 046688e12d26cd96bb05d3f418d8ec34f4426f594acd2bfd8e9abd79405e612d60737007440424bc4f546c54b7402d11880f68edd996f49277b729450f7dda5d05986b014b5244f
+S = 341a80e74f3a69b966ef81ae95dbdd60ed5a0446416653c4df431ff7c4b4272665a523379d76725e9fbe196018f0e747100084c823b95d7c7b1785d3623e52e9adbe773b81b49d3
+
+Msg = 0e640581f573068d8ebd2899a6aaeed0bf987ee11e22b05d25e88e9a1c3451f45ee3800d976f4603c18a041febef07a01086832a6f7ecd5d498d52e796a9d90758c87c36f4a5b704a39c456aaee2d5278183d5815d619c193da9fbc427d701bab0874bded848cb4bb066f56e119b637c78aeb6eaa387c41bec6cdd4bf7b2061a
+d = 1bfab717d6f6e16d9bc6e89d2ffac7cbe0f808cc8ca2eb515af7ecce5f3b230303775710a21bd25c2cc4566bb53c78c78e3774a9f306c751cc6e149929e45eef60f56c1d2388c6d
+Qx = 6935c3e8b58f7bacd045e745054c227687800ddd86d6e0c8b1e426f4df0e4b71feedefa9172c43becebbeee8ee382a75396fc5f29ef3d2cc55f8afa9232038609b5034513b222cf
+Qy = 138463efe3b32259dd90b759062f848deda84f2bcc0d687c410f1ad2dd745517c96c3451432b1e490902208cabb68bb872ec493eabdf1f3b07595d23a54c53e512777abffb7fc65
+k = 00025bd48e2dbbf1ed8bd9c1514303dc503dd0799c7815870b902249cd1d7368380853d36f7fdefad973700ded1e0d66950181b0aeac73eb622c880571315f09504ed26e28e85a1
+R = 1b9d6ccb19b208022d3a579a66957429682517e84a71be42fd571fbbd0247609d0b5b33808189efb52d21e6421d3b08821d82900577791b1c54e239b0d908bfbcdc060cfedaefb2
+S = 3356320389ffde577496c5b46a0de6d53005f5ae3489c0d292c5f460a3b7adc5bd204bc50a3bcc8538e0f8319c79b9024b065223b7ed9b0f211c5c224d363f5bdfe04db97f99e19
+
+Msg = 51a2a560ba226d629127ce1ea7e812219ceaddd23561256331458c9f11fe73990f21d0dcd974a3773040090cfdc8e0f01692d951a0cbb60f8448a016c67abf46a9c150466ac77e656ea827b0ea7d1e77ea32071ba8314fc8a2edf69008f498bd1c18061d7d00f3340a7e2cd73e9766862378d8702e804a1870b442beb2d0aa14
+d = 00cc53bf7f1cad5e3dede4b4f4b082831604c92dd2b147869cdf1107259305b1d50359647f9f3d7d4e1e608865c65dc7c9ea46bc324dcb8423b554dc369d621743cbfb592b70eb5
+Qx = 20187d7de90652caf1210703ef65cada3b88f978e14ce6055847be7127602ba7a5391cef0fc9b009134105da7b09b49beb7ba2f961b84e6d66bd818ea99ec106c6e8428b17394a6
+Qy = 197aef36e47b571ccc0b41f948392d6061060063137d8c3b999ae507b76132fea1563775be555616cb5816b9b19e42b34f9673aab833f4beb9d1a0848a4bbf2f6f44cd03982748c
+k = 08acd0f8f9660d21d62f391112908be73a4342767328d3375a8806dffd2598b6d77fcb4793e69f2390389a78c2b11866cf0f03666a60ad088d2c77bbc49fff6efc5b7283d02bf36
+R = 1004bfb78dc0e4fc0f2624bec6893d717a476fc76bb5c1d94c1dbf157aab5d1dc80f98a3aeabaac94d9cf9e26e1dd172f5d8fcd5b2d48cb3b7f0a4863813357b5cf8eae84478e44
+S = 30b1c8857977181d12c53cc2efc53a427801cde2890cf2ea2c99c6958b6869d0ac78ee2c846c241362c885835af49c47d20c30f3cbfab27d9cfeaa6d858694bab059229e30bf845
+
+Msg = 90eeecff0a2e37df318c441df220dfea013ef29774ee92a56b213e13a798858f31e52b6ccb7599e7314f12b48a89884b113c1ba0526a54f3e9a33c940944319e084bff320cf5f391c02c731c4c4f8b05afa273374a1705d6c85337782ba7d36b9c00767180cad6422c11c581672ff631fa4c49d41b02481568ec87ea97220400
+d = 2b009530cb9d586e35dd8951ccb686833afb7a37ec253e547e85b253ba999f0f186b6d4ba41091615fe57678e9801b4dc94fa683511da25637b2acc9fe60936be15af16234c4ee7
+Qx = 5913ab6a2287d946b5b6d1e6c3d64117e085da7cf6388e333cf58d22494f4b067c684dca770ddbcea5db73f048b296e9c17284a8912b3cb722d9eaa17b6b1209311fb8e8757cbf5
+Qy = 007124ac6c48ac56746563db247bcfe6b20215ccc5cfb1d43c923daa07d429c8f0513bd1ff1180ef0f7927fa23fda1af25d20b22c935c426f9ccb402c358b57b812516c43111779
+k = 27a80a19e9c320b57146845fcf97d6debcffbcae877c33c62aec62a3351ef40bd90ef4c2ca39f9e51086931d82eec4ee7870365cb14e9c54ae735069801ef12c571bf1c7c1cf6e6
+R = 1de22c8984c593a0948164e6cc8631489133972482f6a7fb1c3c13f97e4584604930d369224850a1d24f267f41bc6fca04ad79326aef61f0d429e0e1b9e9d9686ee10f2bc52b104
+S = 085c6b34687081e280a180cd0c4ffe95cebbb0ad6d3b20a7341e467812f88c23973701cbf3cd2bcd2811415d0bf0cd9df229a88754f4cb0c225a2d11f57369a29edfd7b04639055
+
+Msg = d3740cad41e2e365d80ae81da97fdf06d8b6c278b505e34cb683fb55ddc5189da543540914c0accd405dbf0063f6222885fda4b316dad4a83fd03e8d7b7e936f87fc0a5b095defc8a4b22fa97f00b394e672d5efd3e0a230c7e44dfeebda88641143502a400ed62e2a51f9561e5d652a43d616f16699e875deb9610c77de8e1c
+d = 2cc2d0d7189cc8fb3565a039aee7633ddc00ff427cafad32fd2010b10fe249c9724d91785e7080203626038109158e3a61a3970aa3e51688aa7f5184b22f63af63f80d3540ec023
+Qx = 5fe95a030efac2e5d9522680da58606e3e7544a317a3f24d726b69238367d30fa586864d8c143c3695126ce8dffbc7e7fb789f956dbf53aabbc38af988ce50f1fb30294ea3e2d48
+Qy = 193d1e745d82781ae5c3b3d2233e502959d6862fa7987c6416584504f65639ca765578378b75d3844df179cefdeccff3c4c43aeb8865063e176fd43a27c93e329f8d4f6fd5bad21
+k = 02df3920fe4d328315353ff11b0264045248b32f48e860dc59d931ad65f39e97e3a683c7b5c64b21c3fa50a9685fa11f49df9b14ddaae03eb02754b01e03f60fc6aef1e5d6d7d3c
+R = 1b91c4217b1580cfab56812c16bb5aefc1534ee8d049aa2e1d52a5bfc11519ff89f0d36ea2bfdfce8b5d3cf1527dcf700c0208a70595e9ebe4feafd0eb597e05df54212fd6eca3e
+S = 21ce52440267fb16e713eabb8bf2d502c81939799f9d09cf48a50dce5da999f3b457dcd73c212d5d070056b1f373b07ad06e90d96febb7f8cdb4c423ef946f0799c038a3ee68ff4
+
+Msg = 5eb53b5f92121396c5ff30e0c92da48db4fbbdbf27297f9bc82614ab78f7fd863e34096c615a02e349d8bc7ae4b0700130704bedf32756b5ee6af10da1cd717d624fadc57a9aa6db4a6c5d6254c0e8f8c3c0d4d03c264eeeafd52cac2c1968d9d85b106167a49d0ccdbefb20bdc10a2555f8149203af52853169a02db94e5e2a
+d = 3d8936c00c131e38c6566d2464c4e207c878070bbf681695a6cd98cab2c6e80fe98cda80c66a5cf584e90a071144dda59c07b8fc7bb42464dbee5b6f739b0f2ee5fdff7e5a4e7cf
+Qx = 0fc3a8a320e816305772bd5116cec2795d58633a9f490be8a1a360f21d2aebed6038ca4a5081288b6bdb1066307c26897ce38c24f8ccc98a63e371ff6b54f6016917b430c267af7
+Qy = 69719c868d8fd25a38a7338811904e3330a7b2289a8384bf24f6dad5312160f0093bf556fa061ca5e52d6676a8f1a3e4656740c82d3cddf0ac4f903ea885d42610bf1b45d9e57a1
+k = 050da632cd7aa58340adeb20389a2cb9897b8ec944c47e7177da65d9386a9dec5d63be7bb2d0f5b4943932e1fd7d87d5d7a80bc50a63dfd101a6a28005c894c6a6fa4c652dc519c
+R = 0e6152b9050127bf306662f6beee81d024492b91efe87a56e70596a4a72cd02dd2f10b970c9a69909f85bf4783dcd3c32505d7c148166ab43b503ab098b6d95ef09a7932359f60e
+S = 1f7d68d53ba161b61eeb17139eeae1587a6bd148e288c1f73a6bfb3a0d1f6dd8f9cdc27fa9e8c7a681410500c097ad01f320303421f1239b4a9c4d5446562b5b3cb2fc45a6fe239
+
+Msg = 5aced64f702a57ed7fabd045a40c967a485d2a70b0a5e82561d5141ef329469b2da5964a34df203a980111a77adca376c643b9030aa74516f054648c1534d912ea66582adf3c655dbd71ca55e47412315df5e2893e43b2e2dfe6e4dedf426f11846ebef34a99f5615460ce0475f7bc54b4a4fd99e83c982097c3136ac6188a5c
+d = 3dc7de970bce28a943d7599f2a9010fc99435b93bc4ba884d42503ac2941aa63fd07db34bcbb1127d56d6a4e277d6ca32051ea3467e376f74f98c3999d2f276b282ef8a28cf0cbc
+Qx = 2066a50b9f961a58620f473fcf7d5eb635da47f4ce362f428669ea578d50d1c1513c145adcc03ba98f3d67bb422141c73e2f94ef9559ccfdc0be20eb206d3d114a5db302bd0751f
+Qy = 4437e655bd255e7f013d197210bed70c5c1a6cc1daccb96145c9c438c8a44b4074629830d8df9914166c9378b33040d71918cdd0f47fa64b7c69f43eee0f34414b8f64882f90ac3
+k = 3b2e20f4e258b7f0cf69a460fece9b4794a12a37c0f8e7aa6f4f51dbfaf508f6f1e0160ab4388891efb09f0ca1f73178f0e8598750c9debd3ff856cb3a2872762ef9e16487a9513
+R = 2f265aa99ff806ffeacbf9ef7be575ce5300d3cfd4225b1835774ee075d7e530c9fdcd681584223f84a497119b4eb1fe34cd31d654c2fa262d7549acc251cece9530b26cfa3ab35
+S = 2c05ce4b35544bd1f20a68eae7f3483e0a0628dbb53f0466166257f69a7a110d2838a76d204e7a955a8977508e65f2ef6d7deee13e4e2ec0f2b9a8b4bedc26b3502813b0334a1b0
+
+Msg = 43c24aea343d4e088bea25be69a332c631275c36677093e057de69cc83a4c5e70ab270e5a8930f55846f1a22ec10e03007dcf0942c6761e89c65c6a4f032eed97dc3a2c7f7ed1e82552fe48828a132ba16c41f6bd82a49335428a24fa1679522000e6a1d12c646e0e4b4c584398577ea9493bb334fa3cee8bfdb6c2e66f46436
+d = 2de6ee12eefa7a4a736484b19b42a513dfc059a060976edc3b0aa4b50e98d72df6506fed0499ff8480986748e938289e54a5e86c0c29733a9bcf5985aa63d8a2b57933a04a8e8e0
+Qx = 073fa1b62d469f2991d54f1472b60da87ba51be0a9dea361d417b91a4a75373695e9f27b3c672322315d7b566b1f22b96c54adce3e958080fa8a02836955f6264dad3a87fd11f06
+Qy = 452c0a07ff65fff741c96851657a5afc7eeca239622e1260414ed736a04e487157c52da98a7845bcf6f311e0f2e59bb92248b6d47dcb93da6f7e0af644b7aec7603a01950293d8c
+k = 1c87653066057636f9a98a7c69a84e103df480a92739abc4d5ba53891591e3aaaef6ef3ef5e89213abbf71af9c84d3b30898580e782f557a03694446492afb05ab801d7dd631c8c
+R = 086d539546c61e82d74319f0180411172acaf08b5296dc6435d4ed7bd50cf23d3a071deb3be01f74408e64ad244f069cd41227ba127145df5a357489f944b61606ec75e8377db81
+S = 0a34d9975fbd601614d04aa41506b03fc15189ee8102c0431272d691a322f3e77bcfd19d8bddd19b307012b6c6349f5ecf88b5a69e83588b0e18096117f207304b38c16a9a8592b
+
+Msg = e89210565959d93b483659e62cf41f0a0147ea23890c2f1a694c377a826165e363860e4b084016cda878a43eb68465f81f397ecd50087a25215ce7c4ededa3552218071fa3acd7ae380655fc8fa884998209ffc8a2c26f1ca19dfcfee455dad35a4e72caecd8da47eb9ee21b889162f5d3032724abfd1a31e68612e18bfa9006
+d = 05468f0df2c9854f5f655743e79c750fd8812db28b096d97207bae7f5aafc6b6090c9c636ead9e0fde32a1ff8d539b53813733ca812b41b58ff85a941abe4f128d59fdf9847baa4
+Qx = 6591750fbc104f82c213fe88aa620e8a960fd6140598e2e6282e0d5c5ecffd09d22ed94166109561a7f4f694e171189056d8b300b54c8134485500effc7123aaa23862e89791242
+Qy = 05bf8ec10a9ac6a92c54e7fb2135e2aa4f84da571d33227bde0aa2e6c1532074882235f3103d9a51e80b7a9a19067f35047ddc52462db7c634c291e8fc5eb2154f6913bd0846b88
+k = 242308c430de514be1b9084a7e6c96894cd5615a7c71ea22316e539986e9702080ff6ceef2980144c55d9749830c20c9ea90b93dfcdd28fd862b6a15748dbb3d982e4a275129c75
+R = 361e1b7a0f981bcc65480b370c5e09b1c2e2a67cf41646f6a3d829f663c09115892237400317601fcee78a04269411d267dad3e8fc6f069529fbdf0bcf9b5f13c9c6de1681e8b0a
+S = 2620c29f86cbf698cca5f79de364ae131345a802c0cccfaefdd7375dcc9ba6ccac91f70943eb606506e51e2ced50491eb8f48769810b6dc178d56702838f1c2f0930f2a9e4f1db6
+
+Msg = 48629ec97f56273599cd9903f8a84ac2ba74275b40e1e42fa47649568babe05cf63c8417d828251acc2eec525b56dc9082b68d51b0c2bbaa7389fbee15d058cf482993b2bedc5a9101f1afdc79989a812478245d191550109fc17215679553c508c84e3d4cfdea377088d09eb214e6f92410facee4790beeecafe72b2e3ed192
+d = 3d3c6a7ab9450c94aa3b8a1ffb678e5b647af24cbfd66ee3944e6f264f406295b803767471fc67936fdfed1714b4b8761a07eec86543b7c4da6bd2fcb33fa8cda4077737f398e18
+Qx = 42d536f1b15a22f4ba80066798d8d1c2704988eeb9423319c1850a1ae6bba4097307b515640ed3112e93f1f6ae67c60a4b0d2b6634aa7038a60b52b2b447fd1651857b71711c975
+Qy = 79eb18cc7493a1c7f2f9b621969b9ce9ee37fc0701f6cf56f5d5dc6efb13a384517a387f253aae1e93bb0a919b0c22e4d6cbc79b449b268a068b7eb2853324b96715d75b8c26f27
+k = 23ce112d60a2f7c29d77d64acd9f587e0eb75ef8e739b8548e154681efc24243594eef5e33d845b1e4e89bac56f2e9586e042e0fff38bcf79c73fc9aa5fc908261df5cd2c6cb821
+R = 3a770df8a2bc35e122c1bd551c38400be47f2499ff57618ccd01e14a2e35e87a67b0e40f9a10eee7efcc3d37b474f2840fb8c24a9adf93734680ae6b25818369c8608a2f8f338f1
+S = 0728a4eae5f5638a51579e224a24ecd4c997001bb8681e23a7476fbf78b4fab84497000f20c1e67e8a4e4116498bcee49ff00026009af31c1037172188aacd264fde8db15c97167
+
+Msg = aa3a9fe467b1ca638dd0622c9ea235a418b39b2e15ad81fee01b6892b240783d8db3c72e16c13df8016dac6addbfb85232158325bd7432fca3b8bf5db3abd0b4c5ccd0999609dc42199ca4680692a0805cdd68108bcb493a558ab507cec0a2782a9e976928985352edb2abc0c07078b59d2fd86fda7fc76cfe573181d934c46c
+d = 01ce010ea8e6e1a0c26ab22eb90f0700dc73b232c429d36371e68e429792afb7223f10327708bcff779ea55fb5f22ad87aa054e84d10f5450f1bc9a89279062ea2173f55ab0f76c
+Qx = 4b2b5acef5921e691f10ade81b91ba8e68e73b33a2494cf4ca6617707861f334eb07ca96dfd681dd63f78102f8d792d66102117b739d477e431d9a3efd79bfcc18cea156db58a0e
+Qy = 7e421337d4cb7a98cf9c9c6fdf9fa242904d9906d8a6759ef64a82cbf923b2a57073ea0eabd14aa4295bec84d50a1722fecad3e5f064bd3171facdfff45b170e49f185a3c193f2a
+k = 326b62065b7c779dc398ee03a8332cfb940b0f24a7d3de4a90323d9e390ad3fb1f0036abf6f525d8d88ab6641302d10db447b78780d366f32ce36ae571e323124b21984c48aea7d
+R = 3d2b207b428829ed5100a92f7276e16978e374c734834b0d627cddf6aff5cab72dafefc6c038a91426e35ee0f2c1acc11c55a34a89874100b89588aba7b02e19490e66eb49ef6ed
+S = 3259fef5c2a0779ae408b26e6c7d581fa973156cdb07c329dde0c12b6c498e7a94577719865b7fcc0db078ba72a27bf338ec6b8aa41c15963538c329c55dee67833faebe3b643ad
+
+Msg = 6c3937014361799f1461f652841b5137eb0dcaf01dd293298d002f27e9a770b9e1a30367e35c04603881f0c814cf8ecfbe1619cc49cd516b1d60d27de37ed52a5e1cc300e2face4669f308ebe6747255a3d386f16778e494a7cdd10b45171b2bfcdabd91b805bf24857708c1b75e368edb2874321324f83a19154d3a1578c767
+d = 1e7410d012aeef02b3723346d24ebafd684c99087ecccaea1cf3735d52c4c81dda41812c09f1e874dc964d858ca240a19963d5dc89451f5dd6764426ae41cb23f19cbfdca0fc562
+Qx = 400a3bb3ff07a339ff98f7c45fe032cf42c0e25de8dee2934ce42dfb0c9894f4fce27fef299b41beb8579270efc7b01c0663c3f72d7bdd9f6ff5186eca9c42d15faaef8784211a5
+Qy = 06fe998f7a0db06efed050d178865a2b7de6ca7c789cedff7f2158a5e07ac1d335ec0dbd213fc9465399028fad8b7f4d2cd16fb8ceae4d3d53abefd2b4037efd7f7245296bfdf9d
+k = 2bb0fb9c428e42482d5dbdb35157ad0fa713fe732dac8604c0194e3f9738fac5cf3874bd863718712a3da45b7c4612c8685465ecaec0930d9fec32ab25818d2f25fad580009b698
+R = 1062386d3e77043298eb88be46bd4e6f33c83a7358926b30ca06a6b7139815f6e1630f73d352a2cb9bc0619d08a89d4bde1636c74b6580543ed743073eec2ae0037bea2b3c9228e
+S = 1ceef759d804ff7de526559636d0bc7930c096c7b959f04f8fec5d7e96129fba14c8341b0ed84a64c6cce7cd5b058fab7f44dcf3e714544c9b6f9c1d46ce512870deb51856e9dec
+
+Msg = 12fea55ffda15db902aa6a4388b9807c89c193cbf75b5d2a4c95206fa43dedc45974c80079933451bdc5b3ea015ed3ca2c54156dc61afb1bc82adefed1491302a48b9d3d2f474ab45343c611677d360515b93fb36da7a1c1b2341c9cce185c881c0beef33d43967134a190c09034ae3261f3295b79aebd3fe123616f73cf2089
+d = 2139839ce38eb879d266065dde5e5ea227244323b330e3ad5a0bc690f3c210f794cf18f0d730693887548bfbc434f48ee10ed34cb41d52172b06e448df938170a5e17311cab8e88
+Qx = 2ecf46b90616b534ea25cc9993942fd7576a1c4f2f443d3b1f56d4490bf0af669c9eb9d110fe2a65609875e1a924bc4b9ed2ed2315047bbaeadaa1029b38a7a87dd8751d4128e80
+Qy = 2aec3a2f2557c7152a4907af68aa39485274f20927b2da70823440fbd09cbc308d46e30bd6b705f615b7074fe5421ca36b4aa53861983eceae9a69649495952e75b0f060b5d26e4
+k = 2e3412b61eb23d33ca2910dc25dd14c04d2c8b403d8077a72b9511d71ee9da6d7e1db093b92287f8fb00aea0576f6712c56d80cc4e3554e0faa9c7d911e3d17682de831bf649bd9
+R = 06a3075efec81a86175cd1dc2bfe82e83aff1db640184a6a3ed7a0dcdef51aa0be0005c54ac05f9b65af265af7f2ec3d1d7c137184b0d695d701ff1aed194faf2efa98ce6c5e502
+S = 237d7ff92480fa7d6d1f5a0564a2608afe5e95ce2c29dd88853d1ad9d4d2beb8d1f0423edb883faadd592394f52048bf2dc26d2dc19279477ed86621c7a5960ee3c3e2d345fda29
+
+Msg = c8395546842ddb545d8ea3db4efe970453dcb06025ac3b7a25aa5ef62070f3021b9a1fea91ff7055b6c398073e7886a6f71afe53c82c47b71377dfe291972503bbeb25bd477bf0e7adc8a5d3f8b34ccd0080d61e121214e1b29802b711cdd8a6bb2275a2395c467ec2c1571952992e448d736d8bd70ee629c75b5e32b8323a00
+d = 274f70fe69e4dbb55c5d404e39f5196335047113087f8711f2f67f2be4964e4fbcb865680758df1c401cd677b0971654b7a6aeb7bee0d6d80ac0de14d4f46f356b2d5545c185aa6
+Qx = 2b2321e0a1df083919628dd8b4c318b9ded8a3e660ce5585b21e46843228b4d32da765a3776c181654aad0ce90724bf85b01b051d236342b48d41a1dbda1e9904d659c98a039a97
+Qy = 20227182fcf099d46d9882c0b0f26b0595a2a3166248898df2f3fd27c78e7c0b8b59ef0ed6745660c0dea1acb567f9d943928864dd1e94f8eb6b5b8473c0c91485643189cf679d2
+k = 2f234066c936625fca10dd080cbbb1228c4d2054cbdeafc8a0a248c0d22807fc92c661b4f69586ecf9469bc4c22895cc73ecf492fb2165a12b027194d409677e7185de24f6870a3
+R = 3a48daa8e379b3b2f377049a4d462530c9ea67019752f4af4b4192b02d6e028386dcb9ef95c8019e90e09dfc8dff5e6f6812df491906ced39befedf16caef614d8c174e7ea95fc1
+S = 33f18738cb26d88c8c048c58a210c7be70c71636dc62c022df1bd7747d8c67bfcf5ff2fb3990ed35becf6c77755ac62aed480df55efea578671bd8d50536a10e2c0192bd42d78e2
+
+[B-571,SHA-512]
+
+Msg = 10d2e00ae57176c79cdfc746c0c887abe799ee445b151b008e3d9f81eb69be40298ddf37b5c45a9b6e5ff83785d8c140cf11e6a4c3879a2845796872363da24b10f1f8d9cc48f8af20681dceb60dd62095d6d3b1779a4a805de3d74e38983b24c0748618e2f92ef7cac257ff4bd1f41113f2891eb13c47930e69ddbe91f270fb
+d = 03e1b03ffca4399d5b439fac8f87a5cb06930f00d304193d7daf83d5947d0c1e293f74aef8e56849f16147133c37a6b3d1b1883e5d61d6b871ea036c5291d9a74541f28878cb986
+Qx = 3b236fc135d849d50140fdaae1045e6ae35ef61091e98f5059b30eb16acdd0deb2bc0d3544bc3a666e0014e50030134fe5466a9e4d3911ed580e28851f3747c0010888e819d3d1f
+Qy = 3a8b6627a587d289032bd76374d16771188d7ff281c39542c8977f6872fa932e5daa14e13792dea9ffe8e9f68d6b525ec99b81a5a60cfb0590cc6f297cfff8d7ba1a8bb81fe2e16
+k = 2e56a94cfbbcd293e242f0c2a2e9df289a9480e6ba52e0f00fa19bcf2a7769bd155e6b79ddbd6a8646b0e69c8baea27f8034a18796e8eb4fe6e0e2358c383521d9375d2b6b437f9
+R = 2eb1c5c1fc93cf3c8babed12c031cf1504e094174fd335104cbe4a2abd210b5a14b1c3a455579f1ed0517c31822340e4dd3c1f967e1b4b9d071a1072afc1a199f8c548cd449a634
+S = 22f97bb48641235826cf4e597fa8de849402d6bd6114ad2d7fbcf53a08247e5ee921f1bd5994dffee36eedff5592bb93b8bb148214da3b7baebffbd96b4f86c55b3f6bbac142442
+
+Msg = b61a0849a28672cb536fcf61ea2eb389d02ff7a09aa391744cae6597bd56703c40c50ca2dee5f7ee796acfd47322f03d8dbe4d99dc8eec588b4e5467f123075b2d74b2a0b0bbfd3ac5487a905fad6d6ac1421c2e564c0cf15e1f0f10bc31c249b7b46edd2462a55f85560d99bde9d5b06b97817d1dbe0a67c701d6e6e7878272
+d = 2e09ffd8b434bb7f67d1d3ccf482164f1653c6e4ec64dec2517aa21b7a93b2b21ea1eebb54734882f29303e489f02e3b741a87287e2dcdf3858eb6d2ec668f8b5b26f442ce513a2
+Qx = 36f1be8738dd7dae4486b86a08fe90424f3673e76b10e739442e15f3bfafaf841842ac98e490521b7e7bb94c127529f6ec6a42cc6f06fc80606f1210fe020ff508148f93301c9d3
+Qy = 4d39666ebe99fe214336ad440d776c88eb916f2f4a3433548b87d2aebed840b424d15c8341b4a0a657bf6a234d4fe78631c8e07ac1f4dc7474cd6b4545d536b7b17c160db4562d9
+k = 378e7801566d7b77db7a474717ab2195b02957cc264a9449d4126a7cc574728ed5a4769abd5dde987ca66cfe3d45b5fc52ffd266acb8a8bb3fcb4b60f7febbf48aebe33bd3efbdd
+R = 3d8105f87fe3166046c08e80a28acc98a80b8b7a729623053c2a9e80afd06756edfe09bdcf3035f6829ede041b745955d219dc5d30ddd8b37f6ba0f6d2857504cdc68a1ed812a10
+S = 34db9998dc53527114518a7ce3783d674ca8cced823fa05e2942e7a0a20b3cc583dcd930c43f9b93079c5ee18a1f5a66e7c3527c18610f9b47a4da7e245ef803e0662e4d2ad721c
+
+Msg = ba6be551bc60653192401ed8ff9e1acd9013d8811a7a1389528bf07438366f5772cd7aedad010c19c47622cec03a4d35b8003b39ed901b720629ab59de55a03c1ca50a62987f8da159e356245df58d5ae1936e65f3cd3acbe03ad1d0fcab4aaf2a7a947549ae776772201efbc6fab1aebfa1d99994d4f43dc28f39c0f279b992
+d = 2a69bc1df069c6e89722521a63675f318252be629e7558f3716917998e660ac960b0b750562846fe6c12ef492951e51e224754bab84a6eacd4147a5f26ae85ee4381bb14ec2a8c7
+Qx = 4685c0358ca31883cdfd7d609afa8b1e47540a97f473e0ebe98b0aaaab9418877aeead3a26fb01a4725fda20e7223a4fe7de0df6891c0812555b8b146918d3b80edd11615d95b77
+Qy = 67c92736447946c7577965b613e18950d813a4df049a6000895f9dac34d73ea46a83c6a4e7c83831af0d33026825664c44090953521175b9da2a7ac563a0fc5e13c85d34aaf49f2
+k = 1700d9ac00a987ff3a1d0be4290979317fe60f4f8ce1e0e72a026fc89e28c0070b76ada14f7a1a66ac2e8aef17eec18b568ada4fd59c05414e55356fc17d9e5079e6cabfc1f220d
+R = 23a279662efec48f6cf8c7334862525b52ac37a9b03da6a063da2849f87801563242783434fca02fa23e32249666ddc6f596e07750ed21de303f4f10de56f1d37101cb0826bb8bf
+S = 3b449467b150cba0d7c2b44280c5ac452f1217384ce121c979625d313394f6cef501b81980a02567ca55da2bc313dc0754b5256b08d8e3b63ea033253b205cc5dcb014574b8e9a0
+
+Msg = 295720a79ac8201f40a66b06ae5d970afb15f36582897eed25cd92edcd00f70ac8e31c556eed4375ea044c2e8b227a8e02c0a3e996c9272d52ac7b3ad43b80f217295dddc84b177cf1e800ad08bf7fdd021fb2f49b54162092f8d628679c4ee335abbc90c027264c8b288c6e16eca3172eaa297ba50626b00fe0a0ad3a9dbeeb
+d = 0d11ed1b78b22b3420df4ddc4acc7c2286d9569dd6dd88e0fa3ecae69bcced68bb81bbb4ca6e9b54e67856e7fdf39155aa27aecb9cc827ccb9cdcf9ac633561b27d8eebfc261aee
+Qx = 1868a1335058a69e3ce24ea4e6e8dc25851777bb28d3a5da67b741ec9c46e26f2d2ae70a48c3e4feabb3b15b3c3ebd561f667ef3b95a587621de6073b9c8a904755566c5f7a3b42
+Qy = 6365a03c3f3066eca1af17bbbd08cd52e89f8095075b415cd4b82f3364cbff008fe3642fe71e8a8c634ad0e5d9979251e6cedd42cb97c2203f743210051f5ee1b70c861d2a72c00
+k = 075e49d2ff6f2aa8b44fad90446474ee0e72323a3c39e731b6c2b075cce0cb9d193bc3356f8fdae0e0143603a57028836ee6451cab101a6eb550042cb41b5c4233d3ad3e87034d1
+R = 207a8eed0b87efe65ec558a0ccbecb13b9215e176abd93c1a4803fcae713927ece70ec6c41c621357d78a13a950958871a52621f1de7ab74befd964a0e8f4820b84af3e0811bc67
+S = 2f02017714f54089652e02af36ac5165e44ac4a83747c805a9e003fde4bdb29561dcead2c76b02c195074396a2dcc1b93a256c721716f8eeda8dae443c3eea446118fec3cebc4dc
+
+Msg = a9cff41c6dfdc4a12f31dc375a5455950077ae323d0b7a3d9a8dde73b76e9d7b94ddf9c88ae8e6c262d704052ac47681fc35adfc56c904baaa6e146eb653984369d76a85596cb744941aa7b558c945ff2e81bd5ef7f00ecb4f43af23b4cea3bd4ba7b1899f1868a0c0ecfc62ccb1d588955597ffbbaf34cab2838efc2b866669
+d = 2c36ef754b5bd065e9eadde684750acc52795be80f54dd3d7a7d743d968a18f7e404bd71f8a76eb0395f396df5a7c2ff7e0ab6de35df34282fda6ee01fe5b9b68ecb4e378dbe32e
+Qx = 4805e1a23b6eadcf91647b40903bc1fd3b9921861c942fc24d2c03d0544e7c01f004caeed04b5c4ebbce366a098a878c322cbebe7910bfb0f91b284ac1aef344152fc5831669b79
+Qy = 4f589ddb4da482ba1e9a59241b1dfbc7e9b9b69e8f69f8e90460ad58fdecc48a56842ea6aa0537abec0a605ebfb713e588685a98f62e05a7d52082bfd57e3d68fb7851b37ec5567
+k = 2f2002bdde0c0b0fd92e96abe76c0858e42fd7d94a181c711fc6753572539e18effa8155cde7b1e9ceab2394f9eba874b7ea257d7c308c8ac08500f4944af5f33057650608db8fe
+R = 27f9109799bced42730faecdeea68259383a45033c6d5dc8d87adf994b46beb34177e013700b13f1253cf756a8866218e9c8adc180f3c242c56b3de28405b36940d53c2aab24f1a
+S = 20a762ffb2f5a88b0e1356964fb558b555c424946109d16c7548f41a33cfe41da1f483276a27b188faf948a56670716ddf3b187570c9f514869c4492d7773d6ce453a075f9bc64f
+
+Msg = efa6c582d7fcf5e431aa89b3b00180c0e78efd7ccb0384d90b80e59a115a13e55001d951528c42860132531c9b8ab29dda7a657c53c2ce96fd85549f6f1810e121eb89961295335eaa0e40532d85814a4206e6fffdf9bff76599da9b2e71a22ed572910b0e3bae38ad72c7042579f106739a8628dea5a745168bd918736e488a
+d = 19ffee50be5496507e3ef5c40ee88a49625e46d1dd1686a52b09ad4a8e3ee9ef364f953bfcd97c52104eecb6138067192997cd4ebadaccb73c7b2560879289a46353a756b73cc43
+Qx = 77dca410e722009ef11b37742c2c003ab3015d0ca0328a70d9d41aae04cb64f7746f1c348b08458eb3bb1788f9ffe7d0570a9b689a9b7aca43e05400bace7630d598f5b484d13c4
+Qy = 7291f74cddd9ff69470cf0d92afaaddcc4c8c274d4a7a64fd94292ddc8bf080606795376bb725ab4d32c72ef77dff34cfedd34aff2f463d635bfcd7e1fd002d84383dc5bf8d5d23
+k = 2ea37750fc3bbdeec100694068d55f92fdf35bff9ed49251c4b8bbfb2dec2dd4446999af8848e05c7b819aeb1864430ab4e8c1d684e1cf78947a71b04d5ab8ad61cc7e3e4e24205
+R = 12ff1852eaff37fee997531039adb1fb2f9b4f4199670c022e8534625fff1fa93390ee9bc7204ad2ba3efc2233260943f1d2381a3cc025b78c6d1f660a7bd6f42e5ed3c123055a9
+S = 1b4d8abb28ef1a9d77066921ed50eba64b8433cf00c66b8467269a4a914f568cdb86c766a7a6a52437c5d98cfc9a2130dfaba20f3c2001f31bba7071647d51fb9fbd5fc67ee120f
+
+Msg = 211acebfaf13bba33a9dd16722ec53baab92a140127d61372cbf1850f2fc894e942e25d780778235f880743953d04eca7a9205602e388172aec2abf35412b483490751f93b51239b6701cb0aab14e5179b0d7f55d8586358381dd83e3e436bf69a6820317d1701750cb1fea1293467ba589eec5f5779c2dbf2a9b8f28c4dc239
+d = 3129e96fd28c4198cc5242c1e3531a3979fae643d527044e98d7721aa56b5b4b45dfddfa17a4115e10a2b4f46d92f81cbdd7e86e588a4c6d8c2b3a83f54cebcee1d1dd33e85d81a
+Qx = 73a92abcc991e3f89d82c47fa0fec48e3e7c4d97e2525f8dc2d24da39f616af4a5a804d2603703f6db7cc9324c5b56a21009373f6605f561c8503394e7746e51273b5722ffbc23d
+Qy = 0684c842f03a53a60cce087f4fcdbf23b7a28c48b6b6544f583342a65d97dd87037c6fef176a1f00513713468273494a5be683b68c5e75bc08995fde763bb6f965da1acb7e894f1
+k = 0165e52640fcaf8cbdbfe73cb8058c53045e7670aafb2def28d2c9eceb5ed1634b5339cc47ba981eb6eb03ba714c7717e9ed5acc15c8f304702a0409bd4508015d4626cfc5484b1
+R = 27dcdf16b7156a7a05a752da28b5bd6b233e8a7c16eb7f9030f29c4352e6508f8424d1b5ba789dac4152ac4812ff7975cce69908371a81a4d7d9dd70a8dabebdc4e3af27234f0d0
+S = 32a654a31f09a9803e502a1440c2bcf122780f4f47aa37e15991d9a548583fdca48800804712816b212cd3c657e6bd4cb7443a0288592541473c5086e1277250612c21346538374
+
+Msg = ee592e20e0a45c18089c2e41460e65a7d22ed9714379f095d43a308bdd383128aaa6fb24e9d35fd28fc95c5b792ad75c980d2cdf0f460ac60b12c5919d3cb28dac4d488196be6c2dfe462b1b0ce59f8501692255840f5215c0fd8b74b1996a267a5e3b22d2841cf0a0b6315ef4ec7180f1c8494f4c07d5869c01fa2711739efc
+d = 3d723d2697cd07dd8444f992f2ab4a063db334034c25ea9be99fd7a1f495e3a644e5ea033a41264e0d24a911e55741d0cab80a0bd678eaec2bd1e60424d4491eb86d664900d907e
+Qx = 0c7a229b5fb9fc774c1b6250f3bba2f0972d1aada7080641c014d012db0637a0656a43024ec0ea25ff70012646dc19eeb1033aebcc96a001ba876b2f5def6e198b8d4a53f7c7f4a
+Qy = 09228a68eafaac214fdfa19923a0c19629de31ac0967c9d02c53dbf221f9affb735d3bad732f381f1ca414d70920231a78f742254d895a33ffab492f8e6094a542e77962a324ba4
+k = 3b3724a5933353bb9ff5f742f59385e780caa517a963590b7fc89882bed95cf90ca6365ce8b882f2d96e56bd866a5c437733b681308c570c51ec893ea95fede66c7aaf4561173f7
+R = 2a487c1fc29426e8e85f0a35c177cd168a444959b2f5cd4519b9edd52af3ea829cfe964ac2b59198af8e2d3859ebdf9885ebf57bdf5767da1611d3958de286f91ef397230d65599
+S = 10fc01efcb22b982f992efb71887bc79c3f32a9088bc2011c269924cee0f47c36452399d499f2933587081b872e9fd2191c20cd5cd94927839228ebcf22cf7acdf4608a2fa66310
+
+Msg = fffca41927debbd53455821441d9115db99fb31bfc69752a382f57bc7abe021f148346ee29e17512c64b4918ab2391d12d6e5643bee6b5682885dc28177b292e23a37ff99b359b9cf7578432af56e0ad1028a6cce7428980654c145af8daf09addbb3be11228d3c742defca9d3b1667f48c63091fe3307ecf72667b02e008f24
+d = 1999ab45d66cd1d3a0fe6aa43bf5ef1e2a67637d53674f6fbbfb9b582be91fc42a12cdcad94b50b0fc7ac55030de24a0b99fbc4314fa743ef4b5198bcc5f54d8b669fbed78e2e91
+Qx = 0cbf3b0bb4a2e6c225aa922bea3b233da4661df5da7e0a1cd343a9b6655ee87fc60cd763dee21eaa2b81c4dd5af6f4fadc3ceea643b37a6b17a6501e1b9b689fb0c4716911c1f10
+Qy = 14b5a9ae025f09066fffa6797ddf95f27eeade06b8ca5be5738f770362d5213c46ecfca58e3c60cb2bae1f8ab1bf0577c80b4fdad02819fc174cafb33df64fc0ec79713f7b25209
+k = 253b533d3ad1c7095363e3fc80cb32471061e44dab3f9ae0ea6252f6ef169cee8badd3eccb77096ae9224f89baeee7e183058579680661655fb689419e36a61e8573de5ecb4cd09
+R = 3ba94f7682fb61de725a35caf1d4d799c4b05a1d1c44eb1c251dd8efab6b7d713c3fb917776902a1bb202f9226558f4c1e75964349717e6dff938d0befea07a9ca1bbd429dd6318
+S = 226f43be8e24062180c726b5cb721cc04ffd3acd82183925523ff9e8631aecbec2c224d5a291bb225f0da726d256aa822ee7cc2c7d69df3f2a5beb21132d91bea22e4c5db900cec
+
+Msg = a2f71619ea04f7057e6943c2cece8594b341ec3b96c3915d924f94ba13fd7aaeed41ffa0e842ade414784f1ef825fcf2dbcf7bd8263b802def45f94de596aec0c121fc06558c7bb06b9f27a9bf56c42090b5dc344e82b69c4f528d33be166764a593483f6fda0cf56e6000ff363ba220f5ea0ea2c3191615c7ae3bb4fa575324
+d = 2ce1cae0716205330d730e6bc6dbfb6b951dc83ee3b4a7dae75d057e32e8a46e22be75b5f09135452b29c34dfe81a9be2e8dcd243fbd946a0ed14a832a7802e20cfe1abfd3d6e4b
+Qx = 75971399fa621ce535144ec1d57f544d798a0a59207166c3d657e5a80ac00e8f5b643448e3546064d68ae624aaabf36face3016561a248256ff9131950ab8b04710551e12222d0c
+Qy = 224a50f321647f47de3db4fbe1bf1e3a3dce8a834312779f66037315e3326721e3fd63d4d6ef92b7ba1fa9aeb70f92e2a6701458ac8da49ac386491f2306adcd8dd781fe75e99e1
+k = 0ad95aa69cf9f40e13f8a72ed6d93388168abc8001670ee4d95fb4b726b1f958205ab2f458df8bb9ccf2405680d0e6951abbb922cc11d47cfded93c0efdb70caf0c54e7ae96d7e5
+R = 09ce019161bf29eeaf323933045f59d2efc372904ba50c4a6602b8305234a851d95f06a5b56193ad5d28488102ec25e3f421a5f5c4626b435b423d612e6ab60e0a4fe5d4952e2c5
+S = 04f7b7ac787b361c2bdfa767da9c22152e402184a7ac133f651fdcd928239215dc917401122a6d41e78299b4235e085399e594465b7f8dbfaae9bf302d83470b4295ea06bb9bd1e
+
+Msg = b60415a831eca2cf60c79a334ef2f327a76d290846ee588d5d33d0a826bb0c7ec3e11dbb384a7f89c8d180425dfae7463e0ea6497d2eec1dde112f1c1efccb532a2e2b66a28e2d36d4252a4c3b12850d465fe21bddc441b92e6a7b0f67744f7f6e7812a0603211a26518b311a5b190ed890ad852bed4f6ed13377cab3eebedf4
+d = 2c9d0fcfcee7e75c3245ba955ae04188b1033c55ec9c821d8de7685276bda3e9a93c3ae1b003e5ea722913e7b169d67b1aa2dc8cd42adbd9368672a3f81a6817bf3e5529dcb0c8b
+Qx = 19cba4c8ddadb596d7303331f2a22461849ebfbc78ea69277f72dcfe23d08397025ff6691c61ed9958d68a9c5dd8a32048a89a2553afb9077ec43358763756b1473ab2cd8f25b53
+Qy = 319eeaa78444b7cc5d8cff4e9199ddd2c6dc7bd935a1be1d8b1c657dd5ac49bc92b0cd91304ef44ddb7ecac05518301bfa0e533402043533f99549621e31dcc282a52186478df2b
+k = 385e12170ed0b23c9c65ff7edd413145fd343dd841e85c498fae5f36e57764168899902817d4dc39127010faa1da68000a511ac69f80708be5afe1631432f3bab7aaec2bdeb11b4
+R = 231ef400c6a3a0c7b26ba1b92341b72e138ca62d04ea2172854631c40c48081a18a57e9f055748245d3e83d10d21af39935b0e50c9c86956ac46c1ea03ac4ae023d84b24f830973
+S = 24d37d67afafb0676cd7b5da2960cabfc804b0b3244b5e6739f8fe43d0841693d28c61b8e76181f8aa24940d76fc5ea8ef3a95f72f67303e1ed85ad6e83cd2c44fd0e0f3f2f44f4
+
+Msg = 5d15a08226cc74cf495be681b795d0bde26b19f29aca1a8c6ef77d50271ebdcb4e5fa2df23961fe11620b1c6580183f6ebdceb2c09516c8127be576496fb71449bbbf0a9d3d1c48a25024619b97c3e0d8b165897db96ae9758d13ac28441d7cbfb75b23cb423e0002046358bb6d64779974a5995dfe54b398f95f7d64fc52d96
+d = 10c057bbaa44ef0f565edc288bfe66d4f6acd8686899359bca418ba89fb690429489a37bd3c6c9f3a8714b2ca225868c6a45fee360e378a676f7ea39321790f32a4b005b81dce43
+Qx = 43b1e7d7b2aee3563813a6692f0b4b61ba82b801697c3e23724a2fbab2af80a2c56be55af41def0a90cbfce7a45ec61629906055a8b2a5013740e96859e580c444ae9f0ddf73afe
+Qy = 6742f13244f1bf156d321eab2c3095ca548c3182c405187c3de2fbcb01d0e16e1fef246012c87d4d32378629a75b694572ec8583ae0cc813ac64f10bb05a9e52e4805590482f289
+k = 2b8076102a6448bd4c4e192e93cdb96ea9a6c7f6753818267ee9e67644df1a4a6c9ff64bbe9f64904648cc640fb7f0cce69f9e02878ee950b91ad559a9ec0ae15b676d933f1620f
+R = 1ad97f4997037adfe306f3859d550f9fd89bce8b566e657d5742feb17466b6b8d507d5810a8cbba44d671b043ddb557df084bf5d1de74ef8bbd6a93690459fc16a17b80dd6c0f28
+S = 3262ef6e4175e7afe095d18157f67b3d12564d54954e9964e991c31bcfe1dee7e86b35491ce818400cc0f83b819f478f2f2c2d21c6c7a6be43938841559e09bce70b0d61fe51245
+
+Msg = 9eca4bd88200baf61b901fca53dc1f1e7e3f83b94d58a6cc6a2adbc9b1a35fe3f8ec61787c76ed9a0d696167cd4fe46e1a0883fda564666131753c576a720125e0b712db1da0278067cb899bdb14eec08737e864544663abb1d62f34a2114be07e8e3cf56e2d17099299ce6b6d83b1a34e6153d7c6a32a72c7b1bf4583fcbcf7
+d = 2c182df7976ea93d996f3ba5d2221f3cb755cc7847bc3fe9e022fa4285046f5bfb426bafa3580beea206de36f87593ae561b4b74a03fcd61fbd0e8d6fd5668f2148819a88a650aa
+Qx = 6004b26a184ed710a5fb67e9d042f7fb9c8f5584b1f70a91b0b3be41c3fd2cd1a537e962fdac8756df33f80fce2bb1bc7241d325bfc36dbaef7cf625918d589b6352fa744718910
+Qy = 36a29b04a494abfe809d956c3cd6f84ea51a7fa28cb39a52f16137a13f72f0726a84f6ae53ae24f5b468733f4cbfa0ce5bbbc1cc7b348fb996d33a45ff656a6a7557619f598a6b7
+k = 2ab349232bcb4f4816b26bd0049e130fffc90ca0b9308edd50fb9055358a87fe798d00140b0ae01ed8b1f6bb9bfb726b253c3d4949ce9eecaa6c7fa84d1ef812669fa929f26be0f
+R = 0bbf2f9765b12742224ba7d064358c0305fb63e9b54a831e302a4546aa02cace798d82a188d2f536d78544c1571f481289d6ec69d117648026490e781f1eb9fca59bee05234ba7e
+S = 27e07ee0a1a99c90753cdc8c0291da25a82c116e62ec58b93f91086ac1cc039b35ce7d8b53cdaa92a5ade65a7684b6e7ab79873dce33dcd467c39d0c764ee390b7fb25ca18912c3
+
+Msg = 707450bd84141f3b61beb12ffa5ae89d812dd11badcdf6a88a2d50fc70e23f6d822ff4477047abc58cdfa28f97ad7f4911ae0773c04ebed1f51bb2308cf6e5712c4aaed461edd6987fdd1796aab70198276b601241f6a14225dce575830ff60f935fd9f567d1d210652e4710922fa793da78c8fdc30c273cb08365c9fc887f50
+d = 2d3a65bbe133cc98cf0eb56ee1362195968b4eab960a1d55d8b762f1361fc21348d6f275d4bea1de7158fb97c995e20b92a9c887a3e332d154667ad167acc632eb88a0ead6113a2
+Qx = 34355b54d00c3df7c2762ee2982cb777491aaf78e550c4d2ff5d5a893416eb3517671dbe522b8c553fd71edfe0306cd7628324f4f748091fc5d84ad8af33b896985674649a6f4e5
+Qy = 7e322a04eb600a3faf3e045959f1e9f798e1c965ced40fd4c0383c0d4e79a96bf693a91d7662780990d0c9dfca77a9bc0e13551d2ab35af8a153fa34ea903961fe66996ca053b64
+k = 0a59ac1240bcefc52456486ce23b780cc92c8b89314b8442a6898c373bd0adc3725e3ebac580546d1ec82ebfb2e04c608441d962d759ab5f5af1596c6623487e1347537a3c35bf4
+R = 0c47ef55d93ac36cee537160bbe39c3d4504184188533edfe589a5ab6e5a3e06ef413aa48710d304f0b2bc380fd69a34aa0b8e2e9466fd8a131cb056dffe4b809a59fd83e594483
+S = 2d8de1e8e2a52dd1be08435cda69e673b328573edeb1767849536e6f2d5fc8f18f7bfde936d8c32ecbfa97bf976133d65641320ca1c41e81c388fd6088884bbd89274b1976470fc
+
+Msg = d5ce9d59391cdc47ef942dd2a818d024ae3917deea8a5a4214e4db6a0c5e6b0936f3e632fdb68a3f0006e05c44b7232013e1da5f877cd197f44fd6f60c1fd2378995e9a47534948c5a09e33750f07a7165072ab38095373b07a50bc1391eb6b650ee13acd63d0352e7d9c31695ea1ec6323f9b5f57b426ace56aa7fdbf419be0
+d = 2a920e8dc928acdd56e3655b2340d4371c793e66f67405fb7a90f31e9c4ef466cc44331d1d2fe3ff7391d2576dc6640772166ef8c154a5ff1808f5dab2f03061070ec8b3f786c36
+Qx = 5edc0fb974314e21ad40d73524d5620b7279084e3ecb9e58b06340ae53d2383efd206b8b1eb3dd60c38f593efc05e2ba5fb8989472bac7db60fcada2d18d4108ab36e8c20cc710d
+Qy = 0444cf65175f6bbaf647739cfd8407e7036fc6cc6208ccb9d776eb13e13b377136c683e108775d85b6bc5638926432a17344de965d45e042a0a8e0b63c7fc3a36fc15cf718f3baf
+k = 35a0215892d0c52ece29559ebfa061011da8d597af6b3d1ee988ea4819be194c79a42681476140738b1b5dc191485bd20c96c282ab38ddbc3987343155366b6a5d1ce7053efcd83
+R = 1a69a9a51f6b0dc196b2a8db2e8bf61764d4c65b038f43b5ed6b5dc2673971c32928606f92b7caafb4dab3cd61ee724bba71a0d5c788cde4b96ef6b453f2a69126dafc20dbc7c82
+S = 13b5463636b8462cd9f479de8d114e29e7011489bcb9735ffe9ca0707a07df3c0aba05043eab387bfedd9fe982fbf04968f2be200e9e052cb4b02223b8579913d713acf94e7dc80
+
+
diff --git a/test/jdk/sun/security/pkcs11/Cipher/TestCipherTextStealingMultipart.java b/test/jdk/sun/security/pkcs11/Cipher/TestCipherTextStealingMultipart.java
new file mode 100644
index 00000000000..87eeb2519f6
--- /dev/null
+++ b/test/jdk/sun/security/pkcs11/Cipher/TestCipherTextStealingMultipart.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2024, Red Hat, Inc.
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.security.Key;
+import java.security.Provider;
+import java.util.Arrays;
+import java.util.HexFormat;
+import java.util.stream.IntStream;
+
+/*
+ * @test
+ * @bug 8330842
+ * @summary test AES CTS multipart operations with SunPKCS11
+ * @library /test/lib ..
+ * @run main/othervm/timeout=120 TestCipherTextStealingMultipart
+ */
+
+public class TestCipherTextStealingMultipart extends PKCS11Test {
+    private static final String LF = System.lineSeparator();
+    private static final String ALGORITHM = "AES/CTS/NoPadding";
+    private static final int BLOCK_SIZE = 16;
+    private static final Key KEY =
+            new SecretKeySpec("AbCdEfGhIjKlMnOp".getBytes(), "AES");
+    private static final IvParameterSpec IV =
+            new IvParameterSpec("1234567890aBcDeF".getBytes());
+
+    private static final StringBuilder chunksDesc = new StringBuilder();
+    private static Provider sunPKCS11;
+    private static Cipher sunJCECipher;
+
+    private static byte[][] generateChunks(int totalLength, int[] chunkSizes) {
+        chunksDesc.setLength(0);
+        chunksDesc.append("Testing with ").append(totalLength)
+                .append(" bytes distributed in ").append(chunkSizes.length)
+                .append(" multipart updates:").append(LF);
+        int byteIdx = 0;
+        byte[][] plaintextChunks = new byte[chunkSizes.length][];
+        for (int chunkIdx = 0; chunkIdx < chunkSizes.length; chunkIdx++) {
+            byte[] chunk = new byte[chunkSizes[chunkIdx]];
+            for (int i = 0; i < chunk.length; i++) {
+                chunk[i] = (byte) ('A' + byteIdx++ / BLOCK_SIZE);
+            }
+            chunksDesc.append("  ").append(repr(chunk)).append(LF);
+            plaintextChunks[chunkIdx] = chunk;
+        }
+        return plaintextChunks;
+    }
+
+    private static byte[] computeExpected(byte[] jointPlaintext)
+            throws Exception {
+        byte[] ciphertext = sunJCECipher.doFinal(jointPlaintext);
+        if (ciphertext.length != jointPlaintext.length) {
+            throw new Exception("In CTS mode, ciphertext and plaintext should" +
+                    " have the same length. However, SunJCE's CTS cipher " +
+                    "returned a ciphertext of " + ciphertext.length + " bytes" +
+                    " and plaintext has " + jointPlaintext.length + " bytes.");
+        }
+        return ciphertext;
+    }
+
+    private static byte[] join(byte[][] inputChunks, int totalLength) {
+        ByteBuffer outputBuf = ByteBuffer.allocate(totalLength);
+        for (byte[] inputChunk : inputChunks) {
+            outputBuf.put(inputChunk);
+        }
+        return outputBuf.array();
+    }
+
+    private static byte[][] split(byte[] input, int[] chunkSizes) {
+        ByteBuffer inputBuf = ByteBuffer.wrap(input);
+        byte[][] outputChunks = new byte[chunkSizes.length][];
+        for (int chunkIdx = 0; chunkIdx < chunkSizes.length; chunkIdx++) {
+            byte[] chunk = new byte[chunkSizes[chunkIdx]];
+            inputBuf.get(chunk);
+            outputChunks[chunkIdx] = chunk;
+        }
+        return outputChunks;
+    }
+
+    private enum CheckType {CIPHERTEXT, PLAINTEXT}
+
+    private enum OutputType {BYTE_ARRAY, DIRECT_BYTE_BUFFER}
+
+    private static void check(CheckType checkType, OutputType outputType,
+            byte[] expected, ByteBuffer actualBuf) throws Exception {
+        byte[] actual;
+        if (actualBuf.hasArray()) {
+            actual = actualBuf.array();
+        } else {
+            actual = new byte[actualBuf.position()];
+            actualBuf.position(0).get(actual);
+        }
+        if (!Arrays.equals(actual, expected)) {
+            throw new Exception("After " + switch (checkType) {
+                case CIPHERTEXT -> "encrypting";
+                case PLAINTEXT -> "decrypting";
+            } + " into a " + switch (outputType) {
+                case BYTE_ARRAY -> "byte[]";
+                case DIRECT_BYTE_BUFFER -> "direct ByteBuffer";
+            } + ", " + checkType.name().toLowerCase() + "s don't match:" + LF +
+                    "  Expected: " + repr(expected) + LF +
+                    "    Actual: " + repr(actual));
+        }
+    }
+
+    private static ByteBuffer encryptOrDecryptMultipart(int operation,
+            OutputType outputType, byte[][] inputChunks, int totalLength)
+            throws Exception {
+        Cipher cipher = Cipher.getInstance(ALGORITHM, sunPKCS11);
+        cipher.init(operation, KEY, IV);
+        ByteBuffer output = null;
+        int outOfs = 1;
+        switch (outputType) {
+            case BYTE_ARRAY -> {
+                output = ByteBuffer.allocate(totalLength);
+                for (byte[] inputChunk : inputChunks) {
+                    output.put(cipher.update(inputChunk));
+                }
+                // Check that the output array offset does not affect the
+                // penultimate block length calculation.
+                byte[] tmpOut = new byte[cipher.getOutputSize(0) + outOfs];
+                cipher.doFinal(tmpOut, outOfs);
+                output.put(tmpOut, outOfs, tmpOut.length - outOfs);
+            }
+            case DIRECT_BYTE_BUFFER -> {
+                output = ByteBuffer.allocateDirect(totalLength);
+                for (byte[] inputChunk : inputChunks) {
+                    cipher.update(ByteBuffer.wrap(inputChunk), output);
+                }
+                // Check that the output array offset does not affect the
+                // penultimate block length calculation.
+                ByteBuffer tmpOut = ByteBuffer.allocateDirect(
+                        cipher.getOutputSize(0) + outOfs);
+                tmpOut.position(outOfs);
+                cipher.doFinal(ByteBuffer.allocate(0), tmpOut);
+                tmpOut.position(outOfs);
+                output.put(tmpOut);
+            }
+        }
+        return output;
+    }
+
+    private static void doMultipart(int... chunkSizes) throws Exception {
+        int totalLength = IntStream.of(chunkSizes).sum();
+        byte[][] plaintextChunks = generateChunks(totalLength, chunkSizes);
+        byte[] jointPlaintext = join(plaintextChunks, totalLength);
+        byte[] expectedCiphertext = computeExpected(jointPlaintext);
+        byte[][] ciphertextChunks = split(expectedCiphertext, chunkSizes);
+
+        for (OutputType outputType : OutputType.values()) {
+            // Encryption test
+            check(CheckType.CIPHERTEXT, outputType, expectedCiphertext,
+                    encryptOrDecryptMultipart(Cipher.ENCRYPT_MODE, outputType,
+                            plaintextChunks, totalLength));
+            // Decryption test
+            check(CheckType.PLAINTEXT, outputType, jointPlaintext,
+                    encryptOrDecryptMultipart(Cipher.DECRYPT_MODE, outputType,
+                            ciphertextChunks, totalLength));
+        }
+    }
+
+    private static String repr(byte[] data) {
+        if (data == null) {
+            return "<null>";
+        }
+        if (data.length == 0) {
+            return "<empty []>";
+        }
+        String lenRepr = " (" + data.length + " bytes)";
+        for (byte b : data) {
+            if (b < 32 || b > 126) {
+                return HexFormat.ofDelimiter(":").formatHex(data) + lenRepr;
+            }
+        }
+        return new String(data, StandardCharsets.US_ASCII) + lenRepr;
+    }
+
+    private static void initialize() throws Exception {
+        sunJCECipher = Cipher.getInstance(ALGORITHM, "SunJCE");
+        sunJCECipher.init(Cipher.ENCRYPT_MODE, KEY, IV);
+    }
+
+    public static void main(String[] args) throws Exception {
+        initialize();
+        main(new TestCipherTextStealingMultipart(), args);
+    }
+
+    @Override
+    public void main(Provider p) throws Exception {
+        sunPKCS11 = p;
+        try {
+            // Test relevant combinations for 2, 3, and 4 update operations
+            int aesBSize = 16;
+            int[] points = new int[]{1, aesBSize - 1, aesBSize, aesBSize + 1};
+            for (int size1 : points) {
+                for (int size2 : points) {
+                    if (size1 + size2 >= aesBSize) {
+                        doMultipart(size1, size2);
+                    }
+                    for (int size3 : points) {
+                        if (size1 + size2 + size3 >= aesBSize) {
+                            doMultipart(size1, size2, size3);
+                        }
+                        for (int size4 : points) {
+                            if (size1 + size2 + size3 + size4 >= aesBSize) {
+                                doMultipart(size1, size2, size3, size4);
+                            }
+                        }
+                    }
+                }
+            }
+            doMultipart(17, 17, 17, 17, 17);
+            doMultipart(4, 2, 7, 1, 6, 12);
+            doMultipart(2, 15, 21, 26, 31, 26, 5, 30);
+            doMultipart(7, 12, 26, 8, 15, 2, 17, 16, 21, 2, 32, 29);
+            doMultipart(6, 7, 6, 1, 5, 16, 14, 1, 10, 16, 17, 8, 1, 13, 12);
+            doMultipart(16, 125, 19, 32, 32, 16, 17,
+                    31, 19, 13, 16, 16, 32, 16, 16);
+            doMultipart(5, 30, 11, 9, 6, 14, 20, 6,
+                    5, 18, 31, 33, 15, 29, 7, 9);
+            doMultipart(105, 8, 21, 27, 30, 101, 15, 20,
+                    23, 33, 26, 6, 8, 2, 13, 17);
+        } catch (Exception e) {
+            System.out.print(chunksDesc);
+            throw e;
+        }
+        System.out.println("TEST PASS - OK");
+    }
+}
diff --git a/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java b/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java
index 2127256b5ec..e0a7d53e1c1 100644
--- a/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java
+++ b/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphers.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 4898461 6604496
+ * @bug 4898461 6604496 8330842
  * @summary basic test for symmetric ciphers with padding
  * @author Valerie Peng
  * @library /test/lib ..
@@ -80,10 +80,11 @@ private static class CI { // class for holding Cipher Information
         new CI("DESede", "DESede", 408),
         new CI("AES", "AES", 128),
 
-        new CI("AES/CTR/NoPadding", "AES", 3200)
+        new CI("AES/CTR/NoPadding", "AES", 3200),
+        new CI("AES/CTS/NoPadding", "AES", 3200),
 
     };
-    private static StringBuffer debugBuf = new StringBuffer();
+    private static final StringBuffer debugBuf = new StringBuffer();
 
     @Override
     public void main(Provider p) throws Exception {
@@ -128,10 +129,7 @@ public void main(Provider p) throws Exception {
             }
         } catch (Exception ex) {
             // print out debug info when exception is encountered
-            if (debugBuf != null) {
-                System.out.println(debugBuf.toString());
-                debugBuf = new StringBuffer();
-            }
+            System.out.println(debugBuf);
             throw ex;
         }
     }
@@ -171,8 +169,7 @@ private static void test(Cipher cipher, int mode, SecretKey key,
         }
         byte[] testOut1 = baos.toByteArray();
         endTime = System.nanoTime();
-        perfOut("stream InBuf + stream OutBuf: " +
-                (endTime - startTime));
+        perfOut("stream InBuf + stream OutBuf", endTime - startTime);
         match(testOut1, answer);
 
         // test#2: Non-direct Buffer in + non-direct Buffer out
@@ -184,8 +181,7 @@ private static void test(Cipher cipher, int mode, SecretKey key,
         cipher.update(inBuf, outBuf);
         cipher.doFinal(inBuf, outBuf);
         endTime = System.nanoTime();
-        perfOut("non-direct InBuf + non-direct OutBuf: " +
-                (endTime - startTime));
+        perfOut("non-direct InBuf + non-direct OutBuf", endTime - startTime);
         match(outBuf, answer);
 
         // test#3: Direct Buffer in + direc Buffer out
@@ -197,8 +193,7 @@ private static void test(Cipher cipher, int mode, SecretKey key,
         cipher.update(inDirectBuf, outDirectBuf);
         cipher.doFinal(inDirectBuf, outDirectBuf);
         endTime = System.nanoTime();
-        perfOut("direct InBuf + direct OutBuf: " +
-                (endTime - startTime));
+        perfOut("direct InBuf + direct OutBuf", endTime - startTime);
 
         //debugOut("(post) inputBuf: " + inDirectBuf + "\n");
         //debugOut("(post) outputBuf: " + outDirectBuf + "\n");
@@ -215,8 +210,7 @@ private static void test(Cipher cipher, int mode, SecretKey key,
         cipher.update(inDirectBuf, outBuf);
         cipher.doFinal(inDirectBuf, outBuf);
         endTime = System.nanoTime();
-        perfOut("direct InBuf + non-direct OutBuf: " +
-                (endTime - startTime));
+        perfOut("direct InBuf + non-direct OutBuf", endTime - startTime);
         match(outBuf, answer);
 
         // test#5: Non-direct Buffer in + direct Buffer out
@@ -231,26 +225,21 @@ private static void test(Cipher cipher, int mode, SecretKey key,
         cipher.update(inBuf, outDirectBuf);
         cipher.doFinal(inBuf, outDirectBuf);
         endTime = System.nanoTime();
-        perfOut("non-direct InBuf + direct OutBuf: " +
-                (endTime - startTime));
+        perfOut("non-direct InBuf + direct OutBuf", endTime - startTime);
 
         //debugOut("(post) inputBuf: " + inBuf + "\n");
         //debugOut("(post) outputBuf: " + outDirectBuf + "\n");
         match(outDirectBuf, answer);
 
-        debugBuf = null;
+        debugBuf.setLength(0);
     }
 
-    private static void perfOut(String msg) {
-        if (debugBuf != null) {
-            debugBuf.append("PERF>" + msg);
-        }
+    private static void perfOut(String msg, long elapsed) {
+        debugOut("PERF> " + msg + ", elapsed: " + elapsed + " ns\n");
     }
 
     private static void debugOut(String msg) {
-        if (debugBuf != null) {
-            debugBuf.append(msg);
-        }
+        debugBuf.append(msg);
     }
 
     private static void match(byte[] b1, byte[] b2) throws Exception {
diff --git a/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java b/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java
index 8f53cda2f6b..2288a5699fb 100644
--- a/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java
+++ b/test/jdk/sun/security/pkcs11/Cipher/TestSymmCiphersNoPad.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 4898484 6604496 8001284
+ * @bug 4898484 6604496 8001284 8330842
  * @summary basic test for symmetric ciphers with no padding
  * @author Valerie Peng
  * @library /test/lib ..
@@ -68,10 +68,12 @@ private static class CI { // class for holding Cipher Information
         new CI("AES/CBC/NoPadding", "AES", 4800),
         new CI("Blowfish/CBC/NoPadding", "Blowfish", 24),
         new CI("AES/CTR/NoPadding", "AES", 1600),
-        new CI("AES/CTR/NoPadding", "AES", 65)
+        new CI("AES/CTR/NoPadding", "AES", 65),
+        new CI("AES/CTS/NoPadding", "AES", 1600),
+        new CI("AES/CTS/NoPadding", "AES", 65),
     };
 
-    private static StringBuffer debugBuf;
+    private static final StringBuffer debugBuf = new StringBuffer();
 
     @Override
     public void main(Provider p) throws Exception {
@@ -111,9 +113,7 @@ public void main(Provider p) throws Exception {
             }
         } catch (Exception ex) {
             // print out debug info when exception is encountered
-            if (debugBuf != null) {
-                System.out.println(debugBuf.toString());
-            }
+            System.out.println(debugBuf);
             throw ex;
         }
     }
@@ -122,7 +122,6 @@ private static void test(Cipher cipher, int mode, SecretKey key,
                              AlgorithmParameters params,
                              byte[] in, byte[] answer) throws Exception {
         // test setup
-        debugBuf = new StringBuffer();
         cipher.init(mode, key, params);
         int outLen = cipher.getOutputSize(in.length);
         debugBuf.append("Estimated output size = " + outLen + "\n");
@@ -214,7 +213,7 @@ private static void test(Cipher cipher, int mode, SecretKey key,
         }
         match(outBuf, answer);
 
-        debugBuf = null;
+        debugBuf.setLength(0);
     }
 
     private static void match(byte[] b1, byte[] b2) throws Exception {
diff --git a/test/jdk/sun/security/pkcs11/PKCS11Test.java b/test/jdk/sun/security/pkcs11/PKCS11Test.java
index ffd1c42fd88..2810040e376 100644
--- a/test/jdk/sun/security/pkcs11/PKCS11Test.java
+++ b/test/jdk/sun/security/pkcs11/PKCS11Test.java
@@ -791,8 +791,8 @@ private static Path findNSSLibrary(Path path, Path libraryName) throws IOExcepti
                 (tp, attr) -> tp.getFileName().equals(libraryName))) {
 
             return files.findAny()
-                        .orElseThrow(() -> new SkippedException(
-                        "NSS library \"" + libraryName + "\" was not found in " + path));
+                        .orElseThrow(() ->
+                            new RuntimeException("NSS library \"" + libraryName + "\" was not found in " + path));
         }
     }
 
diff --git a/test/jdk/sun/security/tools/jarsigner/SymLinkTest.java b/test/jdk/sun/security/tools/jarsigner/SymLinkTest.java
index c96eeeeb74d..db9811d4ec3 100644
--- a/test/jdk/sun/security/tools/jarsigner/SymLinkTest.java
+++ b/test/jdk/sun/security/tools/jarsigner/SymLinkTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -57,7 +57,7 @@ public static void main(String[] args) throws Exception {
         Files.write(Path.of(ZIPFILENAME), ZIPBYTES);
 
         // check attributes before signing
-        verifyExtraAttrs(ZIPFILENAME);
+        verifyExternalFileAttributes(ZIPFILENAME);
 
         // generate key for signing
         SecurityTools.keytool(
@@ -82,7 +82,7 @@ public static void main(String[] args) throws Exception {
                 .shouldContain(WARNING_MSG);
 
         // recheck attributes after signing
-        verifyExtraAttrs(ZIPFILENAME);
+        verifyExternalFileAttributes(ZIPFILENAME);
 
         // verify zip file - expect warning
         SecurityTools.jarsigner(
@@ -95,8 +95,8 @@ public static void main(String[] args) throws Exception {
                 .shouldContain(WARNING_MSG);
     }
 
-    private static void verifyExtraAttrs(String zipFileName) throws IOException {
-        // the 16 bit extra attributes value should equal 0xa1ff - look for that pattern.
+    private static void verifyExternalFileAttributes(String zipFileName) throws IOException {
+        // the 16 bit 'external file attributes' value should equal 0xa1ff - look for that pattern.
         // Such values can be read from zip file via 'unzip -Z -l -v <zipfile>'
         try (FileInputStream fis = new FileInputStream(ZIPFILENAME)) {
             byte[] b = fis.readAllBytes();
@@ -107,7 +107,7 @@ private static void verifyExtraAttrs(String zipFileName) throws IOException {
                     return;
                 }
             }
-            throw new RuntimeException("extra attribute value not detected");
+            throw new RuntimeException("external file attribute value not detected");
         }
     }
 
diff --git a/test/jdk/sun/security/tools/keytool/KeyToolTest.java b/test/jdk/sun/security/tools/keytool/KeyToolTest.java
index b17f7b7d999..7b5f4d5556e 100644
--- a/test/jdk/sun/security/tools/keytool/KeyToolTest.java
+++ b/test/jdk/sun/security/tools/keytool/KeyToolTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
 
 /*
  * @test
+ * @library /java/security/testlibrary
  * @bug 6251120 8231950 8242151
  * @summary Testing keytool
  *
@@ -1865,172 +1866,4 @@ class TestException extends Exception {
     public TestException(String e) {
         super(e);
     }
-}
-
-/**
- * HumanInputStream tries to act like a human sitting in front of a computer
- * terminal typing on the keyboard while the keytool program is running.
- *
- * keytool has called InputStream.read() and BufferedReader.readLine() in
- * various places. a call to B.readLine() will try to buffer as much input as
- * possible. Thus, a trivial InputStream will find it impossible to feed
- * anything to I.read() after a B.readLine() call.
- *
- * This is why i create HumanInputStream, which will only send a single line
- * to B.readLine(), no more, no less, and the next I.read() can have a chance
- * to read the exact character right after "\n".
- *
- * I don't know why HumanInputStream works.
- */
-class HumanInputStream extends InputStream {
-    byte[] src;
-    int pos;
-    int length;
-    boolean inLine;
-    int stopIt;
-
-    public HumanInputStream(String input) {
-        src = input.getBytes();
-        pos = 0;
-        length = src.length;
-        stopIt = 0;
-        inLine = false;
-    }
-
-    // the trick: when called through read(byte[], int, int),
-    // return -1 twice after "\n"
-
-    @Override public int read() throws IOException {
-        int re;
-        if(pos < length) {
-            re = src[pos];
-            if(inLine) {
-                if(stopIt > 0) {
-                    stopIt--;
-                    re = -1;
-                } else {
-                    if(re == '\n') {
-                        stopIt = 2;
-                    }
-                    pos++;
-                }
-            } else {
-                pos++;
-            }
-        } else {
-            re = -1;//throw new IOException("NO MORE TO READ");
-        }
-        //if (re < 32) System.err.printf("[%02d]", re);
-        //else System.err.printf("[%c]", (char)re);
-        return re;
-    }
-    @Override public int read(byte[] buffer, int offset, int len) {
-        inLine = true;
-        try {
-            int re = super.read(buffer, offset, len);
-            return re;
-        } catch(Exception e) {
-            throw new RuntimeException("HumanInputStream error");
-        } finally {
-            inLine = false;
-        }
-    }
-    @Override public int available() {
-        if(pos < length) return 1;
-        return 0;
-    }
-
-    // test part
-    static void assertTrue(boolean bool) {
-        if(!bool)
-            throw new RuntimeException();
-    }
-
-    public static void test() throws Exception {
-
-        class Tester {
-            HumanInputStream is;
-            BufferedReader reader;
-            Tester(String s) {
-                is = new HumanInputStream(s);
-                reader = new BufferedReader(new InputStreamReader(is));
-            }
-
-            // three kinds of test method
-            // 1. read byte by byte from InputStream
-            void testStreamReadOnce(int expection) throws Exception {
-                assertTrue(is.read() == expection);
-            }
-            void testStreamReadMany(String expection) throws Exception {
-                char[] keys = expection.toCharArray();
-                for(int i=0; i<keys.length; i++) {
-                    assertTrue(is.read() == keys[i]);
-                }
-            }
-            // 2. read a line with a newly created Reader
-            void testReaderReadline(String expection) throws Exception {
-                String s = new BufferedReader(new InputStreamReader(is)).readLine();
-                if(s == null) assertTrue(expection == null);
-                else assertTrue(s.equals(expection));
-            }
-            // 3. read a line with the old Reader
-            void testReaderReadline2(String expection) throws Exception  {
-                String s = reader.readLine();
-                if(s == null) assertTrue(expection == null);
-                else assertTrue(s.equals(expection));
-            }
-        }
-
-        Tester test;
-
-        test = new Tester("111\n222\n\n444\n\n");
-        test.testReaderReadline("111");
-        test.testReaderReadline("222");
-        test.testReaderReadline("");
-        test.testReaderReadline("444");
-        test.testReaderReadline("");
-        test.testReaderReadline(null);
-
-        test = new Tester("111\n222\n\n444\n\n");
-        test.testReaderReadline2("111");
-        test.testReaderReadline2("222");
-        test.testReaderReadline2("");
-        test.testReaderReadline2("444");
-        test.testReaderReadline2("");
-        test.testReaderReadline2(null);
-
-        test = new Tester("111\n222\n\n444\n\n");
-        test.testReaderReadline2("111");
-        test.testReaderReadline("222");
-        test.testReaderReadline2("");
-        test.testReaderReadline2("444");
-        test.testReaderReadline("");
-        test.testReaderReadline2(null);
-
-        test = new Tester("1\n2");
-        test.testStreamReadMany("1\n2");
-        test.testStreamReadOnce(-1);
-
-        test = new Tester("12\n234");
-        test.testStreamReadOnce('1');
-        test.testReaderReadline("2");
-        test.testStreamReadOnce('2');
-        test.testReaderReadline2("34");
-        test.testReaderReadline2(null);
-
-        test = new Tester("changeit\n");
-        test.testStreamReadMany("changeit\n");
-        test.testReaderReadline(null);
-
-        test = new Tester("changeit\nName\nCountry\nYes\n");
-        test.testStreamReadMany("changeit\n");
-        test.testReaderReadline("Name");
-        test.testReaderReadline("Country");
-        test.testReaderReadline("Yes");
-        test.testReaderReadline(null);
-
-        test = new Tester("Me\nHere\n");
-        test.testReaderReadline2("Me");
-        test.testReaderReadline2("Here");
-    }
-}
+}
\ No newline at end of file
diff --git a/test/jdk/sun/security/tools/keytool/NssTest.java b/test/jdk/sun/security/tools/keytool/NssTest.java
index db5d1240153..1ed2d4c3f39 100644
--- a/test/jdk/sun/security/tools/keytool/NssTest.java
+++ b/test/jdk/sun/security/tools/keytool/NssTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, 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
@@ -29,7 +29,7 @@
 /*
  * @test
  * @summary It tests (almost) all keytool behaviors with NSS.
- * @library /test/lib /test/jdk/sun/security/pkcs11
+ * @library /test/lib /test/jdk/sun/security/pkcs11 /java/security/testlibrary
  * @modules java.base/sun.security.tools.keytool
  *          java.base/sun.security.util
  *          java.base/sun.security.x509
diff --git a/test/jdk/sun/tools/jcmd/TestJcmdSubcommandHelp.java b/test/jdk/sun/tools/jcmd/TestJcmdSubcommandHelp.java
new file mode 100644
index 00000000000..dee26ac5a17
--- /dev/null
+++ b/test/jdk/sun/tools/jcmd/TestJcmdSubcommandHelp.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Red Hat Inc.
+ * 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 8332124
+ * @summary Test to verify jcmd accepts the "-help", "--help" and "-h" suboptions as a command argument
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ * @run main/othervm TestJcmdSubcommandHelp
+ *
+ */
+
+import jdk.test.lib.process.OutputAnalyzer;
+
+
+public class TestJcmdSubcommandHelp {
+
+    private static final String HELP_ONE_DASH = "-help";
+    private static final String HELP_TWO_DASH = "--help";
+    private static final String SINGLE_H = "-h";
+    private static final String CMD = "VM.metaspace";
+    private static final String ILLEGAL = "IllegalArgumentException: Unknown argument";
+
+    public static void main(String[] args) throws Exception {
+
+        // Sanity check with empty input
+        OutputAnalyzer output = JcmdBase.jcmd();
+        output.shouldContain("The following commands are available:");
+
+        // Sanity check with existing usage for "help <cmd>"
+        output = JcmdBase.jcmd("help", CMD);
+        String expectedOutput = output.getOutput();
+        output.shouldNotContain("Unknown diagnostic command");
+
+        testExpectedUsage(HELP_ONE_DASH, expectedOutput);
+        testExpectedUsage(HELP_TWO_DASH, expectedOutput);
+        testExpectedUsage(SINGLE_H, expectedOutput);
+
+        testIgnoreAdditionalArgs(HELP_ONE_DASH, expectedOutput);
+        testIgnoreAdditionalArgs(HELP_TWO_DASH, expectedOutput);
+        testIgnoreAdditionalArgs(SINGLE_H, expectedOutput);
+
+        testIgnoreTrailingSpaces(HELP_ONE_DASH, expectedOutput);
+        testIgnoreTrailingSpaces(HELP_TWO_DASH, expectedOutput);
+        testIgnoreTrailingSpaces(SINGLE_H, expectedOutput);
+
+        testSimilarCommand(HELP_ONE_DASH + "less", ILLEGAL);
+        testSimilarCommand(HELP_TWO_DASH + "me", ILLEGAL);
+        testSimilarCommand(SINGLE_H + "ello", ILLEGAL);
+    }
+
+    private static void testExpectedUsage(String helpOption, String expectedOutput) throws Exception {
+        verifyOutput(new String[] {CMD, helpOption}, expectedOutput,
+                "Expected jcmd to accept '%s' suboption as a command argument and issue the same help output.".formatted(helpOption));
+    }
+
+    private static void testIgnoreAdditionalArgs(String helpOption, String expectedOutput) throws Exception {
+        verifyOutput(new String[] {CMD, helpOption, "basic"}, expectedOutput,
+                "Expected jcmd to accept '%s' suboption with additional arguments after help.".formatted(helpOption));
+    }
+
+    private static void testIgnoreTrailingSpaces(String helpOption, String expectedOutput) throws Exception {
+        verifyOutput(new String[] {CMD, "%s    ".formatted(helpOption)}, expectedOutput,
+                "Expected jcmd to accept '%s' suboption with trailing spaces".formatted(helpOption));
+    }
+
+    private static void testSimilarCommand(String helpOption, String expectedOutput) throws Exception {
+        verifyOutputContains(new String[] {CMD, helpOption}, expectedOutput,
+                "Expected jcmd to NOT accept '%s' suboption with trailing content".formatted(helpOption));
+    }
+
+    private static void verifyOutputContains(String[] args, String expectedOutput, String errorMessage) throws Exception {
+        OutputAnalyzer output = JcmdBase.jcmd(args);
+        String issuedOutput = output.getOutput();
+        if (!issuedOutput.contains(expectedOutput)) {
+            printDifferingOutputs(expectedOutput, issuedOutput);
+            throw new Exception(errorMessage);
+        }
+    }
+
+    private static void verifyOutput(String[] args, String expectedOutput, String errorMessage) throws Exception {
+        OutputAnalyzer output = JcmdBase.jcmd(args);
+        String issuedOutput = output.getOutput();
+        if (!expectedOutput.equals(issuedOutput)) {
+            printDifferingOutputs(expectedOutput, issuedOutput);
+            throw new Exception(errorMessage);
+        }
+    }
+
+    private static void printDifferingOutputs(String expectedOutput, String issuedOutput) {
+        System.out.println("Expected output: ");
+        System.out.println(expectedOutput);
+        System.out.println("Issued output: ");
+        System.out.println(issuedOutput);
+    }
+}
diff --git a/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java b/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java
index 53330c08618..89a5801cff7 100644
--- a/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java
+++ b/test/jdk/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java
@@ -54,7 +54,6 @@ public class JMapHeapConfigTest {
         "MaxHeapSize",
         "NewSize",
         "MaxNewSize",
-        "OldSize",
         "NewRatio",
         "SurvivorRatio",
         "MetaspaceSize",
diff --git a/test/jdk/sun/tools/jstatd/JstatdTest.java b/test/jdk/sun/tools/jstatd/JstatdTest.java
index b2ac3804f68..5041bc40d75 100644
--- a/test/jdk/sun/tools/jstatd/JstatdTest.java
+++ b/test/jdk/sun/tools/jstatd/JstatdTest.java
@@ -356,7 +356,7 @@ private void runTest(boolean useShortSyntax) throws Throwable {
         OutputAnalyzer output = jstatdThread.getOutput();
         List<String> stdout = output.asLinesWithoutVMWarnings();
         output.reportDiagnosticSummary();
-        assertEquals(stdout.size(), 1, "Output should contain one line");
+        assertEquals(stdout.size(), 2, "Output should contain two lines"); // includes deprecation warning
         assertTrue(stdout.get(0).startsWith("jstatd started"), "List should start with 'jstatd started'");
         assertNotEquals(output.getExitValue(), 0,
                 "jstatd process exited with unexpected exit code");
diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java
index 3faabcd6f8d..1a4dbd22897 100644
--- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java
+++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WindowsHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -139,6 +139,30 @@ static PackageHandlers createMsiPackageHandlers() {
                     String.format("TARGETDIR=\"%s\"",
                             unpackDir.toAbsolutePath().normalize())))));
             runMsiexecWithRetries(Executor.of("cmd", "/c", unpackBat.toString()));
+
+            //
+            // WiX3 uses "." as the value of "DefaultDir" field for "ProgramFiles64Folder" folder in msi's Directory table
+            // WiX4 uses "PFiles64" as the value of "DefaultDir" field for "ProgramFiles64Folder" folder in msi's Directory table
+            // msiexec creates "Program Files/./<App Installation Directory>" from WiX3 msi which translates to "Program Files/<App Installation Directory>"
+            // msiexec creates "Program Files/PFiles64/<App Installation Directory>" from WiX4 msi
+            // So for WiX4 msi we need to transform "Program Files/PFiles64/<App Installation Directory>" into "Program Files/<App Installation Directory>"
+            //
+            // WiX4 does the same thing for %LocalAppData%.
+            //
+            for (var extraPathComponent : List.of("PFiles64", "LocalApp")) {
+                if (Files.isDirectory(unpackDir.resolve(extraPathComponent))) {
+                    Path installationSubDirectory = getInstallationSubDirectory(cmd);
+                    Path from = Path.of(extraPathComponent).resolve(installationSubDirectory);
+                    Path to = installationSubDirectory;
+                    TKit.trace(String.format("Convert [%s] into [%s] in [%s] directory", from, to,
+                            unpackDir));
+                    ThrowingRunnable.toRunnable(() -> {
+                        Files.createDirectories(unpackDir.resolve(to).getParent());
+                        Files.move(unpackDir.resolve(from), unpackDir.resolve(to));
+                        TKit.deleteDirectoryRecursive(unpackDir.resolve(extraPathComponent));
+                    }).run();
+                }
+            }
             return destinationDir;
         };
         return msi;
diff --git a/test/jdk/tools/jpackage/windows/WinL10nTest.java b/test/jdk/tools/jpackage/windows/WinL10nTest.java
index deb6b1a8705..a868fd5f051 100644
--- a/test/jdk/tools/jpackage/windows/WinL10nTest.java
+++ b/test/jdk/tools/jpackage/windows/WinL10nTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2024, 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
@@ -33,6 +33,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import jdk.jpackage.test.Executor;
 
@@ -55,11 +56,11 @@
 public class WinL10nTest {
 
     public WinL10nTest(WixFileInitializer wxlFileInitializers[],
-            String expectedCulture, String expectedErrorMessage,
+            String[] expectedCultures, String expectedErrorMessage,
             String userLanguage, String userCountry,
             boolean enableWixUIExtension) {
         this.wxlFileInitializers = wxlFileInitializers;
-        this.expectedCulture = expectedCulture;
+        this.expectedCultures = expectedCultures;
         this.expectedErrorMessage = expectedErrorMessage;
         this.userLanguage = userLanguage;
         this.userCountry = userCountry;
@@ -69,56 +70,65 @@ public WinL10nTest(WixFileInitializer wxlFileInitializers[],
     @Parameters
     public static List<Object[]> data() {
         return List.of(new Object[][]{
-            {null, "en-us", null, null, null, false},
-            {null, "en-us", null, "en", "US", false},
-            {null, "en-us", null, "en", "US", true},
-            {null, "de-de", null, "de", "DE", false},
-            {null, "de-de", null, "de", "DE", true},
-            {null, "ja-jp", null, "ja", "JP", false},
-            {null, "ja-jp", null, "ja", "JP", true},
-            {null, "zh-cn", null, "zh", "CN", false},
-            {null, "zh-cn", null, "zh", "CN", true},
+            {null, new String[] {"en-us"}, null, null, null, false},
+            {null, new String[] {"en-us"}, null, "en", "US", false},
+            {null, new String[] {"en-us"}, null, "en", "US", true},
+            {null, new String[] {"de-de"}, null, "de", "DE", false},
+            {null, new String[] {"de-de"}, null, "de", "DE", true},
+            {null, new String[] {"ja-jp"}, null, "ja", "JP", false},
+            {null, new String[] {"ja-jp"}, null, "ja", "JP", true},
+            {null, new String[] {"zh-cn"}, null, "zh", "CN", false},
+            {null, new String[] {"zh-cn"}, null, "zh", "CN", true},
             {new WixFileInitializer[] {
                 WixFileInitializer.create("a.wxl", "en-us")
-            }, "en-us", null, null, null, false},
+            }, new String[] {"en-us"}, null, null, null, false},
             {new WixFileInitializer[] {
                 WixFileInitializer.create("a.wxl", "fr")
-            }, "fr;en-us", null, null, null, false},
+            }, new String[] {"fr", "en-us"}, null, null, null, false},
             {new WixFileInitializer[] {
                 WixFileInitializer.create("a.wxl", "fr"),
                 WixFileInitializer.create("b.wxl", "fr")
-            }, "fr;en-us", null, null, null, false},
+            }, new String[] {"fr", "en-us"}, null, null, null, false},
             {new WixFileInitializer[] {
                 WixFileInitializer.create("a.wxl", "it"),
                 WixFileInitializer.create("b.wxl", "fr")
-            }, "it;fr;en-us", null, null, null, false},
+            }, new String[] {"it", "fr", "en-us"}, null, null, null, false},
             {new WixFileInitializer[] {
                 WixFileInitializer.create("c.wxl", "it"),
                 WixFileInitializer.create("b.wxl", "fr")
-            }, "fr;it;en-us", null, null, null, false},
+            }, new String[] {"fr", "it", "en-us"}, null, null, null, false},
             {new WixFileInitializer[] {
                 WixFileInitializer.create("a.wxl", "fr"),
                 WixFileInitializer.create("b.wxl", "it"),
                 WixFileInitializer.create("c.wxl", "fr"),
                 WixFileInitializer.create("d.wxl", "it")
-            }, "fr;it;en-us", null, null, null, false},
+            }, new String[] {"fr", "it", "en-us"}, null, null, null, false},
             {new WixFileInitializer[] {
                 WixFileInitializer.create("c.wxl", "it"),
                 WixFileInitializer.createMalformed("b.wxl")
             }, null, null, null, null, false},
             {new WixFileInitializer[] {
                 WixFileInitializer.create("MsiInstallerStrings_de.wxl", "de")
-            }, "en-us", null, null, null, false}
+            }, new String[] {"en-us"}, null, null, null, false}
         });
     }
 
-    private static Stream<String> getLightCommandLine(
-            Executor.Result result) {
-        return result.getOutput().stream().filter(s -> {
+    private static Stream<String> getBuildCommandLine(Executor.Result result) {
+        return result.getOutput().stream().filter(createToolCommandLinePredicate("light").or(
+                createToolCommandLinePredicate("wix")));
+    }
+
+    private static boolean isWix3(Executor.Result result) {
+        return result.getOutput().stream().anyMatch(createToolCommandLinePredicate("light"));
+    }
+
+    private final static Predicate<String> createToolCommandLinePredicate(String wixToolName) {
+        var toolFileName = wixToolName + ".exe";
+        return (s) -> {
             s = s.trim();
-            return s.startsWith("light.exe") || ((s.contains("\\light.exe ")
-                    && s.contains(" -out ")));
-        });
+            return s.startsWith(toolFileName) || ((s.contains(String.format("\\%s ", toolFileName)) && s.
+                    contains(" -out ")));
+        };
     }
 
     private static List<TKit.TextStreamVerifier> createDefaultL10nFilesLocVerifiers(Path tempDir) {
@@ -148,14 +158,23 @@ public void test() throws IOException {
             // 2. Instruct test to save jpackage output.
             cmd.setFakeRuntime().saveConsoleOutput(true);
 
+            boolean withJavaOptions = false;
+
             // Set JVM default locale that is used to select primary l10n file.
             if (userLanguage != null) {
+                withJavaOptions = true;
                 cmd.addArguments("-J-Duser.language=" + userLanguage);
             }
             if (userCountry != null) {
+                withJavaOptions = true;
                 cmd.addArguments("-J-Duser.country=" + userCountry);
             }
 
+            if (withJavaOptions) {
+                // Use jpackage as a command to allow "-J" options come through
+                cmd.useToolProvider(false);
+            }
+
             // Cultures handling is affected by the WiX extensions used.
             // By default only WixUtilExtension is used, this flag
             // additionally enables WixUIExtension.
@@ -169,9 +188,16 @@ public void test() throws IOException {
             cmd.addArguments("--temp", tempDir.toString());
         })
         .addBundleVerifier((cmd, result) -> {
-            if (expectedCulture != null) {
-                TKit.assertTextStream("-cultures:" + expectedCulture).apply(
-                        getLightCommandLine(result));
+            if (expectedCultures != null) {
+                String expected;
+                if (isWix3(result)) {
+                    expected = "-cultures:" + String.join(";", expectedCultures);
+                } else {
+                    expected = Stream.of(expectedCultures).map(culture -> {
+                        return String.join(" ", "-culture", culture);
+                    }).collect(Collectors.joining(" "));
+                }
+                TKit.assertTextStream(expected).apply(getBuildCommandLine(result));
             }
 
             if (expectedErrorMessage != null) {
@@ -180,24 +206,24 @@ public void test() throws IOException {
             }
 
             if (wxlFileInitializers != null) {
+                var wixSrcDir = Path.of(cmd.getArgumentValue("--temp")).resolve("config");
+
                 if (allWxlFilesValid) {
                     for (var v : wxlFileInitializers) {
                         if (!v.name.startsWith("MsiInstallerStrings_")) {
-                            v.createCmdOutputVerifier(resourceDir).apply(
-                                    getLightCommandLine(result));
+                            v.createCmdOutputVerifier(wixSrcDir).apply(getBuildCommandLine(result));
                         }
                     }
                     Path tempDir = getTempDirectory(cmd, tempRoot).toAbsolutePath();
                     for (var v : createDefaultL10nFilesLocVerifiers(tempDir)) {
-                        v.apply(getLightCommandLine(result));
+                        v.apply(getBuildCommandLine(result));
                     }
                 } else {
                     Stream.of(wxlFileInitializers)
                             .filter(Predicate.not(WixFileInitializer::isValid))
                             .forEach(v -> v.createCmdOutputVerifier(
-                                    resourceDir).apply(result.getOutput().stream()));
-                    TKit.assertFalse(
-                            getLightCommandLine(result).findAny().isPresent(),
+                                    wixSrcDir).apply(result.getOutput().stream()));
+                    TKit.assertFalse(getBuildCommandLine(result).findAny().isPresent(),
                             "Check light.exe was not invoked");
                 }
             }
@@ -223,7 +249,7 @@ public void test() throws IOException {
     }
 
     final private WixFileInitializer[] wxlFileInitializers;
-    final private String expectedCulture;
+    final private String[] expectedCultures;
     final private String expectedErrorMessage;
     final private String userLanguage;
     final private String userCountry;
diff --git a/test/jdk/tools/launcher/HelpFlagsTest.java b/test/jdk/tools/launcher/HelpFlagsTest.java
index dda649b9f41..15c6c101dd0 100644
--- a/test/jdk/tools/launcher/HelpFlagsTest.java
+++ b/test/jdk/tools/launcher/HelpFlagsTest.java
@@ -141,6 +141,7 @@ private static class ToolHelpSpec {
         new ToolHelpSpec("jlink",       1,   1,   1,   0,         0,    0,     2),     // -?, -h, --help
         new ToolHelpSpec("jmap",        1,   1,   1,   0,         1,    0,     1),     // -?, -h, --help, -help accepted but not documented.
         new ToolHelpSpec("jmod",        1,   1,   1,   0,         1,    0,     2),     // -?, -h, --help, -help accepted but not documented.
+        new ToolHelpSpec("jnativescan", 1,   1,   1,   0,         1,    0,     1),     // -?, -h, --help, -help accepted but not documented.
         new ToolHelpSpec("jps",         1,   1,   1,   0,         1,    1,     1),     // -?, -h, --help -help, Documents -help
         new ToolHelpSpec("jrunscript",  1,   1,   1,   0,         1,    1,     7),     // -?, -h, --help -help, Documents -help
         new ToolHelpSpec("jshell",      1,   1,   1,   0,         1,    0,     1),     // -?, -h, --help, -help accepted but not documented.
diff --git a/test/jtreg-ext/requires/VMProps.java b/test/jtreg-ext/requires/VMProps.java
index e37646ac6d1..49cc6e14311 100644
--- a/test/jtreg-ext/requires/VMProps.java
+++ b/test/jtreg-ext/requires/VMProps.java
@@ -386,7 +386,6 @@ protected void vmOptFinalFlags(SafeMap map) {
         vmOptFinalFlag(map, "EliminateAllocations");
         vmOptFinalFlag(map, "UseCompressedOops");
         vmOptFinalFlag(map, "UseVectorizedMismatchIntrinsic");
-        vmOptFinalFlag(map, "UseVtableBasedCHA");
         vmOptFinalFlag(map, "ZGenerational");
     }
 
diff --git a/test/langtools/TEST.ROOT b/test/langtools/TEST.ROOT
index da884dee170..11daad5244f 100644
--- a/test/langtools/TEST.ROOT
+++ b/test/langtools/TEST.ROOT
@@ -15,7 +15,7 @@ keys=intermittent randomness needs-src needs-src-jdk_javadoc
 groups=TEST.groups
 
 # Minimum jtreg version
-requiredVersion=7.3.1+1
+requiredVersion=7.4+1
 
 # Use new module options
 useNewOptions=true
diff --git a/test/langtools/TEST.groups b/test/langtools/TEST.groups
index 74503501da9..e290a1431a3 100644
--- a/test/langtools/TEST.groups
+++ b/test/langtools/TEST.groups
@@ -63,6 +63,10 @@ langtools_jdeps = \
     tools/all \
     tools/jdeps
 
+langtools_jnativescan = \
+    tools/all \
+    tools/jnativescan
+
 langtools_slow = \
     jdk/internal/shellsupport/doc/FullJavadocHelperTest.java
 
diff --git a/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java
new file mode 100644
index 00000000000..8d2d8e7dd78
--- /dev/null
+++ b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/TestGlobalHtml.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2024, 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      8322708
+ * @summary  Test to make sure global tags work properly
+ * @library  /tools/lib ../../lib
+ * @modules jdk.javadoc/jdk.javadoc.internal.tool
+ * @build    toolbox.ToolBox javadoc.tester.*
+ * @run main TestGlobalHtml
+ */
+
+import javadoc.tester.JavadocTester;
+import toolbox.ToolBox;
+
+import java.nio.file.Path;
+
+public class TestGlobalHtml extends JavadocTester {
+    ToolBox tb = new ToolBox();
+
+    public static void main(String... args) throws Exception {
+        var tester = new TestGlobalHtml();
+        tester.runTests();
+    }
+
+    @Test
+    public void testGlobalTags() {
+        javadoc("--allow-script-in-comments",
+                "-d",
+                "out-global",
+                "-sourcepath",
+                testSrc,
+                "pkg1");
+        checkExit(Exit.OK);
+    }
+
+    @Test
+    public void testNegative(Path base) throws Exception {
+        Path src = base.resolve("src");
+        tb.writeJavaFiles(src,
+                """
+                package p;
+                /**
+                 * class comment
+                 * <a href="https://openjdk.org/">Hyperlink to the OpenJDK website</a>
+                 */
+                public class C {
+                    /**
+                     * <form>
+                     *   <label for="methodname">Method name:</label><br>
+                     *   <input type="text" id="methodname" name="methodname"><br>
+                     *   <label for="paramname">Method Parameter:</label><br>
+                     *   <input type="text" id="paramname" name="paramname">
+                     * </form>
+                     */
+                    public C() {
+                    }
+                }
+                """);
+
+        javadoc("--allow-script-in-comments",
+                "-d",
+                "out-negative",
+                "-sourcepath",
+                src.toString(),
+                "p");
+        checkExit(Exit.ERROR);
+    }
+}
diff --git a/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java
new file mode 100644
index 00000000000..9f823fbad05
--- /dev/null
+++ b/test/langtools/jdk/javadoc/doclet/TestGlobalHtml/pkg1/C1.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2024, 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 pkg1;
+
+
+/**
+ * <div inert>
+ * <p> This content is inert and not interactable.</p>
+ * <a href="https://openjdk.org/" title="OpenJDK's Website" tabindex="0">
+ * Visit OpenJDK's Website!
+ * </a>
+ * </div>
+ *
+ * <div>
+ *   <p autocapitalize="on">This content is interactable.</p>
+ *   <a href="https://openjdk.org/" title="OpenJDK's Website" tabindex="0">
+ *     Visit OpenJDK's Website!
+ *   </a>
+ * </div>
+ *
+ *
+ * <div dir="ltr" lang="en">
+ *   <p itemprop="description">This is used in a jtreg test to check that global HTML tags are allowed</p>
+ *   <ul spellcheck="true">
+ *     <li>Class C</li>
+ *     <li>Has a default constructor</li>
+ *   </ul>
+ * </div>
+ *
+ * <p contenteditable="true" inputmode="text">Here is a description of the class and methods:</p>
+ *
+ * <ol draggable="true" tabindex="0">
+ *   <li><p accesskey="1" data-element-type="constructor" title="Class Details">Has a default constructor</p></li>
+ *   <li><p accesskey="2" data-element-type="toString" title="Methods Summary">Overrides toString method</p></li>
+ *   <li><p accesskey="3" data-element-type="other" title="Usage Example">Is used for testing</p></li>
+ * </ol>
+ *
+ * <div itemscope>
+ *   <p itemprop="name">C1</p>
+ *   <p itemprop="description">C1</p>
+ * </div>
+ */
+public class C1 {
+
+    /**
+     * <p lang="en" accesskey="D" autocapitalize="on" draggable="true" spellcheck="false">
+     * Default constructor for the {@code C1} class. (this content is draggable!) </p>
+     * <div lang="en" contenteditable="true">
+     *   <p itemprop="creator">Author: try editing this content!</p>
+     *   <p title="Creation Date">Created on: June 14 2024</p>
+     * </div>
+     */
+    public C1() {
+    }
+
+    /**
+     * A method in C1
+     *
+     * <p lang="en" inputmode="numeric">simple method.</p>
+     *
+     * <div itemprop="method" itemscope>
+     *   <p itemprop="name">method m</p>
+     *   <p itemprop="description">the method m does nothing</p>
+     * </div>
+     */
+    public void m() {
+    }
+
+    /**
+     * A toString Override.
+     *
+     * <p dir="ltr" spellcheck="true">returns a String Object.</p>
+     *
+     * <div itemprop="method" itemscope>
+     *   <p itemprop="name">toString</p>
+     * </div>
+     *
+     * @return a string.
+     */
+    @Override
+    public String toString() {
+        return "C1";
+    }
+}
diff --git a/test/langtools/jdk/javadoc/doclet/testIOException/TestIOException.java b/test/langtools/jdk/javadoc/doclet/testIOException/TestIOException.java
index 9127cdf86bb..5dd81b62d33 100644
--- a/test/langtools/jdk/javadoc/doclet/testIOException/TestIOException.java
+++ b/test/langtools/jdk/javadoc/doclet/testIOException/TestIOException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,9 +23,9 @@
 
 /*
  * @test
- * @bug 8164130
+ * @bug 8164130 8334332
  * @summary test IOException handling
- * @library ../../lib
+ * @library ../../lib /test/lib
  * @modules jdk.javadoc/jdk.javadoc.internal.tool
  * @build javadoc.tester.*
  * @run main TestIOException
@@ -39,6 +39,7 @@
 import java.util.Map;
 
 import javadoc.tester.JavadocTester;
+import jtreg.SkippedException;
 
 /**
  * Tests IO Exception handling.
@@ -61,16 +62,13 @@ public static void main(String... args) throws Exception {
     public void testReadOnlyDirectory() {
         File outDir = new File("out1");
         if (!outDir.mkdir()) {
-            throw error(outDir, "Cannot create directory");
+            throw skip(outDir, "Cannot create directory");
         }
         if (!outDir.setReadOnly()) {
-            if (skip(outDir)) {
-                return;
-            }
-            throw error(outDir, "could not set directory read-only");
+            throw skip(outDir, "could not set directory read-only");
         }
         if (outDir.canWrite()) {
-            throw error(outDir, "directory is writable");
+            throw skip(outDir, "directory is writable");
         }
 
         try {
@@ -93,15 +91,15 @@ public void testReadOnlyDirectory() {
     public void testReadOnlyFile() throws Exception {
         File outDir = new File("out2");
         if (!outDir.mkdir()) {
-            throw error(outDir, "Cannot create directory");
+            throw skip(outDir, "Cannot create directory");
         }
         File index = new File(outDir, "index.html");
         try (FileWriter fw = new FileWriter(index)) { }
         if (!index.setReadOnly()) {
-            throw error(index, "could not set index read-only");
+            throw skip(index, "could not set index read-only");
         }
         if (index.canWrite()) {
-            throw error(index, "index is writable");
+            throw skip(index, "index is writable");
         }
 
         try {
@@ -139,16 +137,13 @@ public void testReadOnlySubdirectory() throws Exception {
         File outDir = new File("out3");
         File pkgOutDir = new File(outDir, "p");
         if (!pkgOutDir.mkdirs()) {
-            throw error(pkgOutDir, "Cannot create directory");
+            throw skip(pkgOutDir, "Cannot create directory");
         }
         if (!pkgOutDir.setReadOnly()) {
-            if (skip(pkgOutDir)) {
-                return;
-            }
-            throw error(pkgOutDir, "could not set directory read-only");
+            throw skip(pkgOutDir, "could not set directory read-only");
         }
         if (pkgOutDir.canWrite()) {
-            throw error(pkgOutDir, "directory is writable");
+            throw skip(pkgOutDir, "directory is writable");
         }
 
         // run javadoc and check results
@@ -192,16 +187,13 @@ public void testReadOnlyDocFilesDir() throws Exception {
         File pkgOutDir = new File(outDir, "p");
         File docFilesOutDir = new File(pkgOutDir, "doc-files");
         if (!docFilesOutDir.mkdirs()) {
-            throw error(docFilesOutDir, "Cannot create directory");
+            throw skip(docFilesOutDir, "Cannot create directory");
         }
         if (!docFilesOutDir.setReadOnly()) {
-            if (skip(docFilesOutDir)) {
-                return;
-            }
-            throw error(docFilesOutDir, "could not set directory read-only");
+            throw skip(docFilesOutDir, "could not set directory read-only");
         }
         if (docFilesOutDir.canWrite()) {
-            throw error(docFilesOutDir, "directory is writable");
+            throw skip(docFilesOutDir, "directory is writable");
         }
 
         try {
@@ -219,10 +211,11 @@ public void testReadOnlyDocFilesDir() throws Exception {
         }
     }
 
-    private Error error(File f, String message) {
+    private Error skip(File f, String message) {
+        out.print(System.getProperty("user.name"));
         out.println(f + ": " + message);
         showAllAttributes(f.toPath());
-        throw new Error(f + ": " + message);
+        throw new SkippedException(f + ": " + message);
     }
 
     private void showAllAttributes(Path p) {
@@ -242,20 +235,5 @@ private void showAttributes(Path p, String attributes) {
             out.println("Error accessing attributes " + attributes + ": " + t);
         }
     }
-
-    private boolean skip(File dir) {
-        if (isWindows()) {
-            showAllAttributes(dir.toPath());
-            out.println("Windows: cannot set directory read only:" + dir);
-            out.println("TEST CASE SKIPPED");
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    private boolean isWindows() {
-        return System.getProperty("os.name").toLowerCase(Locale.US).startsWith("windows");
-    }
 }
 
diff --git a/test/langtools/jdk/jshell/TerminalNoExecTest.java b/test/langtools/jdk/jshell/TerminalNoExecTest.java
new file mode 100644
index 00000000000..3d76157fd26
--- /dev/null
+++ b/test/langtools/jdk/jshell/TerminalNoExecTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2024, 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 8334433
+ * @summary Verify that when running JShell on platforms that support FFMTerminalProvider,
+ *          no new processes are spawned.
+ * @requires os.family == "windows" | os.family == "mac" | os.family == "linux"
+ * @library /tools/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ *          jdk.compiler/com.sun.tools.javac.main
+ *          jdk.compiler/com.sun.tools.javac.util
+ * @build toolbox.ToolBox toolbox.JavaTask TerminalNoExecTest
+ * @run main TerminalNoExecTest
+ */
+
+import java.io.Writer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import jdk.jfr.consumer.RecordingStream;
+import jdk.jshell.tool.JavaShellToolBuilder;
+
+import toolbox.ToolBox;
+
+public class TerminalNoExecTest {
+
+    public static void main(String... args) throws Exception {
+        if (args.length > 0) {
+            AtomicBoolean spawnedNewProcess = new AtomicBoolean();
+            try (var rs = new RecordingStream()) {
+                rs.enable("jdk.ProcessStart").withoutThreshold();
+                rs.onEvent(evt -> {
+                    System.err.println("evt: " + evt);
+                    spawnedNewProcess.set(true);
+                });
+                rs.startAsync();
+                JavaShellToolBuilder.builder().run("--execution=local", "--no-startup");
+                rs.stop();
+            }
+            if (spawnedNewProcess.get()) {
+                System.err.println("Spawned a new process!");
+                System.exit(1);
+            }
+            System.exit(0);
+        } else {
+            Path testScript = Paths.get("do-exit");
+            try (Writer w = Files.newBufferedWriter(testScript)) {
+                w.append("/exit\n");
+            }
+
+            ToolBox tb = new ToolBox();
+            Process target =
+                new ProcessBuilder(tb.getJDKTool("java").toString(),
+                                   "-classpath", System.getProperty("java.class.path"),
+                                   TerminalNoExecTest.class.getName(),
+                                   "run-test")
+                        .redirectError(ProcessBuilder.Redirect.INHERIT)
+                        .redirectOutput(ProcessBuilder.Redirect.INHERIT)
+                        .redirectInput(testScript.toFile())
+                        .start();
+
+            target.waitFor();
+
+            int exitCode = target.exitValue();
+
+            if (exitCode != 0) {
+                throw new AssertionError("Incorrect exit value, expected 0, got: " + exitCode);
+            }
+        }
+    }
+
+}
diff --git a/test/langtools/jdk/jshell/ToolSimpleTest.java b/test/langtools/jdk/jshell/ToolSimpleTest.java
index 222acb5291c..60d4f369521 100644
--- a/test/langtools/jdk/jshell/ToolSimpleTest.java
+++ b/test/langtools/jdk/jshell/ToolSimpleTest.java
@@ -27,7 +27,7 @@
  *      8167128 8154513 8170015 8170368 8172102 8172103 8165405 8173073 8173848
  *      8174041 8173916 8174028 8174262 8174797 8177079 8180508 8177466 8172154
  *      8192979 8191842 8198573 8198801 8210596 8210959 8215099 8199623 8236715
- *      8239536 8247456 8246774 8238173 8292625 8306560
+ *      8239536 8247456 8246774 8238173 8292625 8306560 8328536
  * @summary Simple jshell tool tests
  * @modules jdk.compiler/com.sun.tools.javac.api
  *          jdk.compiler/com.sun.tools.javac.main
@@ -964,6 +964,13 @@ public void testSwitchStatementExpressionDisambiguation() {
                 );
     }
 
+    @Test
+    public void testSwitchExpressionYieldUnknownType() {
+        test(a -> assertCommandOutputContains(a,
+                "I m(I i, int x) { return switch (x) { default -> i; }; } ",
+                "created method m(I,int), however, it cannot be referenced until class I is declared"));
+    }
+
     @Test
     public void testSelfReference() {
         test(
diff --git a/test/langtools/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out b/test/langtools/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out
index 140521689a0..c04b45bce1e 100644
--- a/test/langtools/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out
+++ b/test/langtools/tools/javac/AnonymousClass/AnonymousInSuperCallNegTest.out
@@ -1,2 +1,2 @@
-AnonymousInSuperCallNegTest.java:23:49: compiler.err.no.encl.instance.of.type.in.scope: AnonymousInSuperCallNegTest.JavacBug
+AnonymousInSuperCallNegTest.java:23:49: compiler.err.cant.ref.before.ctor.called: x
 1 error
diff --git a/test/langtools/tools/javac/LocalClassCtorPrologue.out b/test/langtools/tools/javac/LocalClassCtorPrologue.out
index f1a999af491..65f3418825d 100644
--- a/test/langtools/tools/javac/LocalClassCtorPrologue.out
+++ b/test/langtools/tools/javac/LocalClassCtorPrologue.out
@@ -1,4 +1,4 @@
-LocalClassCtorPrologue.java:16:17: compiler.err.no.encl.instance.of.type.in.scope: LocalClassCtorPrologue
+LocalClassCtorPrologue.java:16:17: compiler.err.cant.ref.before.ctor.called: x
 - compiler.note.preview.filename: LocalClassCtorPrologue.java, DEFAULT
 - compiler.note.preview.recompile
 1 error
diff --git a/test/langtools/tools/javac/MethodParametersTest.java b/test/langtools/tools/javac/MethodParametersTest.java
index 8ce73671d1f..a4d55525e60 100644
--- a/test/langtools/tools/javac/MethodParametersTest.java
+++ b/test/langtools/tools/javac/MethodParametersTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, 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
@@ -184,7 +184,7 @@ void modifyBaz(boolean flip) throws Exception {
 
         // Alter the MethodParameters attribute, changing the name of
         // the parameter from i to baz.
-        byte[] bazBytes = ClassFile.of().transform(baz, ClassTransform.transformingMethods((methodBuilder, methodElement) -> {
+        byte[] bazBytes = ClassFile.of().transformClass(baz, ClassTransform.transformingMethods((methodBuilder, methodElement) -> {
             if (methodElement instanceof MethodParametersAttribute a) {
                 List<MethodParameterInfo> newParameterInfos = new ArrayList<>();
                 for (MethodParameterInfo info : a.parameters()) {
@@ -200,7 +200,7 @@ void modifyBaz(boolean flip) throws Exception {
         // Flip the code and method attributes().  This is for checking
         // that order doesn't matter.
         if (flip) {
-            bazBytes = ClassFile.of().transform(baz, ClassTransform.transformingMethods((methodBuilder, methodElement) -> {
+            bazBytes = ClassFile.of().transformClass(baz, ClassTransform.transformingMethods((methodBuilder, methodElement) -> {
                 if (methodElement instanceof MethodParametersAttribute) {
                     methodBuilder.with(cattr);
                 } else if (methodElement instanceof CodeAttribute){
diff --git a/test/langtools/tools/javac/SuperInit/AnonSuperLambdaCrash.java b/test/langtools/tools/javac/SuperInit/AnonSuperLambdaCrash.java
new file mode 100644
index 00000000000..3ca895194f1
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/AnonSuperLambdaCrash.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2024, 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 8333766
+ * @summary Test for compiler crash when anonymous class created in early lambda
+ */
+
+public class AnonSuperLambdaCrash {
+    class Inner {
+        Inner() {
+            this(() -> new Object() { { AnonSuperLambdaCrash.this.hashCode(); } });
+        }
+        Inner(Runnable r) {
+            r.run();
+        }
+    }
+
+    public static void main(String[] args) {
+        new AnonSuperLambdaCrash().new Inner();
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.java b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.java
new file mode 100644
index 00000000000..abb6bacbc8f
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.java
@@ -0,0 +1,21 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8334258
+ * @summary Disallow early assignment if FLEXIBLE_CONSTRUCTORS preview feature is not enabled
+ * @compile/fail/ref=EarlyAssignmentNoPreview1.out -XDrawDiagnostics EarlyAssignmentNoPreview1.java
+ */
+public class EarlyAssignmentNoPreview1 {
+
+    Runnable r;
+
+    public EarlyAssignmentNoPreview1() {
+        this(r = () -> System.out.println("hello"));
+    }
+
+    public EarlyAssignmentNoPreview1(Runnable r) {
+    }
+
+    public static void main(String[] args) {
+        new EarlyAssignmentNoPreview1();
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.out b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.out
new file mode 100644
index 00000000000..6c5afbbd12b
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview1.out
@@ -0,0 +1,2 @@
+EarlyAssignmentNoPreview1.java:12:14: compiler.err.preview.feature.disabled: (compiler.misc.feature.flexible.constructors)
+1 error
diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.java b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.java
new file mode 100644
index 00000000000..3c33734f42a
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.java
@@ -0,0 +1,21 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8334258
+ * @summary Disallow early assignment if FLEXIBLE_CONSTRUCTORS preview feature is not enabled
+ * @compile/fail/ref=EarlyAssignmentNoPreview2.out -XDrawDiagnostics EarlyAssignmentNoPreview2.java
+ */
+public class EarlyAssignmentNoPreview2 {
+
+    Runnable r;
+
+    public EarlyAssignmentNoPreview2() {
+        this(this.r = () -> System.out.println("hello"));
+    }
+
+    public EarlyAssignmentNoPreview2(Runnable r) {
+    }
+
+    public static void main(String[] args) {
+        new EarlyAssignmentNoPreview2();
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.out b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.out
new file mode 100644
index 00000000000..38fb885684e
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview2.out
@@ -0,0 +1,2 @@
+EarlyAssignmentNoPreview2.java:12:14: compiler.err.preview.feature.disabled: (compiler.misc.feature.flexible.constructors)
+1 error
diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.java b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.java
new file mode 100644
index 00000000000..f6269f2cb1f
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.java
@@ -0,0 +1,21 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8334258
+ * @summary Disallow early assignment if FLEXIBLE_CONSTRUCTORS preview feature is not enabled
+ * @compile/fail/ref=EarlyAssignmentNoPreview3.out -XDrawDiagnostics EarlyAssignmentNoPreview3.java
+ */
+public class EarlyAssignmentNoPreview3 {
+
+    Runnable r;
+
+    public EarlyAssignmentNoPreview3() {
+        this(EarlyAssignmentNoPreview3.this.r = () -> System.out.println("hello"));
+    }
+
+    public EarlyAssignmentNoPreview3(Runnable r) {
+    }
+
+    public static void main(String[] args) {
+        new EarlyAssignmentNoPreview3();
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.out b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.out
new file mode 100644
index 00000000000..def9f4f3722
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyAssignmentNoPreview3.out
@@ -0,0 +1,2 @@
+EarlyAssignmentNoPreview3.java:12:39: compiler.err.preview.feature.disabled: (compiler.misc.feature.flexible.constructors)
+1 error
diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignments.java b/test/langtools/tools/javac/SuperInit/EarlyAssignments.java
index 89a13ccf0ff..c3cad5d7016 100644
--- a/test/langtools/tools/javac/SuperInit/EarlyAssignments.java
+++ b/test/langtools/tools/javac/SuperInit/EarlyAssignments.java
@@ -158,4 +158,15 @@ public Inner7() {
             super();
         }
     }
+
+    public static class Inner8 {
+        class Inner8a {
+            int x;
+        }
+
+        public Inner8() {
+            this.new Inner8a().x = 1;           // FAIL - illegal early access
+            super();
+        }
+    }
 }
diff --git a/test/langtools/tools/javac/SuperInit/EarlyAssignments.out b/test/langtools/tools/javac/SuperInit/EarlyAssignments.out
index 81b4f20b505..38182c2d312 100644
--- a/test/langtools/tools/javac/SuperInit/EarlyAssignments.out
+++ b/test/langtools/tools/javac/SuperInit/EarlyAssignments.out
@@ -23,6 +23,7 @@ EarlyAssignments.java:134:17: compiler.err.cant.ref.before.ctor.called: super
 EarlyAssignments.java:139:23: compiler.err.cant.ref.before.ctor.called: this
 EarlyAssignments.java:148:13: compiler.err.cant.assign.initialized.before.ctor.called: x
 EarlyAssignments.java:157:13: compiler.err.cant.assign.val.to.var: final, x
+EarlyAssignments.java:168:13: compiler.err.cant.ref.before.ctor.called: this
 - compiler.note.preview.filename: EarlyAssignments.java, DEFAULT
 - compiler.note.preview.recompile
-25 errors
+26 errors
diff --git a/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.java b/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.java
new file mode 100644
index 00000000000..a8ee3a2aea5
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.java
@@ -0,0 +1,16 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8334488
+ * @summary Verify the error message generated for early access from inner class
+ * @compile/fail/ref=EarlyInnerAccessErrorMessageTest.out -XDrawDiagnostics EarlyInnerAccessErrorMessageTest.java
+ * @enablePreview
+ */
+public class EarlyInnerAccessErrorMessageTest {
+    int x;
+    EarlyInnerAccessErrorMessageTest() {
+        class Inner {
+            { System.out.println(x); }
+        }
+        super();
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.out b/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.out
new file mode 100644
index 00000000000..a8d690a4c23
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyInnerAccessErrorMessageTest.out
@@ -0,0 +1,4 @@
+EarlyInnerAccessErrorMessageTest.java:12:34: compiler.err.cant.ref.before.ctor.called: x
+- compiler.note.preview.filename: EarlyInnerAccessErrorMessageTest.java, DEFAULT
+- compiler.note.preview.recompile
+1 error
diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalClass.out b/test/langtools/tools/javac/SuperInit/EarlyLocalClass.out
index 390b68ea2c9..ee01f9c403d 100644
--- a/test/langtools/tools/javac/SuperInit/EarlyLocalClass.out
+++ b/test/langtools/tools/javac/SuperInit/EarlyLocalClass.out
@@ -1,4 +1,4 @@
-EarlyLocalClass.java:12:32: compiler.err.no.encl.instance.of.type.in.scope: EarlyLocalClass
+EarlyLocalClass.java:12:32: compiler.err.cant.ref.before.ctor.called: this
 - compiler.note.preview.filename: EarlyLocalClass.java, DEFAULT
 - compiler.note.preview.recompile
 1 error
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/CompilableTest.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest1.java
similarity index 66%
rename from test/hotspot/jtreg/compiler/testlibrary/rtm/CompilableTest.java
rename to test/langtools/tools/javac/SuperInit/EarlyLocalTest1.java
index da701fa30a6..5d9060da83c 100644
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/CompilableTest.java
+++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest1.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 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
@@ -20,21 +20,24 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-
-package compiler.testlibrary.rtm;
-
-/**
- * Interface for test scenarios that contain methods
- * that should be compiled.
+/*
+ * @test
+ * @bug 8333313
+ * @summary Verify references to local classes declared in early construction contexts
+ * @enablePreview
  */
-public interface CompilableTest {
-    /**
-     * @return array with methods' names that should be compiled.
-     */
-    String[] getMethodsToCompileNames();
+public class EarlyLocalTest1 {
+
+    class Test {
+        Test() {
+            class InnerLocal { }
+            Runnable r = () -> new InnerLocal();
+            r.run();
+            super();
+        }
+    }
 
-    /**
-     * @return name of method with RTM-elided lock.
-     */
-    String getMethodWithLockName();
+    public static void main(String[] args) {
+        new EarlyLocalTest1().new Test();
+    }
 }
diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest4.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest4.java
new file mode 100644
index 00000000000..cce6092f606
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest4.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2024, 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 8333313
+ * @summary Verify references to local classes declared in early construction contexts
+ * @enablePreview
+ */
+public class EarlyLocalTest4 {
+
+    class Test {
+        Test() {
+            class InnerLocal { }
+            Runnable r = new Runnable() {
+                public void run() {
+                    new InnerLocal();
+                }
+            };
+            r.run();
+            super();
+        }
+    }
+
+    public static void main(String[] args) {
+        new EarlyLocalTest4().new Test();
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest5.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest5.java
new file mode 100644
index 00000000000..6858e068af8
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest5.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2024, 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 8333313
+ * @summary Verify references to local classes declared in early construction contexts
+ * @enablePreview
+ */
+import java.util.concurrent.atomic.AtomicReference;
+
+public class EarlyLocalTest5 {
+
+    int y;
+
+    class Test extends AtomicReference<Runnable> {
+        Test(int x) {
+            class Foo implements Runnable {
+                public void run() {
+                    System.out.println(x + y);
+                }
+            }
+            super(new Foo());
+        }
+    }
+
+    public static void main(String[] args) {
+        new EarlyLocalTest5().new Test(42);
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest6.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest6.java
new file mode 100644
index 00000000000..742496a48d5
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest6.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2024, 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 8333313
+ * @summary Verify references to local classes declared in early construction contexts
+ * @enablePreview
+ */
+import java.util.concurrent.atomic.AtomicReference;
+
+public class EarlyLocalTest6 {
+
+    int y;
+
+    class Test extends AtomicReference<Runnable> {
+        Test(int x) {
+            super(new Runnable() {
+                public void run() {
+                    System.out.println(x + y);
+                }
+            });
+        }
+    }
+
+    public static void main(String[] args) {
+        new EarlyLocalTest6().new Test(42);
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/EarlyLocalTest7.java b/test/langtools/tools/javac/SuperInit/EarlyLocalTest7.java
new file mode 100644
index 00000000000..1ce63bc04ba
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/EarlyLocalTest7.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2024, 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 8333313
+ * @summary Verify references to local classes declared in early construction contexts
+ * @enablePreview
+ */
+import java.util.concurrent.atomic.AtomicReference;
+
+public class EarlyLocalTest7 {
+
+    int y;
+
+    class Test extends AtomicReference<Runnable> {
+        Test(int x) {
+            super(() -> System.out.println(x + y));
+        }
+    }
+
+    public static void main(String[] args) {
+        new EarlyLocalTest7().new Test(42);
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/LambdaLocalEarlyCrash.java b/test/langtools/tools/javac/SuperInit/LambdaLocalEarlyCrash.java
new file mode 100644
index 00000000000..660e7d19f4e
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/LambdaLocalEarlyCrash.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2024, 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 8334037
+ * @summary Test for compiler crash when local class created in early lambda
+ * @enablePreview
+ */
+
+public class LambdaLocalEarlyCrash {
+    interface A { }
+
+    class Inner {
+       Inner() {
+          this(() -> {
+             class Local {
+                void g() {
+                   m();
+                }
+             }
+             new Local().g(); // error
+          });
+       }
+
+       Inner(Runnable tr) {
+          tr.run();
+       }
+    }
+
+    void m() {
+       System.out.println("Hello");
+    }
+
+    public static void main(String[] args) {
+       new LambdaLocalEarlyCrash().new Inner();
+    }
+}
diff --git a/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java b/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java
new file mode 100644
index 00000000000..261b23dc298
--- /dev/null
+++ b/test/langtools/tools/javac/SuperInit/LambdaOuterCapture.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2024, 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 8334252
+ * @summary Test lambda declared in early construction context
+ * @enablePreview
+ */
+
+public class LambdaOuterCapture {
+
+    public class Inner {
+
+        public Inner() {
+            Runnable r = () -> System.out.println(LambdaOuterCapture.this);
+            this(r);
+        }
+
+        public Inner(Runnable r) {
+        }
+    }
+
+    public static void main(String[] args) {
+        new LambdaOuterCapture().new Inner();
+    }
+}
diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.java b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.java
new file mode 100644
index 00000000000..8d575caec57
--- /dev/null
+++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.java
@@ -0,0 +1,19 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8334757
+ * @compile/fail/ref=CantAnnotateClassWithTypeVariable.out -XDrawDiagnostics CantAnnotateClassWithTypeVariable.java
+ */
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+public class CantAnnotateClassWithTypeVariable {
+  @Target(ElementType.TYPE_USE)
+  @interface TA {}
+
+  static class A {
+    static class B<T> {}
+  }
+
+  <T> @TA A.B<T> f() {}
+}
diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.out b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.out
new file mode 100644
index 00000000000..80fa9f2cdd9
--- /dev/null
+++ b/test/langtools/tools/javac/annotations/typeAnnotations/failures/CantAnnotateClassWithTypeVariable.out
@@ -0,0 +1,2 @@
+CantAnnotateClassWithTypeVariable.java:18:14: compiler.err.type.annotation.inadmissible: (compiler.misc.type.annotation.1: @CantAnnotateClassWithTypeVariable.TA), CantAnnotateClassWithTypeVariable.A, @CantAnnotateClassWithTypeVariable.TA CantAnnotateClassWithTypeVariable.A.B<T>
+1 error
diff --git a/test/langtools/tools/javac/classreader/8171132/BadConstantValue.java b/test/langtools/tools/javac/classreader/8171132/BadConstantValue.java
index b4230c461c1..a44adbf6d9e 100644
--- a/test/langtools/tools/javac/classreader/8171132/BadConstantValue.java
+++ b/test/langtools/tools/javac/classreader/8171132/BadConstantValue.java
@@ -1,5 +1,6 @@
 /*
  * Copyright 2016 Google, Inc.  All rights reserved.
+ * Copyright (c) 2024, 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
@@ -184,7 +185,7 @@ private static void swapConstantValues(File file) throws Exception {
         ClassModel cf = ClassFile.of().parse(file.toPath());
         FieldModel a = cf.fields().getFirst();
         FieldModel b = cf.fields().get(1);
-        byte[] Bytes = ClassFile.of().transform(cf, ClassTransform
+        byte[] Bytes = ClassFile.of().transformClass(cf, ClassTransform
                 .dropping(ce -> ce instanceof ClassFileVersion || ce instanceof FieldModel)
                 .andThen(ClassTransform.endHandler(classBuilder -> classBuilder
                         .withField(b.fieldName(), b.fieldType(), fieldBuilder -> {
diff --git a/test/langtools/tools/javac/classreader/BadMethodParameter.java b/test/langtools/tools/javac/classreader/BadMethodParameter.java
index b37a196e2ed..cddd3f24956 100644
--- a/test/langtools/tools/javac/classreader/BadMethodParameter.java
+++ b/test/langtools/tools/javac/classreader/BadMethodParameter.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2023, Alphabet LLC. All rights reserved.
+ * Copyright (c) 2024, 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
@@ -148,7 +149,7 @@ private static void transform(Path path) throws IOException {
                 };
 
         ClassTransform classTransform = ClassTransform.transformingMethods(methodTransform);
-        bytes = cf.transform(classModel, classTransform);
+        bytes = cf.transformClass(classModel, classTransform);
         Files.write(path, bytes);
     }
 }
diff --git a/test/langtools/tools/javac/defaultMethods/BadClassfile.java b/test/langtools/tools/javac/defaultMethods/BadClassfile.java
index 366692f17e3..589b65bcf66 100644
--- a/test/langtools/tools/javac/defaultMethods/BadClassfile.java
+++ b/test/langtools/tools/javac/defaultMethods/BadClassfile.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, 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
@@ -61,7 +61,7 @@ public static void main(String... args) throws Exception {
     private static void test(String classname, String expected) throws Exception {
         File classfile = new File(System.getProperty("test.classes", "."), classname + ".class");
         ClassModel cf = ClassFile.of().parse(classfile.toPath());
-        ClassFile.of().transform(cf, ClassTransform.dropping(ce -> ce instanceof ClassFileVersion)
+        ClassFile.of().transformClass(cf, ClassTransform.dropping(ce -> ce instanceof ClassFileVersion)
                 .andThen(ClassTransform.endHandler(classBuilder -> classBuilder.withVersion(Target.JDK1_7.majorVersion, Target.JDK1_7.minorVersion))));
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
         JavacTaskImpl task = (JavacTaskImpl) c.getTask(null, null, null, Arrays.asList("-classpath", System.getProperty("test.classes", ".")), null, null);
diff --git a/test/langtools/tools/javac/generics/diamond/7188968/T7188968.out b/test/langtools/tools/javac/generics/diamond/7188968/T7188968.out
index 83b7b8b671d..efceb84c8c7 100644
--- a/test/langtools/tools/javac/generics/diamond/7188968/T7188968.out
+++ b/test/langtools/tools/javac/generics/diamond/7188968/T7188968.out
@@ -1,7 +1,12 @@
 T7188968.java:20:20: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null)
+T7188968.java:20:9: compiler.warn.unchecked.call.mbr.of.raw.type: T7188968.Foo(java.util.List<X>,java.lang.Object), T7188968.Foo
 T7188968.java:21:20: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null)
 T7188968.java:21:29: compiler.warn.unchecked.call.mbr.of.raw.type: T7188968.Foo(java.util.List<X>,java.lang.Object), T7188968.Foo
 T7188968.java:22:22: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null)
+T7188968.java:22:9: compiler.warn.unchecked.meth.invocation.applied: kindname.constructor, <init>, java.util.List<X>,java.lang.Object, java.util.List,unknown, kindname.class, T7188968.Foo
+T7188968.java:22:19: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.util.List, java.util.List<X>
 T7188968.java:23:24: compiler.err.cant.resolve.location: kindname.variable, unknown, , , (compiler.misc.location: kindname.class, T7188968, null)
+T7188968.java:23:20: compiler.warn.unchecked.meth.invocation.applied: kindname.method, makeFoo, java.util.List<Z>,java.lang.Object, java.util.List,unknown, kindname.class, T7188968.Foo
+T7188968.java:23:21: compiler.warn.prob.found.req: (compiler.misc.unchecked.assign), java.util.List, java.util.List<Z>
 4 errors
-1 warning
+6 warnings
diff --git a/test/langtools/tools/javac/importscope/BadClassFileDuringImport.java b/test/langtools/tools/javac/importscope/BadClassFileDuringImport.java
index a4b751fea41..8d1d2a96513 100644
--- a/test/langtools/tools/javac/importscope/BadClassFileDuringImport.java
+++ b/test/langtools/tools/javac/importscope/BadClassFileDuringImport.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /**
  * @test
- * @bug 8198378
+ * @bug 8198378 8335385
  * @summary Verify that BadClassFile related to imports are handled properly.
  * @library /tools/lib
  * @modules jdk.compiler/com.sun.tools.javac.api
@@ -53,7 +53,9 @@ void run() throws Exception {
         new JavacTask(tb)
           .outdir(".")
           .sources("package p; public class A { }",
-                   "package p; public class B { public static class I { } }")
+                   "package p; public class B { public static class I { } }",
+                   "package m; public class A { }",
+                   "package m; public class B { public static class I { } }")
           .run()
           .writeAll();
 
@@ -65,80 +67,165 @@ void run() throws Exception {
             out.write("broken".getBytes("UTF-8"));
         }
 
+        Files.delete(Paths.get(".", "m", "A.class"));
+        Files.delete(Paths.get(".", "m", "B$I.class"));
+
         doTest("import p.A;",
                "",
                "Test.java:2:9: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import m.A;",
+               "",
+               "Test.java:2:9: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.package, m, null)",
+               "1 error");
         doTest("import p.A;",
                "A a;",
                "Test.java:2:9: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
                "Test.java:2:33: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)",
                "2 errors");
+        doTest("import m.A;",
+               "A a;",
+               "Test.java:2:9: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.package, m, null)",
+               "Test.java:2:33: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
         doTest("import p.A;",
                "void test() { A a; }",
                "Test.java:2:9: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
                "Test.java:2:47: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)",
                "2 errors");
+        doTest("import m.A;",
+               "void test() { A a; }",
+               "Test.java:2:9: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.package, m, null)",
+               "Test.java:2:47: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
         doTest("import p.*;",
                "",
                (String[]) null);
+        doTest("import m.*;",
+               "",
+               (String[]) null);
         doTest("import p.*;",
                "A a;",
                "Test.java:2:33: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import m.*;",
+               "A a;",
+               "Test.java:2:33: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)",
+               "1 error");
         doTest("import p.*;",
                "void test() { A a; }",
                "Test.java:2:47: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import m.*;",
+               "void test() { A a; }",
+               "Test.java:2:47: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)",
+               "1 error");
 
         doTest("import p.B.I;",
                "",
                "Test.java:2:11: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import m.B.I;",
+               "",
+               "Test.java:2:11: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "1 error");
         doTest("import p.B.I;",
                "I i;",
                "Test.java:2:11: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
-               "1 error");
+               "Test.java:2:35: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
+        doTest("import m.B.I;",
+               "I i;",
+               "Test.java:2:11: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "Test.java:2:35: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
         doTest("import p.B.I;",
                "void test() { I i; }",
                "Test.java:2:11: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
-               "1 error");
+               "Test.java:2:49: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
+        doTest("import m.B.I;",
+               "void test() { I i; }",
+               "Test.java:2:11: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "Test.java:2:49: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
         doTest("import p.B.*;",
                "",
                (String[]) null);
+        doTest("import m.B.*;",
+               "",
+               (String[]) null);
         doTest("import p.B.*;",
                "I i;",
                "Test.java:2:35: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import m.B.*;",
+               "I i;",
+               "Test.java:2:35: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "1 error");
+        doTest("import m.B.*;",
+               "I i;",
+               "Test.java:2:35: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "1 error");
         doTest("import p.B.*;",
                "void test() { I i; }",
                "Test.java:2:49: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import m.B.*;",
+               "void test() { I i; }",
+               "Test.java:2:49: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "1 error");
 
         doTest("import static p.B.I;",
                "",
                "Test.java:2:1: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import static m.B.I;",
+               "",
+               "Test.java:2:1: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "1 error");
         doTest("import static p.B.I;",
                "I i;",
                "Test.java:2:42: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import static m.B.I;",
+               "I i;",
+               "Test.java:2:42: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "1 error");
         doTest("import static p.B.I;",
                "void test() { I i; }",
                "Test.java:2:1: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import static m.B.I;",
+               "void test() { I i; }",
+               "Test.java:2:1: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "Test.java:2:56: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
         doTest("import static p.B.*;",
                "",
                "Test.java:2:1: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import static m.B.*;",
+               "",
+               "Test.java:2:1: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "1 error");
         doTest("import static p.B.*;",
                "I i;",
                "Test.java:2:42: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import static m.B.*;",
+               "I i;",
+               "Test.java:2:42: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "1 error");
         doTest("import static p.B.*;",
                "void test() { I i; }",
                "Test.java:2:1: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
                "1 error");
+        doTest("import static m.B.*;",
+               "void test() { M m; }",
+               "Test.java:2:1: compiler.err.cant.access: m.B.I, (compiler.misc.class.file.not.found: m.B$I)",
+               "Test.java:2:56: compiler.err.cant.resolve.location: kindname.class, M, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
     }
 
     void doTest(String importText, String useText, String... expectedOutput) {
@@ -146,7 +233,8 @@ void doTest(String importText, String useText, String... expectedOutput) {
                 .classpath(".")
                 .sources("\n" + importText + " public class Test { " + useText + " }")
                 .options("-XDrawDiagnostics")
-                .run(expectedOutput != null ? Task.Expect.FAIL : Task.Expect.SUCCESS)
+                .run(expectedOutput != null ? Task.Expect.FAIL : Task.Expect.SUCCESS,
+                     expectedOutput != null ? 1 : 0)
                 .writeAll()
                 .getOutputLines(Task.OutputKind.DIRECT);
 
diff --git a/test/langtools/tools/javac/lambda/MethodReference23.out b/test/langtools/tools/javac/lambda/MethodReference23.out
index f81c0a6745e..456a002bd99 100644
--- a/test/langtools/tools/javac/lambda/MethodReference23.out
+++ b/test/langtools/tools/javac/lambda/MethodReference23.out
@@ -1,5 +1,5 @@
 MethodReference23.java:52:19: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, MethodReference23, MethodReference23)
-MethodReference23.java:53:16: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, , MethodReference23)
+MethodReference23.java:53:16: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, MethodReference23, MethodReference23)
 MethodReference23.java:57:19: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, , MethodReference23)
 MethodReference23.java:58:16: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: Inner1, , MethodReference23)
 MethodReference23.java:72:9: compiler.err.ref.ambiguous: call3, kindname.method, call3(MethodReference23.SAM21), MethodReference23, kindname.method, call3(MethodReference23.SAM22), MethodReference23
diff --git a/test/langtools/tools/javac/lambda/T8129740/Universe.java.out b/test/langtools/tools/javac/lambda/T8129740/Universe.java.out
index 1d8c0e290c2..919eb14c3c9 100644
--- a/test/langtools/tools/javac/lambda/T8129740/Universe.java.out
+++ b/test/langtools/tools/javac/lambda/T8129740/Universe.java.out
@@ -69,29 +69,27 @@ class Universe {
                 }
                 
                 Planet(String name, int moonsCount) {
-                    this(name, moonsCount, java.lang.invoke.LambdaMetafactory.metafactory(name, Universe.Galaxy.this, Universe.Galaxy.SolarSystem.this));
+                    this(name, moonsCount, ()->{
+                        String n = name;
+                        StringBuffer buf = new StringBuffer();
+                        buf.append("This planet belongs to the galaxy " + Galaxy.this.name + " with " + starsCount + " stars\n");
+                        buf.append("This planet belongs to the galaxy " + Universe.Galaxy.this.name + " with " + starsCount() + " stars\n");
+                        buf.append("This planet belongs to the galaxy " + Galaxy.this.name() + " with " + starsCount() + " stars\n");
+                        buf.append("This planet belongs to the galaxy " + Universe.Galaxy.this.name() + " with " + (Universe.Galaxy.this).starsCount() + " stars\n");
+                        buf.append("This planet belongs to the solar system " + SolarSystem.this.name + " with " + planetsCount + " planets\n");
+                        buf.append("This planet belongs to the solar system " + Galaxy.SolarSystem.this.name + " with " + planetsCount() + " planets\n");
+                        buf.append("This planet belongs to the solar system " + (SolarSystem.this).name + " with " + planetsCount + " planets\n");
+                        buf.append("This planet belongs to the solar system " + Universe.Galaxy.SolarSystem.this.name + " with " + Universe.Galaxy.SolarSystem.this.planetsCount + " planets\n");
+                        buf.append("This planet belongs to the solar system " + Universe.Galaxy.SolarSystem.this.name.toLowerCase().toUpperCase() + " with " + Universe.Galaxy.SolarSystem.this.planetsCount + " planets\n");
+                        buf.append("This planet belongs to the solar system " + copy(Universe.Galaxy.SolarSystem.this).name.toLowerCase().toUpperCase() + " with " + Universe.Galaxy.SolarSystem.this.planetsCount + " planets\n");
+                        if (!buf.toString().equals(output)) throw new AssertionError("Unexpected value\n" + buf);
+                    });
                 }
                 static final String output = "This planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system SUN with 9 planets\nThis planet belongs to the solar system SUN with 9 planets\n";
                 
                 public String toString() {
                     return "Planet " + name + " with " + moonsCount + " moon(s)";
                 }
-                
-                /*synthetic*/ private static void lambda$new$0(/*synthetic*/ final String name, /*synthetic*/ final Universe.Galaxy Universe$Galaxy$this, /*synthetic*/ final Universe.Galaxy.SolarSystem Universe$Galaxy$SolarSystem$this) {
-                    String n = name;
-                    StringBuffer buf = new StringBuffer();
-                    buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name + " with " + Universe$Galaxy$this.starsCount + " stars\n");
-                    buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name + " with " + Universe$Galaxy$this.starsCount() + " stars\n");
-                    buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name() + " with " + Universe$Galaxy$this.starsCount() + " stars\n");
-                    buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name() + " with " + (Universe$Galaxy$this).starsCount() + " stars\n");
-                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
-                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount() + " planets\n");
-                    buf.append("This planet belongs to the solar system " + (Universe$Galaxy$SolarSystem$this).name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
-                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
-                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name.toLowerCase().toUpperCase() + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
-                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.copy(Universe$Galaxy$SolarSystem$this).name.toLowerCase().toUpperCase() + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
-                    if (!buf.toString().equals(output)) throw new AssertionError("Unexpected value\n" + buf);
-                }
             }
         }
     }
diff --git a/test/langtools/tools/javac/lambda/methodReference/MethodRefToInnerWithoutOuter.out b/test/langtools/tools/javac/lambda/methodReference/MethodRefToInnerWithoutOuter.out
index bafb5d1a193..03b3d338369 100644
--- a/test/langtools/tools/javac/lambda/methodReference/MethodRefToInnerWithoutOuter.out
+++ b/test/langtools/tools/javac/lambda/methodReference/MethodRefToInnerWithoutOuter.out
@@ -1,2 +1,2 @@
-MethodRefToInnerWithoutOuter.java:22:31: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: TestString, , MethodRefToInnerBase)
+MethodRefToInnerWithoutOuter.java:22:31: compiler.err.invalid.mref: kindname.constructor, (compiler.misc.cant.access.inner.cls.constr: TestString, java.lang.String, MethodRefToInnerBase)
 1 error
diff --git a/test/langtools/tools/javac/launcher/SourceLauncherTest.java b/test/langtools/tools/javac/launcher/SourceLauncherTest.java
index 5f558d421ff..5e70e84482d 100644
--- a/test/langtools/tools/javac/launcher/SourceLauncherTest.java
+++ b/test/langtools/tools/javac/launcher/SourceLauncherTest.java
@@ -743,7 +743,7 @@ public void testNoDuplicateIncubatorWarning(Path base) throws Exception {
         private static void markModuleAsIncubator(Path moduleInfoFile) throws Exception {
             ClassModel cf = ClassFile.of().parse(moduleInfoFile);
             ModuleResolutionAttribute newAttr = ModuleResolutionAttribute.of(WARN_INCUBATING);
-            byte[] newBytes = ClassFile.of().transform(cf,
+            byte[] newBytes = ClassFile.of().transformClass(cf,
                     ClassTransform.endHandler(classBuilder -> classBuilder.with(newAttr)));
             try (OutputStream out = Files.newOutputStream(moduleInfoFile)) {
                 out.write(newBytes);
diff --git a/test/langtools/tools/javac/modules/IncubatingTest.java b/test/langtools/tools/javac/modules/IncubatingTest.java
index 776023db5e5..ce9d372a2f6 100644
--- a/test/langtools/tools/javac/modules/IncubatingTest.java
+++ b/test/langtools/tools/javac/modules/IncubatingTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, 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
@@ -266,7 +266,7 @@ private void copyJavaBase(Path targetDir) throws IOException {
     private void addModuleResolutionAttribute(Path classfile, int resolution_flags) throws Exception {
         ClassModel cm = ClassFile.of().parse(classfile);
         ModuleResolutionAttribute modRAttr = ModuleResolutionAttribute.of(resolution_flags);
-        byte[] newBytes = ClassFile.of().transform(cm, ClassTransform.dropping(ce -> ce instanceof ModuleResolutionAttribute).
+        byte[] newBytes = ClassFile.of().transformClass(cm, ClassTransform.dropping(ce -> ce instanceof ModuleResolutionAttribute).
                 andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(modRAttr))));
         try (OutputStream out = Files.newOutputStream(classfile)) {
             out.write(newBytes);
diff --git a/test/langtools/tools/javac/modules/JavaBaseTest.java b/test/langtools/tools/javac/modules/JavaBaseTest.java
index 188bc4801e5..6d9f574705d 100644
--- a/test/langtools/tools/javac/modules/JavaBaseTest.java
+++ b/test/langtools/tools/javac/modules/JavaBaseTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2024, 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
@@ -237,7 +237,7 @@ void createClass(Path base, List<String> mods, String target) throws Exception {
                 modAttr1.provides());
         Path modInfo = base.resolve("test-modules").resolve("module-info.class");
         Files.createDirectories(modInfo.getParent());
-        byte[] newBytes = ClassFile.of().transform(cm1, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute).
+        byte[] newBytes = ClassFile.of().transformClass(cm1, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute).
                 andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(modAttr2))));
         try (OutputStream out = Files.newOutputStream(modInfo)) {
             out.write(newBytes);
diff --git a/test/langtools/tools/javac/modules/OpenModulesTest.java b/test/langtools/tools/javac/modules/OpenModulesTest.java
index e21601031e7..f2bf1d00cc7 100644
--- a/test/langtools/tools/javac/modules/OpenModulesTest.java
+++ b/test/langtools/tools/javac/modules/OpenModulesTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2024, 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
@@ -243,7 +243,7 @@ public void testNonZeroOpensInOpen(Path base) throws Exception {
                                                           module.uses(),
                                                           module.provides());
 
-        byte[] newBytes = ClassFile.of().transform(cm, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute).
+        byte[] newBytes = ClassFile.of().transformClass(cm, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute).
                 andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(newModule))));
         try (OutputStream out = Files.newOutputStream(miClass)) {
             out.write(newBytes);
diff --git a/test/langtools/tools/javac/patterns/DisambiguatePatterns.java b/test/langtools/tools/javac/patterns/DisambiguatePatterns.java
index ef4d065f912..d6180c1810f 100644
--- a/test/langtools/tools/javac/patterns/DisambiguatePatterns.java
+++ b/test/langtools/tools/javac/patterns/DisambiguatePatterns.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2024, 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
@@ -109,6 +109,10 @@ public static void main(String... args) throws Throwable {
                                  ExpressionType.EXPRESSION);
         test.disambiguationTest("a & b",
                                  ExpressionType.EXPRESSION);
+        test.disambiguationTest("R r when (x > 0)",
+                                 ExpressionType.PATTERN);
+        test.disambiguationTest("R(int x) when (x > 0)",
+                                 ExpressionType.PATTERN);
     }
 
     private final ParserFactory factory;
diff --git a/test/langtools/tools/javac/platform/createsymbols/CreateSymbolsTestImpl.java b/test/langtools/tools/javac/platform/createsymbols/CreateSymbolsTestImpl.java
index 3a4fd85e54e..c66cd08852a 100644
--- a/test/langtools/tools/javac/platform/createsymbols/CreateSymbolsTestImpl.java
+++ b/test/langtools/tools/javac/platform/createsymbols/CreateSymbolsTestImpl.java
@@ -1070,7 +1070,7 @@ void testModuleMainClass() throws Exception {
                            try {
                                Path moduleInfo = classesDir.resolve("module-info.class");
                                byte[] newClassData =
-                                       cf.transform(cf.parse(moduleInfo),
+                                       cf.transformClass(cf.parse(moduleInfo),
                                                     (builder, element) -> {
                                                         builder.with(element);
                                                         if (element instanceof ModuleAttribute) {
@@ -1179,7 +1179,7 @@ void compileAndPack(Path output, Path outputFile,
             }
             ClassFile cf = ClassFile.of();
             ClassModel cm = cf.parse(moduleInfo);
-            byte[] newData = cf.transform(cm, (builder, element) -> {
+            byte[] newData = cf.transformClass(cm, (builder, element) -> {
                 builder.with(element);
                 if (element instanceof ModuleAttribute) {
                     builder.with(ModulePackagesAttribute.ofNames(packages.stream()
diff --git a/test/langtools/tools/javac/processing/model/element/TestOrigin.java b/test/langtools/tools/javac/processing/model/element/TestOrigin.java
index 1fae5374bea..dee13cbbeb2 100644
--- a/test/langtools/tools/javac/processing/model/element/TestOrigin.java
+++ b/test/langtools/tools/javac/processing/model/element/TestOrigin.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2024, 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
@@ -302,7 +302,7 @@ public void testModuleDirectives(Path base) throws Exception {
                                                           newOpens,
                                                           module.uses(),
                                                           module.provides());
-        byte[] newClassFileBytes = ClassFile.of().transform(cf, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute)
+        byte[] newClassFileBytes = ClassFile.of().transformClass(cf, ClassTransform.dropping(ce -> ce instanceof ModuleAttribute)
                                                  .andThen(ClassTransform.endHandler(classBuilder -> classBuilder.with(newModule))));
         try (OutputStream out = Files.newOutputStream(moduleInfo)) {
             out.write(newClassFileBytes);
diff --git a/test/langtools/tools/javac/recovery/AttrRecovery.java b/test/langtools/tools/javac/recovery/AttrRecovery.java
index 01cf665be13..629cef45c62 100644
--- a/test/langtools/tools/javac/recovery/AttrRecovery.java
+++ b/test/langtools/tools/javac/recovery/AttrRecovery.java
@@ -203,4 +203,35 @@ public interface FI {
         }
     }
 
+    @Test
+    public void testErroneousTarget() throws Exception {
+        String code = """
+                      public class C {
+                          public Undefined g(Undefined u) {
+                              return switch (0) {
+                                  default -> u;
+                              };
+                          }
+                      }
+                      """;
+        Path curPath = Path.of(".");
+        List<String> actual = new JavacTask(tb)
+                .options("-XDrawDiagnostics")
+                .sources(code)
+                .outdir(curPath)
+                .run(Expect.FAIL, 1)
+                .writeAll()
+                .getOutputLines(OutputKind.DIRECT);
+
+        List<String> expected = List.of(
+                "C.java:2:24: compiler.err.cant.resolve.location: kindname.class, Undefined, , , (compiler.misc.location: kindname.class, C, null)",
+                "C.java:2:12: compiler.err.cant.resolve.location: kindname.class, Undefined, , , (compiler.misc.location: kindname.class, C, null)",
+                "2 errors"
+        );
+
+        if (!Objects.equals(actual, expected)) {
+            error("Expected: " + expected + ", but got: " + actual);
+        }
+    }
+
 }
diff --git a/test/langtools/tools/javac/switchexpr/ExpressionSwitchUnderscoreAfterYield.java b/test/langtools/tools/javac/switchexpr/ExpressionSwitchUnderscoreAfterYield.java
new file mode 100644
index 00000000000..14f609cc71e
--- /dev/null
+++ b/test/langtools/tools/javac/switchexpr/ExpressionSwitchUnderscoreAfterYield.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2024, 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 8335136
+ * @summary Underscore as parameter name in one-parameter functional types fails to compile in yield statement if not enclosed in parentheses
+ * @library /tools/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ *          jdk.compiler/com.sun.tools.javac.main
+ * @build toolbox.JavacTask toolbox.ToolBox toolbox.Task
+ * @run main ExpressionSwitchUnderscoreAfterYield
+ */
+
+import toolbox.*;
+
+import java.nio.file.Path;
+import java.util.List;
+
+public class ExpressionSwitchUnderscoreAfterYield extends TestRunner {
+
+    private final ToolBox tb = new ToolBox();
+
+    private final Path ROOT = Path.of(".");
+
+    public ExpressionSwitchUnderscoreAfterYield() {
+        super(System.err);
+    }
+
+    public static void main(String[] args) throws Exception {
+        new ExpressionSwitchUnderscoreAfterYield().runTests();
+    }
+
+    protected void runTests() throws Exception {
+        runTests(f -> {
+            if (f.getName().endsWith("_ShouldFailToCompile")) {
+                return new Object[]{
+                        List.of(
+                                FailParams.UNDERSCORE_YIELDED,
+                                FailParams.ASSIGNMENT_TO_UNDERSCORE_IN_YIELD
+                        )
+                };
+            }
+            return new Object[0];
+        });
+    }
+
+    @Test
+    public void testUnderscoreAsParameterNameInLambda_ShouldCompileFine() throws Exception {
+        var code = """
+                        import java.util.function.*;
+                        \s
+                        public class Test {
+                            public static void main(String[] args) {
+                                Consumer<Object> result = switch (1) {
+                                    case 1 -> {
+                                        yield _ -> {};
+                                    }
+                                    default -> null;
+                                };
+                            }
+                        }
+                        """;
+        tb.writeJavaFiles(ROOT, code);
+        new toolbox.JavacTask(tb)
+                .files(tb.findJavaFiles(ROOT))
+                .run(Task.Expect.SUCCESS);
+    }
+
+    public record FailParams(String code, List<String> expectedDiagnosticMessage) {
+        public static FailParams UNDERSCORE_YIELDED = new FailParams(
+                """
+                        public class Test {
+                            public static void main(String[] args) {
+                                Object result = switch (1) {
+                                    case 1 -> {
+                                        yield _;
+                                    }
+                                    default -> null;
+                                };
+                            }
+                        }
+                        """,
+                List.of("Test.java:5:23: compiler.err.use.of.underscore.not.allowed.non.variable", "1 error")
+        );
+
+        public static FailParams ASSIGNMENT_TO_UNDERSCORE_IN_YIELD = new FailParams(
+                """
+                        public class Test {
+                            public static void main(String[] args) {
+                                Object result = switch (1) {
+                                    case 1 -> {
+                                        yield _ = 1;
+                                    }
+                                    default -> null;
+                                };
+                            }
+                        }
+                        """,
+                List.of("Test.java:5:23: compiler.err.use.of.underscore.not.allowed.non.variable", "1 error")
+        );
+    }
+
+    @Test
+    public void testUnderscoreAsParameterNameInLambda_ShouldFailToCompile(List<FailParams> params) throws Exception {
+        for (var param : params) {
+            tb.writeJavaFiles(ROOT, param.code);
+            Task.Result result = new JavacTask(tb)
+                    .options("-XDrawDiagnostics")
+                    .files(tb.findJavaFiles(ROOT))
+                    .run(Task.Expect.FAIL);
+            tb.checkEqual(param.expectedDiagnosticMessage, result.getOutputLines(Task.OutputKind.DIRECT));
+        }
+    }
+
+}
diff --git a/test/langtools/tools/javac/tree/ASTAttributesFilledForReferencesOnMissingTypes.java b/test/langtools/tools/javac/tree/ASTAttributesFilledForReferencesOnMissingTypes.java
new file mode 100644
index 00000000000..908a3c24f7b
--- /dev/null
+++ b/test/langtools/tools/javac/tree/ASTAttributesFilledForReferencesOnMissingTypes.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2024, 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 8335385
+ * @summary Verify that BadClassFile related to imports are handled properly.
+ * @library /tools/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ *          jdk.compiler/com.sun.tools.javac.main
+ * @build toolbox.ToolBox toolbox.JavacTask
+ * @run main ASTAttributesFilledForReferencesOnMissingTypes
+ */
+
+import com.sun.source.tree.IdentifierTree;
+import com.sun.source.tree.MemberSelectTree;
+import com.sun.source.util.TaskEvent;
+import com.sun.source.util.TaskListener;
+import com.sun.source.util.TreePathScanner;
+import com.sun.source.util.Trees;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+import javax.lang.model.element.Element;
+
+import toolbox.JavacTask;
+import toolbox.Task;
+import toolbox.ToolBox;
+
+public class ASTAttributesFilledForReferencesOnMissingTypes {
+    public static void main(String... args) throws Exception {
+        new ASTAttributesFilledForReferencesOnMissingTypes().run();
+    }
+
+    ToolBox tb = new ToolBox();
+
+    void run() throws Exception {
+        new JavacTask(tb)
+          .outdir(".")
+          .sources("package p; public class A { }",
+                   "package p; public class B { public static class I { } public static class M { } }",
+                   "package p; public class C { }")
+          .run()
+          .writeAll();
+
+        try (OutputStream out = Files.newOutputStream(Paths.get(".", "p", "A.class"))) {
+            out.write("broken".getBytes("UTF-8"));
+        }
+
+        try (OutputStream out = Files.newOutputStream(Paths.get(".", "p", "B$I.class"))) {
+            out.write("broken".getBytes("UTF-8"));
+        }
+
+        Files.delete(Paths.get(".", "p", "C.class"));
+        Files.delete(Paths.get(".", "p", "B$M.class"));
+
+        //tests for findIdent (must be in some global scope):
+        doTest("""
+               package p;
+               public class Test {
+                   A a;
+               }
+               """,
+               "Test.java:3:5: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
+               "1 error");
+        doTest("""
+               import p.*;
+               public class Test {
+                   A a;
+               }
+               """,
+               "Test.java:3:5: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
+               "1 error");
+        doTest("""
+               package p;
+               public class Test {
+                   C c;
+               }
+               """,
+               "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.class, p.Test, null)",
+               "1 error");
+        doTest("""
+               import p.*;
+               public class Test {
+                   C c;
+               }
+               """,
+               "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.class, Test, null)",
+               "1 error");
+
+        //tests for findIdentInPackage:
+        doTest("""
+               import p.A;
+               public class Test {
+                   A a;
+               }
+               """,
+               "Test.java:1:9: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
+               "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
+        doTest("""
+               public class Test {
+                   p.A a;
+               }
+               """,
+               "Test.java:2:6: compiler.err.cant.access: p.A, (compiler.misc.bad.class.file.header: A.class, (compiler.misc.illegal.start.of.class.file))",
+               "1 error");
+        doTest("""
+               import p.C;
+               public class Test {
+                   C c;
+               }
+               """,
+               "Test.java:1:9: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.package, p, null)",
+               "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
+        doTest("""
+               public class Test {
+                   p.C c;
+               }
+               """,
+               "Test.java:2:6: compiler.err.cant.resolve.location: kindname.class, C, , , (compiler.misc.location: kindname.package, p, null)",
+               "1 error");
+
+        //tests for findIdentInType:
+        doTest("""
+               import p.B.I;
+               public class Test {
+                   I i;
+               }
+               """,
+               "Test.java:1:11: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
+               "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, I, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
+        doTest("""
+               import p.B.M;
+               public class Test {
+                   M m;
+               }
+               """,
+               "Test.java:1:11: compiler.err.cant.access: p.B.M, (compiler.misc.class.file.not.found: p.B$M)",
+               "Test.java:3:5: compiler.err.cant.resolve.location: kindname.class, M, , , (compiler.misc.location: kindname.class, Test, null)",
+               "2 errors");
+        doTest("""
+               public class Test {
+                   p.B.I i;
+               }
+               """,
+               "Test.java:2:8: compiler.err.cant.access: p.B.I, (compiler.misc.bad.class.file.header: B$I.class, (compiler.misc.illegal.start.of.class.file))",
+               "1 error");
+        doTest("""
+               public class Test {
+                   p.B.M m;
+               }
+               """,
+               "Test.java:2:8: compiler.err.cant.access: p.B.M, (compiler.misc.class.file.not.found: p.B$M)",
+               "1 error");
+    }
+
+    void doTest(String code, String... expectedOutput) {
+        List<String> log = new JavacTask(tb)
+                .classpath(".")
+                .sources(code)
+                .options("-XDrawDiagnostics")
+                .callback(task -> {
+                    task.addTaskListener(new TaskListener() {
+                        @Override
+                        public void finished(TaskEvent e) {
+                            if (e.getKind() != TaskEvent.Kind.ANALYZE) {
+                                return ;
+                            }
+                            Trees trees = Trees.instance(task);
+                            new TreePathScanner<Void, Void>() {
+                                @Override
+                                public Void visitIdentifier(IdentifierTree node, Void p) {
+                                    validateAttributes();
+                                    return super.visitIdentifier(node, p);
+                                }
+                                @Override
+                                public Void visitMemberSelect(MemberSelectTree node, Void p) {
+                                    if (!node.getIdentifier().contentEquals("*")) {
+                                        validateAttributes();
+                                    }
+                                    return super.visitMemberSelect(node, p);
+                                }
+                                void validateAttributes() {
+                                    Element el = trees.getElement(getCurrentPath());
+                                    if (el == null) {
+                                        throw new AssertionError("A null sym attribute for: " + getCurrentPath().getLeaf() + "!");
+                                    }
+                                }
+                            }.scan(e.getCompilationUnit(), null);
+                        }
+                    });
+                })
+                .run(expectedOutput != null ? Task.Expect.FAIL : Task.Expect.SUCCESS,
+                     expectedOutput != null ? 1 : 0)
+                .writeAll()
+                .getOutputLines(Task.OutputKind.DIRECT);
+
+        if (expectedOutput != null && !log.equals(Arrays.asList(expectedOutput))) {
+            throw new AssertionError("Unexpected output: " + log);
+        }
+    }
+}
diff --git a/test/langtools/tools/javap/UndefinedAccessFlagTest.java b/test/langtools/tools/javap/UndefinedAccessFlagTest.java
new file mode 100644
index 00000000000..822c9e20f35
--- /dev/null
+++ b/test/langtools/tools/javap/UndefinedAccessFlagTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2024, 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 8333748
+ * @summary javap should not fail if reserved access flag bits are set to 1
+ * @library /tools/lib
+ * @modules jdk.jdeps/com.sun.tools.javap
+ * @enablePreview
+ * @run junit UndefinedAccessFlagTest
+ */
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import toolbox.JavapTask;
+import toolbox.Task;
+import toolbox.ToolBox;
+
+import java.lang.classfile.AccessFlags;
+import java.lang.classfile.ClassModel;
+import java.lang.classfile.FieldModel;
+import java.lang.classfile.MethodModel;
+import java.lang.classfile.attribute.InnerClassInfo;
+import java.lang.classfile.attribute.InnerClassesAttribute;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static java.lang.classfile.ClassFile.*;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class UndefinedAccessFlagTest {
+
+    final ToolBox toolBox = new ToolBox();
+
+    enum TestLocation {
+        NONE(false), CLASS, FIELD, METHOD, INNER_CLASS(false);
+
+        final boolean fails;
+        TestLocation() { this(true); }
+        TestLocation(boolean fails) { this.fails = fails; }
+    }
+
+    @ParameterizedTest
+    @EnumSource(TestLocation.class)
+    void test(TestLocation location) throws Throwable {
+        var cf = of();
+        ClassModel cm;
+        try (var is = UndefinedAccessFlagTest.class.getResourceAsStream(
+            "/UndefinedAccessFlagTest$SampleInnerClass.class"
+        )) {
+            cm = cf.parse(is.readAllBytes());
+        }
+        var bytes = cf.transformClass(cm, (cb, ce) -> {
+            switch (ce) {
+                case AccessFlags flags when location == TestLocation.CLASS -> cb
+                    .withFlags(flags.flagsMask() | ACC_PRIVATE);
+                case FieldModel f when location == TestLocation.FIELD -> cb
+                    .transformField(f, (fb, fe) -> {
+                        if (fe instanceof AccessFlags flags) {
+                            fb.withFlags(flags.flagsMask() | ACC_SYNCHRONIZED);
+                        } else {
+                            fb.with(fe);
+                        }
+                    });
+                case MethodModel m when location == TestLocation.METHOD -> cb
+                    .transformMethod(m, (mb, me) -> {
+                        if (me instanceof AccessFlags flags) {
+                            mb.withFlags(flags.flagsMask() | ACC_INTERFACE);
+                        } else {
+                            mb.with(me);
+                        }
+                    });
+                case InnerClassesAttribute attr when location == TestLocation.INNER_CLASS -> cb
+                    .with(InnerClassesAttribute.of(attr.classes().stream()
+                        .map(ic -> InnerClassInfo.of(ic.innerClass(), ic.outerClass(), ic.innerName(), ic.flagsMask() | 0x0020))
+                        .toList()));
+                default -> cb.with(ce);
+            }
+        });
+
+        Files.write(Path.of("transformed.class"), bytes);
+
+        var lines = new JavapTask(toolBox)
+            .classes("transformed.class")
+            .options("-c", "-p", "-v")
+            .run(location.fails ? Task.Expect.FAIL : Task.Expect.SUCCESS)
+            .writeAll()
+            .getOutputLines(Task.OutputKind.DIRECT);
+
+        // No termination when access flag error happens
+        assertTrue(lines.stream().anyMatch(l -> l.contains("java.lang.String field;")));
+        assertTrue(lines.stream().anyMatch(l -> l.contains("UndefinedAccessFlagTest$SampleInnerClass();")));
+        assertTrue(lines.stream().anyMatch(l -> l.contains("void method();")));
+        assertTrue(lines.stream().anyMatch(l -> l.contains("SampleInnerClass=class UndefinedAccessFlagTest$SampleInnerClass of class UndefinedAccessFlagTest")));
+
+        // Remove non-error lines
+        assertTrue(lines.removeIf(st -> !st.startsWith("Error:")));
+        // Desired locations has errors
+        assertTrue(location == TestLocation.NONE || !lines.isEmpty());
+        // Access Flag errors only
+        assertTrue(lines.stream().allMatch(l -> l.contains("Access Flags:")), () -> String.join("\n", lines));
+    }
+
+    static class SampleInnerClass {
+        String field;
+        void method() {}
+    }
+}
diff --git a/test/langtools/tools/jnativescan/JNativeScanTestBase.java b/test/langtools/tools/jnativescan/JNativeScanTestBase.java
new file mode 100644
index 00000000000..97c0b21a738
--- /dev/null
+++ b/test/langtools/tools/jnativescan/JNativeScanTestBase.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2024, 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.IOException;
+import java.io.PrintWriter;
+import java.nio.file.Path;
+import java.util.Arrays;
+
+import java.io.StringWriter;
+import java.util.spi.ToolProvider;
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.util.JarUtils;
+
+public class JNativeScanTestBase {
+
+    public static final String MODULE_PATH = "mods";
+
+    private static final ToolProvider JNATIVESCAN_TOOL = ToolProvider.findFirst("jnativescan")
+            .orElseThrow(() -> new RuntimeException("jnativescan tool not found"));
+
+    public static OutputAnalyzer jnativescan(String... args) {
+        return run(JNATIVESCAN_TOOL, args);
+    }
+
+    private static OutputAnalyzer run(ToolProvider tp, String[] commands) {
+        int rc;
+        StringWriter sw = new StringWriter();
+        StringWriter esw = new StringWriter();
+
+        try (PrintWriter pw = new PrintWriter(sw);
+             PrintWriter epw = new PrintWriter(esw)) {
+            System.out.println("Running " + tp.name() + ", Command: " + Arrays.toString(commands));
+            rc = tp.run(pw, epw, commands);
+        }
+        OutputAnalyzer output = new OutputAnalyzer(sw.toString(), esw.toString(), rc);
+        output.outputTo(System.out);
+        output.errorTo(System.err);
+        return output;
+    }
+
+    public static Path makeModularJar(String moduleName) throws IOException {
+        Path jarPath = Path.of(MODULE_PATH, moduleName + ".jar");
+        Path moduleRoot = moduleRoot(moduleName);
+        JarUtils.createJarFile(jarPath, moduleRoot);
+        return jarPath;
+    }
+
+    public static Path moduleRoot(String name) {
+        return Path.of(System.getProperty("test.module.path")).resolve(name);
+    }
+
+    public static OutputAnalyzer assertSuccess(OutputAnalyzer output) {
+        if (output.getExitValue() != 0) {
+            throw new IllegalStateException("tool run failed");
+        }
+        return output;
+    }
+
+    public static OutputAnalyzer assertFailure(OutputAnalyzer output) {
+        if (output.getExitValue() == 0) {
+            throw new IllegalStateException("tool run succeeded");
+        }
+        return output;
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMAbortThresholdOption.java b/test/langtools/tools/jnativescan/TestArrayTypeRefs.java
similarity index 50%
rename from test/hotspot/jtreg/compiler/rtm/cli/TestRTMAbortThresholdOption.java
rename to test/langtools/tools/jnativescan/TestArrayTypeRefs.java
index 54690fec691..a439fdfdef9 100644
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMAbortThresholdOption.java
+++ b/test/langtools/tools/jnativescan/TestArrayTypeRefs.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,31 +21,36 @@
  * questions.
  */
 
-/**
+/*
  * @test
- * @bug 8031320
- * @summary Verify processing of RTMAbortThreshold option.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestRTMAbortThresholdOption
+ * @library /test/lib .. ./cases/modules
+ * @build JNativeScanTestBase
+ *     cases.classpath.arrayref.App
+ * @run junit TestArrayTypeRefs
  */
 
-package compiler.rtm.cli;
+import jdk.test.lib.util.JarUtils;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+public class TestArrayTypeRefs extends JNativeScanTestBase {
 
-public class TestRTMAbortThresholdOption
-        extends RTMGenericCommandLineOptionTest {
-    private static final String DEFAULT_VALUE = "1000";
+    static Path ARRAY_REF;
 
-    private TestRTMAbortThresholdOption() {
-        super("RTMAbortThreshold", false, true,
-                TestRTMAbortThresholdOption.DEFAULT_VALUE,
-                "0", "42", "100", "10000");
+    @BeforeAll
+    public static void before() throws IOException {
+        ARRAY_REF = Path.of("arrayref.jar");
+        Path testClasses = Path.of(System.getProperty("test.classes", ""));
+        JarUtils.createJarFile(ARRAY_REF, testClasses, Path.of("arrayref", "App.class"));
     }
 
-    public static void main(String args[]) throws Throwable {
-        new TestRTMAbortThresholdOption().runTestCases();
+    @Test
+    public void testSingleJarClassPath() {
+        assertSuccess(jnativescan("--class-path", ARRAY_REF.toString()))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("<no restricted methods>");
     }
 }
diff --git a/test/langtools/tools/jnativescan/TestJNativeScan.java b/test/langtools/tools/jnativescan/TestJNativeScan.java
new file mode 100644
index 00000000000..94db4924412
--- /dev/null
+++ b/test/langtools/tools/jnativescan/TestJNativeScan.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 2024, 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
+ * @library /test/lib .. ./cases/modules
+ * @build JNativeScanTestBase
+ *     org.singlejar/* org.lib/* org.myapp/* org.service/*
+ *     cases.classpath.singlejar.main.Main
+ *     cases.classpath.lib.Lib
+ *     cases.classpath.app.App
+ *     cases.classpath.unnamed_package.UnnamedPackage
+ * @run junit TestJNativeScan
+ */
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.util.JarUtils;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class TestJNativeScan extends JNativeScanTestBase {
+
+    static Path TEST_CLASSES;
+
+    static Path CLASS_PATH_APP;
+    static Path SINGLE_JAR_CLASS_PATH;
+    static Path SINGLE_JAR_MODULAR;
+    static Path ORG_MYAPP;
+    static Path ORG_LIB;
+    static Path UNNAMED_PACKAGE_JAR;
+    static Path LIB_JAR;
+
+    @BeforeAll
+    public static void before() throws IOException {
+        SINGLE_JAR_CLASS_PATH = Path.of("singleJar.jar");
+        TEST_CLASSES = Path.of(System.getProperty("test.classes", ""));
+        JarUtils.createJarFile(SINGLE_JAR_CLASS_PATH, TEST_CLASSES, Path.of("main", "Main.class"));
+
+        LIB_JAR = Path.of("lib.jar");
+        JarUtils.createJarFile(LIB_JAR, TEST_CLASSES, Path.of("lib", "Lib.class"));
+        Manifest manifest = new Manifest();
+        Attributes mainAttrs = manifest.getMainAttributes();
+        mainAttrs.put(Attributes.Name.MANIFEST_VERSION, "1.0"); // need version or other attributes will be ignored
+        mainAttrs.putValue("Class-Path", "lib.jar non-existent.jar");
+        CLASS_PATH_APP = Path.of("app.jar");
+        JarUtils.createJarFile(CLASS_PATH_APP, manifest, TEST_CLASSES, Path.of("app", "App.class"));
+
+        SINGLE_JAR_MODULAR = makeModularJar("org.singlejar");
+        ORG_MYAPP = makeModularJar("org.myapp");
+        ORG_LIB = makeModularJar("org.lib");
+        makeModularJar("org.service");
+
+        UNNAMED_PACKAGE_JAR = Path.of("unnamed_package.jar");
+        JarUtils.createJarFile(UNNAMED_PACKAGE_JAR, TEST_CLASSES, Path.of("UnnamedPackage.class"));
+    }
+
+    @Test
+    public void testSingleJarClassPath() {
+        assertSuccess(jnativescan("--class-path", SINGLE_JAR_CLASS_PATH.toString()))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("ALL-UNNAMED")
+                .stdoutShouldContain("main.Main")
+                .stdoutShouldContain("main.Main::m()void is a native method declaration")
+                .stdoutShouldContain("main.Main::main(String[])void references restricted methods")
+                .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment");
+    }
+
+    @Test
+    public void testSingleJarModulePath() {
+        assertSuccess(jnativescan("--module-path", MODULE_PATH, "--add-modules", "org.singlejar"))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("org.singlejar")
+                .stdoutShouldContain("org.singlejar.main.Main")
+                .stdoutShouldContain("org.singlejar.main.Main::m()void is a native method declaration")
+                .stdoutShouldContain("org.singlejar.main.Main::main(String[])void references restricted methods")
+                .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment");
+    }
+
+    @Test
+    public void testWithDepModule() {
+        assertSuccess(jnativescan("--module-path", MODULE_PATH, "--add-modules", "org.myapp"))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("org.lib")
+                .stdoutShouldContain("org.lib.Lib")
+                .stdoutShouldContain("org.lib.Lib::m()void is a native method declaration")
+                .stdoutShouldContain("org.lib.Lib::doIt()void references restricted methods")
+                .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment")
+                .stdoutShouldContain("org.service")
+                .stdoutShouldContain("org.service.ServiceImpl")
+                .stdoutShouldContain("org.service.ServiceImpl::m()void is a native method declaration")
+                .stdoutShouldContain("org.service.ServiceImpl::doIt()void references restricted methods")
+                .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment");
+    }
+
+    @Test
+    public void testAllModulePath() {
+        assertSuccess(jnativescan("--module-path", MODULE_PATH, "--add-modules", "ALL-MODULE-PATH"))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("org.singlejar")
+                .stdoutShouldContain("org.lib")
+                .stdoutShouldContain("org.service");
+    }
+
+    @Test
+    public void testClassPathAttribute() {
+        assertSuccess(jnativescan("--class-path", CLASS_PATH_APP.toString()))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("ALL-UNNAMED")
+                .stdoutShouldContain("lib.Lib")
+                .stdoutShouldContain("lib.Lib::m()void is a native method declaration")
+                .stdoutShouldContain("lib.Lib::doIt()void references restricted methods")
+                .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment");
+    }
+
+    @Test
+    public void testInvalidRelease() {
+        assertFailure(jnativescan("--module-path", MODULE_PATH, "--add-modules", "ALL-MODULE-PATH", "--release", "asdf"))
+                .stderrShouldContain("Invalid release");
+    }
+
+    @Test
+    public void testReleaseNotSupported() {
+        assertFailure(jnativescan("--module-path", MODULE_PATH, "--add-modules", "ALL-MODULE-PATH", "--release", "9999999"))
+                .stderrShouldContain("Release: 9999999 not supported");
+    }
+
+    @Test
+    public void testFileDoesNotExist() {
+        assertFailure(jnativescan("--class-path", "non-existent.jar"))
+                .stderrShouldContain("Path does not appear to be a jar file, or directory containing classes");
+    }
+
+    @Test
+    public void testModuleNotAJarFile() {
+        String modulePath = moduleRoot("org.myapp").toString() + File.pathSeparator + ORG_LIB.toString();
+        assertSuccess(jnativescan("--module-path", modulePath,
+                        "--add-modules", "ALL-MODULE-PATH"))
+                .stdoutShouldContain("lib.Lib")
+                .stdoutShouldContain("lib.Lib::m()void is a native method declaration")
+                .stdoutShouldContain("lib.Lib::doIt()void references restricted methods")
+                .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment");
+    }
+
+    @Test
+    public void testPrintNativeAccess() {
+        assertSuccess(jnativescan("--module-path", MODULE_PATH,
+                                  "-add-modules", "org.singlejar,org.myapp",
+                                  "--print-native-access"))
+                .stdoutShouldMatch("org.lib,org.service,org.singlejar");
+    }
+
+    @Test
+    public void testNoDuplicateNames() {
+        String classPath = SINGLE_JAR_CLASS_PATH + File.pathSeparator + CLASS_PATH_APP;
+        OutputAnalyzer output = assertSuccess(jnativescan("--class-path", classPath, "--print-native-access"));
+        String[] moduleNames = output.getStdout().split(",");
+        Set<String> names = new HashSet<>();
+        for (String name : moduleNames) {
+            assertTrue(names.add(name.strip()));
+        }
+    }
+
+    @Test
+    public void testUnnamedPackage() {
+        assertSuccess(jnativescan("--class-path", UNNAMED_PACKAGE_JAR.toString()))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("ALL-UNNAMED")
+                .stdoutShouldNotContain(".UnnamedPackage")
+                .stdoutShouldContain("UnnamedPackage")
+                .stdoutShouldContain("UnnamedPackage::m()void is a native method declaration")
+                .stdoutShouldContain("UnnamedPackage::main(String[])void references restricted methods")
+                .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment");
+    }
+
+    @Test
+    public void testPositionalArguments() {
+        assertFailure(jnativescan("foo"))
+                .stdoutShouldBeEmpty()
+                .stderrShouldContain("jnativescan does not accept positional arguments");
+    }
+
+    @Test
+    public void testMissingRootModules() {
+        assertFailure(jnativescan("--module-path", MODULE_PATH))
+                .stdoutShouldBeEmpty()
+                .stderrShouldContain("Missing required option(s) [add-modules]");
+    }
+
+    @Test
+    public void testClassPathDirectory() {
+        assertSuccess(jnativescan("--class-path", TEST_CLASSES.toString()))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("ALL-UNNAMED")
+                .stdoutShouldContain("UnnamedPackage")
+                .stdoutShouldContain("UnnamedPackage::m()void is a native method declaration")
+                .stdoutShouldContain("UnnamedPackage::main(String[])void references restricted methods")
+                .stdoutShouldContain("main.Main")
+                .stdoutShouldContain("main.Main::m()void is a native method declaration")
+                .stdoutShouldContain("main.Main::main(String[])void references restricted methods")
+                .stdoutShouldContain("lib.Lib")
+                .stdoutShouldContain("lib.Lib::m()void is a native method declaration")
+                .stdoutShouldContain("lib.Lib::doIt()void references restricted methods")
+                .stdoutShouldContain("java.lang.foreign.MemorySegment::reinterpret(long)MemorySegment");
+    }
+
+    @Test
+    public void testMultipleClassPathJars() {
+        // make sure all of these are reported, even when they are all in the ALL-UNNAMED module
+        String classPath = UNNAMED_PACKAGE_JAR
+                + File.pathSeparator + SINGLE_JAR_CLASS_PATH
+                + File.pathSeparator + LIB_JAR;
+        assertSuccess(jnativescan("--class-path", classPath))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("ALL-UNNAMED")
+                .stdoutShouldContain("UnnamedPackage")
+                .stdoutShouldContain(UNNAMED_PACKAGE_JAR.toString())
+                .stdoutShouldContain("lib.Lib")
+                .stdoutShouldContain(LIB_JAR.toString())
+                .stdoutShouldContain("main.Main")
+                .stdoutShouldContain(SINGLE_JAR_CLASS_PATH.toString());
+    }
+}
diff --git a/test/langtools/tools/jnativescan/TestMissingSystemClass.java b/test/langtools/tools/jnativescan/TestMissingSystemClass.java
new file mode 100644
index 00000000000..5806590d0e0
--- /dev/null
+++ b/test/langtools/tools/jnativescan/TestMissingSystemClass.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2024, 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
+ * @library /test/lib .. ./cases/modules
+ * @build JNativeScanTestBase
+ * @compile --release 20 cases/classpath/missingsystem/App.java
+ * @run junit TestMissingSystemClass
+ */
+
+import jdk.test.lib.util.JarUtils;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+public class TestMissingSystemClass extends JNativeScanTestBase {
+
+    static Path MISSING_SYSTEM;
+
+    @BeforeAll
+    public static void before() throws IOException {
+        MISSING_SYSTEM = Path.of("missingsystem.jar");
+        Path testClasses = Path.of(System.getProperty("test.classes", ""));
+        JarUtils.createJarFile(MISSING_SYSTEM, testClasses, Path.of("missingsystem", "App.class"));
+    }
+
+    @Test
+    public void testSingleJarClassPath() {
+        assertFailure(jnativescan("--class-path", MISSING_SYSTEM.toString(), "--release", "21"))
+                .stdoutShouldBeEmpty()
+                .stderrShouldContain("Error while processing method")
+                .stderrShouldContain("missingsystem.App::main(String[])void")
+                .stderrShouldContain("CAUSED BY:")
+                .stderrShouldContain("System class can not be found")
+                .stderrShouldContain("java.lang.Compiler");
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java b/test/langtools/tools/jnativescan/TestSubclassRefs.java
similarity index 50%
rename from test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java
rename to test/langtools/tools/jnativescan/TestSubclassRefs.java
index bc6185f62b0..c8eed0439ee 100644
--- a/test/hotspot/jtreg/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java
+++ b/test/langtools/tools/jnativescan/TestSubclassRefs.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,30 +21,36 @@
  * questions.
  */
 
-/**
+/*
  * @test
- * @bug 8031320
- * @summary Verify processing of RTMLockingCalculationDelay option.
- * @library /test/lib /
- * @modules java.base/jdk.internal.misc
- *          java.management
- * @requires vm.flagless
- * @requires vm.rtm.compiler
- * @run driver compiler.rtm.cli.TestRTMLockingCalculationDelayOption
+ * @library /test/lib .. ./cases/modules
+ * @build JNativeScanTestBase
+ *     cases.classpath.subclassref.App
+ * @run junit TestSubclassRefs
  */
 
-package compiler.rtm.cli;
+import jdk.test.lib.util.JarUtils;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+public class TestSubclassRefs extends JNativeScanTestBase {
 
-public class TestRTMLockingCalculationDelayOption
-        extends RTMGenericCommandLineOptionTest {
-    private static final String DEFAULT_VALUE = "0";
+    static Path SUBCLASS_REF;
 
-    private TestRTMLockingCalculationDelayOption() {
-        super("RTMLockingCalculationDelay", false,
-                true, TestRTMLockingCalculationDelayOption.DEFAULT_VALUE);
+    @BeforeAll
+    public static void before() throws IOException {
+        SUBCLASS_REF = Path.of("subclassref.jar");
+        Path testClasses = Path.of(System.getProperty("test.classes", ""));
+        JarUtils.createJarFile(SUBCLASS_REF, testClasses, Path.of("subclassref", "App.class"));
     }
 
-    public static void main(String agrs[]) throws Throwable {
-        new TestRTMLockingCalculationDelayOption().runTestCases();
+    @Test
+    public void testSingleJarClassPath() {
+        assertSuccess(jnativescan("--class-path", SUBCLASS_REF.toString()))
+                .stderrShouldBeEmpty()
+                .stdoutShouldContain("<no restricted methods>");
     }
 }
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageOutput.java b/test/langtools/tools/jnativescan/cases/classpath/app/App.java
similarity index 80%
rename from test/hotspot/jtreg/vmTestbase/vm/share/process/MessageOutput.java
rename to test/langtools/tools/jnativescan/cases/classpath/app/App.java
index 3a0b4549c48..f96ab11e576 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/process/MessageOutput.java
+++ b/test/langtools/tools/jnativescan/cases/classpath/app/App.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 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
@@ -20,10 +20,12 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share.process;
+package app;
 
-public interface MessageOutput {
-        public void start();
-        public void send(String msg);
-        public void finish();
+import lib.Lib;
+
+public class App {
+    public static void main(String[] args) {
+        Lib.doIt();
+    }
 }
diff --git a/test/langtools/tools/jnativescan/cases/classpath/arrayref/App.java b/test/langtools/tools/jnativescan/cases/classpath/arrayref/App.java
new file mode 100644
index 00000000000..aa480f392fb
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/classpath/arrayref/App.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024, 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 arrayref;
+
+public class App {
+    public static void main(String[] args) {
+        // reference an array method to see that
+        // RestrictedMethodFinder correctly handles
+        // references to array methods
+        args.clone();
+    }
+}
diff --git a/test/hotspot/jtreg/compiler/testlibrary/rtm/libXAbortProvoker.c b/test/langtools/tools/jnativescan/cases/classpath/lib/Lib.java
similarity index 69%
rename from test/hotspot/jtreg/compiler/testlibrary/rtm/libXAbortProvoker.c
rename to test/langtools/tools/jnativescan/cases/classpath/lib/Lib.java
index b87882771d4..ec92696364c 100644
--- a/test/hotspot/jtreg/compiler/testlibrary/rtm/libXAbortProvoker.c
+++ b/test/langtools/tools/jnativescan/cases/classpath/lib/Lib.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 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
@@ -20,15 +20,14 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+package lib;
 
-#include "jni.h"
+import java.lang.foreign.MemorySegment;
 
-/**
- * Simply calling a JNI method from the JVM will abort any active transaction,
- * so doAbort() does nothing special and only returns after being called.
- * The transaction abortion happens right before the JNI method is called.
- */
-JNIEXPORT int JNICALL
-Java_compiler_testlibrary_rtm_XAbortProvoker_doAbort(JNIEnv *env, jobject o) {
-  return 0;
+public class Lib {
+    public static void doIt() {
+        MemorySegment.ofAddress(1234).reinterpret(10);
+    }
+
+    private static native void m();
 }
diff --git a/test/langtools/tools/jnativescan/cases/classpath/missingsystem/App.java b/test/langtools/tools/jnativescan/cases/classpath/missingsystem/App.java
new file mode 100644
index 00000000000..0e20fe81eec
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/classpath/missingsystem/App.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024, 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 missingsystem;
+
+public class App {
+    public static void main(String[] args) {
+        // this class was present in Java 20, but removed in 21
+        // if we compile with --release 20, but run jnativescan
+        // with --release 21, we should get an error
+        java.lang.Compiler.enable();
+    }
+}
diff --git a/test/hotspot/jtreg/vmTestbase/vm/share/UnsafeAccess.java b/test/langtools/tools/jnativescan/cases/classpath/singlejar/main/Main.java
similarity index 70%
rename from test/hotspot/jtreg/vmTestbase/vm/share/UnsafeAccess.java
rename to test/langtools/tools/jnativescan/cases/classpath/singlejar/main/Main.java
index 79a0a7392de..280e8646f9f 100644
--- a/test/hotspot/jtreg/vmTestbase/vm/share/UnsafeAccess.java
+++ b/test/langtools/tools/jnativescan/cases/classpath/singlejar/main/Main.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 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
@@ -20,23 +20,15 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-package vm.share;
 
-import java.lang.reflect.Field;
+package main;
 
-import jdk.internal.misc.Unsafe;
+import java.lang.foreign.*;
 
-@SuppressWarnings("restriction")
-public class UnsafeAccess {
-    public static Unsafe unsafe;
-
-    static {
-        try {
-            unsafe = Unsafe.getUnsafe();
-        } catch ( Exception e ) {
-            e.printStackTrace();
-        }
+public class Main {
+    public static void main(String[] args) {
+        MemorySegment.ofAddress(1234).reinterpret(10);
     }
 
-
+    private static native void m();
 }
diff --git a/test/langtools/tools/jnativescan/cases/classpath/subclassref/App.java b/test/langtools/tools/jnativescan/cases/classpath/subclassref/App.java
new file mode 100644
index 00000000000..abe9e41265e
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/classpath/subclassref/App.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024, 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 subclassref;
+
+import java.util.List;
+
+public class App {
+    public static void main(String[] args) {
+        List<String> l = List.of(args);
+        l.stream(); // List does not declare stream()
+    }
+}
diff --git a/test/langtools/tools/jnativescan/cases/classpath/unnamed_package/UnnamedPackage.java b/test/langtools/tools/jnativescan/cases/classpath/unnamed_package/UnnamedPackage.java
new file mode 100644
index 00000000000..4e8dfe69b5a
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/classpath/unnamed_package/UnnamedPackage.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024, 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.lang.foreign.*;
+
+public class UnnamedPackage {
+    public static void main(String[] args) {
+        MemorySegment.ofAddress(1234).reinterpret(10);
+    }
+
+    private static native void m();
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.lib/module-info.java b/test/langtools/tools/jnativescan/cases/modules/org.lib/module-info.java
new file mode 100644
index 00000000000..8572ed80e43
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.lib/module-info.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2024, 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.
+ */
+
+module org.lib {
+    exports org.lib;
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Lib.java b/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Lib.java
new file mode 100644
index 00000000000..3f9ea0e1ada
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Lib.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2024, 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 org.lib;
+
+import java.lang.foreign.*;
+
+public class Lib {
+    public static void doIt() {
+        MemorySegment.ofAddress(1234).reinterpret(10);
+    }
+
+    private static native void m();
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Service.java b/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Service.java
new file mode 100644
index 00000000000..2e406d926a6
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.lib/org/lib/Service.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2024, 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 org.lib;
+
+public interface Service {
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.myapp/module-info.java b/test/langtools/tools/jnativescan/cases/modules/org.myapp/module-info.java
new file mode 100644
index 00000000000..8155fb5d8f2
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.myapp/module-info.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2024, 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.
+ */
+
+module org.myapp {
+    requires org.lib;
+
+    uses org.lib.Service;
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.myapp/org/myapp/main/Main.java b/test/langtools/tools/jnativescan/cases/modules/org.myapp/org/myapp/main/Main.java
new file mode 100644
index 00000000000..c2329b2ceeb
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.myapp/org/myapp/main/Main.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024, 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 org.myapp.main;
+
+import org.lib.Lib;
+
+public class Main {
+    public static void main(String[] args) {
+        Lib.doIt();
+    }
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.service/module-info.java b/test/langtools/tools/jnativescan/cases/modules/org.service/module-info.java
new file mode 100644
index 00000000000..431dd64172d
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.service/module-info.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2024, 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.
+ */
+module org.service {
+    requires org.lib;
+
+    provides org.lib.Service with org.service.ServiceImpl;
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.service/org/service/ServiceImpl.java b/test/langtools/tools/jnativescan/cases/modules/org.service/org/service/ServiceImpl.java
new file mode 100644
index 00000000000..6e643f1c649
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.service/org/service/ServiceImpl.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2024, 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 org.service;
+
+import org.lib.Service;
+
+import java.lang.foreign.MemorySegment;
+
+public class ServiceImpl implements Service {
+    public void doIt() {
+        MemorySegment.ofAddress(1234).reinterpret(10);
+    }
+
+    private native void m();
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.singlejar/module-info.java b/test/langtools/tools/jnativescan/cases/modules/org.singlejar/module-info.java
new file mode 100644
index 00000000000..c9f96e4f771
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.singlejar/module-info.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2024, 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.
+ */
+module org.singlejar {
+
+}
diff --git a/test/langtools/tools/jnativescan/cases/modules/org.singlejar/org/singlejar/main/Main.java b/test/langtools/tools/jnativescan/cases/modules/org.singlejar/org/singlejar/main/Main.java
new file mode 100644
index 00000000000..c6925eaf649
--- /dev/null
+++ b/test/langtools/tools/jnativescan/cases/modules/org.singlejar/org/singlejar/main/Main.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2024, 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 org.singlejar.main;
+
+import java.lang.foreign.*;
+
+public class Main {
+    public static void main(String[] args) {
+        MemorySegment.ofAddress(1234).reinterpret(10);
+    }
+
+    private static native void m();
+}
diff --git a/test/lib-test/TEST.ROOT b/test/lib-test/TEST.ROOT
index 9b91a0dfcc1..27576a2d040 100644
--- a/test/lib-test/TEST.ROOT
+++ b/test/lib-test/TEST.ROOT
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2020, 2024, 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
@@ -29,7 +29,7 @@
 keys=randomness
 
 # Minimum jtreg version
-requiredVersion=7.3.1+1
+requiredVersion=7.4+1
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../ notation to reach them
diff --git a/test/lib-test/jdk/test/whitebox/CPUInfoTest.java b/test/lib-test/jdk/test/whitebox/CPUInfoTest.java
index 138327ec44f..859ec772229 100644
--- a/test/lib-test/jdk/test/whitebox/CPUInfoTest.java
+++ b/test/lib-test/jdk/test/whitebox/CPUInfoTest.java
@@ -65,7 +65,8 @@ public class CPUInfoTest {
                     "avx512_vbmi2", "avx512_vbmi",      "rdtscp",            "rdpid",
                     "hv",           "fsrm",             "avx512_bitalg",     "gfni",
                     "f16c",         "pku",              "ospke",             "cet_ibt",
-                    "cet_ss",       "avx512_ifma",      "serialize",         "avx_ifma"
+                    "cet_ss",       "avx512_ifma",      "serialize",         "avx_ifma",
+                    "apx_f"
                     );
             // @formatter:on
             // Checkstyle: resume
diff --git a/test/lib/jdk/test/lib/Platform.java b/test/lib/jdk/test/lib/Platform.java
index e2451fc8366..4a4b164cd17 100644
--- a/test/lib/jdk/test/lib/Platform.java
+++ b/test/lib/jdk/test/lib/Platform.java
@@ -35,6 +35,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import static java.util.Locale.ROOT;
 
 public class Platform {
     public  static final String vmName      = privilegedGetProperty("java.vm.name");
@@ -134,7 +135,7 @@ public static boolean isWindows() {
     }
 
     private static boolean isOs(String osname) {
-        return osName.toLowerCase().startsWith(osname.toLowerCase());
+        return osName.toLowerCase(ROOT).startsWith(osname.toLowerCase(ROOT));
     }
 
     public static String getOsName() {
@@ -175,15 +176,15 @@ public static int getOsVersionMinor() {
     }
 
     public static boolean isDebugBuild() {
-        return (jdkDebug.toLowerCase().contains("debug"));
+        return (jdkDebug.toLowerCase(ROOT).contains("debug"));
     }
 
     public static boolean isSlowDebugBuild() {
-        return (jdkDebug.toLowerCase().equals("slowdebug"));
+        return (jdkDebug.toLowerCase(ROOT).equals("slowdebug"));
     }
 
     public static boolean isFastDebugBuild() {
-        return (jdkDebug.toLowerCase().equals("fastdebug"));
+        return (jdkDebug.toLowerCase(ROOT).equals("fastdebug"));
     }
 
     public static String getVMVersion() {
@@ -350,8 +351,8 @@ private static boolean isArch(String archnameRE) {
     }
 
     public static boolean isOracleLinux7() {
-        if (System.getProperty("os.name").toLowerCase().contains("linux") &&
-                System.getProperty("os.version").toLowerCase().contains("el")) {
+        if (System.getProperty("os.name").toLowerCase(ROOT).contains("linux") &&
+                System.getProperty("os.version").toLowerCase(ROOT).contains("el")) {
             Pattern p = Pattern.compile("el(\\d+)");
             Matcher m = p.matcher(System.getProperty("os.version"));
             if (m.find()) {
diff --git a/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java b/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java
index a6eff3d237a..0b29d288cd9 100644
--- a/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java
+++ b/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java
@@ -69,6 +69,16 @@ private void testAll(Metrics m, boolean inContainer) throws Exception {
           tester.testMemoryUsage();
         }
         tester.testMisc();
+        testContainerized(m, inContainer);
+    }
+
+    private void testContainerized(Metrics m, boolean inContainer) {
+        if (m.isContainerized() != inContainer) {
+            throw new RuntimeException("containerized test failed. " +
+                                       "Expected isContainerized()==" + inContainer +
+                                       " but got '" + m.isContainerized() + "'");
+        }
+        System.out.println("testContainerized() PASSED!");
     }
 
     public static void main(String[] args) throws Exception {
diff --git a/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp b/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp
index 693baf98d1f..f16b9fefb99 100644
--- a/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp
+++ b/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp
@@ -239,7 +239,7 @@ print_method(jvmtiEnv *jvmti, JNIEnv* jni, jmethodID method, jint depth) {
   check_jvmti_status(jni, err, "print_method: error in JVMTI GetMethodName");
 
   LOG("%2d: %s: %s%s\n", depth, cname, mname, msign);
-  fflush(0);
+  fflush(nullptr);
   deallocate(jvmti, jni, (void*)cname);
   deallocate(jvmti, jni, (void*)mname);
   deallocate(jvmti, jni, (void*)msign);
diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java
index 2402e39974e..1bc309e2aec 100644
--- a/test/lib/jdk/test/whitebox/WhiteBox.java
+++ b/test/lib/jdk/test/whitebox/WhiteBox.java
@@ -119,6 +119,8 @@ public         boolean isMonitorInflated(Object obj) {
     return isMonitorInflated0(obj);
   }
 
+  public native long getInUseMonitorCount();
+
   public native int getLockStackCapacity();
 
   public native boolean supportsRecursiveLightweightLocking();
@@ -798,4 +800,5 @@ public native int validateCgroup(String procCgroups,
   public native boolean setVirtualThreadsNotifyJvmtiMode(boolean enabled);
 
   public native void preTouchMemory(long addr, long size);
+  public native long rss();
 }
diff --git a/test/micro/org/openjdk/bench/java/lang/Characters.java b/test/micro/org/openjdk/bench/java/lang/Characters.java
index 246b4f5ccc8..eb12ad74457 100644
--- a/test/micro/org/openjdk/bench/java/lang/Characters.java
+++ b/test/micro/org/openjdk/bench/java/lang/Characters.java
@@ -35,6 +35,7 @@
 import org.openjdk.jmh.annotations.State;
 import org.openjdk.jmh.annotations.Warmup;
 
+import java.util.Random;
 import java.util.concurrent.TimeUnit;
 
 @BenchmarkMode(Mode.AverageTime)
@@ -48,6 +49,29 @@ public class Characters {
     @Param({"9", "65", "97", "223", "430"})
     private int codePoint;
 
+    @Param("500")
+    private int size;
+
+    private char[] chars;
+    private char[] res;
+
+    @Setup
+    public void setup() {
+        Random r  = new Random(0);
+        chars     = new char[size];
+        res       = new char[size];
+        for (int i = 0; i < size; i++) {
+            chars[i] = (char)r.nextInt(Character.MAX_VALUE + 1);
+        }
+    }
+
+    @Benchmark
+    public void reverseBytes() {
+        for (int i = 0; i < size; i++) {
+            res[i] = Character.reverseBytes(chars[i]);
+        }
+    }
+
     @Benchmark
     public boolean isDigit() {
         return Character.isDigit(codePoint);
diff --git a/test/micro/org/openjdk/bench/java/lang/Shorts.java b/test/micro/org/openjdk/bench/java/lang/Shorts.java
new file mode 100644
index 00000000000..b11d07db8e0
--- /dev/null
+++ b/test/micro/org/openjdk/bench/java/lang/Shorts.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2024, 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 org.openjdk.bench.java.lang;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@State(Scope.Thread)
+@Warmup(iterations = 5, time = 1)
+@Measurement(iterations = 5, time = 1)
+@Fork(3)
+public class Shorts {
+
+    @Param("500")
+    private int size;
+
+    private short[] shorts;
+    private short[] res;
+
+    @Setup
+    public void setup() {
+        Random r  = new Random(0);
+        shorts     = new short[size];
+        res       = new short[size];
+        for (int i = 0; i < size; i++) {
+            shorts[i] = (short)(r.nextInt(Character.MAX_VALUE + 1) + Short.MIN_VALUE);
+        }
+    }
+
+    @Benchmark
+    public void reverseBytes() {
+        for (int i = 0; i < size; i++) {
+            res[i] = Short.reverseBytes(shorts[i]);
+        }
+    }
+}
diff --git a/test/micro/org/openjdk/bench/java/lang/StringBuilders.java b/test/micro/org/openjdk/bench/java/lang/StringBuilders.java
index 29827b7f03a..e7579d72ecb 100644
--- a/test/micro/org/openjdk/bench/java/lang/StringBuilders.java
+++ b/test/micro/org/openjdk/bench/java/lang/StringBuilders.java
@@ -241,17 +241,66 @@ public String toStringCharWithBool8() {
 
 
     @Benchmark
-    public String toStringCharWithFloat8() {
-        StringBuilder result = new StringBuilder();
-        result.append(113.110F);
-        result.append(156456.36435637F);
-        result.append(65436434.64632F);
-        result.append(42654634.64540F);
-        result.append(63464351.64537F);
-        result.append(634564.645711F);
-        result.append(64547.64311F);
-        result.append(4763456341.64531F);
-        return result.toString();
+    public int appendWithFloat8Latin1() {
+        StringBuilder buf = sbLatin1;
+        buf.setLength(0);
+        buf.append(113.110F);
+        buf.append(156456.36435637F);
+        buf.append(65436434.64632F);
+        buf.append(42654634.64540F);
+        buf.append(63464351.64537F);
+        buf.append(634564.645711F);
+        buf.append(64547.64311F);
+        buf.append(4763456341.64531F);
+        return buf.length();
+    }
+
+
+    @Benchmark
+    public int appendWithFloat8Utf16() {
+        StringBuilder buf = sbUtf16;
+        buf.setLength(0);
+        buf.append(113.110F);
+        buf.append(156456.36435637F);
+        buf.append(65436434.64632F);
+        buf.append(42654634.64540F);
+        buf.append(63464351.64537F);
+        buf.append(634564.645711F);
+        buf.append(64547.64311F);
+        buf.append(4763456341.64531F);
+        return buf.length();
+    }
+
+
+    @Benchmark
+    public int appendWithDouble8Latin1() {
+        StringBuilder buf = sbLatin1;
+        buf.setLength(0);
+        buf.append(0.3005216476500575D);
+        buf.append(0.39727691577802204D);
+        buf.append(0.9869700323149287D);
+        buf.append(42654634.645403256D);
+        buf.append(63464351.645371353D);
+        buf.append(634564.645711246D);
+        buf.append(64547.6431172363D);
+        buf.append(4763456341.64531675D);
+        return buf.length();
+    }
+
+
+    @Benchmark
+    public int appendWithDouble8Utf16() {
+        StringBuilder buf = sbUtf16;
+        buf.setLength(0);
+        buf.append(0.3005216476500575D);
+        buf.append(0.39727691577802204D);
+        buf.append(0.9869700323149287D);
+        buf.append(42654634.645403256D);
+        buf.append(63464351.645371353D);
+        buf.append(634564.645711246D);
+        buf.append(64547.6431172363D);
+        buf.append(4763456341.64531675D);
+        return buf.length();
     }
 
     @Benchmark
diff --git a/test/micro/org/openjdk/bench/java/lang/StringIndexOfHuge.java b/test/micro/org/openjdk/bench/java/lang/StringIndexOfHuge.java
new file mode 100644
index 00000000000..cac86bcc17f
--- /dev/null
+++ b/test/micro/org/openjdk/bench/java/lang/StringIndexOfHuge.java
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 2024, 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 org.openjdk.bench.java.lang;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+import java.util.concurrent.TimeUnit;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@State(Scope.Thread)
+@Warmup(iterations = 5, time = 1)
+@Measurement(iterations = 5, time = 1)
+@Fork(value = 3)
+public class StringIndexOfHuge {
+
+  private String dataString;
+  private String dataString16;
+  private String dataStringHuge;
+  private String dataStringHuge16;
+  private String earlyMatchString;
+  private String earlyMatchString16;
+  private String midMatchString;
+  private String midMatchString16;
+  private String lateMatchString;
+  private String lateMatchString16;
+
+  private String searchString;
+  private String searchString16;
+  private String searchStringSmall;
+  private String searchStringSmall16;
+
+  private String searchStringHuge;
+  private String searchStringHuge16;
+
+  private String searchNoMatch;
+  private String searchNoMatch16;
+
+  private String Amdahl_1;
+  private String Amdahl_2;
+  private String Amdahl_3;
+  private String Amdahl_4;
+  private String Amdahl_5;
+  private String Amdahl_6;
+
+  @Setup
+  public void setup() {
+    dataString = "ngdflsoscargfdgf";
+    dataString16 = "ngdfilso\u01facargfd\u01eef";
+    dataStringHuge = (("A".repeat(32) + "B".repeat(32)).repeat(16) + "X").repeat(2) + "bB";
+    dataStringHuge16 = "\u01de" + (("A".repeat(32) + "B".repeat(32)).repeat(16) + "\u01fe").repeat(2) + "\u01eeB";
+    earlyMatchString = dataStringHuge.substring(0, 34);
+    earlyMatchString16 = dataStringHuge16.substring(0, 34);
+    midMatchString = dataStringHuge.substring(dataStringHuge.length() / 2 - 16, dataStringHuge.length() / 2 + 17);
+    midMatchString16 = dataStringHuge16.substring(dataStringHuge16.length() / 2 - 16, dataStringHuge16.length() / 2 + 17);
+    lateMatchString = dataStringHuge.substring(dataStringHuge.length() - 31);
+    lateMatchString16 = dataStringHuge16.substring(dataStringHuge16.length() - 31);
+
+    searchString = "oscar";
+    searchString16 = "o\u01facar";
+    searchStringSmall = "dgf";
+    searchStringSmall16 = "d\u01eef";
+
+    searchStringHuge = "capaapapapasdkajdlkajskldjaslkajdlkajskldjaslkjdlkasjdsalk";
+    searchStringHuge16 = "capaapapapasdkajdlka\u01feskldjaslkajdlkajskldjaslkjdlkasjdsalk";
+
+    searchNoMatch = "XYXyxYxy".repeat(22);
+    searchNoMatch16 = "\u01ab\u01ba\u01cb\u01bc\u01de\u01ed\u01fa\u01af".repeat(22);
+
+    Amdahl_1 = "B".repeat(30) + "X" + "A".repeat(30);
+    Amdahl_2 = "A".repeat(32) + "F" + "B".repeat(32);
+    Amdahl_3 = "A".repeat(32) + "B".repeat(32) + "XbB";
+    Amdahl_4 = "B".repeat(30) + "\u01ef" + "A".repeat(30);
+    Amdahl_5 = "A".repeat(32) + "\u01ef" + "B".repeat(32);
+    Amdahl_6 = "A".repeat(32) + "B".repeat(32) + "\u01fe\u01eeB";
+  }
+
+
+  /** IndexOf Micros */
+  @Benchmark
+  public int searchHugeEarlyMatch() {
+      return dataStringHuge.indexOf(earlyMatchString);
+  }
+
+  @Benchmark
+  public int searchHugeMiddleMatch() {
+      return dataStringHuge.indexOf(midMatchString);
+  }
+
+  @Benchmark
+  public int searchHugeLateMatch() {
+      return dataStringHuge.indexOf(lateMatchString);
+  }
+
+  @Benchmark
+  public int searchHugeNoMatch() {
+      return dataStringHuge.indexOf(searchNoMatch);
+  }
+
+  @Benchmark
+  public int searchSmallEarlyMatch() {
+      return searchString.indexOf(searchString);
+  }
+
+  @Benchmark
+  public int searchSmallMidMatch() {
+      return dataString.indexOf(searchString);
+  }
+
+  @Benchmark
+  public int searchSmallLateMatch() {
+      return dataString.indexOf(searchStringSmall);
+  }
+
+  @Benchmark
+  public int searchHugeLargeSubstring() {
+      return dataStringHuge.indexOf(Amdahl_1, 74);
+  }
+
+  @Benchmark
+  public int searchHugeLargeSubstringNoMatch() {
+      return dataStringHuge.indexOf(Amdahl_2, 64);
+  }
+
+  @Benchmark
+  public int searchSubstringLongerThanString() {
+      return midMatchString.indexOf(dataStringHuge, 3);
+  }
+
+  @Benchmark
+  public int searchHugeWorstCase() {
+      return dataStringHuge.indexOf(Amdahl_3);
+  }
+
+  @Benchmark
+  public int search16HugeEarlyMatch() {
+    return dataStringHuge16.indexOf(earlyMatchString);
+  }
+
+  @Benchmark
+  public int search16HugeMiddleMatch() {
+    return dataStringHuge16.indexOf(midMatchString);
+  }
+
+  @Benchmark
+  public int search16HugeLateMatch() {
+    return dataStringHuge16.indexOf(lateMatchString);
+  }
+
+  @Benchmark
+  public int search16HugeNoMatch() {
+    return dataStringHuge16.indexOf(searchNoMatch);
+  }
+
+  @Benchmark
+  public int search16SmallEarlyMatch() {
+    return searchString16.indexOf(searchString);
+  }
+
+  @Benchmark
+  public int search16SmallMidMatch() {
+    return dataString16.indexOf(searchString);
+  }
+
+  @Benchmark
+  public int search16SmallLateMatch() {
+    return dataString16.indexOf(searchStringSmall);
+  }
+
+  @Benchmark
+  public int search16HugeLargeSubstring() {
+    return dataStringHuge16.indexOf(Amdahl_1, 74);
+  }
+
+  @Benchmark
+  public int search16HugeLargeSubstringNoMatch() {
+    return dataStringHuge16.indexOf(Amdahl_2, 64);
+  }
+
+  @Benchmark
+  public int search16SubstringLongerThanString() {
+    return midMatchString16.indexOf(dataStringHuge, 3);
+  }
+
+  @Benchmark
+  public int search16HugeWorstCase() {
+    return dataStringHuge16.indexOf(Amdahl_3);
+  }
+
+  @Benchmark
+  public int search16HugeEarlyMatch16() {
+    return dataStringHuge16.indexOf(earlyMatchString16);
+  }
+
+  @Benchmark
+  public int search16HugeMiddleMatch16() {
+    return dataStringHuge16.indexOf(midMatchString16);
+  }
+
+  @Benchmark
+  public int search16HugeLateMatch16() {
+    return dataStringHuge16.indexOf(lateMatchString16);
+  }
+
+  @Benchmark
+  public int search16HugeNoMatch16() {
+    return dataStringHuge16.indexOf(searchNoMatch16);
+  }
+
+  @Benchmark
+  public int search16SmallEarlyMatch16() {
+    return searchString16.indexOf(searchString16);
+  }
+
+  @Benchmark
+  public int search16SmallMidMatch16() {
+    return dataString16.indexOf(searchString16);
+  }
+
+  @Benchmark
+  public int search16SmallLateMatch16() {
+    return dataString16.indexOf(searchStringSmall16);
+  }
+
+  @Benchmark
+  public int search16HugeLargeSubstring16() {
+    return dataStringHuge16.indexOf(Amdahl_4, 74);
+  }
+
+  @Benchmark
+  public int search16HugeLargeSubstringNoMatch16() {
+    return dataStringHuge16.indexOf(Amdahl_5, 64);
+  }
+
+  @Benchmark
+  public int search16SubstringLongerThanString16() {
+    return midMatchString16.indexOf(dataStringHuge16, 3);
+  }
+
+  @Benchmark
+  public int search16HugeWorstCase16() {
+    return dataStringHuge16.indexOf(Amdahl_6);
+  }
+}
diff --git a/test/micro/org/openjdk/bench/jdk/classfile/AdHocAdapt.java b/test/micro/org/openjdk/bench/jdk/classfile/AdHocAdapt.java
index 99ef450851e..c74956755b0 100644
--- a/test/micro/org/openjdk/bench/jdk/classfile/AdHocAdapt.java
+++ b/test/micro/org/openjdk/bench/jdk/classfile/AdHocAdapt.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -57,6 +57,6 @@ public enum X {
     public void transform(Blackhole bh) {
         var cc = ClassFile.of();
         for (byte[] bytes : classes)
-            bh.consume(cc.transform(cc.parse(bytes), transform.transform));
+            bh.consume(cc.transformClass(cc.parse(bytes), transform.transform));
     }
 }
diff --git a/test/micro/org/openjdk/bench/jdk/classfile/ClassfileBenchmark.java b/test/micro/org/openjdk/bench/jdk/classfile/ClassfileBenchmark.java
index 05dd4b17583..c07eff075c9 100644
--- a/test/micro/org/openjdk/bench/jdk/classfile/ClassfileBenchmark.java
+++ b/test/micro/org/openjdk/bench/jdk/classfile/ClassfileBenchmark.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -99,18 +99,18 @@ private static void consume(CompoundElement<?> parent) {
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     public void transformWithSharedCP(Blackhole bh) {
-        bh.consume(sharedCP.transform(benchModel, threeLevelNoop));
+        bh.consume(sharedCP.transformClass(benchModel, threeLevelNoop));
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     public void transformWithNewCP(Blackhole bh) {
-        bh.consume(newCP.transform(benchModel, threeLevelNoop));
+        bh.consume(newCP.transformClass(benchModel, threeLevelNoop));
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     public void transformWithAddedNOP(Blackhole bh) {
-        bh.consume(sharedCP.transform(benchModel, addNOP));
+        bh.consume(sharedCP.transformClass(benchModel, addNOP));
     }
 }
diff --git a/test/micro/org/openjdk/bench/jdk/classfile/ParseOptions.java b/test/micro/org/openjdk/bench/jdk/classfile/ParseOptions.java
index ed5e0f150ac..29c555c4a60 100644
--- a/test/micro/org/openjdk/bench/jdk/classfile/ParseOptions.java
+++ b/test/micro/org/openjdk/bench/jdk/classfile/ParseOptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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,7 +42,7 @@ public void transformNoDebug(Blackhole bh) {
         var cc = ClassFile.of(ClassFile.DebugElementsOption.DROP_DEBUG);
         for (byte[] aClass : classes) {
             ClassModel cm = cc.parse(aClass);
-            bh.consume(cc.transform(cm, threeLevelNoop));
+            bh.consume(cc.transformClass(cm, threeLevelNoop));
         }
     }
 
@@ -52,7 +52,7 @@ public void transformNoStackmap(Blackhole bh) {
         var cc = ClassFile.of(ClassFile.StackMapsOption.DROP_STACK_MAPS);
         for (byte[] aClass : classes) {
             ClassModel cm = cc.parse(aClass);
-            bh.consume(cc.transform(cm, threeLevelNoop));
+            bh.consume(cc.transformClass(cm, threeLevelNoop));
         }
     }
 
@@ -62,7 +62,7 @@ public void transformNoLineNumbers(Blackhole bh) {
         var cc = ClassFile.of(ClassFile.LineNumbersOption.DROP_LINE_NUMBERS);
         for (byte[] aClass : classes) {
             ClassModel cm = cc.parse(aClass);
-            bh.consume(cc.transform(cm, threeLevelNoop));
+            bh.consume(cc.transformClass(cm, threeLevelNoop));
         }
     }
 }
diff --git a/test/micro/org/openjdk/bench/jdk/classfile/RebuildMethodBodies.java b/test/micro/org/openjdk/bench/jdk/classfile/RebuildMethodBodies.java
index d5e77c1a2a7..07deec0ae48 100644
--- a/test/micro/org/openjdk/bench/jdk/classfile/RebuildMethodBodies.java
+++ b/test/micro/org/openjdk/bench/jdk/classfile/RebuildMethodBodies.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, 2024, 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
@@ -88,7 +88,7 @@ public void unshared() {
     }
 
     private static void transform(ClassFile cc, ClassModel clm) {
-        cc.transform(clm, ClassTransform.transformingMethodBodies((cob, coe) -> {
+        cc.transformClass(clm, ClassTransform.transformingMethodBodies((cob, coe) -> {
             switch (coe) {
                 case FieldInstruction i ->
                     cob.fieldAccess(i.opcode(), i.owner().asSymbol(), i.name().stringValue(), i.typeSymbol());
diff --git a/test/micro/org/openjdk/bench/jdk/classfile/Transforms.java b/test/micro/org/openjdk/bench/jdk/classfile/Transforms.java
index def55b5f20c..d49897dc9c2 100644
--- a/test/micro/org/openjdk/bench/jdk/classfile/Transforms.java
+++ b/test/micro/org/openjdk/bench/jdk/classfile/Transforms.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, 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
@@ -184,7 +184,7 @@ public enum NoOpTransform {
                     shared
                     ? options
                     : Stream.concat(Stream.of(options), Stream.of(ClassFile.ConstantPoolSharingOption.NEW_POOL)).toArray(ClassFile.Option[]::new));
-            this.transform = bytes -> cc.transform(cc.parse(bytes), classTransform);
+            this.transform = bytes -> cc.transformClass(cc.parse(bytes), classTransform);
         }
     }
 
@@ -198,7 +198,7 @@ public enum InjectNopTransform {
         NOP_SHARED(bytes -> {
             var cc = ClassFile.of();
             ClassModel cm = cc.parse(bytes);
-            return cc.transform(cm, (cb, ce) -> {
+            return cc.transformClass(cm, (cb, ce) -> {
                 if (ce instanceof MethodModel mm) {
                     cb.transformMethod(mm, (mb, me) -> {
                         if (me instanceof CodeModel xm) {
@@ -239,7 +239,7 @@ public enum SimpleTransform {
         HIGH_SHARED_ADD_FIELD(bytes -> {
             var cc = ClassFile.of();
             ClassModel cm = cc.parse(bytes);
-            return cc.transform(cm, new ClassTransform() {
+            return cc.transformClass(cm, new ClassTransform() {
                 @Override
                 public void accept(ClassBuilder builder, ClassElement element) {
                     builder.with(element);
@@ -277,7 +277,7 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str
         HIGH_SHARED_DEL_METHOD(bytes -> {
             var cc = ClassFile.of();
             ClassModel cm = cc.parse(bytes);
-            return cc.transform(cm, (builder, element) -> {
+            return cc.transformClass(cm, (builder, element) -> {
                 if (!(element instanceof MethodModel mm))
                     builder.with(element);
             });
diff --git a/test/micro/org/openjdk/bench/vm/compiler/FinalFieldInitialize.java b/test/micro/org/openjdk/bench/vm/compiler/FinalFieldInitialize.java
new file mode 100644
index 00000000000..ee0779faecf
--- /dev/null
+++ b/test/micro/org/openjdk/bench/vm/compiler/FinalFieldInitialize.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2024, Alibaba Group Co., Ltd. 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 org.openjdk.bench.vm.compiler;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.*;
+
+import java.util.concurrent.TimeUnit;
+import org.openjdk.jmh.infra.Blackhole;
+
+/* test allocation speed of object with final field */
+@BenchmarkMode(Mode.Throughput)
+@OutputTimeUnit(TimeUnit.SECONDS)
+@State(Scope.Benchmark)
+@Warmup(iterations = 5, time = 3, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 3, time = 3, timeUnit = TimeUnit.SECONDS)
+@Fork(value = 3)
+public class FinalFieldInitialize {
+  final static int LEN = 100_000;
+  Object arr[] = null;
+  @Setup
+  public void setup(){
+    arr = new Object[LEN];
+  }
+
+  @Benchmark
+  public void testAlloc(Blackhole bh) {
+    for (int i=0; i<LEN; i++) {
+      arr[i] = new TObj();
+    }
+    bh.consume(arr);
+  }
+
+  @Benchmark
+  public void testAllocWithFinal(Blackhole bh) {
+    for (int i=0; i<LEN; i++) {
+      arr[i] = new TObjWithFinal();
+    }
+    bh.consume(arr);
+  }
+}
+
+class TObj {
+  private int i;
+  private long l;
+  private boolean b;
+
+  public TObj() {
+    i = 10;
+    l = 100L;
+    b = true;
+  }
+}
+
+class TObjWithFinal {
+  private int i;
+  private long l;
+  private final boolean b;
+
+  public TObjWithFinal() {
+    i = 10;
+    l = 100L;
+    b = true;
+  }
+}
diff --git a/test/micro/org/openjdk/bench/vm/compiler/CMove.java b/test/micro/org/openjdk/bench/vm/compiler/PopCount.java
similarity index 59%
rename from test/micro/org/openjdk/bench/vm/compiler/CMove.java
rename to test/micro/org/openjdk/bench/vm/compiler/PopCount.java
index 0f92a681c72..cbf44023c1e 100644
--- a/test/micro/org/openjdk/bench/vm/compiler/CMove.java
+++ b/test/micro/org/openjdk/bench/vm/compiler/PopCount.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024 IBM Corporation. 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
@@ -20,40 +20,38 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
 package org.openjdk.bench.vm.compiler;
 
-import java.util.concurrent.TimeUnit;
-import java.util.random.RandomGeneratorFactory;
 import org.openjdk.jmh.annotations.*;
-import org.openjdk.jmh.infra.Blackhole;
+
+import java.util.concurrent.TimeUnit;
 
 @BenchmarkMode(Mode.AverageTime)
-@OutputTimeUnit(TimeUnit.MICROSECONDS)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
 @State(Scope.Thread)
-@Warmup(iterations = 5, time = 1)
+@Warmup(iterations = 10, time = 1)
 @Measurement(iterations = 5, time = 1)
-@Fork(value = 1)
-public class CMove {
-    static final int SIZE = 1000000;
-
-    @Param({"0.003", "0.006", "0.01", "0.02", "0.03", "0.06", "0.1", "0.2", "0.3", "0.6"})
-    double freq;
-
-    boolean[] conds;
-
-    @Setup(Level.Iteration)
-    public void setup() {
-        var r = RandomGeneratorFactory.getDefault().create(1);
-        conds = new boolean[SIZE];
-        for (int i = 0; i < SIZE; i++) {
-            conds[i] = r.nextDouble() < freq;
-        }
-    }
+@Fork(value = 5)
+public class PopCount {
+    int numTests = 100_000;
 
     @Benchmark
-    public void run(Blackhole bh) {
-        for (int i = 0; i < conds.length; i++) {
-            bh.consume(conds[i] ? 2 : 1);
+    public long test() {
+        long l1 = 1, l2 = 2, l3 = 3, l4 = 4, l5 = 5, l6 = 6, l7 = 7, l8 = 9, l9 = 9, l10 = 10;
+        for (long i = 0; i < numTests; i++) {
+            l1 ^= Long.bitCount(l1) + i;
+            l2 ^= Long.bitCount(l2) + i;
+            l3 ^= Long.bitCount(l3) + i;
+            l4 ^= Long.bitCount(l4) + i;
+            l5 ^= Long.bitCount(l5) + i;
+            l6 ^= Long.bitCount(l6) + i;
+            l7 ^= Long.bitCount(l7) + i;
+            l8 ^= Long.bitCount(l8) + i;
+            l9 ^= Long.bitCount(l9) + i;
+            l10 ^= Long.bitCount(l10) + i;
         }
+        return l1 + l2 + l3 + l4 + l5 + l6 + l7 + l8 + l9 + l10;
     }
-}
\ No newline at end of file
+
+}
diff --git a/test/micro/org/openjdk/bench/vm/compiler/VectorLoadToStoreForwarding.java b/test/micro/org/openjdk/bench/vm/compiler/VectorLoadToStoreForwarding.java
new file mode 100644
index 00000000000..efbf99c6ce5
--- /dev/null
+++ b/test/micro/org/openjdk/bench/vm/compiler/VectorLoadToStoreForwarding.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2024, 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 org.openjdk.bench.vm.compiler;
+
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.infra.*;
+
+import java.util.concurrent.TimeUnit;
+import java.util.Random;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@State(Scope.Thread)
+@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
+@Fork(value = 1)
+public abstract class VectorLoadToStoreForwarding {
+    @Param({"2048"})
+    public int SIZE;
+
+    private int[] aI;
+
+    @Param("0")
+    private int seed;
+    private Random r = new Random(seed);
+
+    @Setup
+    public void init() {
+        aI = new int[SIZE];
+
+        for (int i = 0; i < SIZE; i++) {
+            aI[i] = r.nextInt();
+        }
+    }
+
+    @Benchmark
+    public void benchmark_00() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 0] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_01() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 1] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_02() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 2] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_03() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 3] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_04() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 4] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_05() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 5] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_06() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 6] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_07() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 7] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_08() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 8] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_09() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 9] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_10() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 10] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_11() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 11] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_12() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 12] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_13() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 13] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_14() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 14] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_15() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 15] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_16() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 16] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_17() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 17] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_18() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 18] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_19() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 19] + 1;
+        }
+    }
+
+    @Benchmark
+    public void benchmark_20() {
+        for (int i = 20; i < SIZE; i++) {
+            aI[i] = aI[i - 20] + 1;
+        }
+    }
+
+    @Fork(value = 1, jvmArgsPrepend = {
+        "-XX:+UseSuperWord"
+    })
+    public static class VectorLoadToStoreForwardingSuperWord extends VectorLoadToStoreForwarding {}
+
+    @Fork(value = 1, jvmArgsPrepend = {
+        "-XX:-UseSuperWord"
+    })
+    public static class VectorLoadToStoreForwardingNoSuperWord extends VectorLoadToStoreForwarding {}
+}