Repository: kubernetes-sigs/kueue

Issue:
Internal cert-manager error via helm install
**What happened**:
If you install kueue via helm and use a name other than kueue for the helm installation then the controller manager will error on startup. The internal cert manager throws an error as there is a mismatch in the name of the secret that it is expecting.

**What you expected to happen**:
The controller manager should start up cleanly regardless of the helm installation name.

**How to reproduce it (as minimally and precisely as possible)**:
First run a helm install:
```
$ helm install test-kueue oci://registry.k8s.io/kueue/charts/kueue \
  --version=0.13.4 \
  --namespace  kueue-system \
  --create-namespace
```
The controller will error on startup and enter a CrashLoopBackOff.
```
 $ k logs deployments/test-kueue-controller-manager
...
{"level":"error","ts":"2025-09-16T20:06:18.915180898Z","logger":"setup","caller":"kueue/main.go:280","msg":"Could not run manager","error":"acquiring secret to update certificates: Secret \"kueue-webhook-server-cert\" not found","errorVerbose":"Secret \"kueue-webhook-server-cert\" not found\nacquiring secret to update certificates\ngithub.com/open-policy-agent/cert-controller/pkg/rotator.(*CertRotator).refreshCertIfNeeded.func1\n\t/workspace/vendor/github.com/open-policy-agent/cert-controller/pkg/rotator/rotator.go:331\nk8s.io/apimachinery/pkg/util/wait.runConditionWithCrashProtection\n\t/workspace/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:150\nk8s.io/apimachinery/pkg/util/wait.ExponentialBackoff\n\t/workspace/vendor/k8s.io/apimachinery/pkg/util/wait/backoff.go:477\ngithub.com/open-policy-agent/cert-controller/pkg/rotator.(*CertRotator).refreshCertIfNeeded\n\t/workspace/vendor/github.com/open-policy-agent/cert-controller/pkg/rotator/rotator.go:364\ngithub.com/open-policy-agent/cert-controller/pkg/rotator.(*CertRotator).Start\n\t/workspace/vendor/github.com/open-policy-agent/cert-controller/pkg/rotator/rotator.go:292\nsigs.k8s.io/controller-runtime/pkg/manager.(*runnableGroup).reconcile.func1\n\t/workspace/vendor/sigs.k8s.io/controller-runtime/pkg/manager/runnable_group.go:226\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_arm64.s:1223","stacktrace":"main.main\n\t/workspace/cmd/kueue/main.go:280\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:283"}
```
The secret that is created does match the name of the helm installation. The controller is expecting to find `kueue-webhook-server-cert` instead of `test-kueue-webhook-server-cert`.
```
$ k get secret test-kueue-webhook-server-cert
NAME                             TYPE     DATA   AGE
test-kueue-webhook-server-cert   Opaque   0      3m58s
```

**Anything else we need to know?**:

**Environment**:
- Kubernetes version (use `kubectl version`): v1.32.7
- Kueue version: 0.13.4 
- Install tools: helm

Hints from issue comments:

Solution patch:
diff --git a/apis/config/v1beta1/configuration_types.go b/apis/config/v1beta1/configuration_types.go
index 7550bc641..2ab541f80 100644
--- a/apis/config/v1beta1/configuration_types.go
+++ b/apis/config/v1beta1/configuration_types.go
@@ -450,6 +450,11 @@ type Resources struct {
 	// Transformations defines how to transform PodSpec resources into Workload resource requests.
 	// This is intended to be a map with Input as the key (enforced by validation code)
 	Transformations []ResourceTransformation `json:"transformations,omitempty"`
+
+	// DeviceClassMappings defines mappings from device classes to logical resources
+	// for Dynamic Resource Allocation support.
+	// +optional
+	DeviceClassMappings []DeviceClassMapping `json:"deviceClassMappings,omitempty"`
 }
 
 type ResourceTransformationStrategy string
@@ -470,6 +475,28 @@ type ResourceTransformation struct {
 	Outputs corev1.ResourceList `json:"outputs,omitempty"`
 }
 
+// DeviceClassMapping holds device class to logical resource mappings
+// for Dynamic Resource Allocation support.
+type DeviceClassMapping struct {
+	// Name is referenced in ClusterQueue.nominalQuota and Workload status.
+	// Must be a valid fully qualified name consisting of an optional DNS subdomain prefix
+	// followed by a slash and a DNS label, or just a DNS label.
+	// DNS labels consist of lower-case alphanumeric characters or hyphens,
+	// and must start and end with an alphanumeric character.
+	// DNS subdomain prefixes follow the same rules as DNS labels but can contain periods.
+	// The total length must not exceed 253 characters.
+	Name corev1.ResourceName `json:"name"`
+
+	// DeviceClassNames enumerates the DeviceClasses represented by this resource name.
+	// Each device class name must be a valid qualified name consisting of an optional DNS subdomain prefix
+	// followed by a slash and a DNS label, or just a DNS label.
+	// DNS labels consist of lower-case alphanumeric characters or hyphens,
+	// and must start and end with an alphanumeric character.
+	// DNS subdomain prefixes follow the same rules as DNS labels but can contain periods.
+	// The total length of each name must not exceed 253 characters.
+	DeviceClassNames []corev1.ResourceName `json:"deviceClassNames"`
+}
+
 type PreemptionStrategy string
 
 const (
diff --git a/apis/config/v1beta1/zz_generated.deepcopy.go b/apis/config/v1beta1/zz_generated.deepcopy.go
index 3a561c392..d09086a1b 100644
--- a/apis/config/v1beta1/zz_generated.deepcopy.go
+++ b/apis/config/v1beta1/zz_generated.deepcopy.go
@@ -289,6 +289,26 @@ func (in *ControllerWebhook) DeepCopy() *ControllerWebhook {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DeviceClassMapping) DeepCopyInto(out *DeviceClassMapping) {
+	*out = *in
+	if in.DeviceClassNames != nil {
+		in, out := &in.DeviceClassNames, &out.DeviceClassNames
+		*out = make([]corev1.ResourceName, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeviceClassMapping.
+func (in *DeviceClassMapping) DeepCopy() *DeviceClassMapping {
+	if in == nil {
+		return nil
+	}
+	out := new(DeviceClassMapping)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *FairSharing) DeepCopyInto(out *FairSharing) {
 	*out = *in
@@ -551,6 +571,13 @@ func (in *Resources) DeepCopyInto(out *Resources) {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
 	}
+	if in.DeviceClassMappings != nil {
+		in, out := &in.DeviceClassMappings, &out.DeviceClassMappings
+		*out = make([]DeviceClassMapping, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Resources.
diff --git a/apis/kueue/v1alpha1/zz_generated.deepcopy.go b/apis/kueue/v1alpha1/zz_generated.deepcopy.go
deleted file mode 100644
index 0cef26ec5..000000000
--- a/apis/kueue/v1alpha1/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,118 +0,0 @@
-//go:build !ignore_autogenerated
-
-/*
-Copyright The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-// Code generated by controller-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	runtime "k8s.io/apimachinery/pkg/runtime"
-)
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Topology) DeepCopyInto(out *Topology) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Spec.DeepCopyInto(&out.Spec)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Topology.
-func (in *Topology) DeepCopy() *Topology {
-	if in == nil {
-		return nil
-	}
-	out := new(Topology)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Topology) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TopologyLevel) DeepCopyInto(out *TopologyLevel) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologyLevel.
-func (in *TopologyLevel) DeepCopy() *TopologyLevel {
-	if in == nil {
-		return nil
-	}
-	out := new(TopologyLevel)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TopologyList) DeepCopyInto(out *TopologyList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ListMeta.DeepCopyInto(&out.ListMeta)
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]Topology, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologyList.
-func (in *TopologyList) DeepCopy() *TopologyList {
-	if in == nil {
-		return nil
-	}
-	out := new(TopologyList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *TopologyList) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *TopologySpec) DeepCopyInto(out *TopologySpec) {
-	*out = *in
-	if in.Levels != nil {
-		in, out := &in.Levels, &out.Levels
-		*out = make([]TopologyLevel, len(*in))
-		copy(*out, *in)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologySpec.
-func (in *TopologySpec) DeepCopy() *TopologySpec {
-	if in == nil {
-		return nil
-	}
-	out := new(TopologySpec)
-	in.DeepCopyInto(out)
-	return out
-}
diff --git a/apis/kueue/v1alpha1/topology_types.go b/apis/kueue/v1beta1/topology_types.go
similarity index 97%
rename from apis/kueue/v1alpha1/topology_types.go
rename to apis/kueue/v1beta1/topology_types.go
index 6df22abe5..09fdbe868 100644
--- a/apis/kueue/v1alpha1/topology_types.go
+++ b/apis/kueue/v1beta1/topology_types.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1alpha1
+package v1beta1
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -74,6 +74,8 @@ const (
 	// PodSet is admitted using TopologyAwareScheduling, and all Pods created
 	// from the Job's PodTemplate also have the label. For the Pod-based
 	// integrations the label is added in webhook during the Pod creation.
+	// Depracted. This label is no longer added by TAS to Pod. The constant is
+	// only kept to support "reading" the label until 0.16.
 	TASLabel = "kueue.x-k8s.io/tas"
 
 	// PodGroupPodIndexLabel is a label set on the Pod's metadata belonging
diff --git a/apis/kueue/v1beta1/zz_generated.deepcopy.go b/apis/kueue/v1beta1/zz_generated.deepcopy.go
index 6a6454fa6..ab9a6019f 100644
--- a/apis/kueue/v1beta1/zz_generated.deepcopy.go
+++ b/apis/kueue/v1beta1/zz_generated.deepcopy.go
@@ -1707,6 +1707,32 @@ func (in *SchedulingStats) DeepCopy() *SchedulingStats {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Topology) DeepCopyInto(out *Topology) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Topology.
+func (in *Topology) DeepCopy() *Topology {
+	if in == nil {
+		return nil
+	}
+	out := new(Topology)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Topology) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *TopologyAssignment) DeepCopyInto(out *TopologyAssignment) {
 	*out = *in
@@ -1774,6 +1800,73 @@ func (in *TopologyInfo) DeepCopy() *TopologyInfo {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TopologyLevel) DeepCopyInto(out *TopologyLevel) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologyLevel.
+func (in *TopologyLevel) DeepCopy() *TopologyLevel {
+	if in == nil {
+		return nil
+	}
+	out := new(TopologyLevel)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TopologyList) DeepCopyInto(out *TopologyList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Topology, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologyList.
+func (in *TopologyList) DeepCopy() *TopologyList {
+	if in == nil {
+		return nil
+	}
+	out := new(TopologyList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *TopologyList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *TopologySpec) DeepCopyInto(out *TopologySpec) {
+	*out = *in
+	if in.Levels != nil {
+		in, out := &in.Levels, &out.Levels
+		*out = make([]TopologyLevel, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologySpec.
+func (in *TopologySpec) DeepCopy() *TopologySpec {
+	if in == nil {
+		return nil
+	}
+	out := new(TopologySpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *UnhealthyNode) DeepCopyInto(out *UnhealthyNode) {
 	*out = *in
diff --git a/charts/kueue/templates/crd/kueue.x-k8s.io_topologies.yaml b/charts/kueue/templates/crd/kueue.x-k8s.io_topologies.yaml
index bd01f335f..624a3ba2c 100644
--- a/charts/kueue/templates/crd/kueue.x-k8s.io_topologies.yaml
+++ b/charts/kueue/templates/crd/kueue.x-k8s.io_topologies.yaml
@@ -30,7 +30,7 @@ spec:
     singular: topology
   scope: Cluster
   versions:
-    - name: v1alpha1
+    - name: v1beta1
       schema:
         openAPIV3Schema:
           description: Topology is the Schema for the topology API
diff --git a/charts/kueue/templates/manager/manager-config.yaml b/charts/kueue/templates/manager/manager-config.yaml
index bd34932ef..39440ea0e 100644
--- a/charts/kueue/templates/manager/manager-config.yaml
+++ b/charts/kueue/templates/manager/manager-config.yaml
@@ -6,4 +6,15 @@ metadata:
   labels:
   {{- include "kueue.labels" . | nindent 4 }}
 data:
-  controller_manager_config.yaml: {{ .Values.managerConfig.controllerManagerConfigYaml | toYaml | indent 1 }}
+  controller_manager_config.yaml: |
+{{- $config := .Values.managerConfig.controllerManagerConfigYaml | fromYaml }}
+{{- if not .Values.enableCertManager }}
+  {{- $defaultInternalCert := dict
+        "enable" true
+        "webhookServiceName" (printf "%s-webhook-service" (include "kueue.fullname" .))
+        "webhookSecretName" (printf "%s-webhook-server-cert" (include "kueue.fullname" .)) }}
+  {{- if not $config.internalCertManagement }}
+    {{- $_ := set $config "internalCertManagement" $defaultInternalCert }}
+  {{- end }}
+{{- end }}
+{{ $config | toYaml | indent 4 }}
diff --git a/charts/kueue/templates/rbac/role.yaml b/charts/kueue/templates/rbac/role.yaml
index 1dd7bb729..4687db6fa 100644
--- a/charts/kueue/templates/rbac/role.yaml
+++ b/charts/kueue/templates/rbac/role.yaml
@@ -334,6 +334,15 @@ rules:
       - get
       - patch
       - update
+  - apiGroups:
+      - resource.k8s.io
+    resources:
+      - resourceclaims
+      - resourceclaimtemplates
+    verbs:
+      - get
+      - list
+      - watch
   - apiGroups:
       - scheduling.k8s.io
     resources:
diff --git a/client-go/applyconfiguration/kueue/v1alpha1/topology.go b/client-go/applyconfiguration/kueue/v1beta1/topology.go
similarity index 99%
rename from client-go/applyconfiguration/kueue/v1alpha1/topology.go
rename to client-go/applyconfiguration/kueue/v1beta1/topology.go
index 7decdccea..d93b16bcb 100644
--- a/client-go/applyconfiguration/kueue/v1alpha1/topology.go
+++ b/client-go/applyconfiguration/kueue/v1beta1/topology.go
@@ -15,7 +15,7 @@ limitations under the License.
 */
 // Code generated by applyconfiguration-gen. DO NOT EDIT.
 
-package v1alpha1
+package v1beta1
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -37,7 +37,7 @@ func Topology(name string) *TopologyApplyConfiguration {
 	b := &TopologyApplyConfiguration{}
 	b.WithName(name)
 	b.WithKind("Topology")
-	b.WithAPIVersion("kueue.x-k8s.io/v1alpha1")
+	b.WithAPIVersion("kueue.x-k8s.io/v1beta1")
 	return b
 }
 func (b TopologyApplyConfiguration) IsApplyConfiguration() {}
diff --git a/client-go/applyconfiguration/kueue/v1alpha1/topologylevel.go b/client-go/applyconfiguration/kueue/v1beta1/topologylevel.go
similarity index 98%
rename from client-go/applyconfiguration/kueue/v1alpha1/topologylevel.go
rename to client-go/applyconfiguration/kueue/v1beta1/topologylevel.go
index 00f627b67..119f011a2 100644
--- a/client-go/applyconfiguration/kueue/v1alpha1/topologylevel.go
+++ b/client-go/applyconfiguration/kueue/v1beta1/topologylevel.go
@@ -15,7 +15,7 @@ limitations under the License.
 */
 // Code generated by applyconfiguration-gen. DO NOT EDIT.
 
-package v1alpha1
+package v1beta1
 
 // TopologyLevelApplyConfiguration represents a declarative configuration of the TopologyLevel type for use
 // with apply.
diff --git a/client-go/applyconfiguration/kueue/v1alpha1/topologyspec.go b/client-go/applyconfiguration/kueue/v1beta1/topologyspec.go
similarity index 98%
rename from client-go/applyconfiguration/kueue/v1alpha1/topologyspec.go
rename to client-go/applyconfiguration/kueue/v1beta1/topologyspec.go
index c2a1c1cfd..d87e75990 100644
--- a/client-go/applyconfiguration/kueue/v1alpha1/topologyspec.go
+++ b/client-go/applyconfiguration/kueue/v1beta1/topologyspec.go
@@ -15,7 +15,7 @@ limitations under the License.
 */
 // Code generated by applyconfiguration-gen. DO NOT EDIT.
 
-package v1alpha1
+package v1beta1
 
 // TopologySpecApplyConfiguration represents a declarative configuration of the TopologySpec type for use
 // with apply.
diff --git a/client-go/applyconfiguration/utils.go b/client-go/applyconfiguration/utils.go
index 58182269b..eacb72d0d 100644
--- a/client-go/applyconfiguration/utils.go
+++ b/client-go/applyconfiguration/utils.go
@@ -21,11 +21,9 @@ import (
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	managedfields "k8s.io/apimachinery/pkg/util/managedfields"
-	v1alpha1 "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	v1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	visibilityv1beta1 "sigs.k8s.io/kueue/apis/visibility/v1beta1"
 	internal "sigs.k8s.io/kueue/client-go/applyconfiguration/internal"
-	kueuev1alpha1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1alpha1"
 	kueuev1beta1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1beta1"
 	applyconfigurationvisibilityv1beta1 "sigs.k8s.io/kueue/client-go/applyconfiguration/visibility/v1beta1"
 )
@@ -34,15 +32,7 @@ import (
 // apply configuration type exists for the given GroupVersionKind.
 func ForKind(kind schema.GroupVersionKind) interface{} {
 	switch kind {
-	// Group=kueue.x-k8s.io, Version=v1alpha1
-	case v1alpha1.SchemeGroupVersion.WithKind("Topology"):
-		return &kueuev1alpha1.TopologyApplyConfiguration{}
-	case v1alpha1.SchemeGroupVersion.WithKind("TopologyLevel"):
-		return &kueuev1alpha1.TopologyLevelApplyConfiguration{}
-	case v1alpha1.SchemeGroupVersion.WithKind("TopologySpec"):
-		return &kueuev1alpha1.TopologySpecApplyConfiguration{}
-
-		// Group=kueue.x-k8s.io, Version=v1beta1
+	// Group=kueue.x-k8s.io, Version=v1beta1
 	case v1beta1.SchemeGroupVersion.WithKind("Admission"):
 		return &kueuev1beta1.AdmissionApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("AdmissionCheck"):
@@ -153,12 +143,18 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
 		return &kueuev1beta1.ResourceUsageApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("SchedulingStats"):
 		return &kueuev1beta1.SchedulingStatsApplyConfiguration{}
+	case v1beta1.SchemeGroupVersion.WithKind("Topology"):
+		return &kueuev1beta1.TopologyApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("TopologyAssignment"):
 		return &kueuev1beta1.TopologyAssignmentApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("TopologyDomainAssignment"):
 		return &kueuev1beta1.TopologyDomainAssignmentApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("TopologyInfo"):
 		return &kueuev1beta1.TopologyInfoApplyConfiguration{}
+	case v1beta1.SchemeGroupVersion.WithKind("TopologyLevel"):
+		return &kueuev1beta1.TopologyLevelApplyConfiguration{}
+	case v1beta1.SchemeGroupVersion.WithKind("TopologySpec"):
+		return &kueuev1beta1.TopologySpecApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("UnhealthyNode"):
 		return &kueuev1beta1.UnhealthyNodeApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("Workload"):
diff --git a/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_kueue_client.go b/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_kueue_client.go
index c06a43ff2..68596e950 100644
--- a/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_kueue_client.go
+++ b/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_kueue_client.go
@@ -20,17 +20,12 @@ package fake
 import (
 	rest "k8s.io/client-go/rest"
 	testing "k8s.io/client-go/testing"
-	v1alpha1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/kueue/v1alpha1"
 )
 
 type FakeKueueV1alpha1 struct {
 	*testing.Fake
 }
 
-func (c *FakeKueueV1alpha1) Topologies() v1alpha1.TopologyInterface {
-	return newFakeTopologies(c)
-}
-
 // RESTClient returns a RESTClient that is used to communicate
 // with API server by this client implementation.
 func (c *FakeKueueV1alpha1) RESTClient() rest.Interface {
diff --git a/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_topology.go b/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_topology.go
deleted file mode 100644
index 868c64a25..000000000
--- a/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_topology.go
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-// Code generated by client-gen. DO NOT EDIT.
-
-package fake
-
-import (
-	gentype "k8s.io/client-go/gentype"
-	v1alpha1 "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
-	kueuev1alpha1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1alpha1"
-	typedkueuev1alpha1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/kueue/v1alpha1"
-)
-
-// fakeTopologies implements TopologyInterface
-type fakeTopologies struct {
-	*gentype.FakeClientWithListAndApply[*v1alpha1.Topology, *v1alpha1.TopologyList, *kueuev1alpha1.TopologyApplyConfiguration]
-	Fake *FakeKueueV1alpha1
-}
-
-func newFakeTopologies(fake *FakeKueueV1alpha1) typedkueuev1alpha1.TopologyInterface {
-	return &fakeTopologies{
-		gentype.NewFakeClientWithListAndApply[*v1alpha1.Topology, *v1alpha1.TopologyList, *kueuev1alpha1.TopologyApplyConfiguration](
-			fake.Fake,
-			"",
-			v1alpha1.SchemeGroupVersion.WithResource("topologies"),
-			v1alpha1.SchemeGroupVersion.WithKind("Topology"),
-			func() *v1alpha1.Topology { return &v1alpha1.Topology{} },
-			func() *v1alpha1.TopologyList { return &v1alpha1.TopologyList{} },
-			func(dst, src *v1alpha1.TopologyList) { dst.ListMeta = src.ListMeta },
-			func(list *v1alpha1.TopologyList) []*v1alpha1.Topology { return gentype.ToPointerSlice(list.Items) },
-			func(list *v1alpha1.TopologyList, items []*v1alpha1.Topology) {
-				list.Items = gentype.FromPointerSlice(items)
-			},
-		),
-		fake,
-	}
-}
diff --git a/client-go/clientset/versioned/typed/kueue/v1alpha1/generated_expansion.go b/client-go/clientset/versioned/typed/kueue/v1alpha1/generated_expansion.go
index 6601341f1..5f6c8d4e0 100644
--- a/client-go/clientset/versioned/typed/kueue/v1alpha1/generated_expansion.go
+++ b/client-go/clientset/versioned/typed/kueue/v1alpha1/generated_expansion.go
@@ -16,5 +16,3 @@ limitations under the License.
 // Code generated by client-gen. DO NOT EDIT.
 
 package v1alpha1
-
-type TopologyExpansion interface{}
diff --git a/client-go/clientset/versioned/typed/kueue/v1alpha1/kueue_client.go b/client-go/clientset/versioned/typed/kueue/v1alpha1/kueue_client.go
index b5f9ecdd8..627a8bbeb 100644
--- a/client-go/clientset/versioned/typed/kueue/v1alpha1/kueue_client.go
+++ b/client-go/clientset/versioned/typed/kueue/v1alpha1/kueue_client.go
@@ -27,7 +27,6 @@ import (
 
 type KueueV1alpha1Interface interface {
 	RESTClient() rest.Interface
-	TopologiesGetter
 }
 
 // KueueV1alpha1Client is used to interact with features provided by the kueue.x-k8s.io group.
@@ -35,10 +34,6 @@ type KueueV1alpha1Client struct {
 	restClient rest.Interface
 }
 
-func (c *KueueV1alpha1Client) Topologies() TopologyInterface {
-	return newTopologies(c)
-}
-
 // NewForConfig creates a new KueueV1alpha1Client for the given config.
 // NewForConfig is equivalent to NewForConfigAndClient(c, httpClient),
 // where httpClient was generated with rest.HTTPClientFor(c).
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_kueue_client.go b/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_kueue_client.go
index decc402b8..dd159b6f0 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_kueue_client.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_kueue_client.go
@@ -59,6 +59,10 @@ func (c *FakeKueueV1beta1) ResourceFlavors() v1beta1.ResourceFlavorInterface {
 	return newFakeResourceFlavors(c)
 }
 
+func (c *FakeKueueV1beta1) Topologies() v1beta1.TopologyInterface {
+	return newFakeTopologies(c)
+}
+
 func (c *FakeKueueV1beta1) Workloads(namespace string) v1beta1.WorkloadInterface {
 	return newFakeWorkloads(c, namespace)
 }
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_topology.go b/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_topology.go
new file mode 100644
index 000000000..2a642a746
--- /dev/null
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_topology.go
@@ -0,0 +1,50 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	gentype "k8s.io/client-go/gentype"
+	v1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	kueuev1beta1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1beta1"
+	typedkueuev1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/kueue/v1beta1"
+)
+
+// fakeTopologies implements TopologyInterface
+type fakeTopologies struct {
+	*gentype.FakeClientWithListAndApply[*v1beta1.Topology, *v1beta1.TopologyList, *kueuev1beta1.TopologyApplyConfiguration]
+	Fake *FakeKueueV1beta1
+}
+
+func newFakeTopologies(fake *FakeKueueV1beta1) typedkueuev1beta1.TopologyInterface {
+	return &fakeTopologies{
+		gentype.NewFakeClientWithListAndApply[*v1beta1.Topology, *v1beta1.TopologyList, *kueuev1beta1.TopologyApplyConfiguration](
+			fake.Fake,
+			"",
+			v1beta1.SchemeGroupVersion.WithResource("topologies"),
+			v1beta1.SchemeGroupVersion.WithKind("Topology"),
+			func() *v1beta1.Topology { return &v1beta1.Topology{} },
+			func() *v1beta1.TopologyList { return &v1beta1.TopologyList{} },
+			func(dst, src *v1beta1.TopologyList) { dst.ListMeta = src.ListMeta },
+			func(list *v1beta1.TopologyList) []*v1beta1.Topology { return gentype.ToPointerSlice(list.Items) },
+			func(list *v1beta1.TopologyList, items []*v1beta1.Topology) {
+				list.Items = gentype.FromPointerSlice(items)
+			},
+		),
+		fake,
+	}
+}
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta1/generated_expansion.go b/client-go/clientset/versioned/typed/kueue/v1beta1/generated_expansion.go
index cdf585c2d..77c5d4fc4 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta1/generated_expansion.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/generated_expansion.go
@@ -33,6 +33,8 @@ type ProvisioningRequestConfigExpansion interface{}
 
 type ResourceFlavorExpansion interface{}
 
+type TopologyExpansion interface{}
+
 type WorkloadExpansion interface{}
 
 type WorkloadPriorityClassExpansion interface{}
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta1/kueue_client.go b/client-go/clientset/versioned/typed/kueue/v1beta1/kueue_client.go
index ebc3912a1..a8653da25 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta1/kueue_client.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/kueue_client.go
@@ -35,6 +35,7 @@ type KueueV1beta1Interface interface {
 	MultiKueueConfigsGetter
 	ProvisioningRequestConfigsGetter
 	ResourceFlavorsGetter
+	TopologiesGetter
 	WorkloadsGetter
 	WorkloadPriorityClassesGetter
 }
@@ -76,6 +77,10 @@ func (c *KueueV1beta1Client) ResourceFlavors() ResourceFlavorInterface {
 	return newResourceFlavors(c)
 }
 
+func (c *KueueV1beta1Client) Topologies() TopologyInterface {
+	return newTopologies(c)
+}
+
 func (c *KueueV1beta1Client) Workloads(namespace string) WorkloadInterface {
 	return newWorkloads(c, namespace)
 }
diff --git a/client-go/clientset/versioned/typed/kueue/v1alpha1/topology.go b/client-go/clientset/versioned/typed/kueue/v1beta1/topology.go
similarity index 59%
rename from client-go/clientset/versioned/typed/kueue/v1alpha1/topology.go
rename to client-go/clientset/versioned/typed/kueue/v1beta1/topology.go
index bb326485f..23994bd84 100644
--- a/client-go/clientset/versioned/typed/kueue/v1alpha1/topology.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/topology.go
@@ -15,7 +15,7 @@ limitations under the License.
 */
 // Code generated by client-gen. DO NOT EDIT.
 
-package v1alpha1
+package v1beta1
 
 import (
 	context "context"
@@ -24,8 +24,8 @@ import (
 	types "k8s.io/apimachinery/pkg/types"
 	watch "k8s.io/apimachinery/pkg/watch"
 	gentype "k8s.io/client-go/gentype"
-	kueuev1alpha1 "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
-	applyconfigurationkueuev1alpha1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1alpha1"
+	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	applyconfigurationkueuev1beta1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1beta1"
 	scheme "sigs.k8s.io/kueue/client-go/clientset/versioned/scheme"
 )
 
@@ -37,33 +37,33 @@ type TopologiesGetter interface {
 
 // TopologyInterface has methods to work with Topology resources.
 type TopologyInterface interface {
-	Create(ctx context.Context, topology *kueuev1alpha1.Topology, opts v1.CreateOptions) (*kueuev1alpha1.Topology, error)
-	Update(ctx context.Context, topology *kueuev1alpha1.Topology, opts v1.UpdateOptions) (*kueuev1alpha1.Topology, error)
+	Create(ctx context.Context, topology *kueuev1beta1.Topology, opts v1.CreateOptions) (*kueuev1beta1.Topology, error)
+	Update(ctx context.Context, topology *kueuev1beta1.Topology, opts v1.UpdateOptions) (*kueuev1beta1.Topology, error)
 	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
 	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
-	Get(ctx context.Context, name string, opts v1.GetOptions) (*kueuev1alpha1.Topology, error)
-	List(ctx context.Context, opts v1.ListOptions) (*kueuev1alpha1.TopologyList, error)
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*kueuev1beta1.Topology, error)
+	List(ctx context.Context, opts v1.ListOptions) (*kueuev1beta1.TopologyList, error)
 	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
-	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *kueuev1alpha1.Topology, err error)
-	Apply(ctx context.Context, topology *applyconfigurationkueuev1alpha1.TopologyApplyConfiguration, opts v1.ApplyOptions) (result *kueuev1alpha1.Topology, err error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *kueuev1beta1.Topology, err error)
+	Apply(ctx context.Context, topology *applyconfigurationkueuev1beta1.TopologyApplyConfiguration, opts v1.ApplyOptions) (result *kueuev1beta1.Topology, err error)
 	TopologyExpansion
 }
 
 // topologies implements TopologyInterface
 type topologies struct {
-	*gentype.ClientWithListAndApply[*kueuev1alpha1.Topology, *kueuev1alpha1.TopologyList, *applyconfigurationkueuev1alpha1.TopologyApplyConfiguration]
+	*gentype.ClientWithListAndApply[*kueuev1beta1.Topology, *kueuev1beta1.TopologyList, *applyconfigurationkueuev1beta1.TopologyApplyConfiguration]
 }
 
 // newTopologies returns a Topologies
-func newTopologies(c *KueueV1alpha1Client) *topologies {
+func newTopologies(c *KueueV1beta1Client) *topologies {
 	return &topologies{
-		gentype.NewClientWithListAndApply[*kueuev1alpha1.Topology, *kueuev1alpha1.TopologyList, *applyconfigurationkueuev1alpha1.TopologyApplyConfiguration](
+		gentype.NewClientWithListAndApply[*kueuev1beta1.Topology, *kueuev1beta1.TopologyList, *applyconfigurationkueuev1beta1.TopologyApplyConfiguration](
 			"topologies",
 			c.RESTClient(),
 			scheme.ParameterCodec,
 			"",
-			func() *kueuev1alpha1.Topology { return &kueuev1alpha1.Topology{} },
-			func() *kueuev1alpha1.TopologyList { return &kueuev1alpha1.TopologyList{} },
+			func() *kueuev1beta1.Topology { return &kueuev1beta1.Topology{} },
+			func() *kueuev1beta1.TopologyList { return &kueuev1beta1.TopologyList{} },
 		),
 	}
 }
diff --git a/client-go/informers/externalversions/generic.go b/client-go/informers/externalversions/generic.go
index 6c90e99c4..4eaa59ea5 100644
--- a/client-go/informers/externalversions/generic.go
+++ b/client-go/informers/externalversions/generic.go
@@ -22,7 +22,6 @@ import (
 
 	schema "k8s.io/apimachinery/pkg/runtime/schema"
 	cache "k8s.io/client-go/tools/cache"
-	v1alpha1 "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	v1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	visibilityv1beta1 "sigs.k8s.io/kueue/apis/visibility/v1beta1"
 )
@@ -53,11 +52,7 @@ func (f *genericInformer) Lister() cache.GenericLister {
 // TODO extend this to unknown resources with a client pool
 func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
 	switch resource {
-	// Group=kueue.x-k8s.io, Version=v1alpha1
-	case v1alpha1.SchemeGroupVersion.WithResource("topologies"):
-		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1alpha1().Topologies().Informer()}, nil
-
-		// Group=kueue.x-k8s.io, Version=v1beta1
+	// Group=kueue.x-k8s.io, Version=v1beta1
 	case v1beta1.SchemeGroupVersion.WithResource("admissionchecks"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().AdmissionChecks().Informer()}, nil
 	case v1beta1.SchemeGroupVersion.WithResource("clusterqueues"):
@@ -74,6 +69,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().ProvisioningRequestConfigs().Informer()}, nil
 	case v1beta1.SchemeGroupVersion.WithResource("resourceflavors"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().ResourceFlavors().Informer()}, nil
+	case v1beta1.SchemeGroupVersion.WithResource("topologies"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().Topologies().Informer()}, nil
 	case v1beta1.SchemeGroupVersion.WithResource("workloads"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().Workloads().Informer()}, nil
 	case v1beta1.SchemeGroupVersion.WithResource("workloadpriorityclasses"):
diff --git a/client-go/informers/externalversions/kueue/interface.go b/client-go/informers/externalversions/kueue/interface.go
index 7f89811e1..28943b8c6 100644
--- a/client-go/informers/externalversions/kueue/interface.go
+++ b/client-go/informers/externalversions/kueue/interface.go
@@ -19,14 +19,11 @@ package kueue
 
 import (
 	internalinterfaces "sigs.k8s.io/kueue/client-go/informers/externalversions/internalinterfaces"
-	v1alpha1 "sigs.k8s.io/kueue/client-go/informers/externalversions/kueue/v1alpha1"
 	v1beta1 "sigs.k8s.io/kueue/client-go/informers/externalversions/kueue/v1beta1"
 )
 
 // Interface provides access to each of this group's versions.
 type Interface interface {
-	// V1alpha1 provides access to shared informers for resources in V1alpha1.
-	V1alpha1() v1alpha1.Interface
 	// V1beta1 provides access to shared informers for resources in V1beta1.
 	V1beta1() v1beta1.Interface
 }
@@ -42,11 +39,6 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList
 	return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
 }
 
-// V1alpha1 returns a new v1alpha1.Interface.
-func (g *group) V1alpha1() v1alpha1.Interface {
-	return v1alpha1.New(g.factory, g.namespace, g.tweakListOptions)
-}
-
 // V1beta1 returns a new v1beta1.Interface.
 func (g *group) V1beta1() v1beta1.Interface {
 	return v1beta1.New(g.factory, g.namespace, g.tweakListOptions)
diff --git a/client-go/informers/externalversions/kueue/v1alpha1/interface.go b/client-go/informers/externalversions/kueue/v1alpha1/interface.go
deleted file mode 100644
index aebd35f5b..000000000
--- a/client-go/informers/externalversions/kueue/v1alpha1/interface.go
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-// Code generated by informer-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	internalinterfaces "sigs.k8s.io/kueue/client-go/informers/externalversions/internalinterfaces"
-)
-
-// Interface provides access to all the informers in this group version.
-type Interface interface {
-	// Topologies returns a TopologyInformer.
-	Topologies() TopologyInformer
-}
-
-type version struct {
-	factory          internalinterfaces.SharedInformerFactory
-	namespace        string
-	tweakListOptions internalinterfaces.TweakListOptionsFunc
-}
-
-// New returns a new Interface.
-func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
-	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
-}
-
-// Topologies returns a TopologyInformer.
-func (v *version) Topologies() TopologyInformer {
-	return &topologyInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
-}
diff --git a/client-go/informers/externalversions/kueue/v1beta1/interface.go b/client-go/informers/externalversions/kueue/v1beta1/interface.go
index edfcb4742..e0882502d 100644
--- a/client-go/informers/externalversions/kueue/v1beta1/interface.go
+++ b/client-go/informers/externalversions/kueue/v1beta1/interface.go
@@ -39,6 +39,8 @@ type Interface interface {
 	ProvisioningRequestConfigs() ProvisioningRequestConfigInformer
 	// ResourceFlavors returns a ResourceFlavorInformer.
 	ResourceFlavors() ResourceFlavorInformer
+	// Topologies returns a TopologyInformer.
+	Topologies() TopologyInformer
 	// Workloads returns a WorkloadInformer.
 	Workloads() WorkloadInformer
 	// WorkloadPriorityClasses returns a WorkloadPriorityClassInformer.
@@ -96,6 +98,11 @@ func (v *version) ResourceFlavors() ResourceFlavorInformer {
 	return &resourceFlavorInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
 }
 
+// Topologies returns a TopologyInformer.
+func (v *version) Topologies() TopologyInformer {
+	return &topologyInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
+}
+
 // Workloads returns a WorkloadInformer.
 func (v *version) Workloads() WorkloadInformer {
 	return &workloadInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
diff --git a/client-go/informers/externalversions/kueue/v1alpha1/topology.go b/client-go/informers/externalversions/kueue/v1beta1/topology.go
similarity index 82%
rename from client-go/informers/externalversions/kueue/v1alpha1/topology.go
rename to client-go/informers/externalversions/kueue/v1beta1/topology.go
index eb63ca7f0..68bfd09cd 100644
--- a/client-go/informers/externalversions/kueue/v1alpha1/topology.go
+++ b/client-go/informers/externalversions/kueue/v1beta1/topology.go
@@ -15,7 +15,7 @@ limitations under the License.
 */
 // Code generated by informer-gen. DO NOT EDIT.
 
-package v1alpha1
+package v1beta1
 
 import (
 	context "context"
@@ -25,17 +25,17 @@ import (
 	runtime "k8s.io/apimachinery/pkg/runtime"
 	watch "k8s.io/apimachinery/pkg/watch"
 	cache "k8s.io/client-go/tools/cache"
-	apiskueuev1alpha1 "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	apiskueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	versioned "sigs.k8s.io/kueue/client-go/clientset/versioned"
 	internalinterfaces "sigs.k8s.io/kueue/client-go/informers/externalversions/internalinterfaces"
-	kueuev1alpha1 "sigs.k8s.io/kueue/client-go/listers/kueue/v1alpha1"
+	kueuev1beta1 "sigs.k8s.io/kueue/client-go/listers/kueue/v1beta1"
 )
 
 // TopologyInformer provides access to a shared informer and lister for
 // Topologies.
 type TopologyInformer interface {
 	Informer() cache.SharedIndexInformer
-	Lister() kueuev1alpha1.TopologyLister
+	Lister() kueuev1beta1.TopologyLister
 }
 
 type topologyInformer struct {
@@ -60,28 +60,28 @@ func NewFilteredTopologyInformer(client versioned.Interface, resyncPeriod time.D
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1alpha1().Topologies().List(context.Background(), options)
+				return client.KueueV1beta1().Topologies().List(context.Background(), options)
 			},
 			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1alpha1().Topologies().Watch(context.Background(), options)
+				return client.KueueV1beta1().Topologies().Watch(context.Background(), options)
 			},
 			ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1alpha1().Topologies().List(ctx, options)
+				return client.KueueV1beta1().Topologies().List(ctx, options)
 			},
 			WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1alpha1().Topologies().Watch(ctx, options)
+				return client.KueueV1beta1().Topologies().Watch(ctx, options)
 			},
 		},
-		&apiskueuev1alpha1.Topology{},
+		&apiskueuev1beta1.Topology{},
 		resyncPeriod,
 		indexers,
 	)
@@ -92,9 +92,9 @@ func (f *topologyInformer) defaultInformer(client versioned.Interface, resyncPer
 }
 
 func (f *topologyInformer) Informer() cache.SharedIndexInformer {
-	return f.factory.InformerFor(&apiskueuev1alpha1.Topology{}, f.defaultInformer)
+	return f.factory.InformerFor(&apiskueuev1beta1.Topology{}, f.defaultInformer)
 }
 
-func (f *topologyInformer) Lister() kueuev1alpha1.TopologyLister {
-	return kueuev1alpha1.NewTopologyLister(f.Informer().GetIndexer())
+func (f *topologyInformer) Lister() kueuev1beta1.TopologyLister {
+	return kueuev1beta1.NewTopologyLister(f.Informer().GetIndexer())
 }
diff --git a/client-go/listers/kueue/v1alpha1/expansion_generated.go b/client-go/listers/kueue/v1alpha1/expansion_generated.go
deleted file mode 100644
index a760283dd..000000000
--- a/client-go/listers/kueue/v1alpha1/expansion_generated.go
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-// Code generated by lister-gen. DO NOT EDIT.
-
-package v1alpha1
-
-// TopologyListerExpansion allows custom methods to be added to
-// TopologyLister.
-type TopologyListerExpansion interface{}
diff --git a/client-go/listers/kueue/v1beta1/expansion_generated.go b/client-go/listers/kueue/v1beta1/expansion_generated.go
index 667043eb7..357b54ed7 100644
--- a/client-go/listers/kueue/v1beta1/expansion_generated.go
+++ b/client-go/listers/kueue/v1beta1/expansion_generated.go
@@ -57,6 +57,10 @@ type ProvisioningRequestConfigListerExpansion interface{}
 // ResourceFlavorLister.
 type ResourceFlavorListerExpansion interface{}
 
+// TopologyListerExpansion allows custom methods to be added to
+// TopologyLister.
+type TopologyListerExpansion interface{}
+
 // WorkloadListerExpansion allows custom methods to be added to
 // WorkloadLister.
 type WorkloadListerExpansion interface{}
diff --git a/client-go/listers/kueue/v1alpha1/topology.go b/client-go/listers/kueue/v1beta1/topology.go
similarity index 78%
rename from client-go/listers/kueue/v1alpha1/topology.go
rename to client-go/listers/kueue/v1beta1/topology.go
index eadc26178..30426890f 100644
--- a/client-go/listers/kueue/v1alpha1/topology.go
+++ b/client-go/listers/kueue/v1beta1/topology.go
@@ -15,13 +15,13 @@ limitations under the License.
 */
 // Code generated by lister-gen. DO NOT EDIT.
 
-package v1alpha1
+package v1beta1
 
 import (
 	labels "k8s.io/apimachinery/pkg/labels"
 	listers "k8s.io/client-go/listers"
 	cache "k8s.io/client-go/tools/cache"
-	kueuev1alpha1 "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
 // TopologyLister helps list Topologies.
@@ -29,19 +29,19 @@ import (
 type TopologyLister interface {
 	// List lists all Topologies in the indexer.
 	// Objects returned here must be treated as read-only.
-	List(selector labels.Selector) (ret []*kueuev1alpha1.Topology, err error)
+	List(selector labels.Selector) (ret []*kueuev1beta1.Topology, err error)
 	// Get retrieves the Topology from the index for a given name.
 	// Objects returned here must be treated as read-only.
-	Get(name string) (*kueuev1alpha1.Topology, error)
+	Get(name string) (*kueuev1beta1.Topology, error)
 	TopologyListerExpansion
 }
 
 // topologyLister implements the TopologyLister interface.
 type topologyLister struct {
-	listers.ResourceIndexer[*kueuev1alpha1.Topology]
+	listers.ResourceIndexer[*kueuev1beta1.Topology]
 }
 
 // NewTopologyLister returns a new TopologyLister.
 func NewTopologyLister(indexer cache.Indexer) TopologyLister {
-	return &topologyLister{listers.New[*kueuev1alpha1.Topology](indexer, kueuev1alpha1.Resource("topology"))}
+	return &topologyLister{listers.New[*kueuev1beta1.Topology](indexer, kueuev1beta1.Resource("topology"))}
 }
diff --git a/cmd/kueue/main.go b/cmd/kueue/main.go
index 89f359fa7..0b8d187ec 100644
--- a/cmd/kueue/main.go
+++ b/cmd/kueue/main.go
@@ -64,6 +64,7 @@ import (
 	tasindexer "sigs.k8s.io/kueue/pkg/controller/tas/indexer"
 	dispatcher "sigs.k8s.io/kueue/pkg/controller/workloaddispatcher"
 	"sigs.k8s.io/kueue/pkg/debugger"
+	"sigs.k8s.io/kueue/pkg/dra"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/metrics"
 	"sigs.k8s.io/kueue/pkg/scheduler"
@@ -221,6 +222,13 @@ func main() {
 		cacheOptions = append(cacheOptions, schdcache.WithResourceTransformations(cfg.Resources.Transformations))
 		queueOptions = append(queueOptions, qcache.WithResourceTransformations(cfg.Resources.Transformations))
 	}
+	if features.Enabled(features.DynamicResourceAllocation) && cfg.Resources != nil && len(cfg.Resources.DeviceClassMappings) > 0 {
+		if err := dra.CreateMapperFromConfiguration(cfg.Resources.DeviceClassMappings); err != nil {
+			setupLog.Error(err, "Failed to initialize DRA mapper from configuration")
+			os.Exit(1)
+		}
+		setupLog.Info("DRA mapper initialized from configuration")
+	}
 	if cfg.FairSharing != nil {
 		cacheOptions = append(cacheOptions, schdcache.WithFairSharing(cfg.FairSharing.Enable))
 	}
diff --git a/config/components/crd/bases/kueue.x-k8s.io_topologies.yaml b/config/components/crd/bases/kueue.x-k8s.io_topologies.yaml
index 51d188944..a99a59f90 100644
--- a/config/components/crd/bases/kueue.x-k8s.io_topologies.yaml
+++ b/config/components/crd/bases/kueue.x-k8s.io_topologies.yaml
@@ -14,7 +14,7 @@ spec:
     singular: topology
   scope: Cluster
   versions:
-  - name: v1alpha1
+  - name: v1beta1
     schema:
       openAPIV3Schema:
         description: Topology is the Schema for the topology API
diff --git a/config/components/rbac/role.yaml b/config/components/rbac/role.yaml
index dfbdb9764..7290b24a8 100644
--- a/config/components/rbac/role.yaml
+++ b/config/components/rbac/role.yaml
@@ -331,6 +331,15 @@ rules:
   - get
   - patch
   - update
+- apiGroups:
+  - resource.k8s.io
+  resources:
+  - resourceclaims
+  - resourceclaimtemplates
+  verbs:
+  - get
+  - list
+  - watch
 - apiGroups:
   - scheduling.k8s.io
   resources:
diff --git a/hack/e2e-common.sh b/hack/e2e-common.sh
index f011c764d..314e06a38 100644
--- a/hack/e2e-common.sh
+++ b/hack/e2e-common.sh
@@ -313,7 +313,7 @@ function install_kubeflow_trainer {
         kubectl apply --kubeconfig="$2" --server-side -k "$manifests_temp_dir/overlays/manager"
     )
     # In order to install the training runtimes we need to wait for the ClusterTrainingRuntime webhook to be ready
-    kubectl wait --kubeconfig="$2" deploy/kubeflow-trainer-controller-manager -n kubeflow-system --for=condition=available --timeout=1m
+    kubectl wait --kubeconfig="$2" deploy/kubeflow-trainer-controller-manager -n kubeflow-system --for=condition=available --timeout=5m
     kubectl apply --kubeconfig="$2" --server-side -k "${KUBEFLOW_TRAINER_MANIFEST}/overlays/runtimes"
 }
 
diff --git a/hack/releasing/sync-notes.sh b/hack/releasing/sync-notes.sh
index 6a79db1af..22c360803 100755
--- a/hack/releasing/sync-notes.sh
+++ b/hack/releasing/sync-notes.sh
@@ -57,6 +57,10 @@ git fetch "${UPSTREAM_REMOTE}" --tags
 find_previous_version() {
   local release_version="$1"
   IFS='.' read -r major minor patch <<< "${release_version#v}"
+  if [ "$patch" -eq 0 ]; then
+    echo "${release_version}-devel"
+    return 0
+  fi
   for tag in $(git tag -l | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | sort -V -r); do
     IFS='.' read -r t_major t_minor t_patch <<< "${tag#v}"
     if [ "$t_major" -lt "$major" ] || \
@@ -88,9 +92,11 @@ function find_head_branch() {
 
 HEAD_BRANCH=$(find_head_branch "$RELEASE_VERSION")
 declare HEAD_BRANCH
+echo "+++ HEAD_BRANCH=$HEAD_BRANCH"
 
 PREVIOUS_VERSION=$(find_previous_version "$RELEASE_VERSION")
 declare PREVIOUS_VERSION
+echo "+++ PREVIOUS_VERSION=$PREVIOUS_VERSION"
 
 START_SHA=$(git rev-parse "${PREVIOUS_VERSION}^{commit}" 2>/dev/null)
 declare START_SHA
diff --git a/keps/2724-topology-aware-scheduling/README.md b/keps/2724-topology-aware-scheduling/README.md
index fead468a3..8a76d40ef 100644
--- a/keps/2724-topology-aware-scheduling/README.md
+++ b/keps/2724-topology-aware-scheduling/README.md
@@ -1304,11 +1304,8 @@ The new validations which are for MVP, but likely will be relaxed in the future:
   for node taints. Some options to consider include virtual level as proposed in
   the [issue](https://github.com/kubernetes-sigs/kueue/issues/3658#issuecomment-2505583333)
   or explicit level added by webhook.
-- introduce configuration for setting TAS profiles/algorithms
-- introduce a performance test for TAS [#4634](https://github.com/kubernetes-sigs/kueue/issues/4634)
 - re-evaluate the need for admin-facing configuration of the second phase
   requeuing for ProvisioningRequests based on user feedback
-- add observability metrics, some ideas are in the [discussion](https://github.com/kubernetes-sigs/kueue/pull/5078#discussion_r2060580973)
 - change how the information about the failed nodes is stored at a Workload from Annotation into a field in workload.Status
 - handle a more comprehensive set of failure scenarios (e.g., including node becoming unschedulable due to a taint)
 - re-evaluate replacing `NodeToReplace` annotation with a status field, to optimize number of requests in scheduler loop. [Discussion](https://github.com/kubernetes-sigs/kueue/issues/5560)
@@ -1325,6 +1322,10 @@ Consider the following improvements and implement if feasible:
 - perform full scheduling simulation rather than just capacity counting
  (including pod affinities and anti-affinities)
 - drop `TASLeastAllocated` feature gate
+- introduce configuration for setting TAS profiles/algorithms: https://github.com/kubernetes-sigs/kueue/issues/4570
+- introduce a performance test for TAS [#4634](https://github.com/kubernetes-sigs/kueue/issues/4634)
+- add observability metrics, some ideas are in the [discussion](https://github.com/kubernetes-sigs/kueue/pull/5078#discussion_r2060580973)
+- introduce configuration for the Node Hot Swap sub-feature: https://github.com/kubernetes-sigs/kueue/issues/6514
 
 ## Implementation History
 
diff --git a/keps/2724-topology-aware-scheduling/kep.yaml b/keps/2724-topology-aware-scheduling/kep.yaml
index 6d6e7091a..1f77c3ca3 100644
--- a/keps/2724-topology-aware-scheduling/kep.yaml
+++ b/keps/2724-topology-aware-scheduling/kep.yaml
@@ -18,17 +18,17 @@ see-also:
   - "/keps/1136-provisioning-request-support"
 
 # The target maturity stage in the current dev cycle for this KEP.
-stage: alpha
+stage: beta
 
 # The most recent milestone for which work toward delivery of this KEP has been
 # done. This can be the current (upcoming) milestone, if it is being actively
 # worked on.
-latest-milestone: "v0.12"
+latest-milestone: "v0.14"
 
 # The milestone at which this feature was, or is targeted to be, at each stage.
 milestone:
   alpha: "v0.9"
-  beta:
+  beta: "v0.14"
   stable:
 
 # The following PRR answers are required at alpha release
diff --git a/pkg/cache/queue/cohort.go b/pkg/cache/queue/cohort.go
index 2e1e924d2..f9e2fa476 100644
--- a/pkg/cache/queue/cohort.go
+++ b/pkg/cache/queue/cohort.go
@@ -31,7 +31,7 @@ type cohort struct {
 func newCohort(name kueue.CohortReference) *cohort {
 	return &cohort{
 		name,
-		hierarchy.NewCohort[*ClusterQueue, *cohort](),
+		hierarchy.NewCohort[*ClusterQueue](),
 	}
 }
 
diff --git a/pkg/cache/queue/manager.go b/pkg/cache/queue/manager.go
index dd8a35742..979b96a3d 100644
--- a/pkg/cache/queue/manager.go
+++ b/pkg/cache/queue/manager.go
@@ -32,7 +32,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache/hierarchy"
 	utilindexer "sigs.k8s.io/kueue/pkg/controller/core/indexer"
@@ -89,7 +88,7 @@ func WithResourceTransformations(transforms []config.ResourceTransformation) Opt
 }
 
 type TopologyUpdateWatcher interface {
-	NotifyTopologyUpdate(oldTopology, newTopology *kueuealpha.Topology)
+	NotifyTopologyUpdate(oldTopology, newTopology *kueue.Topology)
 }
 
 type Manager struct {
@@ -131,7 +130,7 @@ func NewManager(client client.Client, checker StatusChecker, options ...Option)
 			PodsReadyRequeuingTimestamp: config.EvictionTimestamp,
 		},
 		workloadInfoOptions: []workload.InfoOption{},
-		hm:                  hierarchy.NewManager[*ClusterQueue, *cohort](newCohort),
+		hm:                  hierarchy.NewManager(newCohort),
 
 		topologyUpdateWatchers: make([]TopologyUpdateWatcher, 0),
 		secondPassQueue:        newSecondPassQueue(),
@@ -148,7 +147,7 @@ func (m *Manager) AddTopologyUpdateWatcher(watcher TopologyUpdateWatcher) {
 	m.topologyUpdateWatchers = append(m.topologyUpdateWatchers, watcher)
 }
 
-func (m *Manager) NotifyTopologyUpdateWatchers(oldTopology, newTopology *kueuealpha.Topology) {
+func (m *Manager) NotifyTopologyUpdateWatchers(oldTopology, newTopology *kueue.Topology) {
 	for _, watcher := range m.topologyUpdateWatchers {
 		watcher.NotifyTopologyUpdate(oldTopology, newTopology)
 	}
@@ -418,19 +417,20 @@ func (m *Manager) ClusterQueueForWorkload(wl *kueue.Workload) (kueue.ClusterQueu
 
 // AddOrUpdateWorkload adds or updates workload to the corresponding queue.
 // Returns whether the queue existed.
-func (m *Manager) AddOrUpdateWorkload(w *kueue.Workload) error {
+func (m *Manager) AddOrUpdateWorkload(w *kueue.Workload, opts ...workload.InfoOption) error {
 	m.Lock()
 	defer m.Unlock()
-	return m.AddOrUpdateWorkloadWithoutLock(w)
+	return m.AddOrUpdateWorkloadWithoutLock(w, opts...)
 }
 
-func (m *Manager) AddOrUpdateWorkloadWithoutLock(w *kueue.Workload) error {
+func (m *Manager) AddOrUpdateWorkloadWithoutLock(w *kueue.Workload, opts ...workload.InfoOption) error {
 	qKey := queue.KeyFromWorkload(w)
 	q := m.localQueues[qKey]
 	if q == nil {
 		return ErrLocalQueueDoesNotExistOrInactive
 	}
-	wInfo := workload.NewInfo(w, m.workloadInfoOptions...)
+	allOptions := append(m.workloadInfoOptions, opts...)
+	wInfo := workload.NewInfo(w, allOptions...)
 	q.AddOrUpdate(wInfo)
 	cq := m.hm.ClusterQueue(q.ClusterQueue)
 	if cq == nil {
@@ -612,13 +612,13 @@ func requeueWorkloadsCohortSubtree(ctx context.Context, m *Manager, cohort *coho
 
 // UpdateWorkload updates the workload to the corresponding queue or adds it if
 // it didn't exist. Returns whether the queue existed.
-func (m *Manager) UpdateWorkload(oldW, w *kueue.Workload) error {
+func (m *Manager) UpdateWorkload(oldW, w *kueue.Workload, opts ...workload.InfoOption) error {
 	m.Lock()
 	defer m.Unlock()
 	if oldW.Spec.QueueName != w.Spec.QueueName {
 		m.deleteWorkloadFromQueueAndClusterQueue(w, queue.KeyFromWorkload(oldW))
 	}
-	return m.AddOrUpdateWorkloadWithoutLock(w)
+	return m.AddOrUpdateWorkloadWithoutLock(w, opts...)
 }
 
 // CleanUpOnContext tracks the context. When closed, it wakes routines waiting
diff --git a/pkg/cache/scheduler/cache.go b/pkg/cache/scheduler/cache.go
index 8234b0894..81cd4ed5a 100644
--- a/pkg/cache/scheduler/cache.go
+++ b/pkg/cache/scheduler/cache.go
@@ -35,7 +35,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache/hierarchy"
 	utilindexer "sigs.k8s.io/kueue/pkg/controller/core/indexer"
@@ -122,7 +121,7 @@ func New(client client.Client, options ...Option) *Cache {
 		assumedWorkloads: make(map[workload.Reference]kueue.ClusterQueueReference),
 		resourceFlavors:  make(map[kueue.ResourceFlavorReference]*kueue.ResourceFlavor),
 		admissionChecks:  make(map[kueue.AdmissionCheckReference]AdmissionCheck),
-		hm:               hierarchy.NewManager[*clusterQueue, *cohort](newCohort),
+		hm:               hierarchy.NewManager(newCohort),
 		tasCache:         NewTASCache(client),
 	}
 	for _, option := range options {
@@ -267,7 +266,7 @@ func (c *Cache) DeleteResourceFlavor(log logr.Logger, rf *kueue.ResourceFlavor)
 	return c.updateClusterQueues(log)
 }
 
-func (c *Cache) AddOrUpdateTopology(log logr.Logger, topology *kueuealpha.Topology) sets.Set[kueue.ClusterQueueReference] {
+func (c *Cache) AddOrUpdateTopology(log logr.Logger, topology *kueue.Topology) sets.Set[kueue.ClusterQueueReference] {
 	c.Lock()
 	defer c.Unlock()
 	c.tasCache.AddTopology(topology)
diff --git a/pkg/cache/scheduler/cohort.go b/pkg/cache/scheduler/cohort.go
index 1dfbeb7d0..255fda677 100644
--- a/pkg/cache/scheduler/cohort.go
+++ b/pkg/cache/scheduler/cohort.go
@@ -38,7 +38,7 @@ type cohort struct {
 func newCohort(name kueue.CohortReference) *cohort {
 	return &cohort{
 		Name:         name,
-		Cohort:       hierarchy.NewCohort[*clusterQueue, *cohort](),
+		Cohort:       hierarchy.NewCohort[*clusterQueue](),
 		resourceNode: NewResourceNode(),
 	}
 }
diff --git a/pkg/cache/scheduler/tas_cache.go b/pkg/cache/scheduler/tas_cache.go
index d9d2c87c8..3573e22b5 100644
--- a/pkg/cache/scheduler/tas_cache.go
+++ b/pkg/cache/scheduler/tas_cache.go
@@ -23,7 +23,6 @@ import (
 
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utiltas "sigs.k8s.io/kueue/pkg/util/tas"
 )
@@ -75,7 +74,7 @@ func (t *tasCache) AddFlavor(flavor *kueue.ResourceFlavor) {
 	}
 }
 
-func (t *tasCache) AddTopology(topology *kueuealpha.Topology) {
+func (t *tasCache) AddTopology(topology *kueue.Topology) {
 	t.Lock()
 	defer t.Unlock()
 	name := kueue.TopologyReference(topology.Name)
diff --git a/pkg/cache/scheduler/tas_flavor.go b/pkg/cache/scheduler/tas_flavor.go
index 2c828b37c..425800fa8 100644
--- a/pkg/cache/scheduler/tas_flavor.go
+++ b/pkg/cache/scheduler/tas_flavor.go
@@ -25,13 +25,11 @@ import (
 
 	"github.com/go-logr/logr"
 	corev1 "k8s.io/api/core/v1"
-	"k8s.io/apimachinery/pkg/labels"
-	"k8s.io/apimachinery/pkg/selection"
+	"k8s.io/apimachinery/pkg/fields"
 	resourcehelpers "k8s.io/component-helpers/resource"
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/tas/indexer"
 	"sigs.k8s.io/kueue/pkg/resources"
@@ -116,13 +114,8 @@ func (c *TASFlavorCache) snapshot(ctx context.Context) (*TASFlavorSnapshot, erro
 	if err != nil {
 		return nil, fmt.Errorf("failed to list nodes for TAS: %w", err)
 	}
-	r, err := labels.NewRequirement(kueuealpha.TASLabel, selection.DoesNotExist, nil)
-	if err != nil {
-		return nil, fmt.Errorf("failed to build requirement for non-TAS pods: %w", err)
-	}
 	podListOpts := &client.ListOptions{}
-	podListOpts.LabelSelector = labels.NewSelector()
-	podListOpts.LabelSelector = podListOpts.LabelSelector.Add(*r)
+	podListOpts.FieldSelector = fields.OneTermEqualSelector(indexer.TASKey, "false")
 	pods := corev1.PodList{}
 	err = c.client.List(ctx, &pods, podListOpts)
 	if err != nil {
diff --git a/pkg/config/validation.go b/pkg/config/validation.go
index c5ed679fb..a932e10be 100644
--- a/pkg/config/validation.go
+++ b/pkg/config/validation.go
@@ -64,6 +64,7 @@ var (
 	internalCertManagementPath           = field.NewPath("internalCertManagement")
 	queueVisibilityPath                  = field.NewPath("queueVisibility")
 	resourceTransformationPath           = field.NewPath("resources", "transformations")
+	dynamicResourceAllocationPath        = field.NewPath("resources", "deviceClassMappings")
 	objectRetentionPoliciesPath          = field.NewPath("objectRetentionPolicies")
 	objectRetentionPoliciesWorkloadsPath = objectRetentionPoliciesPath.Child("workloads")
 	log                                  = ctrl.Log.WithName("config")
@@ -79,6 +80,7 @@ func validate(c *configapi.Configuration, scheme *runtime.Scheme) field.ErrorLis
 	allErrs = append(allErrs, validateAdmissionFairSharing(c)...)
 	allErrs = append(allErrs, validateInternalCertManagement(c)...)
 	allErrs = append(allErrs, validateResourceTransformations(c)...)
+	allErrs = append(allErrs, validateDeviceClassMappings(c)...)
 	allErrs = append(allErrs, validateManagedJobsNamespaceSelector(c)...)
 	allErrs = append(allErrs, validateObjectRetentionPolicies(c)...)
 	return allErrs
@@ -352,6 +354,80 @@ func validateResourceTransformations(c *configapi.Configuration) field.ErrorList
 	return allErrs
 }
 
+func validateDeviceClassMappings(c *configapi.Configuration) field.ErrorList {
+	if c.Resources == nil || len(c.Resources.DeviceClassMappings) == 0 {
+		return nil
+	}
+
+	mappings := c.Resources.DeviceClassMappings
+	var allErrs field.ErrorList
+
+	if len(mappings) > 16 {
+		allErrs = append(allErrs, field.TooMany(dynamicResourceAllocationPath, len(mappings), 16))
+	}
+
+	seenResourceNames := make(sets.Set[corev1.ResourceName])
+	deviceClassToResource := make(map[corev1.ResourceName]corev1.ResourceName)
+
+	for idx, mapping := range mappings {
+		mappingPath := dynamicResourceAllocationPath.Index(idx)
+
+		if errs := apimachineryutilvalidation.IsQualifiedName(string(mapping.Name)); len(errs) > 0 {
+			allErrs = append(allErrs, field.Invalid(mappingPath.Child("name"), mapping.Name, strings.Join(errs, "; ")))
+		}
+
+		if len(string(mapping.Name)) > 253 {
+			allErrs = append(allErrs, field.Invalid(mappingPath.Child("name"), mapping.Name, "must not exceed 253 characters"))
+		}
+
+		if seenResourceNames.Has(mapping.Name) {
+			allErrs = append(allErrs, field.Duplicate(mappingPath.Child("name"), mapping.Name))
+		} else {
+			seenResourceNames.Insert(mapping.Name)
+		}
+
+		if len(mapping.DeviceClassNames) == 0 {
+			allErrs = append(allErrs, field.Required(mappingPath.Child("deviceClassNames"),
+				"at least one device class name is required"))
+		}
+
+		if len(mapping.DeviceClassNames) > 8 {
+			allErrs = append(allErrs, field.TooMany(mappingPath.Child("deviceClassNames"), len(mapping.DeviceClassNames), 8))
+		}
+
+		seenDeviceClassNames := make(sets.Set[corev1.ResourceName])
+
+		for dcIdx, deviceClass := range mapping.DeviceClassNames {
+			dcPath := mappingPath.Child("deviceClassNames").Index(dcIdx)
+
+			if errs := apimachineryutilvalidation.IsQualifiedName(string(deviceClass)); len(errs) > 0 {
+				allErrs = append(allErrs, field.Invalid(dcPath, deviceClass, strings.Join(errs, "; ")))
+			}
+
+			if len(string(deviceClass)) > 253 {
+				allErrs = append(allErrs, field.Invalid(dcPath, deviceClass, "must not exceed 253 characters"))
+			}
+
+			if seenDeviceClassNames.Has(deviceClass) {
+				allErrs = append(allErrs, field.Duplicate(dcPath, deviceClass))
+			} else {
+				seenDeviceClassNames.Insert(deviceClass)
+			}
+
+			if existingResource, exists := deviceClassToResource[deviceClass]; exists {
+				if existingResource != mapping.Name {
+					allErrs = append(allErrs, field.Invalid(dcPath, deviceClass,
+						fmt.Sprintf("device class already mapped to resource %s", existingResource)))
+				}
+			} else {
+				deviceClassToResource[deviceClass] = mapping.Name
+			}
+		}
+	}
+
+	return allErrs
+}
+
 func validateManagedJobsNamespaceSelector(c *configapi.Configuration) field.ErrorList {
 	var allErrs field.ErrorList
 
diff --git a/pkg/controller/admissionchecks/provisioning/controller.go b/pkg/controller/admissionchecks/provisioning/controller.go
index aaa618672..8d4ca818d 100644
--- a/pkg/controller/admissionchecks/provisioning/controller.go
+++ b/pkg/controller/admissionchecks/provisioning/controller.go
@@ -359,7 +359,7 @@ func (c *Controller) createPodTemplate(ctx context.Context, wl *kueue.Workload,
 	}
 
 	// apply the admission node selectors to the Template
-	psi, err := podset.FromAssignment(ctx, c.client, psa, ptr.Deref(psa.Count, ps.Count))
+	psi, err := podset.FromAssignment(ctx, c.client, psa, ps)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/controller/core/clusterqueue_controller.go b/pkg/controller/core/clusterqueue_controller.go
index 036f48a60..dbe1cb609 100644
--- a/pkg/controller/core/clusterqueue_controller.go
+++ b/pkg/controller/core/clusterqueue_controller.go
@@ -44,7 +44,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -183,8 +182,8 @@ func (r *ClusterQueueReconciler) Reconcile(ctx context.Context, req ctrl.Request
 
 // NotifyTopologyUpdate triggers a topology update event only on creation or deletion,
 // as these are the only changes affecting the ClusterQueue's active state.
-func (r *ClusterQueueReconciler) NotifyTopologyUpdate(oldTopology, newTopology *kueuealpha.Topology) {
-	var topology *kueuealpha.Topology
+func (r *ClusterQueueReconciler) NotifyTopologyUpdate(oldTopology, newTopology *kueue.Topology) {
+	var topology *kueue.Topology
 	switch {
 	case oldTopology == nil:
 		// Create Event.
diff --git a/pkg/controller/core/workload_controller.go b/pkg/controller/core/workload_controller.go
index 5da6223ef..80e10dd5f 100644
--- a/pkg/controller/core/workload_controller.go
+++ b/pkg/controller/core/workload_controller.go
@@ -53,6 +53,7 @@ import (
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/core/indexer"
+	"sigs.k8s.io/kueue/pkg/dra"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/metrics"
 	"sigs.k8s.io/kueue/pkg/util/admissioncheck"
@@ -144,6 +145,8 @@ func NewWorkloadReconciler(client client.Client, queues *qcache.Manager, cache *
 // +kubebuilder:rbac:groups=kueue.x-k8s.io,resources=workloads/status,verbs=get;update;patch
 // +kubebuilder:rbac:groups=kueue.x-k8s.io,resources=workloads/finalizers,verbs=update
 // +kubebuilder:rbac:groups=node.k8s.io,resources=runtimeclasses,verbs=get;list;watch
+// +kubebuilder:rbac:groups=resource.k8s.io,resources=resourceclaims,verbs=get;list;watch
+// +kubebuilder:rbac:groups=resource.k8s.io,resources=resourceclaimtemplates,verbs=get;list;watch
 
 func (r *WorkloadReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	var wl kueue.Workload
@@ -188,6 +191,48 @@ func (r *WorkloadReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
 		return ctrl.Result{}, nil
 	}
 
+	if features.Enabled(features.DynamicResourceAllocation) && workload.Status(&wl) == workload.StatusPending &&
+		r.workloadHasDRA(&wl) {
+		if r.workloadHasResourceClaim(&wl) {
+			log.V(3).Info("Workload is inadmissible because it uses resource claims which is not supported")
+			if workload.UnsetQuotaReservationWithCondition(&wl, kueue.WorkloadInadmissible, "DynamicResourceAllocation feature does not support use of resource claims", r.clock.Now()) {
+				if err := workload.ApplyAdmissionStatus(ctx, r.client, &wl, true, r.clock); err != nil {
+					return ctrl.Result{}, fmt.Errorf("failed to update workload status for DRA resource claims error: %w", err)
+				}
+			}
+			return ctrl.Result{}, nil
+		}
+
+		log.V(3).Info("Processing DRA resources for workload")
+		draResources, err := dra.GetResourceRequestsForResourceClaimTemplates(ctx, r.client, &wl)
+		if err != nil {
+			log.Error(err, "Failed to process DRA resources for workload")
+			if workload.UnsetQuotaReservationWithCondition(&wl, kueue.WorkloadInadmissible, err.Error(), r.clock.Now()) {
+				if updateErr := workload.ApplyAdmissionStatus(ctx, r.client, &wl, true, r.clock); updateErr != nil {
+					return ctrl.Result{}, fmt.Errorf("failed to update workload status for DRA error: %w", updateErr)
+				}
+			}
+			return ctrl.Result{}, err
+		}
+
+		var queueOptions []workload.InfoOption
+		if len(draResources) > 0 {
+			queueOptions = append(queueOptions, workload.WithPreprocessedDRAResources(draResources))
+		}
+
+		if workload.IsActive(&wl) && !workload.HasQuotaReservation(&wl) {
+			if err := r.queues.AddOrUpdateWorkload(&wl, queueOptions...); err != nil {
+				log.V(2).Info("Failed to add DRA workload to queue", "error", err)
+				return ctrl.Result{}, err
+			}
+		} else {
+			if !r.cache.AddOrUpdateWorkload(log, &wl) {
+				log.V(2).Info("ClusterQueue for workload didn't exist; ignored for now")
+			}
+		}
+		log.V(3).Info("Successfully pre-processed and queued DRA workload in scheduler")
+	}
+
 	if workload.IsActive(&wl) {
 		if apimeta.IsStatusConditionTrue(wl.Status.Conditions, kueue.WorkloadDeactivationTarget) {
 			wl.Spec.Active = ptr.To(false)
@@ -525,6 +570,32 @@ func (r *WorkloadReconciler) reconcileOnClusterQueueActiveState(ctx context.Cont
 	return false, nil
 }
 
+func (r *WorkloadReconciler) workloadHasDRA(wl *kueue.Workload) bool {
+	return r.workloadHasResourceClaim(wl) || r.workloadHasResourceClaimTemplates(wl)
+}
+
+func (r *WorkloadReconciler) workloadHasResourceClaimTemplates(wl *kueue.Workload) bool {
+	for _, ps := range wl.Spec.PodSets {
+		for _, prc := range ps.Template.Spec.ResourceClaims {
+			if prc.ResourceClaimTemplateName != nil {
+				return true
+			}
+		}
+	}
+	return false
+}
+
+func (r *WorkloadReconciler) workloadHasResourceClaim(wl *kueue.Workload) bool {
+	for _, ps := range wl.Spec.PodSets {
+		for _, prc := range ps.Template.Spec.ResourceClaims {
+			if prc.ResourceClaimName != nil {
+				return true
+			}
+		}
+	}
+	return false
+}
+
 func syncAdmissionCheckConditions(conds []kueue.AdmissionCheckState, admissionChecks sets.Set[kueue.AdmissionCheckReference], c clock.Clock) ([]kueue.AdmissionCheckState, bool) {
 	if len(admissionChecks) == 0 {
 		return nil, len(conds) > 0
@@ -620,6 +691,13 @@ func (r *WorkloadReconciler) Create(e event.TypedCreateEvent[*kueue.Workload]) b
 	wlCopy := e.Object.DeepCopy()
 	workload.AdjustResources(ctx, r.client, wlCopy)
 
+	// It is intentional for this code to be not guarded behind a feature gate
+	// DRA workloads need to have certain error handling and hence to be handled in Reconcile loop
+	if features.Enabled(features.DynamicResourceAllocation) && r.workloadHasDRA(e.Object) {
+		log.V(2).Info("Skipping DRA workload in Create event - will be handled in Reconcile")
+		return true
+	}
+
 	if workload.IsActive(e.Object) && !workload.HasQuotaReservation(e.Object) {
 		if err := r.queues.AddOrUpdateWorkload(wlCopy); err != nil {
 			log.V(2).Info("ignored an error for now", "error", err)
@@ -714,9 +792,14 @@ func (r *WorkloadReconciler) Update(e event.TypedUpdateEvent[*kueue.Workload]) b
 		})
 
 	case prevStatus == workload.StatusPending && status == workload.StatusPending:
-		err := r.queues.UpdateWorkload(e.ObjectOld, wlCopy)
-		if err != nil {
-			log.V(2).Info("ignored an error for now", "error", err)
+		// Skip queue operations for DRA workloads - they are handled in Reconcile loop
+		if features.Enabled(features.DynamicResourceAllocation) && r.workloadHasDRA(e.ObjectNew) {
+			log.V(2).Info("Skipping queue update for DRA workload - handled in Reconcile")
+		} else {
+			err := r.queues.UpdateWorkload(e.ObjectOld, wlCopy)
+			if err != nil {
+				log.V(2).Info("ignored an error for now", "error", err)
+			}
 		}
 	case prevStatus == workload.StatusPending && (status == workload.StatusQuotaReserved || status == workload.StatusAdmitted):
 		r.queues.DeleteWorkload(e.ObjectOld)
@@ -740,26 +823,36 @@ func (r *WorkloadReconciler) Update(e event.TypedUpdateEvent[*kueue.Workload]) b
 			// Here we don't take the lock as it is already taken by the wrapping
 			// function.
 			if immediate {
-				if err := r.queues.AddOrUpdateWorkloadWithoutLock(wlCopy); err != nil {
-					log.V(2).Info("ignored an error for now", "error", err)
+				// Skip queue operations for DRA workloads - they are handled in Reconcile loop
+				if features.Enabled(features.DynamicResourceAllocation) && r.workloadHasDRA(e.ObjectNew) {
+					log.V(2).Info("Skipping immediate requeue for DRA workload - handled in Reconcile")
+				} else {
+					if err := r.queues.AddOrUpdateWorkloadWithoutLock(wlCopy); err != nil {
+						log.V(2).Info("ignored an error for now", "error", err)
+					}
+					r.queues.DeleteSecondPassWithoutLock(wlCopy)
 				}
-				r.queues.DeleteSecondPassWithoutLock(wlCopy)
 			}
 		})
 
 		if !immediate {
 			log.V(3).Info("Workload to be requeued after backoff", "backoff", backoff, "requeueAt", e.ObjectNew.Status.RequeueState.RequeueAt.Time)
-			time.AfterFunc(backoff, func() {
-				updatedWl := kueue.Workload{}
-				err := r.client.Get(ctx, client.ObjectKeyFromObject(e.ObjectNew), &updatedWl)
-				if err == nil && workload.Status(&updatedWl) == workload.StatusPending {
-					if err = r.queues.AddOrUpdateWorkload(wlCopy); err != nil {
-						log.V(2).Info("ignored an error for now", "error", err)
-					} else {
-						log.V(3).Info("Workload requeued after backoff")
+			// Skip delayed requeue for DRA workloads - they are handled in Reconcile loop
+			if features.Enabled(features.DynamicResourceAllocation) && r.workloadHasDRA(e.ObjectNew) {
+				log.V(3).Info("Skipping delayed requeue for DRA workload - handled in Reconcile")
+			} else {
+				time.AfterFunc(backoff, func() {
+					updatedWl := kueue.Workload{}
+					err := r.client.Get(ctx, client.ObjectKeyFromObject(e.ObjectNew), &updatedWl)
+					if err == nil && workload.Status(&updatedWl) == workload.StatusPending {
+						if err = r.queues.AddOrUpdateWorkload(wlCopy); err != nil {
+							log.V(2).Info("ignored an error for now", "error", err)
+						} else {
+							log.V(3).Info("Workload requeued after backoff")
+						}
 					}
-				}
-			})
+				})
+			}
 		}
 	case prevStatus == workload.StatusAdmitted && status == workload.StatusAdmitted && !equality.Semantic.DeepEqual(e.ObjectOld.Status.ReclaimablePods, e.ObjectNew.Status.ReclaimablePods),
 		features.Enabled(features.ElasticJobsViaWorkloadSlices) && workloadslicing.ScaledDown(workload.ExtractPodSetCountsFromWorkload(e.ObjectOld), workload.ExtractPodSetCountsFromWorkload(e.ObjectNew)):
diff --git a/pkg/controller/jobframework/reconciler.go b/pkg/controller/jobframework/reconciler.go
index a4675142f..3b60c71b3 100644
--- a/pkg/controller/jobframework/reconciler.go
+++ b/pkg/controller/jobframework/reconciler.go
@@ -44,7 +44,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -1288,12 +1287,12 @@ func getPodSetsInfoFromStatus(ctx context.Context, c client.Client, w *kueue.Wor
 	podSetsInfo := make([]podset.PodSetInfo, len(w.Status.Admission.PodSetAssignments))
 
 	for i, psAssignment := range w.Status.Admission.PodSetAssignments {
-		info, err := podset.FromAssignment(ctx, c, &psAssignment, w.Spec.PodSets[i].Count)
+		info, err := podset.FromAssignment(ctx, c, &psAssignment, &w.Spec.PodSets[i])
 		if err != nil {
 			return nil, err
 		}
 		if features.Enabled(features.TopologyAwareScheduling) {
-			info.Annotations[kueuealpha.WorkloadAnnotation] = w.Name
+			info.Annotations[kueue.WorkloadAnnotation] = w.Name
 		}
 
 		info.Labels[controllerconsts.PodSetLabel] = string(psAssignment.Name)
diff --git a/pkg/controller/jobframework/tas.go b/pkg/controller/jobframework/tas.go
index a7fa0569f..b024454eb 100644
--- a/pkg/controller/jobframework/tas.go
+++ b/pkg/controller/jobframework/tas.go
@@ -22,7 +22,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
@@ -52,14 +51,14 @@ func NewPodSetTopologyRequest(meta *metav1.ObjectMeta) *podSetTopologyRequestBui
 
 func (p *podSetTopologyRequestBuilder) Build() (*kueue.PodSetTopologyRequest, error) {
 	psTopologyReq := kueue.PodSetTopologyRequest{}
-	requiredValue, requiredFound := p.meta.Annotations[kueuealpha.PodSetRequiredTopologyAnnotation]
-	preferredValue, preferredFound := p.meta.Annotations[kueuealpha.PodSetPreferredTopologyAnnotation]
-	unconstrained, unconstrainedFound := p.meta.Annotations[kueuealpha.PodSetUnconstrainedTopologyAnnotation]
+	requiredValue, requiredFound := p.meta.Annotations[kueue.PodSetRequiredTopologyAnnotation]
+	preferredValue, preferredFound := p.meta.Annotations[kueue.PodSetPreferredTopologyAnnotation]
+	unconstrained, unconstrainedFound := p.meta.Annotations[kueue.PodSetUnconstrainedTopologyAnnotation]
 
-	sliceRequiredTopologyValue, sliceRequiredTopologyFound := p.meta.Annotations[kueuealpha.PodSetSliceRequiredTopologyAnnotation]
-	sliceSizeValue, sliceSizeFound := p.meta.Annotations[kueuealpha.PodSetSliceSizeAnnotation]
+	sliceRequiredTopologyValue, sliceRequiredTopologyFound := p.meta.Annotations[kueue.PodSetSliceRequiredTopologyAnnotation]
+	sliceSizeValue, sliceSizeFound := p.meta.Annotations[kueue.PodSetSliceSizeAnnotation]
 
-	podSetGroupName, podSetGroupNameFound := p.meta.Annotations[kueuealpha.PodSetGroupName]
+	podSetGroupName, podSetGroupNameFound := p.meta.Annotations[kueue.PodSetGroupName]
 
 	switch {
 	case requiredFound:
diff --git a/pkg/controller/jobframework/tas_validation.go b/pkg/controller/jobframework/tas_validation.go
index 8e7527c2f..d9ca03251 100644
--- a/pkg/controller/jobframework/tas_validation.go
+++ b/pkg/controller/jobframework/tas_validation.go
@@ -24,17 +24,16 @@ import (
 	metavalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueuebeta "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
 func ValidateTASPodSetRequest(replicaPath *field.Path, replicaMetadata *metav1.ObjectMeta) field.ErrorList {
 	var allErrs field.ErrorList
-	requiredValue, requiredFound := replicaMetadata.Annotations[kueuealpha.PodSetRequiredTopologyAnnotation]
-	preferredValue, preferredFound := replicaMetadata.Annotations[kueuealpha.PodSetPreferredTopologyAnnotation]
-	_, unconstrainedFound := replicaMetadata.Annotations[kueuealpha.PodSetUnconstrainedTopologyAnnotation]
-	sliceRequiredValue, sliceRequiredFound := replicaMetadata.Annotations[kueuealpha.PodSetSliceRequiredTopologyAnnotation]
-	_, sliceSizeFound := replicaMetadata.Annotations[kueuealpha.PodSetSliceSizeAnnotation]
+	requiredValue, requiredFound := replicaMetadata.Annotations[kueuebeta.PodSetRequiredTopologyAnnotation]
+	preferredValue, preferredFound := replicaMetadata.Annotations[kueuebeta.PodSetPreferredTopologyAnnotation]
+	_, unconstrainedFound := replicaMetadata.Annotations[kueuebeta.PodSetUnconstrainedTopologyAnnotation]
+	sliceRequiredValue, sliceRequiredFound := replicaMetadata.Annotations[kueuebeta.PodSetSliceRequiredTopologyAnnotation]
+	_, sliceSizeFound := replicaMetadata.Annotations[kueuebeta.PodSetSliceSizeAnnotation]
 
 	// validate no more than 1 annotation
 	asInt := func(b bool) int {
@@ -48,21 +47,21 @@ func ValidateTASPodSetRequest(replicaPath *field.Path, replicaMetadata *metav1.O
 	if annotationFoundCount > 1 {
 		allErrs = append(allErrs, field.Invalid(annotationsPath, field.OmitValueType{},
 			fmt.Sprintf("must not contain more than one topology annotation: [%q, %q, %q]",
-				kueuealpha.PodSetRequiredTopologyAnnotation,
-				kueuealpha.PodSetPreferredTopologyAnnotation,
-				kueuealpha.PodSetUnconstrainedTopologyAnnotation),
+				kueuebeta.PodSetRequiredTopologyAnnotation,
+				kueuebeta.PodSetPreferredTopologyAnnotation,
+				kueuebeta.PodSetUnconstrainedTopologyAnnotation),
 		))
 	}
 
 	// validate labels
 	if requiredFound {
-		allErrs = append(allErrs, metavalidation.ValidateLabelName(requiredValue, annotationsPath.Key(kueuealpha.PodSetRequiredTopologyAnnotation))...)
+		allErrs = append(allErrs, metavalidation.ValidateLabelName(requiredValue, annotationsPath.Key(kueuebeta.PodSetRequiredTopologyAnnotation))...)
 	}
 	if preferredFound {
-		allErrs = append(allErrs, metavalidation.ValidateLabelName(preferredValue, annotationsPath.Key(kueuealpha.PodSetPreferredTopologyAnnotation))...)
+		allErrs = append(allErrs, metavalidation.ValidateLabelName(preferredValue, annotationsPath.Key(kueuebeta.PodSetPreferredTopologyAnnotation))...)
 	}
 	if sliceRequiredFound {
-		allErrs = append(allErrs, metavalidation.ValidateLabelName(sliceRequiredValue, annotationsPath.Key(kueuealpha.PodSetSliceRequiredTopologyAnnotation))...)
+		allErrs = append(allErrs, metavalidation.ValidateLabelName(sliceRequiredValue, annotationsPath.Key(kueuebeta.PodSetSliceRequiredTopologyAnnotation))...)
 	}
 
 	unconstrainedErrs := validateTASUnconstrained(annotationsPath, replicaMetadata)
@@ -74,23 +73,23 @@ func ValidateTASPodSetRequest(replicaPath *field.Path, replicaMetadata *metav1.O
 	// validate slice annotations
 	if sliceRequiredFound {
 		if !sliceSizeFound {
-			allErrs = append(allErrs, field.Required(annotationsPath.Key(kueuealpha.PodSetSliceSizeAnnotation), "slice size is required if slice topology is requested"))
+			allErrs = append(allErrs, field.Required(annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), "slice size is required if slice topology is requested"))
 		}
 	}
 
 	if !sliceRequiredFound && sliceSizeFound {
-		allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueuealpha.PodSetSliceSizeAnnotation), fmt.Sprintf("cannot be set when '%s' is not present", kueuealpha.PodSetSliceRequiredTopologyAnnotation)))
+		allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), fmt.Sprintf("cannot be set when '%s' is not present", kueuebeta.PodSetSliceRequiredTopologyAnnotation)))
 	}
 
 	return allErrs
 }
 
 func validateTASUnconstrained(annotationsPath *field.Path, replicaMetadata *metav1.ObjectMeta) field.ErrorList {
-	if val, ok := replicaMetadata.Annotations[kueuealpha.PodSetUnconstrainedTopologyAnnotation]; ok {
+	if val, ok := replicaMetadata.Annotations[kueuebeta.PodSetUnconstrainedTopologyAnnotation]; ok {
 		if _, err := strconv.ParseBool(val); err != nil {
 			return field.ErrorList{
 				field.Invalid(
-					annotationsPath.Key(kueuealpha.PodSetUnconstrainedTopologyAnnotation), val, "must be a boolean value",
+					annotationsPath.Key(kueuebeta.PodSetUnconstrainedTopologyAnnotation), val, "must be a boolean value",
 				),
 			}
 		}
@@ -99,7 +98,7 @@ func validateTASUnconstrained(annotationsPath *field.Path, replicaMetadata *meta
 }
 
 func validateSliceSizeAnnotation(annotationsPath *field.Path, replicaMetadata *metav1.ObjectMeta) field.ErrorList {
-	sliceSizeValue, sliceSizeFound := replicaMetadata.Annotations[kueuealpha.PodSetSliceSizeAnnotation]
+	sliceSizeValue, sliceSizeFound := replicaMetadata.Annotations[kueuebeta.PodSetSliceSizeAnnotation]
 	if !sliceSizeFound {
 		return nil
 	}
@@ -108,7 +107,7 @@ func validateSliceSizeAnnotation(annotationsPath *field.Path, replicaMetadata *m
 	if err != nil {
 		return field.ErrorList{
 			field.Invalid(
-				annotationsPath.Key(kueuealpha.PodSetSliceSizeAnnotation), sliceSizeValue, "must be a numeric value",
+				annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), sliceSizeValue, "must be a numeric value",
 			),
 		}
 	}
@@ -116,7 +115,7 @@ func validateSliceSizeAnnotation(annotationsPath *field.Path, replicaMetadata *m
 	if int32(val) < 1 {
 		return field.ErrorList{
 			field.Invalid(
-				annotationsPath.Key(kueuealpha.PodSetSliceSizeAnnotation), sliceSizeValue,
+				annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), sliceSizeValue,
 				"must be greater than or equal to 1",
 			),
 		}
@@ -126,7 +125,7 @@ func validateSliceSizeAnnotation(annotationsPath *field.Path, replicaMetadata *m
 }
 
 func ValidateSliceSizeAnnotationUpperBound(replicaPath *field.Path, replicaMetadata *metav1.ObjectMeta, podSet *kueuebeta.PodSet) field.ErrorList {
-	sliceSizeValue, sliceSizeFound := replicaMetadata.Annotations[kueuealpha.PodSetSliceSizeAnnotation]
+	sliceSizeValue, sliceSizeFound := replicaMetadata.Annotations[kueuebeta.PodSetSliceSizeAnnotation]
 	if !sliceSizeFound || podSet == nil {
 		return nil
 	}
@@ -137,7 +136,7 @@ func ValidateSliceSizeAnnotationUpperBound(replicaPath *field.Path, replicaMetad
 	if err != nil {
 		return field.ErrorList{
 			field.Invalid(
-				annotationsPath.Key(kueuealpha.PodSetSliceSizeAnnotation), sliceSizeValue, "must be a numeric value",
+				annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), sliceSizeValue, "must be a numeric value",
 			),
 		}
 	}
@@ -145,7 +144,7 @@ func ValidateSliceSizeAnnotationUpperBound(replicaPath *field.Path, replicaMetad
 	if int32(val) > podSet.Count {
 		return field.ErrorList{
 			field.Invalid(
-				annotationsPath.Key(kueuealpha.PodSetSliceSizeAnnotation), sliceSizeValue,
+				annotationsPath.Key(kueuebeta.PodSetSliceSizeAnnotation), sliceSizeValue,
 				fmt.Sprintf("must not be greater than pod set count %d", podSet.Count),
 			),
 		}
diff --git a/pkg/controller/jobs/pod/pod_controller.go b/pkg/controller/jobs/pod/pod_controller.go
index 2501edac3..a4c1d1dd6 100644
--- a/pkg/controller/jobs/pod/pod_controller.go
+++ b/pkg/controller/jobs/pod/pod_controller.go
@@ -43,7 +43,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/controller"
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -389,12 +388,38 @@ func (p *Pod) PodSets() ([]kueue.PodSet, error) {
 	}
 }
 
-// IsActive returns true if there are any running pods.
+// IsActive reports whether a Pod or PodGroup should be considered active.
+//
+// For regular Pod, return value is always false.
+//
+// For Pod group, return true if there is at least a single Active pod in the group.
+// A Pod is considered active if it is in the Running phase and has not exceeded
+// its deletion grace period. Pods in other phases are ignored. If a Pod is
+// terminating (has a DeletionTimestamp) and its grace period has already
+// elapsed, it is treated as inactive. This prevents workloads from being
+// blocked by Pods that are stuck terminating, ensuring quota can be released
+// and new Pods admitted.
 func (p *Pod) IsActive() bool {
 	for i := range p.list.Items {
-		if p.list.Items[i].Status.Phase == corev1.PodRunning {
-			return true
+		pod := p.list.Items[i]
+
+		// Pods that are not in the Running phase are never considered Active.
+		if pod.Status.Phase != corev1.PodRunning {
+			continue
+		}
+
+		// If a pod is stuck terminating (e.g., due to a lost node), we should avoid
+		// counting as Active, as doing so could block the workload to release acquired quota.
+		if pod.DeletionTimestamp != nil && pod.DeletionGracePeriodSeconds != nil {
+			now := p.clock.Now()
+			gracePeriod := time.Duration(*pod.DeletionGracePeriodSeconds) * time.Second
+			if now.After(pod.DeletionTimestamp.Add(gracePeriod)) {
+				continue
+			}
 		}
+
+		// At this point, the pod is Running and not stuck terminating — count as active.
+		return true
 	}
 	return false
 }
@@ -661,7 +686,7 @@ func constructPodSet(p *corev1.Pod) (kueue.PodSet, error) {
 	if features.Enabled(features.TopologyAwareScheduling) {
 		topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 			&p.ObjectMeta).PodIndexLabel(
-			ptr.To(kueuealpha.PodGroupPodIndexLabel)).Build()
+			ptr.To(kueue.PodGroupPodIndexLabel)).Build()
 		if err != nil {
 			return kueue.PodSet{}, err
 		}
@@ -738,7 +763,7 @@ func (p *Pod) validatePodGroupMetadata(r record.EventRecorder, activePods []core
 		return err
 	}
 
-	_, err = utilpod.ReadUIntFromLabelBelowBound(p.Object(), kueuealpha.PodGroupPodIndexLabel, groupTotalCount)
+	_, err = utilpod.ReadUIntFromLabelBelowBound(p.Object(), kueue.PodGroupPodIndexLabel, groupTotalCount)
 	if utilpod.IgnoreLabelNotFoundError(err) != nil {
 		return err
 	}
@@ -1378,10 +1403,10 @@ func prepare(pod *corev1.Pod, info podset.PodSetInfo) error {
 	utilpod.Ungate(pod, podconstants.SchedulingGateName)
 	// Remove the TopologySchedulingGate if the Pod is scheduled without using TAS
 	found := slices.ContainsFunc(info.SchedulingGates, func(g corev1.PodSchedulingGate) bool {
-		return g.Name == kueuealpha.TopologySchedulingGate
+		return g.Name == kueue.TopologySchedulingGate
 	})
 	if !found {
-		utilpod.Ungate(pod, kueuealpha.TopologySchedulingGate)
+		utilpod.Ungate(pod, kueue.TopologySchedulingGate)
 	}
 	return nil
 }
diff --git a/pkg/controller/jobs/pod/pod_webhook.go b/pkg/controller/jobs/pod/pod_webhook.go
index 19dbc3542..d0ac38e67 100644
--- a/pkg/controller/jobs/pod/pod_webhook.go
+++ b/pkg/controller/jobs/pod/pod_webhook.go
@@ -33,7 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	"sigs.k8s.io/kueue/pkg/constants"
 	ctrlconstants "sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/controller/jobs/statefulset/statefulset_webhook.go b/pkg/controller/jobs/statefulset/statefulset_webhook.go
index bfb97b07d..eacaae068 100644
--- a/pkg/controller/jobs/statefulset/statefulset_webhook.go
+++ b/pkg/controller/jobs/statefulset/statefulset_webhook.go
@@ -31,7 +31,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconstants "sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/controller/tas/indexer/indexer.go b/pkg/controller/tas/indexer/indexer.go
index d8fba3938..d3eca5f6e 100644
--- a/pkg/controller/tas/indexer/indexer.go
+++ b/pkg/controller/tas/indexer/indexer.go
@@ -19,28 +19,37 @@ package indexer
 import (
 	"context"
 	"fmt"
+	"strconv"
 
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utiltas "sigs.k8s.io/kueue/pkg/util/tas"
 )
 
 const (
+	TASKey                        = "metadata.tas"
 	WorkloadNameKey               = "metadata.workload"
 	ReadyNode                     = "metadata.ready"
 	SchedulableNode               = "spec.schedulable"
 	ResourceFlavorTopologyNameKey = "spec.topologyName"
 )
 
+func indexPodTAS(o client.Object) []string {
+	pod, ok := o.(*corev1.Pod)
+	if !ok {
+		return nil
+	}
+	return []string{strconv.FormatBool(utiltas.IsTAS(pod))}
+}
+
 func indexPodWorkload(o client.Object) []string {
 	pod, ok := o.(*corev1.Pod)
 	if !ok {
 		return nil
 	}
-	value, found := pod.Annotations[kueuealpha.WorkloadAnnotation]
+	value, found := pod.Annotations[kueue.WorkloadAnnotation]
 	if !found {
 		return nil
 	}
@@ -77,6 +86,10 @@ func indexResourceFlavorTopologyName(o client.Object) []string {
 }
 
 func SetupIndexes(ctx context.Context, indexer client.FieldIndexer) error {
+	if err := indexer.IndexField(ctx, &corev1.Pod{}, TASKey, indexPodTAS); err != nil {
+		return fmt.Errorf("setting index pod TAS: %w", err)
+	}
+
 	if err := indexer.IndexField(ctx, &corev1.Pod{}, WorkloadNameKey, indexPodWorkload); err != nil {
 		return fmt.Errorf("setting index pod workload: %w", err)
 	}
diff --git a/pkg/controller/tas/topology_controller.go b/pkg/controller/tas/topology_controller.go
index 9d223e4c5..931c5ad40 100644
--- a/pkg/controller/tas/topology_controller.go
+++ b/pkg/controller/tas/topology_controller.go
@@ -36,7 +36,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -57,7 +56,7 @@ type topologyReconciler struct {
 }
 
 var _ reconcile.Reconciler = (*topologyReconciler)(nil)
-var _ predicate.TypedPredicate[*kueuealpha.Topology] = (*topologyReconciler)(nil)
+var _ predicate.TypedPredicate[*kueue.Topology] = (*topologyReconciler)(nil)
 
 func newTopologyReconciler(c client.Client, queues *qcache.Manager, cache *schdcache.Cache) *topologyReconciler {
 	return &topologyReconciler{
@@ -74,23 +73,23 @@ func (r *topologyReconciler) setupWithManager(mgr ctrl.Manager, cfg *configapi.C
 		Named("tas_topology_controller").
 		WatchesRawSource(source.TypedKind(
 			mgr.GetCache(),
-			&kueuealpha.Topology{},
-			&handler.TypedEnqueueRequestForObject[*kueuealpha.Topology]{},
+			&kueue.Topology{},
+			&handler.TypedEnqueueRequestForObject[*kueue.Topology]{},
 			r,
 		)).
 		WithOptions(controller.Options{
 			NeedLeaderElection:      ptr.To(false),
-			MaxConcurrentReconciles: mgr.GetControllerOptions().GroupKindConcurrency[kueuealpha.GroupVersion.WithKind("Topology").GroupKind().String()],
+			MaxConcurrentReconciles: mgr.GetControllerOptions().GroupKindConcurrency[kueue.GroupVersion.WithKind("Topology").GroupKind().String()],
 		}).
 		Watches(&kueue.ResourceFlavor{}, &resourceFlavorHandler{}).
-		Complete(core.WithLeadingManager(mgr, r, &kueuealpha.Topology{}, cfg))
+		Complete(core.WithLeadingManager(mgr, r, &kueue.Topology{}, cfg))
 }
 
 // +kubebuilder:rbac:groups=kueue.x-k8s.io,resources=topologies,verbs=get;list;watch;update
 // +kubebuilder:rbac:groups=kueue.x-k8s.io,resources=topologies/finalizers,verbs=update
 
 func (r *topologyReconciler) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) {
-	topology := &kueuealpha.Topology{}
+	topology := &kueue.Topology{}
 	if err := r.client.Get(ctx, req.NamespacedName, topology); err != nil {
 		// we'll ignore not-found errors, since there is nothing to do.
 		return ctrl.Result{}, client.IgnoreNotFound(err)
@@ -127,11 +126,11 @@ func (r *topologyReconciler) Reconcile(ctx context.Context, req reconcile.Reques
 	return reconcile.Result{}, nil
 }
 
-func (r *topologyReconciler) Generic(event.TypedGenericEvent[*kueuealpha.Topology]) bool {
+func (r *topologyReconciler) Generic(event.TypedGenericEvent[*kueue.Topology]) bool {
 	return false
 }
 
-func (r *topologyReconciler) Create(e event.TypedCreateEvent[*kueuealpha.Topology]) bool {
+func (r *topologyReconciler) Create(e event.TypedCreateEvent[*kueue.Topology]) bool {
 	log := r.log.WithValues("topology", klog.KObj(e.Object))
 	log.V(2).Info("Topology create event")
 
@@ -140,11 +139,11 @@ func (r *topologyReconciler) Create(e event.TypedCreateEvent[*kueuealpha.Topolog
 	return true
 }
 
-func (r *topologyReconciler) Update(event.TypedUpdateEvent[*kueuealpha.Topology]) bool {
+func (r *topologyReconciler) Update(event.TypedUpdateEvent[*kueue.Topology]) bool {
 	return true
 }
 
-func (r *topologyReconciler) Delete(e event.TypedDeleteEvent[*kueuealpha.Topology]) bool {
+func (r *topologyReconciler) Delete(e event.TypedDeleteEvent[*kueue.Topology]) bool {
 	log := r.log.WithValues("topology", klog.KObj(e.Object))
 	log.V(2).Info("Topology delete event")
 
diff --git a/pkg/controller/tas/topology_ungater.go b/pkg/controller/tas/topology_ungater.go
index 242ef947a..70ef8a1a0 100644
--- a/pkg/controller/tas/topology_ungater.go
+++ b/pkg/controller/tas/topology_ungater.go
@@ -41,7 +41,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
@@ -135,18 +134,18 @@ func (h *podHandler) queueReconcileForPod(ctx context.Context, object client.Obj
 	if !isPod {
 		return
 	}
-	if _, found := pod.Labels[kueuealpha.TASLabel]; !found {
+	if !utiltas.IsTAS(pod) {
 		// skip non-TAS pods
 		return
 	}
-	if wlName, found := pod.Annotations[kueuealpha.WorkloadAnnotation]; found {
+	if wlName, found := pod.Annotations[kueue.WorkloadAnnotation]; found {
 		key := types.NamespacedName{
 			Name:      wlName,
 			Namespace: pod.Namespace,
 		}
 		// it is possible that the pod is removed before the gate removal, so
 		// we also need to consider deleted pod as ungated.
-		if !utilpod.HasGate(pod, kueuealpha.TopologySchedulingGate) || deleted {
+		if !utilpod.HasGate(pod, kueue.TopologySchedulingGate) || deleted {
 			log := ctrl.LoggerFrom(ctx).WithValues("pod", klog.KObj(pod), "workload", key.String())
 			h.expectationsStore.ObservedUID(log, key, pod.UID)
 		}
@@ -242,7 +241,7 @@ func (r *topologyUngater) Reconcile(ctx context.Context, req reconcile.Request)
 		var ungated bool
 		e := utilclient.Patch(ctx, r.client, podWithUngateInfo.pod, func() (client.Object, bool, error) {
 			log.V(3).Info("ungating pod", "pod", klog.KObj(podWithUngateInfo.pod), "nodeLabels", podWithUngateInfo.nodeLabels)
-			ungated = utilpod.Ungate(podWithUngateInfo.pod, kueuealpha.TopologySchedulingGate)
+			ungated = utilpod.Ungate(podWithUngateInfo.pod, kueue.TopologySchedulingGate)
 			if podWithUngateInfo.pod.Spec.NodeSelector == nil {
 				podWithUngateInfo.pod.Spec.NodeSelector = make(map[string]string)
 			}
@@ -366,7 +365,7 @@ func assignGatedPodsToDomainsGreedy(
 	gatedPods := make([]*corev1.Pod, 0)
 	domainIDToUngatedCnt := make(map[utiltas.TopologyDomainID]int32)
 	for _, pod := range pods {
-		if utilpod.HasGate(pod, kueuealpha.TopologySchedulingGate) {
+		if utilpod.HasGate(pod, kueue.TopologySchedulingGate) {
 			gatedPods = append(gatedPods, pod)
 		} else {
 			levelValues := utiltas.LevelValues(levelKeys, pod.Spec.NodeSelector)
diff --git a/pkg/dra/claims.go b/pkg/dra/claims.go
new file mode 100644
index 000000000..cbacc7b16
--- /dev/null
+++ b/pkg/dra/claims.go
@@ -0,0 +1,134 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dra
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"strconv"
+
+	corev1 "k8s.io/api/core/v1"
+	resourcev1beta2 "k8s.io/api/resource/v1beta2"
+	"k8s.io/apimachinery/pkg/api/resource"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	"sigs.k8s.io/kueue/pkg/resources"
+	utilresource "sigs.k8s.io/kueue/pkg/util/resource"
+)
+
+var (
+	ErrDeviceClassNotMapped = errors.New("DeviceClass is not mapped in DRA configuration")
+	ErrResourceClaimInUse   = errors.New("ResourceClaim is in use")
+	ErrClaimSpecNotFound    = errors.New("failed to get claim spec")
+)
+
+// countDevicesPerClass returns a resources.Requests representing the
+// total number of devices requested for each DeviceClass inside the provided
+// ResourceClaimSpec.
+func countDevicesPerClass(claimSpec *resourcev1beta2.ResourceClaimSpec) resources.Requests {
+	out := resources.Requests{}
+	if claimSpec == nil {
+		return out
+	}
+	for _, req := range claimSpec.Devices.Requests {
+		// v1beta2 DeviceRequest has Exactly or FirstAvailable. For Step 1, we
+		// preserve existing semantics by only supporting Exactly with Count.
+		var dcName string
+		var q int64
+		if req.Exactly != nil {
+			dcName = req.Exactly.DeviceClassName
+			if req.Exactly.AllocationMode == resourcev1beta2.DeviceAllocationModeExactCount {
+				q = req.Exactly.Count
+			}
+		}
+		dc := corev1.ResourceName(dcName)
+		if dc == "" {
+			continue
+		}
+		// TODO: handle other Allocation modes
+		out[dc] += q
+	}
+	return out
+}
+
+// getClaimSpec resolves the ResourceClaim(Template) referenced by the PodResourceClaim
+// and returns its *ResourceClaimSpec. A nil spec and nil error mean the reference is
+// empty (both name pointers are nil) and should be skipped.
+func getClaimSpec(ctx context.Context, cl client.Client, namespace string, prc corev1.PodResourceClaim) (*resourcev1beta2.ResourceClaimSpec, error) {
+	switch {
+	case prc.ResourceClaimTemplateName != nil:
+		var tmpl resourcev1beta2.ResourceClaimTemplate
+		if err := cl.Get(ctx, client.ObjectKey{Namespace: namespace, Name: *prc.ResourceClaimTemplateName}, &tmpl); err != nil {
+			return nil, err
+		}
+		return &tmpl.Spec.Spec, nil
+	case prc.ResourceClaimName != nil:
+		var claim resourcev1beta2.ResourceClaim
+		if err := cl.Get(ctx, client.ObjectKey{Namespace: namespace, Name: *prc.ResourceClaimName}, &claim); err != nil {
+			return nil, err
+		}
+		return &claim.Spec, nil
+	default:
+		return nil, nil
+	}
+}
+
+// GetResourceRequestsForResourceClaimTemplates walks all ResourceClaimTemplates referenced by each PodSet of the Workload,
+// converts DeviceClass counts into logical resources using the provided lookup function and
+// returns the aggregated quantities per PodSet.
+//
+// If at least one DeviceClass is not present in the DRA configuration the function
+// returns an error.
+func GetResourceRequestsForResourceClaimTemplates(
+	ctx context.Context,
+	cl client.Client,
+	wl *kueue.Workload) (map[kueue.PodSetReference]corev1.ResourceList, error) {
+	perPodSet := make(map[kueue.PodSetReference]corev1.ResourceList)
+	for i := range wl.Spec.PodSets {
+		ps := &wl.Spec.PodSets[i]
+		aggregated := corev1.ResourceList{}
+
+		for _, prc := range ps.Template.Spec.ResourceClaims {
+			if prc.ResourceClaimTemplateName == nil {
+				continue
+			}
+			spec, err := getClaimSpec(ctx, cl, wl.Namespace, prc)
+			if err != nil {
+				return nil, fmt.Errorf("failed to get claim spec for ResourceClaimTemplate %s in workload %s podset %s: %w", *prc.ResourceClaimTemplateName, wl.Name, ps.Name, fmt.Errorf("%w: %v", ErrClaimSpecNotFound, err))
+			}
+			if spec == nil {
+				continue
+			}
+
+			for dc, qty := range countDevicesPerClass(spec) {
+				logical, found := Mapper().lookup(dc)
+				if !found {
+					return nil, fmt.Errorf("DeviceClass %s is not mapped in DRA configuration for workload %s podset %s: %w", dc, wl.Name, ps.Name, ErrDeviceClassNotMapped)
+				}
+				aggregated = utilresource.MergeResourceListKeepSum(aggregated, corev1.ResourceList{logical: resource.MustParse(strconv.FormatInt(qty, 10))})
+			}
+		}
+
+		if len(aggregated) > 0 {
+			perPodSet[ps.Name] = aggregated
+		}
+	}
+
+	return perPodSet, nil
+}
diff --git a/pkg/dra/mapper.go b/pkg/dra/mapper.go
new file mode 100644
index 000000000..ed64e8a07
--- /dev/null
+++ b/pkg/dra/mapper.go
@@ -0,0 +1,79 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dra
+
+import (
+	"sync"
+
+	corev1 "k8s.io/api/core/v1"
+
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+)
+
+var (
+	globalMapper     *ResourceMapper
+	globalMapperOnce sync.Once
+)
+
+// ResourceMapper provides device class to logical resource name mapping
+// based on Configuration API DRA settings. Initialized once at startup, immutable during runtime.
+// No locks needed due to startup-only initialization pattern.
+type ResourceMapper struct {
+	deviceClassToResource map[corev1.ResourceName]corev1.ResourceName
+}
+
+// newDRAResourceMapper creates a new empty ResourceMapper instance.
+func newDRAResourceMapper() *ResourceMapper {
+	return &ResourceMapper{
+		deviceClassToResource: make(map[corev1.ResourceName]corev1.ResourceName),
+	}
+}
+
+// Returns (logicalResourceName, true) on success or ("", false) when the device class is not mapped.
+func (m *ResourceMapper) lookup(deviceClass corev1.ResourceName) (corev1.ResourceName, bool) {
+	logicalResource, found := m.deviceClassToResource[deviceClass]
+	return logicalResource, found
+}
+
+func (m *ResourceMapper) populateFromConfiguration(mappings []configapi.DeviceClassMapping) error {
+	if mappings == nil {
+		return nil
+	}
+	newMapping := make(map[corev1.ResourceName]corev1.ResourceName)
+	for _, mapping := range mappings {
+		for _, deviceClassName := range mapping.DeviceClassNames {
+			newMapping[deviceClassName] = mapping.Name
+		}
+	}
+
+	m.deviceClassToResource = newMapping
+	return nil
+}
+
+// Mapper returns the singleton DRA mapper instance initializing the mapper lazily on first access.
+func Mapper() *ResourceMapper {
+	globalMapperOnce.Do(func() {
+		globalMapper = newDRAResourceMapper()
+	})
+	return globalMapper
+}
+
+// CreateMapperFromConfiguration creates and populates the global DRA mapper from Configuration API.
+// This is called ONCE during Kueue startup when configuration is loaded.
+func CreateMapperFromConfiguration(mappings []configapi.DeviceClassMapping) error {
+	return Mapper().populateFromConfiguration(mappings)
+}
diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go
index c9ddc189c..ff1e929ec 100644
--- a/pkg/features/kube_features.go
+++ b/pkg/features/kube_features.go
@@ -181,6 +181,12 @@ const (
 	// In flavor fungibility, the preference whether to preempt or borrow is inferred from flavor fungibility policy
 	// This feature gate is going to be replaced by an API before graduation or deprecation.
 	FlavorFungibilityImplicitPreferenceDefault featuregate.Feature = "FlavorFungibilityImplicitPreferenceDefault"
+
+	// owner: @alaypatel07
+	// kep: https://github.com/kubernetes-sigs/kueue/tree/main/keps/2941-DRA
+	//
+	// Enable quota accounting for Dynamic Resource Allocation (DRA) devies in workloads
+	DynamicResourceAllocation featuregate.Feature = "DynamicResourceAllocation"
 )
 
 func init() {
@@ -226,6 +232,7 @@ var defaultVersionedFeatureGates = map[featuregate.Feature]featuregate.Versioned
 	},
 	TopologyAwareScheduling: {
 		{Version: version.MustParse("0.9"), Default: false, PreRelease: featuregate.Alpha},
+		{Version: version.MustParse("0.14"), Default: true, PreRelease: featuregate.Beta},
 	},
 	ConfigurableResourceTransformations: {
 		{Version: version.MustParse("0.9"), Default: false, PreRelease: featuregate.Alpha},
@@ -282,6 +289,9 @@ var defaultVersionedFeatureGates = map[featuregate.Feature]featuregate.Versioned
 	FlavorFungibilityImplicitPreferenceDefault: {
 		{Version: version.MustParse("0.13"), Default: false, PreRelease: featuregate.Alpha},
 	},
+	DynamicResourceAllocation: {
+		{Version: version.MustParse("0.14"), Default: false, PreRelease: featuregate.Alpha},
+	},
 }
 
 func SetFeatureGateDuringTest(tb testing.TB, f featuregate.Feature, value bool) {
diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go
index 7716a26ec..024b020f5 100644
--- a/pkg/metrics/metrics.go
+++ b/pkg/metrics/metrics.go
@@ -134,7 +134,7 @@ The label 'result' can have the following values:
 			Subsystem: constants.KueueName,
 			Name:      "quota_reserved_workloads_total",
 			Help:      "The total number of quota reserved workloads per 'cluster_queue'",
-		}, []string{"cluster_queue"},
+		}, []string{"cluster_queue", "workload_priority_class"},
 	)
 
 	LocalQueueQuotaReservedWorkloadsTotal = prometheus.NewCounterVec(
@@ -201,13 +201,13 @@ The label 'underlying_cause' can have the following values:
 		}, []string{"name", "namespace"},
 	)
 
-	admissionWaitTime = prometheus.NewHistogramVec(
+	AdmissionWaitTime = prometheus.NewHistogramVec(
 		prometheus.HistogramOpts{
 			Subsystem: constants.KueueName,
 			Name:      "admission_wait_time_seconds",
 			Help:      "The time between a workload was created or requeued until admission, per 'cluster_queue'",
 			Buckets:   generateExponentialBuckets(14),
-		}, []string{"cluster_queue"},
+		}, []string{"cluster_queue", "workload_priority_class"},
 	)
 
 	queuedUntilReadyWaitTime = prometheus.NewHistogramVec(
@@ -291,7 +291,7 @@ The label 'underlying_cause' can have the following values:
 - "AdmissionCheck" means that the workload was evicted by Kueue due to a rejected admission check.
 - "MaximumExecutionTimeExceeded" means that the workload was evicted by Kueue due to maximum execution time exceeded.
 - "RequeuingLimitExceeded" means that the workload was evicted by Kueue due to requeuing limit exceeded.`,
-		}, []string{"cluster_queue", "reason", "underlying_cause"},
+		}, []string{"cluster_queue", "reason", "underlying_cause", "workload_priority_class"},
 	)
 
 	ReplacedWorkloadSlicesTotal = prometheus.NewCounterVec(
@@ -343,7 +343,7 @@ The label 'detailed_reason' can have the following values:
 - "AdmissionCheck" means that the workload was evicted by Kueue due to a rejected admission check.
 - "MaximumExecutionTimeExceeded" means that the workload was evicted by Kueue due to maximum execution time exceeded.
 - "RequeuingLimitExceeded" means that the workload was evicted by Kueue due to requeuing limit exceeded.`,
-		}, []string{"cluster_queue", "reason", "detailed_reason"},
+		}, []string{"cluster_queue", "reason", "detailed_reason", "workload_priority_class"},
 	)
 
 	PreemptedWorkloadsTotal = prometheus.NewCounterVec(
@@ -510,8 +510,8 @@ func AdmissionAttempt(result AdmissionResult, duration time.Duration) {
 	admissionAttemptDuration.WithLabelValues(string(result)).Observe(duration.Seconds())
 }
 
-func QuotaReservedWorkload(cqName kueue.ClusterQueueReference, waitTime time.Duration) {
-	QuotaReservedWorkloadsTotal.WithLabelValues(string(cqName)).Inc()
+func QuotaReservedWorkload(cqName kueue.ClusterQueueReference, workloadPriorityClass string, waitTime time.Duration) {
+	QuotaReservedWorkloadsTotal.WithLabelValues(string(cqName), workloadPriorityClass).Inc()
 	quotaReservedWaitTime.WithLabelValues(string(cqName)).Observe(waitTime.Seconds())
 }
 
@@ -522,7 +522,7 @@ func LocalQueueQuotaReservedWorkload(lq LocalQueueReference, waitTime time.Durat
 
 func AdmittedWorkload(cqName kueue.ClusterQueueReference, workloadPriorityClass string, waitTime time.Duration) {
 	AdmittedWorkloadsTotal.WithLabelValues(string(cqName), workloadPriorityClass).Inc()
-	admissionWaitTime.WithLabelValues(string(cqName)).Observe(waitTime.Seconds())
+	AdmissionWaitTime.WithLabelValues(string(cqName), workloadPriorityClass).Observe(waitTime.Seconds())
 }
 
 func LocalQueueAdmittedWorkload(lq LocalQueueReference, waitTime time.Duration) {
@@ -564,8 +564,8 @@ func ReportLocalQueuePendingWorkloads(lq LocalQueueReference, active, inadmissib
 	LocalQueuePendingWorkloads.WithLabelValues(string(lq.Name), lq.Namespace, PendingStatusInadmissible).Set(float64(inadmissible))
 }
 
-func ReportEvictedWorkloads(cqName kueue.ClusterQueueReference, evictionReason, underlyingCause string) {
-	EvictedWorkloadsTotal.WithLabelValues(string(cqName), evictionReason, underlyingCause).Inc()
+func ReportEvictedWorkloads(cqName kueue.ClusterQueueReference, evictionReason, underlyingCause, workloadPriorityClass string) {
+	EvictedWorkloadsTotal.WithLabelValues(string(cqName), evictionReason, underlyingCause, workloadPriorityClass).Inc()
 }
 
 func ReportReplacedWorkloadSlices(cqName kueue.ClusterQueueReference) {
@@ -576,8 +576,8 @@ func ReportLocalQueueEvictedWorkloads(lq LocalQueueReference, reason, underlying
 	LocalQueueEvictedWorkloadsTotal.WithLabelValues(string(lq.Name), lq.Namespace, reason, underlyingCause).Inc()
 }
 
-func ReportEvictedWorkloadsOnce(cqName kueue.ClusterQueueReference, reason, underlyingCause string) {
-	EvictedWorkloadsOnceTotal.WithLabelValues(string(cqName), reason, underlyingCause).Inc()
+func ReportEvictedWorkloadsOnce(cqName kueue.ClusterQueueReference, reason, underlyingCause, workloadPriorityClass string) {
+	EvictedWorkloadsOnceTotal.WithLabelValues(string(cqName), reason, underlyingCause, workloadPriorityClass).Inc()
 }
 
 func ReportPreemption(preemptingCqName kueue.ClusterQueueReference, preemptingReason string, targetCqName kueue.ClusterQueueReference) {
@@ -595,13 +595,11 @@ func ClearClusterQueueMetrics(cqName string) {
 	AdmissionCyclePreemptionSkips.DeleteLabelValues(cqName)
 	PendingWorkloads.DeleteLabelValues(cqName, PendingStatusActive)
 	PendingWorkloads.DeleteLabelValues(cqName, PendingStatusInadmissible)
-	QuotaReservedWorkloadsTotal.DeleteLabelValues(cqName)
+	QuotaReservedWorkloadsTotal.DeletePartialMatch(prometheus.Labels{"cluster_queue": cqName})
 	quotaReservedWaitTime.DeleteLabelValues(cqName)
 	PodsReadyToEvictedTimeSeconds.DeleteLabelValues(cqName)
-	AdmittedWorkloadsTotal.DeletePartialMatch(prometheus.Labels{
-		"cluster_queue": cqName,
-	})
-	admissionWaitTime.DeleteLabelValues(cqName)
+	AdmittedWorkloadsTotal.DeletePartialMatch(prometheus.Labels{"cluster_queue": cqName})
+	AdmissionWaitTime.DeletePartialMatch(prometheus.Labels{"cluster_queue": cqName})
 	admissionChecksWaitTime.DeleteLabelValues(cqName)
 	queuedUntilReadyWaitTime.DeleteLabelValues(cqName)
 	admittedUntilReadyWaitTime.DeleteLabelValues(cqName)
@@ -776,7 +774,7 @@ func Register() {
 		EvictedWorkloadsTotal,
 		EvictedWorkloadsOnceTotal,
 		PreemptedWorkloadsTotal,
-		admissionWaitTime,
+		AdmissionWaitTime,
 		admissionChecksWaitTime,
 		queuedUntilReadyWaitTime,
 		admittedUntilReadyWaitTime,
diff --git a/pkg/podset/podset.go b/pkg/podset/podset.go
index df03097b6..3ec3c5169 100644
--- a/pkg/podset/podset.go
+++ b/pkg/podset/podset.go
@@ -30,7 +30,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	utilmaps "sigs.k8s.io/kueue/pkg/util/maps"
@@ -53,19 +52,24 @@ type PodSetInfo struct {
 
 // FromAssignment returns a PodSetInfo based on the provided assignment and an error if unable
 // to get any of the referenced flavors.
-func FromAssignment(ctx context.Context, client client.Client, assignment *kueue.PodSetAssignment, defaultCount int32) (PodSetInfo, error) {
+func FromAssignment(ctx context.Context, client client.Client, assignment *kueue.PodSetAssignment, podSet *kueue.PodSet) (PodSetInfo, error) {
 	processedFlvs := sets.New[kueue.ResourceFlavorReference]()
 	info := PodSetInfo{
 		Name:         assignment.Name,
 		NodeSelector: make(map[string]string),
-		Count:        ptr.Deref(assignment.Count, defaultCount),
+		Count:        ptr.Deref(assignment.Count, podSet.Count),
 		Labels:       make(map[string]string),
 		Annotations:  make(map[string]string),
 	}
 	if features.Enabled(features.TopologyAwareScheduling) && assignment.TopologyAssignment != nil {
-		info.Labels[kueuealpha.TASLabel] = "true"
+		// For implicit TAS we inject the "unconstrained" topology by default, even if unspecified.
+		if podSet.TopologyRequest == nil || (podSet.TopologyRequest.Preferred == nil &&
+			podSet.TopologyRequest.Required == nil &&
+			podSet.TopologyRequest.Unconstrained == nil) {
+			info.Annotations[kueue.PodSetUnconstrainedTopologyAnnotation] = "true"
+		}
 		info.SchedulingGates = append(info.SchedulingGates, corev1.PodSchedulingGate{
-			Name: kueuealpha.TopologySchedulingGate,
+			Name: kueue.TopologySchedulingGate,
 		})
 	}
 	for _, flvRef := range assignment.Flavors {
diff --git a/pkg/scheduler/preemption/preemption.go b/pkg/scheduler/preemption/preemption.go
index 6030bdd7a..352e150aa 100644
--- a/pkg/scheduler/preemption/preemption.go
+++ b/pkg/scheduler/preemption/preemption.go
@@ -182,7 +182,7 @@ func (p *Preemptor) IssuePreemptions(ctx context.Context, preemptor *workload.In
 				return
 			}
 
-			log.V(3).Info("Preempted", "targetWorkload", klog.KObj(target.WorkloadInfo.Obj), "preemptingWorkload", klog.KObj(preemptor.Obj), "reason", target.Reason, "message", message, "targetClusterQueue", klog.KRef("", string(target.WorkloadInfo.ClusterQueue)))
+			log.V(3).Info("Preempted", "targetWorkload", klog.KObj(target.WorkloadInfo.Obj), "preemptingWorkload", klog.KObj(preemptor.Obj), "preemptorUID", string(preemptor.Obj.UID), "preemptorJobUID", preemptor.Obj.Labels[constants.JobUIDLabel], "reason", target.Reason, "message", message, "targetClusterQueue", klog.KRef("", string(target.WorkloadInfo.ClusterQueue)))
 			p.recorder.Eventf(target.WorkloadInfo.Obj, corev1.EventTypeNormal, "Preempted", message)
 			workload.ReportPreemption(preemptor.ClusterQueue, target.Reason, target.WorkloadInfo.ClusterQueue)
 		} else {
diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go
index 8985b71e2..2b3ce0efe 100644
--- a/pkg/scheduler/scheduler.go
+++ b/pkg/scheduler/scheduler.go
@@ -796,7 +796,7 @@ func (s *Scheduler) recordQuotaReservationMetrics(newWorkload, originalWorkload
 
 	s.recorder.Eventf(newWorkload, corev1.EventTypeNormal, "QuotaReserved", "Quota reserved in ClusterQueue %v, wait time since queued was %.0fs", admission.ClusterQueue, waitTime.Seconds())
 
-	metrics.QuotaReservedWorkload(admission.ClusterQueue, waitTime)
+	metrics.QuotaReservedWorkload(admission.ClusterQueue, workload.GetWorkloadPriorityClass(newWorkload), waitTime)
 	if features.Enabled(features.LocalQueueMetrics) {
 		metrics.LocalQueueQuotaReservedWorkload(metrics.LQRefFromWorkload(newWorkload), waitTime)
 	}
diff --git a/pkg/util/client/client.go b/pkg/util/client/client.go
index 9b8b6e82b..658ba087f 100644
--- a/pkg/util/client/client.go
+++ b/pkg/util/client/client.go
@@ -22,62 +22,152 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 )
 
-type ClientPatchOption func(*ClientPatchOptions)
-
-type ClientPatchOptions struct {
+// PatchOption defines a functional option for customizing PatchOptions.
+// It follows the functional options pattern, allowing callers to configure
+// patch behavior at call sites without directly manipulating PatchOptions.
+type PatchOption func(*PatchOptions)
+
+// PatchOptions contains configuration parameters that control how patches
+// are generated and applied.
+//
+// Fields:
+//   - Strict: Controls whether ResourceVersion should always be cleared
+//     from the "original" object to ensure its inclusion in the generated
+//     patch. Defaults to true. Setting Strict=false preserves the current
+//     ResourceVersion.
+//
+// Typically, PatchOptions are constructed via DefaultPatchOptions and
+// modified using PatchOption functions (e.g., WithStrict).
+type PatchOptions struct {
 	Strict bool
 }
 
-func DefaultClientPatchOptions() *ClientPatchOptions {
-	return &ClientPatchOptions{
+// DefaultPatchOptions returns a new PatchOptions instance configured with
+// default settings.
+//
+// By default, Strict is set to true, meaning ResourceVersion is cleared
+// from the original object so it will always be included in the generated
+// patch. This ensures stricter version handling during patch application.
+func DefaultPatchOptions() *PatchOptions {
+	return &PatchOptions{
 		Strict: true, // default is strict
 	}
 }
 
-func WithStrict(strict bool) ClientPatchOption {
-	return func(o *ClientPatchOptions) {
+// WithStrict returns a PatchOption that sets the Strict field on PatchOptions.
+//
+// By default, Strict is true. In strict mode, generated patches enforce stricter
+// behavior by clearing the ResourceVersion field from the "original" object.
+// This ensures that the ResourceVersion is always included in the generated patch
+// and taken into account during patch application.
+//
+// Example:
+//
+//	patch := clientutil.Patch(ctx, c, obj, true, func() (bool, error) {
+//	    return updateFn(obj), nil
+//	}, WithStrict(false)) // disables strict mode
+func WithStrict(strict bool) PatchOption {
+	return func(o *PatchOptions) {
 		o.Strict = strict
 	}
 }
 
-func patchCommon(obj client.Object, update func() (client.Object, bool, error), patchFunc func(patch client.Patch) error, options ...ClientPatchOption) error {
-	opts := DefaultClientPatchOptions()
+func patchCommon(obj client.Object, update func() (client.Object, bool, error), patchFunc func(patch client.Patch) error, options ...PatchOption) error {
+	opts := DefaultPatchOptions()
 	for _, opt := range options {
 		opt(opts)
 	}
-	strict := opts.Strict
-	return updateAndPatch(obj, strict, update, patchFunc)
+	return updateAndPatch(obj, *opts, update, patchFunc)
 }
 
-// Patch applies the merge patch of client.Object.
-// If strict is true, the resourceVersion will be part of the patch, make this call fail if
-// client.Object was changed.
-func Patch(ctx context.Context, c client.Client, obj client.Object, update func() (client.Object, bool, error), options ...ClientPatchOption) error {
+// Patch applies an update to a Kubernetes object using a patch-based workflow.
+//
+// The function first computes the "original" and "modified" states of the object
+// by invoking the provided update callback, then generates a patch describing
+// the changes. Finally, it applies the patch through the given client.Client.
+//
+// Behavior is influenced by PatchOptions, which can be customized using
+// PatchOption functional arguments (e.g., WithStrict).
+//
+// Returns:
+//   - error: If patch generation or application fails, an error is returned.
+//
+// Example:
+//
+//	err := Patch(ctx, client, obj, func() (client.Object, bool, error) {
+//	    updated := obj.DeepCopyObject().(client.Object)
+//	    updated.SetLabels(map[string]string{"app": "demo"})
+//	    return updated, true, nil
+//	}, WithStrict(true))
+//	if err != nil {
+//	    log.Fatal(err)
+//	}
+//
+// Notes:
+//   - By default, patches are generated in "strict" mode (Strict=true).
+//     This clears the ResourceVersion field in the original object to ensure
+//     it is always included in the generated patch.
+func Patch(ctx context.Context, c client.Client, obj client.Object, update func() (client.Object, bool, error), options ...PatchOption) error {
 	return patchCommon(obj, update, func(patch client.Patch) error {
 		return c.Patch(ctx, obj, patch)
 	}, options...)
 }
 
-// PatchStatus applies the merge patch of client.Object status.
-// The resourceVersion will be part of the patch, make this call fail if
-// client.Object was changed.
-func PatchStatus(ctx context.Context, c client.Client, obj client.Object, update func() (client.Object, bool, error), options ...ClientPatchOption) error {
+// PatchStatus applies an update to the *status* subresource of a Kubernetes object
+// using a patch-based workflow.
+//
+// The function computes the "original" and "modified" states of the object by
+// invoking the provided update callback, generates a patch describing the changes,
+// and applies the patch specifically through the client's status interface
+// (c.Status().Patch).
+//
+// Behavior is influenced by PatchOptions, which can be customized using
+// PatchOption functional arguments (e.g., WithStrict).
+//
+// Returns:
+//   - error: If patch generation or application fails, an error is returned.
+//
+// Example:
+//
+//	err := PatchStatus(ctx, client, obj, func() (client.Object, bool, error) {
+//	    updated := obj.DeepCopyObject().(client.Object)
+//	    myObj := updated.(*myv1.MyCustomResource)
+//	    myObj.Status.Phase = "Ready"
+//	    return updated, true, nil
+//	})
+//	if err != nil {
+//	    log.Fatal(err)
+//	}
+//
+// Notes:
+//   - By default, patches are generated in "strict" mode (Strict=true).
+//     This clears the ResourceVersion field in the original object to ensure
+//     it is always included in the generated patch.
+func PatchStatus(ctx context.Context, c client.Client, obj client.Object, update func() (client.Object, bool, error), options ...PatchOption) error {
 	return patchCommon(obj, update, func(patch client.Patch) error {
 		return c.Status().Patch(ctx, obj, patch)
 	}, options...)
 }
 
-func getOriginalObject(obj client.Object, strict bool) client.Object {
+// getOriginalObject creates and returns a deep copy of the given client.Object.
+// The copy represents the "original" state of the object before applying any
+// modifications. This is typically used when generating a patch.
+//
+// If PatchOptions.Strict is set to true, the function clears the
+// ResourceVersion field on the copied object. This ensures that the
+// ResourceVersion is included in the generated patch, enforcing stricter
+// version handling during patch application.
+func getOriginalObject(obj client.Object, options PatchOptions) client.Object {
 	objOriginal := obj.DeepCopyObject().(client.Object)
-	if strict {
+	if options.Strict {
 		// Clearing ResourceVersion from the original object to make sure it is included in the generated patch.
 		objOriginal.SetResourceVersion("")
 	}
 	return objOriginal
 }
 
-func updateAndPatch(obj client.Object, strict bool, update func() (client.Object, bool, error), patchFn func(client.Patch) error) error {
-	objOriginal := getOriginalObject(obj, strict)
+func updateAndPatch(obj client.Object, options PatchOptions, update func() (client.Object, bool, error), patchFn func(client.Patch) error) error {
+	objOriginal := getOriginalObject(obj, options)
 	objPatched, updated, err := update()
 	if err != nil || !updated {
 		return err
diff --git a/pkg/util/tas/tas.go b/pkg/util/tas/tas.go
index 197ee846e..2289d0c37 100644
--- a/pkg/util/tas/tas.go
+++ b/pkg/util/tas/tas.go
@@ -21,7 +21,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
 type TopologyDomainID string
@@ -30,6 +30,30 @@ func DomainID(levelValues []string) TopologyDomainID {
 	return TopologyDomainID(strings.Join(levelValues, ","))
 }
 
+func IsTAS(pod *corev1.Pod) bool {
+	if IsExplicitTAS(pod.Annotations) {
+		return true
+	}
+	if _, ok := pod.Annotations[kueue.PodSetUnconstrainedTopologyAnnotation]; ok {
+		return true
+	}
+	// TODO: remove after 0.16
+	if _, ok := pod.Labels[kueue.TASLabel]; ok {
+		return true
+	}
+	return false
+}
+
+func IsExplicitTAS(annots map[string]string) bool {
+	if _, ok := annots[kueue.PodSetPreferredTopologyAnnotation]; ok {
+		return true
+	}
+	if _, ok := annots[kueue.PodSetRequiredTopologyAnnotation]; ok {
+		return true
+	}
+	return false
+}
+
 func NodeLabelsFromKeysAndValues(keys, values []string) map[string]string {
 	result := make(map[string]string, len(keys))
 	for i := range keys {
@@ -46,7 +70,7 @@ func LevelValues(levelKeys []string, objectLabels map[string]string) []string {
 	return levelValues
 }
 
-func Levels(topology *kueuealpha.Topology) []string {
+func Levels(topology *kueue.Topology) []string {
 	result := make([]string, len(topology.Spec.Levels))
 	for i, level := range topology.Spec.Levels {
 		result[i] = level.NodeLabel
diff --git a/pkg/workload/workload.go b/pkg/workload/workload.go
index 660c9e1e8..ff3e1d199 100644
--- a/pkg/workload/workload.go
+++ b/pkg/workload/workload.go
@@ -96,9 +96,15 @@ type AssignmentClusterQueueState struct {
 	ClusterQueueGeneration int64
 }
 
+// dra holds DRA-specific configuration for workload.Info construction.
+type dra struct {
+	preprocessedDRAResources map[kueue.PodSetReference]corev1.ResourceList
+}
+
 type InfoOptions struct {
 	excludedResourcePrefixes []string
 	resourceTransformations  map[corev1.ResourceName]*config.ResourceTransformation
+	dra
 }
 
 type InfoOption func(*InfoOptions)
@@ -119,6 +125,15 @@ func WithResourceTransformations(transforms []config.ResourceTransformation) Inf
 	}
 }
 
+// WithPreprocessedDRAResources creates an InfoOption that provides preprocessed DRA resources.
+func WithPreprocessedDRAResources(draResources map[kueue.PodSetReference]corev1.ResourceList) InfoOption {
+	return func(o *InfoOptions) {
+		o.dra = dra{
+			preprocessedDRAResources: draResources,
+		}
+	}
+}
+
 func (s *AssignmentClusterQueueState) Clone() *AssignmentClusterQueueState {
 	c := AssignmentClusterQueueState{
 		LastTriedFlavorIdx:     make([]map[corev1.ResourceName]int, len(s.LastTriedFlavorIdx)),
@@ -475,9 +490,20 @@ func totalRequestsFromPodSets(wl *kueue.Workload, info *InfoOptions) []PodSetRes
 			effectiveRequests = applyResourceTransformations(effectiveRequests, info.resourceTransformations)
 		}
 		setRes.Requests = resources.NewRequests(effectiveRequests)
+		if features.Enabled(features.DynamicResourceAllocation) && info.preprocessedDRAResources != nil {
+			if draRes, exists := info.preprocessedDRAResources[ps.Name]; exists {
+				for resName, quantity := range draRes {
+					if setRes.Requests == nil {
+						setRes.Requests = make(resources.Requests)
+					}
+					setRes.Requests[resName] += resources.ResourceValue(resName, quantity)
+				}
+			}
+		}
 		setRes.Requests.Mul(int64(count))
 		res = append(res, setRes)
 	}
+
 	return res
 }
 
@@ -672,34 +698,49 @@ func BaseSSAWorkload(w *kueue.Workload, strict bool) *kueue.Workload {
 	return wlCopy
 }
 
-// SetQuotaReservation applies the provided admission to the workload.
-// The WorkloadAdmitted and WorkloadEvicted are added or updated if necessary.
+// SetQuotaReservation records that quota has been reserved for the given Workload
+// in the specified ClusterQueue and updates the Workload status accordingly.
+//
+// Effects:
+//   - Sets w.Status.Admission to the provided admission.
+//   - Adds or updates a Condition of type kueue.WorkloadQuotaReserved with
+//     Status=True, Reason="QuotaReserved", Message="Quota reserved in ClusterQueue <name>",
+//     and ObservedGeneration set to w.Generation. The message is truncated via
+//     api.TruncateConditionMessage.
+//   - Resets any active "evicted" and "preempted" conditions by invoking
+//     resetActiveCondition for kueue.WorkloadEvicted and kueue.WorkloadPreempted.
 func SetQuotaReservation(w *kueue.Workload, admission *kueue.Admission, clock clock.Clock) {
 	w.Status.Admission = admission
-	message := fmt.Sprintf("Quota reserved in ClusterQueue %s", w.Status.Admission.ClusterQueue)
-	admittedCond := metav1.Condition{
+
+	reason := "QuotaReserved"
+
+	apimeta.SetStatusCondition(&w.Status.Conditions, metav1.Condition{
 		Type:               kueue.WorkloadQuotaReserved,
 		Status:             metav1.ConditionTrue,
-		Reason:             "QuotaReserved",
-		Message:            api.TruncateConditionMessage(message),
+		Reason:             reason,
+		Message:            api.TruncateConditionMessage(fmt.Sprintf("Quota reserved in ClusterQueue %s", admission.ClusterQueue)),
 		ObservedGeneration: w.Generation,
-	}
-	apimeta.SetStatusCondition(&w.Status.Conditions, admittedCond)
+		LastTransitionTime: metav1.NewTime(clock.Now()),
+	})
 
-	// reset Evicted condition if present.
-	if evictedCond := apimeta.FindStatusCondition(w.Status.Conditions, kueue.WorkloadEvicted); evictedCond != nil {
-		evictedCond.Status = metav1.ConditionFalse
-		evictedCond.Reason = "QuotaReserved"
-		evictedCond.Message = api.TruncateConditionMessage("Previously: " + evictedCond.Message)
-		evictedCond.LastTransitionTime = metav1.NewTime(clock.Now())
-	}
-	// reset Preempted condition if present.
-	if preemptedCond := apimeta.FindStatusCondition(w.Status.Conditions, kueue.WorkloadPreempted); preemptedCond != nil {
-		preemptedCond.Status = metav1.ConditionFalse
-		preemptedCond.Reason = "QuotaReserved"
-		preemptedCond.Message = api.TruncateConditionMessage("Previously: " + preemptedCond.Message)
-		preemptedCond.LastTransitionTime = metav1.NewTime(clock.Now())
+	resetActiveCondition(&w.Status.Conditions, w.Generation, kueue.WorkloadEvicted, reason, clock)
+	resetActiveCondition(&w.Status.Conditions, w.Generation, kueue.WorkloadPreempted, reason, clock)
+}
+
+func resetActiveCondition(conds *[]metav1.Condition, gen int64, condType, reason string, clock clock.Clock) {
+	prev := apimeta.FindStatusCondition(*conds, condType)
+	// Ignore not found or inactive condition.
+	if prev == nil || prev.Status != metav1.ConditionTrue {
+		return
 	}
+	apimeta.SetStatusCondition(conds, metav1.Condition{
+		Type:               condType,
+		Status:             metav1.ConditionFalse,
+		Reason:             reason,
+		Message:            api.TruncateConditionMessage("Previously: " + prev.Message),
+		ObservedGeneration: gen,
+		LastTransitionTime: metav1.NewTime(clock.Now()),
+	})
 }
 
 // NeedsSecondPass checks if the second pass of scheduling is needed for the
@@ -1082,7 +1123,7 @@ func Evict(ctx context.Context, c client.Client, recorder record.EventRecorder,
 	}
 	reportEvictedWorkload(recorder, wl, wl.Status.Admission.ClusterQueue, reason, underlyingCause, msg)
 	if reportWorkloadEvictedOnce {
-		metrics.ReportEvictedWorkloadsOnce(wl.Status.Admission.ClusterQueue, reason, underlyingCause)
+		metrics.ReportEvictedWorkloadsOnce(wl.Status.Admission.ClusterQueue, reason, underlyingCause, GetWorkloadPriorityClass(wl))
 	}
 	return nil
 }
@@ -1104,7 +1145,7 @@ func resetUnhealthyNodes(w *kueue.Workload) {
 }
 
 func reportEvictedWorkload(recorder record.EventRecorder, wl *kueue.Workload, cqName kueue.ClusterQueueReference, reason, underlyingCause, message string) {
-	metrics.ReportEvictedWorkloads(cqName, reason, underlyingCause)
+	metrics.ReportEvictedWorkloads(cqName, reason, underlyingCause, GetWorkloadPriorityClass(wl))
 	if podsReadyToEvictionTime := workloadsWithPodsReadyToEvictedTime(wl); podsReadyToEvictionTime != nil {
 		metrics.PodsReadyToEvictedTimeSeconds.WithLabelValues(string(cqName), reason, underlyingCause).Observe(podsReadyToEvictionTime.Seconds())
 	}
diff --git a/site/content/en/docs/installation/_index.md b/site/content/en/docs/installation/_index.md
index 6411529fc..f440f87dd 100644
--- a/site/content/en/docs/installation/_index.md
+++ b/site/content/en/docs/installation/_index.md
@@ -264,7 +264,7 @@ spec:
 ### Feature gates for alpha and beta features
 
 | Feature                                       | Default | Stage | Since | Until |
-| --------------------------------------------- | ------- | ----- | ----- | ----- |
+| --------------------------------------------- |---------|-------|-------|-------|
 | `FlavorFungibility`                           | `true`  | Beta  | 0.5   |       |
 | `MultiKueue`                                  | `false` | Alpha | 0.6   | 0.8   |
 | `MultiKueue`                                  | `true`  | Beta  | 0.9   |       |
@@ -276,7 +276,8 @@ spec:
 | `PrioritySortingWithinCohort`                 | `true`  | Beta  | 0.6   |       |
 | `LendingLimit`                                | `false` | Alpha | 0.6   | 0.8   |
 | `LendingLimit`                                | `true`  | Beta  | 0.9   |       |
-| `TopologyAwareScheduling`                     | `false` | Alpha | 0.9   |       |
+| `TopologyAwareScheduling`                     | `false` | Alpha | 0.9   | 0.13  |
+| `TopologyAwareScheduling`                     | `true`  | Beta  | 0.14  |       |
 | `LocalQueueDefaulting`                        | `false` | Alpha | 0.10  | 0.11  |
 | `LocalQueueDefaulting`                        | `true`  | Beta  | 0.12  |       |
 | `LocalQueueMetrics`                           | `false` | Alpha | 0.10  |       |
diff --git a/site/content/en/docs/reference/kueue-config.v1beta1.md b/site/content/en/docs/reference/kueue-config.v1beta1.md
index 1f9f178b0..8d436fcfb 100644
--- a/site/content/en/docs/reference/kueue-config.v1beta1.md
+++ b/site/content/en/docs/reference/kueue-config.v1beta1.md
@@ -498,6 +498,52 @@ must be named tls.key and tls.crt, respectively.</p>
 </tbody>
 </table>
 
+## `DeviceClassMapping`     {#DeviceClassMapping}
+    
+
+**Appears in:**
+
+- [Resources](#Resources)
+
+
+<p>DeviceClassMapping holds device class to logical resource mappings
+for Dynamic Resource Allocation support.</p>
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>name</code> <B>[Required]</B><br/>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#resourcename-v1-core"><code>k8s.io/api/core/v1.ResourceName</code></a>
+</td>
+<td>
+   <p>Name is referenced in ClusterQueue.nominalQuota and Workload status.
+Must be a valid fully qualified name consisting of an optional DNS subdomain prefix
+followed by a slash and a DNS label, or just a DNS label.
+DNS labels consist of lower-case alphanumeric characters or hyphens,
+and must start and end with an alphanumeric character.
+DNS subdomain prefixes follow the same rules as DNS labels but can contain periods.
+The total length must not exceed 253 characters.</p>
+</td>
+</tr>
+<tr><td><code>deviceClassNames</code> <B>[Required]</B><br/>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#resourcename-v1-core"><code>[]k8s.io/api/core/v1.ResourceName</code></a>
+</td>
+<td>
+   <p>DeviceClassNames enumerates the DeviceClasses represented by this resource name.
+Each device class name must be a valid qualified name consisting of an optional DNS subdomain prefix
+followed by a slash and a DNS label, or just a DNS label.
+DNS labels consist of lower-case alphanumeric characters or hyphens,
+and must start and end with an alphanumeric character.
+DNS subdomain prefixes follow the same rules as DNS labels but can contain periods.
+The total length of each name must not exceed 253 characters.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
 ## `FairSharing`     {#FairSharing}
     
 
@@ -984,6 +1030,14 @@ An empty Outputs combined with a <code>Replace</code> Strategy causes the Input
 This is intended to be a map with Input as the key (enforced by validation code)</p>
 </td>
 </tr>
+<tr><td><code>deviceClassMappings</code><br/>
+<a href="#DeviceClassMapping"><code>[]DeviceClassMapping</code></a>
+</td>
+<td>
+   <p>DeviceClassMappings defines mappings from device classes to logical resources
+for Dynamic Resource Allocation support.</p>
+</td>
+</tr>
 </tbody>
 </table>
 
diff --git a/site/content/en/docs/reference/kueue.v1beta1.md b/site/content/en/docs/reference/kueue.v1beta1.md
index 205ed41a4..5dfee78a6 100644
--- a/site/content/en/docs/reference/kueue.v1beta1.md
+++ b/site/content/en/docs/reference/kueue.v1beta1.md
@@ -18,6 +18,7 @@ description: Generated API reference documentation for kueue.x-k8s.io/v1beta1.
 - [MultiKueueConfig](#kueue-x-k8s-io-v1beta1-MultiKueueConfig)
 - [ProvisioningRequestConfig](#kueue-x-k8s-io-v1beta1-ProvisioningRequestConfig)
 - [ResourceFlavor](#kueue-x-k8s-io-v1beta1-ResourceFlavor)
+- [Topology](#kueue-x-k8s-io-v1beta1-Topology)
 - [Workload](#kueue-x-k8s-io-v1beta1-Workload)
 - [WorkloadPriorityClass](#kueue-x-k8s-io-v1beta1-WorkloadPriorityClass)
   
@@ -271,6 +272,33 @@ V0.9 and V0.10 is unsupported, and results in undefined behavior.</p>
 </tbody>
 </table>
 
+## `Topology`     {#kueue-x-k8s-io-v1beta1-Topology}
+    
+
+**Appears in:**
+
+
+
+<p>Topology is the Schema for the topology API</p>
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+<tr><td><code>apiVersion</code><br/>string</td><td><code>kueue.x-k8s.io/v1beta1</code></td></tr>
+<tr><td><code>kind</code><br/>string</td><td><code>Topology</code></td></tr>
+    
+  
+<tr><td><code>spec</code> <B>[Required]</B><br/>
+<a href="#kueue-x-k8s-io-v1beta1-TopologySpec"><code>TopologySpec</code></a>
+</td>
+<td>
+   <span class="text-muted">No description provided.</span></td>
+</tr>
+</tbody>
+</table>
+
 ## `Workload`     {#kueue-x-k8s-io-v1beta1-Workload}
     
 
@@ -2939,6 +2967,38 @@ domain indicated by the values field.</p>
 </tbody>
 </table>
 
+## `TopologyLevel`     {#kueue-x-k8s-io-v1beta1-TopologyLevel}
+    
+
+**Appears in:**
+
+- [TopologySpec](#kueue-x-k8s-io-v1beta1-TopologySpec)
+
+
+<p>TopologyLevel defines the desired state of TopologyLevel</p>
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>nodeLabel</code> <B>[Required]</B><br/>
+<code>string</code>
+</td>
+<td>
+   <p>nodeLabel indicates the name of the node label for a specific topology
+level.</p>
+<p>Examples:</p>
+<ul>
+<li>cloud.provider.com/topology-block</li>
+<li>cloud.provider.com/topology-rack</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+
 ## `TopologyReference`     {#kueue-x-k8s-io-v1beta1-TopologyReference}
     
 (Alias of `string`)
@@ -2955,6 +3015,32 @@ domain indicated by the values field.</p>
 
 
 
+## `TopologySpec`     {#kueue-x-k8s-io-v1beta1-TopologySpec}
+    
+
+**Appears in:**
+
+- [Topology](#kueue-x-k8s-io-v1beta1-Topology)
+
+
+<p>TopologySpec defines the desired state of Topology</p>
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>levels</code> <B>[Required]</B><br/>
+<a href="#kueue-x-k8s-io-v1beta1-TopologyLevel"><code>[]TopologyLevel</code></a>
+</td>
+<td>
+   <p>levels define the levels of topology.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
 ## `UnhealthyNode`     {#kueue-x-k8s-io-v1beta1-UnhealthyNode}
     
 
diff --git a/site/content/en/docs/reference/metrics.md b/site/content/en/docs/reference/metrics.md
index bc32a7a90..c8fdcbea9 100644
--- a/site/content/en/docs/reference/metrics.md
+++ b/site/content/en/docs/reference/metrics.md
@@ -27,12 +27,12 @@ Use the following metrics to monitor the status of your ClusterQueues:
 | Metric name                                | Type      | Description                                                                         | Labels                                                                                                                                                                                                 |
 | -------------------------------------------- | ----------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
 | `kueue_pending_workloads`                  | Gauge     | The number of pending workloads.                                                    | `cluster_queue`: the name of the ClusterQueue<br> `status`: possible values are `active` or `inadmissible`                                                                                             |
-| `kueue_quota_reserved_workloads_total`     | Counter   | The total number of quota reserved workloads.                                       | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
+| `kueue_quota_reserved_workloads_total`     | Counter   | The total number of quota reserved workloads.                                       | `cluster_queue`: the name of the ClusterQueue<br> workload_priority_class: the workload priority class name                                                                                            |
 | `kueue_quota_reserved_wait_time_seconds`   | Histogram | The time between a workload was created or requeued until it got quota reservation. | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
-| `kueue_admitted_workloads_total`           | Counter   | The total number of admitted workloads.                                             | `cluster_queue`: the name of the ClusterQueue, workload_priority_class: the workload priority class name                                                                                               |
-| `kueue_evicted_workloads_total`            | Counter   | The total number of evicted workloads.                                              | `cluster_queue`: the name of the ClusterQueue<br> `reason`: Possible values are `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped` or `Deactivated`                              |
-| `kueue_evicted_workloads_once_total`            | Counter   | The number of unique workload evictions per 'cluster_queue'                                              | `cluster_queue`: the name of the ClusterQueue<br> `reason`: Possible values are `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped` or `Deactivated`<br> `detailedReason`: specifies a finer-grained explanation that complements the eviction cause                              |
-| `kueue_admission_wait_time_seconds`        | Histogram | The time between a workload was created or requeued until admission.                | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
+| `kueue_admitted_workloads_total`           | Counter   | The total number of admitted workloads.                                             | `cluster_queue`: the name of the ClusterQueue<br> workload_priority_class: the workload priority class name                                                                                               |
+| `kueue_evicted_workloads_total`            | Counter   | The total number of evicted workloads.                                              | `cluster_queue`: the name of the ClusterQueue<br> `reason`: Possible values are `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped` or `Deactivated`<br> workload_priority_class: the workload priority class name |
+| `kueue_evicted_workloads_once_total`       | Counter   | The number of unique workload evictions per 'cluster_queue'                         | `cluster_queue`: the name of the ClusterQueue<br> `reason`: Possible values are `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped` or `Deactivated`<br> `detailedReason`: specifies a finer-grained explanation that complements the eviction cause<br> workload_priority_class: the workload priority class name |
+| `kueue_admission_wait_time_seconds`        | Histogram | The time between a workload was created or requeued until admission.                | `cluster_queue`: the name of the ClusterQueue<br> workload_priority_class: the workload priority class name                                                                                            |
 | `kueue_admission_checks_wait_time_seconds` | Histogram | The time from when a workload got the quota reservation until admission.            | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
 | `kueue_admitted_active_workloads`          | Gauge     | The number of admitted Workloads that are active (unsuspended and not finished)     | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
 | `kueue_cluster_queue_status`               | Gauge     | Reports the status of the ClusterQueue                                              | `cluster_queue`: The name of the ClusterQueue<br> `status`: Possible values are `pending`, `active` or `terminated`. For a ClusterQueue, the metric only reports a value of 1 for one of the statuses. |
diff --git a/site/content/zh-CN/docs/reference/metrics.md b/site/content/zh-CN/docs/reference/metrics.md
index b29f9b1bc..69b129eb2 100644
--- a/site/content/zh-CN/docs/reference/metrics.md
+++ b/site/content/zh-CN/docs/reference/metrics.md
@@ -14,10 +14,10 @@ and [LocalQueues](/docs/concepts/local_queue).
 Use the following metrics to monitor the health of the kueue controllers:
 
 
-| Metric name                                | Type      | Description                                                                                                                                   | Labels                                                    |
-| -------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
-| `kueue_admission_attempts_total`           | Counter   | The total number of attempts to [admit](/docs/concepts#admission) workloads. Each admission attempt might try to admit more than one workload. | `result`: possible values are `success` or `inadmissible` |
-| `kueue_admission_attempt_duration_seconds` | Histogram | The latency of an admission attempt.                                                                                                          | `result`: possible values are `success` or `inadmissible` |
+| Type      | Metric name                                | Description                                                                                                                                   | Labels                                                    |
+| ----------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
+| Counter   | `kueue_admission_attempts_total`           | The total number of attempts to [admit](/docs/concepts#admission) workloads. Each admission attempt might try to admit more than one workload. | `result`: possible values are `success` or `inadmissible` |
+| Histogram | `kueue_admission_attempt_duration_seconds` | The latency of an admission attempt.                                                                                                          | `result`: possible values are `success` or `inadmissible` |
 
 ## ClusterQueue status
 
@@ -27,12 +27,12 @@ Use the following metrics to monitor the status of your ClusterQueues:
 | Metric name                                | Type      | Description                                                                         | Labels                                                                                                                                                                                                 |
 | -------------------------------------------- | ----------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
 | `kueue_pending_workloads`                  | Gauge     | The number of pending workloads.                                                    | `cluster_queue`: the name of the ClusterQueue<br> `status`: possible values are `active` or `inadmissible`                                                                                             |
-| `kueue_quota_reserved_workloads_total`     | Counter   | The total number of quota reserved workloads.                                       | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
+| `kueue_quota_reserved_workloads_total`     | Counter   | The total number of quota reserved workloads.                                       | `cluster_queue`: the name of the ClusterQueue<br> workload_priority_class: the workload priority class name                                                                                            |
 | `kueue_quota_reserved_wait_time_seconds`   | Histogram | The time between a workload was created or requeued until it got quota reservation. | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
-| `kueue_admitted_workloads_total`           | Counter   | The total number of admitted workloads.                                             | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
-| `kueue_evicted_workloads_total`            | Counter   | The total number of evicted workloads.                                              | `cluster_queue`: the name of the ClusterQueue<br> `reason`: Possible values are `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped` or `Deactivated`                              |
-| `kueue_evicted_workloads_once_total`            | Counter   | The number of unique workload evictions per 'cluster_queue'                                              | `cluster_queue`: the name of the ClusterQueue<br> `reason`: Possible values are `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped` or `Deactivated`<br> `detailedReason`: specifies a finer-grained explanation that complements the eviction cause                              |
-| `kueue_admission_wait_time_seconds`        | Histogram | The time between a workload was created or requeued until admission.                | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
+| `kueue_admitted_workloads_total`           | Counter   | The total number of admitted workloads.                                             | `cluster_queue`: the name of the ClusterQueue<br> workload_priority_class: the workload priority class name                                                                                            |
+| `kueue_evicted_workloads_total`            | Counter   | The total number of evicted workloads.                                              | `cluster_queue`: the name of the ClusterQueue<br> `reason`: Possible values are `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped` or `Deactivated`<br> workload_priority_class: the workload priority class name |
+| `kueue_evicted_workloads_once_total`       | Counter   | The number of unique workload evictions per 'cluster_queue'                         | `cluster_queue`: the name of the ClusterQueue<br> `reason`: Possible values are `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped` or `Deactivated`<br> `detailedReason`: specifies a finer-grained explanation that complements the eviction cause<br> workload_priority_class: the workload priority class name |
+| `kueue_admission_wait_time_seconds`        | Histogram | The time between a workload was created or requeued until admission.                | `cluster_queue`: the name of the ClusterQueue<br> workload_priority_class: the workload priority class name                                                                                            |
 | `kueue_admission_checks_wait_time_seconds` | Histogram | The time from when a workload got the quota reservation until admission.            | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
 | `kueue_admitted_active_workloads`          | Gauge     | The number of admitted Workloads that are active (unsuspended and not finished)     | `cluster_queue`: the name of the ClusterQueue                                                                                                                                                          |
 | `kueue_cluster_queue_status`               | Gauge     | Reports the status of the ClusterQueue                                              | `cluster_queue`: The name of the ClusterQueue<br> `status`: Possible values are `pending`, `active` or `terminated`. For a ClusterQueue, the metric only reports a value of 1 for one of the statuses. |



Test patch:
diff --git a/apis/config/v1beta1/defaults_test.go b/apis/config/v1beta1/defaults_test.go
index 382a61ab0..a9af0092c 100644
--- a/apis/config/v1beta1/defaults_test.go
+++ b/apis/config/v1beta1/defaults_test.go
@@ -531,7 +531,7 @@ func TestSetDefaults_Configuration(t *testing.T) {
 					GCInterval:        &metav1.Duration{Duration: time.Second},
 					Origin:            ptr.To("multikueue-manager1"),
 					WorkerLostTimeout: &metav1.Duration{Duration: time.Minute},
-					DispatcherName:    ptr.To[string](MultiKueueDispatcherModeIncremental),
+					DispatcherName:    ptr.To(MultiKueueDispatcherModeIncremental),
 				},
 			},
 			want: &Configuration{
@@ -547,7 +547,7 @@ func TestSetDefaults_Configuration(t *testing.T) {
 					GCInterval:        &metav1.Duration{Duration: time.Second},
 					Origin:            ptr.To("multikueue-manager1"),
 					WorkerLostTimeout: &metav1.Duration{Duration: time.Minute},
-					DispatcherName:    ptr.To[string](MultiKueueDispatcherModeIncremental),
+					DispatcherName:    ptr.To(MultiKueueDispatcherModeIncremental),
 				},
 				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
 				WaitForPodsReady:             &WaitForPodsReady{},
diff --git a/charts/kueue/tests/manager_config_test.yaml b/charts/kueue/tests/manager_config_test.yaml
new file mode 100644
index 000000000..7b519fe08
--- /dev/null
+++ b/charts/kueue/tests/manager_config_test.yaml
@@ -0,0 +1,105 @@
+suite: test manager-config configmap
+templates:
+  - manager/manager-config.yaml
+tests:
+  - it: should not inject internalCertManagement config when enableCertManager is true
+    set:
+      enableCertManager: true
+    asserts:
+      - notMatchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "internalCertManagement:\n  enable: true"
+
+  - it: should properly template the webhook using the release name and defaults
+    release:
+      name: custom-kueue-name
+    asserts:
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "webhookServiceName: custom-kueue-name-webhook-service"
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "webhookSecretName: custom-kueue-name-webhook-server-cert"
+
+  - it: should properly template the webhook using the fullnameOverride and defaults
+    set:
+      fullnameOverride: "full-override"
+    asserts:
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "webhookServiceName: full-override-webhook-service"
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "webhookSecretName: full-override-webhook-server-cert"
+
+  - it: should parse controllerManagerConfigYaml and preserve custom config
+    set:
+      enableCertManager: false
+      managerConfig:
+        controllerManagerConfigYaml: |
+          leaderElection:
+            leaderElect: true
+          metrics:
+            bindAddress: "0.0.0.0:8080"
+    asserts:
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "leaderElection:\n  leaderElect: true"
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "metrics:\n  bindAddress: 0.0.0.0:8080"
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "internalCertManagement:\n  enable: true"
+
+  - it: should allow controllerManagerConfigYaml to supersede defaults
+    set:
+      enableCertManager: false
+      managerConfig:
+        controllerManagerConfigYaml: |
+          internalCertManagement:
+            enable: false
+            webhookServiceName: foo
+            webhookSecretName: bar
+          leaderElection:
+            leaderElect: false
+    asserts:
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "leaderElection:\n  leaderElect: false"
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "internalCertManagement:\n  enable: false\n  webhookSecretName: bar\n  webhookServiceName: foo"
+
+  - it: should not add internalCertManagement when enableCertManager is true and controllerManagerConfigYaml is provided
+    set:
+      enableCertManager: true
+      managerConfig:
+        controllerManagerConfigYaml: |
+          leaderElection:
+            leaderElect: true
+          metrics:
+            bindAddress: "0.0.0.0:8080"
+    asserts:
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "leaderElection:\n  leaderElect: true"
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "metrics:\n  bindAddress: 0.0.0.0:8080"
+      - notMatchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "internalCertManagement:"
+
+  - it: should handle an empty controllerManagerConfigYaml
+    release:
+      name: testing
+    set:
+      enableCertManager: false
+      managerConfig:
+        controllerManagerConfigYaml: "{}"
+    asserts:
+      - matchRegex:
+          path: data["controller_manager_config.yaml"]
+          pattern: "internalCertManagement:\n  enable: true\n  webhookSecretName: testing-kueue-webhook-server-cert\n  webhookServiceName: testing-kueue-webhook-service"
+
diff --git a/cmd/importer/pod/import_test.go b/cmd/importer/pod/import_test.go
index 951161e79..f7cd0b8d7 100644
--- a/cmd/importer/pod/import_test.go
+++ b/cmd/importer/pod/import_test.go
@@ -23,6 +23,7 @@ import (
 	"github.com/google/go-cmp/cmp/cmpopts"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
@@ -47,6 +48,7 @@ func TestImportNamespace(t *testing.T) {
 		PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
 			Image("img").
 			Request(corev1.ResourceCPU, "1").
+			PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 			Obj()).
 		ReserveQuota(utiltesting.MakeAdmission("cq1").
 			PodSets(utiltesting.MakePodSetAssignment(kueue.DefaultPodSetName).
diff --git a/pkg/cache/hierarchy/manager_test.go b/pkg/cache/hierarchy/manager_test.go
index 74855eb93..79d22360c 100644
--- a/pkg/cache/hierarchy/manager_test.go
+++ b/pkg/cache/hierarchy/manager_test.go
@@ -498,7 +498,7 @@ type testCohort struct {
 func newCohort(name kueue.CohortReference) *testCohort {
 	return &testCohort{
 		name:   name,
-		Cohort: NewCohort[*testClusterQueue, *testCohort](),
+		Cohort: NewCohort[*testClusterQueue](),
 	}
 }
 
diff --git a/pkg/cache/scheduler/cache_test.go b/pkg/cache/scheduler/cache_test.go
index 315bc1568..cb748d2a8 100644
--- a/pkg/cache/scheduler/cache_test.go
+++ b/pkg/cache/scheduler/cache_test.go
@@ -37,7 +37,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache/hierarchy"
 	"sigs.k8s.io/kueue/pkg/features"
@@ -3928,12 +3927,12 @@ func TestSnapshotError(t *testing.T) {
 	cache := New(client)
 	cache.AddOrUpdateResourceFlavor(log, &flavor)
 	if flavor.Spec.TopologyName != nil {
-		cache.AddOrUpdateTopology(log, &kueuealpha.Topology{
+		cache.AddOrUpdateTopology(log, &kueue.Topology{
 			ObjectMeta: metav1.ObjectMeta{
 				Name: string(*flavor.Spec.TopologyName),
 			},
-			Spec: kueuealpha.TopologySpec{
-				Levels: []kueuealpha.TopologyLevel{
+			Spec: kueue.TopologySpec{
+				Levels: []kueue.TopologyLevel{
 					{
 						NodeLabel: corev1.LabelHostname,
 					},
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index 300fe9a63..7d4415a2d 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -335,7 +335,7 @@ webhook:
 kind: Configuration
 namespace: kueue-system
 objectRetentionPolicies:
-  workloads: 
+  workloads:
     afterFinished: 30m
     afterDeactivatedByKueue: 30m
 `), os.FileMode(0600)); err != nil {
@@ -383,8 +383,8 @@ objectRetentionPolicies:
 	}
 
 	defaultClientConnection := &configapi.ClientConnection{
-		QPS:   ptr.To[float32](configapi.DefaultClientConnectionQPS),
-		Burst: ptr.To[int32](configapi.DefaultClientConnectionBurst),
+		QPS:   ptr.To(configapi.DefaultClientConnectionQPS),
+		Burst: ptr.To(configapi.DefaultClientConnectionBurst),
 	}
 
 	defaultIntegrations := &configapi.Integrations{
@@ -412,7 +412,7 @@ objectRetentionPolicies:
 		GCInterval:        &metav1.Duration{Duration: configapi.DefaultMultiKueueGCInterval},
 		Origin:            ptr.To(configapi.DefaultMultiKueueOrigin),
 		WorkerLostTimeout: &metav1.Duration{Duration: configapi.DefaultMultiKueueWorkerLostTimeout},
-		DispatcherName:    ptr.To[string](configapi.MultiKueueDispatcherModeAllAtOnce),
+		DispatcherName:    ptr.To(configapi.MultiKueueDispatcherModeAllAtOnce),
 	}
 
 	defaultWaitForPodsReady := &configapi.WaitForPodsReady{}
@@ -908,7 +908,7 @@ objectRetentionPolicies:
 					GCInterval:        &metav1.Duration{Duration: 90 * time.Second},
 					Origin:            ptr.To("multikueue-manager1"),
 					WorkerLostTimeout: &metav1.Duration{Duration: 10 * time.Minute},
-					DispatcherName:    ptr.To[string](configapi.MultiKueueDispatcherModeIncremental),
+					DispatcherName:    ptr.To(configapi.MultiKueueDispatcherModeIncremental),
 				},
 				ManagedJobsNamespaceSelector: defaultManagedJobsNamespaceSelector,
 				WaitForPodsReady:             defaultWaitForPodsReady,
diff --git a/pkg/config/validation_test.go b/pkg/config/validation_test.go
index 9dc13831d..9dc023ba6 100644
--- a/pkg/config/validation_test.go
+++ b/pkg/config/validation_test.go
@@ -18,6 +18,7 @@ package config
 
 import (
 	"fmt"
+	"strings"
 	"testing"
 	"time"
 
@@ -881,3 +882,439 @@ func TestValidateFeatureGates(t *testing.T) {
 		})
 	}
 }
+
+func TestValidateDeviceClassMappings(t *testing.T) {
+	testCases := map[string]struct {
+		cfg     *configapi.Configuration
+		wantErr field.ErrorList
+	}{
+		"nil resources": {
+			cfg: &configapi.Configuration{},
+		},
+		"nil DRA config": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{},
+			},
+		},
+		"empty DRA resources": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{},
+				},
+			},
+		},
+		"valid single resource": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "whole-foo",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+					},
+				},
+			},
+		},
+		"valid multiple resources": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "whole-foo",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+						{
+							Name:             "shared-bar",
+							DeviceClassNames: []corev1.ResourceName{"bar.com/device-1g", "bar.com/device-2g"},
+						},
+					},
+				},
+			},
+		},
+		"valid resource with multiple device classes": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "mixed-devices",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/gpu", "bar.com/accelerator", "baz.org/compute"},
+						},
+					},
+				},
+			},
+		},
+		"invalid resource name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "@invalid-name",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].name",
+				},
+			},
+		},
+		"duplicate resource names": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "duplicate-name",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+						{
+							Name:             "duplicate-name",
+							DeviceClassNames: []corev1.ResourceName{"bar.com/device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeDuplicate,
+					Field: "resources.deviceClassMappings[1].name",
+				},
+			},
+		},
+		"empty device class names": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "empty-devices",
+							DeviceClassNames: []corev1.ResourceName{},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeRequired,
+					Field: "resources.deviceClassMappings[0].deviceClassNames",
+				},
+			},
+		},
+		"invalid device class name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "valid-name",
+							DeviceClassNames: []corev1.ResourceName{"valid.com/device", "@invalid-device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].deviceClassNames[1]",
+				},
+			},
+		},
+		"device class conflict": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "first-resource",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+						{
+							Name:             "second-resource",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[1].deviceClassNames[0]",
+				},
+			},
+		},
+		"multiple validation errors": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "@invalid",
+							DeviceClassNames: []corev1.ResourceName{},
+						},
+						{
+							Name:             "valid-name",
+							DeviceClassNames: []corev1.ResourceName{"@invalid-device", "valid.com/device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].name",
+				},
+				&field.Error{
+					Type:  field.ErrorTypeRequired,
+					Field: "resources.deviceClassMappings[0].deviceClassNames",
+				},
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[1].deviceClassNames[0]",
+				},
+			},
+		},
+		"duplicate device class names within same mapping": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "duplicate-devices",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device", "bar.com/device", "foo.com/device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeDuplicate,
+					Field: "resources.deviceClassMappings[0].deviceClassNames[2]",
+				},
+			},
+		},
+		"empty string resource name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].name",
+				},
+			},
+		},
+		"whitespace in resource name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "foo bar",
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].name",
+				},
+			},
+		},
+		"empty string device class name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "valid-name",
+							DeviceClassNames: []corev1.ResourceName{""},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].deviceClassNames[0]",
+				},
+			},
+		},
+		"whitespace in device class name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "valid-name",
+							DeviceClassNames: []corev1.ResourceName{"foo   bar"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].deviceClassNames[0]",
+				},
+			},
+		},
+		"max length resource name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             corev1.ResourceName(fmt.Sprintf("%s/%s", strings.Repeat("a", 240), strings.Repeat("b", 12))), // 253 chars total
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+					},
+				},
+			},
+		},
+		"over max length resource name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             corev1.ResourceName(fmt.Sprintf("%s/%s", strings.Repeat("a", 240), strings.Repeat("b", 14))), // 255 chars total
+							DeviceClassNames: []corev1.ResourceName{"foo.com/device"},
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].name",
+				},
+			},
+		},
+		"max length device class name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "valid-name",
+							DeviceClassNames: []corev1.ResourceName{corev1.ResourceName(fmt.Sprintf("%s/%s", strings.Repeat("x", 240), strings.Repeat("y", 12)))}, // 253 chars total
+						},
+					},
+				},
+			},
+		},
+		"over max length device class name": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name:             "valid-name",
+							DeviceClassNames: []corev1.ResourceName{corev1.ResourceName(fmt.Sprintf("%s/%s", strings.Repeat("x", 240), strings.Repeat("y", 14)))}, // 255 chars total
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeInvalid,
+					Field: "resources.deviceClassMappings[0].deviceClassNames[0]",
+				},
+			},
+		},
+		"nil device class mappings": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: nil,
+				},
+			},
+		},
+		"too many device class mappings": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: func() []configapi.DeviceClassMapping {
+						mappings := make([]configapi.DeviceClassMapping, 17) // Exceed limit of 16
+						for i := range 17 {
+							mappings[i] = configapi.DeviceClassMapping{
+								Name:             corev1.ResourceName(fmt.Sprintf("resource-%d", i)),
+								DeviceClassNames: []corev1.ResourceName{corev1.ResourceName(fmt.Sprintf("device-%d.example.com", i))},
+							}
+						}
+						return mappings
+					}(),
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeTooMany,
+					Field: "resources.deviceClassMappings",
+				},
+			},
+		},
+		"too many device class names per mapping": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name: "many-devices",
+							DeviceClassNames: func() []corev1.ResourceName {
+								deviceClasses := make([]corev1.ResourceName, 9) // Exceed limit of 8
+								for i := range 9 {
+									deviceClasses[i] = corev1.ResourceName(fmt.Sprintf("device-%d.example.com", i))
+								}
+								return deviceClasses
+							}(),
+						},
+					},
+				},
+			},
+			wantErr: field.ErrorList{
+				&field.Error{
+					Type:  field.ErrorTypeTooMany,
+					Field: "resources.deviceClassMappings[0].deviceClassNames",
+				},
+			},
+		},
+		"exactly max device class mappings": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: func() []configapi.DeviceClassMapping {
+						mappings := make([]configapi.DeviceClassMapping, 16) // Exactly at limit
+						for i := range 16 {
+							mappings[i] = configapi.DeviceClassMapping{
+								Name:             corev1.ResourceName(fmt.Sprintf("resource-%d", i)),
+								DeviceClassNames: []corev1.ResourceName{corev1.ResourceName(fmt.Sprintf("device-%d.example.com", i))},
+							}
+						}
+						return mappings
+					}(),
+				},
+			},
+		},
+		"exactly max device class names per mapping": {
+			cfg: &configapi.Configuration{
+				Resources: &configapi.Resources{
+					DeviceClassMappings: []configapi.DeviceClassMapping{
+						{
+							Name: "max-devices",
+							DeviceClassNames: func() []corev1.ResourceName {
+								deviceClasses := make([]corev1.ResourceName, 8) // Exactly at limit
+								for i := range 8 {
+									deviceClasses[i] = corev1.ResourceName(fmt.Sprintf("device-%d.example.com", i))
+								}
+								return deviceClasses
+							}(),
+						},
+					},
+				},
+			},
+		},
+	}
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) {
+			got := validateDeviceClassMappings(tc.cfg)
+			if diff := cmp.Diff(tc.wantErr, got, cmpopts.IgnoreFields(field.Error{}, "BadValue", "Detail")); diff != "" {
+				t.Errorf("validateDeviceClassMappings() returned unexpected error (-want,+got):\n%s", diff)
+			}
+		})
+	}
+}
diff --git a/pkg/controller/core/workload_controller_test.go b/pkg/controller/core/workload_controller_test.go
index bde33a506..19c2fa872 100644
--- a/pkg/controller/core/workload_controller_test.go
+++ b/pkg/controller/core/workload_controller_test.go
@@ -18,6 +18,7 @@ package core
 
 import (
 	"context"
+	stderrors "errors"
 	"fmt"
 	"testing"
 	"time"
@@ -26,6 +27,7 @@ import (
 	"github.com/google/go-cmp/cmp/cmpopts"
 	batchv1 "k8s.io/api/batch/v1"
 	corev1 "k8s.io/api/core/v1"
+	resourcev1beta2 "k8s.io/api/resource/v1beta2"
 	"k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
@@ -36,10 +38,13 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
+	"sigs.k8s.io/kueue/pkg/dra"
 	"sigs.k8s.io/kueue/pkg/features"
+	utilqueue "sigs.k8s.io/kueue/pkg/util/queue"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/test/util"
 )
@@ -397,16 +402,241 @@ func TestReconcile(t *testing.T) {
 
 	cases := map[string]struct {
 		enableObjectRetentionPolicies bool
+		enableDRAFeature              bool
 
-		workload       *kueue.Workload
-		cq             *kueue.ClusterQueue
-		lq             *kueue.LocalQueue
-		wantWorkload   *kueue.Workload
-		wantError      error
-		wantEvents     []utiltesting.EventRecord
-		wantResult     reconcile.Result
-		reconcilerOpts []Option
+		workload               *kueue.Workload
+		cq                     *kueue.ClusterQueue
+		lq                     *kueue.LocalQueue
+		resourceClaims         []*resourcev1beta2.ResourceClaim
+		resourceClaimTemplates []*resourcev1beta2.ResourceClaimTemplate
+		wantDRAResourceTotal   *int64
+		wantWorkloadsInQueue   *int
+		wantWorkload           *kueue.Workload
+		wantError              error
+		wantEvents             []utiltesting.EventRecord
+		wantResult             reconcile.Result
+		reconcilerOpts         []Option
 	}{
+		"reconcile DRA ResourceClaim should be rejected as inadmissible": {
+			enableDRAFeature: true,
+			workload: utiltesting.MakeWorkload("wlWithDRAResourceClaim", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
+					ResourceClaim("gpu", "rc1").
+					Obj()).
+				Obj(),
+			resourceClaims: []*resourcev1beta2.ResourceClaim{{
+				ObjectMeta: metav1.ObjectMeta{Name: "rc1", Namespace: "ns"},
+				Spec: resourcev1beta2.ResourceClaimSpec{
+					Devices: resourcev1beta2.DeviceClaim{
+						Requests: []resourcev1beta2.DeviceRequest{{
+							Exactly: &resourcev1beta2.ExactDeviceRequest{
+								DeviceClassName: "gpu.example.com",
+								AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+								Count:           1,
+							},
+						}},
+					},
+				},
+			}},
+			cq: utiltesting.MakeClusterQueue("cq").
+				ResourceGroup(
+					*utiltesting.MakeFlavorQuotas("flavor1").
+						Resource("gpus", "2").Obj(),
+				).Obj(),
+			lq: utiltesting.MakeLocalQueue("lq", "ns").ClusterQueue("cq").Obj(),
+			wantWorkload: utiltesting.MakeWorkload("wlWithDRAResourceClaim", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
+					ResourceClaim("gpu", "rc1").
+					Obj()).
+				Condition(metav1.Condition{
+					Type:    kueue.WorkloadQuotaReserved,
+					Status:  metav1.ConditionFalse,
+					Reason:  kueue.WorkloadInadmissible,
+					Message: "DynamicResourceAllocation feature does not support use of resource claims",
+				}).
+				Obj(),
+			wantEvents: nil,
+		},
+		"reconcile DRA ResourceClaimTemplate should be pre-processed and queued": {
+			enableDRAFeature:     true,
+			wantDRAResourceTotal: ptr.To(int64(1)),
+			wantWorkloadsInQueue: ptr.To(1),
+			workload: utiltesting.MakeWorkload("wlWithDRAResourceClaimTemplate", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
+					ResourceClaimTemplate("gpu", "gpu-template").
+					Obj()).
+				Obj(),
+			resourceClaimTemplates: []*resourcev1beta2.ResourceClaimTemplate{{
+				ObjectMeta: metav1.ObjectMeta{Name: "gpu-template", Namespace: "ns"},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "gpu-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "gpu.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           1,
+								},
+							}},
+						},
+					},
+				},
+			}},
+			cq: utiltesting.MakeClusterQueue("cq").
+				ResourceGroup(
+					*utiltesting.MakeFlavorQuotas("flavor1").
+						Resource("gpu", "2").Obj(),
+				).Obj(),
+			lq: utiltesting.MakeLocalQueue("lq", "ns").ClusterQueue("cq").Obj(),
+			wantWorkload: utiltesting.MakeWorkload("wlWithDRAResourceClaimTemplate", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
+					ResourceClaimTemplate("gpu", "gpu-template").
+					Obj()).
+				Condition(metav1.Condition{
+					Type:    kueue.WorkloadQuotaReserved,
+					Status:  metav1.ConditionFalse,
+					Reason:  kueue.WorkloadInadmissible,
+					Message: "ClusterQueue cq is inactive",
+				}).
+				Obj(),
+			wantEvents: nil,
+		},
+		"reconcile DRA ResourceClaimTemplate multi-pod should be pre-processed and queued": {
+			enableDRAFeature:     true,
+			wantDRAResourceTotal: ptr.To(int64(6)),
+			wantWorkloadsInQueue: ptr.To(1),
+			workload: utiltesting.MakeWorkload("wlMultiPodDRA", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
+					ResourceClaimTemplate("gpu", "gpu-template").
+					Obj()).
+				Obj(),
+			resourceClaimTemplates: []*resourcev1beta2.ResourceClaimTemplate{{
+				ObjectMeta: metav1.ObjectMeta{Name: "gpu-template", Namespace: "ns"},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "gpu-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "gpu.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           2,
+								},
+							}},
+						},
+					},
+				},
+			}},
+			cq: utiltesting.MakeClusterQueue("cq").
+				ResourceGroup(
+					*utiltesting.MakeFlavorQuotas("flavor1").
+						Resource("gpu", "10").Obj(),
+				).Obj(),
+			lq: utiltesting.MakeLocalQueue("lq", "ns").ClusterQueue("cq").Obj(),
+			wantWorkload: utiltesting.MakeWorkload("wlMultiPodDRA", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
+					ResourceClaimTemplate("gpu", "gpu-template").
+					Obj()).
+				Condition(metav1.Condition{
+					Type:    kueue.WorkloadQuotaReserved,
+					Status:  metav1.ConditionFalse,
+					Reason:  kueue.WorkloadInadmissible,
+					Message: "ClusterQueue cq is inactive",
+				}).
+				Obj(),
+			wantEvents: nil,
+		},
+		"reconcile DRA ResourceClaimTemplate with unmapped device class": {
+			enableDRAFeature: true,
+			workload: utiltesting.MakeWorkload("wlUnmappedDRA", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
+					ResourceClaimTemplate("gpu", "gpu-template").
+					Obj()).
+				Obj(),
+			resourceClaimTemplates: []*resourcev1beta2.ResourceClaimTemplate{{
+				ObjectMeta: metav1.ObjectMeta{Name: "gpu-template", Namespace: "ns"},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "gpu-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "unmapped.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           1,
+								},
+							}},
+						},
+					},
+				},
+			}},
+			cq: utiltesting.MakeClusterQueue("cq").
+				ResourceGroup(
+					*utiltesting.MakeFlavorQuotas("flavor1").
+						Resource("gpu", "2").Obj(),
+				).Obj(),
+			lq: utiltesting.MakeLocalQueue("lq", "ns").ClusterQueue("cq").Obj(),
+			wantWorkload: func() *kueue.Workload {
+				wl := utiltesting.MakeWorkload("wlUnmappedDRA", "ns").
+					Queue("lq").
+					PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
+						ResourceClaimTemplate("gpu", "gpu-template").
+						Obj()).
+					Condition(metav1.Condition{
+						Type:    kueue.WorkloadQuotaReserved,
+						Status:  metav1.ConditionFalse,
+						Reason:  kueue.WorkloadInadmissible,
+						Message: "DeviceClass unmapped.example.com is not mapped in DRA configuration for workload wlUnmappedDRA podset main: DeviceClass is not mapped in DRA configuration",
+					}).
+					Obj()
+				wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{{
+					Name: "gpu", ResourceClaimTemplateName: ptr.To("gpu-template"),
+				}}
+				if len(wl.Spec.PodSets[0].Template.Spec.Containers) > 0 {
+					wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{{Name: "gpu"}}
+				}
+				return wl
+			}(),
+			wantError:  dra.ErrDeviceClassNotMapped,
+			wantEvents: nil,
+		},
+		"reconcile DRA ResourceClaimTemplate not found should return error": {
+			enableDRAFeature: true,
+			workload: utiltesting.MakeWorkload("wlMissingTemplate", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
+					ResourceClaimTemplate("gpu", "missing-template").
+					Obj()).
+				Obj(),
+			cq: utiltesting.MakeClusterQueue("cq").
+				ResourceGroup(
+					*utiltesting.MakeFlavorQuotas("flavor1").
+						Resource("gpu", "2").Obj(),
+				).Obj(),
+			lq: utiltesting.MakeLocalQueue("lq", "ns").ClusterQueue("cq").Obj(),
+			wantWorkload: utiltesting.MakeWorkload("wlMissingTemplate", "ns").
+				Queue("lq").
+				PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
+					ResourceClaimTemplate("gpu", "missing-template").
+					Obj()).
+				Condition(metav1.Condition{
+					Type:    kueue.WorkloadQuotaReserved,
+					Status:  metav1.ConditionFalse,
+					Reason:  kueue.WorkloadInadmissible,
+					Message: `failed to get claim spec for ResourceClaimTemplate missing-template in workload wlMissingTemplate podset main: failed to get claim spec: resourceclaimtemplates.resource.k8s.io "missing-template" not found`,
+				}).
+				Obj(),
+			wantError:  dra.ErrClaimSpecNotFound,
+			wantEvents: nil,
+		},
 		"assign Admission Checks from ClusterQueue.spec.AdmissionCheckStrategy": {
 			workload: utiltesting.MakeWorkload("wl", "ns").
 				ReserveQuota(utiltesting.MakeAdmission("cq").
@@ -2024,8 +2254,17 @@ func TestReconcile(t *testing.T) {
 	for name, tc := range cases {
 		t.Run(name, func(t *testing.T) {
 			features.SetFeatureGateDuringTest(t, features.ObjectRetentionPolicies, tc.enableObjectRetentionPolicies)
+			features.SetFeatureGateDuringTest(t, features.DynamicResourceAllocation, tc.enableDRAFeature)
 
 			objs := []client.Object{tc.workload}
+			for _, rc := range tc.resourceClaims {
+				objs = append(objs, rc)
+			}
+
+			for _, rct := range tc.resourceClaimTemplates {
+				objs = append(objs, rct)
+			}
+
 			clientBuilder := utiltesting.NewClientBuilder().WithObjects(objs...).WithStatusSubresource(objs...).WithInterceptorFuncs(interceptor.Funcs{SubResourcePatch: utiltesting.TreatSSAAsStrategicMerge})
 			cl := clientBuilder.Build()
 			recorder := &utiltesting.EventRecorder{}
@@ -2058,29 +2297,106 @@ func TestReconcile(t *testing.T) {
 				}
 			}
 
+			if tc.workload != nil && tc.workload.Namespace == "ns" &&
+				len(tc.workload.Spec.PodSets) > 0 &&
+				len(tc.workload.Spec.PodSets[0].Template.Spec.ResourceClaims) > 0 {
+				draConfig := []configapi.DeviceClassMapping{
+					{
+						Name:             corev1.ResourceName("foo"),
+						DeviceClassNames: []corev1.ResourceName{"foo.example.com"},
+					},
+					{
+						Name:             corev1.ResourceName("gpu"),
+						DeviceClassNames: []corev1.ResourceName{"gpu.example.com"},
+					},
+				}
+				err := dra.CreateMapperFromConfiguration(draConfig)
+				if err != nil {
+					t.Fatalf("Failed to initialize DRA mapper: %v", err)
+				}
+			}
+
 			gotResult, gotError := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: client.ObjectKeyFromObject(tc.workload)})
 
-			if diff := cmp.Diff(tc.wantError, gotError); diff != "" {
-				t.Errorf("unexpected reconcile error (-want/+got):\n%s", diff)
+			if tc.wantError != nil {
+				if gotError == nil {
+					t.Errorf("expected error %v, got nil", tc.wantError)
+				} else if !stderrors.Is(gotError, tc.wantError) {
+					t.Errorf("unexpected error type: want %v, got %v", tc.wantError, gotError)
+				}
+			} else if gotError != nil {
+				t.Errorf("unexpected error: %v", gotError)
 			}
 
 			if diff := cmp.Diff(tc.wantResult, gotResult); diff != "" {
 				t.Errorf("unexpected reconcile result (-want/+got):\n%s", diff)
 			}
 
-			gotWorkload := &kueue.Workload{}
-			if err := cl.Get(ctx, client.ObjectKeyFromObject(tc.workload), gotWorkload); err != nil {
-				if tc.wantWorkload != nil && !errors.IsNotFound(err) {
-					t.Fatalf("Could not get Workloads after reconcile: %v", err)
+			if tc.wantWorkload != nil {
+				gotWorkload := &kueue.Workload{}
+				if err := cl.Get(ctx, client.ObjectKeyFromObject(tc.workload), gotWorkload); err != nil {
+					if !errors.IsNotFound(err) {
+						t.Fatalf("Could not get Workloads after reconcile: %v", err)
+					}
+					t.Fatalf("expected workload to persist")
+				}
+				if diff := cmp.Diff(tc.wantWorkload, gotWorkload, workloadCmpOpts...); diff != "" {
+					t.Errorf("Workloads after reconcile (-want,+got):\n%s", diff)
 				}
-				gotWorkload = nil
-			}
-			if diff := cmp.Diff(tc.wantWorkload, gotWorkload, workloadCmpOpts...); diff != "" {
-				t.Errorf("Workloads after reconcile (-want,+got):\n%s", diff)
 			}
 			if diff := cmp.Diff(tc.wantEvents, recorder.RecordedEvents); diff != "" {
 				t.Errorf("unexpected events (-want/+got):\n%s", diff)
 			}
+
+			// For DRA tests, verify that workloads are properly queued/cached
+			if tc.enableDRAFeature && tc.workload != nil &&
+				len(tc.workload.Spec.PodSets) > 0 &&
+				len(tc.workload.Spec.PodSets[0].Template.Spec.ResourceClaims) > 0 {
+				workloadKey := client.ObjectKeyFromObject(tc.workload)
+
+				if cqName, found := qManager.ClusterQueueFromLocalQueue(utilqueue.KeyFromWorkload(tc.workload)); found {
+					pendingWorkloads := qManager.PendingWorkloadsInfo(cqName)
+
+					if tc.wantWorkloadsInQueue != nil {
+						if len(pendingWorkloads) != *tc.wantWorkloadsInQueue {
+							t.Errorf("Expected exactly %d workload(s) in queue, got %d workloads", *tc.wantWorkloadsInQueue, len(pendingWorkloads))
+							for i, wl := range pendingWorkloads {
+								t.Logf("Workload %d: %s/%s", i, wl.Obj.Namespace, wl.Obj.Name)
+							}
+						}
+					}
+
+					var foundInQueue bool
+					for _, wlInfo := range pendingWorkloads {
+						if wlInfo.Obj.Name == workloadKey.Name && wlInfo.Obj.Namespace == workloadKey.Namespace {
+							foundInQueue = true
+							if len(tc.resourceClaimTemplates) > 0 && wlInfo.TotalRequests != nil {
+								t.Logf("DRA workload found in queue with TotalRequests: %+v", wlInfo.TotalRequests)
+
+								if tc.wantDRAResourceTotal != nil {
+									if len(wlInfo.TotalRequests) > 0 && wlInfo.TotalRequests[0].Requests != nil {
+										if gpuVal, hasGPU := wlInfo.TotalRequests[0].Requests["gpu"]; hasGPU {
+											if gpuVal != *tc.wantDRAResourceTotal {
+												t.Errorf("Expected gpu resource total to be %d, got %d", *tc.wantDRAResourceTotal, gpuVal)
+											}
+										} else {
+											t.Errorf("Expected gpu resource in DRA workload TotalRequests, but not found")
+										}
+									} else {
+										t.Errorf("Expected TotalRequests with DRA resources, but TotalRequests is empty")
+									}
+								}
+							}
+							break
+						}
+					}
+					if !foundInQueue {
+						t.Errorf("DRA workload not found in queue - expected to be queued for processing")
+					}
+				} else {
+					t.Errorf("LocalQueue not found in queue manager - DRA workload should have been queued")
+				}
+			}
 		})
 	}
 }
diff --git a/pkg/controller/jobframework/tas_test.go b/pkg/controller/jobframework/tas_test.go
index 9c7c85d2e..13dd0bea9 100644
--- a/pkg/controller/jobframework/tas_test.go
+++ b/pkg/controller/jobframework/tas_test.go
@@ -27,7 +27,6 @@ import (
 	"k8s.io/utils/ptr"
 	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
@@ -43,7 +42,7 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"required annotation": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 				},
 			},
 			wantReq: &kueue.PodSetTopologyRequest{
@@ -53,7 +52,7 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"required annotation with pod index label": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 				},
 			},
 			podIndexLabel: ptr.To(batchv1.JobCompletionIndexAnnotation),
@@ -74,8 +73,8 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"required annotation with sub group": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
-					kueuealpha.PodSetGroupName:                  "block",
+					kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetGroupName:                  "block",
 				},
 			},
 			subGroupIndexLabel: ptr.To(jobsetapi.JobIndexKey),
@@ -90,8 +89,8 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"required annotation with sub group and pod set group name annotation": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
-					kueuealpha.PodSetGroupName:                  "block",
+					kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetGroupName:                  "block",
 				},
 			},
 			subGroupIndexLabel: ptr.To(jobsetapi.JobIndexKey),
@@ -106,7 +105,7 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"preferred annotation": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 				},
 			},
 			wantReq: &kueue.PodSetTopologyRequest{
@@ -116,7 +115,7 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"unconstrained annotation (true)": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetUnconstrainedTopologyAnnotation: "true",
+					kueue.PodSetUnconstrainedTopologyAnnotation: "true",
 				},
 			},
 			wantReq: &kueue.PodSetTopologyRequest{
@@ -126,7 +125,7 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"unconstrained annotation (false)": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetUnconstrainedTopologyAnnotation: "false",
+					kueue.PodSetUnconstrainedTopologyAnnotation: "false",
 				},
 			},
 			wantReq: &kueue.PodSetTopologyRequest{
@@ -136,8 +135,8 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"slice-only topology": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-					kueuealpha.PodSetSliceSizeAnnotation:             "1",
+					kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetSliceSizeAnnotation:             "1",
 				},
 			},
 			wantReq: &kueue.PodSetTopologyRequest{
@@ -148,23 +147,23 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"slice-only topology – only slice required annotation": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
 				},
 			},
 		},
 		"slice-only topology – only slice size annotation": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetSliceSizeAnnotation: "1",
+					kueue.PodSetSliceSizeAnnotation: "1",
 				},
 			},
 		},
 		"slice-only topology with sub group and pod set group name annotation": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-					kueuealpha.PodSetSliceSizeAnnotation:             "1",
-					kueuealpha.PodSetGroupName:                       "block",
+					kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetSliceSizeAnnotation:             "1",
+					kueue.PodSetGroupName:                       "block",
 				},
 			},
 			subGroupIndexLabel: ptr.To(jobsetapi.JobIndexKey),
@@ -179,7 +178,7 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"invalid unconstrained topology annotation value": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetUnconstrainedTopologyAnnotation: "invalid",
+					kueue.PodSetUnconstrainedTopologyAnnotation: "invalid",
 				},
 			},
 			wantErr: strconv.ErrSyntax,
@@ -187,8 +186,8 @@ func TestPodSetTopologyRequestBuilder(t *testing.T) {
 		"invalid podset slice size annotation value": {
 			meta: &metav1.ObjectMeta{
 				Annotations: map[string]string{
-					kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-					kueuealpha.PodSetSliceSizeAnnotation:             "invalid",
+					kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetSliceSizeAnnotation:             "invalid",
 				},
 			},
 			wantErr: strconv.ErrSyntax,
diff --git a/pkg/controller/jobs/appwrapper/appwrapper_controller_test.go b/pkg/controller/jobs/appwrapper/appwrapper_controller_test.go
index 4200c775e..0624d691d 100644
--- a/pkg/controller/jobs/appwrapper/appwrapper_controller_test.go
+++ b/pkg/controller/jobs/appwrapper/appwrapper_controller_test.go
@@ -32,7 +32,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -70,14 +69,14 @@ func TestPodSets(t *testing.T) {
 				ReplicaType:  kftraining.PyTorchJobReplicaTypeMaster,
 				ReplicaCount: 1,
 				Annotations: map[string]string{
-					kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+					kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 				},
 			},
 			testingpytorchjob.PyTorchReplicaSpecRequirement{
 				ReplicaType:  kftraining.PyTorchJobReplicaTypeWorker,
 				ReplicaCount: 4,
 				Annotations: map[string]string{
-					kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 				},
 			},
 		).
@@ -119,13 +118,13 @@ func TestPodSets(t *testing.T) {
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet("aw-0", 1).
 					PodSpec(pytorchJobTAS.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeMaster].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+					Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 					RequiredTopologyRequest("cloud.com/rack").
 					PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 					Obj(),
 				*utiltesting.MakePodSet("aw-1", 4).
 					PodSpec(pytorchJobTAS.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeWorker].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 					PreferredTopologyRequest("cloud.com/block").
 					PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 					Obj(),
@@ -141,11 +140,11 @@ func TestPodSets(t *testing.T) {
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet("aw-0", 1).
 					PodSpec(pytorchJobTAS.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeMaster].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+					Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 					Obj(),
 				*utiltesting.MakePodSet("aw-1", 4).
 					PodSpec(pytorchJobTAS.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeWorker].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 					Obj(),
 			},
 
@@ -210,7 +209,9 @@ func TestReconciler(t *testing.T) {
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("aw", "ns").
 					PodSets(
-						*utiltesting.MakePodSet("aw-0", 2).Obj(),
+						*utiltesting.MakePodSet("aw-0", 2).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -243,7 +244,9 @@ func TestReconciler(t *testing.T) {
 				*utiltesting.MakeWorkload("aw", "ns").
 					Annotations(map[string]string{controllerconsts.ProvReqAnnotationPrefix + "test-annotation": "test-val"}).
 					PodSets(
-						*utiltesting.MakePodSet("aw-0", 2).Obj(),
+						*utiltesting.MakePodSet("aw-0", 2).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							Obj(),
 					).
 					Obj(),
 			},
diff --git a/pkg/controller/jobs/job/job_controller_test.go b/pkg/controller/jobs/job/job_controller_test.go
index d7bddb19c..bac4a356c 100644
--- a/pkg/controller/jobs/job/job_controller_test.go
+++ b/pkg/controller/jobs/job/job_controller_test.go
@@ -37,7 +37,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
@@ -363,13 +362,13 @@ func TestPodSets(t *testing.T) {
 			job: (*Job)(
 				jobTemplate.Clone().
 					Parallelism(3).
-					PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+					PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
 					Obj(),
 			),
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
 					PodSpec(jobTemplate.Clone().Spec.Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
 					RequiredTopologyRequest("cloud.com/block").
 					PodIndexLabel(ptr.To(batchv1.JobCompletionIndexAnnotation)).
 					Obj(),
@@ -380,13 +379,13 @@ func TestPodSets(t *testing.T) {
 			job: (*Job)(
 				jobTemplate.Clone().
 					Parallelism(3).
-					PodAnnotation(kueuealpha.PodSetPreferredTopologyAnnotation, "cloud.com/block").
+					PodAnnotation(kueue.PodSetPreferredTopologyAnnotation, "cloud.com/block").
 					Obj(),
 			),
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
 					PodSpec(jobTemplate.Clone().Spec.Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 					PreferredTopologyRequest("cloud.com/block").
 					PodIndexLabel(ptr.To(batchv1.JobCompletionIndexAnnotation)).
 					Obj(),
@@ -397,16 +396,16 @@ func TestPodSets(t *testing.T) {
 			job: (*Job)(
 				jobTemplate.Clone().
 					Parallelism(3).
-					PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-					PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
+					PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+					PodAnnotation(kueue.PodSetSliceSizeAnnotation, "1").
 					Obj(),
 			),
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
 					PodSpec(jobTemplate.Clone().Spec.Template.Spec).
 					Annotations(map[string]string{
-						kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-						kueuealpha.PodSetSliceSizeAnnotation:             "1",
+						kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+						kueue.PodSetSliceSizeAnnotation:             "1",
 					}).
 					PodIndexLabel(ptr.To(batchv1.JobCompletionIndexAnnotation)).
 					SliceRequiredTopologyRequest("cloud.com/block").
@@ -419,16 +418,16 @@ func TestPodSets(t *testing.T) {
 			job: (*Job)(
 				jobTemplate.Clone().
 					Parallelism(3).
-					PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-					PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
+					PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+					PodAnnotation(kueue.PodSetSliceSizeAnnotation, "1").
 					Obj(),
 			),
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
 					PodSpec(jobTemplate.Clone().Spec.Template.Spec).
 					Annotations(map[string]string{
-						kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-						kueuealpha.PodSetSliceSizeAnnotation:             "1",
+						kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+						kueue.PodSetSliceSizeAnnotation:             "1",
 					}).
 					Obj(),
 			},
@@ -438,14 +437,14 @@ func TestPodSets(t *testing.T) {
 			job: (*Job)(
 				jobTemplate.Clone().
 					Parallelism(3).
-					PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+					PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
 					Obj(),
 			),
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
 					PodSpec(jobTemplate.Clone().Spec.Template.Spec).
 					Annotations(map[string]string{
-						kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+						kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
 					}).
 					PodIndexLabel(ptr.To(batchv1.JobCompletionIndexAnnotation)).
 					Obj(),
@@ -456,14 +455,14 @@ func TestPodSets(t *testing.T) {
 			job: (*Job)(
 				jobTemplate.Clone().
 					Parallelism(3).
-					PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
+					PodAnnotation(kueue.PodSetSliceSizeAnnotation, "1").
 					Obj(),
 			),
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
 					PodSpec(jobTemplate.Clone().Spec.Template.Spec).
 					Annotations(map[string]string{
-						kueuealpha.PodSetSliceSizeAnnotation: "1",
+						kueue.PodSetSliceSizeAnnotation: "1",
 					}).
 					PodIndexLabel(ptr.To(batchv1.JobCompletionIndexAnnotation)).
 					Obj(),
@@ -474,13 +473,13 @@ func TestPodSets(t *testing.T) {
 			job: (*Job)(
 				jobTemplate.Clone().
 					Parallelism(3).
-					PodAnnotation(kueuealpha.PodSetPreferredTopologyAnnotation, "cloud.com/block").
+					PodAnnotation(kueue.PodSetPreferredTopologyAnnotation, "cloud.com/block").
 					Obj(),
 			),
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
 					PodSpec(jobTemplate.Clone().Spec.Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 					Obj(),
 			},
 			enableTopologyAwareScheduling: false,
@@ -489,13 +488,13 @@ func TestPodSets(t *testing.T) {
 			job: (*Job)(
 				jobTemplate.Clone().
 					Parallelism(3).
-					PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+					PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
 					Obj(),
 			),
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 3).
 					PodSpec(jobTemplate.Clone().Spec.Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
 					Obj(),
 			},
 			enableTopologyAwareScheduling: false,
@@ -925,7 +924,7 @@ func TestReconciler(t *testing.T) {
 			wantJob: *baseJobWrapper.Clone().
 				Suspend(false).
 				PodLabel(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
-				PodAnnotation(kueuealpha.WorkloadAnnotation, "wl").
+				PodAnnotation(kueue.WorkloadAnnotation, "wl").
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
diff --git a/pkg/controller/jobs/job/job_webhook_test.go b/pkg/controller/jobs/job/job_webhook_test.go
index d597339b3..3489dd7dc 100644
--- a/pkg/controller/jobs/job/job_webhook_test.go
+++ b/pkg/controller/jobs/job/job_webhook_test.go
@@ -33,7 +33,6 @@ import (
 	"k8s.io/utils/ptr"
 	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -245,7 +244,7 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "valid topology request",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			wantValidationErrs:      nil,
 			topologyAwareScheduling: true,
@@ -253,8 +252,8 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "invalid topology request - both annotations",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetPreferredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetPreferredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Invalid(replicaMetaPath.Child("annotations"), field.OmitValueType{},
@@ -266,7 +265,7 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "invalid topology request - invalid required",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "some required value").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "some required value").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Invalid(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-required-topology"), "some required value",
@@ -277,7 +276,7 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "invalid topology request - invalid preferred",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetPreferredTopologyAnnotation, "some preferred value").
+				PodAnnotation(kueue.PodSetPreferredTopologyAnnotation, "some preferred value").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Invalid(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-preferred-topology"), "some preferred value",
@@ -288,9 +287,9 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "valid slice topology request",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "1").
 				Obj(),
 			wantValidationErrs:      nil,
 			topologyAwareScheduling: true,
@@ -298,9 +297,9 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "valid topology request - slice-only topology - unconstrained with slices defined",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetUnconstrainedTopologyAnnotation, "true").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
+				PodAnnotation(kueue.PodSetUnconstrainedTopologyAnnotation, "true").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "1").
 				Obj(),
 			wantValidationErrs:      nil,
 			topologyAwareScheduling: true,
@@ -308,8 +307,8 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "invalid topology request - slice requested without slice size",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Required(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-size"), "slice size is required if slice topology is requested"),
@@ -319,9 +318,9 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "invalid topology request - slice size is not a number",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "not a number").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "not a number").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Invalid(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-size"), "not a number", "must be a numeric value"),
@@ -331,9 +330,9 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "invalid topology request - slice size is negative",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "-1").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "-1").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Invalid(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-size"), "-1", "must be greater than or equal to 1"),
@@ -343,9 +342,9 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "invalid topology request - slice size is zero",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "0").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "0").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Invalid(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-size"), "0", "must be greater than or equal to 1"),
@@ -355,8 +354,8 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "invalid topology request - slice size provided without slice topology",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "1").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Forbidden(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-size"), "cannot be set when 'kueue.x-k8s.io/podset-slice-required-topology' is not present"),
@@ -366,8 +365,8 @@ func TestValidateCreate(t *testing.T) {
 		{
 			name: "valid topology request - slice-only topology",
 			job: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "1").
 				Obj(),
 			wantValidationErrs:      nil,
 			topologyAwareScheduling: true,
@@ -376,9 +375,9 @@ func TestValidateCreate(t *testing.T) {
 			name: "invalid slice topology request - slice size larger than number of podsets",
 			job: testingutil.MakeJob("job", "default").
 				Parallelism(4).
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "20").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "20").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Invalid(replicaMetaPath.Child("annotations").
@@ -642,7 +641,7 @@ func TestValidateUpdate(t *testing.T) {
 			oldJob: testingutil.MakeJob("job", "default").
 				Obj(),
 			newJob: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			topologyAwareScheduling: true,
 		},
@@ -651,8 +650,8 @@ func TestValidateUpdate(t *testing.T) {
 			oldJob: testingutil.MakeJob("job", "default").
 				Obj(),
 			newJob: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetPreferredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetPreferredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Invalid(replicaMetaPath.Child("annotations"), field.OmitValueType{},
@@ -665,9 +664,9 @@ func TestValidateUpdate(t *testing.T) {
 			oldJob: testingutil.MakeJob("job", "default").
 				Obj(),
 			newJob: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceSizeAnnotation, "1").
 				Obj(),
 			topologyAwareScheduling: true,
 		},
@@ -676,8 +675,8 @@ func TestValidateUpdate(t *testing.T) {
 			oldJob: testingutil.MakeJob("job", "default").
 				Obj(),
 			newJob: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			wantValidationErrs: field.ErrorList{
 				field.Required(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-size"), "slice size is required if slice topology is requested"),
diff --git a/pkg/controller/jobs/jobset/jobset_controller_test.go b/pkg/controller/jobs/jobset/jobset_controller_test.go
index 98fd94df3..74b018452 100644
--- a/pkg/controller/jobs/jobset/jobset_controller_test.go
+++ b/pkg/controller/jobs/jobset/jobset_controller_test.go
@@ -31,7 +31,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	jobset "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
@@ -237,7 +236,7 @@ func TestPodSets(t *testing.T) {
 						Parallelism: 1,
 						Completions: 1,
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingjobset.ReplicatedJobRequirements{Name: "job2", Replicas: 3, Parallelism: 2, Completions: 3},
@@ -247,7 +246,7 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(jobSet.Spec.ReplicatedJobs[0].Name), 2).
 						PodSpec(*jobSet.Spec.ReplicatedJobs[0].Template.Spec.Template.Spec.DeepCopy()).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
 						RequiredTopologyRequest("cloud.com/block").
 						PodIndexLabel(ptr.To(batchv1.JobCompletionIndexAnnotation)).
 						SubGroupIndexLabel(ptr.To(jobset.JobIndexKey)).
@@ -273,7 +272,7 @@ func TestPodSets(t *testing.T) {
 						Parallelism: 2,
 						Completions: 3,
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -288,7 +287,7 @@ func TestPodSets(t *testing.T) {
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(jobSet.Spec.ReplicatedJobs[1].Name), 6).
 						PodSpec(*jobSet.Spec.ReplicatedJobs[1].Template.Spec.Template.Spec.DeepCopy()).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						PreferredTopologyRequest("cloud.com/block").
 						PodIndexLabel(ptr.To(batchv1.JobCompletionIndexAnnotation)).
 						SubGroupIndexLabel(ptr.To(jobset.JobIndexKey)).
@@ -308,7 +307,7 @@ func TestPodSets(t *testing.T) {
 						Parallelism: 1,
 						Completions: 1,
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingjobset.ReplicatedJobRequirements{
@@ -317,7 +316,7 @@ func TestPodSets(t *testing.T) {
 						Parallelism: 2,
 						Completions: 3,
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -329,11 +328,11 @@ func TestPodSets(t *testing.T) {
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(jobSet.Spec.ReplicatedJobs[1].Name), 2).
 						PodSpec(*jobSet.Spec.ReplicatedJobs[1].Template.Spec.Template.Spec.DeepCopy()).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(jobSet.Spec.ReplicatedJobs[2].Name), 6).
 						PodSpec(*jobSet.Spec.ReplicatedJobs[2].Template.Spec.Template.Spec.DeepCopy()).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						Obj(),
 				}
 			},
@@ -430,8 +429,16 @@ func TestReconciler(t *testing.T) {
 				*utiltesting.MakeWorkload("jobset", "ns").
 					Annotations(map[string]string{controllerconsts.ProvReqAnnotationPrefix + "test-annotation": "test-val"}).
 					PodSets(
-						*utiltesting.MakePodSet("replicated-job-1", 1).Obj(),
-						*utiltesting.MakePodSet("replicated-job-2", 4).Obj(),
+						*utiltesting.MakePodSet("replicated-job-1", 1).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							SubGroupIndexLabel(ptr.To(jobset.JobIndexKey)).
+							SubGroupCount(ptr.To[int32](1)).
+							Obj(),
+						*utiltesting.MakePodSet("replicated-job-2", 4).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							SubGroupIndexLabel(ptr.To(jobset.JobIndexKey)).
+							SubGroupCount(ptr.To[int32](2)).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -466,7 +473,11 @@ func TestReconciler(t *testing.T) {
 					Priority(100).
 					PriorityClassSource(constants.WorkloadPriorityClassSource).
 					PodSets(
-						*utiltesting.MakePodSet("replicated-job-1", 1).Obj(),
+						*utiltesting.MakePodSet("replicated-job-1", 1).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							SubGroupIndexLabel(ptr.To(jobset.JobIndexKey)).
+							SubGroupCount(ptr.To[int32](1)).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -501,7 +512,11 @@ func TestReconciler(t *testing.T) {
 					Priority(200).
 					PriorityClassSource(constants.PodPriorityClassSource).
 					PodSets(
-						*utiltesting.MakePodSet("replicated-job-1", 1).Obj(),
+						*utiltesting.MakePodSet("replicated-job-1", 1).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							SubGroupIndexLabel(ptr.To(jobset.JobIndexKey)).
+							SubGroupCount(ptr.To[int32](1)).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -536,7 +551,11 @@ func TestReconciler(t *testing.T) {
 					Priority(100).
 					PriorityClassSource(constants.WorkloadPriorityClassSource).
 					PodSets(
-						*utiltesting.MakePodSet("replicated-job-1", 1).Obj(),
+						*utiltesting.MakePodSet("replicated-job-1", 1).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							SubGroupIndexLabel(ptr.To(jobset.JobIndexKey)).
+							SubGroupCount(ptr.To[int32](1)).
+							Obj(),
 					).
 					Obj(),
 			},
diff --git a/pkg/controller/jobs/jobset/jobset_webhook_test.go b/pkg/controller/jobs/jobset/jobset_webhook_test.go
index fa3787789..465eea294 100644
--- a/pkg/controller/jobs/jobset/jobset_webhook_test.go
+++ b/pkg/controller/jobs/jobset/jobset_webhook_test.go
@@ -27,7 +27,6 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	jobset "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -73,12 +72,12 @@ func TestValidateCreate(t *testing.T) {
 			job: testingutil.MakeJobSet("job", "default").ReplicatedJobs(testingutil.ReplicatedJobRequirements{
 				Name: "launcher",
 				PodAnnotations: map[string]string{
-					kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 				},
 			}, testingutil.ReplicatedJobRequirements{
 				Name: "worker",
 				PodAnnotations: map[string]string{
-					kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 				},
 			}).Obj(),
 			topologyAwareScheduling: true,
@@ -88,13 +87,13 @@ func TestValidateCreate(t *testing.T) {
 			job: testingutil.MakeJobSet("job", "default").ReplicatedJobs(testingutil.ReplicatedJobRequirements{
 				Name: "launcher",
 				PodAnnotations: map[string]string{
-					kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 				},
 			}, testingutil.ReplicatedJobRequirements{
 				Name: "worker",
 				PodAnnotations: map[string]string{
-					kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
-					kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
+					kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
 				},
 			}).Obj(),
 			wantErr: field.ErrorList{field.Invalid(field.NewPath("spec.replicatedJobs[1].template.metadata.annotations"),
@@ -107,9 +106,9 @@ func TestValidateCreate(t *testing.T) {
 			job: testingutil.MakeJobSet("jobset", "default").
 				ReplicatedJobs(testingutil.ReplicatedJobRequirements{
 					Name: "job1", Replicas: 2, Parallelism: 1, Completions: 1, PodAnnotations: map[string]string{
-						kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
-						kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-						kueuealpha.PodSetSliceSizeAnnotation:             "20",
+						kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+						kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+						kueue.PodSetSliceSizeAnnotation:             "20",
 					},
 				}).
 				Obj(),
@@ -154,7 +153,7 @@ func TestValidateUpdate(t *testing.T) {
 			newJob: testingutil.MakeJobSet("job", "default").ReplicatedJobs(testingutil.ReplicatedJobRequirements{
 				Name: "worker",
 				PodAnnotations: map[string]string{
-					kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 				},
 			}).Obj(),
 			topologyAwareScheduling: true,
@@ -168,8 +167,8 @@ func TestValidateUpdate(t *testing.T) {
 			newJob: testingutil.MakeJobSet("job", "default").ReplicatedJobs(testingutil.ReplicatedJobRequirements{
 				Name: "worker",
 				PodAnnotations: map[string]string{
-					kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
-					kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
+					kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+					kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
 				},
 			}).Obj(),
 			wantValidationErrs: field.ErrorList{field.Invalid(field.NewPath("spec.replicatedJobs[0].template.metadata.annotations"),
diff --git a/pkg/controller/jobs/kubeflow/jobs/jaxjob/jaxjob_controller_test.go b/pkg/controller/jobs/kubeflow/jobs/jaxjob/jaxjob_controller_test.go
index 981293abe..56687b869 100644
--- a/pkg/controller/jobs/kubeflow/jobs/jaxjob/jaxjob_controller_test.go
+++ b/pkg/controller/jobs/kubeflow/jobs/jaxjob/jaxjob_controller_test.go
@@ -26,7 +26,6 @@ import (
 	"k8s.io/component-base/featuregate"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -128,6 +127,7 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.JAXJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.JAXReplicaSpecs[kftraining.JAXJobReplicaTypeWorker].Template.Spec).
+						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
 				}
 			},
@@ -139,7 +139,7 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.JAXJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -148,7 +148,7 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.JAXJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.JAXReplicaSpecs[kftraining.JAXJobReplicaTypeWorker].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						PreferredTopologyRequest("cloud.com/block").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
@@ -199,7 +199,7 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.JAXJobReplicaTypeWorker,
 						ReplicaCount: 3,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -213,8 +213,8 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.JAXJobReplicaTypeWorker,
 						ReplicaCount: 3,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -237,9 +237,9 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.JAXJobReplicaTypeWorker,
 						ReplicaCount: 3,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "20",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "20",
 						},
 					},
 				).
diff --git a/pkg/controller/jobs/kubeflow/jobs/paddlejob/paddlejob_controller_test.go b/pkg/controller/jobs/kubeflow/jobs/paddlejob/paddlejob_controller_test.go
index a96c33274..564a4a481 100644
--- a/pkg/controller/jobs/kubeflow/jobs/paddlejob/paddlejob_controller_test.go
+++ b/pkg/controller/jobs/kubeflow/jobs/paddlejob/paddlejob_controller_test.go
@@ -33,7 +33,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/features"
@@ -271,14 +270,14 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.PaddleJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingpaddlejob.PaddleReplicaSpecRequirement{
 						ReplicaType:  kftraining.PaddleJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -287,13 +286,13 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.PaddleJobReplicaTypeMaster)), 1).
 						PodSpec(job.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeMaster].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 						RequiredTopologyRequest("cloud.com/rack").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.PaddleJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeWorker].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						PreferredTopologyRequest("cloud.com/block").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
@@ -308,14 +307,14 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.PaddleJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingpaddlejob.PaddleReplicaSpecRequirement{
 						ReplicaType:  kftraining.PaddleJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -324,11 +323,11 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.PaddleJobReplicaTypeMaster)), 1).
 						PodSpec(job.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeMaster].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.PaddleJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.PaddleReplicaSpecs[kftraining.PaddleJobReplicaTypeWorker].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						Obj(),
 				}
 			},
@@ -366,14 +365,14 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.PaddleJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingpaddlejob.PaddleReplicaSpecRequirement{
 						ReplicaType:  kftraining.PaddleJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -387,16 +386,16 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.PaddleJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingpaddlejob.PaddleReplicaSpecRequirement{
 						ReplicaType:  kftraining.PaddleJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -426,18 +425,18 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.PaddleJobReplicaTypeMaster,
 						ReplicaCount: 5,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "10",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "10",
 						},
 					},
 					testingpaddlejob.PaddleReplicaSpecRequirement{
 						ReplicaType:  kftraining.PaddleJobReplicaTypeWorker,
 						ReplicaCount: 10,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "20",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "20",
 						},
 					},
 				).
@@ -518,8 +517,12 @@ func TestReconciler(t *testing.T) {
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("paddlejob", "ns").
 					PodSets(
-						*utiltesting.MakePodSet("master", 1).Obj(),
-						*utiltesting.MakePodSet("worker", 2).Obj(),
+						*utiltesting.MakePodSet("master", 1).
+							PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
+							Obj(),
+						*utiltesting.MakePodSet("worker", 2).
+							PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
+							Obj(),
 					).
 					Obj(),
 			},
diff --git a/pkg/controller/jobs/kubeflow/jobs/pytorchjob/pytorchjob_controller_test.go b/pkg/controller/jobs/kubeflow/jobs/pytorchjob/pytorchjob_controller_test.go
index 1f9f87a8a..f8703b87e 100644
--- a/pkg/controller/jobs/kubeflow/jobs/pytorchjob/pytorchjob_controller_test.go
+++ b/pkg/controller/jobs/kubeflow/jobs/pytorchjob/pytorchjob_controller_test.go
@@ -25,7 +25,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -262,14 +261,14 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingpytorchjob.PyTorchReplicaSpecRequirement{
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -278,13 +277,13 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.PyTorchJobReplicaTypeMaster)), 1).
 						PodSpec(job.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeMaster].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 						RequiredTopologyRequest("cloud.com/rack").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.PyTorchJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeWorker].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						PreferredTopologyRequest("cloud.com/block").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
@@ -299,14 +298,14 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingpytorchjob.PyTorchReplicaSpecRequirement{
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -315,11 +314,11 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.PyTorchJobReplicaTypeMaster)), 1).
 						PodSpec(job.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeMaster].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.PyTorchJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.PyTorchReplicaSpecs[kftraining.PyTorchJobReplicaTypeWorker].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						Obj(),
 				}
 			},
@@ -368,14 +367,14 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingpytorchjob.PyTorchReplicaSpecRequirement{
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeWorker,
 						ReplicaCount: 3,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -389,16 +388,16 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingpytorchjob.PyTorchReplicaSpecRequirement{
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeWorker,
 						ReplicaCount: 3,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -428,18 +427,18 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeMaster,
 						ReplicaCount: 5,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "10",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "10",
 						},
 					},
 					testingpytorchjob.PyTorchReplicaSpecRequirement{
 						ReplicaType:  kftraining.PyTorchJobReplicaTypeWorker,
 						ReplicaCount: 10,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "20",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "20",
 						},
 					},
 				).
diff --git a/pkg/controller/jobs/kubeflow/jobs/tfjob/tfjob_controller_test.go b/pkg/controller/jobs/kubeflow/jobs/tfjob/tfjob_controller_test.go
index 7d92ba6ec..f43491e61 100644
--- a/pkg/controller/jobs/kubeflow/jobs/tfjob/tfjob_controller_test.go
+++ b/pkg/controller/jobs/kubeflow/jobs/tfjob/tfjob_controller_test.go
@@ -25,7 +25,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -272,14 +271,14 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.TFJobReplicaTypeChief,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
 						ReplicaType:  kftraining.TFJobReplicaTypePS,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
@@ -292,13 +291,13 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.TFJobReplicaTypeChief)), 1).
 						PodSpec(job.Spec.TFReplicaSpecs[kftraining.TFJobReplicaTypeChief].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 						RequiredTopologyRequest("cloud.com/rack").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.TFJobReplicaTypePS)), 1).
 						PodSpec(job.Spec.TFReplicaSpecs[kftraining.TFJobReplicaTypePS].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						PreferredTopologyRequest("cloud.com/block").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
@@ -317,14 +316,14 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.TFJobReplicaTypeChief,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
 						ReplicaType:  kftraining.TFJobReplicaTypePS,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
@@ -337,11 +336,11 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.TFJobReplicaTypeChief)), 1).
 						PodSpec(job.Spec.TFReplicaSpecs[kftraining.TFJobReplicaTypeChief].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.TFJobReplicaTypePS)), 1).
 						PodSpec(job.Spec.TFReplicaSpecs[kftraining.TFJobReplicaTypePS].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.TFJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.TFReplicaSpecs[kftraining.TFJobReplicaTypeWorker].Template.Spec).
@@ -382,14 +381,14 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.TFJobReplicaTypeChief,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
 						ReplicaType:  kftraining.TFJobReplicaTypePS,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
@@ -407,23 +406,23 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.TFJobReplicaTypeChief,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
 						ReplicaType:  kftraining.TFJobReplicaTypePS,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
 						ReplicaType:  kftraining.TFJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 				).
@@ -453,27 +452,27 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.TFJobReplicaTypeChief,
 						ReplicaCount: 3,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "5",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "5",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
 						ReplicaType:  kftraining.TFJobReplicaTypePS,
 						ReplicaCount: 5,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "10",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "10",
 						},
 					},
 					testingtfjob.TFReplicaSpecRequirement{
 						ReplicaType:  kftraining.TFJobReplicaTypeWorker,
 						ReplicaCount: 10,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "20",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "20",
 						},
 					},
 				).
diff --git a/pkg/controller/jobs/kubeflow/jobs/xgboostjob/xgboostjob_controller_test.go b/pkg/controller/jobs/kubeflow/jobs/xgboostjob/xgboostjob_controller_test.go
index bdf56d7a4..c6fda1ca3 100644
--- a/pkg/controller/jobs/kubeflow/jobs/xgboostjob/xgboostjob_controller_test.go
+++ b/pkg/controller/jobs/kubeflow/jobs/xgboostjob/xgboostjob_controller_test.go
@@ -33,7 +33,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/features"
@@ -269,14 +268,14 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingxgboostjob.XGBReplicaSpecRequirement{
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -285,13 +284,13 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.XGBoostJobReplicaTypeMaster)), 1).
 						PodSpec(job.Spec.XGBReplicaSpecs[kftraining.XGBoostJobReplicaTypeMaster].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 						RequiredTopologyRequest("cloud.com/rack").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.XGBoostJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.XGBReplicaSpecs[kftraining.XGBoostJobReplicaTypeWorker].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						PreferredTopologyRequest("cloud.com/block").
 						PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
 						Obj(),
@@ -306,14 +305,14 @@ func TestPodSets(t *testing.T) {
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingxgboostjob.XGBReplicaSpecRequirement{
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeWorker,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -322,11 +321,11 @@ func TestPodSets(t *testing.T) {
 				return []kueue.PodSet{
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.XGBoostJobReplicaTypeMaster)), 1).
 						PodSpec(job.Spec.XGBReplicaSpecs[kftraining.XGBoostJobReplicaTypeMaster].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
+						Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack"}).
 						Obj(),
 					*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kftraining.XGBoostJobReplicaTypeWorker)), 1).
 						PodSpec(job.Spec.XGBReplicaSpecs[kftraining.XGBoostJobReplicaTypeWorker].Template.Spec).
-						Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+						Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 						Obj(),
 				}
 			},
@@ -375,14 +374,14 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 						},
 					},
 					testingxgboostjob.XGBReplicaSpecRequirement{
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeWorker,
 						ReplicaCount: 3,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -396,16 +395,16 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeMaster,
 						ReplicaCount: 1,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					testingxgboostjob.XGBReplicaSpecRequirement{
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeWorker,
 						ReplicaCount: 3,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
-							kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/rack",
+							kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				).
@@ -435,18 +434,18 @@ func TestValidate(t *testing.T) {
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeMaster,
 						ReplicaCount: 5,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "10",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "10",
 						},
 					},
 					testingxgboostjob.XGBReplicaSpecRequirement{
 						ReplicaType:  kftraining.XGBoostJobReplicaTypeWorker,
 						ReplicaCount: 10,
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-							kueuealpha.PodSetSliceSizeAnnotation:             "20",
+							kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/rack",
+							kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetSliceSizeAnnotation:             "20",
 						},
 					},
 				).
@@ -527,8 +526,12 @@ func TestReconciler(t *testing.T) {
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("xgboostjob", "ns").
 					PodSets(
-						*utiltesting.MakePodSet("master", 1).Obj(),
-						*utiltesting.MakePodSet("worker", 2).Obj(),
+						*utiltesting.MakePodSet("master", 1).
+							PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
+							Obj(),
+						*utiltesting.MakePodSet("worker", 2).
+							PodIndexLabel(ptr.To(kftraining.ReplicaIndexLabel)).
+							Obj(),
 					).
 					Obj(),
 			},
diff --git a/pkg/controller/jobs/kubeflow/trainjob/trainjob_controller_test.go b/pkg/controller/jobs/kubeflow/trainjob/trainjob_controller_test.go
index 90ed4ccc3..ef62ed15a 100644
--- a/pkg/controller/jobs/kubeflow/trainjob/trainjob_controller_test.go
+++ b/pkg/controller/jobs/kubeflow/trainjob/trainjob_controller_test.go
@@ -26,6 +26,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/client-go/tools/record"
+	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
@@ -390,8 +391,16 @@ func TestReconciler(t *testing.T) {
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload(testTrainJob.Name, testTrainJob.Namespace).
 					PodSets(
-						*utiltesting.MakePodSet("replicated-job-1", 1).Obj(),
-						*utiltesting.MakePodSet("replicated-job-2", 4).Obj(),
+						*utiltesting.MakePodSet("replicated-job-1", 1).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							SubGroupIndexLabel(ptr.To("jobset.sigs.k8s.io/job-index")).
+							SubGroupCount(ptr.To[int32](1)).
+							Obj(),
+						*utiltesting.MakePodSet("replicated-job-2", 4).
+							PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+							SubGroupIndexLabel(ptr.To("jobset.sigs.k8s.io/job-index")).
+							SubGroupCount(ptr.To[int32](2)).
+							Obj(),
 					).
 					Obj(),
 			},
diff --git a/pkg/controller/jobs/leaderworkerset/leaderworkerset_reconciler_test.go b/pkg/controller/jobs/leaderworkerset/leaderworkerset_reconciler_test.go
index 2a0e64700..0386a240f 100644
--- a/pkg/controller/jobs/leaderworkerset/leaderworkerset_reconciler_test.go
+++ b/pkg/controller/jobs/leaderworkerset/leaderworkerset_reconciler_test.go
@@ -31,7 +31,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	leaderworkersetv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -297,7 +296,7 @@ func TestReconciler(t *testing.T) {
 				LeaderTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -309,7 +308,7 @@ func TestReconciler(t *testing.T) {
 				WorkerTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -325,7 +324,7 @@ func TestReconciler(t *testing.T) {
 				LeaderTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -337,7 +336,7 @@ func TestReconciler(t *testing.T) {
 				WorkerTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -407,7 +406,7 @@ func TestReconciler(t *testing.T) {
 				LeaderTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -419,7 +418,7 @@ func TestReconciler(t *testing.T) {
 				WorkerTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -435,7 +434,7 @@ func TestReconciler(t *testing.T) {
 				LeaderTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -447,7 +446,7 @@ func TestReconciler(t *testing.T) {
 				WorkerTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 					Spec: corev1.PodSpec{
diff --git a/pkg/controller/jobs/leaderworkerset/leaderworkerset_webhook_test.go b/pkg/controller/jobs/leaderworkerset/leaderworkerset_webhook_test.go
index a957d8155..c789c8b0a 100644
--- a/pkg/controller/jobs/leaderworkerset/leaderworkerset_webhook_test.go
+++ b/pkg/controller/jobs/leaderworkerset/leaderworkerset_webhook_test.go
@@ -28,7 +28,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 	leaderworkersetv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/controller/jobs/mpijob/mpijob_controller_test.go b/pkg/controller/jobs/mpijob/mpijob_controller_test.go
index 5be2f4c0c..6fbafd484 100644
--- a/pkg/controller/jobs/mpijob/mpijob_controller_test.go
+++ b/pkg/controller/jobs/mpijob/mpijob_controller_test.go
@@ -30,7 +30,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -217,12 +216,12 @@ func TestPodSets(t *testing.T) {
 			job: (*MPIJob)(jobTemplate.Clone().
 				PodAnnotation(
 					kfmpi.MPIReplicaTypeLauncher,
-					kueuealpha.PodSetRequiredTopologyAnnotation,
+					kueue.PodSetRequiredTopologyAnnotation,
 					"cloud.com/block",
 				).
 				PodAnnotation(
 					kfmpi.MPIReplicaTypeWorker,
-					kueuealpha.PodSetRequiredTopologyAnnotation,
+					kueue.PodSetRequiredTopologyAnnotation,
 					"cloud.com/block",
 				).
 				Obj(),
@@ -230,13 +229,13 @@ func TestPodSets(t *testing.T) {
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kfmpi.MPIReplicaTypeLauncher)), 1).
 					PodSpec(jobTemplate.Clone().Spec.MPIReplicaSpecs[kfmpi.MPIReplicaTypeLauncher].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
 					RequiredTopologyRequest("cloud.com/block").
 					PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
 					Obj(),
 				*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kfmpi.MPIReplicaTypeWorker)), 3).
 					PodSpec(jobTemplate.Clone().Spec.MPIReplicaSpecs[kfmpi.MPIReplicaTypeWorker].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
 					RequiredTopologyRequest("cloud.com/block").
 					PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
 					Obj(),
@@ -247,12 +246,12 @@ func TestPodSets(t *testing.T) {
 			job: (*MPIJob)(jobTemplate.Clone().
 				PodAnnotation(
 					kfmpi.MPIReplicaTypeLauncher,
-					kueuealpha.PodSetPreferredTopologyAnnotation,
+					kueue.PodSetPreferredTopologyAnnotation,
 					"cloud.com/block",
 				).
 				PodAnnotation(
 					kfmpi.MPIReplicaTypeWorker,
-					kueuealpha.PodSetPreferredTopologyAnnotation,
+					kueue.PodSetPreferredTopologyAnnotation,
 					"cloud.com/block",
 				).
 				Obj(),
@@ -260,13 +259,13 @@ func TestPodSets(t *testing.T) {
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kfmpi.MPIReplicaTypeLauncher)), 1).
 					PodSpec(jobTemplate.Clone().Spec.MPIReplicaSpecs[kfmpi.MPIReplicaTypeLauncher].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 					PreferredTopologyRequest("cloud.com/block").
 					PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
 					Obj(),
 				*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kfmpi.MPIReplicaTypeWorker)), 3).
 					PodSpec(jobTemplate.Clone().Spec.MPIReplicaSpecs[kfmpi.MPIReplicaTypeWorker].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 					PreferredTopologyRequest("cloud.com/block").
 					PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
 					Obj(),
@@ -277,12 +276,12 @@ func TestPodSets(t *testing.T) {
 			job: (*MPIJob)(jobTemplate.Clone().
 				PodAnnotation(
 					kfmpi.MPIReplicaTypeLauncher,
-					kueuealpha.PodSetRequiredTopologyAnnotation,
+					kueue.PodSetRequiredTopologyAnnotation,
 					"cloud.com/block",
 				).
 				PodAnnotation(
 					kfmpi.MPIReplicaTypeWorker,
-					kueuealpha.PodSetRequiredTopologyAnnotation,
+					kueue.PodSetRequiredTopologyAnnotation,
 					"cloud.com/block",
 				).
 				Obj(),
@@ -290,11 +289,11 @@ func TestPodSets(t *testing.T) {
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kfmpi.MPIReplicaTypeLauncher)), 1).
 					PodSpec(jobTemplate.Clone().Spec.MPIReplicaSpecs[kfmpi.MPIReplicaTypeLauncher].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
 					Obj(),
 				*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kfmpi.MPIReplicaTypeWorker)), 3).
 					PodSpec(jobTemplate.Clone().Spec.MPIReplicaSpecs[kfmpi.MPIReplicaTypeWorker].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block"}).
 					Obj(),
 			},
 			enableTopologyAwareScheduling: false,
@@ -303,12 +302,12 @@ func TestPodSets(t *testing.T) {
 			job: (*MPIJob)(jobTemplate.Clone().
 				PodAnnotation(
 					kfmpi.MPIReplicaTypeLauncher,
-					kueuealpha.PodSetPreferredTopologyAnnotation,
+					kueue.PodSetPreferredTopologyAnnotation,
 					"cloud.com/block",
 				).
 				PodAnnotation(
 					kfmpi.MPIReplicaTypeWorker,
-					kueuealpha.PodSetPreferredTopologyAnnotation,
+					kueue.PodSetPreferredTopologyAnnotation,
 					"cloud.com/block",
 				).
 				Obj(),
@@ -316,11 +315,11 @@ func TestPodSets(t *testing.T) {
 			wantPodSets: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kfmpi.MPIReplicaTypeLauncher)), 1).
 					PodSpec(jobTemplate.Clone().Spec.MPIReplicaSpecs[kfmpi.MPIReplicaTypeLauncher].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 					Obj(),
 				*utiltesting.MakePodSet(kueue.NewPodSetReference(string(kfmpi.MPIReplicaTypeWorker)), 3).
 					PodSpec(jobTemplate.Clone().Spec.MPIReplicaSpecs[kfmpi.MPIReplicaTypeWorker].Template.Spec).
-					Annotations(map[string]string{kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
+					Annotations(map[string]string{kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block"}).
 					Obj(),
 			},
 			enableTopologyAwareScheduling: false,
@@ -378,8 +377,12 @@ func TestReconciler(t *testing.T) {
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("mpijob", "ns").
 					PodSets(
-						*utiltesting.MakePodSet("launcher", 1).Obj(),
-						*utiltesting.MakePodSet("worker", 2).Obj(),
+						*utiltesting.MakePodSet("launcher", 1).
+							PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
+							Obj(),
+						*utiltesting.MakePodSet("worker", 2).
+							PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
+							Obj(),
 					).
 					Obj(),
 			},
@@ -397,8 +400,12 @@ func TestReconciler(t *testing.T) {
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("mpijob", "ns").
 					PodSets(
-						*utiltesting.MakePodSet("launcher", 1).Obj(),
-						*utiltesting.MakePodSet("worker", 2).Obj(),
+						*utiltesting.MakePodSet("launcher", 1).
+							PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
+							Obj(),
+						*utiltesting.MakePodSet("worker", 2).
+							PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
+							Obj(),
 					).PriorityClass("test-wpc").Priority(100).
 					PriorityClassSource(constants.WorkloadPriorityClassSource).
 					Obj(),
@@ -417,8 +424,12 @@ func TestReconciler(t *testing.T) {
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("mpijob", "ns").
 					PodSets(
-						*utiltesting.MakePodSet("launcher", 1).Obj(),
-						*utiltesting.MakePodSet("worker", 2).Obj(),
+						*utiltesting.MakePodSet("launcher", 1).
+							PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
+							Obj(),
+						*utiltesting.MakePodSet("worker", 2).
+							PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
+							Obj(),
 					).PriorityClass("test-pc").Priority(200).
 					PriorityClassSource(constants.PodPriorityClassSource).
 					Obj(),
@@ -439,8 +450,12 @@ func TestReconciler(t *testing.T) {
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("mpijob", "ns").
 					PodSets(
-						*utiltesting.MakePodSet("launcher", 1).Obj(),
-						*utiltesting.MakePodSet("worker", 2).Obj(),
+						*utiltesting.MakePodSet("launcher", 1).
+							PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
+							Obj(),
+						*utiltesting.MakePodSet("worker", 2).
+							PodIndexLabel(ptr.To(kfmpi.ReplicaIndexLabel)).
+							Obj(),
 					).PriorityClass("test-wpc").Priority(100).
 					PriorityClassSource(constants.WorkloadPriorityClassSource).
 					Obj(),
diff --git a/pkg/controller/jobs/mpijob/mpijob_webhook_test.go b/pkg/controller/jobs/mpijob/mpijob_webhook_test.go
index 9b78a78cc..db0b7819a 100644
--- a/pkg/controller/jobs/mpijob/mpijob_webhook_test.go
+++ b/pkg/controller/jobs/mpijob/mpijob_webhook_test.go
@@ -27,7 +27,6 @@ import (
 	"k8s.io/utils/ptr"
 	ctrl "sigs.k8s.io/controller-runtime"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -82,8 +81,8 @@ func TestValidateCreate(t *testing.T) {
 						ReplicaCount: 3,
 					},
 				).
-				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			topologyAwareScheduling: true,
 		},
@@ -101,10 +100,10 @@ func TestValidateCreate(t *testing.T) {
 						ReplicaCount: 3,
 					},
 				).
-				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueuealpha.PodSetPreferredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueuealpha.PodSetPreferredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueue.PodSetPreferredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueue.PodSetPreferredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			wantErr: field.ErrorList{
 				field.Invalid(
@@ -134,12 +133,12 @@ func TestValidateCreate(t *testing.T) {
 						ReplicaCount: 3,
 					},
 				).
-				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueuealpha.PodSetSliceSizeAnnotation, "20").
-				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueuealpha.PodSetSliceSizeAnnotation, "20").
+				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeLauncher, kueue.PodSetSliceSizeAnnotation, "20").
+				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueue.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
+				PodAnnotation(v2beta1.MPIReplicaTypeWorker, kueue.PodSetSliceSizeAnnotation, "20").
 				Obj(),
 			wantErr: field.ErrorList{
 				field.Invalid(field.NewPath("spec.mpiReplicaSpecs[Launcher].template.metadata.annotations").
diff --git a/pkg/controller/jobs/pod/pod_controller_test.go b/pkg/controller/jobs/pod/pod_controller_test.go
index 26d0fc74e..b08f623b6 100644
--- a/pkg/controller/jobs/pod/pod_controller_test.go
+++ b/pkg/controller/jobs/pod/pod_controller_test.go
@@ -31,6 +31,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/tools/record"
+	"k8s.io/utils/clock"
 	testingclock "k8s.io/utils/clock/testing"
 	"k8s.io/utils/ptr"
 	ctrl "sigs.k8s.io/controller-runtime"
@@ -39,7 +40,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -149,7 +149,7 @@ func TestPodSets(t *testing.T) {
 		},
 		"with required topology annotation": {
 			pod: FromObject(testingpod.MakePod("pod", "ns").
-				Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				Annotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			),
 			wantPodSets: func(pod *Pod) []kueue.PodSet {
@@ -157,7 +157,7 @@ func TestPodSets(t *testing.T) {
 					*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
 						PodSpec(*pod.pod.Spec.DeepCopy()).
 						RequiredTopologyRequest("cloud.com/block").
-						PodIndexLabel(ptr.To(kueuealpha.PodGroupPodIndexLabel)).
+						PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 						Obj(),
 				}
 			},
@@ -165,7 +165,7 @@ func TestPodSets(t *testing.T) {
 		},
 		"with required topology preferred": {
 			pod: FromObject(testingpod.MakePod("pod", "ns").
-				Annotation(kueuealpha.PodSetPreferredTopologyAnnotation, "cloud.com/block").
+				Annotation(kueue.PodSetPreferredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			),
 			wantPodSets: func(pod *Pod) []kueue.PodSet {
@@ -173,7 +173,7 @@ func TestPodSets(t *testing.T) {
 					*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
 						PodSpec(*pod.pod.Spec.DeepCopy()).
 						PreferredTopologyRequest("cloud.com/block").
-						PodIndexLabel(ptr.To(kueuealpha.PodGroupPodIndexLabel)).
+						PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 						Obj(),
 				}
 			},
@@ -181,7 +181,7 @@ func TestPodSets(t *testing.T) {
 		},
 		"without required topology annotation if TAS is disabled": {
 			pod: FromObject(testingpod.MakePod("pod", "ns").
-				Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
+				Annotation(kueue.PodSetRequiredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			),
 			wantPodSets: func(pod *Pod) []kueue.PodSet {
@@ -195,7 +195,7 @@ func TestPodSets(t *testing.T) {
 		},
 		"without preferred topology annotation if TAS is disabled": {
 			pod: FromObject(testingpod.MakePod("pod", "ns").
-				Annotation(kueuealpha.PodSetPreferredTopologyAnnotation, "cloud.com/block").
+				Annotation(kueue.PodSetPreferredTopologyAnnotation, "cloud.com/block").
 				Obj(),
 			),
 			wantPodSets: func(pod *Pod) []kueue.PodSet {
@@ -295,6 +295,7 @@ func TestReconciler(t *testing.T) {
 				NodeSelector(corev1.LabelArchStable, "arm64").
 				KueueFinalizer().
 				Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
+				Annotation(kueue.WorkloadAnnotation, "unit-test").
 				Obj()},
 			workloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("unit-test", "ns").Finalizers(kueue.ResourceInUseFinalizerName).
@@ -334,7 +335,6 @@ func TestReconciler(t *testing.T) {
 				},
 			},
 		},
-
 		"non-matching admitted workload is deleted and pod is finalized": {
 			pods: []corev1.Pod{*basePodWrapper.
 				Clone().
@@ -388,6 +388,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("test-queue").
@@ -716,6 +717,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 2).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("user-queue").
@@ -771,6 +773,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 3).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("user-queue").
@@ -840,6 +843,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet("dc85db45", 2).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("user-queue").
@@ -927,6 +931,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet("dc85db45", 2).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("user-queue").
@@ -1048,6 +1053,7 @@ func TestReconciler(t *testing.T) {
 					GroupTotalCount("2").
 					NodeSelector(corev1.LabelArchStable, "arm64").
 					Label(controllerconsts.PodSetLabel, podUID).
+					Annotation(kueue.WorkloadAnnotation, "test-group").
 					Obj(),
 				*basePodWrapper.
 					Clone().
@@ -1058,6 +1064,7 @@ func TestReconciler(t *testing.T) {
 					GroupTotalCount("2").
 					NodeSelector(corev1.LabelArchStable, "arm64").
 					Label(controllerconsts.PodSetLabel, podUID).
+					Annotation(kueue.WorkloadAnnotation, "test-group").
 					Obj(),
 			},
 			workloads: []kueue.Workload{
@@ -1078,7 +1085,11 @@ func TestReconciler(t *testing.T) {
 			},
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("test-group", "ns").Finalizers(kueue.ResourceInUseFinalizerName).
-					PodSets(*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 2).Request(corev1.ResourceCPU, "1").Obj()).
+					PodSets(
+						*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 2).
+							Request(corev1.ResourceCPU, "1").
+							Obj(),
+					).
 					OwnerReference(corev1.SchemeGroupVersion.WithKind("Pod"), "pod", "test-uid").
 					OwnerReference(corev1.SchemeGroupVersion.WithKind("Pod"), "pod2", "test-uid").
 					ReserveQuota(
@@ -1610,6 +1621,7 @@ func TestReconciler(t *testing.T) {
 					Group("test-group").
 					GroupTotalCount("1").
 					Label(controllerconsts.PodSetLabel, podUID).
+					Annotation(kueue.WorkloadAnnotation, "test-group").
 					Obj(),
 			},
 			workloads: []kueue.Workload{
@@ -1752,6 +1764,7 @@ func TestReconciler(t *testing.T) {
 					Group("test-group").
 					GroupTotalCount("3").
 					Label(controllerconsts.PodSetLabel, podUID).
+					Annotation(kueue.WorkloadAnnotation, "test-group").
 					Obj(),
 			},
 			wantWorkloads: []kueue.Workload{
@@ -2134,7 +2147,12 @@ func TestReconciler(t *testing.T) {
 			},
 			wantWorkloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("test-group", "ns").Finalizers(kueue.ResourceInUseFinalizerName).
-					PodSets(*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 2).Request(corev1.ResourceCPU, "1").NodeName("test-node").Obj()).
+					PodSets(
+						*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 2).Request(corev1.ResourceCPU, "1").
+							NodeName("test-node").
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
+							Obj(),
+					).
 					Queue("test-queue").
 					Priority(0).
 					OwnerReference(corev1.SchemeGroupVersion.WithKind("Pod"), "pod", "test-uid").
@@ -2388,6 +2406,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 2).
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
 							Request(corev1.ResourceCPU, "1").
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("user-queue").
@@ -2852,6 +2871,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 1).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("user-queue").
@@ -3294,6 +3314,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 1).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("user-queue").
@@ -4126,6 +4147,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("test-queue").
@@ -4184,6 +4206,7 @@ func TestReconciler(t *testing.T) {
 						*utiltesting.MakePodSet(kueue.NewPodSetReference(podUID), 2).
 							Request(corev1.ResourceCPU, "1").
 							SchedulingGates(corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName}).
+							PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 							Obj(),
 					).
 					Queue("user-queue").
@@ -4460,6 +4483,7 @@ func TestReconciler(t *testing.T) {
 					Group("test-group").
 					GroupTotalCount("2").
 					CreationTimestamp(now.Add(-time.Hour)).
+					Annotation(kueue.WorkloadAnnotation, "test-group").
 					Obj(),
 				*basePodWrapper.
 					Clone().
@@ -4470,6 +4494,7 @@ func TestReconciler(t *testing.T) {
 					Group("test-group").
 					GroupTotalCount("2").
 					CreationTimestamp(now).
+					Annotation(kueue.WorkloadAnnotation, "test-group").
 					Obj(),
 			},
 			workloadCmpOpts: defaultWorkloadCmpOpts,
@@ -4508,6 +4533,7 @@ func TestReconciler(t *testing.T) {
 					Group("test-group").
 					GroupTotalCount("2").
 					Label(controllerconsts.PodSetLabel, podUID).
+					Annotation(kueue.WorkloadAnnotation, "test-group").
 					CreationTimestamp(now).
 					Obj(),
 			},
@@ -5953,3 +5979,90 @@ func TestReconciler_DeletePodAfterTransientErrorsOnUpdateOrDeleteOps(t *testing.
 		t.Fatalf("Got unexpected error %v when checking if pod %q was deleted", err, podKey.String())
 	}
 }
+
+func TestPod_IsActive(t *testing.T) {
+	type fields struct {
+		pod   corev1.Pod
+		list  corev1.PodList
+		clock clock.Clock
+	}
+	tests := map[string]struct {
+		fields fields
+		want   bool
+	}{
+		"RegularPod": {
+			want: false,
+		},
+		"PodGroup_NotActive": {
+			fields: fields{
+				clock: realClock,
+				list: corev1.PodList{
+					Items: []corev1.Pod{
+						{
+							ObjectMeta: metav1.ObjectMeta{
+								Name:                       "deleted-with-expired-grace",
+								DeletionTimestamp:          &metav1.Time{Time: time.Now().Add(-time.Minute)},
+								DeletionGracePeriodSeconds: ptr.To(int64(30)),
+							},
+							Status: corev1.PodStatus{Phase: corev1.PodRunning},
+						},
+						{
+							ObjectMeta: metav1.ObjectMeta{Name: "succeeded"},
+							Status:     corev1.PodStatus{Phase: corev1.PodSucceeded},
+						},
+						{
+							ObjectMeta: metav1.ObjectMeta{Name: "failed"},
+							Status:     corev1.PodStatus{Phase: corev1.PodFailed},
+						},
+					},
+				},
+			},
+		},
+		"PodGroup_Active": {
+			fields: fields{
+				clock: realClock,
+				list: corev1.PodList{
+					Items: []corev1.Pod{
+						{
+							ObjectMeta: metav1.ObjectMeta{
+								Name:                       "deleted-with-expired-grace",
+								DeletionTimestamp:          &metav1.Time{Time: time.Now().Add(-time.Minute)},
+								DeletionGracePeriodSeconds: ptr.To(int64(30)),
+							},
+							Status: corev1.PodStatus{Phase: corev1.PodRunning},
+						},
+						{
+							ObjectMeta: metav1.ObjectMeta{Name: "succeeded"},
+							Status:     corev1.PodStatus{Phase: corev1.PodSucceeded},
+						},
+						{
+							ObjectMeta: metav1.ObjectMeta{Name: "failed"},
+							Status:     corev1.PodStatus{Phase: corev1.PodFailed},
+						},
+						{
+							ObjectMeta: metav1.ObjectMeta{
+								Name:                       "deleted-within-grace",
+								DeletionTimestamp:          &metav1.Time{Time: time.Now().Add(-time.Minute)},
+								DeletionGracePeriodSeconds: ptr.To(int64(90)),
+							},
+							Status: corev1.PodStatus{Phase: corev1.PodRunning},
+						},
+					},
+				},
+			},
+			want: true,
+		},
+	}
+	for name, tt := range tests {
+		t.Run(name, func(t *testing.T) {
+			p := &Pod{
+				pod:   tt.fields.pod,
+				list:  tt.fields.list,
+				clock: tt.fields.clock,
+			}
+			if got := p.IsActive(); got != tt.want {
+				t.Errorf("IsActive() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/pkg/controller/jobs/pod/pod_webhook_test.go b/pkg/controller/jobs/pod/pod_webhook_test.go
index 7d7e7a8b6..058bf778e 100644
--- a/pkg/controller/jobs/pod/pod_webhook_test.go
+++ b/pkg/controller/jobs/pod/pod_webhook_test.go
@@ -36,7 +36,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/controller/jobs/raycluster/raycluster_controller_test.go b/pkg/controller/jobs/raycluster/raycluster_controller_test.go
index 50203d658..6c0623612 100644
--- a/pkg/controller/jobs/raycluster/raycluster_controller_test.go
+++ b/pkg/controller/jobs/raycluster/raycluster_controller_test.go
@@ -33,7 +33,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -110,7 +109,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "head_c"}}},
@@ -123,7 +122,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group1_c"}}},
@@ -164,7 +163,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "head_c"}}},
@@ -184,7 +183,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group2_c"}}},
@@ -218,7 +217,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "head_c"}}},
@@ -231,7 +230,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group1_c"}}},
@@ -243,7 +242,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group2_c"}}},
@@ -328,6 +327,8 @@ func TestReconciler(t *testing.T) {
 				NodeSelectorHeadGroup(corev1.LabelArchStable, "arm64").
 				NodeLabel(rayv1.HeadNode, controllerconsts.PodSetLabel, "head").
 				NodeLabel(rayv1.WorkerNode, controllerconsts.PodSetLabel, "workers-group-0").
+				NodeAnnotation(rayv1.HeadNode, kueue.WorkloadAnnotation, "test").
+				NodeAnnotation(rayv1.WorkerNode, kueue.WorkloadAnnotation, "test").
 				Obj(),
 			workloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("test", "ns").
@@ -558,6 +559,8 @@ func TestReconciler(t *testing.T) {
 				WithNumOfHosts("workers-group-0", 2).
 				NodeLabel(rayv1.HeadNode, controllerconsts.PodSetLabel, "head").
 				NodeLabel(rayv1.WorkerNode, controllerconsts.PodSetLabel, "workers-group-0").
+				NodeAnnotation(rayv1.HeadNode, kueue.WorkloadAnnotation, "test").
+				NodeAnnotation(rayv1.WorkerNode, kueue.WorkloadAnnotation, "test").
 				Obj(),
 			workloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("test", "ns").
diff --git a/pkg/controller/jobs/raycluster/raycluster_webhook_test.go b/pkg/controller/jobs/raycluster/raycluster_webhook_test.go
index bc929b27b..0270efd9b 100644
--- a/pkg/controller/jobs/raycluster/raycluster_webhook_test.go
+++ b/pkg/controller/jobs/raycluster/raycluster_webhook_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -176,7 +175,7 @@ func TestValidateCreate(t *testing.T) {
 					Template: corev1.PodTemplateSpec{
 						ObjectMeta: metav1.ObjectMeta{
 							Annotations: map[string]string{
-								kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+								kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 							},
 						},
 					},
@@ -187,7 +186,7 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 						},
@@ -197,7 +196,7 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 						},
@@ -213,8 +212,8 @@ func TestValidateCreate(t *testing.T) {
 					Template: corev1.PodTemplateSpec{
 						ObjectMeta: metav1.ObjectMeta{
 							Annotations: map[string]string{
-								kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
-								kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
+								kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+								kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
 							},
 						},
 					},
@@ -225,8 +224,8 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
-									kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
 								},
 							},
 						},
@@ -253,9 +252,9 @@ func TestValidateCreate(t *testing.T) {
 					Template: corev1.PodTemplateSpec{
 						ObjectMeta: metav1.ObjectMeta{
 							Annotations: map[string]string{
-								kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
-								kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-								kueuealpha.PodSetSliceSizeAnnotation:             "2",
+								kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+								kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+								kueue.PodSetSliceSizeAnnotation:             "2",
 							},
 						},
 					},
@@ -267,9 +266,9 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
-									kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-									kueuealpha.PodSetSliceSizeAnnotation:             "10",
+									kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+									kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetSliceSizeAnnotation:             "10",
 								},
 							},
 						},
@@ -280,9 +279,9 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
-									kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-									kueuealpha.PodSetSliceSizeAnnotation:             "20",
+									kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+									kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetSliceSizeAnnotation:             "20",
 								},
 							},
 						},
diff --git a/pkg/controller/jobs/rayjob/rayjob_controller_test.go b/pkg/controller/jobs/rayjob/rayjob_controller_test.go
index 2762880f8..843598833 100644
--- a/pkg/controller/jobs/rayjob/rayjob_controller_test.go
+++ b/pkg/controller/jobs/rayjob/rayjob_controller_test.go
@@ -27,7 +27,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/podset"
@@ -88,7 +87,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "head_c"}}},
@@ -101,7 +100,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group1_c"}}},
@@ -142,7 +141,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "head_c"}}},
@@ -162,7 +161,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group2_c"}}},
@@ -196,7 +195,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "head_c"}}},
@@ -209,7 +208,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group1_c"}}},
@@ -221,7 +220,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group2_c"}}},
@@ -255,7 +254,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "head_c"}}},
@@ -269,7 +268,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group1_c"}}},
@@ -304,7 +303,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/rack",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "head_c"}}},
@@ -318,7 +317,7 @@ func TestPodSets(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 							Spec: corev1.PodSpec{Containers: []corev1.Container{{Name: "group1_c"}}},
@@ -336,7 +335,7 @@ func TestPodSets(t *testing.T) {
 					},
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+							kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 						},
 					},
 				}).
diff --git a/pkg/controller/jobs/rayjob/rayjob_webhook_test.go b/pkg/controller/jobs/rayjob/rayjob_webhook_test.go
index 426a037aa..9f6abf84b 100644
--- a/pkg/controller/jobs/rayjob/rayjob_webhook_test.go
+++ b/pkg/controller/jobs/rayjob/rayjob_webhook_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -211,7 +210,7 @@ func TestValidateCreate(t *testing.T) {
 					Template: corev1.PodTemplateSpec{
 						ObjectMeta: metav1.ObjectMeta{
 							Annotations: map[string]string{
-								kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+								kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 							},
 						},
 					},
@@ -222,7 +221,7 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 						},
@@ -232,7 +231,7 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
 								},
 							},
 						},
@@ -248,8 +247,8 @@ func TestValidateCreate(t *testing.T) {
 					Template: corev1.PodTemplateSpec{
 						ObjectMeta: metav1.ObjectMeta{
 							Annotations: map[string]string{
-								kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
-								kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
+								kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+								kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
 							},
 						},
 					},
@@ -260,8 +259,8 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: "cloud.com/block",
-									kueuealpha.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
+									kueue.PodSetPreferredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetRequiredTopologyAnnotation:  "cloud.com/block",
 								},
 							},
 						},
@@ -288,9 +287,9 @@ func TestValidateCreate(t *testing.T) {
 					Template: corev1.PodTemplateSpec{
 						ObjectMeta: metav1.ObjectMeta{
 							Annotations: map[string]string{
-								kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
-								kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-								kueuealpha.PodSetSliceSizeAnnotation:             "2",
+								kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+								kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+								kueue.PodSetSliceSizeAnnotation:             "2",
 							},
 						},
 					},
@@ -302,9 +301,9 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
-									kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-									kueuealpha.PodSetSliceSizeAnnotation:             "10",
+									kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+									kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetSliceSizeAnnotation:             "10",
 								},
 							},
 						},
@@ -315,9 +314,9 @@ func TestValidateCreate(t *testing.T) {
 						Template: corev1.PodTemplateSpec{
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
-									kueuealpha.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
-									kueuealpha.PodSetSliceSizeAnnotation:             "20",
+									kueue.PodSetRequiredTopologyAnnotation:      "cloud.com/block",
+									kueue.PodSetSliceRequiredTopologyAnnotation: "cloud.com/block",
+									kueue.PodSetSliceSizeAnnotation:             "20",
 								},
 							},
 						},
diff --git a/pkg/controller/tas/node_failure_controller_test.go b/pkg/controller/tas/node_failure_controller_test.go
index e42a45f6d..201ffd8a1 100644
--- a/pkg/controller/tas/node_failure_controller_test.go
+++ b/pkg/controller/tas/node_failure_controller_test.go
@@ -33,7 +33,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	podcontroller "sigs.k8s.io/kueue/pkg/controller/jobs/pod/constants"
 	"sigs.k8s.io/kueue/pkg/controller/tas/indexer"
@@ -94,8 +93,8 @@ func TestNodeFailureReconciler(t *testing.T) {
 	earlierTime := metav1.NewTime(now.Add(-NodeFailureDelay))
 
 	basePod := testingpod.MakePod("test-pod", nsName).
-		Annotation(kueuealpha.WorkloadAnnotation, wlName).
-		Label(kueuealpha.TASLabel, "true").
+		Annotation(kueue.WorkloadAnnotation, wlName).
+		Label(kueue.TASLabel, "true").
 		NodeName(nodeName).
 		Obj()
 
@@ -254,8 +253,8 @@ func TestNodeFailureReconciler(t *testing.T) {
 					Status:             corev1.ConditionFalse,
 					LastTransitionTime: earlierTime}).Obj(),
 				workloadWithTwoNodes.DeepCopy(),
-				testingpod.MakePod("pod1", nsName).Annotation(kueuealpha.WorkloadAnnotation, wlName).NodeName(nodeName).Obj(),
-				testingpod.MakePod("pod2", nsName).Annotation(kueuealpha.WorkloadAnnotation, wlName).NodeName(nodeName2).Obj(),
+				testingpod.MakePod("pod1", nsName).Annotation(kueue.WorkloadAnnotation, wlName).NodeName(nodeName).Obj(),
+				testingpod.MakePod("pod2", nsName).Annotation(kueue.WorkloadAnnotation, wlName).NodeName(nodeName2).Obj(),
 			},
 			reconcileRequests: []reconcile.Request{
 				{NamespacedName: types.NamespacedName{Name: nodeName}},
diff --git a/pkg/controller/tas/topology_ungater_test.go b/pkg/controller/tas/topology_ungater_test.go
index 1e68073c6..bada480df 100644
--- a/pkg/controller/tas/topology_ungater_test.go
+++ b/pkg/controller/tas/topology_ungater_test.go
@@ -36,7 +36,6 @@ import (
 	jobset "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 	leaderworkersetv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/tas/indexer"
@@ -91,7 +90,7 @@ func TestReconcile(t *testing.T) {
 		result := make(map[string]*counts, len(pods))
 		for i := range pods {
 			pod := pods[i]
-			if utilpod.HasGate(&pod, kueuealpha.TopologySchedulingGate) {
+			if utilpod.HasGate(&pod, kueue.TopologySchedulingGate) {
 				continue
 			}
 			if utilpod.IsTerminated(&pod) {
@@ -136,14 +135,14 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 			},
@@ -177,23 +176,23 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("pod2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 				*testingpod.MakePod("pod2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 			},
@@ -230,23 +229,23 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("pod2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 				*testingpod.MakePod("pod2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 			},
@@ -275,14 +274,14 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
@@ -305,14 +304,14 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
@@ -338,14 +337,14 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
@@ -400,13 +399,13 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					TopologySchedulingGate().
 					Obj(),
 			},
@@ -430,7 +429,7 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
@@ -439,7 +438,7 @@ func TestReconcile(t *testing.T) {
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
@@ -475,7 +474,7 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Gate("example.com/gate").
@@ -483,7 +482,7 @@ func TestReconcile(t *testing.T) {
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
@@ -519,28 +518,28 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod-already-running", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					StatusPhase(corev1.PodRunning).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod-gated", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod-already-running", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					StatusPhase(corev1.PodRunning).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod-gated", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
@@ -574,28 +573,28 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod-already-running", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					StatusPhase(corev1.PodFailed).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod-gated", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod-already-running", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					StatusPhase(corev1.PodFailed).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod-gated", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
@@ -631,26 +630,26 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").UID("x").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod2", "ns").UID("y").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").UID("x").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod2", "ns").UID("y").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
@@ -685,28 +684,28 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod-already-succeeded", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					StatusPhase(corev1.PodSucceeded).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod-gated", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod-already-succeeded", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					StatusPhase(corev1.PodSucceeded).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod-gated", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 			},
@@ -741,26 +740,26 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").UID("x").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod2", "ns").UID("y").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 			},
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("pod1", "ns").UID("x").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("pod2", "ns").UID("y").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
@@ -803,33 +802,33 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "3").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b2").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p4", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "4").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
@@ -838,35 +837,35 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "3").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b2").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p4", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "4").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b2").
@@ -940,31 +939,31 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "0").
 					Label(controllerconsts.PodSetLabel, "leader").
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "2").
 					Label(controllerconsts.PodSetLabel, "workers").
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "1").
 					Label(controllerconsts.PodSetLabel, "workers").
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "3").
 					Label(controllerconsts.PodSetLabel, "workers").
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p4", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "4").
 					Label(controllerconsts.PodSetLabel, "workers").
 					TopologySchedulingGate().
@@ -973,35 +972,35 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "0").
 					Label(controllerconsts.PodSetLabel, "leader").
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "2").
 					Label(controllerconsts.PodSetLabel, "workers").
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "1").
 					Label(controllerconsts.PodSetLabel, "workers").
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "3").
 					Label(controllerconsts.PodSetLabel, "workers").
 					NodeSelector(tasBlockLabel, "b2").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p4", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "4").
 					Label(controllerconsts.PodSetLabel, "workers").
 					NodeSelector(tasBlockLabel, "b2").
@@ -1059,31 +1058,31 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "3").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p4", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "4").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
@@ -1092,35 +1091,35 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "3").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b2").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p4", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "4").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b2").
@@ -1197,31 +1196,31 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "0").
 					Label(controllerconsts.PodSetLabel, "leader").
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "0").
 					Label(controllerconsts.PodSetLabel, "workers").
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "1").
 					Label(controllerconsts.PodSetLabel, "workers").
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "2").
 					Label(controllerconsts.PodSetLabel, "workers").
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p4", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "3").
 					Label(controllerconsts.PodSetLabel, "workers").
 					TopologySchedulingGate().
@@ -1230,35 +1229,35 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "0").
 					Label(controllerconsts.PodSetLabel, "leader").
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "0").
 					Label(controllerconsts.PodSetLabel, "workers").
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "1").
 					Label(controllerconsts.PodSetLabel, "workers").
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "2").
 					Label(controllerconsts.PodSetLabel, "workers").
 					NodeSelector(tasBlockLabel, "b2").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p4", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(leaderworkersetv1.WorkerIndexLabelKey, "3").
 					Label(controllerconsts.PodSetLabel, "workers").
 					NodeSelector(tasBlockLabel, "b2").
@@ -1317,25 +1316,25 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
@@ -1344,22 +1343,22 @@ func TestReconcile(t *testing.T) {
 			cmpNS: false,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					Obj(),
@@ -1409,7 +1408,7 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					StatusPhase(corev1.PodFailed).
@@ -1417,7 +1416,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
@@ -1426,7 +1425,7 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					StatusPhase(corev1.PodFailed).
@@ -1434,7 +1433,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
@@ -1480,7 +1479,7 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1488,7 +1487,7 @@ func TestReconcile(t *testing.T) {
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1496,7 +1495,7 @@ func TestReconcile(t *testing.T) {
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1504,7 +1503,7 @@ func TestReconcile(t *testing.T) {
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1515,7 +1514,7 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1524,7 +1523,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1533,7 +1532,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1542,7 +1541,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1604,7 +1603,7 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1612,7 +1611,7 @@ func TestReconcile(t *testing.T) {
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1621,7 +1620,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1630,7 +1629,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1641,7 +1640,7 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1650,7 +1649,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1659,7 +1658,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "0").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1668,7 +1667,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1749,7 +1748,7 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1757,7 +1756,7 @@ func TestReconcile(t *testing.T) {
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1768,7 +1767,7 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("p1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "0").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1777,7 +1776,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("p3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(batchv1.JobCompletionIndexAnnotation, "1").
 					Label(jobset.JobIndexKey, "1").
 					Label(jobset.ReplicatedJobReplicas, "2").
@@ -1830,27 +1829,27 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("l0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "launcher").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -1860,14 +1859,14 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("l0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "launcher").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -1875,7 +1874,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -1883,7 +1882,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("w2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -1942,20 +1941,20 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("l0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "launcher").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -1963,7 +1962,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -1974,14 +1973,14 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("l0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "launcher").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -1989,7 +1988,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -1997,7 +1996,7 @@ func TestReconcile(t *testing.T) {
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
 					Label(kftraining.JobRoleLabel, "worker").
 					Label(kftraining.ReplicaIndexLabel, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
@@ -2034,7 +2033,7 @@ func TestReconcile(t *testing.T) {
 				*utiltesting.MakeWorkload("unit-test", "ns").Finalizers(kueue.ResourceInUseFinalizerName).
 					PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 4).
 						Request(corev1.ResourceCPU, "1").
-						PodIndexLabel(ptr.To(kueuealpha.PodGroupPodIndexLabel)).
+						PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 						Obj()).
 					ReserveQuota(
 						utiltesting.MakeAdmission("cq").
@@ -2056,26 +2055,26 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("w0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "0").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "1").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "2").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "3").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "3").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
@@ -2083,29 +2082,29 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("w0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "0").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "1").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "2").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("w3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "3").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "3").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b2").
 					NodeSelector(tasRackLabel, "r1").
@@ -2140,7 +2139,7 @@ func TestReconcile(t *testing.T) {
 				*utiltesting.MakeWorkload("unit-test", "ns").Finalizers(kueue.ResourceInUseFinalizerName).
 					PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 4).
 						Request(corev1.ResourceCPU, "1").
-						PodIndexLabel(ptr.To(kueuealpha.PodGroupPodIndexLabel)).
+						PodIndexLabel(ptr.To(kueue.PodGroupPodIndexLabel)).
 						Obj()).
 					ReserveQuota(
 						utiltesting.MakeAdmission("cq").
@@ -2162,27 +2161,27 @@ func TestReconcile(t *testing.T) {
 			},
 			pods: []corev1.Pod{
 				*testingpod.MakePod("w0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "0").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "1").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "2").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					TopologySchedulingGate().
 					Obj(),
 				*testingpod.MakePod("w3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "3").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "3").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r2").
@@ -2191,29 +2190,29 @@ func TestReconcile(t *testing.T) {
 			cmpNS: true,
 			wantPods: []corev1.Pod{
 				*testingpod.MakePod("w0", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "0").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "0").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w1", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "1").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "1").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r1").
 					Obj(),
 				*testingpod.MakePod("w2", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "2").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "2").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b1").
 					NodeSelector(tasRackLabel, "r2").
 					Obj(),
 				*testingpod.MakePod("w3", "ns").
-					Annotation(kueuealpha.WorkloadAnnotation, "unit-test").
-					Label(kueuealpha.PodGroupPodIndexLabel, "3").
+					Annotation(kueue.WorkloadAnnotation, "unit-test").
+					Label(kueue.PodGroupPodIndexLabel, "3").
 					Label(controllerconsts.PodSetLabel, string(kueue.DefaultPodSetName)).
 					NodeSelector(tasBlockLabel, "b2").
 					NodeSelector(tasRackLabel, "r1").
diff --git a/pkg/dra/claims_test.go b/pkg/dra/claims_test.go
new file mode 100644
index 000000000..9db2ddebf
--- /dev/null
+++ b/pkg/dra/claims_test.go
@@ -0,0 +1,305 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dra_test
+
+import (
+	"context"
+	"reflect"
+	"testing"
+
+	corev1 "k8s.io/api/core/v1"
+	resourcev1beta2 "k8s.io/api/resource/v1beta2"
+	"k8s.io/apimachinery/pkg/api/resource"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
+	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/client/fake"
+
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	"sigs.k8s.io/kueue/pkg/dra"
+)
+
+func Test_GetResourceRequests(t *testing.T) {
+	scheme := runtime.NewScheme()
+	_ = clientgoscheme.AddToScheme(scheme)
+	_ = kueuev1beta1.AddToScheme(scheme)
+	_ = resourcev1beta2.AddToScheme(scheme)
+
+	tmpl := &resourcev1beta2.ResourceClaimTemplate{
+		ObjectMeta: metav1.ObjectMeta{Name: "claim-tmpl-1", Namespace: "ns1"},
+		Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+			Spec: resourcev1beta2.ResourceClaimSpec{
+				Devices: resourcev1beta2.DeviceClaim{
+					Requests: []resourcev1beta2.DeviceRequest{{
+						Exactly: &resourcev1beta2.ExactDeviceRequest{
+							AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+							Count:           2,
+							DeviceClassName: "test-deviceclass-1",
+						},
+					}},
+				},
+			},
+		},
+	}
+
+	claim := &resourcev1beta2.ResourceClaim{
+		ObjectMeta: metav1.ObjectMeta{Name: "claim-2", Namespace: "ns1"},
+		Spec: resourcev1beta2.ResourceClaimSpec{
+			Devices: resourcev1beta2.DeviceClaim{
+				Requests: []resourcev1beta2.DeviceRequest{{
+					Exactly: &resourcev1beta2.ExactDeviceRequest{
+						AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+						Count:           1,
+						DeviceClassName: "test-deviceclass-2",
+					},
+				}},
+			},
+		},
+	}
+
+	wl := &kueuev1beta1.Workload{
+		ObjectMeta: metav1.ObjectMeta{Name: "wl", Namespace: "ns1"},
+		Spec: kueuev1beta1.WorkloadSpec{
+			PodSets: []kueuev1beta1.PodSet{{
+				Name:  "main",
+				Count: 1,
+				Template: corev1.PodTemplateSpec{
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{{Name: "c", Image: "pause"}},
+						ResourceClaims: []corev1.PodResourceClaim{
+							{Name: "req-1", ResourceClaimTemplateName: ptr.To("claim-tmpl-1")},
+							{Name: "req-2", ResourceClaimName: ptr.To("claim-2")},
+						},
+					},
+				},
+			}},
+		},
+	}
+
+	tests := []struct {
+		name         string
+		modifyWL     func(w *kueuev1beta1.Workload)
+		extraObjects []runtime.Object
+		lookup       func(corev1.ResourceName) (corev1.ResourceName, bool)
+		want         map[kueuev1beta1.PodSetReference]corev1.ResourceList
+		wantErr      bool
+	}{
+		{
+			name: "Single claim template with single device",
+			lookup: func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
+				m := map[corev1.ResourceName]corev1.ResourceName{
+					"test-deviceclass-1": "res-1",
+					"test-deviceclass-2": "res-2",
+				}
+				lr, ok := m[dc]
+				return lr, ok
+			},
+			want: map[kueuev1beta1.PodSetReference]corev1.ResourceList{
+				"main": {
+					"res-1": resource.MustParse("2"),
+				},
+			},
+		},
+		{
+			name:    "Unmapped DeviceClass returns error",
+			lookup:  func(corev1.ResourceName) (corev1.ResourceName, bool) { return "", false },
+			wantErr: true,
+		},
+		{
+			name: "Two containers each using different claim templates",
+			modifyWL: func(w *kueuev1beta1.Workload) {
+				w.Spec.PodSets[0].Template.Spec.Containers = []corev1.Container{
+					{
+						Name:  "c1",
+						Image: "pause",
+						Resources: corev1.ResourceRequirements{
+							Claims: []corev1.ResourceClaim{{Name: "req-a"}},
+						},
+					},
+					{
+						Name:  "c2",
+						Image: "pause",
+						Resources: corev1.ResourceRequirements{
+							Claims: []corev1.ResourceClaim{{Name: "req-b"}},
+						},
+					},
+				}
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-a", ResourceClaimTemplateName: ptr.To("claim-tmpl-1")},
+					{Name: "req-b", ResourceClaimTemplateName: ptr.To("claim-tmpl-2")},
+				}
+			},
+			extraObjects: []runtime.Object{
+				&resourcev1beta2.ResourceClaimTemplate{
+					ObjectMeta: metav1.ObjectMeta{Name: "claim-tmpl-2", Namespace: "ns1"},
+					Spec:       resourcev1beta2.ResourceClaimTemplateSpec{Spec: resourcev1beta2.ResourceClaimSpec{Devices: resourcev1beta2.DeviceClaim{Requests: []resourcev1beta2.DeviceRequest{{Exactly: &resourcev1beta2.ExactDeviceRequest{AllocationMode: resourcev1beta2.DeviceAllocationModeExactCount, Count: 1, DeviceClassName: "test-deviceclass-2"}}}}}},
+				},
+			},
+			lookup: func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
+				m := map[corev1.ResourceName]corev1.ResourceName{"test-deviceclass-1": "res-1", "test-deviceclass-2": "res-2"}
+				lr, ok := m[dc]
+				return lr, ok
+			},
+			want: map[kueuev1beta1.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2"), "res-2": resource.MustParse("1")}},
+		},
+		{
+			name: "Two containers sharing one claim template",
+			modifyWL: func(w *kueuev1beta1.Workload) {
+				w.Spec.PodSets[0].Template.Spec.Containers = []corev1.Container{
+					{
+						Name:  "c1",
+						Image: "pause",
+						Resources: corev1.ResourceRequirements{
+							Claims: []corev1.ResourceClaim{{Name: "req-a"}},
+						},
+					},
+					{
+						Name:  "c2",
+						Image: "pause",
+						Resources: corev1.ResourceRequirements{
+							Claims: []corev1.ResourceClaim{{Name: "req-a"}},
+						},
+					},
+				}
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-a", ResourceClaimTemplateName: ptr.To("claim-tmpl-1")},
+				}
+			},
+			lookup: func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
+				if dc == "test-deviceclass-1" {
+					return "res-1", true
+				}
+				return "", false
+			},
+			want: map[kueuev1beta1.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
+		},
+		{
+			name: "Single template requesting two devices",
+			extraObjects: []runtime.Object{
+				&resourcev1beta2.ResourceClaimTemplate{
+					ObjectMeta: metav1.ObjectMeta{Name: "claim-tmpl-3", Namespace: "ns1"},
+					Spec:       resourcev1beta2.ResourceClaimTemplateSpec{Spec: resourcev1beta2.ResourceClaimSpec{Devices: resourcev1beta2.DeviceClaim{Requests: []resourcev1beta2.DeviceRequest{{Exactly: &resourcev1beta2.ExactDeviceRequest{AllocationMode: resourcev1beta2.DeviceAllocationModeExactCount, Count: 2, DeviceClassName: "test-deviceclass-1"}}}}}},
+				},
+			},
+			modifyWL: func(w *kueuev1beta1.Workload) {
+				w.Spec.PodSets[0].Template.Spec.Containers = []corev1.Container{
+					{
+						Name:  "c",
+						Image: "pause",
+						Resources: corev1.ResourceRequirements{
+							Claims: []corev1.ResourceClaim{{Name: "req-x"}},
+						},
+					},
+				}
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "req-x", ResourceClaimTemplateName: ptr.To("claim-tmpl-3")},
+				}
+			},
+			lookup: func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
+				if dc == "test-deviceclass-1" {
+					return "res-1", true
+				}
+				return "", false
+			},
+			want: map[kueuev1beta1.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
+		},
+		{
+			name: "Init and regular container sharing one template",
+			modifyWL: func(w *kueuev1beta1.Workload) {
+				w.Spec.PodSets[0].Template.Spec.InitContainers = []corev1.Container{
+					{
+						Name:  "init",
+						Image: "pause",
+						Resources: corev1.ResourceRequirements{
+							Claims: []corev1.ResourceClaim{{Name: "rc"}},
+						},
+					},
+				}
+				w.Spec.PodSets[0].Template.Spec.Containers = []corev1.Container{
+					{
+						Name:  "main",
+						Image: "pause",
+						Resources: corev1.ResourceRequirements{
+							Claims: []corev1.ResourceClaim{{Name: "rc"}},
+						},
+					},
+				}
+				w.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+					{Name: "rc", ResourceClaimTemplateName: ptr.To("claim-tmpl-1")},
+				}
+			},
+			lookup: func(dc corev1.ResourceName) (corev1.ResourceName, bool) {
+				if dc == "test-deviceclass-1" {
+					return "res-1", true
+				}
+				return "", false
+			},
+			want: map[kueuev1beta1.PodSetReference]corev1.ResourceList{"main": {"res-1": resource.MustParse("2")}},
+		},
+	}
+
+	for _, tc := range tests {
+		t.Run(tc.name, func(t *testing.T) {
+			if tc.lookup != nil {
+				mappings := []configapi.DeviceClassMapping{
+					{
+						Name:             corev1.ResourceName("res-1"),
+						DeviceClassNames: []corev1.ResourceName{"test-deviceclass-1"},
+					},
+					{
+						Name:             corev1.ResourceName("res-2"),
+						DeviceClassNames: []corev1.ResourceName{"test-deviceclass-2"},
+					},
+				}
+				if tc.name == "Unmapped DeviceClass returns error" {
+					mappings = []configapi.DeviceClassMapping{}
+				}
+				err := dra.CreateMapperFromConfiguration(mappings)
+				if err != nil {
+					t.Fatalf("Failed to initialize DRA mapper: %v", err)
+				}
+			}
+
+			objs := []client.Object{tmpl, claim}
+			if tc.extraObjects != nil {
+				for _, o := range tc.extraObjects {
+					objs = append(objs, o.(client.Object))
+				}
+			}
+			baseClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(objs...).Build()
+
+			wlCopy := wl.DeepCopy()
+			if tc.modifyWL != nil {
+				tc.modifyWL(wlCopy)
+			}
+
+			got, err := dra.GetResourceRequestsForResourceClaimTemplates(context.Background(), baseClient, wlCopy)
+			if (err != nil) != tc.wantErr {
+				t.Fatalf("unexpected error status: gotErr=%v wantErr=%v, err=%v", err != nil, tc.wantErr, err)
+			}
+			if tc.wantErr {
+				return
+			}
+			if !reflect.DeepEqual(got, tc.want) {
+				t.Fatalf("unexpected result; got=%v want=%v", got, tc.want)
+			}
+		})
+	}
+}
diff --git a/pkg/dra/mapper_test.go b/pkg/dra/mapper_test.go
new file mode 100644
index 000000000..183decd2b
--- /dev/null
+++ b/pkg/dra/mapper_test.go
@@ -0,0 +1,294 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dra
+
+import (
+	"testing"
+
+	corev1 "k8s.io/api/core/v1"
+
+	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
+)
+
+func TestNewDRAResourceMapper(t *testing.T) {
+	mapper := newDRAResourceMapper()
+
+	if mapper == nil {
+		t.Fatal("newDRAResourceMapper() returned nil")
+	}
+
+	if mapper.deviceClassToResource == nil {
+		t.Fatal("deviceClassToResource map not initialized")
+	}
+
+	// Test empty mapping lookup
+	_, found := mapper.lookup("nonexistent")
+	if found {
+		t.Error("Expected lookup to fail on empty mapping")
+	}
+}
+
+func TestDRAResourceMapper_Lookup(t *testing.T) {
+	tests := []struct {
+		name    string
+		config  []configapi.DeviceClassMapping
+		lookups []struct {
+			deviceClass    corev1.ResourceName
+			expectedRes    corev1.ResourceName
+			expectedExists bool
+		}
+	}{
+		{
+			name: "single device class mapping",
+			config: []configapi.DeviceClassMapping{
+				{
+					Name:             corev1.ResourceName("foo"),
+					DeviceClassNames: []corev1.ResourceName{"foo.example.com"},
+				},
+			},
+			lookups: []struct {
+				deviceClass    corev1.ResourceName
+				expectedRes    corev1.ResourceName
+				expectedExists bool
+			}{
+				{
+					deviceClass:    "foo.example.com",
+					expectedRes:    "foo",
+					expectedExists: true,
+				},
+				{
+					deviceClass:    "example.com/nonexistent",
+					expectedRes:    "",
+					expectedExists: false,
+				},
+			},
+		},
+		{
+			name: "multiple device classes to single resource",
+			config: []configapi.DeviceClassMapping{
+				{
+					Name: corev1.ResourceName("accelerator"),
+					DeviceClassNames: []corev1.ResourceName{
+						"foo.example.com",
+						"bar.example.com",
+					},
+				},
+			},
+			lookups: []struct {
+				deviceClass    corev1.ResourceName
+				expectedRes    corev1.ResourceName
+				expectedExists bool
+			}{
+				{
+					deviceClass:    "foo.example.com",
+					expectedRes:    "accelerator",
+					expectedExists: true,
+				},
+				{
+					deviceClass:    "bar.example.com",
+					expectedRes:    "accelerator",
+					expectedExists: true,
+				},
+				{
+					deviceClass:    "example.com/nonexistent",
+					expectedRes:    "",
+					expectedExists: false,
+				},
+			},
+		},
+		{
+			name: "multiple resources",
+			config: []configapi.DeviceClassMapping{
+				{
+					Name:             corev1.ResourceName("foo"),
+					DeviceClassNames: []corev1.ResourceName{"foo.example.com"},
+				},
+				{
+					Name:             corev1.ResourceName("bar"),
+					DeviceClassNames: []corev1.ResourceName{"bar.example.com"},
+				},
+			},
+			lookups: []struct {
+				deviceClass    corev1.ResourceName
+				expectedRes    corev1.ResourceName
+				expectedExists bool
+			}{
+				{
+					deviceClass:    "foo.example.com",
+					expectedRes:    "foo",
+					expectedExists: true,
+				},
+				{
+					deviceClass:    "bar.example.com",
+					expectedRes:    "bar",
+					expectedExists: true,
+				},
+			},
+		},
+		{
+			name:   "empty configuration",
+			config: []configapi.DeviceClassMapping{},
+			lookups: []struct {
+				deviceClass    corev1.ResourceName
+				expectedRes    corev1.ResourceName
+				expectedExists bool
+			}{
+				{
+					deviceClass:    "example.com/any",
+					expectedRes:    "",
+					expectedExists: false,
+				},
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			mapper := newDRAResourceMapper()
+
+			err := mapper.populateFromConfiguration(tt.config)
+			if err != nil {
+				t.Fatalf("populateFromConfiguration failed: %v", err)
+			}
+
+			for _, lookup := range tt.lookups {
+				actualResource, actualExists := mapper.lookup(lookup.deviceClass)
+
+				if actualExists != lookup.expectedExists {
+					t.Errorf("lookup(%s) exists = %v, want %v", lookup.deviceClass, actualExists, lookup.expectedExists)
+				}
+
+				if actualResource != lookup.expectedRes {
+					t.Errorf("lookup(%s) resource = %v, want %v", lookup.deviceClass, actualResource, lookup.expectedRes)
+				}
+			}
+		})
+	}
+}
+
+func TestDRAResourceMapper_PopulateFromConfiguration(t *testing.T) {
+	tests := []struct {
+		name          string
+		initialConfig []configapi.DeviceClassMapping
+		updateConfig  []configapi.DeviceClassMapping
+		finalLookups  []struct {
+			deviceClass    corev1.ResourceName
+			expectedRes    corev1.ResourceName
+			expectedExists bool
+		}
+	}{
+		{
+			name: "populate replaces old mapping",
+			initialConfig: []configapi.DeviceClassMapping{
+				{
+					Name:             corev1.ResourceName("old-foo"),
+					DeviceClassNames: []corev1.ResourceName{"old-foo.example.com"},
+				},
+			},
+			updateConfig: []configapi.DeviceClassMapping{
+				{
+					Name:             corev1.ResourceName("new-foo"),
+					DeviceClassNames: []corev1.ResourceName{"new-foo.example.com"},
+				},
+			},
+			finalLookups: []struct {
+				deviceClass    corev1.ResourceName
+				expectedRes    corev1.ResourceName
+				expectedExists bool
+			}{
+				{
+					deviceClass:    "old-foo.example.com",
+					expectedRes:    "",
+					expectedExists: false,
+				},
+				{
+					deviceClass:    "new-foo.example.com",
+					expectedRes:    "new-foo",
+					expectedExists: true,
+				},
+			},
+		},
+		{
+			name:          "populate with nil config",
+			initialConfig: nil,
+			updateConfig:  nil,
+			finalLookups: []struct {
+				deviceClass    corev1.ResourceName
+				expectedRes    corev1.ResourceName
+				expectedExists bool
+			}{
+				{
+					deviceClass:    "example.com/any",
+					expectedRes:    "",
+					expectedExists: false,
+				},
+			},
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			mapper := newDRAResourceMapper()
+
+			// Initial population
+			if err := mapper.populateFromConfiguration(tt.initialConfig); err != nil {
+				t.Fatalf("Initial populateFromConfiguration failed: %v", err)
+			}
+
+			// Update population
+			if err := mapper.populateFromConfiguration(tt.updateConfig); err != nil {
+				t.Fatalf("Update populateFromConfiguration failed: %v", err)
+			}
+
+			// Test final state
+			for _, lookup := range tt.finalLookups {
+				actualResource, actualExists := mapper.lookup(lookup.deviceClass)
+
+				if actualExists != lookup.expectedExists {
+					t.Errorf("lookup(%s) exists = %v, want %v", lookup.deviceClass, actualExists, lookup.expectedExists)
+				}
+
+				if actualResource != lookup.expectedRes {
+					t.Errorf("lookup(%s) resource = %v, want %v", lookup.deviceClass, actualResource, lookup.expectedRes)
+				}
+			}
+		})
+	}
+}
+
+func TestCreateMapperFromConfiguration(t *testing.T) {
+	config := []configapi.DeviceClassMapping{
+		{
+			Name:             corev1.ResourceName("foo"),
+			DeviceClassNames: []corev1.ResourceName{"foo.example.com"},
+		},
+	}
+
+	err := CreateMapperFromConfiguration(config)
+	if err != nil {
+		t.Fatalf("CreateMapperFromConfiguration failed: %v", err)
+	}
+
+	// Test that the global mapper was populated
+	resource, found := Mapper().lookup("foo.example.com")
+	if !found {
+		t.Error("Expected to find device class in global mapper")
+	}
+	if resource != "foo" {
+		t.Errorf("Expected resource 'foo', got '%s'", resource)
+	}
+}
diff --git a/pkg/metrics/metrics_test.go b/pkg/metrics/metrics_test.go
index 15a8ce3f7..36e20feb8 100644
--- a/pkg/metrics/metrics_test.go
+++ b/pkg/metrics/metrics_test.go
@@ -146,8 +146,8 @@ func TestReportAndCleanupClusterQueueUsage(t *testing.T) {
 }
 
 func TestReportAndCleanupClusterQueueEvictedNumber(t *testing.T) {
-	ReportEvictedWorkloads("cluster_queue1", "Preempted", "")
-	ReportEvictedWorkloads("cluster_queue1", "Evicted", "")
+	ReportEvictedWorkloads("cluster_queue1", "Preempted", "", "")
+	ReportEvictedWorkloads("cluster_queue1", "Evicted", "", "")
 
 	expectFilteredMetricsCount(t, EvictedWorkloadsTotal, 2, "cluster_queue", "cluster_queue1")
 	expectFilteredMetricsCount(t, EvictedWorkloadsTotal, 1, "cluster_queue", "cluster_queue1", "reason", "Preempted")
diff --git a/pkg/podset/podset_test.go b/pkg/podset/podset_test.go
index c3bf0c2d2..6a0ea3490 100644
--- a/pkg/podset/podset_test.go
+++ b/pkg/podset/podset_test.go
@@ -26,7 +26,6 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -189,8 +188,8 @@ func TestFromAssignment(t *testing.T) {
 			wantInfo: PodSetInfo{
 				Name:  "name",
 				Count: 4,
-				Labels: map[string]string{
-					kueuealpha.TASLabel: "true",
+				Annotations: map[string]string{
+					kueue.PodSetUnconstrainedTopologyAnnotation: "true",
 				},
 				NodeSelector: map[string]string{
 					"f1l1": "f1v1",
@@ -199,7 +198,7 @@ func TestFromAssignment(t *testing.T) {
 				Tolerations: []corev1.Toleration{*toleration1.DeepCopy(), *toleration2.DeepCopy()},
 				SchedulingGates: []corev1.PodSchedulingGate{
 					{
-						Name: kueuealpha.TopologySchedulingGate,
+						Name: kueue.TopologySchedulingGate,
 					},
 				},
 			},
@@ -239,7 +238,10 @@ func TestFromAssignment(t *testing.T) {
 			features.SetFeatureGateDuringTest(t, features.TopologyAwareScheduling, tc.enableTopologyAwareScheduling)
 			client := utiltesting.NewClientBuilder().WithLists(&kueue.ResourceFlavorList{Items: tc.flavors}).Build()
 
-			gotInfo, gotError := FromAssignment(ctx, client, tc.assignment, tc.defaultCount)
+			podSet := kueue.PodSet{
+				Count: tc.defaultCount,
+			}
+			gotInfo, gotError := FromAssignment(ctx, client, tc.assignment, &podSet)
 
 			if diff := cmp.Diff(tc.wantError, gotError); diff != "" {
 				t.Errorf("Unexpected error (-want/+got):\n%s", diff)
@@ -434,21 +436,21 @@ func TestMergeRestore(t *testing.T) {
 		},
 		"podset with tas label; empty info": {
 			podSet: utiltesting.MakePodSet("", 1).
-				Labels(map[string]string{kueuealpha.TASLabel: "true"}).
+				Labels(map[string]string{kueue.TASLabel: "true"}).
 				Obj(),
 			wantPodSet: utiltesting.MakePodSet("", 1).
-				Labels(map[string]string{kueuealpha.TASLabel: "true"}).
+				Labels(map[string]string{kueue.TASLabel: "true"}).
 				Obj(),
 		},
 		"podset with tas label; info re-adds the same": {
 			podSet: utiltesting.MakePodSet("", 1).
-				Labels(map[string]string{kueuealpha.TASLabel: "true"}).
+				Labels(map[string]string{kueue.TASLabel: "true"}).
 				Obj(),
 			info: PodSetInfo{
-				Labels: map[string]string{kueuealpha.TASLabel: "true"},
+				Labels: map[string]string{kueue.TASLabel: "true"},
 			},
 			wantPodSet: utiltesting.MakePodSet("", 1).
-				Labels(map[string]string{kueuealpha.TASLabel: "true"}).
+				Labels(map[string]string{kueue.TASLabel: "true"}).
 				Obj(),
 		},
 	}
diff --git a/pkg/scheduler/flavorassigner/flavorassigner_test.go b/pkg/scheduler/flavorassigner/flavorassigner_test.go
index 64093aead..a086c72e5 100644
--- a/pkg/scheduler/flavorassigner/flavorassigner_test.go
+++ b/pkg/scheduler/flavorassigner/flavorassigner_test.go
@@ -2489,7 +2489,10 @@ func TestAssignFlavors(t *testing.T) {
 				t.Errorf("e.assignFlavors(_).RepresentativeMode()=%s, want %s", repMode, tc.wantRepMode)
 			}
 
-			if diff := cmp.Diff(tc.wantAssignment, assignment, cmpopts.IgnoreUnexported(Assignment{}, FlavorAssignment{}), statusComparer, cmpopts.IgnoreFields(Assignment{}, "LastState")); diff != "" {
+			if diff := cmp.Diff(tc.wantAssignment, assignment,
+				cmpopts.EquateEmpty(),
+				cmpopts.IgnoreUnexported(Assignment{}, FlavorAssignment{}), statusComparer, cmpopts.IgnoreFields(Assignment{}, "LastState"),
+			); diff != "" {
 				t.Errorf("Unexpected assignment (-want,+got):\n%s", diff)
 			}
 		})
@@ -2781,7 +2784,10 @@ func TestDeletedFlavors(t *testing.T) {
 				t.Errorf("e.assignFlavors(_).RepresentativeMode()=%s, want %s", repMode, tc.wantRepMode)
 			}
 
-			if diff := cmp.Diff(tc.wantAssignment, assignment, cmpopts.IgnoreUnexported(Assignment{}, FlavorAssignment{}), statusComparer, cmpopts.IgnoreFields(Assignment{}, "LastState")); diff != "" {
+			if diff := cmp.Diff(tc.wantAssignment, assignment,
+				cmpopts.EquateEmpty(),
+				cmpopts.IgnoreUnexported(Assignment{}, FlavorAssignment{}), statusComparer, cmpopts.IgnoreFields(Assignment{}, "LastState"),
+			); diff != "" {
 				t.Errorf("Unexpected assignment (-want,+got):\n%s", diff)
 			}
 		})
diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go
index 91b380e57..ffc3db9c4 100644
--- a/pkg/scheduler/scheduler_test.go
+++ b/pkg/scheduler/scheduler_test.go
@@ -45,7 +45,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -5157,7 +5156,7 @@ func TestScheduleForTAS(t *testing.T) {
 	cases := map[string]struct {
 		nodes           []corev1.Node
 		pods            []corev1.Pod
-		topologies      []kueuealpha.Topology
+		topologies      []kueue.Topology
 		admissionChecks []kueue.AdmissionCheck
 		resourceFlavors []kueue.ResourceFlavor
 		clusterQueues   []kueue.ClusterQueue
@@ -5189,7 +5188,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Ready().
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultTwoLevelTopology},
+			topologies:      []kueue.Topology{defaultTwoLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASTwoLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5232,7 +5231,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload in CQ with ProvisioningRequest; second pass; baseline scenario": {
 			nodes:           defaultSingleNode,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{clusterQueueWithProvReq},
 			workloads: []kueue.Workload{
@@ -5289,7 +5288,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Obj(),
 			},
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{
 				*utiltesting.MakeResourceFlavor("tas-reservation").
 					NodeLabel("tas-group", "reservation").
@@ -5342,7 +5341,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with unhealthyNode annotation; second pass; baseline scenario": {
 			nodes:           defaultNodes,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultThreeLevelTopology},
+			topologies:      []kueue.Topology{defaultThreeLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASThreeLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5380,7 +5379,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with unhealthyNode annotation; second pass; preferred; fit in different rack": {
 			nodes:           defaultNodes,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultThreeLevelTopology},
+			topologies:      []kueue.Topology{defaultThreeLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASThreeLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5421,7 +5420,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with unhealthyNode annotation; second pass; preferred; no fit": {
 			nodes:           defaultNodes,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultThreeLevelTopology},
+			topologies:      []kueue.Topology{defaultThreeLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASThreeLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5464,7 +5463,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with unhealthyNode annotation; second pass; preferred; no fit; FailFast": {
 			nodes:           defaultNodes,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultThreeLevelTopology},
+			topologies:      []kueue.Topology{defaultThreeLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASThreeLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5508,7 +5507,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with unhealthyNode annotation; second pass; required rack; fit": {
 			nodes:           defaultNodes,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultThreeLevelTopology},
+			topologies:      []kueue.Topology{defaultThreeLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASThreeLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5548,7 +5547,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with unhealthyNode annotation; second pass; required rack for a single node; fit": {
 			nodes:           defaultNodes,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultThreeLevelTopology},
+			topologies:      []kueue.Topology{defaultThreeLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASThreeLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5586,7 +5585,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with unhealthyNode annotation; second pass; required rack; no fit": {
 			nodes:           defaultNodes,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultThreeLevelTopology},
+			topologies:      []kueue.Topology{defaultThreeLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASThreeLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5631,7 +5630,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with unhealthyNode annotation; second pass; two podsets": {
 			nodes:           defaultNodes,
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultThreeLevelTopology},
+			topologies:      []kueue.Topology{defaultThreeLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASThreeLevelFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -5704,7 +5703,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Obj(),
 			},
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{clusterQueueWithProvReq},
 			workloads: []kueue.Workload{
@@ -5772,7 +5771,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Obj(),
 			},
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor,
 				*utiltesting.MakeResourceFlavor("tas-second").
 					NodeLabel("tas-node-second", "true").
@@ -5851,7 +5850,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Obj(),
 			},
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor,
 				*utiltesting.MakeResourceFlavor("tas-second").
 					NodeLabel("tas-node-second", "true").
@@ -5931,7 +5930,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload in CQ with ProvisioningRequest gets QuotaReserved only; implicit defaulting": {
 			nodes:           []corev1.Node{},
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{clusterQueueWithProvReq},
 			workloads: []kueue.Workload{
@@ -5983,7 +5982,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Obj(),
 			},
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor,
 				*utiltesting.MakeResourceFlavor("tas-second").
 					NodeLabel("tas-node-second", "true").
@@ -6042,7 +6041,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload in CQ with ProvisioningRequest gets QuotaReserved only": {
 			nodes:           []corev1.Node{},
 			admissionChecks: []kueue.AdmissionCheck{defaultProvCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{clusterQueueWithProvReq},
 			workloads: []kueue.Workload{
@@ -6076,7 +6075,7 @@ func TestScheduleForTAS(t *testing.T) {
 		"workload with a custom AdmissionCheck gets TAS assigned": {
 			nodes:           defaultSingleNode,
 			admissionChecks: []kueue.AdmissionCheck{defaultCustomCheck},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{clusterQueueWithCustomCheck},
 			workloads: []kueue.Workload{
@@ -6109,7 +6108,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload which does not specify TAS annotation uses the only TAS flavor": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor, defaultFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -6144,7 +6143,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload requiring TAS skips the non-TAS flavor": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor, defaultFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -6182,7 +6181,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload which does not need TAS skips the TAS flavor": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor, defaultFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -6216,7 +6215,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload with mixed PodSets (requiring TAS and not)": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor, defaultFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -6263,7 +6262,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload required TAS gets scheduled": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6293,7 +6292,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload requests topology level which is not present in topology": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6326,7 +6325,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Ready().
 					Obj(),
 			},
-			topologies: []kueuealpha.Topology{defaultSingleLevelTopology,
+			topologies: []kueue.Topology{defaultSingleLevelTopology,
 				*utiltesting.MakeTopology("tas-custom-topology").
 					Levels("cloud.com/custom-level").
 					Obj(),
@@ -6373,7 +6372,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload does not get scheduled as it does not fit within the node capacity": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6396,7 +6395,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload does not get scheduled as the node capacity is already used by another TAS workload": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6443,7 +6442,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Request(corev1.ResourceCPU, "600m").
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6471,10 +6470,10 @@ func TestScheduleForTAS(t *testing.T) {
 					StatusPhase(corev1.PodRunning).
 					Request(corev1.ResourceCPU, "400m").
 					NodeSelector(corev1.LabelHostname, "x1").
-					Label(kueuealpha.TASLabel, "true").
+					Label(kueue.TASLabel, "true").
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6522,7 +6521,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload gets admitted next to already admitted workload, multiple resources used": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6595,7 +6594,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Ready().
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultTwoLevelTopology},
+			topologies:      []kueue.Topology{defaultTwoLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASTwoLevelFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -6650,7 +6649,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Ready().
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultTwoLevelTopology},
+			topologies:      []kueue.Topology{defaultTwoLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASTwoLevelFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -6722,7 +6721,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Ready().
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultTwoLevelTopology},
+			topologies:      []kueue.Topology{defaultTwoLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASTwoLevelFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -6786,7 +6785,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Ready().
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -6857,7 +6856,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Ready().
 					Obj(),
 			},
-			topologies: []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies: []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{
 				*utiltesting.MakeResourceFlavor("tas-default").
 					NodeLabel("tas-node", "true").
@@ -6904,7 +6903,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"TAS workload gets scheduled as trimmed by partial admission": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6952,7 +6951,7 @@ func TestScheduleForTAS(t *testing.T) {
 					Request(corev1.ResourceCPU, "300m").
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -6994,7 +6993,7 @@ func TestScheduleForTAS(t *testing.T) {
 		},
 		"workload with zero value request gets scheduled": {
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueue},
 			workloads: []kueue.Workload{
@@ -7036,7 +7035,7 @@ func TestScheduleForTAS(t *testing.T) {
 				WithLists(
 					&kueue.AdmissionCheckList{Items: tc.admissionChecks},
 					&kueue.WorkloadList{Items: tc.workloads},
-					&kueuealpha.TopologyList{Items: tc.topologies},
+					&kueue.TopologyList{Items: tc.topologies},
 					&corev1.PodList{Items: tc.pods},
 					&corev1.NodeList{Items: tc.nodes},
 					&kueue.LocalQueueList{Items: queues}).
@@ -7054,7 +7053,7 @@ func TestScheduleForTAS(t *testing.T) {
 			now := time.Now()
 			fakeClock := testingclock.NewFakeClock(now)
 			qManager := qcache.NewManager(cl, cqCache, qcache.WithClock(fakeClock))
-			topologyByName := slices.ToMap(tc.topologies, func(i int) (kueue.TopologyReference, kueuealpha.Topology) {
+			topologyByName := slices.ToMap(tc.topologies, func(i int) (kueue.TopologyReference, kueue.Topology) {
 				return kueue.TopologyReference(tc.topologies[i].Name), tc.topologies[i]
 			})
 			for _, ac := range tc.admissionChecks {
@@ -7205,7 +7204,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 	cases := map[string]struct {
 		nodes           []corev1.Node
 		pods            []corev1.Pod
-		topologies      []kueuealpha.Topology
+		topologies      []kueue.Topology
 		resourceFlavors []kueue.ResourceFlavor
 		clusterQueues   []kueue.ClusterQueue
 		workloads       []kueue.Workload
@@ -7227,7 +7226,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 			// In this scenario the preemption target, based on quota, is a
 			// using an already deleted node (z).
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("tas-main").
@@ -7283,7 +7282,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 			// This test case demonstrates the baseline scenario where there
 			// is only one low-priority workload and it gets preempted.
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueWithPreemption},
 			workloads: []kueue.Workload{
@@ -7336,7 +7335,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 					StatusAllocatable(corev1.ResourceList{corev1.ResourcePods: resource.MustParse("1")}).
 					Obj(),
 			},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueWithPreemption},
 			workloads: []kueue.Workload{
@@ -7385,7 +7384,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 			// This test case demonstrates the targets are selected according
 			// to priorities, similarly as for regular preemption.
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueWithPreemption},
 			workloads: []kueue.Workload{
@@ -7455,7 +7454,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 			// node, but the workload requires to run on a single node, thus
 			// the lower priority workload is chosen as target.
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueWithPreemption},
 			workloads: []kueue.Workload{
@@ -7526,7 +7525,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 			// to get in, as it is awaiting for the running workloads to
 			// complete.
 			nodes:           defaultSingleNode,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueWithPreemption},
 			workloads: []kueue.Workload{
@@ -7587,7 +7586,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 			clientBuilder := utiltesting.NewClientBuilder().
 				WithLists(
 					&kueue.WorkloadList{Items: tc.workloads},
-					&kueuealpha.TopologyList{Items: tc.topologies},
+					&kueue.TopologyList{Items: tc.topologies},
 					&corev1.PodList{Items: tc.pods},
 					&corev1.NodeList{Items: tc.nodes},
 					&kueue.LocalQueueList{Items: queues}).
@@ -7599,7 +7598,7 @@ func TestScheduleForTASPreemption(t *testing.T) {
 			recorder := &utiltesting.EventRecorder{}
 			cqCache := schdcache.New(cl)
 			qManager := qcache.NewManager(cl, cqCache)
-			topologyByName := slices.ToMap(tc.topologies, func(i int) (kueue.TopologyReference, kueuealpha.Topology) {
+			topologyByName := slices.ToMap(tc.topologies, func(i int) (kueue.TopologyReference, kueue.Topology) {
 				return kueue.TopologyReference(tc.topologies[i].Name), tc.topologies[i]
 			})
 			for _, flavor := range tc.resourceFlavors {
@@ -7765,7 +7764,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 	cases := map[string]struct {
 		nodes           []corev1.Node
 		pods            []corev1.Pod
-		topologies      []kueuealpha.Topology
+		topologies      []kueue.Topology
 		resourceFlavors []kueue.ResourceFlavor
 		clusterQueues   []kueue.ClusterQueue
 		workloads       []kueue.Workload
@@ -7785,7 +7784,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 	}{
 		"workload which requires borrowing gets scheduled": {
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -7819,7 +7818,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 			// This is a baseline scenario for reclamation within cohort where
 			// a single borrowing workload gets preempted.
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -7865,7 +7864,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 			// The test demonstrates the heuristic to select only a subset of
 			// workloads that need to be preempted.
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -7953,7 +7952,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 			// admission to 3 units of CPU and memory. It preempts one workload
 			// to fit.
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -8023,7 +8022,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 			// was one CPU unit empty. However, the preempting workload b1 books
 			// this capacity.
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB, defaultClusterQueueC},
 			workloads: []kueue.Workload{
@@ -8118,7 +8117,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 		},
 		"two small workloads considered; both get scheduled on different nodes": {
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -8167,7 +8166,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 		},
 		"two small workloads considered; both get scheduled on the same node": {
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -8217,7 +8216,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 		},
 		"two small workloads considered; there is only space for one of them on the initial node": {
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -8260,7 +8259,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 		},
 		"two workloads considered; there is enough space only for the first": {
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -8306,7 +8305,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 			// Both of the workloads require 2 CPU units which will make them
 			// both target the x1 node which is smallest in terms of CPU.
 			nodes:           defaultTwoNodes,
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues:   []kueue.ClusterQueue{defaultClusterQueueA, defaultClusterQueueB},
 			workloads: []kueue.Workload{
@@ -8349,7 +8348,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 		},
 		"preempting workload with targets reserves capacity so that lower priority workload cannot use it": {
 			nodes:           []corev1.Node{defaultNodeY1},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues: []kueue.ClusterQueue{*utiltesting.MakeClusterQueue("tas-cq-a").
 				Cohort("tas-cohort-main").
@@ -8413,7 +8412,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 		},
 		"preempting workload without targets reserves capacity so that lower priority workload cannot use it": {
 			nodes:           []corev1.Node{defaultNodeY1},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues: []kueue.ClusterQueue{*utiltesting.MakeClusterQueue("tas-cq-a").
 				Cohort("tas-cohort-main").
@@ -8477,7 +8476,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 		},
 		"preempting workload without targets doesn't reserve capacity when it can always reclaim": {
 			nodes:           []corev1.Node{defaultNodeY1},
-			topologies:      []kueuealpha.Topology{defaultSingleLevelTopology},
+			topologies:      []kueue.Topology{defaultSingleLevelTopology},
 			resourceFlavors: []kueue.ResourceFlavor{defaultTASFlavor},
 			clusterQueues: []kueue.ClusterQueue{*utiltesting.MakeClusterQueue("tas-cq-a").
 				Cohort("tas-cohort-main").
@@ -8559,7 +8558,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 			clientBuilder := utiltesting.NewClientBuilder().
 				WithLists(
 					&kueue.WorkloadList{Items: tc.workloads},
-					&kueuealpha.TopologyList{Items: tc.topologies},
+					&kueue.TopologyList{Items: tc.topologies},
 					&corev1.PodList{Items: tc.pods},
 					&corev1.NodeList{Items: tc.nodes},
 					&kueue.LocalQueueList{Items: queues}).
@@ -8571,7 +8570,7 @@ func TestScheduleForTASCohorts(t *testing.T) {
 			recorder := &utiltesting.EventRecorder{}
 			cqCache := schdcache.New(cl)
 			qManager := qcache.NewManager(cl, cqCache)
-			topologyByName := slices.ToMap(tc.topologies, func(i int) (kueue.TopologyReference, kueuealpha.Topology) {
+			topologyByName := slices.ToMap(tc.topologies, func(i int) (kueue.TopologyReference, kueue.Topology) {
 				return kueue.TopologyReference(tc.topologies[i].Name), tc.topologies[i]
 			})
 			for _, flavor := range tc.resourceFlavors {
diff --git a/pkg/util/client/client_test.go b/pkg/util/client/client_test.go
new file mode 100644
index 000000000..a7c9d5ac5
--- /dev/null
+++ b/pkg/util/client/client_test.go
@@ -0,0 +1,305 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package client
+
+import (
+	"errors"
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+	batchv1 "k8s.io/api/batch/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
+)
+
+// newObject creates and returns a new *batchv1.Job initialized with the given
+// resourceVersion and default metadata (Namespace="default", Name="test").
+//
+// The returned Job can be further customized by applying the provided option
+// functions. Each option is a function that mutates the Job before it is
+// returned, allowing flexible and reusable configuration in tests or setup code.
+//
+// Used in TestPatch and TestPatchStatus.
+func newObject(resourceVersion string, opts ...func(*batchv1.Job)) *batchv1.Job {
+	job := &batchv1.Job{
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace:       "default",
+			Name:            "test",
+			ResourceVersion: resourceVersion,
+		},
+	}
+	for _, opt := range opts {
+		opt(job)
+	}
+	return job
+}
+
+func TestPatch(t *testing.T) {
+	type args struct {
+		// context: initialized in t.Run().
+		// client: initialized in t.Run().
+		obj     client.Object
+		update  func() (client.Object, bool, error)
+		options []PatchOption
+	}
+	type want struct {
+		err bool
+		obj client.Object // To assert patched object.
+	}
+	// clientObject is used to initialize test Client in t.Run().
+	clientObject := newObject("2")
+
+	tests := map[string]struct {
+		args args
+		want want
+	}{
+		"Strict_OutdatedLocalObject": {
+			args: args{
+				obj: newObject("1"), // outdated local object results in patch error.
+				update: func() (client.Object, bool, error) {
+					obj := newObject("1")
+					obj.Spec.Suspend = ptr.To(true)
+					return obj, true, nil
+				},
+			},
+			want: want{
+				err: true,           // object was modified error.
+				obj: newObject("2"), // unchanged.
+			},
+		},
+		"Strict_CurrentLocalObject": {
+			args: args{
+				obj: newObject("2"),
+				update: func() (client.Object, bool, error) {
+					obj := newObject("2")
+					obj.Spec.Suspend = ptr.To(true)
+					obj.Status.Active = 1
+					return obj, true, nil
+				},
+			},
+			want: want{
+				obj: newObject("3", // post-patch incremented resource version.
+					func(job *batchv1.Job) {
+						// Change to Spec is applied; Status change is ignored because Patch updates meta and spec only.
+						job.Spec.Suspend = ptr.To(true)
+					}),
+			},
+		},
+		"NotStrict_OutdatedLocalObject": {
+			args: args{
+				obj: newObject("1"), // outdated local object.
+				update: func() (client.Object, bool, error) {
+					obj := newObject("1")
+					obj.Spec.Suspend = ptr.To(true)
+					return obj, true, nil
+				},
+				options: []PatchOption{WithStrict(false)},
+			},
+			want: want{
+				// Unlike "Strict" version - this update is successful since the resource version is not
+				// included in the patch.
+				obj: newObject("3", func(job *batchv1.Job) {
+					job.Spec.Suspend = ptr.To(true)
+				}),
+			},
+		},
+		"NotStrict_CurrentLocalObject": {
+			args: args{
+				obj: newObject("2"),
+				update: func() (client.Object, bool, error) {
+					obj := newObject("2")
+					obj.Spec.Suspend = ptr.To(true)
+					return obj, true, nil
+				},
+				options: []PatchOption{WithStrict(false)},
+			},
+			want: want{
+				obj: newObject("3", func(job *batchv1.Job) {
+					job.Spec.Suspend = ptr.To(true)
+				}),
+			},
+		},
+		"NoChanges": {
+			// Modeled after "Strict_OutdatedLocalObject"; however since we are returning
+			// updated: false - it makes no difference if the local object is outdated.
+			args: args{
+				obj: newObject("1"), // outdated local object results in patch error.
+				update: func() (client.Object, bool, error) {
+					return newObject("1"), false, nil
+				},
+			},
+			want: want{
+				obj: newObject("2"),
+			},
+		},
+		"Error": {
+			args: args{
+				obj: newObject("2"),
+				update: func() (client.Object, bool, error) {
+					return newObject("2"), true, errors.New("test-error")
+				},
+			},
+			want: want{
+				err: true,
+				obj: newObject("2"),
+			},
+		},
+	}
+	for name, tt := range tests {
+		t.Run(name, func(t *testing.T) {
+			ctx := t.Context()
+			clnt := utiltesting.NewClientBuilder().WithObjects(clientObject).Build()
+			if err := Patch(ctx, clnt, tt.args.obj, tt.args.update, tt.args.options...); (err != nil) != tt.want.err {
+				t.Errorf("Patch() error = %v, wantErr %v", err, tt.want.err)
+			}
+			if err := clnt.Get(ctx, client.ObjectKeyFromObject(tt.args.obj), tt.args.obj); err != nil {
+				t.Fatalf("Patch() unexpected error getting object: %v", err)
+			}
+			if diff := cmp.Diff(tt.want.obj, tt.args.obj); diff != "" {
+				t.Errorf("Patch() object (-want +got):\n%s", diff)
+			}
+		})
+	}
+}
+
+func TestPatchStatus(t *testing.T) {
+	type args struct {
+		// context: initialized in t.Run().
+		// client: initialized in t.Run().
+		obj     client.Object
+		update  func() (client.Object, bool, error)
+		options []PatchOption
+	}
+	type want struct {
+		err bool
+		obj client.Object // To assert patched object.
+	}
+	// clientObject is used to initialize test Client in t.Run().
+	clientObject := newObject("2")
+
+	tests := map[string]struct {
+		args args
+		want want
+	}{
+		"Strict_OutdatedLocalObject": {
+			args: args{
+				obj: newObject("1"), // outdated local object results in patch error.
+				update: func() (client.Object, bool, error) {
+					return newObject("1"), true, nil
+				},
+			},
+			want: want{
+				err: true,           // object was modified error.
+				obj: newObject("2"), // unchanged.
+			},
+		},
+		"Strict_CurrentLocalObject": {
+			args: args{
+				obj: newObject("2"),
+				update: func() (client.Object, bool, error) {
+					obj := newObject("2")
+					obj.Status.Active = 1
+					obj.Spec.Suspend = ptr.To(true)
+					return obj, true, nil
+				},
+			},
+			want: want{
+				obj: newObject("3", func(job *batchv1.Job) {
+					// Change to Status is applied; Spec change is ignored because Patch updates status only.
+					job.Status.Active = 1
+				}), // incremented.
+			},
+		},
+		"NotStrict_OutdatedLocalObject": {
+			args: args{
+				obj: newObject("1"), // outdated local object.
+				update: func() (client.Object, bool, error) {
+					obj := newObject("1")
+					obj.Status.Active = 1
+					return obj, true, nil
+				},
+				options: []PatchOption{WithStrict(false)},
+			},
+			want: want{
+				obj: newObject("3", func(job *batchv1.Job) {
+					job.Status.Active = 1
+				}),
+			},
+		},
+		"NotStrict_CurrentLocalObject": {
+			args: args{
+				obj: newObject("2"),
+				update: func() (client.Object, bool, error) {
+					obj := newObject("2")
+					obj.Status.Active = 1
+					return obj, true, nil
+				},
+				options: []PatchOption{WithStrict(false)},
+			},
+			want: want{
+				obj: newObject("3", func(job *batchv1.Job) {
+					job.Status.Active = 1
+				}),
+			},
+		},
+		"NoChanges": {
+			// Modeled after "Strict_OutdatedLocalObject"; however since we are returning
+			// false - it makes no difference if the local object is outdated.
+			args: args{
+				obj: newObject("1"), // outdated local object results in patch error.
+				update: func() (client.Object, bool, error) {
+					return newObject("1"), false, nil
+				},
+			},
+			want: want{
+				obj: newObject("2"),
+			},
+		},
+		"Error": {
+			args: args{
+				obj: newObject("2"),
+				update: func() (client.Object, bool, error) {
+					obj := newObject("2")
+					obj.Status.Active = 1
+					return obj, true, errors.New("test-error")
+				},
+			},
+			want: want{
+				err: true,
+				obj: newObject("2"),
+			},
+		},
+	}
+	for name, tt := range tests {
+		t.Run(name, func(t *testing.T) {
+			ctx := t.Context()
+			clnt := utiltesting.NewClientBuilder().WithObjects(clientObject).Build()
+			if err := PatchStatus(ctx, clnt, tt.args.obj, tt.args.update, tt.args.options...); (err != nil) != tt.want.err {
+				t.Errorf("Patch() error = %v, wantErr %v", err, tt.want.err)
+			}
+			if err := clnt.Get(ctx, client.ObjectKeyFromObject(tt.args.obj), tt.args.obj); err != nil {
+				t.Fatalf("Patch() unexpected error getting object: %v", err)
+			}
+			if diff := cmp.Diff(tt.want.obj, tt.args.obj); diff != "" {
+				t.Errorf("Patch() object (-want +got):\n%s", diff)
+			}
+		})
+	}
+}
diff --git a/pkg/util/testing/client.go b/pkg/util/testing/client.go
index 32d7123bb..1775a78ca 100644
--- a/pkg/util/testing/client.go
+++ b/pkg/util/testing/client.go
@@ -30,7 +30,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/core/indexer"
 )
@@ -47,7 +46,6 @@ func NewClientBuilder(addToSchemes ...func(s *runtime.Scheme) error) *fake.Clien
 	scheme := runtime.NewScheme()
 	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
 	utilruntime.Must(kueue.AddToScheme(scheme))
-	utilruntime.Must(kueuealpha.AddToScheme(scheme))
 	for i := range addToSchemes {
 		utilruntime.Must(addToSchemes[i](scheme))
 	}
diff --git a/pkg/util/testing/defaults.go b/pkg/util/testing/defaults.go
index b7f81bcd2..af6e5b0fb 100644
--- a/pkg/util/testing/defaults.go
+++ b/pkg/util/testing/defaults.go
@@ -21,7 +21,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
 const (
diff --git a/pkg/util/testing/wrappers.go b/pkg/util/testing/wrappers.go
index 7407ef7a2..a0b7b4114 100644
--- a/pkg/util/testing/wrappers.go
+++ b/pkg/util/testing/wrappers.go
@@ -32,7 +32,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utilResource "sigs.k8s.io/kueue/pkg/util/resource"
 )
@@ -523,6 +522,10 @@ func (p *PodSetWrapper) Obj() *kueue.PodSet {
 	return &p.PodSet
 }
 
+func (p *PodSetWrapper) Clone() *PodSetWrapper {
+	return &PodSetWrapper{PodSet: *p.DeepCopy()}
+}
+
 func (p *PodSetWrapper) Request(r corev1.ResourceName, q string) *PodSetWrapper {
 	p.Template.Spec.Containers[0].Resources.Requests[r] = resource.MustParse(q)
 	return p
@@ -608,6 +611,34 @@ func (p *PodSetWrapper) PodOverHead(resources corev1.ResourceList) *PodSetWrappe
 	return p
 }
 
+func (p *PodSetWrapper) ResourceClaimTemplate(claimName, templateName string) *PodSetWrapper {
+	p.Template.Spec.ResourceClaims = append(p.Template.Spec.ResourceClaims, corev1.PodResourceClaim{
+		Name:                      claimName,
+		ResourceClaimTemplateName: ptr.To(templateName),
+	})
+	if len(p.Template.Spec.Containers) > 0 {
+		p.Template.Spec.Containers[0].Resources.Claims = append(
+			p.Template.Spec.Containers[0].Resources.Claims,
+			corev1.ResourceClaim{Name: claimName},
+		)
+	}
+	return p
+}
+
+func (p *PodSetWrapper) ResourceClaim(claimName, resourceClaimName string) *PodSetWrapper {
+	p.Template.Spec.ResourceClaims = append(p.Template.Spec.ResourceClaims, corev1.PodResourceClaim{
+		Name:              claimName,
+		ResourceClaimName: ptr.To(resourceClaimName),
+	})
+	if len(p.Template.Spec.Containers) > 0 {
+		p.Template.Spec.Containers[0].Resources.Claims = append(
+			p.Template.Spec.Containers[0].Resources.Claims,
+			corev1.ResourceClaim{Name: claimName},
+		)
+	}
+	return p
+}
+
 // AdmissionWrapper wraps an Admission
 type AdmissionWrapper struct{ kueue.Admission }
 
@@ -1106,11 +1137,11 @@ func (rf *ResourceFlavorWrapper) Creation(t time.Time) *ResourceFlavorWrapper {
 }
 
 // TopologyWrapper wraps a Topology.
-type TopologyWrapper struct{ kueuealpha.Topology }
+type TopologyWrapper struct{ kueue.Topology }
 
 // MakeTopology creates a wrapper for a Topology.
 func MakeTopology(name string) *TopologyWrapper {
-	return &TopologyWrapper{kueuealpha.Topology{
+	return &TopologyWrapper{kueue.Topology{
 		ObjectMeta: metav1.ObjectMeta{
 			Name: name,
 		},
@@ -1119,16 +1150,16 @@ func MakeTopology(name string) *TopologyWrapper {
 
 // Levels sets the levels for a Topology.
 func (t *TopologyWrapper) Levels(levels ...string) *TopologyWrapper {
-	t.Spec.Levels = make([]kueuealpha.TopologyLevel, len(levels))
+	t.Spec.Levels = make([]kueue.TopologyLevel, len(levels))
 	for i, level := range levels {
-		t.Spec.Levels[i] = kueuealpha.TopologyLevel{
+		t.Spec.Levels[i] = kueue.TopologyLevel{
 			NodeLabel: level,
 		}
 	}
 	return t
 }
 
-func (t *TopologyWrapper) Obj() *kueuealpha.Topology {
+func (t *TopologyWrapper) Obj() *kueue.Topology {
 	return &t.Topology
 }
 
diff --git a/pkg/util/testingjobs/pod/wrappers.go b/pkg/util/testingjobs/pod/wrappers.go
index 144c64820..f6c30d55c 100644
--- a/pkg/util/testingjobs/pod/wrappers.go
+++ b/pkg/util/testingjobs/pod/wrappers.go
@@ -28,7 +28,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/ptr"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconsts "sigs.k8s.io/kueue/pkg/controller/constants"
 	podconstants "sigs.k8s.io/kueue/pkg/controller/jobs/pod/constants"
@@ -146,7 +146,7 @@ func (p *PodWrapper) GroupTotalCount(gtc string) *PodWrapper {
 
 // GroupIndex updates the pod.GroupIndexLabel of the Pod
 func (p *PodWrapper) GroupIndex(index string) *PodWrapper {
-	return p.Label(kueuealpha.PodGroupPodIndexLabel, index)
+	return p.Label(kueue.PodGroupPodIndexLabel, index)
 }
 
 // Label sets the label of the Pod
@@ -183,7 +183,7 @@ func (p *PodWrapper) KueueSchedulingGate() *PodWrapper {
 
 // TopologySchedulingGate adds kueue scheduling gate to the Pod
 func (p *PodWrapper) TopologySchedulingGate() *PodWrapper {
-	return p.Gate(kueuealpha.TopologySchedulingGate)
+	return p.Gate(kueue.TopologySchedulingGate)
 }
 
 // Gate adds kueue scheduling gate to the Pod by the gate name
diff --git a/pkg/util/testingjobs/raycluster/wrappers.go b/pkg/util/testingjobs/raycluster/wrappers.go
index 5f576c2a6..85bf74c30 100644
--- a/pkg/util/testingjobs/raycluster/wrappers.go
+++ b/pkg/util/testingjobs/raycluster/wrappers.go
@@ -217,6 +217,23 @@ func (j *ClusterWrapper) NodeLabel(rayType rayv1.RayNodeType, key, value string)
 	return j
 }
 
+// NodeAnnotation sets the annotation key and value for specific RayNodeType
+func (j *ClusterWrapper) NodeAnnotation(rayType rayv1.RayNodeType, key, value string) *ClusterWrapper {
+	switch rayType {
+	case rayv1.HeadNode:
+		if j.Spec.HeadGroupSpec.Template.Annotations == nil {
+			j.Spec.HeadGroupSpec.Template.Annotations = make(map[string]string)
+		}
+		j.Spec.HeadGroupSpec.Template.Annotations[key] = value
+	case rayv1.WorkerNode:
+		if j.Spec.WorkerGroupSpecs[0].Template.Annotations == nil {
+			j.Spec.WorkerGroupSpecs[0].Template.Annotations = make(map[string]string)
+		}
+		j.Spec.WorkerGroupSpecs[0].Template.Annotations[key] = value
+	}
+	return j
+}
+
 // StatusConditions adds a condition
 func (j *ClusterWrapper) StatusConditions(c metav1.Condition) *ClusterWrapper {
 	j.Status.Conditions = append(j.Status.Conditions, c)
diff --git a/pkg/util/testingjobs/statefulset/wrappers.go b/pkg/util/testingjobs/statefulset/wrappers.go
index 8897dac66..298d80de6 100644
--- a/pkg/util/testingjobs/statefulset/wrappers.go
+++ b/pkg/util/testingjobs/statefulset/wrappers.go
@@ -27,7 +27,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/ptr"
 
-	"sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	"sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	controllerconstants "sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -199,7 +199,7 @@ func (ss *StatefulSetWrapper) PodTemplateSpecPodGroupServingAnnotation() *Statef
 }
 
 func (ss *StatefulSetWrapper) PodTemplateSpecPodGroupPodIndexLabelAnnotation(labelName string) *StatefulSetWrapper {
-	return ss.PodTemplateSpecAnnotation(v1alpha1.PodGroupPodIndexLabelAnnotation, labelName)
+	return ss.PodTemplateSpecAnnotation(v1beta1.PodGroupPodIndexLabelAnnotation, labelName)
 }
 
 func (ss *StatefulSetWrapper) Image(image string, args []string) *StatefulSetWrapper {
diff --git a/pkg/workload/workload_test.go b/pkg/workload/workload_test.go
index a3d4f24ee..e3bbeea73 100644
--- a/pkg/workload/workload_test.go
+++ b/pkg/workload/workload_test.go
@@ -17,6 +17,7 @@ limitations under the License.
 package workload
 
 import (
+	"fmt"
 	"testing"
 	"time"
 
@@ -32,6 +33,7 @@ import (
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/resources"
 	"sigs.k8s.io/kueue/pkg/util/admissioncheck"
 	utiltas "sigs.k8s.io/kueue/pkg/util/tas"
@@ -1290,3 +1292,220 @@ func TestNeedsSecondPass(t *testing.T) {
 		})
 	}
 }
+
+func TestWithPreprocessedDRAResources(t *testing.T) {
+	features.SetFeatureGateDuringTest(t, features.DynamicResourceAllocation, true)
+
+	cases := map[string]struct {
+		workload     kueue.Workload
+		draResources map[kueue.PodSetReference]corev1.ResourceList
+		wantInfo     Info
+	}{
+		"single podset with DRA resources": {
+			workload: *utiltesting.MakeWorkload("test-wl", "default").
+				PodSets(*utiltesting.MakePodSet("main", 1).
+					Request(corev1.ResourceCPU, "100m").
+					Obj()).
+				Obj(),
+			draResources: map[kueue.PodSetReference]corev1.ResourceList{
+				"main": {
+					"gpus": resource.MustParse("2"),
+				},
+			},
+			wantInfo: Info{
+				TotalRequests: []PodSetResources{
+					{
+						Name:  "main",
+						Count: 1,
+						Requests: resources.Requests{
+							corev1.ResourceCPU: 100,
+							"gpus":             2,
+						},
+					},
+				},
+			},
+		},
+		"multiple podsets with different DRA resources": {
+			workload: *utiltesting.MakeWorkload("test-wl", "default").
+				PodSets(
+					*utiltesting.MakePodSet("main", 1).
+						Request(corev1.ResourceCPU, "100m").
+						Obj(),
+					*utiltesting.MakePodSet("worker", 2).
+						Request(corev1.ResourceMemory, "1Gi").
+						Obj(),
+				).
+				Obj(),
+			draResources: map[kueue.PodSetReference]corev1.ResourceList{
+				"main": {
+					"gpus": resource.MustParse("2"),
+				},
+				"worker": {
+					"foo-accelerator": resource.MustParse("1"),
+				},
+			},
+			wantInfo: Info{
+				TotalRequests: []PodSetResources{
+					{
+						Name:  "main",
+						Count: 1,
+						Requests: resources.Requests{
+							corev1.ResourceCPU: 100,
+							"gpus":             2,
+						},
+					},
+					{
+						Name:  "worker",
+						Count: 2,
+						Requests: resources.Requests{
+							corev1.ResourceMemory: 2 * 1024 * 1024 * 1024,
+							"foo-accelerator":     2,
+						},
+					},
+				},
+			},
+		},
+		"no DRA resources for podset": {
+			workload: *utiltesting.MakeWorkload("test-wl", "default").
+				PodSets(
+					*utiltesting.MakePodSet("main", 1).
+						Request(corev1.ResourceCPU, "100m").
+						Obj(),
+					*utiltesting.MakePodSet("worker", 1).
+						Request(corev1.ResourceMemory, "512Mi").
+						Obj(),
+				).
+				Obj(),
+			draResources: map[kueue.PodSetReference]corev1.ResourceList{
+				"main": {
+					"gpus": resource.MustParse("1"),
+				},
+			},
+			wantInfo: Info{
+				TotalRequests: []PodSetResources{
+					{
+						Name:  "main",
+						Count: 1,
+						Requests: resources.Requests{
+							corev1.ResourceCPU: 100,
+							"gpus":             1,
+						},
+					},
+					{
+						Name:  "worker",
+						Count: 1,
+						Requests: resources.Requests{
+							corev1.ResourceMemory: 512 * 1024 * 1024,
+						},
+					},
+				},
+			},
+		},
+	}
+
+	for name, tc := range cases {
+		t.Run(name, func(t *testing.T) {
+			info := NewInfo(&tc.workload, WithPreprocessedDRAResources(tc.draResources))
+
+			if diff := cmp.Diff(tc.wantInfo.TotalRequests, info.TotalRequests); diff != "" {
+				t.Errorf("Unexpected TotalRequests (-want,+got):\n%s", diff)
+			}
+		})
+	}
+}
+
+func TestSetQuotaReservation(t *testing.T) {
+	// test clock and time "constants" uses in conditions.
+	testClock := testingclock.NewFakeClock(time.Now())
+	now := testClock.Now()
+	fiveMinutesAgo := now.Add(-5 * time.Minute)
+
+	// admission "constants" values used in all test cases.
+	admission := utiltesting.MakeAdmission("test-queue").Obj()
+	quotaReservedReason := "QuotaReserved"
+	quotaReservedMessage := fmt.Sprintf("Quota reserved in ClusterQueue %s", admission.ClusterQueue)
+
+	// newWorkload wrapper to reduce boilerplate in test cases.
+	newWorkload := func() *utiltesting.WorkloadWrapper {
+		return utiltesting.MakeWorkload("test", "default").Generation(1)
+	}
+
+	// newCondition helper.
+	newCondition := func(condition string, status metav1.ConditionStatus, reason, message string, ltt time.Time) metav1.Condition {
+		return metav1.Condition{
+			Type:               condition,
+			Status:             status,
+			Reason:             reason,
+			Message:            message,
+			ObservedGeneration: 1,
+			LastTransitionTime: metav1.NewTime(ltt),
+		}
+	}
+
+	// test cases.
+	type args struct {
+		workload  *kueue.Workload
+		admission *kueue.Admission
+	}
+	tests := map[string]struct {
+		args args
+		want *kueue.Workload
+	}{
+		"WorkloadWithoutConditions": {
+			args: args{
+				workload:  newWorkload().Obj(),
+				admission: admission,
+			},
+			want: newWorkload().
+				Admission(admission).
+				Condition(newCondition(kueue.WorkloadQuotaReserved, metav1.ConditionTrue, quotaReservedReason, quotaReservedMessage, now)).
+				Obj(),
+		},
+		"WorkloadWithActiveConditions": {
+			args: args{
+				workload: newWorkload().
+					Conditions(
+						newCondition(kueue.WorkloadEvicted, metav1.ConditionTrue, "TestEvictedReason", "test evicted message", fiveMinutesAgo),
+						newCondition(kueue.WorkloadPreempted, metav1.ConditionTrue, "TestPreemptedReason", "test preempted message", fiveMinutesAgo),
+						newCondition(kueue.WorkloadQuotaReserved, metav1.ConditionFalse, "TestReason", "test message", fiveMinutesAgo),
+					).Obj(),
+				admission: admission,
+			},
+			want: newWorkload().
+				Admission(admission).
+				Conditions(
+					newCondition(kueue.WorkloadEvicted, metav1.ConditionFalse, quotaReservedReason, "Previously: test evicted message", now),
+					newCondition(kueue.WorkloadPreempted, metav1.ConditionFalse, quotaReservedReason, "Previously: test preempted message", now),
+					newCondition(kueue.WorkloadQuotaReserved, metav1.ConditionTrue, quotaReservedReason, quotaReservedMessage, now),
+				).
+				Obj(),
+		},
+		"WorkloadWithInactiveConditions": {
+			args: args{
+				workload: newWorkload().
+					Conditions(
+						newCondition(kueue.WorkloadEvicted, metav1.ConditionFalse, quotaReservedReason, "Previously: test evicted message", fiveMinutesAgo),
+						newCondition(kueue.WorkloadPreempted, metav1.ConditionFalse, quotaReservedReason, "Previously: test preempted message", fiveMinutesAgo),
+						newCondition(kueue.WorkloadQuotaReserved, metav1.ConditionFalse, quotaReservedReason, quotaReservedMessage, fiveMinutesAgo),
+					).Obj(),
+				admission: admission,
+			},
+			want: newWorkload().
+				Admission(admission).
+				Conditions(
+					newCondition(kueue.WorkloadEvicted, metav1.ConditionFalse, quotaReservedReason, "Previously: test evicted message", fiveMinutesAgo),
+					newCondition(kueue.WorkloadPreempted, metav1.ConditionFalse, quotaReservedReason, "Previously: test preempted message", fiveMinutesAgo),
+					newCondition(kueue.WorkloadQuotaReserved, metav1.ConditionTrue, quotaReservedReason, quotaReservedMessage, now),
+				).
+				Obj(),
+		},
+	}
+	for name, tt := range tests {
+		t.Run(name, func(t *testing.T) {
+			SetQuotaReservation(tt.args.workload, tt.args.admission, testClock)
+			if diff := cmp.Diff(tt.want, tt.args.workload); diff != "" {
+				t.Errorf("SetQuotaReservation() (-want +got):\n%s", diff)
+			}
+		})
+	}
+}
diff --git a/pkg/workloadslicing/workloadslicing_test.go b/pkg/workloadslicing/workloadslicing_test.go
index ad97655a9..14fed96e3 100644
--- a/pkg/workloadslicing/workloadslicing_test.go
+++ b/pkg/workloadslicing/workloadslicing_test.go
@@ -38,7 +38,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache/hierarchy"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
@@ -1055,7 +1054,7 @@ func Test_StartWorkloadSlicePods(t *testing.T) {
 						// Gated pod - gate should be removed.
 						testPod("test-two", "200", testJobObject, corev1.PodSchedulingGate{Name: kueue.ElasticJobSchedulingGate}),
 						// Gated with some other gate -
-						testPod("test-three", "300", testJobObject, corev1.PodSchedulingGate{Name: kueue.ElasticJobSchedulingGate}, corev1.PodSchedulingGate{Name: kueuealpha.TopologySchedulingGate}),
+						testPod("test-three", "300", testJobObject, corev1.PodSchedulingGate{Name: kueue.ElasticJobSchedulingGate}, corev1.PodSchedulingGate{Name: kueue.TopologySchedulingGate}),
 						// Other gated pod (not for this job)
 						testPod("other-pod", "400", &batchv1.Job{
 							ObjectMeta: metav1.ObjectMeta{
@@ -1072,7 +1071,7 @@ func Test_StartWorkloadSlicePods(t *testing.T) {
 					// Gated pod - gate removed (resource version increase).
 					testPod("test-two", "201", testJobObject),
 					// Gated with some other gate - other gate remains (resource version increased).
-					testPod("test-three", "301", testJobObject, corev1.PodSchedulingGate{Name: kueuealpha.TopologySchedulingGate}),
+					testPod("test-three", "301", testJobObject, corev1.PodSchedulingGate{Name: kueue.TopologySchedulingGate}),
 					// Other gated pod (not for this job) - no change.
 					testPod("other-pod", "400", &batchv1.Job{
 						ObjectMeta: metav1.ObjectMeta{
diff --git a/test/e2e/singlecluster/tas_test.go b/test/e2e/singlecluster/tas_test.go
index bc7d21a12..93c12247c 100644
--- a/test/e2e/singlecluster/tas_test.go
+++ b/test/e2e/singlecluster/tas_test.go
@@ -26,7 +26,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/jobset"
@@ -53,7 +52,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 
 	ginkgo.When("Creating a Job requesting TAS", func() {
 		var (
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			onDemandRF   *kueue.ResourceFlavor
 			localQueue   *kueue.LocalQueue
 			clusterQueue *kueue.ClusterQueue
@@ -97,7 +96,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 				Obj()
 			jobKey := client.ObjectKeyFromObject(sampleJob)
 			sampleJob = (&testingjob.JobWrapper{Job: *sampleJob}).
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, corev1.LabelHostname).
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, corev1.LabelHostname).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 				Obj()
 			util.MustCreate(ctx, k8sClient, sampleJob)
@@ -145,7 +144,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 
 	ginkgo.When("Creating a JobSet requesting TAS", func() {
 		var (
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			onDemandRF   *kueue.ResourceFlavor
 			clusterQueue *kueue.ClusterQueue
 			localQueue   *kueue.LocalQueue
@@ -197,7 +196,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 						Parallelism: 1,
 						Completions: 1,
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: corev1.LabelHostname,
+							kueue.PodSetRequiredTopologyAnnotation: corev1.LabelHostname,
 						},
 					},
 					testingjobset.ReplicatedJobRequirements{
@@ -208,7 +207,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 						Parallelism: 1,
 						Completions: 1,
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: corev1.LabelHostname,
+							kueue.PodSetRequiredTopologyAnnotation: corev1.LabelHostname,
 						},
 					},
 				).
@@ -280,7 +279,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 
 	ginkgo.When("Creating a Pod requesting TAS", func() {
 		var (
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			onDemandRF   *kueue.ResourceFlavor
 			clusterQueue *kueue.ClusterQueue
 			localQueue   *kueue.LocalQueue
@@ -324,7 +323,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 			p := testingpod.MakePod("test-pod", ns.Name).
 				Queue(localQueue.Name).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
-				Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, corev1.LabelHostname).
+				Annotation(kueue.PodSetRequiredTopologyAnnotation, corev1.LabelHostname).
 				RequestAndLimit(corev1.ResourceCPU, "200m").
 				RequestAndLimit(corev1.ResourceMemory, "200Mi").
 				Obj()
@@ -333,7 +332,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 				util.MustCreate(ctx, k8sClient, p)
 				gomega.Expect(p.Spec.SchedulingGates).To(gomega.ContainElements(
 					corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName},
-					corev1.PodSchedulingGate{Name: kueuealpha.TopologySchedulingGate},
+					corev1.PodSchedulingGate{Name: kueue.TopologySchedulingGate},
 				))
 			})
 
@@ -382,7 +381,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 			group := testingpod.MakePod("group", ns.Name).
 				Queue(localQueue.Name).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
-				Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, corev1.LabelHostname).
+				Annotation(kueue.PodSetRequiredTopologyAnnotation, corev1.LabelHostname).
 				RequestAndLimit(corev1.ResourceCPU, "200m").
 				RequestAndLimit(corev1.ResourceMemory, "200Mi").
 				MakeGroup(2)
@@ -392,7 +391,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 					util.MustCreate(ctx, k8sClient, p)
 					gomega.Expect(p.Spec.SchedulingGates).To(gomega.ContainElements(
 						corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName},
-						corev1.PodSchedulingGate{Name: kueuealpha.TopologySchedulingGate},
+						corev1.PodSchedulingGate{Name: kueue.TopologySchedulingGate},
 					))
 				}
 			})
diff --git a/test/e2e/tas/appwrapper_test.go b/test/e2e/tas/appwrapper_test.go
index 5275e27e3..9da55cf68 100644
--- a/test/e2e/tas/appwrapper_test.go
+++ b/test/e2e/tas/appwrapper_test.go
@@ -25,7 +25,6 @@ import (
 	"k8s.io/apimachinery/pkg/fields"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	awtesting "sigs.k8s.io/kueue/pkg/util/testingjobs/appwrapper"
@@ -36,7 +35,7 @@ import (
 var _ = ginkgo.Describe("TopologyAwareScheduling for AppWrapper", func() {
 	var (
 		ns           *corev1.Namespace
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -91,7 +90,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for AppWrapper", func() {
 						RequestAndLimit(extraResource, "1").
 						Suspend(false).
 						Image(util.GetAgnHostImage(), util.BehaviorExitFast).
-						PodAnnotation(kueuealpha.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
+						PodAnnotation(kueue.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
 						SetTypeMeta().Obj(),
 				}).
 				Queue(localQueue.Name).
@@ -133,7 +132,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for AppWrapper", func() {
 				Indexed(true).
 				Suspend(false).
 				RequestAndLimit(extraResource, "1").
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 				SetTypeMeta().
 				Obj()
diff --git a/test/e2e/tas/job_test.go b/test/e2e/tas/job_test.go
index 6df7d5bee..cb190226d 100644
--- a/test/e2e/tas/job_test.go
+++ b/test/e2e/tas/job_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
 	"sigs.k8s.io/kueue/pkg/util/testing"
@@ -55,7 +54,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Job", func() {
 
 	ginkgo.When("Creating a Job", func() {
 		var (
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			tasFlavor    *kueue.ResourceFlavor
 			localQueue   *kueue.LocalQueue
 			clusterQueue *kueue.ClusterQueue
@@ -99,7 +98,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Job", func() {
 				RequestAndLimit(extraResource, "1").
 				Obj()
 			sampleJob = (&testingjob.JobWrapper{Job: *sampleJob}).
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, testing.DefaultRackTopologyLevel).
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, testing.DefaultRackTopologyLevel).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 				Obj()
 			util.MustCreate(ctx, k8sClient, sampleJob)
@@ -122,7 +121,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Job", func() {
 				RequestAndLimit(extraResource, "1").
 				Obj()
 			sampleJob = (&testingjob.JobWrapper{Job: *sampleJob}).
-				PodAnnotation(kueuealpha.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
+				PodAnnotation(kueue.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 				Obj()
 			util.MustCreate(ctx, k8sClient, sampleJob)
@@ -174,7 +173,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Job", func() {
 				RequestAndLimit(extraResource, "1").
 				Obj()
 			sampleJob = (&testingjob.JobWrapper{Job: *sampleJob}).
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 				Obj()
 			util.MustCreate(ctx, k8sClient, sampleJob)
@@ -227,7 +226,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Job", func() {
 				RequestAndLimit(extraResource, "1").
 				Obj()
 			sampleJob = (&testingjob.JobWrapper{Job: *sampleJob}).
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 				Obj()
 			util.MustCreate(ctx, k8sClient, sampleJob)
@@ -255,7 +254,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Job", func() {
 				RequestAndLimit(extraResource, "1").
 				Obj()
 			sampleJob = (&testingjob.JobWrapper{Job: *sampleJob}).
-				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
+				PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
 				Image(util.GetAgnHostImage(), util.BehaviorWaitForDeletion).
 				Obj()
 			util.MustCreate(ctx, k8sClient, sampleJob)
diff --git a/test/e2e/tas/jobset_test.go b/test/e2e/tas/jobset_test.go
index f9f20b3fe..c3007789e 100644
--- a/test/e2e/tas/jobset_test.go
+++ b/test/e2e/tas/jobset_test.go
@@ -28,7 +28,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	jobset "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	testingjobset "sigs.k8s.io/kueue/pkg/util/testingjobs/jobset"
@@ -47,7 +46,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for JobSet", func() {
 
 	ginkgo.When("Creating a JobSet", func() {
 		var (
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			tasFlavor    *kueue.ResourceFlavor
 			localQueue   *kueue.LocalQueue
 			clusterQueue *kueue.ClusterQueue
@@ -98,7 +97,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for JobSet", func() {
 						Parallelism: int32(parallelism),
 						Completions: int32(parallelism),
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 						},
 					},
 				).
@@ -161,9 +160,9 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for JobSet", func() {
 						Parallelism: int32(parallelism),
 						Completions: int32(parallelism),
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation:     testing.DefaultBlockTopologyLevel,
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
-							kueuealpha.PodSetSliceSizeAnnotation:             "3",
+							kueue.PodSetPreferredTopologyAnnotation:     testing.DefaultBlockTopologyLevel,
+							kueue.PodSetSliceRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetSliceSizeAnnotation:             "3",
 						},
 					},
 				).
@@ -226,8 +225,8 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for JobSet", func() {
 						Parallelism: int32(parallelism),
 						Completions: int32(parallelism),
 						PodAnnotations: map[string]string{
-							kueuealpha.PodSetSliceRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
-							kueuealpha.PodSetSliceSizeAnnotation:             "3",
+							kueue.PodSetSliceRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetSliceSizeAnnotation:             "3",
 						},
 					},
 				).
diff --git a/test/e2e/tas/leaderworkerset_test.go b/test/e2e/tas/leaderworkerset_test.go
index 54d3c2b73..9345f6398 100644
--- a/test/e2e/tas/leaderworkerset_test.go
+++ b/test/e2e/tas/leaderworkerset_test.go
@@ -28,7 +28,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	leaderworkersetv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	leaderworkersettesting "sigs.k8s.io/kueue/pkg/util/testingjobs/leaderworkerset"
@@ -38,7 +37,7 @@ import (
 var _ = ginkgo.Describe("TopologyAwareScheduling for LeaderWorkerSet", func() {
 	var (
 		ns           *corev1.Namespace
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		localQueue   *kueue.LocalQueue
 		clusterQueue *kueue.ClusterQueue
@@ -92,7 +91,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for LeaderWorkerSet", func() {
 				WorkerTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -185,8 +184,8 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for LeaderWorkerSet", func() {
 				WorkerTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
-							kueuealpha.PodSetGroupName:                  "same-group",
+							kueue.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetGroupName:                  "same-group",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -210,8 +209,8 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for LeaderWorkerSet", func() {
 				LeaderTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
-							kueuealpha.PodSetGroupName:                  "same-group",
+							kueue.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetGroupName:                  "same-group",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -294,8 +293,8 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for LeaderWorkerSet", func() {
 				WorkerTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
-							kueuealpha.PodSetGroupName:                  "same-group",
+							kueue.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetGroupName:                  "same-group",
 						},
 					},
 					Spec: corev1.PodSpec{
@@ -321,8 +320,8 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for LeaderWorkerSet", func() {
 				LeaderTemplate(corev1.PodTemplateSpec{
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
-							kueuealpha.PodSetGroupName:                  "same-group",
+							kueue.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetGroupName:                  "same-group",
 						},
 					},
 					Spec: corev1.PodSpec{
diff --git a/test/e2e/tas/mpijob_test.go b/test/e2e/tas/mpijob_test.go
index 651ad8af4..6fe0bf0e1 100644
--- a/test/e2e/tas/mpijob_test.go
+++ b/test/e2e/tas/mpijob_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	testingmpijob "sigs.k8s.io/kueue/pkg/util/testingjobs/mpijob"
@@ -38,7 +37,7 @@ import (
 var _ = ginkgo.Describe("TopologyAwareScheduling for MPIJob", func() {
 	var (
 		ns           *corev1.Namespace
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -97,7 +96,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for MPIJob", func() {
 						ReplicaCount:  launcherReplicas,
 						RestartPolicy: corev1.RestartPolicyOnFailure,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+							kueue.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 						},
 					},
 					testingmpijob.MPIJobReplicaSpecRequirement{
@@ -105,7 +104,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for MPIJob", func() {
 						ReplicaCount:  workerReplicas,
 						RestartPolicy: corev1.RestartPolicyOnFailure,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 						},
 					},
 				).
diff --git a/test/e2e/tas/pod_group_test.go b/test/e2e/tas/pod_group_test.go
index 2fcb2436e..7a8c876cf 100644
--- a/test/e2e/tas/pod_group_test.go
+++ b/test/e2e/tas/pod_group_test.go
@@ -23,7 +23,6 @@ import (
 	"k8s.io/apimachinery/pkg/fields"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	testingpod "sigs.k8s.io/kueue/pkg/util/testingjobs/pod"
@@ -42,7 +41,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Pod group", func() {
 
 	ginkgo.When("Creating a Pod group", func() {
 		var (
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			tasFlavor    *kueue.ResourceFlavor
 			localQueue   *kueue.LocalQueue
 			clusterQueue *kueue.ClusterQueue
@@ -86,7 +85,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Pod group", func() {
 				RequestAndLimit(extraResource, "1").
 				Limit(extraResource, "1").
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
-				Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel)
+				Annotation(kueue.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel)
 			podGroup := basePod.MakeIndexedGroup(numPods)
 
 			for _, pod := range podGroup {
@@ -116,7 +115,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for Pod group", func() {
 					client.MatchingLabels(basePod.Labels))).To(gomega.Succeed())
 				gotAssignment := make(map[string]string, numPods)
 				for _, pod := range pods.Items {
-					index := pod.Labels[kueuealpha.PodGroupPodIndexLabel]
+					index := pod.Labels[kueue.PodGroupPodIndexLabel]
 					gotAssignment[index] = pod.Spec.NodeName
 				}
 				wantAssignment := map[string]string{
diff --git a/test/e2e/tas/pytorch_test.go b/test/e2e/tas/pytorch_test.go
index 68fdc5e7b..eba2bf406 100644
--- a/test/e2e/tas/pytorch_test.go
+++ b/test/e2e/tas/pytorch_test.go
@@ -27,7 +27,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	testingpytorchjob "sigs.k8s.io/kueue/pkg/util/testingjobs/pytorchjob"
@@ -37,7 +36,7 @@ import (
 var _ = ginkgo.Describe("TopologyAwareScheduling for PyTorchJob", func() {
 	var (
 		ns           *corev1.Namespace
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -96,7 +95,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for PyTorchJob", func() {
 						ReplicaCount:  masterReplicas,
 						RestartPolicy: kftraining.RestartPolicyOnFailure,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+							kueue.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 						},
 					},
 					testingpytorchjob.PyTorchReplicaSpecRequirement{
@@ -104,7 +103,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for PyTorchJob", func() {
 						ReplicaCount:  workerReplicas,
 						RestartPolicy: kftraining.RestartPolicyOnFailure,
 						Annotations: map[string]string{
-							kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 						},
 					},
 				).
diff --git a/test/e2e/tas/rayjob_test.go b/test/e2e/tas/rayjob_test.go
index ecb2f86c5..9eed4826f 100644
--- a/test/e2e/tas/rayjob_test.go
+++ b/test/e2e/tas/rayjob_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/utils/set"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	testingrayjob "sigs.k8s.io/kueue/pkg/util/testingjobs/rayjob"
@@ -38,7 +37,7 @@ import (
 var _ = ginkgo.Describe("TopologyAwareScheduling for RayJob", ginkgo.Ordered, func() {
 	var (
 		ns           *corev1.Namespace
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -116,7 +115,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for RayJob", ginkgo.Ordered, fu
 							},
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+									kueue.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 								},
 							},
 						},
@@ -148,7 +147,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for RayJob", ginkgo.Ordered, fu
 							},
 							ObjectMeta: metav1.ObjectMeta{
 								Annotations: map[string]string{
-									kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+									kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 								},
 							},
 						},
@@ -174,7 +173,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for RayJob", ginkgo.Ordered, fu
 					},
 					ObjectMeta: metav1.ObjectMeta{
 						Annotations: map[string]string{
-							kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+							kueue.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 						},
 					},
 				}).
diff --git a/test/e2e/tas/statefulset_test.go b/test/e2e/tas/statefulset_test.go
index 57a1a7fa6..961ab1626 100644
--- a/test/e2e/tas/statefulset_test.go
+++ b/test/e2e/tas/statefulset_test.go
@@ -24,7 +24,6 @@ import (
 	"k8s.io/apimachinery/pkg/fields"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/util/testingjobs/statefulset"
@@ -34,7 +33,7 @@ import (
 var _ = ginkgo.Describe("TopologyAwareScheduling for StatefulSet", func() {
 	var (
 		ns           *corev1.Namespace
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		localQueue   *kueue.LocalQueue
 		clusterQueue *kueue.ClusterQueue
@@ -81,7 +80,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for StatefulSet", func() {
 				RequestAndLimit(extraResource, "1").
 				Replicas(replicas).
 				Queue(localQueue.Name).
-				PodTemplateSpecAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
+				PodTemplateSpecAnnotation(kueue.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
 				TerminationGracePeriod(1).
 				Obj()
 			util.MustCreate(ctx, k8sClient, sts)
@@ -109,7 +108,7 @@ var _ = ginkgo.Describe("TopologyAwareScheduling for StatefulSet", func() {
 				gomega.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name))).To(gomega.Succeed())
 				gotAssignment := make(map[string]string, replicas)
 				for _, pod := range pods.Items {
-					index := pod.Labels[kueuealpha.PodGroupPodIndexLabel]
+					index := pod.Labels[kueue.PodGroupPodIndexLabel]
 					gotAssignment[index] = pod.Spec.NodeName
 				}
 				wantAssignment := map[string]string{
diff --git a/test/integration/framework/framework.go b/test/integration/framework/framework.go
index e7b0e2036..a61270e74 100644
--- a/test/integration/framework/framework.go
+++ b/test/integration/framework/framework.go
@@ -34,6 +34,7 @@ import (
 	"github.com/onsi/gomega"
 	awv1beta2 "github.com/project-codeflare/appwrapper/api/v1beta2"
 	rayv1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1"
+	resourcev1beta2 "k8s.io/api/resource/v1beta2"
 	"k8s.io/apimachinery/pkg/runtime"
 	autoscaling "k8s.io/autoscaler/cluster-autoscaler/apis/provisioningrequest/autoscaling.x-k8s.io/v1"
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
@@ -49,7 +50,6 @@ import (
 	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/test/util"
 )
@@ -57,12 +57,13 @@ import (
 type ManagerSetup func(context.Context, manager.Manager)
 
 type Framework struct {
-	DepCRDPaths           []string
-	WebhookPath           string
-	APIServerFeatureGates []string
-	testEnv               *envtest.Environment
-	cancel                context.CancelFunc
-	scheme                *runtime.Scheme
+	DepCRDPaths            []string
+	WebhookPath            string
+	APIServerFeatureGates  []string
+	APIServerRuntimeConfig []string
+	testEnv                *envtest.Environment
+	cancel                 context.CancelFunc
+	scheme                 *runtime.Scheme
 
 	managerCancel context.CancelFunc
 	managerDone   <-chan struct{}
@@ -86,6 +87,10 @@ func (f *Framework) Init() *rest.Config {
 			f.testEnv.ControlPlane.GetAPIServer().Configure().Append("feature-gates", strings.Join(f.APIServerFeatureGates, ","))
 		}
 
+		if len(f.APIServerRuntimeConfig) > 0 {
+			f.testEnv.ControlPlane.GetAPIServer().Configure().Append("runtime-config", strings.Join(f.APIServerRuntimeConfig, ","))
+		}
+
 		if level, err := strconv.Atoi(os.Getenv("API_LOG_LEVEL")); err == nil && level > 0 {
 			f.testEnv.ControlPlane.GetAPIServer().Configure().Append("v", strconv.Itoa(level))
 			f.testEnv.ControlPlane.GetAPIServer().Out = ginkgo.GinkgoWriter
@@ -109,9 +114,6 @@ func (f *Framework) SetupClient(cfg *rest.Config) (context.Context, client.Clien
 	err = kueue.AddToScheme(f.scheme)
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 
-	err = kueuealpha.AddToScheme(f.scheme)
-	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
-
 	err = awv1beta2.AddToScheme(f.scheme)
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 
@@ -133,6 +135,9 @@ func (f *Framework) SetupClient(cfg *rest.Config) (context.Context, client.Clien
 	err = kftrainer.AddToScheme(f.scheme)
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 
+	err = resourcev1beta2.AddToScheme(f.scheme)
+	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
+
 	k8sClient, err := client.New(cfg, client.Options{Scheme: f.scheme})
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 	gomega.ExpectWithOffset(1, k8sClient).NotTo(gomega.BeNil())
diff --git a/test/integration/singlecluster/controller/admissionchecks/provisioning/provisioning_test.go b/test/integration/singlecluster/controller/admissionchecks/provisioning/provisioning_test.go
index cec44e4d1..f550fb3c6 100644
--- a/test/integration/singlecluster/controller/admissionchecks/provisioning/provisioning_test.go
+++ b/test/integration/singlecluster/controller/admissionchecks/provisioning/provisioning_test.go
@@ -356,7 +356,7 @@ var _ = ginkgo.Describe("Provisioning", ginkgo.Ordered, ginkgo.ContinueOnFailure
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
 					g.Expect(workload.IsEvictedByDeactivation(&updatedWl)).To(gomega.BeTrue())
-					util.ExpectEvictedWorkloadsTotalMetric(cq.Name, "Deactivated", "AdmissionCheck", 1)
+					util.ExpectEvictedWorkloadsTotalMetric(cq.Name, "Deactivated", "AdmissionCheck", "", 1)
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
 		})
@@ -420,7 +420,7 @@ var _ = ginkgo.Describe("Provisioning", ginkgo.Ordered, ginkgo.ContinueOnFailure
 					g.Expect(workload.IsEvictedByDeactivation(&updatedWl)).To(gomega.BeTrue())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
-				util.ExpectEvictedWorkloadsTotalMetric(cq.Name, "Deactivated", "AdmissionCheck", 1)
+				util.ExpectEvictedWorkloadsTotalMetric(cq.Name, "Deactivated", "AdmissionCheck", "", 1)
 			})
 		})
 
@@ -469,7 +469,7 @@ var _ = ginkgo.Describe("Provisioning", ginkgo.Ordered, ginkgo.ContinueOnFailure
 					g.Expect(workload.IsEvictedByDeactivation(&updatedWl)).To(gomega.BeTrue())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
-				util.ExpectEvictedWorkloadsTotalMetric(cq.Name, "Deactivated", "AdmissionCheck", 1)
+				util.ExpectEvictedWorkloadsTotalMetric(cq.Name, "Deactivated", "AdmissionCheck", "", 1)
 			})
 		})
 
@@ -538,7 +538,7 @@ var _ = ginkgo.Describe("Provisioning", ginkgo.Ordered, ginkgo.ContinueOnFailure
 					g.Expect(workload.IsEvictedByDeactivation(&updatedWl)).To(gomega.BeFalse())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
-				util.ExpectEvictedWorkloadsTotalMetric(cq.Name, kueue.WorkloadDeactivated, "", 0)
+				util.ExpectEvictedWorkloadsTotalMetric(cq.Name, kueue.WorkloadDeactivated, "", "", 0)
 			})
 		})
 
@@ -1103,7 +1103,7 @@ var _ = ginkgo.Describe("Provisioning", ginkgo.Ordered, ginkgo.ContinueOnFailure
 					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
 
 					g.Expect(workload.IsEvictedByDeactivation(&updatedWl)).To(gomega.BeTrue())
-					util.ExpectEvictedWorkloadsTotalMetric(cq.Name, "Deactivated", "AdmissionCheck", 1)
+					util.ExpectEvictedWorkloadsTotalMetric(cq.Name, "Deactivated", "AdmissionCheck", "", 1)
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
 		})
diff --git a/test/integration/singlecluster/controller/core/workload_controller_test.go b/test/integration/singlecluster/controller/core/workload_controller_test.go
index bfee7ee12..cbf120abf 100644
--- a/test/integration/singlecluster/controller/core/workload_controller_test.go
+++ b/test/integration/singlecluster/controller/core/workload_controller_test.go
@@ -309,8 +309,8 @@ var _ = ginkgo.Describe("Workload controller", ginkgo.Ordered, ginkgo.ContinueOn
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, wlKey, updatedWl)).To(gomega.Succeed())
 					g.Expect(workload.IsEvictedByDeactivation(updatedWl)).To(gomega.BeTrue())
-					util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, "Deactivated", "AdmissionCheck", 1)
-					util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, "Deactivated", "AdmissionCheck", 1)
+					util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, "Deactivated", "AdmissionCheck", "", 1)
+					util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, "Deactivated", "AdmissionCheck", "", 1)
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
 		})
@@ -391,8 +391,8 @@ var _ = ginkgo.Describe("Workload controller", ginkgo.Ordered, ginkgo.ContinueOn
 					g.Expect(k8sClient.Get(ctx, wlKey, updatedWl)).To(gomega.Succeed())
 
 					g.Expect(workload.IsEvictedByDeactivation(updatedWl)).To(gomega.BeTrue())
-					util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, "Deactivated", "AdmissionCheck", 1)
-					util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, "Deactivated", "AdmissionCheck", 1)
+					util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, "Deactivated", "AdmissionCheck", "", 1)
+					util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, "Deactivated", "AdmissionCheck", "", 1)
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
 		})
diff --git a/test/integration/singlecluster/controller/dra/dra_test.go b/test/integration/singlecluster/controller/dra/dra_test.go
new file mode 100644
index 000000000..72d78c4e1
--- /dev/null
+++ b/test/integration/singlecluster/controller/dra/dra_test.go
@@ -0,0 +1,592 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dra
+
+import (
+	"context"
+
+	"github.com/onsi/ginkgo/v2"
+	"github.com/onsi/gomega"
+	corev1 "k8s.io/api/core/v1"
+	resourcev1beta2 "k8s.io/api/resource/v1beta2"
+	"k8s.io/apimachinery/pkg/api/resource"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
+	"sigs.k8s.io/kueue/pkg/workload"
+	"sigs.k8s.io/kueue/test/util"
+)
+
+var _ = ginkgo.Describe("DRA Integration", ginkgo.Ordered, ginkgo.ContinueOnFailure, func() {
+	ginkgo.BeforeAll(func() {
+		fwk.StartManager(ctx, cfg, managerSetup)
+	})
+
+	ginkgo.AfterAll(func() {
+		fwk.StopManager(ctx)
+	})
+
+	ginkgo.BeforeEach(func() {
+		ctx = context.Background()
+	})
+
+	ginkgo.When("DRA is configured via ConfigMap", func() {
+		var (
+			ns             *corev1.Namespace
+			resourceFlavor *kueue.ResourceFlavor
+			clusterQueue   *kueue.ClusterQueue
+			localQueue     *kueue.LocalQueue
+		)
+		ginkgo.BeforeEach(func() {
+			ns = &corev1.Namespace{
+				ObjectMeta: metav1.ObjectMeta{
+					GenerateName: "dra-",
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, ns)).To(gomega.Succeed())
+
+			resourceFlavor = utiltesting.MakeResourceFlavor("").Obj()
+			resourceFlavor.GenerateName = "rf-"
+			gomega.Expect(k8sClient.Create(ctx, resourceFlavor)).To(gomega.Succeed())
+
+			clusterQueue = &kueue.ClusterQueue{
+				ObjectMeta: metav1.ObjectMeta{
+					GenerateName: "test-cq-",
+				},
+				Spec: kueue.ClusterQueueSpec{
+					NamespaceSelector: &metav1.LabelSelector{},
+					ResourceGroups: []kueue.ResourceGroup{
+						{
+							CoveredResources: []corev1.ResourceName{"foo"},
+							Flavors: []kueue.FlavorQuotas{
+								{
+									Name: kueue.ResourceFlavorReference(resourceFlavor.Name),
+									Resources: []kueue.ResourceQuota{
+										{Name: "foo", NominalQuota: resource.MustParse("10")},
+									},
+								},
+							},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, clusterQueue)).To(gomega.Succeed())
+			util.ExpectClusterQueuesToBeActive(ctx, k8sClient, clusterQueue)
+			localQueue = utiltesting.MakeLocalQueue("test-lq", ns.Name).
+				ClusterQueue(clusterQueue.Name).Obj()
+			gomega.Expect(k8sClient.Create(ctx, localQueue)).To(gomega.Succeed())
+		})
+
+		ginkgo.AfterEach(func() {
+			gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, clusterQueue, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, resourceFlavor, true)
+		})
+
+		ginkgo.It("Should reject workload with DRA resource claims with inadmissible condition", func() {
+			ginkgo.By("Creating a ResourceClaim")
+			rc := makeResourceClaim("test-rc", ns.Name, "foo.example.com", 2)
+			gomega.Expect(k8sClient.Create(ctx, rc)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with DRA resource claim")
+			wl := utiltesting.MakeWorkload("test-wl", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{Name: "device", ResourceClaimName: ptr.To("test-rc")},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is marked as inadmissible")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+
+				g.Expect(updatedWl.Status.Conditions).To(gomega.ContainElement(gomega.And(
+					gomega.HaveField("Type", kueue.WorkloadQuotaReserved),
+					gomega.HaveField("Status", metav1.ConditionFalse),
+					gomega.HaveField("Reason", kueue.WorkloadInadmissible),
+				)))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should handle workload with insufficient DRA quota", func() {
+			ginkgo.By("Creating a ResourceClaim that exceeds quota")
+			rc := makeResourceClaim("test-rc-large", ns.Name, "foo.example.com", 15)
+			gomega.Expect(k8sClient.Create(ctx, rc)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with large DRA resource claim")
+			wl := utiltesting.MakeWorkload("test-wl-large", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{Name: "device", ResourceClaimName: ptr.To("test-rc-large")},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload remains pending")
+			gomega.Consistently(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+			}, util.ConsistentDuration, util.ShortInterval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should handle multiple workloads sharing DRA quota", func() {
+			ginkgo.By("Creating ResourceClaimTemplates")
+			rct1 := &resourcev1beta2.ResourceClaimTemplate{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "quota-template-1",
+					Namespace: ns.Name,
+				},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "device-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "foo.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           4,
+								},
+							}},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, rct1)).To(gomega.Succeed())
+
+			rct2 := &resourcev1beta2.ResourceClaimTemplate{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "quota-template-2",
+					Namespace: ns.Name,
+				},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "device-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "foo.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           4,
+								},
+							}},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, rct2)).To(gomega.Succeed())
+
+			ginkgo.By("Creating first workload")
+			wl1 := utiltesting.MakeWorkload("test-wl-1", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl1.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("quota-template-1"),
+				},
+			}
+			wl1.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl1)).To(gomega.Succeed())
+
+			ginkgo.By("Creating second workload")
+			wl2 := utiltesting.MakeWorkload("test-wl-2", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl2.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("quota-template-2"),
+				},
+			}
+			wl2.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl2)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying both workloads are admitted")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl1, updatedWl2 kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), &updatedWl1)).To(gomega.Succeed())
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl2), &updatedWl2)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl1)).To(gomega.BeTrue())
+				g.Expect(workload.HasQuotaReservation(&updatedWl2)).To(gomega.BeTrue())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			ginkgo.By("Verifying total DRA usage doesn't exceed quota")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl1, updatedWl2 kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), &updatedWl1)).To(gomega.Succeed())
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl2), &updatedWl2)).To(gomega.Succeed())
+
+				totalUsage := int64(0)
+				if updatedWl1.Status.Admission != nil && len(updatedWl1.Status.Admission.PodSetAssignments) > 0 {
+					if usage, ok := updatedWl1.Status.Admission.PodSetAssignments[0].ResourceUsage["foo"]; ok {
+						totalUsage += usage.Value()
+					}
+				}
+				if updatedWl2.Status.Admission != nil && len(updatedWl2.Status.Admission.PodSetAssignments) > 0 {
+					if usage, ok := updatedWl2.Status.Admission.PodSetAssignments[0].ResourceUsage["foo"]; ok {
+						totalUsage += usage.Value()
+					}
+				}
+				g.Expect(totalUsage).To(gomega.Equal(int64(8)))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should admit workload with DRA resource claim templates", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate")
+			rct := &resourcev1beta2.ResourceClaimTemplate{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "device-template",
+					Namespace: ns.Name,
+				},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "device-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "foo.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           2,
+								},
+							}},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload that references the ResourceClaimTemplate")
+			wl := utiltesting.MakeWorkload("test-wl-template", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("device-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is admitted with ResourceClaimTemplate")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeTrue())
+				g.Expect(updatedWl.Status.Admission).NotTo(gomega.BeNil())
+				g.Expect(updatedWl.Status.Admission.PodSetAssignments).To(gomega.HaveLen(1))
+
+				assignment := updatedWl.Status.Admission.PodSetAssignments[0]
+				g.Expect(assignment.ResourceUsage).To(gomega.HaveKey(corev1.ResourceName("foo")))
+				g.Expect(assignment.ResourceUsage["foo"]).To(gomega.Equal(resource.MustParse("2")))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should handle multiple workloads with ResourceClaimTemplates", func() {
+			ginkgo.By("Creating ResourceClaimTemplates")
+			rct1 := &resourcev1beta2.ResourceClaimTemplate{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "device-template-1",
+					Namespace: ns.Name,
+				},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "device-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "foo.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           3,
+								},
+							}},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, rct1)).To(gomega.Succeed())
+
+			rct2 := &resourcev1beta2.ResourceClaimTemplate{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "device-template-2",
+					Namespace: ns.Name,
+				},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "device-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "foo.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           3,
+								},
+							}},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, rct2)).To(gomega.Succeed())
+
+			ginkgo.By("Creating first workload with ResourceClaimTemplate")
+			wl1 := utiltesting.MakeWorkload("test-wl-template-1", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl1.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("device-template-1"),
+				},
+			}
+			wl1.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl1)).To(gomega.Succeed())
+
+			ginkgo.By("Creating second workload with ResourceClaimTemplate")
+			wl2 := utiltesting.MakeWorkload("test-wl-template-2", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl2.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("device-template-2"),
+				},
+			}
+			wl2.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl2)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying both workloads are admitted with ResourceClaimTemplates")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl1, updatedWl2 kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), &updatedWl1)).To(gomega.Succeed())
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl2), &updatedWl2)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl1)).To(gomega.BeTrue())
+				g.Expect(workload.HasQuotaReservation(&updatedWl2)).To(gomega.BeTrue())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			ginkgo.By("Verifying total DRA usage from ResourceClaimTemplates")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl1, updatedWl2 kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), &updatedWl1)).To(gomega.Succeed())
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl2), &updatedWl2)).To(gomega.Succeed())
+
+				totalUsage := int64(0)
+				if updatedWl1.Status.Admission != nil && len(updatedWl1.Status.Admission.PodSetAssignments) > 0 {
+					if usage, ok := updatedWl1.Status.Admission.PodSetAssignments[0].ResourceUsage["foo"]; ok {
+						totalUsage += usage.Value()
+					}
+				}
+				if updatedWl2.Status.Admission != nil && len(updatedWl2.Status.Admission.PodSetAssignments) > 0 {
+					if usage, ok := updatedWl2.Status.Admission.PodSetAssignments[0].ResourceUsage["foo"]; ok {
+						totalUsage += usage.Value()
+					}
+				}
+				g.Expect(totalUsage).To(gomega.Equal(int64(6)))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should handle ResourceClaimTemplate with insufficient quota", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate that exceeds quota")
+			rct := &resourcev1beta2.ResourceClaimTemplate{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "device-template-large",
+					Namespace: ns.Name,
+				},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "device-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "foo.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           12,
+								},
+							}},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload that references the large ResourceClaimTemplate")
+			wl := utiltesting.MakeWorkload("test-wl-template-large", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("device-template-large"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload with ResourceClaimTemplate remains pending due to quota")
+			gomega.Consistently(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+			}, util.ConsistentDuration, util.ShortInterval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should handle unmapped device classes with proper error", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate with unmapped device class")
+			rct := &resourcev1beta2.ResourceClaimTemplate{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "unmapped-template",
+					Namespace: ns.Name,
+				},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "device-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "unmapped.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           2,
+								},
+							}},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a workload with unmapped device class")
+			wl := utiltesting.MakeWorkload("test-wl-unmapped", ns.Name).
+				Queue("test-lq").
+				Obj()
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("unmapped-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is marked as inadmissible")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeFalse())
+
+				g.Expect(updatedWl.Status.Conditions).To(gomega.ContainElement(gomega.And(
+					gomega.HaveField("Type", kueue.WorkloadQuotaReserved),
+					gomega.HaveField("Status", metav1.ConditionFalse),
+					gomega.HaveField("Reason", kueue.WorkloadInadmissible),
+					gomega.HaveField("Message", gomega.And(
+						gomega.ContainSubstring("DeviceClass"),
+						gomega.ContainSubstring("is not mapped"),
+					)),
+				)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.It("Should handle multi-pod workloads with correct DRA resource calculation", func() {
+			ginkgo.By("Creating a ResourceClaimTemplate")
+			rct := &resourcev1beta2.ResourceClaimTemplate{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "multi-pod-template",
+					Namespace: ns.Name,
+				},
+				Spec: resourcev1beta2.ResourceClaimTemplateSpec{
+					Spec: resourcev1beta2.ResourceClaimSpec{
+						Devices: resourcev1beta2.DeviceClaim{
+							Requests: []resourcev1beta2.DeviceRequest{{
+								Name: "device-request",
+								Exactly: &resourcev1beta2.ExactDeviceRequest{
+									DeviceClassName: "foo.example.com",
+									AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+									Count:           1,
+								},
+							}},
+						},
+					},
+				},
+			}
+			gomega.Expect(k8sClient.Create(ctx, rct)).To(gomega.Succeed())
+
+			ginkgo.By("Creating a multi-pod workload (parallelism: 3)")
+			wl := utiltesting.MakeWorkload("test-wl-multi-pod", ns.Name).
+				Queue("test-lq").
+				Obj()
+
+			wl.Spec.PodSets[0].Count = 3
+			wl.Spec.PodSets[0].Template.Spec.ResourceClaims = []corev1.PodResourceClaim{
+				{
+					Name:                      "device-template",
+					ResourceClaimTemplateName: ptr.To("multi-pod-template"),
+				},
+			}
+			wl.Spec.PodSets[0].Template.Spec.Containers[0].Resources.Claims = []corev1.ResourceClaim{
+				{Name: "device-template"},
+			}
+			gomega.Expect(k8sClient.Create(ctx, wl)).To(gomega.Succeed())
+
+			ginkgo.By("Verifying workload is admitted with correct total DRA resource usage")
+			gomega.Eventually(func(g gomega.Gomega) {
+				var updatedWl kueue.Workload
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), &updatedWl)).To(gomega.Succeed())
+				g.Expect(workload.HasQuotaReservation(&updatedWl)).To(gomega.BeTrue())
+				g.Expect(updatedWl.Status.Admission).NotTo(gomega.BeNil())
+				g.Expect(updatedWl.Status.Admission.PodSetAssignments).To(gomega.HaveLen(1))
+
+				assignment := updatedWl.Status.Admission.PodSetAssignments[0]
+
+				g.Expect(assignment.Count).To(gomega.Equal(ptr.To(int32(3))))
+
+				g.Expect(assignment.ResourceUsage).To(gomega.HaveKey(corev1.ResourceName("foo")))
+				g.Expect(assignment.ResourceUsage["foo"]).To(gomega.Equal(resource.MustParse("3")))
+
+				resourceQuantity := assignment.ResourceUsage["foo"]
+				resourceValue := resourceQuantity.Value()
+				podCount := int64(*assignment.Count)
+				g.Expect(resourceValue%podCount).To(gomega.Equal(int64(0)),
+					"DRA resource usage should be a multiple of pod count for webhook validation")
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+	})
+})
diff --git a/test/integration/singlecluster/controller/dra/suite_test.go b/test/integration/singlecluster/controller/dra/suite_test.go
new file mode 100644
index 000000000..cde27af94
--- /dev/null
+++ b/test/integration/singlecluster/controller/dra/suite_test.go
@@ -0,0 +1,157 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dra
+
+import (
+	"context"
+	"testing"
+
+	"github.com/onsi/ginkgo/v2"
+	"github.com/onsi/gomega"
+	corev1 "k8s.io/api/core/v1"
+	resourcev1beta2 "k8s.io/api/resource/v1beta2"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/rest"
+	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+
+	config "sigs.k8s.io/kueue/apis/config/v1beta1"
+	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
+	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
+	"sigs.k8s.io/kueue/pkg/controller/core"
+	"sigs.k8s.io/kueue/pkg/controller/core/indexer"
+	"sigs.k8s.io/kueue/pkg/dra"
+	"sigs.k8s.io/kueue/pkg/features"
+	"sigs.k8s.io/kueue/pkg/scheduler"
+	"sigs.k8s.io/kueue/pkg/webhooks"
+	"sigs.k8s.io/kueue/test/integration/framework"
+	"sigs.k8s.io/kueue/test/util"
+)
+
+var (
+	cfg       *rest.Config
+	k8sClient client.Client
+	ctx       context.Context
+	fwk       *framework.Framework
+)
+
+func TestAPIs(t *testing.T) {
+	gomega.RegisterFailHandler(ginkgo.Fail)
+
+	ginkgo.RunSpecs(t,
+		"DRA Controller Suite",
+	)
+}
+
+var _ = ginkgo.BeforeSuite(func() {
+	features.SetFeatureGateDuringTest(ginkgo.GinkgoTB(), features.DynamicResourceAllocation, true)
+
+	fwk = &framework.Framework{
+		WebhookPath: util.WebhookPath,
+		APIServerFeatureGates: []string{
+			"DynamicResourceAllocation=true",
+		},
+		APIServerRuntimeConfig: []string{
+			"resource.k8s.io/v1beta2=true",
+		},
+	}
+
+	cfg = fwk.Init()
+
+	ctx, k8sClient = fwk.SetupClient(cfg)
+})
+
+var _ = ginkgo.AfterSuite(func() {
+	ginkgo.By("tearing down the test environment")
+	fwk.Teardown()
+})
+
+// Manager setup used by tests to start controllers with DRA ConfigMap configuration
+func managerSetup(ctx context.Context, mgr manager.Manager) {
+	// Indexes
+	err := indexer.Setup(ctx, mgr.GetFieldIndexer())
+	gomega.Expect(err).NotTo(gomega.HaveOccurred())
+
+	// Webhooks
+	failedWebhook, err := webhooks.Setup(mgr, config.MultiKueueDispatcherModeAllAtOnce)
+	gomega.Expect(err).ToNot(gomega.HaveOccurred(), "webhook", failedWebhook)
+
+	mappings := []config.DeviceClassMapping{
+		{
+			Name:             corev1.ResourceName("foo"),
+			DeviceClassNames: []corev1.ResourceName{"foo.example.com"},
+		},
+		{
+			Name:             corev1.ResourceName("res-1"),
+			DeviceClassNames: []corev1.ResourceName{"test-deviceclass-1"},
+		},
+		{
+			Name:             corev1.ResourceName("res-2"),
+			DeviceClassNames: []corev1.ResourceName{"test-deviceclass-2"},
+		},
+	}
+
+	err = dra.CreateMapperFromConfiguration(mappings)
+	gomega.Expect(err).NotTo(gomega.HaveOccurred())
+
+	// Controllers configuration
+	controllersCfg := &config.Configuration{
+		Namespace: ptr.To("kueue-system"),
+		Resources: &config.Resources{
+			DeviceClassMappings: mappings,
+		},
+	}
+	mgr.GetScheme().Default(controllersCfg)
+	controllersCfg.Metrics.EnableClusterQueueResources = true
+
+	cCache := schdcache.New(mgr.GetClient())
+	queues := qcache.NewManager(mgr.GetClient(), cCache)
+
+	// Core controllers
+	failedCtrl, err := core.SetupControllers(mgr, queues, cCache, controllersCfg)
+	gomega.Expect(err).ToNot(gomega.HaveOccurred(), "controller", failedCtrl)
+
+	// Scheduler - required for workload admission
+	sched := scheduler.New(
+		queues,
+		cCache,
+		mgr.GetClient(),
+		mgr.GetEventRecorderFor("kueue-admission"),
+	)
+	err = mgr.Add(sched)
+	gomega.Expect(err).NotTo(gomega.HaveOccurred())
+}
+
+// Helper function to create a ResourceClaim
+func makeResourceClaim(name, namespace, deviceClassName string, count int64) *resourcev1beta2.ResourceClaim {
+	return &resourcev1beta2.ResourceClaim{
+		ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace},
+		Spec: resourcev1beta2.ResourceClaimSpec{
+			Devices: resourcev1beta2.DeviceClaim{
+				Requests: []resourcev1beta2.DeviceRequest{{
+					Name: "device-request",
+					Exactly: &resourcev1beta2.ExactDeviceRequest{
+						DeviceClassName: deviceClassName,
+						AllocationMode:  resourcev1beta2.DeviceAllocationModeExactCount,
+						Count:           count,
+					},
+				}},
+			},
+		},
+	}
+}
diff --git a/test/integration/singlecluster/controller/jobs/appwrapper/appwrapper_controller_test.go b/test/integration/singlecluster/controller/jobs/appwrapper/appwrapper_controller_test.go
index df7bfdd01..ba5610834 100644
--- a/test/integration/singlecluster/controller/jobs/appwrapper/appwrapper_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/appwrapper/appwrapper_controller_test.go
@@ -36,7 +36,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -845,7 +844,7 @@ var _ = ginkgo.Describe("AppWrapper controller when TopologyAwareScheduling enab
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -910,7 +909,7 @@ var _ = ginkgo.Describe("AppWrapper controller when TopologyAwareScheduling enab
 		aw := testingaw.MakeAppWrapper(awName, ns.Name).
 			Component(testingaw.Component{
 				Template: utiltestingjob.MakeJob("job", ns.Name).
-					PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, tasBlockLabel).
+					PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, tasBlockLabel).
 					Request(corev1.ResourceCPU, "1").
 					SetTypeMeta().
 					Obj(),
diff --git a/test/integration/singlecluster/controller/jobs/jaxjob/jaxjob_controller_test.go b/test/integration/singlecluster/controller/jobs/jaxjob/jaxjob_controller_test.go
index 30ab5c73e..48eabe9d5 100644
--- a/test/integration/singlecluster/controller/jobs/jaxjob/jaxjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/jaxjob/jaxjob_controller_test.go
@@ -30,7 +30,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -570,7 +569,7 @@ var _ = ginkgo.Describe("JAXJob controller when TopologyAwareScheduling enabled"
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -639,7 +638,7 @@ var _ = ginkgo.Describe("JAXJob controller when TopologyAwareScheduling enabled"
 					ReplicaType:  kftraining.JAXJobReplicaTypeWorker,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+						kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 					},
 				},
 			).
diff --git a/test/integration/singlecluster/controller/jobs/job/job_controller_test.go b/test/integration/singlecluster/controller/jobs/job/job_controller_test.go
index cf5112971..e3096710d 100644
--- a/test/integration/singlecluster/controller/jobs/job/job_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/job/job_controller_test.go
@@ -39,7 +39,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -2595,7 +2594,7 @@ var _ = ginkgo.Describe("Job controller when TopologyAwareScheduling enabled", g
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -2659,7 +2658,7 @@ var _ = ginkgo.Describe("Job controller when TopologyAwareScheduling enabled", g
 	ginkgo.It("should admit workload which fits in a required topology domain", func() {
 		job := testingjob.MakeJob("job", ns.Name).
 			Queue(kueue.LocalQueueName(localQueue.Name)).
-			PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, tasBlockLabel).
+			PodAnnotation(kueue.PodSetRequiredTopologyAnnotation, tasBlockLabel).
 			Request(corev1.ResourceCPU, "1").
 			Obj()
 		ginkgo.By("creating a job which requires block", func() {
@@ -2708,7 +2707,7 @@ var _ = ginkgo.Describe("Job controller when TopologyAwareScheduling enabled", g
 	ginkgo.It("should admit workload with topology unconstrained annotation which fits", func() {
 		job := testingjob.MakeJob("job", ns.Name).
 			Queue(kueue.LocalQueueName(localQueue.Name)).
-			PodAnnotation(kueuealpha.PodSetUnconstrainedTopologyAnnotation, "true").
+			PodAnnotation(kueue.PodSetUnconstrainedTopologyAnnotation, "true").
 			Request(corev1.ResourceCPU, "1").
 			Obj()
 		ginkgo.By("creating a job", func() {
@@ -3332,6 +3331,10 @@ var _ = ginkgo.Describe("Job with elastic jobs via workload-slices support", gin
 		util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, lowPriorityWorkloadSlice)
 		util.ExpectAdmittedWorkloadsTotalMetric(clusterQueue, lowPriorityClass.Name, 1)
 		util.ExpectAdmittedWorkloadsTotalMetric(clusterQueue, highPriorityClass.Name, 0)
+		util.ExpectAdmissionWaitTimeMetric(clusterQueue, lowPriorityClass.Name, 1)
+		util.ExpectAdmissionWaitTimeMetric(clusterQueue, highPriorityClass.Name, 0)
+		util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, lowPriorityClass.Name, 1)
+		util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, highPriorityClass.Name, 0)
 
 		ginkgo.By("scale-up low-priority job beyond the queue's nominal capacity")
 		gomega.Eventually(func(g gomega.Gomega) {
@@ -3362,8 +3365,18 @@ var _ = ginkgo.Describe("Job with elastic jobs via workload-slices support", gin
 
 		util.ExpectAdmittedWorkloadsTotalMetric(clusterQueue, lowPriorityClass.Name, 1)
 		util.ExpectAdmittedWorkloadsTotalMetric(clusterQueue, highPriorityClass.Name, 1)
+		util.ExpectAdmissionWaitTimeMetric(clusterQueue, lowPriorityClass.Name, 1)
+		util.ExpectAdmissionWaitTimeMetric(clusterQueue, highPriorityClass.Name, 1)
+		util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, lowPriorityClass.Name, 1)
+		util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, highPriorityClass.Name, 1)
 
 		ginkgo.By("the low priority old workload slice is finished")
 		util.ExpectWorkloadToFinish(ctx, k8sClient, client.ObjectKeyFromObject(lowPriorityWorkloadSlice))
+
+		util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, kueue.WorkloadEvictedByPreemption, "", lowPriorityClass.Name, 1)
+		util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, kueue.WorkloadEvictedByPreemption, "", highPriorityClass.Name, 0)
+
+		util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, kueue.WorkloadEvictedByPreemption, "", lowPriorityClass.Name, 1)
+		util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, kueue.WorkloadEvictedByPreemption, "", highPriorityClass.Name, 0)
 	})
 })
diff --git a/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go b/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
index 76c7957fa..9b8f14db0 100644
--- a/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
@@ -35,7 +35,6 @@ import (
 	jobsetapi "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -421,8 +420,22 @@ var _ = ginkgo.Describe("JobSet controller", ginkgo.Ordered, ginkgo.ContinueOnFa
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, wlLookupKey, createdWorkload)).To(gomega.Succeed())
 					g.Expect(createdWorkload.Spec.PodSets).To(gomega.ContainElements(
-						gomega.BeComparableTo(kueue.PodSet{Name: "replicated-job-1", Count: 4}, checkPSOpts),
-						gomega.BeComparableTo(kueue.PodSet{Name: "replicated-job-2-empty", Count: 0}, checkPSOpts),
+						gomega.BeComparableTo(
+							*testing.MakePodSet("replicated-job-1", 4).
+								PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+								SubGroupIndexLabel(ptr.To("jobset.sigs.k8s.io/job-index")).
+								SubGroupCount(ptr.To[int32](2)).
+								Obj(),
+							checkPSOpts,
+						),
+						gomega.BeComparableTo(
+							*testing.MakePodSet("replicated-job-2-empty", 0).
+								PodIndexLabel(ptr.To("batch.kubernetes.io/job-completion-index")).
+								SubGroupIndexLabel(ptr.To("jobset.sigs.k8s.io/job-index")).
+								SubGroupCount(ptr.To[int32](1)).
+								Obj(),
+							checkPSOpts,
+						),
 					))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
@@ -1132,7 +1145,7 @@ var _ = ginkgo.Describe("JobSet controller when TopologyAwareScheduling enabled"
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -1204,7 +1217,7 @@ var _ = ginkgo.Describe("JobSet controller when TopologyAwareScheduling enabled"
 					Parallelism: 1,
 					Completions: 1,
 					PodAnnotations: map[string]string{
-						kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+						kueue.PodSetRequiredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 					},
 					Image: util.GetAgnHostImage(),
 					Args:  util.BehaviorExitFast,
@@ -1215,7 +1228,7 @@ var _ = ginkgo.Describe("JobSet controller when TopologyAwareScheduling enabled"
 					Parallelism: 1,
 					Completions: 1,
 					PodAnnotations: map[string]string{
-						kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+						kueue.PodSetPreferredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 					},
 					Image: util.GetAgnHostImage(),
 					Args:  util.BehaviorExitFast,
diff --git a/test/integration/singlecluster/controller/jobs/mpijob/mpijob_controller_test.go b/test/integration/singlecluster/controller/jobs/mpijob/mpijob_controller_test.go
index 8e65ca356..96497b3bf 100644
--- a/test/integration/singlecluster/controller/jobs/mpijob/mpijob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/mpijob/mpijob_controller_test.go
@@ -34,7 +34,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -902,7 +901,7 @@ var _ = ginkgo.Describe("MPIJob controller when TopologyAwareScheduling enabled"
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -968,8 +967,8 @@ var _ = ginkgo.Describe("MPIJob controller when TopologyAwareScheduling enabled"
 		mpiJob := testingmpijob.MakeMPIJob(jobName, ns.Name).
 			Queue(localQueue.Name).
 			GenericLauncherAndWorker().
-			PodAnnotation(kfmpi.MPIReplicaTypeLauncher, kueuealpha.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
-			PodAnnotation(kfmpi.MPIReplicaTypeWorker, kueuealpha.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
+			PodAnnotation(kfmpi.MPIReplicaTypeLauncher, kueue.PodSetRequiredTopologyAnnotation, testing.DefaultBlockTopologyLevel).
+			PodAnnotation(kfmpi.MPIReplicaTypeWorker, kueue.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
 			Request(kfmpi.MPIReplicaTypeLauncher, corev1.ResourceCPU, "100m").
 			Request(kfmpi.MPIReplicaTypeWorker, corev1.ResourceCPU, "100m").
 			Obj()
diff --git a/test/integration/singlecluster/controller/jobs/paddlejob/paddlejob_controller_test.go b/test/integration/singlecluster/controller/jobs/paddlejob/paddlejob_controller_test.go
index 933c8f729..8db7d518a 100644
--- a/test/integration/singlecluster/controller/jobs/paddlejob/paddlejob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/paddlejob/paddlejob_controller_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/utils/ptr"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadpaddlejob "sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/paddlejob"
@@ -292,7 +291,7 @@ var _ = ginkgo.Describe("PaddleJob controller when TopologyAwareScheduling enabl
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -361,14 +360,14 @@ var _ = ginkgo.Describe("PaddleJob controller when TopologyAwareScheduling enabl
 					ReplicaType:  kftraining.PaddleJobReplicaTypeMaster,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+						kueue.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 					},
 				},
 				testingpaddlejob.PaddleReplicaSpecRequirement{
 					ReplicaType:  kftraining.PaddleJobReplicaTypeWorker,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+						kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 					},
 				},
 			).
diff --git a/test/integration/singlecluster/controller/jobs/pod/pod_controller_test.go b/test/integration/singlecluster/controller/jobs/pod/pod_controller_test.go
index beda01b93..0093a82e2 100644
--- a/test/integration/singlecluster/controller/jobs/pod/pod_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/pod/pod_controller_test.go
@@ -34,7 +34,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -2138,7 +2137,7 @@ var _ = ginkgo.Describe("Pod controller when TopologyAwareScheduling enabled", g
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -2215,14 +2214,14 @@ var _ = ginkgo.Describe("Pod controller when TopologyAwareScheduling enabled", g
 	ginkgo.It("should admit workload which fits in a required topology domain (single pod)", func() {
 		pod := testingpod.MakePod("pod", ns.Name).
 			Queue(localQueue.Name).
-			Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, tasBlockLabel).
+			Annotation(kueue.PodSetRequiredTopologyAnnotation, tasBlockLabel).
 			Request(corev1.ResourceCPU, "1").
 			Obj()
 		ginkgo.By("creating a pod which requires block", func() {
 			util.MustCreate(ctx, k8sClient, pod)
 			gomega.Expect(pod.Spec.SchedulingGates).Should(gomega.ContainElements(
 				corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName},
-				corev1.PodSchedulingGate{Name: kueuealpha.TopologySchedulingGate},
+				corev1.PodSchedulingGate{Name: kueue.TopologySchedulingGate},
 			))
 		})
 
@@ -2240,7 +2239,7 @@ var _ = ginkgo.Describe("Pod controller when TopologyAwareScheduling enabled", g
 					Count: 1,
 					TopologyRequest: &kueue.PodSetTopologyRequest{
 						Required:      ptr.To(tasBlockLabel),
-						PodIndexLabel: ptr.To(kueuealpha.PodGroupPodIndexLabel),
+						PodIndexLabel: ptr.To(kueue.PodGroupPodIndexLabel),
 					},
 				}}, cmpopts.IgnoreFields(kueue.PodSet{}, "Template")))
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -2267,7 +2266,7 @@ var _ = ginkgo.Describe("Pod controller when TopologyAwareScheduling enabled", g
 	ginkgo.It("should admit workload which fits in a required topology domain (pod group)", func() {
 		group := testingpod.MakePod("group", ns.Name).
 			Queue(localQueue.Name).
-			Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, tasBlockLabel).
+			Annotation(kueue.PodSetRequiredTopologyAnnotation, tasBlockLabel).
 			Request(corev1.ResourceCPU, "100m").
 			MakeIndexedGroup(2)
 		ginkgo.By("Creating the Pod group", func() {
@@ -2275,7 +2274,7 @@ var _ = ginkgo.Describe("Pod controller when TopologyAwareScheduling enabled", g
 				util.MustCreate(ctx, k8sClient, p)
 				gomega.Expect(p.Spec.SchedulingGates).To(gomega.ContainElements(
 					corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName},
-					corev1.PodSchedulingGate{Name: kueuealpha.TopologySchedulingGate},
+					corev1.PodSchedulingGate{Name: kueue.TopologySchedulingGate},
 				))
 			}
 		})
@@ -2291,7 +2290,7 @@ var _ = ginkgo.Describe("Pod controller when TopologyAwareScheduling enabled", g
 					Count: 2,
 					TopologyRequest: &kueue.PodSetTopologyRequest{
 						Required:      ptr.To(tasBlockLabel),
-						PodIndexLabel: ptr.To(kueuealpha.PodGroupPodIndexLabel),
+						PodIndexLabel: ptr.To(kueue.PodGroupPodIndexLabel),
 					},
 				}}, cmpopts.IgnoreFields(kueue.PodSet{}, "Template")))
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -2325,7 +2324,7 @@ var _ = ginkgo.Describe("Pod controller when TASReplaceNodeOnPodTermination is e
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -2432,7 +2431,7 @@ var _ = ginkgo.Describe("Pod controller when TASReplaceNodeOnPodTermination is e
 		var nodeName string
 		podgroup := testingpod.MakePod(podGroupName, ns.Name).
 			Queue(localQueue.Name).
-			Annotation(kueuealpha.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
+			Annotation(kueue.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
 			Request(corev1.ResourceCPU, "100m").
 			MakeIndexedGroup(2)
 		ginkgo.By("Creating the Pod group", func() {
@@ -2440,7 +2439,7 @@ var _ = ginkgo.Describe("Pod controller when TASReplaceNodeOnPodTermination is e
 				util.MustCreate(ctx, k8sClient, p)
 				gomega.Expect(p.Spec.SchedulingGates).To(gomega.ContainElements(
 					corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName},
-					corev1.PodSchedulingGate{Name: kueuealpha.TopologySchedulingGate},
+					corev1.PodSchedulingGate{Name: kueue.TopologySchedulingGate},
 				))
 			}
 		})
@@ -2514,7 +2513,7 @@ var _ = ginkgo.Describe("Pod controller when TASReplaceNodeOnPodTermination is e
 		var nodeName string
 		podgroup := testingpod.MakePod(podGroupName, ns.Name).
 			Queue(localQueue.Name).
-			Annotation(kueuealpha.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
+			Annotation(kueue.PodSetPreferredTopologyAnnotation, testing.DefaultRackTopologyLevel).
 			Request(corev1.ResourceCPU, "100m").
 			MakeIndexedGroup(2)
 		ginkgo.By("Creating the Pod group", func() {
@@ -2522,7 +2521,7 @@ var _ = ginkgo.Describe("Pod controller when TASReplaceNodeOnPodTermination is e
 				util.MustCreate(ctx, k8sClient, p)
 				gomega.Expect(p.Spec.SchedulingGates).To(gomega.ContainElements(
 					corev1.PodSchedulingGate{Name: podconstants.SchedulingGateName},
-					corev1.PodSchedulingGate{Name: kueuealpha.TopologySchedulingGate},
+					corev1.PodSchedulingGate{Name: kueue.TopologySchedulingGate},
 				))
 			}
 		})
diff --git a/test/integration/singlecluster/controller/jobs/pytorchjob/pytorchjob_controller_test.go b/test/integration/singlecluster/controller/jobs/pytorchjob/pytorchjob_controller_test.go
index 68c761427..7188bffb8 100644
--- a/test/integration/singlecluster/controller/jobs/pytorchjob/pytorchjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/pytorchjob/pytorchjob_controller_test.go
@@ -30,7 +30,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
@@ -591,7 +590,7 @@ var _ = ginkgo.Describe("PyTorchJob controller when TopologyAwareScheduling enab
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -660,14 +659,14 @@ var _ = ginkgo.Describe("PyTorchJob controller when TopologyAwareScheduling enab
 					ReplicaType:  kftraining.PyTorchJobReplicaTypeMaster,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+						kueue.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 					},
 				},
 				testingpytorchjob.PyTorchReplicaSpecRequirement{
 					ReplicaType:  kftraining.PyTorchJobReplicaTypeWorker,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+						kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 					},
 				},
 			).
diff --git a/test/integration/singlecluster/controller/jobs/tfjob/tfjob_controller_test.go b/test/integration/singlecluster/controller/jobs/tfjob/tfjob_controller_test.go
index 41691d77b..9e29e8dd7 100644
--- a/test/integration/singlecluster/controller/jobs/tfjob/tfjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/tfjob/tfjob_controller_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/utils/ptr"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadtfjob "sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/tfjob"
@@ -306,7 +305,7 @@ var _ = ginkgo.Describe("TFJob controller when TopologyAwareScheduling enabled",
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -375,21 +374,21 @@ var _ = ginkgo.Describe("TFJob controller when TopologyAwareScheduling enabled",
 					ReplicaType:  kftraining.TFJobReplicaTypeChief,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+						kueue.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 					},
 				},
 				testingtfjob.TFReplicaSpecRequirement{
 					ReplicaType:  kftraining.TFJobReplicaTypePS,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+						kueue.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 					},
 				},
 				testingtfjob.TFReplicaSpecRequirement{
 					ReplicaType:  kftraining.TFJobReplicaTypeWorker,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+						kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 					},
 				},
 			).
diff --git a/test/integration/singlecluster/controller/jobs/xgboostjob/xgboostjob_controller_test.go b/test/integration/singlecluster/controller/jobs/xgboostjob/xgboostjob_controller_test.go
index 042443a1d..e07d4feb5 100644
--- a/test/integration/singlecluster/controller/jobs/xgboostjob/xgboostjob_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/xgboostjob/xgboostjob_controller_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/utils/ptr"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	workloadxgboostjob "sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/xgboostjob"
@@ -289,7 +288,7 @@ var _ = ginkgo.Describe("XGBoostJob controller when TopologyAwareScheduling enab
 	var (
 		ns           *corev1.Namespace
 		nodes        []corev1.Node
-		topology     *kueuealpha.Topology
+		topology     *kueue.Topology
 		tasFlavor    *kueue.ResourceFlavor
 		clusterQueue *kueue.ClusterQueue
 		localQueue   *kueue.LocalQueue
@@ -358,14 +357,14 @@ var _ = ginkgo.Describe("XGBoostJob controller when TopologyAwareScheduling enab
 					ReplicaType:  kftraining.XGBoostJobReplicaTypeMaster,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
+						kueue.PodSetRequiredTopologyAnnotation: testing.DefaultRackTopologyLevel,
 					},
 				},
 				testingxgboostjob.XGBReplicaSpecRequirement{
 					ReplicaType:  kftraining.XGBoostJobReplicaTypeWorker,
 					ReplicaCount: 1,
 					Annotations: map[string]string{
-						kueuealpha.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
+						kueue.PodSetPreferredTopologyAnnotation: testing.DefaultBlockTopologyLevel,
 					},
 				},
 			).
diff --git a/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go b/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go
index 22c16885d..b635843dc 100644
--- a/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go
+++ b/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go
@@ -660,8 +660,8 @@ var _ = ginkgo.Describe("Scheduler", ginkgo.Ordered, ginkgo.ContinueOnFailure, f
 			util.FinishEvictionForWorkloads(ctx, k8sClient, wlBestEffortB)
 			util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, wlGuaranteed)
 
-			util.ExpectEvictedWorkloadsTotalMetric(bestEffortCQA.Name, kueue.WorkloadEvictedByPreemption, "", 0)
-			util.ExpectEvictedWorkloadsTotalMetric(bestEffortCQB.Name, kueue.WorkloadEvictedByPreemption, "", 1)
+			util.ExpectEvictedWorkloadsTotalMetric(bestEffortCQA.Name, kueue.WorkloadEvictedByPreemption, "", "", 0)
+			util.ExpectEvictedWorkloadsTotalMetric(bestEffortCQB.Name, kueue.WorkloadEvictedByPreemption, "", "", 1)
 		})
 	})
 })
diff --git a/test/integration/singlecluster/scheduler/podsready/scheduler_test.go b/test/integration/singlecluster/scheduler/podsready/scheduler_test.go
index ba025a705..ee5007946 100644
--- a/test/integration/singlecluster/scheduler/podsready/scheduler_test.go
+++ b/test/integration/singlecluster/scheduler/podsready/scheduler_test.go
@@ -283,8 +283,8 @@ var _ = ginkgo.Describe("SchedulerWithWaitForPodsReady", func() {
 			}, util.Timeout, util.Interval).Should(gomega.Succeed(), "the workload should be evicted after the timeout expires")
 
 			util.FinishEvictionForWorkloads(ctx, k8sClient, prodWl1)
-			util.ExpectEvictedWorkloadsTotalMetric(prodClusterQ.Name, kueue.WorkloadEvictedByPodsReadyTimeout, kueue.WorkloadWaitForStart, 1)
-			util.ExpectEvictedWorkloadsOnceTotalMetric(prodClusterQ.Name, kueue.WorkloadEvictedByPodsReadyTimeout, kueue.WorkloadWaitForStart, 1)
+			util.ExpectEvictedWorkloadsTotalMetric(prodClusterQ.Name, kueue.WorkloadEvictedByPodsReadyTimeout, kueue.WorkloadWaitForStart, "", 1)
+			util.ExpectEvictedWorkloadsOnceTotalMetric(prodClusterQ.Name, kueue.WorkloadEvictedByPodsReadyTimeout, kueue.WorkloadWaitForStart, "", 1)
 
 			ginkgo.By("verify the 'prod2' workload gets admitted and the 'prod1' is pending by backoff")
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, prodWl2)
@@ -298,7 +298,7 @@ var _ = ginkgo.Describe("SchedulerWithWaitForPodsReady", func() {
 
 			ginkgo.By("checking the 'prod' workload is admitted")
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, prodWl)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 1)
 			util.AwaitWorkloadEvictionByPodsReadyTimeout(ctx, k8sClient, client.ObjectKeyFromObject(prodWl), podsReadyTimeout)
 			util.SetRequeuedConditionWithPodsReadyTimeout(ctx, k8sClient, client.ObjectKeyFromObject(prodWl))
@@ -312,7 +312,7 @@ var _ = ginkgo.Describe("SchedulerWithWaitForPodsReady", func() {
 
 			ginkgo.By("verify the 'prod' workload gets re-admitted twice")
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, prodWl)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 2)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 2)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 2)
 			util.AwaitWorkloadEvictionByPodsReadyTimeout(ctx, k8sClient, client.ObjectKeyFromObject(prodWl), podsReadyTimeout)
 			util.SetRequeuedConditionWithPodsReadyTimeout(ctx, k8sClient, client.ObjectKeyFromObject(prodWl))
@@ -323,7 +323,7 @@ var _ = ginkgo.Describe("SchedulerWithWaitForPodsReady", func() {
 
 			ginkgo.By("the workload exceeded re-queue backoff limit should be deactivated")
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, prodWl)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 3)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 3)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 3)
 			time.Sleep(podsReadyTimeout)
 			gomega.Eventually(func(g gomega.Gomega) {
@@ -335,8 +335,8 @@ var _ = ginkgo.Describe("SchedulerWithWaitForPodsReady", func() {
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			util.FinishEvictionForWorkloads(ctx, k8sClient, prodWl)
 			// should observe a metrics of WorkloadEvictedByDeactivation
-			util.ExpectEvictedWorkloadsTotalMetric(prodClusterQ.Name, "Deactivated", "RequeuingLimitExceeded", 1)
-			util.ExpectEvictedWorkloadsOnceTotalMetric(prodClusterQ.Name, kueue.WorkloadEvictedByPodsReadyTimeout, kueue.WorkloadWaitForStart, 1)
+			util.ExpectEvictedWorkloadsTotalMetric(prodClusterQ.Name, "Deactivated", "RequeuingLimitExceeded", "", 1)
+			util.ExpectEvictedWorkloadsOnceTotalMetric(prodClusterQ.Name, kueue.WorkloadEvictedByPodsReadyTimeout, kueue.WorkloadWaitForStart, "", 1)
 
 			ginkgo.By("the reactivated workload should not be deactivated by the scheduler unless exceeding the backoffLimitCount")
 			gomega.Eventually(func(g gomega.Gomega) {
@@ -347,7 +347,7 @@ var _ = ginkgo.Describe("SchedulerWithWaitForPodsReady", func() {
 			// We await for re-admission. Then, the workload keeps the QuotaReserved condition
 			// even after timeout until FinishEvictionForWorkloads is called below.
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, prodWl)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 4)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 4)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 4)
 			util.AwaitWorkloadEvictionByPodsReadyTimeout(ctx, k8sClient, client.ObjectKeyFromObject(prodWl), podsReadyTimeout)
 			util.SetRequeuedConditionWithPodsReadyTimeout(ctx, k8sClient, client.ObjectKeyFromObject(prodWl))
@@ -696,7 +696,7 @@ var _ = ginkgo.Describe("SchedulerWithWaitForPodsReadyNonblockingMode", func() {
 			util.MustCreate(ctx, k8sClient, prodWl)
 			ginkgo.By("checking the 'prod' workload is admitted")
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, prodWl)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 1)
 			ginkgo.By("exceed the timeout for the 'prod' workload")
 			time.Sleep(podsReadyTimeout)
@@ -705,7 +705,7 @@ var _ = ginkgo.Describe("SchedulerWithWaitForPodsReadyNonblockingMode", func() {
 
 			ginkgo.By("verify the 'prod' workload gets re-admitted once")
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, prodWl)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 2)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 2)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 2)
 			util.AwaitWorkloadEvictionByPodsReadyTimeout(ctx, k8sClient, client.ObjectKeyFromObject(prodWl), podsReadyTimeout)
 			util.SetRequeuedConditionWithPodsReadyTimeout(ctx, k8sClient, client.ObjectKeyFromObject(prodWl))
diff --git a/test/integration/singlecluster/scheduler/preemption_test.go b/test/integration/singlecluster/scheduler/preemption_test.go
index af0d2eac5..9a2905d4f 100644
--- a/test/integration/singlecluster/scheduler/preemption_test.go
+++ b/test/integration/singlecluster/scheduler/preemption_test.go
@@ -132,9 +132,9 @@ var _ = ginkgo.Describe("Preemption", func() {
 			util.MustCreate(ctx, k8sClient, highWl2)
 
 			util.FinishEvictionForWorkloads(ctx, k8sClient, lowWl1, lowWl2)
-			util.ExpectEvictedWorkloadsTotalMetric(cq.Name, kueue.WorkloadEvictedByPreemption, "", 2)
+			util.ExpectEvictedWorkloadsTotalMetric(cq.Name, kueue.WorkloadEvictedByPreemption, "", "", 2)
 			util.ExpectPreemptedWorkloadsTotalMetric(cq.Name, kueue.InClusterQueueReason, 2)
-			util.ExpectEvictedWorkloadsOnceTotalMetric(cq.Name, kueue.WorkloadEvictedByPreemption, "", 2)
+			util.ExpectEvictedWorkloadsOnceTotalMetric(cq.Name, kueue.WorkloadEvictedByPreemption, "", "", 2)
 
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, cq.Name, highWl2)
 			util.ExpectWorkloadsToBePending(ctx, k8sClient, lowWl1, lowWl2)
@@ -314,20 +314,22 @@ var _ = ginkgo.Describe("Preemption", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(alphaLowWl), alphaLowWl)).To(gomega.Succeed())
 					g.Expect(apimeta.FindStatusCondition(alphaLowWl.Status.Conditions, kueue.WorkloadPreempted)).To(gomega.BeComparableTo(&metav1.Condition{
-						Type:    kueue.WorkloadPreempted,
-						Status:  metav1.ConditionFalse,
-						Reason:  "QuotaReserved",
-						Message: fmt.Sprintf("Previously: Preempted to accommodate a workload (UID: %s, JobUID: UNKNOWN) due to %s", alphaMidWl.UID, preemption.HumanReadablePreemptionReasons[kueue.InClusterQueueReason]),
+						Type:               kueue.WorkloadPreempted,
+						Status:             metav1.ConditionFalse,
+						ObservedGeneration: alphaLowWl.Generation,
+						Reason:             "QuotaReserved",
+						Message:            fmt.Sprintf("Previously: Preempted to accommodate a workload (UID: %s, JobUID: UNKNOWN) due to %s", alphaMidWl.UID, preemption.HumanReadablePreemptionReasons[kueue.InClusterQueueReason]),
 					}, conditionCmpOpts))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(betaMidWl), betaMidWl)).To(gomega.Succeed())
 					g.Expect(apimeta.FindStatusCondition(betaMidWl.Status.Conditions, kueue.WorkloadPreempted)).To(gomega.BeComparableTo(&metav1.Condition{
-						Type:    kueue.WorkloadPreempted,
-						Status:  metav1.ConditionFalse,
-						Reason:  "QuotaReserved",
-						Message: fmt.Sprintf("Previously: Preempted to accommodate a workload (UID: %s, JobUID: UNKNOWN) due to %s", alphaMidWl.UID, preemption.HumanReadablePreemptionReasons[kueue.InCohortReclamationReason]),
+						Type:               kueue.WorkloadPreempted,
+						Status:             metav1.ConditionFalse,
+						ObservedGeneration: betaMidWl.Generation,
+						Reason:             "QuotaReserved",
+						Message:            fmt.Sprintf("Previously: Preempted to accommodate a workload (UID: %s, JobUID: UNKNOWN) due to %s", alphaMidWl.UID, preemption.HumanReadablePreemptionReasons[kueue.InCohortReclamationReason]),
 					}, conditionCmpOpts))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
diff --git a/test/integration/singlecluster/scheduler/scheduler_test.go b/test/integration/singlecluster/scheduler/scheduler_test.go
index 521b58ff1..bbb8d41cb 100644
--- a/test/integration/singlecluster/scheduler/scheduler_test.go
+++ b/test/integration/singlecluster/scheduler/scheduler_test.go
@@ -258,7 +258,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, prodWl1, prodWl1Admission)
 			util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 1)
 
 			ginkgo.By("checking a second no-fit workload does not get admitted")
@@ -293,7 +293,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, emptyWl)
 				util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 1)
 				util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 2)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 2)
 				util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 2)
 			})
 
@@ -308,7 +308,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, devWl, spotUntaintedFlavorAdmission)
 			util.ExpectPendingWorkloadsMetric(devClusterQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(devClusterQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(devClusterQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(devClusterQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(devClusterQ, "", 1)
 
 			ginkgo.By("checking the second workload gets admitted when the first workload finishes")
@@ -317,7 +317,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, prodWl2, prodWl2Admission)
 			util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 3)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 3)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 3)
 		})
 
@@ -341,7 +341,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl1, wl1Admission)
 				util.ExpectPendingWorkloadsMetric(podsCountClusterQ, 0, 0)
 				util.ExpectReservingActiveWorkloadsMetric(podsCountClusterQ, 1)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountClusterQ, 1)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountClusterQ, "", 1)
 				util.ExpectAdmittedWorkloadsTotalMetric(podsCountClusterQ, "", 1)
 			})
 
@@ -369,7 +369,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadsToBePending(ctx, k8sClient, wl2)
 				util.ExpectPendingWorkloadsMetric(podsCountClusterQ, 0, 1)
 				util.ExpectReservingActiveWorkloadsMetric(podsCountClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountClusterQ, 2)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountClusterQ, "", 2)
 				util.ExpectAdmittedWorkloadsTotalMetric(podsCountClusterQ, "", 2)
 			})
 
@@ -381,7 +381,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, podsCountClusterQ.Name, wl2, wl3)
 				util.ExpectPendingWorkloadsMetric(podsCountClusterQ, 0, 0)
 				util.ExpectReservingActiveWorkloadsMetric(podsCountClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountClusterQ, 3)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountClusterQ, "", 3)
 				util.ExpectAdmittedWorkloadsTotalMetric(podsCountClusterQ, "", 3)
 			})
 		})
@@ -404,7 +404,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl1, wl1Admission)
 				util.ExpectPendingWorkloadsMetric(podsCountOnlyClusterQ, 0, 0)
 				util.ExpectReservingActiveWorkloadsMetric(podsCountOnlyClusterQ, 1)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountOnlyClusterQ, 1)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountOnlyClusterQ, "", 1)
 				util.ExpectAdmittedWorkloadsTotalMetric(podsCountOnlyClusterQ, "", 1)
 			})
 
@@ -430,7 +430,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadsToBePending(ctx, k8sClient, wl2)
 				util.ExpectPendingWorkloadsMetric(podsCountOnlyClusterQ, 0, 1)
 				util.ExpectReservingActiveWorkloadsMetric(podsCountOnlyClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountOnlyClusterQ, 2)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountOnlyClusterQ, "", 2)
 				util.ExpectAdmittedWorkloadsTotalMetric(podsCountOnlyClusterQ, "", 2)
 			})
 
@@ -442,7 +442,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, podsCountOnlyClusterQ.Name, wl2, wl3)
 				util.ExpectPendingWorkloadsMetric(podsCountOnlyClusterQ, 0, 0)
 				util.ExpectReservingActiveWorkloadsMetric(podsCountOnlyClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountOnlyClusterQ, 3)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(podsCountOnlyClusterQ, "", 3)
 				util.ExpectAdmittedWorkloadsTotalMetric(podsCountOnlyClusterQ, "", 3)
 			})
 		})
@@ -512,7 +512,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl1, wl1Admission)
 				util.ExpectPendingWorkloadsMetric(admissionCheckClusterQ, 0, 0)
 				util.ExpectReservingActiveWorkloadsMetric(admissionCheckClusterQ, 1)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(admissionCheckClusterQ, 1)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(admissionCheckClusterQ, "", 1)
 				util.ExpectAdmittedWorkloadsTotalMetric(admissionCheckClusterQ, "", 0)
 			})
 		})
@@ -551,7 +551,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 
 				util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 3)
 				util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 2)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 2)
 				util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 2)
 
 				ginkgo.By("after the high priority workloads finish, only the mid priority workloads should be admitted")
@@ -560,7 +560,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, wlMid1, wlMid2)
 				util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 1)
 				util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 4)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 4)
 				util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 4)
 			})
 		})
@@ -599,7 +599,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 
 				util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 3)
 				util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 2)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 2)
 				util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 2)
 
 				ginkgo.By("after the high priority workloads finish, only the mid priority workloads should be admitted")
@@ -608,7 +608,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, wlMid1, wlMid2)
 				util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 1)
 				util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 2)
-				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 4)
+				util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 4)
 				util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 4)
 			})
 		})
@@ -621,7 +621,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, bigWl)
 			util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 1)
 
 			smallWl1 := testing.MakeWorkload("small-wl-1", ns.Name).Queue(kueue.LocalQueueName(prodQueue.Name)).Request(corev1.ResourceCPU, "2.5").Obj()
@@ -640,7 +640,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, prodClusterQ.Name, smallWl1, smallWl2)
 			util.ExpectPendingWorkloadsMetric(prodClusterQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodClusterQ, 2)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, 3)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodClusterQ, "", 3)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodClusterQ, "", 3)
 		})
 
@@ -702,7 +702,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl1, expectWl1Admission)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 1)
 
 			ginkgo.By("Second big workload is pending")
@@ -711,7 +711,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToBePending(ctx, k8sClient, wl2)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 1)
 
 			ginkgo.By("Third small workload starts")
@@ -721,7 +721,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl3, expectWl3Admission)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 2)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 2)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 2)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 2)
 
 			ginkgo.By("Second big workload starts after the first one is deleted")
@@ -730,7 +730,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl2, expectWl2Admission)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 2)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 3)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 3)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 3)
 		})
 
@@ -754,7 +754,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl1, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(fooCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(fooCQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(fooCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(fooCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(fooCQ, "", 1)
 
 			ginkgo.By("Second big workload is pending")
@@ -763,7 +763,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToBePending(ctx, k8sClient, wl2)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 0)
 
 			ginkgo.By("Third small workload starts")
@@ -773,7 +773,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl3, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(fooCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(fooCQ, 2)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(fooCQ, 2)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(fooCQ, "", 2)
 			util.ExpectAdmittedWorkloadsTotalMetric(fooCQ, "", 2)
 
 			ginkgo.By("Second big workload starts after the first one is deleted")
@@ -782,7 +782,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl2, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 1)
 		})
 	})
@@ -812,7 +812,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToBePending(ctx, k8sClient, wl)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 0)
 			util.ExpectAdmissionAttemptsMetric(1, 0)
 
@@ -834,7 +834,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmissionAttemptsMetric(1, 1)
 		})
@@ -884,7 +884,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToBePending(ctx, k8sClient, wl1, wl2)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 2)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 0)
 
 			ginkgo.By("checking the first workload gets admitted after updating the namespace labels to match CQ selector")
@@ -892,7 +892,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			gomega.Expect(k8sClient.Update(ctx, ns)).Should(gomega.Succeed())
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, cq.Name, wl1)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 1)
 		})
@@ -926,7 +926,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToBeFrozen(ctx, k8sClient, fooCQ.Name, wl)
 			util.ExpectPendingWorkloadsMetric(fooCQ, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(fooCQ, 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(fooCQ, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(fooCQ, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(fooCQ, "", 0)
 
 			ginkgo.By("Creating foo flavor")
@@ -939,7 +939,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, fooCQ.Name, wl)
 			util.ExpectPendingWorkloadsMetric(fooCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(fooCQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(fooCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(fooCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(fooCQ, "", 1)
 		})
 	})
@@ -981,7 +981,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl1, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 1)
 
 			ginkgo.By("checking a second workload without toleration doesn't start")
@@ -990,7 +990,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToBePending(ctx, k8sClient, wl2)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 1)
 
 			ginkgo.By("checking a third workload with toleration starts")
@@ -1001,7 +1001,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl3, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 2)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 2)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 2)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 2)
 		})
 	})
@@ -1038,7 +1038,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			expectAdmission := testing.MakeAdmission(cq.Name).PodSets(testing.MakePodSetAssignment(kueue.DefaultPodSetName).Assignment(corev1.ResourceCPU, "spot-untainted", "1").Obj()).Obj()
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl1, expectAdmission)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 1)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 0)
 
@@ -1052,7 +1052,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl2, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(cq, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(cq, 2)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, 2)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(cq, "", 2)
 			util.ExpectAdmittedWorkloadsTotalMetric(cq, "", 2)
 		})
 	})
@@ -1145,7 +1145,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectPendingWorkloadsMetric(prodCQ, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 0)
 
 			ginkgo.By("checking the workload gets admitted when a fallback ClusterQueue gets added")
 			fallbackClusterQueue := testing.MakeClusterQueue("fallback-cq").
@@ -1163,7 +1163,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(prodCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 1)
 		})
 
@@ -1196,9 +1196,9 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectPendingWorkloadsMetric(devCQ, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 0)
 			util.ExpectReservingActiveWorkloadsMetric(devCQ, 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(devCQ, "", 0)
 
 			// Delay cluster queue creation to make sure workloads are in the same
@@ -1218,9 +1218,9 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectPendingWorkloadsMetric(devCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 1)
 			util.ExpectReservingActiveWorkloadsMetric(devCQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(devCQ, "", 1)
 		})
 
@@ -1307,7 +1307,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				testing.MakeAdmission(prodCQ.Name).PodSets(testing.MakePodSetAssignment(kueue.DefaultPodSetName).Assignment(corev1.ResourceCPU, "spot-untainted", "1").Obj()).Obj())
 			util.ExpectPendingWorkloadsMetric(prodCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 3)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 3)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 3)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 3)
 		})
 
@@ -1340,7 +1340,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl1, prodWl1Admission)
 			util.ExpectPendingWorkloadsMetric(prodCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 1)
 
 			ginkgo.By("Creating another workload")
@@ -1350,7 +1350,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl2, prodWl2Admission)
 			util.ExpectPendingWorkloadsMetric(devCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(devCQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(devCQ, "", 1)
 		})
 
@@ -1560,7 +1560,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadsToBePending(ctx, k8sClient, wl)
 			util.ExpectPendingWorkloadsMetric(prodCQ, 0, 1)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 0)
 
 			ginkgo.By("checking the workload gets admitted when another ClusterQueue gets added")
@@ -1578,7 +1578,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectWorkloadToBeAdmittedAs(ctx, k8sClient, wl, expectAdmission)
 			util.ExpectPendingWorkloadsMetric(prodCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 1)
 		})
 
@@ -1613,9 +1613,9 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectPendingWorkloadsMetric(devCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 1)
 			util.ExpectReservingActiveWorkloadsMetric(devCQ, 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 1)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 1)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 1)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(devCQ, "", 0)
 
 			// Update lending limit of cluster queue
@@ -1634,9 +1634,9 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			util.ExpectPendingWorkloadsMetric(devCQ, 0, 0)
 			util.ExpectReservingActiveWorkloadsMetric(prodCQ, 2)
 			util.ExpectReservingActiveWorkloadsMetric(devCQ, 0)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, 2)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(prodCQ, "", 2)
 			util.ExpectAdmittedWorkloadsTotalMetric(prodCQ, "", 2)
-			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, 0)
+			util.ExpectQuotaReservedWorkloadsTotalMetric(devCQ, "", 0)
 			util.ExpectAdmittedWorkloadsTotalMetric(devCQ, "", 0)
 		})
 	})
@@ -1971,8 +1971,8 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
 			util.ExpectClusterQueueStatusMetric(cq, metrics.CQStatusPending)
-			util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, kueue.WorkloadEvictedByClusterQueueStopped, "", 1)
-			util.ExpectEvictedWorkloadsOnceTotalMetric(cq.Name, kueue.WorkloadEvictedByClusterQueueStopped, "", 1)
+			util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, kueue.WorkloadEvictedByClusterQueueStopped, "", "", 1)
+			util.ExpectEvictedWorkloadsOnceTotalMetric(cq.Name, kueue.WorkloadEvictedByClusterQueueStopped, "", "", 1)
 
 			ginkgo.By("Checking the condition of workload is evicted", func() {
 				createdWl := kueue.Workload{}
@@ -2071,8 +2071,8 @@ var _ = ginkgo.Describe("Scheduler", func() {
 				g.Expect(k8sClient.Update(ctx, createdLq)).Should(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
-			util.ExpectEvictedWorkloadsTotalMetric(cq.Name, kueue.WorkloadEvictedByLocalQueueStopped, "", 1)
-			util.ExpectEvictedWorkloadsOnceTotalMetric(cq.Name, kueue.WorkloadEvictedByLocalQueueStopped, "", 1)
+			util.ExpectEvictedWorkloadsTotalMetric(cq.Name, kueue.WorkloadEvictedByLocalQueueStopped, "", "", 1)
+			util.ExpectEvictedWorkloadsOnceTotalMetric(cq.Name, kueue.WorkloadEvictedByLocalQueueStopped, "", "", 1)
 
 			createdWl := kueue.Workload{}
 			ginkgo.By("Checking the condition of workload is evicted")
diff --git a/test/integration/singlecluster/tas/tas_test.go b/test/integration/singlecluster/tas/tas_test.go
index dad5f7dbc..ee944814e 100644
--- a/test/integration/singlecluster/tas/tas_test.go
+++ b/test/integration/singlecluster/tas/tas_test.go
@@ -34,7 +34,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/admissionchecks/provisioning"
 	"sigs.k8s.io/kueue/pkg/controller/tas"
@@ -75,7 +74,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 	ginkgo.When("Delete Topology", func() {
 		var (
 			tasFlavor    *kueue.ResourceFlavor
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			clusterQueue *kueue.ClusterQueue
 		)
 
@@ -122,7 +121,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 					util.ExpectClusterQueuesToBeActive(ctx, k8sClient, clusterQueue)
 				})
 
-				createdTopology := &kueuealpha.Topology{}
+				createdTopology := &kueue.Topology{}
 
 				ginkgo.By("check topology has finalizer", func() {
 					gomega.Eventually(func(g gomega.Gomega) {
@@ -217,7 +216,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 
 	ginkgo.When("Negative scenarios for ClusterQueue configuration", func() {
 		var (
-			topology       *kueuealpha.Topology
+			topology       *kueue.Topology
 			tasFlavor      *kueue.ResourceFlavor
 			clusterQueue   *kueue.ClusterQueue
 			admissionCheck *kueue.AdmissionCheck
@@ -269,7 +268,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 	ginkgo.When("Single TAS Resource Flavor", func() {
 		var (
 			tasFlavor    *kueue.ResourceFlavor
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			localQueue   *kueue.LocalQueue
 			clusterQueue *kueue.ClusterQueue
 		)
@@ -601,7 +600,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 			})
 
 			ginkgo.It("should not admit the workload after the topology is deleted but should admit it after the topology is created", func() {
-				var updatedTopology kueuealpha.Topology
+				var updatedTopology kueue.Topology
 
 				ginkgo.By("wait for the finalizer to be added to the topology", func() {
 					gomega.Eventually(func(g gomega.Gomega) {
@@ -1481,7 +1480,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 
 				ginkgo.By("verify the workload is evicted due to no replacement possible", func() {
 					util.FinishEvictionForWorkloads(ctx, k8sClient, wl1)
-					util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, kueue.WorkloadEvictedDueToNodeFailures, "", 1)
+					util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, kueue.WorkloadEvictedDueToNodeFailures, "", "", 1)
 					gomega.Eventually(func(g gomega.Gomega) {
 						updatedWl := &kueue.Workload{}
 						g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), updatedWl)).To(gomega.Succeed())
@@ -2081,7 +2080,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 				wlKey := client.ObjectKeyFromObject(wl1)
 
 				ginkgo.By("verify the workload reserves the quota", func() {
-					util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, 1)
+					util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, "", 1)
 					util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 1)
 					util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, clusterQueue.Name, wl1)
 					gomega.Eventually(func(g gomega.Gomega) {
@@ -2211,7 +2210,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 				wlKey := client.ObjectKeyFromObject(wl1)
 
 				ginkgo.By("verify the workload reserves the quota", func() {
-					util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, 1)
+					util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, "", 1)
 					util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 1)
 					util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, clusterQueue.Name, wl1)
 					gomega.Eventually(func(g gomega.Gomega) {
@@ -2326,7 +2325,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 				wlKey := client.ObjectKeyFromObject(wl1)
 
 				ginkgo.By("verify the workload reserves the quota", func() {
-					util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, 1)
+					util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, "", 1)
 					util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 1)
 					util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, clusterQueue.Name, wl1)
 					gomega.Eventually(func(g gomega.Gomega) {
@@ -2474,7 +2473,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 				wlKey := client.ObjectKeyFromObject(wl1)
 
 				ginkgo.By("verify the workload reserves the quota", func() {
-					util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, 1)
+					util.ExpectQuotaReservedWorkloadsTotalMetric(clusterQueue, "", 1)
 					util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 1)
 				})
 
@@ -2569,7 +2568,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 		var (
 			tasGPUFlavor *kueue.ResourceFlavor
 			tasCPUFlavor *kueue.ResourceFlavor
-			topology     *kueuealpha.Topology
+			topology     *kueue.Topology
 			localQueue   *kueue.LocalQueue
 			clusterQueue *kueue.ClusterQueue
 		)
@@ -2883,7 +2882,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 		ginkgo.Context("With Topology-Aware Scheduling", func() {
 			var (
 				tasFlavor    *kueue.ResourceFlavor
-				topology     *kueuealpha.Topology
+				topology     *kueue.Topology
 				localQueue   *kueue.LocalQueue
 				clusterQueue *kueue.ClusterQueue
 			)
@@ -3018,7 +3017,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 			ginkgo.Context("Multiple pods in 1 workload TAS scenario", func() {
 				var (
 					tasFlavor    *kueue.ResourceFlavor
-					topology     *kueuealpha.Topology
+					topology     *kueue.Topology
 					localQueue   *kueue.LocalQueue
 					clusterQueue *kueue.ClusterQueue
 				)
@@ -3203,7 +3202,7 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 
 var _ = ginkgo.Describe("Topology validations", func() {
 	ginkgo.When("Creating a Topology", func() {
-		ginkgo.DescribeTable("Validate Topology on creation", func(topology *kueuealpha.Topology, matcher types.GomegaMatcher) {
+		ginkgo.DescribeTable("Validate Topology on creation", func(topology *kueue.Topology, matcher types.GomegaMatcher) {
 			err := k8sClient.Create(ctx, topology)
 			if err == nil {
 				defer func() {
@@ -3237,7 +3236,7 @@ var _ = ginkgo.Describe("Topology validations", func() {
 	})
 
 	ginkgo.When("Updating a Topology", func() {
-		ginkgo.DescribeTable("Validate Topology on update", func(topology *kueuealpha.Topology, updateTopology func(topology *kueuealpha.Topology), matcher types.GomegaMatcher) {
+		ginkgo.DescribeTable("Validate Topology on update", func(topology *kueue.Topology, updateTopology func(topology *kueue.Topology), matcher types.GomegaMatcher) {
 			util.MustCreate(ctx, k8sClient, topology)
 			defer func() {
 				util.ExpectObjectToBeDeleted(ctx, k8sClient, topology, true)
@@ -3248,7 +3247,7 @@ var _ = ginkgo.Describe("Topology validations", func() {
 		},
 			ginkgo.Entry("succeed to update topology",
 				testing.MakeDefaultOneLevelTopology("valid"),
-				func(topology *kueuealpha.Topology) {
+				func(topology *kueue.Topology) {
 					topology.Labels = map[string]string{
 						"alpha": "beta",
 					}
@@ -3256,15 +3255,15 @@ var _ = ginkgo.Describe("Topology validations", func() {
 				gomega.Succeed()),
 			ginkgo.Entry("updating levels is prohibited",
 				testing.MakeDefaultOneLevelTopology("valid"),
-				func(topology *kueuealpha.Topology) {
-					topology.Spec.Levels = append(topology.Spec.Levels, kueuealpha.TopologyLevel{
+				func(topology *kueue.Topology) {
+					topology.Spec.Levels = append(topology.Spec.Levels, kueue.TopologyLevel{
 						NodeLabel: "added",
 					})
 				},
 				testing.BeInvalidError()),
 			ginkgo.Entry("updating levels order is prohibited",
 				testing.MakeDefaultThreeLevelTopology("default"),
-				func(topology *kueuealpha.Topology) {
+				func(topology *kueue.Topology) {
 					topology.Spec.Levels[0], topology.Spec.Levels[1] = topology.Spec.Levels[1], topology.Spec.Levels[0]
 				},
 				testing.BeInvalidError()),
diff --git a/test/integration/singlecluster/webhook/core/workload_test.go b/test/integration/singlecluster/webhook/core/workload_test.go
index 0f0d4c7c7..c2f2ae2e5 100644
--- a/test/integration/singlecluster/webhook/core/workload_test.go
+++ b/test/integration/singlecluster/webhook/core/workload_test.go
@@ -807,23 +807,21 @@ var _ = ginkgo.Describe("Workload validating webhook", ginkgo.Ordered, func() {
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 		})
 
-		ginkgo.It("Should forbid the change of spec.admission", func() {
+		ginkgo.It("Should forbid the change of status.admission", func() {
 			ginkgo.By("Creating a new Workload")
 			workload := testing.MakeWorkload(workloadName, ns.Name).Obj()
 			util.MustCreate(ctx, k8sClient, workload)
 
-			ginkgo.By("Admitting the Workload")
-			gomega.Eventually(func(g gomega.Gomega) {
-				var newWL kueue.Workload
-				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(workload), &newWL)).To(gomega.Succeed())
-				newWL.Status.Admission = testing.MakeAdmission("cluster-queue").Obj()
-				g.Expect(k8sClient.Status().Update(ctx, &newWL)).Should(gomega.Succeed())
-			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			ginkgo.By("Admitting the Workload", func() {
+				util.SetQuotaReservation(ctx, k8sClient, client.ObjectKeyFromObject(workload), testing.MakeAdmission("cluster-queue").Obj())
+				util.SyncAdmittedConditionForWorkloads(ctx, k8sClient, workload)
+			})
 
 			ginkgo.By("Updating queueName")
 			gomega.Eventually(func(g gomega.Gomega) {
 				var newWL kueue.Workload
 				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(workload), &newWL)).To(gomega.Succeed())
+				g.Expect(newWL.Status.Admission).NotTo(gomega.BeNil())
 				newWL.Status.Admission.ClusterQueue = "foo-cluster-queue"
 				g.Expect(k8sClient.Status().Update(ctx, &newWL)).Should(testing.BeForbiddenError())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
diff --git a/test/integration/singlecluster/webhook/jobs/jobset_webhook_test.go b/test/integration/singlecluster/webhook/jobs/jobset_webhook_test.go
index 52a1bcf13..9a419d2e0 100644
--- a/test/integration/singlecluster/webhook/jobs/jobset_webhook_test.go
+++ b/test/integration/singlecluster/webhook/jobs/jobset_webhook_test.go
@@ -21,7 +21,7 @@ import (
 	"github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/jobset"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/test/integration/singlecluster/webhook/jobs/paddlejob_webhook_test.go b/test/integration/singlecluster/webhook/jobs/paddlejob_webhook_test.go
index 535582648..5deb49426 100644
--- a/test/integration/singlecluster/webhook/jobs/paddlejob_webhook_test.go
+++ b/test/integration/singlecluster/webhook/jobs/paddlejob_webhook_test.go
@@ -22,7 +22,7 @@ import (
 	"github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/paddlejob"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/test/integration/singlecluster/webhook/jobs/pytorchjob_webhook_test.go b/test/integration/singlecluster/webhook/jobs/pytorchjob_webhook_test.go
index 07c57bc90..e60d64ff8 100644
--- a/test/integration/singlecluster/webhook/jobs/pytorchjob_webhook_test.go
+++ b/test/integration/singlecluster/webhook/jobs/pytorchjob_webhook_test.go
@@ -22,7 +22,7 @@ import (
 	"github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/pytorchjob"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/test/integration/singlecluster/webhook/jobs/tfjob_webhook_test.go b/test/integration/singlecluster/webhook/jobs/tfjob_webhook_test.go
index 10166f4a1..6a7facb69 100644
--- a/test/integration/singlecluster/webhook/jobs/tfjob_webhook_test.go
+++ b/test/integration/singlecluster/webhook/jobs/tfjob_webhook_test.go
@@ -22,7 +22,7 @@ import (
 	"github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/tfjob"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/test/integration/singlecluster/webhook/jobs/xgboostjob_webhook_test.go b/test/integration/singlecluster/webhook/jobs/xgboostjob_webhook_test.go
index 18cfddf61..42a7455f6 100644
--- a/test/integration/singlecluster/webhook/jobs/xgboostjob_webhook_test.go
+++ b/test/integration/singlecluster/webhook/jobs/xgboostjob_webhook_test.go
@@ -22,7 +22,7 @@ import (
 	"github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/kubeflow/jobs/xgboostjob"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/test/util/e2e.go b/test/util/e2e.go
index e3ffac216..5a03dfd45 100644
--- a/test/util/e2e.go
+++ b/test/util/e2e.go
@@ -50,7 +50,6 @@ import (
 	"sigs.k8s.io/yaml"
 
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
 	kueueclientset "sigs.k8s.io/kueue/client-go/clientset/versioned"
@@ -143,7 +142,7 @@ func CreateClientUsingCluster(kContext string) (client.WithWatch, *rest.Config,
 	err = cmv1.AddToScheme(scheme.Scheme)
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 
-	err = kueuealpha.AddToScheme(scheme.Scheme)
+	err = kueue.AddToScheme(scheme.Scheme)
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 
 	err = visibility.AddToScheme(scheme.Scheme)
diff --git a/test/util/util.go b/test/util/util.go
index 011e8b5dd..04dc61fee 100644
--- a/test/util/util.go
+++ b/test/util/util.go
@@ -573,8 +573,17 @@ func ExpectAdmittedWorkloadsTotalMetric(cq *kueue.ClusterQueue, workloadPriority
 	expectCounterMetric(metric, v)
 }
 
-func ExpectEvictedWorkloadsTotalMetric(cqName, reason, underlyingCause string, v int) {
-	metric := metrics.EvictedWorkloadsTotal.WithLabelValues(cqName, reason, underlyingCause)
+func ExpectAdmissionWaitTimeMetric(cq *kueue.ClusterQueue, workloadPriorityClass string, count int) {
+	gomega.EventuallyWithOffset(1, func(g gomega.Gomega) {
+		metric := metrics.AdmissionWaitTime.WithLabelValues(cq.Name, workloadPriorityClass)
+		v, err := testutil.GetHistogramMetricCount(metric)
+		g.Expect(err).ToNot(gomega.HaveOccurred())
+		g.Expect(int(v)).Should(gomega.Equal(count))
+	}, Timeout, Interval).Should(gomega.Succeed())
+}
+
+func ExpectEvictedWorkloadsTotalMetric(cqName, reason, underlyingCause, workloadPriorityClass string, v int) {
+	metric := metrics.EvictedWorkloadsTotal.WithLabelValues(cqName, reason, underlyingCause, workloadPriorityClass)
 	expectCounterMetric(metric, v)
 }
 
@@ -583,8 +592,8 @@ func ExpectPodsReadyToEvictedTimeSeconds(cqName, reason, underlyingCause string,
 	expectHistogramMetric(metric, cqName, reason, underlyingCause, v)
 }
 
-func ExpectEvictedWorkloadsOnceTotalMetric(cqName string, reason, underlyingCause string, v int) {
-	metric := metrics.EvictedWorkloadsOnceTotal.WithLabelValues(cqName, reason, underlyingCause)
+func ExpectEvictedWorkloadsOnceTotalMetric(cqName string, reason, underlyingCause, workloadPriorityClass string, v int) {
+	metric := metrics.EvictedWorkloadsOnceTotal.WithLabelValues(cqName, reason, underlyingCause, workloadPriorityClass)
 	expectCounterMetric(metric, v)
 }
 
@@ -593,8 +602,8 @@ func ExpectPreemptedWorkloadsTotalMetric(preemptorCqName, reason string, v int)
 	expectCounterMetric(metric, v)
 }
 
-func ExpectQuotaReservedWorkloadsTotalMetric(cq *kueue.ClusterQueue, v int) {
-	metric := metrics.QuotaReservedWorkloadsTotal.WithLabelValues(cq.Name)
+func ExpectQuotaReservedWorkloadsTotalMetric(cq *kueue.ClusterQueue, workloadPriorityClass string, v int) {
+	metric := metrics.QuotaReservedWorkloadsTotal.WithLabelValues(cq.Name, workloadPriorityClass)
 	expectCounterMetric(metric, v)
 }