Repository: kubernetes-sigs/kueue

Issue:
Add validation tests for v1beta2 TopologyAssignment
**What would you like to be cleaned**:

I'd like to have an integration test for the validation rules in the v1beta2 TopologyAssignment (introduced in #7544).

**Why is this needed**:

The validation rules are specified via Kubebuilder annotations. While the existing automation does some checking of those, I'm not 100% certain if they behave as intended. It'd be nice to have tests for this.

Hints from issue comments:
@olekzabl: /assign

Solution patch:
diff --git a/.github/workflows/krew-release.yml b/.github/workflows/krew-release.yml
index 7eba0308d..de5970685 100644
--- a/.github/workflows/krew-release.yml
+++ b/.github/workflows/krew-release.yml
@@ -7,6 +7,6 @@ jobs:
     runs-on: ubuntu-24.04
     steps:
       - name: Checkout
-        uses: actions/checkout@v5
+        uses: actions/checkout@v6
       - name: Update new version in krew-index
         uses: rajatjindal/krew-release-bot@v0.0.47
\ No newline at end of file
diff --git a/.github/workflows/openvex.yaml b/.github/workflows/openvex.yaml
index 9dab48d61..7292a2b9b 100644
--- a/.github/workflows/openvex.yaml
+++ b/.github/workflows/openvex.yaml
@@ -19,7 +19,7 @@ jobs:
           TAG=${{ github.event.inputs.tag }}
           echo "TAG=$TAG" >> "$GITHUB_ENV"
       - name: Checkout code
-        uses: actions/checkout@v5
+        uses: actions/checkout@v6
       - uses: openvex/generate-vex@c59881b41451d7ccba5c3b74cd195382b8971fcd
         name: Run vexctl
         with:
diff --git a/.github/workflows/sbom.yaml b/.github/workflows/sbom.yaml
index 1311ed3fe..91c9c3c04 100644
--- a/.github/workflows/sbom.yaml
+++ b/.github/workflows/sbom.yaml
@@ -15,7 +15,7 @@ jobs:
     name: Install bom and generate SBOM
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v5
+        uses: actions/checkout@v6
       - name: Set tag name
         shell: bash
         run: |
diff --git a/.github/workflows/sync-dependabot.yaml b/.github/workflows/sync-dependabot.yaml
index 151c24533..991f9c9c4 100644
--- a/.github/workflows/sync-dependabot.yaml
+++ b/.github/workflows/sync-dependabot.yaml
@@ -15,7 +15,7 @@ jobs:
           contents: write
 
         steps:
-            - uses: actions/checkout@v5
+            - uses: actions/checkout@v6
               with: 
                 ref: ${{github.head_ref}}
             - name: Set git user from last commit
diff --git a/.golangci-kal.yml b/.golangci-kal.yml
index 5f356aaff..39c181aee 100644
--- a/.golangci-kal.yml
+++ b/.golangci-kal.yml
@@ -94,7 +94,7 @@ linters:
       path: "apis/kueue/v1beta2"
 
     # Required fields that intentionally exclude omitempty
-    - text: "requiredfields: field (ControllerName|LastUpdate|Reason|UnderlyingCause|Message|WeightedShare|Value|ConsumedResources) should have the omitempty tag."
+    - text: "requiredfields: field (ControllerName|LastUpdate|Reason|UnderlyingCause|Message|WeightedShare|Value|ConsumedResources|Location) should have the omitempty tag."
       path: "apis/kueue/v1beta2"
 
     # ResourceList fields (map types required for Kubernetes compatibility)
diff --git a/apis/config/v1beta2/configuration_types.go b/apis/config/v1beta2/configuration_types.go
index bcffcd024..4721a789c 100644
--- a/apis/config/v1beta2/configuration_types.go
+++ b/apis/config/v1beta2/configuration_types.go
@@ -384,7 +384,7 @@ type ClusterProfileCredentialsProvider struct {
 	// Name is the name of the provider.
 	Name string `json:"name"`
 	//  ExecConfig is the exec configuration to obtain credentials.
-	ExecConfig *clientcmdapi.ExecConfig `json:"execConfig"`
+	ExecConfig clientcmdapi.ExecConfig `json:"execConfig"`
 }
 
 type ClientConnection struct {
diff --git a/apis/config/v1beta2/zz_generated.deepcopy.go b/apis/config/v1beta2/zz_generated.deepcopy.go
index 6c4da46d7..ed29b391e 100644
--- a/apis/config/v1beta2/zz_generated.deepcopy.go
+++ b/apis/config/v1beta2/zz_generated.deepcopy.go
@@ -24,7 +24,6 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/client-go/tools/clientcmd/api"
 	"k8s.io/component-base/config/v1alpha1"
 	timex "time"
 )
@@ -103,11 +102,7 @@ func (in *ClusterProfile) DeepCopy() *ClusterProfile {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ClusterProfileCredentialsProvider) DeepCopyInto(out *ClusterProfileCredentialsProvider) {
 	*out = *in
-	if in.ExecConfig != nil {
-		in, out := &in.ExecConfig, &out.ExecConfig
-		*out = new(api.ExecConfig)
-		(*in).DeepCopyInto(*out)
-	}
+	in.ExecConfig.DeepCopyInto(&out.ExecConfig)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterProfileCredentialsProvider.
diff --git a/apis/kueue/v1beta1/cohort_conversion.go b/apis/kueue/v1beta1/cohort_conversion.go
new file mode 100644
index 000000000..a93fd1a94
--- /dev/null
+++ b/apis/kueue/v1beta1/cohort_conversion.go
@@ -0,0 +1,36 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	"sigs.k8s.io/controller-runtime/pkg/conversion"
+
+	"sigs.k8s.io/kueue/apis/kueue/v1beta2"
+)
+
+//lint:file-ignore ST1003 "generated Convert_* calls below use underscores"
+//revive:disable:var-naming
+
+func (src *Cohort) ConvertTo(dstRaw conversion.Hub) error {
+	dst := dstRaw.(*v1beta2.Cohort)
+	return Convert_v1beta1_Cohort_To_v1beta2_Cohort(src, dst, nil)
+}
+
+func (dst *Cohort) ConvertFrom(srcRaw conversion.Hub) error {
+	src := srcRaw.(*v1beta2.Cohort)
+	return Convert_v1beta2_Cohort_To_v1beta1_Cohort(src, dst, nil)
+}
diff --git a/apis/kueue/v1beta1/cohort_types.go b/apis/kueue/v1beta1/cohort_types.go
index e6ea5f77b..899447156 100644
--- a/apis/kueue/v1beta1/cohort_types.go
+++ b/apis/kueue/v1beta1/cohort_types.go
@@ -79,6 +79,7 @@ type CohortStatus struct {
 }
 
 // +genclient
+// +genclient:nonNamespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:storageversion
 // +kubebuilder:resource:scope=Cluster
diff --git a/apis/kueue/v1beta1/fairsharing_conversion.go b/apis/kueue/v1beta1/fairsharing_conversion.go
new file mode 100644
index 000000000..83ffa2023
--- /dev/null
+++ b/apis/kueue/v1beta1/fairsharing_conversion.go
@@ -0,0 +1,30 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	conversionapi "k8s.io/apimachinery/pkg/conversion"
+
+	"sigs.k8s.io/kueue/apis/kueue/v1beta2"
+)
+
+//lint:file-ignore ST1003 "generated Convert_* calls below use underscores"
+//revive:disable:var-naming
+
+func Convert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(in *FairSharingStatus, out *v1beta2.FairSharingStatus, s conversionapi.Scope) error {
+	return autoConvert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(in, out, s)
+}
diff --git a/apis/kueue/v1beta1/multikueue_conversion.go b/apis/kueue/v1beta1/multikueue_conversion.go
index 6c0f66fc6..235388510 100644
--- a/apis/kueue/v1beta1/multikueue_conversion.go
+++ b/apis/kueue/v1beta1/multikueue_conversion.go
@@ -18,6 +18,7 @@ package v1beta1
 
 import (
 	conversionapi "k8s.io/apimachinery/pkg/conversion"
+	"sigs.k8s.io/controller-runtime/pkg/conversion"
 
 	"sigs.k8s.io/kueue/apis/kueue/v1beta2"
 )
@@ -25,20 +26,34 @@ import (
 //lint:file-ignore ST1003 "generated Convert_* calls below use underscores"
 //revive:disable:var-naming
 
+func (src *MultiKueueCluster) ConvertTo(dstRaw conversion.Hub) error {
+	dst := dstRaw.(*v1beta2.MultiKueueCluster)
+	return autoConvert_v1beta1_MultiKueueCluster_To_v1beta2_MultiKueueCluster(src, dst, nil)
+}
+
+func (dst *MultiKueueCluster) ConvertFrom(srcRaw conversion.Hub) error {
+	src := srcRaw.(*v1beta2.MultiKueueCluster)
+	return autoConvert_v1beta2_MultiKueueCluster_To_v1beta1_MultiKueueCluster(src, dst, nil)
+}
+
 func Convert_v1beta2_MultiKueueClusterSpec_To_v1beta1_MultiKueueClusterSpec(in *v1beta2.MultiKueueClusterSpec, out *MultiKueueClusterSpec, s conversionapi.Scope) error {
-	if in.KubeConfig != nil {
+	if in.ClusterSource.KubeConfig != nil {
 		out.KubeConfig = KubeConfig{
-			Location:     in.KubeConfig.Location,
-			LocationType: LocationType(in.KubeConfig.LocationType),
+			Location:     in.ClusterSource.KubeConfig.Location,
+			LocationType: LocationType(in.ClusterSource.KubeConfig.LocationType),
 		}
 	}
 	return autoConvert_v1beta2_MultiKueueClusterSpec_To_v1beta1_MultiKueueClusterSpec(in, out, s)
 }
 
 func Convert_v1beta1_MultiKueueClusterSpec_To_v1beta2_MultiKueueClusterSpec(in *MultiKueueClusterSpec, out *v1beta2.MultiKueueClusterSpec, s conversionapi.Scope) error {
-	out.KubeConfig = &v1beta2.KubeConfig{
-		Location:     in.KubeConfig.Location,
-		LocationType: v1beta2.LocationType(in.KubeConfig.LocationType),
+	if in.KubeConfig.Location != "" {
+		out.ClusterSource = v1beta2.ClusterSource{
+			KubeConfig: &v1beta2.KubeConfig{
+				Location:     in.KubeConfig.Location,
+				LocationType: v1beta2.LocationType(in.KubeConfig.LocationType),
+			},
+		}
 	}
 	return autoConvert_v1beta1_MultiKueueClusterSpec_To_v1beta2_MultiKueueClusterSpec(in, out, s)
 }
diff --git a/apis/kueue/v1beta1/zz_generated.conversion.go b/apis/kueue/v1beta1/zz_generated.conversion.go
index 5086f8a92..07203119e 100644
--- a/apis/kueue/v1beta1/zz_generated.conversion.go
+++ b/apis/kueue/v1beta1/zz_generated.conversion.go
@@ -123,16 +123,6 @@ func RegisterConversions(s *runtime.Scheme) error {
 	}); err != nil {
 		return err
 	}
-	if err := s.AddGeneratedConversionFunc((*AdmissionFairSharingStatus)(nil), (*v1beta2.AdmissionFairSharingStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
-		return Convert_v1beta1_AdmissionFairSharingStatus_To_v1beta2_AdmissionFairSharingStatus(a.(*AdmissionFairSharingStatus), b.(*v1beta2.AdmissionFairSharingStatus), scope)
-	}); err != nil {
-		return err
-	}
-	if err := s.AddGeneratedConversionFunc((*v1beta2.AdmissionFairSharingStatus)(nil), (*AdmissionFairSharingStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
-		return Convert_v1beta2_AdmissionFairSharingStatus_To_v1beta1_AdmissionFairSharingStatus(a.(*v1beta2.AdmissionFairSharingStatus), b.(*AdmissionFairSharingStatus), scope)
-	}); err != nil {
-		return err
-	}
 	if err := s.AddGeneratedConversionFunc((*AdmissionScope)(nil), (*v1beta2.AdmissionScope)(nil), func(a, b interface{}, scope conversion.Scope) error {
 		return Convert_v1beta1_AdmissionScope_To_v1beta2_AdmissionScope(a.(*AdmissionScope), b.(*v1beta2.AdmissionScope), scope)
 	}); err != nil {
@@ -238,11 +228,6 @@ func RegisterConversions(s *runtime.Scheme) error {
 	}); err != nil {
 		return err
 	}
-	if err := s.AddGeneratedConversionFunc((*FairSharingStatus)(nil), (*v1beta2.FairSharingStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
-		return Convert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(a.(*FairSharingStatus), b.(*v1beta2.FairSharingStatus), scope)
-	}); err != nil {
-		return err
-	}
 	if err := s.AddGeneratedConversionFunc((*v1beta2.FairSharingStatus)(nil), (*FairSharingStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
 		return Convert_v1beta2_FairSharingStatus_To_v1beta1_FairSharingStatus(a.(*v1beta2.FairSharingStatus), b.(*FairSharingStatus), scope)
 	}); err != nil {
@@ -723,6 +708,11 @@ func RegisterConversions(s *runtime.Scheme) error {
 	}); err != nil {
 		return err
 	}
+	if err := s.AddConversionFunc((*FairSharingStatus)(nil), (*v1beta2.FairSharingStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(a.(*FairSharingStatus), b.(*v1beta2.FairSharingStatus), scope)
+	}); err != nil {
+		return err
+	}
 	if err := s.AddConversionFunc((*LocalQueueStatus)(nil), (*v1beta2.LocalQueueStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
 		return Convert_v1beta1_LocalQueueStatus_To_v1beta2_LocalQueueStatus(a.(*LocalQueueStatus), b.(*v1beta2.LocalQueueStatus), scope)
 	}); err != nil {
@@ -1033,28 +1023,6 @@ func Convert_v1beta2_AdmissionChecksStrategy_To_v1beta1_AdmissionChecksStrategy(
 	return autoConvert_v1beta2_AdmissionChecksStrategy_To_v1beta1_AdmissionChecksStrategy(in, out, s)
 }
 
-func autoConvert_v1beta1_AdmissionFairSharingStatus_To_v1beta2_AdmissionFairSharingStatus(in *AdmissionFairSharingStatus, out *v1beta2.AdmissionFairSharingStatus, s conversion.Scope) error {
-	out.ConsumedResources = *(*corev1.ResourceList)(unsafe.Pointer(&in.ConsumedResources))
-	out.LastUpdate = in.LastUpdate
-	return nil
-}
-
-// Convert_v1beta1_AdmissionFairSharingStatus_To_v1beta2_AdmissionFairSharingStatus is an autogenerated conversion function.
-func Convert_v1beta1_AdmissionFairSharingStatus_To_v1beta2_AdmissionFairSharingStatus(in *AdmissionFairSharingStatus, out *v1beta2.AdmissionFairSharingStatus, s conversion.Scope) error {
-	return autoConvert_v1beta1_AdmissionFairSharingStatus_To_v1beta2_AdmissionFairSharingStatus(in, out, s)
-}
-
-func autoConvert_v1beta2_AdmissionFairSharingStatus_To_v1beta1_AdmissionFairSharingStatus(in *v1beta2.AdmissionFairSharingStatus, out *AdmissionFairSharingStatus, s conversion.Scope) error {
-	out.ConsumedResources = *(*corev1.ResourceList)(unsafe.Pointer(&in.ConsumedResources))
-	out.LastUpdate = in.LastUpdate
-	return nil
-}
-
-// Convert_v1beta2_AdmissionFairSharingStatus_To_v1beta1_AdmissionFairSharingStatus is an autogenerated conversion function.
-func Convert_v1beta2_AdmissionFairSharingStatus_To_v1beta1_AdmissionFairSharingStatus(in *v1beta2.AdmissionFairSharingStatus, out *AdmissionFairSharingStatus, s conversion.Scope) error {
-	return autoConvert_v1beta2_AdmissionFairSharingStatus_To_v1beta1_AdmissionFairSharingStatus(in, out, s)
-}
-
 func autoConvert_v1beta1_AdmissionScope_To_v1beta2_AdmissionScope(in *AdmissionScope, out *v1beta2.AdmissionScope, s conversion.Scope) error {
 	out.AdmissionMode = v1beta2.AdmissionMode(in.AdmissionMode)
 	return nil
@@ -1232,7 +1200,15 @@ func autoConvert_v1beta1_ClusterQueueStatus_To_v1beta2_ClusterQueueStatus(in *Cl
 	out.ReservingWorkloads = in.ReservingWorkloads
 	out.AdmittedWorkloads = in.AdmittedWorkloads
 	// WARNING: in.PendingWorkloadsStatus requires manual conversion: does not exist in peer-type
-	out.FairSharing = (*v1beta2.FairSharingStatus)(unsafe.Pointer(in.FairSharing))
+	if in.FairSharing != nil {
+		in, out := &in.FairSharing, &out.FairSharing
+		*out = new(v1beta2.FairSharingStatus)
+		if err := Convert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(*in, *out, s); err != nil {
+			return err
+		}
+	} else {
+		out.FairSharing = nil
+	}
 	return nil
 }
 
@@ -1243,7 +1219,15 @@ func autoConvert_v1beta2_ClusterQueueStatus_To_v1beta1_ClusterQueueStatus(in *v1
 	out.PendingWorkloads = in.PendingWorkloads
 	out.ReservingWorkloads = in.ReservingWorkloads
 	out.AdmittedWorkloads = in.AdmittedWorkloads
-	out.FairSharing = (*FairSharingStatus)(unsafe.Pointer(in.FairSharing))
+	if in.FairSharing != nil {
+		in, out := &in.FairSharing, &out.FairSharing
+		*out = new(FairSharingStatus)
+		if err := Convert_v1beta2_FairSharingStatus_To_v1beta1_FairSharingStatus(*in, *out, s); err != nil {
+			return err
+		}
+	} else {
+		out.FairSharing = nil
+	}
 	return nil
 }
 
@@ -1286,7 +1270,17 @@ func Convert_v1beta2_Cohort_To_v1beta1_Cohort(in *v1beta2.Cohort, out *Cohort, s
 
 func autoConvert_v1beta1_CohortList_To_v1beta2_CohortList(in *CohortList, out *v1beta2.CohortList, s conversion.Scope) error {
 	out.ListMeta = in.ListMeta
-	out.Items = *(*[]v1beta2.Cohort)(unsafe.Pointer(&in.Items))
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]v1beta2.Cohort, len(*in))
+		for i := range *in {
+			if err := Convert_v1beta1_Cohort_To_v1beta2_Cohort(&(*in)[i], &(*out)[i], s); err != nil {
+				return err
+			}
+		}
+	} else {
+		out.Items = nil
+	}
 	return nil
 }
 
@@ -1297,7 +1291,17 @@ func Convert_v1beta1_CohortList_To_v1beta2_CohortList(in *CohortList, out *v1bet
 
 func autoConvert_v1beta2_CohortList_To_v1beta1_CohortList(in *v1beta2.CohortList, out *CohortList, s conversion.Scope) error {
 	out.ListMeta = in.ListMeta
-	out.Items = *(*[]Cohort)(unsafe.Pointer(&in.Items))
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Cohort, len(*in))
+		for i := range *in {
+			if err := Convert_v1beta2_Cohort_To_v1beta1_Cohort(&(*in)[i], &(*out)[i], s); err != nil {
+				return err
+			}
+		}
+	} else {
+		out.Items = nil
+	}
 	return nil
 }
 
@@ -1331,7 +1335,15 @@ func Convert_v1beta2_CohortSpec_To_v1beta1_CohortSpec(in *v1beta2.CohortSpec, ou
 }
 
 func autoConvert_v1beta1_CohortStatus_To_v1beta2_CohortStatus(in *CohortStatus, out *v1beta2.CohortStatus, s conversion.Scope) error {
-	out.FairSharing = (*v1beta2.FairSharingStatus)(unsafe.Pointer(in.FairSharing))
+	if in.FairSharing != nil {
+		in, out := &in.FairSharing, &out.FairSharing
+		*out = new(v1beta2.FairSharingStatus)
+		if err := Convert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(*in, *out, s); err != nil {
+			return err
+		}
+	} else {
+		out.FairSharing = nil
+	}
 	return nil
 }
 
@@ -1341,7 +1353,15 @@ func Convert_v1beta1_CohortStatus_To_v1beta2_CohortStatus(in *CohortStatus, out
 }
 
 func autoConvert_v1beta2_CohortStatus_To_v1beta1_CohortStatus(in *v1beta2.CohortStatus, out *CohortStatus, s conversion.Scope) error {
-	out.FairSharing = (*FairSharingStatus)(unsafe.Pointer(in.FairSharing))
+	if in.FairSharing != nil {
+		in, out := &in.FairSharing, &out.FairSharing
+		*out = new(FairSharingStatus)
+		if err := Convert_v1beta2_FairSharingStatus_To_v1beta1_FairSharingStatus(*in, *out, s); err != nil {
+			return err
+		}
+	} else {
+		out.FairSharing = nil
+	}
 	return nil
 }
 
@@ -1372,18 +1392,12 @@ func Convert_v1beta2_FairSharing_To_v1beta1_FairSharing(in *v1beta2.FairSharing,
 
 func autoConvert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(in *FairSharingStatus, out *v1beta2.FairSharingStatus, s conversion.Scope) error {
 	out.WeightedShare = in.WeightedShare
-	out.AdmissionFairSharingStatus = (*v1beta2.AdmissionFairSharingStatus)(unsafe.Pointer(in.AdmissionFairSharingStatus))
+	// WARNING: in.AdmissionFairSharingStatus requires manual conversion: does not exist in peer-type
 	return nil
 }
 
-// Convert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus is an autogenerated conversion function.
-func Convert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(in *FairSharingStatus, out *v1beta2.FairSharingStatus, s conversion.Scope) error {
-	return autoConvert_v1beta1_FairSharingStatus_To_v1beta2_FairSharingStatus(in, out, s)
-}
-
 func autoConvert_v1beta2_FairSharingStatus_To_v1beta1_FairSharingStatus(in *v1beta2.FairSharingStatus, out *FairSharingStatus, s conversion.Scope) error {
 	out.WeightedShare = in.WeightedShare
-	out.AdmissionFairSharingStatus = (*AdmissionFairSharingStatus)(unsafe.Pointer(in.AdmissionFairSharingStatus))
 	return nil
 }
 
@@ -1632,7 +1646,7 @@ func autoConvert_v1beta1_LocalQueueStatus_To_v1beta2_LocalQueueStatus(in *LocalQ
 	out.FlavorsReservation = *(*[]v1beta2.LocalQueueFlavorUsage)(unsafe.Pointer(&in.FlavorsReservation))
 	// WARNING: in.FlavorUsage requires manual conversion: does not exist in peer-type
 	// WARNING: in.Flavors requires manual conversion: does not exist in peer-type
-	out.FairSharing = (*v1beta2.FairSharingStatus)(unsafe.Pointer(in.FairSharing))
+	out.FairSharing = (*v1beta2.LocalQueueFairSharingStatus)(unsafe.Pointer(in.FairSharing))
 	return nil
 }
 
@@ -1722,13 +1736,12 @@ func Convert_v1beta2_MultiKueueClusterList_To_v1beta1_MultiKueueClusterList(in *
 }
 
 func autoConvert_v1beta1_MultiKueueClusterSpec_To_v1beta2_MultiKueueClusterSpec(in *MultiKueueClusterSpec, out *v1beta2.MultiKueueClusterSpec, s conversion.Scope) error {
-	// WARNING: in.KubeConfig requires manual conversion: inconvertible types (sigs.k8s.io/kueue/apis/kueue/v1beta1.KubeConfig vs *sigs.k8s.io/kueue/apis/kueue/v1beta2.KubeConfig)
+	// WARNING: in.KubeConfig requires manual conversion: does not exist in peer-type
 	return nil
 }
 
 func autoConvert_v1beta2_MultiKueueClusterSpec_To_v1beta1_MultiKueueClusterSpec(in *v1beta2.MultiKueueClusterSpec, out *MultiKueueClusterSpec, s conversion.Scope) error {
-	// WARNING: in.KubeConfig requires manual conversion: inconvertible types (*sigs.k8s.io/kueue/apis/kueue/v1beta2.KubeConfig vs sigs.k8s.io/kueue/apis/kueue/v1beta1.KubeConfig)
-	// WARNING: in.ClusterProfile requires manual conversion: does not exist in peer-type
+	// WARNING: in.ClusterSource requires manual conversion: does not exist in peer-type
 	return nil
 }
 
diff --git a/apis/kueue/v1beta2/cohort_types.go b/apis/kueue/v1beta2/cohort_types.go
index 8542b1097..865096f4c 100644
--- a/apis/kueue/v1beta2/cohort_types.go
+++ b/apis/kueue/v1beta2/cohort_types.go
@@ -81,6 +81,7 @@ type CohortStatus struct {
 }
 
 // +genclient
+// +genclient:nonNamespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:resource:scope=Cluster
 // +kubebuilder:subresource:status
@@ -116,3 +117,5 @@ type CohortList struct {
 func init() {
 	SchemeBuilder.Register(&Cohort{}, &CohortList{})
 }
+
+func (src *Cohort) Hub() {}
diff --git a/apis/kueue/v1beta2/fairsharing_types.go b/apis/kueue/v1beta2/fairsharing_types.go
index 2bab0cc89..0cbb7c074 100644
--- a/apis/kueue/v1beta2/fairsharing_types.go
+++ b/apis/kueue/v1beta2/fairsharing_types.go
@@ -17,9 +17,7 @@ limitations under the License.
 package v1beta2
 
 import (
-	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 // FairSharing contains the properties of the ClusterQueue or Cohort,
@@ -56,22 +54,6 @@ type FairSharingStatus struct {
 	// 9223372036854775807, the maximum possible share value.
 	// +required
 	WeightedShare int64 `json:"weightedShare"`
-
-	// admissionFairSharingStatus represents information relevant to the Admission Fair Sharing
-	// +optional
-	AdmissionFairSharingStatus *AdmissionFairSharingStatus `json:"admissionFairSharingStatus,omitempty"`
-}
-
-type AdmissionFairSharingStatus struct {
-	// consumedResources represents the aggregated usage of resources over time,
-	// with decaying function applied.
-	// The value is populated if usage consumption functionality is enabled in Kueue config.
-	// +required
-	ConsumedResources corev1.ResourceList `json:"consumedResources"`
-
-	// lastUpdate is the time when share and consumed resources were updated.
-	// +required
-	LastUpdate metav1.Time `json:"lastUpdate"`
 }
 
 type AdmissionScope struct {
diff --git a/apis/kueue/v1beta2/localqueue_types.go b/apis/kueue/v1beta2/localqueue_types.go
index e047c7367..c1c12321f 100644
--- a/apis/kueue/v1beta2/localqueue_types.go
+++ b/apis/kueue/v1beta2/localqueue_types.go
@@ -118,7 +118,36 @@ type LocalQueueStatus struct {
 
 	// fairSharing contains the information about the current status of fair sharing.
 	// +optional
-	FairSharing *FairSharingStatus `json:"fairSharing,omitempty"`
+	FairSharing *LocalQueueFairSharingStatus `json:"fairSharing,omitempty"`
+}
+
+// LocalQueueFairSharingStatus contains the information about the current status of Fair Sharing.
+type LocalQueueFairSharingStatus struct {
+	// weightedShare represents the maximum of the ratios of usage
+	// above nominal quota to the lendable resources in the
+	// Cohort, among all the resources provided by the Node, and
+	// divided by the weight.  If zero, it means that the usage of
+	// the Node is below the nominal quota.  If the Node has a
+	// weight of zero and is borrowing, this will return
+	// 9223372036854775807, the maximum possible share value.
+	// +required
+	WeightedShare int64 `json:"weightedShare"`
+
+	// admissionFairSharingStatus represents information relevant to the Admission Fair Sharing
+	// +optional
+	AdmissionFairSharingStatus *LocalQueueAdmissionFairSharingStatus `json:"admissionFairSharingStatus,omitempty"`
+}
+
+type LocalQueueAdmissionFairSharingStatus struct {
+	// consumedResources represents the aggregated usage of resources over time,
+	// with decaying function applied.
+	// The value is populated if usage consumption functionality is enabled in Kueue config.
+	// +required
+	ConsumedResources corev1.ResourceList `json:"consumedResources"`
+
+	// lastUpdate is the time when share and consumed resources were updated.
+	// +required
+	LastUpdate metav1.Time `json:"lastUpdate"`
 }
 
 const (
diff --git a/apis/kueue/v1beta2/multikueue_types.go b/apis/kueue/v1beta2/multikueue_types.go
index f9ab6c466..9729a7ea3 100644
--- a/apis/kueue/v1beta2/multikueue_types.go
+++ b/apis/kueue/v1beta2/multikueue_types.go
@@ -52,26 +52,31 @@ type KubeConfig struct {
 	// +kubebuilder:validation:MaxLength=256
 	// +kubebuilder:validation:MinLength=1
 	// +required
-	Location string `json:"location,omitempty"`
+	Location string `json:"location"`
 
 	// locationType of the KubeConfig.
 	//
 	// +kubebuilder:default=Secret
 	// +optional
 	// +kubebuilder:validation:Enum=Secret;Path
-	LocationType LocationType `json:"locationType"`
+	LocationType LocationType `json:"locationType,omitempty"`
 }
 
-// +kubebuilder:validation:ExactlyOneOf=kubeConfig;clusterProfile
-
 type MultiKueueClusterSpec struct {
+	// clusterSource is the source to connect to the cluster.
+	// +required
+	ClusterSource ClusterSource `json:"clusterSource,omitempty"`
+}
+
+// +kubebuilder:validation:ExactlyOneOf=kubeConfig;clusterProfileRef
+type ClusterSource struct {
 	// kubeConfig is information on how to connect to the cluster.
 	// +optional
 	KubeConfig *KubeConfig `json:"kubeConfig,omitempty,omitzero"`
 
-	// clusterProfile is the reference to the ClusterProfile object used to connect to the cluster.
+	// clusterProfileRef is the reference to the ClusterProfile object used to connect to the cluster.
 	// +optional
-	ClusterProfile *ClusterProfileReference `json:"clusterProfile,omitempty"`
+	ClusterProfileRef *ClusterProfileReference `json:"clusterProfileRef,omitempty"`
 }
 
 type ClusterProfileReference struct {
@@ -80,12 +85,6 @@ type ClusterProfileReference struct {
 	// +kubebuilder:validation:MinLength=1
 	// +required
 	Name string `json:"name,omitempty"`
-
-	// namespace of the ClusterProfile.
-	// +kubebuilder:validation:MaxLength=256
-	// +kubebuilder:validation:MinLength=1
-	// +required
-	Namespace string `json:"namespace,omitempty"`
 }
 
 type MultiKueueClusterStatus struct {
@@ -175,3 +174,5 @@ type MultiKueueConfigList struct {
 func init() {
 	SchemeBuilder.Register(&MultiKueueConfig{}, &MultiKueueConfigList{}, &MultiKueueCluster{}, &MultiKueueClusterList{})
 }
+
+func (*MultiKueueCluster) Hub() {}
diff --git a/apis/kueue/v1beta2/zz_generated.deepcopy.go b/apis/kueue/v1beta2/zz_generated.deepcopy.go
index 9ea20cb1e..d4b08583e 100644
--- a/apis/kueue/v1beta2/zz_generated.deepcopy.go
+++ b/apis/kueue/v1beta2/zz_generated.deepcopy.go
@@ -239,29 +239,6 @@ func (in *AdmissionChecksStrategy) DeepCopy() *AdmissionChecksStrategy {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *AdmissionFairSharingStatus) DeepCopyInto(out *AdmissionFairSharingStatus) {
-	*out = *in
-	if in.ConsumedResources != nil {
-		in, out := &in.ConsumedResources, &out.ConsumedResources
-		*out = make(corev1.ResourceList, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val.DeepCopy()
-		}
-	}
-	in.LastUpdate.DeepCopyInto(&out.LastUpdate)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionFairSharingStatus.
-func (in *AdmissionFairSharingStatus) DeepCopy() *AdmissionFairSharingStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(AdmissionFairSharingStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *AdmissionScope) DeepCopyInto(out *AdmissionScope) {
 	*out = *in
@@ -475,7 +452,7 @@ func (in *ClusterQueueStatus) DeepCopyInto(out *ClusterQueueStatus) {
 	if in.FairSharing != nil {
 		in, out := &in.FairSharing, &out.FairSharing
 		*out = new(FairSharingStatus)
-		(*in).DeepCopyInto(*out)
+		**out = **in
 	}
 }
 
@@ -489,6 +466,31 @@ 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 *ClusterSource) DeepCopyInto(out *ClusterSource) {
+	*out = *in
+	if in.KubeConfig != nil {
+		in, out := &in.KubeConfig, &out.KubeConfig
+		*out = new(KubeConfig)
+		**out = **in
+	}
+	if in.ClusterProfileRef != nil {
+		in, out := &in.ClusterProfileRef, &out.ClusterProfileRef
+		*out = new(ClusterProfileReference)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterSource.
+func (in *ClusterSource) DeepCopy() *ClusterSource {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterSource)
+	in.DeepCopyInto(out)
+	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
@@ -581,7 +583,7 @@ func (in *CohortStatus) DeepCopyInto(out *CohortStatus) {
 	if in.FairSharing != nil {
 		in, out := &in.FairSharing, &out.FairSharing
 		*out = new(FairSharingStatus)
-		(*in).DeepCopyInto(*out)
+		**out = **in
 	}
 }
 
@@ -618,11 +620,6 @@ func (in *FairSharing) DeepCopy() *FairSharing {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *FairSharingStatus) DeepCopyInto(out *FairSharingStatus) {
 	*out = *in
-	if in.AdmissionFairSharingStatus != nil {
-		in, out := &in.AdmissionFairSharingStatus, &out.AdmissionFairSharingStatus
-		*out = new(AdmissionFairSharingStatus)
-		(*in).DeepCopyInto(*out)
-	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FairSharingStatus.
@@ -741,6 +738,49 @@ func (in *LocalQueue) DeepCopyObject() runtime.Object {
 	return nil
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalQueueAdmissionFairSharingStatus) DeepCopyInto(out *LocalQueueAdmissionFairSharingStatus) {
+	*out = *in
+	if in.ConsumedResources != nil {
+		in, out := &in.ConsumedResources, &out.ConsumedResources
+		*out = make(corev1.ResourceList, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val.DeepCopy()
+		}
+	}
+	in.LastUpdate.DeepCopyInto(&out.LastUpdate)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalQueueAdmissionFairSharingStatus.
+func (in *LocalQueueAdmissionFairSharingStatus) DeepCopy() *LocalQueueAdmissionFairSharingStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(LocalQueueAdmissionFairSharingStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalQueueFairSharingStatus) DeepCopyInto(out *LocalQueueFairSharingStatus) {
+	*out = *in
+	if in.AdmissionFairSharingStatus != nil {
+		in, out := &in.AdmissionFairSharingStatus, &out.AdmissionFairSharingStatus
+		*out = new(LocalQueueAdmissionFairSharingStatus)
+		(*in).DeepCopyInto(*out)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalQueueFairSharingStatus.
+func (in *LocalQueueFairSharingStatus) DeepCopy() *LocalQueueFairSharingStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(LocalQueueFairSharingStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *LocalQueueFlavorUsage) DeepCopyInto(out *LocalQueueFlavorUsage) {
 	*out = *in
@@ -862,7 +902,7 @@ func (in *LocalQueueStatus) DeepCopyInto(out *LocalQueueStatus) {
 	}
 	if in.FairSharing != nil {
 		in, out := &in.FairSharing, &out.FairSharing
-		*out = new(FairSharingStatus)
+		*out = new(LocalQueueFairSharingStatus)
 		(*in).DeepCopyInto(*out)
 	}
 }
@@ -939,16 +979,7 @@ func (in *MultiKueueClusterList) DeepCopyObject() runtime.Object {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *MultiKueueClusterSpec) DeepCopyInto(out *MultiKueueClusterSpec) {
 	*out = *in
-	if in.KubeConfig != nil {
-		in, out := &in.KubeConfig, &out.KubeConfig
-		*out = new(KubeConfig)
-		**out = **in
-	}
-	if in.ClusterProfile != nil {
-		in, out := &in.ClusterProfile, &out.ClusterProfile
-		*out = new(ClusterProfileReference)
-		**out = **in
-	}
+	in.ClusterSource.DeepCopyInto(&out.ClusterSource)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MultiKueueClusterSpec.
diff --git a/charts/kueue/templates/crd/kueue.x-k8s.io_clusterqueues.yaml b/charts/kueue/templates/crd/kueue.x-k8s.io_clusterqueues.yaml
index 238758e6b..8e7d605f3 100644
--- a/charts/kueue/templates/crd/kueue.x-k8s.io_clusterqueues.yaml
+++ b/charts/kueue/templates/crd/kueue.x-k8s.io_clusterqueues.yaml
@@ -1384,29 +1384,6 @@ spec:
                     when participating in Fair Sharing.
                     This is recorded only when Fair Sharing is enabled in the Kueue configuration.
                   properties:
-                    admissionFairSharingStatus:
-                      description: admissionFairSharingStatus represents information relevant to the Admission Fair Sharing
-                      properties:
-                        consumedResources:
-                          additionalProperties:
-                            anyOf:
-                              - type: integer
-                              - type: string
-                            pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                            x-kubernetes-int-or-string: true
-                          description: |-
-                            consumedResources represents the aggregated usage of resources over time,
-                            with decaying function applied.
-                            The value is populated if usage consumption functionality is enabled in Kueue config.
-                          type: object
-                        lastUpdate:
-                          description: lastUpdate is the time when share and consumed resources were updated.
-                          format: date-time
-                          type: string
-                      required:
-                        - consumedResources
-                        - lastUpdate
-                      type: object
                     weightedShare:
                       description: |-
                         weightedShare represents the maximum of the ratios of usage
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 e7d0ed710..c5063b515 100644
--- a/charts/kueue/templates/crd/kueue.x-k8s.io_cohorts.yaml
+++ b/charts/kueue/templates/crd/kueue.x-k8s.io_cohorts.yaml
@@ -28,6 +28,16 @@ metadata:
     controller-gen.kubebuilder.io/version: v0.19.0
   name: cohorts.kueue.x-k8s.io
 spec:
+  conversion:
+    strategy: Webhook
+    webhook:
+      clientConfig:
+        service:
+          name: '{{ include "kueue.fullname" . }}-webhook-service'
+          namespace: '{{ .Release.Namespace }}'
+          path: /convert
+      conversionReviewVersions:
+        - v1
   group: kueue.x-k8s.io
   names:
     kind: Cohort
@@ -542,29 +552,6 @@ spec:
                     when participating in Fair Sharing.
                     The is recorded only when Fair Sharing is enabled in the Kueue configuration.
                   properties:
-                    admissionFairSharingStatus:
-                      description: admissionFairSharingStatus represents information relevant to the Admission Fair Sharing
-                      properties:
-                        consumedResources:
-                          additionalProperties:
-                            anyOf:
-                              - type: integer
-                              - type: string
-                            pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                            x-kubernetes-int-or-string: true
-                          description: |-
-                            consumedResources represents the aggregated usage of resources over time,
-                            with decaying function applied.
-                            The value is populated if usage consumption functionality is enabled in Kueue config.
-                          type: object
-                        lastUpdate:
-                          description: lastUpdate is the time when share and consumed resources were updated.
-                          format: date-time
-                          type: string
-                      required:
-                        - consumedResources
-                        - lastUpdate
-                      type: object
                     weightedShare:
                       description: |-
                         weightedShare represents the maximum of the ratios of usage
diff --git a/charts/kueue/templates/crd/kueue.x-k8s.io_multikueueclusters.yaml b/charts/kueue/templates/crd/kueue.x-k8s.io_multikueueclusters.yaml
index 0ae93fa2d..ec13903bb 100644
--- a/charts/kueue/templates/crd/kueue.x-k8s.io_multikueueclusters.yaml
+++ b/charts/kueue/templates/crd/kueue.x-k8s.io_multikueueclusters.yaml
@@ -28,6 +28,16 @@ metadata:
     controller-gen.kubebuilder.io/version: v0.19.0
   name: multikueueclusters.kueue.x-k8s.io
 spec:
+  conversion:
+    strategy: Webhook
+    webhook:
+      clientConfig:
+        service:
+          name: '{{ include "kueue.fullname" . }}-webhook-service'
+          namespace: '{{ .Release.Namespace }}'
+          path: /convert
+      conversionReviewVersions:
+        - v1
   group: kueue.x-k8s.io
   names:
     kind: MultiKueueCluster
@@ -198,49 +208,49 @@ spec:
             spec:
               description: spec is the specification of the MultiKueueCluster.
               properties:
-                clusterProfile:
-                  description: clusterProfile is the reference to the ClusterProfile object used to connect to the cluster.
+                clusterSource:
+                  description: clusterSource is the source to connect to the cluster.
                   properties:
-                    name:
-                      description: name of the ClusterProfile.
-                      maxLength: 256
-                      minLength: 1
-                      type: string
-                    namespace:
-                      description: namespace of the ClusterProfile.
-                      maxLength: 256
-                      minLength: 1
-                      type: string
-                  required:
-                    - name
-                    - namespace
-                  type: object
-                kubeConfig:
-                  description: kubeConfig is information on how to connect to the cluster.
-                  properties:
-                    location:
-                      description: |-
-                        location of the KubeConfig.
+                    clusterProfileRef:
+                      description: clusterProfileRef is the reference to the ClusterProfile object used to connect to the cluster.
+                      properties:
+                        name:
+                          description: name of the ClusterProfile.
+                          maxLength: 256
+                          minLength: 1
+                          type: string
+                      required:
+                        - name
+                      type: object
+                    kubeConfig:
+                      description: kubeConfig is information on how to connect to the cluster.
+                      properties:
+                        location:
+                          description: |-
+                            location of the KubeConfig.
 
-                        If LocationType is Secret then Location is the name of the secret inside the namespace in
-                        which the kueue controller manager is running. The config should be stored in the "kubeconfig" key.
-                      maxLength: 256
-                      minLength: 1
-                      type: string
-                    locationType:
-                      default: Secret
-                      description: locationType of the KubeConfig.
-                      enum:
-                        - Secret
-                        - Path
-                      type: string
-                  required:
-                    - location
+                            If LocationType is Secret then Location is the name of the secret inside the namespace in
+                            which the kueue controller manager is running. The config should be stored in the "kubeconfig" key.
+                          maxLength: 256
+                          minLength: 1
+                          type: string
+                        locationType:
+                          default: Secret
+                          description: locationType of the KubeConfig.
+                          enum:
+                            - Secret
+                            - Path
+                          type: string
+                      required:
+                        - location
+                      type: object
                   type: object
+                  x-kubernetes-validations:
+                    - message: exactly one of the fields in [kubeConfig clusterProfileRef] must be set
+                      rule: '[has(self.kubeConfig),has(self.clusterProfileRef)].filter(x,x==true).size() == 1'
+              required:
+                - clusterSource
               type: object
-              x-kubernetes-validations:
-                - message: exactly one of the fields in [kubeConfig clusterProfile] must be set
-                  rule: '[has(self.kubeConfig),has(self.clusterProfile)].filter(x,x==true).size() == 1'
             status:
               description: status is the status of the MultiKueueCluster.
               properties:
diff --git a/client-go/applyconfiguration/kueue/v1beta1/cohort.go b/client-go/applyconfiguration/kueue/v1beta1/cohort.go
index 1e85e4982..2172b2395 100644
--- a/client-go/applyconfiguration/kueue/v1beta1/cohort.go
+++ b/client-go/applyconfiguration/kueue/v1beta1/cohort.go
@@ -34,10 +34,9 @@ type CohortApplyConfiguration struct {
 
 // Cohort constructs a declarative configuration of the Cohort type for use with
 // apply.
-func Cohort(name, namespace string) *CohortApplyConfiguration {
+func Cohort(name string) *CohortApplyConfiguration {
 	b := &CohortApplyConfiguration{}
 	b.WithName(name)
-	b.WithNamespace(namespace)
 	b.WithKind("Cohort")
 	b.WithAPIVersion("kueue.x-k8s.io/v1beta1")
 	return b
diff --git a/client-go/applyconfiguration/kueue/v1beta2/clusterprofilereference.go b/client-go/applyconfiguration/kueue/v1beta2/clusterprofilereference.go
index e2bc8e47a..79c84c327 100644
--- a/client-go/applyconfiguration/kueue/v1beta2/clusterprofilereference.go
+++ b/client-go/applyconfiguration/kueue/v1beta2/clusterprofilereference.go
@@ -20,8 +20,7 @@ package v1beta2
 // ClusterProfileReferenceApplyConfiguration represents a declarative configuration of the ClusterProfileReference type for use
 // with apply.
 type ClusterProfileReferenceApplyConfiguration struct {
-	Name      *string `json:"name,omitempty"`
-	Namespace *string `json:"namespace,omitempty"`
+	Name *string `json:"name,omitempty"`
 }
 
 // ClusterProfileReferenceApplyConfiguration constructs a declarative configuration of the ClusterProfileReference type for use with
@@ -37,11 +36,3 @@ func (b *ClusterProfileReferenceApplyConfiguration) WithName(value string) *Clus
 	b.Name = &value
 	return b
 }
-
-// WithNamespace sets the Namespace 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 Namespace field is set to the value of the last call.
-func (b *ClusterProfileReferenceApplyConfiguration) WithNamespace(value string) *ClusterProfileReferenceApplyConfiguration {
-	b.Namespace = &value
-	return b
-}
diff --git a/client-go/applyconfiguration/kueue/v1beta2/clustersource.go b/client-go/applyconfiguration/kueue/v1beta2/clustersource.go
new file mode 100644
index 000000000..056968dbe
--- /dev/null
+++ b/client-go/applyconfiguration/kueue/v1beta2/clustersource.go
@@ -0,0 +1,47 @@
+/*
+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 applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta2
+
+// ClusterSourceApplyConfiguration represents a declarative configuration of the ClusterSource type for use
+// with apply.
+type ClusterSourceApplyConfiguration struct {
+	KubeConfig        *KubeConfigApplyConfiguration              `json:"kubeConfig,omitempty"`
+	ClusterProfileRef *ClusterProfileReferenceApplyConfiguration `json:"clusterProfileRef,omitempty"`
+}
+
+// ClusterSourceApplyConfiguration constructs a declarative configuration of the ClusterSource type for use with
+// apply.
+func ClusterSource() *ClusterSourceApplyConfiguration {
+	return &ClusterSourceApplyConfiguration{}
+}
+
+// WithKubeConfig sets the KubeConfig 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 KubeConfig field is set to the value of the last call.
+func (b *ClusterSourceApplyConfiguration) WithKubeConfig(value *KubeConfigApplyConfiguration) *ClusterSourceApplyConfiguration {
+	b.KubeConfig = value
+	return b
+}
+
+// WithClusterProfileRef sets the ClusterProfileRef 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 ClusterProfileRef field is set to the value of the last call.
+func (b *ClusterSourceApplyConfiguration) WithClusterProfileRef(value *ClusterProfileReferenceApplyConfiguration) *ClusterSourceApplyConfiguration {
+	b.ClusterProfileRef = value
+	return b
+}
diff --git a/client-go/applyconfiguration/kueue/v1beta2/cohort.go b/client-go/applyconfiguration/kueue/v1beta2/cohort.go
index 1903d044c..4a9022f37 100644
--- a/client-go/applyconfiguration/kueue/v1beta2/cohort.go
+++ b/client-go/applyconfiguration/kueue/v1beta2/cohort.go
@@ -34,10 +34,9 @@ type CohortApplyConfiguration struct {
 
 // Cohort constructs a declarative configuration of the Cohort type for use with
 // apply.
-func Cohort(name, namespace string) *CohortApplyConfiguration {
+func Cohort(name string) *CohortApplyConfiguration {
 	b := &CohortApplyConfiguration{}
 	b.WithName(name)
-	b.WithNamespace(namespace)
 	b.WithKind("Cohort")
 	b.WithAPIVersion("kueue.x-k8s.io/v1beta2")
 	return b
diff --git a/client-go/applyconfiguration/kueue/v1beta2/fairsharingstatus.go b/client-go/applyconfiguration/kueue/v1beta2/fairsharingstatus.go
index e8eaf9732..9f1759cd1 100644
--- a/client-go/applyconfiguration/kueue/v1beta2/fairsharingstatus.go
+++ b/client-go/applyconfiguration/kueue/v1beta2/fairsharingstatus.go
@@ -20,8 +20,7 @@ package v1beta2
 // FairSharingStatusApplyConfiguration represents a declarative configuration of the FairSharingStatus type for use
 // with apply.
 type FairSharingStatusApplyConfiguration struct {
-	WeightedShare              *int64                                        `json:"weightedShare,omitempty"`
-	AdmissionFairSharingStatus *AdmissionFairSharingStatusApplyConfiguration `json:"admissionFairSharingStatus,omitempty"`
+	WeightedShare *int64 `json:"weightedShare,omitempty"`
 }
 
 // FairSharingStatusApplyConfiguration constructs a declarative configuration of the FairSharingStatus type for use with
@@ -37,11 +36,3 @@ func (b *FairSharingStatusApplyConfiguration) WithWeightedShare(value int64) *Fa
 	b.WeightedShare = &value
 	return b
 }
-
-// WithAdmissionFairSharingStatus sets the AdmissionFairSharingStatus 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 AdmissionFairSharingStatus field is set to the value of the last call.
-func (b *FairSharingStatusApplyConfiguration) WithAdmissionFairSharingStatus(value *AdmissionFairSharingStatusApplyConfiguration) *FairSharingStatusApplyConfiguration {
-	b.AdmissionFairSharingStatus = value
-	return b
-}
diff --git a/client-go/applyconfiguration/kueue/v1beta2/admissionfairsharingstatus.go b/client-go/applyconfiguration/kueue/v1beta2/localqueueadmissionfairsharingstatus.go
similarity index 64%
rename from client-go/applyconfiguration/kueue/v1beta2/admissionfairsharingstatus.go
rename to client-go/applyconfiguration/kueue/v1beta2/localqueueadmissionfairsharingstatus.go
index 01231c0bc..03f73d332 100644
--- a/client-go/applyconfiguration/kueue/v1beta2/admissionfairsharingstatus.go
+++ b/client-go/applyconfiguration/kueue/v1beta2/localqueueadmissionfairsharingstatus.go
@@ -22,23 +22,23 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-// AdmissionFairSharingStatusApplyConfiguration represents a declarative configuration of the AdmissionFairSharingStatus type for use
+// LocalQueueAdmissionFairSharingStatusApplyConfiguration represents a declarative configuration of the LocalQueueAdmissionFairSharingStatus type for use
 // with apply.
-type AdmissionFairSharingStatusApplyConfiguration struct {
+type LocalQueueAdmissionFairSharingStatusApplyConfiguration struct {
 	ConsumedResources *v1.ResourceList `json:"consumedResources,omitempty"`
 	LastUpdate        *metav1.Time     `json:"lastUpdate,omitempty"`
 }
 
-// AdmissionFairSharingStatusApplyConfiguration constructs a declarative configuration of the AdmissionFairSharingStatus type for use with
+// LocalQueueAdmissionFairSharingStatusApplyConfiguration constructs a declarative configuration of the LocalQueueAdmissionFairSharingStatus type for use with
 // apply.
-func AdmissionFairSharingStatus() *AdmissionFairSharingStatusApplyConfiguration {
-	return &AdmissionFairSharingStatusApplyConfiguration{}
+func LocalQueueAdmissionFairSharingStatus() *LocalQueueAdmissionFairSharingStatusApplyConfiguration {
+	return &LocalQueueAdmissionFairSharingStatusApplyConfiguration{}
 }
 
 // WithConsumedResources sets the ConsumedResources 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 ConsumedResources field is set to the value of the last call.
-func (b *AdmissionFairSharingStatusApplyConfiguration) WithConsumedResources(value v1.ResourceList) *AdmissionFairSharingStatusApplyConfiguration {
+func (b *LocalQueueAdmissionFairSharingStatusApplyConfiguration) WithConsumedResources(value v1.ResourceList) *LocalQueueAdmissionFairSharingStatusApplyConfiguration {
 	b.ConsumedResources = &value
 	return b
 }
@@ -46,7 +46,7 @@ func (b *AdmissionFairSharingStatusApplyConfiguration) WithConsumedResources(val
 // WithLastUpdate sets the LastUpdate 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 LastUpdate field is set to the value of the last call.
-func (b *AdmissionFairSharingStatusApplyConfiguration) WithLastUpdate(value metav1.Time) *AdmissionFairSharingStatusApplyConfiguration {
+func (b *LocalQueueAdmissionFairSharingStatusApplyConfiguration) WithLastUpdate(value metav1.Time) *LocalQueueAdmissionFairSharingStatusApplyConfiguration {
 	b.LastUpdate = &value
 	return b
 }
diff --git a/client-go/applyconfiguration/kueue/v1beta2/localqueuefairsharingstatus.go b/client-go/applyconfiguration/kueue/v1beta2/localqueuefairsharingstatus.go
new file mode 100644
index 000000000..5bcb9778b
--- /dev/null
+++ b/client-go/applyconfiguration/kueue/v1beta2/localqueuefairsharingstatus.go
@@ -0,0 +1,47 @@
+/*
+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 applyconfiguration-gen. DO NOT EDIT.
+
+package v1beta2
+
+// LocalQueueFairSharingStatusApplyConfiguration represents a declarative configuration of the LocalQueueFairSharingStatus type for use
+// with apply.
+type LocalQueueFairSharingStatusApplyConfiguration struct {
+	WeightedShare              *int64                                                  `json:"weightedShare,omitempty"`
+	AdmissionFairSharingStatus *LocalQueueAdmissionFairSharingStatusApplyConfiguration `json:"admissionFairSharingStatus,omitempty"`
+}
+
+// LocalQueueFairSharingStatusApplyConfiguration constructs a declarative configuration of the LocalQueueFairSharingStatus type for use with
+// apply.
+func LocalQueueFairSharingStatus() *LocalQueueFairSharingStatusApplyConfiguration {
+	return &LocalQueueFairSharingStatusApplyConfiguration{}
+}
+
+// WithWeightedShare sets the WeightedShare 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 WeightedShare field is set to the value of the last call.
+func (b *LocalQueueFairSharingStatusApplyConfiguration) WithWeightedShare(value int64) *LocalQueueFairSharingStatusApplyConfiguration {
+	b.WeightedShare = &value
+	return b
+}
+
+// WithAdmissionFairSharingStatus sets the AdmissionFairSharingStatus 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 AdmissionFairSharingStatus field is set to the value of the last call.
+func (b *LocalQueueFairSharingStatusApplyConfiguration) WithAdmissionFairSharingStatus(value *LocalQueueAdmissionFairSharingStatusApplyConfiguration) *LocalQueueFairSharingStatusApplyConfiguration {
+	b.AdmissionFairSharingStatus = value
+	return b
+}
diff --git a/client-go/applyconfiguration/kueue/v1beta2/localqueuestatus.go b/client-go/applyconfiguration/kueue/v1beta2/localqueuestatus.go
index 988cf8655..834e54c06 100644
--- a/client-go/applyconfiguration/kueue/v1beta2/localqueuestatus.go
+++ b/client-go/applyconfiguration/kueue/v1beta2/localqueuestatus.go
@@ -24,13 +24,13 @@ import (
 // LocalQueueStatusApplyConfiguration represents a declarative configuration of the LocalQueueStatus type for use
 // with apply.
 type LocalQueueStatusApplyConfiguration struct {
-	Conditions         []v1.ConditionApplyConfiguration          `json:"conditions,omitempty"`
-	PendingWorkloads   *int32                                    `json:"pendingWorkloads,omitempty"`
-	ReservingWorkloads *int32                                    `json:"reservingWorkloads,omitempty"`
-	AdmittedWorkloads  *int32                                    `json:"admittedWorkloads,omitempty"`
-	FlavorsReservation []LocalQueueFlavorUsageApplyConfiguration `json:"flavorsReservation,omitempty"`
-	FlavorsUsage       []LocalQueueFlavorUsageApplyConfiguration `json:"flavorsUsage,omitempty"`
-	FairSharing        *FairSharingStatusApplyConfiguration      `json:"fairSharing,omitempty"`
+	Conditions         []v1.ConditionApplyConfiguration               `json:"conditions,omitempty"`
+	PendingWorkloads   *int32                                         `json:"pendingWorkloads,omitempty"`
+	ReservingWorkloads *int32                                         `json:"reservingWorkloads,omitempty"`
+	AdmittedWorkloads  *int32                                         `json:"admittedWorkloads,omitempty"`
+	FlavorsReservation []LocalQueueFlavorUsageApplyConfiguration      `json:"flavorsReservation,omitempty"`
+	FlavorsUsage       []LocalQueueFlavorUsageApplyConfiguration      `json:"flavorsUsage,omitempty"`
+	FairSharing        *LocalQueueFairSharingStatusApplyConfiguration `json:"fairSharing,omitempty"`
 }
 
 // LocalQueueStatusApplyConfiguration constructs a declarative configuration of the LocalQueueStatus type for use with
@@ -105,7 +105,7 @@ func (b *LocalQueueStatusApplyConfiguration) WithFlavorsUsage(values ...*LocalQu
 // 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 *LocalQueueStatusApplyConfiguration) WithFairSharing(value *FairSharingStatusApplyConfiguration) *LocalQueueStatusApplyConfiguration {
+func (b *LocalQueueStatusApplyConfiguration) WithFairSharing(value *LocalQueueFairSharingStatusApplyConfiguration) *LocalQueueStatusApplyConfiguration {
 	b.FairSharing = value
 	return b
 }
diff --git a/client-go/applyconfiguration/kueue/v1beta2/multikueueclusterspec.go b/client-go/applyconfiguration/kueue/v1beta2/multikueueclusterspec.go
index 08e8d6eaf..8b0ecf473 100644
--- a/client-go/applyconfiguration/kueue/v1beta2/multikueueclusterspec.go
+++ b/client-go/applyconfiguration/kueue/v1beta2/multikueueclusterspec.go
@@ -20,8 +20,7 @@ package v1beta2
 // MultiKueueClusterSpecApplyConfiguration represents a declarative configuration of the MultiKueueClusterSpec type for use
 // with apply.
 type MultiKueueClusterSpecApplyConfiguration struct {
-	KubeConfig     *KubeConfigApplyConfiguration              `json:"kubeConfig,omitempty"`
-	ClusterProfile *ClusterProfileReferenceApplyConfiguration `json:"clusterProfile,omitempty"`
+	ClusterSource *ClusterSourceApplyConfiguration `json:"clusterSource,omitempty"`
 }
 
 // MultiKueueClusterSpecApplyConfiguration constructs a declarative configuration of the MultiKueueClusterSpec type for use with
@@ -30,18 +29,10 @@ func MultiKueueClusterSpec() *MultiKueueClusterSpecApplyConfiguration {
 	return &MultiKueueClusterSpecApplyConfiguration{}
 }
 
-// WithKubeConfig sets the KubeConfig field in the declarative configuration to the given value
+// WithClusterSource sets the ClusterSource 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 KubeConfig field is set to the value of the last call.
-func (b *MultiKueueClusterSpecApplyConfiguration) WithKubeConfig(value *KubeConfigApplyConfiguration) *MultiKueueClusterSpecApplyConfiguration {
-	b.KubeConfig = value
-	return b
-}
-
-// WithClusterProfile sets the ClusterProfile 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 ClusterProfile field is set to the value of the last call.
-func (b *MultiKueueClusterSpecApplyConfiguration) WithClusterProfile(value *ClusterProfileReferenceApplyConfiguration) *MultiKueueClusterSpecApplyConfiguration {
-	b.ClusterProfile = value
+// If called multiple times, the ClusterSource field is set to the value of the last call.
+func (b *MultiKueueClusterSpecApplyConfiguration) WithClusterSource(value *ClusterSourceApplyConfiguration) *MultiKueueClusterSpecApplyConfiguration {
+	b.ClusterSource = value
 	return b
 }
diff --git a/client-go/applyconfiguration/utils.go b/client-go/applyconfiguration/utils.go
index d774f9ae1..b8a8257dc 100644
--- a/client-go/applyconfiguration/utils.go
+++ b/client-go/applyconfiguration/utils.go
@@ -189,8 +189,6 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
 		return &kueuev1beta2.AdmissionCheckStatusApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("AdmissionCheckStrategyRule"):
 		return &kueuev1beta2.AdmissionCheckStrategyRuleApplyConfiguration{}
-	case v1beta2.SchemeGroupVersion.WithKind("AdmissionFairSharingStatus"):
-		return &kueuev1beta2.AdmissionFairSharingStatusApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("AdmissionScope"):
 		return &kueuev1beta2.AdmissionScopeApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("BorrowWithinCohort"):
@@ -205,6 +203,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
 		return &kueuev1beta2.ClusterQueueSpecApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("ClusterQueueStatus"):
 		return &kueuev1beta2.ClusterQueueStatusApplyConfiguration{}
+	case v1beta2.SchemeGroupVersion.WithKind("ClusterSource"):
+		return &kueuev1beta2.ClusterSourceApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("Cohort"):
 		return &kueuev1beta2.CohortApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("CohortSpec"):
@@ -225,6 +225,10 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
 		return &kueuev1beta2.KubeConfigApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("LocalQueue"):
 		return &kueuev1beta2.LocalQueueApplyConfiguration{}
+	case v1beta2.SchemeGroupVersion.WithKind("LocalQueueAdmissionFairSharingStatus"):
+		return &kueuev1beta2.LocalQueueAdmissionFairSharingStatusApplyConfiguration{}
+	case v1beta2.SchemeGroupVersion.WithKind("LocalQueueFairSharingStatus"):
+		return &kueuev1beta2.LocalQueueFairSharingStatusApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("LocalQueueFlavorUsage"):
 		return &kueuev1beta2.LocalQueueFlavorUsageApplyConfiguration{}
 	case v1beta2.SchemeGroupVersion.WithKind("LocalQueueResourceUsage"):
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta1/cohort.go b/client-go/clientset/versioned/typed/kueue/v1beta1/cohort.go
index 9fe9b552a..e33925307 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta1/cohort.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/cohort.go
@@ -32,7 +32,7 @@ import (
 // CohortsGetter has a method to return a CohortInterface.
 // A group's client should implement this interface.
 type CohortsGetter interface {
-	Cohorts(namespace string) CohortInterface
+	Cohorts() CohortInterface
 }
 
 // CohortInterface has methods to work with Cohort resources.
@@ -59,13 +59,13 @@ type cohorts struct {
 }
 
 // newCohorts returns a Cohorts
-func newCohorts(c *KueueV1beta1Client, namespace string) *cohorts {
+func newCohorts(c *KueueV1beta1Client) *cohorts {
 	return &cohorts{
 		gentype.NewClientWithListAndApply[*kueuev1beta1.Cohort, *kueuev1beta1.CohortList, *applyconfigurationkueuev1beta1.CohortApplyConfiguration](
 			"cohorts",
 			c.RESTClient(),
 			scheme.ParameterCodec,
-			namespace,
+			"",
 			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
index 8dfc0962c..553df18b1 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_cohort.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/fake/fake_cohort.go
@@ -30,11 +30,11 @@ type fakeCohorts struct {
 	Fake *FakeKueueV1beta1
 }
 
-func newFakeCohorts(fake *FakeKueueV1beta1, namespace string) typedkueuev1beta1.CohortInterface {
+func newFakeCohorts(fake *FakeKueueV1beta1) 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{} },
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 dd159b6f0..3f451ccce 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,8 +35,8 @@ func (c *FakeKueueV1beta1) ClusterQueues() v1beta1.ClusterQueueInterface {
 	return newFakeClusterQueues(c)
 }
 
-func (c *FakeKueueV1beta1) Cohorts(namespace string) v1beta1.CohortInterface {
-	return newFakeCohorts(c, namespace)
+func (c *FakeKueueV1beta1) Cohorts() v1beta1.CohortInterface {
+	return newFakeCohorts(c)
 }
 
 func (c *FakeKueueV1beta1) LocalQueues(namespace string) v1beta1.LocalQueueInterface {
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 a8653da25..3725740bc 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta1/kueue_client.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta1/kueue_client.go
@@ -53,8 +53,8 @@ func (c *KueueV1beta1Client) ClusterQueues() ClusterQueueInterface {
 	return newClusterQueues(c)
 }
 
-func (c *KueueV1beta1Client) Cohorts(namespace string) CohortInterface {
-	return newCohorts(c, namespace)
+func (c *KueueV1beta1Client) Cohorts() CohortInterface {
+	return newCohorts(c)
 }
 
 func (c *KueueV1beta1Client) LocalQueues(namespace string) LocalQueueInterface {
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta2/cohort.go b/client-go/clientset/versioned/typed/kueue/v1beta2/cohort.go
index 51a7dba8b..5fb658d3c 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta2/cohort.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta2/cohort.go
@@ -32,7 +32,7 @@ import (
 // CohortsGetter has a method to return a CohortInterface.
 // A group's client should implement this interface.
 type CohortsGetter interface {
-	Cohorts(namespace string) CohortInterface
+	Cohorts() CohortInterface
 }
 
 // CohortInterface has methods to work with Cohort resources.
@@ -59,13 +59,13 @@ type cohorts struct {
 }
 
 // newCohorts returns a Cohorts
-func newCohorts(c *KueueV1beta2Client, namespace string) *cohorts {
+func newCohorts(c *KueueV1beta2Client) *cohorts {
 	return &cohorts{
 		gentype.NewClientWithListAndApply[*kueuev1beta2.Cohort, *kueuev1beta2.CohortList, *applyconfigurationkueuev1beta2.CohortApplyConfiguration](
 			"cohorts",
 			c.RESTClient(),
 			scheme.ParameterCodec,
-			namespace,
+			"",
 			func() *kueuev1beta2.Cohort { return &kueuev1beta2.Cohort{} },
 			func() *kueuev1beta2.CohortList { return &kueuev1beta2.CohortList{} },
 		),
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta2/fake/fake_cohort.go b/client-go/clientset/versioned/typed/kueue/v1beta2/fake/fake_cohort.go
index d7dbd736b..5235a57c4 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta2/fake/fake_cohort.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta2/fake/fake_cohort.go
@@ -30,11 +30,11 @@ type fakeCohorts struct {
 	Fake *FakeKueueV1beta2
 }
 
-func newFakeCohorts(fake *FakeKueueV1beta2, namespace string) typedkueuev1beta2.CohortInterface {
+func newFakeCohorts(fake *FakeKueueV1beta2) typedkueuev1beta2.CohortInterface {
 	return &fakeCohorts{
 		gentype.NewFakeClientWithListAndApply[*v1beta2.Cohort, *v1beta2.CohortList, *kueuev1beta2.CohortApplyConfiguration](
 			fake.Fake,
-			namespace,
+			"",
 			v1beta2.SchemeGroupVersion.WithResource("cohorts"),
 			v1beta2.SchemeGroupVersion.WithKind("Cohort"),
 			func() *v1beta2.Cohort { return &v1beta2.Cohort{} },
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta2/fake/fake_kueue_client.go b/client-go/clientset/versioned/typed/kueue/v1beta2/fake/fake_kueue_client.go
index fb3cf79ba..91d096a13 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta2/fake/fake_kueue_client.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta2/fake/fake_kueue_client.go
@@ -35,8 +35,8 @@ func (c *FakeKueueV1beta2) ClusterQueues() v1beta2.ClusterQueueInterface {
 	return newFakeClusterQueues(c)
 }
 
-func (c *FakeKueueV1beta2) Cohorts(namespace string) v1beta2.CohortInterface {
-	return newFakeCohorts(c, namespace)
+func (c *FakeKueueV1beta2) Cohorts() v1beta2.CohortInterface {
+	return newFakeCohorts(c)
 }
 
 func (c *FakeKueueV1beta2) LocalQueues(namespace string) v1beta2.LocalQueueInterface {
diff --git a/client-go/clientset/versioned/typed/kueue/v1beta2/kueue_client.go b/client-go/clientset/versioned/typed/kueue/v1beta2/kueue_client.go
index ffa61483f..4ad4b6d50 100644
--- a/client-go/clientset/versioned/typed/kueue/v1beta2/kueue_client.go
+++ b/client-go/clientset/versioned/typed/kueue/v1beta2/kueue_client.go
@@ -53,8 +53,8 @@ func (c *KueueV1beta2Client) ClusterQueues() ClusterQueueInterface {
 	return newClusterQueues(c)
 }
 
-func (c *KueueV1beta2Client) Cohorts(namespace string) CohortInterface {
-	return newCohorts(c, namespace)
+func (c *KueueV1beta2Client) Cohorts() CohortInterface {
+	return newCohorts(c)
 }
 
 func (c *KueueV1beta2Client) LocalQueues(namespace string) LocalQueueInterface {
diff --git a/client-go/informers/externalversions/kueue/v1beta1/cohort.go b/client-go/informers/externalversions/kueue/v1beta1/cohort.go
index cdc36fb12..205eb53c3 100644
--- a/client-go/informers/externalversions/kueue/v1beta1/cohort.go
+++ b/client-go/informers/externalversions/kueue/v1beta1/cohort.go
@@ -41,45 +41,44 @@ type CohortInformer interface {
 type cohortInformer struct {
 	factory          internalinterfaces.SharedInformerFactory
 	tweakListOptions internalinterfaces.TweakListOptionsFunc
-	namespace        string
 }
 
 // NewCohortInformer constructs a new informer for Cohort type.
 // Always prefer using an informer factory to get a shared informer instead of getting an independent
 // one. This reduces memory footprint and number of connections to the server.
-func NewCohortInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
-	return NewFilteredCohortInformer(client, namespace, resyncPeriod, indexers, nil)
+func NewCohortInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredCohortInformer(client, resyncPeriod, indexers, nil)
 }
 
 // NewFilteredCohortInformer constructs a new informer for Cohort type.
 // Always prefer using an informer factory to get a shared informer instead of getting an independent
 // one. This reduces memory footprint and number of connections to the server.
-func NewFilteredCohortInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+func NewFilteredCohortInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
 	return cache.NewSharedIndexInformer(
 		&cache.ListWatch{
 			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1beta1().Cohorts(namespace).List(context.Background(), options)
+				return client.KueueV1beta1().Cohorts().List(context.Background(), options)
 			},
 			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1beta1().Cohorts(namespace).Watch(context.Background(), options)
+				return client.KueueV1beta1().Cohorts().Watch(context.Background(), options)
 			},
 			ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1beta1().Cohorts(namespace).List(ctx, options)
+				return client.KueueV1beta1().Cohorts().List(ctx, options)
 			},
 			WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1beta1().Cohorts(namespace).Watch(ctx, options)
+				return client.KueueV1beta1().Cohorts().Watch(ctx, options)
 			},
 		},
 		&apiskueuev1beta1.Cohort{},
@@ -89,7 +88,7 @@ func NewFilteredCohortInformer(client versioned.Interface, namespace string, res
 }
 
 func (f *cohortInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
-	return NewFilteredCohortInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+	return NewFilteredCohortInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
 }
 
 func (f *cohortInformer) Informer() cache.SharedIndexInformer {
diff --git a/client-go/informers/externalversions/kueue/v1beta1/interface.go b/client-go/informers/externalversions/kueue/v1beta1/interface.go
index e0882502d..1e4f4f374 100644
--- a/client-go/informers/externalversions/kueue/v1beta1/interface.go
+++ b/client-go/informers/externalversions/kueue/v1beta1/interface.go
@@ -70,7 +70,7 @@ func (v *version) ClusterQueues() ClusterQueueInformer {
 
 // Cohorts returns a CohortInformer.
 func (v *version) Cohorts() CohortInformer {
-	return &cohortInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+	return &cohortInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
 }
 
 // LocalQueues returns a LocalQueueInformer.
diff --git a/client-go/informers/externalversions/kueue/v1beta2/cohort.go b/client-go/informers/externalversions/kueue/v1beta2/cohort.go
index 60c5fcc98..785d95959 100644
--- a/client-go/informers/externalversions/kueue/v1beta2/cohort.go
+++ b/client-go/informers/externalversions/kueue/v1beta2/cohort.go
@@ -41,45 +41,44 @@ type CohortInformer interface {
 type cohortInformer struct {
 	factory          internalinterfaces.SharedInformerFactory
 	tweakListOptions internalinterfaces.TweakListOptionsFunc
-	namespace        string
 }
 
 // NewCohortInformer constructs a new informer for Cohort type.
 // Always prefer using an informer factory to get a shared informer instead of getting an independent
 // one. This reduces memory footprint and number of connections to the server.
-func NewCohortInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
-	return NewFilteredCohortInformer(client, namespace, resyncPeriod, indexers, nil)
+func NewCohortInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredCohortInformer(client, resyncPeriod, indexers, nil)
 }
 
 // NewFilteredCohortInformer constructs a new informer for Cohort type.
 // Always prefer using an informer factory to get a shared informer instead of getting an independent
 // one. This reduces memory footprint and number of connections to the server.
-func NewFilteredCohortInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+func NewFilteredCohortInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
 	return cache.NewSharedIndexInformer(
 		&cache.ListWatch{
 			ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1beta2().Cohorts(namespace).List(context.Background(), options)
+				return client.KueueV1beta2().Cohorts().List(context.Background(), options)
 			},
 			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1beta2().Cohorts(namespace).Watch(context.Background(), options)
+				return client.KueueV1beta2().Cohorts().Watch(context.Background(), options)
 			},
 			ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1beta2().Cohorts(namespace).List(ctx, options)
+				return client.KueueV1beta2().Cohorts().List(ctx, options)
 			},
 			WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
 				if tweakListOptions != nil {
 					tweakListOptions(&options)
 				}
-				return client.KueueV1beta2().Cohorts(namespace).Watch(ctx, options)
+				return client.KueueV1beta2().Cohorts().Watch(ctx, options)
 			},
 		},
 		&apiskueuev1beta2.Cohort{},
@@ -89,7 +88,7 @@ func NewFilteredCohortInformer(client versioned.Interface, namespace string, res
 }
 
 func (f *cohortInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
-	return NewFilteredCohortInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+	return NewFilteredCohortInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
 }
 
 func (f *cohortInformer) Informer() cache.SharedIndexInformer {
diff --git a/client-go/informers/externalversions/kueue/v1beta2/interface.go b/client-go/informers/externalversions/kueue/v1beta2/interface.go
index 7c431b5eb..dc4ed828e 100644
--- a/client-go/informers/externalversions/kueue/v1beta2/interface.go
+++ b/client-go/informers/externalversions/kueue/v1beta2/interface.go
@@ -70,7 +70,7 @@ func (v *version) ClusterQueues() ClusterQueueInformer {
 
 // Cohorts returns a CohortInformer.
 func (v *version) Cohorts() CohortInformer {
-	return &cohortInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+	return &cohortInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
 }
 
 // LocalQueues returns a LocalQueueInformer.
diff --git a/client-go/listers/kueue/v1beta1/cohort.go b/client-go/listers/kueue/v1beta1/cohort.go
index 6a496f6c9..0c1e85cad 100644
--- a/client-go/listers/kueue/v1beta1/cohort.go
+++ b/client-go/listers/kueue/v1beta1/cohort.go
@@ -30,8 +30,9 @@ type CohortLister interface {
 	// List lists all Cohorts in the indexer.
 	// Objects returned here must be treated as read-only.
 	List(selector labels.Selector) (ret []*kueuev1beta1.Cohort, err error)
-	// Cohorts returns an object that can list and get Cohorts.
-	Cohorts(namespace string) CohortNamespaceLister
+	// Get retrieves the Cohort from the index for a given name.
+	// Objects returned here must be treated as read-only.
+	Get(name string) (*kueuev1beta1.Cohort, error)
 	CohortListerExpansion
 }
 
@@ -44,26 +45,3 @@ type cohortLister struct {
 func NewCohortLister(indexer cache.Indexer) CohortLister {
 	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[*kueuev1beta1.Cohort](s.ResourceIndexer, namespace)}
-}
-
-// CohortNamespaceLister helps list and get Cohorts.
-// All objects returned here must be treated as read-only.
-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 []*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) (*kueuev1beta1.Cohort, error)
-	CohortNamespaceListerExpansion
-}
-
-// cohortNamespaceLister implements the CohortNamespaceLister
-// interface.
-type cohortNamespaceLister struct {
-	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 357b54ed7..c1a01bcb9 100644
--- a/client-go/listers/kueue/v1beta1/expansion_generated.go
+++ b/client-go/listers/kueue/v1beta1/expansion_generated.go
@@ -29,10 +29,6 @@ type ClusterQueueListerExpansion interface{}
 // 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/client-go/listers/kueue/v1beta2/cohort.go b/client-go/listers/kueue/v1beta2/cohort.go
index ebb56aeb6..73841e788 100644
--- a/client-go/listers/kueue/v1beta2/cohort.go
+++ b/client-go/listers/kueue/v1beta2/cohort.go
@@ -30,8 +30,9 @@ type CohortLister interface {
 	// List lists all Cohorts in the indexer.
 	// Objects returned here must be treated as read-only.
 	List(selector labels.Selector) (ret []*kueuev1beta2.Cohort, err error)
-	// Cohorts returns an object that can list and get Cohorts.
-	Cohorts(namespace string) CohortNamespaceLister
+	// Get retrieves the Cohort from the index for a given name.
+	// Objects returned here must be treated as read-only.
+	Get(name string) (*kueuev1beta2.Cohort, error)
 	CohortListerExpansion
 }
 
@@ -44,26 +45,3 @@ type cohortLister struct {
 func NewCohortLister(indexer cache.Indexer) CohortLister {
 	return &cohortLister{listers.New[*kueuev1beta2.Cohort](indexer, kueuev1beta2.Resource("cohort"))}
 }
-
-// Cohorts returns an object that can list and get Cohorts.
-func (s *cohortLister) Cohorts(namespace string) CohortNamespaceLister {
-	return cohortNamespaceLister{listers.NewNamespaced[*kueuev1beta2.Cohort](s.ResourceIndexer, namespace)}
-}
-
-// CohortNamespaceLister helps list and get Cohorts.
-// All objects returned here must be treated as read-only.
-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 []*kueuev1beta2.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) (*kueuev1beta2.Cohort, error)
-	CohortNamespaceListerExpansion
-}
-
-// cohortNamespaceLister implements the CohortNamespaceLister
-// interface.
-type cohortNamespaceLister struct {
-	listers.ResourceIndexer[*kueuev1beta2.Cohort]
-}
diff --git a/client-go/listers/kueue/v1beta2/expansion_generated.go b/client-go/listers/kueue/v1beta2/expansion_generated.go
index 8d0039064..0ef35d4ea 100644
--- a/client-go/listers/kueue/v1beta2/expansion_generated.go
+++ b/client-go/listers/kueue/v1beta2/expansion_generated.go
@@ -29,10 +29,6 @@ type ClusterQueueListerExpansion interface{}
 // 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/cmd/experimental/README.md b/cmd/experimental/README.md
index e8cdd0b74..ac72226ff 100644
--- a/cmd/experimental/README.md
+++ b/cmd/experimental/README.md
@@ -11,7 +11,7 @@ where they will be maintained long term.
 
 ### Existing integrations
 
-- `kueue-prepopulator`
+- `kueue-populator`
 
 ### Adding new integrations
 
diff --git a/cmd/experimental/kueue-prepopulator/Dockerfile b/cmd/experimental/kueue-populator/Dockerfile
similarity index 100%
rename from cmd/experimental/kueue-prepopulator/Dockerfile
rename to cmd/experimental/kueue-populator/Dockerfile
diff --git a/cmd/experimental/kueue-prepopulator/Makefile b/cmd/experimental/kueue-populator/Makefile
similarity index 93%
rename from cmd/experimental/kueue-prepopulator/Makefile
rename to cmd/experimental/kueue-populator/Makefile
index 4262dc9e7..dd5dac9d4 100644
--- a/cmd/experimental/kueue-prepopulator/Makefile
+++ b/cmd/experimental/kueue-populator/Makefile
@@ -16,7 +16,7 @@ DOCKER_BUILDX_CMD ?= docker buildx
 IMAGE_BUILD_CMD ?= $(DOCKER_BUILDX_CMD) build
 
 IMAGE_REGISTRY ?= us-central1-docker.pkg.dev/k8s-staging-images/kueue
-IMAGE_NAME := kueue-prepopulator
+IMAGE_NAME := kueue-populator
 IMAGE_REPO := $(IMAGE_REGISTRY)/$(IMAGE_NAME)
 IMAGE_TAG := $(IMAGE_REPO):$(GIT_TAG)
 
@@ -74,7 +74,7 @@ CONTROLLER_GEN := $(BIN_DIR)/controller-gen
 
 .PHONY: manifests
 manifests:
-	$(CONTROLLER_GEN) rbac:roleName=kueue-prepopulator-role output:rbac:artifacts:config=config/rbac paths="./pkg/controller/..."
+	$(CONTROLLER_GEN) rbac:roleName=kueue-populator-role output:rbac:artifacts:config=config/rbac paths="./pkg/controller/..."
 
 .PHONY: test-integration
 test-integration:
diff --git a/cmd/experimental/kueue-prepopulator/OWNERS b/cmd/experimental/kueue-populator/OWNERS
similarity index 100%
rename from cmd/experimental/kueue-prepopulator/OWNERS
rename to cmd/experimental/kueue-populator/OWNERS
diff --git a/cmd/experimental/kueue-prepopulator/README.md b/cmd/experimental/kueue-populator/README.md
similarity index 65%
rename from cmd/experimental/kueue-prepopulator/README.md
rename to cmd/experimental/kueue-populator/README.md
index bff0573c2..57e3f01a8 100644
--- a/cmd/experimental/kueue-prepopulator/README.md
+++ b/cmd/experimental/kueue-populator/README.md
@@ -1,6 +1,6 @@
-# Kueue Prepopulator
+# Kueue Populator
 
-The `kueue-prepopulator` is an experimental controller that automatically creates a `LocalQueue` in namespaces that match a `ClusterQueue`'s `namespaceSelector`. This simplifies the setup for users who want to automatically provision `LocalQueue`s without manual intervention.
+The `kueue-populator` is an experimental controller that automatically creates a `LocalQueue` in namespaces that match a `ClusterQueue`'s `namespaceSelector`. This simplifies the setup for users who want to automatically provision `LocalQueue`s without manual intervention.
 
 ## Purpose
 
@@ -8,13 +8,13 @@ This component demonstrates how to extend Kueue's functionality with custom cont
 
 ## Build
 
-To build the `kueue-prepopulator` binary:
+To build the `kueue-populator` binary:
 
 ```bash
 make build
 ```
 
-This will create the executable `bin/manager` in the current directory (`cmd/experimental/kueue-prepopulator/bin`).
+This will create the executable `bin/manager` in the current directory (`cmd/experimental/kueue-populator/bin`).
 
 To build the container image:
 
@@ -22,13 +22,13 @@ To build the container image:
 make image-build
 ```
 
-The image will be tagged as `us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-prepopulator:$(GIT_TAG)`.
+The image will be tagged as `us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-populator:$(GIT_TAG)`.
 
 ## Deploy
 
-The `kueue-prepopulator` can be deployed to a Kubernetes cluster using the Kustomize manifests located in the `config/` directory.
+The `kueue-populator` can be deployed to a Kubernetes cluster using the Kustomize manifests located in the `config/` directory.
 
-1.  **Ensure Kueue is installed:** The `kueue-prepopulator` relies on Kueue CRDs and assumes a Kueue installation is present in the cluster.
+1.  **Ensure Kueue is installed:** The `kueue-populator` relies on Kueue CRDs and assumes a Kueue installation is present in the cluster.
 2.  **Apply manifests (to an existing cluster):**
 
     ```bash
@@ -37,7 +37,7 @@ The `kueue-prepopulator` can be deployed to a Kubernetes cluster using the Kusto
 
 ### Deploying to Kind with a Local Image
 
-To deploy the `kueue-prepopulator` using a locally built image into a Kind cluster:
+To deploy the `kueue-populator` using a locally built image into a Kind cluster:
 
 1.  **Build and Load Image:** Ensure you have built the image for your local environment:
 
@@ -54,7 +54,7 @@ To deploy the `kueue-prepopulator` using a locally built image into a Kind clust
     ```
     
 ## Configuration
-The `kueue-prepopulator` supports the following command-line flags:
+The `kueue-populator` supports the following command-line flags:
 
 *   `--local-queue-name`: The name of the `LocalQueue` to create by default in selected namespaces. Defaults to `"default"`.
 *   `--zap-log-level`: Sets the logging verbosity level for the Zap logger (e.g., `info`, `debug`, `error`).
@@ -70,7 +70,7 @@ To set these flags, modify the `args` list in the `Deployment` manifest (`config
 
 ## Testing
 
-The `kueue-prepopulator` project includes unit, integration, and end-to-end (e2e) tests to ensure its functionality and reliability.
+The `kueue-populator` project includes unit, integration, and end-to-end (e2e) tests to ensure its functionality and reliability.
 
 ### Unit Tests
 
diff --git a/cmd/experimental/kueue-prepopulator/config/kustomization.yaml b/cmd/experimental/kueue-populator/config/kustomization.yaml
similarity index 92%
rename from cmd/experimental/kueue-prepopulator/config/kustomization.yaml
rename to cmd/experimental/kueue-populator/config/kustomization.yaml
index 3ad65351a..fd5c15ba9 100644
--- a/cmd/experimental/kueue-prepopulator/config/kustomization.yaml
+++ b/cmd/experimental/kueue-populator/config/kustomization.yaml
@@ -9,7 +9,7 @@ resources:
 - manager/controller_config_map.yaml
 
 images:
-- name: us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-prepopulator
-  newName: us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-prepopulator
+- name: us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-populator
+  newName: us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-populator
   newTag: main
 namespace: kueue-system
diff --git a/cmd/experimental/kueue-prepopulator/config/manager/controller_config_map.yaml b/cmd/experimental/kueue-populator/config/manager/controller_config_map.yaml
similarity index 86%
rename from cmd/experimental/kueue-prepopulator/config/manager/controller_config_map.yaml
rename to cmd/experimental/kueue-populator/config/manager/controller_config_map.yaml
index 9d995b6da..8335c5ae8 100644
--- a/cmd/experimental/kueue-prepopulator/config/manager/controller_config_map.yaml
+++ b/cmd/experimental/kueue-populator/config/manager/controller_config_map.yaml
@@ -1,7 +1,7 @@
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: kueue-prepopulator-config
+  name: kueue-populator-config
   namespace: kueue-system
 data:
   controller_manager_config.yaml: |
diff --git a/cmd/experimental/kueue-prepopulator/config/manager/manager.yaml b/cmd/experimental/kueue-populator/config/manager/manager.yaml
similarity index 85%
rename from cmd/experimental/kueue-prepopulator/config/manager/manager.yaml
rename to cmd/experimental/kueue-populator/config/manager/manager.yaml
index b21ae4dca..ad7a3a5ee 100644
--- a/cmd/experimental/kueue-prepopulator/config/manager/manager.yaml
+++ b/cmd/experimental/kueue-populator/config/manager/manager.yaml
@@ -1,16 +1,16 @@
 apiVersion: apps/v1
 kind: Deployment
 metadata:
-  name: kueue-prepopulator
+  name: kueue-populator
 spec:
   replicas: 1
   selector:
     matchLabels:
-      control-plane: kueue-prepopulator
+      control-plane: kueue-populator
   template:
     metadata:
       labels:
-        control-plane: kueue-prepopulator
+        control-plane: kueue-populator
     spec:
       securityContext:
         runAsNonRoot: true
@@ -21,7 +21,7 @@ spec:
         - "--config=/etc/kueue/controller_manager_config.yaml"
         - "--zap-log-level=2"
         imagePullPolicy: IfNotPresent
-        image: us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-prepopulator:latest
+        image: us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-populator:latest
         name: manager
         securityContext:
           allowPrivilegeEscalation: false
@@ -51,9 +51,9 @@ spec:
         volumeMounts:
         - mountPath: /etc/kueue
           name: manager-config
-      serviceAccountName: kueue-prepopulator
+      serviceAccountName: kueue-populator
       terminationGracePeriodSeconds: 10
       volumes:
       - configMap:
-          name: kueue-prepopulator-config
+          name: kueue-populator-config
         name: manager-config
diff --git a/cmd/experimental/kueue-prepopulator/config/rbac/role.yaml b/cmd/experimental/kueue-populator/config/rbac/role.yaml
similarity index 93%
rename from cmd/experimental/kueue-prepopulator/config/rbac/role.yaml
rename to cmd/experimental/kueue-populator/config/rbac/role.yaml
index d2d77a820..5bd0cfe02 100644
--- a/cmd/experimental/kueue-prepopulator/config/rbac/role.yaml
+++ b/cmd/experimental/kueue-populator/config/rbac/role.yaml
@@ -2,7 +2,7 @@
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
 metadata:
-  name: kueue-prepopulator-role
+  name: kueue-populator-role
 rules:
 - apiGroups:
   - ""
diff --git a/cmd/experimental/kueue-prepopulator/config/rbac/role_binding.yaml b/cmd/experimental/kueue-populator/config/rbac/role_binding.yaml
similarity index 67%
rename from cmd/experimental/kueue-prepopulator/config/rbac/role_binding.yaml
rename to cmd/experimental/kueue-populator/config/rbac/role_binding.yaml
index f109a2b95..ae9c3b6ea 100644
--- a/cmd/experimental/kueue-prepopulator/config/rbac/role_binding.yaml
+++ b/cmd/experimental/kueue-populator/config/rbac/role_binding.yaml
@@ -1,12 +1,12 @@
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
-  name: kueue-prepopulator-role-binding
+  name: kueue-populator-role-binding
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
-  name: kueue-prepopulator-role
+  name: kueue-populator-role
 subjects:
 - kind: ServiceAccount
-  name: kueue-prepopulator
+  name: kueue-populator
   namespace: kueue-system
diff --git a/cmd/experimental/kueue-prepopulator/config/rbac/service_account.yaml b/cmd/experimental/kueue-populator/config/rbac/service_account.yaml
similarity index 63%
rename from cmd/experimental/kueue-prepopulator/config/rbac/service_account.yaml
rename to cmd/experimental/kueue-populator/config/rbac/service_account.yaml
index caff79bdb..26911d14e 100644
--- a/cmd/experimental/kueue-prepopulator/config/rbac/service_account.yaml
+++ b/cmd/experimental/kueue-populator/config/rbac/service_account.yaml
@@ -1,4 +1,4 @@
 apiVersion: v1
 kind: ServiceAccount
 metadata:
-  name: kueue-prepopulator
+  name: kueue-populator
diff --git a/cmd/experimental/kueue-prepopulator/go.mod b/cmd/experimental/kueue-populator/go.mod
similarity index 98%
rename from cmd/experimental/kueue-prepopulator/go.mod
rename to cmd/experimental/kueue-populator/go.mod
index b6868131c..3195522b0 100644
--- a/cmd/experimental/kueue-prepopulator/go.mod
+++ b/cmd/experimental/kueue-populator/go.mod
@@ -1,4 +1,4 @@
-module sigs.k8s.io/kueue/cmd/experimental/kueue-prepopulator
+module sigs.k8s.io/kueue/cmd/experimental/kueue-populator
 
 go 1.25.0
 
diff --git a/cmd/experimental/kueue-prepopulator/go.sum b/cmd/experimental/kueue-populator/go.sum
similarity index 100%
rename from cmd/experimental/kueue-prepopulator/go.sum
rename to cmd/experimental/kueue-populator/go.sum
diff --git a/cmd/experimental/kueue-prepopulator/main.go b/cmd/experimental/kueue-populator/main.go
similarity index 86%
rename from cmd/experimental/kueue-prepopulator/main.go
rename to cmd/experimental/kueue-populator/main.go
index 9b548b396..c3b63a0d3 100644
--- a/cmd/experimental/kueue-prepopulator/main.go
+++ b/cmd/experimental/kueue-populator/main.go
@@ -30,8 +30,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
-	kueueprepopulatorconfig "sigs.k8s.io/kueue/cmd/experimental/kueue-prepopulator/pkg/config"
-	"sigs.k8s.io/kueue/cmd/experimental/kueue-prepopulator/pkg/controller"
+	kueuepopulatorconfig "sigs.k8s.io/kueue/cmd/experimental/kueue-populator/pkg/config"
+	"sigs.k8s.io/kueue/cmd/experimental/kueue-populator/pkg/controller"
 )
 
 var (
@@ -64,7 +64,7 @@ func main() {
 func start(configFile string) error {
 	log := ctrl.Log.WithName("setup")
 
-	cfg, err := kueueprepopulatorconfig.Load(configFile)
+	cfg, err := kueuepopulatorconfig.Load(configFile)
 	if err != nil {
 		log.Error(err, "Unable to load the configuration")
 		return err
@@ -79,7 +79,7 @@ func start(configFile string) error {
 		return err
 	}
 
-	reconcilerOpts := []controller.KueuePrepopulatorReconcilerOption{
+	reconcilerOpts := []controller.KueuePopulatorReconcilerOption{
 		controller.WithLocalQueueName(cfg.LocalQueueName),
 	}
 	if cfg.ManagedJobsNamespaceSelector != nil {
@@ -91,12 +91,12 @@ func start(configFile string) error {
 		reconcilerOpts = append(reconcilerOpts, controller.WithNamespaceSelector(selector))
 	}
 
-	if err = controller.NewKueuePrepopulatorReconciler(
+	if err = controller.NewKueuePopulatorReconciler(
 		mgr.GetClient(),
-		mgr.GetEventRecorderFor("kueue-prepopulator"),
+		mgr.GetEventRecorderFor("kueue-populator"),
 		reconcilerOpts...,
 	).SetupWithManager(mgr); err != nil {
-		log.Error(err, "Unable to create controller", "controller", "DefaultLocalQueue")
+		log.Error(err, "Unable to create controller", "controller", "KueuePopulator")
 		return err
 	}
 
diff --git a/cmd/experimental/kueue-prepopulator/pkg/config/config.go b/cmd/experimental/kueue-populator/pkg/config/config.go
similarity index 96%
rename from cmd/experimental/kueue-prepopulator/pkg/config/config.go
rename to cmd/experimental/kueue-populator/pkg/config/config.go
index d3fa00430..8fd7b60fc 100644
--- a/cmd/experimental/kueue-prepopulator/pkg/config/config.go
+++ b/cmd/experimental/kueue-populator/pkg/config/config.go
@@ -24,7 +24,7 @@ import (
 	"sigs.k8s.io/yaml"
 )
 
-// Configuration defines the configuration for the kueue-prepopulator controller.
+// Configuration defines the configuration for the kueue-populator controller.
 type Configuration struct {
 	// LocalQueueName is the name of the LocalQueue to create by default.
 	LocalQueueName string `json:"localQueueName,omitempty"`
diff --git a/cmd/experimental/kueue-prepopulator/pkg/constants/constants.go b/cmd/experimental/kueue-populator/pkg/constants/constants.go
similarity index 100%
rename from cmd/experimental/kueue-prepopulator/pkg/constants/constants.go
rename to cmd/experimental/kueue-populator/pkg/constants/constants.go
diff --git a/cmd/experimental/kueue-prepopulator/pkg/controller/controller.go b/cmd/experimental/kueue-populator/pkg/controller/controller.go
similarity index 77%
rename from cmd/experimental/kueue-prepopulator/pkg/controller/controller.go
rename to cmd/experimental/kueue-populator/pkg/controller/controller.go
index 24ffedc4a..b20c6c6fe 100644
--- a/cmd/experimental/kueue-prepopulator/pkg/controller/controller.go
+++ b/cmd/experimental/kueue-populator/pkg/controller/controller.go
@@ -34,12 +34,12 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
-	"sigs.k8s.io/kueue/cmd/experimental/kueue-prepopulator/pkg/constants"
+	"sigs.k8s.io/kueue/cmd/experimental/kueue-populator/pkg/constants"
 )
 
-const ControllerName = "kueue-prepopulator"
+const ControllerName = "kueue-populator"
 
-type KueuePrepopulatorReconciler struct {
+type KueuePopulatorReconciler struct {
 	client            client.Client
 	log               logr.Logger
 	recorder          record.EventRecorder
@@ -47,41 +47,41 @@ type KueuePrepopulatorReconciler struct {
 	localQueueName    string
 }
 
-var _ reconcile.Reconciler = (*KueuePrepopulatorReconciler)(nil)
+var _ reconcile.Reconciler = (*KueuePopulatorReconciler)(nil)
 
-type KueuePrepopulatorReconcilerOptions struct {
+type KueuePopulatorReconcilerOptions struct {
 	NamespaceSelector labels.Selector
 	LocalQueueName    string
 }
 
-type KueuePrepopulatorReconcilerOption func(*KueuePrepopulatorReconcilerOptions)
+type KueuePopulatorReconcilerOption func(*KueuePopulatorReconcilerOptions)
 
-func WithNamespaceSelector(s labels.Selector) KueuePrepopulatorReconcilerOption {
-	return func(o *KueuePrepopulatorReconcilerOptions) {
+func WithNamespaceSelector(s labels.Selector) KueuePopulatorReconcilerOption {
+	return func(o *KueuePopulatorReconcilerOptions) {
 		o.NamespaceSelector = s
 	}
 }
 
-func WithLocalQueueName(name string) KueuePrepopulatorReconcilerOption {
-	return func(o *KueuePrepopulatorReconcilerOptions) {
+func WithLocalQueueName(name string) KueuePopulatorReconcilerOption {
+	return func(o *KueuePopulatorReconcilerOptions) {
 		o.LocalQueueName = name
 	}
 }
 
-var defaultPrepopulatorOptions = KueuePrepopulatorReconcilerOptions{}
+var defaultPopulatorOptions = KueuePopulatorReconcilerOptions{}
 
-func NewKueuePrepopulatorReconciler(
+func NewKueuePopulatorReconciler(
 	client client.Client,
 	recorder record.EventRecorder,
-	opts ...KueuePrepopulatorReconcilerOption,
-) *KueuePrepopulatorReconciler {
-	options := defaultPrepopulatorOptions
+	opts ...KueuePopulatorReconcilerOption,
+) *KueuePopulatorReconciler {
+	options := defaultPopulatorOptions
 	for _, opt := range opts {
 		opt(&options)
 	}
-	return &KueuePrepopulatorReconciler{
+	return &KueuePopulatorReconciler{
 		client:            client,
-		log:               ctrl.Log.WithName("kueue-prepopulator-reconciler"),
+		log:               ctrl.Log.WithName("kueue-populator-reconciler"),
 		recorder:          recorder,
 		namespaceSelector: options.NamespaceSelector,
 		localQueueName:    options.LocalQueueName,
@@ -93,7 +93,7 @@ func NewKueuePrepopulatorReconciler(
 // +kubebuilder:rbac:groups=kueue.x-k8s.io,resources=clusterqueues,verbs=get;list;watch
 // +kubebuilder:rbac:groups=kueue.x-k8s.io,resources=localqueues,verbs=get;list;watch;create
 
-func (r *KueuePrepopulatorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
+func (r *KueuePopulatorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := ctrl.LoggerFrom(ctx)
 
 	var ns corev1.Namespace
@@ -149,7 +149,7 @@ func (r *KueuePrepopulatorReconciler) Reconcile(ctx context.Context, req ctrl.Re
 	return ctrl.Result{}, nil
 }
 
-func (r *KueuePrepopulatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
+func (r *KueuePopulatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
 	return builder.TypedControllerManagedBy[reconcile.Request](mgr).
 		For(&corev1.Namespace{}).
 		Watches(
@@ -159,7 +159,7 @@ func (r *KueuePrepopulatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
 		Complete(r)
 }
 
-func (r *KueuePrepopulatorReconciler) mapClusterQueueToNamespaces(ctx context.Context, cqObj client.Object) []reconcile.Request {
+func (r *KueuePopulatorReconciler) mapClusterQueueToNamespaces(ctx context.Context, cqObj client.Object) []reconcile.Request {
 	cq, ok := cqObj.(*kueue.ClusterQueue)
 	if !ok {
 		return nil
@@ -201,7 +201,7 @@ func (r *KueuePrepopulatorReconciler) mapClusterQueueToNamespaces(ctx context.Co
 	return requests
 }
 
-func (r *KueuePrepopulatorReconciler) ensureLocalQueueExists(ctx context.Context, cq *kueue.ClusterQueue, ns *corev1.Namespace) error {
+func (r *KueuePopulatorReconciler) ensureLocalQueueExists(ctx context.Context, cq *kueue.ClusterQueue, ns *corev1.Namespace) error {
 	log := ctrl.LoggerFrom(ctx)
 
 	targetLQ := types.NamespacedName{
@@ -214,13 +214,13 @@ func (r *KueuePrepopulatorReconciler) ensureLocalQueueExists(ctx context.Context
 		if lq.Spec.ClusterQueue == kueue.ClusterQueueReference(cq.Name) {
 			return nil
 		}
-		r.recorder.Eventf(cq, corev1.EventTypeWarning, "DefaultLocalQueueExists", "Skipping LocalQueue creation in namespace %s, a LocalQueue with name %s already exists", ns.Name, targetLQ.Name)
+		r.recorder.Eventf(cq, corev1.EventTypeWarning, "LocalQueueExists", "Skipping LocalQueue creation in namespace %s, a LocalQueue with name %s already exists", ns.Name, targetLQ.Name)
 		return nil
 	} else if !apierrors.IsNotFound(err) {
 		return err
 	}
 
-	log.Info("Creating default LocalQueue", "namespace", ns.Name, "localQueue", targetLQ.Name)
+	log.Info("Creating LocalQueue", "namespace", ns.Name, "localQueue", targetLQ.Name)
 
 	newLQ := &kueue.LocalQueue{
 		ObjectMeta: metav1.ObjectMeta{
diff --git a/cmd/experimental/kueue-prepopulator/run-e2e.sh b/cmd/experimental/kueue-populator/run-e2e.sh
similarity index 72%
rename from cmd/experimental/kueue-prepopulator/run-e2e.sh
rename to cmd/experimental/kueue-populator/run-e2e.sh
index 481f2ec33..cbcffc185 100755
--- a/cmd/experimental/kueue-prepopulator/run-e2e.sh
+++ b/cmd/experimental/kueue-populator/run-e2e.sh
@@ -20,7 +20,7 @@ set -o pipefail
 
 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
 REPO_ROOT=$(realpath "$SCRIPT_DIR/../../..")
-KIND_CLUSTER_NAME="kueue-prepopulator-e2e"
+KIND_CLUSTER_NAME="kueue-populator-e2e"
 GIT_TAG=$(git describe --tags --dirty --always)
 
 # Use tools from the root project
@@ -41,32 +41,26 @@ trap cleanup EXIT
 echo "Creating Kind cluster..."
 "$KIND" create cluster --name "$KIND_CLUSTER_NAME"
 
-echo "Building and loading Kueue image..."
-cd "$REPO_ROOT"
-IMAGE_TAG_KUEUE="us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue:$GIT_TAG"
-make kind-image-build
-"$KIND" load docker-image "$IMAGE_TAG_KUEUE" --name "$KIND_CLUSTER_NAME"
-
 echo "Installing Kueue..."
-"$KUSTOMIZE" build config/default | kubectl apply --server-side -f -
+kubectl apply --server-side -f https://github.com/kubernetes-sigs/kueue/releases/download/v0.14.4/manifests.yaml
 kubectl wait deployment/kueue-controller-manager -n kueue-system --for=condition=available --timeout=5m
 cd "$SCRIPT_DIR"
 
-echo "Building and loading kueue-prepopulator image..."
+echo "Building and loading kueue-populator image..."
 make kind-image-build
-IMAGE_TAG="us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-prepopulator:$GIT_TAG"
+IMAGE_TAG="us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-populator:$GIT_TAG"
 "$KIND" load docker-image "$IMAGE_TAG" --name "$KIND_CLUSTER_NAME"
 
-echo "Deploying kueue-prepopulator..."
+echo "Deploying kueue-populator..."
 cd config
 # Use the same tag as the Makefile
-IMAGE_TAG="us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-prepopulator:$GIT_TAG"
-"$KUSTOMIZE" edit set image us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-prepopulator="$IMAGE_TAG"
+IMAGE_TAG="us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-populator:$GIT_TAG"
+"$KUSTOMIZE" edit set image us-central1-docker.pkg.dev/k8s-staging-images/kueue/kueue-populator="$IMAGE_TAG"
 "$KUSTOMIZE" build . | kubectl apply --server-side -f -
 cd ..
 
 echo "Waiting for deployment to be ready..."
-kubectl wait deployment/kueue-prepopulator -n kueue-system --for=condition=available --timeout=2m
+kubectl wait deployment/kueue-populator -n kueue-system --for=condition=available --timeout=2m
 
 echo "Running E2E tests..."
 "$GINKGO" -v test/e2e/...
\ No newline at end of file
diff --git a/config/components/crd/bases/kueue.x-k8s.io_clusterqueues.yaml b/config/components/crd/bases/kueue.x-k8s.io_clusterqueues.yaml
index 49f62c81d..6294ebb91 100644
--- a/config/components/crd/bases/kueue.x-k8s.io_clusterqueues.yaml
+++ b/config/components/crd/bases/kueue.x-k8s.io_clusterqueues.yaml
@@ -1384,31 +1384,6 @@ spec:
                   when participating in Fair Sharing.
                   This is recorded only when Fair Sharing is enabled in the Kueue configuration.
                 properties:
-                  admissionFairSharingStatus:
-                    description: admissionFairSharingStatus represents information
-                      relevant to the Admission Fair Sharing
-                    properties:
-                      consumedResources:
-                        additionalProperties:
-                          anyOf:
-                          - type: integer
-                          - type: string
-                          pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                          x-kubernetes-int-or-string: true
-                        description: |-
-                          consumedResources represents the aggregated usage of resources over time,
-                          with decaying function applied.
-                          The value is populated if usage consumption functionality is enabled in Kueue config.
-                        type: object
-                      lastUpdate:
-                        description: lastUpdate is the time when share and consumed
-                          resources were updated.
-                        format: date-time
-                        type: string
-                    required:
-                    - consumedResources
-                    - lastUpdate
-                    type: object
                   weightedShare:
                     description: |-
                       weightedShare represents the maximum of the ratios of usage
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 add75e420..cdddd24eb 100644
--- a/config/components/crd/bases/kueue.x-k8s.io_cohorts.yaml
+++ b/config/components/crd/bases/kueue.x-k8s.io_cohorts.yaml
@@ -526,31 +526,6 @@ spec:
                   when participating in Fair Sharing.
                   The is recorded only when Fair Sharing is enabled in the Kueue configuration.
                 properties:
-                  admissionFairSharingStatus:
-                    description: admissionFairSharingStatus represents information
-                      relevant to the Admission Fair Sharing
-                    properties:
-                      consumedResources:
-                        additionalProperties:
-                          anyOf:
-                          - type: integer
-                          - type: string
-                          pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                          x-kubernetes-int-or-string: true
-                        description: |-
-                          consumedResources represents the aggregated usage of resources over time,
-                          with decaying function applied.
-                          The value is populated if usage consumption functionality is enabled in Kueue config.
-                        type: object
-                      lastUpdate:
-                        description: lastUpdate is the time when share and consumed
-                          resources were updated.
-                        format: date-time
-                        type: string
-                    required:
-                    - consumedResources
-                    - lastUpdate
-                    type: object
                   weightedShare:
                     description: |-
                       weightedShare represents the maximum of the ratios of usage
diff --git a/config/components/crd/bases/kueue.x-k8s.io_multikueueclusters.yaml b/config/components/crd/bases/kueue.x-k8s.io_multikueueclusters.yaml
index 9c54384db..8a49ccc0c 100644
--- a/config/components/crd/bases/kueue.x-k8s.io_multikueueclusters.yaml
+++ b/config/components/crd/bases/kueue.x-k8s.io_multikueueclusters.yaml
@@ -177,52 +177,53 @@ spec:
           spec:
             description: spec is the specification of the MultiKueueCluster.
             properties:
-              clusterProfile:
-                description: clusterProfile is the reference to the ClusterProfile
-                  object used to connect to the cluster.
+              clusterSource:
+                description: clusterSource is the source to connect to the cluster.
                 properties:
-                  name:
-                    description: name of the ClusterProfile.
-                    maxLength: 256
-                    minLength: 1
-                    type: string
-                  namespace:
-                    description: namespace of the ClusterProfile.
-                    maxLength: 256
-                    minLength: 1
-                    type: string
-                required:
-                - name
-                - namespace
-                type: object
-              kubeConfig:
-                description: kubeConfig is information on how to connect to the cluster.
-                properties:
-                  location:
-                    description: |-
-                      location of the KubeConfig.
+                  clusterProfileRef:
+                    description: clusterProfileRef is the reference to the ClusterProfile
+                      object used to connect to the cluster.
+                    properties:
+                      name:
+                        description: name of the ClusterProfile.
+                        maxLength: 256
+                        minLength: 1
+                        type: string
+                    required:
+                    - name
+                    type: object
+                  kubeConfig:
+                    description: kubeConfig is information on how to connect to the
+                      cluster.
+                    properties:
+                      location:
+                        description: |-
+                          location of the KubeConfig.
 
-                      If LocationType is Secret then Location is the name of the secret inside the namespace in
-                      which the kueue controller manager is running. The config should be stored in the "kubeconfig" key.
-                    maxLength: 256
-                    minLength: 1
-                    type: string
-                  locationType:
-                    default: Secret
-                    description: locationType of the KubeConfig.
-                    enum:
-                    - Secret
-                    - Path
-                    type: string
-                required:
-                - location
+                          If LocationType is Secret then Location is the name of the secret inside the namespace in
+                          which the kueue controller manager is running. The config should be stored in the "kubeconfig" key.
+                        maxLength: 256
+                        minLength: 1
+                        type: string
+                      locationType:
+                        default: Secret
+                        description: locationType of the KubeConfig.
+                        enum:
+                        - Secret
+                        - Path
+                        type: string
+                    required:
+                    - location
+                    type: object
                 type: object
+                x-kubernetes-validations:
+                - message: exactly one of the fields in [kubeConfig clusterProfileRef]
+                    must be set
+                  rule: '[has(self.kubeConfig),has(self.clusterProfileRef)].filter(x,x==true).size()
+                    == 1'
+            required:
+            - clusterSource
             type: object
-            x-kubernetes-validations:
-            - message: exactly one of the fields in [kubeConfig clusterProfile] must
-                be set
-              rule: '[has(self.kubeConfig),has(self.clusterProfile)].filter(x,x==true).size()
-                == 1'
           status:
             description: status is the status of the MultiKueueCluster.
             properties:
diff --git a/config/components/crd/kustomization.yaml b/config/components/crd/kustomization.yaml
index c5779dd70..4b9ba190d 100644
--- a/config/components/crd/kustomization.yaml
+++ b/config/components/crd/kustomization.yaml
@@ -20,7 +20,9 @@ patches:
 # patches here are for enabling the conversion webhook for each CRD
 - path: patches/webhook_in_localqueues.yaml
 - path: patches/webhook_in_clusterqueues.yaml
+- path: patches/webhook_in_cohorts.yaml
 - path: patches/webhook_in_workloads.yaml
+- path: patches/webhook_in_multikueueclusters.yaml
 #- path: patches/webhook_in_resourceflavors.yaml
 #+kubebuilder:scaffold:crdkustomizewebhookpatch
 
diff --git a/config/components/crd/patches/webhook_in_cohorts.yaml b/config/components/crd/patches/webhook_in_cohorts.yaml
new file mode 100644
index 000000000..96328b84e
--- /dev/null
+++ b/config/components/crd/patches/webhook_in_cohorts.yaml
@@ -0,0 +1,16 @@
+# The following patch enables a conversion webhook for the CRD
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  name: cohorts.kueue.x-k8s.io
+spec:
+  conversion:
+    strategy: Webhook
+    webhook:
+      clientConfig:
+        service:
+          namespace: system
+          name: webhook-service
+          path: /convert
+      conversionReviewVersions:
+      - v1
diff --git a/config/components/crd/patches/webhook_in_multikueueclusters.yaml b/config/components/crd/patches/webhook_in_multikueueclusters.yaml
new file mode 100644
index 000000000..f1d7a9000
--- /dev/null
+++ b/config/components/crd/patches/webhook_in_multikueueclusters.yaml
@@ -0,0 +1,16 @@
+# The following patch enables a conversion webhook for the CRD
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  name: multikueueclusters.kueue.x-k8s.io
+spec:
+  conversion:
+    strategy: Webhook
+    webhook:
+      clientConfig:
+        service:
+          namespace: system
+          name: webhook-service
+          path: /convert
+      conversionReviewVersions:
+      - v1
\ No newline at end of file
diff --git a/go.mod b/go.mod
index aec1805bb..6877832c4 100644
--- a/go.mod
+++ b/go.mod
@@ -25,6 +25,7 @@ require (
 	golang.org/x/exp v0.0.0-20250718183923-645b1fa84792
 	golang.org/x/sync v0.18.0
 	k8s.io/api v0.34.1
+	k8s.io/apiextensions-apiserver v0.34.1
 	k8s.io/apimachinery v0.34.1
 	k8s.io/apiserver v0.34.1
 	k8s.io/autoscaler/cluster-autoscaler/apis v0.0.0-20240830133931-adfbe7e45277
@@ -144,7 +145,6 @@ require (
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/apiextensions-apiserver v0.34.1 // indirect
 	k8s.io/code-generator v0.34.1 // indirect
 	k8s.io/gengo/v2 v2.0.0-20250820003526-c297c0c1eb9d // indirect
 	k8s.io/kms v0.34.1 // indirect
diff --git a/hack/processing-plan.yaml b/hack/processing-plan.yaml
index dedafe939..9b17ffbf4 100644
--- a/hack/processing-plan.yaml
+++ b/hack/processing-plan.yaml
@@ -10,7 +10,7 @@ files:
     operations:
       - type: INSERT_OBJECT
         key: .spec
-        onFileCondition: '{"Workload": true, "LocalQueue": true, "ClusterQueue": true}[.spec.names.kind]'
+        onFileCondition: '{"Workload": true, "LocalQueue": true, "ClusterQueue": true, "Cohort": true, "MultiKueueCluster": true}[.spec.names.kind]'
         value: |
           conversion:
               strategy: Webhook
diff --git a/keps/693-multikueue/README.md b/keps/693-multikueue/README.md
index 42af00057..a5c66e064 100644
--- a/keps/693-multikueue/README.md
+++ b/keps/693-multikueue/README.md
@@ -189,11 +189,14 @@ const (
     SecretLocationType LocationType = "Secret"
 )
 
-// +kubebuilder:validation:ExactlyOneOf=kubeConfig;clusterProfile
-
 type MultiKueueClusterSpec struct {
-    // Information about how to connect to the cluster.
-    // Exactly one of KubeConfig or ClusterProfile must be specified.
+  // Information about the cluster.
+  // +required
+  ClusterSource ClusterSource `json:"clusterSource,omitempty"`
+}
+
+// +kubebuilder:validation:ExactlyOneOf=kubeConfig;clusterProfile
+type ClusterSource struct {
 
     // KubeConfig is the direct specification of the kubeconfig for the remote cluster.
     // This field can only be configured when ClusterProfile is not specified.
@@ -204,7 +207,7 @@ type MultiKueueClusterSpec struct {
     // The controller will use the information from the ClusterProfile to connect to the remote cluster.
     // This field can only be configured when KubeConfig is not specified.
     // +optional
-    ClusterProfile *ClusterProfileReference `json:"clusterProfile,omitempty"`
+    ClusterProfileRef *ClusterProfileReference `json:"clusterProfile,omitempty"`
 }
 
 type KubeConfig struct {
@@ -215,15 +218,12 @@ type KubeConfig struct {
     //
     // +kubebuilder:default=Secret
     // +kubebuilder:validation:Enum=Secret;Path
-    LocationType LocationType `json:"locationType"`
+    LocationType LocationType `json:"locationType,omitempty"`
 }
 
 type ClusterProfileReference struct {
   // Name of the ClusterProfile.
   Name string `json:"name"`
-
-  // Namespace of the ClusterProfile.
-  Namespace string `json:"namespace"`
 }
 
 type MultiKueueClusterStatus struct {
@@ -279,7 +279,7 @@ type ClusterProfileCredentialsProvider struct {
 	// Name is the name of the provider.
 	Name string `json:"name"`
 	//  ExecConfig is the exec configuration to obtain credentials.
-	ExecConfig *clientcmdapi.ExecConfig `json:"execConfig"`
+	ExecConfig clientcmdapi.ExecConfig `json:"execConfig"`
 }
 ```
 
diff --git a/pkg/cache/queue/cluster_queue.go b/pkg/cache/queue/cluster_queue.go
index 585e4f50f..88accd4ff 100644
--- a/pkg/cache/queue/cluster_queue.go
+++ b/pkg/cache/queue/cluster_queue.go
@@ -28,6 +28,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/klog/v2"
 	"k8s.io/utils/clock"
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
@@ -51,6 +52,7 @@ const (
 	RequeueReasonNamespaceMismatch     RequeueReason = "NamespaceMismatch"
 	RequeueReasonGeneric               RequeueReason = ""
 	RequeueReasonPendingPreemption     RequeueReason = "PendingPreemption"
+	RequeueReasonPreemptionFailed      RequeueReason = "PreemptionFailed"
 )
 
 var (
@@ -548,7 +550,11 @@ func (c *ClusterQueue) RequeueIfNotPresent(ctx context.Context, wInfo *workload.
 	if c.queueingStrategy == kueue.StrictFIFO {
 		return c.requeueIfNotPresent(wInfo, reason != RequeueReasonNamespaceMismatch)
 	}
-	return c.requeueIfNotPresent(wInfo, reason == RequeueReasonFailedAfterNomination || reason == RequeueReasonPendingPreemption)
+	return c.requeueIfNotPresent(
+		wInfo,
+		reason == RequeueReasonFailedAfterNomination ||
+			reason == RequeueReasonPendingPreemption ||
+			reason == RequeueReasonPreemptionFailed)
 }
 
 // queueOrderingFunc returns a function used by the clusterQueue heap algorithm
@@ -567,8 +573,8 @@ func queueOrderingFunc(ctx context.Context, c client.Client, wo workload.Orderin
 			case errB != nil:
 				log.V(2).Error(errB, "Error determining LocalQueue usage")
 			default:
-				log.V(3).Info("Resource usage from LocalQueue", "LocalQueue", a.Obj.Spec.QueueName, "Usage", lqAUsage)
-				log.V(3).Info("Resource usage from LocalQueue", "LocalQueue", b.Obj.Spec.QueueName, "Usage", lqBUsage)
+				log.V(3).Info("Resource usage from LocalQueue", "localQueue", klog.KRef(a.Obj.Namespace, string(a.Obj.Spec.QueueName)), "usage", lqAUsage)
+				log.V(3).Info("Resource usage from LocalQueue", "localQueue", klog.KRef(b.Obj.Namespace, string(b.Obj.Spec.QueueName)), "usage", lqBUsage)
 				if lqAUsage != lqBUsage {
 					return lqAUsage < lqBUsage
 				}
diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go
index 0ed6fdc9d..b9f3a223c 100644
--- a/pkg/constants/constants.go
+++ b/pkg/constants/constants.go
@@ -21,11 +21,12 @@ import (
 )
 
 const (
-	KueueName              = "kueue"
-	JobControllerName      = KueueName + "-job-controller"
-	WorkloadControllerName = KueueName + "-workload-controller"
-	AdmissionName          = KueueName + "-admission"
-	ReclaimablePodsMgr     = KueueName + "-reclaimable-pods"
+	KueueName                    = "kueue"
+	JobControllerName            = KueueName + "-job-controller"
+	WorkloadControllerName       = KueueName + "-workload-controller"
+	PodTerminationControllerName = KueueName + "-pod-termination-controller"
+	AdmissionName                = KueueName + "-admission"
+	ReclaimablePodsMgr           = KueueName + "-reclaimable-pods"
 
 	// UpdatesBatchPeriod is the batch period to hold workload updates
 	// before syncing a Queue and ClusterQueue objects.
diff --git a/pkg/controller/admissionchecks/multikueue/controllers.go b/pkg/controller/admissionchecks/multikueue/controllers.go
index ffe04a59f..62cb0f8a1 100644
--- a/pkg/controller/admissionchecks/multikueue/controllers.go
+++ b/pkg/controller/admissionchecks/multikueue/controllers.go
@@ -131,7 +131,7 @@ func SetupControllers(mgr ctrl.Manager, namespace string, opts ...SetupOption) e
 			for _, provider := range options.clusterProfileConfig.CredentialsProviders {
 				p = append(p, credentials.Provider{
 					Name:       provider.Name,
-					ExecConfig: provider.ExecConfig,
+					ExecConfig: &provider.ExecConfig,
 				})
 			}
 			cpCreds = credentials.New(p)
diff --git a/pkg/controller/admissionchecks/multikueue/indexer.go b/pkg/controller/admissionchecks/multikueue/indexer.go
index c745e64c5..29a159a4f 100644
--- a/pkg/controller/admissionchecks/multikueue/indexer.go
+++ b/pkg/controller/admissionchecks/multikueue/indexer.go
@@ -46,10 +46,10 @@ func getIndexUsingKubeConfigs(configNamespace string) func(obj client.Object) []
 		if !isCluster {
 			return nil
 		}
-		if cluster.Spec.KubeConfig == nil {
+		if cluster.Spec.ClusterSource.KubeConfig == nil {
 			return nil
 		}
-		return []string{strings.Join([]string{configNamespace, cluster.Spec.KubeConfig.Location}, "/")}
+		return []string{strings.Join([]string{configNamespace, cluster.Spec.ClusterSource.KubeConfig.Location}, "/")}
 	}
 }
 
@@ -59,10 +59,10 @@ func getIndexUsingClusterProfiles(configNamespace string) func(obj client.Object
 		if !isCluster {
 			return nil
 		}
-		if cluster.Spec.ClusterProfile == nil {
+		if cluster.Spec.ClusterSource.ClusterProfileRef == nil {
 			return nil
 		}
-		return []string{strings.Join([]string{configNamespace, cluster.Spec.ClusterProfile.Namespace, cluster.Spec.ClusterProfile.Name}, "/")}
+		return []string{strings.Join([]string{configNamespace, cluster.Spec.ClusterSource.ClusterProfileRef.Name}, "/")}
 	}
 }
 
diff --git a/pkg/controller/admissionchecks/multikueue/multikueuecluster.go b/pkg/controller/admissionchecks/multikueue/multikueuecluster.go
index a4b8cd607..7ce091cd1 100644
--- a/pkg/controller/admissionchecks/multikueue/multikueuecluster.go
+++ b/pkg/controller/admissionchecks/multikueue/multikueuecluster.go
@@ -351,7 +351,7 @@ type clustersReconciler struct {
 
 	adapters map[string]jobframework.MultiKueueAdapter
 
-	cpCreds clusterProfileCreds
+	clusterProfileCreds clusterProfileCreds
 }
 
 type clusterProfileCreds interface {
@@ -450,18 +450,25 @@ func (c *clustersReconciler) Reconcile(ctx context.Context, req reconcile.Reques
 
 func (c *clustersReconciler) loadClientConfig(ctx context.Context, cluster *kueue.MultiKueueCluster) (*clientConfig, bool, string, error) {
 	log := ctrl.LoggerFrom(ctx)
-	if cluster.Spec.ClusterProfile != nil {
+	if cluster.Spec.ClusterSource.ClusterProfileRef != nil {
 		if !features.Enabled(features.MultiKueueClusterProfile) {
 			return nil, false, "MultiKueueClusterProfileFeatureDisabled", errors.New("MultiKueueClusterProfile feature gate is disabled")
 		}
-		restConfig, retry, err := c.getRestConfigFromClusterProfile(ctx, cluster.Spec.ClusterProfile)
+		restConfig, retry, err := c.getRestConfigFromClusterProfile(ctx, cluster.Spec.ClusterSource.ClusterProfileRef)
 		if err != nil {
 			return nil, retry, "BadClusterProfile", err
 		}
+		opts := validateRestConfigOptions{
+			// ExecProvider is allowed for ClusterProfile credentials plugins.
+			allowExecProvider: true,
+		}
+		if err := validateRestConfig(restConfig, opts); err != nil {
+			return nil, false, "BadRestConfig", err
+		}
 		return &clientConfig{RestConfig: restConfig}, false, "", nil
 	}
 
-	kubeConfig, retry, err := c.getKubeConfig(ctx, cluster.Spec.KubeConfig)
+	kubeConfig, retry, err := c.getKubeConfig(ctx, cluster.Spec.ClusterSource.KubeConfig)
 	if err != nil {
 		return nil, retry, "BadKubeConfig", err
 	}
@@ -514,8 +521,17 @@ func validateKubeconfig(kubeconfig []byte) error {
 		return err
 	}
 
+	return validateRestConfig(restConfig, validateRestConfigOptions{})
+}
+
+type validateRestConfigOptions struct {
+	allowExecProvider bool
+}
+
+func validateRestConfig(restConfig *rest.Config, opts validateRestConfigOptions) error {
 	// Block dangerous auth mechanisms
-	// BearerToken is allowed due to service account tokens usage
+	// BearerTokenFile is not allowed.
+	// Instead BearerToken is allowed due to service account tokens usage.
 	if restConfig.BearerTokenFile != "" {
 		return errors.New("bearerTokenFile is not allowed")
 	}
@@ -526,7 +542,7 @@ func validateKubeconfig(kubeconfig []byte) error {
 	if restConfig.Username != "" || restConfig.Password != "" {
 		return errors.New("basic auth is not allowed")
 	}
-	if restConfig.ExecProvider != nil {
+	if restConfig.ExecProvider != nil && !opts.allowExecProvider {
 		return errors.New("exec plugins are not allowed")
 	}
 	if restConfig.AuthProvider != nil {
@@ -567,11 +583,11 @@ func (c *clustersReconciler) getKubeConfig(ctx context.Context, ref *kueue.KubeC
 
 func (c *clustersReconciler) getRestConfigFromClusterProfile(ctx context.Context, profileRef *kueue.ClusterProfileReference) (*rest.Config, bool, error) {
 	cp := &inventoryv1alpha1.ClusterProfile{}
-	if err := c.localClient.Get(ctx, types.NamespacedName{Name: profileRef.Name, Namespace: profileRef.Namespace}, cp); err != nil {
+	if err := c.localClient.Get(ctx, types.NamespacedName{Name: profileRef.Name, Namespace: c.configNamespace}, cp); err != nil {
 		return nil, !apierrors.IsNotFound(err), err
 	}
 
-	restConfig, err := c.cpCreds.BuildConfigFromCP(cp)
+	restConfig, err := c.clusterProfileCreds.BuildConfigFromCP(cp)
 	if err != nil {
 		return nil, false, err
 	}
@@ -659,16 +675,16 @@ func (c *clustersReconciler) getRemoteClients() []*remoteClient {
 
 func newClustersReconciler(c client.Client, namespace string, gcInterval time.Duration, origin string, fsWatcher *KubeConfigFSWatcher, adapters map[string]jobframework.MultiKueueAdapter, cpCreds clusterProfileCreds) *clustersReconciler {
 	return &clustersReconciler{
-		localClient:     c,
-		configNamespace: namespace,
-		remoteClients:   make(map[string]*remoteClient),
-		wlUpdateCh:      make(chan event.GenericEvent, eventChBufferSize),
-		gcInterval:      gcInterval,
-		origin:          origin,
-		watchEndedCh:    make(chan event.GenericEvent, eventChBufferSize),
-		fsWatcher:       fsWatcher,
-		adapters:        adapters,
-		cpCreds:         cpCreds,
+		localClient:         c,
+		configNamespace:     namespace,
+		remoteClients:       make(map[string]*remoteClient),
+		wlUpdateCh:          make(chan event.GenericEvent, eventChBufferSize),
+		gcInterval:          gcInterval,
+		origin:              origin,
+		watchEndedCh:        make(chan event.GenericEvent, eventChBufferSize),
+		fsWatcher:           fsWatcher,
+		adapters:            adapters,
+		clusterProfileCreds: cpCreds,
 	}
 }
 
@@ -699,8 +715,8 @@ func (c *clustersReconciler) setupWithManager(mgr ctrl.Manager) error {
 	filter := predicate.Funcs{
 		CreateFunc: func(ce event.CreateEvent) bool {
 			if cluster, isCluster := ce.Object.(*kueue.MultiKueueCluster); isCluster {
-				if cluster.Spec.KubeConfig != nil && cluster.Spec.KubeConfig.LocationType == kueue.PathLocationType {
-					err := c.fsWatcher.AddOrUpdate(cluster.Name, cluster.Spec.KubeConfig.Location)
+				if cluster.Spec.ClusterSource.KubeConfig != nil && cluster.Spec.ClusterSource.KubeConfig.LocationType == kueue.PathLocationType {
+					err := c.fsWatcher.AddOrUpdate(cluster.Name, cluster.Spec.ClusterSource.KubeConfig.Location)
 					if err != nil {
 						filterLog.Error(err, "AddOrUpdate FS watch", "cluster", klog.KObj(cluster))
 					}
@@ -715,8 +731,8 @@ func (c *clustersReconciler) setupWithManager(mgr ctrl.Manager) error {
 				return true
 			}
 
-			clusterNewHasKubeConfigPath := clusterNew.Spec.KubeConfig != nil && clusterNew.Spec.KubeConfig.LocationType == kueue.PathLocationType
-			clusterOldHasKubeConfigPath := clusterOld.Spec.KubeConfig != nil && clusterOld.Spec.KubeConfig.LocationType == kueue.PathLocationType
+			clusterNewHasKubeConfigPath := clusterNew.Spec.ClusterSource.KubeConfig != nil && clusterNew.Spec.ClusterSource.KubeConfig.LocationType == kueue.PathLocationType
+			clusterOldHasKubeConfigPath := clusterOld.Spec.ClusterSource.KubeConfig != nil && clusterOld.Spec.ClusterSource.KubeConfig.LocationType == kueue.PathLocationType
 			if clusterOldHasKubeConfigPath && !clusterNewHasKubeConfigPath {
 				err := c.fsWatcher.Remove(clusterOld.Name)
 				if err != nil {
@@ -725,7 +741,7 @@ func (c *clustersReconciler) setupWithManager(mgr ctrl.Manager) error {
 			}
 
 			if clusterNewHasKubeConfigPath {
-				err := c.fsWatcher.AddOrUpdate(clusterNew.Name, clusterNew.Spec.KubeConfig.Location)
+				err := c.fsWatcher.AddOrUpdate(clusterNew.Name, clusterNew.Spec.ClusterSource.KubeConfig.Location)
 				if err != nil {
 					filterLog.Error(err, "AddOrUpdate FS watch", "cluster", klog.KObj(clusterNew))
 				}
@@ -734,7 +750,7 @@ func (c *clustersReconciler) setupWithManager(mgr ctrl.Manager) error {
 		},
 		DeleteFunc: func(de event.DeleteEvent) bool {
 			if cluster, isCluster := de.Object.(*kueue.MultiKueueCluster); isCluster {
-				if cluster.Spec.KubeConfig != nil && cluster.Spec.KubeConfig.LocationType == kueue.PathLocationType {
+				if cluster.Spec.ClusterSource.KubeConfig != nil && cluster.Spec.ClusterSource.KubeConfig.LocationType == kueue.PathLocationType {
 					err := c.fsWatcher.Remove(cluster.Name)
 					if err != nil {
 						filterLog.Error(err, "Remove FS watch", "cluster", klog.KObj(cluster))
diff --git a/pkg/controller/constants/constants.go b/pkg/controller/constants/constants.go
index 28c9831d7..9dd945ef5 100644
--- a/pkg/controller/constants/constants.go
+++ b/pkg/controller/constants/constants.go
@@ -43,4 +43,9 @@ const (
 
 	// MaxExecTimeSecondsLabel is the label key in the job that holds the maximum execution time.
 	MaxExecTimeSecondsLabel = `kueue.x-k8s.io/max-exec-time-seconds`
+
+	// SafeToForcefullyTerminateAnnotationKey is the annotation key that controls whether a pod opted in to FailureRecoveryPolicy.
+	SafeToForcefullyTerminateAnnotationKey = "kueue.x-k8s.io/safe-to-forcefully-terminate"
+	// SafeToForcefullyTerminateAnnotationValue is the value of that annotation that enables FailureRecoveryPolicy for that pod.
+	SafeToForcefullyTerminateAnnotationValue = "true"
 )
diff --git a/pkg/controller/core/core.go b/pkg/controller/core/core.go
index ee0598cd4..4569d62bd 100644
--- a/pkg/controller/core/core.go
+++ b/pkg/controller/core/core.go
@@ -25,6 +25,7 @@ import (
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/constants"
+	"sigs.k8s.io/kueue/pkg/controller/failurerecovery"
 	"sigs.k8s.io/kueue/pkg/features"
 	"sigs.k8s.io/kueue/pkg/scheduler/preemption/fairsharing"
 	"sigs.k8s.io/kueue/pkg/util/waitforpodsready"
@@ -62,6 +63,20 @@ func SetupControllers(mgr ctrl.Manager, qManager *qcache.Manager, cc *schdcache.
 		watchers = append(watchers, cohortRec)
 	}
 
+	if features.Enabled(features.FailureRecoveryPolicy) {
+		tpRec, err := failurerecovery.NewTerminatingPodReconciler(
+			mgr.GetClient(),
+			mgr.GetEventRecorderFor(constants.PodTerminationControllerName),
+		)
+		if err != nil {
+			return "FailureRecoveryPolicy", err
+		}
+
+		if err := tpRec.SetupWithManager(mgr); err != nil {
+			return "FailureRecoveryPolicy", err
+		}
+	}
+
 	cqRec := NewClusterQueueReconciler(
 		mgr.GetClient(),
 		qManager,
diff --git a/pkg/controller/core/localqueue_controller.go b/pkg/controller/core/localqueue_controller.go
index b0c56ac16..0b4eb38ed 100644
--- a/pkg/controller/core/localqueue_controller.go
+++ b/pkg/controller/core/localqueue_controller.go
@@ -262,10 +262,10 @@ func (r *LocalQueueReconciler) Update(e event.TypedUpdateEvent[*kueue.LocalQueue
 
 func (r *LocalQueueReconciler) initializeAdmissionFsStatus(lq *kueue.LocalQueue) bool {
 	if lq.Status.FairSharing == nil {
-		lq.Status.FairSharing = &kueue.FairSharingStatus{}
+		lq.Status.FairSharing = &kueue.LocalQueueFairSharingStatus{}
 	}
 	if lq.Status.FairSharing.AdmissionFairSharingStatus == nil {
-		lq.Status.FairSharing.AdmissionFairSharingStatus = &kueue.AdmissionFairSharingStatus{
+		lq.Status.FairSharing.AdmissionFairSharingStatus = &kueue.LocalQueueAdmissionFairSharingStatus{
 			LastUpdate: metav1.NewTime(r.clock.Now()),
 		}
 		return true
diff --git a/pkg/controller/failurerecovery/pod_termination_controller.go b/pkg/controller/failurerecovery/pod_termination_controller.go
new file mode 100644
index 000000000..1ad98a467
--- /dev/null
+++ b/pkg/controller/failurerecovery/pod_termination_controller.go
@@ -0,0 +1,210 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package failurerecovery
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/client-go/tools/record"
+	"k8s.io/utils/clock"
+	"k8s.io/utils/ptr"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/event"
+	"sigs.k8s.io/controller-runtime/pkg/handler"
+	"sigs.k8s.io/controller-runtime/pkg/source"
+
+	"sigs.k8s.io/kueue/pkg/controller/constants"
+	utilclient "sigs.k8s.io/kueue/pkg/util/client"
+	utilpod "sigs.k8s.io/kueue/pkg/util/pod"
+	utiltaints "sigs.k8s.io/kueue/pkg/util/taints"
+)
+
+// +kubebuilder:rbac:groups="",resources=pods,verbs=get;list;watch
+// +kubebuilder:rbac:groups="",resources=pods/status,verbs=get;patch
+// +kubebuilder:rbac:groups="",resources=nodes,verbs=get;list;watch
+
+var realClock = clock.RealClock{}
+
+const (
+	KueueFailureRecoveryConditionType = "KueueFailureRecovery"
+	KueueForcefulTerminationReason    = "KueueForcefullyTerminated"
+)
+
+type TerminatingPodReconciler struct {
+	client                         client.Client
+	clock                          clock.Clock
+	forcefulTerminationGracePeriod time.Duration
+	recorder                       record.EventRecorder
+}
+
+type TerminatingPodReconcilerOptions struct {
+	clock                          clock.Clock
+	forcefulTerminationGracePeriod time.Duration
+}
+
+type TerminatingPodReconcilerOption func(*TerminatingPodReconcilerOptions)
+
+func WithClock(c clock.Clock) TerminatingPodReconcilerOption {
+	return func(o *TerminatingPodReconcilerOptions) {
+		o.clock = c
+	}
+}
+
+func WithForcefulTerminationGracePeriod(t time.Duration) TerminatingPodReconcilerOption {
+	return func(o *TerminatingPodReconcilerOptions) {
+		o.forcefulTerminationGracePeriod = t
+	}
+}
+
+var defaultOptions = TerminatingPodReconcilerOptions{
+	clock:                          realClock,
+	forcefulTerminationGracePeriod: time.Minute,
+}
+
+func NewTerminatingPodReconciler(
+	client client.Client,
+	recorder record.EventRecorder,
+	opts ...TerminatingPodReconcilerOption,
+) (*TerminatingPodReconciler, error) {
+	options := defaultOptions
+	for _, opt := range opts {
+		opt(&options)
+	}
+
+	return &TerminatingPodReconciler{
+		client:                         client,
+		clock:                          options.clock,
+		forcefulTerminationGracePeriod: options.forcefulTerminationGracePeriod,
+		recorder:                       recorder,
+	}, nil
+}
+
+func (r *TerminatingPodReconciler) Generic(event.TypedGenericEvent[*corev1.Pod]) bool {
+	return false
+}
+
+func (r *TerminatingPodReconciler) Create(e event.TypedCreateEvent[*corev1.Pod]) bool {
+	return podEligibleForTermination(e.Object)
+}
+
+func (r *TerminatingPodReconciler) Update(u event.TypedUpdateEvent[*corev1.Pod]) bool {
+	if !podEligibleForTermination(u.ObjectNew) {
+		return false
+	}
+
+	// Pod was not marked for deletion in the update
+	if !u.ObjectOld.DeletionTimestamp.IsZero() || u.ObjectNew.DeletionTimestamp.IsZero() {
+		return false
+	}
+
+	return true
+}
+
+func (r *TerminatingPodReconciler) Delete(event.TypedDeleteEvent[*corev1.Pod]) bool {
+	return false
+}
+
+func (r *TerminatingPodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
+	pod := &corev1.Pod{}
+	if err := r.client.Get(ctx, req.NamespacedName, pod); err != nil {
+		return ctrl.Result{}, client.IgnoreNotFound(err)
+	}
+
+	// Pod was updated in the meantime and should not be forcefully terminated
+	if !podEligibleForTermination(pod) {
+		return ctrl.Result{}, nil
+	}
+
+	// Forceful termination threshold not reached
+	now := r.clock.Now()
+	forcefulTerminationThreshold := pod.DeletionTimestamp.Add(r.forcefulTerminationGracePeriod)
+	if now.Before(forcefulTerminationThreshold) {
+		remainingTime := forcefulTerminationThreshold.Sub(now)
+		return ctrl.Result{RequeueAfter: remainingTime}, nil
+	}
+
+	node := &corev1.Node{}
+	nodeKey := types.NamespacedName{Name: pod.Spec.NodeName}
+	if err := r.client.Get(ctx, nodeKey, node); err != nil {
+		return ctrl.Result{}, client.IgnoreNotFound(err)
+	}
+	// Pod is not scheduled on an unreachable node
+	if !utiltaints.TaintKeyExists(node.Spec.Taints, corev1.TaintNodeUnreachable) {
+		return ctrl.Result{}, nil
+	}
+
+	totalDeletionGracePeriod := time.Duration(ptr.Deref(pod.DeletionGracePeriodSeconds, 0)) + r.forcefulTerminationGracePeriod
+	eventMessage := fmt.Sprintf(
+		"Pod forcefully terminated after %s grace period due to unreachable node `%s` (triggered by `%s` annotation)",
+		totalDeletionGracePeriod,
+		node.Name,
+		constants.SafeToForcefullyTerminateAnnotationKey,
+	)
+
+	err := utilclient.PatchStatus(ctx, r.client, pod, func() (bool, error) {
+		pod.Status.Phase = corev1.PodFailed
+		pod.Status.Conditions = append(pod.Status.Conditions, corev1.PodCondition{
+			Type:    KueueFailureRecoveryConditionType,
+			Status:  corev1.ConditionTrue,
+			Reason:  KueueForcefulTerminationReason,
+			Message: eventMessage,
+		})
+		return true, nil
+	})
+
+	if err != nil {
+		return ctrl.Result{}, err
+	}
+
+	r.recorder.Event(pod, corev1.EventTypeWarning, KueueForcefulTerminationReason, eventMessage)
+
+	return ctrl.Result{}, nil
+}
+
+func podEligibleForTermination(p *corev1.Pod) bool {
+	annotationValue, hasAnnotation := p.Annotations[constants.SafeToForcefullyTerminateAnnotationKey]
+	if !hasAnnotation || annotationValue != constants.SafeToForcefullyTerminateAnnotationValue {
+		return false
+	}
+
+	if p.DeletionTimestamp.IsZero() {
+		return false
+	}
+
+	if utilpod.IsTerminated(p) {
+		return false
+	}
+
+	return true
+}
+
+func (r *TerminatingPodReconciler) SetupWithManager(mgr ctrl.Manager) error {
+	return ctrl.NewControllerManagedBy(mgr).
+		WatchesRawSource(source.TypedKind(
+			mgr.GetCache(),
+			&corev1.Pod{},
+			&handler.TypedEnqueueRequestForObject[*corev1.Pod]{},
+			r,
+		)).
+		For(&corev1.Pod{}).
+		Complete(r)
+}
diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go
index 917925d36..0b38e3438 100644
--- a/pkg/features/kube_features.go
+++ b/pkg/features/kube_features.go
@@ -222,6 +222,12 @@ const (
 	//
 	// Enables ClusterProfile integration for MultiKueue.
 	MultiKueueClusterProfile featuregate.Feature = "MultiKueueClusterProfile"
+
+	// owner: @kshalot
+	//
+	// issue: https://github.com/kubernetes-sigs/kueue/issues/6757
+	// Enabled failure recovery of pods stuck in terminating state.
+	FailureRecoveryPolicy featuregate.Feature = "FailureRecoveryPolicy"
 )
 
 func init() {
@@ -346,10 +352,12 @@ var defaultVersionedFeatureGates = map[featuregate.Feature]featuregate.Versioned
 	PropagateBatchJobLabelsToWorkload: {
 		{Version: version.MustParse("0.15"), Default: true, PreRelease: featuregate.Beta},
 	},
-
 	MultiKueueClusterProfile: {
 		{Version: version.MustParse("0.15"), Default: false, PreRelease: featuregate.Alpha},
 	},
+	FailureRecoveryPolicy: {
+		{Version: version.MustParse("0.15"), Default: false, PreRelease: featuregate.Alpha},
+	},
 }
 
 func SetFeatureGateDuringTest(tb testing.TB, f featuregate.Feature, value bool) {
diff --git a/pkg/scheduler/preemption/preemption.go b/pkg/scheduler/preemption/preemption.go
index 8112096a9..b5fc19f34 100644
--- a/pkg/scheduler/preemption/preemption.go
+++ b/pkg/scheduler/preemption/preemption.go
@@ -154,11 +154,12 @@ func preemptionMessage(preemptor *kueue.Workload, reason, preemptorPath, preempt
 }
 
 // IssuePreemptions marks the target workloads as evicted.
-func (p *Preemptor) IssuePreemptions(ctx context.Context, preemptor *workload.Info, targets []*Target, snap *schdcache.ClusterQueueSnapshot) (int, error) {
+func (p *Preemptor) IssuePreemptions(ctx context.Context, preemptor *workload.Info, targets []*Target, snap *schdcache.ClusterQueueSnapshot) (preempted int, failedPreemptions int, exampleError error) {
 	log := ctrl.LoggerFrom(ctx)
 	errCh := routine.NewErrorChannel()
 	ctx, cancel := context.WithCancel(ctx)
 	var successfullyPreempted atomic.Int64
+	var preemptionErrors atomic.Int64
 	defer cancel()
 	workqueue.ParallelizeUntil(ctx, parallelPreemptions, len(targets), func(i int) {
 		target := targets[i]
@@ -173,6 +174,7 @@ func (p *Preemptor) IssuePreemptions(ctx context.Context, preemptor *workload.In
 			}))
 			if err != nil {
 				errCh.SendErrorWithCancel(err, cancel)
+				preemptionErrors.Add(1)
 				return
 			}
 
@@ -186,7 +188,7 @@ func (p *Preemptor) IssuePreemptions(ctx context.Context, preemptor *workload.In
 		}
 		successfullyPreempted.Add(1)
 	})
-	return int(successfullyPreempted.Load()), errCh.ReceiveError()
+	return int(successfullyPreempted.Load()), int(preemptionErrors.Load()), errCh.ReceiveError()
 }
 
 type preemptionAttemptOpts struct {
diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go
index 8eac6bd40..94421a082 100644
--- a/pkg/scheduler/scheduler.go
+++ b/pkg/scheduler/scheduler.go
@@ -296,13 +296,16 @@ func (s *Scheduler) schedule(ctx context.Context) wait.SpeedSignal {
 		if e.assignment.RepresentativeMode() == flavorassigner.Preempt {
 			// If preemptions are issued, the next attempt should try all the flavors.
 			e.LastAssignment = nil
-			preempted, err := s.preemptor.IssuePreemptions(ctx, &e.Info, preemptionTargets, e.clusterQueueSnapshot)
+			preempted, errors, err := s.preemptor.IssuePreemptions(ctx, &e.Info, preemptionTargets, e.clusterQueueSnapshot)
 			if err != nil {
 				log.Error(err, "Failed to preempt workloads")
 			}
 			if preempted != 0 {
 				e.inadmissibleMsg += fmt.Sprintf(". Pending the preemption of %d workload(s)", preempted)
 				e.requeueReason = qcache.RequeueReasonPendingPreemption
+			} else if errors > 0 {
+				e.inadmissibleMsg += fmt.Sprintf(". Preempting %d workload(s) failed, will retry.", errors)
+				e.requeueReason = qcache.RequeueReasonPreemptionFailed
 			}
 			continue
 		}
diff --git a/pkg/util/cert/cert.go b/pkg/util/cert/cert.go
index 18c6d4e5e..fca3b4703 100644
--- a/pkg/util/cert/cert.go
+++ b/pkg/util/cert/cert.go
@@ -73,6 +73,12 @@ func ManageCerts(mgr ctrl.Manager, cfg config.Configuration, setupFinished chan
 		}, {
 			Type: cert.CRDConversion,
 			Name: "workloads.kueue.x-k8s.io",
+		}, {
+			Type: cert.CRDConversion,
+			Name: "cohorts.kueue.x-k8s.io",
+		}, {
+			Type: cert.CRDConversion,
+			Name: "multikueueclusters.kueue.x-k8s.io",
 		}},
 		// When kueue is running in the leader election mode,
 		// we expect webhook server will run in primary and secondary instance
diff --git a/pkg/util/taints/taints.go b/pkg/util/taints/taints.go
new file mode 100644
index 000000000..4ad2f34cb
--- /dev/null
+++ b/pkg/util/taints/taints.go
@@ -0,0 +1,29 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package taints
+
+import corev1 "k8s.io/api/core/v1"
+
+// TaintKeyExists checks if the given taint key exists in list of taints. Returns true if exists false otherwise.
+func TaintKeyExists(taints []corev1.Taint, taintKeyToMatch string) bool {
+	for _, taint := range taints {
+		if taint.Key == taintKeyToMatch {
+			return true
+		}
+	}
+	return false
+}
diff --git a/site/content/en/docs/reference/kueue.v1beta2.md b/site/content/en/docs/reference/kueue.v1beta2.md
index d2ffb7a9f..6c9df31a8 100644
--- a/site/content/en/docs/reference/kueue.v1beta2.md
+++ b/site/content/en/docs/reference/kueue.v1beta2.md
@@ -671,39 +671,6 @@ If empty, the AdmissionCheck will run for all workloads submitted to the Cluster
 </tbody>
 </table>
 
-## `AdmissionFairSharingStatus`     {#kueue-x-k8s-io-v1beta2-AdmissionFairSharingStatus}
-    
-
-**Appears in:**
-
-- [FairSharingStatus](#kueue-x-k8s-io-v1beta2-FairSharingStatus)
-
-
-
-<table class="table">
-<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
-<tbody>
-    
-  
-<tr><td><code>consumedResources</code> <B>[Required]</B><br/>
-<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#resourcelist-v1-core"><code>k8s.io/api/core/v1.ResourceList</code></a>
-</td>
-<td>
-   <p>consumedResources represents the aggregated usage of resources over time,
-with decaying function applied.
-The value is populated if usage consumption functionality is enabled in Kueue config.</p>
-</td>
-</tr>
-<tr><td><code>lastUpdate</code> <B>[Required]</B><br/>
-<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta"><code>k8s.io/apimachinery/pkg/apis/meta/v1.Time</code></a>
-</td>
-<td>
-   <p>lastUpdate is the time when share and consumed resources were updated.</p>
-</td>
-</tr>
-</tbody>
-</table>
-
 ## `AdmissionMode`     {#kueue-x-k8s-io-v1beta2-AdmissionMode}
     
 (Alias of `string`)
@@ -821,7 +788,7 @@ policy can be preempted by the borrowing workload.</p>
 
 **Appears in:**
 
-- [MultiKueueClusterSpec](#kueue-x-k8s-io-v1beta2-MultiKueueClusterSpec)
+- [ClusterSource](#kueue-x-k8s-io-v1beta2-ClusterSource)
 
 
 
@@ -837,13 +804,6 @@ policy can be preempted by the borrowing workload.</p>
    <p>name of the ClusterProfile.</p>
 </td>
 </tr>
-<tr><td><code>namespace</code> <B>[Required]</B><br/>
-<code>string</code>
-</td>
-<td>
-   <p>namespace of the ClusterProfile.</p>
-</td>
-</tr>
 </tbody>
 </table>
 
@@ -1153,6 +1113,37 @@ This is recorded only when Fair Sharing is enabled in the Kueue configuration.</
 </tbody>
 </table>
 
+## `ClusterSource`     {#kueue-x-k8s-io-v1beta2-ClusterSource}
+    
+
+**Appears in:**
+
+- [MultiKueueClusterSpec](#kueue-x-k8s-io-v1beta2-MultiKueueClusterSpec)
+
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>kubeConfig,omitempty,omitzero</code><br/>
+<a href="#kueue-x-k8s-io-v1beta2-KubeConfig"><code>KubeConfig</code></a>
+</td>
+<td>
+   <p>kubeConfig is information on how to connect to the cluster.</p>
+</td>
+</tr>
+<tr><td><code>clusterProfileRef</code><br/>
+<a href="#kueue-x-k8s-io-v1beta2-ClusterProfileReference"><code>ClusterProfileReference</code></a>
+</td>
+<td>
+   <p>clusterProfileRef is the reference to the ClusterProfile object used to connect to the cluster.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
 ## `CohortReference`     {#kueue-x-k8s-io-v1beta2-CohortReference}
     
 (Alias of `string`)
@@ -1350,8 +1341,6 @@ When not 0, Weight must be greater than 10^-9.</p>
 
 - [CohortStatus](#kueue-x-k8s-io-v1beta2-CohortStatus)
 
-- [LocalQueueStatus](#kueue-x-k8s-io-v1beta2-LocalQueueStatus)
-
 
 <p>FairSharingStatus contains the information about the current status of Fair Sharing.</p>
 
@@ -1374,13 +1363,6 @@ weight of zero and is borrowing, this will return
 9223372036854775807, the maximum possible share value.</p>
 </td>
 </tr>
-<tr><td><code>admissionFairSharingStatus</code><br/>
-<a href="#kueue-x-k8s-io-v1beta2-AdmissionFairSharingStatus"><code>AdmissionFairSharingStatus</code></a>
-</td>
-<td>
-   <p>admissionFairSharingStatus represents information relevant to the Admission Fair Sharing</p>
-</td>
-</tr>
 </tbody>
 </table>
 
@@ -1543,7 +1525,7 @@ There could be up to 64 resources.</p>
 
 **Appears in:**
 
-- [MultiKueueClusterSpec](#kueue-x-k8s-io-v1beta2-MultiKueueClusterSpec)
+- [ClusterSource](#kueue-x-k8s-io-v1beta2-ClusterSource)
 
 
 
@@ -1571,6 +1553,78 @@ which the kueue controller manager is running. The config should be stored in th
 </tbody>
 </table>
 
+## `LocalQueueAdmissionFairSharingStatus`     {#kueue-x-k8s-io-v1beta2-LocalQueueAdmissionFairSharingStatus}
+    
+
+**Appears in:**
+
+- [LocalQueueFairSharingStatus](#kueue-x-k8s-io-v1beta2-LocalQueueFairSharingStatus)
+
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>consumedResources</code> <B>[Required]</B><br/>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#resourcelist-v1-core"><code>k8s.io/api/core/v1.ResourceList</code></a>
+</td>
+<td>
+   <p>consumedResources represents the aggregated usage of resources over time,
+with decaying function applied.
+The value is populated if usage consumption functionality is enabled in Kueue config.</p>
+</td>
+</tr>
+<tr><td><code>lastUpdate</code> <B>[Required]</B><br/>
+<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta"><code>k8s.io/apimachinery/pkg/apis/meta/v1.Time</code></a>
+</td>
+<td>
+   <p>lastUpdate is the time when share and consumed resources were updated.</p>
+</td>
+</tr>
+</tbody>
+</table>
+
+## `LocalQueueFairSharingStatus`     {#kueue-x-k8s-io-v1beta2-LocalQueueFairSharingStatus}
+    
+
+**Appears in:**
+
+- [LocalQueueStatus](#kueue-x-k8s-io-v1beta2-LocalQueueStatus)
+
+
+<p>LocalQueueFairSharingStatus contains the information about the current status of Fair Sharing.</p>
+
+
+<table class="table">
+<thead><tr><th width="30%">Field</th><th>Description</th></tr></thead>
+<tbody>
+    
+  
+<tr><td><code>weightedShare</code> <B>[Required]</B><br/>
+<code>int64</code>
+</td>
+<td>
+   <p>weightedShare represents the maximum of the ratios of usage
+above nominal quota to the lendable resources in the
+Cohort, among all the resources provided by the Node, and
+divided by the weight.  If zero, it means that the usage of
+the Node is below the nominal quota.  If the Node has a
+weight of zero and is borrowing, this will return
+9223372036854775807, the maximum possible share value.</p>
+</td>
+</tr>
+<tr><td><code>admissionFairSharingStatus</code><br/>
+<a href="#kueue-x-k8s-io-v1beta2-LocalQueueAdmissionFairSharingStatus"><code>LocalQueueAdmissionFairSharingStatus</code></a>
+</td>
+<td>
+   <p>admissionFairSharingStatus represents information relevant to the Admission Fair Sharing</p>
+</td>
+</tr>
+</tbody>
+</table>
+
 ## `LocalQueueFlavorUsage`     {#kueue-x-k8s-io-v1beta2-LocalQueueFlavorUsage}
     
 
@@ -1762,7 +1816,7 @@ workloads assigned to this LocalQueue.</p>
 </td>
 </tr>
 <tr><td><code>fairSharing</code><br/>
-<a href="#kueue-x-k8s-io-v1beta2-FairSharingStatus"><code>FairSharingStatus</code></a>
+<a href="#kueue-x-k8s-io-v1beta2-LocalQueueFairSharingStatus"><code>LocalQueueFairSharingStatus</code></a>
 </td>
 <td>
    <p>fairSharing contains the information about the current status of fair sharing.</p>
@@ -1797,18 +1851,11 @@ workloads assigned to this LocalQueue.</p>
 <tbody>
     
   
-<tr><td><code>kubeConfig,omitempty,omitzero</code><br/>
-<a href="#kueue-x-k8s-io-v1beta2-KubeConfig"><code>KubeConfig</code></a>
-</td>
-<td>
-   <p>kubeConfig is information on how to connect to the cluster.</p>
-</td>
-</tr>
-<tr><td><code>clusterProfile</code><br/>
-<a href="#kueue-x-k8s-io-v1beta2-ClusterProfileReference"><code>ClusterProfileReference</code></a>
+<tr><td><code>clusterSource</code> <B>[Required]</B><br/>
+<a href="#kueue-x-k8s-io-v1beta2-ClusterSource"><code>ClusterSource</code></a>
 </td>
 <td>
-   <p>clusterProfile is the reference to the ClusterProfile object used to connect to the cluster.</p>
+   <p>clusterSource is the source to connect to the cluster.</p>
 </td>
 </tr>
 </tbody>
diff --git a/site/content/zh-CN/docs/tasks/run/rayservices.md b/site/content/zh-CN/docs/tasks/run/rayservices.md
index 7feda5830..22897a6c2 100644
--- a/site/content/zh-CN/docs/tasks/run/rayservices.md
+++ b/site/content/zh-CN/docs/tasks/run/rayservices.md
@@ -1,38 +1,44 @@
 ---
-title: "Run A RayService"
-linkTitle: "RayServices"
+title: "运行 RayService"
+linkTitle: "RayService"
 date: 2025-06-30
 weight: 6
 description: >
-  Run a RayService with Kueue.
+  在 Kueue 上运行 RayService 的指南。
 ---
 
-This page shows how to leverage Kueue's scheduling and resource management capabilities when running [RayService](https://docs.ray.io/en/latest/cluster/kubernetes/getting-started/rayservice-quick-start.html).
+本页演示如何利用 Kueue 的调度与资源管理能力运行
+[RayService](https://docs.ray.io/en/latest/cluster/kubernetes/getting-started/rayservice-quick-start.html) 。
 
-Kueue manages the RayService through the RayCluster created for it. Therefore, RayService needs the label of `kueue.x-k8s.io/queue-name: user-queue` and this label is propagated to the relevant RayCluster to trigger Kueue's management.
+Kueue 通过为 RayService 创建的 RayCluster 来管理 RayService。
+因此，RayService 需要在 metadata.labels 中包含 `kueue.x-k8s.io/queue-name: user-queue` 标签，该标签会被传递到相应的 RayCluster，以触发 Kueue 的管理。
 
-This guide is for [serving users](/docs/tasks#serving-user) that have a basic understanding of Kueue. For more information, see [Kueue's overview](/docs/overview).
+本指南面向对 Kueue 有基本了解的、[对外提供服务的用户](/zh-CN/docs/tasks#serving-user)。
+更多信息，请参见 [Kueue 概览](/zh-CN/docs/overview)。
 
-## Before you begin
+## 开始之前 {#before-you-begin}
 
-1. Make sure you are using Kueue v0.6.0 version or newer and KubeRay v1.3.0 or newer.
+1. 请确保你使用的是 Kueue v0.6.0 版本或更高版本，以及 KubeRay v1.3.0 或更高版本。
 
-2. Check [Administer cluster quotas](/docs/tasks/manage/administer_cluster_quotas) for details on the initial Kueue setup.
+2. 请参见 [管理集群配额](/zh-CN/docs/tasks/manage/administer_cluster_quotas)了解初始 Kueue 设置的详细信息。
 
-3. See [KubeRay Installation](https://docs.ray.io/en/latest/cluster/kubernetes/getting-started/kuberay-operator-installation.html) for installation and configuration details of KubeRay.
+3. 请参见 [KubeRay 安装说明](https://docs.ray.io/en/latest/cluster/kubernetes/getting-started/raycluster-quick-start.html#step-2-deploy-a-kuberay-operator)了解 KubeRay 的安装和配置详情。
 
-{{% alert title="Note" color="primary" %}}
-RayService is managed by Kueue through RayCluster, and in order to use RayCluster, prior to v0.8.1, you need to restart Kueue after the installation.
-You can do it by running: `kubectl delete pods -l control-plane=controller-manager -n kueue-system`.
+{{% alert title="注意" color="primary" %}}
+RayService 通过 RayCluster 由 Kueue 管理；
+在 v0.8.1 之前，你需要在完成安装后重启 Kueue 才能使用 RayCluster。你可以通过运行
+`kubectl delete pods -l control-plane=controller-manager -n kueue-system` 来完成此操作。
 {{% /alert %}}
 
-## RayService definition
+## RayService 定义 {#rayservice-definition}
 
-When running [RayService](https://docs.ray.io/en/latest/cluster/kubernetes/getting-started/rayservice-quick-start.html) on Kueue, take into consideration the following aspects:
+在 Kueue 上运行 [RayService](https://docs.ray.io/en/latest/cluster/kubernetes/getting-started/rayservice-quick-start.html)
+时，请考虑以下方面：
 
-### a. Queue selection
+### a. 队列选择 {#a-queue-selection}
 
-The target [local queue](/docs/concepts/local_queue) should be specified in the `metadata.labels` section of the RayService configuration, and this label will be propagated to its RayCluster.
+目标 [本地队列](/zh-CN/docs/concepts/local_queue)应在 RayService 配置的 `metadata.labels`
+部分指定，该标签会被传递到其 RayCluster。
 
 ```yaml
 metadata:
@@ -40,9 +46,9 @@ metadata:
     kueue.x-k8s.io/queue-name: user-queue
 ```
 
-### b. Configure the resource needs
+### b. 配置资源需求 {#b-configure-the-resource-needs}
 
-The resource needs of the workload can be configured in the `spec.rayClusterConfig`.
+工作负载的资源需求可以在 `spec.rayClusterConfig` 中配置。
 
 ```yaml
 spec:
@@ -63,17 +69,18 @@ spec:
                   cpu: "1"
 ```
 
-### c. Limitations
-- Limited Worker Groups: Because a Kueue workload can have a maximum of 8 PodSets, the maximum number of `spec.rayClusterConfig.workerGroupSpecs` is 7
-- In-Tree Autoscaling Disabled: Kueue manages resource allocation for the RayService; therefore, the internal autoscaling mechanisms need to be disabled
+### c. 限制事项 {#c-limitations}
+- 有限的 Worker Group：由于 Kueue 工作负载最多可以有 8 个 PodSet,
+  所以`spec.rayClusterConfig.workerGroupSpecs` 的最大数量为 7。
+- 内建自动扩缩禁用：Kueue 管理 RayService 的资源分配，因此，集群的内部自动扩缩机制需要禁用。
 
-## Example RayService
+## RayService 示例{#example-rayservice}
 
-The RayService looks like the following:
+RayService 如下所示：
 
 {{< include "examples/jobs/ray-service-sample.yaml" "yaml" >}}
 
-{{% alert title="Note" color="primary" %}}
-The example above comes from [here](https://raw.githubusercontent.com/ray-project/kuberay/v1.4.2/ray-operator/config/samples/ray-service.sample.yaml)
-and only has the `queue-name` label added and requests updated.
+{{% alert title="注意" color="primary" %}}
+上述示例来自[这里](https://raw.githubusercontent.com/ray-project/kuberay/v1.4.2/ray-operator/config/samples/ray-service.sample.yaml)，
+仅添加了 `queue-name` 标签并更新了请求。
 {{% /alert %}}
\ No newline at end of file
diff --git a/site/static/examples/admin/single-clusterqueue-setup.yaml b/site/static/examples/admin/single-clusterqueue-setup.yaml
index 2ee6dd52d..2e4b2ef4d 100644
--- a/site/static/examples/admin/single-clusterqueue-setup.yaml
+++ b/site/static/examples/admin/single-clusterqueue-setup.yaml
@@ -1,4 +1,4 @@
-apiVersion: kueue.x-k8s.io/v1beta2
+apiVersion: kueue.x-k8s.io/v1beta1
 kind: ResourceFlavor
 metadata:
   name: "default-flavor"
diff --git a/site/static/examples/jobs/ray-cluster-sample.yaml b/site/static/examples/jobs/ray-cluster-sample.yaml
index eb2da94a7..a5069fa19 100644
--- a/site/static/examples/jobs/ray-cluster-sample.yaml
+++ b/site/static/examples/jobs/ray-cluster-sample.yaml
@@ -118,10 +118,10 @@ spec:
                   # For this example, we use a 500m CPU request to accommodate resource-constrained local
                   # Kubernetes testing environments such as KinD and minikube.
                   cpu: "1"
-                  # For production use-cases, we recommend allocating at least 8Gb memory for each Ray container.
+                  # For production use-cases, we recommend allocating at least 8GB memory for each Ray container.
                   memory: "1G"
           # use volumes
           # Refer to https://kubernetes.io/docs/concepts/storage/volumes/
           volumes:
             - name: ray-logs
-              emptyDir: {}
\ No newline at end of file
+              emptyDir: {}



Test patch:
diff --git a/apis/kueue/v1beta1/clusterqueue_conversion_test.go b/apis/kueue/v1beta1/clusterqueue_conversion_test.go
index e5c15565b..66ebb34ba 100644
--- a/apis/kueue/v1beta1/clusterqueue_conversion_test.go
+++ b/apis/kueue/v1beta1/clusterqueue_conversion_test.go
@@ -20,6 +20,8 @@ import (
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"sigs.k8s.io/kueue/apis/kueue/v1beta2"
@@ -206,6 +208,15 @@ func TestClusterQueueConvertTo(t *testing.T) {
 					QueueingStrategy: StrictFIFO,
 				},
 				Status: ClusterQueueStatus{
+					FairSharing: &FairSharingStatus{
+						WeightedShare: 100,
+						AdmissionFairSharingStatus: &AdmissionFairSharingStatus{
+							ConsumedResources: corev1.ResourceList{
+								corev1.ResourceCPU: resource.MustParse("10"),
+							},
+							LastUpdate: metav1.Now(),
+						},
+					},
 					Conditions: []metav1.Condition{
 						{
 							Type:   "Active",
@@ -232,6 +243,9 @@ func TestClusterQueueConvertTo(t *testing.T) {
 					QueueingStrategy: v1beta2.StrictFIFO,
 				},
 				Status: v1beta2.ClusterQueueStatus{
+					FairSharing: &v1beta2.FairSharingStatus{
+						WeightedShare: 100,
+					},
 					Conditions: []metav1.Condition{
 						{
 							Type:   "Active",
@@ -347,6 +361,9 @@ func TestClusterQueueConvertFrom(t *testing.T) {
 					QueueingStrategy: v1beta2.StrictFIFO,
 				},
 				Status: v1beta2.ClusterQueueStatus{
+					FairSharing: &v1beta2.FairSharingStatus{
+						WeightedShare: 100,
+					},
 					Conditions: []metav1.Condition{
 						{
 							Type:   "Active",
@@ -368,6 +385,9 @@ func TestClusterQueueConvertFrom(t *testing.T) {
 					QueueingStrategy: StrictFIFO,
 				},
 				Status: ClusterQueueStatus{
+					FairSharing: &FairSharingStatus{
+						WeightedShare: 100,
+					},
 					Conditions: []metav1.Condition{
 						{
 							Type:   "Active",
diff --git a/apis/kueue/v1beta1/localqueue_conversion_test.go b/apis/kueue/v1beta1/localqueue_conversion_test.go
index f7c5821ef..994dd67a7 100644
--- a/apis/kueue/v1beta1/localqueue_conversion_test.go
+++ b/apis/kueue/v1beta1/localqueue_conversion_test.go
@@ -32,6 +32,7 @@ func TestLocalQueueConvertTo(t *testing.T) {
 		Name:      "test-localqueue",
 		Namespace: "default",
 	}
+	now := metav1.Now()
 
 	testCases := map[string]struct {
 		input    *LocalQueue
@@ -172,6 +173,15 @@ func TestLocalQueueConvertTo(t *testing.T) {
 					ClusterQueue: "cluster-queue-1",
 				},
 				Status: LocalQueueStatus{
+					FairSharing: &FairSharingStatus{
+						WeightedShare: 100,
+						AdmissionFairSharingStatus: &AdmissionFairSharingStatus{
+							ConsumedResources: corev1.ResourceList{
+								corev1.ResourceCPU: resource.MustParse("10"),
+							},
+							LastUpdate: now,
+						},
+					},
 					Conditions: []metav1.Condition{
 						{
 							Type:   "Active",
@@ -199,6 +209,15 @@ func TestLocalQueueConvertTo(t *testing.T) {
 					ClusterQueue: "cluster-queue-1",
 				},
 				Status: v1beta2.LocalQueueStatus{
+					FairSharing: &v1beta2.LocalQueueFairSharingStatus{
+						WeightedShare: 100,
+						AdmissionFairSharingStatus: &v1beta2.LocalQueueAdmissionFairSharingStatus{
+							ConsumedResources: corev1.ResourceList{
+								corev1.ResourceCPU: resource.MustParse("10"),
+							},
+							LastUpdate: now,
+						},
+					},
 					Conditions: []metav1.Condition{
 						{
 							Type:   "Active",
diff --git a/apis/kueue/v1beta1/multikueue_conversion_test.go b/apis/kueue/v1beta1/multikueue_conversion_test.go
new file mode 100644
index 000000000..17aab5e1f
--- /dev/null
+++ b/apis/kueue/v1beta1/multikueue_conversion_test.go
@@ -0,0 +1,295 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1beta1
+
+import (
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"sigs.k8s.io/kueue/apis/kueue/v1beta2"
+)
+
+func TestMultiKueueClusterConvertTo(t *testing.T) {
+	defaultObjectMeta := metav1.ObjectMeta{
+		Name: "test-multikueuecluster",
+	}
+
+	testCases := map[string]struct {
+		input    *MultiKueueCluster
+		expected *v1beta2.MultiKueueCluster
+	}{
+		"KubeConfig conversion": {
+			input: &MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: MultiKueueClusterSpec{
+					KubeConfig: KubeConfig{
+						Location:     "test-location",
+						LocationType: SecretLocationType,
+					},
+				},
+			},
+			expected: &v1beta2.MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: v1beta2.MultiKueueClusterSpec{
+					ClusterSource: v1beta2.ClusterSource{
+						KubeConfig: &v1beta2.KubeConfig{
+							Location:     "test-location",
+							LocationType: v1beta2.LocationType(SecretLocationType),
+						},
+					},
+				},
+			},
+		},
+		"empty KubeConfig": {
+			input: &MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec:       MultiKueueClusterSpec{},
+			},
+			expected: &v1beta2.MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec:       v1beta2.MultiKueueClusterSpec{},
+			},
+		},
+		"complete MultiKueueCluster with status": {
+			input: &MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: MultiKueueClusterSpec{
+					KubeConfig: KubeConfig{
+						Location:     "test-location",
+						LocationType: PathLocationType,
+					},
+				},
+				Status: MultiKueueClusterStatus{
+					Conditions: []metav1.Condition{
+						{
+							Type:   "Active",
+							Status: metav1.ConditionTrue,
+							Reason: "Ready",
+						},
+					},
+				},
+			},
+			expected: &v1beta2.MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: v1beta2.MultiKueueClusterSpec{
+					ClusterSource: v1beta2.ClusterSource{
+						KubeConfig: &v1beta2.KubeConfig{
+							Location:     "test-location",
+							LocationType: v1beta2.LocationType(PathLocationType),
+						},
+					},
+				},
+				Status: v1beta2.MultiKueueClusterStatus{
+					Conditions: []metav1.Condition{
+						{
+							Type:   "Active",
+							Status: metav1.ConditionTrue,
+							Reason: "Ready",
+						},
+					},
+				},
+			},
+		},
+	}
+
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) {
+			result := &v1beta2.MultiKueueCluster{}
+			if err := tc.input.ConvertTo(result); err != nil {
+				t.Fatalf("ConvertTo failed: %v", err)
+			}
+			if diff := cmp.Diff(tc.expected, result); diff != "" {
+				t.Errorf("unexpected conversion result (-want +got):\n%s", diff)
+			}
+		})
+	}
+}
+
+func TestMultiKueueClusterConvertFrom(t *testing.T) {
+	defaultObjectMeta := metav1.ObjectMeta{
+		Name: "test-multikueuecluster",
+	}
+
+	testCases := map[string]struct {
+		input    *v1beta2.MultiKueueCluster
+		expected *MultiKueueCluster
+	}{
+		"KubeConfig conversion": {
+			input: &v1beta2.MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: v1beta2.MultiKueueClusterSpec{
+					ClusterSource: v1beta2.ClusterSource{
+						KubeConfig: &v1beta2.KubeConfig{
+							Location:     "test-location",
+							LocationType: v1beta2.LocationType(SecretLocationType),
+						},
+					},
+				},
+			},
+			expected: &MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: MultiKueueClusterSpec{
+					KubeConfig: KubeConfig{
+						Location:     "test-location",
+						LocationType: SecretLocationType,
+					},
+				},
+			},
+		},
+		"nil KubeConfig": {
+			input: &v1beta2.MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: v1beta2.MultiKueueClusterSpec{
+					ClusterSource: v1beta2.ClusterSource{
+						KubeConfig: nil,
+					},
+				},
+			},
+			expected: &MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec:       MultiKueueClusterSpec{},
+			},
+		},
+		"ClusterProfileRef conversion": {
+			input: &v1beta2.MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: v1beta2.MultiKueueClusterSpec{
+					ClusterSource: v1beta2.ClusterSource{
+						ClusterProfileRef: &v1beta2.ClusterProfileReference{
+							Name: "foobar",
+						},
+					},
+				},
+			},
+			expected: &MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec:       MultiKueueClusterSpec{},
+			},
+		},
+		"complete MultiKueueCluster with status": {
+			input: &v1beta2.MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: v1beta2.MultiKueueClusterSpec{
+					ClusterSource: v1beta2.ClusterSource{
+						KubeConfig: &v1beta2.KubeConfig{
+							Location:     "test-location",
+							LocationType: v1beta2.LocationType(PathLocationType),
+						},
+					},
+				},
+				Status: v1beta2.MultiKueueClusterStatus{
+					Conditions: []metav1.Condition{
+						{
+							Type:   "Active",
+							Status: metav1.ConditionTrue,
+							Reason: "Ready",
+						},
+					},
+				},
+			},
+			expected: &MultiKueueCluster{
+				ObjectMeta: defaultObjectMeta,
+				Spec: MultiKueueClusterSpec{
+					KubeConfig: KubeConfig{
+						Location:     "test-location",
+						LocationType: PathLocationType,
+					},
+				},
+				Status: MultiKueueClusterStatus{
+					Conditions: []metav1.Condition{
+						{
+							Type:   "Active",
+							Status: metav1.ConditionTrue,
+							Reason: "Ready",
+						},
+					},
+				},
+			},
+		},
+	}
+
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) {
+			result := &MultiKueueCluster{}
+			if err := result.ConvertFrom(tc.input); err != nil {
+				t.Fatalf("ConvertFrom failed: %v", err)
+			}
+			if diff := cmp.Diff(tc.expected, result); diff != "" {
+				t.Errorf("unexpected conversion result (-want +got):\n%s", diff)
+			}
+		})
+	}
+}
+
+func TestMultiKueueClusterConversion_RoundTrip(t *testing.T) {
+	testCases := map[string]struct {
+		v1beta1Obj *MultiKueueCluster
+	}{
+		"complete MultiKueueCluster with KubeConfig and status": {
+			v1beta1Obj: &MultiKueueCluster{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "test-multikueuecluster",
+				},
+				Spec: MultiKueueClusterSpec{
+					KubeConfig: KubeConfig{
+						Location:     "test-location",
+						LocationType: SecretLocationType,
+					},
+				},
+				Status: MultiKueueClusterStatus{
+					Conditions: []metav1.Condition{
+						{
+							Type:   "Active",
+							Status: metav1.ConditionTrue,
+							Reason: "Ready",
+						},
+					},
+				},
+			},
+		},
+		"minimal MultiKueueCluster": {
+			v1beta1Obj: &MultiKueueCluster{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "minimal-mkc",
+				},
+			},
+		},
+	}
+
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) {
+			// Convert v1beta1 -> v1beta2
+			v1beta2Obj := &v1beta2.MultiKueueCluster{}
+			if err := tc.v1beta1Obj.ConvertTo(v1beta2Obj); err != nil {
+				t.Fatalf("ConvertTo failed: %v", err)
+			}
+
+			// Convert v1beta2 -> v1beta1 (round-trip)
+			roundTripped := &MultiKueueCluster{}
+			if err := roundTripped.ConvertFrom(v1beta2Obj); err != nil {
+				t.Fatalf("ConvertFrom failed: %v", err)
+			}
+
+			// Verify round-trip
+			if diff := cmp.Diff(tc.v1beta1Obj, roundTripped); diff != "" {
+				t.Errorf("round-trip conversion produced diff (-original +roundtripped):\n%s", diff)
+			}
+		})
+	}
+}
diff --git a/cmd/experimental/kueue-prepopulator/pkg/controller/controller_test.go b/cmd/experimental/kueue-populator/pkg/controller/controller_test.go
similarity index 98%
rename from cmd/experimental/kueue-prepopulator/pkg/controller/controller_test.go
rename to cmd/experimental/kueue-populator/pkg/controller/controller_test.go
index 60e54c8f4..77be07c78 100644
--- a/cmd/experimental/kueue-prepopulator/pkg/controller/controller_test.go
+++ b/cmd/experimental/kueue-populator/pkg/controller/controller_test.go
@@ -33,7 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
-	"sigs.k8s.io/kueue/cmd/experimental/kueue-prepopulator/pkg/constants"
+	"sigs.k8s.io/kueue/cmd/experimental/kueue-populator/pkg/constants"
 )
 
 // Event is a simplified representation of a Kubernetes event for testing purposes.
@@ -43,7 +43,7 @@ type Event struct {
 	Message   string
 }
 
-func TestKueuePrepopulatorReconciler(t *testing.T) {
+func TestKueuePopulatorReconciler(t *testing.T) {
 	cases := map[string]struct {
 		clusterQueues       []*kueue.ClusterQueue
 		namespaces          []*corev1.Namespace
@@ -353,7 +353,7 @@ func TestKueuePrepopulatorReconciler(t *testing.T) {
 			wantEvents: []Event{
 				{
 					EventType: corev1.EventTypeWarning,
-					Reason:    "DefaultLocalQueueExists",
+					Reason:    "LocalQueueExists",
 					Message:   "Skipping LocalQueue creation in namespace ns, a LocalQueue with name default-lq already exists",
 				},
 			},
@@ -439,7 +439,7 @@ func TestKueuePrepopulatorReconciler(t *testing.T) {
 			k8sclient := builder.Build()
 			recorder := record.NewFakeRecorder(10)
 
-			var opts []KueuePrepopulatorReconcilerOption
+			var opts []KueuePopulatorReconcilerOption
 			if tc.globalNsSelectorStr != "" {
 				selector, err := labels.Parse(tc.globalNsSelectorStr)
 				if err != nil {
@@ -449,7 +449,7 @@ func TestKueuePrepopulatorReconciler(t *testing.T) {
 			}
 			opts = append(opts, WithLocalQueueName(tc.localQueueName))
 
-			reconciler := NewKueuePrepopulatorReconciler(
+			reconciler := NewKueuePopulatorReconciler(
 				k8sclient,
 				recorder,
 				opts...,
diff --git a/cmd/experimental/kueue-prepopulator/test/e2e/local_queue_creator_test.go b/cmd/experimental/kueue-populator/test/e2e/populator_test.go
similarity index 98%
rename from cmd/experimental/kueue-prepopulator/test/e2e/local_queue_creator_test.go
rename to cmd/experimental/kueue-populator/test/e2e/populator_test.go
index 78dfb343a..0973fbc59 100644
--- a/cmd/experimental/kueue-prepopulator/test/e2e/local_queue_creator_test.go
+++ b/cmd/experimental/kueue-populator/test/e2e/populator_test.go
@@ -27,7 +27,7 @@ import (
 	"sigs.k8s.io/kueue/test/util"
 )
 
-var _ = ginkgo.Describe("DefaultLocalQueue", func() {
+var _ = ginkgo.Describe("KueuePopulator", func() {
 	var (
 		ns *corev1.Namespace
 		cq *kueue.ClusterQueue
@@ -50,7 +50,7 @@ var _ = ginkgo.Describe("DefaultLocalQueue", func() {
 		}
 	})
 
-	ginkgo.When("DefaultLocalQueue controller is enabled", func() {
+	ginkgo.When("The controller is enabled", func() {
 		ginkgo.It("Should create a default LocalQueue when namespace matches ClusterQueue selector", func() {
 			cq = &kueue.ClusterQueue{
 				ObjectMeta: metav1.ObjectMeta{
diff --git a/cmd/experimental/kueue-prepopulator/test/e2e/suite_test.go b/cmd/experimental/kueue-populator/test/e2e/suite_test.go
similarity index 96%
rename from cmd/experimental/kueue-prepopulator/test/e2e/suite_test.go
rename to cmd/experimental/kueue-populator/test/e2e/suite_test.go
index 09cda7d7d..51111ce4a 100644
--- a/cmd/experimental/kueue-prepopulator/test/e2e/suite_test.go
+++ b/cmd/experimental/kueue-populator/test/e2e/suite_test.go
@@ -38,7 +38,7 @@ var (
 
 func TestE2E(t *testing.T) {
 	gomega.RegisterFailHandler(ginkgo.Fail)
-	ginkgo.RunSpecs(t, "LocalQueueCreator E2E Suite")
+	ginkgo.RunSpecs(t, "KueuePopulator E2E Suite")
 }
 
 var _ = ginkgo.BeforeSuite(func() {
diff --git a/cmd/experimental/kueue-prepopulator/test/integration/controller_test.go b/cmd/experimental/kueue-populator/test/integration/controller_test.go
similarity index 98%
rename from cmd/experimental/kueue-prepopulator/test/integration/controller_test.go
rename to cmd/experimental/kueue-populator/test/integration/controller_test.go
index 64066905e..dac0fff69 100644
--- a/cmd/experimental/kueue-prepopulator/test/integration/controller_test.go
+++ b/cmd/experimental/kueue-populator/test/integration/controller_test.go
@@ -25,13 +25,13 @@ import (
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
-	"sigs.k8s.io/kueue/cmd/experimental/kueue-prepopulator/pkg/constants"
+	"sigs.k8s.io/kueue/cmd/experimental/kueue-populator/pkg/constants"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/test/util"
 )
 
-var _ = ginkgo.Describe("KueuePrepopulator controller", ginkgo.Serial, func() {
-	ginkgo.When("the KueuePrepopulator controller is running", func() {
+var _ = ginkgo.Describe("KueuePopulator controller", ginkgo.Serial, func() {
+	ginkgo.When("the KueuePopulator controller is running", func() {
 		var (
 			ns *corev1.Namespace
 			cq *kueue.ClusterQueue
diff --git a/cmd/experimental/kueue-prepopulator/test/integration/suite_test.go b/cmd/experimental/kueue-populator/test/integration/suite_test.go
similarity index 92%
rename from cmd/experimental/kueue-prepopulator/test/integration/suite_test.go
rename to cmd/experimental/kueue-populator/test/integration/suite_test.go
index 5f58aae1b..a0181807f 100644
--- a/cmd/experimental/kueue-prepopulator/test/integration/suite_test.go
+++ b/cmd/experimental/kueue-populator/test/integration/suite_test.go
@@ -28,7 +28,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta1"
-	"sigs.k8s.io/kueue/cmd/experimental/kueue-prepopulator/pkg/controller"
+	"sigs.k8s.io/kueue/cmd/experimental/kueue-populator/pkg/controller"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	schdcache "sigs.k8s.io/kueue/pkg/cache/scheduler"
 	"sigs.k8s.io/kueue/pkg/controller/core"
@@ -48,7 +48,7 @@ func TestAPIs(t *testing.T) {
 	gomega.RegisterFailHandler(ginkgo.Fail)
 
 	ginkgo.RunSpecs(t,
-		"kueue-prepopulator Controllers Suite",
+		"kueue-populator Controllers Suite",
 	)
 }
 
@@ -88,7 +88,7 @@ func managerAndControllerSetup(controllersCfg *config.Configuration) framework.M
 		failedCtrl, err := core.SetupControllers(mgr, queues, cCache, controllersCfg)
 		gomega.Expect(err).ToNot(gomega.HaveOccurred(), "controller", failedCtrl)
 
-		opts := []controller.KueuePrepopulatorReconcilerOption{
+		opts := []controller.KueuePopulatorReconcilerOption{
 			controller.WithLocalQueueName("default-lq"),
 		}
 		if controllersCfg.ManagedJobsNamespaceSelector != nil {
@@ -97,7 +97,7 @@ func managerAndControllerSetup(controllersCfg *config.Configuration) framework.M
 			opts = append(opts, controller.WithNamespaceSelector(selector))
 		}
 
-		reconciler := controller.NewKueuePrepopulatorReconciler(
+		reconciler := controller.NewKueuePopulatorReconciler(
 			mgr.GetClient(),
 			mgr.GetEventRecorderFor(controller.ControllerName),
 			opts...,
diff --git a/pkg/cache/queue/cluster_queue_test.go b/pkg/cache/queue/cluster_queue_test.go
index a67cdaa61..f8770ea05 100644
--- a/pkg/cache/queue/cluster_queue_test.go
+++ b/pkg/cache/queue/cluster_queue_test.go
@@ -899,8 +899,8 @@ func TestFsAdmission(t *testing.T) {
 						Weight: ptr.To(resource.MustParse("1")),
 					}).
 					FairSharingStatus(
-						&kueue.FairSharingStatus{
-							AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+						&kueue.LocalQueueFairSharingStatus{
+							AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 								ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 									corev1.ResourceCPU: resource.MustParse("2"),
 								},
@@ -913,8 +913,8 @@ func TestFsAdmission(t *testing.T) {
 						Weight: ptr.To(resource.MustParse("1")),
 					}).
 					FairSharingStatus(
-						&kueue.FairSharingStatus{
-							AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+						&kueue.LocalQueueFairSharingStatus{
+							AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 								ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 									corev1.ResourceCPU: resource.MustParse("1"),
 								},
@@ -939,8 +939,8 @@ func TestFsAdmission(t *testing.T) {
 						Weight: ptr.To(resource.MustParse("1")),
 					}).
 					FairSharingStatus(
-						&kueue.FairSharingStatus{
-							AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+						&kueue.LocalQueueFairSharingStatus{
+							AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 								ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 									corev1.ResourceCPU: resource.MustParse("1"),
 									resourceGPU:        resource.MustParse("10"),
@@ -954,8 +954,8 @@ func TestFsAdmission(t *testing.T) {
 						Weight: ptr.To(resource.MustParse("1")),
 					}).
 					FairSharingStatus(
-						&kueue.FairSharingStatus{
-							AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+						&kueue.LocalQueueFairSharingStatus{
+							AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 								ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 									corev1.ResourceCPU: resource.MustParse("1000"),
 									resourceGPU:        resource.MustParse("1"),
@@ -986,8 +986,8 @@ func TestFsAdmission(t *testing.T) {
 						Weight: ptr.To(resource.MustParse("1")),
 					}).
 					FairSharingStatus(
-						&kueue.FairSharingStatus{
-							AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+						&kueue.LocalQueueFairSharingStatus{
+							AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 								ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 									corev1.ResourceCPU: resource.MustParse("10"),
 								},
@@ -1000,8 +1000,8 @@ func TestFsAdmission(t *testing.T) {
 						Weight: ptr.To(resource.MustParse("2")),
 					}).
 					FairSharingStatus(
-						&kueue.FairSharingStatus{
-							AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+						&kueue.LocalQueueFairSharingStatus{
+							AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 								ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 									corev1.ResourceCPU: resource.MustParse("6"),
 								},
@@ -1026,8 +1026,8 @@ func TestFsAdmission(t *testing.T) {
 						Weight: ptr.To(resource.MustParse("1")),
 					}).
 					FairSharingStatus(
-						&kueue.FairSharingStatus{
-							AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+						&kueue.LocalQueueFairSharingStatus{
+							AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 								ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 									corev1.ResourceCPU: resource.MustParse("10"),
 								},
diff --git a/pkg/controller/admissionchecks/multikueue/indexer_test.go b/pkg/controller/admissionchecks/multikueue/indexer_test.go
index c4ec56054..cd54a0e16 100644
--- a/pkg/controller/admissionchecks/multikueue/indexer_test.go
+++ b/pkg/controller/admissionchecks/multikueue/indexer_test.go
@@ -33,7 +33,7 @@ import (
 	"sigs.k8s.io/kueue/pkg/controller/core/indexer"
 	"sigs.k8s.io/kueue/pkg/controller/jobframework"
 	"sigs.k8s.io/kueue/pkg/features"
-	"sigs.k8s.io/kueue/pkg/util/slices"
+	utilslices "sigs.k8s.io/kueue/pkg/util/slices"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta2"
 )
@@ -69,7 +69,8 @@ func TestListMultiKueueClustersUsingKubeConfig(t *testing.T) {
 		wantList      []string
 	}{
 		"no clusters": {
-			filter: client.MatchingFields{UsingKubeConfigs: TestNamespace + "/secret1"},
+			filter:   client.MatchingFields{UsingKubeConfigs: TestNamespace + "/secret1"},
+			wantList: []string{},
 		},
 		"single cluster, single match": {
 			clusters: []*kueue.MultiKueueCluster{
@@ -82,7 +83,8 @@ func TestListMultiKueueClustersUsingKubeConfig(t *testing.T) {
 			clusters: []*kueue.MultiKueueCluster{
 				utiltestingapi.MakeMultiKueueCluster("cluster2").KubeConfig(kueue.SecretLocationType, "secret2").Obj(),
 			},
-			filter: client.MatchingFields{UsingKubeConfigs: TestNamespace + "/secret1"},
+			filter:   client.MatchingFields{UsingKubeConfigs: TestNamespace + "/secret1"},
+			wantList: []string{},
 		},
 		"multiple clusters, single match": {
 			clusters: []*kueue.MultiKueueCluster{
@@ -111,8 +113,8 @@ func TestListMultiKueueClustersUsingKubeConfig(t *testing.T) {
 				t.Errorf("unexpected list error (-want/+got):\n%s", diff)
 			}
 
-			gotList := slices.Map(lst.Items, func(mkc *kueue.MultiKueueCluster) string { return mkc.Name })
-			if diff := cmp.Diff(tc.wantList, gotList, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != "" {
+			gotList := utilslices.Map(lst.Items, func(mkc *kueue.MultiKueueCluster) string { return mkc.Name })
+			if diff := cmp.Diff(tc.wantList, gotList, cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != "" {
 				t.Errorf("unexpected list (-want/+got):\n%s", diff)
 			}
 		})
@@ -128,27 +130,29 @@ func TestListMultiKueueClustersUsingClusterProfile(t *testing.T) {
 		wantList      []string
 	}{
 		"no clusters": {
-			filter: client.MatchingFields{UsingClusterProfiles: TestNamespace + "/ns1/clusterprofile1"},
+			filter:   client.MatchingFields{UsingClusterProfiles: TestNamespace + "/clusterprofile1"},
+			wantList: []string{},
 		},
 		"single cluster, single match": {
 			clusters: []*kueue.MultiKueueCluster{
-				utiltestingapi.MakeMultiKueueCluster("cluster1").ClusterProfile("clusterprofile1", "ns1").Obj(),
+				utiltestingapi.MakeMultiKueueCluster("cluster1").ClusterProfile("clusterprofile1").Obj(),
 			},
-			filter:   client.MatchingFields{UsingClusterProfiles: TestNamespace + "/ns1/clusterprofile1"},
+			filter:   client.MatchingFields{UsingClusterProfiles: TestNamespace + "/clusterprofile1"},
 			wantList: []string{"cluster1"},
 		},
 		"single cluster, no match": {
 			clusters: []*kueue.MultiKueueCluster{
-				utiltestingapi.MakeMultiKueueCluster("cluster2").ClusterProfile("clusterprofile2", "ns2").Obj(),
+				utiltestingapi.MakeMultiKueueCluster("cluster2").ClusterProfile("clusterprofile2").Obj(),
 			},
-			filter: client.MatchingFields{UsingClusterProfiles: TestNamespace + "/ns1/clusterprofile1"},
+			filter:   client.MatchingFields{UsingClusterProfiles: TestNamespace + "/clusterprofile1"},
+			wantList: []string{},
 		},
 		"multiple clusters, single match": {
 			clusters: []*kueue.MultiKueueCluster{
-				utiltestingapi.MakeMultiKueueCluster("cluster1").ClusterProfile("clusterprofile1", "ns1").Obj(),
-				utiltestingapi.MakeMultiKueueCluster("cluster2").ClusterProfile("clusterprofile2", "ns2").Obj(),
+				utiltestingapi.MakeMultiKueueCluster("cluster1").ClusterProfile("clusterprofile1").Obj(),
+				utiltestingapi.MakeMultiKueueCluster("cluster2").ClusterProfile("clusterprofile2").Obj(),
 			},
-			filter:   client.MatchingFields{UsingClusterProfiles: TestNamespace + "/ns1/clusterprofile1"},
+			filter:   client.MatchingFields{UsingClusterProfiles: TestNamespace + "/clusterprofile1"},
 			wantList: []string{"cluster1"},
 		},
 	}
@@ -170,8 +174,8 @@ func TestListMultiKueueClustersUsingClusterProfile(t *testing.T) {
 				t.Errorf("unexpected list error (-want/+got):\n%s", diff)
 			}
 
-			gotList := slices.Map(lst.Items, func(mkc *kueue.MultiKueueCluster) string { return mkc.Name })
-			if diff := cmp.Diff(tc.wantList, gotList, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != "" {
+			gotList := utilslices.Map(lst.Items, func(mkc *kueue.MultiKueueCluster) string { return mkc.Name })
+			if diff := cmp.Diff(tc.wantList, gotList, cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != "" {
 				t.Errorf("unexpected list (-want/+got):\n%s", diff)
 			}
 		})
@@ -186,7 +190,8 @@ func TestListMultiKueueConfigsUsingMultiKueueClusters(t *testing.T) {
 		wantList      []string
 	}{
 		"no configs": {
-			filter: client.MatchingFields{UsingMultiKueueClusters: "cluster1"},
+			filter:   client.MatchingFields{UsingMultiKueueClusters: "cluster1"},
+			wantList: []string{},
 		},
 		"single config, single match": {
 			configs: []*kueue.MultiKueueConfig{
@@ -199,7 +204,8 @@ func TestListMultiKueueConfigsUsingMultiKueueClusters(t *testing.T) {
 			configs: []*kueue.MultiKueueConfig{
 				utiltestingapi.MakeMultiKueueConfig("config2").Clusters("cluster2").Obj(),
 			},
-			filter: client.MatchingFields{UsingMultiKueueClusters: "cluster1"},
+			filter:   client.MatchingFields{UsingMultiKueueClusters: "cluster1"},
+			wantList: []string{},
 		},
 		"multiple configs, single match": {
 			configs: []*kueue.MultiKueueConfig{
@@ -228,8 +234,8 @@ func TestListMultiKueueConfigsUsingMultiKueueClusters(t *testing.T) {
 				t.Errorf("unexpected list error (-want/+got):\n%s", diff)
 			}
 
-			gotList := slices.Map(lst.Items, func(mkc *kueue.MultiKueueConfig) string { return mkc.Name })
-			if diff := cmp.Diff(tc.wantList, gotList, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != "" {
+			gotList := utilslices.Map(lst.Items, func(mkc *kueue.MultiKueueConfig) string { return mkc.Name })
+			if diff := cmp.Diff(tc.wantList, gotList, cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != "" {
 				t.Errorf("unexpected list (-want/+got):\n%s", diff)
 			}
 		})
@@ -302,7 +308,7 @@ func TestListWorkloadsWithAdmissionCheck(t *testing.T) {
 				t.Errorf("unexpected error (-want/+got):\n%s", diff)
 			}
 
-			gotList := slices.Map(lst.Items, func(wl *kueue.Workload) string { return wl.Name })
+			gotList := utilslices.Map(lst.Items, func(wl *kueue.Workload) string { return wl.Name })
 			if diff := cmp.Diff(tc.wantList, gotList, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != "" {
 				t.Errorf("unexpected (-want/+got):\n%s", diff)
 			}
diff --git a/pkg/controller/admissionchecks/multikueue/multikueuecluster_test.go b/pkg/controller/admissionchecks/multikueue/multikueuecluster_test.go
index cc2ef911b..e44ee827a 100644
--- a/pkg/controller/admissionchecks/multikueue/multikueuecluster_test.go
+++ b/pkg/controller/admissionchecks/multikueue/multikueuecluster_test.go
@@ -116,14 +116,32 @@ type testClusterProfileCreds struct {
 func (t *testClusterProfileCreds) BuildConfigFromCP(clusterprofile *inventoryv1alpha1.ClusterProfile) (*rest.Config, error) {
 	for _, provider := range clusterprofile.Status.CredentialProviders {
 		if t.supportedProviders[provider.Name] {
-			return &rest.Config{
-				Host: clusterprofile.Name,
-			}, nil
+			if strings.Contains(clusterprofile.Name, "invalid") {
+				return testRestConfigInvalid(), nil
+			}
+			return testRestConfig(), nil
 		}
 	}
 	return nil, errors.New("unsupported credential provider")
 }
 
+func testRestConfig() *rest.Config {
+	return &rest.Config{
+		Host: "https://10.10.10.10",
+		ExecProvider: &clientcmdapi.ExecConfig{
+			APIVersion: "v1",
+			Command:    "/test-command",
+		},
+	}
+}
+
+func testRestConfigInvalid() *rest.Config {
+	return &rest.Config{
+		Host:            "invalid-host",
+		BearerTokenFile: "/path/to/file",
+	}
+}
+
 func makeTestClusterProfile(name string, providerName string) inventoryv1alpha1.ClusterProfile {
 	return inventoryv1alpha1.ClusterProfile{
 		ObjectMeta: metav1.ObjectMeta{
@@ -517,7 +535,7 @@ func TestUpdateConfig(t *testing.T) {
 			reconcileFor: "worker1",
 			clusters: []kueue.MultiKueueCluster{
 				*utiltestingapi.MakeMultiKueueCluster("worker1").
-					ClusterProfile("worker1", TestNamespace).
+					ClusterProfile("worker1").
 					Generation(1).
 					Obj(),
 			},
@@ -532,7 +550,7 @@ func TestUpdateConfig(t *testing.T) {
 			},
 			wantClusters: []kueue.MultiKueueCluster{
 				*utiltestingapi.MakeMultiKueueCluster("worker1").
-					ClusterProfile("worker1", TestNamespace).
+					ClusterProfile("worker1").
 					Active(metav1.ConditionTrue, "Active", "Connected", 1).
 					Generation(1).
 					Obj(),
@@ -540,7 +558,7 @@ func TestUpdateConfig(t *testing.T) {
 			wantRemoteClients: map[string]*remoteClient{
 				"worker1": {
 					config: &clientConfig{
-						RestConfig: &rest.Config{Host: "worker1"},
+						RestConfig: testRestConfig(),
 					},
 				},
 			},
@@ -549,7 +567,7 @@ func TestUpdateConfig(t *testing.T) {
 			reconcileFor: "worker1",
 			clusters: []kueue.MultiKueueCluster{
 				*utiltestingapi.MakeMultiKueueCluster("worker1").
-					ClusterProfile("worker1", TestNamespace).
+					ClusterProfile("worker1").
 					Generation(1).
 					Obj(),
 			},
@@ -562,7 +580,7 @@ func TestUpdateConfig(t *testing.T) {
 			},
 			wantClusters: []kueue.MultiKueueCluster{
 				*utiltestingapi.MakeMultiKueueCluster("worker1").
-					ClusterProfile("worker1", TestNamespace).
+					ClusterProfile("worker1").
 					Active(metav1.ConditionFalse, "BadClusterProfile", "load client config failed: unsupported credential provider", 1).
 					Generation(1).
 					Obj(),
@@ -573,7 +591,7 @@ func TestUpdateConfig(t *testing.T) {
 			reconcileFor: "worker1",
 			clusters: []kueue.MultiKueueCluster{
 				*utiltestingapi.MakeMultiKueueCluster("worker1").
-					ClusterProfile("worker1", TestNamespace).
+					ClusterProfile("worker1").
 					Generation(1).
 					Obj(),
 			},
@@ -586,7 +604,7 @@ func TestUpdateConfig(t *testing.T) {
 			},
 			wantClusters: []kueue.MultiKueueCluster{
 				*utiltestingapi.MakeMultiKueueCluster("worker1").
-					ClusterProfile("worker1", TestNamespace).
+					ClusterProfile("worker1").
 					Active(metav1.ConditionFalse, "BadClusterProfile", "load client config failed: clusterprofiles.multicluster.x-k8s.io \"worker1\" not found", 1).
 					Generation(1).
 					Obj(),
@@ -597,7 +615,7 @@ func TestUpdateConfig(t *testing.T) {
 			reconcileFor: "worker1",
 			clusters: []kueue.MultiKueueCluster{
 				*utiltestingapi.MakeMultiKueueCluster("worker1").
-					ClusterProfile("worker1", TestNamespace).
+					ClusterProfile("worker1").
 					Generation(1).
 					Obj(),
 			},
@@ -607,13 +625,39 @@ func TestUpdateConfig(t *testing.T) {
 			},
 			wantClusters: []kueue.MultiKueueCluster{
 				*utiltestingapi.MakeMultiKueueCluster("worker1").
-					ClusterProfile("worker1", TestNamespace).
+					ClusterProfile("worker1").
 					Active(metav1.ConditionFalse, "MultiKueueClusterProfileFeatureDisabled", "load client config failed: MultiKueueClusterProfile feature gate is disabled", 1).
 					Generation(1).
 					Obj(),
 			},
 			wantErr: fmt.Errorf("failed to load client config, reason: MultiKueueClusterProfileFeatureDisabled, error: %w", errors.New("MultiKueueClusterProfile feature gate is disabled")),
 		},
+		"invalid rest config from cluster profile": {
+			reconcileFor: "invalid",
+			clusters: []kueue.MultiKueueCluster{
+				*utiltestingapi.MakeMultiKueueCluster("invalid").
+					ClusterProfile("invalid").
+					Generation(1).
+					Obj(),
+			},
+			secrets: []corev1.Secret{},
+			clusterprofiles: []inventoryv1alpha1.ClusterProfile{
+				makeTestClusterProfile("invalid", "credentialProvider1"),
+			},
+			cpCreds: &testClusterProfileCreds{
+				supportedProviders: map[string]bool{
+					"credentialProvider1": true,
+				},
+			},
+			wantClusters: []kueue.MultiKueueCluster{
+				*utiltestingapi.MakeMultiKueueCluster("invalid").
+					ClusterProfile("invalid").
+					Active(metav1.ConditionFalse, "BadRestConfig", "load client config failed: bearerTokenFile is not allowed", 1).
+					Generation(1).
+					Obj(),
+			},
+			wantErr: fmt.Errorf("failed to load client config, reason: BadRestConfig, error: %w", errors.New("bearerTokenFile is not allowed")),
+		},
 	}
 
 	for name, tc := range cases {
@@ -645,10 +689,10 @@ func TestUpdateConfig(t *testing.T) {
 			}
 
 			// Create test kubeconfig file for path location type
-			if tc.clusters != nil && tc.clusters[0].Spec.KubeConfig != nil && tc.clusters[0].Spec.KubeConfig.LocationType == kueue.PathLocationType && tc.clusters[0].Spec.KubeConfig.Location != "" {
+			if tc.clusters != nil && tc.clusters[0].Spec.ClusterSource.KubeConfig != nil && tc.clusters[0].Spec.ClusterSource.KubeConfig.LocationType == kueue.PathLocationType && tc.clusters[0].Spec.ClusterSource.KubeConfig.Location != "" {
 				kubeconfigBytes := testKubeconfig("worker1")
-				if err := os.WriteFile(tc.clusters[0].Spec.KubeConfig.Location, []byte(kubeconfigBytes), 0666); err != nil {
-					t.Errorf("Failed to create test file (%s): %v", tc.clusters[0].Spec.KubeConfig.Location, err)
+				if err := os.WriteFile(tc.clusters[0].Spec.ClusterSource.KubeConfig.Location, []byte(kubeconfigBytes), 0666); err != nil {
+					t.Errorf("Failed to create test file (%s): %v", tc.clusters[0].Spec.ClusterSource.KubeConfig.Location, err)
 				}
 			}
 
diff --git a/pkg/controller/core/localqueue_controller_test.go b/pkg/controller/core/localqueue_controller_test.go
index 88bbe6775..eb04ab9bb 100644
--- a/pkg/controller/core/localqueue_controller_test.go
+++ b/pkg/controller/core/localqueue_controller_test.go
@@ -135,8 +135,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-5 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("8")},
@@ -150,8 +150,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("4"),
 							},
@@ -174,8 +174,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-5 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("8")},
@@ -191,8 +191,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("6"),
 							},
@@ -223,8 +223,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-5 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("8"),
@@ -242,8 +242,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("6"),
 								"GPU":              resource.MustParse("10"),
@@ -287,8 +287,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-5 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("8")},
@@ -304,8 +304,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 				ReservingWorkloads(1).
 				AdmittedWorkloads(1).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("6827m"),
 							},
@@ -336,8 +336,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-5 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("8")},
@@ -351,8 +351,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("7980m"),
 							},
@@ -375,8 +375,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-5 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								"GPU": resource.MustParse("8")},
@@ -392,8 +392,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 				ReservingWorkloads(1).
 				AdmittedWorkloads(1).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								"GPU": resource.MustParse("6827m"),
 							},
@@ -424,8 +424,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-5 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								"GPU": resource.MustParse("8")},
@@ -441,8 +441,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 				ReservingWorkloads(1).
 				AdmittedWorkloads(1).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{},
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{},
 					}).
 				Obj(),
 			runningWls: []kueue.Workload{
@@ -469,8 +469,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-4 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("8")},
@@ -484,8 +484,8 @@ func TestLocalQueueReconcile(t *testing.T) {
 					Weight: ptr.To(resource.MustParse("1")),
 				}).
 				FairSharingStatus(
-					&kueue.FairSharingStatus{
-						AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+					&kueue.LocalQueueFairSharingStatus{
+						AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 							LastUpdate: metav1.NewTime(clock.Now().Add(-4 * time.Minute)),
 							ConsumedResources: map[corev1.ResourceName]resource.Quantity{
 								corev1.ResourceCPU: resource.MustParse("8")},
@@ -560,7 +560,7 @@ func TestLocalQueueReconcile(t *testing.T) {
 				cmpopts.EquateEmpty(),
 				util.IgnoreConditionTimestamps,
 				util.IgnoreObjectMetaResourceVersion,
-				cmpopts.IgnoreFields(kueue.AdmissionFairSharingStatus{}, "LastUpdate"),
+				cmpopts.IgnoreFields(kueue.LocalQueueAdmissionFairSharingStatus{}, "LastUpdate"),
 			}
 			if diff := cmp.Diff(tc.wantLocalQueue, gotLocalQueue, cmpOpts...); diff != "" {
 				t.Errorf("Workloads after reconcile (-want,+got):\n%s", diff)
diff --git a/pkg/controller/failurerecovery/pod_termination_controller_test.go b/pkg/controller/failurerecovery/pod_termination_controller_test.go
new file mode 100644
index 000000000..b5c92957e
--- /dev/null
+++ b/pkg/controller/failurerecovery/pod_termination_controller_test.go
@@ -0,0 +1,297 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package failurerecovery
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/google/go-cmp/cmp"
+	"github.com/google/go-cmp/cmp/cmpopts"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/types"
+	testingclock "k8s.io/utils/clock/testing"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/event"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
+
+	"sigs.k8s.io/kueue/pkg/controller/constants"
+	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
+	testingnode "sigs.k8s.io/kueue/pkg/util/testingjobs/node"
+	testingpod "sigs.k8s.io/kueue/pkg/util/testingjobs/pod"
+)
+
+var (
+	podCmpOpts = cmp.Options{
+		cmpopts.EquateEmpty(),
+		cmpopts.IgnoreFields(
+			corev1.Pod{}, "ObjectMeta.ResourceVersion", "ObjectMeta.DeletionTimestamp",
+		),
+	}
+)
+
+func TestCreateEventFilter(t *testing.T) {
+	now := time.Now()
+	fakeClock := testingclock.NewFakeClock(now)
+	cl := utiltesting.NewFakeClient()
+	recorder := &utiltesting.EventRecorder{}
+	reconciler, err := NewTerminatingPodReconciler(cl, recorder, WithClock(fakeClock))
+	if err != nil {
+		t.Fatalf("could not create reconciler: %v", err)
+	}
+
+	podToReconcile := testingpod.MakePod("pod", "ns").
+		StatusPhase(corev1.PodRunning).
+		Annotation(constants.SafeToForcefullyTerminateAnnotationKey, constants.SafeToForcefullyTerminateAnnotationValue).
+		DeletionTimestamp(now).
+		KueueFinalizer()
+
+	cases := map[string]struct {
+		pod        *corev1.Pod
+		wantResult bool
+	}{
+		"pod is annotated and marked for deletion": {
+			pod:        podToReconcile.Obj(),
+			wantResult: true,
+		},
+		"pod is not annotated": {
+			pod: podToReconcile.
+				Clone().
+				Annotation(constants.SafeToForcefullyTerminateAnnotationKey, "false").
+				Obj(),
+			wantResult: false,
+		},
+		"pod is not marked for deletion": {
+			pod: podToReconcile.
+				Clone().
+				DeletionTimestamp(time.Time{}).
+				Obj(),
+			wantResult: false,
+		},
+	}
+
+	for name, tc := range cases {
+		t.Run(name, func(t *testing.T) {
+			gotResult := reconciler.Create(event.TypedCreateEvent[*corev1.Pod]{Object: tc.pod})
+
+			if diff := cmp.Diff(tc.wantResult, gotResult); diff != "" {
+				t.Errorf("unexpected reconcile result (-want/+got):\n%s", diff)
+			}
+		})
+	}
+}
+
+func TestUpdateEventFilter(t *testing.T) {
+	now := time.Now()
+	fakeClock := testingclock.NewFakeClock(now)
+	cl := utiltesting.NewFakeClient()
+	recorder := &utiltesting.EventRecorder{}
+	reconciler, err := NewTerminatingPodReconciler(cl, recorder, WithClock(fakeClock))
+	if err != nil {
+		t.Fatalf("could not create reconciler: %v", err)
+	}
+
+	oldPod := testingpod.MakePod("pod", "ns").
+		StatusPhase(corev1.PodRunning).
+		Annotation(constants.SafeToForcefullyTerminateAnnotationKey, constants.SafeToForcefullyTerminateAnnotationValue)
+	newPodToReconcile := oldPod.Clone().DeletionTimestamp(now)
+
+	cases := map[string]struct {
+		oldPod     *corev1.Pod
+		newPod     *corev1.Pod
+		wantResult bool
+	}{
+		"pod is annotated and was marked for deletion": {
+			oldPod:     oldPod.Obj(),
+			newPod:     newPodToReconcile.Obj(),
+			wantResult: true,
+		},
+		"pod was already deleted": {
+			oldPod:     oldPod.Clone().DeletionTimestamp(now).Obj(),
+			newPod:     newPodToReconcile.Obj(),
+			wantResult: false,
+		},
+		"updated object is not annotated": {
+			oldPod: oldPod.Obj(),
+			newPod: newPodToReconcile.
+				Clone().
+				Annotation(constants.SafeToForcefullyTerminateAnnotationKey, "false").
+				Obj(),
+			wantResult: false,
+		},
+	}
+
+	for name, tc := range cases {
+		t.Run(name, func(t *testing.T) {
+			gotResult := reconciler.Update(event.TypedUpdateEvent[*corev1.Pod]{ObjectOld: tc.oldPod, ObjectNew: tc.newPod})
+
+			if diff := cmp.Diff(tc.wantResult, gotResult); diff != "" {
+				t.Errorf("unexpected reconcile result (-want/+got):\n%s", diff)
+			}
+		})
+	}
+}
+
+func TestReconciler(t *testing.T) {
+	now := time.Now()
+	nowSecondPrecision := metav1.NewTime(now).Rfc3339Copy()
+	beforeGracePeriod := now.Add(-time.Minute * 3)
+	fakeClock := testingclock.NewFakeClock(now)
+
+	unreachableNode := testingnode.MakeNode("unreachable-node").
+		Taints(corev1.Taint{Key: corev1.TaintNodeUnreachable}).Obj()
+	healthyNode := testingnode.MakeNode("healthy-node").Obj()
+	podToForcefullyTerminate := testingpod.MakePod("pod", "ns").
+		StatusPhase(corev1.PodRunning).
+		Annotation(constants.SafeToForcefullyTerminateAnnotationKey, constants.SafeToForcefullyTerminateAnnotationValue).
+		NodeName(unreachableNode.Name).
+		DeletionTimestamp(beforeGracePeriod).
+		KueueFinalizer()
+
+	cases := map[string]struct {
+		testPod    *corev1.Pod
+		wantResult ctrl.Result
+		wantErr    error
+		wantPod    *corev1.Pod
+		wantEvents []utiltesting.EventRecord
+	}{
+		"pod is in failed phase": {
+			testPod: podToForcefullyTerminate.
+				Clone().
+				StatusPhase(corev1.PodFailed).
+				Obj(),
+			wantResult: ctrl.Result{},
+			wantErr:    nil,
+			wantPod: podToForcefullyTerminate.
+				Clone().
+				StatusPhase(corev1.PodFailed).
+				Obj(),
+			wantEvents: nil,
+		},
+		"pod is in succeeded phase": {
+			testPod: podToForcefullyTerminate.
+				Clone().
+				StatusPhase(corev1.PodSucceeded).
+				Obj(),
+			wantResult: ctrl.Result{},
+			wantErr:    nil,
+			wantPod: podToForcefullyTerminate.
+				Clone().
+				StatusPhase(corev1.PodSucceeded).
+				Obj(),
+			wantEvents: nil,
+		},
+		"pod is not scheduled on an unreachable node": {
+			testPod: podToForcefullyTerminate.
+				Clone().
+				NodeName(healthyNode.Name).
+				Obj(),
+			wantResult: ctrl.Result{},
+			wantErr:    nil,
+			wantPod: podToForcefullyTerminate.
+				Clone().
+				NodeName(healthyNode.Name).
+				Obj(),
+			wantEvents: nil,
+		},
+		"forceful termination grace period did not elapse for pod": {
+			testPod: podToForcefullyTerminate.
+				Clone().
+				DeletionTimestamp(now).
+				Obj(),
+			wantResult: ctrl.Result{RequeueAfter: nowSecondPrecision.Add(time.Minute).Sub(now)},
+			wantErr:    nil,
+			wantPod: podToForcefullyTerminate.
+				Clone().
+				DeletionTimestamp(now).
+				Obj(),
+			wantEvents: nil,
+		},
+		"forceful termination grace period elapsed for pod": {
+			testPod:    podToForcefullyTerminate.Clone().Obj(),
+			wantResult: ctrl.Result{},
+			wantErr:    nil,
+			wantPod: podToForcefullyTerminate.Clone().
+				StatusPhase(corev1.PodFailed).
+				StatusConditions(corev1.PodCondition{
+					Type:    KueueFailureRecoveryConditionType,
+					Status:  "True",
+					Reason:  KueueForcefulTerminationReason,
+					Message: "Pod forcefully terminated after 1m0s grace period due to unreachable node `unreachable-node` (triggered by `kueue.x-k8s.io/safe-to-forcefully-terminate` annotation)",
+				}).
+				Obj(),
+			wantEvents: []utiltesting.EventRecord{
+				{
+					Key:       types.NamespacedName{Namespace: "ns", Name: "pod"},
+					EventType: "Warning",
+					Reason:    KueueForcefulTerminationReason,
+					Message:   "Pod forcefully terminated after 1m0s grace period due to unreachable node `unreachable-node` (triggered by `kueue.x-k8s.io/safe-to-forcefully-terminate` annotation)",
+				},
+			},
+		},
+		"pod is scheduled on a node that does not exist": {
+			testPod:    podToForcefullyTerminate.Clone().NodeName("missing-node").Obj(),
+			wantResult: ctrl.Result{},
+			wantErr:    nil,
+			wantPod:    podToForcefullyTerminate.Clone().NodeName("missing-node").Obj(),
+			wantEvents: nil,
+		},
+	}
+
+	for name, tc := range cases {
+		t.Run(name, func(t *testing.T) {
+			objs := []client.Object{tc.testPod, healthyNode, unreachableNode}
+			clientBuilder := utiltesting.NewClientBuilder().WithObjects(objs...)
+			cl := clientBuilder.Build()
+			recorder := &utiltesting.EventRecorder{}
+			reconciler, err := NewTerminatingPodReconciler(cl, recorder, WithClock(fakeClock))
+			if err != nil {
+				t.Fatalf("could not create reconciler: %v", err)
+			}
+
+			ctxWithLogger, _ := utiltesting.ContextWithLog(t)
+			ctx, ctxCancel := context.WithCancel(ctxWithLogger)
+			defer ctxCancel()
+
+			gotResult, gotError := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: client.ObjectKeyFromObject(tc.testPod)})
+
+			if diff := cmp.Diff(tc.wantResult, gotResult); diff != "" {
+				t.Errorf("unexpected reconcile result (-want/+got):\n%s", diff)
+			}
+
+			if diff := cmp.Diff(tc.wantErr, gotError); diff != "" {
+				t.Errorf("unexpected reconcile error (-want/+got):\n%s", diff)
+			}
+
+			gotPod := podToForcefullyTerminate.Clone().Obj()
+			if err := cl.Get(ctx, client.ObjectKeyFromObject(tc.testPod), gotPod); err != nil {
+				t.Fatalf("could not get pod after reconcile")
+			}
+
+			if diff := cmp.Diff(tc.wantPod, gotPod, podCmpOpts...); diff != "" {
+				t.Errorf("Workloads after reconcile (-want,+got):\n%s", diff)
+			}
+
+			if diff := cmp.Diff(tc.wantEvents, recorder.RecordedEvents); diff != "" {
+				t.Errorf("unexpected events (-want/+got):\n%s", diff)
+			}
+		})
+	}
+}
diff --git a/pkg/controller/jobs/job/job_controller_test.go b/pkg/controller/jobs/job/job_controller_test.go
index b89907613..220a6f71b 100644
--- a/pkg/controller/jobs/job/job_controller_test.go
+++ b/pkg/controller/jobs/job/job_controller_test.go
@@ -558,8 +558,7 @@ var (
 func TestReconciler(t *testing.T) {
 	// the clock is primarily used with second rounded times
 	// use the current time trimmed.
-	testStartTime := time.Now().Truncate(time.Second)
-	fakeClock := testingclock.NewFakeClock(testStartTime)
+	now := time.Now().Truncate(time.Second)
 
 	t.Cleanup(jobframework.EnableIntegrationsForTest(t, FrameworkName))
 	baseJobWrapper := utiltestingjob.MakeJob("job", "ns").
@@ -572,7 +571,7 @@ func TestReconciler(t *testing.T) {
 	baseWorkloadWrapper := utiltestingapi.MakeWorkload("wl", "ns").
 		Finalizers(kueue.ResourceInUseFinalizerName).
 		PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 10).Request(corev1.ResourceCPU, "1").Obj()).
-		ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj())
+		ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj(), now)
 
 	baseWPCWrapper := utiltestingapi.MakeWorkloadPriorityClass("test-wpc").
 		PriorityValue(100)
@@ -609,11 +608,11 @@ func TestReconciler(t *testing.T) {
 			job:     *baseJobWrapper.DeepCopy(),
 			wantJob: *baseJobWrapper.DeepCopy(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(false).
+				AdmittedAt(false, now).
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(false).
+				AdmittedAt(false, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -630,11 +629,11 @@ func TestReconciler(t *testing.T) {
 			job:     *baseJobWrapper.DeepCopy(),
 			wantJob: *baseJobWrapper.DeepCopy(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -659,7 +658,7 @@ func TestReconciler(t *testing.T) {
 				Active(10).
 				Obj(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -669,7 +668,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -690,7 +689,7 @@ func TestReconciler(t *testing.T) {
 				Ready(10).
 				Obj(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -700,7 +699,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionTrue,
@@ -721,11 +720,11 @@ func TestReconciler(t *testing.T) {
 				Ready(10).
 				Obj(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionTrue,
@@ -748,7 +747,7 @@ func TestReconciler(t *testing.T) {
 				Failed(1).
 				Obj(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionTrue,
@@ -758,7 +757,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -783,7 +782,7 @@ func TestReconciler(t *testing.T) {
 				Failed(1).
 				Obj(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -793,7 +792,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -814,7 +813,7 @@ func TestReconciler(t *testing.T) {
 				Ready(10).
 				Obj(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -824,7 +823,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionTrue,
@@ -841,7 +840,7 @@ func TestReconciler(t *testing.T) {
 			job:     *baseJobWrapper.DeepCopy(),
 			wantJob: *baseJobWrapper.DeepCopy(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -851,7 +850,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -872,7 +871,7 @@ func TestReconciler(t *testing.T) {
 				Ready(10).
 				Obj(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionTrue,
@@ -882,7 +881,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionTrue,
@@ -899,7 +898,7 @@ func TestReconciler(t *testing.T) {
 			job:     *baseJobWrapper.DeepCopy(),
 			wantJob: *baseJobWrapper.DeepCopy(),
 			workloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -909,7 +908,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			},
 			wantWorkloads: []kueue.Workload{*baseWorkloadWrapper.Clone().
-				Admitted(true).
+				AdmittedAt(true, now).
 				Condition(metav1.Condition{
 					Type:    kueue.WorkloadPodsReady,
 					Status:  metav1.ConditionFalse,
@@ -933,12 +932,12 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantEvents: []utiltesting.EventRecord{
@@ -1027,7 +1026,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check",
 						State: kueue.CheckStateReady,
@@ -1044,7 +1043,7 @@ func TestReconciler(t *testing.T) {
 			},
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check",
 						State: kueue.CheckStateReady,
@@ -1077,7 +1076,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Active(false).
 					Condition(metav1.Condition{
 						Type:    kueue.WorkloadEvicted,
@@ -1167,14 +1166,14 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Active(true).
 					Condition(metav1.Condition{
 						Type:               kueue.WorkloadEvicted,
 						Status:             metav1.ConditionTrue,
 						Reason:             workload.ReasonWithCause(kueue.WorkloadDeactivated, kueue.WorkloadRequeuingLimitExceeded),
 						Message:            "The workload is deactivated",
-						LastTransitionTime: metav1.NewTime(testStartTime),
+						LastTransitionTime: metav1.NewTime(now),
 					}).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check",
@@ -1258,14 +1257,14 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Active(false).
 					Condition(metav1.Condition{
 						Type:               kueue.WorkloadEvicted,
 						Status:             metav1.ConditionTrue,
 						Reason:             kueue.WorkloadDeactivated,
 						Message:            "The workload is deactivated",
-						LastTransitionTime: metav1.NewTime(testStartTime),
+						LastTransitionTime: metav1.NewTime(now),
 					}).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check",
@@ -1346,14 +1345,14 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Active(false).
 					Condition(metav1.Condition{
 						Type:               kueue.WorkloadEvicted,
 						Status:             metav1.ConditionTrue,
 						Reason:             workload.ReasonWithCause(kueue.WorkloadDeactivated, kueue.WorkloadRequeuingLimitExceeded),
 						Message:            "The workload is deactivated",
-						LastTransitionTime: metav1.NewTime(testStartTime),
+						LastTransitionTime: metav1.NewTime(now),
 					}).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check",
@@ -1443,14 +1442,14 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-2*time.Minute)).
+					AdmittedAt(true, now.Add(-2*time.Minute)).
 					Active(false).
 					Condition(metav1.Condition{
 						Type:               kueue.WorkloadEvicted,
 						Status:             metav1.ConditionTrue,
 						Reason:             workload.ReasonWithCause(kueue.WorkloadDeactivated, kueue.WorkloadRequeuingLimitExceeded),
 						Message:            "The workload is deactivated",
-						LastTransitionTime: metav1.NewTime(testStartTime.Add(-time.Minute)),
+						LastTransitionTime: metav1.NewTime(now.Add(-time.Minute)),
 					}).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check",
@@ -1531,14 +1530,14 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-2*time.Minute)).
+					AdmittedAt(true, now.Add(-2*time.Minute)).
 					Active(false).
 					Condition(metav1.Condition{
 						Type:               kueue.WorkloadEvicted,
 						Status:             metav1.ConditionTrue,
 						Reason:             workload.ReasonWithCause(kueue.WorkloadDeactivated, kueue.WorkloadRequeuingLimitExceeded),
 						Message:            "The workload is deactivated",
-						LastTransitionTime: metav1.NewTime(testStartTime.Add(-time.Minute)),
+						LastTransitionTime: metav1.NewTime(now.Add(-time.Minute)),
 					}).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check",
@@ -1620,7 +1619,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Condition(metav1.Condition{
 						Type:    kueue.WorkloadEvicted,
 						Status:  metav1.ConditionTrue,
@@ -1676,7 +1675,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Condition(metav1.Condition{
 						Type:    kueue.WorkloadEvicted,
 						Status:  metav1.ConditionTrue,
@@ -1756,7 +1755,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Condition(metav1.Condition{
 						Type:    kueue.WorkloadEvicted,
 						Status:  metav1.ConditionTrue,
@@ -1836,7 +1835,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Condition(metav1.Condition{
 						Type:    kueue.WorkloadEvicted,
 						Status:  metav1.ConditionTrue,
@@ -1916,7 +1915,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					AdmittedAt(true, testStartTime.Add(-time.Second)).
+					AdmittedAt(true, now.Add(-time.Second)).
 					Condition(metav1.Condition{
 						Type:    kueue.WorkloadEvicted,
 						Status:  metav1.ConditionTrue,
@@ -1997,7 +1996,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Active(false).
 					Queue("foo").
 					Condition(metav1.Condition{
@@ -2028,7 +2027,7 @@ func TestReconciler(t *testing.T) {
 			},
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Active(false).
 					Queue("foo").
 					Condition(metav1.Condition{
@@ -2066,7 +2065,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check1",
 						State: kueue.CheckStateReady,
@@ -2149,7 +2148,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check1",
 						State: kueue.CheckStateReady,
@@ -2232,7 +2231,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check1",
 						State: kueue.CheckStateReady,
@@ -2317,7 +2316,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check",
 						State: kueue.CheckStateReady,
@@ -2382,7 +2381,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check1",
 						State: kueue.CheckStateReady,
@@ -2425,7 +2424,7 @@ func TestReconciler(t *testing.T) {
 			},
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					AdmissionCheck(kueue.AdmissionCheckState{
 						Name:  "check1",
 						State: kueue.CheckStateReady,
@@ -2487,12 +2486,12 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantEvents: []utiltesting.EventRecord{
@@ -2514,7 +2513,7 @@ func TestReconciler(t *testing.T) {
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
 					PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 5).Request(corev1.ResourceCPU, "1").Obj()).
-					Admitted(true).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantErr: jobframework.ErrNoMatchingWorkloads,
@@ -2576,8 +2575,8 @@ func TestReconciler(t *testing.T) {
 				*utiltestingapi.MakeWorkload("a", "ns").
 					Finalizers(kueue.ResourceInUseFinalizerName).
 					PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 10).SetMinimumCount(5).Request(corev1.ResourceCPU, "1").Obj()).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(8).Obj()).Obj()).
-					Admitted(true).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(8).Obj()).Obj(), now).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantWorkloads: []kueue.Workload{
@@ -2589,8 +2588,8 @@ func TestReconciler(t *testing.T) {
 							Request(corev1.ResourceCPU, "1").
 							Obj(),
 					).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(8).Obj()).Obj()).
-					Admitted(true).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(8).Obj()).Obj(), now).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantEvents: []utiltesting.EventRecord{
@@ -2623,8 +2622,8 @@ func TestReconciler(t *testing.T) {
 							Request(corev1.ResourceCPU, "1").
 							Obj(),
 					).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(8).Obj()).Obj()).
-					Admitted(true).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(8).Obj()).Obj(), now).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantErr: jobframework.ErrNoMatchingWorkloads,
@@ -2897,16 +2896,16 @@ func TestReconciler(t *testing.T) {
 			workloads: []kueue.Workload{
 				*utiltestingapi.MakeWorkload("unit-test", "ns").
 					PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 10).SetMinimumCount(5).Request(corev1.ResourceCPU, "1").Obj()).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj()).
-					Admitted(true).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj(), now).
+					AdmittedAt(true, now).
 					ControllerReference(batchv1.SchemeGroupVersion.WithKind("Job"), "parent", "parent-uid").
 					Obj(),
 			},
 			wantWorkloads: []kueue.Workload{
 				*utiltestingapi.MakeWorkload("unit-test", "ns").
 					PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 10).SetMinimumCount(5).Request(corev1.ResourceCPU, "1").Obj()).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj()).
-					Admitted(true).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj(), now).
+					AdmittedAt(true, now).
 					ControllerReference(batchv1.SchemeGroupVersion.WithKind("Job"), "parent", "parent-uid").
 					Obj(),
 			},
@@ -2977,18 +2976,18 @@ func TestReconciler(t *testing.T) {
 				*utiltestingapi.MakeWorkload("parent-workload", "ns").
 					Finalizers(kueue.ResourceInUseFinalizerName).
 					PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 10).SetMinimumCount(5).Request(corev1.ResourceCPU, "1").Obj()).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj()).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj(), now).
 					ControllerReference(batchv1.SchemeGroupVersion.WithKind("Job"), "parent", "parent-uid").
-					Admitted(true).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantWorkloads: []kueue.Workload{
 				*utiltestingapi.MakeWorkload("parent-workload", "ns").
 					Finalizers(kueue.ResourceInUseFinalizerName).
 					PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 10).SetMinimumCount(5).Request(corev1.ResourceCPU, "1").Obj()).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj()).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(utiltestingapi.MakePodSetAssignment(kueue.DefaultPodSetName).Count(10).Obj()).Obj(), now).
 					ControllerReference(batchv1.SchemeGroupVersion.WithKind("Job"), "parent", "parent-uid").
-					Admitted(true).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 		},
@@ -3011,8 +3010,8 @@ func TestReconciler(t *testing.T) {
 				*utiltestingapi.MakeWorkload("first-workload", "ns").
 					Finalizers(kueue.ResourceInUseFinalizerName).
 					PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 5).Request(corev1.ResourceCPU, "1").Obj()).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").Obj()).
-					Admitted(true).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").Obj(), now).
+					AdmittedAt(true, now).
 					Obj(),
 				*utiltestingapi.MakeWorkload("second-workload", "ns").
 					Finalizers(kueue.ResourceInUseFinalizerName).
@@ -3023,8 +3022,8 @@ func TestReconciler(t *testing.T) {
 				*utiltestingapi.MakeWorkload("first-workload", "ns").
 					Finalizers(kueue.ResourceInUseFinalizerName).
 					PodSets(*utiltestingapi.MakePodSet(kueue.DefaultPodSetName, 5).Request(corev1.ResourceCPU, "1").Obj()).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").Obj()).
-					Admitted(true).
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").Obj(), now).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantErr: jobframework.ErrExtraWorkloads,
@@ -3040,13 +3039,13 @@ func TestReconciler(t *testing.T) {
 		"when workload is evicted, suspend, reset startTime and restore node affinity": {
 			job: *baseJobWrapper.Clone().
 				Suspend(false).
-				StartTime(time.Now()).
+				StartTime(now).
 				NodeSelector("provisioning", "spot").
 				Active(10).
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Condition(metav1.Condition{
 						Type:   kueue.WorkloadEvicted,
 						Status: metav1.ConditionTrue,
@@ -3059,7 +3058,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Condition(metav1.Condition{
 						Type:   kueue.WorkloadEvicted,
 						Status: metav1.ConditionTrue,
@@ -3077,13 +3076,13 @@ func TestReconciler(t *testing.T) {
 		"when workload is evicted but suspended, reset startTime and restore node affinity": {
 			job: *baseJobWrapper.Clone().
 				Suspend(true).
-				StartTime(time.Now()).
+				StartTime(now).
 				NodeSelector("provisioning", "spot").
 				Active(10).
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Condition(metav1.Condition{
 						Type:   kueue.WorkloadEvicted,
 						Status: metav1.ConditionTrue,
@@ -3096,7 +3095,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Condition(metav1.Condition{
 						Type:   kueue.WorkloadEvicted,
 						Status: metav1.ConditionTrue,
@@ -3112,7 +3111,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Condition(metav1.Condition{
 						Type:   kueue.WorkloadEvicted,
 						Status: metav1.ConditionTrue,
@@ -3125,7 +3124,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Condition(metav1.Condition{
 						Type:   kueue.WorkloadEvicted,
 						Status: metav1.ConditionTrue,
@@ -3143,7 +3142,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(true).
+					AdmittedAt(true, now).
 					Generation(1).
 					Obj(),
 			},
@@ -3634,14 +3633,14 @@ func TestReconciler(t *testing.T) {
 						controllerconsts.JobUIDLabel: "",
 					}).
 					Priority(0).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(kueue.PodSetAssignment{
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(kueue.PodSetAssignment{
 						Name: kueue.DefaultPodSetName,
 						Flavors: map[corev1.ResourceName]kueue.ResourceFlavorReference{
 							corev1.ResourceCPU: "default",
 						},
 						Count: ptr.To[int32](10),
-					}).Obj()).
-					Admitted(true).
+					}).Obj(), now).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 			wantWorkloads: []kueue.Workload{
@@ -3663,14 +3662,14 @@ func TestReconciler(t *testing.T) {
 						controllerconsts.JobUIDLabel: "",
 					}).
 					Priority(0).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(kueue.PodSetAssignment{
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(kueue.PodSetAssignment{
 						Name: kueue.DefaultPodSetName,
 						Flavors: map[corev1.ResourceName]kueue.ResourceFlavorReference{
 							corev1.ResourceCPU: "default",
 						},
 						Count: ptr.To[int32](10),
-					}).Obj()).
-					Admitted(true).
+					}).Obj(), now).
+					AdmittedAt(true, now).
 					Obj(),
 			},
 		},
@@ -3705,13 +3704,13 @@ func TestReconciler(t *testing.T) {
 						controllerconsts.JobUIDLabel: "",
 					}).
 					Priority(0).
-					ReserveQuota(utiltestingapi.MakeAdmission("cq").PodSets(kueue.PodSetAssignment{
+					ReserveQuotaAt(utiltestingapi.MakeAdmission("cq").PodSets(kueue.PodSetAssignment{
 						Name: kueue.DefaultPodSetName,
 						Flavors: map[corev1.ResourceName]kueue.ResourceFlavorReference{
 							corev1.ResourceCPU: "default",
 						},
 						Count: ptr.To[int32](10),
-					}).Obj()).
+					}).Obj(), now).
 					Obj(),
 			},
 			wantEvents: []utiltesting.EventRecord{
@@ -3733,7 +3732,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(false).
+					AdmittedAt(false, now).
 					Active(false).
 					Queue("foo").
 					Condition(metav1.Condition{
@@ -3750,7 +3749,7 @@ func TestReconciler(t *testing.T) {
 			},
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(false).
+					AdmittedAt(false, now).
 					Active(false).
 					Queue("foo").
 					Condition(metav1.Condition{
@@ -3783,7 +3782,7 @@ func TestReconciler(t *testing.T) {
 				Obj(),
 			workloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(false).
+					AdmittedAt(false, now).
 					Active(false).
 					Queue("foo").
 					Condition(metav1.Condition{
@@ -3805,7 +3804,7 @@ func TestReconciler(t *testing.T) {
 			},
 			wantWorkloads: []kueue.Workload{
 				*baseWorkloadWrapper.Clone().
-					Admitted(false).
+					AdmittedAt(false, now).
 					Active(false).
 					Queue("foo").
 					Condition(metav1.Condition{
@@ -4010,7 +4009,8 @@ func TestReconciler(t *testing.T) {
 					}
 				}
 				recorder := &utiltesting.EventRecorder{}
-				reconciler, err := NewReconciler(ctx, kClient, indexer, recorder, append(tc.reconcilerOptions, jobframework.WithClock(fakeClock))...)
+				reconciler, err := NewReconciler(ctx, kClient, indexer, recorder,
+					append(tc.reconcilerOptions, jobframework.WithClock(testingclock.NewFakeClock(now)))...)
 				if err != nil {
 					t.Errorf("Error creating the reconciler: %v", err)
 				}
diff --git a/pkg/scheduler/preemption/preemption_hierarchical_test.go b/pkg/scheduler/preemption/preemption_hierarchical_test.go
index 0665f8cdd..05bcb41d7 100644
--- a/pkg/scheduler/preemption/preemption_hierarchical_test.go
+++ b/pkg/scheduler/preemption/preemption_hierarchical_test.go
@@ -1856,13 +1856,16 @@ func TestHierarchicalPreemptions(t *testing.T) {
 			wlInfo := workload.NewInfo(tc.incoming)
 			wlInfo.ClusterQueue = tc.targetCQ
 			targets := preemptor.GetTargets(log, *wlInfo, tc.assignment, snapshotWorkingCopy)
-			preempted, err := preemptor.IssuePreemptions(ctx, wlInfo, targets, snapshotWorkingCopy.ClusterQueue(wlInfo.ClusterQueue))
+			preempted, failed, err := preemptor.IssuePreemptions(ctx, wlInfo, targets, snapshotWorkingCopy.ClusterQueue(wlInfo.ClusterQueue))
 			if err != nil {
 				t.Fatalf("Failed doing preemption")
 			}
 			if preempted != tc.wantPreempted {
 				t.Errorf("Reported %d preemptions, want %d", preempted, tc.wantPreempted)
 			}
+			if failed != 0 {
+				t.Errorf("Reported %d failed preemptions, want 0", failed)
+			}
 
 			workloads := &kueue.WorkloadList{}
 			err = cl.List(ctx, workloads)
diff --git a/pkg/scheduler/preemption/preemption_test.go b/pkg/scheduler/preemption/preemption_test.go
index 26416d7dd..5c2ac177b 100644
--- a/pkg/scheduler/preemption/preemption_test.go
+++ b/pkg/scheduler/preemption/preemption_test.go
@@ -4144,13 +4144,16 @@ func TestPreemption(t *testing.T) {
 			wlInfo := workload.NewInfo(tc.incoming)
 			wlInfo.ClusterQueue = tc.targetCQ
 			targets := preemptor.GetTargets(log, *wlInfo, tc.assignment, snapshotWorkingCopy)
-			preempted, err := preemptor.IssuePreemptions(ctx, wlInfo, targets, snapshotWorkingCopy.ClusterQueue(wlInfo.ClusterQueue))
+			preempted, failed, err := preemptor.IssuePreemptions(ctx, wlInfo, targets, snapshotWorkingCopy.ClusterQueue(wlInfo.ClusterQueue))
 			if err != nil {
 				t.Fatalf("Failed doing preemption")
 			}
 			if preempted != tc.wantPreempted {
 				t.Errorf("Reported %d preemptions, want %d", preempted, tc.wantPreempted)
 			}
+			if failed != 0 {
+				t.Errorf("Reported %d failed preemptions, want 0", failed)
+			}
 
 			workloads := &kueue.WorkloadList{}
 			err = cl.List(ctx, workloads)
diff --git a/pkg/scheduler/scheduler_afs_test.go b/pkg/scheduler/scheduler_afs_test.go
index 3185cd79e..320579443 100644
--- a/pkg/scheduler/scheduler_afs_test.go
+++ b/pkg/scheduler/scheduler_afs_test.go
@@ -64,9 +64,9 @@ func TestScheduleForAFS(t *testing.T) {
 		*utiltestingapi.MakeLocalQueue("lq-a", "default").
 			FairSharing(&kueue.FairSharing{Weight: ptr.To(resource.MustParse("1"))}).
 			ClusterQueue("cq1").
-			FairSharingStatus(&kueue.FairSharingStatus{
+			FairSharingStatus(&kueue.LocalQueueFairSharingStatus{
 				WeightedShare: 1,
-				AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+				AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 					ConsumedResources: corev1.ResourceList{},
 				},
 			}).
@@ -74,9 +74,9 @@ func TestScheduleForAFS(t *testing.T) {
 		*utiltestingapi.MakeLocalQueue("lq-b", "default").
 			FairSharing(&kueue.FairSharing{Weight: ptr.To(resource.MustParse("1"))}).
 			ClusterQueue("cq1").
-			FairSharingStatus(&kueue.FairSharingStatus{
+			FairSharingStatus(&kueue.LocalQueueFairSharingStatus{
 				WeightedShare: 1,
-				AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+				AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 					ConsumedResources: corev1.ResourceList{},
 				},
 			}).
@@ -84,9 +84,9 @@ func TestScheduleForAFS(t *testing.T) {
 		*utiltestingapi.MakeLocalQueue("lq-c", "default").
 			FairSharing(&kueue.FairSharing{Weight: ptr.To(resource.MustParse("1"))}).
 			ClusterQueue("cq1").
-			FairSharingStatus(&kueue.FairSharingStatus{
+			FairSharingStatus(&kueue.LocalQueueFairSharingStatus{
 				WeightedShare: 1,
-				AdmissionFairSharingStatus: &kueue.AdmissionFairSharingStatus{
+				AdmissionFairSharingStatus: &kueue.LocalQueueAdmissionFairSharingStatus{
 					ConsumedResources: corev1.ResourceList{},
 				},
 			}).
diff --git a/pkg/util/taints/taints_test.go b/pkg/util/taints/taints_test.go
new file mode 100644
index 000000000..cee205d0e
--- /dev/null
+++ b/pkg/util/taints/taints_test.go
@@ -0,0 +1,65 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package taints
+
+import (
+	"testing"
+
+	corev1 "k8s.io/api/core/v1"
+)
+
+func TestTaintKeyExists(t *testing.T) {
+	testingTaints := []corev1.Taint{
+		{
+			Key:    "foo_1",
+			Value:  "bar_1",
+			Effect: corev1.TaintEffectNoExecute,
+		},
+		{
+			Key:    "foo_2",
+			Value:  "bar_2",
+			Effect: corev1.TaintEffectNoSchedule,
+		},
+	}
+
+	cases := []struct {
+		name            string
+		taintKeyToMatch string
+		expectedResult  bool
+	}{
+		{
+			name:            "taint key exists",
+			taintKeyToMatch: "foo_1",
+			expectedResult:  true,
+		},
+		{
+			name:            "taint key does not exist",
+			taintKeyToMatch: "foo_3",
+			expectedResult:  false,
+		},
+	}
+
+	for _, c := range cases {
+		t.Run(c.name, func(t *testing.T) {
+			result := TaintKeyExists(testingTaints, c.taintKeyToMatch)
+
+			if result != c.expectedResult {
+				t.Errorf("[%s] unexpected results: %v", c.name, result)
+			}
+		})
+	}
+}
diff --git a/pkg/util/testing/v1beta2/wrappers.go b/pkg/util/testing/v1beta2/wrappers.go
index d3dcf6715..4c610e28f 100644
--- a/pkg/util/testing/v1beta2/wrappers.go
+++ b/pkg/util/testing/v1beta2/wrappers.go
@@ -777,7 +777,7 @@ func (q *LocalQueueWrapper) Active(status metav1.ConditionStatus) *LocalQueueWra
 }
 
 // FairSharingStatus updates the fairSharing in status.
-func (q *LocalQueueWrapper) FairSharingStatus(status *kueue.FairSharingStatus) *LocalQueueWrapper {
+func (q *LocalQueueWrapper) FairSharingStatus(status *kueue.LocalQueueFairSharingStatus) *LocalQueueWrapper {
 	q.Status.FairSharing = status
 	return q
 }
@@ -1432,17 +1432,16 @@ func (mkc *MultiKueueClusterWrapper) Obj() *kueue.MultiKueueCluster {
 }
 
 func (mkc *MultiKueueClusterWrapper) KubeConfig(locationType kueue.LocationType, location string) *MultiKueueClusterWrapper {
-	mkc.Spec.KubeConfig = &kueue.KubeConfig{
+	mkc.Spec.ClusterSource.KubeConfig = &kueue.KubeConfig{
 		Location:     location,
 		LocationType: locationType,
 	}
 	return mkc
 }
 
-func (mkc *MultiKueueClusterWrapper) ClusterProfile(name string, namespace string) *MultiKueueClusterWrapper {
-	mkc.Spec.ClusterProfile = &kueue.ClusterProfileReference{
-		Name:      name,
-		Namespace: namespace,
+func (mkc *MultiKueueClusterWrapper) ClusterProfile(name string) *MultiKueueClusterWrapper {
+	mkc.Spec.ClusterSource.ClusterProfileRef = &kueue.ClusterProfileReference{
+		Name: name,
 	}
 	return mkc
 }
diff --git a/test/e2e/singlecluster/certs_test.go b/test/e2e/singlecluster/certs_test.go
new file mode 100644
index 000000000..eead4ffa4
--- /dev/null
+++ b/test/e2e/singlecluster/certs_test.go
@@ -0,0 +1,147 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package e2e
+
+import (
+	"github.com/onsi/ginkgo/v2"
+	"github.com/onsi/gomega"
+	admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
+	corev1 "k8s.io/api/core/v1"
+	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
+	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
+	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta2"
+	"sigs.k8s.io/kueue/test/util"
+)
+
+var _ = ginkgo.Describe("Kueue Certs", func() {
+	var (
+		ns             *corev1.Namespace
+		onDemandFlavor *kueue.ResourceFlavor
+		localQueue     *kueue.LocalQueue
+		clusterQueue   *kueue.ClusterQueue
+	)
+
+	var (
+		mvcKey           = client.ObjectKey{Name: "kueue-mutating-webhook-configuration"}
+		localQueueCRDKey = client.ObjectKey{Name: "localqueues.kueue.x-k8s.io"}
+	)
+
+	ginkgo.BeforeEach(func() {
+		ns = util.CreateNamespaceFromPrefixWithLog(ctx, k8sClient, "e2e-certs-")
+		onDemandFlavor = utiltestingapi.MakeResourceFlavor("on-demand").
+			NodeLabel("instance-type", "on-demand").Obj()
+		util.MustCreate(ctx, k8sClient, onDemandFlavor)
+		clusterQueue = utiltestingapi.MakeClusterQueue("cluster-queue").
+			ResourceGroup(
+				*utiltestingapi.MakeFlavorQuotas("on-demand").
+					Resource(corev1.ResourceCPU, "1").
+					Resource(corev1.ResourceMemory, "1Gi").
+					Obj(),
+			).
+			Obj()
+		util.MustCreate(ctx, k8sClient, clusterQueue)
+		util.ExpectClusterQueuesToBeActive(ctx, k8sClient, clusterQueue)
+
+		localQueue = utiltestingapi.MakeLocalQueue("main", ns.Name).ClusterQueue("cluster-queue").Obj()
+		util.MustCreate(ctx, k8sClient, localQueue)
+		util.ExpectLocalQueuesToBeActive(ctx, k8sClient, localQueue)
+	})
+
+	ginkgo.AfterEach(func() {
+		gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
+		util.ExpectObjectToBeDeleted(ctx, k8sClient, clusterQueue, true)
+		util.ExpectObjectToBeDeleted(ctx, k8sClient, onDemandFlavor, true)
+	})
+
+	ginkgo.It("should rotate the certificates for the CRD resources", func() {
+		localQueueCRD := &apiextensionsv1.CustomResourceDefinition{}
+		ginkgo.By("verify the caBundle is set after startup for CRD", func() {
+			gomega.Expect(k8sClient.Get(ctx, localQueueCRDKey, localQueueCRD)).To(gomega.Succeed())
+
+			caBundle := localQueueCRD.Spec.Conversion.Webhook.ClientConfig.CABundle
+			gomega.Expect(caBundle).NotTo(gomega.BeEmpty())
+		})
+
+		ginkgo.By("verify the caBundle is set after startup for webhooks", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				mwc := &admissionregistrationv1.MutatingWebhookConfiguration{}
+				g.Expect(k8sClient.Get(ctx, client.ObjectKey{Name: "kueue-mutating-webhook-configuration"}, mwc)).To(gomega.Succeed())
+				for _, webhook := range mwc.Webhooks {
+					g.Expect(webhook.ClientConfig.CABundle).ToNot(gomega.BeEmpty())
+				}
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("clear the caBundle field", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(k8sClient.Get(ctx, localQueueCRDKey, localQueueCRD)).Should(gomega.Succeed())
+				localQueueCRD.Spec.Conversion.Webhook.ClientConfig.CABundle = nil
+				g.Expect(k8sClient.Update(ctx, localQueueCRD)).Should(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("clear the caBundle fields for webhooks", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				mwc := &admissionregistrationv1.MutatingWebhookConfiguration{}
+				g.Expect(k8sClient.Get(ctx, mvcKey, mwc)).To(gomega.Succeed())
+				for _, webhook := range mwc.Webhooks {
+					webhook.ClientConfig.CABundle = nil
+				}
+				g.Expect(k8sClient.Update(ctx, mwc)).Should(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("verify the caBundle is set again for CRD", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(k8sClient.Get(ctx, localQueueCRDKey, localQueueCRD)).To(gomega.Succeed())
+
+				caBundle := localQueueCRD.Spec.Conversion.Webhook.ClientConfig.CABundle
+				g.Expect(caBundle).NotTo(gomega.BeEmpty())
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("verify the caBundle is set again for mutating webhooks", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				mwc := &admissionregistrationv1.MutatingWebhookConfiguration{}
+				g.Expect(k8sClient.Get(ctx, mvcKey, mwc)).To(gomega.Succeed())
+				for _, webhook := range mwc.Webhooks {
+					g.Expect(webhook.ClientConfig.CABundle).ToNot(gomega.BeEmpty())
+				}
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("verify the localQueue can be fetched and mutated", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(localQueue), localQueue)).To(gomega.Succeed())
+				localQueue.Spec.StopPolicy = ptr.To(kueue.Hold)
+				g.Expect(k8sClient.Update(ctx, localQueue)).Should(gomega.Succeed())
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("revert the LocalQueue change", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(localQueue), localQueue)).To(gomega.Succeed())
+				g.Expect(localQueue.Spec.StopPolicy).Should(gomega.Equal(ptr.To(kueue.Hold)))
+				localQueue.Spec.StopPolicy = ptr.To(kueue.None)
+				g.Expect(k8sClient.Update(ctx, localQueue)).Should(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+	})
+})
diff --git a/test/integration/framework/framework.go b/test/integration/framework/framework.go
index 58dadf7c0..8b1a83fc4 100644
--- a/test/integration/framework/framework.go
+++ b/test/integration/framework/framework.go
@@ -58,6 +58,14 @@ import (
 
 type ManagerSetup func(context.Context, manager.Manager)
 
+type ManagerOption func(*manager.Options)
+
+func WithNewClient(c client.NewClientFunc) ManagerOption {
+	return func(o *manager.Options) {
+		o.NewClient = c
+	}
+}
+
 type Framework struct {
 	DepCRDPaths            []string
 	WebhookPath            string
@@ -116,7 +124,7 @@ func (f *Framework) Init() *rest.Config {
 	return cfg
 }
 
-func (f *Framework) SetupClient(cfg *rest.Config) (context.Context, client.Client) {
+func (f *Framework) SetupClient(cfg *rest.Config) (context.Context, client.WithWatch) {
 	err := config.AddToScheme(f.scheme)
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 
@@ -150,7 +158,7 @@ func (f *Framework) SetupClient(cfg *rest.Config) (context.Context, client.Clien
 	err = resourcev1.AddToScheme(f.scheme)
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 
-	k8sClient, err := client.New(cfg, client.Options{Scheme: f.scheme})
+	k8sClient, err := client.NewWithWatch(cfg, client.Options{Scheme: f.scheme})
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 	gomega.ExpectWithOffset(1, k8sClient).NotTo(gomega.BeNil())
 
@@ -160,10 +168,10 @@ func (f *Framework) SetupClient(cfg *rest.Config) (context.Context, client.Clien
 	return ctx, k8sClient
 }
 
-func (f *Framework) StartManager(ctx context.Context, cfg *rest.Config, managerSetup ManagerSetup) {
+func (f *Framework) StartManager(ctx context.Context, cfg *rest.Config, managerSetup ManagerSetup, opts ...ManagerOption) {
 	ginkgo.By("starting the manager", func() {
 		webhookInstallOptions := &f.testEnv.WebhookInstallOptions
-		mgrOpts := manager.Options{
+		mgrOptions := manager.Options{
 			Scheme: f.scheme,
 			Metrics: metricsserver.Options{
 				BindAddress: "0", // disable metrics to avoid conflicts between packages.
@@ -178,7 +186,10 @@ func (f *Framework) StartManager(ctx context.Context, cfg *rest.Config, managerS
 				SkipNameValidation: ptr.To(true),
 			},
 		}
-		mgr, err := ctrl.NewManager(cfg, mgrOpts)
+		for _, opt := range opts {
+			opt(&mgrOptions)
+		}
+		mgr, err := ctrl.NewManager(cfg, mgrOptions)
 		gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred(), "failed to create manager")
 
 		managerCtx, managerCancel := context.WithCancel(ctx)
diff --git a/test/integration/multikueue/cluster_role_sharing_test.go b/test/integration/multikueue/cluster_role_sharing_test.go
new file mode 100644
index 000000000..0d4f1717f
--- /dev/null
+++ b/test/integration/multikueue/cluster_role_sharing_test.go
@@ -0,0 +1,610 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package multikueue
+
+import (
+	"context"
+	"time"
+
+	kftraining "github.com/kubeflow/training-operator/pkg/apis/kubeflow.org/v1"
+	"github.com/onsi/ginkgo/v2"
+	"github.com/onsi/gomega"
+	batchv1 "k8s.io/api/batch/v1"
+	corev1 "k8s.io/api/core/v1"
+	apimeta "k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/utils/ptr"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+
+	config "sigs.k8s.io/kueue/apis/config/v1beta2"
+	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
+	workloadjob "sigs.k8s.io/kueue/pkg/controller/jobs/job"
+	"sigs.k8s.io/kueue/pkg/features"
+	"sigs.k8s.io/kueue/pkg/util/admissioncheck"
+	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
+	utiltestingapi "sigs.k8s.io/kueue/pkg/util/testing/v1beta2"
+	testingjob "sigs.k8s.io/kueue/pkg/util/testingjobs/job"
+	"sigs.k8s.io/kueue/test/util"
+)
+
+// We test the interoperability of the Cluster Queues, where one is dedicated to manager Non-MultiKueue workloads
+// and the other one to MultiKueue workloads, both sharing the same namespace.
+// This will be tested on both manager and one of the worker clusters.
+// We assume this type of Cluster role sharing is possible.
+var _ = ginkgo.Describe("MultiKueue Cluster Role Sharing", ginkgo.Ordered, ginkgo.ContinueOnFailure, func() {
+	var (
+		managerNs *corev1.Namespace
+		worker1Ns *corev1.Namespace
+		worker2Ns *corev1.Namespace
+
+		managerMultiKueueSecret1 *corev1.Secret
+		managerMultiKueueSecret2 *corev1.Secret
+		workerCluster1           *kueue.MultiKueueCluster
+		workerCluster2           *kueue.MultiKueueCluster
+		managerMultiKueueConfig  *kueue.MultiKueueConfig
+
+		multiKueueAC *kueue.AdmissionCheck
+		managerAC    *kueue.AdmissionCheck
+		worker1AC    *kueue.AdmissionCheck
+
+		// MultiKueue Cluster Queues and Local Queues
+		managerMkCq *kueue.ClusterQueue
+		managerMkLq *kueue.LocalQueue
+		worker1MkCq *kueue.ClusterQueue
+		worker1MkLq *kueue.LocalQueue
+		worker2MkCq *kueue.ClusterQueue
+		worker2MkLq *kueue.LocalQueue
+
+		// Non-MultiKueue Cluster Queues and Local Queues
+		managerCq *kueue.ClusterQueue
+		managerLq *kueue.LocalQueue
+		worker1Cq *kueue.ClusterQueue
+		worker1Lq *kueue.LocalQueue
+	)
+
+	ginkgo.BeforeAll(func() {
+		managerTestCluster.fwk.StartManager(managerTestCluster.ctx, managerTestCluster.cfg, func(ctx context.Context, mgr manager.Manager) {
+			managerAndMultiKueueSetup(ctx, mgr, 2*time.Second, defaultEnabledIntegrations, config.MultiKueueDispatcherModeAllAtOnce)
+		})
+	})
+
+	ginkgo.AfterAll(func() {
+		managerTestCluster.fwk.StopManager(managerTestCluster.ctx)
+	})
+
+	ginkgo.BeforeEach(func() {
+		managerNs = util.CreateNamespaceFromPrefixWithLog(managerTestCluster.ctx, managerTestCluster.client, "multikueue-")
+		worker1Ns = util.CreateNamespaceWithLog(worker1TestCluster.ctx, worker1TestCluster.client, managerNs.Name)
+		worker2Ns = util.CreateNamespaceWithLog(worker2TestCluster.ctx, worker2TestCluster.client, managerNs.Name)
+
+		w1Kubeconfig, err := worker1TestCluster.kubeConfigBytes()
+		gomega.Expect(err).NotTo(gomega.HaveOccurred())
+
+		w2Kubeconfig, err := worker2TestCluster.kubeConfigBytes()
+		gomega.Expect(err).NotTo(gomega.HaveOccurred())
+
+		managerMultiKueueSecret1 = &corev1.Secret{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "multikueue1",
+				Namespace: managersConfigNamespace.Name,
+			},
+			Data: map[string][]byte{
+				kueue.MultiKueueConfigSecretKey: w1Kubeconfig,
+			},
+		}
+		util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, managerMultiKueueSecret1)
+
+		managerMultiKueueSecret2 = &corev1.Secret{
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "multikueue2",
+				Namespace: managersConfigNamespace.Name,
+			},
+			Data: map[string][]byte{
+				kueue.MultiKueueConfigSecretKey: w2Kubeconfig,
+			},
+		}
+		util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, managerMultiKueueSecret2)
+
+		workerCluster1 = utiltestingapi.MakeMultiKueueCluster("worker1").KubeConfig(kueue.SecretLocationType, managerMultiKueueSecret1.Name).Obj()
+		util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, workerCluster1)
+
+		workerCluster2 = utiltestingapi.MakeMultiKueueCluster("worker2").KubeConfig(kueue.SecretLocationType, managerMultiKueueSecret2.Name).Obj()
+		util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, workerCluster2)
+
+		managerMultiKueueConfig = utiltestingapi.MakeMultiKueueConfig("multikueueconfig").Clusters(workerCluster1.Name, workerCluster2.Name).Obj()
+		util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, managerMultiKueueConfig)
+
+		// MultiKueue setup
+		ginkgo.By("Creating and initializing MultiKueue specific resources", func() {
+			multiKueueAC = utiltestingapi.MakeAdmissionCheck("ac1").
+				ControllerName(kueue.MultiKueueControllerName).
+				Parameters(kueue.GroupVersion.Group, "MultiKueueConfig", managerMultiKueueConfig.Name).
+				Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, multiKueueAC)
+
+			ginkgo.By("wait for check active", func() {
+				updatedAc := kueue.AdmissionCheck{}
+				acKey := client.ObjectKeyFromObject(multiKueueAC)
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, acKey, &updatedAc)).To(gomega.Succeed())
+					g.Expect(updatedAc.Status.Conditions).To(utiltesting.HaveConditionStatusTrue(kueue.AdmissionCheckActive))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			managerMkCq = utiltestingapi.MakeClusterQueue("q1").
+				AdmissionChecks(kueue.AdmissionCheckReference(multiKueueAC.Name)).
+				Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, managerMkCq)
+			util.ExpectClusterQueuesToBeActive(managerTestCluster.ctx, managerTestCluster.client, managerMkCq)
+
+			managerMkLq = utiltestingapi.MakeLocalQueue(managerMkCq.Name, managerNs.Name).ClusterQueue(managerMkCq.Name).Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, managerMkLq)
+			util.ExpectLocalQueuesToBeActive(managerTestCluster.ctx, managerTestCluster.client, managerMkLq)
+
+			worker1MkCq = utiltestingapi.MakeClusterQueue("q1").Obj()
+			util.MustCreate(worker1TestCluster.ctx, worker1TestCluster.client, worker1MkCq)
+			util.ExpectClusterQueuesToBeActive(worker1TestCluster.ctx, worker1TestCluster.client, worker1MkCq)
+			worker1MkLq = utiltestingapi.MakeLocalQueue(worker1MkCq.Name, worker1Ns.Name).ClusterQueue(worker1MkCq.Name).Obj()
+			util.MustCreate(worker1TestCluster.ctx, worker1TestCluster.client, worker1MkLq)
+			util.ExpectLocalQueuesToBeActive(worker1TestCluster.ctx, worker1TestCluster.client, worker1MkLq)
+
+			worker2MkCq = utiltestingapi.MakeClusterQueue("q1").Obj()
+			util.MustCreate(worker2TestCluster.ctx, worker2TestCluster.client, worker2MkCq)
+			util.ExpectClusterQueuesToBeActive(worker2TestCluster.ctx, worker2TestCluster.client, worker2MkCq)
+			worker2MkLq = utiltestingapi.MakeLocalQueue(worker2MkCq.Name, worker2Ns.Name).ClusterQueue(worker2MkCq.Name).Obj()
+			util.MustCreate(worker2TestCluster.ctx, worker2TestCluster.client, worker2MkLq)
+			util.ExpectLocalQueuesToBeActive(worker2TestCluster.ctx, worker2TestCluster.client, worker2MkLq)
+		})
+
+		// Regular Kueue setup
+		ginkgo.By("Creating and initializing regular Kueue resources (Non MultiKueue)", func() {
+			managerAC = utiltestingapi.MakeAdmissionCheck("manager-ac").
+				ControllerName("kueue-controller").
+				Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, managerAC)
+			util.SetAdmissionCheckActive(managerTestCluster.ctx, managerTestCluster.client, managerAC, metav1.ConditionTrue)
+
+			ginkgo.By("wait for check active", func() {
+				updatedAc := kueue.AdmissionCheck{}
+				acKey := client.ObjectKeyFromObject(managerAC)
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, acKey, &updatedAc)).To(gomega.Succeed())
+					g.Expect(updatedAc.Status.Conditions).To(utiltesting.HaveConditionStatusTrue(kueue.AdmissionCheckActive))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			worker1AC = utiltestingapi.MakeAdmissionCheck("worker1-ac").
+				ControllerName("kueue-controller").
+				Obj()
+			util.MustCreate(worker1TestCluster.ctx, worker1TestCluster.client, worker1AC)
+			util.SetAdmissionCheckActive(worker1TestCluster.ctx, worker1TestCluster.client, worker1AC, metav1.ConditionTrue)
+
+			ginkgo.By("wait for check active", func() {
+				updatedAc := kueue.AdmissionCheck{}
+				acKey := client.ObjectKeyFromObject(worker1AC)
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, acKey, &updatedAc)).To(gomega.Succeed())
+					g.Expect(updatedAc.Status.Conditions).To(utiltesting.HaveConditionStatusTrue(kueue.AdmissionCheckActive))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			managerCq = utiltestingapi.MakeClusterQueue("q2").Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, managerCq)
+			util.ExpectClusterQueuesToBeActive(managerTestCluster.ctx, managerTestCluster.client, managerCq)
+			managerLq = utiltestingapi.MakeLocalQueue(managerCq.Name, managerNs.Name).ClusterQueue(managerCq.Name).Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, managerLq)
+			util.ExpectLocalQueuesToBeActive(managerTestCluster.ctx, managerTestCluster.client, managerLq)
+
+			worker1Cq = utiltestingapi.MakeClusterQueue("q2").Obj()
+			util.MustCreate(worker1TestCluster.ctx, worker1TestCluster.client, worker1Cq)
+			util.ExpectClusterQueuesToBeActive(worker1TestCluster.ctx, worker1TestCluster.client, worker1Cq)
+			worker1Lq = utiltestingapi.MakeLocalQueue(worker1Cq.Name, worker1Ns.Name).ClusterQueue(worker1Cq.Name).Obj()
+			util.MustCreate(worker1TestCluster.ctx, worker1TestCluster.client, worker1Lq)
+			util.ExpectLocalQueuesToBeActive(worker1TestCluster.ctx, worker1TestCluster.client, worker1Lq)
+		})
+	})
+
+	ginkgo.AfterEach(func() {
+		gomega.Expect(util.DeleteNamespace(managerTestCluster.ctx, managerTestCluster.client, managerNs)).To(gomega.Succeed())
+		gomega.Expect(util.DeleteNamespace(worker1TestCluster.ctx, worker1TestCluster.client, worker1Ns)).To(gomega.Succeed())
+		gomega.Expect(util.DeleteNamespace(worker2TestCluster.ctx, worker2TestCluster.client, worker2Ns)).To(gomega.Succeed())
+
+		util.ExpectObjectToBeDeleted(worker1TestCluster.ctx, worker1TestCluster.client, worker1AC, true)
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, managerAC, true)
+
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, managerMkCq, true)
+		util.ExpectObjectToBeDeleted(worker1TestCluster.ctx, worker1TestCluster.client, worker1MkCq, true)
+		util.ExpectObjectToBeDeleted(worker2TestCluster.ctx, worker2TestCluster.client, worker2MkCq, true)
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, managerCq, true)
+		util.ExpectObjectToBeDeleted(worker1TestCluster.ctx, worker1TestCluster.client, worker1Cq, true)
+
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, multiKueueAC, true)
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, managerMultiKueueConfig, true)
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, workerCluster1, true)
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, workerCluster2, true)
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, managerMultiKueueSecret1, true)
+		util.ExpectObjectToBeDeleted(managerTestCluster.ctx, managerTestCluster.client, managerMultiKueueSecret2, true)
+	})
+
+	ginkgo.It("Share worker cluster between MultiKueue and regular Kueue", func() {
+		features.SetFeatureGateDuringTest(ginkgo.GinkgoTB(), features.MultiKueueBatchJobWithManagedBy, true)
+
+		var jobMk, jobNonMk *batchv1.Job
+		ginkgo.By("creating the jobs in the management cluster for MultiKueue and non-MultiKueue Cluster Queues", func() {
+			jobMk = testingjob.MakeJob("job-mk", managerNs.Name).
+				ManagedBy(kueue.MultiKueueControllerName).
+				Queue(kueue.LocalQueueName(managerMkLq.Name)).
+				Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, jobMk)
+
+			jobNonMk = testingjob.MakeJob("job-kueue", worker1Ns.Name).
+				Queue(kueue.LocalQueueName(worker1Lq.Name)).
+				Obj()
+			util.MustCreate(worker1TestCluster.ctx, worker1TestCluster.client, jobNonMk)
+		})
+
+		wlMkLookupKey := types.NamespacedName{Name: workloadjob.GetWorkloadNameForJob(jobMk.Name, jobMk.UID), Namespace: managerNs.Name}
+		wlNonMkLookupKey := types.NamespacedName{Name: workloadjob.GetWorkloadNameForJob(jobNonMk.Name, jobNonMk.UID), Namespace: worker1Ns.Name}
+
+		ginkgo.By("setting multikueue workload reservation in the management cluster", func() {
+			admission := utiltestingapi.MakeAdmission(managerMkCq.Name).Obj()
+			util.SetQuotaReservation(managerTestCluster.ctx, managerTestCluster.client, wlMkLookupKey, admission)
+		})
+
+		ginkgo.By("setting non multikueue workload reservation in the worker1 cluster", func() {
+			admission := utiltestingapi.MakeAdmission(worker1Cq.Name).Obj()
+			util.SetQuotaReservation(worker1TestCluster.ctx, worker1TestCluster.client, wlNonMkLookupKey, admission)
+		})
+
+		createdMkWorkload := &kueue.Workload{}
+		createdNonMkWorkload := &kueue.Workload{}
+		ginkgo.By("checking the multikueue workload creation in the worker clusters", func() {
+			managerWl := &kueue.Workload{}
+			gomega.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, wlMkLookupKey, managerWl)).To(gomega.Succeed())
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, wlMkLookupKey, createdMkWorkload)).To(gomega.Succeed())
+				g.Expect(createdMkWorkload.Spec).To(gomega.BeComparableTo(managerWl.Spec))
+				g.Expect(worker2TestCluster.client.Get(worker2TestCluster.ctx, wlMkLookupKey, createdMkWorkload)).To(gomega.Succeed())
+				g.Expect(createdMkWorkload.Spec).To(gomega.BeComparableTo(managerWl.Spec))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("checking the non multikueue workload creation in the worker1 cluster", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, wlNonMkLookupKey, createdNonMkWorkload)).To(gomega.Succeed())
+				g.Expect(createdNonMkWorkload.Status.Conditions).Should(utiltesting.HaveCondition(kueue.WorkloadQuotaReserved))
+				g.Expect(createdNonMkWorkload.Status.Conditions).Should(utiltesting.HaveCondition(kueue.WorkloadAdmitted))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("setting workload reservation in worker1, AC state is updated in manager and worker2 wl is removed", func() {
+			admission := utiltestingapi.MakeAdmission(managerMkCq.Name).Obj()
+			util.SetQuotaReservation(worker1TestCluster.ctx, worker1TestCluster.client, wlMkLookupKey, admission)
+
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, wlMkLookupKey, createdMkWorkload)).To(gomega.Succeed())
+				acs := admissioncheck.FindAdmissionCheck(createdMkWorkload.Status.AdmissionChecks, kueue.AdmissionCheckReference(multiKueueAC.Name))
+				g.Expect(acs).NotTo(gomega.BeNil())
+				g.Expect(acs.State).To(gomega.Equal(kueue.CheckStateReady))
+				g.Expect(acs.Message).To(gomega.Equal(`The workload got reservation on "worker1"`))
+				ok, err := utiltesting.HasEventAppeared(managerTestCluster.ctx, managerTestCluster.client, corev1.Event{
+					Reason:  "MultiKueue",
+					Type:    corev1.EventTypeNormal,
+					Message: `The workload got reservation on "worker1"`,
+				})
+				g.Expect(err).NotTo(gomega.HaveOccurred())
+				g.Expect(ok).To(gomega.BeTrue())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(worker2TestCluster.client.Get(worker2TestCluster.ctx, wlMkLookupKey, createdMkWorkload)).To(utiltesting.BeNotFoundError())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("updating the multikueue worker job status", func() {
+			startTime := metav1.NewTime(time.Now().Truncate(time.Second))
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, client.ObjectKeyFromObject(jobMk), &createdJob)).To(gomega.Succeed())
+				createdJob.Status.StartTime = &startTime
+				createdJob.Status.Active = 1
+				createdJob.Status.Ready = ptr.To[int32](1)
+				g.Expect(worker1TestCluster.client.Status().Update(worker1TestCluster.ctx, &createdJob)).To(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(jobMk), &createdJob)).To(gomega.Succeed())
+				g.Expect(ptr.Deref(createdJob.Status.StartTime, metav1.Time{})).To(gomega.Equal(startTime))
+				g.Expect(ptr.Deref(createdJob.Status.Ready, 0)).To(gomega.Equal(int32(1)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("updating the regular worker job status", func() {
+			startTime := metav1.NewTime(time.Now().Truncate(time.Second))
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, client.ObjectKeyFromObject(jobNonMk), &createdJob)).To(gomega.Succeed())
+				createdJob.Status.StartTime = &startTime
+				createdJob.Status.Active = 1
+				createdJob.Status.Ready = ptr.To[int32](1)
+				g.Expect(worker1TestCluster.client.Status().Update(worker1TestCluster.ctx, &createdJob)).To(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		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,
+		}
+		ginkgo.By("finishing the multikueue worker job", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, client.ObjectKeyFromObject(jobMk), &createdJob)).To(gomega.Succeed())
+				createdJob.Status.Conditions = append(createdJob.Status.Conditions,
+					batchv1.JobCondition{
+						Type:               batchv1.JobSuccessCriteriaMet,
+						Status:             corev1.ConditionTrue,
+						LastProbeTime:      now,
+						LastTransitionTime: now,
+						Message:            reachedPodsReason,
+					}, completedJobCondition)
+				createdJob.Status.Active = 0
+				createdJob.Status.Ready = ptr.To[int32](0)
+				createdJob.Status.Succeeded = 1
+				createdJob.Status.CompletionTime = ptr.To(now)
+				g.Expect(worker1TestCluster.client.Status().Update(worker1TestCluster.ctx, &createdJob)).To(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			waitForWorkloadToFinishAndRemoteWorkloadToBeDeleted(wlMkLookupKey, finishJobReason)
+
+			// Assert job complete condition.
+			localJob := &batchv1.Job{}
+			gomega.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(jobMk), 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))))
+		})
+
+		ginkgo.By("finishing the regular worker job", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, client.ObjectKeyFromObject(jobNonMk), &createdJob)).To(gomega.Succeed())
+				createdJob.Status.Conditions = append(createdJob.Status.Conditions,
+					batchv1.JobCondition{
+						Type:               batchv1.JobSuccessCriteriaMet,
+						Status:             corev1.ConditionTrue,
+						LastProbeTime:      now,
+						LastTransitionTime: now,
+						Message:            reachedPodsReason,
+					}, completedJobCondition)
+				createdJob.Status.Active = 0
+				createdJob.Status.Ready = ptr.To[int32](0)
+				createdJob.Status.Succeeded = 1
+				createdJob.Status.CompletionTime = ptr.To(now)
+				g.Expect(worker1TestCluster.client.Status().Update(worker1TestCluster.ctx, &createdJob)).To(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdWorkload := &kueue.Workload{}
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, wlNonMkLookupKey, createdWorkload)).To(gomega.Succeed())
+				g.Expect(apimeta.FindStatusCondition(createdWorkload.Status.Conditions, kueue.WorkloadFinished)).To(gomega.BeComparableTo(&metav1.Condition{
+					Type:    kueue.WorkloadFinished,
+					Status:  metav1.ConditionTrue,
+					Reason:  string(kftraining.JobSucceeded),
+					Message: finishJobReason,
+				}, util.IgnoreConditionTimestampsAndObservedGeneration))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+	})
+
+	ginkgo.It("Share manager cluster between MultiKueue and regular Kueue", func() {
+		features.SetFeatureGateDuringTest(ginkgo.GinkgoTB(), features.MultiKueueBatchJobWithManagedBy, true)
+
+		var jobMk, jobNonMk *batchv1.Job
+		ginkgo.By("creating the jobs in the management cluster for MultiKueue and non-MultiKueue Cluster Queues", func() {
+			jobMk = testingjob.MakeJob("job-mk", managerNs.Name).
+				ManagedBy(kueue.MultiKueueControllerName).
+				Queue(kueue.LocalQueueName(managerMkLq.Name)).
+				Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, jobMk)
+
+			jobNonMk = testingjob.MakeJob("job-kueue", managerNs.Name).
+				Queue(kueue.LocalQueueName(managerLq.Name)).
+				Obj()
+			util.MustCreate(managerTestCluster.ctx, managerTestCluster.client, jobNonMk)
+		})
+
+		wlMkLookupKey := types.NamespacedName{Name: workloadjob.GetWorkloadNameForJob(jobMk.Name, jobMk.UID), Namespace: managerNs.Name}
+		wlNonMkLookupKey := types.NamespacedName{Name: workloadjob.GetWorkloadNameForJob(jobNonMk.Name, jobNonMk.UID), Namespace: managerNs.Name}
+
+		ginkgo.By("setting multikueue workload reservation in the management cluster", func() {
+			admission := utiltestingapi.MakeAdmission(managerMkCq.Name).Obj()
+			util.SetQuotaReservation(managerTestCluster.ctx, managerTestCluster.client, wlMkLookupKey, admission)
+		})
+
+		ginkgo.By("setting non multikueue workload reservation in the worker1 cluster", func() {
+			admission := utiltestingapi.MakeAdmission(managerCq.Name).Obj()
+			util.SetQuotaReservation(managerTestCluster.ctx, managerTestCluster.client, wlNonMkLookupKey, admission)
+		})
+
+		createdMkWorkload := &kueue.Workload{}
+		createdNonMkWorkload := &kueue.Workload{}
+		ginkgo.By("checking the multikueue workload creation in the worker clusters", func() {
+			managerWl := &kueue.Workload{}
+			gomega.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, wlMkLookupKey, managerWl)).To(gomega.Succeed())
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, wlMkLookupKey, createdMkWorkload)).To(gomega.Succeed())
+				g.Expect(createdMkWorkload.Spec).To(gomega.BeComparableTo(managerWl.Spec))
+				g.Expect(worker2TestCluster.client.Get(worker2TestCluster.ctx, wlMkLookupKey, createdMkWorkload)).To(gomega.Succeed())
+				g.Expect(createdMkWorkload.Spec).To(gomega.BeComparableTo(managerWl.Spec))
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("checking the non multikueue workload creation in the manager cluster", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, wlNonMkLookupKey, createdNonMkWorkload)).To(gomega.Succeed())
+				g.Expect(createdNonMkWorkload.Status.Conditions).Should(utiltesting.HaveCondition(kueue.WorkloadQuotaReserved))
+				g.Expect(createdNonMkWorkload.Status.Conditions).Should(utiltesting.HaveCondition(kueue.WorkloadAdmitted))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("setting workload reservation in worker1, AC state is updated in manager and worker2 wl is removed", func() {
+			admission := utiltestingapi.MakeAdmission(managerMkCq.Name).Obj()
+			util.SetQuotaReservation(worker1TestCluster.ctx, worker1TestCluster.client, wlMkLookupKey, admission)
+
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, wlMkLookupKey, createdMkWorkload)).To(gomega.Succeed())
+				acs := admissioncheck.FindAdmissionCheck(createdMkWorkload.Status.AdmissionChecks, kueue.AdmissionCheckReference(multiKueueAC.Name))
+				g.Expect(acs).NotTo(gomega.BeNil())
+				g.Expect(acs.State).To(gomega.Equal(kueue.CheckStateReady))
+				g.Expect(acs.Message).To(gomega.Equal(`The workload got reservation on "worker1"`))
+				ok, err := utiltesting.HasEventAppeared(managerTestCluster.ctx, managerTestCluster.client, corev1.Event{
+					Reason:  "MultiKueue",
+					Type:    corev1.EventTypeNormal,
+					Message: `The workload got reservation on "worker1"`,
+				})
+				g.Expect(err).NotTo(gomega.HaveOccurred())
+				g.Expect(ok).To(gomega.BeTrue())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(worker2TestCluster.client.Get(worker2TestCluster.ctx, wlMkLookupKey, createdMkWorkload)).To(utiltesting.BeNotFoundError())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("updating the multikueue manager job status", func() {
+			startTime := metav1.NewTime(time.Now().Truncate(time.Second))
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, client.ObjectKeyFromObject(jobMk), &createdJob)).To(gomega.Succeed())
+				createdJob.Status.StartTime = &startTime
+				createdJob.Status.Active = 1
+				createdJob.Status.Ready = ptr.To[int32](1)
+				g.Expect(worker1TestCluster.client.Status().Update(worker1TestCluster.ctx, &createdJob)).To(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(jobMk), &createdJob)).To(gomega.Succeed())
+				g.Expect(ptr.Deref(createdJob.Status.StartTime, metav1.Time{})).To(gomega.Equal(startTime))
+				g.Expect(ptr.Deref(createdJob.Status.Ready, 0)).To(gomega.Equal(int32(1)))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		ginkgo.By("updating the regular worker job status", func() {
+			startTime := metav1.NewTime(time.Now().Truncate(time.Second))
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(jobNonMk), &createdJob)).To(gomega.Succeed())
+				createdJob.Status.StartTime = &startTime
+				createdJob.Status.Active = 1
+				createdJob.Status.Ready = ptr.To[int32](1)
+				g.Expect(managerTestCluster.client.Status().Update(managerTestCluster.ctx, &createdJob)).To(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		})
+
+		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,
+		}
+		ginkgo.By("finishing the multikueue worker job", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(worker1TestCluster.client.Get(worker1TestCluster.ctx, client.ObjectKeyFromObject(jobMk), &createdJob)).To(gomega.Succeed())
+				createdJob.Status.Conditions = append(createdJob.Status.Conditions,
+					batchv1.JobCondition{
+						Type:               batchv1.JobSuccessCriteriaMet,
+						Status:             corev1.ConditionTrue,
+						LastProbeTime:      now,
+						LastTransitionTime: now,
+						Message:            reachedPodsReason,
+					}, completedJobCondition)
+				createdJob.Status.Active = 0
+				createdJob.Status.Ready = ptr.To[int32](0)
+				createdJob.Status.Succeeded = 1
+				createdJob.Status.CompletionTime = ptr.To(now)
+				g.Expect(worker1TestCluster.client.Status().Update(worker1TestCluster.ctx, &createdJob)).To(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			waitForWorkloadToFinishAndRemoteWorkloadToBeDeleted(wlMkLookupKey, finishJobReason)
+
+			// Assert job complete condition.
+			localJob := &batchv1.Job{}
+			gomega.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(jobMk), 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))))
+		})
+
+		ginkgo.By("finishing the regular manager job", func() {
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdJob := batchv1.Job{}
+				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(jobNonMk), &createdJob)).To(gomega.Succeed())
+				createdJob.Status.Conditions = append(createdJob.Status.Conditions,
+					batchv1.JobCondition{
+						Type:               batchv1.JobSuccessCriteriaMet,
+						Status:             corev1.ConditionTrue,
+						LastProbeTime:      now,
+						LastTransitionTime: now,
+						Message:            reachedPodsReason,
+					}, completedJobCondition)
+				createdJob.Status.Active = 0
+				createdJob.Status.Ready = ptr.To[int32](0)
+				createdJob.Status.Succeeded = 1
+				createdJob.Status.CompletionTime = ptr.To(now)
+				g.Expect(managerTestCluster.client.Status().Update(managerTestCluster.ctx, &createdJob)).To(gomega.Succeed())
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+			gomega.Eventually(func(g gomega.Gomega) {
+				createdWorkload := &kueue.Workload{}
+				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, wlNonMkLookupKey, createdWorkload)).To(gomega.Succeed())
+				g.Expect(apimeta.FindStatusCondition(createdWorkload.Status.Conditions, kueue.WorkloadFinished)).To(gomega.BeComparableTo(&metav1.Condition{
+					Type:    kueue.WorkloadFinished,
+					Status:  metav1.ConditionTrue,
+					Reason:  string(kftraining.JobSucceeded),
+					Message: finishJobReason,
+				}, util.IgnoreConditionTimestampsAndObservedGeneration))
+			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+		})
+	})
+})
diff --git a/test/integration/multikueue/external_job_test.go b/test/integration/multikueue/external_job_test.go
index 383180adc..75c82ca98 100644
--- a/test/integration/multikueue/external_job_test.go
+++ b/test/integration/multikueue/external_job_test.go
@@ -375,7 +375,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 				gomega.Eventually(func(g gomega.Gomega) {
 					createdCluster := &kueue.MultiKueueCluster{}
 					g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster2), createdCluster)).To(gomega.Succeed())
-					createdCluster.Spec.KubeConfig.Location = "bad-secret"
+					createdCluster.Spec.ClusterSource.KubeConfig.Location = "bad-secret"
 					g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
@@ -414,7 +414,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 				gomega.Eventually(func(g gomega.Gomega) {
 					createdCluster := &kueue.MultiKueueCluster{}
 					g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster1), createdCluster)).To(gomega.Succeed())
-					createdCluster.Spec.KubeConfig.Location = "bad-secret"
+					createdCluster.Spec.ClusterSource.KubeConfig.Location = "bad-secret"
 					g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
@@ -460,7 +460,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 				gomega.Eventually(func(g gomega.Gomega) {
 					createdCluster := &kueue.MultiKueueCluster{}
 					g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster2), createdCluster)).To(gomega.Succeed())
-					createdCluster.Spec.KubeConfig.Location = managerMultiKueueSecret2.Name
+					createdCluster.Spec.ClusterSource.KubeConfig.Location = managerMultiKueueSecret2.Name
 					g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
@@ -486,7 +486,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 				gomega.Eventually(func(g gomega.Gomega) {
 					createdCluster := &kueue.MultiKueueCluster{}
 					g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster1), createdCluster)).To(gomega.Succeed())
-					createdCluster.Spec.KubeConfig.Location = managerMultiKueueSecret1.Name
+					createdCluster.Spec.ClusterSource.KubeConfig.Location = managerMultiKueueSecret1.Name
 					g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
diff --git a/test/integration/multikueue/jobs_test.go b/test/integration/multikueue/jobs_test.go
index d9b10eed1..f75bc6680 100644
--- a/test/integration/multikueue/jobs_test.go
+++ b/test/integration/multikueue/jobs_test.go
@@ -1255,7 +1255,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdCluster := &kueue.MultiKueueCluster{}
 				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster2), createdCluster)).To(gomega.Succeed())
-				createdCluster.Spec.KubeConfig.Location = "bad-secret"
+				createdCluster.Spec.ClusterSource.KubeConfig.Location = "bad-secret"
 				g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
@@ -1284,7 +1284,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdCluster := &kueue.MultiKueueCluster{}
 				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster1), createdCluster)).To(gomega.Succeed())
-				createdCluster.Spec.KubeConfig.Location = "bad-secret"
+				createdCluster.Spec.ClusterSource.KubeConfig.Location = "bad-secret"
 				g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
@@ -1330,7 +1330,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdCluster := &kueue.MultiKueueCluster{}
 				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster2), createdCluster)).To(gomega.Succeed())
-				createdCluster.Spec.KubeConfig.Location = managerMultiKueueSecret2.Name
+				createdCluster.Spec.ClusterSource.KubeConfig.Location = managerMultiKueueSecret2.Name
 				g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
@@ -1356,7 +1356,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdCluster := &kueue.MultiKueueCluster{}
 				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster1), createdCluster)).To(gomega.Succeed())
-				createdCluster.Spec.KubeConfig.Location = managerMultiKueueSecret1.Name
+				createdCluster.Spec.ClusterSource.KubeConfig.Location = managerMultiKueueSecret1.Name
 				g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
@@ -1417,7 +1417,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdCluster := &kueue.MultiKueueCluster{}
 				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster2), createdCluster)).To(gomega.Succeed())
-				createdCluster.Spec.KubeConfig.Location = "bad-secret"
+				createdCluster.Spec.ClusterSource.KubeConfig.Location = "bad-secret"
 				g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
@@ -1456,7 +1456,7 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			gomega.Eventually(func(g gomega.Gomega) {
 				createdCluster := &kueue.MultiKueueCluster{}
 				g.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, client.ObjectKeyFromObject(workerCluster2), createdCluster)).To(gomega.Succeed())
-				createdCluster.Spec.KubeConfig.Location = managerMultiKueueSecret2.Name
+				createdCluster.Spec.ClusterSource.KubeConfig.Location = managerMultiKueueSecret2.Name
 				g.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, createdCluster)).To(gomega.Succeed())
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
diff --git a/test/integration/multikueue/setup_test.go b/test/integration/multikueue/setup_test.go
index cc11dad19..39f6c63e6 100644
--- a/test/integration/multikueue/setup_test.go
+++ b/test/integration/multikueue/setup_test.go
@@ -768,8 +768,8 @@ var _ = ginkgo.Describe("MultiKueue", ginkgo.Ordered, ginkgo.ContinueOnFailure,
 			updatedCluster := kueue.MultiKueueCluster{}
 			ginkgo.By("updating the cluster spec", func() {
 				gomega.Expect(managerTestCluster.client.Get(managerTestCluster.ctx, clusterKey, &updatedCluster)).To(gomega.Succeed())
-				updatedCluster.Spec.KubeConfig.LocationType = kueue.SecretLocationType
-				updatedCluster.Spec.KubeConfig.Location = secret.Name
+				updatedCluster.Spec.ClusterSource.KubeConfig.LocationType = kueue.SecretLocationType
+				updatedCluster.Spec.ClusterSource.KubeConfig.Location = secret.Name
 				gomega.Expect(managerTestCluster.client.Update(managerTestCluster.ctx, &updatedCluster)).To(gomega.Succeed())
 			})
 
diff --git a/test/integration/singlecluster/controller/failurerecovery/pod_termination_controller_test.go b/test/integration/singlecluster/controller/failurerecovery/pod_termination_controller_test.go
new file mode 100644
index 000000000..c387b326f
--- /dev/null
+++ b/test/integration/singlecluster/controller/failurerecovery/pod_termination_controller_test.go
@@ -0,0 +1,100 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package failurerecovery
+
+import (
+	"time"
+
+	"github.com/onsi/ginkgo/v2"
+	"github.com/onsi/gomega"
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/types"
+
+	"sigs.k8s.io/kueue/pkg/controller/constants"
+	testingnode "sigs.k8s.io/kueue/pkg/util/testingjobs/node"
+	testingpod "sigs.k8s.io/kueue/pkg/util/testingjobs/pod"
+	"sigs.k8s.io/kueue/test/util"
+)
+
+const (
+	unreachableNodeName             = "unreachable-node"
+	reachableNodeName               = "reachable-node"
+	forcefulTerminationCheckTimeout = 2 * time.Second
+)
+
+var _ = ginkgo.Describe("Pod termination controller", ginkgo.Ordered, ginkgo.ContinueOnFailure, func() {
+	var ns *corev1.Namespace
+	var matchingPodWrapper *testingpod.PodWrapper
+
+	ginkgo.BeforeAll(func() {
+		ns = util.CreateNamespaceFromPrefixWithLog(ctx, k8sClient, "pod-fr-namespace-")
+		nodes := []corev1.Node{
+			*testingnode.MakeNode(unreachableNodeName).
+				NotReady().
+				Taints(corev1.Taint{Key: corev1.TaintNodeUnreachable, Effect: corev1.TaintEffectNoSchedule}).
+				Obj(),
+			*testingnode.MakeNode(reachableNodeName).
+				Ready().
+				Obj(),
+		}
+		util.CreateNodesWithStatus(ctx, k8sClient, nodes)
+
+		matchingPodWrapper = testingpod.MakePod("matching-pod", ns.Name).
+			StatusPhase(corev1.PodPending).
+			TerminationGracePeriod(1).
+			NodeName(unreachableNodeName).
+			Annotation(constants.SafeToForcefullyTerminateAnnotationKey, constants.SafeToForcefullyTerminateAnnotationValue)
+	})
+
+	ginkgo.It("forcefully terminates pods that opt-in, scheduled on unreachable nodes", func() {
+		matchingPod := matchingPodWrapper.Clone().Obj()
+		util.MustCreate(ctx, k8sClient, matchingPod)
+		gomega.Expect(k8sClient.Delete(ctx, matchingPod)).To(gomega.Succeed())
+
+		gomega.Eventually(func(g gomega.Gomega) {
+			g.Expect(k8sClient.Get(ctx, types.NamespacedName{Name: matchingPod.Name, Namespace: matchingPod.Namespace}, matchingPod)).
+				To(gomega.Succeed())
+			g.Expect(matchingPod.Status.Phase).Should(gomega.Equal(corev1.PodFailed))
+		}, forcefulTerminationCheckTimeout, util.Interval).Should(gomega.Succeed())
+	})
+
+	ginkgo.It("does not forcefully terminate matching pods that did not opt-in or are running on healthy nodes", func() {
+		nonMatchingPod := matchingPodWrapper.
+			Clone().
+			Name("non-matching-pod").
+			Annotation(constants.SafeToForcefullyTerminateAnnotationKey, "false").
+			Obj()
+		util.MustCreate(ctx, k8sClient, nonMatchingPod)
+		gomega.Expect(k8sClient.Delete(ctx, nonMatchingPod)).To(gomega.Succeed())
+
+		podOnHealthyNode := matchingPodWrapper.Clone().Name("healthy-pod").NodeName(reachableNodeName).Obj()
+		util.MustCreate(ctx, k8sClient, podOnHealthyNode)
+		gomega.Expect(k8sClient.Delete(ctx, podOnHealthyNode)).To(gomega.Succeed())
+
+		gomega.Consistently(func(g gomega.Gomega) {
+			// Non-matching pod is left untouched.
+			g.Expect(k8sClient.Get(ctx, types.NamespacedName{Name: nonMatchingPod.Name, Namespace: nonMatchingPod.Namespace}, nonMatchingPod)).
+				To(gomega.Succeed())
+			g.Expect(nonMatchingPod.Status.Phase).Should(gomega.Equal(corev1.PodPending))
+
+			// Healthy pod is left untouched.
+			g.Expect(k8sClient.Get(ctx, types.NamespacedName{Name: podOnHealthyNode.Name, Namespace: podOnHealthyNode.Namespace}, podOnHealthyNode)).
+				To(gomega.Succeed())
+			g.Expect(podOnHealthyNode.Status.Phase).Should(gomega.Equal(corev1.PodPending))
+		}, forcefulTerminationCheckTimeout, util.Interval).Should(gomega.Succeed())
+	})
+})
diff --git a/test/integration/singlecluster/controller/failurerecovery/suite_test.go b/test/integration/singlecluster/controller/failurerecovery/suite_test.go
new file mode 100644
index 000000000..d9d2ebe06
--- /dev/null
+++ b/test/integration/singlecluster/controller/failurerecovery/suite_test.go
@@ -0,0 +1,71 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package failurerecovery
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/onsi/ginkgo/v2"
+	"github.com/onsi/gomega"
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/manager"
+
+	"sigs.k8s.io/kueue/pkg/constants"
+	"sigs.k8s.io/kueue/pkg/controller/failurerecovery"
+	"sigs.k8s.io/kueue/test/integration/framework"
+)
+
+var (
+	cfg       *rest.Config
+	k8sClient client.Client
+	ctx       context.Context
+	fwk       *framework.Framework
+)
+
+func TestAPIs(t *testing.T) {
+	gomega.RegisterFailHandler(ginkgo.Fail)
+
+	ginkgo.RunSpecs(t,
+		"Failure Recovery Suite",
+	)
+}
+
+var _ = ginkgo.BeforeSuite(func() {
+	fwk = &framework.Framework{}
+	cfg = fwk.Init()
+	ctx, k8sClient = fwk.SetupClient(cfg)
+	fwk.StartManager(ctx, cfg, managerSetup)
+})
+
+var _ = ginkgo.AfterSuite(func() {
+	fwk.Teardown()
+})
+
+func managerSetup(ctx context.Context, mgr manager.Manager) {
+	terminatingPodReconciler, err := failurerecovery.NewTerminatingPodReconciler(
+		mgr.GetClient(),
+		mgr.GetEventRecorderFor(constants.PodTerminationControllerName),
+		failurerecovery.WithForcefulTerminationGracePeriod(time.Millisecond),
+	)
+	gomega.Expect(err).NotTo(gomega.HaveOccurred())
+
+	err = terminatingPodReconciler.SetupWithManager(mgr)
+	gomega.Expect(err).NotTo(gomega.HaveOccurred())
+}
diff --git a/test/integration/singlecluster/scheduler/preemption_test.go b/test/integration/singlecluster/scheduler/preemption_test.go
index a67585d42..079b5996e 100644
--- a/test/integration/singlecluster/scheduler/preemption_test.go
+++ b/test/integration/singlecluster/scheduler/preemption_test.go
@@ -17,6 +17,7 @@ limitations under the License.
 package scheduler
 
 import (
+	"errors"
 	"fmt"
 
 	"github.com/google/go-cmp/cmp/cmpopts"
@@ -144,6 +145,51 @@ var _ = ginkgo.Describe("Preemption", func() {
 			util.ExpectWorkloadsToBePending(ctx, k8sClient, lowWl1, lowWl2)
 		})
 
+		ginkgo.It("Should retry on failed preemptions", func() {
+			attempt := 0
+			fakeSubResourcePatchSpec = func(obj client.Object) (fakeClientUsage, error) {
+				wl, ok := obj.(*kueue.Workload)
+				if !ok {
+					return fallThrough, nil
+				}
+				if cond := apimeta.FindStatusCondition(wl.Status.Conditions, kueue.WorkloadEvicted); cond == nil || cond.Status != metav1.ConditionTrue {
+					return fallThrough, nil
+				}
+				// Ignore patches triggered by util.FinishEvictionForWorkloads()
+				if cond := apimeta.FindStatusCondition(wl.Status.Conditions, kueue.WorkloadQuotaReserved); cond != nil && cond.Status == metav1.ConditionFalse && cond.Message == "By test" {
+					return fallThrough, nil
+				}
+
+				attempt++
+				if attempt < 3 {
+					return emitResponse, errors.New("simulate API server error while preempting workload")
+				}
+				return fallThrough, nil
+			}
+			ginkgo.By("Creating a low priority Workload")
+			lowWl := utiltestingapi.MakeWorkload("low-wl", ns.Name).
+				Queue(kueue.LocalQueueName(q.Name)).
+				Priority(lowPriority).
+				Request(corev1.ResourceCPU, "3").
+				Obj()
+			util.MustCreate(ctx, k8sClient, lowWl)
+
+			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, cq.Name, lowWl)
+
+			ginkgo.By("Creating a high priority Workload")
+			highWl := utiltestingapi.MakeWorkload("high-wl", ns.Name).
+				Queue(kueue.LocalQueueName(q.Name)).
+				Priority(highPriority).
+				Request(corev1.ResourceCPU, "3").
+				Obj()
+			util.MustCreate(ctx, k8sClient, highWl)
+
+			util.FinishEvictionForWorkloads(ctx, k8sClient, lowWl)
+
+			util.ExpectWorkloadsToHaveQuotaReservation(ctx, k8sClient, cq.Name, highWl)
+			util.ExpectWorkloadsToBePending(ctx, k8sClient, lowWl)
+		})
+
 		ginkgo.It("Should preempt newer Workloads with the same priority when there is not enough quota", func() {
 			ginkgo.By("Creating initial Workloads")
 			wl1 := utiltestingapi.MakeWorkload("wl-1", ns.Name).
diff --git a/test/integration/singlecluster/scheduler/suite_test.go b/test/integration/singlecluster/scheduler/suite_test.go
index ea8eaa9c9..4ae79c37a 100644
--- a/test/integration/singlecluster/scheduler/suite_test.go
+++ b/test/integration/singlecluster/scheduler/suite_test.go
@@ -18,6 +18,7 @@ package scheduler
 
 import (
 	"context"
+	"fmt"
 	"testing"
 
 	"github.com/onsi/ginkgo/v2"
@@ -27,6 +28,7 @@ import (
 	"k8s.io/client-go/rest"
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	config "sigs.k8s.io/kueue/apis/config/v1beta2"
@@ -42,11 +44,21 @@ import (
 	"sigs.k8s.io/kueue/test/util"
 )
 
+type subResourcePatchFn func(ctx context.Context, client client.Client, subResourceName string, obj client.Object, patch client.Patch, opts ...client.SubResourcePatchOption) error
+type fakeClientUsage int
+type fakeClientCallSpec func(obj client.Object) (fakeClientUsage, error)
+
+const (
+	emitResponse = iota
+	fallThrough
+)
+
 var (
-	cfg       *rest.Config
-	k8sClient client.Client
-	ctx       context.Context
-	fwk       *framework.Framework
+	cfg                      *rest.Config
+	k8sClient                client.Client
+	ctx                      context.Context
+	fwk                      *framework.Framework
+	fakeSubResourcePatchSpec fakeClientCallSpec
 )
 
 func TestScheduler(t *testing.T) {
@@ -62,14 +74,18 @@ var _ = ginkgo.BeforeSuite(func() {
 		WebhookPath: util.WebhookPath,
 	}
 	cfg = fwk.Init()
-	ctx, k8sClient = fwk.SetupClient(cfg)
-	fwk.StartManager(ctx, cfg, managerAndSchedulerSetup)
+	ctx, k8sClient = setupInterceptedClient()
+	fwk.StartManager(ctx, cfg, managerAndSchedulerSetup, framework.WithNewClient(newInterceptedClient))
 })
 
 var _ = ginkgo.AfterSuite(func() {
 	fwk.Teardown()
 })
 
+var _ = ginkgo.BeforeEach(func() {
+	fakeSubResourcePatchSpec = nil
+})
+
 func managerAndSchedulerSetup(ctx context.Context, mgr manager.Manager) {
 	err := indexer.Setup(ctx, mgr.GetFieldIndexer())
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
@@ -100,3 +116,44 @@ func managerAndSchedulerSetup(ctx context.Context, mgr manager.Manager) {
 	err = sched.Start(ctx)
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 }
+
+func setupInterceptedClient() (context.Context, client.Client) {
+	ctx, baseClient := fwk.SetupClient(cfg)
+	funcs := interceptor.Funcs{
+		SubResourcePatch: fakeSubResourcePatchFrom(&fakeSubResourcePatchSpec, baseClient),
+	}
+	client := interceptor.NewClient(baseClient, funcs)
+	return ctx, client
+}
+
+func newInterceptedClient(config *rest.Config, options client.Options) (client.Client, error) {
+	baseClient, err := client.NewWithWatch(config, options)
+	if err != nil {
+		return nil, err
+	}
+	funcs := interceptor.Funcs{
+		SubResourcePatch: fakeSubResourcePatchFrom(&fakeSubResourcePatchSpec, baseClient),
+	}
+	client := interceptor.NewClient(baseClient, funcs)
+	return client, nil
+}
+
+func fakeSubResourcePatchFrom(f *fakeClientCallSpec, baseK8sClient client.Client) subResourcePatchFn {
+	if f == nil {
+		panic("Nil pointer passed to wrapFakeSubResourcePatch")
+	}
+	return func(ctx context.Context, client client.Client, subResourceName string, obj client.Object, patch client.Patch, opts ...client.SubResourcePatchOption) error {
+		if *f != nil {
+			fakeUsage, err := (*f)(obj)
+			if fakeUsage == emitResponse {
+				return err
+			}
+		}
+		switch subResourceName {
+		case "status":
+			return baseK8sClient.Status().Patch(ctx, obj, patch, opts...)
+		default:
+			return fmt.Errorf("Unsupported subresource: %s", subResourceName)
+		}
+	}
+}
diff --git a/test/integration/singlecluster/webhook/core/admissioncheck_test.go b/test/integration/singlecluster/webhook/core/admissioncheck_test.go
index 0255dbd5b..b79359e96 100644
--- a/test/integration/singlecluster/webhook/core/admissioncheck_test.go
+++ b/test/integration/singlecluster/webhook/core/admissioncheck_test.go
@@ -17,15 +17,12 @@ limitations under the License.
 package core
 
 import (
-	"context"
-
 	"github.com/google/go-cmp/cmp/cmpopts"
 	"github.com/onsi/ginkgo/v2"
 	"github.com/onsi/gomega"
 	"github.com/onsi/gomega/types"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -35,9 +32,7 @@ import (
 
 var _ = ginkgo.Describe("AdmissionCheck Webhook", ginkgo.Ordered, func() {
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
diff --git a/test/integration/singlecluster/webhook/core/clusterqueue_test.go b/test/integration/singlecluster/webhook/core/clusterqueue_test.go
index 28947371d..999a8080f 100644
--- a/test/integration/singlecluster/webhook/core/clusterqueue_test.go
+++ b/test/integration/singlecluster/webhook/core/clusterqueue_test.go
@@ -17,7 +17,6 @@ limitations under the License.
 package core
 
 import (
-	"context"
 	"fmt"
 
 	"github.com/google/go-cmp/cmp/cmpopts"
@@ -29,7 +28,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -44,9 +42,7 @@ const (
 
 var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
diff --git a/test/integration/singlecluster/webhook/core/cohort_test.go b/test/integration/singlecluster/webhook/core/cohort_test.go
index 7f27ea30c..73b8ef419 100644
--- a/test/integration/singlecluster/webhook/core/cohort_test.go
+++ b/test/integration/singlecluster/webhook/core/cohort_test.go
@@ -17,7 +17,6 @@ limitations under the License.
 package core
 
 import (
-	"context"
 	"fmt"
 
 	"github.com/onsi/ginkgo/v2"
@@ -27,7 +26,6 @@ import (
 	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -37,9 +35,7 @@ import (
 
 var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
diff --git a/test/integration/singlecluster/webhook/core/localqueue_test.go b/test/integration/singlecluster/webhook/core/localqueue_test.go
index 6e7e7795e..85ee959a7 100644
--- a/test/integration/singlecluster/webhook/core/localqueue_test.go
+++ b/test/integration/singlecluster/webhook/core/localqueue_test.go
@@ -17,12 +17,9 @@ limitations under the License.
 package core
 
 import (
-	"context"
-
 	"github.com/onsi/ginkgo/v2"
 	"github.com/onsi/gomega"
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -40,9 +37,7 @@ var _ = ginkgo.Describe("Queue validating webhook", ginkgo.Ordered, func() {
 		gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
 	})
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
diff --git a/test/integration/singlecluster/webhook/core/resourceflavor_test.go b/test/integration/singlecluster/webhook/core/resourceflavor_test.go
index 1238f2cef..81cde20dd 100644
--- a/test/integration/singlecluster/webhook/core/resourceflavor_test.go
+++ b/test/integration/singlecluster/webhook/core/resourceflavor_test.go
@@ -17,7 +17,6 @@ limitations under the License.
 package core
 
 import (
-	"context"
 	"fmt"
 
 	"github.com/onsi/ginkgo/v2"
@@ -26,7 +25,6 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
-	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
@@ -41,9 +39,7 @@ const (
 
 var _ = ginkgo.Describe("ResourceFlavor Webhook", ginkgo.Ordered, func() {
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
diff --git a/test/integration/singlecluster/webhook/core/workload_test.go b/test/integration/singlecluster/webhook/core/workload_test.go
index f536e9abe..16c2af40c 100644
--- a/test/integration/singlecluster/webhook/core/workload_test.go
+++ b/test/integration/singlecluster/webhook/core/workload_test.go
@@ -17,7 +17,6 @@ limitations under the License.
 package core
 
 import (
-	"context"
 	"fmt"
 	"time"
 
@@ -30,7 +29,6 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	"sigs.k8s.io/kueue/pkg/features"
@@ -58,9 +56,7 @@ var _ = ginkgo.Describe("Workload defaulting webhook", ginkgo.Ordered, func() {
 	})
 
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
@@ -121,9 +117,7 @@ var _ = ginkgo.Describe("Workload validating webhook", ginkgo.Ordered, func() {
 		gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
 	})
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
@@ -1306,9 +1300,7 @@ var _ = ginkgo.Describe("Workload validating webhook ClusterName - Dispatcher Al
 		gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
 	})
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
@@ -1416,9 +1408,7 @@ var _ = ginkgo.Describe("Workload validating webhook ClusterName - Dispatcher In
 		gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
 	})
 	ginkgo.BeforeAll(func() {
-		fwk.StartManager(ctx, cfg, func(ctx context.Context, mgr manager.Manager) {
-			managerSetup(ctx, mgr)
-		})
+		fwk.StartManager(ctx, cfg, managerSetup)
 	})
 	ginkgo.AfterAll(func() {
 		fwk.StopManager(ctx)
@@ -1554,3 +1544,183 @@ var _ = ginkgo.Describe("Workload validating webhook ClusterName - Dispatcher In
 		})
 	})
 })
+
+var _ = ginkgo.Describe("TopologyAssignment validation", ginkgo.Ordered, func() {
+	var (
+		wl        *kueue.Workload
+		twoLevels = []string{"block", "rack"}
+	)
+
+	var _ = ginkgo.BeforeEach(func() {
+		ns = util.CreateNamespaceFromPrefixWithLog(ctx, k8sClient, "core-")
+		wl = utiltestingapi.MakeWorkload("wl", ns.Name).
+			Queue(kueue.LocalQueueName("lq1")).
+			PodSets(
+				*utiltestingapi.MakePodSet("ps1", 3).
+					Request(corev1.ResourceCPU, "1").
+					Image("image").
+					Obj(),
+			).
+			Obj()
+		util.MustCreate(ctx, k8sClient, wl)
+	})
+
+	var _ = ginkgo.AfterEach(func() {
+		gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
+	})
+
+	ginkgo.BeforeAll(func() {
+		fwk.StartManager(ctx, cfg, managerSetup)
+	})
+
+	ginkgo.AfterAll(func() {
+		fwk.StopManager(ctx)
+	})
+
+	var _ = ginkgo.DescribeTable("kubebuilder XValidation rule set",
+		func(tasAssignment kueue.TopologyAssignment, expectedOutcome gomegatypes.GomegaMatcher) {
+			gomega.Eventually(func(g gomega.Gomega) {
+				g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), wl)).To(gomega.Succeed())
+				wl.Status = kueue.WorkloadStatus{
+					Admission: &kueue.Admission{
+						ClusterQueue: "cq1",
+						PodSetAssignments: []kueue.PodSetAssignment{
+							{
+								Name:               "ps1",
+								TopologyAssignment: ptr.To(tasAssignment),
+							},
+						},
+					},
+				}
+				g.Expect(k8sClient.Status().Update(ctx, wl)).To(expectedOutcome)
+			}, util.Timeout, util.Interval).Should(gomega.Succeed())
+		},
+		ginkgo.Entry("accepts a TopologyAssignment combining various item counts & patterns of subfield presence",
+			// 2 levels, 5 slices, 3 domains in first slice, 4 domains in second slice
+			// - all these numbers deliberately distinct,
+			// to make sure we don't accidentally require some extra equality
+			kueue.TopologyAssignment{
+				Levels: twoLevels,
+				Slices: []kueue.TopologyAssignmentSlice{
+					{
+						DomainCount: 3,
+						ValuesPerLevel: []kueue.TopologyAssignmentSliceLevelValues{
+							{Universal: ptr.To("block-1")},
+							{
+								Individual: &kueue.TopologyAssignmentSliceLevelIndividualValues{
+									Prefix: ptr.To("rack-1-"),
+									Roots:  []string{"1", "2", "3"},
+								},
+							},
+						},
+						PodCounts: kueue.TopologyAssignmentSlicePodCounts{
+							Universal: ptr.To(int32(1)),
+						},
+					},
+					{
+						DomainCount: 4,
+						ValuesPerLevel: []kueue.TopologyAssignmentSliceLevelValues{
+							{
+								Individual: &kueue.TopologyAssignmentSliceLevelIndividualValues{
+									Prefix: ptr.To("block"),
+									Roots:  []string{"-", "-", "-", "-"},
+									Suffix: ptr.To("2"),
+								},
+							},
+							{
+								Individual: &kueue.TopologyAssignmentSliceLevelIndividualValues{
+									Roots: []string{"r1", "r2", "r3", "r4"},
+								},
+							},
+						},
+						PodCounts: kueue.TopologyAssignmentSlicePodCounts{
+							Individual: []int32{10, 20, 30, 40},
+						},
+					},
+					validSliceFor(twoLevels, 3),
+					validSliceFor(twoLevels, 4),
+					validSliceFor(twoLevels, 5),
+				},
+			},
+			gomega.Succeed()),
+		ginkgo.Entry("rejects a slice with wrong number of levels",
+			kueue.TopologyAssignment{
+				Levels: twoLevels,
+				Slices: []kueue.TopologyAssignmentSlice{
+					validSliceFor(twoLevels, 1),
+					{
+						DomainCount: 1,
+						ValuesPerLevel: []kueue.TopologyAssignmentSliceLevelValues{
+							{Universal: ptr.To("block-2")},
+							// error - missing rack
+						},
+						PodCounts: kueue.TopologyAssignmentSlicePodCounts{
+							Universal: ptr.To(int32(1)),
+						},
+					},
+					validSliceFor(twoLevels, 3),
+				},
+			},
+			gomega.MatchError(gomega.ContainSubstring("valuesPerLevel must have the same length as the number of levels in this TopologyAssignment")),
+		),
+		ginkgo.Entry("rejects a slice with wrong number of individual pod counts",
+			kueue.TopologyAssignment{
+				Levels: twoLevels,
+				Slices: []kueue.TopologyAssignmentSlice{
+					validSliceFor(twoLevels, 1),
+					{
+						DomainCount: 3,
+						ValuesPerLevel: []kueue.TopologyAssignmentSliceLevelValues{
+							{Universal: ptr.To("block-2")},
+							{Universal: ptr.To("rack-2")},
+						},
+						PodCounts: kueue.TopologyAssignmentSlicePodCounts{
+							Individual: []int32{10, 20},
+						},
+					},
+					validSliceFor(twoLevels, 3),
+				},
+			},
+			gomega.MatchError(gomega.ContainSubstring("podCounts.individual must have length equal to domainCount")),
+		),
+		ginkgo.Entry("rejects a slice has wrong number of individual assignment values",
+			kueue.TopologyAssignment{
+				Levels: twoLevels,
+				Slices: []kueue.TopologyAssignmentSlice{
+					validSliceFor(twoLevels, 1),
+					{
+						DomainCount: 3,
+						ValuesPerLevel: []kueue.TopologyAssignmentSliceLevelValues{
+							{Universal: ptr.To("block-2")},
+							{
+								Individual: &kueue.TopologyAssignmentSliceLevelIndividualValues{
+									Roots: []string{"rack2-1", "rack2-2"},
+								},
+							},
+						},
+						PodCounts: kueue.TopologyAssignmentSlicePodCounts{
+							Individual: []int32{10, 20, 30},
+						},
+					},
+					validSliceFor(twoLevels, 3),
+				},
+			},
+			gomega.MatchError(gomega.ContainSubstring("valuesPerLevel.individual, if set, must have roots of length equal to domainCount of this TopologyAssignmentSlice")),
+		),
+	)
+})
+
+func validSliceFor(levels []string, suffix int) kueue.TopologyAssignmentSlice {
+	res := kueue.TopologyAssignmentSlice{
+		DomainCount: int32(1),
+		PodCounts: kueue.TopologyAssignmentSlicePodCounts{
+			Universal: ptr.To(int32(1)),
+		},
+	}
+	for _, level := range levels {
+		res.ValuesPerLevel = append(res.ValuesPerLevel, kueue.TopologyAssignmentSliceLevelValues{
+			Universal: ptr.To(fmt.Sprintf("%s-%d", level, suffix)),
+		})
+	}
+	return res
+}
diff --git a/test/util/e2e.go b/test/util/e2e.go
index 14b85dc09..bd0f60718 100644
--- a/test/util/e2e.go
+++ b/test/util/e2e.go
@@ -38,6 +38,7 @@ import (
 	rayv1 "github.com/ray-project/kuberay/ray-operator/apis/ray/v1"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
+	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/kubernetes/scheme"
@@ -137,6 +138,9 @@ func CreateClientUsingCluster(kContext string) (client.WithWatch, *rest.Config,
 	}
 	gomega.ExpectWithOffset(1, cfg).NotTo(gomega.BeNil())
 
+	err = apiextensionsv1.AddToScheme(scheme.Scheme)
+	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
+
 	err = kueue.AddToScheme(scheme.Scheme)
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())