diff --git a/tck/pom.xml b/tck/pom.xml
index 51784f6cd..4258784f8 100644
--- a/tck/pom.xml
+++ b/tck/pom.xml
@@ -303,13 +303,16 @@
             </executions>
             <configuration>
               <classes>${project.build.directory}/jakarta.data-api</classes>
-              <classes>${project.build.directory}/jimage/java.base</classes><classes>${project.build.directory}/jimage/java.base</classes>
+              <classes>${project.build.directory}/jimage/java.base</classes>
               <packages>
                   jakarta.data,
                   jakarta.data.exceptions,
                   jakarta.data.metamodel,
+                  jakarta.data.metamodel.impl,
                   jakarta.data.page,
-                  jakarta.data.repository
+                  jakarta.data.page.impl,
+                  jakarta.data.repository,
+                  jakarta.data.spi
               </packages>
               <attach>false</attach>
               <sigfile>${project.build.directory}/jakarta.data.sig_${java.version}</sigfile>
diff --git a/tck/src/main/java/ee/jakarta/tck/data/framework/signature/DataSignatureTestRunner.java b/tck/src/main/java/ee/jakarta/tck/data/framework/signature/DataSignatureTestRunner.java
index 0f42e2988..e9a6984e5 100644
--- a/tck/src/main/java/ee/jakarta/tck/data/framework/signature/DataSignatureTestRunner.java
+++ b/tck/src/main/java/ee/jakarta/tck/data/framework/signature/DataSignatureTestRunner.java
@@ -62,16 +62,24 @@ public DataSignatureTestRunner() {
      * Returns a list of strings where each string represents a package name. Each
      * package name will have it's signature tested by the signature test framework.
      * 
+     * TODO is there a way to construct this list at runtime?
+     * Unlikely due to lazy classloading Package.getPackages() will not contain anything 
+     * that hasn't been loaded.
+     * 
      * @return String[] The names of the packages whose signatures should be
      *         verified.
      */
     @Override
     protected String[] getPackages(String vehicleName) {
         return new String[] {
-                "jakarta.data",
-                "jakarta.data.exceptions",
-                "jakarta.data.page",
-                "jakarta.data.repository"
+                  "jakarta.data",
+                  "jakarta.data.exceptions",
+                  "jakarta.data.metamodel",
+                  "jakarta.data.metamodel.impl",
+                  "jakarta.data.page",
+                  "jakarta.data.page.impl",
+                  "jakarta.data.repository",
+                  "jakarta.data.spi"
                 };
     }
 
diff --git a/tck/src/main/resources/ee/jakarta/tck/data/framework/signature/jakarta.data.sig_17 b/tck/src/main/resources/ee/jakarta/tck/data/framework/signature/jakarta.data.sig_17
index 6c0d565a1..0c55dd733 100644
--- a/tck/src/main/resources/ee/jakarta/tck/data/framework/signature/jakarta.data.sig_17
+++ b/tck/src/main/resources/ee/jakarta/tck/data/framework/signature/jakarta.data.sig_17
@@ -31,6 +31,7 @@ meth public jakarta.data.page.PageRequest<{jakarta.data.Order%0}> pageSize(int)
 meth public java.lang.String toString()
 meth public java.util.Iterator<jakarta.data.Sort<? super {jakarta.data.Order%0}>> iterator()
 meth public java.util.List<jakarta.data.Sort<? super {jakarta.data.Order%0}>> sorts()
+meth public static <%0 extends java.lang.Object> jakarta.data.Order<{%%0}> by(java.util.List<jakarta.data.Sort<? super {%%0}>>)
 supr java.lang.Object
 hfds sorts
 
@@ -122,6 +123,42 @@ intf jakarta.data.metamodel.SortableAttribute<{jakarta.data.metamodel.TextAttrib
 meth public abstract jakarta.data.Sort<{jakarta.data.metamodel.TextAttribute%0}> ascIgnoreCase()
 meth public abstract jakarta.data.Sort<{jakarta.data.metamodel.TextAttribute%0}> descIgnoreCase()
 
+CLSS public final jakarta.data.metamodel.impl.AttributeRecord<%0 extends java.lang.Object>
+cons public init(java.lang.String)
+intf jakarta.data.metamodel.Attribute<{jakarta.data.metamodel.impl.AttributeRecord%0}>
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public java.lang.String name()
+supr java.lang.Record
+hfds name
+
+CLSS public final jakarta.data.metamodel.impl.SortableAttributeRecord<%0 extends java.lang.Object>
+cons public init(java.lang.String)
+intf jakarta.data.metamodel.SortableAttribute<{jakarta.data.metamodel.impl.SortableAttributeRecord%0}>
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.SortableAttributeRecord%0}> asc()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.SortableAttributeRecord%0}> desc()
+meth public java.lang.String name()
+supr java.lang.Record
+hfds name
+
+CLSS public final jakarta.data.metamodel.impl.TextAttributeRecord<%0 extends java.lang.Object>
+cons public init(java.lang.String)
+intf jakarta.data.metamodel.TextAttribute<{jakarta.data.metamodel.impl.TextAttributeRecord%0}>
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.TextAttributeRecord%0}> asc()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.TextAttributeRecord%0}> ascIgnoreCase()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.TextAttributeRecord%0}> desc()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.TextAttributeRecord%0}> descIgnoreCase()
+meth public java.lang.String name()
+supr java.lang.Record
+hfds name
+
 CLSS abstract interface jakarta.data.metamodel.package-info
 
 CLSS abstract interface jakarta.data.package-info
@@ -204,6 +241,59 @@ meth public static jakarta.data.page.PageRequest$Mode valueOf(java.lang.String)
 meth public static jakarta.data.page.PageRequest$Mode[] values()
 supr java.lang.Enum<jakarta.data.page.PageRequest$Mode>
 
+CLSS public final jakarta.data.page.impl.CursoredPageRecord<%0 extends java.lang.Object>
+cons public init(java.util.List<{jakarta.data.page.impl.CursoredPageRecord%0}>,java.util.List<jakarta.data.page.PageRequest$Cursor>,long,jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}>,boolean,boolean)
+cons public init(java.util.List<{jakarta.data.page.impl.CursoredPageRecord%0}>,java.util.List<jakarta.data.page.PageRequest$Cursor>,long,jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}>,jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}>,jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}>)
+intf jakarta.data.page.CursoredPage<{jakarta.data.page.impl.CursoredPageRecord%0}>
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> nextPageRequest(java.lang.Class<{%%0}>)
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> pageRequest(java.lang.Class<{%%0}>)
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> previousPageRequest(java.lang.Class<{%%0}>)
+meth public boolean hasContent()
+meth public boolean hasNext()
+meth public boolean hasPrevious()
+meth public boolean hasTotals()
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public int numberOfElements()
+meth public jakarta.data.page.PageRequest$Cursor cursor(int)
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}> nextPageRequest()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}> pageRequest()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}> previousPageRequest()
+meth public java.util.Iterator<{jakarta.data.page.impl.CursoredPageRecord%0}> iterator()
+meth public java.util.List<jakarta.data.page.PageRequest$Cursor> cursors()
+meth public java.util.List<{jakarta.data.page.impl.CursoredPageRecord%0}> content()
+meth public long totalElements()
+meth public long totalPages()
+supr java.lang.Record
+hfds content,cursors,nextPageRequest,pageRequest,previousPageRequest,totalElements
+
+CLSS public final jakarta.data.page.impl.PageRecord<%0 extends java.lang.Object>
+cons public init(jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}>,java.util.List<{jakarta.data.page.impl.PageRecord%0}>,long)
+cons public init(jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}>,java.util.List<{jakarta.data.page.impl.PageRecord%0}>,long,boolean)
+intf jakarta.data.page.Page<{jakarta.data.page.impl.PageRecord%0}>
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> nextPageRequest(java.lang.Class<{%%0}>)
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> pageRequest(java.lang.Class<{%%0}>)
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> previousPageRequest(java.lang.Class<{%%0}>)
+meth public boolean hasContent()
+meth public boolean hasNext()
+meth public boolean hasPrevious()
+meth public boolean hasTotals()
+meth public boolean moreResults()
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public int numberOfElements()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}> nextPageRequest()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}> pageRequest()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}> previousPageRequest()
+meth public java.util.Iterator<{jakarta.data.page.impl.PageRecord%0}> iterator()
+meth public java.util.List<{jakarta.data.page.impl.PageRecord%0}> content()
+meth public long totalElements()
+meth public long totalPages()
+supr java.lang.Record
+hfds content,moreResults,pageRequest,totalElements
+
 CLSS abstract interface jakarta.data.page.package-info
 
 CLSS public abstract interface jakarta.data.repository.BasicRepository<%0 extends java.lang.Object, %1 extends java.lang.Object>
@@ -228,7 +318,7 @@ meth public abstract void deleteById({jakarta.data.repository.BasicRepository%1}
 CLSS public abstract interface !annotation jakarta.data.repository.By
  anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
  anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER])
-fld public final static java.lang.String ID = "#id"
+fld public final static java.lang.String ID = "id(this)"
 intf java.lang.annotation.Annotation
 meth public abstract java.lang.String value()
 
diff --git a/tck/src/main/resources/ee/jakarta/tck/data/framework/signature/jakarta.data.sig_21 b/tck/src/main/resources/ee/jakarta/tck/data/framework/signature/jakarta.data.sig_21
index b8d345ce7..618c8ca37 100644
--- a/tck/src/main/resources/ee/jakarta/tck/data/framework/signature/jakarta.data.sig_21
+++ b/tck/src/main/resources/ee/jakarta/tck/data/framework/signature/jakarta.data.sig_21
@@ -31,6 +31,7 @@ meth public jakarta.data.page.PageRequest<{jakarta.data.Order%0}> pageSize(int)
 meth public java.lang.String toString()
 meth public java.util.Iterator<jakarta.data.Sort<? super {jakarta.data.Order%0}>> iterator()
 meth public java.util.List<jakarta.data.Sort<? super {jakarta.data.Order%0}>> sorts()
+meth public static <%0 extends java.lang.Object> jakarta.data.Order<{%%0}> by(java.util.List<jakarta.data.Sort<? super {%%0}>>)
 supr java.lang.Object
 hfds sorts
 
@@ -122,6 +123,42 @@ intf jakarta.data.metamodel.SortableAttribute<{jakarta.data.metamodel.TextAttrib
 meth public abstract jakarta.data.Sort<{jakarta.data.metamodel.TextAttribute%0}> ascIgnoreCase()
 meth public abstract jakarta.data.Sort<{jakarta.data.metamodel.TextAttribute%0}> descIgnoreCase()
 
+CLSS public final jakarta.data.metamodel.impl.AttributeRecord<%0 extends java.lang.Object>
+cons public init(java.lang.String)
+intf jakarta.data.metamodel.Attribute<{jakarta.data.metamodel.impl.AttributeRecord%0}>
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public java.lang.String name()
+supr java.lang.Record
+hfds name
+
+CLSS public final jakarta.data.metamodel.impl.SortableAttributeRecord<%0 extends java.lang.Object>
+cons public init(java.lang.String)
+intf jakarta.data.metamodel.SortableAttribute<{jakarta.data.metamodel.impl.SortableAttributeRecord%0}>
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.SortableAttributeRecord%0}> asc()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.SortableAttributeRecord%0}> desc()
+meth public java.lang.String name()
+supr java.lang.Record
+hfds name
+
+CLSS public final jakarta.data.metamodel.impl.TextAttributeRecord<%0 extends java.lang.Object>
+cons public init(java.lang.String)
+intf jakarta.data.metamodel.TextAttribute<{jakarta.data.metamodel.impl.TextAttributeRecord%0}>
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.TextAttributeRecord%0}> asc()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.TextAttributeRecord%0}> ascIgnoreCase()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.TextAttributeRecord%0}> desc()
+meth public jakarta.data.Sort<{jakarta.data.metamodel.impl.TextAttributeRecord%0}> descIgnoreCase()
+meth public java.lang.String name()
+supr java.lang.Record
+hfds name
+
 CLSS abstract interface jakarta.data.metamodel.package-info
 
 CLSS abstract interface jakarta.data.package-info
@@ -204,6 +241,59 @@ meth public static jakarta.data.page.PageRequest$Mode valueOf(java.lang.String)
 meth public static jakarta.data.page.PageRequest$Mode[] values()
 supr java.lang.Enum<jakarta.data.page.PageRequest$Mode>
 
+CLSS public final jakarta.data.page.impl.CursoredPageRecord<%0 extends java.lang.Object>
+cons public init(java.util.List<{jakarta.data.page.impl.CursoredPageRecord%0}>,java.util.List<jakarta.data.page.PageRequest$Cursor>,long,jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}>,boolean,boolean)
+cons public init(java.util.List<{jakarta.data.page.impl.CursoredPageRecord%0}>,java.util.List<jakarta.data.page.PageRequest$Cursor>,long,jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}>,jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}>,jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}>)
+intf jakarta.data.page.CursoredPage<{jakarta.data.page.impl.CursoredPageRecord%0}>
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> nextPageRequest(java.lang.Class<{%%0}>)
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> pageRequest(java.lang.Class<{%%0}>)
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> previousPageRequest(java.lang.Class<{%%0}>)
+meth public boolean hasContent()
+meth public boolean hasNext()
+meth public boolean hasPrevious()
+meth public boolean hasTotals()
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public int numberOfElements()
+meth public jakarta.data.page.PageRequest$Cursor cursor(int)
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}> nextPageRequest()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}> pageRequest()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.CursoredPageRecord%0}> previousPageRequest()
+meth public java.util.Iterator<{jakarta.data.page.impl.CursoredPageRecord%0}> iterator()
+meth public java.util.List<jakarta.data.page.PageRequest$Cursor> cursors()
+meth public java.util.List<{jakarta.data.page.impl.CursoredPageRecord%0}> content()
+meth public long totalElements()
+meth public long totalPages()
+supr java.lang.Record
+hfds content,cursors,nextPageRequest,pageRequest,previousPageRequest,totalElements
+
+CLSS public final jakarta.data.page.impl.PageRecord<%0 extends java.lang.Object>
+cons public init(jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}>,java.util.List<{jakarta.data.page.impl.PageRecord%0}>,long)
+cons public init(jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}>,java.util.List<{jakarta.data.page.impl.PageRecord%0}>,long,boolean)
+intf jakarta.data.page.Page<{jakarta.data.page.impl.PageRecord%0}>
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> nextPageRequest(java.lang.Class<{%%0}>)
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> pageRequest(java.lang.Class<{%%0}>)
+meth public <%0 extends java.lang.Object> jakarta.data.page.PageRequest<{%%0}> previousPageRequest(java.lang.Class<{%%0}>)
+meth public boolean hasContent()
+meth public boolean hasNext()
+meth public boolean hasPrevious()
+meth public boolean hasTotals()
+meth public boolean moreResults()
+meth public final boolean equals(java.lang.Object)
+meth public final int hashCode()
+meth public final java.lang.String toString()
+meth public int numberOfElements()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}> nextPageRequest()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}> pageRequest()
+meth public jakarta.data.page.PageRequest<{jakarta.data.page.impl.PageRecord%0}> previousPageRequest()
+meth public java.util.Iterator<{jakarta.data.page.impl.PageRecord%0}> iterator()
+meth public java.util.List<{jakarta.data.page.impl.PageRecord%0}> content()
+meth public long totalElements()
+meth public long totalPages()
+supr java.lang.Record
+hfds content,moreResults,pageRequest,totalElements
+
 CLSS abstract interface jakarta.data.page.package-info
 
 CLSS public abstract interface jakarta.data.repository.BasicRepository<%0 extends java.lang.Object, %1 extends java.lang.Object>
@@ -228,7 +318,7 @@ meth public abstract void deleteById({jakarta.data.repository.BasicRepository%1}
 CLSS public abstract interface !annotation jakarta.data.repository.By
  anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
  anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PARAMETER])
-fld public final static java.lang.String ID = "#id"
+fld public final static java.lang.String ID = "id(this)"
 intf java.lang.annotation.Annotation
 meth public abstract java.lang.String value()