Repository: kubernetes-sigs/kueue

Issue:
v1beta2: graduate the visibility API
**What would you like to be added**:

Graduate the visibility on demand API to v1beta2

**Why is this needed**:

Part of #7113



Discussion:
@mimowo: cc @mbobrovskyi who was interested in taking the task@mbobrovskyi: /assign

Solution patch:
diff --git a/apis/visibility/openapi/zz_generated.openapi.go b/apis/visibility/openapi/zz_generated.openapi.go
index d79b55e3f..74f4ddaff 100644
--- a/apis/visibility/openapi/zz_generated.openapi.go
+++ b/apis/visibility/openapi/zz_generated.openapi.go
@@ -88,6 +88,13 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"sigs.k8s.io/kueue/apis/visibility/v1beta1.PendingWorkload":         schema_kueue_apis_visibility_v1beta1_PendingWorkload(ref),
 		"sigs.k8s.io/kueue/apis/visibility/v1beta1.PendingWorkloadOptions":  schema_kueue_apis_visibility_v1beta1_PendingWorkloadOptions(ref),
 		"sigs.k8s.io/kueue/apis/visibility/v1beta1.PendingWorkloadsSummary": schema_kueue_apis_visibility_v1beta1_PendingWorkloadsSummary(ref),
+		"sigs.k8s.io/kueue/apis/visibility/v1beta2.ClusterQueue":            schema_kueue_apis_visibility_v1beta2_ClusterQueue(ref),
+		"sigs.k8s.io/kueue/apis/visibility/v1beta2.ClusterQueueList":        schema_kueue_apis_visibility_v1beta2_ClusterQueueList(ref),
+		"sigs.k8s.io/kueue/apis/visibility/v1beta2.LocalQueue":              schema_kueue_apis_visibility_v1beta2_LocalQueue(ref),
+		"sigs.k8s.io/kueue/apis/visibility/v1beta2.LocalQueueList":          schema_kueue_apis_visibility_v1beta2_LocalQueueList(ref),
+		"sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkload":         schema_kueue_apis_visibility_v1beta2_PendingWorkload(ref),
+		"sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkloadOptions":  schema_kueue_apis_visibility_v1beta2_PendingWorkloadOptions(ref),
+		"sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkloadsSummary": schema_kueue_apis_visibility_v1beta2_PendingWorkloadsSummary(ref),
 	}
 }
 
@@ -3040,3 +3047,327 @@ func schema_kueue_apis_visibility_v1beta1_PendingWorkloadsSummary(ref common.Ref
 			"k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta", "sigs.k8s.io/kueue/apis/visibility/v1beta1.PendingWorkload"},
 	}
 }
+
+func schema_kueue_apis_visibility_v1beta2_ClusterQueue(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+						},
+					},
+					"pendingWorkloadsSummary": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkloadsSummary"),
+						},
+					},
+				},
+				Required: []string{"pendingWorkloadsSummary"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta", "sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkloadsSummary"},
+	}
+}
+
+func schema_kueue_apis_visibility_v1beta2_ClusterQueueList(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
+						},
+					},
+					"items": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("sigs.k8s.io/kueue/apis/visibility/v1beta2.ClusterQueue"),
+									},
+								},
+							},
+						},
+					},
+				},
+				Required: []string{"items"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta", "sigs.k8s.io/kueue/apis/visibility/v1beta2.ClusterQueue"},
+	}
+}
+
+func schema_kueue_apis_visibility_v1beta2_LocalQueue(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+						},
+					},
+					"pendingWorkloadsSummary": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkloadsSummary"),
+						},
+					},
+				},
+				Required: []string{"pendingWorkloadsSummary"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta", "sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkloadsSummary"},
+	}
+}
+
+func schema_kueue_apis_visibility_v1beta2_LocalQueueList(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Type: []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
+						},
+					},
+					"items": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("sigs.k8s.io/kueue/apis/visibility/v1beta2.LocalQueue"),
+									},
+								},
+							},
+						},
+					},
+				},
+				Required: []string{"items"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta", "sigs.k8s.io/kueue/apis/visibility/v1beta2.LocalQueue"},
+	}
+}
+
+func schema_kueue_apis_visibility_v1beta2_PendingWorkload(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PendingWorkload is a user-facing representation of a pending workload that summarizes the relevant information for position in the cluster queue.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+						},
+					},
+					"priority": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Priority indicates the workload's priority",
+							Default:     0,
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"localQueueName": {
+						SchemaProps: spec.SchemaProps{
+							Description: "LocalQueueName indicates the name of the LocalQueue the workload is submitted to",
+							Default:     "",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"positionInClusterQueue": {
+						SchemaProps: spec.SchemaProps{
+							Description: "PositionInClusterQueue indicates the workload's position in the ClusterQueue, starting from 0",
+							Default:     0,
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+					"positionInLocalQueue": {
+						SchemaProps: spec.SchemaProps{
+							Description: "PositionInLocalQueue indicates the workload's position in the LocalQueue, starting from 0",
+							Default:     0,
+							Type:        []string{"integer"},
+							Format:      "int32",
+						},
+					},
+				},
+				Required: []string{"priority", "localQueueName", "positionInClusterQueue", "positionInLocalQueue"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
+	}
+}
+
+func schema_kueue_apis_visibility_v1beta2_PendingWorkloadOptions(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PendingWorkloadOptions are query params used in the visibility queries",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"offset": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Offset indicates position of the first pending workload that should be fetched, starting from 0. 0 by default",
+							Default:     0,
+							Type:        []string{"integer"},
+							Format:      "int64",
+						},
+					},
+					"limit": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Limit indicates max number of pending workloads that should be fetched. 1000 by default",
+							Type:        []string{"integer"},
+							Format:      "int64",
+						},
+					},
+				},
+				Required: []string{"offset"},
+			},
+		},
+	}
+}
+
+func schema_kueue_apis_visibility_v1beta2_PendingWorkloadsSummary(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PendingWorkloadsSummary contains a list of pending workloads in the context of the query (within LocalQueue or ClusterQueue).",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"kind": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"apiVersion": {
+						SchemaProps: spec.SchemaProps{
+							Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
+							Type:        []string{"string"},
+							Format:      "",
+						},
+					},
+					"metadata": {
+						SchemaProps: spec.SchemaProps{
+							Default: map[string]interface{}{},
+							Ref:     ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
+						},
+					},
+					"items": {
+						SchemaProps: spec.SchemaProps{
+							Type: []string{"array"},
+							Items: &spec.SchemaOrArray{
+								Schema: &spec.Schema{
+									SchemaProps: spec.SchemaProps{
+										Default: map[string]interface{}{},
+										Ref:     ref("sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkload"),
+									},
+								},
+							},
+						},
+					},
+				},
+				Required: []string{"items"},
+			},
+		},
+		Dependencies: []string{
+			"k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta", "sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkload"},
+	}
+}
diff --git a/apis/visibility/v1beta1/doc.go b/apis/visibility/v1beta1/doc.go
index 2cdc7ef52..0a4c84402 100644
--- a/apis/visibility/v1beta1/doc.go
+++ b/apis/visibility/v1beta1/doc.go
@@ -18,6 +18,6 @@ limitations under the License.
 // +kubebuilder:skip
 // +groupName=visibility.kueue.x-k8s.io
 // +k8s:openapi-gen=true
-// +k8s:conversion-gen=false
+// +k8s:conversion-gen=sigs.k8s.io/kueue/apis/visibility/v1beta2
 
 package v1beta1
diff --git a/apis/visibility/v1beta1/groupversion_info.go b/apis/visibility/v1beta1/groupversion_info.go
index f7e97c63b..31484ab31 100644
--- a/apis/visibility/v1beta1/groupversion_info.go
+++ b/apis/visibility/v1beta1/groupversion_info.go
@@ -19,7 +19,6 @@ limitations under the License.
 // +kubebuilder:skip
 // +groupName=visibility.kueue.x-k8s.io
 // +k8s:openapi-gen=true
-// +k8s:conversion-gen=false
 
 package v1beta1
 
diff --git a/apis/visibility/v1beta1/zz_generated.conversion.go b/apis/visibility/v1beta1/zz_generated.conversion.go
index 396ba67ec..b863b3df2 100644
--- a/apis/visibility/v1beta1/zz_generated.conversion.go
+++ b/apis/visibility/v1beta1/zz_generated.conversion.go
@@ -22,9 +22,13 @@ package v1beta1
 
 import (
 	url "net/url"
+	unsafe "unsafe"
 
 	conversion "k8s.io/apimachinery/pkg/conversion"
 	runtime "k8s.io/apimachinery/pkg/runtime"
+	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
+	kueuev1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
+	v1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 )
 
 func init() {
@@ -34,6 +38,76 @@ func init() {
 // RegisterConversions adds conversion functions to the given scheme.
 // Public to allow building arbitrary schemes.
 func RegisterConversions(s *runtime.Scheme) error {
+	if err := s.AddGeneratedConversionFunc((*ClusterQueue)(nil), (*v1beta2.ClusterQueue)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ClusterQueue_To_v1beta2_ClusterQueue(a.(*ClusterQueue), b.(*v1beta2.ClusterQueue), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ClusterQueue)(nil), (*ClusterQueue)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ClusterQueue_To_v1beta1_ClusterQueue(a.(*v1beta2.ClusterQueue), b.(*ClusterQueue), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*ClusterQueueList)(nil), (*v1beta2.ClusterQueueList)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_ClusterQueueList_To_v1beta2_ClusterQueueList(a.(*ClusterQueueList), b.(*v1beta2.ClusterQueueList), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.ClusterQueueList)(nil), (*ClusterQueueList)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_ClusterQueueList_To_v1beta1_ClusterQueueList(a.(*v1beta2.ClusterQueueList), b.(*ClusterQueueList), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*LocalQueue)(nil), (*v1beta2.LocalQueue)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_LocalQueue_To_v1beta2_LocalQueue(a.(*LocalQueue), b.(*v1beta2.LocalQueue), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.LocalQueue)(nil), (*LocalQueue)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_LocalQueue_To_v1beta1_LocalQueue(a.(*v1beta2.LocalQueue), b.(*LocalQueue), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*LocalQueueList)(nil), (*v1beta2.LocalQueueList)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_LocalQueueList_To_v1beta2_LocalQueueList(a.(*LocalQueueList), b.(*v1beta2.LocalQueueList), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.LocalQueueList)(nil), (*LocalQueueList)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_LocalQueueList_To_v1beta1_LocalQueueList(a.(*v1beta2.LocalQueueList), b.(*LocalQueueList), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PendingWorkload)(nil), (*v1beta2.PendingWorkload)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PendingWorkload_To_v1beta2_PendingWorkload(a.(*PendingWorkload), b.(*v1beta2.PendingWorkload), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.PendingWorkload)(nil), (*PendingWorkload)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_PendingWorkload_To_v1beta1_PendingWorkload(a.(*v1beta2.PendingWorkload), b.(*PendingWorkload), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PendingWorkloadOptions)(nil), (*v1beta2.PendingWorkloadOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PendingWorkloadOptions_To_v1beta2_PendingWorkloadOptions(a.(*PendingWorkloadOptions), b.(*v1beta2.PendingWorkloadOptions), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.PendingWorkloadOptions)(nil), (*PendingWorkloadOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_PendingWorkloadOptions_To_v1beta1_PendingWorkloadOptions(a.(*v1beta2.PendingWorkloadOptions), b.(*PendingWorkloadOptions), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*PendingWorkloadsSummary)(nil), (*v1beta2.PendingWorkloadsSummary)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta1_PendingWorkloadsSummary_To_v1beta2_PendingWorkloadsSummary(a.(*PendingWorkloadsSummary), b.(*v1beta2.PendingWorkloadsSummary), scope)
+	}); err != nil {
+		return err
+	}
+	if err := s.AddGeneratedConversionFunc((*v1beta2.PendingWorkloadsSummary)(nil), (*PendingWorkloadsSummary)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_v1beta2_PendingWorkloadsSummary_To_v1beta1_PendingWorkloadsSummary(a.(*v1beta2.PendingWorkloadsSummary), b.(*PendingWorkloadsSummary), scope)
+	}); err != nil {
+		return err
+	}
 	if err := s.AddGeneratedConversionFunc((*url.Values)(nil), (*PendingWorkloadOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
 		return Convert_url_Values_To_v1beta1_PendingWorkloadOptions(a.(*url.Values), b.(*PendingWorkloadOptions), scope)
 	}); err != nil {
@@ -42,6 +116,152 @@ func RegisterConversions(s *runtime.Scheme) error {
 	return nil
 }
 
+func autoConvert_v1beta1_ClusterQueue_To_v1beta2_ClusterQueue(in *ClusterQueue, out *v1beta2.ClusterQueue, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	if err := Convert_v1beta1_PendingWorkloadsSummary_To_v1beta2_PendingWorkloadsSummary(&in.Summary, &out.Summary, s); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Convert_v1beta1_ClusterQueue_To_v1beta2_ClusterQueue is an autogenerated conversion function.
+func Convert_v1beta1_ClusterQueue_To_v1beta2_ClusterQueue(in *ClusterQueue, out *v1beta2.ClusterQueue, s conversion.Scope) error {
+	return autoConvert_v1beta1_ClusterQueue_To_v1beta2_ClusterQueue(in, out, s)
+}
+
+func autoConvert_v1beta2_ClusterQueue_To_v1beta1_ClusterQueue(in *v1beta2.ClusterQueue, out *ClusterQueue, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	if err := Convert_v1beta2_PendingWorkloadsSummary_To_v1beta1_PendingWorkloadsSummary(&in.Summary, &out.Summary, s); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Convert_v1beta2_ClusterQueue_To_v1beta1_ClusterQueue is an autogenerated conversion function.
+func Convert_v1beta2_ClusterQueue_To_v1beta1_ClusterQueue(in *v1beta2.ClusterQueue, out *ClusterQueue, s conversion.Scope) error {
+	return autoConvert_v1beta2_ClusterQueue_To_v1beta1_ClusterQueue(in, out, s)
+}
+
+func autoConvert_v1beta1_ClusterQueueList_To_v1beta2_ClusterQueueList(in *ClusterQueueList, out *v1beta2.ClusterQueueList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]v1beta2.ClusterQueue)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1beta1_ClusterQueueList_To_v1beta2_ClusterQueueList is an autogenerated conversion function.
+func Convert_v1beta1_ClusterQueueList_To_v1beta2_ClusterQueueList(in *ClusterQueueList, out *v1beta2.ClusterQueueList, s conversion.Scope) error {
+	return autoConvert_v1beta1_ClusterQueueList_To_v1beta2_ClusterQueueList(in, out, s)
+}
+
+func autoConvert_v1beta2_ClusterQueueList_To_v1beta1_ClusterQueueList(in *v1beta2.ClusterQueueList, out *ClusterQueueList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]ClusterQueue)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1beta2_ClusterQueueList_To_v1beta1_ClusterQueueList is an autogenerated conversion function.
+func Convert_v1beta2_ClusterQueueList_To_v1beta1_ClusterQueueList(in *v1beta2.ClusterQueueList, out *ClusterQueueList, s conversion.Scope) error {
+	return autoConvert_v1beta2_ClusterQueueList_To_v1beta1_ClusterQueueList(in, out, s)
+}
+
+func autoConvert_v1beta1_LocalQueue_To_v1beta2_LocalQueue(in *LocalQueue, out *v1beta2.LocalQueue, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	if err := Convert_v1beta1_PendingWorkloadsSummary_To_v1beta2_PendingWorkloadsSummary(&in.Summary, &out.Summary, s); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Convert_v1beta1_LocalQueue_To_v1beta2_LocalQueue is an autogenerated conversion function.
+func Convert_v1beta1_LocalQueue_To_v1beta2_LocalQueue(in *LocalQueue, out *v1beta2.LocalQueue, s conversion.Scope) error {
+	return autoConvert_v1beta1_LocalQueue_To_v1beta2_LocalQueue(in, out, s)
+}
+
+func autoConvert_v1beta2_LocalQueue_To_v1beta1_LocalQueue(in *v1beta2.LocalQueue, out *LocalQueue, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	if err := Convert_v1beta2_PendingWorkloadsSummary_To_v1beta1_PendingWorkloadsSummary(&in.Summary, &out.Summary, s); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Convert_v1beta2_LocalQueue_To_v1beta1_LocalQueue is an autogenerated conversion function.
+func Convert_v1beta2_LocalQueue_To_v1beta1_LocalQueue(in *v1beta2.LocalQueue, out *LocalQueue, s conversion.Scope) error {
+	return autoConvert_v1beta2_LocalQueue_To_v1beta1_LocalQueue(in, out, s)
+}
+
+func autoConvert_v1beta1_LocalQueueList_To_v1beta2_LocalQueueList(in *LocalQueueList, out *v1beta2.LocalQueueList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]v1beta2.LocalQueue)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1beta1_LocalQueueList_To_v1beta2_LocalQueueList is an autogenerated conversion function.
+func Convert_v1beta1_LocalQueueList_To_v1beta2_LocalQueueList(in *LocalQueueList, out *v1beta2.LocalQueueList, s conversion.Scope) error {
+	return autoConvert_v1beta1_LocalQueueList_To_v1beta2_LocalQueueList(in, out, s)
+}
+
+func autoConvert_v1beta2_LocalQueueList_To_v1beta1_LocalQueueList(in *v1beta2.LocalQueueList, out *LocalQueueList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]LocalQueue)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1beta2_LocalQueueList_To_v1beta1_LocalQueueList is an autogenerated conversion function.
+func Convert_v1beta2_LocalQueueList_To_v1beta1_LocalQueueList(in *v1beta2.LocalQueueList, out *LocalQueueList, s conversion.Scope) error {
+	return autoConvert_v1beta2_LocalQueueList_To_v1beta1_LocalQueueList(in, out, s)
+}
+
+func autoConvert_v1beta1_PendingWorkload_To_v1beta2_PendingWorkload(in *PendingWorkload, out *v1beta2.PendingWorkload, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	out.Priority = in.Priority
+	out.LocalQueueName = kueuev1beta2.LocalQueueName(in.LocalQueueName)
+	out.PositionInClusterQueue = in.PositionInClusterQueue
+	out.PositionInLocalQueue = in.PositionInLocalQueue
+	return nil
+}
+
+// Convert_v1beta1_PendingWorkload_To_v1beta2_PendingWorkload is an autogenerated conversion function.
+func Convert_v1beta1_PendingWorkload_To_v1beta2_PendingWorkload(in *PendingWorkload, out *v1beta2.PendingWorkload, s conversion.Scope) error {
+	return autoConvert_v1beta1_PendingWorkload_To_v1beta2_PendingWorkload(in, out, s)
+}
+
+func autoConvert_v1beta2_PendingWorkload_To_v1beta1_PendingWorkload(in *v1beta2.PendingWorkload, out *PendingWorkload, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	out.Priority = in.Priority
+	out.LocalQueueName = kueuev1beta1.LocalQueueName(in.LocalQueueName)
+	out.PositionInClusterQueue = in.PositionInClusterQueue
+	out.PositionInLocalQueue = in.PositionInLocalQueue
+	return nil
+}
+
+// Convert_v1beta2_PendingWorkload_To_v1beta1_PendingWorkload is an autogenerated conversion function.
+func Convert_v1beta2_PendingWorkload_To_v1beta1_PendingWorkload(in *v1beta2.PendingWorkload, out *PendingWorkload, s conversion.Scope) error {
+	return autoConvert_v1beta2_PendingWorkload_To_v1beta1_PendingWorkload(in, out, s)
+}
+
+func autoConvert_v1beta1_PendingWorkloadOptions_To_v1beta2_PendingWorkloadOptions(in *PendingWorkloadOptions, out *v1beta2.PendingWorkloadOptions, s conversion.Scope) error {
+	out.Offset = in.Offset
+	out.Limit = in.Limit
+	return nil
+}
+
+// Convert_v1beta1_PendingWorkloadOptions_To_v1beta2_PendingWorkloadOptions is an autogenerated conversion function.
+func Convert_v1beta1_PendingWorkloadOptions_To_v1beta2_PendingWorkloadOptions(in *PendingWorkloadOptions, out *v1beta2.PendingWorkloadOptions, s conversion.Scope) error {
+	return autoConvert_v1beta1_PendingWorkloadOptions_To_v1beta2_PendingWorkloadOptions(in, out, s)
+}
+
+func autoConvert_v1beta2_PendingWorkloadOptions_To_v1beta1_PendingWorkloadOptions(in *v1beta2.PendingWorkloadOptions, out *PendingWorkloadOptions, s conversion.Scope) error {
+	out.Offset = in.Offset
+	out.Limit = in.Limit
+	return nil
+}
+
+// Convert_v1beta2_PendingWorkloadOptions_To_v1beta1_PendingWorkloadOptions is an autogenerated conversion function.
+func Convert_v1beta2_PendingWorkloadOptions_To_v1beta1_PendingWorkloadOptions(in *v1beta2.PendingWorkloadOptions, out *PendingWorkloadOptions, s conversion.Scope) error {
+	return autoConvert_v1beta2_PendingWorkloadOptions_To_v1beta1_PendingWorkloadOptions(in, out, s)
+}
+
 func autoConvert_url_Values_To_v1beta1_PendingWorkloadOptions(in *url.Values, out *PendingWorkloadOptions, s conversion.Scope) error {
 	// WARNING: Field TypeMeta does not have json tag, skipping.
 
@@ -66,3 +286,25 @@ func autoConvert_url_Values_To_v1beta1_PendingWorkloadOptions(in *url.Values, ou
 func Convert_url_Values_To_v1beta1_PendingWorkloadOptions(in *url.Values, out *PendingWorkloadOptions, s conversion.Scope) error {
 	return autoConvert_url_Values_To_v1beta1_PendingWorkloadOptions(in, out, s)
 }
+
+func autoConvert_v1beta1_PendingWorkloadsSummary_To_v1beta2_PendingWorkloadsSummary(in *PendingWorkloadsSummary, out *v1beta2.PendingWorkloadsSummary, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	out.Items = *(*[]v1beta2.PendingWorkload)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1beta1_PendingWorkloadsSummary_To_v1beta2_PendingWorkloadsSummary is an autogenerated conversion function.
+func Convert_v1beta1_PendingWorkloadsSummary_To_v1beta2_PendingWorkloadsSummary(in *PendingWorkloadsSummary, out *v1beta2.PendingWorkloadsSummary, s conversion.Scope) error {
+	return autoConvert_v1beta1_PendingWorkloadsSummary_To_v1beta2_PendingWorkloadsSummary(in, out, s)
+}
+
+func autoConvert_v1beta2_PendingWorkloadsSummary_To_v1beta1_PendingWorkloadsSummary(in *v1beta2.PendingWorkloadsSummary, out *PendingWorkloadsSummary, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	out.Items = *(*[]PendingWorkload)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1beta2_PendingWorkloadsSummary_To_v1beta1_PendingWorkloadsSummary is an autogenerated conversion function.
+func Convert_v1beta2_PendingWorkloadsSummary_To_v1beta1_PendingWorkloadsSummary(in *v1beta2.PendingWorkloadsSummary, out *PendingWorkloadsSummary, s conversion.Scope) error {
+	return autoConvert_v1beta2_PendingWorkloadsSummary_To_v1beta1_PendingWorkloadsSummary(in, out, s)
+}
diff --git a/apis/visibility/v1beta2/defaults.go b/apis/visibility/v1beta2/defaults.go
new file mode 100644
index 000000000..53697893d
--- /dev/null
+++ b/apis/visibility/v1beta2/defaults.go
@@ -0,0 +1,37 @@
+/*
+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 v1beta2
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+func init() {
+	localSchemeBuilder.Register(addDefaultingFuncs)
+}
+
+func addDefaultingFuncs(scheme *runtime.Scheme) error {
+	return RegisterDefaults(scheme)
+}
+
+//nolint:revive // format required by generated code for defaulting
+func SetDefaults_PendingWorkloadOptions(obj *PendingWorkloadOptions) {
+	defaultPendingWorkloadsLimit := int64(1000)
+	if obj.Limit == 0 {
+		obj.Limit = defaultPendingWorkloadsLimit
+	}
+}
diff --git a/apis/visibility/v1beta2/doc.go b/apis/visibility/v1beta2/doc.go
new file mode 100644
index 000000000..052e00200
--- /dev/null
+++ b/apis/visibility/v1beta2/doc.go
@@ -0,0 +1,23 @@
+/*
+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.
+*/
+
+// +kubebuilder:object:generate=true
+// +kubebuilder:skip
+// +groupName=visibility.kueue.x-k8s.io
+// +k8s:openapi-gen=true
+// +k8s:conversion-gen=false
+
+package v1beta2
diff --git a/apis/visibility/v1beta2/groupversion_info.go b/apis/visibility/v1beta2/groupversion_info.go
new file mode 100644
index 000000000..e89b9721b
--- /dev/null
+++ b/apis/visibility/v1beta2/groupversion_info.go
@@ -0,0 +1,52 @@
+/*
+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 v1beta2 contains API Schema definitions for the pending workloads kueue v1beta2 API group
+// +kubebuilder:object:generate=true
+// +kubebuilder:skip
+// +groupName=visibility.kueue.x-k8s.io
+// +k8s:openapi-gen=true
+
+package v1beta2
+
+import (
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"sigs.k8s.io/controller-runtime/pkg/scheme"
+)
+
+var (
+	// GroupVersion is group version used to register these objects.
+	GroupVersion = schema.GroupVersion{Group: "visibility.kueue.x-k8s.io", Version: "v1beta2"}
+
+	// SchemeGroupVersion is alias to GroupVersion for client-go libraries.
+	// It is required by pkg/client/informers/externalversions/...
+	SchemeGroupVersion = GroupVersion
+
+	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
+	SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
+
+	// localSchemeBuilder is used to register autogenerated conversion and defaults functions
+	// It is required by ./zz_generated.conversion.go and ./zz_generated.defaults.go
+	localSchemeBuilder = &SchemeBuilder.SchemeBuilder
+
+	// AddToScheme adds the types in this group-version to the given scheme.
+	AddToScheme = SchemeBuilder.AddToScheme
+)
+
+// Resource is required by pkg/client/listers/...
+func Resource(resource string) schema.GroupResource {
+	return GroupVersion.WithResource(resource).GroupResource()
+}
diff --git a/apis/visibility/v1beta2/types.go b/apis/visibility/v1beta2/types.go
new file mode 100644
index 000000000..e83f37e9c
--- /dev/null
+++ b/apis/visibility/v1beta2/types.go
@@ -0,0 +1,115 @@
+/*
+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 v1beta2
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	"sigs.k8s.io/kueue/apis/kueue/v1beta2"
+)
+
+// +genclient
+// +kubebuilder:object:root=true
+// +k8s:openapi-gen=true
+// +genclient:nonNamespaced
+// +genclient:method=GetPendingWorkloadsSummary,verb=get,subresource=pendingworkloads,result=sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkloadsSummary
+type ClusterQueue struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Summary PendingWorkloadsSummary `json:"pendingWorkloadsSummary"`
+}
+
+// +kubebuilder:object:root=true
+type ClusterQueueList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+
+	Items []ClusterQueue `json:"items"`
+}
+
+// +genclient
+// +kubebuilder:object:root=true
+// +k8s:openapi-gen=true
+// +genclient:method=GetPendingWorkloadsSummary,verb=get,subresource=pendingworkloads,result=sigs.k8s.io/kueue/apis/visibility/v1beta2.PendingWorkloadsSummary
+type LocalQueue struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Summary PendingWorkloadsSummary `json:"pendingWorkloadsSummary"`
+}
+
+// +kubebuilder:object:root=true
+type LocalQueueList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+
+	Items []LocalQueue `json:"items"`
+}
+
+// PendingWorkload is a user-facing representation of a pending workload that summarizes the relevant information for
+// position in the cluster queue.
+type PendingWorkload struct {
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	// Priority indicates the workload's priority
+	Priority int32 `json:"priority"`
+
+	// LocalQueueName indicates the name of the LocalQueue the workload is submitted to
+	LocalQueueName v1beta2.LocalQueueName `json:"localQueueName"`
+
+	// PositionInClusterQueue indicates the workload's position in the ClusterQueue, starting from 0
+	PositionInClusterQueue int32 `json:"positionInClusterQueue"`
+
+	// PositionInLocalQueue indicates the workload's position in the LocalQueue, starting from 0
+	PositionInLocalQueue int32 `json:"positionInLocalQueue"`
+}
+
+// +k8s:openapi-gen=true
+// +kubebuilder:object:root=true
+
+// PendingWorkloadsSummary contains a list of pending workloads in the context
+// of the query (within LocalQueue or ClusterQueue).
+type PendingWorkloadsSummary struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Items []PendingWorkload `json:"items"`
+}
+
+// +kubebuilder:object:root=true
+// +k8s:openapi-gen=true
+// +k8s:conversion-gen:explicit-from=net/url.Values
+// +k8s:defaulter-gen=true
+
+// PendingWorkloadOptions are query params used in the visibility queries
+type PendingWorkloadOptions struct {
+	metav1.TypeMeta `json:",inline"`
+
+	// Offset indicates position of the first pending workload that should be fetched, starting from 0. 0 by default
+	Offset int64 `json:"offset"`
+
+	// Limit indicates max number of pending workloads that should be fetched. 1000 by default
+	Limit int64 `json:"limit,omitempty"`
+}
+
+func init() {
+	SchemeBuilder.Register(
+		&PendingWorkloadsSummary{},
+		&PendingWorkloadOptions{},
+	)
+}
diff --git a/apis/visibility/v1beta2/zz_generated.conversion.go b/apis/visibility/v1beta2/zz_generated.conversion.go
new file mode 100644
index 000000000..957a4132c
--- /dev/null
+++ b/apis/visibility/v1beta2/zz_generated.conversion.go
@@ -0,0 +1,68 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by conversion-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	url "net/url"
+
+	conversion "k8s.io/apimachinery/pkg/conversion"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+func init() {
+	localSchemeBuilder.Register(RegisterConversions)
+}
+
+// RegisterConversions adds conversion functions to the given scheme.
+// Public to allow building arbitrary schemes.
+func RegisterConversions(s *runtime.Scheme) error {
+	if err := s.AddGeneratedConversionFunc((*url.Values)(nil), (*PendingWorkloadOptions)(nil), func(a, b interface{}, scope conversion.Scope) error {
+		return Convert_url_Values_To_v1beta2_PendingWorkloadOptions(a.(*url.Values), b.(*PendingWorkloadOptions), scope)
+	}); err != nil {
+		return err
+	}
+	return nil
+}
+
+func autoConvert_url_Values_To_v1beta2_PendingWorkloadOptions(in *url.Values, out *PendingWorkloadOptions, s conversion.Scope) error {
+	// WARNING: Field TypeMeta does not have json tag, skipping.
+
+	if values, ok := map[string][]string(*in)["offset"]; ok && len(values) > 0 {
+		if err := runtime.Convert_Slice_string_To_int64(&values, &out.Offset, s); err != nil {
+			return err
+		}
+	} else {
+		out.Offset = 0
+	}
+	if values, ok := map[string][]string(*in)["limit"]; ok && len(values) > 0 {
+		if err := runtime.Convert_Slice_string_To_int64(&values, &out.Limit, s); err != nil {
+			return err
+		}
+	} else {
+		out.Limit = 0
+	}
+	return nil
+}
+
+// Convert_url_Values_To_v1beta2_PendingWorkloadOptions is an autogenerated conversion function.
+func Convert_url_Values_To_v1beta2_PendingWorkloadOptions(in *url.Values, out *PendingWorkloadOptions, s conversion.Scope) error {
+	return autoConvert_url_Values_To_v1beta2_PendingWorkloadOptions(in, out, s)
+}
diff --git a/apis/visibility/v1beta2/zz_generated.deepcopy.go b/apis/visibility/v1beta2/zz_generated.deepcopy.go
new file mode 100644
index 000000000..572a6a9dd
--- /dev/null
+++ b/apis/visibility/v1beta2/zz_generated.deepcopy.go
@@ -0,0 +1,213 @@
+//go:build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by controller-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterQueue) DeepCopyInto(out *ClusterQueue) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Summary.DeepCopyInto(&out.Summary)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterQueue.
+func (in *ClusterQueue) DeepCopy() *ClusterQueue {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterQueue)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ClusterQueue) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterQueueList) DeepCopyInto(out *ClusterQueueList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]ClusterQueue, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterQueueList.
+func (in *ClusterQueueList) DeepCopy() *ClusterQueueList {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterQueueList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ClusterQueueList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalQueue) DeepCopyInto(out *LocalQueue) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Summary.DeepCopyInto(&out.Summary)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalQueue.
+func (in *LocalQueue) DeepCopy() *LocalQueue {
+	if in == nil {
+		return nil
+	}
+	out := new(LocalQueue)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *LocalQueue) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *LocalQueueList) DeepCopyInto(out *LocalQueueList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]LocalQueue, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalQueueList.
+func (in *LocalQueueList) DeepCopy() *LocalQueueList {
+	if in == nil {
+		return nil
+	}
+	out := new(LocalQueueList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *LocalQueueList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PendingWorkload) DeepCopyInto(out *PendingWorkload) {
+	*out = *in
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingWorkload.
+func (in *PendingWorkload) DeepCopy() *PendingWorkload {
+	if in == nil {
+		return nil
+	}
+	out := new(PendingWorkload)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PendingWorkloadOptions) DeepCopyInto(out *PendingWorkloadOptions) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingWorkloadOptions.
+func (in *PendingWorkloadOptions) DeepCopy() *PendingWorkloadOptions {
+	if in == nil {
+		return nil
+	}
+	out := new(PendingWorkloadOptions)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PendingWorkloadOptions) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PendingWorkloadsSummary) DeepCopyInto(out *PendingWorkloadsSummary) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]PendingWorkload, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingWorkloadsSummary.
+func (in *PendingWorkloadsSummary) DeepCopy() *PendingWorkloadsSummary {
+	if in == nil {
+		return nil
+	}
+	out := new(PendingWorkloadsSummary)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PendingWorkloadsSummary) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
diff --git a/apis/visibility/v1beta2/zz_generated.defaults.go b/apis/visibility/v1beta2/zz_generated.defaults.go
new file mode 100644
index 000000000..66e2b9a2e
--- /dev/null
+++ b/apis/visibility/v1beta2/zz_generated.defaults.go
@@ -0,0 +1,37 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by defaulter-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// RegisterDefaults adds defaulters functions to the given scheme.
+// Public to allow building arbitrary schemes.
+// All generated defaulters are covering - they call all nested defaulters.
+func RegisterDefaults(scheme *runtime.Scheme) error {
+	scheme.AddTypeDefaultingFunc(&PendingWorkloadOptions{}, func(obj interface{}) { SetObjectDefaults_PendingWorkloadOptions(obj.(*PendingWorkloadOptions)) })
+	return nil
+}
+
+func SetObjectDefaults_PendingWorkloadOptions(in *PendingWorkloadOptions) {
+	SetDefaults_PendingWorkloadOptions(in)
+}
diff --git a/charts/kueue/templates/visibility/apiservice_v1beta2.yaml b/charts/kueue/templates/visibility/apiservice_v1beta2.yaml
new file mode 100644
index 000000000..93eb8639a
--- /dev/null
+++ b/charts/kueue/templates/visibility/apiservice_v1beta2.yaml
@@ -0,0 +1,39 @@
+{{- /*
+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 yaml-processor. DO NOT EDIT. */}}
+
+apiVersion: apiregistration.k8s.io/v1
+kind: APIService
+metadata:
+  {{- if .Values.enableCertManager }}
+  annotations:
+    cert-manager.io/inject-ca-from: '{{ .Release.Namespace }}/{{ include "kueue.fullname" . }}-visibility-server-cert'
+  {{- end }}
+  labels:
+  {{- include "kueue.visibilityService.labels" . | nindent 4 }}
+  name: v1beta2.visibility.kueue.x-k8s.io
+spec:
+  {{- if not .Values.enableCertManager }}
+  insecureSkipTLSVerify: true
+  {{- end }}
+  group: visibility.kueue.x-k8s.io
+  groupPriorityMinimum: 100
+  service:
+    name: '{{ include "kueue.fullname" . }}-visibility-server'
+    namespace: '{{ .Release.Namespace }}'
+  version: v1beta2
+  versionPriority: 100
diff --git a/client-go/applyconfiguration/utils.go b/client-go/applyconfiguration/utils.go
index 9b6de000d..673a24f15 100644
--- a/client-go/applyconfiguration/utils.go
+++ b/client-go/applyconfiguration/utils.go
@@ -24,10 +24,12 @@ import (
 	v1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	v1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	visibilityv1beta1 "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	internal "sigs.k8s.io/kueue/client-go/applyconfiguration/internal"
 	kueuev1beta1 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1beta1"
 	kueuev1beta2 "sigs.k8s.io/kueue/client-go/applyconfiguration/kueue/v1beta2"
 	applyconfigurationvisibilityv1beta1 "sigs.k8s.io/kueue/client-go/applyconfiguration/visibility/v1beta1"
+	applyconfigurationvisibilityv1beta2 "sigs.k8s.io/kueue/client-go/applyconfiguration/visibility/v1beta2"
 )
 
 // ForKind returns an apply configuration type for the given GroupVersionKind, or nil if no
@@ -316,6 +318,16 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
 	case visibilityv1beta1.SchemeGroupVersion.WithKind("PendingWorkloadsSummary"):
 		return &applyconfigurationvisibilityv1beta1.PendingWorkloadsSummaryApplyConfiguration{}
 
+		// Group=visibility.kueue.x-k8s.io, Version=v1beta2
+	case visibilityv1beta2.SchemeGroupVersion.WithKind("ClusterQueue"):
+		return &applyconfigurationvisibilityv1beta2.ClusterQueueApplyConfiguration{}
+	case visibilityv1beta2.SchemeGroupVersion.WithKind("LocalQueue"):
+		return &applyconfigurationvisibilityv1beta2.LocalQueueApplyConfiguration{}
+	case visibilityv1beta2.SchemeGroupVersion.WithKind("PendingWorkload"):
+		return &applyconfigurationvisibilityv1beta2.PendingWorkloadApplyConfiguration{}
+	case visibilityv1beta2.SchemeGroupVersion.WithKind("PendingWorkloadsSummary"):
+		return &applyconfigurationvisibilityv1beta2.PendingWorkloadsSummaryApplyConfiguration{}
+
 	}
 	return nil
 }
diff --git a/client-go/applyconfiguration/visibility/v1beta2/clusterqueue.go b/client-go/applyconfiguration/visibility/v1beta2/clusterqueue.go
new file mode 100644
index 000000000..0188dded6
--- /dev/null
+++ b/client-go/applyconfiguration/visibility/v1beta2/clusterqueue.go
@@ -0,0 +1,231 @@
+/*
+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
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	v1 "k8s.io/client-go/applyconfigurations/meta/v1"
+)
+
+// ClusterQueueApplyConfiguration represents a declarative configuration of the ClusterQueue type for use
+// with apply.
+type ClusterQueueApplyConfiguration struct {
+	v1.TypeMetaApplyConfiguration    `json:",inline"`
+	*v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"`
+	Summary                          *PendingWorkloadsSummaryApplyConfiguration `json:"pendingWorkloadsSummary,omitempty"`
+}
+
+// ClusterQueue constructs a declarative configuration of the ClusterQueue type for use with
+// apply.
+func ClusterQueue(name string) *ClusterQueueApplyConfiguration {
+	b := &ClusterQueueApplyConfiguration{}
+	b.WithName(name)
+	b.WithKind("ClusterQueue")
+	b.WithAPIVersion("visibility.kueue.x-k8s.io/v1beta2")
+	return b
+}
+func (b ClusterQueueApplyConfiguration) IsApplyConfiguration() {}
+
+// WithKind sets the Kind 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 Kind field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithKind(value string) *ClusterQueueApplyConfiguration {
+	b.TypeMetaApplyConfiguration.Kind = &value
+	return b
+}
+
+// WithAPIVersion sets the APIVersion 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 APIVersion field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithAPIVersion(value string) *ClusterQueueApplyConfiguration {
+	b.TypeMetaApplyConfiguration.APIVersion = &value
+	return b
+}
+
+// WithName sets the Name 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 Name field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithName(value string) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Name = &value
+	return b
+}
+
+// WithGenerateName sets the GenerateName 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 GenerateName field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithGenerateName(value string) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.GenerateName = &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 *ClusterQueueApplyConfiguration) WithNamespace(value string) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Namespace = &value
+	return b
+}
+
+// WithUID sets the UID 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 UID field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithUID(value types.UID) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.UID = &value
+	return b
+}
+
+// WithResourceVersion sets the ResourceVersion 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 ResourceVersion field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithResourceVersion(value string) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.ResourceVersion = &value
+	return b
+}
+
+// WithGeneration sets the Generation 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 Generation field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithGeneration(value int64) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Generation = &value
+	return b
+}
+
+// WithCreationTimestamp sets the CreationTimestamp 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 CreationTimestamp field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithCreationTimestamp(value metav1.Time) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.CreationTimestamp = &value
+	return b
+}
+
+// WithDeletionTimestamp sets the DeletionTimestamp 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 DeletionTimestamp field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionTimestamp = &value
+	return b
+}
+
+// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds 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 DeletionGracePeriodSeconds field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionGracePeriodSeconds = &value
+	return b
+}
+
+// WithLabels puts the entries into the Labels field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Labels field,
+// overwriting an existing map entries in Labels field with the same key.
+func (b *ClusterQueueApplyConfiguration) WithLabels(entries map[string]string) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Labels == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Labels = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Labels[k] = v
+	}
+	return b
+}
+
+// WithAnnotations puts the entries into the Annotations field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Annotations field,
+// overwriting an existing map entries in Annotations field with the same key.
+func (b *ClusterQueueApplyConfiguration) WithAnnotations(entries map[string]string) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Annotations == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Annotations = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Annotations[k] = v
+	}
+	return b
+}
+
+// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the OwnerReferences field.
+func (b *ClusterQueueApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithOwnerReferences")
+		}
+		b.ObjectMetaApplyConfiguration.OwnerReferences = append(b.ObjectMetaApplyConfiguration.OwnerReferences, *values[i])
+	}
+	return b
+}
+
+// WithFinalizers adds the given value to the Finalizers field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Finalizers field.
+func (b *ClusterQueueApplyConfiguration) WithFinalizers(values ...string) *ClusterQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		b.ObjectMetaApplyConfiguration.Finalizers = append(b.ObjectMetaApplyConfiguration.Finalizers, values[i])
+	}
+	return b
+}
+
+func (b *ClusterQueueApplyConfiguration) ensureObjectMetaApplyConfigurationExists() {
+	if b.ObjectMetaApplyConfiguration == nil {
+		b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{}
+	}
+}
+
+// WithSummary sets the Summary 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 Summary field is set to the value of the last call.
+func (b *ClusterQueueApplyConfiguration) WithSummary(value *PendingWorkloadsSummaryApplyConfiguration) *ClusterQueueApplyConfiguration {
+	b.Summary = value
+	return b
+}
+
+// GetKind retrieves the value of the Kind field in the declarative configuration.
+func (b *ClusterQueueApplyConfiguration) GetKind() *string {
+	return b.TypeMetaApplyConfiguration.Kind
+}
+
+// GetAPIVersion retrieves the value of the APIVersion field in the declarative configuration.
+func (b *ClusterQueueApplyConfiguration) GetAPIVersion() *string {
+	return b.TypeMetaApplyConfiguration.APIVersion
+}
+
+// GetName retrieves the value of the Name field in the declarative configuration.
+func (b *ClusterQueueApplyConfiguration) GetName() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Name
+}
+
+// GetNamespace retrieves the value of the Namespace field in the declarative configuration.
+func (b *ClusterQueueApplyConfiguration) GetNamespace() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Namespace
+}
diff --git a/client-go/applyconfiguration/visibility/v1beta2/localqueue.go b/client-go/applyconfiguration/visibility/v1beta2/localqueue.go
new file mode 100644
index 000000000..c4eb8ed6c
--- /dev/null
+++ b/client-go/applyconfiguration/visibility/v1beta2/localqueue.go
@@ -0,0 +1,232 @@
+/*
+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
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	v1 "k8s.io/client-go/applyconfigurations/meta/v1"
+)
+
+// LocalQueueApplyConfiguration represents a declarative configuration of the LocalQueue type for use
+// with apply.
+type LocalQueueApplyConfiguration struct {
+	v1.TypeMetaApplyConfiguration    `json:",inline"`
+	*v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"`
+	Summary                          *PendingWorkloadsSummaryApplyConfiguration `json:"pendingWorkloadsSummary,omitempty"`
+}
+
+// LocalQueue constructs a declarative configuration of the LocalQueue type for use with
+// apply.
+func LocalQueue(name, namespace string) *LocalQueueApplyConfiguration {
+	b := &LocalQueueApplyConfiguration{}
+	b.WithName(name)
+	b.WithNamespace(namespace)
+	b.WithKind("LocalQueue")
+	b.WithAPIVersion("visibility.kueue.x-k8s.io/v1beta2")
+	return b
+}
+func (b LocalQueueApplyConfiguration) IsApplyConfiguration() {}
+
+// WithKind sets the Kind 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 Kind field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithKind(value string) *LocalQueueApplyConfiguration {
+	b.TypeMetaApplyConfiguration.Kind = &value
+	return b
+}
+
+// WithAPIVersion sets the APIVersion 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 APIVersion field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithAPIVersion(value string) *LocalQueueApplyConfiguration {
+	b.TypeMetaApplyConfiguration.APIVersion = &value
+	return b
+}
+
+// WithName sets the Name 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 Name field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithName(value string) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Name = &value
+	return b
+}
+
+// WithGenerateName sets the GenerateName 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 GenerateName field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithGenerateName(value string) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.GenerateName = &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 *LocalQueueApplyConfiguration) WithNamespace(value string) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Namespace = &value
+	return b
+}
+
+// WithUID sets the UID 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 UID field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithUID(value types.UID) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.UID = &value
+	return b
+}
+
+// WithResourceVersion sets the ResourceVersion 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 ResourceVersion field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithResourceVersion(value string) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.ResourceVersion = &value
+	return b
+}
+
+// WithGeneration sets the Generation 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 Generation field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithGeneration(value int64) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Generation = &value
+	return b
+}
+
+// WithCreationTimestamp sets the CreationTimestamp 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 CreationTimestamp field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithCreationTimestamp(value metav1.Time) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.CreationTimestamp = &value
+	return b
+}
+
+// WithDeletionTimestamp sets the DeletionTimestamp 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 DeletionTimestamp field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionTimestamp = &value
+	return b
+}
+
+// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds 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 DeletionGracePeriodSeconds field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionGracePeriodSeconds = &value
+	return b
+}
+
+// WithLabels puts the entries into the Labels field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Labels field,
+// overwriting an existing map entries in Labels field with the same key.
+func (b *LocalQueueApplyConfiguration) WithLabels(entries map[string]string) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Labels == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Labels = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Labels[k] = v
+	}
+	return b
+}
+
+// WithAnnotations puts the entries into the Annotations field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Annotations field,
+// overwriting an existing map entries in Annotations field with the same key.
+func (b *LocalQueueApplyConfiguration) WithAnnotations(entries map[string]string) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Annotations == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Annotations = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Annotations[k] = v
+	}
+	return b
+}
+
+// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the OwnerReferences field.
+func (b *LocalQueueApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithOwnerReferences")
+		}
+		b.ObjectMetaApplyConfiguration.OwnerReferences = append(b.ObjectMetaApplyConfiguration.OwnerReferences, *values[i])
+	}
+	return b
+}
+
+// WithFinalizers adds the given value to the Finalizers field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Finalizers field.
+func (b *LocalQueueApplyConfiguration) WithFinalizers(values ...string) *LocalQueueApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		b.ObjectMetaApplyConfiguration.Finalizers = append(b.ObjectMetaApplyConfiguration.Finalizers, values[i])
+	}
+	return b
+}
+
+func (b *LocalQueueApplyConfiguration) ensureObjectMetaApplyConfigurationExists() {
+	if b.ObjectMetaApplyConfiguration == nil {
+		b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{}
+	}
+}
+
+// WithSummary sets the Summary 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 Summary field is set to the value of the last call.
+func (b *LocalQueueApplyConfiguration) WithSummary(value *PendingWorkloadsSummaryApplyConfiguration) *LocalQueueApplyConfiguration {
+	b.Summary = value
+	return b
+}
+
+// GetKind retrieves the value of the Kind field in the declarative configuration.
+func (b *LocalQueueApplyConfiguration) GetKind() *string {
+	return b.TypeMetaApplyConfiguration.Kind
+}
+
+// GetAPIVersion retrieves the value of the APIVersion field in the declarative configuration.
+func (b *LocalQueueApplyConfiguration) GetAPIVersion() *string {
+	return b.TypeMetaApplyConfiguration.APIVersion
+}
+
+// GetName retrieves the value of the Name field in the declarative configuration.
+func (b *LocalQueueApplyConfiguration) GetName() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Name
+}
+
+// GetNamespace retrieves the value of the Namespace field in the declarative configuration.
+func (b *LocalQueueApplyConfiguration) GetNamespace() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Namespace
+}
diff --git a/client-go/applyconfiguration/visibility/v1beta2/pendingworkload.go b/client-go/applyconfiguration/visibility/v1beta2/pendingworkload.go
new file mode 100644
index 000000000..a10a3efc7
--- /dev/null
+++ b/client-go/applyconfiguration/visibility/v1beta2/pendingworkload.go
@@ -0,0 +1,227 @@
+/*
+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
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	v1 "k8s.io/client-go/applyconfigurations/meta/v1"
+	kueuev1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
+)
+
+// PendingWorkloadApplyConfiguration represents a declarative configuration of the PendingWorkload type for use
+// with apply.
+type PendingWorkloadApplyConfiguration struct {
+	*v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"`
+	Priority                         *int32                       `json:"priority,omitempty"`
+	LocalQueueName                   *kueuev1beta2.LocalQueueName `json:"localQueueName,omitempty"`
+	PositionInClusterQueue           *int32                       `json:"positionInClusterQueue,omitempty"`
+	PositionInLocalQueue             *int32                       `json:"positionInLocalQueue,omitempty"`
+}
+
+// PendingWorkloadApplyConfiguration constructs a declarative configuration of the PendingWorkload type for use with
+// apply.
+func PendingWorkload() *PendingWorkloadApplyConfiguration {
+	return &PendingWorkloadApplyConfiguration{}
+}
+
+// WithName sets the Name 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 Name field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithName(value string) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Name = &value
+	return b
+}
+
+// WithGenerateName sets the GenerateName 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 GenerateName field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithGenerateName(value string) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.GenerateName = &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 *PendingWorkloadApplyConfiguration) WithNamespace(value string) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Namespace = &value
+	return b
+}
+
+// WithUID sets the UID 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 UID field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithUID(value types.UID) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.UID = &value
+	return b
+}
+
+// WithResourceVersion sets the ResourceVersion 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 ResourceVersion field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithResourceVersion(value string) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.ResourceVersion = &value
+	return b
+}
+
+// WithGeneration sets the Generation 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 Generation field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithGeneration(value int64) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Generation = &value
+	return b
+}
+
+// WithCreationTimestamp sets the CreationTimestamp 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 CreationTimestamp field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.CreationTimestamp = &value
+	return b
+}
+
+// WithDeletionTimestamp sets the DeletionTimestamp 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 DeletionTimestamp field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionTimestamp = &value
+	return b
+}
+
+// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds 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 DeletionGracePeriodSeconds field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionGracePeriodSeconds = &value
+	return b
+}
+
+// WithLabels puts the entries into the Labels field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Labels field,
+// overwriting an existing map entries in Labels field with the same key.
+func (b *PendingWorkloadApplyConfiguration) WithLabels(entries map[string]string) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Labels == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Labels = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Labels[k] = v
+	}
+	return b
+}
+
+// WithAnnotations puts the entries into the Annotations field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Annotations field,
+// overwriting an existing map entries in Annotations field with the same key.
+func (b *PendingWorkloadApplyConfiguration) WithAnnotations(entries map[string]string) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Annotations == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Annotations = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Annotations[k] = v
+	}
+	return b
+}
+
+// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the OwnerReferences field.
+func (b *PendingWorkloadApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithOwnerReferences")
+		}
+		b.ObjectMetaApplyConfiguration.OwnerReferences = append(b.ObjectMetaApplyConfiguration.OwnerReferences, *values[i])
+	}
+	return b
+}
+
+// WithFinalizers adds the given value to the Finalizers field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Finalizers field.
+func (b *PendingWorkloadApplyConfiguration) WithFinalizers(values ...string) *PendingWorkloadApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		b.ObjectMetaApplyConfiguration.Finalizers = append(b.ObjectMetaApplyConfiguration.Finalizers, values[i])
+	}
+	return b
+}
+
+func (b *PendingWorkloadApplyConfiguration) ensureObjectMetaApplyConfigurationExists() {
+	if b.ObjectMetaApplyConfiguration == nil {
+		b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{}
+	}
+}
+
+// WithPriority sets the Priority 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 Priority field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithPriority(value int32) *PendingWorkloadApplyConfiguration {
+	b.Priority = &value
+	return b
+}
+
+// WithLocalQueueName sets the LocalQueueName 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 LocalQueueName field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithLocalQueueName(value kueuev1beta2.LocalQueueName) *PendingWorkloadApplyConfiguration {
+	b.LocalQueueName = &value
+	return b
+}
+
+// WithPositionInClusterQueue sets the PositionInClusterQueue 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 PositionInClusterQueue field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithPositionInClusterQueue(value int32) *PendingWorkloadApplyConfiguration {
+	b.PositionInClusterQueue = &value
+	return b
+}
+
+// WithPositionInLocalQueue sets the PositionInLocalQueue 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 PositionInLocalQueue field is set to the value of the last call.
+func (b *PendingWorkloadApplyConfiguration) WithPositionInLocalQueue(value int32) *PendingWorkloadApplyConfiguration {
+	b.PositionInLocalQueue = &value
+	return b
+}
+
+// GetName retrieves the value of the Name field in the declarative configuration.
+func (b *PendingWorkloadApplyConfiguration) GetName() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Name
+}
+
+// GetNamespace retrieves the value of the Namespace field in the declarative configuration.
+func (b *PendingWorkloadApplyConfiguration) GetNamespace() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Namespace
+}
diff --git a/client-go/applyconfiguration/visibility/v1beta2/pendingworkloadssummary.go b/client-go/applyconfiguration/visibility/v1beta2/pendingworkloadssummary.go
new file mode 100644
index 000000000..d6cfab21e
--- /dev/null
+++ b/client-go/applyconfiguration/visibility/v1beta2/pendingworkloadssummary.go
@@ -0,0 +1,235 @@
+/*
+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
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	v1 "k8s.io/client-go/applyconfigurations/meta/v1"
+)
+
+// PendingWorkloadsSummaryApplyConfiguration represents a declarative configuration of the PendingWorkloadsSummary type for use
+// with apply.
+type PendingWorkloadsSummaryApplyConfiguration struct {
+	v1.TypeMetaApplyConfiguration    `json:",inline"`
+	*v1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"`
+	Items                            []PendingWorkloadApplyConfiguration `json:"items,omitempty"`
+}
+
+// PendingWorkloadsSummaryApplyConfiguration constructs a declarative configuration of the PendingWorkloadsSummary type for use with
+// apply.
+func PendingWorkloadsSummary() *PendingWorkloadsSummaryApplyConfiguration {
+	b := &PendingWorkloadsSummaryApplyConfiguration{}
+	b.WithKind("PendingWorkloadsSummary")
+	b.WithAPIVersion("visibility.kueue.x-k8s.io/v1beta2")
+	return b
+}
+func (b PendingWorkloadsSummaryApplyConfiguration) IsApplyConfiguration() {}
+
+// WithKind sets the Kind 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 Kind field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithKind(value string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.TypeMetaApplyConfiguration.Kind = &value
+	return b
+}
+
+// WithAPIVersion sets the APIVersion 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 APIVersion field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithAPIVersion(value string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.TypeMetaApplyConfiguration.APIVersion = &value
+	return b
+}
+
+// WithName sets the Name 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 Name field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithName(value string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Name = &value
+	return b
+}
+
+// WithGenerateName sets the GenerateName 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 GenerateName field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithGenerateName(value string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.GenerateName = &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 *PendingWorkloadsSummaryApplyConfiguration) WithNamespace(value string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Namespace = &value
+	return b
+}
+
+// WithUID sets the UID 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 UID field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithUID(value types.UID) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.UID = &value
+	return b
+}
+
+// WithResourceVersion sets the ResourceVersion 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 ResourceVersion field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithResourceVersion(value string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.ResourceVersion = &value
+	return b
+}
+
+// WithGeneration sets the Generation 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 Generation field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithGeneration(value int64) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.Generation = &value
+	return b
+}
+
+// WithCreationTimestamp sets the CreationTimestamp 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 CreationTimestamp field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithCreationTimestamp(value metav1.Time) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.CreationTimestamp = &value
+	return b
+}
+
+// WithDeletionTimestamp sets the DeletionTimestamp 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 DeletionTimestamp field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithDeletionTimestamp(value metav1.Time) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionTimestamp = &value
+	return b
+}
+
+// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds 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 DeletionGracePeriodSeconds field is set to the value of the last call.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	b.ObjectMetaApplyConfiguration.DeletionGracePeriodSeconds = &value
+	return b
+}
+
+// WithLabels puts the entries into the Labels field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Labels field,
+// overwriting an existing map entries in Labels field with the same key.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithLabels(entries map[string]string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Labels == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Labels = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Labels[k] = v
+	}
+	return b
+}
+
+// WithAnnotations puts the entries into the Annotations field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, the entries provided by each call will be put on the Annotations field,
+// overwriting an existing map entries in Annotations field with the same key.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithAnnotations(entries map[string]string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	if b.ObjectMetaApplyConfiguration.Annotations == nil && len(entries) > 0 {
+		b.ObjectMetaApplyConfiguration.Annotations = make(map[string]string, len(entries))
+	}
+	for k, v := range entries {
+		b.ObjectMetaApplyConfiguration.Annotations[k] = v
+	}
+	return b
+}
+
+// WithOwnerReferences adds the given value to the OwnerReferences field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the OwnerReferences field.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithOwnerReferences(values ...*v1.OwnerReferenceApplyConfiguration) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithOwnerReferences")
+		}
+		b.ObjectMetaApplyConfiguration.OwnerReferences = append(b.ObjectMetaApplyConfiguration.OwnerReferences, *values[i])
+	}
+	return b
+}
+
+// WithFinalizers adds the given value to the Finalizers field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Finalizers field.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithFinalizers(values ...string) *PendingWorkloadsSummaryApplyConfiguration {
+	b.ensureObjectMetaApplyConfigurationExists()
+	for i := range values {
+		b.ObjectMetaApplyConfiguration.Finalizers = append(b.ObjectMetaApplyConfiguration.Finalizers, values[i])
+	}
+	return b
+}
+
+func (b *PendingWorkloadsSummaryApplyConfiguration) ensureObjectMetaApplyConfigurationExists() {
+	if b.ObjectMetaApplyConfiguration == nil {
+		b.ObjectMetaApplyConfiguration = &v1.ObjectMetaApplyConfiguration{}
+	}
+}
+
+// WithItems adds the given value to the Items field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Items field.
+func (b *PendingWorkloadsSummaryApplyConfiguration) WithItems(values ...*PendingWorkloadApplyConfiguration) *PendingWorkloadsSummaryApplyConfiguration {
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithItems")
+		}
+		b.Items = append(b.Items, *values[i])
+	}
+	return b
+}
+
+// GetKind retrieves the value of the Kind field in the declarative configuration.
+func (b *PendingWorkloadsSummaryApplyConfiguration) GetKind() *string {
+	return b.TypeMetaApplyConfiguration.Kind
+}
+
+// GetAPIVersion retrieves the value of the APIVersion field in the declarative configuration.
+func (b *PendingWorkloadsSummaryApplyConfiguration) GetAPIVersion() *string {
+	return b.TypeMetaApplyConfiguration.APIVersion
+}
+
+// GetName retrieves the value of the Name field in the declarative configuration.
+func (b *PendingWorkloadsSummaryApplyConfiguration) GetName() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Name
+}
+
+// GetNamespace retrieves the value of the Namespace field in the declarative configuration.
+func (b *PendingWorkloadsSummaryApplyConfiguration) GetNamespace() *string {
+	b.ensureObjectMetaApplyConfigurationExists()
+	return b.ObjectMetaApplyConfiguration.Namespace
+}
diff --git a/client-go/clientset/versioned/clientset.go b/client-go/clientset/versioned/clientset.go
index eae8e735f..679e26aec 100644
--- a/client-go/clientset/versioned/clientset.go
+++ b/client-go/clientset/versioned/clientset.go
@@ -28,6 +28,7 @@ import (
 	kueuev1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/kueue/v1beta1"
 	kueuev1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/kueue/v1beta2"
 	visibilityv1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta1"
+	visibilityv1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2"
 )
 
 type Interface interface {
@@ -36,6 +37,7 @@ type Interface interface {
 	KueueV1beta1() kueuev1beta1.KueueV1beta1Interface
 	KueueV1beta2() kueuev1beta2.KueueV1beta2Interface
 	VisibilityV1beta1() visibilityv1beta1.VisibilityV1beta1Interface
+	VisibilityV1beta2() visibilityv1beta2.VisibilityV1beta2Interface
 }
 
 // Clientset contains the clients for groups.
@@ -45,6 +47,7 @@ type Clientset struct {
 	kueueV1beta1      *kueuev1beta1.KueueV1beta1Client
 	kueueV1beta2      *kueuev1beta2.KueueV1beta2Client
 	visibilityV1beta1 *visibilityv1beta1.VisibilityV1beta1Client
+	visibilityV1beta2 *visibilityv1beta2.VisibilityV1beta2Client
 }
 
 // KueueV1alpha1 retrieves the KueueV1alpha1Client
@@ -67,6 +70,11 @@ func (c *Clientset) VisibilityV1beta1() visibilityv1beta1.VisibilityV1beta1Inter
 	return c.visibilityV1beta1
 }
 
+// VisibilityV1beta2 retrieves the VisibilityV1beta2Client
+func (c *Clientset) VisibilityV1beta2() visibilityv1beta2.VisibilityV1beta2Interface {
+	return c.visibilityV1beta2
+}
+
 // Discovery retrieves the DiscoveryClient
 func (c *Clientset) Discovery() discovery.DiscoveryInterface {
 	if c == nil {
@@ -127,6 +135,10 @@ func NewForConfigAndClient(c *rest.Config, httpClient *http.Client) (*Clientset,
 	if err != nil {
 		return nil, err
 	}
+	cs.visibilityV1beta2, err = visibilityv1beta2.NewForConfigAndClient(&configShallowCopy, httpClient)
+	if err != nil {
+		return nil, err
+	}
 
 	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfigAndClient(&configShallowCopy, httpClient)
 	if err != nil {
@@ -152,6 +164,7 @@ func New(c rest.Interface) *Clientset {
 	cs.kueueV1beta1 = kueuev1beta1.New(c)
 	cs.kueueV1beta2 = kueuev1beta2.New(c)
 	cs.visibilityV1beta1 = visibilityv1beta1.New(c)
+	cs.visibilityV1beta2 = visibilityv1beta2.New(c)
 
 	cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
 	return &cs
diff --git a/client-go/clientset/versioned/fake/clientset_generated.go b/client-go/clientset/versioned/fake/clientset_generated.go
index e3cdaa3a2..ec200ab89 100644
--- a/client-go/clientset/versioned/fake/clientset_generated.go
+++ b/client-go/clientset/versioned/fake/clientset_generated.go
@@ -34,6 +34,8 @@ import (
 	fakekueuev1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/kueue/v1beta2/fake"
 	visibilityv1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta1"
 	fakevisibilityv1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta1/fake"
+	visibilityv1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2"
+	fakevisibilityv1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2/fake"
 )
 
 // NewSimpleClientset returns a clientset that will respond with the provided objects.
@@ -149,3 +151,8 @@ func (c *Clientset) KueueV1beta2() kueuev1beta2.KueueV1beta2Interface {
 func (c *Clientset) VisibilityV1beta1() visibilityv1beta1.VisibilityV1beta1Interface {
 	return &fakevisibilityv1beta1.FakeVisibilityV1beta1{Fake: &c.Fake}
 }
+
+// VisibilityV1beta2 retrieves the VisibilityV1beta2Client
+func (c *Clientset) VisibilityV1beta2() visibilityv1beta2.VisibilityV1beta2Interface {
+	return &fakevisibilityv1beta2.FakeVisibilityV1beta2{Fake: &c.Fake}
+}
diff --git a/client-go/clientset/versioned/fake/register.go b/client-go/clientset/versioned/fake/register.go
index 31fb5ba9d..eb4b0b962 100644
--- a/client-go/clientset/versioned/fake/register.go
+++ b/client-go/clientset/versioned/fake/register.go
@@ -27,6 +27,7 @@ import (
 	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	kueuev1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	visibilityv1beta1 "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 )
 
 var scheme = runtime.NewScheme()
@@ -37,6 +38,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{
 	kueuev1beta1.AddToScheme,
 	kueuev1beta2.AddToScheme,
 	visibilityv1beta1.AddToScheme,
+	visibilityv1beta2.AddToScheme,
 }
 
 // AddToScheme adds all types of this clientset into the given scheme. This allows composition
diff --git a/client-go/clientset/versioned/scheme/register.go b/client-go/clientset/versioned/scheme/register.go
index 50034e589..eb61f49b8 100644
--- a/client-go/clientset/versioned/scheme/register.go
+++ b/client-go/clientset/versioned/scheme/register.go
@@ -27,6 +27,7 @@ import (
 	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	kueuev1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	visibilityv1beta1 "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 )
 
 var Scheme = runtime.NewScheme()
@@ -37,6 +38,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{
 	kueuev1beta1.AddToScheme,
 	kueuev1beta2.AddToScheme,
 	visibilityv1beta1.AddToScheme,
+	visibilityv1beta2.AddToScheme,
 }
 
 // AddToScheme adds all types of this clientset into the given scheme. This allows composition
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/clusterqueue.go b/client-go/clientset/versioned/typed/visibility/v1beta2/clusterqueue.go
new file mode 100644
index 000000000..354eb69b4
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/clusterqueue.go
@@ -0,0 +1,84 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	context "context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	gentype "k8s.io/client-go/gentype"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+	applyconfigurationvisibilityv1beta2 "sigs.k8s.io/kueue/client-go/applyconfiguration/visibility/v1beta2"
+	scheme "sigs.k8s.io/kueue/client-go/clientset/versioned/scheme"
+)
+
+// ClusterQueuesGetter has a method to return a ClusterQueueInterface.
+// A group's client should implement this interface.
+type ClusterQueuesGetter interface {
+	ClusterQueues() ClusterQueueInterface
+}
+
+// ClusterQueueInterface has methods to work with ClusterQueue resources.
+type ClusterQueueInterface interface {
+	Create(ctx context.Context, clusterQueue *visibilityv1beta2.ClusterQueue, opts v1.CreateOptions) (*visibilityv1beta2.ClusterQueue, error)
+	Update(ctx context.Context, clusterQueue *visibilityv1beta2.ClusterQueue, opts v1.UpdateOptions) (*visibilityv1beta2.ClusterQueue, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*visibilityv1beta2.ClusterQueue, error)
+	List(ctx context.Context, opts v1.ListOptions) (*visibilityv1beta2.ClusterQueueList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *visibilityv1beta2.ClusterQueue, err error)
+	Apply(ctx context.Context, clusterQueue *applyconfigurationvisibilityv1beta2.ClusterQueueApplyConfiguration, opts v1.ApplyOptions) (result *visibilityv1beta2.ClusterQueue, err error)
+	GetPendingWorkloadsSummary(ctx context.Context, clusterQueueName string, options v1.GetOptions) (*visibilityv1beta2.PendingWorkloadsSummary, error)
+
+	ClusterQueueExpansion
+}
+
+// clusterQueues implements ClusterQueueInterface
+type clusterQueues struct {
+	*gentype.ClientWithListAndApply[*visibilityv1beta2.ClusterQueue, *visibilityv1beta2.ClusterQueueList, *applyconfigurationvisibilityv1beta2.ClusterQueueApplyConfiguration]
+}
+
+// newClusterQueues returns a ClusterQueues
+func newClusterQueues(c *VisibilityV1beta2Client) *clusterQueues {
+	return &clusterQueues{
+		gentype.NewClientWithListAndApply[*visibilityv1beta2.ClusterQueue, *visibilityv1beta2.ClusterQueueList, *applyconfigurationvisibilityv1beta2.ClusterQueueApplyConfiguration](
+			"clusterqueues",
+			c.RESTClient(),
+			scheme.ParameterCodec,
+			"",
+			func() *visibilityv1beta2.ClusterQueue { return &visibilityv1beta2.ClusterQueue{} },
+			func() *visibilityv1beta2.ClusterQueueList { return &visibilityv1beta2.ClusterQueueList{} },
+		),
+	}
+}
+
+// GetPendingWorkloadsSummary takes name of the clusterQueue, and returns the corresponding visibilityv1beta2.PendingWorkloadsSummary object, and an error if there is any.
+func (c *clusterQueues) GetPendingWorkloadsSummary(ctx context.Context, clusterQueueName string, options v1.GetOptions) (result *visibilityv1beta2.PendingWorkloadsSummary, err error) {
+	result = &visibilityv1beta2.PendingWorkloadsSummary{}
+	err = c.GetClient().Get().
+		Resource("clusterqueues").
+		Name(clusterQueueName).
+		SubResource("pendingworkloads").
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/doc.go b/client-go/clientset/versioned/typed/visibility/v1beta2/doc.go
new file mode 100644
index 000000000..bfa7cbb63
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+// This package has the automatically generated typed clients.
+package v1beta2
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/fake/doc.go b/client-go/clientset/versioned/typed/visibility/v1beta2/fake/doc.go
new file mode 100644
index 000000000..3b0015925
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/fake/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+// Package fake has the automatically generated clients.
+package fake
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_clusterqueue.go b/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_clusterqueue.go
new file mode 100644
index 000000000..61925edfb
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_clusterqueue.go
@@ -0,0 +1,67 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	context "context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	gentype "k8s.io/client-go/gentype"
+	testing "k8s.io/client-go/testing"
+	v1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+	visibilityv1beta2 "sigs.k8s.io/kueue/client-go/applyconfiguration/visibility/v1beta2"
+	typedvisibilityv1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2"
+)
+
+// fakeClusterQueues implements ClusterQueueInterface
+type fakeClusterQueues struct {
+	*gentype.FakeClientWithListAndApply[*v1beta2.ClusterQueue, *v1beta2.ClusterQueueList, *visibilityv1beta2.ClusterQueueApplyConfiguration]
+	Fake *FakeVisibilityV1beta2
+}
+
+func newFakeClusterQueues(fake *FakeVisibilityV1beta2) typedvisibilityv1beta2.ClusterQueueInterface {
+	return &fakeClusterQueues{
+		gentype.NewFakeClientWithListAndApply[*v1beta2.ClusterQueue, *v1beta2.ClusterQueueList, *visibilityv1beta2.ClusterQueueApplyConfiguration](
+			fake.Fake,
+			"",
+			v1beta2.SchemeGroupVersion.WithResource("clusterqueues"),
+			v1beta2.SchemeGroupVersion.WithKind("ClusterQueue"),
+			func() *v1beta2.ClusterQueue { return &v1beta2.ClusterQueue{} },
+			func() *v1beta2.ClusterQueueList { return &v1beta2.ClusterQueueList{} },
+			func(dst, src *v1beta2.ClusterQueueList) { dst.ListMeta = src.ListMeta },
+			func(list *v1beta2.ClusterQueueList) []*v1beta2.ClusterQueue {
+				return gentype.ToPointerSlice(list.Items)
+			},
+			func(list *v1beta2.ClusterQueueList, items []*v1beta2.ClusterQueue) {
+				list.Items = gentype.FromPointerSlice(items)
+			},
+		),
+		fake,
+	}
+}
+
+// GetPendingWorkloadsSummary takes name of the clusterQueue, and returns the corresponding pendingWorkloadsSummary object, and an error if there is any.
+func (c *fakeClusterQueues) GetPendingWorkloadsSummary(ctx context.Context, clusterQueueName string, options v1.GetOptions) (result *v1beta2.PendingWorkloadsSummary, err error) {
+	emptyResult := &v1beta2.PendingWorkloadsSummary{}
+	obj, err := c.Fake.
+		Invokes(testing.NewRootGetSubresourceActionWithOptions(c.Resource(), "pendingworkloads", clusterQueueName, options), emptyResult)
+	if obj == nil {
+		return emptyResult, err
+	}
+	return obj.(*v1beta2.PendingWorkloadsSummary), err
+}
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_localqueue.go b/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_localqueue.go
new file mode 100644
index 000000000..5e44b4809
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_localqueue.go
@@ -0,0 +1,66 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	context "context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	gentype "k8s.io/client-go/gentype"
+	testing "k8s.io/client-go/testing"
+	v1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+	visibilityv1beta2 "sigs.k8s.io/kueue/client-go/applyconfiguration/visibility/v1beta2"
+	typedvisibilityv1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2"
+)
+
+// fakeLocalQueues implements LocalQueueInterface
+type fakeLocalQueues struct {
+	*gentype.FakeClientWithListAndApply[*v1beta2.LocalQueue, *v1beta2.LocalQueueList, *visibilityv1beta2.LocalQueueApplyConfiguration]
+	Fake *FakeVisibilityV1beta2
+}
+
+func newFakeLocalQueues(fake *FakeVisibilityV1beta2, namespace string) typedvisibilityv1beta2.LocalQueueInterface {
+	return &fakeLocalQueues{
+		gentype.NewFakeClientWithListAndApply[*v1beta2.LocalQueue, *v1beta2.LocalQueueList, *visibilityv1beta2.LocalQueueApplyConfiguration](
+			fake.Fake,
+			namespace,
+			v1beta2.SchemeGroupVersion.WithResource("localqueues"),
+			v1beta2.SchemeGroupVersion.WithKind("LocalQueue"),
+			func() *v1beta2.LocalQueue { return &v1beta2.LocalQueue{} },
+			func() *v1beta2.LocalQueueList { return &v1beta2.LocalQueueList{} },
+			func(dst, src *v1beta2.LocalQueueList) { dst.ListMeta = src.ListMeta },
+			func(list *v1beta2.LocalQueueList) []*v1beta2.LocalQueue { return gentype.ToPointerSlice(list.Items) },
+			func(list *v1beta2.LocalQueueList, items []*v1beta2.LocalQueue) {
+				list.Items = gentype.FromPointerSlice(items)
+			},
+		),
+		fake,
+	}
+}
+
+// GetPendingWorkloadsSummary takes name of the localQueue, and returns the corresponding pendingWorkloadsSummary object, and an error if there is any.
+func (c *fakeLocalQueues) GetPendingWorkloadsSummary(ctx context.Context, localQueueName string, options v1.GetOptions) (result *v1beta2.PendingWorkloadsSummary, err error) {
+	emptyResult := &v1beta2.PendingWorkloadsSummary{}
+	obj, err := c.Fake.
+		Invokes(testing.NewGetSubresourceActionWithOptions(c.Resource(), c.Namespace(), "pendingworkloads", localQueueName, options), emptyResult)
+
+	if obj == nil {
+		return emptyResult, err
+	}
+	return obj.(*v1beta2.PendingWorkloadsSummary), err
+}
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_visibility_client.go b/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_visibility_client.go
new file mode 100644
index 000000000..19f42d036
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/fake/fake_visibility_client.go
@@ -0,0 +1,43 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	rest "k8s.io/client-go/rest"
+	testing "k8s.io/client-go/testing"
+	v1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2"
+)
+
+type FakeVisibilityV1beta2 struct {
+	*testing.Fake
+}
+
+func (c *FakeVisibilityV1beta2) ClusterQueues() v1beta2.ClusterQueueInterface {
+	return newFakeClusterQueues(c)
+}
+
+func (c *FakeVisibilityV1beta2) LocalQueues(namespace string) v1beta2.LocalQueueInterface {
+	return newFakeLocalQueues(c, namespace)
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *FakeVisibilityV1beta2) RESTClient() rest.Interface {
+	var ret *rest.RESTClient
+	return ret
+}
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/generated_expansion.go b/client-go/clientset/versioned/typed/visibility/v1beta2/generated_expansion.go
new file mode 100644
index 000000000..ab34ee10b
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/generated_expansion.go
@@ -0,0 +1,22 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1beta2
+
+type ClusterQueueExpansion interface{}
+
+type LocalQueueExpansion interface{}
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/localqueue.go b/client-go/clientset/versioned/typed/visibility/v1beta2/localqueue.go
new file mode 100644
index 000000000..c4b2d5203
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/localqueue.go
@@ -0,0 +1,85 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	context "context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	gentype "k8s.io/client-go/gentype"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+	applyconfigurationvisibilityv1beta2 "sigs.k8s.io/kueue/client-go/applyconfiguration/visibility/v1beta2"
+	scheme "sigs.k8s.io/kueue/client-go/clientset/versioned/scheme"
+)
+
+// LocalQueuesGetter has a method to return a LocalQueueInterface.
+// A group's client should implement this interface.
+type LocalQueuesGetter interface {
+	LocalQueues(namespace string) LocalQueueInterface
+}
+
+// LocalQueueInterface has methods to work with LocalQueue resources.
+type LocalQueueInterface interface {
+	Create(ctx context.Context, localQueue *visibilityv1beta2.LocalQueue, opts v1.CreateOptions) (*visibilityv1beta2.LocalQueue, error)
+	Update(ctx context.Context, localQueue *visibilityv1beta2.LocalQueue, opts v1.UpdateOptions) (*visibilityv1beta2.LocalQueue, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*visibilityv1beta2.LocalQueue, error)
+	List(ctx context.Context, opts v1.ListOptions) (*visibilityv1beta2.LocalQueueList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *visibilityv1beta2.LocalQueue, err error)
+	Apply(ctx context.Context, localQueue *applyconfigurationvisibilityv1beta2.LocalQueueApplyConfiguration, opts v1.ApplyOptions) (result *visibilityv1beta2.LocalQueue, err error)
+	GetPendingWorkloadsSummary(ctx context.Context, localQueueName string, options v1.GetOptions) (*visibilityv1beta2.PendingWorkloadsSummary, error)
+
+	LocalQueueExpansion
+}
+
+// localQueues implements LocalQueueInterface
+type localQueues struct {
+	*gentype.ClientWithListAndApply[*visibilityv1beta2.LocalQueue, *visibilityv1beta2.LocalQueueList, *applyconfigurationvisibilityv1beta2.LocalQueueApplyConfiguration]
+}
+
+// newLocalQueues returns a LocalQueues
+func newLocalQueues(c *VisibilityV1beta2Client, namespace string) *localQueues {
+	return &localQueues{
+		gentype.NewClientWithListAndApply[*visibilityv1beta2.LocalQueue, *visibilityv1beta2.LocalQueueList, *applyconfigurationvisibilityv1beta2.LocalQueueApplyConfiguration](
+			"localqueues",
+			c.RESTClient(),
+			scheme.ParameterCodec,
+			namespace,
+			func() *visibilityv1beta2.LocalQueue { return &visibilityv1beta2.LocalQueue{} },
+			func() *visibilityv1beta2.LocalQueueList { return &visibilityv1beta2.LocalQueueList{} },
+		),
+	}
+}
+
+// GetPendingWorkloadsSummary takes name of the localQueue, and returns the corresponding visibilityv1beta2.PendingWorkloadsSummary object, and an error if there is any.
+func (c *localQueues) GetPendingWorkloadsSummary(ctx context.Context, localQueueName string, options v1.GetOptions) (result *visibilityv1beta2.PendingWorkloadsSummary, err error) {
+	result = &visibilityv1beta2.PendingWorkloadsSummary{}
+	err = c.GetClient().Get().
+		Namespace(c.GetNamespace()).
+		Resource("localqueues").
+		Name(localQueueName).
+		SubResource("pendingworkloads").
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/client-go/clientset/versioned/typed/visibility/v1beta2/visibility_client.go b/client-go/clientset/versioned/typed/visibility/v1beta2/visibility_client.go
new file mode 100644
index 000000000..fd1b452b2
--- /dev/null
+++ b/client-go/clientset/versioned/typed/visibility/v1beta2/visibility_client.go
@@ -0,0 +1,105 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	http "net/http"
+
+	rest "k8s.io/client-go/rest"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+	scheme "sigs.k8s.io/kueue/client-go/clientset/versioned/scheme"
+)
+
+type VisibilityV1beta2Interface interface {
+	RESTClient() rest.Interface
+	ClusterQueuesGetter
+	LocalQueuesGetter
+}
+
+// VisibilityV1beta2Client is used to interact with features provided by the visibility.kueue.x-k8s.io group.
+type VisibilityV1beta2Client struct {
+	restClient rest.Interface
+}
+
+func (c *VisibilityV1beta2Client) ClusterQueues() ClusterQueueInterface {
+	return newClusterQueues(c)
+}
+
+func (c *VisibilityV1beta2Client) LocalQueues(namespace string) LocalQueueInterface {
+	return newLocalQueues(c, namespace)
+}
+
+// NewForConfig creates a new VisibilityV1beta2Client for the given config.
+// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient),
+// where httpClient was generated with rest.HTTPClientFor(c).
+func NewForConfig(c *rest.Config) (*VisibilityV1beta2Client, error) {
+	config := *c
+	setConfigDefaults(&config)
+	httpClient, err := rest.HTTPClientFor(&config)
+	if err != nil {
+		return nil, err
+	}
+	return NewForConfigAndClient(&config, httpClient)
+}
+
+// NewForConfigAndClient creates a new VisibilityV1beta2Client for the given config and http client.
+// Note the http client provided takes precedence over the configured transport values.
+func NewForConfigAndClient(c *rest.Config, h *http.Client) (*VisibilityV1beta2Client, error) {
+	config := *c
+	setConfigDefaults(&config)
+	client, err := rest.RESTClientForConfigAndClient(&config, h)
+	if err != nil {
+		return nil, err
+	}
+	return &VisibilityV1beta2Client{client}, nil
+}
+
+// NewForConfigOrDie creates a new VisibilityV1beta2Client for the given config and
+// panics if there is an error in the config.
+func NewForConfigOrDie(c *rest.Config) *VisibilityV1beta2Client {
+	client, err := NewForConfig(c)
+	if err != nil {
+		panic(err)
+	}
+	return client
+}
+
+// New creates a new VisibilityV1beta2Client for the given RESTClient.
+func New(c rest.Interface) *VisibilityV1beta2Client {
+	return &VisibilityV1beta2Client{c}
+}
+
+func setConfigDefaults(config *rest.Config) {
+	gv := visibilityv1beta2.SchemeGroupVersion
+	config.GroupVersion = &gv
+	config.APIPath = "/apis"
+	config.NegotiatedSerializer = rest.CodecFactoryForGeneratedClient(scheme.Scheme, scheme.Codecs).WithoutConversion()
+
+	if config.UserAgent == "" {
+		config.UserAgent = rest.DefaultKubernetesUserAgent()
+	}
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *VisibilityV1beta2Client) RESTClient() rest.Interface {
+	if c == nil {
+		return nil
+	}
+	return c.restClient
+}
diff --git a/client-go/informers/externalversions/generic.go b/client-go/informers/externalversions/generic.go
index 55e66176f..1e19dcc75 100644
--- a/client-go/informers/externalversions/generic.go
+++ b/client-go/informers/externalversions/generic.go
@@ -25,6 +25,7 @@ import (
 	v1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	v1beta2 "sigs.k8s.io/kueue/apis/kueue/v1beta2"
 	visibilityv1beta1 "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 )
 
 // GenericInformer is type of SharedIndexInformer which will locate and delegate to other
@@ -107,6 +108,12 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource
 	case visibilityv1beta1.SchemeGroupVersion.WithResource("localqueues"):
 		return &genericInformer{resource: resource.GroupResource(), informer: f.Visibility().V1beta1().LocalQueues().Informer()}, nil
 
+		// Group=visibility.kueue.x-k8s.io, Version=v1beta2
+	case visibilityv1beta2.SchemeGroupVersion.WithResource("clusterqueues"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Visibility().V1beta2().ClusterQueues().Informer()}, nil
+	case visibilityv1beta2.SchemeGroupVersion.WithResource("localqueues"):
+		return &genericInformer{resource: resource.GroupResource(), informer: f.Visibility().V1beta2().LocalQueues().Informer()}, nil
+
 	}
 
 	return nil, fmt.Errorf("no informer found for %v", resource)
diff --git a/client-go/informers/externalversions/visibility/interface.go b/client-go/informers/externalversions/visibility/interface.go
index 90d318603..0166df616 100644
--- a/client-go/informers/externalversions/visibility/interface.go
+++ b/client-go/informers/externalversions/visibility/interface.go
@@ -20,12 +20,15 @@ package visibility
 import (
 	internalinterfaces "sigs.k8s.io/kueue/client-go/informers/externalversions/internalinterfaces"
 	v1beta1 "sigs.k8s.io/kueue/client-go/informers/externalversions/visibility/v1beta1"
+	v1beta2 "sigs.k8s.io/kueue/client-go/informers/externalversions/visibility/v1beta2"
 )
 
 // Interface provides access to each of this group's versions.
 type Interface interface {
 	// V1beta1 provides access to shared informers for resources in V1beta1.
 	V1beta1() v1beta1.Interface
+	// V1beta2 provides access to shared informers for resources in V1beta2.
+	V1beta2() v1beta2.Interface
 }
 
 type group struct {
@@ -43,3 +46,8 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList
 func (g *group) V1beta1() v1beta1.Interface {
 	return v1beta1.New(g.factory, g.namespace, g.tweakListOptions)
 }
+
+// V1beta2 returns a new v1beta2.Interface.
+func (g *group) V1beta2() v1beta2.Interface {
+	return v1beta2.New(g.factory, g.namespace, g.tweakListOptions)
+}
diff --git a/client-go/informers/externalversions/visibility/v1beta2/clusterqueue.go b/client-go/informers/externalversions/visibility/v1beta2/clusterqueue.go
new file mode 100644
index 000000000..ea0dda2b2
--- /dev/null
+++ b/client-go/informers/externalversions/visibility/v1beta2/clusterqueue.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.
+*/
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	context "context"
+	time "time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	watch "k8s.io/apimachinery/pkg/watch"
+	cache "k8s.io/client-go/tools/cache"
+	apisvisibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+	versioned "sigs.k8s.io/kueue/client-go/clientset/versioned"
+	internalinterfaces "sigs.k8s.io/kueue/client-go/informers/externalversions/internalinterfaces"
+	visibilityv1beta2 "sigs.k8s.io/kueue/client-go/listers/visibility/v1beta2"
+)
+
+// ClusterQueueInformer provides access to a shared informer and lister for
+// ClusterQueues.
+type ClusterQueueInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() visibilityv1beta2.ClusterQueueLister
+}
+
+type clusterQueueInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// NewClusterQueueInformer constructs a new informer for ClusterQueue 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 NewClusterQueueInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredClusterQueueInformer(client, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredClusterQueueInformer constructs a new informer for ClusterQueue 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 NewFilteredClusterQueueInformer(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.VisibilityV1beta2().ClusterQueues().List(context.Background(), options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.VisibilityV1beta2().ClusterQueues().Watch(context.Background(), options)
+			},
+			ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.VisibilityV1beta2().ClusterQueues().List(ctx, options)
+			},
+			WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.VisibilityV1beta2().ClusterQueues().Watch(ctx, options)
+			},
+		},
+		&apisvisibilityv1beta2.ClusterQueue{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *clusterQueueInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredClusterQueueInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *clusterQueueInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&apisvisibilityv1beta2.ClusterQueue{}, f.defaultInformer)
+}
+
+func (f *clusterQueueInformer) Lister() visibilityv1beta2.ClusterQueueLister {
+	return visibilityv1beta2.NewClusterQueueLister(f.Informer().GetIndexer())
+}
diff --git a/client-go/informers/externalversions/visibility/v1beta2/interface.go b/client-go/informers/externalversions/visibility/v1beta2/interface.go
new file mode 100644
index 000000000..b13c09b73
--- /dev/null
+++ b/client-go/informers/externalversions/visibility/v1beta2/interface.go
@@ -0,0 +1,51 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	internalinterfaces "sigs.k8s.io/kueue/client-go/informers/externalversions/internalinterfaces"
+)
+
+// Interface provides access to all the informers in this group version.
+type Interface interface {
+	// ClusterQueues returns a ClusterQueueInformer.
+	ClusterQueues() ClusterQueueInformer
+	// LocalQueues returns a LocalQueueInformer.
+	LocalQueues() LocalQueueInformer
+}
+
+type version struct {
+	factory          internalinterfaces.SharedInformerFactory
+	namespace        string
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// New returns a new Interface.
+func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
+	return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
+}
+
+// ClusterQueues returns a ClusterQueueInformer.
+func (v *version) ClusterQueues() ClusterQueueInformer {
+	return &clusterQueueInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
+}
+
+// LocalQueues returns a LocalQueueInformer.
+func (v *version) LocalQueues() LocalQueueInformer {
+	return &localQueueInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+}
diff --git a/client-go/informers/externalversions/visibility/v1beta2/localqueue.go b/client-go/informers/externalversions/visibility/v1beta2/localqueue.go
new file mode 100644
index 000000000..0380eb1fd
--- /dev/null
+++ b/client-go/informers/externalversions/visibility/v1beta2/localqueue.go
@@ -0,0 +1,101 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	context "context"
+	time "time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	watch "k8s.io/apimachinery/pkg/watch"
+	cache "k8s.io/client-go/tools/cache"
+	apisvisibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+	versioned "sigs.k8s.io/kueue/client-go/clientset/versioned"
+	internalinterfaces "sigs.k8s.io/kueue/client-go/informers/externalversions/internalinterfaces"
+	visibilityv1beta2 "sigs.k8s.io/kueue/client-go/listers/visibility/v1beta2"
+)
+
+// LocalQueueInformer provides access to a shared informer and lister for
+// LocalQueues.
+type LocalQueueInformer interface {
+	Informer() cache.SharedIndexInformer
+	Lister() visibilityv1beta2.LocalQueueLister
+}
+
+type localQueueInformer struct {
+	factory          internalinterfaces.SharedInformerFactory
+	tweakListOptions internalinterfaces.TweakListOptionsFunc
+	namespace        string
+}
+
+// NewLocalQueueInformer constructs a new informer for LocalQueue 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 NewLocalQueueInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+	return NewFilteredLocalQueueInformer(client, namespace, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredLocalQueueInformer constructs a new informer for LocalQueue 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 NewFilteredLocalQueueInformer(client versioned.Interface, namespace string, 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.VisibilityV1beta2().LocalQueues(namespace).List(context.Background(), options)
+			},
+			WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.VisibilityV1beta2().LocalQueues(namespace).Watch(context.Background(), options)
+			},
+			ListWithContextFunc: func(ctx context.Context, options v1.ListOptions) (runtime.Object, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.VisibilityV1beta2().LocalQueues(namespace).List(ctx, options)
+			},
+			WatchFuncWithContext: func(ctx context.Context, options v1.ListOptions) (watch.Interface, error) {
+				if tweakListOptions != nil {
+					tweakListOptions(&options)
+				}
+				return client.VisibilityV1beta2().LocalQueues(namespace).Watch(ctx, options)
+			},
+		},
+		&apisvisibilityv1beta2.LocalQueue{},
+		resyncPeriod,
+		indexers,
+	)
+}
+
+func (f *localQueueInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+	return NewFilteredLocalQueueInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *localQueueInformer) Informer() cache.SharedIndexInformer {
+	return f.factory.InformerFor(&apisvisibilityv1beta2.LocalQueue{}, f.defaultInformer)
+}
+
+func (f *localQueueInformer) Lister() visibilityv1beta2.LocalQueueLister {
+	return visibilityv1beta2.NewLocalQueueLister(f.Informer().GetIndexer())
+}
diff --git a/client-go/listers/visibility/v1beta2/clusterqueue.go b/client-go/listers/visibility/v1beta2/clusterqueue.go
new file mode 100644
index 000000000..a9f88fb7d
--- /dev/null
+++ b/client-go/listers/visibility/v1beta2/clusterqueue.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 lister-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	labels "k8s.io/apimachinery/pkg/labels"
+	listers "k8s.io/client-go/listers"
+	cache "k8s.io/client-go/tools/cache"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+)
+
+// ClusterQueueLister helps list ClusterQueues.
+// All objects returned here must be treated as read-only.
+type ClusterQueueLister interface {
+	// List lists all ClusterQueues in the indexer.
+	// Objects returned here must be treated as read-only.
+	List(selector labels.Selector) (ret []*visibilityv1beta2.ClusterQueue, err error)
+	// Get retrieves the ClusterQueue from the index for a given name.
+	// Objects returned here must be treated as read-only.
+	Get(name string) (*visibilityv1beta2.ClusterQueue, error)
+	ClusterQueueListerExpansion
+}
+
+// clusterQueueLister implements the ClusterQueueLister interface.
+type clusterQueueLister struct {
+	listers.ResourceIndexer[*visibilityv1beta2.ClusterQueue]
+}
+
+// NewClusterQueueLister returns a new ClusterQueueLister.
+func NewClusterQueueLister(indexer cache.Indexer) ClusterQueueLister {
+	return &clusterQueueLister{listers.New[*visibilityv1beta2.ClusterQueue](indexer, visibilityv1beta2.Resource("clusterqueue"))}
+}
diff --git a/client-go/listers/visibility/v1beta2/expansion_generated.go b/client-go/listers/visibility/v1beta2/expansion_generated.go
new file mode 100644
index 000000000..4100065a3
--- /dev/null
+++ b/client-go/listers/visibility/v1beta2/expansion_generated.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.
+*/
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1beta2
+
+// ClusterQueueListerExpansion allows custom methods to be added to
+// ClusterQueueLister.
+type ClusterQueueListerExpansion interface{}
+
+// LocalQueueListerExpansion allows custom methods to be added to
+// LocalQueueLister.
+type LocalQueueListerExpansion interface{}
+
+// LocalQueueNamespaceListerExpansion allows custom methods to be added to
+// LocalQueueNamespaceLister.
+type LocalQueueNamespaceListerExpansion interface{}
diff --git a/client-go/listers/visibility/v1beta2/localqueue.go b/client-go/listers/visibility/v1beta2/localqueue.go
new file mode 100644
index 000000000..2c5e46a2a
--- /dev/null
+++ b/client-go/listers/visibility/v1beta2/localqueue.go
@@ -0,0 +1,69 @@
+/*
+Copyright The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v1beta2
+
+import (
+	labels "k8s.io/apimachinery/pkg/labels"
+	listers "k8s.io/client-go/listers"
+	cache "k8s.io/client-go/tools/cache"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
+)
+
+// LocalQueueLister helps list LocalQueues.
+// All objects returned here must be treated as read-only.
+type LocalQueueLister interface {
+	// List lists all LocalQueues in the indexer.
+	// Objects returned here must be treated as read-only.
+	List(selector labels.Selector) (ret []*visibilityv1beta2.LocalQueue, err error)
+	// LocalQueues returns an object that can list and get LocalQueues.
+	LocalQueues(namespace string) LocalQueueNamespaceLister
+	LocalQueueListerExpansion
+}
+
+// localQueueLister implements the LocalQueueLister interface.
+type localQueueLister struct {
+	listers.ResourceIndexer[*visibilityv1beta2.LocalQueue]
+}
+
+// NewLocalQueueLister returns a new LocalQueueLister.
+func NewLocalQueueLister(indexer cache.Indexer) LocalQueueLister {
+	return &localQueueLister{listers.New[*visibilityv1beta2.LocalQueue](indexer, visibilityv1beta2.Resource("localqueue"))}
+}
+
+// LocalQueues returns an object that can list and get LocalQueues.
+func (s *localQueueLister) LocalQueues(namespace string) LocalQueueNamespaceLister {
+	return localQueueNamespaceLister{listers.NewNamespaced[*visibilityv1beta2.LocalQueue](s.ResourceIndexer, namespace)}
+}
+
+// LocalQueueNamespaceLister helps list and get LocalQueues.
+// All objects returned here must be treated as read-only.
+type LocalQueueNamespaceLister interface {
+	// List lists all LocalQueues in the indexer for a given namespace.
+	// Objects returned here must be treated as read-only.
+	List(selector labels.Selector) (ret []*visibilityv1beta2.LocalQueue, err error)
+	// Get retrieves the LocalQueue from the indexer for a given namespace and name.
+	// Objects returned here must be treated as read-only.
+	Get(name string) (*visibilityv1beta2.LocalQueue, error)
+	LocalQueueNamespaceListerExpansion
+}
+
+// localQueueNamespaceLister implements the LocalQueueNamespaceLister
+// interface.
+type localQueueNamespaceLister struct {
+	listers.ResourceIndexer[*visibilityv1beta2.LocalQueue]
+}
diff --git a/cmd/kueuectl/app/list/list_workload.go b/cmd/kueuectl/app/list/list_workload.go
index 6d7933319..e790e6430 100644
--- a/cmd/kueuectl/app/list/list_workload.go
+++ b/cmd/kueuectl/app/list/list_workload.go
@@ -36,7 +36,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	clientset "sigs.k8s.io/kueue/client-go/clientset/versioned"
 	"sigs.k8s.io/kueue/client-go/clientset/versioned/scheme"
 	"sigs.k8s.io/kueue/cmd/kueuectl/app/completion"
@@ -451,7 +451,7 @@ func (o *WorkloadOptions) pendingWorkloads(ctx context.Context, list *kueue.Work
 		}
 		pendingWorkloadsSummary, ok := pendingWorkloadsSummaries[clusterQueueName]
 		if !ok {
-			pendingWorkloadsSummary, err = o.ClientSet.VisibilityV1beta1().ClusterQueues().
+			pendingWorkloadsSummary, err = o.ClientSet.VisibilityV1beta2().ClusterQueues().
 				GetPendingWorkloadsSummary(ctx, string(clusterQueueName), metav1.GetOptions{})
 			if client.IgnoreNotFound(err) != nil {
 				return nil, err
diff --git a/cmd/kueuectl/app/list/list_workload_printer.go b/cmd/kueuectl/app/list/list_workload_printer.go
index 0bec93d1c..8a6d05506 100644
--- a/cmd/kueuectl/app/list/list_workload_printer.go
+++ b/cmd/kueuectl/app/list/list_workload_printer.go
@@ -31,7 +31,7 @@ import (
 	"k8s.io/utils/clock"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
diff --git a/config/components/visibility/apiservice_v1beta2.yaml b/config/components/visibility/apiservice_v1beta2.yaml
new file mode 100644
index 000000000..011aba596
--- /dev/null
+++ b/config/components/visibility/apiservice_v1beta2.yaml
@@ -0,0 +1,13 @@
+apiVersion: apiregistration.k8s.io/v1
+kind: APIService
+metadata:
+  name: v1beta2.visibility.kueue.x-k8s.io
+spec:
+  group: visibility.kueue.x-k8s.io
+  groupPriorityMinimum: 100
+  insecureSkipTLSVerify: true
+  service:
+    name: visibility-server
+    namespace: kueue-system
+  version: v1beta2
+  versionPriority: 100
\ No newline at end of file
diff --git a/config/components/visibility/kustomization.yaml b/config/components/visibility/kustomization.yaml
index 18bd0173c..96162046c 100644
--- a/config/components/visibility/kustomization.yaml
+++ b/config/components/visibility/kustomization.yaml
@@ -1,5 +1,6 @@
 resources:
 - apiservice_v1beta1.yaml
+- apiservice_v1beta2.yaml
 - role_binding.yaml
 - service.yaml
 
diff --git a/keps/3589-manage-jobs-selectively/kep.yaml b/keps/3589-manage-jobs-selectively/kep.yaml
index feb272357..b367a98c5 100644
--- a/keps/3589-manage-jobs-selectively/kep.yaml
+++ b/keps/3589-manage-jobs-selectively/kep.yaml
@@ -12,16 +12,17 @@ approvers:
   - "@tenzen-y"
 
 # The target maturity stage in the current dev cycle for this KEP.
-stage: beta
+stage: stable
 
 # The most recent milestone for which work toward delivery of this KEP has been
 # done. This can be the current (upcoming) milestone, if it is being actively
 # worked on.
-latest-milestone: "v0.10"
+latest-milestone: "v0.13"
 
 # The milestone at which this feature was, or is targeted to be, at each stage.
 milestone:
   beta: "v0.10"
+  stable: "v0.13"
 
 feature-gates:
   - name: ManagedJobsNamespaceSelector
diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go
index fd0d1bf62..5e629a344 100644
--- a/pkg/features/kube_features.go
+++ b/pkg/features/kube_features.go
@@ -96,12 +96,6 @@ const (
 	// all currently available ResourceFlavors for the LocalQueue.
 	ExposeFlavorsInLocalQueue featuregate.Feature = "ExposeFlavorsInLocalQueue"
 
-	// owner: @dgrove-oss
-	// kep: https://github.com/kubernetes-sigs/kueue/tree/main/keps/3589-manage-jobs-selectively
-	//
-	// Enable namespace-based control of manageJobsWithoutQueueNames for all Job integrations
-	ManagedJobsNamespaceSelector featuregate.Feature = "ManagedJobsNamespaceSelector"
-
 	// owner: @kpostoffice
 	// kep: https://github.com/kubernetes-sigs/kueue/tree/main/keps/1833-metrics-for-local-queue
 	//
@@ -270,10 +264,6 @@ var defaultVersionedFeatureGates = map[featuregate.Feature]featuregate.Versioned
 	ExposeFlavorsInLocalQueue: {
 		{Version: version.MustParse("0.9"), Default: true, PreRelease: featuregate.Beta},
 	},
-	ManagedJobsNamespaceSelector: {
-		{Version: version.MustParse("0.10"), Default: true, PreRelease: featuregate.Beta},
-		{Version: version.MustParse("0.13"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 0.15
-	},
 	LocalQueueMetrics: {
 		{Version: version.MustParse("0.10"), Default: false, PreRelease: featuregate.Alpha},
 	},
diff --git a/pkg/visibility/api/install.go b/pkg/visibility/api/install.go
deleted file mode 100644
index 4d75ae40f..000000000
--- a/pkg/visibility/api/install.go
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-Copyright The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package api
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"k8s.io/apimachinery/pkg/runtime/serializer"
-	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
-	genericapiserver "k8s.io/apiserver/pkg/server"
-
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
-	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
-	visibilityapi "sigs.k8s.io/kueue/pkg/visibility/api/v1beta1"
-)
-
-var (
-	Scheme         = runtime.NewScheme()
-	Codecs         = serializer.NewCodecFactory(Scheme)
-	ParameterCodec = runtime.NewParameterCodec(Scheme)
-)
-
-func init() {
-	utilruntime.Must(visibility.AddToScheme(Scheme))
-	utilruntime.Must(Scheme.SetVersionPriority(visibility.GroupVersion))
-	metav1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
-}
-
-// Install installs API scheme and registers storages
-func Install(server *genericapiserver.GenericAPIServer, kueueMgr *qcache.Manager) error {
-	apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(visibility.GroupVersion.Group, Scheme, ParameterCodec, Codecs)
-	apiGroupInfo.VersionedResourcesStorageMap[visibility.GroupVersion.Version] = visibilityapi.NewStorage(kueueMgr)
-	return server.InstallAPIGroups(&apiGroupInfo)
-}
diff --git a/pkg/visibility/server.go b/pkg/visibility/server.go
index 4fe37c1a4..9bf97ffae 100644
--- a/pkg/visibility/server.go
+++ b/pkg/visibility/server.go
@@ -22,6 +22,11 @@ import (
 	"net"
 	"strings"
 
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 	validatingadmissionpolicy "k8s.io/apiserver/pkg/admission/plugin/policy/validating"
 	"k8s.io/apiserver/pkg/admission/plugin/resourcequota"
 	mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating"
@@ -34,14 +39,18 @@ import (
 	"k8s.io/component-base/version"
 
 	generatedopenapi "sigs.k8s.io/kueue/apis/visibility/openapi"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibilityv1beta1 "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibilityv1beta2 "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
-	"sigs.k8s.io/kueue/pkg/visibility/api"
+	"sigs.k8s.io/kueue/pkg/visibility/storage"
 
 	_ "k8s.io/component-base/metrics/prometheus/restclient" // for client-go metrics registration
 )
 
 var (
+	scheme         = runtime.NewScheme()
+	codecs         = serializer.NewCodecFactory(scheme)
+	parameterCodec = runtime.NewParameterCodec(scheme)
 	// Admission plugins that are enabled by default in the kubeapi server
 	// but are not required for the visibility server.
 	disabledPlugins = []string{
@@ -53,11 +62,17 @@ var (
 	certDir = "/visibility"
 )
 
+func init() {
+	utilruntime.Must(visibilityv1beta2.AddToScheme(scheme))
+	utilruntime.Must(visibilityv1beta1.AddToScheme(scheme))
+	metav1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"})
+}
+
 // +kubebuilder:rbac:groups=flowcontrol.apiserver.k8s.io,resources=prioritylevelconfigurations,verbs=list;watch
 // +kubebuilder:rbac:groups=flowcontrol.apiserver.k8s.io,resources=flowschemas,verbs=list;watch
 // +kubebuilder:rbac:groups=flowcontrol.apiserver.k8s.io,resources=flowschemas/status,verbs=patch
 
-// CreateAndStartVisibilityServer creates visibility server injecting KueueManager and starts it
+// CreateAndStartVisibilityServer creates a visibility server injecting KueueManager and starts it
 func CreateAndStartVisibilityServer(ctx context.Context, kueueMgr *qcache.Manager, enableInternalCertManagement bool, kubeConfig *rest.Config) error {
 	config := newVisibilityServerConfig(kubeConfig)
 	if err := applyVisibilityServerOptions(config, enableInternalCertManagement); err != nil {
@@ -69,7 +84,7 @@ func CreateAndStartVisibilityServer(ctx context.Context, kueueMgr *qcache.Manage
 		return fmt.Errorf("unable to create visibility server: %w", err)
 	}
 
-	if err := api.Install(visibilityServer, kueueMgr); err != nil {
+	if err := install(visibilityServer, kueueMgr); err != nil {
 		return fmt.Errorf("unable to install visibility.kueue.x-k8s.io API: %w", err)
 	}
 
@@ -81,7 +96,10 @@ func CreateAndStartVisibilityServer(ctx context.Context, kueueMgr *qcache.Manage
 }
 
 func applyVisibilityServerOptions(config *genericapiserver.RecommendedConfig, enableInternalCertManagement bool) error {
-	o := genericoptions.NewRecommendedOptions("", api.Codecs.LegacyCodec(visibility.SchemeGroupVersion))
+	o := genericoptions.NewRecommendedOptions("", codecs.LegacyCodec(
+		visibilityv1beta2.SchemeGroupVersion,
+		visibilityv1beta1.SchemeGroupVersion,
+	))
 	o.Etcd = nil
 	o.SecureServing.BindPort = 8082
 	if enableInternalCertManagement {
@@ -99,13 +117,13 @@ func applyVisibilityServerOptions(config *genericapiserver.RecommendedConfig, en
 }
 
 func newVisibilityServerConfig(kubeConfig *rest.Config) *genericapiserver.RecommendedConfig {
-	c := genericapiserver.NewRecommendedConfig(api.Codecs)
+	c := genericapiserver.NewRecommendedConfig(codecs)
 	versionInfo := version.Get()
 	version := strings.Split(versionInfo.String(), "-")[0]
 	// enable OpenAPI schemas
 	c.EffectiveVersion = compatibility.NewEffectiveVersionFromString(version, "", "")
-	c.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(api.Scheme))
-	c.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(api.Scheme))
+	c.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(scheme))
+	c.OpenAPIV3Config = genericapiserver.DefaultOpenAPIV3Config(generatedopenapi.GetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(scheme))
 	c.OpenAPIConfig.Info.Title = "Kueue visibility-server"
 	c.OpenAPIV3Config.Info.Title = "Kueue visibility-server"
 	c.OpenAPIConfig.Info.Version = version
@@ -116,3 +134,13 @@ func newVisibilityServerConfig(kubeConfig *rest.Config) *genericapiserver.Recomm
 
 	return c
 }
+
+// install installs API scheme and registers storages
+func install(server *genericapiserver.GenericAPIServer, kueueMgr *qcache.Manager) error {
+	apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(visibilityv1beta2.GroupVersion.Group, scheme, parameterCodec, codecs)
+	storage := storage.NewStorage(kueueMgr)
+	apiGroupInfo.VersionedResourcesStorageMap[visibilityv1beta2.GroupVersion.Version] = storage
+	apiGroupInfo.VersionedResourcesStorageMap[visibilityv1beta1.GroupVersion.Version] = storage
+	apiGroupInfo.PrioritizedVersions = []schema.GroupVersion{visibilityv1beta2.GroupVersion, visibilityv1beta1.GroupVersion}
+	return server.InstallAPIGroups(&apiGroupInfo)
+}
diff --git a/pkg/visibility/api/v1beta1/cluster_queue.go b/pkg/visibility/storage/cluster_queue.go
similarity index 95%
rename from pkg/visibility/api/v1beta1/cluster_queue.go
rename to pkg/visibility/storage/cluster_queue.go
index fa19d5e4a..e380a20f2 100644
--- a/pkg/visibility/api/v1beta1/cluster_queue.go
+++ b/pkg/visibility/storage/cluster_queue.go
@@ -14,13 +14,13 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apiserver/pkg/registry/rest"
 
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 )
 
 // CqREST type is used only to install clusterqueues/ resource, so we can install clusterqueues/pending_workloads subresource.
diff --git a/pkg/visibility/api/v1beta1/local_queue.go b/pkg/visibility/storage/local_queue.go
similarity index 95%
rename from pkg/visibility/api/v1beta1/local_queue.go
rename to pkg/visibility/storage/local_queue.go
index 43748edaf..ef352a7d8 100644
--- a/pkg/visibility/api/v1beta1/local_queue.go
+++ b/pkg/visibility/storage/local_queue.go
@@ -14,13 +14,13 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apiserver/pkg/registry/rest"
 
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 )
 
 // LqREST type is used only to install localqueues/ resource, so we can install localqueues/pending_workloads subresource.
diff --git a/pkg/visibility/api/v1beta1/pending_workloads_cq.go b/pkg/visibility/storage/pending_workloads_cq.go
similarity index 97%
rename from pkg/visibility/api/v1beta1/pending_workloads_cq.go
rename to pkg/visibility/storage/pending_workloads_cq.go
index 12fc8e028..8378e522f 100644
--- a/pkg/visibility/api/v1beta1/pending_workloads_cq.go
+++ b/pkg/visibility/storage/pending_workloads_cq.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
 	"context"
@@ -27,7 +27,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	"sigs.k8s.io/kueue/pkg/constants"
 
diff --git a/pkg/visibility/api/v1beta1/pending_workloads_lq.go b/pkg/visibility/storage/pending_workloads_lq.go
similarity index 97%
rename from pkg/visibility/api/v1beta1/pending_workloads_lq.go
rename to pkg/visibility/storage/pending_workloads_lq.go
index 227a4bcb5..8a0b4e200 100644
--- a/pkg/visibility/api/v1beta1/pending_workloads_lq.go
+++ b/pkg/visibility/storage/pending_workloads_lq.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
 	"context"
@@ -28,7 +28,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	"sigs.k8s.io/kueue/pkg/constants"
 	utilqueue "sigs.k8s.io/kueue/pkg/util/queue"
diff --git a/pkg/visibility/api/v1beta1/storage.go b/pkg/visibility/storage/storage.go
similarity index 98%
rename from pkg/visibility/api/v1beta1/storage.go
rename to pkg/visibility/storage/storage.go
index f641d2e8b..6ac13e382 100644
--- a/pkg/visibility/api/v1beta1/storage.go
+++ b/pkg/visibility/storage/storage.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
 	"k8s.io/apiserver/pkg/registry/rest"
diff --git a/pkg/visibility/api/v1beta1/utils.go b/pkg/visibility/storage/utils.go
similarity index 87%
rename from pkg/visibility/api/v1beta1/utils.go
rename to pkg/visibility/storage/utils.go
index f9f7a455f..f9f66c016 100644
--- a/pkg/visibility/api/v1beta1/utils.go
+++ b/pkg/visibility/storage/utils.go
@@ -14,13 +14,12 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
@@ -43,7 +42,7 @@ func newPendingWorkload(wlInfo *workload.Info, positionInLq int32, positionInCq
 		},
 		PositionInClusterQueue: int32(positionInCq),
 		Priority:               *wlInfo.Obj.Spec.Priority,
-		LocalQueueName:         kueuev1beta1.LocalQueueName(wlInfo.Obj.Spec.QueueName),
+		LocalQueueName:         wlInfo.Obj.Spec.QueueName,
 		PositionInLocalQueue:   positionInLq,
 	}
 }
diff --git a/site/content/en/docs/installation/_index.md b/site/content/en/docs/installation/_index.md
index 5481a0325..1673f0634 100644
--- a/site/content/en/docs/installation/_index.md
+++ b/site/content/en/docs/installation/_index.md
@@ -307,8 +307,6 @@ The SanitizePodSets feature is available starting from versions 0.13.8 and 0.14.
 
 | Feature                               | Default | Stage      | Since | Until |
 |---------------------------------------| ------- | ---------- | ----- | ----- |
-| `ManagedJobsNamespaceSelector`        | `true`  | Beta       | 0.10  | 0.13  |
-| `ManagedJobsNamespaceSelector`        | `true`  | GA         | 0.13  |       |
 | `ProvisioningACC`                     | `false` | Alpha      | 0.5   | 0.6   |
 | `ProvisioningACC`                     | `true`  | Beta       | 0.7   |       |
 | `ProvisioningACC`                     | `true`  | GA         | 0.14  |       |
diff --git a/site/content/en/docs/reference/components-tools/feature-gate-removed.md b/site/content/en/docs/reference/components-tools/feature-gate-removed.md
index 1c54db2df..d8b87755f 100644
--- a/site/content/en/docs/reference/components-tools/feature-gate-removed.md
+++ b/site/content/en/docs/reference/components-tools/feature-gate-removed.md
@@ -33,4 +33,6 @@ In the following table:
 | `WorkloadResourceRequestsSummary` | `true`  | Beta       | 0.10 | 0.11 |
 | `WorkloadResourceRequestsSummary` | `true`  | GA         | 0.11 | 0.13 |
 | `QueueVisibility`                 | `false` | Alpha      | 0.5  | 0.9  |
-| `QueueVisibility`                 | `false` | Deprecated | 0.9  | 0.14 |
\ No newline at end of file
+| `QueueVisibility`                 | `false` | Deprecated | 0.9  | 0.14 |
+| `ManagedJobsNamespaceSelector`    | `true`  | Beta       | 0.10 | 0.13 |
+| `ManagedJobsNamespaceSelector`    | `true`  | GA         | 0.13 | 0.15 |
\ No newline at end of file
diff --git a/site/content/en/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand.md b/site/content/en/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand.md
index 584c957c7..8d5b58570 100644
--- a/site/content/en/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand.md
+++ b/site/content/en/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand.md
@@ -72,7 +72,7 @@ kubectl apply -f https://kueue.sigs.k8s.io/examples/visibility/cluster-role-and-
 
 You can disable it by setting the `VisibilityOnDemand` feature gate. Check the [Installation](/docs/installation/#change-the-feature-gates-configuration) guide for details on feature gate configuration.
 
-If you disable the feature, you also need to remove the associated `APIService` from your cluster by doing `kubectl delete APIService v1beta1.visibility.kueue.x-k8s.io`.
+If you disable the feature, you also need to remove the associated `APIService` from your cluster by doing `kubectl delete APIService v1beta2.visibility.kueue.x-k8s.io`.
 
 {{% /alert %}}
 
@@ -103,7 +103,7 @@ for i in {1..6}; do kubectl create -f https://kueue.sigs.k8s.io/examples/jobs/sa
 To view pending workloads in ClusterQueue `cluster-queue` run the following command:
 
 ```shell
-kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta1/clusterqueues/cluster-queue/pendingworkloads"
+kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads"
 ```
 
 You should get results similar to:
@@ -111,7 +111,7 @@ You should get results similar to:
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -184,7 +184,7 @@ You can pass optional query parameters:
 To view only 1 pending workloads use, starting from position 1 in ClusterQueue run:
 
 ```shell
-kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta1/clusterqueues/cluster-queue/pendingworkloads?limit=1&offset=1"
+kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads?limit=1&offset=1"
 ```
 
 You should get results similar to 
@@ -192,7 +192,7 @@ You should get results similar to
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -226,8 +226,8 @@ If you followed steps described in [Directly accessing the Visibility API](#dire
 you can use curl to view pending workloads in ClusterQueue using following commands:
 
 {{< tabpane lang="shell" persist=disabled >}}
-{{< tab header="Using kubectl proxy" >}} curl http://localhost:8080/apis/visibility.kueue.x-k8s.io/v1beta1/clusterqueues/cluster-queue/pendingworkloads {{< /tab >}}
-{{< tab header="Without kubectl proxy" >}} curl -X GET $APISERVER/apis/visibility.kueue.x-k8s.io/v1beta1/clusterqueues/cluster-queue/pendingworkloads --header "Authorization: Bearer $TOKEN" --insecure {{< /tab >}}
+{{< tab header="Using kubectl proxy" >}} curl http://localhost:8080/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads {{< /tab >}}
+{{< tab header="Without kubectl proxy" >}} curl -X GET $APISERVER/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads --header "Authorization: Bearer $TOKEN" --insecure {{< /tab >}}
 {{< /tabpane >}}
 
 You should get results similar to:
@@ -235,7 +235,7 @@ You should get results similar to:
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -306,7 +306,7 @@ You should get results similar to:
 Similarly to ClusterQueue, to view pending workloads in LocalQueue `user-queue` run the following command:
 
 ```shell
-kubectl get --raw /apis/visibility.kueue.x-k8s.io/v1beta1/namespaces/default/localqueues/user-queue/pendingworkloads
+kubectl get --raw /apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads
 ```
 
 You should get results similar to:
@@ -314,7 +314,7 @@ You should get results similar to:
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -387,7 +387,7 @@ You can pass optional query parameters:
 To view only 1 pending workloads use, starting from position 1 in LocalQueue run:
 
 ```shell
-kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta1/namespaces/default/localqueues/user-queue/pendingworkloads?limit=1&offset=1"
+kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads?limit=1&offset=1"
 
 ```
 You should get results similar to 
@@ -395,7 +395,7 @@ You should get results similar to
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -429,8 +429,8 @@ If you followed steps described in [Directly accessing the Visibility API](#dire
 above, you can use curl to view pending workloads in LocalQueue using following commands:
 
 {{< tabpane lang="shell" persist=disabled >}}
-{{< tab header="Using kubectl proxy" >}} curl http://localhost:8080/apis/visibility.kueue.x-k8s.io/v1beta1/namespaces/default/localqueues/user-queue/pendingworkloads {{< /tab >}}
-{{< tab header="Without kubectl proxy" >}} curl -X GET $APISERVER/apis/visibility.kueue.x-k8s.io/v1beta1/namespaces/default/localqueues/user-queue/pendingworkloads --header "Authorization: Bearer $TOKEN" --insecure {{< /tab >}}
+{{< tab header="Using kubectl proxy" >}} curl http://localhost:8080/apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads {{< /tab >}}
+{{< tab header="Without kubectl proxy" >}} curl -X GET $APISERVER/apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads --header "Authorization: Bearer $TOKEN" --insecure {{< /tab >}}
 {{< /tabpane >}}
 
 You should get results similar to:
@@ -438,7 +438,7 @@ You should get results similar to:
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
diff --git a/site/content/zh-CN/docs/installation/_index.md b/site/content/zh-CN/docs/installation/_index.md
index c9a309957..cc341b667 100644
--- a/site/content/zh-CN/docs/installation/_index.md
+++ b/site/content/zh-CN/docs/installation/_index.md
@@ -298,8 +298,6 @@ spec:
 
 | 功能                                    | 默认值  | 阶段       | 起始版本    | 截止版本    |
 |---------------------------------------| ------- | ---------- |---------|---------|
-| `ManagedJobsNamespaceSelector`        | `true`  | Beta       | 0.10    | 0.13    |
-| `ManagedJobsNamespaceSelector`        | `true`  | GA         | 0.13    |         |
 | `ProvisioningACC`                     | `false` | Alpha      | 0.5     | 0.6     |
 | `ProvisioningACC`                     | `true`  | Beta       | 0.7     |         |
 | `ProvisioningACC`                     | `true`  | GA         | 0.14    |         |
diff --git a/site/content/zh-CN/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand.md b/site/content/zh-CN/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand.md
index 584c957c7..8d5b58570 100644
--- a/site/content/zh-CN/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand.md
+++ b/site/content/zh-CN/docs/tasks/manage/monitor_pending_workloads/pending_workloads_on_demand.md
@@ -72,7 +72,7 @@ kubectl apply -f https://kueue.sigs.k8s.io/examples/visibility/cluster-role-and-
 
 You can disable it by setting the `VisibilityOnDemand` feature gate. Check the [Installation](/docs/installation/#change-the-feature-gates-configuration) guide for details on feature gate configuration.
 
-If you disable the feature, you also need to remove the associated `APIService` from your cluster by doing `kubectl delete APIService v1beta1.visibility.kueue.x-k8s.io`.
+If you disable the feature, you also need to remove the associated `APIService` from your cluster by doing `kubectl delete APIService v1beta2.visibility.kueue.x-k8s.io`.
 
 {{% /alert %}}
 
@@ -103,7 +103,7 @@ for i in {1..6}; do kubectl create -f https://kueue.sigs.k8s.io/examples/jobs/sa
 To view pending workloads in ClusterQueue `cluster-queue` run the following command:
 
 ```shell
-kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta1/clusterqueues/cluster-queue/pendingworkloads"
+kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads"
 ```
 
 You should get results similar to:
@@ -111,7 +111,7 @@ You should get results similar to:
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -184,7 +184,7 @@ You can pass optional query parameters:
 To view only 1 pending workloads use, starting from position 1 in ClusterQueue run:
 
 ```shell
-kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta1/clusterqueues/cluster-queue/pendingworkloads?limit=1&offset=1"
+kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads?limit=1&offset=1"
 ```
 
 You should get results similar to 
@@ -192,7 +192,7 @@ You should get results similar to
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -226,8 +226,8 @@ If you followed steps described in [Directly accessing the Visibility API](#dire
 you can use curl to view pending workloads in ClusterQueue using following commands:
 
 {{< tabpane lang="shell" persist=disabled >}}
-{{< tab header="Using kubectl proxy" >}} curl http://localhost:8080/apis/visibility.kueue.x-k8s.io/v1beta1/clusterqueues/cluster-queue/pendingworkloads {{< /tab >}}
-{{< tab header="Without kubectl proxy" >}} curl -X GET $APISERVER/apis/visibility.kueue.x-k8s.io/v1beta1/clusterqueues/cluster-queue/pendingworkloads --header "Authorization: Bearer $TOKEN" --insecure {{< /tab >}}
+{{< tab header="Using kubectl proxy" >}} curl http://localhost:8080/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads {{< /tab >}}
+{{< tab header="Without kubectl proxy" >}} curl -X GET $APISERVER/apis/visibility.kueue.x-k8s.io/v1beta2/clusterqueues/cluster-queue/pendingworkloads --header "Authorization: Bearer $TOKEN" --insecure {{< /tab >}}
 {{< /tabpane >}}
 
 You should get results similar to:
@@ -235,7 +235,7 @@ You should get results similar to:
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -306,7 +306,7 @@ You should get results similar to:
 Similarly to ClusterQueue, to view pending workloads in LocalQueue `user-queue` run the following command:
 
 ```shell
-kubectl get --raw /apis/visibility.kueue.x-k8s.io/v1beta1/namespaces/default/localqueues/user-queue/pendingworkloads
+kubectl get --raw /apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads
 ```
 
 You should get results similar to:
@@ -314,7 +314,7 @@ You should get results similar to:
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -387,7 +387,7 @@ You can pass optional query parameters:
 To view only 1 pending workloads use, starting from position 1 in LocalQueue run:
 
 ```shell
-kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta1/namespaces/default/localqueues/user-queue/pendingworkloads?limit=1&offset=1"
+kubectl get --raw "/apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads?limit=1&offset=1"
 
 ```
 You should get results similar to 
@@ -395,7 +395,7 @@ You should get results similar to
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },
@@ -429,8 +429,8 @@ If you followed steps described in [Directly accessing the Visibility API](#dire
 above, you can use curl to view pending workloads in LocalQueue using following commands:
 
 {{< tabpane lang="shell" persist=disabled >}}
-{{< tab header="Using kubectl proxy" >}} curl http://localhost:8080/apis/visibility.kueue.x-k8s.io/v1beta1/namespaces/default/localqueues/user-queue/pendingworkloads {{< /tab >}}
-{{< tab header="Without kubectl proxy" >}} curl -X GET $APISERVER/apis/visibility.kueue.x-k8s.io/v1beta1/namespaces/default/localqueues/user-queue/pendingworkloads --header "Authorization: Bearer $TOKEN" --insecure {{< /tab >}}
+{{< tab header="Using kubectl proxy" >}} curl http://localhost:8080/apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads {{< /tab >}}
+{{< tab header="Without kubectl proxy" >}} curl -X GET $APISERVER/apis/visibility.kueue.x-k8s.io/v1beta2/namespaces/default/localqueues/user-queue/pendingworkloads --header "Authorization: Bearer $TOKEN" --insecure {{< /tab >}}
 {{< /tabpane >}}
 
 You should get results similar to:
@@ -438,7 +438,7 @@ You should get results similar to:
 ```json
 {
   "kind": "PendingWorkloadsSummary",
-  "apiVersion": "visibility.kueue.x-k8s.io/v1beta1",
+  "apiVersion": "visibility.kueue.x-k8s.io/v1beta2",
   "metadata": {
     "creationTimestamp": null
   },



Test patch:
diff --git a/apis/visibility/v1beta2/conversion_test.go b/apis/visibility/v1beta2/conversion_test.go
new file mode 100644
index 000000000..9dc05f834
--- /dev/null
+++ b/apis/visibility/v1beta2/conversion_test.go
@@ -0,0 +1,93 @@
+/*
+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 v1beta2
+
+import (
+	"net/url"
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/diff"
+)
+
+func TestPendingWorkloadsOptions(t *testing.T) {
+	scheme := runtime.NewScheme()
+	err := AddToScheme(scheme)
+	if err != nil {
+		t.Fatal(err)
+	}
+	codec := runtime.NewParameterCodec(scheme)
+
+	cases := map[string]struct {
+		inputQueryParams           url.Values
+		wantQueryParams            url.Values
+		wantPendingWorkloadOptions PendingWorkloadOptions
+	}{
+		"correct parameters": {
+			inputQueryParams: url.Values{
+				"limit":  {"1"},
+				"offset": {"2"},
+			},
+			wantQueryParams: url.Values{
+				"limit":  {"1"},
+				"offset": {"2"},
+			},
+			wantPendingWorkloadOptions: PendingWorkloadOptions{
+				Limit:  1,
+				Offset: 2,
+			},
+		},
+		"default values": {
+			inputQueryParams: url.Values{
+				"limit":  {"0"},
+				"offset": {"0"},
+			},
+			wantQueryParams: url.Values{
+				"limit":  {"1000"},
+				"offset": {"0"},
+			},
+			wantPendingWorkloadOptions: PendingWorkloadOptions{
+				Limit:  1000,
+				Offset: 0,
+			},
+		},
+	}
+
+	for name, tc := range cases {
+		t.Run(name, func(t *testing.T) {
+			// versioned -> query params
+			actualParameters, err := codec.EncodeParameters(&tc.wantPendingWorkloadOptions, SchemeGroupVersion)
+			if err != nil {
+				t.Fatal(err)
+			}
+			if d := cmp.Diff(actualParameters, tc.wantQueryParams); d != "" {
+				t.Fatalf("Unexpected serialization:\n%s", diff.ObjectGoPrintSideBySide(tc.wantQueryParams, actualParameters))
+			}
+
+			// query params -> versioned
+			convertedPendingWorkloadOptions := PendingWorkloadOptions{}
+			err = codec.DecodeParameters(tc.inputQueryParams, SchemeGroupVersion, &convertedPendingWorkloadOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+			if d := cmp.Diff(convertedPendingWorkloadOptions, tc.wantPendingWorkloadOptions); d != "" {
+				t.Fatalf("Unexpected deserialization:\n%s", diff.ObjectGoPrintSideBySide(tc.wantPendingWorkloadOptions, convertedPendingWorkloadOptions))
+			}
+		})
+	}
+}
diff --git a/cmd/kueuectl/app/list/list_workload_test.go b/cmd/kueuectl/app/list/list_workload_test.go
index 066fed379..52f52c4e5 100644
--- a/cmd/kueuectl/app/list/list_workload_test.go
+++ b/cmd/kueuectl/app/list/list_workload_test.go
@@ -44,7 +44,7 @@ import (
 	testingclock "k8s.io/utils/clock/testing"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	"sigs.k8s.io/kueue/client-go/clientset/versioned/fake"
 	cmdtesting "sigs.k8s.io/kueue/cmd/kueuectl/app/testing"
 	"sigs.k8s.io/kueue/pkg/controller/constants"
diff --git a/pkg/visibility/api/v1beta1/pending_workloads_cq_test.go b/pkg/visibility/storage/pending_workloads_cq_test.go
similarity index 99%
rename from pkg/visibility/api/v1beta1/pending_workloads_cq_test.go
rename to pkg/visibility/storage/pending_workloads_cq_test.go
index 26f623666..00b92e71d 100644
--- a/pkg/visibility/api/v1beta1/pending_workloads_cq_test.go
+++ b/pkg/visibility/storage/pending_workloads_cq_test.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
 	"context"
@@ -28,7 +28,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	"sigs.k8s.io/kueue/pkg/constants"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/pkg/visibility/api/v1beta1/pending_workloads_lq_test.go b/pkg/visibility/storage/pending_workloads_lq_test.go
similarity index 99%
rename from pkg/visibility/api/v1beta1/pending_workloads_lq_test.go
rename to pkg/visibility/storage/pending_workloads_lq_test.go
index 367464d1b..4165eb172 100644
--- a/pkg/visibility/api/v1beta1/pending_workloads_lq_test.go
+++ b/pkg/visibility/storage/pending_workloads_lq_test.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
 	"context"
@@ -29,7 +29,7 @@ import (
 	"k8s.io/apiserver/pkg/endpoints/request"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	qcache "sigs.k8s.io/kueue/pkg/cache/queue"
 	"sigs.k8s.io/kueue/pkg/constants"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
diff --git a/pkg/visibility/api/v1beta1/test_utils.go b/pkg/visibility/storage/utils_test.go
similarity index 91%
rename from pkg/visibility/api/v1beta1/test_utils.go
rename to pkg/visibility/storage/utils_test.go
index 31a613f5e..e3d0dab6f 100644
--- a/pkg/visibility/api/v1beta1/test_utils.go
+++ b/pkg/visibility/storage/utils_test.go
@@ -14,10 +14,10 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1beta1
+package storage
 
 import (
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 )
 
 type req struct {
diff --git a/test/e2e/certmanager/suite_test.go b/test/e2e/certmanager/suite_test.go
index 17cf6f365..edb294274 100644
--- a/test/e2e/certmanager/suite_test.go
+++ b/test/e2e/certmanager/suite_test.go
@@ -28,7 +28,7 @@ import (
 	"k8s.io/client-go/rest"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	visibilityv1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2"
 	"sigs.k8s.io/kueue/test/util"
 )
 
@@ -38,7 +38,7 @@ var (
 	cfg              *rest.Config
 	restClient       *rest.RESTClient
 	kueueNS          = util.GetKueueNamespace()
-	visibilityClient visibilityv1beta1.VisibilityV1beta1Interface
+	visibilityClient visibility.VisibilityV1beta2Interface
 )
 
 func TestAPIs(t *testing.T) {
@@ -59,8 +59,7 @@ var _ = ginkgo.BeforeSuite(func() {
 	k8sClient, cfg, err = util.CreateClientUsingCluster("")
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 	restClient = util.CreateRestClient(cfg)
-	visibilityClient, err = util.CreateVisibilityClient("")
-	gomega.Expect(err).NotTo(gomega.HaveOccurred())
+	visibilityClient = util.CreateVisibilityClient("")
 	ctx = ginkgo.GinkgoT().Context()
 
 	waitForAvailableStart := time.Now()
diff --git a/test/e2e/singlecluster/suite_test.go b/test/e2e/singlecluster/suite_test.go
index 3154cdd1d..afe32b742 100644
--- a/test/e2e/singlecluster/suite_test.go
+++ b/test/e2e/singlecluster/suite_test.go
@@ -30,7 +30,8 @@ import (
 	"k8s.io/utils/clock"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	visibilityv1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta1"
+	kueueclientset "sigs.k8s.io/kueue/client-go/clientset/versioned"
+	visibility "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2"
 	"sigs.k8s.io/kueue/test/util"
 )
 
@@ -41,8 +42,8 @@ var (
 	cfg                          *rest.Config
 	restClient                   *rest.RESTClient
 	ctx                          context.Context
-	visibilityClient             visibilityv1beta1.VisibilityV1beta1Interface
-	impersonatedVisibilityClient visibilityv1beta1.VisibilityV1beta1Interface
+	kueueClientset               kueueclientset.Interface
+	impersonatedVisibilityClient visibility.VisibilityV1beta2Interface
 	kueueNS                      = util.GetKueueNamespace()
 )
 
@@ -64,9 +65,9 @@ var _ = ginkgo.BeforeSuite(func() {
 	k8sClient, cfg, err = util.CreateClientUsingCluster("")
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 	restClient = util.CreateRestClient(cfg)
-	visibilityClient, err = util.CreateVisibilityClient("")
+	kueueClientset = util.CreateKueueClientset("")
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
-	impersonatedVisibilityClient, err = util.CreateVisibilityClient(fmt.Sprintf("system:serviceaccount:%s:default", kueueNS))
+	impersonatedVisibilityClient = util.CreateVisibilityClient(fmt.Sprintf("system:serviceaccount:%s:default", kueueNS))
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 	ctx = ginkgo.GinkgoT().Context()
 
diff --git a/test/e2e/singlecluster/visibility_test.go b/test/e2e/singlecluster/visibility_test.go
index d80393983..60912474e 100644
--- a/test/e2e/singlecluster/visibility_test.go
+++ b/test/e2e/singlecluster/visibility_test.go
@@ -29,9 +29,8 @@ import (
 	"k8s.io/utils/ptr"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	"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"
@@ -135,9 +134,55 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 			util.ExpectObjectToBeDeleted(ctx, k8sClient, defaultRF, true)
 		})
 
+		ginkgo.It("Should allow fetching information about pending workloads in ClusterQueue (v1beta1)", func() {
+			ginkgo.By("Verify there are zero pending workloads", func() {
+				info, err := kueueClientset.VisibilityV1beta1().ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
+				gomega.Expect(err).NotTo(gomega.HaveOccurred())
+				gomega.Expect(info.Items).Should(gomega.BeEmpty())
+			})
+
+			ginkgo.By("Schedule a job which is pending due to lower priority", func() {
+				sampleJob2 = testingjob.MakeJob("test-job-2", nsA.Name).
+					Queue(kueue.LocalQueueName(localQueueA.Name)).
+					Image(util.GetAgnHostImage(), util.BehaviorExitFast).
+					RequestAndLimit(corev1.ResourceCPU, "1").
+					PriorityClass(lowPriorityClass.Name).
+					Obj()
+				util.MustCreate(ctx, k8sClient, sampleJob2)
+			})
+
+			ginkgo.By("Verify there is one pending workload", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					info, err := kueueClientset.VisibilityV1beta1().ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
+					g.Expect(err).NotTo(gomega.HaveOccurred())
+					g.Expect(info.Items).Should(gomega.HaveLen(1))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Await for pods to be running", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					createdJob := &batchv1.Job{}
+					g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(blockingJob), createdJob)).Should(gomega.Succeed())
+					g.Expect(createdJob.Status.Ready).Should(gomega.Equal(ptr.To[int32](1)))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Terminate execution of the first workload to release the quota", func() {
+				gomega.Expect(util.DeleteAllPodsInNamespace(ctx, k8sClient, nsA)).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Verify there are zero pending workloads, after the second workload is admitted", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					info, err := kueueClientset.VisibilityV1beta1().ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
+					g.Expect(err).NotTo(gomega.HaveOccurred())
+					g.Expect(info.Items).Should(gomega.BeEmpty())
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+		})
+
 		ginkgo.It("Should allow fetching information about pending workloads in ClusterQueue", func() {
 			ginkgo.By("Verify there are zero pending workloads", func() {
-				info, err := visibilityClient.ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
+				info, err := kueueClientset.VisibilityV1beta2().ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
 				gomega.Expect(err).NotTo(gomega.HaveOccurred())
 				gomega.Expect(info.Items).Should(gomega.BeEmpty())
 			})
@@ -154,7 +199,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 
 			ginkgo.By("Verify there is one pending workload", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.HaveLen(1))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -174,7 +219,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 
 			ginkgo.By("Verify there are zero pending workloads, after the second workload is admitted", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.BeEmpty())
 				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
@@ -225,7 +270,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               highPriorityClass.Value,
 						PositionInLocalQueue:   0,
 						PositionInClusterQueue: 0,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueA.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueA.Name),
 					},
 					{
 						ObjectMeta: metav1.ObjectMeta{
@@ -235,7 +280,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               midPriorityClass.Value,
 						PositionInLocalQueue:   0,
 						PositionInClusterQueue: 1,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueB.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueB.Name),
 					},
 					{
 						ObjectMeta: metav1.ObjectMeta{
@@ -245,11 +290,11 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               lowPriorityClass.Value,
 						PositionInLocalQueue:   1,
 						PositionInClusterQueue: 2,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueB.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueB.Name),
 					},
 				}
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().ClusterQueues().GetPendingWorkloadsSummary(ctx, clusterQueue.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.BeComparableTo(wantPendingWorkloads, pendingWorkloadsCmpOpts...))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -258,7 +303,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 
 		ginkgo.It("Should allow fetching information about pending workloads in LocalQueue", func() {
 			ginkgo.By("Verify there are zero pending workloads", func() {
-				info, err := visibilityClient.LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
+				info, err := kueueClientset.VisibilityV1beta2().LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
 				gomega.Expect(err).NotTo(gomega.HaveOccurred())
 				gomega.Expect(info.Items).Should(gomega.BeEmpty())
 			})
@@ -275,7 +320,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 
 			ginkgo.By("Verify there is one pending workload", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.HaveLen(1))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -295,7 +340,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 
 			ginkgo.By("Verify there are zero pending workloads, after the second workload is admitted", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.BeEmpty())
 				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
@@ -346,11 +391,11 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               highPriorityClass.Value,
 						PositionInLocalQueue:   0,
 						PositionInClusterQueue: 0,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueA.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueA.Name),
 					},
 				}
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.BeComparableTo(wantPendingWorkloads, pendingWorkloadsCmpOpts...))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -366,7 +411,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               midPriorityClass.Value,
 						PositionInLocalQueue:   0,
 						PositionInClusterQueue: 1,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueB.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueB.Name),
 					},
 					{
 						ObjectMeta: metav1.ObjectMeta{
@@ -376,11 +421,11 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               lowPriorityClass.Value,
 						PositionInLocalQueue:   1,
 						PositionInClusterQueue: 2,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueB.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueB.Name),
 					},
 				}
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueB.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueB.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.BeComparableTo(wantPendingWorkloads, pendingWorkloadsCmpOpts...))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -439,11 +484,11 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               highPriorityClass.Value,
 						PositionInLocalQueue:   0,
 						PositionInClusterQueue: 0,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueA.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueA.Name),
 					},
 				}
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueA.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.BeComparableTo(wantPendingWorkloads, pendingWorkloadsCmpOpts...))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
@@ -459,7 +504,7 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               midPriorityClass.Value,
 						PositionInLocalQueue:   0,
 						PositionInClusterQueue: 1,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueB.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueB.Name),
 					},
 					{
 						ObjectMeta: metav1.ObjectMeta{
@@ -469,11 +514,11 @@ var _ = ginkgo.Describe("Kueue visibility server", func() {
 						Priority:               lowPriorityClass.Value,
 						PositionInLocalQueue:   1,
 						PositionInClusterQueue: 2,
-						LocalQueueName:         kueuev1beta1.LocalQueueName(localQueueB.Name),
+						LocalQueueName:         kueue.LocalQueueName(localQueueB.Name),
 					},
 				}
 				gomega.Eventually(func(g gomega.Gomega) {
-					info, err := visibilityClient.LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueB.Name, metav1.GetOptions{})
+					info, err := kueueClientset.VisibilityV1beta2().LocalQueues(nsA.Name).GetPendingWorkloadsSummary(ctx, localQueueB.Name, metav1.GetOptions{})
 					g.Expect(err).NotTo(gomega.HaveOccurred())
 					g.Expect(info.Items).Should(gomega.BeComparableTo(wantPendingWorkloads, pendingWorkloadsCmpOpts...))
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
diff --git a/test/util/e2e.go b/test/util/e2e.go
index 07025aec8..96b423db0 100644
--- a/test/util/e2e.go
+++ b/test/util/e2e.go
@@ -52,9 +52,9 @@ import (
 	configapi "sigs.k8s.io/kueue/apis/config/v1beta2"
 	kueuev1beta1 "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta2"
-	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta1"
+	visibility "sigs.k8s.io/kueue/apis/visibility/v1beta2"
 	kueueclientset "sigs.k8s.io/kueue/client-go/clientset/versioned"
-	visibilityv1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta1"
+	visibilityv1beta2 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta2"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
@@ -188,23 +188,22 @@ func CreateRestClient(cfg *rest.Config) *rest.RESTClient {
 	return restClient
 }
 
-func CreateVisibilityClient(user string) (visibilityv1beta1.VisibilityV1beta1Interface, error) {
+func CreateKueueClientset(user string) kueueclientset.Interface {
+	ginkgo.GinkgoHelper()
 	cfg, err := config.GetConfigWithContext("")
-	if err != nil {
-		return nil, fmt.Errorf("unable to get kubeconfig: %w", err)
-	}
-	gomega.ExpectWithOffset(1, cfg).NotTo(gomega.BeNil())
-
+	gomega.Expect(err).NotTo(gomega.HaveOccurred())
+	gomega.Expect(cfg).NotTo(gomega.BeNil())
 	if user != "" {
 		cfg.Impersonate.UserName = user
 	}
-
 	kueueClient, err := kueueclientset.NewForConfig(cfg)
-	if err != nil {
-		return nil, fmt.Errorf("unable to create kueue clientset: %w", err)
-	}
-	visibilityClient := kueueClient.VisibilityV1beta1()
-	return visibilityClient, nil
+	gomega.Expect(err).NotTo(gomega.HaveOccurred())
+	return kueueClient
+}
+
+func CreateVisibilityClient(user string) visibilityv1beta2.VisibilityV1beta2Interface {
+	kueueClientset := CreateKueueClientset(user)
+	return kueueClientset.VisibilityV1beta2()
 }
 
 func rolloutOperatorDeployment(ctx context.Context, k8sClient client.Client, key types.NamespacedName, kindClusterName string) {