Repository: kubernetes-sigs/kueue

Issue:
The workload is not admitted if queue-name is set while manageJobsWithoutQueueName is enabled
<!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks!

If the matter is security related, please disclose it privately via https://kubernetes.io/security/
-->


**What happened**:

The workload is not admitted if queue-name is set while manageJobsWithoutQueueName is enabled.

This happens because we are setting labels and annotation only when queue-name is available:

https://github.com/kubernetes-sigs/kueue/blob/f23be17d69a548e5c279140edb6fc26e0d7d6ab0/pkg/controller/jobs/statefulset/statefulset_webhook.go#L88-L95

**What you expected to happen**:

The workload was admitted and the pods are running successfully.

**How to reproduce it (as minimally and precisely as possible)**:

1. Install Kueue with manageJobsWithoutQueueName=true, "pod" enabled and "statefulset" enabled.
2. Apply https://github.com/kubernetes-sigs/kueue/blob/f23be17d69a548e5c279140edb6fc26e0d7d6ab0/site/static/examples/admin/single-clusterqueue-setup.yaml.
3. Create StatefulSet without queue-name:

```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: registry.k8s.io/nginx-slim:0.27
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "100m"
  serviceName: "nginx"
```

It creates a workload for a single pod instead of the StatefulSet pod group:
```
kubectl get wl   
NAME                            QUEUE   RESERVED IN   ADMITTED   FINISHED   AGE
pod-nginx-statefulset-0-7b2bd                                               82s

kubectl get pods            
NAME                  READY   STATUS            RESTARTS   AGE
nginx-statefulset-0   0/1     SchedulingGated   0          70s
```

4. Apply StatefulSet with queue-name:

```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  labels:
    app: nginx
    kueue.x-k8s.io/queue-name: user-queue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: registry.k8s.io/nginx-slim:0.27
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "100m"
  serviceName: "nginx"
```

The workload is still not admitted:
```
kubectl get wl                                               
NAME                            QUEUE   RESERVED IN   ADMITTED   FINISHED   AGE
pod-nginx-statefulset-0-7b2bd                                               116s

kubectl get pods                                                   
NAME                  READY   STATUS            RESTARTS   AGE
nginx-statefulset-0   0/1     SchedulingGated   0          2m31s

```

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

**Environment**:
- Kubernetes version (use `kubectl version`):  1.32.3
- Kueue version (use `git describe --tags --dirty --always`): main branch
- Cloud provider or hardware configuration:
- OS (e.g: `cat /etc/os-release`):
- Kernel (e.g. `uname -a`):
- Install tools:
- Others:

Hints from issue comments:
@mbobrovskyi: /assign

Solution patch:
diff --git a/README.md b/README.md
index 920c6ac80..10f1e732e 100644
--- a/README.md
+++ b/README.md
@@ -3,8 +3,8 @@
 [![GoReport Widget]][GoReport Status]
 [![Latest Release](https://img.shields.io/github/v/release/kubernetes-sigs/kueue?include_prereleases)](https://github.com/kubernetes-sigs/kueue/releases/latest)
 
-[GoReport Widget]: https://goreportcard.com/badge/github.com/kubernetes-sigs/kueue
-[GoReport Status]: https://goreportcard.com/report/github.com/kubernetes-sigs/kueue
+[GoReport Widget]: https://goreportcard.com/badge/sigs.k8s.io/kueue
+[GoReport Status]: https://goreportcard.com/report/sigs.k8s.io/kueue
 
 <img src="https://github.com/kubernetes-sigs/kueue/blob/main/site/static/images/logo.svg" width="100" alt="kueue logo">
 
diff --git a/apis/kueue/v1alpha1/zz_generated.deepcopy.go b/apis/kueue/v1alpha1/zz_generated.deepcopy.go
index a44e38a74..0cef26ec5 100644
--- a/apis/kueue/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/kueue/v1alpha1/zz_generated.deepcopy.go
@@ -22,115 +22,8 @@ package v1alpha1
 
 import (
 	runtime "k8s.io/apimachinery/pkg/runtime"
-	"sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Cohort) DeepCopyInto(out *Cohort) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	in.Spec.DeepCopyInto(&out.Spec)
-	in.Status.DeepCopyInto(&out.Status)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Cohort.
-func (in *Cohort) DeepCopy() *Cohort {
-	if in == nil {
-		return nil
-	}
-	out := new(Cohort)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Cohort) 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 *CohortList) DeepCopyInto(out *CohortList) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ListMeta.DeepCopyInto(&out.ListMeta)
-	if in.Items != nil {
-		in, out := &in.Items, &out.Items
-		*out = make([]Cohort, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CohortList.
-func (in *CohortList) DeepCopy() *CohortList {
-	if in == nil {
-		return nil
-	}
-	out := new(CohortList)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *CohortList) 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 *CohortSpec) DeepCopyInto(out *CohortSpec) {
-	*out = *in
-	if in.ResourceGroups != nil {
-		in, out := &in.ResourceGroups, &out.ResourceGroups
-		*out = make([]v1beta1.ResourceGroup, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	if in.FairSharing != nil {
-		in, out := &in.FairSharing, &out.FairSharing
-		*out = new(v1beta1.FairSharing)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CohortSpec.
-func (in *CohortSpec) DeepCopy() *CohortSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(CohortSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *CohortStatus) DeepCopyInto(out *CohortStatus) {
-	*out = *in
-	if in.FairSharing != nil {
-		in, out := &in.FairSharing, &out.FairSharing
-		*out = new(v1beta1.FairSharingStatus)
-		(*in).DeepCopyInto(*out)
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CohortStatus.
-func (in *CohortStatus) DeepCopy() *CohortStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(CohortStatus)
-	in.DeepCopyInto(out)
-	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
diff --git a/apis/kueue/v1alpha1/cohort_types.go b/apis/kueue/v1beta1/cohort_types.go
similarity index 84%
rename from apis/kueue/v1alpha1/cohort_types.go
rename to apis/kueue/v1beta1/cohort_types.go
index 6a614341e..dee2fee5a 100644
--- a/apis/kueue/v1alpha1/cohort_types.go
+++ b/apis/kueue/v1beta1/cohort_types.go
@@ -14,17 +14,15 @@ 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"
-
-	kueuebeta "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
 // CohortSpec defines the desired state of Cohort
 type CohortSpec struct {
-	// Parent references the name of the Cohort's parent, if
+	// ParentName references the name of the Cohort's parent, if
 	// any. It satisfies one of three cases:
 	// 1) Unset. This Cohort is the root of its Cohort tree.
 	// 2) References a non-existent Cohort. We use default Cohort (no borrowing/lending limits).
@@ -34,7 +32,7 @@ type CohortSpec struct {
 	// Cohort, including ClusterQueues, until the cycle is
 	// removed.  We prevent further admission while the cycle
 	// exists.
-	Parent kueuebeta.CohortReference `json:"parent,omitempty"`
+	ParentName CohortReference `json:"parentName,omitempty"`
 
 	// ResourceGroups describes groupings of Resources and
 	// Flavors.  Each ResourceGroup defines a list of Resources
@@ -55,13 +53,13 @@ type CohortSpec struct {
 	//
 	//+listType=atomic
 	//+kubebuilder:validation:MaxItems=16
-	ResourceGroups []kueuebeta.ResourceGroup `json:"resourceGroups,omitempty"`
+	ResourceGroups []ResourceGroup `json:"resourceGroups,omitempty"`
 
 	// fairSharing defines the properties of the Cohort when
 	// participating in FairSharing. The values are only relevant
 	// if FairSharing is enabled in the Kueue configuration.
 	// +optional
-	FairSharing *kueuebeta.FairSharing `json:"fairSharing,omitempty"`
+	FairSharing *FairSharing `json:"fairSharing,omitempty"`
 }
 
 // CohortStatus defines the observed state of Cohort.
@@ -70,13 +68,14 @@ type CohortStatus struct {
 	// when participating in Fair Sharing.
 	// The is recorded only when Fair Sharing is enabled in the Kueue configuration.
 	// +optional
-	FairSharing *kueuebeta.FairSharingStatus `json:"fairSharing,omitempty"`
+	FairSharing *FairSharingStatus `json:"fairSharing,omitempty"`
 }
 
-//+genclient
-//+kubebuilder:object:root=true
-//+kubebuilder:resource:scope=Cluster
-//+kubebuilder:subresource:status
+// +genclient
+// +kubebuilder:object:root=true
+// +kubebuilder:storageversion
+// +kubebuilder:resource:scope=Cluster
+// +kubebuilder:subresource:status
 
 // Cohort defines the Cohorts API.
 //
@@ -91,7 +90,7 @@ type Cohort struct {
 	Status CohortStatus `json:"status,omitempty"`
 }
 
-//+kubebuilder:object:root=true
+// +kubebuilder:object:root=true
 
 // CohortList contains a list of Cohort
 type CohortList struct {
diff --git a/apis/kueue/v1beta1/zz_generated.deepcopy.go b/apis/kueue/v1beta1/zz_generated.deepcopy.go
index 78890789a..1575413f5 100644
--- a/apis/kueue/v1beta1/zz_generated.deepcopy.go
+++ b/apis/kueue/v1beta1/zz_generated.deepcopy.go
@@ -515,6 +515,112 @@ func (in *ClusterQueueStatus) DeepCopy() *ClusterQueueStatus {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Cohort) DeepCopyInto(out *Cohort) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Cohort.
+func (in *Cohort) DeepCopy() *Cohort {
+	if in == nil {
+		return nil
+	}
+	out := new(Cohort)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Cohort) 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 *CohortList) DeepCopyInto(out *CohortList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Cohort, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CohortList.
+func (in *CohortList) DeepCopy() *CohortList {
+	if in == nil {
+		return nil
+	}
+	out := new(CohortList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *CohortList) 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 *CohortSpec) DeepCopyInto(out *CohortSpec) {
+	*out = *in
+	if in.ResourceGroups != nil {
+		in, out := &in.ResourceGroups, &out.ResourceGroups
+		*out = make([]ResourceGroup, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.FairSharing != nil {
+		in, out := &in.FairSharing, &out.FairSharing
+		*out = new(FairSharing)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CohortSpec.
+func (in *CohortSpec) DeepCopy() *CohortSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(CohortSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CohortStatus) DeepCopyInto(out *CohortStatus) {
+	*out = *in
+	if in.FairSharing != nil {
+		in, out := &in.FairSharing, &out.FairSharing
+		*out = new(FairSharingStatus)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CohortStatus.
+func (in *CohortStatus) DeepCopy() *CohortStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(CohortStatus)
+	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
diff --git a/charts/kueue/templates/crd/kueue.x-k8s.io_cohorts.yaml b/charts/kueue/templates/crd/kueue.x-k8s.io_cohorts.yaml
index e85c6c619..d01510e25 100644
--- a/charts/kueue/templates/crd/kueue.x-k8s.io_cohorts.yaml
+++ b/charts/kueue/templates/crd/kueue.x-k8s.io_cohorts.yaml
@@ -28,7 +28,7 @@ spec:
     singular: cohort
   scope: Cluster
   versions:
-    - name: v1alpha1
+    - name: v1beta1
       schema:
         openAPIV3Schema:
           description: |-
@@ -83,9 +83,9 @@ spec:
                       pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                       x-kubernetes-int-or-string: true
                   type: object
-                parent:
+                parentName:
                   description: |-
-                    Parent references the name of the Cohort's parent, if
+                    ParentName references the name of the Cohort's parent, if
                     any. It satisfies one of three cases:
                     1) Unset. This Cohort is the root of its Cohort tree.
                     2) References a non-existent Cohort. We use default Cohort (no borrowing/lending limits).
diff --git a/charts/kueue/templates/webhook/manifests.yaml b/charts/kueue/templates/webhook/manifests.yaml
index 62c98dd10..6907bf966 100644
--- a/charts/kueue/templates/webhook/manifests.yaml
+++ b/charts/kueue/templates/webhook/manifests.yaml
@@ -900,14 +900,14 @@ webhooks:
       service:
         name: '{{ include "kueue.fullname" . }}-webhook-service'
         namespace: '{{ .Release.Namespace }}'
-        path: /validate-kueue-x-k8s-io-v1alpha1-cohort
+        path: /validate-kueue-x-k8s-io-v1beta1-cohort
     failurePolicy: Fail
     name: vcohort.kb.io
     rules:
       - apiGroups:
           - kueue.x-k8s.io
         apiVersions:
-          - v1alpha1
+          - v1beta1
         operations:
           - CREATE
           - UPDATE
diff --git a/client-go/applyconfiguration/kueue/v1alpha1/cohort.go b/client-go/applyconfiguration/kueue/v1beta1/cohort.go
similarity index 99%
rename from client-go/applyconfiguration/kueue/v1alpha1/cohort.go
rename to client-go/applyconfiguration/kueue/v1beta1/cohort.go
index 69ab523ef..be8d7e166 100644
--- a/client-go/applyconfiguration/kueue/v1alpha1/cohort.go
+++ b/client-go/applyconfiguration/kueue/v1beta1/cohort.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"
@@ -39,7 +39,7 @@ func Cohort(name, namespace string) *CohortApplyConfiguration {
 	b.WithName(name)
 	b.WithNamespace(namespace)
 	b.WithKind("Cohort")
-	b.WithAPIVersion("kueue.x-k8s.io/v1alpha1")
+	b.WithAPIVersion("kueue.x-k8s.io/v1beta1")
 	return b
 }
 
diff --git a/client-go/applyconfiguration/kueue/v1alpha1/cohortspec.go b/client-go/applyconfiguration/kueue/v1beta1/cohortspec.go
similarity index 67%
rename from client-go/applyconfiguration/kueue/v1alpha1/cohortspec.go
rename to client-go/applyconfiguration/kueue/v1beta1/cohortspec.go
index 3320d7d9f..12556adab 100644
--- a/client-go/applyconfiguration/kueue/v1alpha1/cohortspec.go
+++ b/client-go/applyconfiguration/kueue/v1beta1/cohortspec.go
@@ -15,19 +15,18 @@ limitations under the License.
 */
 // Code generated by applyconfiguration-gen. DO NOT EDIT.
 
-package v1alpha1
+package v1beta1
 
 import (
-	v1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
-	kueuev1beta1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1beta1"
+	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
 // CohortSpecApplyConfiguration represents a declarative configuration of the CohortSpec type for use
 // with apply.
 type CohortSpecApplyConfiguration struct {
-	Parent         *v1beta1.CohortReference                       `json:"parent,omitempty"`
-	ResourceGroups []kueuev1beta1.ResourceGroupApplyConfiguration `json:"resourceGroups,omitempty"`
-	FairSharing    *kueuev1beta1.FairSharingApplyConfiguration    `json:"fairSharing,omitempty"`
+	ParentName     *kueuev1beta1.CohortReference     `json:"parentName,omitempty"`
+	ResourceGroups []ResourceGroupApplyConfiguration `json:"resourceGroups,omitempty"`
+	FairSharing    *FairSharingApplyConfiguration    `json:"fairSharing,omitempty"`
 }
 
 // CohortSpecApplyConfiguration constructs a declarative configuration of the CohortSpec type for use with
@@ -36,18 +35,18 @@ func CohortSpec() *CohortSpecApplyConfiguration {
 	return &CohortSpecApplyConfiguration{}
 }
 
-// WithParent sets the Parent field in the declarative configuration to the given value
+// WithParentName sets the ParentName field in the declarative configuration to the given value
 // and returns the receiver, so that objects can be built by chaining "With" function invocations.
-// If called multiple times, the Parent field is set to the value of the last call.
-func (b *CohortSpecApplyConfiguration) WithParent(value v1beta1.CohortReference) *CohortSpecApplyConfiguration {
-	b.Parent = &value
+// If called multiple times, the ParentName field is set to the value of the last call.
+func (b *CohortSpecApplyConfiguration) WithParentName(value kueuev1beta1.CohortReference) *CohortSpecApplyConfiguration {
+	b.ParentName = &value
 	return b
 }
 
 // WithResourceGroups adds the given value to the ResourceGroups field in the declarative configuration
 // and returns the receiver, so that objects can be build by chaining "With" function invocations.
 // If called multiple times, values provided by each call will be appended to the ResourceGroups field.
-func (b *CohortSpecApplyConfiguration) WithResourceGroups(values ...*kueuev1beta1.ResourceGroupApplyConfiguration) *CohortSpecApplyConfiguration {
+func (b *CohortSpecApplyConfiguration) WithResourceGroups(values ...*ResourceGroupApplyConfiguration) *CohortSpecApplyConfiguration {
 	for i := range values {
 		if values[i] == nil {
 			panic("nil value passed to WithResourceGroups")
@@ -60,7 +59,7 @@ func (b *CohortSpecApplyConfiguration) WithResourceGroups(values ...*kueuev1beta
 // WithFairSharing sets the FairSharing field in the declarative configuration to the given value
 // and returns the receiver, so that objects can be built by chaining "With" function invocations.
 // If called multiple times, the FairSharing field is set to the value of the last call.
-func (b *CohortSpecApplyConfiguration) WithFairSharing(value *kueuev1beta1.FairSharingApplyConfiguration) *CohortSpecApplyConfiguration {
+func (b *CohortSpecApplyConfiguration) WithFairSharing(value *FairSharingApplyConfiguration) *CohortSpecApplyConfiguration {
 	b.FairSharing = value
 	return b
 }
diff --git a/client-go/applyconfiguration/kueue/v1alpha1/cohortstatus.go b/client-go/applyconfiguration/kueue/v1beta1/cohortstatus.go
similarity index 83%
rename from client-go/applyconfiguration/kueue/v1alpha1/cohortstatus.go
rename to client-go/applyconfiguration/kueue/v1beta1/cohortstatus.go
index 875f84f08..216dcbda4 100644
--- a/client-go/applyconfiguration/kueue/v1alpha1/cohortstatus.go
+++ b/client-go/applyconfiguration/kueue/v1beta1/cohortstatus.go
@@ -15,16 +15,12 @@ limitations under the License.
 */
 // Code generated by applyconfiguration-gen. DO NOT EDIT.
 
-package v1alpha1
-
-import (
-	v1beta1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1beta1"
-)
+package v1beta1
 
 // CohortStatusApplyConfiguration represents a declarative configuration of the CohortStatus type for use
 // with apply.
 type CohortStatusApplyConfiguration struct {
-	FairSharing *v1beta1.FairSharingStatusApplyConfiguration `json:"fairSharing,omitempty"`
+	FairSharing *FairSharingStatusApplyConfiguration `json:"fairSharing,omitempty"`
 }
 
 // CohortStatusApplyConfiguration constructs a declarative configuration of the CohortStatus type for use with
@@ -36,7 +32,7 @@ func CohortStatus() *CohortStatusApplyConfiguration {
 // WithFairSharing sets the FairSharing field in the declarative configuration to the given value
 // and returns the receiver, so that objects can be built by chaining "With" function invocations.
 // If called multiple times, the FairSharing field is set to the value of the last call.
-func (b *CohortStatusApplyConfiguration) WithFairSharing(value *v1beta1.FairSharingStatusApplyConfiguration) *CohortStatusApplyConfiguration {
+func (b *CohortStatusApplyConfiguration) WithFairSharing(value *FairSharingStatusApplyConfiguration) *CohortStatusApplyConfiguration {
 	b.FairSharing = value
 	return b
 }
diff --git a/client-go/applyconfiguration/utils.go b/client-go/applyconfiguration/utils.go
index c610295d0..6d4b48e4b 100644
--- a/client-go/applyconfiguration/utils.go
+++ b/client-go/applyconfiguration/utils.go
@@ -35,12 +35,6 @@ import (
 func ForKind(kind schema.GroupVersionKind) interface{} {
 	switch kind {
 	// Group=kueue.x-k8s.io, Version=v1alpha1
-	case v1alpha1.SchemeGroupVersion.WithKind("Cohort"):
-		return &kueuev1alpha1.CohortApplyConfiguration{}
-	case v1alpha1.SchemeGroupVersion.WithKind("CohortSpec"):
-		return &kueuev1alpha1.CohortSpecApplyConfiguration{}
-	case v1alpha1.SchemeGroupVersion.WithKind("CohortStatus"):
-		return &kueuev1alpha1.CohortStatusApplyConfiguration{}
 	case v1alpha1.SchemeGroupVersion.WithKind("Topology"):
 		return &kueuev1alpha1.TopologyApplyConfiguration{}
 	case v1alpha1.SchemeGroupVersion.WithKind("TopologyLevel"):
@@ -83,6 +77,12 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
 		return &kueuev1beta1.ClusterQueueSpecApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("ClusterQueueStatus"):
 		return &kueuev1beta1.ClusterQueueStatusApplyConfiguration{}
+	case v1beta1.SchemeGroupVersion.WithKind("Cohort"):
+		return &kueuev1beta1.CohortApplyConfiguration{}
+	case v1beta1.SchemeGroupVersion.WithKind("CohortSpec"):
+		return &kueuev1beta1.CohortSpecApplyConfiguration{}
+	case v1beta1.SchemeGroupVersion.WithKind("CohortStatus"):
+		return &kueuev1beta1.CohortStatusApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("FairSharing"):
 		return &kueuev1beta1.FairSharingApplyConfiguration{}
 	case v1beta1.SchemeGroupVersion.WithKind("FairSharingStatus"):
diff --git a/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_cohort.go b/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_cohort.go
deleted file mode 100644
index 73858224a..000000000
--- a/client-go/clientset/versioned/typed/kueue/v1alpha1/fake/fake_cohort.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"
-)
-
-// fakeCohorts implements CohortInterface
-type fakeCohorts struct {
-	*gentype.FakeClientWithListAndApply[*v1alpha1.Cohort, *v1alpha1.CohortList, *kueuev1alpha1.CohortApplyConfiguration]
-	Fake *FakeKueueV1alpha1
-}
-
-func newFakeCohorts(fake *FakeKueueV1alpha1, namespace string) typedkueuev1alpha1.CohortInterface {
-	return &fakeCohorts{
-		gentype.NewFakeClientWithListAndApply[*v1alpha1.Cohort, *v1alpha1.CohortList, *kueuev1alpha1.CohortApplyConfiguration](
-			fake.Fake,
-			namespace,
-			v1alpha1.SchemeGroupVersion.WithResource("cohorts"),
-			v1alpha1.SchemeGroupVersion.WithKind("Cohort"),
-			func() *v1alpha1.Cohort { return &v1alpha1.Cohort{} },
-			func() *v1alpha1.CohortList { return &v1alpha1.CohortList{} },
-			func(dst, src *v1alpha1.CohortList) { dst.ListMeta = src.ListMeta },
-			func(list *v1alpha1.CohortList) []*v1alpha1.Cohort { return gentype.ToPointerSlice(list.Items) },
-			func(list *v1alpha1.CohortList, items []*v1alpha1.Cohort) {
-				list.Items = gentype.FromPointerSlice(items)
-			},
-		),
-		fake,
-	}
-}
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 27d0b9b31..c06a43ff2 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
@@ -27,10 +27,6 @@ type FakeKueueV1alpha1 struct {
 	*testing.Fake
 }
 
-func (c *FakeKueueV1alpha1) Cohorts(namespace string) v1alpha1.CohortInterface {
-	return newFakeCohorts(c, namespace)
-}
-
 func (c *FakeKueueV1alpha1) Topologies() v1alpha1.TopologyInterface {
 	return newFakeTopologies(c)
 }
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 2593a3544..6601341f1 100644
--- a/client-go/clientset/versioned/typed/kueue/v1alpha1/generated_expansion.go
+++ b/client-go/clientset/versioned/typed/kueue/v1alpha1/generated_expansion.go
@@ -17,6 +17,4 @@ limitations under the License.
 
 package v1alpha1
 
-type CohortExpansion interface{}
-
 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 3a6e7c02a..b5f9ecdd8 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
-	CohortsGetter
 	TopologiesGetter
 }
 
@@ -36,10 +35,6 @@ type KueueV1alpha1Client struct {
 	restClient rest.Interface
 }
 
-func (c *KueueV1alpha1Client) Cohorts(namespace string) CohortInterface {
-	return newCohorts(c, namespace)
-}
-
 func (c *KueueV1alpha1Client) Topologies() TopologyInterface {
 	return newTopologies(c)
 }
diff --git a/client-go/clientset/versioned/typed/kueue/v1alpha1/cohort.go b/client-go/clientset/versioned/typed/kueue/v1beta1/cohort.go
similarity index 59%
rename from client-go/clientset/versioned/typed/kueue/v1alpha1/cohort.go
rename to client-go/clientset/versioned/typed/kueue/v1beta1/cohort.go
index ce7858f2e..9fe9b552a 100644
--- a/client-go/clientset/versioned/typed/kueue/v1alpha1/cohort.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/cohort.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,37 +37,37 @@ type CohortsGetter interface {
 
 // CohortInterface has methods to work with Cohort resources.
 type CohortInterface interface {
-	Create(ctx context.Context, cohort *kueuev1alpha1.Cohort, opts v1.CreateOptions) (*kueuev1alpha1.Cohort, error)
-	Update(ctx context.Context, cohort *kueuev1alpha1.Cohort, opts v1.UpdateOptions) (*kueuev1alpha1.Cohort, error)
+	Create(ctx context.Context, cohort *kueuev1beta1.Cohort, opts v1.CreateOptions) (*kueuev1beta1.Cohort, error)
+	Update(ctx context.Context, cohort *kueuev1beta1.Cohort, opts v1.UpdateOptions) (*kueuev1beta1.Cohort, error)
 	// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-	UpdateStatus(ctx context.Context, cohort *kueuev1alpha1.Cohort, opts v1.UpdateOptions) (*kueuev1alpha1.Cohort, error)
+	UpdateStatus(ctx context.Context, cohort *kueuev1beta1.Cohort, opts v1.UpdateOptions) (*kueuev1beta1.Cohort, 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.Cohort, error)
-	List(ctx context.Context, opts v1.ListOptions) (*kueuev1alpha1.CohortList, error)
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*kueuev1beta1.Cohort, error)
+	List(ctx context.Context, opts v1.ListOptions) (*kueuev1beta1.CohortList, 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.Cohort, err error)
-	Apply(ctx context.Context, cohort *applyconfigurationkueuev1alpha1.CohortApplyConfiguration, opts v1.ApplyOptions) (result *kueuev1alpha1.Cohort, err error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *kueuev1beta1.Cohort, err error)
+	Apply(ctx context.Context, cohort *applyconfigurationkueuev1beta1.CohortApplyConfiguration, opts v1.ApplyOptions) (result *kueuev1beta1.Cohort, err error)
 	// Add a +genclient:noStatus comment above the type to avoid generating ApplyStatus().
-	ApplyStatus(ctx context.Context, cohort *applyconfigurationkueuev1alpha1.CohortApplyConfiguration, opts v1.ApplyOptions) (result *kueuev1alpha1.Cohort, err error)
+	ApplyStatus(ctx context.Context, cohort *applyconfigurationkueuev1beta1.CohortApplyConfiguration, opts v1.ApplyOptions) (result *kueuev1beta1.Cohort, err error)
 	CohortExpansion
 }
 
 // cohorts implements CohortInterface
 type cohorts struct {
-	*gentype.ClientWithListAndApply[*kueuev1alpha1.Cohort, *kueuev1alpha1.CohortList, *applyconfigurationkueuev1alpha1.CohortApplyConfiguration]
+	*gentype.ClientWithListAndApply[*kueuev1beta1.Cohort, *kueuev1beta1.CohortList, *applyconfigurationkueuev1beta1.CohortApplyConfiguration]
 }
 
 // newCohorts returns a Cohorts
-func newCohorts(c *KueueV1alpha1Client, namespace string) *cohorts {
+func newCohorts(c *KueueV1beta1Client, namespace string) *cohorts {
 	return &cohorts{
-		gentype.NewClientWithListAndApply[*kueuev1alpha1.Cohort, *kueuev1alpha1.CohortList, *applyconfigurationkueuev1alpha1.CohortApplyConfiguration](
+		gentype.NewClientWithListAndApply[*kueuev1beta1.Cohort, *kueuev1beta1.CohortList, *applyconfigurationkueuev1beta1.CohortApplyConfiguration](
 			"cohorts",
 			c.RESTClient(),
 			scheme.ParameterCodec,
 			namespace,
-			func() *kueuev1alpha1.Cohort { return &kueuev1alpha1.Cohort{} },
-			func() *kueuev1alpha1.CohortList { return &kueuev1alpha1.CohortList{} },
+			func() *kueuev1beta1.Cohort { return &kueuev1beta1.Cohort{} },
+			func() *kueuev1beta1.CohortList { return &kueuev1beta1.CohortList{} },
 		),
 	}
 }
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_cohort.go b/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_cohort.go
new file mode 100644
index 000000000..8dfc0962c
--- /dev/null
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_cohort.go
@@ -0,0 +1,48 @@
+/*
+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"
+)
+
+// fakeCohorts implements CohortInterface
+type fakeCohorts struct {
+	*gentype.FakeClientWithListAndApply[*v1beta1.Cohort, *v1beta1.CohortList, *kueuev1beta1.CohortApplyConfiguration]
+	Fake *FakeKueueV1beta1
+}
+
+func newFakeCohorts(fake *FakeKueueV1beta1, namespace string) typedkueuev1beta1.CohortInterface {
+	return &fakeCohorts{
+		gentype.NewFakeClientWithListAndApply[*v1beta1.Cohort, *v1beta1.CohortList, *kueuev1beta1.CohortApplyConfiguration](
+			fake.Fake,
+			namespace,
+			v1beta1.SchemeGroupVersion.WithResource("cohorts"),
+			v1beta1.SchemeGroupVersion.WithKind("Cohort"),
+			func() *v1beta1.Cohort { return &v1beta1.Cohort{} },
+			func() *v1beta1.CohortList { return &v1beta1.CohortList{} },
+			func(dst, src *v1beta1.CohortList) { dst.ListMeta = src.ListMeta },
+			func(list *v1beta1.CohortList) []*v1beta1.Cohort { return gentype.ToPointerSlice(list.Items) },
+			func(list *v1beta1.CohortList, items []*v1beta1.Cohort) { list.Items = gentype.FromPointerSlice(items) },
+		),
+		fake,
+	}
+}
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 bbc243a2c..decc402b8 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
@@ -35,6 +35,10 @@ func (c *FakeKueueV1beta1) ClusterQueues() v1beta1.ClusterQueueInterface {
 	return newFakeClusterQueues(c)
 }
 
+func (c *FakeKueueV1beta1) Cohorts(namespace string) v1beta1.CohortInterface {
+	return newFakeCohorts(c, namespace)
+}
+
 func (c *FakeKueueV1beta1) LocalQueues(namespace string) v1beta1.LocalQueueInterface {
 	return newFakeLocalQueues(c, namespace)
 }
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 78f0443a7..cdf585c2d 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta1/generated_expansion.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/generated_expansion.go
@@ -21,6 +21,8 @@ type AdmissionCheckExpansion interface{}
 
 type ClusterQueueExpansion interface{}
 
+type CohortExpansion interface{}
+
 type LocalQueueExpansion interface{}
 
 type MultiKueueClusterExpansion 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 e1eebc967..ebc3912a1 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta1/kueue_client.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/kueue_client.go
@@ -29,6 +29,7 @@ type KueueV1beta1Interface interface {
 	RESTClient() rest.Interface
 	AdmissionChecksGetter
 	ClusterQueuesGetter
+	CohortsGetter
 	LocalQueuesGetter
 	MultiKueueClustersGetter
 	MultiKueueConfigsGetter
@@ -51,6 +52,10 @@ func (c *KueueV1beta1Client) ClusterQueues() ClusterQueueInterface {
 	return newClusterQueues(c)
 }
 
+func (c *KueueV1beta1Client) Cohorts(namespace string) CohortInterface {
+	return newCohorts(c, namespace)
+}
+
 func (c *KueueV1beta1Client) LocalQueues(namespace string) LocalQueueInterface {
 	return newLocalQueues(c, namespace)
 }
diff --git a/client-go/informers/externalversions/generic.go b/client-go/informers/externalversions/generic.go
index ebbf7e4eb..6c90e99c4 100644
--- a/client-go/informers/externalversions/generic.go
+++ b/client-go/informers/externalversions/generic.go
@@ -54,8 +54,6 @@ func (f *genericInformer) Lister() cache.GenericLister {
 func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
 	switch resource {
 	// Group=kueue.x-k8s.io, Version=v1alpha1
-	case v1alpha1.SchemeGroupVersion.WithResource("cohorts"):
-		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1alpha1().Cohorts().Informer()}, nil
 	case v1alpha1.SchemeGroupVersion.WithResource("topologies"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1alpha1().Topologies().Informer()}, nil
 
@@ -64,6 +62,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().AdmissionChecks().Informer()}, nil
 	case v1beta1.SchemeGroupVersion.WithResource("clusterqueues"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().ClusterQueues().Informer()}, nil
+	case v1beta1.SchemeGroupVersion.WithResource("cohorts"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().Cohorts().Informer()}, nil
 	case v1beta1.SchemeGroupVersion.WithResource("localqueues"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Kueue().V1beta1().LocalQueues().Informer()}, nil
 	case v1beta1.SchemeGroupVersion.WithResource("multikueueclusters"):
diff --git a/client-go/informers/externalversions/kueue/v1alpha1/interface.go b/client-go/informers/externalversions/kueue/v1alpha1/interface.go
index e8594fde7..aebd35f5b 100644
--- a/client-go/informers/externalversions/kueue/v1alpha1/interface.go
+++ b/client-go/informers/externalversions/kueue/v1alpha1/interface.go
@@ -23,8 +23,6 @@ import (
 
 // Interface provides access to all the informers in this group version.
 type Interface interface {
-	// Cohorts returns a CohortInformer.
-	Cohorts() CohortInformer
 	// Topologies returns a TopologyInformer.
 	Topologies() TopologyInformer
 }
@@ -40,11 +38,6 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList
 	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
 }
 
-// Cohorts returns a CohortInformer.
-func (v *version) Cohorts() CohortInformer {
-	return &cohortInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.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/v1alpha1/cohort.go b/client-go/informers/externalversions/kueue/v1beta1/cohort.go
similarity index 82%
rename from client-go/informers/externalversions/kueue/v1alpha1/cohort.go
rename to client-go/informers/externalversions/kueue/v1beta1/cohort.go
index ed3c4ac5b..cdc36fb12 100644
--- a/client-go/informers/externalversions/kueue/v1alpha1/cohort.go
+++ b/client-go/informers/externalversions/kueue/v1beta1/cohort.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"
 )
 
 // CohortInformer provides access to a shared informer and lister for
 // Cohorts.
 type CohortInformer interface {
 	Informer() cache.SharedIndexInformer
-	Lister() kueuev1alpha1.CohortLister
+	Lister() kueuev1beta1.CohortLister
 }
 
 type cohortInformer struct {
@@ -61,28 +61,28 @@ func NewFilteredCohortInformer(client versioned.Interface, namespace string, res
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1alpha1().Cohorts(namespace).List(context.Background(), options)
+				return client.KueueV1beta1().Cohorts(namespace).List(context.Background(), options)
 			},
 			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1alpha1().Cohorts(namespace).Watch(context.Background(), options)
+				return client.KueueV1beta1().Cohorts(namespace).Watch(context.Background(), options)
 			},
 			ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1alpha1().Cohorts(namespace).List(ctx, options)
+				return client.KueueV1beta1().Cohorts(namespace).List(ctx, options)
 			},
 			WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1alpha1().Cohorts(namespace).Watch(ctx, options)
+				return client.KueueV1beta1().Cohorts(namespace).Watch(ctx, options)
 			},
 		},
-		&apiskueuev1alpha1.Cohort{},
+		&apiskueuev1beta1.Cohort{},
 		resyncPeriod,
 		indexers,
 	)
@@ -93,9 +93,9 @@ func (f *cohortInformer) defaultInformer(client versioned.Interface, resyncPerio
 }
 
 func (f *cohortInformer) Informer() cache.SharedIndexInformer {
-	return f.factory.InformerFor(&apiskueuev1alpha1.Cohort{}, f.defaultInformer)
+	return f.factory.InformerFor(&apiskueuev1beta1.Cohort{}, f.defaultInformer)
 }
 
-func (f *cohortInformer) Lister() kueuev1alpha1.CohortLister {
-	return kueuev1alpha1.NewCohortLister(f.Informer().GetIndexer())
+func (f *cohortInformer) Lister() kueuev1beta1.CohortLister {
+	return kueuev1beta1.NewCohortLister(f.Informer().GetIndexer())
 }
diff --git a/client-go/informers/externalversions/kueue/v1beta1/interface.go b/client-go/informers/externalversions/kueue/v1beta1/interface.go
index bae59d189..edfcb4742 100644
--- a/client-go/informers/externalversions/kueue/v1beta1/interface.go
+++ b/client-go/informers/externalversions/kueue/v1beta1/interface.go
@@ -27,6 +27,8 @@ type Interface interface {
 	AdmissionChecks() AdmissionCheckInformer
 	// ClusterQueues returns a ClusterQueueInformer.
 	ClusterQueues() ClusterQueueInformer
+	// Cohorts returns a CohortInformer.
+	Cohorts() CohortInformer
 	// LocalQueues returns a LocalQueueInformer.
 	LocalQueues() LocalQueueInformer
 	// MultiKueueClusters returns a MultiKueueClusterInformer.
@@ -64,6 +66,11 @@ func (v *version) ClusterQueues() ClusterQueueInformer {
 	return &clusterQueueInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
 }
 
+// Cohorts returns a CohortInformer.
+func (v *version) Cohorts() CohortInformer {
+	return &cohortInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+}
+
 // LocalQueues returns a LocalQueueInformer.
 func (v *version) LocalQueues() LocalQueueInformer {
 	return &localQueueInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
diff --git a/client-go/listers/kueue/v1alpha1/expansion_generated.go b/client-go/listers/kueue/v1alpha1/expansion_generated.go
index a9cc1fd6d..a760283dd 100644
--- a/client-go/listers/kueue/v1alpha1/expansion_generated.go
+++ b/client-go/listers/kueue/v1alpha1/expansion_generated.go
@@ -17,14 +17,6 @@ limitations under the License.
 
 package v1alpha1
 
-// CohortListerExpansion allows custom methods to be added to
-// CohortLister.
-type CohortListerExpansion interface{}
-
-// CohortNamespaceListerExpansion allows custom methods to be added to
-// CohortNamespaceLister.
-type CohortNamespaceListerExpansion interface{}
-
 // TopologyListerExpansion allows custom methods to be added to
 // TopologyLister.
 type TopologyListerExpansion interface{}
diff --git a/client-go/listers/kueue/v1alpha1/cohort.go b/client-go/listers/kueue/v1beta1/cohort.go
similarity index 77%
rename from client-go/listers/kueue/v1alpha1/cohort.go
rename to client-go/listers/kueue/v1beta1/cohort.go
index e002bdf74..6a496f6c9 100644
--- a/client-go/listers/kueue/v1alpha1/cohort.go
+++ b/client-go/listers/kueue/v1beta1/cohort.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"
 )
 
 // CohortLister helps list Cohorts.
@@ -29,7 +29,7 @@ import (
 type CohortLister interface {
 	// List lists all Cohorts in the indexer.
 	// Objects returned here must be treated as read-only.
-	List(selector labels.Selector) (ret []*kueuev1alpha1.Cohort, err error)
+	List(selector labels.Selector) (ret []*kueuev1beta1.Cohort, err error)
 	// Cohorts returns an object that can list and get Cohorts.
 	Cohorts(namespace string) CohortNamespaceLister
 	CohortListerExpansion
@@ -37,17 +37,17 @@ type CohortLister interface {
 
 // cohortLister implements the CohortLister interface.
 type cohortLister struct {
-	listers.ResourceIndexer[*kueuev1alpha1.Cohort]
+	listers.ResourceIndexer[*kueuev1beta1.Cohort]
 }
 
 // NewCohortLister returns a new CohortLister.
 func NewCohortLister(indexer cache.Indexer) CohortLister {
-	return &cohortLister{listers.New[*kueuev1alpha1.Cohort](indexer, kueuev1alpha1.Resource("cohort"))}
+	return &cohortLister{listers.New[*kueuev1beta1.Cohort](indexer, kueuev1beta1.Resource("cohort"))}
 }
 
 // Cohorts returns an object that can list and get Cohorts.
 func (s *cohortLister) Cohorts(namespace string) CohortNamespaceLister {
-	return cohortNamespaceLister{listers.NewNamespaced[*kueuev1alpha1.Cohort](s.ResourceIndexer, namespace)}
+	return cohortNamespaceLister{listers.NewNamespaced[*kueuev1beta1.Cohort](s.ResourceIndexer, namespace)}
 }
 
 // CohortNamespaceLister helps list and get Cohorts.
@@ -55,15 +55,15 @@ func (s *cohortLister) Cohorts(namespace string) CohortNamespaceLister {
 type CohortNamespaceLister interface {
 	// List lists all Cohorts in the indexer for a given namespace.
 	// Objects returned here must be treated as read-only.
-	List(selector labels.Selector) (ret []*kueuev1alpha1.Cohort, err error)
+	List(selector labels.Selector) (ret []*kueuev1beta1.Cohort, err error)
 	// Get retrieves the Cohort from the indexer for a given namespace and name.
 	// Objects returned here must be treated as read-only.
-	Get(name string) (*kueuev1alpha1.Cohort, error)
+	Get(name string) (*kueuev1beta1.Cohort, error)
 	CohortNamespaceListerExpansion
 }
 
 // cohortNamespaceLister implements the CohortNamespaceLister
 // interface.
 type cohortNamespaceLister struct {
-	listers.ResourceIndexer[*kueuev1alpha1.Cohort]
+	listers.ResourceIndexer[*kueuev1beta1.Cohort]
 }
diff --git a/client-go/listers/kueue/v1beta1/expansion_generated.go b/client-go/listers/kueue/v1beta1/expansion_generated.go
index 2061a69e7..667043eb7 100644
--- a/client-go/listers/kueue/v1beta1/expansion_generated.go
+++ b/client-go/listers/kueue/v1beta1/expansion_generated.go
@@ -25,6 +25,14 @@ type AdmissionCheckListerExpansion interface{}
 // ClusterQueueLister.
 type ClusterQueueListerExpansion interface{}
 
+// CohortListerExpansion allows custom methods to be added to
+// CohortLister.
+type CohortListerExpansion interface{}
+
+// CohortNamespaceListerExpansion allows custom methods to be added to
+// CohortNamespaceLister.
+type CohortNamespaceListerExpansion interface{}
+
 // LocalQueueListerExpansion allows custom methods to be added to
 // LocalQueueLister.
 type LocalQueueListerExpansion interface{}
diff --git a/config/components/crd/bases/kueue.x-k8s.io_cohorts.yaml b/config/components/crd/bases/kueue.x-k8s.io_cohorts.yaml
index f99a8589a..24a50ce66 100644
--- a/config/components/crd/bases/kueue.x-k8s.io_cohorts.yaml
+++ b/config/components/crd/bases/kueue.x-k8s.io_cohorts.yaml
@@ -14,7 +14,7 @@ spec:
     singular: cohort
   scope: Cluster
   versions:
-  - name: v1alpha1
+  - name: v1beta1
     schema:
       openAPIV3Schema:
         description: |-
@@ -69,9 +69,9 @@ spec:
                     pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                     x-kubernetes-int-or-string: true
                 type: object
-              parent:
+              parentName:
                 description: |-
-                  Parent references the name of the Cohort's parent, if
+                  ParentName references the name of the Cohort's parent, if
                   any. It satisfies one of three cases:
                   1) Unset. This Cohort is the root of its Cohort tree.
                   2) References a non-existent Cohort. We use default Cohort (no borrowing/lending limits).
diff --git a/config/components/webhook/manifests.yaml b/config/components/webhook/manifests.yaml
index e87f1cb65..1abebda23 100644
--- a/config/components/webhook/manifests.yaml
+++ b/config/components/webhook/manifests.yaml
@@ -681,14 +681,14 @@ webhooks:
     service:
       name: webhook-service
       namespace: system
-      path: /validate-kueue-x-k8s-io-v1alpha1-cohort
+      path: /validate-kueue-x-k8s-io-v1beta1-cohort
   failurePolicy: Fail
   name: vcohort.kb.io
   rules:
   - apiGroups:
     - kueue.x-k8s.io
     apiVersions:
-    - v1alpha1
+    - v1beta1
     operations:
     - CREATE
     - UPDATE
diff --git a/hack/e2e-common.sh b/hack/e2e-common.sh
index 05c919056..3aa4de454 100644
--- a/hack/e2e-common.sh
+++ b/hack/e2e-common.sh
@@ -18,6 +18,7 @@ export KUSTOMIZE="$ROOT_DIR"/bin/kustomize
 export GINKGO="$ROOT_DIR"/bin/ginkgo
 export KIND="$ROOT_DIR"/bin/kind
 export YQ="$ROOT_DIR"/bin/yq
+export KUEUE_NAMESPACE="${KUEUE_NAMESPACE:-kueue-system}"
 
 export KIND_VERSION="${E2E_KIND_VERSION/"kindest/node:v"/}"
 
@@ -207,8 +208,10 @@ function deploy_with_certmanager() {
         $KUSTOMIZE edit add patch --path "validating_webhookcainjection_patch.yaml"
         $KUSTOMIZE edit add patch --path "cert_metrics_manager_patch.yaml" --kind Deployment
         
-        $KUSTOMIZE build "${ROOT_DIR}/test/e2e/config/certmanager" | \
-        kubectl apply --kubeconfig="$1" --server-side -f -
+        local build_output
+        build_output=$($KUSTOMIZE build "${ROOT_DIR}/test/e2e/config/certmanager")
+        build_output="${build_output//kueue-system/$KUEUE_NAMESPACE}"
+        echo "$build_output" | kubectl apply --kubeconfig="$1" --server-side -f -
     )
 
     printf "%s\n" "$crd_backup" > "$crd_kust"
@@ -224,7 +227,10 @@ function cluster_kueue_deploy {
         
         deploy_with_certmanager "$1"
     else
-        kubectl apply --kubeconfig="$1" --server-side -k "${ROOT_DIR}/test/e2e/config/default"
+        local build_output
+        build_output=$($KUSTOMIZE build "${ROOT_DIR}/test/e2e/config/default")
+        build_output="${build_output//kueue-system/$KUEUE_NAMESPACE}"
+        echo "$build_output" | kubectl apply --kubeconfig="$1" --server-side -f -
     fi
 }
 
diff --git a/hack/e2e-kueueviz-backend.sh b/hack/e2e-kueueviz-backend.sh
index 5d32ff77c..d0f0725fb 100755
--- a/hack/e2e-kueueviz-backend.sh
+++ b/hack/e2e-kueueviz-backend.sh
@@ -46,7 +46,7 @@ prepare_docker_images
 cluster_kind_load "${KIND_CLUSTER_NAME}"
 (cd config/components/manager && $KUSTOMIZE edit set image controller="$IMAGE_TAG")
 cluster_kueue_deploy ""
-kubectl wait deploy/kueue-controller-manager -nkueue-system --for=condition=available --timeout=5m
+kubectl wait deploy/kueue-controller-manager -n"$KUEUE_NAMESPACE" --for=condition=available --timeout=5m
 
 # Deploy KueueViz resources
 kubectl create -f "${ROOT_DIR}/cmd/kueueviz/examples/"
diff --git a/hack/e2e-kueueviz-local.sh b/hack/e2e-kueueviz-local.sh
index 68673d5f0..84ae5dda2 100755
--- a/hack/e2e-kueueviz-local.sh
+++ b/hack/e2e-kueueviz-local.sh
@@ -38,7 +38,7 @@ prepare_docker_images
 cluster_kind_load "${KIND_CLUSTER_NAME}"
 (cd config/components/manager && $KUSTOMIZE edit set image controller="$IMAGE_TAG")
 cluster_kueue_deploy ""
-kubectl wait deploy/kueue-controller-manager -nkueue-system --for=condition=available --timeout=5m
+kubectl wait deploy/kueue-controller-manager -n"$KUEUE_NAMESPACE" --for=condition=available --timeout=5m
 
 # Deploy kueueviz resources
 kubectl create -f "${ROOT_DIR}/cmd/kueueviz/examples/"
diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go
index 8d4ed39ed..5e94a93f7 100644
--- a/pkg/cache/cache.go
+++ b/pkg/cache/cache.go
@@ -470,14 +470,14 @@ func (c *Cache) DeleteClusterQueue(cq *kueue.ClusterQueue) {
 	metrics.ClearCacheMetrics(cq.Name)
 }
 
-func (c *Cache) AddOrUpdateCohort(apiCohort *kueuealpha.Cohort) error {
+func (c *Cache) AddOrUpdateCohort(apiCohort *kueue.Cohort) error {
 	c.Lock()
 	defer c.Unlock()
 	cohortName := kueue.CohortReference(apiCohort.Name)
 	c.hm.AddCohort(cohortName)
 	cohort := c.hm.Cohort(cohortName)
 	oldParent := cohort.Parent()
-	c.hm.UpdateCohortEdge(cohortName, apiCohort.Spec.Parent)
+	c.hm.UpdateCohortEdge(cohortName, apiCohort.Spec.ParentName)
 	return cohort.updateCohort(apiCohort, oldParent)
 }
 
@@ -714,7 +714,7 @@ type CohortUsageStats struct {
 	WeightedShare int64
 }
 
-func (c *Cache) CohortStats(cohortObj *kueuealpha.Cohort) (*CohortUsageStats, error) {
+func (c *Cache) CohortStats(cohortObj *kueue.Cohort) (*CohortUsageStats, error) {
 	c.RLock()
 	defer c.RUnlock()
 
diff --git a/pkg/cache/cohort.go b/pkg/cache/cohort.go
index 931a86927..edd557207 100644
--- a/pkg/cache/cohort.go
+++ b/pkg/cache/cohort.go
@@ -21,7 +21,6 @@ import (
 
 	"k8s.io/apimachinery/pkg/api/resource"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/hierarchy"
 )
@@ -44,7 +43,7 @@ func newCohort(name kueue.CohortReference) *cohort {
 	}
 }
 
-func (c *cohort) updateCohort(apiCohort *kueuealpha.Cohort, oldParent *cohort) error {
+func (c *cohort) updateCohort(apiCohort *kueue.Cohort, oldParent *cohort) error {
 	c.FairWeight = parseFairWeight(apiCohort.Spec.FairSharing)
 
 	c.resourceNode.Quotas = createResourceQuotas(apiCohort.Spec.ResourceGroups)
diff --git a/pkg/cache/tas_flavor_snapshot.go b/pkg/cache/tas_flavor_snapshot.go
index b3f1a63ec..572e2e979 100644
--- a/pkg/cache/tas_flavor_snapshot.go
+++ b/pkg/cache/tas_flavor_snapshot.go
@@ -185,6 +185,10 @@ func (s *TASFlavorSnapshot) lowestLevel() string {
 	return s.levelKeys[len(s.levelKeys)-1]
 }
 
+func (s *TASFlavorSnapshot) highestLevel() string {
+	return s.levelKeys[0]
+}
+
 // initialize prepares the topology tree structure. This structure holds
 // for a given the list of topology domains with additional static and dynamic
 // information. This function initializes the static information which
@@ -726,6 +730,9 @@ func isRequired(tr *kueue.PodSetTopologyRequest) bool {
 }
 
 func (s *TASFlavorSnapshot) levelKeyWithImpliedFallback(tasRequests *TASPodSetRequests) *string {
+	if isSliceTopologyOnlyRequest(tasRequests.PodSet.TopologyRequest) {
+		return ptr.To(s.highestLevel())
+	}
 	if key := s.levelKey(tasRequests.PodSet.TopologyRequest); key != nil {
 		return key
 	}
@@ -759,7 +766,11 @@ func (s *TASFlavorSnapshot) sliceLevelKeyWithDefault(tasRequests *TASPodSetReque
 }
 
 func isUnconstrained(tr *kueue.PodSetTopologyRequest, tasRequests *TASPodSetRequests) bool {
-	return (tr != nil && tr.Unconstrained != nil && *tr.Unconstrained) || tasRequests.Implied
+	return (tr != nil && tr.Unconstrained != nil && *tr.Unconstrained) || tasRequests.Implied || isSliceTopologyOnlyRequest(tr)
+}
+
+func isSliceTopologyOnlyRequest(tr *kueue.PodSetTopologyRequest) bool {
+	return tr != nil && tr.Required == nil && tr.Preferred == nil && tr.PodSetSliceRequiredTopology != nil
 }
 
 // findBestFitDomain finds an index of the first domain with the lowest
diff --git a/pkg/controller/admissionchecks/multikueue/multikueuecluster.go b/pkg/controller/admissionchecks/multikueue/multikueuecluster.go
index eb8dab41f..f58b0b0ab 100644
--- a/pkg/controller/admissionchecks/multikueue/multikueuecluster.go
+++ b/pkg/controller/admissionchecks/multikueue/multikueuecluster.go
@@ -260,14 +260,14 @@ func (rc *remoteClient) runGC(ctx context.Context) {
 		return
 	}
 
-	lst := &kueue.WorkloadList{}
-	err := rc.client.List(ctx, lst, client.MatchingLabels{kueue.MultiKueueOriginLabel: rc.origin})
+	wls := &kueue.WorkloadList{}
+	err := rc.client.List(ctx, wls, client.MatchingLabels{kueue.MultiKueueOriginLabel: rc.origin})
 	if err != nil {
 		log.Error(err, "Listing remote workloads")
 		return
 	}
 
-	for _, remoteWl := range lst.Items {
+	for _, remoteWl := range wls.Items {
 		localWl := &kueue.Workload{}
 		wlLog := log.WithValues("remoteWl", klog.KObj(&remoteWl))
 		err := rc.localClient.Get(ctx, client.ObjectKeyFromObject(&remoteWl), localWl)
diff --git a/pkg/controller/admissionchecks/provisioning/controller.go b/pkg/controller/admissionchecks/provisioning/controller.go
index a3ceb8d4d..69b0a5608 100644
--- a/pkg/controller/admissionchecks/provisioning/controller.go
+++ b/pkg/controller/admissionchecks/provisioning/controller.go
@@ -128,8 +128,8 @@ func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (reco
 		return reconcile.Result{}, nil
 	}
 
-	provisioningRequestList := &autoscaling.ProvisioningRequestList{}
-	if err := c.client.List(ctx, provisioningRequestList, client.InNamespace(wl.Namespace), client.MatchingFields{RequestsOwnedByWorkloadKey: wl.Name}); client.IgnoreNotFound(err) != nil {
+	provReqs := &autoscaling.ProvisioningRequestList{}
+	if err := c.client.List(ctx, provReqs, client.InNamespace(wl.Namespace), client.MatchingFields{RequestsOwnedByWorkloadKey: wl.Name}); client.IgnoreNotFound(err) != nil {
 		return reconcile.Result{}, err
 	}
 
@@ -148,7 +148,7 @@ func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (reco
 		checkConfig[checkName] = prc
 	}
 
-	activeOrLastPRForChecks := c.activeOrLastPRForChecks(ctx, wl, checkConfig, provisioningRequestList.Items)
+	activeOrLastPRForChecks := c.activeOrLastPRForChecks(ctx, wl, checkConfig, provReqs.Items)
 
 	wlInfo := workloadInfo{
 		checkStates: make([]kueue.AdmissionCheckState, 0),
@@ -158,7 +158,7 @@ func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (reco
 		return reconcile.Result{}, err
 	}
 
-	err = c.deleteUnusedProvisioningRequests(ctx, provisioningRequestList.Items, activeOrLastPRForChecks)
+	err = c.deleteUnusedProvisioningRequests(ctx, provReqs.Items, activeOrLastPRForChecks)
 	if err != nil {
 		log.V(2).Error(err, "syncOwnedProvisionRequest failed to delete unused provisioning requests")
 		return reconcile.Result{}, err
@@ -697,13 +697,13 @@ func (a *acHandler) Generic(_ context.Context, _ event.GenericEvent, _ workqueue
 }
 
 func (a *acHandler) reconcileWorkloadsUsing(ctx context.Context, check string, q workqueue.TypedRateLimitingInterface[reconcile.Request]) error {
-	list := &kueue.WorkloadList{}
-	if err := a.client.List(ctx, list, client.MatchingFields{WorkloadsWithAdmissionCheckKey: check}); client.IgnoreNotFound(err) != nil {
+	wls := &kueue.WorkloadList{}
+	if err := a.client.List(ctx, wls, client.MatchingFields{WorkloadsWithAdmissionCheckKey: check}); client.IgnoreNotFound(err) != nil {
 		return err
 	}
 
-	for i := range list.Items {
-		wl := &list.Items[i]
+	for i := range wls.Items {
+		wl := &wls.Items[i]
 		req := reconcile.Request{
 			NamespacedName: types.NamespacedName{
 				Name:      wl.Name,
@@ -765,11 +765,11 @@ func (p *prcHandler) Generic(_ context.Context, _ event.GenericEvent, _ workqueu
 }
 
 func (p *prcHandler) reconcileWorkloadsUsing(ctx context.Context, config string, q workqueue.TypedRateLimitingInterface[reconcile.Request]) error {
-	list := &kueue.AdmissionCheckList{}
-	if err := p.client.List(ctx, list, client.MatchingFields{AdmissionCheckUsingConfigKey: config}); client.IgnoreNotFound(err) != nil {
+	acs := &kueue.AdmissionCheckList{}
+	if err := p.client.List(ctx, acs, client.MatchingFields{AdmissionCheckUsingConfigKey: config}); client.IgnoreNotFound(err) != nil {
 		return err
 	}
-	users := slices.Map(list.Items, func(ac *kueue.AdmissionCheck) string { return ac.Name })
+	users := slices.Map(acs.Items, func(ac *kueue.AdmissionCheck) string { return ac.Name })
 	for _, user := range users {
 		if p.acHandlerOverride != nil {
 			if err := p.acHandlerOverride(ctx, user, q); err != nil {
diff --git a/pkg/controller/core/cohort_controller.go b/pkg/controller/core/cohort_controller.go
index a2dd20578..30fbb5974 100644
--- a/pkg/controller/core/cohort_controller.go
+++ b/pkg/controller/core/cohort_controller.go
@@ -35,8 +35,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
-	kueue "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
-	"sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache"
 	"sigs.k8s.io/kueue/pkg/metrics"
 	"sigs.k8s.io/kueue/pkg/queue"
@@ -137,8 +136,8 @@ func (r *CohortReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
 	if err := r.client.Get(ctx, req.NamespacedName, &cohort); err != nil {
 		if apierrors.IsNotFound(err) {
 			log.V(2).Info("Cohort is being deleted")
-			r.cache.DeleteCohort(v1beta1.CohortReference(req.Name))
-			r.qManager.DeleteCohort(v1beta1.CohortReference(req.Name))
+			r.cache.DeleteCohort(kueue.CohortReference(req.Name))
+			r.qManager.DeleteCohort(kueue.CohortReference(req.Name))
 		}
 		return ctrl.Result{}, client.IgnoreNotFound(err)
 	}
@@ -167,7 +166,7 @@ func (r *CohortReconciler) updateCohortStatusIfChanged(ctx context.Context, coho
 	if r.fairSharingEnabled {
 		metrics.ReportCohortWeightedShare(cohort.Name, stats.WeightedShare)
 		if cohort.Status.FairSharing == nil {
-			cohort.Status.FairSharing = &v1beta1.FairSharingStatus{}
+			cohort.Status.FairSharing = &kueue.FairSharingStatus{}
 		}
 		cohort.Status.FairSharing.WeightedShare = stats.WeightedShare
 	} else {
@@ -181,7 +180,7 @@ func (r *CohortReconciler) updateCohortStatusIfChanged(ctx context.Context, coho
 	return nil
 }
 
-func (r *CohortReconciler) NotifyClusterQueueUpdate(oldCQ, newCQ *v1beta1.ClusterQueue) {
+func (r *CohortReconciler) NotifyClusterQueueUpdate(oldCQ, newCQ *kueue.ClusterQueue) {
 	// if clusterQueue is nil, it's a delete event.
 	if newCQ == nil {
 		r.cqUpdateCh <- event.GenericEvent{Object: oldCQ}
@@ -205,7 +204,7 @@ func (h *cohortCqHandler) Delete(context.Context, event.DeleteEvent, workqueue.T
 }
 
 func (h *cohortCqHandler) Generic(ctx context.Context, e event.GenericEvent, q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
-	cq, isCQ := e.Object.(*v1beta1.ClusterQueue)
+	cq, isCQ := e.Object.(*kueue.ClusterQueue)
 	if !isCQ {
 		return
 	}
diff --git a/pkg/controller/jobframework/defaults.go b/pkg/controller/jobframework/defaults.go
index 74fdd9537..2a470d5d5 100644
--- a/pkg/controller/jobframework/defaults.go
+++ b/pkg/controller/jobframework/defaults.go
@@ -61,7 +61,7 @@ func WorkloadShouldBeSuspended(ctx context.Context, jobObj client.Object, k8sCli
 
 	// Logic for managing jobs without queue names.
 	if manageJobsWithoutQueueName {
-		if features.Enabled(features.ManagedJobsNamespaceSelector) {
+		if features.Enabled(features.ManagedJobsNamespaceSelector) && managedJobsNamespaceSelector != nil {
 			// Default suspend the job if the namespace selector matches
 			ns := corev1.Namespace{}
 			err := k8sClient.Get(ctx, client.ObjectKey{Name: jobObj.GetNamespace()}, &ns)
diff --git a/pkg/controller/jobframework/reconciler.go b/pkg/controller/jobframework/reconciler.go
index a1432911e..ce9365e40 100644
--- a/pkg/controller/jobframework/reconciler.go
+++ b/pkg/controller/jobframework/reconciler.go
@@ -662,25 +662,25 @@ func (r *JobReconciler) recordAdmissionCheckUpdate(wl *kueue.Workload, job Gener
 
 // getWorkloadForObject returns the Workload associated with the given job.
 func (r *JobReconciler) getWorkloadForObject(ctx context.Context, jobObj client.Object) (*kueue.Workload, error) {
-	wlList := kueue.WorkloadList{}
-	if err := r.client.List(ctx, &wlList, client.InNamespace(jobObj.GetNamespace()), client.MatchingFields{indexer.OwnerReferenceUID: string(jobObj.GetUID())}); client.IgnoreNotFound(err) != nil {
+	wls := kueue.WorkloadList{}
+	if err := r.client.List(ctx, &wls, client.InNamespace(jobObj.GetNamespace()), client.MatchingFields{indexer.OwnerReferenceUID: string(jobObj.GetUID())}); client.IgnoreNotFound(err) != nil {
 		return nil, err
 	}
 
-	if len(wlList.Items) == 0 {
+	if len(wls.Items) == 0 {
 		return nil, nil
 	}
 
 	// In theory the job can own multiple Workloads, we cannot do too much about it, maybe log it.
-	if len(wlList.Items) > 1 {
+	if len(wls.Items) > 1 {
 		ctrl.LoggerFrom(ctx).V(2).Info(
 			"WARNING: The job has multiple associated Workloads",
 			"job", klog.KObj(jobObj),
-			"workloads", klog.KObjSlice(wlList.Items),
+			"workloads", klog.KObjSlice(wls.Items),
 		)
 	}
 
-	return &wlList.Items[0], nil
+	return &wls.Items[0], nil
 }
 
 // FindAncestorJobManagedByKueue traverses controllerRefs to find the top-level ancestor Job managed by Kueue.
diff --git a/pkg/controller/jobframework/tas.go b/pkg/controller/jobframework/tas.go
index dedf11ca7..e921df89f 100644
--- a/pkg/controller/jobframework/tas.go
+++ b/pkg/controller/jobframework/tas.go
@@ -27,36 +27,37 @@ import (
 )
 
 type podSetTopologyRequestBuilder struct {
-	request *kueue.PodSetTopologyRequest
-}
-
-func (p *podSetTopologyRequestBuilder) Build() *kueue.PodSetTopologyRequest {
-	return p.request
+	podIndexLabel      *string
+	subGroupIndexLabel *string
+	subGroupCount      *int32
+	meta               *metav1.ObjectMeta
 }
 
 func (p *podSetTopologyRequestBuilder) PodIndexLabel(podIndexLabel *string) *podSetTopologyRequestBuilder {
-	if p.request != nil {
-		p.request.PodIndexLabel = podIndexLabel
-	}
+	p.podIndexLabel = podIndexLabel
 	return p
 }
 
 func (p *podSetTopologyRequestBuilder) SubGroup(subGroupIndexLabel *string, subGroupCount *int32) *podSetTopologyRequestBuilder {
-	if p.request != nil {
-		p.request.SubGroupIndexLabel = subGroupIndexLabel
-		p.request.SubGroupCount = subGroupCount
-	}
+	p.subGroupIndexLabel = subGroupIndexLabel
+	p.subGroupCount = subGroupCount
 	return p
 }
 
 func NewPodSetTopologyRequest(meta *metav1.ObjectMeta) *podSetTopologyRequestBuilder {
-	psTopologyReq := &kueue.PodSetTopologyRequest{}
-	requiredValue, requiredFound := meta.Annotations[kueuealpha.PodSetRequiredTopologyAnnotation]
-	preferredValue, preferredFound := meta.Annotations[kueuealpha.PodSetPreferredTopologyAnnotation]
-	unconstrained, unconstrainedFound := meta.Annotations[kueuealpha.PodSetUnconstrainedTopologyAnnotation]
+	return &podSetTopologyRequestBuilder{
+		meta: meta,
+	}
+}
+
+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]
 
-	sliceRequiredTopologyValue, sliceRequiredTopologyFound := meta.Annotations[kueuealpha.PodSetSliceRequiredTopologyAnnotation]
-	sliceSizeValue, sliceSizeFound := meta.Annotations[kueuealpha.PodSetSliceSizeAnnotation]
+	sliceRequiredTopologyValue, sliceRequiredTopologyFound := p.meta.Annotations[kueuealpha.PodSetSliceRequiredTopologyAnnotation]
+	sliceSizeValue, sliceSizeFound := p.meta.Annotations[kueuealpha.PodSetSliceSizeAnnotation]
 
 	switch {
 	case requiredFound:
@@ -64,22 +65,28 @@ func NewPodSetTopologyRequest(meta *metav1.ObjectMeta) *podSetTopologyRequestBui
 	case preferredFound:
 		psTopologyReq.Preferred = &preferredValue
 	case unconstrainedFound:
-		unconstrained, _ := strconv.ParseBool(unconstrained)
+		unconstrained, err := strconv.ParseBool(unconstrained)
+		if err != nil {
+			return nil, err
+		}
 		psTopologyReq.Unconstrained = &unconstrained
 	default:
-		psTopologyReq = nil
+		return nil, nil
 	}
 
 	if sliceRequiredTopologyFound && sliceSizeFound {
 		sliceSizeIntValue, err := strconv.ParseInt(sliceSizeValue, 10, 32)
 		if err != nil {
-			// silently ignore as it should not happen due to earlier validation in a webhook
+			return nil, err
 		} else {
 			psTopologyReq.PodSetSliceRequiredTopology = &sliceRequiredTopologyValue
 			psTopologyReq.PodSetSliceSize = ptr.To(int32(sliceSizeIntValue))
 		}
 	}
 
-	builder := &podSetTopologyRequestBuilder{request: psTopologyReq}
-	return builder
+	psTopologyReq.PodIndexLabel = p.podIndexLabel
+	psTopologyReq.SubGroupCount = p.subGroupCount
+	psTopologyReq.SubGroupIndexLabel = p.subGroupIndexLabel
+
+	return &psTopologyReq, nil
 }
diff --git a/pkg/controller/jobframework/tas_validation.go b/pkg/controller/jobframework/tas_validation.go
index 0a2ce57a6..e54a8b01d 100644
--- a/pkg/controller/jobframework/tas_validation.go
+++ b/pkg/controller/jobframework/tas_validation.go
@@ -76,9 +76,6 @@ func ValidateTASPodSetRequest(replicaPath *field.Path, replicaMetadata *metav1.O
 
 	// validate slice annotations
 	if sliceRequiredFound {
-		if !requiredFound && !preferredFound {
-			allErrs = append(allErrs, field.Forbidden(annotationsPath.Key(kueuealpha.PodSetSliceRequiredTopologyAnnotation), "can be used with required or preferred topology only"))
-		}
 		if !sliceSizeFound {
 			allErrs = append(allErrs, field.Required(annotationsPath.Key(kueuealpha.PodSetSliceSizeAnnotation), "slice size is required if slice topology is requested"))
 		}
diff --git a/pkg/controller/jobs/appwrapper/appwrapper_controller.go b/pkg/controller/jobs/appwrapper/appwrapper_controller.go
index 2c6300673..c3c7c6fc7 100644
--- a/pkg/controller/jobs/appwrapper/appwrapper_controller.go
+++ b/pkg/controller/jobs/appwrapper/appwrapper_controller.go
@@ -147,9 +147,13 @@ func (j *AppWrapper) PodSets() ([]kueue.PodSet, error) {
 			Count:    awutils.Replicas(awPodSets[psIndex]),
 		}
 		if features.Enabled(features.TopologyAwareScheduling) {
-			podSets[psIndex].TopologyRequest = jobframework.NewPodSetTopologyRequest(
+			topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 				&(podSpecTemplates[psIndex].ObjectMeta)).
 				PodIndexLabel(podIndexLabel).SubGroup(subGroupIndexLabel, subGroupCount).Build()
+			if err != nil {
+				return nil, err
+			}
+			podSets[psIndex].TopologyRequest = topologyRequest
 		}
 	}
 	return podSets, nil
diff --git a/pkg/controller/jobs/job/job_controller.go b/pkg/controller/jobs/job/job_controller.go
index 30a0704d9..c8cc26495 100644
--- a/pkg/controller/jobs/job/job_controller.go
+++ b/pkg/controller/jobs/job/job_controller.go
@@ -251,9 +251,13 @@ func (j *Job) PodSets() ([]kueue.PodSet, error) {
 		MinCount: j.minPodsCount(),
 	}
 	if features.Enabled(features.TopologyAwareScheduling) {
-		podSet.TopologyRequest = jobframework.NewPodSetTopologyRequest(
+		topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 			&j.Spec.Template.ObjectMeta).PodIndexLabel(
 			ptr.To(batchv1.JobCompletionIndexAnnotation)).Build()
+		if err != nil {
+			return nil, err
+		}
+		podSet.TopologyRequest = topologyRequest
 	}
 	return []kueue.PodSet{
 		podSet,
diff --git a/pkg/controller/jobs/job/job_multikueue_adapter.go b/pkg/controller/jobs/job/job_multikueue_adapter.go
index 8dd9564b6..8dcd082e2 100644
--- a/pkg/controller/jobs/job/job_multikueue_adapter.go
+++ b/pkg/controller/jobs/job/job_multikueue_adapter.go
@@ -61,13 +61,12 @@ func (b *multiKueueAdapter) SyncJob(ctx context.Context, localClient client.Clie
 
 	// the remote job exists
 	if err == nil {
-		if fromObject(&localJob).IsSuspended() {
-			// Ensure the job is unsuspended before updating its status; otherwise, it will fail when patching the spec.
-			log.V(2).Info("Skipping the sync since the local job is still suspended")
-			return nil
-		}
-
 		if features.Enabled(features.MultiKueueBatchJobWithManagedBy) {
+			if fromObject(&localJob).IsSuspended() {
+				// Ensure the job is unsuspended before updating its status; otherwise, it will fail when patching the spec.
+				log.V(2).Info("Skipping the sync since the local job is still suspended")
+				return nil
+			}
 			return clientutil.PatchStatus(ctx, localClient, &localJob, func() (bool, error) {
 				localJob.Status = remoteJob.Status
 				return true, nil
diff --git a/pkg/controller/jobs/jobset/jobset_controller.go b/pkg/controller/jobs/jobset/jobset_controller.go
index b84cad3a0..57a44a929 100644
--- a/pkg/controller/jobs/jobset/jobset_controller.go
+++ b/pkg/controller/jobs/jobset/jobset_controller.go
@@ -120,11 +120,15 @@ func (j *JobSet) PodSets() ([]kueue.PodSet, error) {
 			Count:    podsCount(&replicatedJob),
 		}
 		if features.Enabled(features.TopologyAwareScheduling) {
-			podSets[index].TopologyRequest = jobframework.NewPodSetTopologyRequest(
+			topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 				&replicatedJob.Template.Spec.Template.ObjectMeta).PodIndexLabel(
 				ptr.To(batchv1.JobCompletionIndexAnnotation)).SubGroup(
 				ptr.To(jobsetapi.JobIndexKey),
 				ptr.To(replicatedJob.Replicas)).Build()
+			if err != nil {
+				return nil, err
+			}
+			podSets[index].TopologyRequest = topologyRequest
 		}
 	}
 	return podSets, nil
diff --git a/pkg/controller/jobs/kubeflow/kubeflowjob/kubeflowjob_controller.go b/pkg/controller/jobs/kubeflow/kubeflowjob/kubeflowjob_controller.go
index 2cbe58dab..1e2885068 100644
--- a/pkg/controller/jobs/kubeflow/kubeflowjob/kubeflowjob_controller.go
+++ b/pkg/controller/jobs/kubeflow/kubeflowjob/kubeflowjob_controller.go
@@ -108,9 +108,13 @@ func (j *KubeflowJob) PodSets() ([]kueue.PodSet, error) {
 			Count:    podsCount(j.KFJobControl.ReplicaSpecs(), replicaType),
 		}
 		if features.Enabled(features.TopologyAwareScheduling) {
-			podSets[index].TopologyRequest = jobframework.NewPodSetTopologyRequest(
+			topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 				&j.KFJobControl.ReplicaSpecs()[replicaType].Template.ObjectMeta).PodIndexLabel(
 				ptr.To(kftraining.ReplicaIndexLabel)).Build()
+			if err != nil {
+				return nil, err
+			}
+			podSets[index].TopologyRequest = topologyRequest
 		}
 	}
 	return podSets, nil
diff --git a/pkg/controller/jobs/leaderworkerset/leaderworkerset_reconciler.go b/pkg/controller/jobs/leaderworkerset/leaderworkerset_reconciler.go
index cce69b451..872f55287 100644
--- a/pkg/controller/jobs/leaderworkerset/leaderworkerset_reconciler.go
+++ b/pkg/controller/jobs/leaderworkerset/leaderworkerset_reconciler.go
@@ -184,14 +184,18 @@ func (r *Reconciler) createPrebuiltWorkload(ctx context.Context, lws *leaderwork
 }
 
 func (r *Reconciler) constructWorkload(lws *leaderworkersetv1.LeaderWorkerSet, workloadName string) (*kueue.Workload, error) {
-	createdWorkload := podcontroller.NewGroupWorkload(workloadName, lws, r.podSets(lws), r.labelKeysToCopy)
+	podSets, err := r.podSets(lws)
+	if err != nil {
+		return nil, err
+	}
+	createdWorkload := podcontroller.NewGroupWorkload(workloadName, lws, podSets, r.labelKeysToCopy)
 	if err := controllerutil.SetOwnerReference(lws, createdWorkload, r.client.Scheme()); err != nil {
 		return nil, err
 	}
 	return createdWorkload, nil
 }
 
-func (r *Reconciler) podSets(lws *leaderworkersetv1.LeaderWorkerSet) []kueue.PodSet {
+func (r *Reconciler) podSets(lws *leaderworkersetv1.LeaderWorkerSet) ([]kueue.PodSet, error) {
 	podSets := make([]kueue.PodSet, 0, 2)
 
 	if lws.Spec.LeaderWorkerTemplate.LeaderTemplate != nil {
@@ -203,8 +207,12 @@ func (r *Reconciler) podSets(lws *leaderworkersetv1.LeaderWorkerSet) []kueue.Pod
 			},
 		}
 		if features.Enabled(features.TopologyAwareScheduling) {
-			podSet.TopologyRequest = jobframework.NewPodSetTopologyRequest(
+			topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 				&lws.Spec.LeaderWorkerTemplate.LeaderTemplate.ObjectMeta).Build()
+			if err != nil {
+				return nil, err
+			}
+			podSet.TopologyRequest = topologyRequest
 		}
 		podSets = append(podSets, podSet)
 	}
@@ -228,14 +236,18 @@ func (r *Reconciler) podSets(lws *leaderworkersetv1.LeaderWorkerSet) []kueue.Pod
 	}
 
 	if features.Enabled(features.TopologyAwareScheduling) {
-		podSet.TopologyRequest = jobframework.NewPodSetTopologyRequest(
+		topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 			&lws.Spec.LeaderWorkerTemplate.WorkerTemplate.ObjectMeta).PodIndexLabel(
 			ptr.To(leaderworkersetv1.WorkerIndexLabelKey)).Build()
+		if err != nil {
+			return nil, err
+		}
+		podSet.TopologyRequest = topologyRequest
 	}
 
 	podSets = append(podSets, podSet)
 
-	return podSets
+	return podSets, nil
 }
 
 func (r *Reconciler) removeOwnerReference(ctx context.Context, lws *leaderworkersetv1.LeaderWorkerSet, wl *kueue.Workload) error {
diff --git a/pkg/controller/jobs/mpijob/mpijob_controller.go b/pkg/controller/jobs/mpijob/mpijob_controller.go
index be604d498..c752c310d 100644
--- a/pkg/controller/jobs/mpijob/mpijob_controller.go
+++ b/pkg/controller/jobs/mpijob/mpijob_controller.go
@@ -119,9 +119,13 @@ func (j *MPIJob) PodSets() ([]kueue.PodSet, error) {
 			Count:    podsCount(&j.Spec, mpiReplicaType),
 		}
 		if features.Enabled(features.TopologyAwareScheduling) {
-			podSets[index].TopologyRequest = jobframework.NewPodSetTopologyRequest(
+			topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 				&j.Spec.MPIReplicaSpecs[mpiReplicaType].Template.ObjectMeta).PodIndexLabel(
 				ptr.To(kfmpi.ReplicaIndexLabel)).Build()
+			if err != nil {
+				return nil, err
+			}
+			podSets[index].TopologyRequest = topologyRequest
 		}
 	}
 	return podSets, nil
diff --git a/pkg/controller/jobs/pod/pod_controller.go b/pkg/controller/jobs/pod/pod_controller.go
index 3133daa0c..b3857a2f6 100644
--- a/pkg/controller/jobs/pod/pod_controller.go
+++ b/pkg/controller/jobs/pod/pod_controller.go
@@ -385,7 +385,7 @@ func (p *Pod) Finished() (message string, success, finished bool) {
 // PodSets will build workload podSets corresponding to the job.
 func (p *Pod) PodSets() ([]kueue.PodSet, error) {
 	if !p.isGroup {
-		return constructPodSets(&p.pod), nil
+		return constructPodSets(&p.pod)
 	} else {
 		return p.constructGroupPodSets()
 	}
@@ -642,13 +642,17 @@ func (p *Pod) constructGroupPodSets() ([]kueue.PodSet, error) {
 	return constructGroupPodSets(p.list.Items)
 }
 
-func constructPodSets(p *corev1.Pod) []kueue.PodSet {
-	return []kueue.PodSet{
-		constructPodSet(p),
+func constructPodSets(p *corev1.Pod) ([]kueue.PodSet, error) {
+	podSet, err := constructPodSet(p)
+	if err != nil {
+		return nil, err
 	}
+	return []kueue.PodSet{
+		podSet,
+	}, nil
 }
 
-func constructPodSet(p *corev1.Pod) kueue.PodSet {
+func constructPodSet(p *corev1.Pod) (kueue.PodSet, error) {
 	podSet := kueue.PodSet{
 		Name:  kueue.DefaultPodSetName,
 		Count: 1,
@@ -657,11 +661,15 @@ func constructPodSet(p *corev1.Pod) kueue.PodSet {
 		},
 	}
 	if features.Enabled(features.TopologyAwareScheduling) {
-		podSet.TopologyRequest = jobframework.NewPodSetTopologyRequest(
+		topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 			&p.ObjectMeta).PodIndexLabel(
 			ptr.To(kueuealpha.PodGroupPodIndexLabel)).Build()
+		if err != nil {
+			return kueue.PodSet{}, err
+		}
+		podSet.TopologyRequest = topologyRequest
 	}
-	return podSet
+	return podSet, nil
 }
 
 func constructGroupPodSetsFast(pods []corev1.Pod, groupTotalCount int) ([]kueue.PodSet, error) {
@@ -673,7 +681,10 @@ func constructGroupPodSetsFast(pods []corev1.Pod, groupTotalCount int) ([]kueue.
 		if err != nil {
 			return nil, fmt.Errorf("failed to calculate pod role hash: %w", err)
 		}
-		podSets := constructPodSets(&podInGroup)
+		podSets, err := constructPodSets(&podInGroup)
+		if err != nil {
+			return nil, err
+		}
 		podSets[0].Name = kueue.NewPodSetReference(roleHash)
 		podSets[0].Count = int32(groupTotalCount)
 		return podSets, nil
@@ -705,7 +716,10 @@ func constructGroupPodSets(pods []corev1.Pod) ([]kueue.PodSet, error) {
 		}
 
 		if !podRoleFound {
-			podSet := constructPodSet(&podInGroup)
+			podSet, err := constructPodSet(&podInGroup)
+			if err != nil {
+				return nil, err
+			}
 			podSet.Name = kueue.NewPodSetReference(roleHash)
 
 			resultPodSets = append(resultPodSets, podSet)
diff --git a/pkg/controller/jobs/raycluster/raycluster_controller.go b/pkg/controller/jobs/raycluster/raycluster_controller.go
index 3a7dde7b1..baf700805 100644
--- a/pkg/controller/jobs/raycluster/raycluster_controller.go
+++ b/pkg/controller/jobs/raycluster/raycluster_controller.go
@@ -113,8 +113,12 @@ func (j *RayCluster) PodSets() ([]kueue.PodSet, error) {
 	}
 
 	if features.Enabled(features.TopologyAwareScheduling) {
-		podSets[0].TopologyRequest = jobframework.NewPodSetTopologyRequest(
+		topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 			&j.Spec.HeadGroupSpec.Template.ObjectMeta).Build()
+		if err != nil {
+			return nil, err
+		}
+		podSets[0].TopologyRequest = topologyRequest
 	}
 
 	// workers
@@ -133,8 +137,12 @@ func (j *RayCluster) PodSets() ([]kueue.PodSet, error) {
 			Count:    count,
 		}
 		if features.Enabled(features.TopologyAwareScheduling) {
-			podSets[index+1].TopologyRequest = jobframework.NewPodSetTopologyRequest(
+			topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 				&wgs.Template.ObjectMeta).Build()
+			if err != nil {
+				return nil, err
+			}
+			podSets[index+1].TopologyRequest = topologyRequest
 		}
 	}
 	return podSets, nil
diff --git a/pkg/controller/jobs/rayjob/rayjob_controller.go b/pkg/controller/jobs/rayjob/rayjob_controller.go
index 38cf765cb..2c2f39fd0 100644
--- a/pkg/controller/jobs/rayjob/rayjob_controller.go
+++ b/pkg/controller/jobs/rayjob/rayjob_controller.go
@@ -121,8 +121,12 @@ func (j *RayJob) PodSets() ([]kueue.PodSet, error) {
 		Count:    1,
 	}
 	if features.Enabled(features.TopologyAwareScheduling) {
-		headPodSet.TopologyRequest = jobframework.NewPodSetTopologyRequest(
+		topologyRequest, err := jobframework.NewPodSetTopologyRequest(
 			&j.Spec.RayClusterSpec.HeadGroupSpec.Template.ObjectMeta).Build()
+		if err != nil {
+			return nil, err
+		}
+		headPodSet.TopologyRequest = topologyRequest
 	}
 	podSets = append(podSets, headPodSet)
 
@@ -142,7 +146,11 @@ func (j *RayJob) PodSets() ([]kueue.PodSet, error) {
 			Count:    count,
 		}
 		if features.Enabled(features.TopologyAwareScheduling) {
-			workerPodSet.TopologyRequest = jobframework.NewPodSetTopologyRequest(&wgs.Template.ObjectMeta).Build()
+			topologyRequest, err := jobframework.NewPodSetTopologyRequest(&wgs.Template.ObjectMeta).Build()
+			if err != nil {
+				return nil, err
+			}
+			workerPodSet.TopologyRequest = topologyRequest
 		}
 		podSets = append(podSets, workerPodSet)
 	}
@@ -158,7 +166,11 @@ func (j *RayJob) PodSets() ([]kueue.PodSet, error) {
 		// Create the TopologyRequest for the Submitter Job PodSet, based on the annotations
 		// in rayJob.Spec.SubmitterPodTemplate, which can be specified by the user.
 		if features.Enabled(features.TopologyAwareScheduling) {
-			submitterJobPodSet.TopologyRequest = jobframework.NewPodSetTopologyRequest(&submitterJobPodSet.Template.ObjectMeta).Build()
+			topologyRequest, err := jobframework.NewPodSetTopologyRequest(&submitterJobPodSet.Template.ObjectMeta).Build()
+			if err != nil {
+				return nil, err
+			}
+			submitterJobPodSet.TopologyRequest = topologyRequest
 		}
 		podSets = append(podSets, submitterJobPodSet)
 	}
diff --git a/pkg/controller/jobs/statefulset/statefulset_webhook.go b/pkg/controller/jobs/statefulset/statefulset_webhook.go
index 71e48893a..96c250e5e 100644
--- a/pkg/controller/jobs/statefulset/statefulset_webhook.go
+++ b/pkg/controller/jobs/statefulset/statefulset_webhook.go
@@ -76,26 +76,26 @@ func (wh *Webhook) Default(ctx context.Context, obj runtime.Object) error {
 		return err
 	}
 	if suspend {
-		if ss.Spec.Template.Annotations == nil {
-			ss.Spec.Template.Annotations = make(map[string]string, 1)
-		}
-		ss.Spec.Template.Annotations[podconstants.SuspendedByParentAnnotation] = FrameworkName
 		if ss.Spec.Template.Labels == nil {
-			ss.Spec.Template.Labels = make(map[string]string, 1)
+			ss.Spec.Template.Labels = make(map[string]string, 4)
 		}
 		ss.Spec.Template.Labels[constants.ManagedByKueueLabelKey] = constants.ManagedByKueueLabelValue
-		queueName := jobframework.QueueNameForObject(ss.Object())
-		if queueName != "" {
+		ss.Spec.Template.Labels[podconstants.GroupNameLabel] = GetWorkloadName(ss.Name)
+		if queueName := jobframework.QueueNameForObject(ss.Object()); queueName != "" {
 			ss.Spec.Template.Labels[controllerconstants.QueueLabel] = string(queueName)
-			ss.Spec.Template.Labels[podconstants.GroupNameLabel] = GetWorkloadName(ss.Name)
-			ss.Spec.Template.Annotations[podconstants.GroupTotalCountAnnotation] = fmt.Sprint(ptr.Deref(ss.Spec.Replicas, 1))
-			ss.Spec.Template.Annotations[podconstants.GroupFastAdmissionAnnotationKey] = podconstants.GroupFastAdmissionAnnotationValue
-			ss.Spec.Template.Annotations[podconstants.GroupServingAnnotationKey] = podconstants.GroupServingAnnotationValue
-			ss.Spec.Template.Annotations[kueuealpha.PodGroupPodIndexLabelAnnotation] = appsv1.PodIndexLabel
 		}
 		if priorityClass := jobframework.WorkloadPriorityClassName(ss.Object()); priorityClass != "" {
 			ss.Spec.Template.Labels[controllerconstants.WorkloadPriorityClassLabel] = priorityClass
 		}
+
+		if ss.Spec.Template.Annotations == nil {
+			ss.Spec.Template.Annotations = make(map[string]string, 5)
+		}
+		ss.Spec.Template.Annotations[podconstants.SuspendedByParentAnnotation] = FrameworkName
+		ss.Spec.Template.Annotations[podconstants.GroupTotalCountAnnotation] = fmt.Sprint(ptr.Deref(ss.Spec.Replicas, 1))
+		ss.Spec.Template.Annotations[podconstants.GroupFastAdmissionAnnotationKey] = podconstants.GroupFastAdmissionAnnotationValue
+		ss.Spec.Template.Annotations[podconstants.GroupServingAnnotationKey] = podconstants.GroupServingAnnotationValue
+		ss.Spec.Template.Annotations[kueuealpha.PodGroupPodIndexLabelAnnotation] = appsv1.PodIndexLabel
 	}
 
 	return nil
diff --git a/pkg/queue/manager.go b/pkg/queue/manager.go
index f69bbef00..2683d2f6d 100644
--- a/pkg/queue/manager.go
+++ b/pkg/queue/manager.go
@@ -163,13 +163,13 @@ func (m *Manager) NotifyTopologyUpdateWatchers(oldTopology, newTopology *kueueal
 	}
 }
 
-func (m *Manager) AddOrUpdateCohort(ctx context.Context, cohort *kueuealpha.Cohort) {
+func (m *Manager) AddOrUpdateCohort(ctx context.Context, cohort *kueue.Cohort) {
 	m.Lock()
 	defer m.Unlock()
 	cohortName := kueue.CohortReference(cohort.Name)
 
 	m.hm.AddCohort(cohortName)
-	m.hm.UpdateCohortEdge(cohortName, cohort.Spec.Parent)
+	m.hm.UpdateCohortEdge(cohortName, cohort.Spec.ParentName)
 	if m.requeueWorkloadsCohort(ctx, m.hm.Cohort(cohortName)) {
 		m.Broadcast()
 	}
diff --git a/pkg/scheduler/flavorassigner/flavorassigner.go b/pkg/scheduler/flavorassigner/flavorassigner.go
index 556d5a960..212ad664b 100644
--- a/pkg/scheduler/flavorassigner/flavorassigner.go
+++ b/pkg/scheduler/flavorassigner/flavorassigner.go
@@ -39,7 +39,7 @@ import (
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/resources"
 	"sigs.k8s.io/kueue/pkg/scheduler/preemption/classical"
-	"sigs.k8s.io/kueue/pkg/scheduler/preemption/preemptioncommon"
+	preemptioncommon "sigs.k8s.io/kueue/pkg/scheduler/preemption/common"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
@@ -292,14 +292,15 @@ type FlavorAssignmentMode int
 // The flavor assignment modes below are ordered from lowest to highest
 // preference.
 const (
-	// NoFit means that there is not enough quota to assign this flavor.
+	// NoFit means that there is not enough quota to assign this flavor,
+	// or we require preemption but we are already borrowing, and policy
+	// does not allow this.
 	NoFit FlavorAssignmentMode = iota
-	// Preempt means that there is not enough unused nominal quota in the ClusterQueue
-	// or cohort. Preempting other workloads in the ClusterQueue or cohort, or
-	// waiting for them to finish might make it possible to assign this flavor.
+	// Preempt indicates that admission is possible given Quotas.
+	// Preemption may be impossible due to policy/limits/priorities.
 	Preempt
-	// Fit means that there is enough unused quota in the cohort to assign this
-	// flavor.
+	// Fit means that there is enough unused quota to assign to this Flavor
+	// without preeemption, potentially with borrowing.
 	Fit
 )
 
@@ -322,20 +323,44 @@ type granularMode int
 
 const (
 	noFit granularMode = iota
+	// noPreemptionCandidates indicates that admission is possible with
+	// preemption, but simulation found no preemption targets.
+	noPreemptionCandidates
 	preempt
 	reclaim
 	fit
 )
 
+func fromPreemptionPossibility(preemptionPossibility preemptioncommon.PreemptionPossibility) granularMode {
+	switch preemptionPossibility {
+	case preemptioncommon.NoCandidates:
+		return noPreemptionCandidates
+	case preemptioncommon.Preempt:
+		return preempt
+	case preemptioncommon.Reclaim:
+		return reclaim
+	}
+	panic("illegal state")
+}
+
 func (mode granularMode) flavorAssignmentMode() FlavorAssignmentMode {
-	if mode == fit {
-		return Fit
-	} else if mode.isPreemptMode() {
+	switch mode {
+	case noFit:
+		return NoFit
+	case noPreemptionCandidates:
+		return Preempt
+	case preempt:
 		return Preempt
+	case reclaim:
+		return Preempt
+	case fit:
+		return Fit
+	default:
+		panic("illegal state")
 	}
-	return NoFit
 }
 
+// isPreemptMode indicates a mode where preemption targets were found.
 func (mode granularMode) isPreemptMode() bool {
 	return mode == preempt || mode == reclaim
 }
@@ -737,23 +762,15 @@ func (a *FlavorAssigner) fitsResourceQuota(log logr.Logger, fr resources.FlavorR
 		return fit, borrow, nil
 	}
 
-	// Check if preemption is possible
-	mode := noFit
-	// For single-level hierarchies, mayReclaimInHierarchy = true iff val <= rQuota.Nominal
-	preemptionPossibility := a.oracle.SimulatePreemption(log, a.cq, *a.wl, fr, val)
-	if val <= rQuota.Nominal || mayReclaimInHierarchy {
-		mode = preempt
-		if preemptionPossibility == preemptioncommon.Reclaim {
-			mode = reclaim
-		}
-	} else if a.canPreemptWhileBorrowing() && (preemptionPossibility != preemptioncommon.None) {
-		mode = preempt
-	}
-
+	// Preempt
 	status.appendf("insufficient unused quota for %s in flavor %s, %s more needed",
 		fr.Resource, fr.Flavor, resources.ResourceQuantityString(fr.Resource, val-available))
 
-	return mode, borrow, &status
+	if val <= rQuota.Nominal || mayReclaimInHierarchy || a.canPreemptWhileBorrowing() {
+		mode := fromPreemptionPossibility(a.oracle.SimulatePreemption(log, a.cq, *a.wl, fr, val))
+		return mode, borrow, &status
+	}
+	return noFit, borrow, &status
 }
 
 func (a *FlavorAssigner) canPreemptWhileBorrowing() bool {
diff --git a/pkg/scheduler/preemption/preemptioncommon/types.go b/pkg/scheduler/preemption/common/types.go
similarity index 67%
rename from pkg/scheduler/preemption/preemptioncommon/types.go
rename to pkg/scheduler/preemption/common/types.go
index e34a0bd32..1dfa93097 100644
--- a/pkg/scheduler/preemption/preemptioncommon/types.go
+++ b/pkg/scheduler/preemption/common/types.go
@@ -16,17 +16,17 @@ limitations under the License.
 
 package preemptioncommon
 
+// PreemptionPossibility represents the result
+// of a preemption simulation.
 type PreemptionPossibility int
 
-// Preemption Oracle returns one of three possible
-// results of the preemption simulation.
 const (
-	// Preemption in the given resource flavor is
-	// impossible
-	None PreemptionPossibility = iota
-	// Priority-based preemption may be possible
-	// but reclaim is impossible
-	PriorityBased
-	// Reclaim may be possible
+	// NoCandidates were found.
+	NoCandidates PreemptionPossibility = iota
+	// Preemption targets were found.
+	Preempt
+	// Preemption targets were found, and
+	// all of them are outside of preempting
+	// ClusterQueue.
 	Reclaim
 )
diff --git a/pkg/scheduler/preemption/preemption_oracle.go b/pkg/scheduler/preemption/preemption_oracle.go
index 8514672c8..b4fca0d02 100644
--- a/pkg/scheduler/preemption/preemption_oracle.go
+++ b/pkg/scheduler/preemption/preemption_oracle.go
@@ -22,7 +22,7 @@ import (
 
 	"sigs.k8s.io/kueue/pkg/cache"
 	"sigs.k8s.io/kueue/pkg/resources"
-	"sigs.k8s.io/kueue/pkg/scheduler/preemption/preemptioncommon"
+	preemptioncommon "sigs.k8s.io/kueue/pkg/scheduler/preemption/common"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
@@ -47,11 +47,11 @@ func (p *PreemptionOracle) SimulatePreemption(log logr.Logger, cq *cache.Cluster
 		workloadUsage:     workload.Usage{Quota: resources.FlavorResourceQuantities{fr: quantity}},
 	})
 	if len(candidates) == 0 {
-		return preemptioncommon.None
+		return preemptioncommon.NoCandidates
 	}
 	for _, candidate := range candidates {
 		if candidate.WorkloadInfo.ClusterQueue == cq.Name {
-			return preemptioncommon.PriorityBased
+			return preemptioncommon.Preempt
 		}
 	}
 	return preemptioncommon.Reclaim
diff --git a/pkg/webhooks/cohort_webhook.go b/pkg/webhooks/cohort_webhook.go
index 1c0c21cdb..51148f1c0 100644
--- a/pkg/webhooks/cohort_webhook.go
+++ b/pkg/webhooks/cohort_webhook.go
@@ -25,37 +25,37 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 )
 
 type CohortWebhook struct{}
 
 func setupWebhookForCohort(mgr ctrl.Manager) error {
 	return ctrl.NewWebhookManagedBy(mgr).
-		For(&kueuealpha.Cohort{}).
+		For(&kueue.Cohort{}).
 		WithValidator(&CohortWebhook{}).
 		Complete()
 }
 
-func (w *CohortWebhook) Default(ctx context.Context, obj runtime.Object) error {
+func (w *CohortWebhook) Default(context.Context, runtime.Object) error {
 	return nil
 }
 
-//+kubebuilder:webhook:path=/validate-kueue-x-k8s-io-v1alpha1-cohort,mutating=false,failurePolicy=fail,sideEffects=None,groups=kueue.x-k8s.io,resources=cohorts,verbs=create;update,versions=v1alpha1,name=vcohort.kb.io,admissionReviewVersions=v1
+//+kubebuilder:webhook:path=/validate-kueue-x-k8s-io-v1beta1-cohort,mutating=false,failurePolicy=fail,sideEffects=None,groups=kueue.x-k8s.io,resources=cohorts,verbs=create;update,versions=v1beta1,name=vcohort.kb.io,admissionReviewVersions=v1
 
 var _ webhook.CustomValidator = &CohortWebhook{}
 
 // ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type
 func (w *CohortWebhook) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
-	cohort := obj.(*kueuealpha.Cohort)
+	cohort := obj.(*kueue.Cohort)
 	log := ctrl.LoggerFrom(ctx).WithName("cohort-webhook")
 	log.V(5).Info("Validating Cohort create")
 	return nil, validateCohort(cohort).ToAggregate()
 }
 
 // ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type
-func (w *CohortWebhook) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
-	cohort := newObj.(*kueuealpha.Cohort)
+func (w *CohortWebhook) ValidateUpdate(ctx context.Context, _, newObj runtime.Object) (admission.Warnings, error) {
+	cohort := newObj.(*kueue.Cohort)
 	log := ctrl.LoggerFrom(ctx).WithName("cohort-webhook")
 	log.V(5).Info("Validating Cohort update")
 	return nil, validateCohort(cohort).ToAggregate()
@@ -66,10 +66,10 @@ func (w *CohortWebhook) ValidateDelete(_ context.Context, _ runtime.Object) (adm
 	return nil, nil
 }
 
-func validateCohort(cohort *kueuealpha.Cohort) field.ErrorList {
+func validateCohort(cohort *kueue.Cohort) field.ErrorList {
 	path := field.NewPath("spec")
 	config := validationConfig{
-		hasParent:                        cohort.Spec.Parent != "",
+		hasParent:                        cohort.Spec.ParentName != "",
 		enforceNominalGreaterThanLending: false,
 	}
 	var allErrs field.ErrorList
diff --git a/site/content/en/docs/concepts/cohort.md b/site/content/en/docs/concepts/cohort.md
index c7edaea9f..aee56c273 100644
--- a/site/content/en/docs/concepts/cohort.md
+++ b/site/content/en/docs/concepts/cohort.md
@@ -10,7 +10,7 @@ description: >
 Cohorts give you the ability to organize your Quotas. ClusterQueues within the same Cohort (or same CohortTree for [Hierarchical Cohorts](#hierarchical-cohorts)) can share resources with each other. The simplest possible Cohort is the following:
 
 ```yaml
-apiVersion: kueue.x-k8s.io/v1alpha1
+apiVersion: kueue.x-k8s.io/v1beta1
 kind: Cohort
 metadata:
   name: "hello-cohort"
@@ -31,7 +31,7 @@ spec:
 Similarly to [ClusterQueues](/docs/concepts/cluster_queue/#flavors-and-resources) Resource quotas may be defined at the Cohort level, and consumed by ClusterQueues within the Cohort.
 
 ```yaml
-apiVersion: kueue.x-k8s.io/v1alpha1
+apiVersion: kueue.x-k8s.io/v1beta1
 kind: Cohort
 metadata:
   name: "hello-cohort"
@@ -73,26 +73,26 @@ These Borrowing and Lending Limits can be specified for Cohorts, as well as for
 
 Here is a simple CohortTree, with three Cohorts:
 ```yaml
-apiVersion: kueue.x-k8s.io/v1alpha1
+apiVersion: kueue.x-k8s.io/v1beta1
 kind: Cohort
 metadata:
   name: "root-cohort"
 ---
-apiVersion: kueue.x-k8s.io/v1alpha1
+apiVersion: kueue.x-k8s.io/v1beta1
 kind: Cohort
 metadata:
   name: "important-org"
 spec:
-  parent: "root-cohort"
+  parentName: "root-cohort"
   fairSharing:
     weight: "0.75"
 ---
-apiVersion: kueue.x-k8s.io/v1alpha1
+apiVersion: kueue.x-k8s.io/v1beta1
 kind: Cohort
 metadata:
   name: "regular-org"
 spec:
-  parent: "root-cohort"
+  parentName: "root-cohort"
   fairSharing:
     weight: "0.25"
 ```
diff --git a/site/content/en/docs/concepts/multikueue.md b/site/content/en/docs/concepts/multikueue.md
index f2c198434..bce963830 100644
--- a/site/content/en/docs/concepts/multikueue.md
+++ b/site/content/en/docs/concepts/multikueue.md
@@ -76,11 +76,11 @@ The supported version of the Kubeflow Trainer is v1.7.0, or a newer version.
 The Management cluster should only install the CRDs and not the package itself. 
 On the other hand, the Worker cluster should install the full kubeflow operator.
 
-## Plain Pods
+### Plain Pods
 
 MultiKueue supports the remote creation and management of Plain Pods and Group of Pods.
 
-## Deployments
+### Deployments
 
 MultiKueue supports the remote creation and management of Deployment replica Pods.
 
diff --git a/site/content/en/docs/reference/kueue-alpha.v1alpha1.md b/site/content/en/docs/reference/kueue-alpha.v1alpha1.md
index 06318fec3..1dc6e23ab 100644
--- a/site/content/en/docs/reference/kueue-alpha.v1alpha1.md
+++ b/site/content/en/docs/reference/kueue-alpha.v1alpha1.md
@@ -10,46 +10,9 @@ description: Generated API reference documentation for kueue.x-k8s.io/v1alpha1.
 ## Resource Types 
 
 
-- [Cohort](#kueue-x-k8s-io-v1alpha1-Cohort)
 - [Topology](#kueue-x-k8s-io-v1alpha1-Topology)
   
 
-## `Cohort`     {#kueue-x-k8s-io-v1alpha1-Cohort}
-    
-
-**Appears in:**
-
-
-
-<p>Cohort defines the Cohorts API.</p>
-<p>Hierarchical Cohorts (any Cohort which has a parent) are compatible
-with Fair Sharing as of v0.11. Using these features together in
-V0.9 and V0.10 is unsupported, and results in undefined behavior.</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/v1alpha1</code></td></tr>
-<tr><td><code>kind</code><br/>string</td><td><code>Cohort</code></td></tr>
-    
-  
-<tr><td><code>spec</code> <B>[Required]</B><br/>
-<a href="#kueue-x-k8s-io-v1alpha1-CohortSpec"><code>CohortSpec</code></a>
-</td>
-<td>
-   <span class="text-muted">No description provided.</span></td>
-</tr>
-<tr><td><code>status</code> <B>[Required]</B><br/>
-<a href="#kueue-x-k8s-io-v1alpha1-CohortStatus"><code>CohortStatus</code></a>
-</td>
-<td>
-   <span class="text-muted">No description provided.</span></td>
-</tr>
-</tbody>
-</table>
-
 ## `Topology`     {#kueue-x-k8s-io-v1alpha1-Topology}
     
 
@@ -77,98 +40,6 @@ V0.9 and V0.10 is unsupported, and results in undefined behavior.</p>
 </tbody>
 </table>
 
-## `CohortSpec`     {#kueue-x-k8s-io-v1alpha1-CohortSpec}
-    
-
-**Appears in:**
-
-- [Cohort](#kueue-x-k8s-io-v1alpha1-Cohort)
-
-
-<p>CohortSpec defines the desired state of Cohort</p>
-
-
-<table class="table">
-<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
-<tbody>
-    
-  
-<tr><td><code>parent</code> <B>[Required]</B><br/>
-<a href="#kueue-x-k8s-io-v1beta1-CohortReference"><code>CohortReference</code></a>
-</td>
-<td>
-   <p>Parent references the name of the Cohort's parent, if
-any. It satisfies one of three cases:</p>
-<ol>
-<li>Unset. This Cohort is the root of its Cohort tree.</li>
-<li>References a non-existent Cohort. We use default Cohort (no borrowing/lending limits).</li>
-<li>References an existent Cohort.</li>
-</ol>
-<p>If a cycle is created, we disable all members of the
-Cohort, including ClusterQueues, until the cycle is
-removed.  We prevent further admission while the cycle
-exists.</p>
-</td>
-</tr>
-<tr><td><code>resourceGroups</code> <B>[Required]</B><br/>
-<a href="#kueue-x-k8s-io-v1beta1-ResourceGroup"><code>[]ResourceGroup</code></a>
-</td>
-<td>
-   <p>ResourceGroups describes groupings of Resources and
-Flavors.  Each ResourceGroup defines a list of Resources
-and a list of Flavors which provide quotas for these
-Resources. Each Resource and each Flavor may only form part
-of one ResourceGroup.  There may be up to 16 ResourceGroups
-within a Cohort.</p>
-<p>BorrowingLimit limits how much members of this Cohort
-subtree can borrow from the parent subtree.</p>
-<p>LendingLimit limits how much members of this Cohort subtree
-can lend to the parent subtree.</p>
-<p>Borrowing and Lending limits must only be set when the
-Cohort has a parent.  Otherwise, the Cohort create/update
-will be rejected by the webhook.</p>
-</td>
-</tr>
-<tr><td><code>fairSharing</code><br/>
-<a href="#kueue-x-k8s-io-v1beta1-FairSharing"><code>FairSharing</code></a>
-</td>
-<td>
-   <p>fairSharing defines the properties of the Cohort when
-participating in FairSharing. The values are only relevant
-if FairSharing is enabled in the Kueue configuration.</p>
-</td>
-</tr>
-</tbody>
-</table>
-
-## `CohortStatus`     {#kueue-x-k8s-io-v1alpha1-CohortStatus}
-    
-
-**Appears in:**
-
-- [Cohort](#kueue-x-k8s-io-v1alpha1-Cohort)
-
-
-<p>CohortStatus defines the observed state of Cohort.</p>
-
-
-<table class="table">
-<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
-<tbody>
-    
-  
-<tr><td><code>fairSharing</code><br/>
-<a href="#kueue-x-k8s-io-v1beta1-FairSharingStatus"><code>FairSharingStatus</code></a>
-</td>
-<td>
-   <p>fairSharing contains the current state for this Cohort
-when participating in Fair Sharing.
-The is recorded only when Fair Sharing is enabled in the Kueue configuration.</p>
-</td>
-</tr>
-</tbody>
-</table>
-
 ## `TopologyLevel`     {#kueue-x-k8s-io-v1alpha1-TopologyLevel}
     
 
diff --git a/site/content/en/docs/reference/kueue.v1beta1.md b/site/content/en/docs/reference/kueue.v1beta1.md
index 2c7783fb3..ea378e67f 100644
--- a/site/content/en/docs/reference/kueue.v1beta1.md
+++ b/site/content/en/docs/reference/kueue.v1beta1.md
@@ -12,6 +12,7 @@ description: Generated API reference documentation for kueue.x-k8s.io/v1beta1.
 
 - [AdmissionCheck](#kueue-x-k8s-io-v1beta1-AdmissionCheck)
 - [ClusterQueue](#kueue-x-k8s-io-v1beta1-ClusterQueue)
+- [Cohort](#kueue-x-k8s-io-v1beta1-Cohort)
 - [LocalQueue](#kueue-x-k8s-io-v1beta1-LocalQueue)
 - [MultiKueueCluster](#kueue-x-k8s-io-v1beta1-MultiKueueCluster)
 - [MultiKueueConfig](#kueue-x-k8s-io-v1beta1-MultiKueueConfig)
@@ -87,6 +88,42 @@ description: Generated API reference documentation for kueue.x-k8s.io/v1beta1.
 </tbody>
 </table>
 
+## `Cohort`     {#kueue-x-k8s-io-v1beta1-Cohort}
+    
+
+**Appears in:**
+
+
+
+<p>Cohort defines the Cohorts API.</p>
+<p>Hierarchical Cohorts (any Cohort which has a parent) are compatible
+with Fair Sharing as of v0.11. Using these features together in
+V0.9 and V0.10 is unsupported, and results in undefined behavior.</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>Cohort</code></td></tr>
+    
+  
+<tr><td><code>spec</code> <B>[Required]</B><br/>
+<a href="#kueue-x-k8s-io-v1beta1-CohortSpec"><code>CohortSpec</code></a>
+</td>
+<td>
+   <span class="text-muted">No description provided.</span></td>
+</tr>
+<tr><td><code>status</code> <B>[Required]</B><br/>
+<a href="#kueue-x-k8s-io-v1beta1-CohortStatus"><code>CohortStatus</code></a>
+</td>
+<td>
+   <span class="text-muted">No description provided.</span></td>
+</tr>
+</tbody>
+</table>
+
 ## `LocalQueue`     {#kueue-x-k8s-io-v1beta1-LocalQueue}
     
 
@@ -1115,6 +1152,8 @@ This is recorded only when Fair Sharing is enabled in the Kueue configuration.</
 
 - [ClusterQueueSpec](#kueue-x-k8s-io-v1beta1-ClusterQueueSpec)
 
+- [CohortSpec](#kueue-x-k8s-io-v1beta1-CohortSpec)
+
 
 <p>CohortReference is the name of the Cohort.</p>
 <p>Validation of a cohort name is equivalent to that of object names:
@@ -1123,6 +1162,98 @@ subdomain in DNS (RFC 1123).</p>
 
 
 
+## `CohortSpec`     {#kueue-x-k8s-io-v1beta1-CohortSpec}
+    
+
+**Appears in:**
+
+- [Cohort](#kueue-x-k8s-io-v1beta1-Cohort)
+
+
+<p>CohortSpec defines the desired state of Cohort</p>
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>parentName</code> <B>[Required]</B><br/>
+<a href="#kueue-x-k8s-io-v1beta1-CohortReference"><code>CohortReference</code></a>
+</td>
+<td>
+   <p>ParentName references the name of the Cohort's parent, if
+any. It satisfies one of three cases:</p>
+<ol>
+<li>Unset. This Cohort is the root of its Cohort tree.</li>
+<li>References a non-existent Cohort. We use default Cohort (no borrowing/lending limits).</li>
+<li>References an existent Cohort.</li>
+</ol>
+<p>If a cycle is created, we disable all members of the
+Cohort, including ClusterQueues, until the cycle is
+removed.  We prevent further admission while the cycle
+exists.</p>
+</td>
+</tr>
+<tr><td><code>resourceGroups</code> <B>[Required]</B><br/>
+<a href="#kueue-x-k8s-io-v1beta1-ResourceGroup"><code>[]ResourceGroup</code></a>
+</td>
+<td>
+   <p>ResourceGroups describes groupings of Resources and
+Flavors.  Each ResourceGroup defines a list of Resources
+and a list of Flavors which provide quotas for these
+Resources. Each Resource and each Flavor may only form part
+of one ResourceGroup.  There may be up to 16 ResourceGroups
+within a Cohort.</p>
+<p>BorrowingLimit limits how much members of this Cohort
+subtree can borrow from the parent subtree.</p>
+<p>LendingLimit limits how much members of this Cohort subtree
+can lend to the parent subtree.</p>
+<p>Borrowing and Lending limits must only be set when the
+Cohort has a parent.  Otherwise, the Cohort create/update
+will be rejected by the webhook.</p>
+</td>
+</tr>
+<tr><td><code>fairSharing</code><br/>
+<a href="#kueue-x-k8s-io-v1beta1-FairSharing"><code>FairSharing</code></a>
+</td>
+<td>
+   <p>fairSharing defines the properties of the Cohort when
+participating in FairSharing. The values are only relevant
+if FairSharing is enabled in the Kueue configuration.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
+## `CohortStatus`     {#kueue-x-k8s-io-v1beta1-CohortStatus}
+    
+
+**Appears in:**
+
+- [Cohort](#kueue-x-k8s-io-v1beta1-Cohort)
+
+
+<p>CohortStatus defines the observed state of Cohort.</p>
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>fairSharing</code><br/>
+<a href="#kueue-x-k8s-io-v1beta1-FairSharingStatus"><code>FairSharingStatus</code></a>
+</td>
+<td>
+   <p>fairSharing contains the current state for this Cohort
+when participating in Fair Sharing.
+The is recorded only when Fair Sharing is enabled in the Kueue configuration.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
 ## `DelayedTopologyRequestState`     {#kueue-x-k8s-io-v1beta1-DelayedTopologyRequestState}
     
 (Alias of `string`)
@@ -1144,6 +1275,8 @@ subdomain in DNS (RFC 1123).</p>
 
 - [ClusterQueueSpec](#kueue-x-k8s-io-v1beta1-ClusterQueueSpec)
 
+- [CohortSpec](#kueue-x-k8s-io-v1beta1-CohortSpec)
+
 - [LocalQueueSpec](#kueue-x-k8s-io-v1beta1-LocalQueueSpec)
 
 
@@ -1185,6 +1318,8 @@ disadvantage against other ClusterQueues and Cohorts.</p>
 
 - [ClusterQueueStatus](#kueue-x-k8s-io-v1beta1-ClusterQueueStatus)
 
+- [CohortStatus](#kueue-x-k8s-io-v1beta1-CohortStatus)
+
 - [LocalQueueStatus](#kueue-x-k8s-io-v1beta1-LocalQueueStatus)
 
 
@@ -2506,6 +2641,8 @@ nodes matching to the Resource Flavor node labels.</p>
 
 - [ClusterQueueSpec](#kueue-x-k8s-io-v1beta1-ClusterQueueSpec)
 
+- [CohortSpec](#kueue-x-k8s-io-v1beta1-CohortSpec)
+
 
 
 <table class="table">



Test patch:
diff --git a/pkg/cache/cache_test.go b/pkg/cache/cache_test.go
index 3d2c7de9c..b5218cdb9 100644
--- a/pkg/cache/cache_test.go
+++ b/pkg/cache/cache_test.go
@@ -3734,7 +3734,7 @@ func TestCohortCycles(t *testing.T) {
 				t.Errorf("Unexpected resource (-want,+got):\n%s", diff)
 			}
 		}
-		cohort.Spec.Parent = "root2"
+		cohort.Spec.ParentName = "root2"
 		if err := cache.AddOrUpdateCohort(cohort); err != nil {
 			t.Fatal("Expected success")
 		}
@@ -3778,7 +3778,7 @@ func TestCohortCycles(t *testing.T) {
 			t.Fatal("Expected failure")
 		}
 
-		cohort.Spec.Parent = "root"
+		cohort.Spec.ParentName = "root"
 		if err := cache.AddOrUpdateCohort(cohort); err != nil {
 			t.Fatal("Expected success")
 		}
@@ -3825,7 +3825,7 @@ func TestCohortCycles(t *testing.T) {
 			}
 		}
 
-		cohort.Spec.Parent = "cycle-root"
+		cohort.Spec.ParentName = "cycle-root"
 		if err := cache.AddOrUpdateCohort(cohort); err == nil {
 			t.Fatal("Expected failure")
 		}
@@ -3910,7 +3910,7 @@ func TestSnapshotError(t *testing.T) {
 
 func TestClusterQueueAncestors(t *testing.T) {
 	testCases := map[string]struct {
-		cohorts       []*kueuealpha.Cohort
+		cohorts       []*kueue.Cohort
 		cq            *kueue.ClusterQueue
 		wantAncestors []kueue.CohortReference
 		wantErr       error
@@ -3922,14 +3922,14 @@ func TestClusterQueueAncestors(t *testing.T) {
 			cq: utiltesting.MakeClusterQueue("cq").Cohort("root").Obj(),
 		},
 		"one level": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("root").Obj(),
 			},
 			cq:            utiltesting.MakeClusterQueue("cq").Cohort("root").Obj(),
 			wantAncestors: []kueue.CohortReference{},
 		},
 		"two level": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("root").Obj(),
 				utiltesting.MakeCohort("left").Parent("root").Obj(),
 				utiltesting.MakeCohort("right").Parent("root").Obj(),
@@ -3938,7 +3938,7 @@ func TestClusterQueueAncestors(t *testing.T) {
 			wantAncestors: []kueue.CohortReference{"left"},
 		},
 		"three levels": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("root").Obj(),
 				utiltesting.MakeCohort("first-left").Parent("root").Obj(),
 				utiltesting.MakeCohort("first-right").Parent("root").Obj(),
@@ -3949,7 +3949,7 @@ func TestClusterQueueAncestors(t *testing.T) {
 			wantAncestors: []kueue.CohortReference{"second-left", "first-left"},
 		},
 		"with cycle": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("root").Parent("second-right").Obj(),
 				utiltesting.MakeCohort("first-left").Parent("root").Obj(),
 				utiltesting.MakeCohort("first-right").Parent("root").Obj(),
diff --git a/pkg/cache/fair_sharing_test.go b/pkg/cache/fair_sharing_test.go
index 608f81ec2..8a80c4a3f 100644
--- a/pkg/cache/fair_sharing_test.go
+++ b/pkg/cache/fair_sharing_test.go
@@ -26,7 +26,6 @@ import (
 	"k8s.io/apimachinery/pkg/api/resource"
 	"k8s.io/apimachinery/pkg/util/sets"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/resources"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -51,7 +50,7 @@ func TestDominantResourceShare(t *testing.T) {
 		usage               resources.FlavorResourceQuantities
 		clusterQueue        *kueue.ClusterQueue
 		lendingClusterQueue *kueue.ClusterQueue
-		cohorts             []*kueuealpha.Cohort
+		cohorts             []*kueue.Cohort
 		flvResQ             resources.FlavorResourceQuantities
 		want                []fairSharingResult
 	}{
@@ -487,7 +486,7 @@ func TestDominantResourceShare(t *testing.T) {
 						ResourceQuotaWrapper("example.com/gpu").NominalQuota("5").Append().
 						FlavorQuotas,
 				).Obj(),
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("child-cohort").FairWeight(resource.MustParse("2")).Parent("root").Obj(),
 				utiltesting.MakeCohort("root").ResourceGroup(
 					utiltesting.MakeFlavorQuotas("default").
@@ -528,7 +527,7 @@ func TestDominantResourceShare(t *testing.T) {
 						ResourceQuotaWrapper("example.com/gpu").NominalQuota("0").Append().
 						FlavorQuotas,
 				).Obj(),
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("child-cohort").FairWeight(resource.MustParse("2")).Parent("root").Obj(),
 				utiltesting.MakeCohort("root").ResourceGroup(
 					utiltesting.MakeFlavorQuotas("default").
@@ -571,7 +570,7 @@ func TestDominantResourceShare(t *testing.T) {
 						ResourceQuotaWrapper("example.com/gpu").NominalQuota("0").Append().
 						FlavorQuotas,
 				).Obj(),
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("child-cohort").ResourceGroup(
 					utiltesting.MakeFlavorQuotas("default").
 						ResourceQuotaWrapper("example.com/gpu").NominalQuota("0").BorrowingLimit("10").Append().
diff --git a/pkg/cache/resource_test.go b/pkg/cache/resource_test.go
index 063042c60..9c1d3e771 100644
--- a/pkg/cache/resource_test.go
+++ b/pkg/cache/resource_test.go
@@ -21,7 +21,6 @@ import (
 
 	"github.com/google/go-cmp/cmp"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/resources"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -30,7 +29,7 @@ import (
 
 func TestAvailable(t *testing.T) {
 	cases := map[string]struct {
-		cohorts                  []kueuealpha.Cohort
+		cohorts                  []kueue.Cohort
 		clusterQueues            []kueue.ClusterQueue
 		usage                    map[kueue.ClusterQueueReference]resources.FlavorResourceQuantities
 		wantAvailable            map[kueue.ClusterQueueReference]resources.FlavorResourceQuantities
@@ -77,7 +76,7 @@ func TestAvailable(t *testing.T) {
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10", "", "9").Obj(),
 					).ClusterQueue,
 			},
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("cohort").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10").Obj(),
@@ -104,7 +103,7 @@ func TestAvailable(t *testing.T) {
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10").Obj(),
 					).ClusterQueue,
 			},
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("cohort").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10").Obj(),
@@ -127,7 +126,7 @@ func TestAvailable(t *testing.T) {
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10", "0", "0").Obj(),
 					).ClusterQueue,
 			},
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("cohort").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10").Obj(),
@@ -173,7 +172,7 @@ func TestAvailable(t *testing.T) {
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10", "", "5").Obj(),
 					).ClusterQueue,
 			},
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("cohort").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10").Obj(),
@@ -221,7 +220,7 @@ func TestAvailable(t *testing.T) {
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10", "", "0").Obj(),
 					).ClusterQueue,
 			},
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("root").Cohort,
 				utiltesting.MakeCohort("left").
 					Parent("root").
@@ -273,7 +272,7 @@ func TestAvailable(t *testing.T) {
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "10").Obj(),
 					).ClusterQueue,
 			},
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("root").Cohort,
 				utiltesting.MakeCohort("left").
 					Parent("root").
@@ -328,7 +327,7 @@ func TestAvailable(t *testing.T) {
 						*utiltesting.MakeFlavorQuotas("red").Resource("cpu", "0").Obj(),
 					).ClusterQueue,
 			},
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("root").Cohort,
 				utiltesting.MakeCohort("left").
 					Parent("root").
diff --git a/pkg/cache/snapshot_test.go b/pkg/cache/snapshot_test.go
index 637dcfee1..0d5a0a4f3 100644
--- a/pkg/cache/snapshot_test.go
+++ b/pkg/cache/snapshot_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/sets"
 	"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/hierarchy"
@@ -48,7 +47,7 @@ var snapCmpOpts = cmp.Options{
 func TestSnapshot(t *testing.T) {
 	testCases := map[string]struct {
 		cqs                 []*kueue.ClusterQueue
-		cohorts             []*kueuealpha.Cohort
+		cohorts             []*kueue.Cohort
 		rfs                 []*kueue.ResourceFlavor
 		wls                 []*kueue.Workload
 		wantSnapshot        Snapshot
@@ -736,7 +735,7 @@ func TestSnapshot(t *testing.T) {
 					).
 					Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("cohort").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("arm").Resource(corev1.ResourceCPU, "10").Obj(),
@@ -805,7 +804,7 @@ func TestSnapshot(t *testing.T) {
 			rfs: []*kueue.ResourceFlavor{
 				utiltesting.MakeResourceFlavor("arm").Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("autocycle").Parent("autocycle").Obj(),
 				utiltesting.MakeCohort("cycle-a").Parent("cycle-b").Obj(),
 				utiltesting.MakeCohort("cycle-b").Parent("cycle-a").Obj(),
@@ -879,7 +878,7 @@ func TestSnapshot(t *testing.T) {
 			},
 		},
 		"cohort snapshot has fair sharing weight": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("cohort").FairWeight(resource.MustParse("0.5")).Obj(),
 			},
 			wantSnapshot: Snapshot{
diff --git a/pkg/cache/tas_cache_test.go b/pkg/cache/tas_cache_test.go
index 186d6e503..e9fd9f133 100644
--- a/pkg/cache/tas_cache_test.go
+++ b/pkg/cache/tas_cache_test.go
@@ -2798,6 +2798,142 @@ func TestFindTopologyAssignment(t *testing.T) {
 			count:      1,
 			wantReason: "no requested topology level for slices: not-existing-topology-level",
 		},
+		"no topology for podset; host required for slices; BestFit": {
+			//        b1
+			//         |
+			//        r1
+			//    /    |    \
+			// x1:3, x2:3, x3:3
+			//
+			nodes: []corev1.Node{
+				*testingnode.MakeNode("b1-r1-x1").
+					Label(tasBlockLabel, "b1").
+					Label(tasRackLabel, "r1").
+					Label(corev1.LabelHostname, "x1").
+					StatusAllocatable(corev1.ResourceList{
+						corev1.ResourceCPU:  resource.MustParse("3"),
+						corev1.ResourcePods: resource.MustParse("10"),
+					}).
+					Ready().
+					Obj(),
+				*testingnode.MakeNode("b1-r1-x2").
+					Label(tasBlockLabel, "b1").
+					Label(tasRackLabel, "r1").
+					Label(corev1.LabelHostname, "x2").
+					StatusAllocatable(corev1.ResourceList{
+						corev1.ResourceCPU:  resource.MustParse("3"),
+						corev1.ResourcePods: resource.MustParse("10"),
+					}).
+					Ready().
+					Obj(),
+				*testingnode.MakeNode("b1-r1-x3").
+					Label(tasBlockLabel, "b1").
+					Label(tasRackLabel, "r1").
+					Label(corev1.LabelHostname, "x3").
+					StatusAllocatable(corev1.ResourceList{
+						corev1.ResourceCPU:  resource.MustParse("3"),
+						corev1.ResourcePods: resource.MustParse("10"),
+					}).
+					Ready().
+					Obj(),
+			},
+			topologyRequest: &kueue.PodSetTopologyRequest{
+				PodSetSliceRequiredTopology: ptr.To(corev1.LabelHostname),
+				PodSetSliceSize:             ptr.To(int32(2)),
+			},
+			levels: defaultThreeLevels,
+			requests: resources.Requests{
+				corev1.ResourceCPU: 1000,
+			},
+			count: 6,
+			wantAssignment: &kueue.TopologyAssignment{
+				Levels: defaultOneLevel,
+				Domains: []kueue.TopologyDomainAssignment{
+					{
+						Count: 2,
+						Values: []string{
+							"x3",
+						},
+					},
+					{
+						Count: 2,
+						Values: []string{
+							"x2",
+						},
+					},
+					{
+						Count: 2,
+						Values: []string{
+							"x1",
+						},
+					},
+				},
+			},
+		},
+		"no topology for podset; host required for slices; multiple blocks; BestFit": {
+			nodes: scatteredNodes,
+			topologyRequest: &kueue.PodSetTopologyRequest{
+				PodSetSliceRequiredTopology: ptr.To(corev1.LabelHostname),
+				PodSetSliceSize:             ptr.To(int32(2)),
+			},
+			levels: defaultThreeLevels,
+			requests: resources.Requests{
+				corev1.ResourceCPU: 1000,
+			},
+			count: 6,
+			wantAssignment: &kueue.TopologyAssignment{
+				Levels: defaultOneLevel,
+				Domains: []kueue.TopologyDomainAssignment{
+					{
+						Count: 4,
+						Values: []string{
+							"x1",
+						},
+					},
+					{
+						Count: 2,
+						Values: []string{
+							"x4",
+						},
+					},
+				},
+			},
+		},
+		"no topology for podset; rack required for slices; multiple blocks; BestFit": {
+			nodes: defaultNodes,
+			topologyRequest: &kueue.PodSetTopologyRequest{
+				PodSetSliceRequiredTopology: ptr.To(tasRackLabel),
+				PodSetSliceSize:             ptr.To(int32(2)),
+			},
+			levels: defaultThreeLevels,
+			requests: resources.Requests{
+				corev1.ResourceCPU: 1000,
+			},
+			count: 4,
+			wantAssignment: &kueue.TopologyAssignment{
+				Levels: defaultOneLevel,
+				Domains: []kueue.TopologyDomainAssignment{
+					{
+						Count: 1,
+						Values: []string{
+							"x2",
+						},
+					},
+					{
+						Count: 1,
+						Values: []string{
+							"x3",
+						},
+					},
+					{
+						Count: 2,
+						Values: []string{
+							"x6",
+						},
+					},
+				},
+			},
+		},
 	}
 	for name, tc := range cases {
 		t.Run(name, func(t *testing.T) {
diff --git a/pkg/controller/core/cohort_controller_test.go b/pkg/controller/core/cohort_controller_test.go
index 005463ed6..326e68097 100644
--- a/pkg/controller/core/cohort_controller_test.go
+++ b/pkg/controller/core/cohort_controller_test.go
@@ -28,7 +28,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	kueue "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache"
 	"sigs.k8s.io/kueue/pkg/queue"
 	"sigs.k8s.io/kueue/pkg/resources"
@@ -134,7 +134,7 @@ func TestCohortReconcileCycleNoError(t *testing.T) {
 	if err := cl.Get(ctx, client.ObjectKeyFromObject(cohortB), cohortB); err != nil {
 		t.Fatal("unexpected error")
 	}
-	cohortB.Spec.Parent = "cohort-c"
+	cohortB.Spec.ParentName = "cohort-c"
 	if err := cl.Update(ctx, cohortB); err != nil {
 		t.Fatal("unexpected error updating cohort", err)
 	}
diff --git a/pkg/controller/jobs/job/job_webhook_test.go b/pkg/controller/jobs/job/job_webhook_test.go
index 0ee068168..3faf19d42 100644
--- a/pkg/controller/jobs/job/job_webhook_test.go
+++ b/pkg/controller/jobs/job/job_webhook_test.go
@@ -287,15 +287,13 @@ func TestValidateCreate(t *testing.T) {
 			wantErr: nil,
 		},
 		{
-			name: "invalid topology request - unconstrained with slices defined",
+			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").
 				Obj(),
-			wantErr: field.ErrorList{
-				field.Forbidden(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-required-topology"), "can be used with required or preferred topology only"),
-			},
+			wantErr: nil,
 		},
 		{
 			name: "invalid topology request - slice requested without slice size",
@@ -351,14 +349,12 @@ func TestValidateCreate(t *testing.T) {
 			},
 		},
 		{
-			name: "invalid topology request - slice topology requested without podset topology",
+			name: "valid topology request - slice-only topology",
 			job: testingutil.MakeJob("job", "default").
 				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
 				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
 				Obj(),
-			wantErr: field.ErrorList{
-				field.Forbidden(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-required-topology"), "can be used with required or preferred topology only"),
-			},
+			wantErr: nil,
 		},
 	}
 
@@ -639,12 +635,11 @@ func TestValidateUpdate(t *testing.T) {
 			oldJob: testingutil.MakeJob("job", "default").
 				Obj(),
 			newJob: testingutil.MakeJob("job", "default").
-				PodAnnotation(kueuealpha.PodSetUnconstrainedTopologyAnnotation, "true").
+				PodAnnotation(kueuealpha.PodSetRequiredTopologyAnnotation, "cloud.com/block").
 				PodAnnotation(kueuealpha.PodSetSliceRequiredTopologyAnnotation, "cloud.com/block").
-				PodAnnotation(kueuealpha.PodSetSliceSizeAnnotation, "1").
 				Obj(),
 			wantErr: field.ErrorList{
-				field.Forbidden(replicaMetaPath.Child("annotations").Key("kueue.x-k8s.io/podset-slice-required-topology"), "can be used with required or preferred topology only"),
+				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/statefulset/statefulset_webhook_test.go b/pkg/controller/jobs/statefulset/statefulset_webhook_test.go
index 617ffc061..d3fe6741c 100644
--- a/pkg/controller/jobs/statefulset/statefulset_webhook_test.go
+++ b/pkg/controller/jobs/statefulset/statefulset_webhook_test.go
@@ -29,6 +29,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 	leaderworkersetv1 "sigs.k8s.io/lws/api/leaderworkerset/v1"
 
@@ -48,6 +49,7 @@ import (
 
 func TestDefault(t *testing.T) {
 	testCases := map[string]struct {
+		initObjs                   []client.Object
 		statefulset                *appsv1.StatefulSet
 		manageJobsWithoutQueueName bool
 		localQueueDefaulting       bool
@@ -55,6 +57,24 @@ func TestDefault(t *testing.T) {
 		enableIntegrations         []string
 		want                       *appsv1.StatefulSet
 	}{
+		"statefulset without queue with manageJobsWithoutQueueName": {
+			enableIntegrations:         []string{"pod"},
+			manageJobsWithoutQueueName: true,
+			initObjs:                   []client.Object{utiltesting.MakeNamespace("test-ns")},
+			statefulset: testingstatefulset.MakeStatefulSet("test-pod", "test-ns").
+				Replicas(10).
+				Obj(),
+			want: testingstatefulset.MakeStatefulSet("test-pod", "test-ns").
+				Replicas(10).
+				PodTemplateManagedByKueue().
+				PodTemplateAnnotation(podconstants.SuspendedByParentAnnotation, FrameworkName).
+				PodTemplateSpecPodGroupNameLabel("test-pod", "", gvk).
+				PodTemplateSpecPodGroupTotalCountAnnotation(10).
+				PodTemplateSpecPodGroupFastAdmissionAnnotation().
+				PodTemplateSpecPodGroupServingAnnotation().
+				PodTemplateSpecPodGroupPodIndexLabelAnnotation(appsv1.PodIndexLabel).
+				Obj(),
+		},
 		"statefulset with queue": {
 			enableIntegrations: []string{"pod"},
 			statefulset: testingstatefulset.MakeStatefulSet("test-pod", "").
@@ -159,7 +179,7 @@ func TestDefault(t *testing.T) {
 			t.Cleanup(jobframework.EnableIntegrationsForTest(t, tc.enableIntegrations...))
 			ctx, _ := utiltesting.ContextWithLog(t)
 
-			builder := utiltesting.NewClientBuilder()
+			builder := utiltesting.NewClientBuilder().WithObjects(tc.initObjs...)
 			cli := builder.Build()
 			cqCache := cache.New(cli)
 			queueManager := queue.NewManager(cli, cqCache)
diff --git a/pkg/queue/manager_test.go b/pkg/queue/manager_test.go
index c4d77e408..60da40de5 100644
--- a/pkg/queue/manager_test.go
+++ b/pkg/queue/manager_test.go
@@ -32,7 +32,6 @@ import (
 	testingclock "k8s.io/utils/clock/testing"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/workload"
@@ -211,7 +210,7 @@ func TestUpdateClusterQueue(t *testing.T) {
 }
 
 func TestRequeueWorkloadsCohortCycle(t *testing.T) {
-	cohorts := []*kueuealpha.Cohort{
+	cohorts := []*kueue.Cohort{
 		utiltesting.MakeCohort("cohort-a").Parent("cohort-b").Obj(),
 		utiltesting.MakeCohort("cohort-b").Parent("cohort-c").Obj(),
 		utiltesting.MakeCohort("cohort-c").Parent("cohort-a").Obj(),
diff --git a/pkg/scheduler/flavorassigner/flavorassigner_test.go b/pkg/scheduler/flavorassigner/flavorassigner_test.go
index 3524e395a..0996ef73c 100644
--- a/pkg/scheduler/flavorassigner/flavorassigner_test.go
+++ b/pkg/scheduler/flavorassigner/flavorassigner_test.go
@@ -26,29 +26,26 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
 
-	kueuealpha "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/cache"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/resources"
-	"sigs.k8s.io/kueue/pkg/scheduler/preemption/preemptioncommon"
+	preemptioncommon "sigs.k8s.io/kueue/pkg/scheduler/preemption/common"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
 type testOracle struct {
-	CanPreemptInCohort bool
+	simulationResult map[resources.FlavorResource]preemptioncommon.PreemptionPossibility
 }
 
 func (f *testOracle) SimulatePreemption(log logr.Logger, cq *cache.ClusterQueueSnapshot, wl workload.Info, fr resources.FlavorResource, quantity int64) preemptioncommon.PreemptionPossibility {
-	if !cq.BorrowingWith(fr, quantity) {
-		return preemptioncommon.Reclaim
-	}
-	if f.CanPreemptInCohort {
-		return preemptioncommon.PriorityBased
-	} else {
-		return preemptioncommon.None
+	if f.simulationResult != nil {
+		if result, ok := f.simulationResult[fr]; ok {
+			return result
+		}
 	}
+	return preemptioncommon.Preempt
 }
 
 func TestAssignFlavors(t *testing.T) {
@@ -90,7 +87,7 @@ func TestAssignFlavors(t *testing.T) {
 		wantAssignment             Assignment
 		disableLendingLimit        bool
 		enableFairSharing          bool
-		cannotPreemptInCohort      bool
+		simulationResult           map[resources.FlavorResource]preemptioncommon.PreemptionPossibility
 	}{
 		"single flavor, fits": {
 			wlPods: []kueue.PodSet{
@@ -1824,8 +1821,10 @@ func TestAssignFlavors(t *testing.T) {
 			secondaryClusterQueueUsage: resources.FlavorResourceQuantities{
 				{Flavor: "one", Resource: corev1.ResourceCPU}: 2_000,
 			},
-			cannotPreemptInCohort: true,
-			wantRepMode:           Fit,
+			simulationResult: map[resources.FlavorResource]preemptioncommon.PreemptionPossibility{
+				{Flavor: "one", Resource: corev1.ResourceCPU}: preemptioncommon.NoCandidates,
+			},
+			wantRepMode: Fit,
 			wantAssignment: Assignment{
 				PodSets: []PodSetAssignment{{
 					Name: kueue.DefaultPodSetName,
@@ -1944,7 +1943,7 @@ func TestAssignFlavors(t *testing.T) {
 				}},
 			},
 		},
-		"when borrowing while preemption is needed for flavor one, fair sharing enabled, reclaimWithinCohor=Never": {
+		"when borrowing while preemption is needed for flavor one, fair sharing enabled, reclaimWithinCohort=Never": {
 			enableFairSharing: true,
 			wlPods: []kueue.PodSet{
 				*utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).
@@ -1973,6 +1972,9 @@ func TestAssignFlavors(t *testing.T) {
 			secondaryClusterQueueUsage: resources.FlavorResourceQuantities{
 				{Flavor: "one", Resource: corev1.ResourceCPU}: 10_000,
 			},
+			simulationResult: map[resources.FlavorResource]preemptioncommon.PreemptionPossibility{
+				{Flavor: "one", Resource: corev1.ResourceCPU}: preemptioncommon.NoCandidates,
+			},
 			wantRepMode: Fit,
 			wantAssignment: Assignment{
 				PodSets: []PodSetAssignment{{
@@ -2047,7 +2049,7 @@ func TestAssignFlavors(t *testing.T) {
 				secondaryClusterQueue.AddUsage(workload.Usage{Quota: tc.secondaryClusterQueueUsage})
 			}
 
-			flvAssigner := New(wlInfo, clusterQueue, resourceFlavors, tc.enableFairSharing, &testOracle{CanPreemptInCohort: !tc.cannotPreemptInCohort})
+			flvAssigner := New(wlInfo, clusterQueue, resourceFlavors, tc.enableFairSharing, &testOracle{simulationResult: tc.simulationResult})
 			assignment := flvAssigner.Assign(log, nil)
 			if repMode := assignment.RepresentativeMode(); repMode != tc.wantRepMode {
 				t.Errorf("e.assignFlavors(_).RepresentativeMode()=%s, want %s", repMode, tc.wantRepMode)
@@ -2072,6 +2074,7 @@ func TestReclaimBeforePriorityPreemption(t *testing.T) {
 		flavorFungibility      *kueue.FlavorFungibility
 		wantMode               FlavorAssignmentMode
 		wantAssigment          rfMap
+		simulationResult       map[resources.FlavorResource]preemptioncommon.PreemptionPossibility
 	}{
 		"Select first flavor which fits": {
 			workloadRequests: utiltesting.MakePodSet(kueue.DefaultPodSetName, 1).Request("gpu", "10"),
@@ -2093,6 +2096,10 @@ func TestReclaimBeforePriorityPreemption(t *testing.T) {
 				{Flavor: "due", Resource: "gpu"}: 1,
 				{Flavor: "tre", Resource: "gpu"}: 1,
 			},
+			simulationResult: map[resources.FlavorResource]preemptioncommon.PreemptionPossibility{
+				{Flavor: "uno", Resource: "gpu"}: preemptioncommon.Preempt,
+				{Flavor: "due", Resource: "gpu"}: preemptioncommon.Reclaim,
+			},
 			wantMode:      Preempt,
 			wantAssigment: rfMap{"gpu": "due"},
 		},
@@ -2132,6 +2139,11 @@ func TestReclaimBeforePriorityPreemption(t *testing.T) {
 				{Flavor: "due", Resource: "gpu"}: 1,
 				{Flavor: "tre", Resource: "gpu"}: 1,
 			},
+			simulationResult: map[resources.FlavorResource]preemptioncommon.PreemptionPossibility{
+				{Flavor: "uno", Resource: "gpu"}: preemptioncommon.Preempt,
+				{Flavor: "due", Resource: "gpu"}: preemptioncommon.Reclaim,
+				{Flavor: "tre", Resource: "gpu"}: preemptioncommon.Reclaim,
+			},
 			wantMode:      Preempt,
 			wantAssigment: rfMap{"gpu": "tre", "compute": "tre"},
 		},
@@ -2200,7 +2212,7 @@ func TestReclaimBeforePriorityPreemption(t *testing.T) {
 			testClusterQueue := snapshot.ClusterQueue("test-clusterqueue")
 			testClusterQueue.AddUsage(workload.Usage{Quota: tc.testClusterQueueUsage})
 
-			flvAssigner := New(wlInfo, testClusterQueue, resourceFlavors, false, &testOracle{})
+			flvAssigner := New(wlInfo, testClusterQueue, resourceFlavors, false, &testOracle{tc.simulationResult})
 			assignment := flvAssigner.Assign(log, nil)
 			if gotRepMode := assignment.RepresentativeMode(); gotRepMode != tc.wantMode {
 				t.Errorf("Unexpected RepresentativeMode. got %s, want %s", gotRepMode, tc.wantMode)
@@ -2432,7 +2444,7 @@ func TestHierarchical(t *testing.T) {
 				"two":   utiltesting.MakeResourceFlavor("two").Obj(),
 				"three": utiltesting.MakeResourceFlavor("three").Obj(),
 			}
-			cohorts := []*kueuealpha.Cohort{
+			cohorts := []*kueue.Cohort{
 				utiltesting.MakeCohort("three").
 					ResourceGroup(*utiltesting.MakeFlavorQuotas("three").
 						Resource(corev1.ResourceCPU, "4").
diff --git a/pkg/scheduler/preemption/preemption_test.go b/pkg/scheduler/preemption/preemption_test.go
index ebdd1fc10..b4c9149f0 100644
--- a/pkg/scheduler/preemption/preemption_test.go
+++ b/pkg/scheduler/preemption/preemption_test.go
@@ -37,7 +37,6 @@ import (
 	"k8s.io/utils/ptr"
 
 	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"
 	"sigs.k8s.io/kueue/pkg/constants"
@@ -278,7 +277,7 @@ func TestPreemption(t *testing.T) {
 	}
 	cases := map[string]struct {
 		clusterQueues       []*kueue.ClusterQueue
-		cohorts             []*kueuealpha.Cohort
+		cohorts             []*kueue.Cohort
 		admitted            []kueue.Workload
 		incoming            *kueue.Workload
 		targetCQ            kueue.ClusterQueueReference
@@ -1779,7 +1778,7 @@ func TestPreemption(t *testing.T) {
 					).
 					Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("cohort-left").Parent("root").Obj(),
 				utiltesting.MakeCohort("cohort-right").Parent("root").Obj(),
 			},
@@ -1930,7 +1929,7 @@ func TestFairPreemptions(t *testing.T) {
 	unitWl := *utiltesting.MakeWorkload("unit", "").Request(corev1.ResourceCPU, "1")
 	cases := map[string]struct {
 		clusterQueues []*kueue.ClusterQueue
-		cohorts       []*kueuealpha.Cohort
+		cohorts       []*kueue.Cohort
 		strategies    []config.PreemptionStrategy
 		admitted      []kueue.Workload
 		incoming      *kueue.Workload
@@ -2360,7 +2359,7 @@ func TestFairPreemptions(t *testing.T) {
 					FairWeight(resource.MustParse("0")).
 					Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("right-cohort").
 					FairWeight(resource.MustParse("0")).
 					ResourceGroup(*utiltesting.MakeFlavorQuotas("default").
@@ -2445,7 +2444,7 @@ func TestFairPreemptions(t *testing.T) {
 						Resource(corev1.ResourceCPU, "1").Obj()).
 					Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("ROOT").
 					ResourceGroup(*utiltesting.MakeFlavorQuotas("default").
 						Resource(corev1.ResourceCPU, "5").Obj()).
@@ -2521,7 +2520,7 @@ func TestFairPreemptions(t *testing.T) {
 					FairWeight(resource.MustParse("0.1")).
 					Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("ROOT").Obj(),
 				utiltesting.MakeCohort("RIGHT").Parent("ROOT").
 					FairWeight(resource.MustParse("0.1")).
@@ -2569,7 +2568,7 @@ func TestFairPreemptions(t *testing.T) {
 					FairWeight(resource.MustParse("0.1")).
 					Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("ROOT").Obj(),
 				utiltesting.MakeCohort("RIGHT").Parent("ROOT").
 					FairWeight(resource.MustParse("0.1")).
@@ -2621,7 +2620,7 @@ func TestFairPreemptions(t *testing.T) {
 						Resource(corev1.ResourceCPU, "0").Obj()).
 					Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("ROOT").Obj(),
 				utiltesting.MakeCohort("A").Parent("ROOT").
 					// we are comparing
@@ -2706,7 +2705,7 @@ func TestFairPreemptions(t *testing.T) {
 					FairWeight(resource.MustParse("1.0")).
 					Obj(),
 			},
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("A").
 					Parent("ROOT").
 					FairWeight(resource.MustParse("0.0")).
@@ -2886,7 +2885,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 	}
 	cases := map[string]struct {
 		clusterQueues []*kueue.ClusterQueue
-		cohorts       []*kueuealpha.Cohort
+		cohorts       []*kueue.Cohort
 		admitted      []kueue.Workload
 		incoming      *kueue.Workload
 		targetCQ      kueue.ClusterQueueReference
@@ -2900,7 +2899,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//  /
 		// q
 		"preempt with hierarchical advantage": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -2952,7 +2951,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//  /
 		// q
 		"avoid queues within nominal quota": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3018,7 +3017,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//  /
 		// q(0)
 		"preempt multiple with hierarchical advantage": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3078,7 +3077,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//  /   \
 		// q(0) q_same_cohort(0)
 		"preempt in cohort and own CQ": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3148,7 +3147,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//  /
 		// q(0)
 		"prefer to preempt hierarchical candidate": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3207,7 +3206,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//  /   \
 		// q(0) q_same_cohort(0)
 		"forced to preempt priority candidate": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3280,7 +3279,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		// q(4)  q_same_cohort(0)
 		//
 		"incoming workload fits in CQ nominal quota": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3348,7 +3347,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		// q(0)  q_same_cohort(0)
 		//
 		"preempt hierarchical and priority candidates": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").ResourceGroup(*utiltesting.MakeFlavorQuotas("default").
 					Resource(corev1.ResourceCPU, "1").
 					Obj()).Obj(),
@@ -3428,7 +3427,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		// q(0)  q_same_cohort(0)
 		//
 		"preempt hierarchical candidates and inside CQ": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").ResourceGroup(*utiltesting.MakeFlavorQuotas("default").
 					Resource(corev1.ResourceCPU, "1").
 					Obj()).Obj(),
@@ -3507,7 +3506,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//  /
 		// q(0)
 		"reclaim nominal quota from lowest priority workload, excluding non-borrowing": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3586,7 +3585,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//     /    \                     |
 		//    q(0)  q_same_cohort(0)   q_other(0)
 		"infeasible preemption all available workloads in pruned subtrees": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3662,7 +3661,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//  /    \
 		// q(0)   q_same_cohort(0)
 		"hiearchical preemption with multiple resources": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").
 					ResourceGroup(*utiltesting.MakeFlavorQuotas("default").
 						Resource(corev1.ResourceCPU, "3").
@@ -3741,7 +3740,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		// q(0)  q_same_cohort(0)
 		//
 		"prefer to preempt evicted workloads": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3816,7 +3815,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		// q(3, lending limit 2)
 		//
 		"respect lending limits": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c").
 					Parent("r").
@@ -3876,7 +3875,7 @@ func TestHierarchicalPreemptions(t *testing.T) {
 		//	4: c11, c12, c21, c22, c23, c32, c31
 		//	0: q1, q3, q4, q5
 		"reclaim in complex hierarchy": {
-			cohorts: []*kueuealpha.Cohort{
+			cohorts: []*kueue.Cohort{
 				utiltesting.MakeCohort("r").Obj(),
 				utiltesting.MakeCohort("c11").
 					Parent("r").
diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go
index 24616ccb7..56ef39cce 100644
--- a/pkg/scheduler/scheduler_test.go
+++ b/pkg/scheduler/scheduler_test.go
@@ -254,7 +254,7 @@ func TestSchedule(t *testing.T) {
 		additionalClusterQueues []kueue.ClusterQueue
 		additionalLocalQueues   []kueue.LocalQueue
 
-		cohorts []kueuealpha.Cohort
+		cohorts []kueue.Cohort
 
 		// wantAssignments is a summary of all the admissions in the cache after this cycle.
 		wantAssignments map[workload.Reference]kueue.Admission
@@ -1583,7 +1583,7 @@ func TestSchedule(t *testing.T) {
 		// d1 and e1 respectively.
 		"hierarchical fair sharing schedule workload which wins tournament": {
 			enableFairSharing: true,
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("A").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("on-demand").
@@ -1695,7 +1695,7 @@ func TestSchedule(t *testing.T) {
 		// c1 = 75.
 		"fair sharing schedule workload with lowest drf after admission": {
 			enableFairSharing: true,
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("A").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("on-demand").
@@ -1765,7 +1765,7 @@ func TestSchedule(t *testing.T) {
 		// cq, schedules.
 		"fair sharing schedule singleton cqs and cq without cohort": {
 			enableFairSharing: true,
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("A").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("on-demand").
@@ -1830,7 +1830,7 @@ func TestSchedule(t *testing.T) {
 		},
 		"fair sharing schedule highest priority first": {
 			enableFairSharing: true,
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("A").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("on-demand").
@@ -1884,7 +1884,7 @@ func TestSchedule(t *testing.T) {
 		},
 		"fair sharing schedule earliest timestamp first": {
 			enableFairSharing: true,
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("A").
 					ResourceGroup(
 						*utiltesting.MakeFlavorQuotas("on-demand").
@@ -2958,7 +2958,10 @@ func TestSchedule(t *testing.T) {
 				"eng-gamma/Admitted-Workload-3": *utiltesting.MakeAdmission("CQ3").Assignment("gpu", "on-demand", "5").Obj(),
 			},
 		},
-		"capacity not blocked when lending clusterqueue can reclaim": {
+		// ClusterQueueA has 2 capacity, 1 admitted workload (req=1), and 1 pending workload (req=2)
+		// ClusterQueueB has 0 capacity, and 1 pending workload (req=1)
+		// Since ClusterQueueA knows it can reclaim capacity, it lets ClusterQueueB borrow.
+		"capacity not blocked when lending clusterqueue can reclaim (ReclaimWithinCohort=Any)": {
 			additionalClusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("ClusterQueueA").
 					Cohort("root").
@@ -3008,7 +3011,10 @@ func TestSchedule(t *testing.T) {
 				"eng-beta/b1-pending":   *utiltesting.MakeAdmission("ClusterQueueB").Assignment("gpu", "on-demand", "1").Obj(),
 			},
 		},
-		"capacity blocked when lending clusterqueue not guaranteed to reclaim": {
+		// ClusterQueueA has 2 capacity, 1 admitted workload (req=1), and 1 pending workload (req=2)
+		// ClusterQueueB has 0 capacity, and 1 pending workload (req=1)
+		// Since ClusterQueueA is not sure that it can reclaim this capacity, it doesn't let ClusterQueueB borrow.
+		"capacity blocked when lending clusterqueue not guaranteed to reclaim (ReclaimWithinCohort=LowerPriority)": {
 			additionalClusterQueues: []kueue.ClusterQueue{
 				*utiltesting.MakeClusterQueue("ClusterQueueA").
 					Cohort("root").
@@ -3056,6 +3062,57 @@ func TestSchedule(t *testing.T) {
 				"eng-alpha/a1-admitted": *utiltesting.MakeAdmission("ClusterQueueA").Assignment("gpu", "on-demand", "1").Obj(),
 			},
 		},
+		// ClusterQueueA has 2 capacity, 1 admitted workload (req=1), and 1 pending workload (req=2)
+		// ClusterQueueB has 0 capacity, and 1 pending workload (req=1)
+		// Since ClusterQueueA is not sure that it can reclaim this capacity, it doesn't let ClusterQueueB borrow.
+		"capacity blocked when lending clusterqueue not guaranteed to reclaim (ReclaimWithinCohort=Never)": {
+			additionalClusterQueues: []kueue.ClusterQueue{
+				*utiltesting.MakeClusterQueue("ClusterQueueA").
+					Cohort("root").
+					ResourceGroup(
+						utiltesting.MakeFlavorQuotas("on-demand").Resource("gpu", "2").FlavorQuotas,
+					).
+					Preemption(kueue.ClusterQueuePreemption{
+						ReclaimWithinCohort: kueue.PreemptionPolicyNever,
+					}).
+					Obj(),
+				*utiltesting.MakeClusterQueue("ClusterQueueB").
+					Cohort("root").
+					ResourceGroup(
+						utiltesting.MakeFlavorQuotas("on-demand").Resource("gpu", "0").FlavorQuotas,
+					).
+					Obj(),
+			},
+			additionalLocalQueues: []kueue.LocalQueue{
+				*utiltesting.MakeLocalQueue("lq", "eng-alpha").ClusterQueue("ClusterQueueA").Obj(),
+				*utiltesting.MakeLocalQueue("lq", "eng-beta").ClusterQueue("ClusterQueueB").Obj(),
+			},
+			workloads: []kueue.Workload{
+				*utiltesting.MakeWorkload("a1-admitted", "eng-alpha").
+					Queue("lq").
+					Request("gpu", "1").
+					SimpleReserveQuota("ClusterQueueA", "on-demand", now).
+					Obj(),
+				*utiltesting.MakeWorkload("a2-pending", "eng-alpha").
+					Queue("lq").
+					Request("gpu", "2").
+					Obj(),
+				*utiltesting.MakeWorkload("b1-pending", "eng-beta").
+					Creation(now).
+					Queue("lq").
+					Request("gpu", "1").
+					Obj(),
+			},
+			wantLeft: map[kueue.ClusterQueueReference][]workload.Reference{
+				"ClusterQueueB": {"eng-beta/b1-pending"},
+			},
+			wantInadmissibleLeft: map[kueue.ClusterQueueReference][]workload.Reference{
+				"ClusterQueueA": {"eng-alpha/a2-pending"},
+			},
+			wantAssignments: map[workload.Reference]kueue.Admission{
+				"eng-alpha/a1-admitted": *utiltesting.MakeAdmission("ClusterQueueA").Assignment("gpu", "on-demand", "1").Obj(),
+			},
+		},
 		//
 		// Denote Cohorts in UPPERCASE, and ClusterQueues in lowercase.
 		// quota is at GUARANTEED cohort
@@ -3067,7 +3124,7 @@ func TestSchedule(t *testing.T) {
 		// guaranteed
 		//
 		"in a hierarchical cohort, workload borrowing less is scheduled first": {
-			cohorts: []kueuealpha.Cohort{
+			cohorts: []kueue.Cohort{
 				utiltesting.MakeCohort("root").Cohort,
 				utiltesting.MakeCohort("guaranteed").
 					ResourceGroup(
@@ -3630,22 +3687,6 @@ func TestLastSchedulingContext(t *testing.T) {
 		utiltesting.MakeResourceFlavor("on-demand").Obj(),
 		utiltesting.MakeResourceFlavor("spot").Obj(),
 	}
-	clusterQueue := []kueue.ClusterQueue{
-		*utiltesting.MakeClusterQueue("eng-alpha").
-			QueueingStrategy(kueue.BestEffortFIFO).
-			Preemption(kueue.ClusterQueuePreemption{
-				WithinClusterQueue: kueue.PreemptionPolicyLowerPriority,
-			}).
-			FlavorFungibility(kueue.FlavorFungibility{
-				WhenCanPreempt: kueue.Preempt,
-			}).
-			ResourceGroup(
-				*utiltesting.MakeFlavorQuotas("on-demand").
-					Resource(corev1.ResourceCPU, "50", "50").Obj(),
-				*utiltesting.MakeFlavorQuotas("spot").
-					Resource(corev1.ResourceCPU, "100", "0").Obj(),
-			).Obj(),
-	}
 	clusterQueueCohort := []kueue.ClusterQueue{
 		*utiltesting.MakeClusterQueue("eng-cohort-alpha").
 			Cohort("cohort").
@@ -3738,12 +3779,6 @@ func TestLastSchedulingContext(t *testing.T) {
 			},
 		},
 	}
-	wl := utiltesting.MakeWorkload("low-1", "default").
-		Queue("main").
-		Request(corev1.ResourceCPU, "50").
-		ReserveQuota(utiltesting.MakeAdmission("eng-alpha").Assignment(corev1.ResourceCPU, "on-demand", "50").Obj()).
-		Admitted(true).
-		Obj()
 	cases := []struct {
 		name                           string
 		cqs                            []kueue.ClusterQueue
@@ -3754,31 +3789,31 @@ func TestLastSchedulingContext(t *testing.T) {
 		wantAdmissionsOnFirstSchedule  map[workload.Reference]kueue.Admission
 		wantAdmissionsOnSecondSchedule map[workload.Reference]kueue.Admission
 	}{
-		{
-			name: "scheduling context not changed: use next flavor if can't preempt",
-			cqs:  clusterQueue,
-			admittedWorkloads: []kueue.Workload{
-				*wl,
-			},
-			workloads: []kueue.Workload{
-				*utiltesting.MakeWorkload("new", "default").
-					Queue("main").
-					Request(corev1.ResourceCPU, "20").
-					Obj(),
-			},
-			deleteWorkloads:               []kueue.Workload{},
-			wantPreempted:                 sets.Set[workload.Reference]{},
-			wantAdmissionsOnFirstSchedule: map[workload.Reference]kueue.Admission{},
-			wantAdmissionsOnSecondSchedule: map[workload.Reference]kueue.Admission{
-				"default/new":   *utiltesting.MakeAdmission("eng-alpha").Assignment(corev1.ResourceCPU, "spot", "20").Obj(),
-				"default/low-1": *utiltesting.MakeAdmission("eng-alpha").Assignment(corev1.ResourceCPU, "on-demand", "50").Obj(),
-			},
-		},
 		{
 			name: "some workloads were deleted",
-			cqs:  clusterQueue,
+			cqs: []kueue.ClusterQueue{
+				*utiltesting.MakeClusterQueue("eng-alpha").
+					QueueingStrategy(kueue.BestEffortFIFO).
+					Preemption(kueue.ClusterQueuePreemption{
+						WithinClusterQueue: kueue.PreemptionPolicyLowerPriority,
+					}).
+					FlavorFungibility(kueue.FlavorFungibility{
+						WhenCanPreempt: kueue.Preempt,
+					}).
+					ResourceGroup(
+						*utiltesting.MakeFlavorQuotas("on-demand").
+							Resource(corev1.ResourceCPU, "50", "50").Obj(),
+						*utiltesting.MakeFlavorQuotas("spot").
+							Resource(corev1.ResourceCPU, "0", "0").Obj(),
+					).Obj(),
+			},
 			admittedWorkloads: []kueue.Workload{
-				*wl,
+				utiltesting.MakeWorkload("low-1", "default").
+					Queue("main").
+					Request(corev1.ResourceCPU, "50").
+					ReserveQuota(utiltesting.MakeAdmission("eng-alpha").Assignment(corev1.ResourceCPU, "on-demand", "50").Obj()).
+					Admitted(true).
+					Workload,
 			},
 			workloads: []kueue.Workload{
 				*utiltesting.MakeWorkload("preemptor", "default").
@@ -3787,7 +3822,12 @@ func TestLastSchedulingContext(t *testing.T) {
 					Obj(),
 			},
 			deleteWorkloads: []kueue.Workload{
-				*wl,
+				utiltesting.MakeWorkload("low-1", "default").
+					Queue("main").
+					Request(corev1.ResourceCPU, "50").
+					ReserveQuota(utiltesting.MakeAdmission("eng-alpha").Assignment(corev1.ResourceCPU, "on-demand", "50").Obj()).
+					Admitted(true).
+					Workload,
 			},
 			wantPreempted:                 sets.Set[workload.Reference]{},
 			wantAdmissionsOnFirstSchedule: map[workload.Reference]kueue.Admission{},
diff --git a/pkg/util/testing/wrappers.go b/pkg/util/testing/wrappers.go
index 8b52f106b..74f6c0555 100644
--- a/pkg/util/testing/wrappers.go
+++ b/pkg/util/testing/wrappers.go
@@ -761,23 +761,23 @@ func (q *LocalQueueWrapper) GeneratedName(name string) *LocalQueueWrapper {
 }
 
 type CohortWrapper struct {
-	kueuealpha.Cohort
+	kueue.Cohort
 }
 
 func MakeCohort(name kueue.CohortReference) *CohortWrapper {
-	return &CohortWrapper{kueuealpha.Cohort{
+	return &CohortWrapper{kueue.Cohort{
 		ObjectMeta: metav1.ObjectMeta{
 			Name: string(name),
 		},
 	}}
 }
 
-func (c *CohortWrapper) Obj() *kueuealpha.Cohort {
+func (c *CohortWrapper) Obj() *kueue.Cohort {
 	return &c.Cohort
 }
 
 func (c *CohortWrapper) Parent(parentName kueue.CohortReference) *CohortWrapper {
-	c.Spec.Parent = parentName
+	c.Spec.ParentName = parentName
 	return c
 }
 
diff --git a/pkg/webhooks/cohort_webhook_test.go b/pkg/webhooks/cohort_webhook_test.go
index ddf8d2ae4..c9f06195a 100644
--- a/pkg/webhooks/cohort_webhook_test.go
+++ b/pkg/webhooks/cohort_webhook_test.go
@@ -23,7 +23,7 @@ import (
 	"github.com/google/go-cmp/cmp/cmpopts"
 	"k8s.io/apimachinery/pkg/util/validation/field"
 
-	kueue "sigs.k8s.io/kueue/apis/kueue/v1alpha1"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
 	testingutil "sigs.k8s.io/kueue/pkg/util/testing"
 )
diff --git a/test/e2e/certmanager/metrics_test.go b/test/e2e/certmanager/metrics_test.go
index c1f530408..9a162bfd9 100644
--- a/test/e2e/certmanager/metrics_test.go
+++ b/test/e2e/certmanager/metrics_test.go
@@ -26,7 +26,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
 	"sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	testingjobspod "sigs.k8s.io/kueue/pkg/util/testingjobs/pod"
@@ -64,7 +63,7 @@ var _ = ginkgo.Describe("Metrics", ginkgo.Ordered, func() {
 				{
 					Kind:      "ServiceAccount",
 					Name:      serviceAccountName,
-					Namespace: config.DefaultNamespace,
+					Namespace: kueueNS,
 				},
 			},
 			RoleRef: rbacv1.RoleRef{
@@ -75,13 +74,13 @@ var _ = ginkgo.Describe("Metrics", ginkgo.Ordered, func() {
 		}
 		gomega.Expect(k8sClient.Create(ctx, metricsReaderClusterRoleBinding)).Should(gomega.Succeed())
 
-		curlPod = testingjobspod.MakePod("curl-metrics", config.DefaultNamespace).
+		curlPod = testingjobspod.MakePod("curl-metrics", kueueNS).
 			ServiceAccountName(serviceAccountName).
 			Image(util.E2eTestAgnHostImage, util.BehaviorWaitForDeletion).
 			TerminationGracePeriod(1).
 			Obj()
 		curlPod.Spec.Volumes = []corev1.Volume{
-			corev1.Volume{
+			{
 				Name: "metrics-certs",
 				VolumeSource: corev1.VolumeSource{
 					Secret: &corev1.SecretVolumeSource{
@@ -106,7 +105,7 @@ var _ = ginkgo.Describe("Metrics", ginkgo.Ordered, func() {
 			gomega.Eventually(func(g gomega.Gomega) {
 				secret := &corev1.Secret{}
 				g.Expect(k8sClient.Get(ctx, client.ObjectKey{
-					Namespace: config.DefaultNamespace,
+					Namespace: kueueNS,
 					Name:      certSecretName,
 				}, secret)).To(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -186,14 +185,14 @@ var _ = ginkgo.Describe("Metrics", ginkgo.Ordered, func() {
 })
 
 func getKueueMetricsSecure(curlPodName, curlContainerName string) ([]byte, error) {
-	metricsOutput, _, err := util.KExecute(ctx, cfg, restClient, config.DefaultNamespace, curlPodName, curlContainerName,
+	metricsOutput, _, err := util.KExecute(ctx, cfg, restClient, kueueNS, curlPodName, curlContainerName,
 		[]string{
 			"/bin/sh", "-c",
 			fmt.Sprintf(
 				"curl -s --cacert %s/ca.crt -H \"Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)\" https://%s.%s.svc.cluster.local:8443/metrics",
 				certMountPath,
 				metricsServiceName,
-				config.DefaultNamespace,
+				kueueNS,
 			),
 		})
 
diff --git a/test/e2e/certmanager/suite_test.go b/test/e2e/certmanager/suite_test.go
index e2513ad4a..0ec66cef3 100644
--- a/test/e2e/certmanager/suite_test.go
+++ b/test/e2e/certmanager/suite_test.go
@@ -38,6 +38,7 @@ var (
 	defaultKueueCfg *v1beta1.Configuration
 	cfg             *rest.Config
 	restClient      *rest.RESTClient
+	kueueNS         = util.GetKueueNamespace()
 )
 
 func TestAPIs(t *testing.T) {
diff --git a/test/e2e/customconfigs/managejobswithoutqueuename_test.go b/test/e2e/customconfigs/managejobswithoutqueuename_test.go
index 24c96ffc6..60569cf16 100644
--- a/test/e2e/customconfigs/managejobswithoutqueuename_test.go
+++ b/test/e2e/customconfigs/managejobswithoutqueuename_test.go
@@ -39,6 +39,7 @@ import (
 	"sigs.k8s.io/kueue/pkg/controller/jobs/jobset"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/leaderworkerset"
 	podcontroller "sigs.k8s.io/kueue/pkg/controller/jobs/pod/constants"
+	"sigs.k8s.io/kueue/pkg/controller/jobs/statefulset"
 	"sigs.k8s.io/kueue/pkg/features"
 	utilpod "sigs.k8s.io/kueue/pkg/util/pod"
 	"sigs.k8s.io/kueue/pkg/util/testing"
@@ -589,32 +590,84 @@ var _ = ginkgo.Describe("ManageJobsWithoutQueueName", ginkgo.Ordered, func() {
 			})
 		})
 
-		ginkgo.It("should suspend the pods of a StatefulSet created in the test namespace", func() {
-			var testSts *appsv1.StatefulSet
-			ginkgo.By("creating a StatefulSet without a queue name", func() {
-				testSts = testingsts.MakeStatefulSet("test-sts", ns.Name).
-					Image(util.E2eTestAgnHostImage, util.BehaviorWaitForDeletion).
-					RequestAndLimit(corev1.ResourceCPU, "1").
-					RequestAndLimit(corev1.ResourceMemory, "2Gi").
-					Replicas(2).
-					Obj()
-				util.MustCreate(ctx, k8sClient, testSts)
+		ginkgo.It("should suspend the pods created by a StatefulSet in the test namespace without queue-name label", func() {
+			sts := testingsts.MakeStatefulSet("sts", ns.Name).
+				Image(util.E2eTestAgnHostImage, util.BehaviorWaitForDeletion).
+				Replicas(3).
+				RequestAndLimit(corev1.ResourceCPU, "200m").
+				TerminationGracePeriod(1).
+				Obj()
+			ginkgo.By("Create a StatefulSet", func() {
+				util.MustCreate(ctx, k8sClient, sts)
 			})
 
-			ginkgo.By("verifying that the pods of the StatefulSet are gated", func() {
+			wlKey := types.NamespacedName{Name: statefulset.GetWorkloadName(sts.Name), Namespace: ns.Name}
+			createdWorkload := &kueue.Workload{}
+
+			ginkgo.By("check that workload is created and not admitted", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
-					pods := &corev1.PodList{}
-					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name),
-						client.MatchingLabels(testSts.Spec.Selector.MatchLabels))).To(gomega.Succeed())
-					// If the first pod can't be scheduled, the second won't be created
-					g.Expect(pods.Items).Should(gomega.HaveLen(1))
+					g.Expect(k8sClient.Get(ctx, wlKey, createdWorkload)).To(gomega.Succeed())
+					g.Expect(createdWorkload.Status.Conditions).To(testing.HaveConditionStatusFalse(kueue.WorkloadQuotaReserved))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			createdStatefulSet := &appsv1.StatefulSet{}
+
+			ginkgo.By("verify that replicas is not ready", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(sts), createdStatefulSet)).To(gomega.Succeed())
+					g.Expect(createdStatefulSet.Status.ReadyReplicas).To(gomega.Equal(int32(0)))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("verifying that only one pod is created, pending and gated", func() {
+				pods := &corev1.PodList{}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name), client.MatchingLabels(createdStatefulSet.Spec.Selector.MatchLabels))).To(gomega.Succeed())
+					g.Expect(pods.Items).To(gomega.HaveLen(1))
 					for _, pod := range pods.Items {
-						g.Expect(pod.Spec.SchedulingGates).ShouldNot(gomega.BeEmpty())
-						g.Expect(pod.Labels).Should(gomega.HaveKeyWithValue(constants.ManagedByKueueLabelKey, constants.ManagedByKueueLabelValue))
-						g.Expect(pod.Finalizers).Should(gomega.ContainElement(podcontroller.PodFinalizer))
+						g.Expect(pod.Status.Phase).To(gomega.Equal(corev1.PodPending))
+						g.Expect(utilpod.HasGate(&pod, podcontroller.SchedulingGateName)).Should(gomega.BeTrue())
 					}
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("setting the queue-name label", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(sts), createdStatefulSet)).Should(gomega.Succeed())
+					if createdStatefulSet.Labels == nil {
+						createdStatefulSet.Labels = map[string]string{}
+					}
+					createdStatefulSet.Labels[controllerconstants.QueueLabel] = localQueue.Name
+					g.Expect(k8sClient.Update(ctx, createdStatefulSet)).Should(gomega.Succeed())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
+
+			ginkgo.By("check that workload is admitted", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, createdWorkload)).To(gomega.Succeed())
+					g.Expect(createdWorkload.Status.Conditions).To(testing.HaveConditionStatusTrue(kueue.WorkloadAdmitted))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("verify that replicas are ready", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(sts), createdStatefulSet)).To(gomega.Succeed())
+					g.Expect(createdStatefulSet.Status.ReadyReplicas).To(gomega.Equal(int32(3)))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("verifying that all pod are running and ungated", func() {
+				pods := &corev1.PodList{}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.List(ctx, pods, client.InNamespace(ns.Name), client.MatchingLabels(createdStatefulSet.Spec.Selector.MatchLabels))).To(gomega.Succeed())
+					g.Expect(pods.Items).To(gomega.HaveLen(3))
+					for _, pod := range pods.Items {
+						g.Expect(pod.Status.Phase).To(gomega.Equal(corev1.PodRunning))
+						g.Expect(utilpod.HasGate(&pod, podcontroller.SchedulingGateName)).Should(gomega.BeFalse())
+					}
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
 		})
 
 		ginkgo.It("should not suspend the pods created by a StatefulSet in the kube-system namespace", func() {
diff --git a/test/e2e/customconfigs/suite_test.go b/test/e2e/customconfigs/suite_test.go
index 3dc72c2c0..29deb4aab 100644
--- a/test/e2e/customconfigs/suite_test.go
+++ b/test/e2e/customconfigs/suite_test.go
@@ -38,6 +38,7 @@ var (
 	restClient      *rest.RESTClient
 	ctx             context.Context
 	defaultKueueCfg *v1beta1.Configuration
+	kueueNS         = util.GetKueueNamespace()
 )
 
 func TestAPIs(t *testing.T) {
diff --git a/test/e2e/customconfigs/waitforpodsready_test.go b/test/e2e/customconfigs/waitforpodsready_test.go
index fd3415a77..c673b862f 100644
--- a/test/e2e/customconfigs/waitforpodsready_test.go
+++ b/test/e2e/customconfigs/waitforpodsready_test.go
@@ -64,7 +64,7 @@ var _ = ginkgo.Describe("WaitForPodsReady with tiny Timeout and no RecoveryTimeo
 				{
 					Kind:      "ServiceAccount",
 					Name:      serviceAccountName,
-					Namespace: configapi.DefaultNamespace,
+					Namespace: kueueNS,
 				},
 			},
 			RoleRef: rbacv1.RoleRef{
diff --git a/test/e2e/multikueue/e2e_test.go b/test/e2e/multikueue/e2e_test.go
index 68abd0995..8fb88cd91 100644
--- a/test/e2e/multikueue/e2e_test.go
+++ b/test/e2e/multikueue/e2e_test.go
@@ -911,7 +911,7 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 				gomega.Expect(err).NotTo(gomega.HaveOccurred(), "%s: %s", err, output)
 
 				podList := &corev1.PodList{}
-				podListOptions := client.InNamespace("kueue-system")
+				podListOptions := client.InNamespace(kueueNS)
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sWorker1Client.List(ctx, podList, podListOptions)).Should(gomega.Succeed())
 				}, util.LongTimeout, util.Interval).ShouldNot(gomega.Succeed())
diff --git a/test/e2e/multikueue/suite_test.go b/test/e2e/multikueue/suite_test.go
index 318969306..ff4d8c846 100644
--- a/test/e2e/multikueue/suite_test.go
+++ b/test/e2e/multikueue/suite_test.go
@@ -53,6 +53,7 @@ var (
 	managerClusterName string
 	worker1ClusterName string
 	worker2ClusterName string
+	kueueNS            = util.GetKueueNamespace()
 
 	k8sManagerClient client.Client
 	k8sWorker1Client client.Client
@@ -271,13 +272,13 @@ var _ = ginkgo.BeforeSuite(func() {
 
 	ctx = ginkgo.GinkgoT().Context()
 
-	worker1Kconfig, err := kubeconfigForMultiKueueSA(ctx, k8sWorker1Client, worker1Cfg, "kueue-system", "mksa", worker1ClusterName)
+	worker1Kconfig, err := kubeconfigForMultiKueueSA(ctx, k8sWorker1Client, worker1Cfg, kueueNS, "mksa", worker1ClusterName)
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
-	gomega.Expect(makeMultiKueueSecret(ctx, k8sManagerClient, "kueue-system", "multikueue1", worker1Kconfig)).To(gomega.Succeed())
+	gomega.Expect(makeMultiKueueSecret(ctx, k8sManagerClient, kueueNS, "multikueue1", worker1Kconfig)).To(gomega.Succeed())
 
-	worker2Kconfig, err := kubeconfigForMultiKueueSA(ctx, k8sWorker2Client, worker2Cfg, "kueue-system", "mksa", worker2ClusterName)
+	worker2Kconfig, err := kubeconfigForMultiKueueSA(ctx, k8sWorker2Client, worker2Cfg, kueueNS, "mksa", worker2ClusterName)
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
-	gomega.Expect(makeMultiKueueSecret(ctx, k8sManagerClient, "kueue-system", "multikueue2", worker2Kconfig)).To(gomega.Succeed())
+	gomega.Expect(makeMultiKueueSecret(ctx, k8sManagerClient, kueueNS, "multikueue2", worker2Kconfig)).To(gomega.Succeed())
 
 	waitForAvailableStart := time.Now()
 	util.WaitForKueueAvailability(ctx, k8sManagerClient)
@@ -314,9 +315,9 @@ var _ = ginkgo.BeforeSuite(func() {
 })
 
 var _ = ginkgo.AfterSuite(func() {
-	gomega.Expect(cleanKubeconfigForMultiKueueSA(ctx, k8sWorker1Client, "kueue-system", "mksa")).To(gomega.Succeed())
-	gomega.Expect(cleanKubeconfigForMultiKueueSA(ctx, k8sWorker2Client, "kueue-system", "mksa")).To(gomega.Succeed())
+	gomega.Expect(cleanKubeconfigForMultiKueueSA(ctx, k8sWorker1Client, kueueNS, "mksa")).To(gomega.Succeed())
+	gomega.Expect(cleanKubeconfigForMultiKueueSA(ctx, k8sWorker2Client, kueueNS, "mksa")).To(gomega.Succeed())
 
-	gomega.Expect(cleanMultiKueueSecret(ctx, k8sManagerClient, "kueue-system", "multikueue1")).To(gomega.Succeed())
-	gomega.Expect(cleanMultiKueueSecret(ctx, k8sManagerClient, "kueue-system", "multikueue2")).To(gomega.Succeed())
+	gomega.Expect(cleanMultiKueueSecret(ctx, k8sManagerClient, kueueNS, "multikueue1")).To(gomega.Succeed())
+	gomega.Expect(cleanMultiKueueSecret(ctx, k8sManagerClient, kueueNS, "multikueue2")).To(gomega.Succeed())
 })
diff --git a/test/e2e/singlecluster/metrics_test.go b/test/e2e/singlecluster/metrics_test.go
index e4e90f843..15e751b78 100644
--- a/test/e2e/singlecluster/metrics_test.go
+++ b/test/e2e/singlecluster/metrics_test.go
@@ -28,7 +28,6 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	config "sigs.k8s.io/kueue/apis/config/v1beta1"
 	"sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/controller/jobs/job"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -66,7 +65,7 @@ var _ = ginkgo.Describe("Metrics", func() {
 				{
 					Kind:      "ServiceAccount",
 					Name:      serviceAccountName,
-					Namespace: config.DefaultNamespace,
+					Namespace: kueueNS,
 				},
 			},
 			RoleRef: rbacv1.RoleRef{
@@ -77,7 +76,7 @@ var _ = ginkgo.Describe("Metrics", func() {
 		}
 		util.MustCreate(ctx, k8sClient, metricsReaderClusterRoleBinding)
 
-		curlPod = testingjobspod.MakePod("curl-metrics", config.DefaultNamespace).
+		curlPod = testingjobspod.MakePod("curl-metrics", kueueNS).
 			ServiceAccountName(serviceAccountName).
 			Image(util.E2eTestAgnHostImage, util.BehaviorWaitForDeletion).
 			TerminationGracePeriod(1).
diff --git a/test/e2e/singlecluster/suite_test.go b/test/e2e/singlecluster/suite_test.go
index c665cb01a..57554a24c 100644
--- a/test/e2e/singlecluster/suite_test.go
+++ b/test/e2e/singlecluster/suite_test.go
@@ -43,6 +43,7 @@ var (
 	ctx                          context.Context
 	visibilityClient             visibilityv1beta1.VisibilityV1beta1Interface
 	impersonatedVisibilityClient visibilityv1beta1.VisibilityV1beta1Interface
+	kueueNS                      = util.GetKueueNamespace()
 )
 
 func TestAPIs(t *testing.T) {
@@ -62,7 +63,7 @@ var _ = ginkgo.BeforeSuite(func() {
 	k8sClient, cfg = util.CreateClientUsingCluster("")
 	restClient = util.CreateRestClient(cfg)
 	visibilityClient = util.CreateVisibilityClient("")
-	impersonatedVisibilityClient = util.CreateVisibilityClient("system:serviceaccount:kueue-system:default")
+	impersonatedVisibilityClient = util.CreateVisibilityClient(fmt.Sprintf("system:serviceaccount:%s:default", kueueNS))
 	ctx = ginkgo.GinkgoT().Context()
 
 	waitForAvailableStart := time.Now()
diff --git a/test/e2e/singlecluster/visibility_test.go b/test/e2e/singlecluster/visibility_test.go
index 6fa701e27..e54e627c6 100644
--- a/test/e2e/singlecluster/visibility_test.go
+++ b/test/e2e/singlecluster/visibility_test.go
@@ -487,7 +487,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 				ObjectMeta: metav1.ObjectMeta{Name: "read-pending-workloads"},
 				RoleRef:    rbacv1.RoleRef{APIGroup: rbacv1.GroupName, Kind: "ClusterRole", Name: "kueue-batch-admin-role"},
 				Subjects: []rbacv1.Subject{
-					{Name: "default", APIGroup: "", Namespace: "kueue-system", Kind: rbacv1.ServiceAccountKind},
+					{Name: "default", APIGroup: "", Namespace: kueueNS, Kind: rbacv1.ServiceAccountKind},
 				},
 			}
 			util.MustCreate(ctx, k8sClient, clusterRoleBinding)
@@ -523,7 +523,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 				ObjectMeta: metav1.ObjectMeta{Name: "read-pending-workloads", Namespace: nsA.Name},
 				RoleRef:    rbacv1.RoleRef{APIGroup: rbacv1.GroupName, Kind: "ClusterRole", Name: "kueue-batch-user-role"},
 				Subjects: []rbacv1.Subject{
-					{Name: "default", APIGroup: "", Namespace: "kueue-system", Kind: rbacv1.ServiceAccountKind},
+					{Name: "default", APIGroup: "", Namespace: kueueNS, Kind: rbacv1.ServiceAccountKind},
 				},
 			}
 			util.MustCreate(ctx, k8sClient, roleBinding)
diff --git a/test/integration/multikueue/jobs_test.go b/test/integration/multikueue/jobs_test.go
index 7627f9303..65cc9b942 100644
--- a/test/integration/multikueue/jobs_test.go
+++ b/test/integration/multikueue/jobs_test.go
@@ -264,10 +264,20 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 		ginkgo.By("finishing the worker job", func() {
 			reachedPodsReason := "Reached expected number of succeeded pods"
 			finishJobReason := "Job finished successfully"
+			now := metav1.Now()
+			// completedJobCondition that we will add to the remote job to indicate job completions,
+			// and the same condition that we expect to see on the local job status.
+			completedJobCondition := batchv1.JobCondition{
+				Type:               batchv1.JobComplete,
+				Status:             corev1.ConditionTrue,
+				LastProbeTime:      now,
+				LastTransitionTime: now,
+				Message:            finishJobReason,
+			}
+
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdJob := batchv1.Job{}
 				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, client.ObjectKeyFromObject(job), &createdJob)).To(gomega.Succeed())
-				now := metav1.Now()
 				createdJob.Status.Conditions = append(createdJob.Status.Conditions,
 					batchv1.JobCondition{
 						Type:               batchv1.JobSuccessCriteriaMet,
@@ -276,14 +286,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 						LastTransitionTime: now,
 						Message:            reachedPodsReason,
 					},
-					batchv1.JobCondition{
-						Type:               batchv1.JobComplete,
-						Status:             corev1.ConditionTrue,
-						LastProbeTime:      now,
-						LastTransitionTime: now,
-						Message:            finishJobReason,
-					},
-				)
+					completedJobCondition)
 				createdJob.Status.Succeeded = 1
 				createdJob.Status.StartTime = ptr.To(now)
 				createdJob.Status.CompletionTime = ptr.To(now)
@@ -291,6 +294,16 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
 			waitForWorkloadToFinishAndRemoteWorkloadToBeDeleted(wlLookupKey, finishJobReason)
+
+			// Assert job complete condition.
+			localJob := &batchv1.Job{}
+			gomega.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(job), localJob)).To(gomega.Succeed())
+			gomega.Expect(localJob.Status.Conditions).Should(gomega.ContainElement(gomega.WithTransform(func(condition batchv1.JobCondition) batchv1.JobCondition {
+				// Compare on all condition attributes excluding Time values.
+				condition.LastProbeTime = completedJobCondition.LastProbeTime
+				condition.LastTransitionTime = completedJobCondition.LastTransitionTime
+				return condition
+			}, gomega.Equal(completedJobCondition))))
 		})
 	})
 
@@ -377,10 +390,21 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 		ginkgo.By("finishing the worker job", func() {
 			reachedPodsReason := "Reached expected number of succeeded pods"
 			finishJobReason := "Job finished successfully"
+
+			now := metav1.Now()
+			// completedJobCondition that we will add to the remote job to indicate job completions,
+			// and the same condition that we expect to see on the local job status.
+			completedJobCondition := batchv1.JobCondition{
+				Type:               batchv1.JobComplete,
+				Status:             corev1.ConditionTrue,
+				LastProbeTime:      now,
+				LastTransitionTime: now,
+				Message:            finishJobReason,
+			}
+
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdJob := batchv1.Job{}
 				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, client.ObjectKeyFromObject(job), &createdJob)).To(gomega.Succeed())
-				now := metav1.Now()
 				createdJob.Status.Conditions = append(createdJob.Status.Conditions,
 					batchv1.JobCondition{
 						Type:               batchv1.JobSuccessCriteriaMet,
@@ -388,15 +412,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 						LastProbeTime:      now,
 						LastTransitionTime: now,
 						Message:            reachedPodsReason,
-					},
-					batchv1.JobCondition{
-						Type:               batchv1.JobComplete,
-						Status:             corev1.ConditionTrue,
-						LastProbeTime:      now,
-						LastTransitionTime: now,
-						Message:            finishJobReason,
-					},
-				)
+					}, completedJobCondition)
 				createdJob.Status.Active = 0
 				createdJob.Status.Ready = ptr.To[int32](0)
 				createdJob.Status.Succeeded = 1
@@ -405,6 +421,16 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
 			waitForWorkloadToFinishAndRemoteWorkloadToBeDeleted(wlLookupKey, finishJobReason)
+
+			// Assert job complete condition.
+			localJob := &batchv1.Job{}
+			gomega.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(job), localJob)).To(gomega.Succeed())
+			gomega.Expect(localJob.Status.Conditions).Should(gomega.ContainElement(gomega.WithTransform(func(condition batchv1.JobCondition) batchv1.JobCondition {
+				// Compare on all condition attributes excluding Time values.
+				condition.LastProbeTime = completedJobCondition.LastProbeTime
+				condition.LastTransitionTime = completedJobCondition.LastTransitionTime
+				return condition
+			}, gomega.Equal(completedJobCondition))))
 		})
 	})
 
diff --git a/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go b/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go
index def392735..8ba6f2113 100644
--- a/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_test.go
+++ b/test/integration/singlecluster/scheduler/fairsharing/fair_sharing_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"
 	"sigs.k8s.io/kueue/pkg/metrics"
 	"sigs.k8s.io/kueue/pkg/util/testing"
@@ -39,13 +38,13 @@ var _ = ginkgo.Describe("Scheduler", func() {
 		defaultFlavor *kueue.ResourceFlavor
 		ns            *corev1.Namespace
 
-		cohorts []*kueuealpha.Cohort
+		cohorts []*kueue.Cohort
 		cqs     []*kueue.ClusterQueue
 		lqs     []*kueue.LocalQueue
 		wls     []*kueue.Workload
 	)
 
-	var createCohort = func(cohort *kueuealpha.Cohort) *kueuealpha.Cohort {
+	var createCohort = func(cohort *kueue.Cohort) *kueue.Cohort {
 		util.MustCreate(ctx, k8sClient, cohort)
 		cohorts = append(cohorts, cohort)
 		return cohort
@@ -465,7 +464,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 func expectCohortWeightedShare(cohortName string, weightedShare int64) {
 	// check Status
 	gomega.EventuallyWithOffset(1, func(g gomega.Gomega) {
-		cohort := &kueuealpha.Cohort{}
+		cohort := &kueue.Cohort{}
 		g.ExpectWithOffset(1, k8sClient.Get(ctx, client.ObjectKey{Name: cohortName}, cohort)).Should(gomega.Succeed())
 		g.ExpectWithOffset(1, cohort.Status.FairSharing).ShouldNot(gomega.BeNil())
 		g.ExpectWithOffset(1, cohort.Status.FairSharing.WeightedShare).Should(gomega.Equal(weightedShare))
diff --git a/test/integration/singlecluster/scheduler/preemption_test.go b/test/integration/singlecluster/scheduler/preemption_test.go
index a1ec838ab..1371c9837 100644
--- a/test/integration/singlecluster/scheduler/preemption_test.go
+++ b/test/integration/singlecluster/scheduler/preemption_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/controller/constants"
 	"sigs.k8s.io/kueue/pkg/features"
@@ -913,7 +912,7 @@ var _ = ginkgo.Describe("Preemption", func() {
 		})
 	})
 	ginkgo.Context("In a multi-level cohort", func() {
-		var rootCohort, guaranteedCohort *kueuealpha.Cohort
+		var rootCohort, guaranteedCohort *kueue.Cohort
 		var bestEffortCQ, guaranteedCQ *kueue.ClusterQueue
 		var defaultFlavor *kueue.ResourceFlavor
 
diff --git a/test/integration/singlecluster/scheduler/scheduler_test.go b/test/integration/singlecluster/scheduler/scheduler_test.go
index 9d8905c26..36326514a 100644
--- a/test/integration/singlecluster/scheduler/scheduler_test.go
+++ b/test/integration/singlecluster/scheduler/scheduler_test.go
@@ -29,7 +29,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/core"
 	"sigs.k8s.io/kueue/pkg/features"
@@ -1397,7 +1396,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 	ginkgo.When("Cohort provides resources directly", func() {
 		var (
 			cq     *kueue.ClusterQueue
-			cohort *kueuealpha.Cohort
+			cohort *kueue.Cohort
 			wl     *kueue.Workload
 		)
 
diff --git a/test/integration/singlecluster/webhook/core/cohort_test.go b/test/integration/singlecluster/webhook/core/cohort_test.go
index cdf18b5aa..12b1c5022 100644
--- a/test/integration/singlecluster/webhook/core/cohort_test.go
+++ b/test/integration/singlecluster/webhook/core/cohort_test.go
@@ -25,7 +25,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"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/test/util"
@@ -33,7 +32,7 @@ import (
 
 var _ = ginkgo.Describe("Cohort Webhook", func() {
 	ginkgo.When("Creating a Cohort", func() {
-		ginkgo.DescribeTable("Validate Cohort on creation", func(cohort *kueuealpha.Cohort, matcher types.GomegaMatcher) {
+		ginkgo.DescribeTable("Validate Cohort on creation", func(cohort *kueue.Cohort, matcher types.GomegaMatcher) {
 			err := k8sClient.Create(ctx, cohort)
 			if err == nil {
 				defer func() {
@@ -235,11 +234,11 @@ var _ = ginkgo.Describe("Cohort Webhook", func() {
 					Obj(),
 				gomega.Succeed()),
 			ginkgo.Entry("Should reject resources in a flavor in different order",
-				&kueuealpha.Cohort{
+				&kueue.Cohort{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: "cohort",
 					},
-					Spec: kueuealpha.CohortSpec{
+					Spec: kueue.CohortSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
 								CoveredResources: []corev1.ResourceName{"cpu", "memory"},
@@ -259,11 +258,11 @@ var _ = ginkgo.Describe("Cohort Webhook", func() {
 				},
 				testing.BeForbiddenError()),
 			ginkgo.Entry("Should reject missing resources in a flavor",
-				&kueuealpha.Cohort{
+				&kueue.Cohort{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: "cohort",
 					},
-					Spec: kueuealpha.CohortSpec{
+					Spec: kueue.CohortSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
 								CoveredResources: []corev1.ResourceName{"cpu", "memory"},
@@ -278,11 +277,11 @@ var _ = ginkgo.Describe("Cohort Webhook", func() {
 				},
 				testing.BeInvalidError()),
 			ginkgo.Entry("Should reject resource not defined in resource group",
-				&kueuealpha.Cohort{
+				&kueue.Cohort{
 					ObjectMeta: metav1.ObjectMeta{
 						Name: "cohort",
 					},
-					Spec: kueuealpha.CohortSpec{
+					Spec: kueue.CohortSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
 								CoveredResources: []corev1.ResourceName{"cpu"},
@@ -340,7 +339,7 @@ var _ = ginkgo.Describe("Cohort Webhook", func() {
 
 	ginkgo.When("Updating a Cohort", func() {
 		var (
-			cohort *kueuealpha.Cohort
+			cohort *kueue.Cohort
 		)
 
 		ginkgo.AfterEach(func() {
@@ -352,9 +351,9 @@ var _ = ginkgo.Describe("Cohort Webhook", func() {
 			util.MustCreate(ctx, k8sClient, cohort)
 
 			gomega.Eventually(func(g gomega.Gomega) {
-				createCohort := &kueuealpha.Cohort{}
+				createCohort := &kueue.Cohort{}
 				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(cohort), createCohort)).Should(gomega.Succeed())
-				createCohort.Spec.Parent = "cohort2"
+				createCohort.Spec.ParentName = "cohort2"
 				g.Expect(k8sClient.Update(ctx, createCohort)).Should(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 		})
@@ -363,9 +362,9 @@ var _ = ginkgo.Describe("Cohort Webhook", func() {
 			util.MustCreate(ctx, k8sClient, cohort)
 
 			gomega.Eventually(func(g gomega.Gomega) {
-				createCohort := &kueuealpha.Cohort{}
+				createCohort := &kueue.Cohort{}
 				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(cohort), createCohort)).Should(gomega.Succeed())
-				createCohort.Spec.Parent = "@cohort2"
+				createCohort.Spec.ParentName = "@cohort2"
 				gomega.Expect(k8sClient.Update(ctx, createCohort)).ShouldNot(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 		})
diff --git a/test/util/e2e.go b/test/util/e2e.go
index 81f687b06..4162fc990 100644
--- a/test/util/e2e.go
+++ b/test/util/e2e.go
@@ -62,6 +62,13 @@ const (
 	defaultMetricsServiceName = "kueue-controller-manager-metrics-service"
 )
 
+func GetKueueNamespace() string {
+	if ns := os.Getenv("KUEUE_NAMESPACE"); ns != "" {
+		return ns
+	}
+	return configapi.DefaultNamespace
+}
+
 func CreateClientUsingCluster(kContext string) (client.WithWatch, *rest.Config) {
 	cfg, err := config.GetConfigWithContext(kContext)
 	if err != nil {
@@ -215,7 +222,8 @@ func waitForOperatorAvailability(ctx context.Context, k8sClient client.Client, k
 }
 
 func WaitForKueueAvailability(ctx context.Context, k8sClient client.Client) {
-	kcmKey := types.NamespacedName{Namespace: "kueue-system", Name: "kueue-controller-manager"}
+	kueueNS := GetKueueNamespace()
+	kcmKey := types.NamespacedName{Namespace: kueueNS, Name: "kueue-controller-manager"}
 	waitForOperatorAvailability(ctx, k8sClient, kcmKey)
 }
 
@@ -254,7 +262,8 @@ func WaitForKubeRayOperatorAvailability(ctx context.Context, k8sClient client.Cl
 
 func GetKueueConfiguration(ctx context.Context, k8sClient client.Client) *configapi.Configuration {
 	var kueueCfg configapi.Configuration
-	kcmKey := types.NamespacedName{Namespace: "kueue-system", Name: "kueue-manager-config"}
+	kueueNS := GetKueueNamespace()
+	kcmKey := types.NamespacedName{Namespace: kueueNS, Name: "kueue-manager-config"}
 	configMap := &corev1.ConfigMap{}
 
 	gomega.Expect(k8sClient.Get(ctx, kcmKey, configMap)).To(gomega.Succeed())
@@ -264,7 +273,8 @@ func GetKueueConfiguration(ctx context.Context, k8sClient client.Client) *config
 
 func ApplyKueueConfiguration(ctx context.Context, k8sClient client.Client, kueueCfg *configapi.Configuration) {
 	configMap := &corev1.ConfigMap{}
-	kcmKey := types.NamespacedName{Namespace: "kueue-system", Name: "kueue-manager-config"}
+	kueueNS := GetKueueNamespace()
+	kcmKey := types.NamespacedName{Namespace: kueueNS, Name: "kueue-manager-config"}
 	config, err := yaml.Marshal(kueueCfg)
 
 	gomega.Expect(err).ToNot(gomega.HaveOccurred())
@@ -276,7 +286,8 @@ func ApplyKueueConfiguration(ctx context.Context, k8sClient client.Client, kueue
 }
 
 func RestartKueueController(ctx context.Context, k8sClient client.Client) {
-	kcmKey := types.NamespacedName{Namespace: "kueue-system", Name: "kueue-controller-manager"}
+	kueueNS := GetKueueNamespace()
+	kcmKey := types.NamespacedName{Namespace: kueueNS, Name: "kueue-controller-manager"}
 	rolloutOperatorDeployment(ctx, k8sClient, kcmKey)
 }
 
@@ -338,11 +349,12 @@ func CreateNamespaceFromObjectWithLog(ctx context.Context, k8sClient client.Clie
 }
 
 func GetKueueMetrics(ctx context.Context, cfg *rest.Config, restClient *rest.RESTClient, curlPodName, curlContainerName string) (string, error) {
-	metricsOutput, _, err := KExecute(ctx, cfg, restClient, configapi.DefaultNamespace, curlPodName, curlContainerName, []string{
+	kueueNS := GetKueueNamespace()
+	metricsOutput, _, err := KExecute(ctx, cfg, restClient, kueueNS, curlPodName, curlContainerName, []string{
 		"/bin/sh", "-c",
 		fmt.Sprintf(
 			"curl -s -k -H \"Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)\" https://%s.%s.svc.cluster.local:8443/metrics",
-			defaultMetricsServiceName, configapi.DefaultNamespace,
+			defaultMetricsServiceName, kueueNS,
 		),
 	})
 	return string(metricsOutput), err