Repository: kubernetes-sigs/kueue
Pull request #178 (2022-04-06 07:17:15)

Distinguish workload type before requeue
Signed-off-by: Alex Wang <wangqingcan1990@gmail.com>

<!--  Thanks for sending a pull request!  Here are some tips for you:

1. If this is your first time, please read our contributor guidelines: https://git.k8s.io/community/contributors/guide/first-contribution.md#your-first-contribution and developer guide https://git.k8s.io/community/contributors/devel/development.md#development-guide
2. Please label this pull request according to what type of issue you are addressing, especially if this is a release targeted pull request. For reference on required PR/issue labels, read here:
https://git.k8s.io/community/contributors/devel/sig-release/release.md#issuepr-kind-label
3. Ensure you have added or ran the appropriate tests for your PR: https://git.k8s.io/community/contributors/devel/sig-testing/testing.md
4. If you want *faster* PR reviews, read how: https://git.k8s.io/community/contributors/guide/pull-requests.md#best-practices-for-faster-reviews
5. If the PR is unfinished, see how to mark it: https://git.k8s.io/community/contributors/guide/pull-requests.md#marking-unfinished-pull-requests
-->

#### What type of PR is this?
/kind bug
<!--
Add one of the following kinds:
/kind bug
/kind cleanup
/kind documentation
/kind feature

Optionally add one or more of the following kinds if applicable:
/kind api-change
/kind deprecation
/kind failing-test
/kind flake
/kind regression
-->

#### What this PR does / why we need it:
https://github.com/kubernetes-sigs/kueue/pull/135#discussion_r840729523

We have a case where we requeue because the workload didn't fit. But we also have a case where we requeue because we admitted workloads in another CQ that had higher priority, even though they might still fit in the next scheduling cycle. I don't think we should punish those workloads. They should skip the inadmissible stage.

#### Which issue(s) this PR fixes:
<!--
*Automatically closes linked issue when PR is merged.
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
_If PR is about `failing-tests or flakes`, please post the related issues/tests in a comment and do not use `Fixes`_*
-->

#### Special notes for your reviewer:



k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/kueue/pull/178#" title="Author self-approved">denkensk</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **ahg-g** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @ahg-g` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fkueue).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/kueue/blob/main/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["ahg-g"]} -->
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/kueue/pull/178#" title="Author self-approved">denkensk</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please ask for approval from **ahg-g** after the PR has been reviewed.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fkueue).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/kueue/blob/main/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["ahg-g"]} -->
k8s-ci-robot: @denkensk: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-kueue-verify-main | fbde5a23acc724fec7fef3361e264c5dba77c695 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-verify-main/1511746338742603776) | true | `/test pull-kueue-verify-main`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=kueue&pr=178). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Adenkensk). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/kueue/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @denkensk: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-kueue-verify-main | fbde5a23acc724fec7fef3361e264c5dba77c695 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-verify-main/1511746338742603776) | true | `/test pull-kueue-verify-main`
pull-kueue-test-unit-main | fbde5a23acc724fec7fef3361e264c5dba77c695 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-unit-main/1511746338671300608) | true | `/test pull-kueue-test-unit-main`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=kueue&pr=178). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Adenkensk). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/kueue/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @denkensk: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-kueue-verify-main | fbde5a23acc724fec7fef3361e264c5dba77c695 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-verify-main/1511746338742603776) | true | `/test pull-kueue-verify-main`
pull-kueue-test-unit-main | fbde5a23acc724fec7fef3361e264c5dba77c695 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-unit-main/1511746338671300608) | true | `/test pull-kueue-test-unit-main`
pull-kueue-test-integration-main | fbde5a23acc724fec7fef3361e264c5dba77c695 | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-integration-main/1511746338709049344) | true | `/test pull-kueue-test-integration-main`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=kueue&pr=178). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Adenkensk). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/kueue/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
ahg-g: /lgtm

leaving the approve to Aldo
ahg-g: I sent https://github.com/kubernetes-sigs/kueue/pull/185 so we are consistent with using the term `inadmissible` 
k8s-ci-robot: @denkensk: PR needs rebase.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>
k8s-ci-robot: @denkensk: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-kueue-test-unit-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-unit-main/1512341038537117696) | true | `/test pull-kueue-test-unit-main`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=kueue&pr=178). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Adenkensk). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/kueue/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @denkensk: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-kueue-test-unit-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-unit-main/1512341038537117696) | true | `/test pull-kueue-test-unit-main`
pull-kueue-test-integration-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-integration-main/1512341038579060736) | true | `/test pull-kueue-test-integration-main`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=kueue&pr=178). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Adenkensk). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/kueue/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @denkensk: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-kueue-test-unit-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-unit-main/1512341038537117696) | true | `/test pull-kueue-test-unit-main`
pull-kueue-test-integration-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-integration-main/1512341038579060736) | true | `/test pull-kueue-test-integration-main`
pull-kueue-build-image-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-build-image-main/1512341038637780992) | true | `/test pull-kueue-build-image-main`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=kueue&pr=178). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Adenkensk). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/kueue/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @denkensk: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-kueue-test-unit-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-unit-main/1512341038537117696) | true | `/test pull-kueue-test-unit-main`
pull-kueue-test-integration-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-test-integration-main/1512341038579060736) | true | `/test pull-kueue-test-integration-main`
pull-kueue-build-image-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-build-image-main/1512341038637780992) | true | `/test pull-kueue-build-image-main`
pull-kueue-verify-main | 096c3907228cf8484cc8435cd3198bd1a7d4268b | [link](https://prow.k8s.io/view/gs/kubernetes-jenkins/pr-logs/pull/kubernetes-sigs_kueue/178/pull-kueue-verify-main/1512341038604226560) | true | `/test pull-kueue-verify-main`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=kueue&pr=178). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Adenkensk). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/kueue/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @denkensk: PR needs rebase.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

Patch:
diff --git a/.github/ISSUE_TEMPLATE/NEW_RELEASE.md b/.github/ISSUE_TEMPLATE/NEW_RELEASE.md
index f2e82b24a..61f8e7115 100644
--- a/.github/ISSUE_TEMPLATE/NEW_RELEASE.md
+++ b/.github/ISSUE_TEMPLATE/NEW_RELEASE.md
@@ -10,22 +10,18 @@ assignees: ahg-g, alculquicondor, ArangoGutierrez, denkensk
 <!--
 Please do not remove items from the checklist
 -->
-- [ ] All [OWNERS](https://github.com/kubernetes-sigs/kueue/blob/main/OWNERS) must LGTM the release proposal
+- [ ] All [OWNERS](https://github.com/kubernetes-sigs/kueue/blob/master/OWNERS) must LGTM the release proposal
 - [ ] Verify that the changelog in this issue is up-to-date
-- [ ] For major or minor releases (v$MAJ.$MIN.0), create a new release branch.
+- [ ] For major releases (v0.$MAJ.0) create new release branch
   - [ ] an OWNER creates a vanilla release branch with
-        `git branch release-$MAJ.$MIN main`
+        `git branch release-0.$MAJ master`
   - [ ] An OWNER pushes the new release branch with
-        `git push release-$MAJ.$MIN`
-- [ ] Update things like README, deployment templates, docs, configuration, test/e2e flags.
-      Submit a PR against the release branch.
+        `git push release-0.$MAJ`
+- [ ] Update things like README, deployment templates, docs, configuration, test/e2e flags, submit a PR against the release branch
 - An OWNER prepares a draft release
-  - [ ] Create a draft release at [Github releases page](https://github.com/kubernetes-sigs/kueue/releases).
-  - [ ] Write the change log into the draft release.
-  - [ ] Run
-      `make artifacts IMAGE_REGISTRY=k8s.gcr.io/kueue GIT_TAG=$VERSION`
-      to generate the artifacts and upload the files in the `artifacts` folder
-      to the draft release.
+  - [ ] Create a draft release at [Github releases page](https://github.com/kubernetes-sigs/kueue/releases)
+  - [ ] Write the change log into the draft release
+  - [ ] Upload release artefacts
 - [ ] An OWNER runs
      `git tag -s $VERSION`
       and inserts the changelog into the tag description.
@@ -33,18 +29,19 @@ Please do not remove items from the checklist
       `git push $VERSION`
   - Triggers prow to build and publish a staging container image
       `gcr.io/k8s-staging-kueue/kueue:$VERSION`
-- [ ] Submit a PR against [k8s.io](https://github.com/kubernetes/k8s.io), updating `k8s.gcr.io/images/k8s-staging-kueue/images.yaml` to [promote the container images](https://github.com/kubernetes/k8s.io/tree/main/k8s.gcr.io#image-promoter) to production.
-- [ ] Wait for the PR to be merged and verify that the image `k8s.gcr.io/kueue/kueue:$VERSION` is available.
-- [ ] Publish the draft release prepared at the [Github releases page](https://github.com/kubernetes-sigs/kueue/releases).
+- [ ] Submit a PR against [k8s.io](https://github.com/kubernetes/k8s.io), updating `k8s.gcr.io/images/k8s-staging-kueue/images.yaml` to promote the container images (both "full" and "minimal" variants) to production
+- [ ] Wait for the PR to be merged and verify that the image (`k8s.gcr.io/kueue/kueue:$VERSION`) is available.
+- [ ] Publish the draft release prepared at the [Github releases page](https://github.com/kubernetes-sigs/kueue/releases)
+      which will also trigger a Helm repo index update to add the latest release
 - [ ] Add a link to the tagged release in this issue.
 - [ ] Send an announcement email to `sig-scheduling@kubernetes.io` and `wg-batch@kubernetes.io` with the subject `[ANNOUNCE] kueue $VERSION is released`
-- [ ] Add a link to the release announcement in this issue.
-- [ ] For a major or minor release, update `docs/setup/install.md` in `main` branch.
-  - [ ] Update references on deployment yamls.
-  - [ ] Wait for the PR to be merged.
-- [ ] For a major release, create an unannotated _devel_ tag in the `main` branch, on the first commit that gets merged after the release branch has been created (presumably the README update commit above), and, push the tag:
-      `DEVEL=v0.$(($MAJ+1)).0-devel; git tag $DEVEL main && git push $DEVEL`
-      This ensures that the devel builds on the `main` branch will have a meaningful version number.
+- [ ] Add a link to the release announcement in this issue
+- [ ] For a major release (or a point release of the latest major release), update README in master branch
+  - [ ] Update references on deployment yamls
+  - [ ] Wait for the PR to be merged
+- [ ] For a major release, create an unannotated *devel* tag in the master branch, on the first commit that gets merged after the release branch has been created (presumably the README update commit above), and, push the tag:
+      `DEVEL=v0.$(($MAJ+1)).0-devel; git tag $DEVEL master && git push $DEVEL`
+      This ensures that the devel builds on the master branch will have a meaningful version number.
 - [ ] Close this issue
 
 
diff --git a/.gitignore b/.gitignore
index a6248d887..1dfeddbb0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,7 +6,6 @@
 *.so
 *.dylib
 bin
-artifacts
 testbin/*
 
 # Test binary, build with `go test -c`
diff --git a/Dockerfile b/Dockerfile
index 3260c8dd0..0c724286f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -13,7 +13,7 @@ RUN go mod download
 
 # Copy the go source
 COPY main.go main.go
-COPY apis/ apis/
+COPY api/ api/
 COPY pkg/ pkg/
 
 # Build
diff --git a/Makefile b/Makefile
index 75c67f002..09eced871 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-GIT_TAG ?= $(shell git describe --tags --dirty --always)
+VERSION ?= $(shell git describe --tags --dirty --always)
 # Image URL to use all building/pushing image targets
 IMAGE_BUILD_CMD ?= docker build
 IMAGE_PUSH_CMD ?= docker push
@@ -20,15 +20,9 @@ IMAGE_BUILD_EXTRA_OPTS ?=
 # TODO(#52): Add kueue to k8s gcr registry
 IMAGE_REGISTRY ?= gcr.io/k8s-staging-kueue
 IMAGE_NAME := kueue
+IMAGE_TAG_NAME ?= $(VERSION)
 IMAGE_REPO ?= $(IMAGE_REGISTRY)/$(IMAGE_NAME)
-IMAGE_TAG ?= $(IMAGE_REPO):$(GIT_TAG)
-
-ifdef EXTRA_TAG
-IMAGE_EXTRA_TAG ?= $(IMAGE_REPO):$(EXTRA_TAG)
-endif
-ifdef IMAGE_EXTRA_TAG
-IMAGE_BUILD_EXTRA_OPTS += -t $(IMAGE_EXTRA_TAG)
-endif
+IMAGE_TAG ?= $(IMAGE_REPO):$(IMAGE_TAG_NAME)
 
 # Use distroless as minimal base image to package the manager binary
 # Refer to https://github.com/GoogleContainerTools/distroless for more details
@@ -123,7 +117,7 @@ ci-lint: golangci-lint
 
 .PHONY: verify
 verify: gomod-verify vet ci-lint fmt-verify manifests generate
-	git --no-pager diff --exit-code config/crd/bases apis
+	git --no-pager diff --exit-code config/crd/bases api
 
 ##@ Build
 
@@ -146,9 +140,6 @@ image-build:
 .PHONY: image-push
 image-push:
 	$(IMAGE_PUSH_CMD) $(IMAGE_TAG)
-	if [ -n "$(IMAGE_EXTRA_TAG)" ]; then \
-	  $(IMAGE_PUSH_CMD) $(IMAGE_EXTRA_TAG); \
-	fi
 
 ##@ Deployment
 
@@ -156,8 +147,6 @@ ifndef ignore-not-found
   ignore-not-found = false
 endif
 
-clean-manifests = (cd config/manager && $(KUSTOMIZE) edit set image controller=gcr.io/k8s-staging-kueue/kueue:main)
-
 .PHONY: install
 install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config.
 	$(KUSTOMIZE) build config/crd | kubectl apply -f -
@@ -170,21 +159,12 @@ uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified
 deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config.
 	cd config/manager && $(KUSTOMIZE) edit set image controller=${IMAGE_TAG}
 	$(KUSTOMIZE) build config/default | kubectl apply -f -
-	@$(call clean-manifests)
+	cd config/manager && $(KUSTOMIZE) edit set image controller=gcr.io/k8s-staging-kueue/kueue:devel
 
 .PHONY: undeploy
 undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
 	$(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=$(ignore-not-found) -f -
 
-##@ Release
-.PHONY: artifacts
-artifacts: kustomize
-	cd config/manager && $(KUSTOMIZE) edit set image controller=${IMAGE_TAG}
-	@mkdir -p artifacts
-	@rm -r artifacts/*
-	$(KUSTOMIZE) build config/default -o artifacts/manifests.yaml
-	@$(call clean-manifests)
-
 ##@ Tools
 PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))
 GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint
diff --git a/PROJECT b/PROJECT
index bab428bcb..2f1aaf7c5 100644
--- a/PROJECT
+++ b/PROJECT
@@ -1,7 +1,6 @@
 domain: x-k8s.io
 layout:
 - go.kubebuilder.io/v3
-multigroup: true
 projectName: kueue
 repo: sigs.k8s.io/kueue
 resources:
@@ -16,6 +15,7 @@ resources:
   version: v1alpha1
 - api:
     crdVersion: v1
+    namespaced: false
   controller: true
   domain: x-k8s.io
   group: kueue
@@ -33,16 +33,10 @@ resources:
   version: v1alpha1
 - api:
     crdVersion: v1
+    namespaced: false
   domain: x-k8s.io
   group: kueue
   kind: ResourceFlavor
   path: sigs.k8s.io/kueue/api/v1alpha1
   version: v1alpha1
-- api:
-    crdVersion: v1
-  domain: x-k8s.io
-  group: config
-  kind: KueueConfiguration
-  path: sigs.k8s.io/kueue/apis/config/v1alpha1
-  version: v1alpha1
 version: "3"
diff --git a/RELEASE.md b/RELEASE.md
deleted file mode 100644
index 97d88e80c..000000000
--- a/RELEASE.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Release process
-
-Kueue is released on an as-needed basis.
-
-To begin the process, open an [issue](https://github.com/kubernetes-sigs/kueue/issues/new/choose)
-using the **New Release** template.
diff --git a/apis/core/v1alpha1/clusterqueue_types.go b/api/v1alpha1/clusterqueue_types.go
similarity index 96%
rename from apis/core/v1alpha1/clusterqueue_types.go
rename to api/v1alpha1/clusterqueue_types.go
index 6c441126b..84a2ed970 100644
--- a/apis/core/v1alpha1/clusterqueue_types.go
+++ b/api/v1alpha1/clusterqueue_types.go
@@ -24,7 +24,7 @@ import (
 
 // ClusterQueueSpec defines the desired state of ClusterQueue
 type ClusterQueueSpec struct {
-	// resources represent the total pod requests of workloads dispatched
+	// requestableResources represent the total pod requests of workloads dispatched
 	// via this clusterQueue. This doesn’t guarantee the actual availability of
 	// resources, although an integration with a resource provisioner like Cluster
 	// Autoscaler is possible to achieve that. Example:
@@ -40,7 +40,7 @@ type ClusterQueueSpec struct {
 	//
 	// +listType=map
 	// +listMapKey=name
-	Resources []Resource `json:"resources,omitempty"`
+	RequestableResources []Resource `json:"requestableResources,omitempty"`
 
 	// cohort that this ClusterQueue belongs to. QCs that belong to the
 	// same cohort can borrow unused resources from each other.
@@ -69,7 +69,7 @@ type ClusterQueueSpec struct {
 	//  name: tenantA
 	// spec:
 	//  cohort: borrowing-cohort
-	//  resources:
+	//  requestableResources:
 	// - name: cpu
 	//   - name: spot
 	//     quota:
@@ -95,7 +95,7 @@ type ClusterQueueSpec struct {
 	//  name: tenantB
 	// spec:
 	//  cohort: borrowing-cohort
-	//  resources:
+	//  requestableResources:
 	// - name: cpu
 	//   - name: on-demand
 	//     quota:
@@ -166,7 +166,7 @@ type Resource struct {
 	// flavor and must set different values of a shared key. For example:
 	//
 	// spec:
-	//  resources:
+	//  requestableResources:
 	// - name: nvidia.com/gpus
 	//   - name: k80
 	//     quota:
@@ -183,14 +183,14 @@ type Resource struct {
 	// least one flavor must exist.
 	//
 	// +listType=map
-	// +listMapKey=name
+	// +listMapKey=resourceFlavor
 	Flavors []Flavor `json:"flavors,omitempty"`
 }
 
 type Flavor struct {
-	// name is a reference to the resourceFlavor that defines this flavor.
+	// resourceFlavor is a reference to the resourceFlavor that defines this flavor.
 	// +kubebuilder:default=default
-	Name ResourceFlavorReference `json:"name"`
+	ResourceFlavor ResourceFlavorReference `json:"resourceFlavor"`
 
 	// quota is the limit of resource usage at a point in time.
 	Quota Quota `json:"quota"`
diff --git a/apis/core/v1alpha1/groupversion_info.go b/api/v1alpha1/groupversion_info.go
similarity index 100%
rename from apis/core/v1alpha1/groupversion_info.go
rename to api/v1alpha1/groupversion_info.go
diff --git a/apis/core/v1alpha1/queue_types.go b/api/v1alpha1/queue_types.go
similarity index 100%
rename from apis/core/v1alpha1/queue_types.go
rename to api/v1alpha1/queue_types.go
diff --git a/apis/core/v1alpha1/resourceflavor_types.go b/api/v1alpha1/resourceflavor_types.go
similarity index 100%
rename from apis/core/v1alpha1/resourceflavor_types.go
rename to api/v1alpha1/resourceflavor_types.go
diff --git a/apis/core/v1alpha1/workload_types.go b/api/v1alpha1/workload_types.go
similarity index 99%
rename from apis/core/v1alpha1/workload_types.go
rename to api/v1alpha1/workload_types.go
index 97909f878..a6e36f178 100644
--- a/apis/core/v1alpha1/workload_types.go
+++ b/api/v1alpha1/workload_types.go
@@ -28,7 +28,7 @@ type WorkloadSpec struct {
 	//
 	// +listType=map
 	// +listMapKey=name
-	PodSets []PodSet `json:"podSets,omitempty"`
+	PodSets []PodSet `json:"pods,omitempty"`
 
 	// queueName is the name of the queue the Workload is associated with.
 	QueueName string `json:"queueName"`
diff --git a/apis/core/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
similarity index 99%
rename from apis/core/v1alpha1/zz_generated.deepcopy.go
rename to api/v1alpha1/zz_generated.deepcopy.go
index 1f9767e82..0b7bd0372 100644
--- a/apis/core/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -111,8 +111,8 @@ func (in *ClusterQueueList) DeepCopyObject() runtime.Object {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ClusterQueueSpec) DeepCopyInto(out *ClusterQueueSpec) {
 	*out = *in
-	if in.Resources != nil {
-		in, out := &in.Resources, &out.Resources
+	if in.RequestableResources != nil {
+		in, out := &in.RequestableResources, &out.RequestableResources
 		*out = make([]Resource, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
diff --git a/apis/config/v1alpha1/configuration_types.go b/apis/config/v1alpha1/configuration_types.go
deleted file mode 100644
index 9db341e11..000000000
--- a/apis/config/v1alpha1/configuration_types.go
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-Copyright 2022 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 v1alpha1
-
-import (
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	cfg "sigs.k8s.io/controller-runtime/pkg/config/v1alpha1"
-)
-
-//+kubebuilder:object:root=true
-
-// Configuration is the Schema for the kueueconfigurations API
-type Configuration struct {
-	metav1.TypeMeta `json:",inline"`
-
-	// ControllerManagerConfigurationSpec returns the configurations for controllers
-	cfg.ControllerManagerConfigurationSpec `json:",inline"`
-
-	// ManageJobsWithoutQueueName controls whether or not Kueue reconciles
-	// batch/v1.Jobs that don't set the annotation kueue.x-k8s.io/queue-name.
-	// If set to true, then those jobs will be suspended and never started unless
-	// they are assigned a queue and eventually admitted. This also applies to
-	// jobs created before starting the kueue controller.
-	// Defaults to false; therefore, those jobs are not managed and if they are created
-	// unsuspended, they will start immediately.
-	ManageJobsWithoutQueueName bool `json:"manageJobsWithoutQueueName"`
-}
-
-func init() {
-	SchemeBuilder.Register(&Configuration{})
-}
diff --git a/apis/config/v1alpha1/groupversion_info.go b/apis/config/v1alpha1/groupversion_info.go
deleted file mode 100644
index 37cc6cf82..000000000
--- a/apis/config/v1alpha1/groupversion_info.go
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Copyright 2022 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 v1alpha1 contains API Schema definitions for the config v1alpha1 API group
-//+kubebuilder:object:generate=true
-//+groupName=config.x-k8s.io
-package v1alpha1
-
-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: "config.kueue.x-k8s.io", Version: "v1alpha1"}
-
-	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
-	SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
-
-	// AddToScheme adds the types in this group-version to the given scheme.
-	AddToScheme = SchemeBuilder.AddToScheme
-)
diff --git a/apis/config/v1alpha1/zz_generated.deepcopy.go b/apis/config/v1alpha1/zz_generated.deepcopy.go
deleted file mode 100644
index 6c3786ea2..000000000
--- a/apis/config/v1alpha1/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,51 +0,0 @@
-//go:build !ignore_autogenerated
-// +build !ignore_autogenerated
-
-/*
-Copyright 2022 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-// Code generated by controller-gen. DO NOT EDIT.
-
-package v1alpha1
-
-import (
-	runtime "k8s.io/apimachinery/pkg/runtime"
-)
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *Configuration) DeepCopyInto(out *Configuration) {
-	*out = *in
-	out.TypeMeta = in.TypeMeta
-	in.ControllerManagerConfigurationSpec.DeepCopyInto(&out.ControllerManagerConfigurationSpec)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Configuration.
-func (in *Configuration) DeepCopy() *Configuration {
-	if in == nil {
-		return nil
-	}
-	out := new(Configuration)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
-func (in *Configuration) DeepCopyObject() runtime.Object {
-	if c := in.DeepCopy(); c != nil {
-		return c
-	}
-	return nil
-}
diff --git a/cloudbuild.yaml b/cloudbuild.yaml
index 4fa11aaef..ae6282dd8 100644
--- a/cloudbuild.yaml
+++ b/cloudbuild.yaml
@@ -11,14 +11,15 @@ steps:
       - image-push
     env:
     - IMAGE_REGISTRY=gcr.io/$PROJECT_ID
-    - GIT_TAG=$_GIT_TAG
-    - EXTRA_TAG=$_PULL_BASE_REF
+    - _GIT_TAG=$_GIT_TAG
+    # set devel, as the tag that tracks main branch
+    # this will be modified everytime a release is cut
+    - VERSION="devel"
+    - IMAGE_EXTRA_TAG_NAMES=$_PULL_BASE_REF
 substitutions:
-  # _GIT_TAG will be filled with a git-based tag for the image, of the form vYYYYMMDD-hash, and
-  # can be used as a substitution
+# _GIT_TAG will be filled with a git-based tag for the image, of the form vYYYYMMDD-hash, and
+ # can be used as a substitution
   _GIT_TAG: '0.0.0'
-  # _PULL_BASE_REF will contain the ref that was pushed to trigger this build -
-  # a branch like 'main' or 'release-0.2', or a tag like 'v0.2'.
   _PULL_BASE_REF: 'main'
 options:
   substitution_option: ALLOW_LOOSE
diff --git a/config/crd/bases/kueue.x-k8s.io_clusterqueues.yaml b/config/crd/bases/kueue.x-k8s.io_clusterqueues.yaml
index cab23f545..a59ea3b07 100644
--- a/config/crd/bases/kueue.x-k8s.io_clusterqueues.yaml
+++ b/config/crd/bases/kueue.x-k8s.io_clusterqueues.yaml
@@ -75,18 +75,18 @@ spec:
                   will only be eligible to consume on-demand cores (the next in the
                   list of cpu flavors). 5. Before considering on-demand, the workload
                   will get assigned spot if the quota can be borrowed from the cohort.
-                  \n metadata: name: tenantA spec: cohort: borrowing-cohort resources:
+                  \n metadata: name: tenantA spec: cohort: borrowing-cohort requestableResources:
                   - name: cpu - name: spot quota: min: 1000 - name: on-demand quota:
                   min: 100 - name: nvidia.com/gpus - name: k80 quota: min: 10 max:
                   20 labels: - cloud.provider.com/accelerator: nvidia-tesla-k80 -
                   name: p100 quota: min: 10 max: 20 labels: - cloud.provider.com/accelerator:
                   nvidia-tesla-p100 \n metadata: name: tenantB spec: cohort: borrowing-cohort
-                  resources: - name: cpu - name: on-demand quota: min: 100 - name:
-                  nvidia.com/gpus - name: k80 quota: min: 10 max: 20 labels: - cloud.provider.com/accelerator:
-                  nvidia-tesla-k80 \n If empty, this ClusterQueue cannot borrow from
-                  any other ClusterQueue and vice versa. \n The name style is similar
-                  to label keys. These are just names to link QCs together, and they
-                  are meaningless otherwise."
+                  requestableResources: - name: cpu - name: on-demand quota: min:
+                  100 - name: nvidia.com/gpus - name: k80 quota: min: 10 max: 20 labels:
+                  - cloud.provider.com/accelerator: nvidia-tesla-k80 \n If empty,
+                  this ClusterQueue cannot borrow from any other ClusterQueue and
+                  vice versa. \n The name style is similar to label keys. These are
+                  just names to link QCs together, and they are meaningless otherwise."
                 type: string
               namespaceSelector:
                 description: namespaceSelector defines which namespaces are allowed
@@ -151,13 +151,13 @@ spec:
                 - StrictFIFO
                 - BestEffortFIFO
                 type: string
-              resources:
-                description: "resources represent the total pod requests of workloads
-                  dispatched via this clusterQueue. This doesn’t guarantee the actual
-                  availability of resources, although an integration with a resource
-                  provisioner like Cluster Autoscaler is possible to achieve that.
-                  Example: \n - name: cpu flavors: - quota: min: 100 - name: memory
-                  flavors: - quota: min: 100Gi"
+              requestableResources:
+                description: "requestableResources represent the total pod requests
+                  of workloads dispatched via this clusterQueue. This doesn’t guarantee
+                  the actual availability of resources, although an integration with
+                  a resource provisioner like Cluster Autoscaler is possible to achieve
+                  that. Example: \n - name: cpu flavors: - quota: min: 100 - name:
+                  memory flavors: - quota: min: 100Gi"
                 items:
                   properties:
                     flavors:
@@ -169,22 +169,17 @@ spec:
                         \n For example, if the resource is nvidia.com/gpu, and we
                         want to define different limits for different gpu models,
                         then each model is mapped to a flavor and must set different
-                        values of a shared key. For example: \n spec: resources: -
-                        name: nvidia.com/gpus - name: k80 quota: min: 10 - name: p100
-                        quota: min: 10 \n The flavors are evaluated in order, selecting
-                        the first to satisfy a workload’s requirements. Also the quantities
-                        are additive, in the example above the GPU quota in total
-                        is 20 (10 k80 + 10 p100). A workload is limited to the selected
-                        type by converting the labels to a node selector that gets
-                        injected into the workload. This list can’t be empty, at least
-                        one flavor must exist."
+                        values of a shared key. For example: \n spec: requestableResources:
+                        - name: nvidia.com/gpus - name: k80 quota: min: 10 - name:
+                        p100 quota: min: 10 \n The flavors are evaluated in order,
+                        selecting the first to satisfy a workload’s requirements.
+                        Also the quantities are additive, in the example above the
+                        GPU quota in total is 20 (10 k80 + 10 p100). A workload is
+                        limited to the selected type by converting the labels to a
+                        node selector that gets injected into the workload. This list
+                        can’t be empty, at least one flavor must exist."
                       items:
                         properties:
-                          name:
-                            default: default
-                            description: name is a reference to the resourceFlavor
-                              that defines this flavor.
-                            type: string
                           quota:
                             description: quota is the limit of resource usage at a
                               point in time.
@@ -215,13 +210,18 @@ spec:
                                 pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                 x-kubernetes-int-or-string: true
                             type: object
+                          resourceFlavor:
+                            default: default
+                            description: resourceFlavor is a reference to the resourceFlavor
+                              that defines this flavor.
+                            type: string
                         required:
-                        - name
                         - quota
+                        - resourceFlavor
                         type: object
                       type: array
                       x-kubernetes-list-map-keys:
-                      - name
+                      - resourceFlavor
                       x-kubernetes-list-type: map
                     name:
                       description: name of the resource. For example, cpu, memory
diff --git a/config/crd/bases/kueue.x-k8s.io_workloads.yaml b/config/crd/bases/kueue.x-k8s.io_workloads.yaml
index 904104695..7c3cd12ff 100644
--- a/config/crd/bases/kueue.x-k8s.io_workloads.yaml
+++ b/config/crd/bases/kueue.x-k8s.io_workloads.yaml
@@ -83,7 +83,7 @@ spec:
                 - clusterQueue
                 - podSetFlavors
                 type: object
-              podSets:
+              pods:
                 description: pods is a list of sets of homogeneous pods, each described
                   by a Pod spec and a count.
                 items:
diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml
index 921044298..5f4a332df 100644
--- a/config/default/kustomization.yaml
+++ b/config/default/kustomization.yaml
@@ -32,7 +32,7 @@ patchesStrategicMerge:
 
 # Mount the controller config file for loading manager configurations
 # through a ComponentConfig type
-- manager_config_patch.yaml
+#- manager_config_patch.yaml
 
 # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in
 # crd/kustomization.yaml
diff --git a/config/default/manager_auth_proxy_patch.yaml b/config/default/manager_auth_proxy_patch.yaml
index ca55a8117..15bb913b0 100644
--- a/config/default/manager_auth_proxy_patch.yaml
+++ b/config/default/manager_auth_proxy_patch.yaml
@@ -22,4 +22,7 @@ spec:
           name: https
       - name: manager
         args:
+        - "--health-probe-bind-address=:8081"
+        - "--metrics-bind-address=127.0.0.1:8080"
+        - "--leader-elect"
         - "--zap-log-level=2"
diff --git a/config/default/manager_config_patch.yaml b/config/default/manager_config_patch.yaml
index 7937e6666..6c400155c 100644
--- a/config/default/manager_config_patch.yaml
+++ b/config/default/manager_config_patch.yaml
@@ -10,7 +10,6 @@ spec:
       - name: manager
         args:
         - "--config=controller_manager_config.yaml"
-        - "--zap-log-level=2"
         volumeMounts:
         - name: manager-config
           mountPath: /controller_manager_config.yaml
diff --git a/config/manager/controller_manager_config.yaml b/config/manager/controller_manager_config.yaml
index 9a9df85b7..c3aa23da1 100644
--- a/config/manager/controller_manager_config.yaml
+++ b/config/manager/controller_manager_config.yaml
@@ -1,12 +1,11 @@
-apiVersion: config.kueue.x-k8s.io/v1alpha1
-kind: Configuration
+apiVersion: controller-runtime.sigs.k8s.io/v1alpha1
+kind: ControllerManagerConfig
 health:
   healthProbeBindAddress: :8081
 metrics:
-  bindAddress: :8080
+  bindAddress: 127.0.0.1:8080
 webhook:
   port: 9443
 leaderElection:
   leaderElect: true
   resourceName: c1f6bfd2.kueue.x-k8s.io
-#manageJobsWithoutQueueName: true
diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml
index c166fcdcf..44371efa0 100644
--- a/config/manager/kustomization.yaml
+++ b/config/manager/kustomization.yaml
@@ -8,10 +8,9 @@ configMapGenerator:
 - files:
   - controller_manager_config.yaml
   name: manager-config
-
 apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 images:
 - name: controller
   newName: gcr.io/k8s-staging-kueue/kueue
-  newTag: main
+  newTag: devel
diff --git a/config/samples/single-clusterqueue-setup.yaml b/config/samples/single-clusterqueue-setup.yaml
index ae4f1e709..7b11c8988 100644
--- a/config/samples/single-clusterqueue-setup.yaml
+++ b/config/samples/single-clusterqueue-setup.yaml
@@ -9,15 +9,15 @@ metadata:
   name: cluster-total
 spec:
   namespaceSelector: {}
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 9
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 36Gi
 ---
diff --git a/docs/concepts/cluster_queue.md b/docs/concepts/cluster_queue.md
index edd0b22c3..5e94b676b 100644
--- a/docs/concepts/cluster_queue.md
+++ b/docs/concepts/cluster_queue.md
@@ -16,15 +16,15 @@ metadata:
   name: cluster-total
 spec:
   namespaceSelector: {}
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 9
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 36Gi
 ```
@@ -103,10 +103,10 @@ taints:
 ```
 
 You can use the `.metadata.name` to reference a flavor from a ClusterQueue in
-the `.spec.resources[*].flavors[*].name` field.
+the `.spec.requestableResources[*].flavors[*].resourceFlavor` field.
 
 For each resource of each [pod set](workload.md#pod-sets) in a Workload, Kueue
-assigns the first flavor in the `.spec.resources[*].flavors`
+assigns the first flavor in the `.spec.requestableResources[*].resources.flavors`
 list that has enough unused quota in the ClusterQueue or the ClusterQueue's
 [cohort](#cohort).
 
@@ -176,7 +176,7 @@ ClusterQueue.
 When borrowing, Kueue satisfies the following semantics:
 
 - When assigning flavors, Kueue goes through the list of flavors in
-  `.spec.resources[*].flavors`. For each flavor, Kueue attempts to
+  `.spec.requestableResources[*].flavors`. For each flavor, Kueue attempts to
   fit the workload using the min quota of the ClusterQueue or the unused
   min quota of other ClusterQueues in the cohort, up to the max quota of the
   ClusterQueue. If the workload doesn't fit, Kueue proceeds evaluating the next
@@ -196,15 +196,15 @@ metadata:
 spec:
   namespaceSelector: {}
   cohort: team-ab
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 9
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 36Gi
 ```
@@ -217,15 +217,15 @@ metadata:
 spec:
   namespaceSelector: {}
   cohort: team-ab
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 12
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 48Gi
 ```
@@ -247,7 +247,7 @@ No admitted workloads will be stopped to make space for new workloads.
 ### Max quotas
 
 To limit the amount of resources that a ClusterQueue can borrow from others,
-you can set the `.spec.resources[*].flavors[*].quota.max`
+you can set the `.spec.requestableResources[*].flavors[*].quota.max`
 [quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) field.
 `max` must be greater than or equal to `min`.
 
diff --git a/docs/concepts/workload.md b/docs/concepts/workload.md
index 08449d02d..5cb582221 100644
--- a/docs/concepts/workload.md
+++ b/docs/concepts/workload.md
@@ -23,7 +23,7 @@ metadata:
   name: sample-job
   namespace: default
 spec:
-  podSets:
+  pods:
   - count: 3
     name: main
     spec:
diff --git a/docs/tasks/administer_cluster_quotas.md b/docs/tasks/administer_cluster_quotas.md
index afdfef433..b6e292d97 100644
--- a/docs/tasks/administer_cluster_quotas.md
+++ b/docs/tasks/administer_cluster_quotas.md
@@ -40,15 +40,15 @@ metadata:
   name: cluster-total
 spec:
   namespaceSelector: {} # match all.
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 9
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 36Gi
 ```
@@ -90,7 +90,7 @@ To create the ResourceFlavor, run the following command:
 kubectl apply -f default-flavor.yaml
 ```
 
-The `.metadata.name` matches the `.spec.resources[*].flavors[0].resourceFlavor`
+The `.metadata.name` matches the `.spec.requestableResources[*].flavors[0].resourceFlavor`
 field in the ClusterQueue.
 
 ### 3. Create [Queues](/docs/concepts/queue.md)
@@ -129,7 +129,7 @@ architectures, namely `x86` and `arm`, specified in the node label `cpu-arch`.
 
 **Limitations**
 
-- Using the same flavors in multiple `.resources` of a ClusterQueue
+- Using the same flavors in multiple `.requestableResources` of a ClusterQueue
   is [not supported](https://github.com/kubernetes-sigs/kueue/issues/167).
 
 ### 1. Create ResourceFlavors
@@ -181,23 +181,23 @@ metadata:
   name: cluster-total
 spec:
   namespaceSelector: {}
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: x86
+    - resourceFlavor: x86
       quota:
         min: 9
-    - name: arm
+    - resourceFlavor: arm
       quota:
         min: 12
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 84Gi
 ```
 
-The flavor names in the fields `.spec.resources[*].flavors[*].resourceFlavor`
+The flavor names in the fields `.spec.requestableResources[*].flavors[*].resourceFlavor`
 should match the names of the ResourceFlavors created earlier.
 
 Note that `memory` is referencing the `default` flavor created in the [single flavor setup](#single-clusterqueue-and-single-resourceflavor-setup)
@@ -227,16 +227,16 @@ metadata:
 spec:
   namespaceSelector: {}
   cohort: team-ab
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 9
         max: 15
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 36Gi
         max: 60Gi
@@ -251,15 +251,15 @@ metadata:
 spec:
   namespaceSelector: {}
   cohort: team-ab
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 12
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 48Gi
 ```
@@ -295,19 +295,19 @@ metadata:
 spec:
   namespaceSelector: {}
   cohort: team-ab
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: arm
+    - resourceFlavor: arm
       quota:
         min: 9
         max: 9
-    - name: x86
+    - resourceFlavor: x86
       quota:
         min: 0
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 36Gi
 ```
@@ -321,19 +321,18 @@ metadata:
 spec:
   namespaceSelector: {}
   cohort: team-ab
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: arm
+    - resourceFlavor: arm
       quota:
         min: 12
-        max: 12
-    - name: x86
+    - resourceFlavor: x86
       quota:
         min: 0
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 48Gi
 ```
@@ -347,15 +346,15 @@ metadata:
 spec:
   namespaceSelector: {}
   cohort: team-ab
-  resources:
+  requestableResources:
   - name: "cpu"
     flavors:
-    - name: x86
+    - resourceFlavor: x86
       quota:
         min: 6
   - name: "memory"
     flavors:
-    - name: default
+    - resourceFlavor: default
       quota:
         min: 24Gi
 ```
diff --git a/main.go b/main.go
index 508dfae21..fceedf946 100644
--- a/main.go
+++ b/main.go
@@ -17,9 +17,7 @@ limitations under the License.
 package main
 
 import (
-	"bytes"
 	"flag"
-	"fmt"
 	"os"
 
 	// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
@@ -28,15 +26,13 @@ import (
 
 	schedulingv1 "k8s.io/api/scheduling/v1"
 	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/serializer"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/healthz"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 
-	configv1alpha1 "sigs.k8s.io/kueue/apis/config/v1alpha1"
-	kueuev1alpha1 "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueuev1alpha1 "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/cache"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/controller/core"
@@ -56,46 +52,32 @@ func init() {
 	utilruntime.Must(schedulingv1.AddToScheme(scheme))
 
 	utilruntime.Must(kueuev1alpha1.AddToScheme(scheme))
-	utilruntime.Must(configv1alpha1.AddToScheme(scheme))
 	//+kubebuilder:scaffold:scheme
 }
 
 func main() {
-	var configFile string
-	flag.StringVar(&configFile, "config", "",
-		"The controller will load its initial configuration from this file. "+
-			"Omit this flag to use the default configuration values. ")
-
+	var metricsAddr string
+	var enableLeaderElection bool
+	var probeAddr string
+	flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
+	flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
+	flag.BoolVar(&enableLeaderElection, "leader-elect", false,
+		"Enable leader election for controller manager. "+
+			"Enabling this will ensure there is only one active controller manager.")
 	opts := zap.Options{}
 	opts.BindFlags(flag.CommandLine)
 	flag.Parse()
 
 	ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
 
-	options := ctrl.Options{
+	mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
 		Scheme:                 scheme,
-		HealthProbeBindAddress: ":8081",
-		MetricsBindAddress:     ":8080",
+		MetricsBindAddress:     metricsAddr,
 		Port:                   9443,
+		HealthProbeBindAddress: probeAddr,
+		LeaderElection:         enableLeaderElection,
 		LeaderElectionID:       "c1f6bfd2.kueue.x-k8s.io",
-	}
-	var err error
-	config := configv1alpha1.Configuration{}
-	if configFile != "" {
-		options, err = options.AndFrom(ctrl.ConfigFile().AtPath(configFile).OfKind(&config))
-		if err != nil {
-			setupLog.Error(err, "unable to load the config file")
-			os.Exit(1)
-		}
-		cfgStr, err := encodeConfig(&config)
-		if err != nil {
-			setupLog.Error(err, "unable to encode config file")
-			os.Exit(1)
-		}
-		setupLog.Info("Successfully loaded config file", "config", cfgStr)
-	}
-
-	mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), options)
+	})
 	if err != nil {
 		setupLog.Error(err, "unable to start manager")
 		os.Exit(1)
@@ -112,11 +94,8 @@ func main() {
 	if failedCtrl, err := core.SetupControllers(mgr, queues, cCache); err != nil {
 		setupLog.Error(err, "Unable to create controller", "controller", failedCtrl)
 	}
-	if err = job.NewReconciler(mgr.GetScheme(),
-		mgr.GetClient(),
-		mgr.GetEventRecorderFor(constants.JobControllerName),
-		job.WithManageJobsWithoutQueueName(config.ManageJobsWithoutQueueName),
-	).SetupWithManager(mgr); err != nil {
+	if err = job.NewReconciler(mgr.GetScheme(), mgr.GetClient(),
+		mgr.GetEventRecorderFor(constants.JobControllerName)).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "Job")
 		os.Exit(1)
 	}
@@ -146,19 +125,3 @@ func main() {
 		os.Exit(1)
 	}
 }
-
-func encodeConfig(cfg *configv1alpha1.Configuration) (string, error) {
-	codecs := serializer.NewCodecFactory(scheme)
-	const mediaType = runtime.ContentTypeYAML
-	info, ok := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), mediaType)
-	if !ok {
-		return "", fmt.Errorf("unable to locate encoder -- %q is not a supported media type", mediaType)
-	}
-
-	encoder := codecs.EncoderForVersion(info.Serializer, configv1alpha1.GroupVersion)
-	buf := new(bytes.Buffer)
-	if err := encoder.Encode(cfg, buf); err != nil {
-		return "", err
-	}
-	return buf.String(), nil
-}
diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go
index 669cb1466..542c42385 100644
--- a/pkg/cache/cache.go
+++ b/pkg/cache/cache.go
@@ -28,7 +28,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/sets"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/util/pointer"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
@@ -115,15 +115,15 @@ func (c *Cache) newClusterQueue(cq *kueue.ClusterQueue) (*ClusterQueue, error) {
 }
 
 func (c *ClusterQueue) update(in *kueue.ClusterQueue, resourceFlavors map[string]*kueue.ResourceFlavor) error {
-	c.RequestableResources = resourceLimitsByName(in.Spec.Resources)
+	c.RequestableResources = resourceLimitsByName(in.Spec.RequestableResources)
 	nsSelector, err := metav1.LabelSelectorAsSelector(in.Spec.NamespaceSelector)
 	if err != nil {
 		return err
 	}
 	c.NamespaceSelector = nsSelector
 
-	usedResources := make(Resources, len(in.Spec.Resources))
-	for _, r := range in.Spec.Resources {
+	usedResources := make(Resources, len(in.Spec.RequestableResources))
+	for _, r := range in.Spec.RequestableResources {
 		if len(r.Flavors) == 0 {
 			continue
 		}
@@ -131,7 +131,7 @@ func (c *ClusterQueue) update(in *kueue.ClusterQueue, resourceFlavors map[string
 		existingUsedFlavors := c.UsedResources[r.Name]
 		usedFlavors := make(map[string]int64, len(r.Flavors))
 		for _, f := range r.Flavors {
-			usedFlavors[string(f.Name)] = existingUsedFlavors[string(f.Name)]
+			usedFlavors[string(f.ResourceFlavor)] = existingUsedFlavors[string(f.ResourceFlavor)]
 		}
 		usedResources[r.Name] = usedFlavors
 	}
@@ -473,7 +473,7 @@ func resourceLimitsByName(in []kueue.Resource) map[corev1.ResourceName][]FlavorL
 		for i := range flavors {
 			f := &r.Flavors[i]
 			fLimits := FlavorLimits{
-				Name: string(f.Name),
+				Name: string(f.ResourceFlavor),
 				Min:  workload.ResourceValue(r.Name, f.Quota.Min),
 			}
 			if f.Quota.Max != nil {
diff --git a/pkg/cache/snapshot.go b/pkg/cache/snapshot.go
index 7b85be048..7808ec70c 100644
--- a/pkg/cache/snapshot.go
+++ b/pkg/cache/snapshot.go
@@ -17,7 +17,7 @@ limitations under the License.
 package cache
 
 import (
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
diff --git a/pkg/controller/core/clusterqueue_controller.go b/pkg/controller/core/clusterqueue_controller.go
index c87f3230e..9371fc0f0 100644
--- a/pkg/controller/core/clusterqueue_controller.go
+++ b/pkg/controller/core/clusterqueue_controller.go
@@ -33,7 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/source"
 	"sigs.k8s.io/kueue/pkg/queue"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/cache"
 )
 
diff --git a/pkg/controller/core/queue_controller.go b/pkg/controller/core/queue_controller.go
index 1c5f88a22..04d1c5b65 100644
--- a/pkg/controller/core/queue_controller.go
+++ b/pkg/controller/core/queue_controller.go
@@ -31,7 +31,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/source"
 	"sigs.k8s.io/kueue/pkg/constants"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/queue"
 )
 
diff --git a/pkg/controller/core/resourceflavor_controller.go b/pkg/controller/core/resourceflavor_controller.go
index 214d838f3..7fa8c0faf 100644
--- a/pkg/controller/core/resourceflavor_controller.go
+++ b/pkg/controller/core/resourceflavor_controller.go
@@ -24,7 +24,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/cache"
 )
 
diff --git a/pkg/controller/core/workload_controller.go b/pkg/controller/core/workload_controller.go
index 097251282..a12bda39b 100644
--- a/pkg/controller/core/workload_controller.go
+++ b/pkg/controller/core/workload_controller.go
@@ -27,7 +27,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/cache"
 	"sigs.k8s.io/kueue/pkg/queue"
 	"sigs.k8s.io/kueue/pkg/workload"
diff --git a/pkg/controller/workload/job/job_controller.go b/pkg/controller/workload/job/job_controller.go
index 9798a4b2b..e943cc068 100644
--- a/pkg/controller/workload/job/job_controller.go
+++ b/pkg/controller/workload/job/job_controller.go
@@ -34,7 +34,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	utilpriority "sigs.k8s.io/kueue/pkg/util/priority"
 	"sigs.k8s.io/kueue/pkg/workload"
@@ -46,45 +46,16 @@ var (
 
 // JobReconciler reconciles a Job object
 type JobReconciler struct {
-	client                     client.Client
-	scheme                     *runtime.Scheme
-	record                     record.EventRecorder
-	manageJobsWithoutQueueName bool
+	client client.Client
+	scheme *runtime.Scheme
+	record record.EventRecorder
 }
 
-type options struct {
-	manageJobsWithoutQueueName bool
-}
-
-// Option configures the reconciler.
-type Option func(*options)
-
-// WithManageJobsWithoutQueueName indicates if the controller should reconcile
-// jobs that don't set the queue name annotation.
-func WithManageJobsWithoutQueueName(f bool) Option {
-	return func(o *options) {
-		o.manageJobsWithoutQueueName = f
-	}
-}
-
-var defaultOptions = options{}
-
-func NewReconciler(
-	scheme *runtime.Scheme,
-	client client.Client,
-	record record.EventRecorder,
-	opts ...Option) *JobReconciler {
-
-	options := defaultOptions
-	for _, opt := range opts {
-		opt(&options)
-	}
-
+func NewReconciler(scheme *runtime.Scheme, client client.Client, record record.EventRecorder) *JobReconciler {
 	return &JobReconciler{
-		scheme:                     scheme,
-		client:                     client,
-		record:                     record,
-		manageJobsWithoutQueueName: options.manageJobsWithoutQueueName,
+		scheme: scheme,
+		client: client,
+		record: record,
 	}
 }
 
@@ -133,11 +104,6 @@ func (r *JobReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
 
 	log := ctrl.LoggerFrom(ctx).WithValues("job", klog.KObj(&job))
 	ctx = ctrl.LoggerInto(ctx, log)
-	if queueName(&job) == "" && !r.manageJobsWithoutQueueName {
-		log.V(3).Info(fmt.Sprintf("%s annotation is not set, ignoring the job", constants.QueueAnnotation))
-		return ctrl.Result{}, nil
-	}
-
 	log.V(2).Info("Reconciling Job")
 
 	var childWorkloads kueue.WorkloadList
diff --git a/pkg/queue/cluster_queue_best_effort_fifo.go b/pkg/queue/cluster_queue_best_effort_fifo.go
index 6e4e3de1c..dc7f3548d 100644
--- a/pkg/queue/cluster_queue_best_effort_fifo.go
+++ b/pkg/queue/cluster_queue_best_effort_fifo.go
@@ -19,7 +19,7 @@ package queue
 import (
 	"k8s.io/apimachinery/pkg/api/equality"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
@@ -75,9 +75,15 @@ func (cq *ClusterQueueBestEffortFIFO) Delete(w *kueue.Workload) {
 	cq.ClusterQueueImpl.Delete(w)
 }
 
-// AddInadmissibleIfNotPresent inserts a workload that cannot be admitted into
-// the inadmissibleWorkloads in ClusterQueue, unless it is already in the queue.
-func (cq *ClusterQueueBestEffortFIFO) AddInadmissibleIfNotPresent(wInfo *workload.Info) bool {
+// RequeueIfNotPresent inserts a workload that cannot be admitted into
+// ClusterQueue, unless it is already in the queue. If immediate is true,
+// the workload will be pushed back to heap directly. If not,
+// the workload will be put into the inadmissibleWorkloads.
+func (cq *ClusterQueueBestEffortFIFO) RequeueIfNotPresent(wInfo *workload.Info, immediate bool) bool {
+	if immediate {
+		return cq.ClusterQueueImpl.pushIfNotPresent(wInfo)
+	}
+
 	key := workload.Key(wInfo.Obj)
 	if cq.inadmissibleWorkloads[key] != nil {
 		return false
diff --git a/pkg/queue/cluster_queue_impl.go b/pkg/queue/cluster_queue_impl.go
index 86117b1bb..5545f26f6 100644
--- a/pkg/queue/cluster_queue_impl.go
+++ b/pkg/queue/cluster_queue_impl.go
@@ -21,7 +21,7 @@ import (
 
 	"k8s.io/apimachinery/pkg/util/sets"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
@@ -92,7 +92,7 @@ func (c *ClusterQueueImpl) Delete(w *kueue.Workload) {
 	}
 }
 
-func (c *ClusterQueueImpl) AddInadmissibleIfNotPresent(wInfo *workload.Info) bool {
+func (c *ClusterQueueImpl) RequeueIfNotPresent(wInfo *workload.Info, _ bool) bool {
 	return c.pushIfNotPresent(wInfo)
 }
 
diff --git a/pkg/queue/cluster_queue_interface.go b/pkg/queue/cluster_queue_interface.go
index 0a2d760d4..54307af79 100644
--- a/pkg/queue/cluster_queue_interface.go
+++ b/pkg/queue/cluster_queue_interface.go
@@ -20,7 +20,7 @@ import (
 	"fmt"
 
 	"k8s.io/apimachinery/pkg/util/sets"
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
@@ -49,12 +49,16 @@ type ClusterQueue interface {
 	// queue is empty.
 	Pop() *workload.Info
 
-	// AddInadmissibleIfNotPresent inserts a workload that could not be
-	// admitted back into the ClusterQueue. The implementation might choose to
-	// keep it in temporary placeholder stage where it doesn't compete with
-	// other workloads, until cluster events free up quota. The workload should
-	// not be reinserted if it's already in the ClusterQueue.
-	AddInadmissibleIfNotPresent(*workload.Info) bool
+	// RequeueIfNotPresent inserts a workload that was not
+	// admitted back into the ClusterQueue. If the boolean is true,
+	// the workloads should be put back in the queue immediately,
+	// because we couldn't determine if the workload was admissible
+	// in the last cycle. If the boolean is false, the implementation might
+	// choose to keep it in temporary placeholder stage where it doesn't
+	// compete with other workloads, until cluster events free up quota.
+	// The workload should not be reinserted if it's already in the ClusterQueue.
+	// Returns true if the workload was inserted.
+	RequeueIfNotPresent(*workload.Info, bool) bool
 	// QueueInadmissibleWorkloads moves all workloads put in temporary placeholder stage
 	// to the ClusterQueue. If at least one workload is moved,
 	// returns true. Otherwise returns false.
diff --git a/pkg/queue/cluster_queue_strict_fifo.go b/pkg/queue/cluster_queue_strict_fifo.go
index a8a51f9ec..5a63a84fe 100644
--- a/pkg/queue/cluster_queue_strict_fifo.go
+++ b/pkg/queue/cluster_queue_strict_fifo.go
@@ -17,7 +17,7 @@ limitations under the License.
 package queue
 
 import (
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	utilpriority "sigs.k8s.io/kueue/pkg/util/priority"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
diff --git a/pkg/queue/manager.go b/pkg/queue/manager.go
index 701c65476..5ecab0b33 100644
--- a/pkg/queue/manager.go
+++ b/pkg/queue/manager.go
@@ -27,7 +27,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
@@ -284,7 +284,7 @@ func (m *Manager) addOrUpdateWorkload(w *kueue.Workload) bool {
 // RequeueWorkload requeues the workload ensuring that the queue and the
 // workload still exist in the client cache and it's not admitted. It won't
 // requeue if the workload is already in the queue (possible if the workload was updated).
-func (m *Manager) RequeueWorkload(ctx context.Context, info *workload.Info) bool {
+func (m *Manager) RequeueWorkload(ctx context.Context, info *workload.Info, immediate bool) bool {
 	m.Lock()
 	defer m.Unlock()
 
@@ -306,7 +306,7 @@ func (m *Manager) RequeueWorkload(ctx context.Context, info *workload.Info) bool
 		return false
 	}
 
-	added := cq.AddInadmissibleIfNotPresent(info)
+	added := cq.RequeueIfNotPresent(info, immediate)
 	if added {
 		m.cond.Broadcast()
 	}
diff --git a/pkg/queue/queue.go b/pkg/queue/queue.go
index f3977561e..eac31aa0c 100644
--- a/pkg/queue/queue.go
+++ b/pkg/queue/queue.go
@@ -19,7 +19,7 @@ package queue
 import (
 	"fmt"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
 
diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go
index 050ee93b0..8095103fc 100644
--- a/pkg/scheduler/scheduler.go
+++ b/pkg/scheduler/scheduler.go
@@ -36,7 +36,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/cache"
 	"sigs.k8s.io/kueue/pkg/queue"
 	"sigs.k8s.io/kueue/pkg/util/routine"
@@ -109,8 +109,6 @@ func (s *Scheduler) schedule(ctx context.Context) {
 		}
 		c := snapshot.ClusterQueues[e.ClusterQueue]
 		if len(e.borrows) > 0 && c.Cohort != nil && usedCohorts.Has(c.Cohort.Name) {
-			// TODO(): we shouldn't emit an event or update the workload condition in this
-			// case, just re-queue directly.
 			e.status = skipped
 			e.inadmissibleReason = "cohort used in this cycle"
 			continue
@@ -119,12 +117,7 @@ func (s *Scheduler) schedule(ctx context.Context) {
 		if err := s.admit(ctrl.LoggerInto(ctx, log), e); err == nil {
 			e.status = assumed
 		} else {
-			log.Error(err, "Failed to admit workload")
 			e.inadmissibleReason = fmt.Sprintf("Failed to admit workload: %v", err)
-			err := workload.UpdateStatus(ctx, s.client, e.Obj, kueue.WorkloadAdmitted, corev1.ConditionFalse, "Pending", err.Error())
-			if err != nil {
-				log.Error(err, "Updating Workload status")
-			}
 		}
 		// Even if there was a failure, we shouldn't admit other workloads to this
 		// cohort.
@@ -141,8 +134,7 @@ func (s *Scheduler) schedule(ctx context.Context) {
 			"status", e.status,
 			"reason", e.inadmissibleReason)
 		if e.status != assumed {
-			s.requeueAndUpdate(log, ctx, &e.Info, e.inadmissibleReason)
-			s.recorder.Eventf(e.Obj, corev1.EventTypeNormal, "Pending", e.inadmissibleReason)
+			s.requeueAndUpdate(log, ctx, e)
 		}
 	}
 }
@@ -275,9 +267,9 @@ func (s *Scheduler) admit(ctx context.Context, e *entry) error {
 			log.V(2).Info("Workload not admitted because it was deleted")
 			return
 		}
+
 		log.Error(err, errCouldNotAdmitWL)
-		s.requeueAndUpdate(log, ctx, &e.Info, err.Error())
-		s.recorder.Eventf(newWorkload, corev1.EventTypeNormal, "Pending", "%s: %v", errCouldNotAdmitWL, err)
+		s.requeueAndUpdate(log, ctx, *e)
 	})
 
 	return nil
@@ -423,11 +415,15 @@ func (e entryOrdering) Less(i, j int) bool {
 	return a.Obj.CreationTimestamp.Before(&b.Obj.CreationTimestamp)
 }
 
-func (s *Scheduler) requeueAndUpdate(log logr.Logger, ctx context.Context, w *workload.Info, message string) {
-	added := s.queues.RequeueWorkload(ctx, w)
-	log.V(2).Info("Workload re-queued", "workload", klog.KObj(w.Obj), "queue", klog.KRef(w.Obj.Namespace, w.Obj.Spec.QueueName), "added", added)
-	err := workload.UpdateStatus(ctx, s.client, w.Obj, kueue.WorkloadAdmitted, corev1.ConditionFalse, "Pending", message)
-	if err != nil {
-		log.Error(err, "Could not update Workload status")
+func (s *Scheduler) requeueAndUpdate(log logr.Logger, ctx context.Context, e entry) {
+	added := s.queues.RequeueWorkload(ctx, &e.Info, e.status != "")
+	log.V(2).Info("Workload re-queued", "workload", klog.KObj(e.Obj), "queue", klog.KRef(e.Obj.Namespace, e.Obj.Spec.QueueName), "added", added, "status", e.status)
+
+	if e.status == "" {
+		err := workload.UpdateStatus(ctx, s.client, e.Obj, kueue.WorkloadAdmitted, corev1.ConditionFalse, "Pending", e.inadmissibleReason)
+		if err != nil {
+			log.Error(err, "Could not update Workload status")
+		}
+		s.recorder.Eventf(e.Obj, corev1.EventTypeNormal, "Pending", e.inadmissibleReason)
 	}
 }
diff --git a/pkg/util/priority/priority.go b/pkg/util/priority/priority.go
index b5f02c36a..12dacee0a 100644
--- a/pkg/util/priority/priority.go
+++ b/pkg/util/priority/priority.go
@@ -23,7 +23,7 @@ import (
 	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/constants"
 )
 
diff --git a/pkg/workload/workload.go b/pkg/workload/workload.go
index 4c459010d..b3320d852 100644
--- a/pkg/workload/workload.go
+++ b/pkg/workload/workload.go
@@ -26,7 +26,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 )
 
 // Info holds a Workload object and some pre-processing.


Test patch:
diff --git a/pkg/cache/cache_test.go b/pkg/cache/cache_test.go
index e2d86ce01..626d2c25f 100644
--- a/pkg/cache/cache_test.go
+++ b/pkg/cache/cache_test.go
@@ -31,7 +31,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/sets"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/util/pointer"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/workload"
@@ -42,11 +42,11 @@ func TestCacheClusterQueueOperations(t *testing.T) {
 		{
 			ObjectMeta: metav1.ObjectMeta{Name: "a"},
 			Spec: kueue.ClusterQueueSpec{
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: corev1.ResourceCPU,
 						Flavors: []kueue.Flavor{{
-							Name: "default",
+							ResourceFlavor: "default",
 							Quota: kueue.Quota{
 								Min: resource.MustParse("10"),
 								Max: pointer.Quantity(resource.MustParse("20")),
@@ -60,11 +60,11 @@ func TestCacheClusterQueueOperations(t *testing.T) {
 		{
 			ObjectMeta: metav1.ObjectMeta{Name: "b"},
 			Spec: kueue.ClusterQueueSpec{
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: corev1.ResourceCPU,
 						Flavors: []kueue.Flavor{{
-							Name: "default",
+							ResourceFlavor: "default",
 							Quota: kueue.Quota{
 								Min: resource.MustParse("15"),
 							},
@@ -203,12 +203,12 @@ func TestCacheClusterQueueOperations(t *testing.T) {
 					{
 						ObjectMeta: metav1.ObjectMeta{Name: "a"},
 						Spec: kueue.ClusterQueueSpec{
-							Resources: []kueue.Resource{
+							RequestableResources: []kueue.Resource{
 								{
 									Name: corev1.ResourceCPU,
 									Flavors: []kueue.Flavor{
 										{
-											Name: "default",
+											ResourceFlavor: "default",
 											Quota: kueue.Quota{
 												Min: resource.MustParse("5"),
 												Max: pointer.Quantity(resource.MustParse("10")),
@@ -336,12 +336,12 @@ func TestCacheWorkloadOperations(t *testing.T) {
 		{
 			ObjectMeta: metav1.ObjectMeta{Name: "one"},
 			Spec: kueue.ClusterQueueSpec{
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: "cpu",
 						Flavors: []kueue.Flavor{
-							{Name: "on-demand"},
-							{Name: "spot"},
+							{ResourceFlavor: "on-demand"},
+							{ResourceFlavor: "spot"},
 						},
 					},
 				},
@@ -350,12 +350,12 @@ func TestCacheWorkloadOperations(t *testing.T) {
 		{
 			ObjectMeta: metav1.ObjectMeta{Name: "two"},
 			Spec: kueue.ClusterQueueSpec{
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: "cpu",
 						Flavors: []kueue.Flavor{
-							{Name: "on-demand"},
-							{Name: "spot"},
+							{ResourceFlavor: "on-demand"},
+							{ResourceFlavor: "spot"},
 						},
 					},
 				},
@@ -796,12 +796,12 @@ func TestClusterQueueUsage(t *testing.T) {
 	cq := kueue.ClusterQueue{
 		ObjectMeta: metav1.ObjectMeta{Name: "foo"},
 		Spec: kueue.ClusterQueueSpec{
-			Resources: []kueue.Resource{
+			RequestableResources: []kueue.Resource{
 				{
 					Name: corev1.ResourceCPU,
 					Flavors: []kueue.Flavor{
 						{
-							Name: "default",
+							ResourceFlavor: "default",
 							Quota: kueue.Quota{
 								Min: resource.MustParse("10"),
 								Max: pointer.Quantity(resource.MustParse("20")),
@@ -813,14 +813,14 @@ func TestClusterQueueUsage(t *testing.T) {
 					Name: "example.com/gpu",
 					Flavors: []kueue.Flavor{
 						{
-							Name: "model_a",
+							ResourceFlavor: "model_a",
 							Quota: kueue.Quota{
 								Min: resource.MustParse("5"),
 								Max: pointer.Quantity(resource.MustParse("10")),
 							},
 						},
 						{
-							Name: "model_b",
+							ResourceFlavor: "model_b",
 							Quota: kueue.Quota{
 								Min: resource.MustParse("5"),
 								// No max.
diff --git a/pkg/cache/snapshot_test.go b/pkg/cache/snapshot_test.go
index e06503c96..7de795e2c 100644
--- a/pkg/cache/snapshot_test.go
+++ b/pkg/cache/snapshot_test.go
@@ -30,7 +30,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/sets"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
@@ -48,18 +48,18 @@ func TestSnapshot(t *testing.T) {
 			},
 			Spec: kueue.ClusterQueueSpec{
 				Cohort: "foo",
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: corev1.ResourceCPU,
 						Flavors: []kueue.Flavor{
 							{
-								Name: "demand",
+								ResourceFlavor: "demand",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("100"),
 								},
 							},
 							{
-								Name: "spot",
+								ResourceFlavor: "spot",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("200"),
 								},
@@ -75,12 +75,12 @@ func TestSnapshot(t *testing.T) {
 			},
 			Spec: kueue.ClusterQueueSpec{
 				Cohort: "foo",
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: corev1.ResourceCPU,
 						Flavors: []kueue.Flavor{
 							{
-								Name: "spot",
+								ResourceFlavor: "spot",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("100"),
 								},
@@ -91,7 +91,7 @@ func TestSnapshot(t *testing.T) {
 						Name: "example.com/gpu",
 						Flavors: []kueue.Flavor{
 							{
-								Name: "default",
+								ResourceFlavor: "default",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("50"),
 								},
@@ -106,12 +106,12 @@ func TestSnapshot(t *testing.T) {
 				Name: "bar",
 			},
 			Spec: kueue.ClusterQueueSpec{
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: corev1.ResourceCPU,
 						Flavors: []kueue.Flavor{
 							{
-								Name: "default",
+								ResourceFlavor: "default",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("100"),
 								},
diff --git a/pkg/queue/cluster_queue_best_effort_fifo_test.go b/pkg/queue/cluster_queue_best_effort_fifo_test.go
index 6941810a5..7a7805d23 100644
--- a/pkg/queue/cluster_queue_best_effort_fifo_test.go
+++ b/pkg/queue/cluster_queue_best_effort_fifo_test.go
@@ -22,7 +22,7 @@ import (
 	"github.com/google/go-cmp/cmp"
 	"k8s.io/apimachinery/pkg/util/sets"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
@@ -100,7 +100,7 @@ func TestClusterQueueBestEffortFIFO(t *testing.T) {
 			}
 
 			for _, w := range test.inadmissibleWorkloadsToAdd {
-				cq.AddInadmissibleIfNotPresent(w)
+				cq.RequeueIfNotPresent(w, false)
 			}
 
 			for _, w := range test.workloadsToUpdate {
diff --git a/pkg/queue/cluster_queue_strict_fifo_test.go b/pkg/queue/cluster_queue_strict_fifo_test.go
index 96c7ed2e6..c1f1ac8cc 100644
--- a/pkg/queue/cluster_queue_strict_fifo_test.go
+++ b/pkg/queue/cluster_queue_strict_fifo_test.go
@@ -23,7 +23,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/utils/pointer"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 )
 
 const (
diff --git a/pkg/queue/manager_test.go b/pkg/queue/manager_test.go
index bc678ac40..6008ba3c5 100644
--- a/pkg/queue/manager_test.go
+++ b/pkg/queue/manager_test.go
@@ -28,7 +28,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/sets"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/workload"
 )
@@ -326,7 +326,7 @@ func TestStatus(t *testing.T) {
 	}
 }
 
-func TestRequeueWorkload(t *testing.T) {
+func TestRequeueWorkloadStrictFIFO(t *testing.T) {
 	scheme := runtime.NewScheme()
 	if err := kueue.AddToScheme(scheme); err != nil {
 		t.Fatalf("Failed adding kueue scheme: %s", err)
@@ -414,7 +414,7 @@ func TestRequeueWorkload(t *testing.T) {
 				_ = manager.AddOrUpdateWorkload(tc.workload)
 			}
 			info := workload.NewInfo(tc.workload)
-			if requeued := manager.RequeueWorkload(ctx, info); requeued != tc.wantRequeued {
+			if requeued := manager.RequeueWorkload(ctx, info, true); requeued != tc.wantRequeued {
 				t.Errorf("RequeueWorkload returned %t, want %t", requeued, tc.wantRequeued)
 			}
 		})
@@ -798,7 +798,7 @@ func TestHeadsAsync(t *testing.T) {
 				// Remove the initial workload from the manager.
 				mgr.Heads(ctx)
 				go func() {
-					mgr.RequeueWorkload(ctx, workload.NewInfo(&wl))
+					mgr.RequeueWorkload(ctx, workload.NewInfo(&wl), true)
 				}()
 			},
 		},
diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go
index 0442bdcf1..2de349ccf 100644
--- a/pkg/scheduler/scheduler_test.go
+++ b/pkg/scheduler/scheduler_test.go
@@ -25,6 +25,7 @@ import (
 
 	logrtesting "github.com/go-logr/logr/testing"
 	"github.com/google/go-cmp/cmp"
+	"github.com/google/go-cmp/cmp/cmpopts"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -32,10 +33,11 @@ import (
 	"k8s.io/apimachinery/pkg/util/sets"
 	"k8s.io/client-go/tools/record"
 	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 	"sigs.k8s.io/kueue/pkg/util/pointer"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/cache"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/queue"
@@ -70,12 +72,12 @@ func TestSchedule(t *testing.T) {
 					},
 				},
 				QueueingStrategy: kueue.StrictFIFO,
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: corev1.ResourceCPU,
 						Flavors: []kueue.Flavor{
 							{
-								Name: "default",
+								ResourceFlavor: "default",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("50"),
 									Max: pointer.Quantity(resource.MustParse("50")),
@@ -100,19 +102,19 @@ func TestSchedule(t *testing.T) {
 					},
 				},
 				QueueingStrategy: kueue.StrictFIFO,
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: corev1.ResourceCPU,
 						Flavors: []kueue.Flavor{
 							{
-								Name: "on-demand",
+								ResourceFlavor: "on-demand",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("50"),
 									Max: pointer.Quantity(resource.MustParse("100")),
 								},
 							},
 							{
-								Name: "spot",
+								ResourceFlavor: "spot",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("100"),
 									Max: pointer.Quantity(resource.MustParse("100")),
@@ -137,19 +139,19 @@ func TestSchedule(t *testing.T) {
 					},
 				},
 				QueueingStrategy: kueue.StrictFIFO,
-				Resources: []kueue.Resource{
+				RequestableResources: []kueue.Resource{
 					{
 						Name: corev1.ResourceCPU,
 						Flavors: []kueue.Flavor{
 							{
-								Name: "on-demand",
+								ResourceFlavor: "on-demand",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("50"),
 									Max: pointer.Quantity(resource.MustParse("60")),
 								},
 							},
 							{
-								Name: "spot",
+								ResourceFlavor: "spot",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("0"),
 									Max: pointer.Quantity(resource.MustParse("100")),
@@ -161,7 +163,7 @@ func TestSchedule(t *testing.T) {
 						Name: "example.com/gpu",
 						Flavors: []kueue.Flavor{
 							{
-								Name: "model-a",
+								ResourceFlavor: "model-a",
 								Quota: kueue.Quota{
 									Min: resource.MustParse("20"),
 									Max: pointer.Quantity(resource.MustParse("20")),
@@ -1475,3 +1477,116 @@ func TestEntryOrdering(t *testing.T) {
 		t.Errorf("Unexpected order (-want,+got):\n%s", diff)
 	}
 }
+
+var ignoreConditionTimestamps = cmpopts.IgnoreFields(kueue.WorkloadCondition{}, "LastProbeTime", "LastTransitionTime")
+
+func TestRequeueAndUpdate(t *testing.T) {
+	cq := utiltesting.MakeClusterQueue("cq").QueueingStrategy(kueue.BestEffortFIFO).Obj()
+	q1 := utiltesting.MakeQueue("q1", "ns1").ClusterQueue("cq").Obj()
+	w1 := utiltesting.MakeWorkload("w1", "ns1").Queue("q1").Obj()
+
+	cases := []struct {
+		name          string
+		e             entry
+		wantWorkloads map[string]sets.String
+		wantStatus    kueue.WorkloadStatus
+	}{
+		{
+			name: "workload didn't fit",
+			e: entry{
+				status:             "",
+				inadmissibleReason: "didn't fit",
+			},
+			wantStatus: kueue.WorkloadStatus{
+				Conditions: []kueue.WorkloadCondition{
+					{
+						Type:    kueue.WorkloadAdmitted,
+						Status:  corev1.ConditionFalse,
+						Reason:  "Pending",
+						Message: "didn't fit",
+					},
+				},
+			},
+		},
+		{
+			name: "assumed",
+			e: entry{
+				status:             assumed,
+				inadmissibleReason: "",
+			},
+			wantWorkloads: map[string]sets.String{
+				"cq": sets.NewString(w1.Name),
+			},
+		},
+		{
+			name: "nominated",
+			e: entry{
+				status:             nominated,
+				inadmissibleReason: "failed to admit workload",
+			},
+			wantWorkloads: map[string]sets.String{
+				"cq": sets.NewString(w1.Name),
+			},
+		},
+		{
+			name: "skipped",
+			e: entry{
+				status:             skipped,
+				inadmissibleReason: "cohort used in this cycle",
+			},
+			wantWorkloads: map[string]sets.String{
+				"cq": sets.NewString(w1.Name),
+			},
+		},
+	}
+
+	for _, tc := range cases {
+		t.Run(tc.name, func(t *testing.T) {
+			log := logrtesting.NewTestLoggerWithOptions(t, logrtesting.Options{
+				Verbosity: 2,
+			})
+			ctx := ctrl.LoggerInto(context.Background(), log)
+			scheme := runtime.NewScheme()
+			if err := kueue.AddToScheme(scheme); err != nil {
+				t.Fatalf("Failed adding kueue scheme: %v", err)
+			}
+			if err := corev1.AddToScheme(scheme); err != nil {
+				t.Fatalf("Failed adding kueue scheme: %v", err)
+			}
+
+			clientBuilder := fake.NewClientBuilder().WithScheme(scheme).WithObjects(w1, q1, &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "ns1"}})
+			cl := clientBuilder.Build()
+			broadcaster := record.NewBroadcaster()
+			recorder := broadcaster.NewRecorder(scheme, corev1.EventSource{Component: constants.ManagerName})
+			qManager := queue.NewManager(cl)
+			cqCache := cache.New(cl)
+			scheduler := New(qManager, cqCache, cl, recorder)
+			if err := qManager.AddQueue(ctx, q1); err != nil {
+				t.Fatalf("Inserting queue %s/%s in manager: %v", q1.Namespace, q1.Name, err)
+			}
+			if err := qManager.AddClusterQueue(ctx, cq); err != nil {
+				t.Fatalf("Inserting clusterQueue %s in manager: %v", cq.Name, err)
+			}
+
+			wInfos := qManager.Heads(ctx)
+			if len(wInfos) != 1 {
+				t.Fatalf("Failed getting heads in cluster queue")
+			}
+			tc.e.Info = wInfos[0]
+			scheduler.requeueAndUpdate(log, ctx, tc.e)
+
+			qDump := qManager.Dump()
+			if diff := cmp.Diff(tc.wantWorkloads, qDump); diff != "" {
+				t.Errorf("Unexpected elements in the cluster queue (-want,+got):\n%s", diff)
+			}
+
+			var updatedWl kueue.Workload
+			if err := cl.Get(ctx, client.ObjectKeyFromObject(w1), &updatedWl); err != nil {
+				t.Fatalf("Failed obtaining updated object: %v", err)
+			}
+			if diff := cmp.Diff(tc.wantStatus, updatedWl.Status, ignoreConditionTimestamps); diff != "" {
+				t.Errorf("Unexpected status after updating (-want,+got):\n%s", diff)
+			}
+		})
+	}
+}
diff --git a/pkg/util/testing/wrappers.go b/pkg/util/testing/wrappers.go
index c39289734..39b567e4c 100644
--- a/pkg/util/testing/wrappers.go
+++ b/pkg/util/testing/wrappers.go
@@ -25,7 +25,7 @@ import (
 	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/constants"
 	"sigs.k8s.io/kueue/pkg/util/pointer"
 )
@@ -269,7 +269,7 @@ func (c *ClusterQueueWrapper) Cohort(cohort string) *ClusterQueueWrapper {
 
 // Resource adds a resource with flavors.
 func (c *ClusterQueueWrapper) Resource(r *kueue.Resource) *ClusterQueueWrapper {
-	c.Spec.Resources = append(c.Spec.Resources, *r)
+	c.Spec.RequestableResources = append(c.Spec.RequestableResources, *r)
 	return c
 }
 
@@ -285,10 +285,10 @@ func (c *ClusterQueueWrapper) NamespaceSelector(s *metav1.LabelSelector) *Cluste
 	return c
 }
 
-// ResourceWrapper wraps a resource.
+// ResourceWrapper wraps a requestable resource.
 type ResourceWrapper struct{ kueue.Resource }
 
-// MakeResource creates a wrapper for a resource.
+// MakeResource creates a wrapper for a requestable resource.
 func MakeResource(name corev1.ResourceName) *ResourceWrapper {
 	return &ResourceWrapper{kueue.Resource{
 		Name: name,
@@ -312,7 +312,7 @@ type FlavorWrapper struct{ kueue.Flavor }
 // MakeFlavor creates a wrapper for a resource flavor.
 func MakeFlavor(rf, min string) *FlavorWrapper {
 	return &FlavorWrapper{kueue.Flavor{
-		Name: kueue.ResourceFlavorReference(rf),
+		ResourceFlavor: kueue.ResourceFlavorReference(rf),
 		Quota: kueue.Quota{
 			Min: resource.MustParse(min),
 		},
diff --git a/pkg/workload/workload_test.go b/pkg/workload/workload_test.go
index 61d11c21f..9b853263e 100644
--- a/pkg/workload/workload_test.go
+++ b/pkg/workload/workload_test.go
@@ -29,7 +29,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 )
 
 func TestPodRequests(t *testing.T) {
diff --git a/test/integration/controller/core/clusterqueue_controller_test.go b/test/integration/controller/core/clusterqueue_controller_test.go
index 0db22ecee..18f76ec55 100644
--- a/test/integration/controller/core/clusterqueue_controller_test.go
+++ b/test/integration/controller/core/clusterqueue_controller_test.go
@@ -24,7 +24,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/util/pointer"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/test/integration/framework"
diff --git a/test/integration/controller/core/queue_controller_test.go b/test/integration/controller/core/queue_controller_test.go
index 09ceae6c6..5b21a228d 100644
--- a/test/integration/controller/core/queue_controller_test.go
+++ b/test/integration/controller/core/queue_controller_test.go
@@ -23,7 +23,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/test/integration/framework"
 )
diff --git a/test/integration/controller/core/suite_test.go b/test/integration/controller/core/suite_test.go
index 37da99586..e0251fe46 100644
--- a/test/integration/controller/core/suite_test.go
+++ b/test/integration/controller/core/suite_test.go
@@ -25,6 +25,7 @@ import (
 	"github.com/onsi/gomega"
 	"k8s.io/client-go/rest"
 	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/envtest"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	"sigs.k8s.io/kueue/pkg/cache"
@@ -37,8 +38,9 @@ import (
 var (
 	cfg       *rest.Config
 	k8sClient client.Client
+	testEnv   *envtest.Environment
 	ctx       context.Context
-	fwk       *framework.Framework
+	cancel    context.CancelFunc
 )
 
 func TestAPIs(t *testing.T) {
@@ -50,15 +52,14 @@ func TestAPIs(t *testing.T) {
 }
 
 var _ = ginkgo.BeforeSuite(func() {
-	fwk = &framework.Framework{
-		ManagerSetup: managerSetup,
-		CRDPath:      filepath.Join("..", "..", "..", "..", "config", "crd", "bases"),
-	}
-	ctx, cfg, k8sClient = fwk.Setup()
+	ctx, cancel = context.WithCancel(context.Background())
+	crdPath := filepath.Join("..", "..", "..", "..", "config", "crd", "bases")
+	cfg, k8sClient, testEnv = framework.BeforeSuite(ctx, crdPath, managerSetup)
 })
 
 var _ = ginkgo.AfterSuite(func() {
-	fwk.Teardown()
+	cancel()
+	framework.AfterSuite(testEnv)
 })
 
 func managerSetup(mgr manager.Manager) {
diff --git a/test/integration/controller/core/workload_controller_test.go b/test/integration/controller/core/workload_controller_test.go
index 369de6190..9b0460172 100644
--- a/test/integration/controller/core/workload_controller_test.go
+++ b/test/integration/controller/core/workload_controller_test.go
@@ -25,7 +25,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/test/integration/framework"
 )
diff --git a/test/integration/controller/job/job_controller_test.go b/test/integration/controller/job/job_controller_test.go
index ca16e586d..5fc7db083 100644
--- a/test/integration/controller/job/job_controller_test.go
+++ b/test/integration/controller/job/job_controller_test.go
@@ -17,9 +17,7 @@ limitations under the License.
 package job
 
 import (
-	"context"
 	"fmt"
-	"path/filepath"
 
 	"github.com/onsi/ginkgo/v2"
 	"github.com/onsi/gomega"
@@ -29,12 +27,9 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/kubernetes/scheme"
-	"k8s.io/client-go/rest"
-	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/constants"
-	"sigs.k8s.io/kueue/pkg/controller/workload/job"
 	workloadjob "sigs.k8s.io/kueue/pkg/controller/workload/job"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/pkg/workload"
@@ -51,28 +46,10 @@ const (
 	priorityValue     = 10
 )
 
-var (
-	cfg       *rest.Config
-	k8sClient client.Client
-	ctx       context.Context
-	fwk       *framework.Framework
-	crdPath   = filepath.Join("..", "..", "..", "..", "config", "crd", "bases")
-)
-
 // +kubebuilder:docs-gen:collapse=Imports
 
 var _ = ginkgo.Describe("Job controller", func() {
-	ginkgo.BeforeEach(func() {
-		fwk = &framework.Framework{
-			ManagerSetup: managerSetup(job.WithManageJobsWithoutQueueName(true)),
-			CRDPath:      crdPath,
-		}
-		ctx, cfg, k8sClient = fwk.Setup()
-	})
-	ginkgo.AfterEach(func() {
-		fwk.Teardown()
-	})
-	ginkgo.It("Should reconcile workload and job for all jobs", func() {
+	ginkgo.It("Should reconcile workload and job", func() {
 		ginkgo.By("checking the job gets suspended when created unsuspended")
 		priorityClass := testing.MakePriorityClass(priorityClassName).
 			PriorityValue(int32(priorityValue)).Obj()
@@ -244,37 +221,3 @@ var _ = ginkgo.Describe("Job controller", func() {
 		}, framework.Timeout, framework.Interval).Should(gomega.BeTrue())
 	})
 })
-
-var _ = ginkgo.Describe("Job controller for workloads with no queue set", func() {
-	ginkgo.BeforeEach(func() {
-		fwk = &framework.Framework{
-			ManagerSetup: managerSetup(),
-			CRDPath:      crdPath,
-		}
-		ctx, cfg, k8sClient = fwk.Setup()
-	})
-	ginkgo.AfterEach(func() {
-		fwk.Teardown()
-	})
-	ginkgo.It("Should reconcile jobs only when queue is set", func() {
-		ginkgo.By("checking the workload is not created when queue name is not set")
-		job := testing.MakeJob(jobName, jobNamespace).Obj()
-		gomega.Expect(k8sClient.Create(ctx, job)).Should(gomega.Succeed())
-		lookupKey := types.NamespacedName{Name: jobName, Namespace: jobNamespace}
-		createdJob := &batchv1.Job{}
-		gomega.Expect(k8sClient.Get(ctx, lookupKey, createdJob)).Should(gomega.Succeed())
-
-		createdWorkload := &kueue.Workload{}
-		gomega.Consistently(func() bool {
-			return apierrors.IsNotFound(k8sClient.Get(ctx, lookupKey, createdWorkload))
-		}, framework.ConsistentDuration, framework.Interval).Should(gomega.BeTrue())
-
-		ginkgo.By("checking the workload is created when queue name is set")
-		jobQueueName := "test-queue"
-		createdJob.Annotations = map[string]string{constants.QueueAnnotation: jobQueueName}
-		gomega.Expect(k8sClient.Update(ctx, createdJob)).Should(gomega.Succeed())
-		gomega.Eventually(func() error {
-			return k8sClient.Get(ctx, lookupKey, createdWorkload)
-		}, framework.Timeout, framework.Interval).Should(gomega.Succeed())
-	})
-})
diff --git a/test/integration/controller/job/suite_test.go b/test/integration/controller/job/suite_test.go
index 1a234ee59..83092a3af 100644
--- a/test/integration/controller/job/suite_test.go
+++ b/test/integration/controller/job/suite_test.go
@@ -17,10 +17,15 @@ limitations under the License.
 package job
 
 import (
+	"context"
+	"path/filepath"
 	"testing"
 
 	"github.com/onsi/ginkgo/v2"
 	"github.com/onsi/gomega"
+	"k8s.io/client-go/rest"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/envtest"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 
 	"sigs.k8s.io/kueue/pkg/constants"
@@ -29,6 +34,14 @@ import (
 	//+kubebuilder:scaffold:imports
 )
 
+var (
+	cfg       *rest.Config
+	k8sClient client.Client
+	testEnv   *envtest.Environment
+	ctx       context.Context
+	cancel    context.CancelFunc
+)
+
 func TestAPIs(t *testing.T) {
 	gomega.RegisterFailHandler(ginkgo.Fail)
 
@@ -37,14 +50,18 @@ func TestAPIs(t *testing.T) {
 	)
 }
 
-func managerSetup(opts ...job.Option) framework.ManagerSetup {
-	return func(mgr manager.Manager) {
-		reconciler := job.NewReconciler(
-			mgr.GetScheme(),
-			mgr.GetClient(),
-			mgr.GetEventRecorderFor(constants.JobControllerName),
-			opts...)
-		err := reconciler.SetupWithManager(mgr)
-		gomega.Expect(err).NotTo(gomega.HaveOccurred())
-	}
+var _ = ginkgo.BeforeSuite(func() {
+	ctx, cancel = context.WithCancel(context.Background())
+	crdPath := filepath.Join("..", "..", "..", "..", "config", "crd", "bases")
+	cfg, k8sClient, testEnv = framework.BeforeSuite(ctx, crdPath, managerSetup)
+})
+
+var _ = ginkgo.AfterSuite(func() {
+	cancel()
+	framework.AfterSuite(testEnv)
+})
+
+func managerSetup(mgr manager.Manager) {
+	err := job.NewReconciler(mgr.GetScheme(), mgr.GetClient(), mgr.GetEventRecorderFor(constants.JobControllerName)).SetupWithManager(mgr)
+	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 }
diff --git a/test/integration/framework/framework.go b/test/integration/framework/framework.go
index bc8ccbdcc..8372caab2 100644
--- a/test/integration/framework/framework.go
+++ b/test/integration/framework/framework.go
@@ -35,29 +35,22 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 	"sigs.k8s.io/kueue/pkg/workload"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	//+kubebuilder:scaffold:imports
 )
 
 type ManagerSetup func(manager.Manager)
 
-type Framework struct {
-	CRDPath      string
-	ManagerSetup ManagerSetup
-	testEnv      *envtest.Environment
-	cancel       context.CancelFunc
-}
-
-func (f *Framework) Setup() (context.Context, *rest.Config, client.Client) {
+func BeforeSuite(ctx context.Context, crdPath string, mgrSetup ManagerSetup) (*rest.Config, client.Client, *envtest.Environment) {
 	ctrl.SetLogger(zap.New(zap.WriteTo(ginkgo.GinkgoWriter), zap.UseDevMode(true), zap.Level(zapcore.Level(-3))))
 
 	ginkgo.By("bootstrapping test environment")
-	f.testEnv = &envtest.Environment{
-		CRDDirectoryPaths:     []string{f.CRDPath},
+	testEnv := &envtest.Environment{
+		CRDDirectoryPaths:     []string{crdPath},
 		ErrorIfCRDPathMissing: true,
 	}
 
-	cfg, err := f.testEnv.Start()
+	cfg, err := testEnv.Start()
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 	gomega.ExpectWithOffset(1, cfg).NotTo(gomega.BeNil())
 
@@ -76,9 +69,7 @@ func (f *Framework) Setup() (context.Context, *rest.Config, client.Client) {
 	})
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred(), "failed to create manager")
 
-	f.ManagerSetup(mgr)
-	ctx, cancel := context.WithCancel(context.Background())
-	f.cancel = cancel
+	mgrSetup(mgr)
 
 	go func() {
 		defer ginkgo.GinkgoRecover()
@@ -86,13 +77,12 @@ func (f *Framework) Setup() (context.Context, *rest.Config, client.Client) {
 		gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred(), "failed to run manager")
 	}()
 
-	return ctx, cfg, k8sClient
+	return cfg, k8sClient, testEnv
 }
 
-func (f *Framework) Teardown() {
+func AfterSuite(testEnv *envtest.Environment) {
 	ginkgo.By("tearing down the test environment")
-	f.cancel()
-	err := f.testEnv.Stop()
+	err := testEnv.Stop()
 	gomega.ExpectWithOffset(1, err).NotTo(gomega.HaveOccurred())
 }
 
diff --git a/test/integration/scheduler/scheduler_test.go b/test/integration/scheduler/scheduler_test.go
index 5f1029095..d533bb4bc 100644
--- a/test/integration/scheduler/scheduler_test.go
+++ b/test/integration/scheduler/scheduler_test.go
@@ -26,7 +26,7 @@ import (
 	"k8s.io/utils/pointer"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	kueue "sigs.k8s.io/kueue/apis/core/v1alpha1"
+	kueue "sigs.k8s.io/kueue/api/v1alpha1"
 	"sigs.k8s.io/kueue/pkg/util/testing"
 	"sigs.k8s.io/kueue/test/integration/framework"
 )
@@ -103,7 +103,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 		prodBEClusterQ = testing.MakeClusterQueue("prod-be-cq").
 			Cohort("be").QueueingStrategy(kueue.BestEffortFIFO).
 			Resource(testing.MakeResource(corev1.ResourceCPU).
-				Flavor(testing.MakeFlavor(onDemandFlavor.Name, "5").Max("10").Obj()).
+				Flavor(testing.MakeFlavor(onDemandFlavor.Name, "5").Max("15").Obj()).
 				Obj()).
 			Obj()
 		gomega.Expect(k8sClient.Create(ctx, prodBEClusterQ)).Should(gomega.Succeed())
@@ -111,7 +111,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 		devBEClusterQ = testing.MakeClusterQueue("dev-be-cq").
 			Cohort("be").QueueingStrategy(kueue.BestEffortFIFO).
 			Resource(testing.MakeResource(corev1.ResourceCPU).
-				Flavor(testing.MakeFlavor(onDemandFlavor.Name, "5").Max("10").Obj()).
+				Flavor(testing.MakeFlavor(onDemandFlavor.Name, "5").Max("15").Obj()).
 				Obj()).
 			Obj()
 		gomega.Expect(k8sClient.Create(ctx, devBEClusterQ)).Should(gomega.Succeed())
@@ -502,7 +502,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 		gomega.Expect(k8sClient.Get(ctx, types.NamespacedName{Name: devBEClusterQ.Name}, devCq)).Should(gomega.Succeed())
 
 		updatedResource := testing.MakeResource(corev1.ResourceCPU).Flavor(testing.MakeFlavor(onDemandFlavor.Name, "13").Max("13").Obj()).Obj()
-		devCq.Spec.Resources = []kueue.Resource{*updatedResource}
+		devCq.Spec.RequestableResources = []kueue.Resource{*updatedResource}
 		gomega.Expect(k8sClient.Update(ctx, devCq)).Should(gomega.Succeed())
 
 		gomega.Eventually(func() *bool {
@@ -538,4 +538,30 @@ var _ = ginkgo.Describe("Scheduler", func() {
 
 		framework.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, prodClusterQ.Name, smallWl1, smallWl2)
 	})
+
+	ginkgo.It("Should schedule workloads borrowing quota from ClusterQueues in the same Cohort", func() {
+		wl1 := testing.MakeWorkload("wl-1", ns.Name).Queue(prodBEQueue.Name).Request(corev1.ResourceCPU, "11").Obj()
+		wl2 := testing.MakeWorkload("wl-2", ns.Name).Queue(devBEQueue.Name).Request(corev1.ResourceCPU, "11").Obj()
+
+		ginkgo.By("Creating two workloads")
+		gomega.Expect(k8sClient.Create(ctx, wl1)).Should(gomega.Succeed())
+		gomega.Expect(k8sClient.Create(ctx, wl2)).Should(gomega.Succeed())
+		framework.ExpectWorkloadsToBePending(ctx, k8sClient, wl1, wl2)
+
+		// Make sure workloads are in the same scheduling cycle.
+		testBEClusterQ := testing.MakeClusterQueue("test-be-cq").
+			Cohort("be").QueueingStrategy(kueue.BestEffortFIFO).
+			Resource(testing.MakeResource(corev1.ResourceCPU).
+				Flavor(testing.MakeFlavor(onDemandFlavor.Name,
+					"15").Max("15").Obj()).
+				Obj()).
+			Obj()
+		gomega.Expect(k8sClient.Create(ctx, testBEClusterQ)).Should(gomega.Succeed())
+		defer func() {
+			gomega.Expect(framework.DeleteClusterQueue(ctx, k8sClient, testBEClusterQ)).Should(gomega.Succeed())
+		}()
+
+		framework.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, prodBEClusterQ.Name, wl1)
+		framework.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, devBEClusterQ.Name, wl2)
+	})
 })
diff --git a/test/integration/scheduler/suite_test.go b/test/integration/scheduler/suite_test.go
index a0db2b86f..c364bfba1 100644
--- a/test/integration/scheduler/suite_test.go
+++ b/test/integration/scheduler/suite_test.go
@@ -25,6 +25,7 @@ import (
 	"github.com/onsi/gomega"
 	"k8s.io/client-go/rest"
 	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/envtest"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 	"sigs.k8s.io/kueue/pkg/scheduler"
 
@@ -40,8 +41,9 @@ import (
 var (
 	cfg       *rest.Config
 	k8sClient client.Client
+	testEnv   *envtest.Environment
 	ctx       context.Context
-	fwk       *framework.Framework
+	cancel    context.CancelFunc
 )
 
 func TestScheduler(t *testing.T) {
@@ -53,15 +55,14 @@ func TestScheduler(t *testing.T) {
 }
 
 var _ = ginkgo.BeforeSuite(func() {
-	fwk = &framework.Framework{
-		ManagerSetup: managerAndSchedulerSetup,
-		CRDPath:      filepath.Join("..", "..", "..", "config", "crd", "bases"),
-	}
-	ctx, cfg, k8sClient = fwk.Setup()
+	ctx, cancel = context.WithCancel(context.Background())
+	crdPath := filepath.Join("..", "..", "..", "config", "crd", "bases")
+	cfg, k8sClient, testEnv = framework.BeforeSuite(ctx, crdPath, managerAndSchedulerSetup)
 })
 
 var _ = ginkgo.AfterSuite(func() {
-	fwk.Teardown()
+	cancel()
+	framework.AfterSuite(testEnv)
 })
 
 func managerAndSchedulerSetup(mgr manager.Manager) {