diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/ContextOperation.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/ContextOperation.java
index bace618..26ac343 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/ContextOperation.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/ContextOperation.java
@@ -17,5 +17,5 @@
 package ee.jakarta.tck.ws.rs.ee.rs.container.requestcontext;
 
 public enum ContextOperation {
-  ABORTWITH, GETACCEPTABLELANGUAGES, GETACCEPTABLELANGUAGESISREADONLY, GETACCEPTABLEMEDIATYPES, GETACCEPTABLEMEDIATYPESISREADONLY, GETCOOKIES, GETCOOKIESISREADONLY, GETDATE, GETENTITYSTREAM, GETHEADERS, GETHEADERSISMUTABLE, GETHEADERSTRING2, GETLANGUAGE, GETLENGTH, GETMEDIATYPE, GETMETHOD, GETPROPERTY, GETPROPERTYNAMES, GETPROPERTYNAMESISREADONLY, GETREQUEST, GETSECURITYCONTEXT, GETURIINFO, HASENTITY, REMOVEPROPERTY, SETENTITYSTREAM, SETMETHOD, SETPROPERTY, SETPROPERTYNULL, SETPROPERTYCONTEXT, SETREQUESTURI1, SETREQUESTURI2, SETSECURITYCONTEXT;
+  ABORTWITH, GETACCEPTABLELANGUAGES, GETACCEPTABLELANGUAGESISREADONLY, GETACCEPTABLEMEDIATYPES, GETACCEPTABLEMEDIATYPESISREADONLY, GETCOOKIES, GETCOOKIESISREADONLY, GETDATE, GETENTITYSTREAM, CONTAINSHEADERSTRING, GETHEADERS, GETHEADERSISMUTABLE, GETHEADERSTRING2, GETLANGUAGE, GETLENGTH, GETMEDIATYPE, GETMETHOD, GETPROPERTY, GETPROPERTYNAMES, GETPROPERTYNAMESISREADONLY, GETREQUEST, GETSECURITYCONTEXT, GETURIINFO, HASENTITY, REMOVEPROPERTY, SETENTITYSTREAM, SETMETHOD, SETPROPERTY, SETPROPERTYNULL, SETPROPERTYCONTEXT, SETREQUESTURI1, SETREQUESTURI2, SETSECURITYCONTEXT;
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/JAXRSClientIT.java
index dc3d48a..b41f8b9 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/JAXRSClientIT.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/JAXRSClientIT.java
@@ -334,6 +334,34 @@
   }
 
   /*
+   * @testName: containsHeaderStringTest
+   * 
+   * @assertion_ids: JAXRS:JAVADOC:???
+   * 
+   * @test_Strategy: Check if the specified header contains a specified value.
+   * 
+   * Filter method called before a request has been dispatched to a resource.
+   * Throws IOException.
+   */
+  @Test
+  @Tag("servlet")
+  public void containsHeaderStringTest() throws Fault {    
+      setProperty(Property.REQUEST_HEADERS,
+              "Accept:text/*, text/html, text/html;level=1, */*");
+      setProperty(Property.REQUEST_HEADERS,
+              "Content-Type:application/xml;charset=utf8");
+      setProperty(Property.REQUEST_HEADERS,
+              "Header3:value1 ;; Value2 ;;value 3");
+      setProperty(Property.SEARCH_STRING, "Test1");
+      setProperty(Property.SEARCH_STRING, "Test2");
+      setProperty(Property.SEARCH_STRING, "Test3");
+      setProperty(Property.SEARCH_STRING, "Test4");
+      setProperty(Property.SEARCH_STRING, "Test5");
+
+      invokeRequestAndCheckResponse(ContextOperation.CONTAINSHEADERSTRING);
+  }
+
+  /*
    * @testName: getHeadersTest
    * 
    * @assertion_ids: JAXRS:JAVADOC:655; JAXRS:JAVADOC:677; JAXRS:JAVADOC:678;
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/RequestFilter.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/RequestFilter.java
index c0cc756..a2aa30e 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/RequestFilter.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/RequestFilter.java
@@ -140,16 +140,48 @@
     abortWithEntity(entity);
   }
 
+  public void containsHeaderString() {
+      StringBuffer sb = new StringBuffer();
+      sb.append("containsHeaderString= ");
+
+      try {
+          assertTrue(requestContext.containsHeaderString("accept", "text/html"::equals));
+          sb.append("Test1: accept contains text/html; ");
+        
+          //Verify Predicate and separator character usage
+          assertTrue(requestContext.containsHeaderString("Accept", ",", "Text/html;Level=1"::equalsIgnoreCase));
+          sb.append("Test2: accept contains text/html;level=1; ");
+          
+          //Verify incorrect separator character fails
+          assertTrue(!(requestContext.containsHeaderString("Accept", ";", "text/html;level=1"::equals))); 
+          sb.append("Test3: Incorrect separator character fails as expected; ");
+          
+          //Verify white space in value not trimmed and double character separator
+          assertTrue(!(requestContext.containsHeaderString("header3", ";;", "value3"::equals))); 
+          sb.append("Test4: White space not trimmed from value as expected; ");
+          
+          //Verify white space in front and back of value trimmed
+          assertTrue(requestContext.containsHeaderString("HEADER3", ";;", "value2"::equalsIgnoreCase));
+          sb.append("Test5: White space trimmed around value as expected; ");  
+      } catch (Throwable ex) {
+        sb.append("Unexpected exception thrown in containsHeaderString: "
+            + ex.getMessage());
+        ex.printStackTrace();
+      }
+      abortWithEntity(sb.toString());
+  }
+
   public void getHeaders() {
     MultivaluedMap<String, String> headers = requestContext.getHeaders();
     StringBuilder sb = new StringBuilder();
     for (Entry<String, List<String>> set : headers.entrySet()) {
-      String first = headers.getFirst(set.getKey());
+       String first = headers.getFirst(set.getKey());
       sb.append(set.getKey()).append(":").append(first).append(";");
     }
     abortWithEntity(sb.toString());
   }
 
+  
   public void getHeadersIsMutable() {
     String key = "KEY";
     MultivaluedMap<String, String> headers = requestContext.getHeaders();
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ContextOperation.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ContextOperation.java
index 057e978..a1c2e8b 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ContextOperation.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ContextOperation.java
@@ -17,7 +17,7 @@
 package ee.jakarta.tck.ws.rs.ee.rs.container.responsecontext;
 
 public enum ContextOperation {
-  GETALLOWEDMETHODS, GETCOOKIES, GETCOOKIESISREADONLY, GETDATE, GETENTITY, GETENTITYANNOTATIONS, GETENTITYANNOTATIONSONENTITY, GETENTITYCLASS, GETENTITYSTREAM, GETENTITYTAG, GETENTITYTYPE, GETHEADERS, GETHEADERSISMUTABLE, GETHEADERSTRINGOPERATION, GETHEADERSTRINGHEADER, GETLANGUAGE, GETLASTMODIFIED, GETLENGTH, GETLINK, GETLINKBUILDER, GETLINKS, GETLOCATION, GETMEDIATYPE, GETSTATUS, GETSTATUSINFO, GETSTRINGHEADERS, HASENTITY, HASLINK, SETENTITY, SETENTITYSTREAM, SETSTATUS, SETSTATUSINFO,
+  GETALLOWEDMETHODS, GETCOOKIES, GETCOOKIESISREADONLY, GETDATE, GETENTITY, GETENTITYANNOTATIONS, GETENTITYANNOTATIONSONENTITY, GETENTITYCLASS, GETENTITYSTREAM, GETENTITYTAG, GETENTITYTYPE, CONTAINSHEADERSTRING, GETHEADERS, GETHEADERSISMUTABLE, GETHEADERSTRINGOPERATION, GETHEADERSTRINGHEADER, GETLANGUAGE, GETLASTMODIFIED, GETLENGTH, GETLINK, GETLINKBUILDER, GETLINKS, GETLOCATION, GETMEDIATYPE, GETSTATUS, GETSTATUSINFO, GETSTRINGHEADERS, HASENTITY, HASLINK, SETENTITY, SETENTITYSTREAM, SETSTATUS, SETSTATUSINFO,
 
   // just helping methods, pass
   SETSTRINGBEANRUNTIME, SETORIGINALRUNTIME
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/JAXRSClientIT.java
index c40db3f..504b360 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/JAXRSClientIT.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/JAXRSClientIT.java
@@ -456,6 +456,25 @@
    * Throws IOException.
    */
   @Test
+  public void containsHeaderStringTest() throws Fault {
+    String header = "Test";
+    for (int i = 1; i != 6; i++)
+      setProperty(Property.UNORDERED_SEARCH_STRING, header + i);
+    setProperty(Property.CONTENT, header);
+    invokeRequestAndCheckResponse(ContextOperation.CONTAINSHEADERSTRING);
+  }
+
+  /*
+   * @testName: getHeadersTest
+   * 
+   * @assertion_ids: JAXRS:JAVADOC:688; JAXRS:JAVADOC:707; JAXRS:JAVADOC:708;
+   * 
+   * @test_Strategy: Get the mutable response headers multivalued map.
+   *
+   * Filter method called after a response has been provided for a request.
+   * Throws IOException.
+   */
+  @Test
   public void getHeadersTest() throws Fault {
     String header = "header";
     for (int i = 0; i != 5; i++)
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/Resource.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/Resource.java
index dc0cef1..da7cfb6 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/Resource.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/Resource.java
@@ -180,6 +180,17 @@
   }
 
   @POST
+  @Path("containsheaderstring")
+  public Response containsHeaderString(String header) {
+    ResponseBuilder builder = createResponseWithHeader();
+    builder = builder.header("Accept", "text/html, text/html;level=1, */*");
+    builder = builder.header("Content-Type", "application/xml;charset=utf8");
+    builder = builder.header("Header3", "value1 ;; Value2 ;;value 3");
+    Response response = builder.build();
+    return response;   
+  }
+
+  @POST
   @Path("getheaders")
   public Response getHeaders(String header) {
     ResponseBuilder builder = createResponseWithHeader();
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ResponseFilter.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ResponseFilter.java
index 7c7c3c9..82cd7a6 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ResponseFilter.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ResponseFilter.java
@@ -152,10 +152,41 @@
     setEntity(name);
   }
 
+  public void containsHeaderString() {
+      StringBuffer sb = new StringBuffer();
+      sb.append("containsHeaderString= ");
+
+      try {
+          assertTrue(requestContext.containsHeaderString("accept", "text/html"::equals));
+          sb.append("Test1: accept contains text/html; ");
+        
+          //Verify Predicate and separator character usage
+          assertTrue(requestContext.containsHeaderString("Accept", ",", "Text/html;Level=1"::equalsIgnoreCase));
+          sb.append("Test2: accept contains text/html;level=1; ");
+          
+          //Verify incorrect separator character fails
+          assertTrue(!(requestContext.containsHeaderString("Accept", ";", "text/html;level=1"::equals))); 
+          sb.append("Test3: Incorrect separator character fails as expected; ");
+          
+          //Verify white space in value not trimmed and double character separator
+          assertTrue(!(requestContext.containsHeaderString("header3", ";;", "value3"::equals))); 
+          sb.append("Test4: White space not trimmed from value as expected; ");
+          
+          //Verify white space in front and back of value trimmed
+          assertTrue(requestContext.containsHeaderString("HEADER3", ";;", "value2"::equalsIgnoreCase));
+          sb.append("Test5: White space trimmed around value as expected; ");  
+      } catch (Throwable ex) {
+        sb.append("Unexpected exception thrown in containsHeaderString: "
+            + ex.getMessage());
+        ex.printStackTrace();
+      }
+      setEntity(sb.toString());
+    }
+  
   public void getHeaders() {
-    MultivaluedMap<String, Object> headers = responseContext.getHeaders();
-    setEntity(collectionToString(headers.keySet()));
-  }
+      MultivaluedMap<String, Object> headers = responseContext.getHeaders();
+      setEntity(collectionToString(headers.keySet()));
+    }
 
   public void getHeadersIsMutable() {
     MultivaluedMap<String, Object> headers = responseContext.getHeaders();
