Merge pull request #5583 from senivam/30_merged

merge of the actual 2.x into 3.0 branch
diff --git a/NOTICE.md b/NOTICE.md
index 862a799..1f66e07 100644
--- a/NOTICE.md
+++ b/NOTICE.md
@@ -95,7 +95,7 @@
 * Project: http://www.kineticjs.com, https://github.com/ericdrowell/KineticJS

 * Copyright: Eric Rowell

 

-org.objectweb.asm Version 9.6

+org.objectweb.asm Version 9.7

 * License: Modified BSD (https://asm.ow2.io/license.html)

 * Copyright (c) 2000-2011 INRIA, France Telecom. All rights reserved.

 

diff --git a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/AnnotationWriter.java b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/AnnotationWriter.java
index d1f86a6..23ea980 100644
--- a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/AnnotationWriter.java
+++ b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/AnnotationWriter.java
@@ -144,7 +144,7 @@
     // Write type_index and reserve space for num_element_value_pairs.
     annotation.putShort(symbolTable.addConstantUtf8(descriptor)).putShort(0);
     return new AnnotationWriter(
-        symbolTable, /* useNamedValues = */ true, annotation, previousAnnotation);
+        symbolTable, /* useNamedValues= */ true, annotation, previousAnnotation);
   }
 
   /**
@@ -179,7 +179,7 @@
     // Write type_index and reserve space for num_element_value_pairs.
     typeAnnotation.putShort(symbolTable.addConstantUtf8(descriptor)).putShort(0);
     return new AnnotationWriter(
-        symbolTable, /* useNamedValues = */ true, typeAnnotation, previousAnnotation);
+        symbolTable, /* useNamedValues= */ true, typeAnnotation, previousAnnotation);
   }
 
   // -----------------------------------------------------------------------------------------------
@@ -284,7 +284,7 @@
     }
     // Write tag and type_index, and reserve 2 bytes for num_element_value_pairs.
     annotation.put12('@', symbolTable.addConstantUtf8(descriptor)).putShort(0);
-    return new AnnotationWriter(symbolTable, /* useNamedValues = */ true, annotation, null);
+    return new AnnotationWriter(symbolTable, /* useNamedValues= */ true, annotation, null);
   }
 
   @Override
@@ -303,7 +303,7 @@
     // visit the array elements. Its num_element_value_pairs will correspond to the number of array
     // elements and will be stored in what is in fact num_values.
     annotation.put12('[', 0);
-    return new AnnotationWriter(symbolTable, /* useNamedValues = */ false, annotation, null);
+    return new AnnotationWriter(symbolTable, /* useNamedValues= */ false, annotation, null);
   }
 
   @Override
diff --git a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/ClassReader.java b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/ClassReader.java
index 820a3b8..a2bdae3 100644
--- a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/ClassReader.java
+++ b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/ClassReader.java
@@ -177,7 +177,7 @@
       final byte[] classFileBuffer,
       final int classFileOffset,
       final int classFileLength) { // NOPMD(UnusedFormalParameter) used for backward compatibility.
-    this(classFileBuffer, classFileOffset, /* checkClassVersion = */ true);
+    this(classFileBuffer, classFileOffset, /* checkClassVersion= */ true);
   }
 
   /**
@@ -195,7 +195,7 @@
     this.b = classFileBuffer;
     // Check the class' major_version. This field is after the magic and minor_version fields, which
     // use 4 and 2 bytes respectively.
-    if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V22) {
+    if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V23) {
       throw new IllegalArgumentException(
           "Unsupported class file major version " + readShort(classFileOffset + 6));
     }
@@ -607,9 +607,9 @@
         // Parse num_element_value_pairs and element_value_pairs and visit these values.
         currentAnnotationOffset =
             readElementValues(
-                classVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
+                classVisitor.visitAnnotation(annotationDescriptor, /* visible= */ true),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -625,9 +625,9 @@
         // Parse num_element_value_pairs and element_value_pairs and visit these values.
         currentAnnotationOffset =
             readElementValues(
-                classVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
+                classVisitor.visitAnnotation(annotationDescriptor, /* visible= */ false),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -649,9 +649,9 @@
                     context.currentTypeAnnotationTarget,
                     context.currentTypeAnnotationTargetPath,
                     annotationDescriptor,
-                    /* visible = */ true),
+                    /* visible= */ true),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -673,9 +673,9 @@
                     context.currentTypeAnnotationTarget,
                     context.currentTypeAnnotationTargetPath,
                     annotationDescriptor,
-                    /* visible = */ false),
+                    /* visible= */ false),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -967,9 +967,9 @@
         // Parse num_element_value_pairs and element_value_pairs and visit these values.
         currentAnnotationOffset =
             readElementValues(
-                recordComponentVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
+                recordComponentVisitor.visitAnnotation(annotationDescriptor, /* visible= */ true),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -985,9 +985,9 @@
         // Parse num_element_value_pairs and element_value_pairs and visit these values.
         currentAnnotationOffset =
             readElementValues(
-                recordComponentVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
+                recordComponentVisitor.visitAnnotation(annotationDescriptor, /* visible= */ false),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1009,9 +1009,9 @@
                     context.currentTypeAnnotationTarget,
                     context.currentTypeAnnotationTargetPath,
                     annotationDescriptor,
-                    /* visible = */ true),
+                    /* visible= */ true),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1033,9 +1033,9 @@
                     context.currentTypeAnnotationTarget,
                     context.currentTypeAnnotationTargetPath,
                     annotationDescriptor,
-                    /* visible = */ false),
+                    /* visible= */ false),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1151,9 +1151,9 @@
         // Parse num_element_value_pairs and element_value_pairs and visit these values.
         currentAnnotationOffset =
             readElementValues(
-                fieldVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
+                fieldVisitor.visitAnnotation(annotationDescriptor, /* visible= */ true),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1169,9 +1169,9 @@
         // Parse num_element_value_pairs and element_value_pairs and visit these values.
         currentAnnotationOffset =
             readElementValues(
-                fieldVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
+                fieldVisitor.visitAnnotation(annotationDescriptor, /* visible= */ false),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1193,9 +1193,9 @@
                     context.currentTypeAnnotationTarget,
                     context.currentTypeAnnotationTargetPath,
                     annotationDescriptor,
-                    /* visible = */ true),
+                    /* visible= */ true),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1217,9 +1217,9 @@
                     context.currentTypeAnnotationTarget,
                     context.currentTypeAnnotationTargetPath,
                     annotationDescriptor,
-                    /* visible = */ false),
+                    /* visible= */ false),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1412,9 +1412,9 @@
         // Parse num_element_value_pairs and element_value_pairs and visit these values.
         currentAnnotationOffset =
             readElementValues(
-                methodVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
+                methodVisitor.visitAnnotation(annotationDescriptor, /* visible= */ true),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1430,9 +1430,9 @@
         // Parse num_element_value_pairs and element_value_pairs and visit these values.
         currentAnnotationOffset =
             readElementValues(
-                methodVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
+                methodVisitor.visitAnnotation(annotationDescriptor, /* visible= */ false),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1454,9 +1454,9 @@
                     context.currentTypeAnnotationTarget,
                     context.currentTypeAnnotationTargetPath,
                     annotationDescriptor,
-                    /* visible = */ true),
+                    /* visible= */ true),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1478,9 +1478,9 @@
                     context.currentTypeAnnotationTarget,
                     context.currentTypeAnnotationTargetPath,
                     annotationDescriptor,
-                    /* visible = */ false),
+                    /* visible= */ false),
                 currentAnnotationOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -1488,16 +1488,13 @@
     // Visit the RuntimeVisibleParameterAnnotations attribute.
     if (runtimeVisibleParameterAnnotationsOffset != 0) {
       readParameterAnnotations(
-          methodVisitor, context, runtimeVisibleParameterAnnotationsOffset, /* visible = */ true);
+          methodVisitor, context, runtimeVisibleParameterAnnotationsOffset, /* visible= */ true);
     }
 
     // Visit the RuntimeInvisibleParameterAnnotations attribute.
     if (runtimeInvisibleParameterAnnotationsOffset != 0) {
       readParameterAnnotations(
-          methodVisitor,
-          context,
-          runtimeInvisibleParameterAnnotationsOffset,
-          /* visible = */ false);
+          methodVisitor, context, runtimeInvisibleParameterAnnotationsOffset, /* visible= */ false);
     }
 
     // Visit the non standard attributes.
@@ -1926,7 +1923,7 @@
         }
       } else if (Constants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
         visibleTypeAnnotationOffsets =
-            readTypeAnnotations(methodVisitor, context, currentOffset, /* visible = */ true);
+            readTypeAnnotations(methodVisitor, context, currentOffset, /* visible= */ true);
         // Here we do not extract the labels corresponding to the attribute content. This would
         // require a full parsing of the attribute, which would need to be repeated when parsing
         // the bytecode instructions (see below). Instead, the content of the attribute is read one
@@ -1935,7 +1932,7 @@
         // time. This assumes that type annotations are ordered by increasing bytecode offset.
       } else if (Constants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
         invisibleTypeAnnotationOffsets =
-            readTypeAnnotations(methodVisitor, context, currentOffset, /* visible = */ false);
+            readTypeAnnotations(methodVisitor, context, currentOffset, /* visible= */ false);
         // Same comment as above for the RuntimeVisibleTypeAnnotations attribute.
       } else if (Constants.STACK_MAP_TABLE.equals(attributeName)) {
         if ((context.parsingOptions & SKIP_FRAMES) == 0) {
@@ -2517,9 +2514,9 @@
                   context.currentTypeAnnotationTarget,
                   context.currentTypeAnnotationTargetPath,
                   annotationDescriptor,
-                  /* visible = */ true),
+                  /* visible= */ true),
               currentAnnotationOffset,
-              /* named = */ true,
+              /* named= */ true,
               charBuffer);
         }
         currentVisibleTypeAnnotationBytecodeOffset =
@@ -2545,9 +2542,9 @@
                   context.currentTypeAnnotationTarget,
                   context.currentTypeAnnotationTargetPath,
                   annotationDescriptor,
-                  /* visible = */ false),
+                  /* visible= */ false),
               currentAnnotationOffset,
-              /* named = */ true,
+              /* named= */ true,
               charBuffer);
         }
         currentInvisibleTypeAnnotationBytecodeOffset =
@@ -2618,9 +2615,9 @@
                   context.currentLocalVariableAnnotationRangeEnds,
                   context.currentLocalVariableAnnotationRangeIndices,
                   annotationDescriptor,
-                  /* visible = */ true),
+                  /* visible= */ true),
               currentOffset,
-              /* named = */ true,
+              /* named= */ true,
               charBuffer);
         }
       }
@@ -2646,9 +2643,9 @@
                   context.currentLocalVariableAnnotationRangeEnds,
                   context.currentLocalVariableAnnotationRangeIndices,
                   annotationDescriptor,
-                  /* visible = */ false),
+                  /* visible= */ false),
               currentOffset,
-              /* named = */ true,
+              /* named= */ true,
               charBuffer);
         }
       }
@@ -2821,7 +2818,7 @@
                 methodVisitor.visitTryCatchAnnotation(
                     targetType & 0xFFFFFF00, path, annotationDescriptor, visible),
                 currentOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       } else {
         // We don't want to visit the other target_type annotations, so we just skip them (which
@@ -2832,7 +2829,7 @@
         // with a null AnnotationVisitor).
         currentOffset =
             readElementValues(
-                /* annotationVisitor = */ null, currentOffset, /* named = */ true, charBuffer);
+                /* annotationVisitor= */ null, currentOffset, /* named= */ true, charBuffer);
       }
     }
     return typeAnnotationsOffsets;
@@ -2972,7 +2969,7 @@
             readElementValues(
                 methodVisitor.visitParameterAnnotation(i, annotationDescriptor, visible),
                 currentOffset,
-                /* named = */ true,
+                /* named= */ true,
                 charBuffer);
       }
     }
@@ -3042,9 +3039,9 @@
         case 'e': // enum_const_value
           return currentOffset + 5;
         case '@': // annotation_value
-          return readElementValues(null, currentOffset + 3, /* named = */ true, charBuffer);
+          return readElementValues(null, currentOffset + 3, /* named= */ true, charBuffer);
         case '[': // array_value
-          return readElementValues(null, currentOffset + 1, /* named = */ false, charBuffer);
+          return readElementValues(null, currentOffset + 1, /* named= */ false, charBuffer);
         default:
           return currentOffset + 3;
       }
@@ -3112,7 +3109,7 @@
           return readElementValues(
               annotationVisitor.visitArray(elementName),
               currentOffset - 2,
-              /* named = */ false,
+              /* named= */ false,
               charBuffer);
         }
         switch (classFileBuffer[currentOffset] & 0xFF) {
@@ -3189,7 +3186,7 @@
                 readElementValues(
                     annotationVisitor.visitArray(elementName),
                     currentOffset - 2,
-                    /* named = */ false,
+                    /* named= */ false,
                     charBuffer);
             break;
         }
diff --git a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/ClassWriter.java b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/ClassWriter.java
index 7588188..0af80ce 100644
--- a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/ClassWriter.java
+++ b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/ClassWriter.java
@@ -774,7 +774,7 @@
     lastRecordComponent = null;
     firstAttribute = null;
     compute = hasFrames ? MethodWriter.COMPUTE_INSERTED_FRAMES : MethodWriter.COMPUTE_NOTHING;
-    new ClassReader(classFile, 0, /* checkClassVersion = */ false)
+    new ClassReader(classFile, 0, /* checkClassVersion= */ false)
         .accept(
             this,
             attributes,
diff --git a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/MethodWriter.java b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/MethodWriter.java
index 918bd71..bccc997 100644
--- a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/MethodWriter.java
+++ b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/MethodWriter.java
@@ -651,7 +651,7 @@
   @Override
   public AnnotationVisitor visitAnnotationDefault() {
     defaultValue = new ByteVector();
-    return new AnnotationWriter(symbolTable, /* useNamedValues = */ false, defaultValue, null);
+    return new AnnotationWriter(symbolTable, /* useNamedValues= */ false, defaultValue, null);
   }
 
   @Override
diff --git a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/Opcodes.java b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/Opcodes.java
index 4256afa..f796c94 100644
--- a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/Opcodes.java
+++ b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/Opcodes.java
@@ -288,6 +288,7 @@
   int V20 = 0 << 16 | 64;
   int V21 = 0 << 16 | 65;
   int V22 = 0 << 16 | 66;
+  int V23 = 0 << 16 | 67;
 
   /**
    * Version flag indicating that the class is using 'preview' features.
diff --git a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/SymbolTable.java b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/SymbolTable.java
index dc601a1..9ceffb1 100644
--- a/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/SymbolTable.java
+++ b/core-server/src/main/java/jersey/repackaged/org/objectweb/asm/SymbolTable.java
@@ -1414,23 +1414,23 @@
     }
 
     Entry(final int index, final int tag, final String value, final int hashCode) {
-      super(index, tag, /* owner = */ null, /* name = */ null, value, /* data = */ 0);
+      super(index, tag, /* owner= */ null, /* name= */ null, value, /* data= */ 0);
       this.hashCode = hashCode;
     }
 
     Entry(final int index, final int tag, final String value, final long data, final int hashCode) {
-      super(index, tag, /* owner = */ null, /* name = */ null, value, data);
+      super(index, tag, /* owner= */ null, /* name= */ null, value, data);
       this.hashCode = hashCode;
     }
 
     Entry(
         final int index, final int tag, final String name, final String value, final int hashCode) {
-      super(index, tag, /* owner = */ null, name, value, /* data = */ 0);
+      super(index, tag, /* owner= */ null, name, value, /* data= */ 0);
       this.hashCode = hashCode;
     }
 
     Entry(final int index, final int tag, final long data, final int hashCode) {
-      super(index, tag, /* owner = */ null, /* name = */ null, /* value = */ null, data);
+      super(index, tag, /* owner= */ null, /* name= */ null, /* value= */ null, data);
       this.hashCode = hashCode;
     }
   }
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/AnnotationAcceptingListener.java b/core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/AnnotationAcceptingListener.java
index 7e9db27..f5384f8 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/AnnotationAcceptingListener.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/internal/scanning/AnnotationAcceptingListener.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.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -309,7 +309,7 @@
 
     private static class ClassReaderWrapper {
         private static final Logger LOGGER = Logger.getLogger(ClassReader.class.getName());
-        private static final int WARN_VERSION = Opcodes.V22;
+        private static final int WARN_VERSION = Opcodes.V23;
         private static final int INPUT_STREAM_DATA_CHUNK_SIZE = 4096;
 
         private final byte[] b;
diff --git a/core-server/src/main/resources/META-INF/NOTICE.markdown b/core-server/src/main/resources/META-INF/NOTICE.markdown
index 92d64be..27c798d 100644
--- a/core-server/src/main/resources/META-INF/NOTICE.markdown
+++ b/core-server/src/main/resources/META-INF/NOTICE.markdown
@@ -36,7 +36,7 @@
 * Copyright (c) 2015-2018 Oracle and/or its affiliates. All rights reserved.

 * Copyright 2010-2013 Coda Hale and Yammer, Inc.

 

-org.objectweb.asm Version 9.6

+org.objectweb.asm Version 9.7

 * License: Modified BSD (https://asm.ow2.io/license.html)

 * Copyright: (c) 2000-2011 INRIA, France Telecom. All rights reserved.

 

diff --git a/etc/scripts/TCK/EE10/jakarta-ee10-tck.sh b/etc/scripts/TCK/EE10/jakarta-ee10-tck.sh
new file mode 100644
index 0000000..75dd07c
--- /dev/null
+++ b/etc/scripts/TCK/EE10/jakarta-ee10-tck.sh
@@ -0,0 +1,92 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for listing staging from the staging repo.
+#
+# Input Parameters:
+#     JERSEY_VERSION     - type: String
+#                        - example: 3.1.5
+#                        - description: version of Jersey (EE10) to be tested
+#     GLASSFISH_VERSION  - type: String
+#                        - example: 7.0.6
+#                        - description: version of GF (EE10) to be used within tests
+#     TCK_VERSION        - type: String
+#                        - example: 3.1.3
+#                        - description: version of a TCK bundle which will be downloaded from the staging/central
+# Configuration:
+#
+# JDK:
+#       openjdk-jdk11-latest
+# Git:
+#     https://github.com/eclipse-ee4j/jersey
+#  Branch:
+#     */3.1
+#
+#
+
+#
+# The first sh invocation
+#
+#!/bin/bash -xe
+
+MVN_HOME="/opt/tools/apache-maven/latest/"
+PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+mvn -f tests/jersey-tck/pom.xml clean install \
+    -Dtck.version=${TCK_VERSION} \
+    -Dglassfish.container.version=${GLASSFISH_VERSION} \
+    -Djersey.version=${JERSEY_VERSION} | tee tck.log
+
+
+#
+# The second sh invocation
+#
+#!/bin/bash -xe
+
+MVN_HOME="/opt/tools/apache-maven/latest/"
+PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+mvn -f tests/jersey-tck/pom.xml dependency:copy -Dartifact=jakarta.ws.rs:jakarta-restful-ws-tck:${TCK_VERSION} -Dtck.version=${TCK_VERSION} -Dtransitive=false
+export DOWNLOAD_PATH='tests/jersey-tck/target/dependency/'
+export NAME=`ls ${DOWNLOAD_PATH}`
+
+echo '***********************************************************************************' >> SUMMARY.TXT
+echo '***                        TCK bundle information                               ***' >> SUMMARY.TXT
+echo "*** Name:         ${NAME}                            ***" >> SUMMARY.TXT
+echo '*** Artifact ID:	   jakarta.ws.rs:jakarta-restful-ws-tck:'${TCK_VERSION}'         ***' >> SUMMARY.TXT
+echo '*** Date and size: '`stat -c "date: %y, size(b): %s" ${DOWNLOAD_PATH}/${NAME}`'  ***' >> SUMMARY.TXT
+echo '*** SHA256SUM: '`sha256sum ${DOWNLOAD_PATH}/${NAME} | awk '{print $1}'`' ***' >> SUMMARY.TXT
+echo '***                                                                             ***' >> SUMMARY.TXT
+echo '***********************************************************************************' >> SUMMARY.TXT
+echo '***                        TCK results summary                                  ***' >> SUMMARY.TXT
+export TESTS_RUN=`grep 'Skipped: [0-9]*$' tck.log | grep -o 'Tests run: [0-9]*' | awk '{  SUM += $3 } END { print SUM }'`
+export FAILURES=`grep 'Skipped: [0-9]*$' tck.log | grep -o 'Failures: [0-9]*' | awk '{  SUM += $2 } END { print SUM }'`
+export ERRORS=`grep 'Skipped: [0-9]*$' tck.log | grep -o 'Errors: [0-9]*' | awk '{  SUM += $2 } END { print SUM }'`
+export SKIPPED=`grep 'Skipped: [0-9]*$' tck.log | grep -o 'Skipped: [0-9]*' | awk '{  SUM += $2 } END { print SUM }'`
+echo '[INFO] Number of Tests Passed      = '${TESTS_RUN} >> SUMMARY.TXT
+echo '[INFO] Number of Tests Failed      = '${FAILURES} >> SUMMARY.TXT
+echo '[INFO] Number of Tests with Errors = '${ERRORS} >> SUMMARY.TXT
+echo '[INFO] Number of Skipped Tests     = '${SKIPPED} >> SUMMARY.TXT
+echo '[INFO] ****************************************************************************' >> SUMMARY.TXT
+grep 'Tests run:' tck.log | grep --invert-match 'Skipped: [0-9]*$' >> SUMMARY.TXT
+
+
+#
+# Archive the artifacts:
+#    tck.log,tests/jersey-tck/target/glassfish7/glassfish/domains/domain1/logs/server.log,tests/jersey-tck/pom.xml,SUMMARY.TXT
+#
\ No newline at end of file
diff --git a/etc/scripts/TCK/EE8/jersey-staging-GF-integration.sh b/etc/scripts/TCK/EE8/jersey-staging-GF-integration.sh
new file mode 100644
index 0000000..92c43c0
--- /dev/null
+++ b/etc/scripts/TCK/EE8/jersey-staging-GF-integration.sh
@@ -0,0 +1,106 @@
+#!/bin/bash -ex
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for Jersey EE8 integration into Glassfish 5.
+#
+# Input Parameters:
+#   GF_URL           - type: String
+#                    - value: http://central.maven.org/maven2/org/glassfish/main/distributions/glassfish/5.1.0/glassfish-5.1.0.zip
+#                    - description: actual URL of the Glassfish 5
+#   MAVEN_REPO_URL   - type: String
+#                    - value: https://jakarta.oss.sonatype.org/content/groups/staging/org/glassfish/jersey
+#                    - description: Jersey binaries location
+#   JERSEY_VERSION   - type: String
+#                    - value: 2.42
+#                    - description: the version of Jersey to be integrated into the GF
+#   JERSEY_JARS      - type: Multi-line String
+#                    - value: containers/glassfish/jersey-gf-ejb/${JERSEY_VERSION}/jersey-gf-ejb
+#                              containers/jersey-container-grizzly2-http/${JERSEY_VERSION}/jersey-container-grizzly2-http
+#                              containers/jersey-container-servlet/${JERSEY_VERSION}/jersey-container-servlet
+#                              containers/jersey-container-servlet-core/${JERSEY_VERSION}/jersey-container-servlet-core
+#                              core/jersey-client/${JERSEY_VERSION}/jersey-client
+#                              core/jersey-common/${JERSEY_VERSION}/jersey-common
+#                              core/jersey-server/${JERSEY_VERSION}/jersey-server
+#                              ext/jersey-bean-validation/${JERSEY_VERSION}/jersey-bean-validation
+#                              ext/cdi/jersey-cdi1x/${JERSEY_VERSION}/jersey-cdi1x
+#                              ext/cdi/jersey-cdi1x-servlet/${JERSEY_VERSION}/jersey-cdi1x-servlet
+#                              ext/cdi/jersey-cdi1x-transaction/${JERSEY_VERSION}/jersey-cdi1x-transaction
+#                              ext/jersey-entity-filtering/${JERSEY_VERSION}/jersey-entity-filtering
+#                              ext/jersey-mvc/${JERSEY_VERSION}/jersey-mvc
+#                              ext/jersey-mvc-jsp/${JERSEY_VERSION}/jersey-mvc-jsp
+#                              inject/jersey-hk2/${JERSEY_VERSION}/jersey-hk2
+#                              media/jersey-media-jaxb/${JERSEY_VERSION}/jersey-media-jaxb
+#                              media/jersey-media-json-binding/${JERSEY_VERSION}/jersey-media-json-binding
+#                              media/jersey-media-json-jackson/${JERSEY_VERSION}/jersey-media-json-jackson
+#                              media/jersey-media-json-jettison/${JERSEY_VERSION}/jersey-media-json-jettison
+#                              media/jersey-media-json-processing/${JERSEY_VERSION}/jersey-media-json-processing
+#                              media/jersey-media-moxy/${JERSEY_VERSION}/jersey-media-moxy
+#                              media/jersey-media-multipart/${JERSEY_VERSION}/jersey-media-multipart
+#                              media/jersey-media-sse/${JERSEY_VERSION}/jersey-media-sse
+#                    - description: List of binaries to be integrated into the GF 5
+#
+#
+# Configuration:
+#
+# JDK:
+#       (System)
+# Git:
+#     ------none------
+#
+#  Copy artifacts from another project:
+#       JAXRS_build
+#    Latest successful build
+#    Artifacts to copy:
+#       **/*.jar
+#    Target directory:
+#       download
+#    [X] Flatten directories [X] Fingerprint Artifacts
+#
+#
+#
+ls
+cd download
+wget -q ${GF_URL} -O glassfish.zip
+#wget -q ${JAX_RS_JAR} -O jakarta.ws.rs-api.jar
+
+while IFS= read -r line ; do wget -q ${MAVEN_REPO_URL}/$line-${JERSEY_VERSION}.jar; done <<< "${JERSEY_JARS}"
+
+echo Listing grabbed jars
+ls *.jar
+
+#unzip
+unzip -q glassfish.zip -d ${WORKSPACE}
+cd ${WORKSPACE}/glassfish5/glassfish/modules
+
+#replace API jar
+#cp -v ${WORKSPACE}/download/jakarta.ws.rs-api.jar .
+
+#replace Jersey Jar
+for jarfile in ${WORKSPACE}/download/*.jar; do
+   echo $(basename $jarfile) | sed -e 's/-RC[0-9][0-9]*//' | sed -e 's/-SNAPSHOT//' | sed -e 's/\.[0-9][0-9]*//' | sed -e 's/\.[0-9][0-9]*//' | sed -e 's/-[0-9][0-9]*//' | while IFS= read -r gfnamejar ; do if [ -f $gfnamejar ]; then rm -v $gfnamejar; cp -v $jarfile $gfnamejar; fi; done;
+done
+
+cd ${WORKSPACE}
+zip -r glassfish.zip glassfish5
+
+
+#
+#  Archive the artifacts:
+#    glassfish.zip
+#
+#
diff --git a/etc/scripts/TCK/EE8/tck-build.sh b/etc/scripts/TCK/EE8/tck-build.sh
new file mode 100644
index 0000000..40a9cb1
--- /dev/null
+++ b/etc/scripts/TCK/EE8/tck-build.sh
@@ -0,0 +1,163 @@
+#!/bin/bash -ex
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for building EE8 TCK bundle for Jersey.
+#
+# Input Parameters:
+#   GF_URL     - type: String
+#              - value: https://search.maven.org/remotecontent?filepath=org/glassfish/main/distributions/glassfish/5.1.0/glassfish-5.1.0.zip
+#              - description: actual URL of the Glassfish 5
+#
+# Configuration:
+#
+# JDK:
+#       oracle-jdk8-latest
+# Git:
+#     https://github.com/eclipse-ee4j/jakartaee-tck.git
+#  Branch:
+#     */master
+#  Check out to a sub-directory:
+#     CTS
+#
+#  [X] With Ant:
+#       apache-ant-latest
+#     JDK:
+#       oracle-jdk8-latest
+#
+#  Copy artifacts from another project:
+#       ts_jte_alter
+#    Latest successful build
+#    Artifacts to copy:
+#       ts.jte
+#    Target directory:
+#       download
+#    [X] Flatten directories [X] Fingerprint Artifacts
+#
+#
+#
+
+mkdir ${WORKSPACE}/CTS/tools
+mkdir ${WORKSPACE}/CTS/tools/ant
+
+#create zip command
+#mkdir batch
+#touch ${WORKSPACE}/batch/zip.sh
+#chmod +x ${WORKSPACE}/batch/zip.sh
+#touch ${WORKSPACE}/batch/zip
+#chmod +x ${WORKSPACE}/batch/zip
+#alias zip='${WORKSPACE}/batch/zip.sh'
+
+#echo "echo ARG1=\$1">batch/zip.sh
+#echo "echo ARG2=\$2">>batch/zip.sh
+#echo "echo ARG3=\$3">>batch/zip.sh
+#echo "if [ \$1='-T' ]; then">>batch/zip.sh
+#echo "	exit">>batch/zip.sh
+#echo "fi">>batch/zip.sh
+#echo "filename=\`echo \$2 | cut -d'.' -f 1,2\`">>batch/zip.sh
+#echo "echo filename=\$filename">>batch/zip.sh
+#echo "tar -zcvf '\${filename}'.tar.gz \$3">>batch/zip.sh
+#echo "mv \${filename}.tar.gz \${filename}.zip">>batch/zip.sh
+#echo "echo created \${filename}.zip">>batch/zip.sh
+
+#echo "${WORKSPACE}/batch/zip.sh \$*">batch/zip
+
+#cat batch/zip.sh
+#cat batch/zip
+
+
+#Set variables
+export ANT_OPTS=-Djavax.xml.accessExternalSchema=all
+
+cd download
+#wget -4 https://jenkins.eclipse.org/jersey/view/TCK/job/ts_jte_alter/lastSuccessfulBuild/artifact/ts.jte
+
+#wget -q https://ci.adoptopenjdk.net/view/Build%20Monitor/job/jtharness/lastSuccessfulBuild/artifact/jtharness.tar.gz -O jtharness.tar.gz
+#wget -q https://ci.adoptopenjdk.net/view/Build%20Monitor/job/sigtest/lastSuccessfulBuild/artifact/sigtest.tar.gz -O sigtest.tar.gz
+#wget -q http://central.maven.org/maven2/com/sun/xml/bind/jaxb-xjc/2.2.7/jaxb-xjc-2.2.7.jar -O jaxb-xjc.jar
+#wget -q http://central.maven.org/maven2/ant-contrib/ant-contrib/1.0b3/ant-contrib-1.0b3.jar -O ant-contrib.jar
+#wget -q http://central.maven.org/maven2/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar
+#wget -q http://central.maven.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar
+#wget -q http://central.maven.org/maven2/commons-codec/commons-codec/1.3/commons-codec-1.3.jar
+#tar xfz jtharness.tar.gz
+#tar xvfz sigtest.tar.gz
+#unzip -q sigtest-4.0
+#cp -av ${WORKSPACE}/download/sigtest-4.0/lib/. ${WORKSPACE}/CTS/lib/
+#cp -v ${WORKSPACE}/download/jtharness/lib/javatest.jar ${WORKSPACE}/CTS/lib/javatest.jar
+#cp -v ${WORKSPACE}/download/jaxb-xjc.jar ${WORKSPACE}/CTS/lib/
+#cp -v ${WORKSPACE}/download/ant-contrib.jar ${WORKSPACE}/CTS/lib/
+#cp -v ${WORKSPACE}/download/ant-contrib.jar ${WORKSPACE}/CTS/lib/ant-contrib-1.0b3.jar
+#cp -v ${WORKSPACE}/download/commons-httpclient-3.1.jar ${WORKSPACE}/CTS/lib/
+#cp -v ${WORKSPACE}/download/commons-logging-1.1.1.jar ${WORKSPACE}/CTS/lib/
+#cp -v ${WORKSPACE}/download/commons-codec-1.3.jar ${WORKSPACE}/CTS/lib/
+
+
+ls
+
+yes | cp -vr ${WORKSPACE}/download/ts.jte ${WORKSPACE}/CTS/install/jaxrs/bin/
+#cp -v ${WORKSPACE}/download/ts.jte ${WORKSPACE}/CTS/bin/ts.jte
+
+wget -q ${GF_URL} -O glassfish.zip
+unzip -q glassfish.zip -d ${WORKSPACE}
+
+#COMPILE TCK
+
+export TS_HOME=${WORKSPACE}/CTS
+export deliverabledir=jaxrs
+export javaee_home=${WORKSPACE}/glassfish5
+
+#touch ${WORKSPACE}/CTS/vehicle.properties
+#echo com/sun/ts/tests/jaxrs/api = servlet >> ${WORKSPACE}/CTS/vehicle.properties
+#echo com/sun/ts/tests/jaxrs/api/rs/ext/interceptor = standalone >> ${WORKSPACE}/CTS/vehicle.properties
+#echo com/sun/ts/tests/jaxrs/ee = standalone >> ${WORKSPACE}/CTS/vehicle.properties
+#echo com/sun/ts/tests/jaxrs/jaxrs21 = standalone >> ${WORKSPACE}/CTS/vehicle.properties
+#echo com/sun/ts/tests/jaxrs/jaxrs21/api = servlet >> ${WORKSPACE}/CTS/vehicle.properties
+#echo com/sun/ts/tests/jaxrs/spec = standalone >> ${WORKSPACE}/CTS/vehicle.properties
+#echo com/sun/ts/tests/jaxrs/servlet3 = standalone >> ${WORKSPACE}/CTS/vehicle.properties
+#echo com/sun/ts/tests/jaxrs/platform  = standalone >> ${WORKSPACE}/CTS/vehicle.properties
+
+#cat ${WORKSPACE}/CTS/vehicle.properties
+
+#fix the test
+cd ${WORKSPACE}/CTS/src/com/sun/ts/tests/jaxrs/jaxrs21/ee/sse/sseeventsink
+sed -i '314s/open()/register(holder::add)/' JAXRSClient.java
+sed -i '315s/register(holder::add)/open()/' JAXRSClient.java
+#end of fix
+
+cd ${WORKSPACE}/CTS/install/${deliverabledir}/bin
+ant build.all
+ant update.jaxrs.wars
+
+# BUNDLE TCK
+
+cd ${WORKSPACE}/CTS/release/tools/
+ant jakartaee-jaxrs
+#ls ${WORKSPACE}/CTS/release/JAXRS_BUILD/
+cd ${WORKSPACE}/CTS/release/JAXRS_BUILD/latest
+for fn in `ls *.zip`; do cp -v "${fn}" `echo ${fn} | cut -d'_' -f 1`_latest.zip; done
+
+#zip -s 10m jaxrstck_split_latest.zip jaxrstck-2.1_latest.zip
+#ls
+
+
+
+#
+#  Archive the artifacts:
+#    CTS/release/JAXRS_BUILD/latest/*.z*
+#
+#
+
diff --git a/etc/scripts/TCK/EE8/tck-run-pipeline.groovy b/etc/scripts/TCK/EE8/tck-run-pipeline.groovy
new file mode 100644
index 0000000..95936f1
--- /dev/null
+++ b/etc/scripts/TCK/EE8/tck-run-pipeline.groovy
@@ -0,0 +1,150 @@
+#!/usr/bin/env groovy
+
+/*
+ * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/**
+ * Runs TCK for Jersey EE8 on GlassFish 5
+ *
+ * Input Parameters:
+ *
+ *   GF_INTEGRATION_JOB_NAME    - type: String
+ *                              - value: Jersey_Staging_GF_Integration
+ *                              - description: name of a job from which the prepared archive of the Glassfish 5 is taken
+ *                              - possible values: Jersey_binaries_GF_integration
+ *                                                 Jersey_Staging_GF_Integration
+ *                                                 GF5_Jersey2_Archive_Integration
+ *   TS_JTE_JOB_NAME            - type: String
+ *                              - value: ts_jte_alter
+ *                              - description: name of a job from which prepared ts.jte is taken
+ *  TCK_BUNDLE_JOB_OR_URL       - type: String
+ *                              - value: tck_build
+ *                              - description: name of a job from which prepared TCK bundle is taken
+ */
+
+node {
+
+    // Job that created the API artifact
+    def GF_BUILD_JOB = "${env.GF_INTEGRATION_JOB_NAME}"
+    def TS_JTE_BUILD_JOB = "${env.TS_JTE_JOB_NAME}"
+    def TCK_BUNDLE_URL = "${env.TCK_BUNDLE_JOB_OR_URL}"
+    def API_JAR_NAME="jakarta.ws.rs-api.jar"
+
+    echo "GF_BUILD_JOB=${GF_BUILD_JOB}"
+    echo "TS_JTE_BUILD_JOB=${TS_JTE_BUILD_JOB}"
+    echo "TCK_BUNDLE_URL=${TCK_BUNDLE_URL}"
+
+    //TCK properties
+    env.deliverabledir="jaxrs"
+    env.tck_root="restful-ws-tck"
+    env.TS_HOME="${env.WORKSPACE}/${env.tck_root}"
+    env.javaee_home="${env.WORKSPACE}/glassfish5"
+
+    env.JAVA_HOME= tool name: 'oracle-jdk8-latest', type: 'jdk'
+    env.ANT_HOME= tool name: 'apache-ant-latest', type: 'ant'
+    env.PATH="${ANT_HOME}/bin:${JAVA_HOME}/bin:${PATH}"
+    env.ANT_OPTS="-Djavax.xml.accessExternalSchema=all"
+
+    stage("Grab GF and ts.jte artifacts") {
+        //https://go.cloudbees.com/docs/cloudbees-documentation/cjoc-user-guide/index.html#cluster-copy-artifacts
+        dir ("download") {
+            copyArtifacts(projectName: "${GF_BUILD_JOB}")
+            copyArtifacts(projectName: "${TS_JTE_BUILD_JOB}")
+        }
+    }
+
+    stage("Grab TCK bundle") {
+        env.TCK_BUNDLE_URL = "${TCK_BUNDLE_URL}"
+        if (!(env.TCK_BUNDLE_URL).startsWith("http")) {
+            dir ("download") {
+                copyArtifacts(projectName: "${TCK_BUNDLE_URL}", filter: "**/*_latest.zip")
+                //flatten - could be done by copyRemoteArtifacts but mapper arg expects java class
+                sh "find . -mindepth 2 -type f -print -exec mv {} . \\;"
+
+                //sh "rm *doc*.zip"
+                sh "mv ${deliverabledir}-tck*.zip ${deliverabledir}-tck.zip"
+            }
+        } else {
+            sh '''#!/bin/bash -ex
+                cd ${WORKSPACE}/download 
+                wget -q ${TCK_BUNDLE_URL} -O ${deliverabledir}-tck.zip
+               '''
+        }
+    }
+
+    stage("Unzip TCK and GF") {
+        sh '''#!/bin/bash -ex
+            cd ${WORKSPACE}
+            unzip ${WORKSPACE}/download/glassfish.zip
+            unzip -q ${WORKSPACE}/download/${deliverabledir}-tck.zip
+            ls
+            ls ${tck_root}
+            
+            cd ${WORKSPACE}/glassfish5/glassfish/modules
+            jar xf jersey-common.jar META-INF/MANIFEST.MF
+            cat  META-INF/MANIFEST.MF | grep Bundle-Version
+           '''
+    }
+
+    stage ("Replace ts.jte") {
+        sh '''#!/bin/bash -ex
+            ls ${TS_HOME}
+            ls ${TS_HOME}/bin
+            yes | cp -rfv ${WORKSPACE}/download/ts.jte ${TS_HOME}/bin/ts.jte
+           '''
+    }
+
+    stage("Configure TCK") {
+        sh '''#!/bin/bash -ex
+            cd ${TS_HOME}/bin
+            ant config.vi
+           '''
+    }
+
+    stage ("Deploy TCK tests") {
+         sh '''#!/bin/bash -ex
+            cd ${TS_HOME}/bin
+            ant deploy.all
+           '''
+    }
+
+    stage ("Run TCK tests") {
+         sh '''#!/bin/bash -ex
+            cd ${TS_HOME}/bin
+            ant run.all | tee run.log
+           '''
+    }
+
+    stage ("Create summary.txt, API, and run.log artifacts") {
+        sh '''#!/bin/bash -ex
+            cd ${TS_HOME}/bin
+            cat run.log | sed -e '1,/Completed running/d' > summary.txt
+            PASSED_COUNT=`head -1 summary.txt | tail -1 | sed 's/.*=\\s\\(.*\\)/\\1/'`
+            FAILED_COUNT=`head -2 summary.txt | tail -1 | sed 's/.*=\\s\\(.*\\)/\\1/'`
+            ERROR_COUNT=`head -3 summary.txt | tail -1 | sed 's/.*=\\s\\(.*\\)/\\1/'`
+            
+            echo ERROR_COUNT=${ERROR_COUNT}
+            echo FAILED_COUNT=${FAILED_COUNT}
+            echo PASSED_COUNT=${PASSED_COUNT}            
+           '''
+
+        archiveArtifacts artifacts: "${env.tck_root}/bin/summary.txt", fingerprint: true
+        archiveArtifacts artifacts: "${env.tck_root}/bin/run.log", fingerprint: true
+        archiveArtifacts artifacts: "glassfish5/glassfish/modules/${API_JAR_NAME}", fingerprint: true
+        archiveArtifacts artifacts: "glassfish5/glassfish/modules/META-INF/MANIFEST.MF", fingerprint: true
+        archiveArtifacts artifacts: "glassfish5/glassfish/domains/domain1/logs/server.log", fingerprint: true
+    }
+}
\ No newline at end of file
diff --git a/etc/scripts/TCK/EE8/ts-jte-alter.sh b/etc/scripts/TCK/EE8/ts-jte-alter.sh
new file mode 100644
index 0000000..27d908a
--- /dev/null
+++ b/etc/scripts/TCK/EE8/ts-jte-alter.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for generating ts.jte for EE8 Jersey TCK.
+#
+# Input Parameters:
+#
+#   SERVER_HOME         - type: String
+#                       - value: ${ts.home}/../glassfish5/glassfish
+#  JAXRS_API_JAR_NAME   - type: String
+#                       - value: jakarta.ws.rs-api.jar
+#  HARNESS_REPORT_DIR   - type: String
+#                       - value: ${ts.home}/../JTreport
+#  HARNESS_WORK_DIR     - type: String
+#                       - value: ${ts.home}/../JTwork
+#
+# Configuration:
+#
+# JDK:
+#       (System)
+# Git:
+#     ----none----
+#
+#
+
+wget https://raw.githubusercontent.com/eclipse-ee4j/jakartaee-tck/master/install/jaxrs/bin/ts.jte
+
+JARS_ON_CP="\
+\${web.home}/modules/jersey-client.jar:\
+\${web.home}/modules/jersey-common.jar:\
+\${web.home}/modules/jersey-container-servlet.jar:\
+\${web.home}/modules/jersey-container-servlet-core.jar:\
+\${web.home}/modules/jersey-hk2.jar:\
+\${web.home}/modules/jersey-media-jaxb.jar:\
+\${web.home}/modules/jersey-media-json-binding.jar:\
+\${web.home}/modules/jersey-media-json-processing.jar:\
+\${web.home}/modules/jersey-media-sse.jar:\
+\${web.home}/modules/jersey-server.jar:\
+\${web.home}/modules/jsonp-jaxrs.jar:\
+\${web.home}/modules/asm-all-repackaged.jar:\
+\${web.home}/modules/bean-validator.jar:\
+\${web.home}/modules/endorsed/jakarta.annotation-api.jar:\
+\${web.home}/modules/cdi-api.jar:\
+\${web.home}/modules/cglib.jar:\
+\${web.home}/modules/hk2-api.jar:\
+\${web.home}/modules/hk2-locator.jar:\
+\${web.home}/modules/hk2-utils.jar:\
+\${web.home}/modules/javassist.jar:\
+\${web.home}/modules/jakarta.ejb-api.jar:\
+\${web.home}/modules/jakarta.inject.jar:\
+\${web.home}/modules/jakarta.json.jar:\
+\${web.home}/modules/jakarta.json-api.jar:\
+\${web.home}/modules/jakarta.json.bind-api.jar:\
+\${web.home}/modules/jakarta.interceptor-api.jar:\
+\${web.home}/modules/jakarta.servlet-api.jar:\
+\${web.home}/modules/osgi-resource-locator.jar:\
+\${web.home}/modules/weld-osgi-bundle.jar:\
+\${web.home}/modules/yasson.jar"
+
+sed -i 's/^impl\.vi=/impl\.vi=glassfish/g' ts.jte
+sed -i "s/^web\.home=/$(echo web\.home=${SERVER_HOME} | sed -e 's/\\/\\\\/g; s/\//\\\//g;')/g" ts.jte
+sed -i "s/^impl\.vi\.deploy\.dir=/$(echo impl\.vi\.deploy\.dir=\${web.home}/domains/domain1/autodeploy | sed -e 's/\\/\\\\/g; s/\//\\\//g;')/g" ts.jte
+sed -i 's/^jaxrs_impl_name=/jaxrs_impl_name=jersey/g' ts.jte
+sed -i 's/^harness\.log\.traceflag=/harness\.log\.traceflag=true/g' ts.jte
+sed -i 's/^webServerHost=/webServerHost=localhost/g' ts.jte
+sed -i 's/^webServerPort=/webServerPort=8080/g' ts.jte
+sed -i "s/^work\.dir=\/tmp\/JTwork/$(echo work\.dir=${HARNESS_WORK_DIR} | sed -e 's/\\/\\\\/g; s/\//\\\//g;')/g" ts.jte
+sed -i "s/^report\.dir=\/tmp\/JTreport/$(echo report\.dir=${HARNESS_REPORT_DIR} | sed -e 's/\\/\\\\/g; s/\//\\\//g;')/g" ts.jte
+sed -i "s/^jaxrs_impl\.classes=/$(echo jaxrs_impl\.classes=${JARS_ON_CP} | sed -e 's/\\/\\\\/g; s/\//\\\//g;')/g" ts.jte
+sed -i "s/^jaxrs\.classes=/$(echo jaxrs\.classes=\${web.home}/modules/${JAXRS_API_JAR_NAME} | sed -e 's/\\/\\\\/g; s/\//\\\//g;')/g" ts.jte
+sed -i "s/^jaxrs_impl_lib=/$(echo jaxrs_impl_lib=\${web.home}/modules/jersey-container-servlet-core.jar | sed -e 's/\\/\\\\/g; s/\//\\\//g;')/g" ts.jte
+sed -i "s/^servlet_adaptor=/servlet_adaptor=org\/glassfish\/jersey\/servlet\/ServletContainer.class/g" ts.jte
+
+sed -i "s/-Dcts.tmp=\.*/-Djavax.xml.accessExternalSchema=all -Dcts.tmp=/g" ts.jte
+
+
+#
+# Archive the artifacts:
+#     ts.jte
\ No newline at end of file
diff --git a/etc/scripts/release/EE10/bundle-apidocs.sh b/etc/scripts/release/EE10/bundle-apidocs.sh
new file mode 100644
index 0000000..089a1a9
--- /dev/null
+++ b/etc/scripts/release/EE10/bundle-apidocs.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for releasing api docs bundle by release tag.
+#
+# Input Parameters:
+#
+# VERSION - type: String
+#         - example: 3.1.6
+#         - description: Name of the existing version tag in the Git repo.
+#
+# Configuration:
+#
+# JDK:
+#       oracle-jdk17-latest
+# Git:
+#          git@github.com:eclipse-ee4j/jersey.git
+#    Branches to build:
+#          tags/${VERSION}
+#
+# Bindings:
+#    Secret file:
+#         Variable:
+#              KEYRING
+#         Credentials:
+#              secret-subkeys.asc
+#
+#
+
+
+ gpg --batch --import ${KEYRING}
+ for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
+ do
+   echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
+ done
+
+#!/bin/bash -xe
+
+# Execution environment
+MVN_HOME="/opt/tools/apache-maven/latest/"
+PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+echo '-[ Run maven release plugin ]---------------------------------------------------'
+
+mvn -q -V -C -DstagingDescription="org.glassfish.jersey.bundles.apidocs:${VERSION}" \
+    -Pstaging,oss-release,pre-release -DskipTests -pl :apidocs \
+    -Djersey.version=${VERSION} -Dsource.mvn.plugin.version=3.2.0 install javadoc:jar gpg:sign deploy
\ No newline at end of file
diff --git a/etc/scripts/release/EE10/bundle-examples.sh b/etc/scripts/release/EE10/bundle-examples.sh
new file mode 100644
index 0000000..c49fa1c
--- /dev/null
+++ b/etc/scripts/release/EE10/bundle-examples.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for releasing examples bundle by release tag.
+#
+# Input Parameters:
+#
+# VERSION - type: String
+#         - example: 3.1.6
+#         - description: Name of the existing version tag in the Git repo.
+#
+# Configuration:
+#
+# JDK:
+#       oracle-jdk11-latest
+# Git:
+#          git@github.com:eclipse-ee4j/jersey.git
+#    Branches to build:
+#          tags/${VERSION}
+#
+# Bindings:
+#    Secret file:
+#         Variable:
+#              KEYRING
+#         Credentials:
+#              secret-subkeys.asc
+#
+#
+
+
+ gpg --batch --import ${KEYRING}
+ for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
+ do
+   echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
+ done
+
+
+ # Execution environment
+ MVN_HOME="/opt/tools/apache-maven/latest/"
+ PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+ mvn clean install -C -B -Djersey.version=${VERSION} -DskipTests -Ppre-release,staging -pl org.glassfish.jersey.examples:project -amd
+
+ mvn -C -B -DstagingDescription="org.glassfish.jersey.examples:${VERSION}" \
+     -Pstaging,oss-release,pre-release \
+     -Djersey.version=${VERSION} -DskipTests -pl :jersey-examples \
+     deploy
\ No newline at end of file
diff --git a/etc/scripts/release/EE10/bundle-user-guide.sh b/etc/scripts/release/EE10/bundle-user-guide.sh
new file mode 100644
index 0000000..8890a79
--- /dev/null
+++ b/etc/scripts/release/EE10/bundle-user-guide.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for releasing User Guide bundle by release tag.
+#
+# Input Parameters:
+#
+# VERSION - type: String
+#         - example: 3.1.6
+#         - description: Name of the existing version tag in the Git repo.
+#
+# Configuration:
+#
+# JDK:
+#       oracle-jdk11-latest
+# Git:
+#          git@github.com:eclipse-ee4j/jersey.git
+#    Credentials:
+#          GitHub bot SSH
+#    Branches to build:
+#          refs/tags/${VERSION}
+#
+# Bindings:
+#    Secret file:
+#         Variable:
+#              KEYRING
+#         Credentials:
+#              secret-subkeys.asc
+#
+#
+
+
+ gpg --batch --import ${KEYRING}
+ for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
+ do
+   echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
+ done
+
+#!/bin/bash -xe
+
+# Execution environment
+MVN_HOME="/opt/tools/apache-maven/latest/"
+PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+cd docs
+
+echo '-[ Run maven release plugin ]---------------------------------------------------'
+
+mvn -q -C -DstagingDescription="org.glassfish.jersey.jersey-documentation:${VERSION}" \
+    -Pstaging,oss-release,pre-release \
+    -DskipTests \
+    install javadoc:jar gpg:sign deploy
\ No newline at end of file
diff --git a/etc/scripts/release/EE10/release.groovy b/etc/scripts/release/EE10/release.groovy
new file mode 100644
index 0000000..ad2f167
--- /dev/null
+++ b/etc/scripts/release/EE10/release.groovy
@@ -0,0 +1,333 @@
+#!/usr/bin/env groovy
+
+/*
+ * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/**
+ * Release script for Jakarta EE10 Jersey versions
+ * Release branch is 3.1
+ *
+ * Input Parameters:
+ * RELEASE_VERSION - type: String
+ *                 - example:  3.1.6
+ *                 - Description: mandatory release version. Later is being published to staging/central.
+ * NEXT_VERSION    - type: String
+ *                 - example:  3.1.99-SNAPSHOT
+ *                 - Description: mandatory next developing version will be committed in to the release branch and later
+ *                               merged into the original release branch for further developing.
+ * BRANCH          - type: Choice Parameter
+ *                 - values: 3.1
+ *                 - Description: Original release branch from which the codebase is being checked out
+ * DRY_RUN         - type: Boolean
+ *                 - Description: if checked nothing is really committed to Git nor published to the staging
+ * OVERWRITE       - type: Boolean
+ *                 - Description: if checked allows replacing of the previously published RELEASE_VERSION of Jersey
+ *
+ */
+
+#!/usr/bin/env groovy
+
+node {
+
+    def MVN_HOME = tool name: 'apache-maven-latest', type: 'maven'
+    def HELP_PLUGIN = 'org.apache.maven.plugins:maven-help-plugin:2.1.1'
+    def TARGET = 'package javadoc:jar gpg:sign install:install'
+    def DEPLOY_TARGET = ''
+    def RELEASE_VERSION = RELEASE_VERSION
+    def NEXT_VERSION = NEXT_VERSION
+    def RELEASE_TAG = ''
+    def NEW_RELEASE_BRANCH = ''
+    def OVERWRITE = OVERWRITE
+    def PROJECT_NAME = 'Jersey'
+    def LOGIN = 'jersey-bot'
+    def EMAIL = 'jersey-bot@eclipse.org'
+    def REPO = 'git@github.com:eclipse-ee4j/jersey.git'
+    def SECRET_FILE_ID = 'secret-subkeys.asc'
+    def CREDENTIALS_ID = 'github-bot-ssh'
+    def GIT_ORIGIN = 'origin'
+    def RELEASE_FOLDER = env.WORKSPACE
+    def RELEASE_BRANCH = BRANCH
+
+    def STAGING_NAME_PATTERN = 'orgglassfishjersey-[0-9]+'
+    def STAGING_NAME = ''
+    def STAGING_PREV_NAME = ''
+    def STAGING_OPEN_NAME = ''
+    def STAGING_DESC = 'org.glassfish.jersey:' + RELEASE_VERSION
+    def STAGING_BOM_DESC = 'org.glassfish.jersey.bom:' + RELEASE_VERSION
+    def STAGING_PROFILE_ID = '70fa3a107a8918'
+
+    def MULTIRELEASE_MODULES = ':jersey-wadl-doclet,:jersey-spring6,:jersey-helidon-connector,:jersey-jetty-connector,:jersey-jetty-http2-connector,:jersey-container-jetty-http,:jersey-container-jetty-http2,:jersey-test-framework-provider-jetty,:jersey-test-framework-provider-jetty-http2'
+
+    def JDK_11_HOME = tool name: 'openjdk-jdk11-latest', type: 'jdk'
+    //def JDK_12_HOME = tool name: 'openjdk-jdk12-latest', type: 'jdk'
+    def JDK_21_HOME = tool name: 'openjdk-jdk21-latest', type: 'jdk'
+    //def JDK_8_HOME = tool name: 'oracle-jdk8-latest', type: 'jdk'
+
+    env.JAVA_HOME = JDK_11_HOME
+    env.PATH = "${env.JAVA_HOME}/bin:${env.PATH}:${MVN_HOME}/bin"
+
+    sh 'java -version'
+
+    stage('Fetch from git') {
+        git(branch: RELEASE_BRANCH, credentialsId: CREDENTIALS_ID, url: REPO)
+    }
+    stage('Prepare environment') {
+
+        dir(RELEASE_FOLDER) {
+            //# Check whether top level pom.xml contains SNAPSHOT version
+            if (!sh(returnStdout: true, script: "grep '<version>' pom.xml | grep 'SNAPSHOT'")?.trim()) {
+                error('-[ Missing SNAPSHOT version in POM! ]-------------------------------------------')
+            }
+
+            //# Compute release versions
+            def SNAPSHOT_VERSION = sh(returnStdout: true, script: 'mvn -q -Dexec.executable="echo" -Dexec.args=\'${project.version}\' --non-recursive exec:exec -Pstaging').trim()
+
+            if (!RELEASE_VERSION?.trim()) {
+                if (!SNAPSHOT_VERSION?.trim()) {
+                    error('-[ Missing required snapshot version number! ]----------------------------------')
+                } else {
+                    def versionTokens = SNAPSHOT_VERSION.split('-')
+                    RELEASE_VERSION = versionTokens[0]
+                }
+            }
+
+            if (!NEXT_VERSION?.trim()) {
+                def (MAJOR_VERSION, MINOR_VERSION) = RELEASE_VERSION.tokenize('.')
+                def NEXT_MINOR_VERSION = (MINOR_VERSION as Integer) + 1
+                NEXT_VERSION = MAJOR_VERSION + '.' + NEXT_MINOR_VERSION + '-SNAPSHOT'
+            }
+
+            RELEASE_TAG = RELEASE_VERSION
+            NEW_RELEASE_BRANCH = RELEASE_VERSION+'-BRANCH'
+
+            echo "Current version: ${SNAPSHOT_VERSION}"
+            echo "Release version: ${RELEASE_VERSION}"
+            echo "Next version:    ${NEXT_VERSION}"
+            echo "Release tag:     ${RELEASE_TAG}"
+            echo "Release branch:  ${NEW_RELEASE_BRANCH}"
+
+            if (!SNAPSHOT_VERSION?.trim() || !RELEASE_VERSION?.trim() || !NEXT_VERSION?.trim()) {
+                error '-[ Missing required version numbers! ]------------------------------------------'
+            }
+
+            if (DRY_RUN == 'true') {
+                echo '-[ Dry run turned on ]----------------------------------------------------------'
+                //TARGET = 'install'
+            } else {
+                DEPLOY_TARGET = ' deploy:deploy'
+            }
+            echo '-[ Configure git user ]--------------------------------------------------------'
+            sh "git config --local user.email \"${EMAIL}\""
+            sh "git config --local user.name \"$LOGIN\""
+
+        }
+
+    }
+    stage('Prepare GPG') {
+        withCredentials([file(credentialsId: SECRET_FILE_ID, variable: 'KEYRING')]) {
+            //# Workaround: GPG initialization
+            sh("gpg --batch --import ${KEYRING}")
+            sh '''
+                for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
+                do
+                    echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
+                done
+                '''
+        }
+    }
+    stage('Prepare branch') {
+        echo '-[ Prepare branch ]-------------------------------------------------------------'
+
+        echo '-[ Switching to release branch ]-------------------------------------------------'
+        sh """
+        git checkout ${GIT_ORIGIN}/${RELEASE_BRANCH} && true
+        git reset --hard ${GIT_ORIGIN}/${RELEASE_BRANCH} && true
+        git checkout -B ${NEW_RELEASE_BRANCH}
+        """
+        echo '-[ Release tag cleanup ]--------------------------------------------------------'
+        def TAG_NAME = sh(returnStdout: true, script: "git tag | grep ${RELEASE_TAG}\$ || true").trim()
+        if (RELEASE_TAG == TAG_NAME) {
+            if (OVERWRITE == 'true') {
+                echo "${RELEASE_TAG} tag already exists, deleting"
+                sshagent([CREDENTIALS_ID]) {
+                    sh "git push --delete origin ${RELEASE_TAG} && true"
+                }
+            } else {
+                error "${RELEASE_TAG} tag already exists"
+            }
+            //# Always delete local tag if exists
+            sh """
+            git tag --delete ${RELEASE_TAG} && true
+            """
+        }
+        sh '''
+        sed -i 's|<suppress files="generated" checks=".*"/>|<suppress files="generated" checks=".*"/><suppress files="unpacked-src" checks=".*"/>|g' etc/config/checkstyle-suppressions.xml
+        '''
+    }
+    stage('Check previous stagings') {
+        if (DRY_RUN == 'true') {
+            echo DRY_RUN + ' ------'
+        } else {
+            if (OVERWRITE == 'true') {
+                STAGING_PREV_NAME = sh(returnStdout: true,
+                        script: "mvn -B --non-recursive -Pstaging nexus-staging:rc-list | awk '/\\[INFO] $STAGING_NAME_PATTERN[ ]+CLOSED[ ]+$STAGING_DESC[ ]*\$/ {if(a){a = \$2\",\"a} else{a = \$2}}END{print a}'").trim()
+                echo 'Previously closed staging name: ' + STAGING_PREV_NAME
+            }
+
+            STAGING_OPEN_NAME = sh(returnStdout: true,
+                    script: "mvn -B --non-recursive -Pstaging nexus-staging:rc-list | awk  '/$STAGING_NAME_PATTERN OPEN / {if(a){a = \$2\",\"a} else{a = \$2}}END{print a}'").trim()
+
+            if (!STAGING_OPEN_NAME?.trim()) {
+                echo 'No currently open stagings'
+            } else {
+                echo 'Currently open redundand staging: ' + STAGING_OPEN_NAME + ', immediately closing'
+                sh """
+                    OPEN_STAGINGS=${STAGING_OPEN_NAME}
+                    mvn -B -q -Pstaging nexus-staging:rc-drop -DstagingRepositoryId=\${OPEN_STAGINGS}  
+                """
+            }
+        }
+    }
+    /*
+    stage('Open new staging') {
+        if (DRY_RUN == 'true') {
+            echo DRY_RUN + ' ------'
+        } else {
+            STAGING_NAME = sh(returnStdout: true,
+                script: "mvn -B --non-recursive -Pstaging -DstagingProfileId=${STAGING_PROFILE_ID} -DstagingDescription=${STAGING_DESC} nexus-staging:rc-open | awk  '/\\[INFO] Opened / {print \$3}'").trim()
+            echo 'New staging name: '+STAGING_NAME
+        }
+    }*/
+    stage("Build ${PROJECT_NAME}") {
+        echo env.JAVA_HOME
+        echo '-[ Run maven release ]---------------------------------------------------------'
+        echo '-[ Set Release version ]-------------------------------------------------------'
+        sh """
+        cd ${RELEASE_FOLDER}
+        mvn -q -B -V -Pstaging versions:set -DnewVersion=${RELEASE_VERSION} -DgenerateBackupPoms=false
+        mvn -q -B -V -Pstaging versions:set -DnewVersion=${RELEASE_VERSION} -DgenerateBackupPoms=false -f bom/pom.xml
+        """
+        echo '-[ Update Copyright years ]----------------------------------------------------'
+        sh '''#!/bin/bash -e
+        
+            export CURRENT_YEAR=`date '+%Y'`
+            export SED_CMD_LINE='sed -i "s#, 20.. Oracle and/or its affiliates#, ${CURRENT_YEAR} Oracle and/or its affiliates#g"'
+
+            git status --porcelain --untracked-files=no > modified_pom.log
+            cp modified_pom.log list_of_poms.txt
+            sed -i "s| M |$SED_CMD_LINE |g" modified_pom.log
+            sed -i "s| M ||g" list_of_poms.txt
+
+            bash modified_pom.log
+
+            echo ${CURRENT_YEAR} current year
+
+            while IFS= read -r path_to_pom
+            do
+              export CP_YEAR=`grep -o 'Copyright (c) 20.. Oracle and/or its affiliates' ${path_to_pom} | awk '{print $3}'`
+              [[ -z ${CP_YEAR} ]] && CP_YEAR=${CURRENT_YEAR} || echo ${CP_YEAR}
+              [[ ${CP_YEAR} == ${CURRENT_YEAR} ]] || ( sed -i "s#Copyright (c) ${CP_YEAR} Oracle and/or its affiliates#Copyright (c) ${CP_YEAR}, ${CURRENT_YEAR} Oracle and/or its affiliates#g" ${path_to_pom} ; echo ${path_to_pom} )
+              unset CP_YEAR
+            done < "list_of_poms.txt"
+        '''
+        echo '-[ Run release build ]---------------------------------------------------------'
+        dir(RELEASE_FOLDER) {
+            //env.JAVA_HOME = JDK_12_HOME
+            //sh 'mvn clean install -am -Pstaging -pl :jersey-wadl-doclet -DskipTests -B -q -V -Djersey.version=${RELEASE_VERSION}'
+            env.JAVA_HOME = JDK_21_HOME
+            sh "mvn clean install -B -q -V -DskipTests -am -Pstaging -Djersey.version=${RELEASE_VERSION} --projects ${MULTIRELEASE_MODULES}"
+            env.JAVA_HOME = JDK_11_HOME
+            //
+            sh "mvn -q -B -V -Djersey.version=${RELEASE_VERSION} -DskipTests -Ddoclint=none -Dadditionalparam='-Xdoclint:none' " +
+                    " -Poss-release,staging -U -C ${TARGET} ${DEPLOY_TARGET}"
+            //sh "mvn -Poss-release,staging -pl :jersey-wadl-doclet -am install gpg:sign ${DEPLOY_TARGET} -B -q -V -DskipTests -Djersey.version=${RELEASE_VERSION}"
+
+        }
+    }
+    stage('Prepare release') {
+        sh '''
+        git checkout -- etc/config/checkstyle-suppressions.xml
+        '''
+        echo '-[ Perform release commit to git ]---------------------------------------------'
+        sh "git commit -a -m ${RELEASE_VERSION}"
+        sh "git tag -m ${RELEASE_TAG} -a ${RELEASE_TAG}"
+        echo '-[ Set next snapshot version ]-------------------------------------------------'
+        dir(RELEASE_FOLDER) {
+            sh """
+                mvn -q -B -Pstaging -Djersey.version=${RELEASE_VERSION} versions:set -DnewVersion=${NEXT_VERSION} -DgenerateBackupPoms=false 
+                mvn -q -B -Pstaging -Djersey.version=${RELEASE_VERSION} versions:set -DnewVersion=${NEXT_VERSION} -DgenerateBackupPoms=false -f bom/pom.xml
+            """
+        }
+        echo '-[ Perform commit to git ]-----------------------------------------------------'
+        sh "git commit -a -m ${NEXT_VERSION}"
+    }
+    stage('Publish release') {
+        if (DRY_RUN == 'true') {
+            echo '-[ Prepared branch ]----------------------------------------------------------'
+            sh "git branch --list ${NEW_RELEASE_BRANCH}"
+            echo '-[ Prepared tag ]-------------------------------------------------------------'
+            sh "git tag --list ${NEW_RELEASE_BRANCH}"
+            echo '-[ Prepared commits ]---------------------------------------------------------'
+            sh 'git log -n 5'
+            sshagent([CREDENTIALS_ID]) {
+                sh "git push ${GIT_ORIGIN} ${NEW_RELEASE_BRANCH} --dry-run"
+            }
+            return
+        } else {
+            sshagent([CREDENTIALS_ID]) {
+                sh "git push -f ${GIT_ORIGIN} ${NEW_RELEASE_BRANCH} --follow-tags"
+            }
+        }
+    }
+    stage('Find related staging') {
+        if (DRY_RUN != 'true') {
+            if (!STAGING_NAME?.trim()) {
+                try {
+                    STAGING_NAME =
+                            sh(returnStdout: true,
+                                    script: "mvn -Djersey.version=${RELEASE_VERSION} -B --non-recursive -Pstaging nexus-staging:rc-list | awk  '/$STAGING_NAME_PATTERN OPEN / {if(a){a = \$2\",\"a} else{a = \$2}}END{print a}'"
+                            ).trim()
+                } catch (Error err) {
+                    currentBuild.result = 'UNSTABLE'
+                }
+            }
+            echo 'Staging name: ' + STAGING_NAME
+        } else {
+            echo 'DRY_RUN'
+        }
+    }
+    stage('Close released staging') {
+        if (!STAGING_NAME?.trim()) {
+            echo 'Nothing to be closed'
+        } else {
+            sh("mvn -B -q -Pstaging -Djersey.version=${RELEASE_VERSION} nexus-staging:rc-close -DstagingRepositoryId=${STAGING_NAME} -DstagingDescription='${STAGING_DESC}'")
+        }
+    }
+    stage('Drop redundant staging') {
+        if (!STAGING_PREV_NAME?.trim()) {
+            echo 'Nothing to be dropped'
+        } else {
+            try {
+                sh("""
+                OPEN_STAGINGS=${STAGING_PREV_NAME}
+                mvn -Djersey.version=${RELEASE_VERSION} -B -q -Pstaging nexus-staging:rc-drop -DstagingRepositoryId=\${OPEN_STAGINGS}
+                """)
+            } catch (Error err) {
+                currentBuild.result = 'UNSTABLE'
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/etc/scripts/release/EE8/bundle-apidocs.sh b/etc/scripts/release/EE8/bundle-apidocs.sh
new file mode 100644
index 0000000..dc360cc
--- /dev/null
+++ b/etc/scripts/release/EE8/bundle-apidocs.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for releasing api docs bundle by release tag.
+#
+# Input Parameters:
+#
+# VERSION - type: String
+#         - example: 2.42
+#         - description: Name of the existing version tag in the Git repo.
+#
+# Configuration:
+#
+# JDK:
+#       oracle-jdk8-latest
+# Git:
+#          git@github.com:eclipse-ee4j/jersey.git
+#    Branches to build:
+#          tags/${VERSION}
+#
+# Bindings:
+#    Secret file:
+#         Variable:
+#              KEYRING
+#         Credentials:
+#              secret-subkeys.asc
+#
+#
+
+
+ gpg --batch --import ${KEYRING}
+ for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
+ do
+   echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
+ done
+
+ # Execution environment
+ MVN_HOME="/opt/tools/apache-maven/latest/"
+ PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+ if [[ $VERSION == 2* ]] ;
+ then
+ 	export PROFILE_BUNDLE=',jetty2x'
+ fi
+
+ sed -i "s|org.glassfish.jersey.ext.micrometer|org.glassfish.jersey.ext|g" bundles/apidocs/pom.xml
+
+ echo '-[ Run maven release plugin ]---------------------------------------------------'
+
+ mvn -q -C -DstagingDescription="org.glassfish.jersey.bundles.apidocs:${VERSION}" \
+     -Pstaging,oss-release,pre-release${PROFILE_BUNDLE} -DskipTests -Denforcer.skip -pl bundles/apidocs \
+     install javadoc:jar gpg:sign deploy -Dsource.mvn.plugin.version=3.2.0
\ No newline at end of file
diff --git a/etc/scripts/release/EE8/bundle-examples.sh b/etc/scripts/release/EE8/bundle-examples.sh
new file mode 100644
index 0000000..61afc00
--- /dev/null
+++ b/etc/scripts/release/EE8/bundle-examples.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for releasing examples bundle by release tag.
+#
+# Input Parameters:
+#
+# VERSION - type: String
+#         - example: 2.42
+#         - description: Name of the existing version tag in the Git repo.
+#
+# Configuration:
+#
+# JDK:
+#       oracle-jdk8-latest
+# Git:
+#          git@github.com:eclipse-ee4j/jersey.git
+#    Branches to build:
+#          tags/${VERSION}
+#
+# Bindings:
+#    Secret file:
+#         Variable:
+#              KEYRING
+#         Credentials:
+#              secret-subkeys.asc
+#
+#
+
+
+ gpg --batch --import ${KEYRING}
+ for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
+ do
+   echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
+ done
+
+ # Execution environment
+ MVN_HOME="/opt/tools/apache-maven/latest/"
+ PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+ mvn clean install -C -B -DskipTests -Denforcer.skip -Ppre-release,staging -pl org.glassfish.jersey.examples:project -amd
+
+ mvn -C -B -DstagingDescription="org.glassfish.jersey.examples:${VERSION}" \
+     -Pstaging,oss-release,pre-release -Denforcer.skip=true \
+     -DskipTests -pl :jersey-examples \
+     deploy
\ No newline at end of file
diff --git a/etc/scripts/release/EE8/bundle-user-guide.sh b/etc/scripts/release/EE8/bundle-user-guide.sh
new file mode 100644
index 0000000..f6a121d
--- /dev/null
+++ b/etc/scripts/release/EE8/bundle-user-guide.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for releasing User Guide bundle by release tag.
+#
+# Input Parameters:
+#
+# VERSION - type: String
+#         - example: 2.42
+#         - description: Name of the existing version tag in the Git repo.
+#
+# Configuration:
+#
+# JDK:
+#       oracle-jdk11-latest
+# Git:
+#          git@github.com:eclipse-ee4j/jersey.git
+#    Credentials:
+#          GitHub bot SSH
+#    Branches to build:
+#          refs/tags/${VERSION}
+#
+# Bindings:
+#    Secret file:
+#         Variable:
+#              KEYRING
+#         Credentials:
+#              secret-subkeys.asc
+#
+#
+
+
+ gpg --batch --import ${KEYRING}
+ for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
+ do
+   echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
+ done
+
+ # Execution environment
+ MVN_HOME="/opt/tools/apache-maven/latest/"
+ PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+ echo '-[ Set version to ]-'${VERSION}
+
+ mvn -q -Pstaging versions:set -DnewVersion=${VERSION} -DgenerateBackupPoms=false -Djersey.version=${VERSION}
+
+ cd docs
+
+ echo '-[ Run maven release plugin ]---------------------------------------------------'
+
+ mvn -q -C -DstagingDescription="org.glassfish.jersey.jersey-documentation:${VERSION}" \
+     -Pstaging,oss-release,pre-release \
+     -DskipTests \
+     -Djersey.version=${VERSION} \
+     install javadoc:jar gpg:sign deploy
\ No newline at end of file
diff --git a/etc/scripts/release/EE8/release.groovy b/etc/scripts/release/EE8/release.groovy
new file mode 100644
index 0000000..3a88d31
--- /dev/null
+++ b/etc/scripts/release/EE8/release.groovy
@@ -0,0 +1,347 @@
+#!/usr/bin/env groovy
+
+/*
+ * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+/**
+ * Release script for Jakarta EE8/9 Jersey versions
+ * Release branches are 2.x or 3.0
+ *
+ * Input Parameters:
+ * RELEASE_VERSION - type: String
+ *                 - example:  2.42
+ *                 - Description: mandatory release version. Later is being published to staging/central.
+ * NEXT_VERSION    - type: String
+ *                 - example:  2.43-SNAPSHOT
+ *                 - Description: mandatory next developing version will be committed in to the release branch and later
+ *                               merged into the original release branch for further developing.
+ * BRANCH          - type: Choice Parameter
+ *                 - values: 2.x
+ *                           3.0
+ *                 - Description: Original release branch from which the codebase is being checked out
+ * DRY_RUN         - type: Boolean
+ *                 - Description: if checked nothing is really committed to Git nor published to the staging
+ * OVERWRITE       - type: Boolean
+ *                 - Description: if checked allows replacing of the previously published RELEASE_VERSION of Jersey
+ *
+ */
+
+node {
+
+    def MVN_HOME = tool name: 'apache-maven-latest', type: 'maven'
+    def HELP_PLUGIN = 'org.apache.maven.plugins:maven-help-plugin:2.1.1'
+    def TARGET = 'package javadoc:jar gpg:sign install:install'
+    def DEPLOY_TARGET = ''
+    def RELEASE_VERSION = RELEASE_VERSION
+    def NEXT_VERSION = NEXT_VERSION
+    def RELEASE_TAG = ''
+    def NEW_RELEASE_BRANCH = ''
+    def OVERWRITE = OVERWRITE
+    def PROJECT_NAME = 'Jersey'
+    def LOGIN = 'jersey-bot'
+    def EMAIL = 'jersey-bot@eclipse.org'
+    def REPO = 'git@github.com:eclipse-ee4j/jersey.git'
+    def SECRET_FILE_ID = 'secret-subkeys.asc'
+    def CREDENTIALS_ID = 'github-bot-ssh'
+    def GIT_ORIGIN = 'origin'
+    def RELEASE_FOLDER = env.WORKSPACE
+    def RELEASE_BRANCH = BRANCH
+
+    def STAGING_NAME_PATTERN = 'orgglassfishjersey-[0-9]+'
+    def STAGING_NAME = ''
+    def STAGING_PREV_NAME = ''
+    def STAGING_OPEN_NAME = ''
+    def STAGING_DESC = 'org.glassfish.jersey:' + RELEASE_VERSION
+    def STAGING_BOM_DESC = 'org.glassfish.jersey.bom:' + RELEASE_VERSION
+    def STAGING_PROFILE_ID = '70fa3a107a8918'
+
+    def JDK_11_HOME = tool name: 'openjdk-jdk11-latest', type: 'jdk'
+    def JDK_12_HOME = tool name: 'openjdk-jdk12-latest', type: 'jdk'
+    def JDK_17_HOME = tool name: 'openjdk-jdk17-latest', type: 'jdk'
+    def JDK_8_HOME = tool name: 'oracle-jdk8-latest', type: 'jdk'
+
+    def ZX_BRANCH_MODULES = ',:jersey-jetty-connector,:jersey-container-jetty-http,:jersey-container-jetty-servlet,:jersey-test-framework-provider-jetty,:jersey-test-framework-core,:jersey-container-servlet-core'
+
+    env.JAVA_HOME = JDK_8_HOME
+    env.PATH = "${env.JAVA_HOME}/bin:${env.PATH}:${MVN_HOME}/bin"
+
+    if (RELEASE_BRANCH == '2.x') {
+        ZX_BRANCH_MODULES = ''
+    }
+
+    sh 'java -version'
+
+    stage('Fetch from git') {
+        git(branch: RELEASE_BRANCH, credentialsId: CREDENTIALS_ID, url: REPO)
+    }
+    stage('Prepare environment') {
+
+        dir(RELEASE_FOLDER) {
+            //# Check whether top level pom.xml contains SNAPSHOT version
+            if (!sh(returnStdout: true, script: "grep '<version>' pom.xml | grep 'SNAPSHOT'")?.trim()) {
+                error('-[ Missing SNAPSHOT version in POM! ]-------------------------------------------')
+            }
+
+            //# Compute release versions
+            def SNAPSHOT_VERSION = sh(returnStdout: true, script: 'mvn -q -Dexec.executable="echo" -Dexec.args=\'${project.version}\' --non-recursive exec:exec -Pstaging').trim()
+
+            if (!RELEASE_VERSION?.trim()) {
+                if (!SNAPSHOT_VERSION?.trim()) {
+                    error('-[ Missing required snapshot version number! ]----------------------------------')
+                } else {
+                    def versionTokens = SNAPSHOT_VERSION.split('-')
+                    RELEASE_VERSION = versionTokens[0]
+                }
+            }
+
+            if (!NEXT_VERSION?.trim()) {
+                def (MAJOR_VERSION, MINOR_VERSION) = RELEASE_VERSION.tokenize('.')
+                def NEXT_MINOR_VERSION = (MINOR_VERSION as Integer) + 1
+                NEXT_VERSION = MAJOR_VERSION + '.' + NEXT_MINOR_VERSION + '-SNAPSHOT'
+            }
+
+            RELEASE_TAG = RELEASE_VERSION
+            NEW_RELEASE_BRANCH = RELEASE_VERSION+'-BRANCH'
+
+            echo "Current version: ${SNAPSHOT_VERSION}"
+            echo "Release version: ${RELEASE_VERSION}"
+            echo "Next version:    ${NEXT_VERSION}"
+            echo "Release tag:     ${RELEASE_TAG}"
+            echo "Release branch:  ${NEW_RELEASE_BRANCH}"
+
+            if (!SNAPSHOT_VERSION?.trim() || !RELEASE_VERSION?.trim() || !NEXT_VERSION?.trim()) {
+                error '-[ Missing required version numbers! ]------------------------------------------'
+            }
+
+            if (DRY_RUN == 'true') {
+                echo '-[ Dry run turned on ]----------------------------------------------------------'
+                //TARGET = 'install'
+            } else {
+                DEPLOY_TARGET = ' deploy:deploy'
+            }
+            echo '-[ Configure git user ]--------------------------------------------------------'
+            sh "git config --local user.email \"${EMAIL}\""
+            sh "git config --local user.name \"$LOGIN\""
+
+        }
+
+    }
+    stage('Prepare GPG') {
+        withCredentials([file(credentialsId: SECRET_FILE_ID, variable: 'KEYRING')]) {
+            //# Workaround: GPG initialization
+            sh("gpg --batch --import ${KEYRING}")
+            sh '''
+                for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u);
+                do
+                    echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust;
+                done
+                '''
+        }
+    }
+    stage('Prepare branch') {
+        echo '-[ Prepare branch ]-------------------------------------------------------------'
+
+        echo '-[ Switching to release branch ]-------------------------------------------------'
+        sh """
+        git checkout ${GIT_ORIGIN}/${RELEASE_BRANCH} && true
+        git reset --hard ${GIT_ORIGIN}/${RELEASE_BRANCH} && true
+        git checkout -B ${NEW_RELEASE_BRANCH}
+        """
+        echo '-[ Release tag cleanup ]--------------------------------------------------------'
+        def TAG_NAME = sh(returnStdout: true, script: "git tag | grep ${RELEASE_TAG} || true").trim()
+        if (RELEASE_TAG == TAG_NAME) {
+            if (OVERWRITE == 'true') {
+                echo "${RELEASE_TAG} tag already exists, deleting"
+                sshagent([CREDENTIALS_ID]) {
+                    sh "git push --delete origin ${RELEASE_TAG} && true"
+                }
+            } else {
+                error "${RELEASE_TAG} tag already exists"
+            }
+            //# Always delete local tag if exists
+            sh """
+            git tag --delete ${RELEASE_TAG} && true
+            """
+        }
+        sh '''
+        sed -i 's|<suppress files="generated" checks=".*"/>|<suppress files="generated" checks=".*"/><suppress files="unpacked-src" checks=".*"/>|g' etc/config/checkstyle-suppressions.xml
+        '''
+    }
+    stage('Check previous stagings') {
+        if (DRY_RUN == 'true') {
+            echo DRY_RUN + ' ------'
+        } else {
+            if (OVERWRITE == 'true') {
+                STAGING_PREV_NAME = sh(returnStdout: true,
+                        script: "mvn -B --non-recursive -Pstaging nexus-staging:rc-list | awk '/\\[INFO] $STAGING_NAME_PATTERN[ ]+CLOSED[ ]+$STAGING_DESC[ ]*\$/ {if(a){a = \$2\",\"a} else{a = \$2}}END{print a}'").trim()
+                echo 'Previously closed staging name: ' + STAGING_PREV_NAME
+            }
+
+            STAGING_OPEN_NAME = sh(returnStdout: true,
+                    script: "mvn -B --non-recursive -Pstaging nexus-staging:rc-list | awk  '/$STAGING_NAME_PATTERN OPEN / {if(a){a = \$2\",\"a} else{a = \$2}}END{print a}'").trim()
+
+            if (!STAGING_OPEN_NAME?.trim()) {
+                echo 'No currently open stagings'
+            } else {
+                echo 'Currently open redundand staging: ' + STAGING_OPEN_NAME + ', immediately closing'
+                sh """
+                    OPEN_STAGINGS=${STAGING_OPEN_NAME}
+                    mvn -B -q -Pstaging nexus-staging:rc-drop -DstagingRepositoryId=\${OPEN_STAGINGS}  
+                """
+            }
+        }
+    }
+    /*
+    stage('Open new staging') {
+        if (DRY_RUN == 'true') {
+            echo DRY_RUN + ' ------'
+        } else {
+            STAGING_NAME = sh(returnStdout: true,
+                script: "mvn -B --non-recursive -Pstaging -DstagingProfileId=${STAGING_PROFILE_ID} -DstagingDescription=${STAGING_DESC} nexus-staging:rc-open | awk  '/\\[INFO] Opened / {print \$3}'").trim()
+            echo 'New staging name: '+STAGING_NAME
+        }
+    }*/
+    stage("Build ${PROJECT_NAME}") {
+        echo env.JAVA_HOME
+        echo '-[ Run maven release ]---------------------------------------------------------'
+        echo '-[ Set Release version ]-------------------------------------------------------'
+        sh """
+        cd ${RELEASE_FOLDER}
+        mvn -B -V -Pstaging versions:set -DnewVersion=${RELEASE_VERSION} -DgenerateBackupPoms=false
+        cd bom
+        mvn -B -V -Pstaging versions:set -DnewVersion=${RELEASE_VERSION} -DgenerateBackupPoms=false
+        cd ..
+        """
+        echo '-[ Update Copyright years ]----------------------------------------------------'
+        sh '''#!/bin/bash -e
+        
+            export CURRENT_YEAR=`date '+%Y'`
+            export SED_CMD_LINE='sed -i "s#, 20.. Oracle and/or its affiliates#, ${CURRENT_YEAR} Oracle and/or its affiliates#g"'
+
+            git status --porcelain --untracked-files=no > modified_pom.log
+            cp modified_pom.log list_of_poms.txt
+            sed -i "s| M |$SED_CMD_LINE |g" modified_pom.log
+            sed -i "s| M ||g" list_of_poms.txt
+
+            bash modified_pom.log
+
+            echo ${CURRENT_YEAR} current year
+
+            while IFS= read -r path_to_pom
+            do
+              export CP_YEAR=`grep -o 'Copyright (c) 20.. Oracle and/or its affiliates' ${path_to_pom} | awk '{print $3}'`
+              [[ -z ${CP_YEAR} ]] && CP_YEAR=${CURRENT_YEAR} || echo ${CP_YEAR}
+              [[ ${CP_YEAR} == ${CURRENT_YEAR} ]] || ( sed -i "s#Copyright (c) ${CP_YEAR} Oracle and/or its affiliates#Copyright (c) ${CP_YEAR}, ${CURRENT_YEAR} Oracle and/or its affiliates#g" ${path_to_pom} ; echo ${path_to_pom} )
+              unset CP_YEAR
+            done < "list_of_poms.txt"
+        '''
+        echo '-[ Run release build ]---------------------------------------------------------'
+        dir(RELEASE_FOLDER) {
+            env.JAVA_HOME = JDK_12_HOME
+            //
+            sh "mvn -am -Pstaging --projects  core-server,core-client,media/jaxb,inject/hk2,ext/wadl-doclet,core-common${ZX_BRANCH_MODULES} clean install -B -q -V -DskipTests"
+            if (RELEASE_BRANCH == '3.0') {
+                env.JAVA_HOME = JDK_17_HOME
+                sh "mvn clean install -B -q -V -DskipTests -am -Pstaging --projects :jersey-spring6,connectors/helidon-connector"
+            }
+            env.JAVA_HOME = JDK_8_HOME
+            sh "mvn -q -B -V -DskipTests -Ddoclint=none -Dadditionalparam='-Xdoclint:none' -Dcheckstyle.skip " +
+                    //" -DstagingDescription='${STAGING_DESC}' -DstagingRepositoryId='${STAGING_NAME}' "+
+                    " -Poss-release,staging -U -C ${TARGET} ${DEPLOY_TARGET}"
+
+            sh "mvn -Poss-release,staging --projects core-server,core-client,media/jaxb,inject/hk2,ext/wadl-doclet,core-common install gpg:sign ${DEPLOY_TARGET} -B -q -V -DskipTests"
+            if (RELEASE_BRANCH == '2.x') {
+                env.JAVA_HOME = JDK_11_HOME
+                sh "mvn -Poss-release,staging --projects connectors/helidon-connector install gpg:sign ${DEPLOY_TARGET} -B -q -V -DskipTests"
+            }
+        }
+    }
+    stage('Prepare release') {
+        sh '''
+        git checkout -- etc/config/checkstyle-suppressions.xml
+        '''
+        echo '-[ Perform release commit to git ]---------------------------------------------'
+        sh "git commit -a -m ${RELEASE_VERSION}"
+        sh "git tag -m ${RELEASE_TAG} -a ${RELEASE_TAG}"
+        echo '-[ Set next snapshot version ]-------------------------------------------------'
+        dir(RELEASE_FOLDER) {
+            sh """
+                mvn -B -Pstaging versions:set -DnewVersion=${NEXT_VERSION} -DgenerateBackupPoms=false 
+                cd bom
+                mvn -B -Pstaging versions:set -DnewVersion=${NEXT_VERSION} -DgenerateBackupPoms=false
+                cd ..
+            """
+        }
+        echo '-[ Perform commit to git ]-----------------------------------------------------'
+        sh "git commit -a -m ${NEXT_VERSION}"
+    }
+    stage('Publish release') {
+        if (DRY_RUN == 'true') {
+            echo '-[ Prepared branch ]----------------------------------------------------------'
+            sh "git branch --list ${NEW_RELEASE_BRANCH}"
+            echo '-[ Prepared tag ]-------------------------------------------------------------'
+            sh "git tag --list ${NEW_RELEASE_BRANCH}"
+            echo '-[ Prepared commits ]---------------------------------------------------------'
+            sh 'git log -n 5'
+            sshagent([CREDENTIALS_ID]) {
+                sh "git push ${GIT_ORIGIN} ${NEW_RELEASE_BRANCH} --dry-run"
+            }
+            return
+        } else {
+            sshagent([CREDENTIALS_ID]) {
+                sh "git push -f ${GIT_ORIGIN} ${NEW_RELEASE_BRANCH} --follow-tags"
+            }
+        }
+    }
+    stage('Find related staging') {
+        if (DRY_RUN != 'true') {
+            if (!STAGING_NAME?.trim()) {
+                try {
+                    STAGING_NAME =
+                            sh(returnStdout: true,
+                                    script: "mvn -B --non-recursive -Pstaging nexus-staging:rc-list | awk  '/$STAGING_NAME_PATTERN OPEN / {if(a){a = \$2\",\"a} else{a = \$2}}END{print a}'"
+                            ).trim()
+                } catch (Error err) {
+                    currentBuild.result = 'UNSTABLE'
+                }
+            }
+            echo 'Staging name: ' + STAGING_NAME
+        } else {
+            echo 'DRY_RUN'
+        }
+    }
+    stage('Close released staging') {
+        if (!STAGING_NAME?.trim()) {
+            echo 'Nothing to be closed'
+        } else {
+            sh("mvn -B -q -Pstaging nexus-staging:rc-close -DstagingRepositoryId=${STAGING_NAME} -DstagingDescription='${STAGING_DESC}'")
+        }
+    }
+    stage('Drop redundant staging') {
+        if (!STAGING_PREV_NAME?.trim()) {
+            echo 'Nothing to be dropped'
+        } else {
+            try {
+                sh("""
+                OPEN_STAGINGS=${STAGING_PREV_NAME}
+                mvn -B -q -Pstaging nexus-staging:rc-drop -DstagingRepositoryId=\${OPEN_STAGINGS}
+                """)
+            } catch (Error err) {
+                currentBuild.result = 'UNSTABLE'
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/etc/scripts/release/Release-After/list-closed-stagings.sh b/etc/scripts/release/Release-After/list-closed-stagings.sh
new file mode 100644
index 0000000..d5f32ca
--- /dev/null
+++ b/etc/scripts/release/Release-After/list-closed-stagings.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for listing staging from the staging repo.
+#
+# Input Parameters:
+#     ----none----
+# Configuration:
+#
+# JDK:
+#       (System)
+# Git:
+#     ----none----
+#
+#
+
+cat <<EOT >> pom.xml
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+
+    This program and the accompanying materials are made available under the
+    terms of the Eclipse Public License v. 2.0, which is available at
+    http://www.eclipse.org/legal/epl-2.0.
+
+    This Source Code may also be made available under the following Secondary
+    Licenses when the conditions for such availability set forth in the
+    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+    version 2 with the GNU Classpath Exception, which is available at
+    https://www.gnu.org/software/classpath/license.html.
+
+    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.eclipse.ee4j</groupId>
+        <artifactId>project</artifactId>
+        <version>1.0.9</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.glassfish.jersey</groupId>
+    <artifactId>release-helper-util</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>Jersey Release Helper</name>
+
+    <description>Generated POM for Jersey Release Helper utils</description>
+    <url>https://projects.eclipse.org/projects/ee4j.jersey</url>
+
+    <scm>
+      <connection>scm:git:git://github.com/eclipse-ee4j/jersey</connection>
+      <developerConnection>scm:git:git://github.com/eclipse-ee4j/jersey</developerConnection>
+      <url>https://github.com/eclipse-ee4j/jersey</url>
+    </scm>
+
+</project>
+EOT
+
+MVN_HOME="/opt/tools/apache-maven/latest/"
+PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+export STAGING_PARAMS='-DnexusUrl=https://jakarta.oss.sonatype.org/ -DserverId=ossrh'
+export STAGING_PLUGIN='org.sonatype.plugins:nexus-staging-maven-plugin:1.6.7'
+
+
+mvn -B ${STAGING_PARAMS} ${STAGING_PLUGIN}:rc-list | grep orgglassfishjersey > closed_stagings.txt || true
+
+
+#
+#
+# Archive the artifacts:
+#      closed_stagings.txt
+#
diff --git a/etc/scripts/release/Release-After/populate-documentation.sh b/etc/scripts/release/Release-After/populate-documentation.sh
new file mode 100644
index 0000000..025e512
--- /dev/null
+++ b/etc/scripts/release/Release-After/populate-documentation.sh
@@ -0,0 +1,166 @@
+#!/bin/bash -lex
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for api docs publishing. Publishes api docs from the bundle in the Maven Central to the project's site.
+#
+# Input Parameters:
+#   RELEASE_VERSION    - type: String
+#                      - example: 3.1.6
+#                      - description: version for which project info is being published
+#   DRY_RUN            - type: Boolean
+#                      - description: If checked nothing is being published/generated
+#   WEBSITE_URL        - type: String
+#                      - value: git@github.com:eclipse-ee4j/jersey.github.io.git
+#                      - description: GitHub url for the project info/apidocs repository.
+#                        Mandatory and changes only in exceptional cases
+#  BRANCH_SPECIFIER    - type: String
+#                      - example: 2.x
+#                      - description: Branch for which the api docs are being published. Used only in Git commit message
+#  UPDATE_LATEST       - type: Boolean
+#                      - description: If checked updates the latest api docs (distinguishes for EE8/EE9/EE10) along
+#                        with publication into the RELEASE_VERSION folder.
+# Configuration:
+#
+# JDK:
+#       oracle-jdk8-latest
+# Git:
+#       ----none----
+#
+# SSH agent:
+#    GitHub bot SSH
+#
+#
+#
+
+
+#
+# The first shell execution
+#
+
+
+TOOLS_PREFIX=/opt/tools
+#JAVA_PREFIX=/opt/tools/java/oracle
+MVN_HOME=/opt/tools/apache-maven/latest
+#JAVA_HOME=/opt/tools/java/oracle/jdk-8/latest
+PATH=/opt/tools/apache-maven/latest/bin:${JAVA_HOME}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+
+export CENTRAL_URL='https://repo1.maven.org/maven2'
+export STAGING_URL='https://jakarta.oss.sonatype.org/content/repositories/staging'
+
+# !!! if build docbook it's essentially important to turn the pre-release profile ON !!!
+#mvn clean install -Pstaging,pre-release -DskipTests  -V -q -e -U -B -f docs/pom.xml -Djersey.version=$RELEASE_VERSION
+# however we download already published docbook from staging/central:
+mkdir -p $WORKSPACE/docs/target/docbook/index
+cd $WORKSPACE/docs/target/docbook/index
+wget -nv ${STAGING_URL}/org/glassfish/jersey/jersey-documentation/${RELEASE_VERSION}/jersey-documentation-${RELEASE_VERSION}-docbook.zip
+unzip -o jersey-documentation-${RELEASE_VERSION}-docbook.zip
+rm jersey-documentation-${RELEASE_VERSION}-docbook.zip
+
+mkdir -p $WORKSPACE/target/site/apidocs
+cd $WORKSPACE/target/site/apidocs
+wget -nv ${STAGING_URL}/org/glassfish/jersey/bundles/apidocs/${RELEASE_VERSION}/apidocs-${RELEASE_VERSION}-javadoc.jar -O apidocs-javadoc.jar
+jar -xf apidocs-javadoc.jar
+rm apidocs-javadoc.jar
+rm -rf META-INF
+
+
+#
+# The second shell execution
+#
+
+
+#!/bin/bash -lex
+
+TOOLS_PREFIX=/opt/tools
+#JAVA_PREFIX=/opt/tools/java/oracle
+MVN_HOME=/opt/tools/apache-maven/latest
+#JAVA_HOME=/opt/tools/java/oracle/jdk-8/latest
+PATH=/opt/tools/apache-maven/latest/bin:${JAVA_HOME}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+
+DIRS="$RELEASE_VERSION"
+if $UPDATE_LATEST;
+then
+	if [[ $RELEASE_VERSION == 2* ]] ;
+    then
+    	export DIRS="latest $DIRS"
+    elif [[ $RELEASE_VERSION == 3.1* ]] ;
+    then
+    	export DIRS="latest31x $DIRS"
+    else
+    	export DIRS="latest30x $DIRS"
+    fi
+    echo ${DIRS} for ${RELEASE_VERSION} release
+fi
+
+#export PATH=/opt/csw/bin:$PATH
+WEB_DIR=$WORKSPACE/target/jersey-web
+
+
+function copyDocs {
+    APIDOCS_DIR=$WEB_DIR/apidocs/$1
+    DOCS_DIR=$WEB_DIR/documentation/$1
+
+    #
+    # API docs
+    #
+    if test ! -e $APIDOCS_DIR ; then
+        mkdir -p $APIDOCS_DIR
+    fi
+    cd $APIDOCS_DIR
+
+    rm -rf jersey || true
+    cp -R $WORKSPACE/target/site/apidocs ./jersey
+
+    #
+    # user guide
+    #
+    rm -rf $DOCS_DIR || true
+    mkdir -p $DOCS_DIR
+    cp -r $WORKSPACE/docs/target/docbook/index/* $DOCS_DIR
+    rm $DOCS_DIR/*.fo || true
+}
+
+if test -e $WEB_DIR ; then
+    rm -rf $WEB_DIR
+fi
+
+# would couse shallow reject: git clone --depth 1 $WEBSITE_URL $WEB_DIR
+git clone $WEBSITE_URL $WEB_DIR
+
+cd $WEB_DIR
+
+for dir in $DIRS; do
+    copyDocs $dir
+done
+
+cd $WEB_DIR
+
+git config --local user.email "jersey-bot@eclipse.org"
+git config --local user.name "jersey-bot"
+git add -A .
+git diff --cached --exit-code || git commit -m "[jenkins] automatic javadoc and documentation update [$RELEASE_VERSION @ $BRANCH_SPECIFIER]"
+
+if [ "$DRY_RUN" = "false" ]; then
+  echo "Pushing Web sources to $WEBSITE_URL"
+  git push origin master
+else
+  echo "Dry run .. not pushing to the master"
+  git push origin master --dry-run
+fi
+
+
diff --git a/etc/scripts/release/Release-After/publish-release-notes.sh b/etc/scripts/release/Release-After/publish-release-notes.sh
new file mode 100644
index 0000000..d547134
--- /dev/null
+++ b/etc/scripts/release/Release-After/publish-release-notes.sh
@@ -0,0 +1,109 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for publishing listed stagings from the staging repo into the Maven Central.
+#
+# Input Parameters:
+#   VERSION            - type: String
+#                      - example: 3.1.6
+#                      - description: version for which release notes are being published
+#   DRY_RUN            - type: Boolean
+#                      - description: If checked nothing is being published/generated
+#   PUBLISH_TO_GITHUB  - type: Boolean
+#                      - description: If checked generated notes are propagated to GitHub
+# Configuration:
+#
+# JDK:
+#       oracle-jdk8-latest
+# Git:
+#     https://github.com/eclipse-ee4j/jersey
+#
+# Bindings:
+#    Username and password (separated):
+#       Username Variable:
+#          BOT_NAME
+#       Password Variable:
+#          BOT_PASSWORD
+#       Credentials:
+#          GitHub bot (username/token)
+#
+#
+#
+
+
+cat <<EOT >> pom.xml
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+
+    This program and the accompanying materials are made available under the
+    terms of the Eclipse Public License v. 2.0, which is available at
+    http://www.eclipse.org/legal/epl-2.0.
+
+    This Source Code may also be made available under the following Secondary
+    Licenses when the conditions for such availability set forth in the
+    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+    version 2 with the GNU Classpath Exception, which is available at
+    https://www.gnu.org/software/classpath/license.html.
+
+    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.eclipse.ee4j</groupId>
+        <artifactId>project</artifactId>
+        <version>1.0.9</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.glassfish.jersey</groupId>
+    <artifactId>release-helper-util</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>Jersey Release Helper</name>
+
+    <description>Generated POM for Jersey Release Helper utils</description>
+    <url>https://projects.eclipse.org/projects/ee4j.jersey</url>
+
+    <scm>
+      <connection>scm:git:git://github.com/eclipse-ee4j/jersey</connection>
+      <developerConnection>scm:git:git://github.com/eclipse-ee4j/jersey</developerConnection>
+      <url>https://github.com/eclipse-ee4j/jersey</url>
+    </scm>
+
+</project>
+EOT
+
+# Execution environment
+readonly MVN_HOME="/opt/tools/apache-maven/latest/"
+PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+readonly RELEASE_DATE=`date -I`
+
+mkdir -p target
+
+mvn -B -V org.glassfish.jersey.tools.plugins:jersey-release-notes-maven-plugin:1.0.1:release-notes -DskipTests \
+-DreleaseVersion=${VERSION} -DgithubLogin=${BOT_NAME} -DgithubPassword=${BOT_PASSWORD} \
+-DtemplateFilePath=release-note.html -DreleaseDate=${RELEASE_DATE} \
+-DdryRun=${DRY_RUN} -DpublishToGithub=${PUBLISH_TO_GITHUB}
+
+cp -a `pwd`/target/release-notes ${WORKSPACE}
\ No newline at end of file
diff --git a/etc/scripts/release/Release-After/release-note.html b/etc/scripts/release/Release-After/release-note.html
new file mode 100644
index 0000000..f0e5996
--- /dev/null
+++ b/etc/scripts/release/Release-After/release-note.html
@@ -0,0 +1,78 @@
+<html>
+<!--
+
+    Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+
+    This program and the accompanying materials are made available under the
+    terms of the Eclipse Public License v. 2.0, which is available at
+    http://www.eclipse.org/legal/epl-2.0.
+
+    This Source Code may also be made available under the following Secondary
+    Licenses when the conditions for such availability set forth in the
+    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+    version 2 with the GNU Classpath Exception, which is available at
+    https://www.gnu.org/software/classpath/license.html.
+
+    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+
+-->
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+    <meta name="google-site-verification" content="OiKukTHVW4bdQqx8Fq0zA2EZ_hI6-yYL-MvkCxBxaFs" />
+    <title>Release Notes - Jersey @LATEST_VERSION@</title>
+</head>
+
+<body>
+
+<h1>Release Notes - <a href="/">Jersey</a> @LATEST_VERSION@</h1>
+
+Release date: <strong>@RELEASE_DATE@</strong>
+
+<h2>Previous releases</h2>
+
+<ul>
+    <li><a href="2.29.1.html">Jersey 2.29.1 Release Notes</a></li>
+    <li><a href="2.29.html">Jersey 2.29 Release Notes</a></li>
+    <li><a href="2.28.html">Jersey 2.28 Release Notes</a></li>
+    <li><a href="2.25.1.html">Jersey 2.25.1 Release Notes</a></li>
+    <li><a href="2.25.html">Jersey 2.25 Release Notes</a></li>
+    <li><a href="2.24.1.html">Jersey 2.24.1 Release Notes</a></li>
+    <li><a href="2.24.html">Jersey 2.24 Release Notes</a></li>
+    <li><a href="2.23.2.html">Jersey 2.23.2 Release Notes</a></li>
+    <li><a href="2.23.1.html">Jersey 2.23.1 Release Notes</a></li>
+    <li><a href="2.23.html">Jersey 2.23 Release Notes</a></li>
+    <li><a href="2.22.2.html">Jersey 2.22.2 Release Notes</a></li>
+    <li><a href="2.22.1.html">Jersey 2.22.1 Release Notes</a></li>
+    <li><a href="2.22.html">Jersey 2.22 Release Notes</a></li>
+    <li><a href="2.21.1.html">Jersey 2.21.1 Release Notes</a></li>
+    <li><a href="2.21.html">Jersey 2.21 Release Notes</a></li>
+    <li><a href="2.20.html">Jersey 2.20 Release Notes</a></li>
+    <li><a href="2.19.html">Jersey 2.19 Release Notes</a></li>
+    <li><a href="2.18.html">Jersey 2.18 Release Notes</a></li>
+    <li><a href="2.17.html">Jersey 2.17 Release Notes</a></li>
+    <li><a href="2.16.html">Jersey 2.16 Release Notes</a></li>
+    <li><a href="2.14.html">Jersey 2.14 Release Notes</a></li>
+    <li><a href="2.13.html">Jersey 2.13 Release Notes</a></li>
+    <li><a href="2.12.html">Jersey 2.12 Release Notes</a></li>
+    <li><a href="2.11.html">Jersey 2.11 Release Notes</a></li>
+    <li><a href="2.10.1.html">Jersey 2.10.1 Release Notes</a></li>
+    <li><a href="2.10.html">Jersey 2.10 Release Notes</a></li>
+    <li><a href="2.9.1.html">Jersey 2.9.1 Release Notes</a></li>
+    <li><a href="2.9.html">Jersey 2.9 Release Notes</a></li>
+    <li><a href="2.8.html">Jersey 2.8 Release Notes</a></li>
+    <li><a href="2.7.html">Jersey 2.7 Release Notes</a></li>
+    <li><a href="2.6.html">Jersey 2.6 Release Notes</a></li>
+    <li><a href="2.5.1.html">Jersey 2.5.1 Release Notes</a></li>
+    <li><a href="2.5.html">Jersey 2.5 Release Notes</a></li>
+    <li><a href="2.4.1.html">Jersey 2.4.1 Release Notes</a></li>
+    <li><a href="2.4.html">Jersey 2.4 Release Notes</a></li>
+    <li><a href="2.3.1.html">Jersey 2.3.1 Release Notes</a></li>
+    <li><a href="2.3.html">Jersey 2.3 Release Notes</a></li>
+    <li><a href="2.2.html">Jersey 2.2 Release Notes</a></li>
+    <li><a href="2.1.html">Jersey 2.1 Release Notes</a></li>
+    <li><a href="2.0.html">Jersey 2.0 Release Notes</a></li>
+</ul>
+
+</body>
+</html>
diff --git a/etc/scripts/release/Release-After/release-project-info.sh b/etc/scripts/release/Release-After/release-project-info.sh
new file mode 100644
index 0000000..ebfe9b1
--- /dev/null
+++ b/etc/scripts/release/Release-After/release-project-info.sh
@@ -0,0 +1,103 @@
+#!/bin/bash -lex
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for project info publishing. MUST BE RUN ONLY AFTER THE APIDOCS PUBLISHING.
+#
+# Input Parameters:
+#   RELEASE_VERSION    - type: String
+#                      - example: 3.1.6
+#                      - description: version for which project info is being published
+#   DRY_RUN            - type: Boolean
+#                      - description: If checked nothing is being published/generated
+#   WEBSITE_URL        - type: String
+#                      - value: git@github.com:eclipse-ee4j/jersey.github.io.git
+#                      - description: GitHub url for the project info/apidocs repository.
+#                        Mandatory and changes only in exceptional cases
+# Configuration:
+#
+# JDK:
+#       openjdk-jdk11-latest
+# Git:
+#       https://github.com/eclipse-ee4j/jersey
+#
+#   Branches to build:
+#       tags/${RELEASE_VERSION}
+#
+# SSH agent:
+#    GitHub bot SSH
+#
+#
+#
+
+
+#
+# The first shell execution
+#
+
+MVN_HOME=/opt/tools/apache-maven/latest
+PATH=${PATH}:${MVN_HOME}/bin:${JAVA_HOME}/bin
+
+mvn clean install -B -V -q -PtestsSkip,checkstyleSkip -Dtests.excluded -DskipTests '-Dmaven.test.skip=true'
+
+mvn -B -V -q -Pproject-info,checkstyleSkip,testsSkip,findbugsSkip,staging site site:stage \
+     -DgenerateProjectInfo=true -Dtests.excluded -Ddependency.locations.enabled=false \
+     -Dmaven.jxr.skip=true -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -DskipTests \
+     -Dfindbugs.skip=true
+
+#
+# The second shell execution
+#
+
+#!/bin/bash -lex
+
+export PATH=/opt/csw/bin:$PATH
+WEB_DIR=$WORKSPACE/target/jersey-web
+PROJECT_INFO_DIR=$WEB_DIR/project-info/$RELEASE_VERSION
+
+if test -e $WEB_DIR ; then
+    rm -rf $WEB_DIR
+fi
+
+# would couse shallow reject: git clone --depth 1 $WEBSITE_SOURCE_URL $WEB_DIR
+git clone $WEBSITE_URL $WEB_DIR
+cd $WEB_DIR
+
+if test ! -e $PROJECT_INFO_DIR ; then
+    mkdir -p $PROJECT_INFO_DIR
+fi
+
+cd $PROJECT_INFO_DIR
+
+rm -rf jersey || true
+cp -R $WORKSPACE/target/staging ./jersey
+
+cd $WEB_DIR
+
+git config --local user.email "jersey-bot@eclipse.org"
+git config --local user.name "jersey-bot"
+git add -A .
+#git diff --cached --exit-code ||
+git commit -m "[jenkins] automatic project-info update [$RELEASE_VERSION]"
+
+if [ "$DRY_RUN" = "false" ]; then
+  echo Pushing Web sources to $WEBSITE_URL
+  git push origin master
+else
+  echo "Dry run .. not pushing to the master"
+  git push origin master --dry-run
+fi
\ No newline at end of file
diff --git a/etc/scripts/release/Release-After/release-staging-to-central.sh b/etc/scripts/release/Release-After/release-staging-to-central.sh
new file mode 100644
index 0000000..b470730
--- /dev/null
+++ b/etc/scripts/release/Release-After/release-staging-to-central.sh
@@ -0,0 +1,93 @@
+#!/bin/bash
+#
+# Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# terms of the Eclipse Public License v. 2.0, which is available at
+# http://www.eclipse.org/legal/epl-2.0.
+#
+# This Source Code may also be made available under the following Secondary
+# Licenses when the conditions for such availability set forth in the
+# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+# version 2 with the GNU Classpath Exception, which is available at
+# https://www.gnu.org/software/classpath/license.html.
+#
+# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+#
+
+#
+# script for publishing listed stagings from the staging repo into the Maven Central.
+#
+# Input Parameters:
+#     STAGING_REPO_ID  - type: String
+#                      - example: orgglassfishjersey-1226,orgglassfishjersey-1227,orgglassfishjersey-1228,orgglassfishjersey-1229,orgglassfishjersey-1230
+#                      - description: list all staggings (comma separated) to be published to the Maven Central
+#     STAGING_DESC     - type: String
+#                      - example:org.glassfish.jersey:2.42
+#                      - description: description of what is published. Usually <group.id>:<version>
+# Configuration:
+#
+# JDK:
+#       (System)
+# Git:
+#     ----none----
+#
+#
+
+cat <<EOT >> pom.xml
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+
+    This program and the accompanying materials are made available under the
+    terms of the Eclipse Public License v. 2.0, which is available at
+    http://www.eclipse.org/legal/epl-2.0.
+
+    This Source Code may also be made available under the following Secondary
+    Licenses when the conditions for such availability set forth in the
+    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+    version 2 with the GNU Classpath Exception, which is available at
+    https://www.gnu.org/software/classpath/license.html.
+
+    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.eclipse.ee4j</groupId>
+        <artifactId>project</artifactId>
+        <version>1.0.9</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.glassfish.jersey</groupId>
+    <artifactId>release-helper-util</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>Jersey Release Helper</name>
+
+    <description>Generated POM for Jersey Release Helper utils</description>
+    <url>https://projects.eclipse.org/projects/ee4j.jersey</url>
+
+    <scm>
+      <connection>scm:git:git://github.com/eclipse-ee4j/jersey</connection>
+      <developerConnection>scm:git:git://github.com/eclipse-ee4j/jersey</developerConnection>
+      <url>https://github.com/eclipse-ee4j/jersey</url>
+    </scm>
+
+</project>
+EOT
+
+MVN_HOME="/opt/tools/apache-maven/latest/"
+PATH="${MVN_HOME}/bin:${JAVA_HOME}:/bin:${PATH}"
+
+export STAGING_PARAMS='-DnexusUrl=https://jakarta.oss.sonatype.org/ -DserverId=ossrh'
+export STAGING_PLUGIN='org.sonatype.plugins:nexus-staging-maven-plugin:1.6.7'
+
+
+mvn ${STAGING_PARAMS} -B -C -V ${STAGING_PLUGIN}:rc-release -DstagingRepositoryId="${STAGING_REPO_ID}" -DstagingDescription="${STAGING_DESC}"
+
diff --git a/examples/NOTICE.md b/examples/NOTICE.md
index c68ea53..b14ed9d 100644
--- a/examples/NOTICE.md
+++ b/examples/NOTICE.md
@@ -96,7 +96,7 @@
 * Project: http://www.kineticjs.com, https://github.com/ericdrowell/KineticJS
 * Copyright: Eric Rowell
 
-org.objectweb.asm Version 9.6
+org.objectweb.asm Version 9.7
 * License: Modified BSD (https://asm.ow2.io/license.html)
 * Copyright (c) 2000-2011 INRIA, France Telecom. All rights reserved.
 
diff --git a/pom.xml b/pom.xml
index 8069240..dca426b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2240,7 +2240,7 @@
         <arquillian.weld.version>3.0.1.Final</arquillian.weld.version> <!-- 3.0.2.Final fails microprofile TCK tests -->
         <!-- asm is now source integrated - keeping this property to see the version -->
         <!-- see core-server/src/main/java/jersey/repackaged/asm/.. -->
-        <asm.version>9.6</asm.version>
+        <asm.version>9.7</asm.version>
         <!--required for spring (ext) modules integration -->
         <aspectj.weaver.version>1.9.21.1</aspectj.weaver.version>
 <!--        <bnd.plugin.version>2.3.6</bnd.plugin.version>-->