Repository: redhat-developer/service-binding-operator
Pull request #1176 (2022-06-21 19:52:23)

Support spec v1beta1 resources
Implements support for spec/v1beta1 resources.

# Changes

/kind enhancement

# Submitter Checklist

As the author of this PR, please check off the items in this checklist:

- [ ] [Docs](https://github.com/redhat-developer/service-binding-operator/blob/master/CONTRIBUTING.md#docs) 
  included if any changes are user facing
- [ ] [Tests](https://github.com/redhat-developer/service-binding-operator/blob/master/CONTRIBUTING.md#tests)
  included if any functionality added or changed. For bugfixes please include tests that can catch regressions
- [ ] All acceptance test scenarios included in the PR which verifies a bugfix or a requested feature reported by a non-member are tagged with `@external-feedback` tag.
- [ ] Follows the [commit message standard](https://github.com/redhat-developer/service-binding-operator/blob/master/CONTRIBUTING.md#commits)



openshift-ci[bot]: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please ask for approval from **sadlerap** 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=redhat-developer%2Fservice-binding-operator).

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

- **[OWNERS](https://github.com/redhat-developer/service-binding-operator/blob/master/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":["sadlerap"]} -->
codecov[bot]: # [Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer) Report
> Merging [#1176](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer) (c652c9c) into [master](https://codecov.io/gh/redhat-developer/service-binding-operator/commit/1e4c572166e7bb26b968cdaa7b939aa9b2056223?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer) (1e4c572) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176/graphs/tree.svg?width=650&height=150&src=pr&token=CICBeVWlrC&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer)](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer)

```diff
@@           Coverage Diff           @@
##           master    #1176   +/-   ##
=======================================
  Coverage   58.69%   58.69%           
=======================================
  Files          33       33           
  Lines        2782     2782           
=======================================
  Hits         1633     1633           
  Misses        988      988           
  Partials      161      161           
```


| [Impacted Files](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer) | Coverage Δ | |
|---|---|---|
| [...c/v1alpha3/clusterworkloadresourcemapping\_types.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer#diff-YXBpcy9zcGVjL3YxYWxwaGEzL2NsdXN0ZXJ3b3JrbG9hZHJlc291cmNlbWFwcGluZ190eXBlcy5nbw==) | `100.00% <ø> (ø)` | |
| [apis/spec/v1alpha3/servicebinding\_types.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer#diff-YXBpcy9zcGVjL3YxYWxwaGEzL3NlcnZpY2ViaW5kaW5nX3R5cGVzLmdv) | `20.68% <ø> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer). Last update [1e4c572...c652c9c](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/1176?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=redhat-developer).

sadlerap: /retest
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.11-acceptance | c652c9ca0e4ed25184eb1c03dd97dcb93efcd5f9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1540055466581692416) | true | `/test 4.11-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
sadlerap: /retest
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.11-acceptance | c652c9ca0e4ed25184eb1c03dd97dcb93efcd5f9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1540425228885168128) | true | `/test 4.11-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.10-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1541529759731683328) | true | `/test 4.10-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.10-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1541529759731683328) | true | `/test 4.10-acceptance`
ci/prow/4.9-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541529762101465088) | true | `/test 4.9-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.10-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1541529759731683328) | true | `/test 4.10-acceptance`
ci/prow/4.9-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541529762101465088) | true | `/test 4.9-acceptance`
ci/prow/4.11-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1541529760398577664) | true | `/test 4.11-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
sadlerap: /retest
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.10-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1541529759731683328) | true | `/test 4.10-acceptance`
ci/prow/4.9-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541529762101465088) | true | `/test 4.9-acceptance`
ci/prow/4.11-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1541529760398577664) | true | `/test 4.11-acceptance`
ci/prow/4.8-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.8-acceptance/1541883529095286784) | true | `/test 4.8-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.10-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1541529759731683328) | true | `/test 4.10-acceptance`
ci/prow/4.9-acceptance | e6b2b74acbb38513e0b262e2f9c96141aafcf770 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541529762101465088) | true | `/test 4.9-acceptance`
ci/prow/4.8-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.8-acceptance/1541883529095286784) | true | `/test 4.8-acceptance`
ci/prow/4.11-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1541883529057538048) | true | `/test 4.11-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.8-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.8-acceptance/1541883529095286784) | true | `/test 4.8-acceptance`
ci/prow/4.11-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1541883529057538048) | true | `/test 4.11-acceptance`
ci/prow/4.9-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541883529137229824) | true | `/test 4.9-acceptance`
ci/prow/4.10-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1541883529032372224) | true | `/test 4.10-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please ask for approval from sadlerap by writing `/assign @sadlerap` in a comment. For more information see:[The Kubernetes Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=redhat-developer%2Fservice-binding-operator).

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

- **[OWNERS](https://github.com/redhat-developer/service-binding-operator/blob/master/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":["sadlerap"]} -->
sadlerap: /retest
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.11-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1541883529057538048) | true | `/test 4.11-acceptance`
ci/prow/4.9-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541883529137229824) | true | `/test 4.9-acceptance`
ci/prow/4.10-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1541883529032372224) | true | `/test 4.10-acceptance`
ci/prow/4.8-acceptance | 1668a516c263e39a810eadc690ebb5d87e4f6c10 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.8-acceptance/1549828262123802624) | true | `/test 4.8-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.11-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1541883529057538048) | true | `/test 4.11-acceptance`
ci/prow/4.9-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541883529137229824) | true | `/test 4.9-acceptance`
ci/prow/4.8-acceptance | 1668a516c263e39a810eadc690ebb5d87e4f6c10 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.8-acceptance/1549828262123802624) | true | `/test 4.8-acceptance`
ci/prow/4.10-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1552264579520663552) | true | `/test 4.10-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.9-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541883529137229824) | true | `/test 4.9-acceptance`
ci/prow/4.8-acceptance | 1668a516c263e39a810eadc690ebb5d87e4f6c10 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.8-acceptance/1549828262123802624) | true | `/test 4.8-acceptance`
ci/prow/4.10-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1552264579520663552) | true | `/test 4.10-acceptance`
ci/prow/4.11-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1552264579642298368) | true | `/test 4.11-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.9-acceptance | 84f6f4ff4f3126c908ff94b663d9c4ba6cef2b8c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1541883529137229824) | true | `/test 4.9-acceptance`
ci/prow/4.10-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1552264579520663552) | true | `/test 4.10-acceptance`
ci/prow/4.11-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1552264579642298368) | true | `/test 4.11-acceptance`
ci/prow/4.8-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.8-acceptance/1552264579789099008) | true | `/test 4.8-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.10-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.10-acceptance/1552264579520663552) | true | `/test 4.10-acceptance`
ci/prow/4.11-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.11-acceptance/1552264579642298368) | true | `/test 4.11-acceptance`
ci/prow/4.8-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.8-acceptance/1552264579789099008) | true | `/test 4.8-acceptance`
ci/prow/4.9-acceptance | b1879867d5fa74d96cf3155cbf86a5bbf3925051 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1552264579902345216) | true | `/test 4.9-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
openshift-ci[bot]: @sadlerap: 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
--- | --- | --- | --- | ---
ci/prow/4.9-acceptance | 0ceefae016d3f443e7d05f05386975ac905acecd | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/1176/pull-ci-redhat-developer-service-binding-operator-master-4.9-acceptance/1554597789244067840) | true | `/test 4.9-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=1176). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:sadlerap).

<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 -->
baijum: /lgtm
/approve
openshift-ci[bot]: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/redhat-developer/service-binding-operator/pull/1176#issuecomment-1210463154" title="Approved">baijum</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=redhat-developer%2Fservice-binding-operator).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

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

- ~~[OWNERS](https://github.com/redhat-developer/service-binding-operator/blob/master/OWNERS)~~ [baijum]

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":[]} -->

Patch:
diff --git a/PROJECT b/PROJECT
index bf1440b4..904197f5 100644
--- a/PROJECT
+++ b/PROJECT
@@ -50,4 +50,26 @@ resources:
   kind: BindableKinds
   path: github.com/redhat-developer/service-binding-operator/apis/binding/v1alpha1
   version: v1alpha1
+- api:
+    crdVersion: v1
+    namespaced: true
+  domain: operators.coreos.com
+  group: spec
+  kind: ServiceBinding
+  path: github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1
+  version: v1beta1
+  webhooks:
+    validation: true
+    webhookVersion: v1
+- api:
+    crdVersion: v1
+    namespaced: true
+  domain: operators.coreos.com
+  group: spec
+  kind: ClusterWorkloadResourceMapping
+  path: github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1
+  version: v1beta1
+  webhooks:
+    validation: true
+    webhookVersion: v1
 version: "3"
diff --git a/apis/spec/v1alpha3/clusterworkloadresourcemapping_types.go b/apis/spec/v1alpha3/clusterworkloadresourcemapping_types.go
index 5e0cab55..86e03592 100644
--- a/apis/spec/v1alpha3/clusterworkloadresourcemapping_types.go
+++ b/apis/spec/v1alpha3/clusterworkloadresourcemapping_types.go
@@ -70,8 +70,8 @@ type ClusterWorkloadResourceMappingSpec struct {
 }
 
 // +kubebuilder:object:root=true
+// +kubebuilder:deprecatedversion
 // +kubebuilder:resource:scope=Cluster
-// +kubebuilder:storageversion
 // +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`
 
 // ClusterWorkloadResourceMapping is the Schema for the clusterworkloadresourcemappings API
diff --git a/apis/spec/v1alpha3/groupversion_info.go b/apis/spec/v1alpha3/groupversion_info.go
index 3a941237..e47a2f29 100644
--- a/apis/spec/v1alpha3/groupversion_info.go
+++ b/apis/spec/v1alpha3/groupversion_info.go
@@ -28,14 +28,6 @@ var (
 	// GroupVersion is group version used to register these objects
 	GroupVersion = schema.GroupVersion{Group: "servicebinding.io", Version: "v1alpha3"}
 
-	GroupVersionResource = GroupVersion.WithResource("servicebindings")
-
-	GroupVersionKind = GroupVersion.WithKind("ServiceBinding")
-
-	WorkloadResourceMappingGroupVersionResource = GroupVersion.WithResource("clusterworkloadresourcemappings")
-
-	WorkloadResourceMappingGroupVersionKind = GroupVersion.WithKind("ClusterWorkloadResourceMapping")
-
 	// SchemeBuilder is used to add go types to the GroupVersionKind scheme
 	SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
 
diff --git a/apis/spec/v1alpha3/servicebinding_types.go b/apis/spec/v1alpha3/servicebinding_types.go
index ab7d9ebf..3101ff83 100644
--- a/apis/spec/v1alpha3/servicebinding_types.go
+++ b/apis/spec/v1alpha3/servicebinding_types.go
@@ -17,9 +17,7 @@ limitations under the License.
 package v1alpha3
 
 import (
-	"errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime/schema"
 )
 
 // ServiceBindingWorkloadReference defines a subset of corev1.ObjectReference with extensions
@@ -97,7 +95,8 @@ type ServiceBindingStatus struct {
 }
 
 // +kubebuilder:object:root=true
-// +kubebuilder:storageversion
+// +kubebuilder:resource:scope=Namespaced
+// +kubebuilder:deprecatedversion
 // +kubebuilder:subresource:status
 // +kubebuilder:printcolumn:name="Ready",type=string,JSONPath=`.status.conditions[?(@.type=="Ready")].status`
 // +kubebuilder:printcolumn:name="Reason",type=string,JSONPath=`.status.conditions[?(@.type=="Ready")].reason`
@@ -126,37 +125,6 @@ func init() {
 	SchemeBuilder.Register(&ServiceBinding{}, &ServiceBindingList{})
 }
 
-func (ref *ServiceBindingServiceReference) GroupVersionResource() (*schema.GroupVersionResource, error) {
-	return nil, errors.New("Resource undefined")
-}
-
-func (ref *ServiceBindingServiceReference) GroupVersionKind() (*schema.GroupVersionKind, error) {
-	typeMeta := &metav1.TypeMeta{Kind: ref.Kind, APIVersion: ref.APIVersion}
-	gvk := typeMeta.GroupVersionKind()
-	return &gvk, nil
-}
-
-func (ref *ServiceBindingWorkloadReference) GroupVersionResource() (*schema.GroupVersionResource, error) {
-	return nil, errors.New("Resource undefined")
-}
-
-func (ref *ServiceBindingWorkloadReference) GroupVersionKind() (*schema.GroupVersionKind, error) {
-	typeMeta := &metav1.TypeMeta{Kind: ref.Kind, APIVersion: ref.APIVersion}
-	gvk := typeMeta.GroupVersionKind()
-	return &gvk, nil
-}
-
-func (sb *ServiceBinding) AsOwnerReference() metav1.OwnerReference {
-	var ownerRefController bool = true
-	return metav1.OwnerReference{
-		Name:       sb.Name,
-		UID:        sb.UID,
-		Kind:       sb.Kind,
-		APIVersion: sb.APIVersion,
-		Controller: &ownerRefController,
-	}
-}
-
 func (sb *ServiceBinding) HasDeletionTimestamp() bool {
 	return !sb.DeletionTimestamp.IsZero()
 }
diff --git a/apis/spec/v1alpha3/zz_generated.deepcopy.go b/apis/spec/v1alpha3/zz_generated.deepcopy.go
index 8c580269..7a47ca62 100644
--- a/apis/spec/v1alpha3/zz_generated.deepcopy.go
+++ b/apis/spec/v1alpha3/zz_generated.deepcopy.go
@@ -23,7 +23,7 @@ package v1alpha3
 
 import (
 	"k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
+	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
diff --git a/apis/spec/v1beta1/clusterworkloadresourcemapping_types.go b/apis/spec/v1beta1/clusterworkloadresourcemapping_types.go
new file mode 100644
index 00000000..5615d75f
--- /dev/null
+++ b/apis/spec/v1beta1/clusterworkloadresourcemapping_types.go
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2021 Original 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
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package v1beta1
+
+import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+// ClusterWorkloadResourceMappingTemplate defines the mapping for a specific version of an workload resource to a
+// logical PodTemplateSpec-like structure.
+type ClusterWorkloadResourceMappingTemplate struct {
+	// Version is the version of the workload resource that this mapping is for.
+	Version string `json:"version"`
+	// Annotations is a Restricted JSONPath that references the annotations map within the workload resource. These
+	// annotations must end up in the resulting Pod, and are generally not the workload resource's annotations.
+	// Defaults to `.spec.template.metadata.annotations`.
+	Annotations string `json:"annotations,omitempty"`
+	// Containers is the collection of mappings to container-like fragments of the workload resource. Defaults to
+	// mappings appropriate for a PodSpecable resource.
+	Containers []ClusterWorkloadResourceMappingContainer `json:"containers,omitempty"`
+	// Volumes is a Restricted JSONPath that references the slice of volumes within the workload resource. Defaults to
+	// `.spec.template.spec.volumes`.
+	Volumes string `json:"volumes,omitempty"`
+}
+
+// ClusterWorkloadResourceMappingContainer defines the mapping for a specific fragment of an workload resource
+// to a Container-like structure.
+//
+// Each mapping defines exactly one path that may match multiple container-like fragments within the workload
+// resource. For each object matching the path the name, env and volumeMounts expressions are resolved to find those
+// structures.
+type ClusterWorkloadResourceMappingContainer struct {
+	// Path is the JSONPath within the workload resource that matches an existing fragment that is container-like.
+	Path string `json:"path"`
+	// Name is a Restricted JSONPath that references the name of the container with the container-like workload resource
+	// fragment. If not defined, container name filtering is ignored.
+	Name string `json:"name,omitempty"`
+	// Env is a Restricted JSONPath that references the slice of environment variables for the container with the
+	// container-like workload resource fragment. The referenced location is created if it does not exist. Defaults
+	// to `.envs`.
+	Env string `json:"env,omitempty"`
+	// VolumeMounts is a Restricted JSONPath that references the slice of volume mounts for the container with the
+	// container-like workload resource fragment. The referenced location is created if it does not exist. Defaults
+	// to `.volumeMounts`.
+	VolumeMounts string `json:"volumeMounts,omitempty"`
+}
+
+// ClusterWorkloadResourceMappingSpec defines the desired state of ClusterWorkloadResourceMapping
+type ClusterWorkloadResourceMappingSpec struct {
+	// Versions is the collection of versions for a given resource, with mappings.
+	Versions []ClusterWorkloadResourceMappingTemplate `json:"versions,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+// +kubebuilder:resource:scope=Cluster
+// +kubebuilder:storageversion
+// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`
+
+// ClusterWorkloadResourceMapping is the Schema for the clusterworkloadresourcemappings API
+type ClusterWorkloadResourceMapping struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec ClusterWorkloadResourceMappingSpec `json:"spec,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+
+// ClusterWorkloadResourceMappingList contains a list of ClusterWorkloadResourceMapping
+type ClusterWorkloadResourceMappingList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+
+	Items []ClusterWorkloadResourceMapping `json:"items"`
+}
+
+func init() {
+	SchemeBuilder.Register(&ClusterWorkloadResourceMapping{}, &ClusterWorkloadResourceMappingList{})
+}
+
+var DefaultTemplate = ClusterWorkloadResourceMappingTemplate{
+	Version:     "*",
+	Annotations: ".spec.template.spec.annotations",
+	Volumes:     ".spec.template.spec.volumes",
+	Containers: []ClusterWorkloadResourceMappingContainer{
+		{
+			Path:         ".spec.template.spec.containers[*]",
+			Name:         ".name",
+			Env:          ".env",
+			VolumeMounts: ".volumeMounts",
+		},
+		{
+			Path:         ".spec.template.spec.initContainers[*]",
+			Name:         ".name",
+			Env:          ".env",
+			VolumeMounts: ".volumeMounts",
+		},
+	},
+}
diff --git a/apis/spec/v1alpha3/clusterworkloadresourcemapping_webhook.go b/apis/spec/v1beta1/clusterworkloadresourcemapping_webhook.go
similarity index 93%
rename from apis/spec/v1alpha3/clusterworkloadresourcemapping_webhook.go
rename to apis/spec/v1beta1/clusterworkloadresourcemapping_webhook.go
index 69063593..12c01871 100644
--- a/apis/spec/v1alpha3/clusterworkloadresourcemapping_webhook.go
+++ b/apis/spec/v1beta1/clusterworkloadresourcemapping_webhook.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1alpha3
+package v1beta1
 
 import (
 	"fmt"
@@ -36,7 +36,7 @@ func (r *ClusterWorkloadResourceMapping) SetupWebhookWithManager(mgr ctrl.Manage
 // EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
 
 // TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
-//+kubebuilder:webhook:path=/validate-servicebinding-io-v1alpha3-clusterworkloadresourcemapping,mutating=false,failurePolicy=fail,sideEffects=None,groups=servicebinding.io,resources=clusterworkloadresourcemappings,verbs=create;update,versions=v1alpha3,name=vclusterworkloadresourcemapping.kb.io,admissionReviewVersions=v1
+//+kubebuilder:webhook:path=/validate-servicebinding-io-v1beta1-clusterworkloadresourcemapping,mutating=false,failurePolicy=fail,sideEffects=None,groups=servicebinding.io,resources=clusterworkloadresourcemappings,verbs=create;update,versions=v1beta1,name=vclusterworkloadresourcemapping.kb.io,admissionReviewVersions=v1
 
 var _ webhook.Validator = &ClusterWorkloadResourceMapping{}
 
diff --git a/apis/spec/v1beta1/groupversion_info.go b/apis/spec/v1beta1/groupversion_info.go
new file mode 100644
index 00000000..8614516d
--- /dev/null
+++ b/apis/spec/v1beta1/groupversion_info.go
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2020 Original 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
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Package v1beta1 contains API Schema definitions for the service v1beta1 API group
+// +kubebuilder:object:generate=true
+// +groupName=servicebinding.io
+package v1beta1
+
+import (
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"sigs.k8s.io/controller-runtime/pkg/scheme"
+)
+
+var (
+	WorkloadResourceMappingGroupVersionResource = GroupVersion.WithResource("clusterworkloadresourcemappings")
+
+	WorkloadResourceMappingGroupVersionKind = GroupVersion.WithKind("ClusterWorkloadResourceMapping")
+
+	// GroupVersion is group version used to register these objects
+	GroupVersion = schema.GroupVersion{Group: "servicebinding.io", Version: "v1beta1"}
+
+	GroupVersionResource = GroupVersion.WithResource("servicebindings")
+
+	GroupVersionKind = GroupVersion.WithKind("ServiceBinding")
+
+	// 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/spec/v1beta1/servicebinding_types.go b/apis/spec/v1beta1/servicebinding_types.go
new file mode 100644
index 00000000..47e9e5a1
--- /dev/null
+++ b/apis/spec/v1beta1/servicebinding_types.go
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2020 Original 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
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package v1beta1
+
+import (
+	"errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// ServiceBindingWorkloadReference defines a subset of corev1.ObjectReference with extensions
+type ServiceBindingWorkloadReference struct {
+	// API version of the referent.
+	APIVersion string `json:"apiVersion"`
+	// Kind of the referent.
+	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+	Kind string `json:"kind"`
+	// Name of the referent.
+	// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+	Name string `json:"name,omitempty"`
+	// Selector is a query that selects the workload or workloads to bind the service to
+	Selector *metav1.LabelSelector `json:"selector,omitempty"`
+	// Containers describes which containers in a Pod should be bound to
+	Containers []string `json:"containers,omitempty"`
+}
+
+// ServiceBindingServiceReference defines a subset of corev1.ObjectReference
+type ServiceBindingServiceReference struct {
+	// API version of the referent.
+	APIVersion string `json:"apiVersion"`
+	// Kind of the referent.
+	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+	Kind string `json:"kind"`
+	// Name of the referent.
+	// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+	Name string `json:"name"`
+}
+
+// ServiceBindingSecretReference defines a mirror of corev1.LocalObjectReference
+type ServiceBindingSecretReference struct {
+	// Name of the referent secret.
+	// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+	Name string `json:"name"`
+}
+
+// EnvMapping defines a mapping from the value of a Secret entry to an environment variable
+type EnvMapping struct {
+	// Name is the name of the environment variable
+	Name string `json:"name"`
+	// Key is the key in the Secret that will be exposed
+	Key string `json:"key"`
+}
+
+// ServiceBindingSpec defines the desired state of ServiceBinding
+type ServiceBindingSpec struct {
+	// Name is the name of the service as projected into the workload container.  Defaults to .metadata.name.
+	Name string `json:"name,omitempty"`
+	// Type is the type of the service as projected into the workload container
+	Type string `json:"type,omitempty"`
+	// Provider is the provider of the service as projected into the workload container
+	Provider string `json:"provider,omitempty"`
+	// Workload is a reference to an object
+	Workload ServiceBindingWorkloadReference `json:"workload"`
+	// Service is a reference to an object that fulfills the ProvisionedService duck type
+	Service ServiceBindingServiceReference `json:"service"`
+	// Env is the collection of mappings from Secret entries to environment variables
+	Env []EnvMapping `json:"env,omitempty"`
+}
+
+// These are valid conditions of ServiceBinding.
+const (
+	// ServiceBindingReady means the ServiceBinding has projected the ProvisionedService
+	// secret and the Workload is ready to start. It does not indicate the condition
+	// of either the Service or the Workload resources referenced.
+	ServiceBindingConditionReady = "Ready"
+)
+
+// ServiceBindingStatus defines the observed state of ServiceBinding
+type ServiceBindingStatus struct {
+	// ObservedGeneration is the 'Generation' of the ServiceBinding that
+	// was last processed by the controller.
+	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
+
+	// Conditions are the conditions of this ServiceBinding
+	Conditions []metav1.Condition `json:"conditions,omitempty"`
+
+	// Binding exposes the projected secret for this ServiceBinding
+	Binding *ServiceBindingSecretReference `json:"binding,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+// +kubebuilder:resource:scope=Namespaced
+// +kubebuilder:storageversion
+// +kubebuilder:subresource:status
+// +kubebuilder:printcolumn:name="Ready",type=string,JSONPath=`.status.conditions[?(@.type=="Ready")].status`
+// +kubebuilder:printcolumn:name="Reason",type=string,JSONPath=`.status.conditions[?(@.type=="Ready")].reason`
+// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`
+
+// ServiceBinding is the Schema for the servicebindings API
+type ServiceBinding struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec   ServiceBindingSpec   `json:"spec,omitempty"`
+	Status ServiceBindingStatus `json:"status,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+
+// ServiceBindingList contains a list of ServiceBinding
+type ServiceBindingList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+
+	Items []ServiceBinding `json:"items"`
+}
+
+func init() {
+	SchemeBuilder.Register(&ServiceBinding{}, &ServiceBindingList{})
+}
+
+func (ref *ServiceBindingServiceReference) GroupVersionResource() (*schema.GroupVersionResource, error) {
+	return nil, errors.New("Resource undefined")
+}
+
+func (ref *ServiceBindingServiceReference) GroupVersionKind() (*schema.GroupVersionKind, error) {
+	typeMeta := &metav1.TypeMeta{Kind: ref.Kind, APIVersion: ref.APIVersion}
+	gvk := typeMeta.GroupVersionKind()
+	return &gvk, nil
+}
+
+func (ref *ServiceBindingWorkloadReference) GroupVersionResource() (*schema.GroupVersionResource, error) {
+	return nil, errors.New("Resource undefined")
+}
+
+func (ref *ServiceBindingWorkloadReference) GroupVersionKind() (*schema.GroupVersionKind, error) {
+	typeMeta := &metav1.TypeMeta{Kind: ref.Kind, APIVersion: ref.APIVersion}
+	gvk := typeMeta.GroupVersionKind()
+	return &gvk, nil
+}
+
+func (sb *ServiceBinding) AsOwnerReference() metav1.OwnerReference {
+	var ownerRefController bool = true
+	return metav1.OwnerReference{
+		Name:       sb.Name,
+		UID:        sb.UID,
+		Kind:       sb.Kind,
+		APIVersion: sb.APIVersion,
+		Controller: &ownerRefController,
+	}
+}
+
+func (sb *ServiceBinding) HasDeletionTimestamp() bool {
+	return !sb.DeletionTimestamp.IsZero()
+}
+
+func (r *ServiceBinding) StatusConditions() []metav1.Condition {
+	return r.Status.Conditions
+}
+
+func (sb *ServiceBinding) GetSpec() interface{} {
+	return sb.Spec
+}
diff --git a/apis/spec/v1alpha3/servicebinding_webhook.go b/apis/spec/v1beta1/servicebinding_webhook.go
similarity index 85%
rename from apis/spec/v1alpha3/servicebinding_webhook.go
rename to apis/spec/v1beta1/servicebinding_webhook.go
index ca27c969..255d6718 100644
--- a/apis/spec/v1alpha3/servicebinding_webhook.go
+++ b/apis/spec/v1beta1/servicebinding_webhook.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package v1alpha3
+package v1beta1
 
 import (
 	"errors"
@@ -38,7 +38,7 @@ func (r *ServiceBinding) SetupWebhookWithManager(mgr ctrl.Manager) error {
 // EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
 
 // TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
-// +kubebuilder:webhook:path=/validate-servicebinding-io-v1alpha3-servicebinding,mutating=false,failurePolicy=fail,sideEffects=None,groups=servicebinding.io,resources=servicebindings,verbs=create;update,versions=v1alpha3,name=vspecservicebinding.kb.io,admissionReviewVersions=v1
+// +kubebuilder:webhook:path=/validate-servicebinding-io-v1beta1-servicebinding,mutating=false,failurePolicy=fail,sideEffects=None,groups=servicebinding.io,resources=servicebindings,verbs=create;update,versions=v1beta1,name=vspecservicebinding.kb.io,admissionReviewVersions=v1
 
 var _ webhook.Validator = &ServiceBinding{}
 
@@ -72,5 +72,8 @@ func (sb *ServiceBinding) ValidateUpdate(old runtime.Object) error {
 
 // ValidateDelete implements webhook.Validator so a webhook will be registered for the type
 func (r *ServiceBinding) ValidateDelete() error {
+	log.Info("validate delete", "name", r.Name)
+
+	// TODO(user): fill in your validation logic upon object deletion.
 	return nil
 }
diff --git a/apis/spec/v1beta1/zz_generated.deepcopy.go b/apis/spec/v1beta1/zz_generated.deepcopy.go
new file mode 100644
index 00000000..8a66633f
--- /dev/null
+++ b/apis/spec/v1beta1/zz_generated.deepcopy.go
@@ -0,0 +1,320 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright 2021.
+
+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 v1beta1
+
+import (
+	"k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterWorkloadResourceMapping) DeepCopyInto(out *ClusterWorkloadResourceMapping) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterWorkloadResourceMapping.
+func (in *ClusterWorkloadResourceMapping) DeepCopy() *ClusterWorkloadResourceMapping {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterWorkloadResourceMapping)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ClusterWorkloadResourceMapping) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterWorkloadResourceMappingContainer) DeepCopyInto(out *ClusterWorkloadResourceMappingContainer) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterWorkloadResourceMappingContainer.
+func (in *ClusterWorkloadResourceMappingContainer) DeepCopy() *ClusterWorkloadResourceMappingContainer {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterWorkloadResourceMappingContainer)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterWorkloadResourceMappingList) DeepCopyInto(out *ClusterWorkloadResourceMappingList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]ClusterWorkloadResourceMapping, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterWorkloadResourceMappingList.
+func (in *ClusterWorkloadResourceMappingList) DeepCopy() *ClusterWorkloadResourceMappingList {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterWorkloadResourceMappingList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ClusterWorkloadResourceMappingList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterWorkloadResourceMappingSpec) DeepCopyInto(out *ClusterWorkloadResourceMappingSpec) {
+	*out = *in
+	if in.Versions != nil {
+		in, out := &in.Versions, &out.Versions
+		*out = make([]ClusterWorkloadResourceMappingTemplate, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterWorkloadResourceMappingSpec.
+func (in *ClusterWorkloadResourceMappingSpec) DeepCopy() *ClusterWorkloadResourceMappingSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterWorkloadResourceMappingSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ClusterWorkloadResourceMappingTemplate) DeepCopyInto(out *ClusterWorkloadResourceMappingTemplate) {
+	*out = *in
+	if in.Containers != nil {
+		in, out := &in.Containers, &out.Containers
+		*out = make([]ClusterWorkloadResourceMappingContainer, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterWorkloadResourceMappingTemplate.
+func (in *ClusterWorkloadResourceMappingTemplate) DeepCopy() *ClusterWorkloadResourceMappingTemplate {
+	if in == nil {
+		return nil
+	}
+	out := new(ClusterWorkloadResourceMappingTemplate)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EnvMapping) DeepCopyInto(out *EnvMapping) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvMapping.
+func (in *EnvMapping) DeepCopy() *EnvMapping {
+	if in == nil {
+		return nil
+	}
+	out := new(EnvMapping)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceBinding) DeepCopyInto(out *ServiceBinding) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceBinding.
+func (in *ServiceBinding) DeepCopy() *ServiceBinding {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceBinding)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ServiceBinding) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceBindingList) DeepCopyInto(out *ServiceBindingList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]ServiceBinding, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceBindingList.
+func (in *ServiceBindingList) DeepCopy() *ServiceBindingList {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceBindingList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ServiceBindingList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceBindingSecretReference) DeepCopyInto(out *ServiceBindingSecretReference) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceBindingSecretReference.
+func (in *ServiceBindingSecretReference) DeepCopy() *ServiceBindingSecretReference {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceBindingSecretReference)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceBindingServiceReference) DeepCopyInto(out *ServiceBindingServiceReference) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceBindingServiceReference.
+func (in *ServiceBindingServiceReference) DeepCopy() *ServiceBindingServiceReference {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceBindingServiceReference)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceBindingSpec) DeepCopyInto(out *ServiceBindingSpec) {
+	*out = *in
+	in.Workload.DeepCopyInto(&out.Workload)
+	out.Service = in.Service
+	if in.Env != nil {
+		in, out := &in.Env, &out.Env
+		*out = make([]EnvMapping, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceBindingSpec.
+func (in *ServiceBindingSpec) DeepCopy() *ServiceBindingSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceBindingSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceBindingStatus) DeepCopyInto(out *ServiceBindingStatus) {
+	*out = *in
+	if in.Conditions != nil {
+		in, out := &in.Conditions, &out.Conditions
+		*out = make([]v1.Condition, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.Binding != nil {
+		in, out := &in.Binding, &out.Binding
+		*out = new(ServiceBindingSecretReference)
+		**out = **in
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceBindingStatus.
+func (in *ServiceBindingStatus) DeepCopy() *ServiceBindingStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceBindingStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ServiceBindingWorkloadReference) DeepCopyInto(out *ServiceBindingWorkloadReference) {
+	*out = *in
+	if in.Selector != nil {
+		in, out := &in.Selector, &out.Selector
+		*out = new(v1.LabelSelector)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Containers != nil {
+		in, out := &in.Containers, &out.Containers
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceBindingWorkloadReference.
+func (in *ServiceBindingWorkloadReference) DeepCopy() *ServiceBindingWorkloadReference {
+	if in == nil {
+		return nil
+	}
+	out := new(ServiceBindingWorkloadReference)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/apis/webhooks/admission.go b/apis/webhooks/admission.go
index 698c2c9b..7aee637c 100644
--- a/apis/webhooks/admission.go
+++ b/apis/webhooks/admission.go
@@ -19,7 +19,7 @@ func SetupWithManager(mgr ctrl.Manager, serviceAccountName string) {
 }
 
 // +kubebuilder:webhook:path=/mutate-servicebinding,mutating=true,failurePolicy=fail,sideEffects=None,groups=binding.operators.coreos.com,resources=servicebindings,verbs=create;update,versions=v1alpha1,name=mservicebinding.kb.io,admissionReviewVersions=v1
-// +kubebuilder:webhook:path=/mutate-servicebinding,mutating=true,failurePolicy=fail,sideEffects=None,groups=servicebinding.io,resources=servicebindings,verbs=create;update,versions=v1alpha3,name=mspec-servicebinding.kb.io,admissionReviewVersions=v1
+// +kubebuilder:webhook:path=/mutate-servicebinding,mutating=true,failurePolicy=fail,sideEffects=None,groups=servicebinding.io,resources=servicebindings,verbs=create;update,versions=v1alpha3;v1beta1,name=mspec-servicebinding.kb.io,admissionReviewVersions=v1
 
 type admissionHandler struct {
 	decoder            *admission.Decoder
diff --git a/config/crd/bases/servicebinding.io_clusterworkloadresourcemappings.yaml b/config/crd/bases/servicebinding.io_clusterworkloadresourcemappings.yaml
index 5fb07f69..49caf73a 100644
--- a/config/crd/bases/servicebinding.io_clusterworkloadresourcemappings.yaml
+++ b/config/crd/bases/servicebinding.io_clusterworkloadresourcemappings.yaml
@@ -20,6 +20,7 @@ spec:
     - jsonPath: .metadata.creationTimestamp
       name: Age
       type: date
+    deprecated: true
     name: v1alpha3
     schema:
       openAPIV3Schema:
@@ -113,6 +114,105 @@ spec:
             type: object
         type: object
     served: true
+    storage: false
+    subresources: {}
+  - additionalPrinterColumns:
+    - jsonPath: .metadata.creationTimestamp
+      name: Age
+      type: date
+    name: v1beta1
+    schema:
+      openAPIV3Schema:
+        description: ClusterWorkloadResourceMapping is the Schema for the clusterworkloadresourcemappings
+          API
+        properties:
+          apiVersion:
+            description: 'APIVersion defines the versioned schema of this representation
+              of an object. Servers should convert recognized schemas to the latest
+              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
+            type: string
+          kind:
+            description: 'Kind is a string value representing the REST resource this
+              object represents. Servers may infer this from the endpoint the client
+              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: ClusterWorkloadResourceMappingSpec defines the desired state
+              of ClusterWorkloadResourceMapping
+            properties:
+              versions:
+                description: Versions is the collection of versions for a given resource,
+                  with mappings.
+                items:
+                  description: ClusterWorkloadResourceMappingTemplate defines the
+                    mapping for a specific version of an workload resource to a logical
+                    PodTemplateSpec-like structure.
+                  properties:
+                    annotations:
+                      description: Annotations is a Restricted JSONPath that references
+                        the annotations map within the workload resource. These annotations
+                        must end up in the resulting Pod, and are generally not the
+                        workload resource's annotations. Defaults to `.spec.template.metadata.annotations`.
+                      type: string
+                    containers:
+                      description: Containers is the collection of mappings to container-like
+                        fragments of the workload resource. Defaults to mappings appropriate
+                        for a PodSpecable resource.
+                      items:
+                        description: "ClusterWorkloadResourceMappingContainer defines
+                          the mapping for a specific fragment of an workload resource
+                          to a Container-like structure. \n Each mapping defines exactly
+                          one path that may match multiple container-like fragments
+                          within the workload resource. For each object matching the
+                          path the name, env and volumeMounts expressions are resolved
+                          to find those structures."
+                        properties:
+                          env:
+                            description: Env is a Restricted JSONPath that references
+                              the slice of environment variables for the container
+                              with the container-like workload resource fragment.
+                              The referenced location is created if it does not exist.
+                              Defaults to `.envs`.
+                            type: string
+                          name:
+                            description: Name is a Restricted JSONPath that references
+                              the name of the container with the container-like workload
+                              resource fragment. If not defined, container name filtering
+                              is ignored.
+                            type: string
+                          path:
+                            description: Path is the JSONPath within the workload
+                              resource that matches an existing fragment that is container-like.
+                            type: string
+                          volumeMounts:
+                            description: VolumeMounts is a Restricted JSONPath that
+                              references the slice of volume mounts for the container
+                              with the container-like workload resource fragment.
+                              The referenced location is created if it does not exist.
+                              Defaults to `.volumeMounts`.
+                            type: string
+                        required:
+                        - path
+                        type: object
+                      type: array
+                    version:
+                      description: Version is the version of the workload resource
+                        that this mapping is for.
+                      type: string
+                    volumes:
+                      description: Volumes is a Restricted JSONPath that references
+                        the slice of volumes within the workload resource. Defaults
+                        to `.spec.template.spec.volumes`.
+                      type: string
+                  required:
+                  - version
+                  type: object
+                type: array
+            type: object
+        type: object
+    served: true
     storage: true
     subresources: {}
 status:
diff --git a/config/crd/bases/servicebinding.io_servicebindings.yaml b/config/crd/bases/servicebinding.io_servicebindings.yaml
index 4156bbfb..f85bab0e 100644
--- a/config/crd/bases/servicebinding.io_servicebindings.yaml
+++ b/config/crd/bases/servicebinding.io_servicebindings.yaml
@@ -26,6 +26,7 @@ spec:
     - jsonPath: .metadata.creationTimestamp
       name: Age
       type: date
+    deprecated: true
     name: v1alpha3
     schema:
       openAPIV3Schema:
@@ -257,6 +258,248 @@ spec:
             type: object
         type: object
     served: true
+    storage: false
+    subresources:
+      status: {}
+  - additionalPrinterColumns:
+    - jsonPath: .status.conditions[?(@.type=="Ready")].status
+      name: Ready
+      type: string
+    - jsonPath: .status.conditions[?(@.type=="Ready")].reason
+      name: Reason
+      type: string
+    - jsonPath: .metadata.creationTimestamp
+      name: Age
+      type: date
+    name: v1beta1
+    schema:
+      openAPIV3Schema:
+        description: ServiceBinding is the Schema for the servicebindings API
+        properties:
+          apiVersion:
+            description: 'APIVersion defines the versioned schema of this representation
+              of an object. Servers should convert recognized schemas to the latest
+              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
+            type: string
+          kind:
+            description: 'Kind is a string value representing the REST resource this
+              object represents. Servers may infer this from the endpoint the client
+              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: ServiceBindingSpec defines the desired state of ServiceBinding
+            properties:
+              env:
+                description: Env is the collection of mappings from Secret entries
+                  to environment variables
+                items:
+                  description: EnvMapping defines a mapping from the value of a Secret
+                    entry to an environment variable
+                  properties:
+                    key:
+                      description: Key is the key in the Secret that will be exposed
+                      type: string
+                    name:
+                      description: Name is the name of the environment variable
+                      type: string
+                  required:
+                  - key
+                  - name
+                  type: object
+                type: array
+              name:
+                description: Name is the name of the service as projected into the
+                  workload container.  Defaults to .metadata.name.
+                type: string
+              provider:
+                description: Provider is the provider of the service as projected
+                  into the workload container
+                type: string
+              service:
+                description: Service is a reference to an object that fulfills the
+                  ProvisionedService duck type
+                properties:
+                  apiVersion:
+                    description: API version of the referent.
+                    type: string
+                  kind:
+                    description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                    type: string
+                  name:
+                    description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                    type: string
+                required:
+                - apiVersion
+                - kind
+                - name
+                type: object
+              type:
+                description: Type is the type of the service as projected into the
+                  workload container
+                type: string
+              workload:
+                description: Workload is a reference to an object
+                properties:
+                  apiVersion:
+                    description: API version of the referent.
+                    type: string
+                  containers:
+                    description: Containers describes which containers in a Pod should
+                      be bound to
+                    items:
+                      type: string
+                    type: array
+                  kind:
+                    description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+                    type: string
+                  name:
+                    description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                    type: string
+                  selector:
+                    description: Selector is a query that selects the workload or
+                      workloads to bind the service to
+                    properties:
+                      matchExpressions:
+                        description: matchExpressions is a list of label selector
+                          requirements. The requirements are ANDed.
+                        items:
+                          description: A label selector requirement is a selector
+                            that contains values, a key, and an operator that relates
+                            the key and values.
+                          properties:
+                            key:
+                              description: key is the label key that the selector
+                                applies to.
+                              type: string
+                            operator:
+                              description: operator represents a key's relationship
+                                to a set of values. Valid operators are In, NotIn,
+                                Exists and DoesNotExist.
+                              type: string
+                            values:
+                              description: values is an array of string values. If
+                                the operator is In or NotIn, the values array must
+                                be non-empty. If the operator is Exists or DoesNotExist,
+                                the values array must be empty. This array is replaced
+                                during a strategic merge patch.
+                              items:
+                                type: string
+                              type: array
+                          required:
+                          - key
+                          - operator
+                          type: object
+                        type: array
+                      matchLabels:
+                        additionalProperties:
+                          type: string
+                        description: matchLabels is a map of {key,value} pairs. A
+                          single {key,value} in the matchLabels map is equivalent
+                          to an element of matchExpressions, whose key field is "key",
+                          the operator is "In", and the values array contains only
+                          "value". The requirements are ANDed.
+                        type: object
+                    type: object
+                required:
+                - apiVersion
+                - kind
+                type: object
+            required:
+            - service
+            - workload
+            type: object
+          status:
+            description: ServiceBindingStatus defines the observed state of ServiceBinding
+            properties:
+              binding:
+                description: Binding exposes the projected secret for this ServiceBinding
+                properties:
+                  name:
+                    description: 'Name of the referent secret. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
+                    type: string
+                required:
+                - name
+                type: object
+              conditions:
+                description: Conditions are the conditions of this ServiceBinding
+                items:
+                  description: "Condition contains details for one aspect of the current
+                    state of this API Resource. --- This struct is intended for direct
+                    use as an array at the field path .status.conditions.  For example,
+                    type FooStatus struct{     // Represents the observations of a
+                    foo's current state.     // Known .status.conditions.type are:
+                    \"Available\", \"Progressing\", and \"Degraded\"     // +patchMergeKey=type
+                    \    // +patchStrategy=merge     // +listType=map     // +listMapKey=type
+                    \    Conditions []metav1.Condition `json:\"conditions,omitempty\"
+                    patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
+                    \n     // other fields }"
+                  properties:
+                    lastTransitionTime:
+                      description: lastTransitionTime is the last time the condition
+                        transitioned from one status to another. This should be when
+                        the underlying condition changed.  If that is not known, then
+                        using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: message is a human readable message indicating
+                        details about the transition. This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: observedGeneration represents the .metadata.generation
+                        that the condition was set based upon. For instance, if .metadata.generation
+                        is currently 12, but the .status.conditions[x].observedGeneration
+                        is 9, the condition is out of date with respect to the current
+                        state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: reason contains a programmatic identifier indicating
+                        the reason for the condition's last transition. Producers
+                        of specific condition types may define expected values and
+                        meanings for this field, and whether the values are considered
+                        a guaranteed API. The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                        --- Many .condition.type values are consistent across resources
+                        like Available, but because arbitrary conditions can be useful
+                        (see .node.status.conditions), the ability to deconflict is
+                        important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+              observedGeneration:
+                description: ObservedGeneration is the 'Generation' of the ServiceBinding
+                  that was last processed by the controller.
+                format: int64
+                type: integer
+            type: object
+        type: object
+    served: true
     storage: true
     subresources:
       status: {}
diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml
index 5abc9c76..ec08ad46 100644
--- a/config/crd/kustomization.yaml
+++ b/config/crd/kustomization.yaml
@@ -13,12 +13,15 @@ patchesStrategicMerge:
 # patches here are for enabling the conversion webhook for each CRD
 #- patches/webhook_in_servicebindings.yaml
 #- patches/webhook_in_bindablekinds.yaml
+#- patches/webhook_in_clusterworkloadresourcemappings.yaml
 # +kubebuilder:scaffold:crdkustomizewebhookpatch
 
 # [CERTMANAGER] To enable webhook, uncomment all the sections with [CERTMANAGER] prefix.
 # patches here are for enabling the CA injection for each CRD
 - patches/cainjection_in_servicebindings.yaml
 #- patches/cainjection_in_bindablekinds.yaml
+#- patches/cainjection_in_servicebindings.yaml
+#- patches/cainjection_in_clusterworkloadresourcemappings.yaml
 # +kubebuilder:scaffold:crdkustomizecainjectionpatch
 
 # the following config is for teaching kustomize how to do kustomization for CRDs.
diff --git a/config/crd/patches/cainjection_in_spec_clusterworkloadresourcemappings.yaml b/config/crd/patches/cainjection_in_spec_clusterworkloadresourcemappings.yaml
new file mode 100644
index 00000000..27154ee7
--- /dev/null
+++ b/config/crd/patches/cainjection_in_spec_clusterworkloadresourcemappings.yaml
@@ -0,0 +1,7 @@
+# The following patch adds a directive for certmanager to inject CA into the CRD
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME)
+  name: clusterworkloadresourcemappings.servicebinding.io
diff --git a/config/crd/patches/cainjection_in_spec_servicebindings.yaml b/config/crd/patches/cainjection_in_spec_servicebindings.yaml
new file mode 100644
index 00000000..214c628c
--- /dev/null
+++ b/config/crd/patches/cainjection_in_spec_servicebindings.yaml
@@ -0,0 +1,7 @@
+# The following patch adds a directive for certmanager to inject CA into the CRD
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME)
+  name: servicebindings.servicebinding.io
diff --git a/config/samples/kustomization.yaml b/config/samples/kustomization.yaml
index e8b7b587..c5f7ee05 100644
--- a/config/samples/kustomization.yaml
+++ b/config/samples/kustomization.yaml
@@ -2,4 +2,6 @@
 resources:
 - operators_v1alpha1_servicebinding.yaml
 - servicebinding.io_v1alpha3_servicebinding.yaml
+- spec_v1beta1_servicebinding.yaml
+- spec_v1beta1_clusterworkloadresourcemapping.yaml
 # +kubebuilder:scaffold:manifestskustomizesamples
diff --git a/config/samples/spec_v1beta1_clusterworkloadresourcemapping.yaml b/config/samples/spec_v1beta1_clusterworkloadresourcemapping.yaml
new file mode 100644
index 00000000..b92bfb11
--- /dev/null
+++ b/config/samples/spec_v1beta1_clusterworkloadresourcemapping.yaml
@@ -0,0 +1,6 @@
+apiVersion: servicebinding.io/v1beta1
+kind: ClusterWorkloadResourceMapping
+metadata:
+  name: clusterworkloadresourcemapping-sample
+spec:
+  # TODO(user): Add fields here
diff --git a/config/samples/spec_v1beta1_servicebinding.yaml b/config/samples/spec_v1beta1_servicebinding.yaml
new file mode 100644
index 00000000..30eb60e3
--- /dev/null
+++ b/config/samples/spec_v1beta1_servicebinding.yaml
@@ -0,0 +1,6 @@
+apiVersion: servicebinding.io/v1beta1
+kind: ServiceBinding
+metadata:
+  name: servicebinding-sample
+spec:
+  # TODO(user): Add fields here
diff --git a/config/webhook/manifests.yaml b/config/webhook/manifests.yaml
index 778e4f68..57c5c35e 100644
--- a/config/webhook/manifests.yaml
+++ b/config/webhook/manifests.yaml
@@ -40,6 +40,7 @@ webhooks:
     - servicebinding.io
     apiVersions:
     - v1alpha3
+    - v1beta1
     operations:
     - CREATE
     - UPDATE
@@ -80,14 +81,14 @@ webhooks:
     service:
       name: webhook-service
       namespace: system
-      path: /validate-servicebinding-io-v1alpha3-clusterworkloadresourcemapping
+      path: /validate-servicebinding-io-v1beta1-clusterworkloadresourcemapping
   failurePolicy: Fail
   name: vclusterworkloadresourcemapping.kb.io
   rules:
   - apiGroups:
     - servicebinding.io
     apiVersions:
-    - v1alpha3
+    - v1beta1
     operations:
     - CREATE
     - UPDATE
@@ -100,14 +101,14 @@ webhooks:
     service:
       name: webhook-service
       namespace: system
-      path: /validate-servicebinding-io-v1alpha3-servicebinding
+      path: /validate-servicebinding-io-v1beta1-servicebinding
   failurePolicy: Fail
   name: vspecservicebinding.kb.io
   rules:
   - apiGroups:
     - servicebinding.io
     apiVersions:
-    - v1alpha3
+    - v1beta1
     operations:
     - CREATE
     - UPDATE
diff --git a/controllers/spec/servicebinding_controller.go b/controllers/spec/servicebinding_controller.go
index 2de844b5..7ab74ab6 100644
--- a/controllers/spec/servicebinding_controller.go
+++ b/controllers/spec/servicebinding_controller.go
@@ -19,7 +19,6 @@ package spec
 import (
 	"github.com/go-logr/logr"
 	"github.com/redhat-developer/service-binding-operator/apis"
-	"github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
 	"github.com/redhat-developer/service-binding-operator/controllers"
 	"github.com/redhat-developer/service-binding-operator/pkg/client/kubernetes"
 	"github.com/redhat-developer/service-binding-operator/pkg/reconcile/pipeline"
@@ -41,7 +40,7 @@ type ServiceBindingReconciler struct {
 // +kubebuilder:rbac:groups=servicebinding.io,resources=servicebindings/status,verbs=get;update;patch
 // +kubebuilder:rbac:groups=servicebinding.io,resources=servicebindings/finalizers,verbs=update
 
-func New(client client.Client, log logr.Logger, scheme *runtime.Scheme) *ServiceBindingReconciler {
+func New(client client.Client, log logr.Logger, scheme *runtime.Scheme, object apis.Object) *ServiceBindingReconciler {
 	r := &ServiceBindingReconciler{
 		BindingReconciler: controllers.BindingReconciler{
 			Client: client,
@@ -58,7 +57,7 @@ func New(client client.Client, log logr.Logger, scheme *runtime.Scheme) *Service
 				}
 				return builder.SpecBuilder.WithContextProvider(context.SpecProvider(client, authClient.SubjectAccessReviews(), lookup)).Build(), nil
 			},
-			ReconcilingObject: func() apis.Object { return &v1alpha3.ServiceBinding{} },
+			ReconcilingObject: func() apis.Object { return object },
 		},
 	}
 
diff --git a/docs/userguide/modules/binding-workloads-using-sbo/pages/binding-options.adoc b/docs/userguide/modules/binding-workloads-using-sbo/pages/binding-options.adoc
index aad8f3f0..2fcb60ea 100644
--- a/docs/userguide/modules/binding-workloads-using-sbo/pages/binding-options.adoc
+++ b/docs/userguide/modules/binding-workloads-using-sbo/pages/binding-options.adoc
@@ -210,7 +210,7 @@ spec:
 .Example of `ServiceBinding` CR in the `servicebinding.io` API:
 [source,yaml]
 ----
-apiVersion: servicebindings.io/v1alpha3
+apiVersion: servicebindings.io/v1beta1
 kind: ServiceBinding
 metadata:
   name: multi-application-binding
diff --git a/docs/userguide/modules/binding-workloads-using-sbo/pages/creating-service-binding.adoc b/docs/userguide/modules/binding-workloads-using-sbo/pages/creating-service-binding.adoc
index b75f0387..b4171433 100644
--- a/docs/userguide/modules/binding-workloads-using-sbo/pages/creating-service-binding.adoc
+++ b/docs/userguide/modules/binding-workloads-using-sbo/pages/creating-service-binding.adoc
@@ -40,7 +40,7 @@ spec:
 .Example of `ServiceBinding` CR in the `servicebinding.io` API:
 [source,yaml]
 ----
-apiVersion: servicebinding.io/v1alpha3
+apiVersion: servicebinding.io/v1beta1
 kind: ServiceBinding
 metadata:
   name: account-service
diff --git a/docs/userguide/modules/binding-workloads-using-sbo/pages/custom-path-injection.adoc b/docs/userguide/modules/binding-workloads-using-sbo/pages/custom-path-injection.adoc
index 02d5f7c9..547a2b5d 100644
--- a/docs/userguide/modules/binding-workloads-using-sbo/pages/custom-path-injection.adoc
+++ b/docs/userguide/modules/binding-workloads-using-sbo/pages/custom-path-injection.adoc
@@ -177,7 +177,7 @@ The specification also provides a way to define exactly where binding data needs
 .Example: Schema of the `ClusterWorkloadResourceMapping` resource
 [source,yaml]
 ----
-apiVersion: servicebinding.io/v1alpha3
+apiVersion: servicebinding.io/v1beta1
 kind: ClusterWorkloadResourceMapping
 metadata:
   name: # string <1>
@@ -221,7 +221,7 @@ All other operations are forbidden.
 .Example: Mapping for `CronJob.batch/v1` resources
 [source,yaml]
 ----
-apiVersion: servicebinding.io/v1alpha3
+apiVersion: servicebinding.io/v1beta1
 kind: ClusterWorkloadResourceMapping
 metadata:
  name: cronjobs.batch
diff --git a/docs/userguide/modules/binding-workloads-using-sbo/pages/unbinding-workloads.adoc b/docs/userguide/modules/binding-workloads-using-sbo/pages/unbinding-workloads.adoc
index 3b3de67a..82cc4580 100644
--- a/docs/userguide/modules/binding-workloads-using-sbo/pages/unbinding-workloads.adoc
+++ b/docs/userguide/modules/binding-workloads-using-sbo/pages/unbinding-workloads.adoc
@@ -43,9 +43,9 @@ where:
 
 
 [#for-the-servicebinding.io-api]
-== For the `servicebinding.io/v1alpha3` API:
+== For the `servicebinding.io/v1beta1` API:
 
-You can unbind a workload from a backing service bound using a `ServiceBinding` custom resource (CR) from the `servicebinding.io/v1alpha3` API:
+You can unbind a workload from a backing service bound using a `ServiceBinding` custom resource (CR) from the `servicebinding.io/v1beta1` API:
 
 [discreet]
 .Procedure
diff --git a/docs/userguide/modules/exposing-binding-data/pages/direct-secret-reference.adoc b/docs/userguide/modules/exposing-binding-data/pages/direct-secret-reference.adoc
index fb0b438b..6f7de7c4 100644
--- a/docs/userguide/modules/exposing-binding-data/pages/direct-secret-reference.adoc
+++ b/docs/userguide/modules/exposing-binding-data/pages/direct-secret-reference.adoc
@@ -22,7 +22,7 @@ spec:
 .Example: Specification that is compliant with the `servicebinding.io` API
 [source,yaml]
 ----
-apiVersion: servicebinding.io/v1alpha3
+apiVersion: servicebinding.io/v1beta1
 kind: ServiceBinding
 metadata:
   name: account-service
diff --git a/docs/userguide/modules/exposing-binding-data/pages/provisioned-service.adoc b/docs/userguide/modules/exposing-binding-data/pages/provisioned-service.adoc
index 2b0c0c1e..2e1496ec 100644
--- a/docs/userguide/modules/exposing-binding-data/pages/provisioned-service.adoc
+++ b/docs/userguide/modules/exposing-binding-data/pages/provisioned-service.adoc
@@ -59,7 +59,7 @@ spec:
 .Example: `ServiceBinding` resource in Specification API
 [source,yaml]
 ----
-apiVersion: servicebinding.io/v1alpha3
+apiVersion: servicebinding.io/v1beta1
 kind: ServiceBinding
 metadata:
   name: account-service
diff --git a/main.go b/main.go
index 3b515759..bb3eff1e 100644
--- a/main.go
+++ b/main.go
@@ -47,6 +47,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	specv1alpha3 "github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	specv1beta1 "github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	speccontrollers "github.com/redhat-developer/service-binding-operator/controllers/spec"
 	// +kubebuilder:scaffold:imports
 )
@@ -63,6 +64,7 @@ func init() {
 	utilruntime.Must(specv1alpha3.AddToScheme(scheme))
 	utilruntime.Must(v1apiextensions.AddToScheme(scheme))
 	utilruntime.Must(v1beta1apiextensions.AddToScheme(scheme))
+	utilruntime.Must(specv1beta1.AddToScheme(scheme))
 	// +kubebuilder:scaffold:scheme
 }
 
@@ -134,25 +136,35 @@ func main() {
 		setupLog.Error(err, "unable to create controller", "controller", "ServiceBinding")
 		os.Exit(1)
 	}
+	if err = (&v1alpha1.ServiceBinding{}).SetupWebhookWithManager(mgr); err != nil {
+		setupLog.Error(err, "unable to create webhook", "webhook", "ServiceBinding")
+		os.Exit(1)
+	}
 	if err = speccontrollers.New(
 		mgr.GetClient(),
 		ctrl.Log.WithName("controllers").WithName("SPEC ServiceBinding"),
 		mgr.GetScheme(),
+		&specv1alpha3.ServiceBinding{},
 	).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "SPEC ServiceBinding")
 		os.Exit(1)
 	}
-
-	if err = (&v1alpha1.ServiceBinding{}).SetupWebhookWithManager(mgr); err != nil {
-		setupLog.Error(err, "unable to create webhook", "webhook", "ServiceBinding")
+	if err = speccontrollers.New(
+		mgr.GetClient(),
+		ctrl.Log.WithName("controllers").WithName("SPEC ServiceBinding"),
+		mgr.GetScheme(),
+		&specv1beta1.ServiceBinding{},
+	).SetupWithManager(mgr); err != nil {
+		setupLog.Error(err, "unable to create controller", "controller", "SPEC ServiceBinding")
 		os.Exit(1)
 	}
+
 	webhooks.SetupWithManager(mgr, serviceAccountName)
-	if err = (&specv1alpha3.ServiceBinding{}).SetupWebhookWithManager(mgr); err != nil {
+	if err = (&specv1beta1.ServiceBinding{}).SetupWebhookWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create webhook", "webhook", "SPEC ServiceBinding")
 		os.Exit(1)
 	}
-	if err = (&specv1alpha3.ClusterWorkloadResourceMapping{}).SetupWebhookWithManager(mgr); err != nil {
+	if err = (&specv1beta1.ClusterWorkloadResourceMapping{}).SetupWebhookWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create webhook", "webhook", "ClusterWorkloadResourceMapping")
 		os.Exit(1)
 	}
diff --git a/pkg/binding/mocks/mocks.go b/pkg/binding/mocks/mocks.go
index a769fef0..d28dece4 100644
--- a/pkg/binding/mocks/mocks.go
+++ b/pkg/binding/mocks/mocks.go
@@ -64,18 +64,18 @@ func (mr *MockDefinitionMockRecorder) GetPath() *gomock.Call {
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPath", reflect.TypeOf((*MockDefinition)(nil).GetPath))
 }
 
-// NonExistingOptional mock
-func (m *MockDefinition) NonExistingOptional(v binding.Value) bool {
+// NonExistingOptional mocks base method.
+func (m *MockDefinition) NonExistingOptional(arg0 binding.Value) bool {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "NonExistingOptional")
+	ret := m.ctrl.Call(m, "NonExistingOptional", arg0)
 	ret0, _ := ret[0].(bool)
 	return ret0
 }
 
 // NonExistingOptional indicates an expected call of NonExistingOptional.
-func (mr *MockDefinitionMockRecorder) NonExistingOptional() *gomock.Call {
+func (mr *MockDefinitionMockRecorder) NonExistingOptional(arg0 interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NonExistingOptional", reflect.TypeOf((*MockDefinition)(nil).NonExistingOptional))
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NonExistingOptional", reflect.TypeOf((*MockDefinition)(nil).NonExistingOptional), arg0)
 }
 
 // MockValue is a mock of Value interface.
diff --git a/pkg/reconcile/pipeline/context/impl.go b/pkg/reconcile/pipeline/context/impl.go
index 74969ace..f014a9cb 100644
--- a/pkg/reconcile/pipeline/context/impl.go
+++ b/pkg/reconcile/pipeline/context/impl.go
@@ -10,7 +10,7 @@ import (
 
 	"github.com/redhat-developer/service-binding-operator/apis"
 	"github.com/redhat-developer/service-binding-operator/apis/binding/v1alpha1"
-	"github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	"github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	"github.com/redhat-developer/service-binding-operator/pkg/client/kubernetes"
 	"github.com/redhat-developer/service-binding-operator/pkg/reconcile/pipeline/context/service"
 	"golang.org/x/time/rate"
@@ -520,14 +520,14 @@ func (i *impl) WorkloadResourceTemplate(gvr *schema.GroupVersionResource, contai
 		return i.resourceMapping, nil
 	}
 
-	defaultTemplate := v1alpha3.DefaultTemplate
-	mappingGVR := v1alpha3.WorkloadResourceMappingGroupVersionResource
+	defaultTemplate := v1beta1.DefaultTemplate
+	mappingGVR := v1beta1.WorkloadResourceMappingGroupVersionResource
 
 	if !i.canPerform(&mappingGVR, gvr.GroupResource().String(), "", "get") {
 		return nil, errors.NewBadRequest(fmt.Sprintf("Unable to retrieve ClusterWorkloadResourceMapping for type %q", gvr))
 	}
 
-	var mappingTemplate *v1alpha3.ClusterWorkloadResourceMappingTemplate = nil
+	var mappingTemplate *v1beta1.ClusterWorkloadResourceMappingTemplate = nil
 	mappingObj, err := i.client.Resource(mappingGVR).
 		Get(context.Background(),
 			gvr.GroupResource().String(),
@@ -535,7 +535,7 @@ func (i *impl) WorkloadResourceTemplate(gvr *schema.GroupVersionResource, contai
 	if errors.IsNotFound(err) {
 		mappingTemplate = &defaultTemplate
 	} else if mappingObj != nil {
-		var mapping v1alpha3.ClusterWorkloadResourceMapping
+		var mapping v1beta1.ClusterWorkloadResourceMapping
 		err := runtime.DefaultUnstructuredConverter.FromUnstructured(mappingObj.Object, &mapping)
 		if err != nil {
 			return nil, err
@@ -571,7 +571,7 @@ func (i *impl) WorkloadResourceTemplate(gvr *schema.GroupVersionResource, contai
 			}
 		}
 		if found {
-			mappingTemplate.Containers = append(mappingTemplate.Containers, v1alpha3.ClusterWorkloadResourceMappingContainer{
+			mappingTemplate.Containers = append(mappingTemplate.Containers, v1beta1.ClusterWorkloadResourceMappingContainer{
 				Path: path,
 			})
 		}
diff --git a/pkg/reconcile/pipeline/context/spec_binding_impl.go b/pkg/reconcile/pipeline/context/spec_binding_impl.go
index b096c8ff..9c7150df 100644
--- a/pkg/reconcile/pipeline/context/spec_binding_impl.go
+++ b/pkg/reconcile/pipeline/context/spec_binding_impl.go
@@ -6,7 +6,7 @@ import (
 	"time"
 
 	"github.com/redhat-developer/service-binding-operator/apis"
-	"github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	"github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	"github.com/redhat-developer/service-binding-operator/pkg/client/kubernetes"
 	"github.com/redhat-developer/service-binding-operator/pkg/converter"
 	"github.com/redhat-developer/service-binding-operator/pkg/reconcile/pipeline"
@@ -31,7 +31,7 @@ var SpecProvider = func(client dynamic.Interface, subjectAccessReviewClient auth
 		typeLookup: typeLookup,
 		get: func(binding interface{}) (pipeline.Context, error) {
 			switch sb := binding.(type) {
-			case *v1alpha3.ServiceBinding:
+			case *v1beta1.ServiceBinding:
 				if sb.Generation != 0 {
 					sb.Status.ObservedGeneration = sb.Generation
 				}
@@ -49,7 +49,7 @@ var SpecProvider = func(client dynamic.Interface, subjectAccessReviewClient auth
 							return sb.Status.Binding.Name
 						},
 						setStatusSecretName: func(name string) {
-							sb.Status.Binding = &v1alpha3.ServiceBindingSecretReference{Name: name}
+							sb.Status.Binding = &v1beta1.ServiceBindingSecretReference{Name: name}
 						},
 						unstructuredBinding: func() (*unstructured.Unstructured, error) {
 							return converter.ToUnstructured(sb)
@@ -61,7 +61,7 @@ var SpecProvider = func(client dynamic.Interface, subjectAccessReviewClient auth
 							return sb.AsOwnerReference()
 						},
 						groupVersionResource: func() schema.GroupVersionResource {
-							return v1alpha3.GroupVersionResource
+							return v1beta1.GroupVersionResource
 						},
 						requester: func() *v1.UserInfo {
 							return apis.Requester(sb.ObjectMeta)
@@ -91,7 +91,7 @@ var SpecProvider = func(client dynamic.Interface, subjectAccessReviewClient auth
 
 type specImpl struct {
 	impl
-	serviceBinding *v1alpha3.ServiceBinding
+	serviceBinding *v1beta1.ServiceBinding
 }
 
 func (i *specImpl) BindingName() string {
diff --git a/pkg/reconcile/pipeline/mapping.go b/pkg/reconcile/pipeline/mapping.go
index 1bd07d13..489174bd 100644
--- a/pkg/reconcile/pipeline/mapping.go
+++ b/pkg/reconcile/pipeline/mapping.go
@@ -17,7 +17,7 @@ import (
 	"fmt"
 	"path"
 
-	"github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	"github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	"github.com/redhat-developer/service-binding-operator/pkg/converter"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -38,7 +38,7 @@ type WorkloadMapping struct {
 	Volume     []string
 }
 
-func FromWorkloadResourceMappingTemplate(mapping v1alpha3.ClusterWorkloadResourceMappingTemplate) (*WorkloadMapping, error) {
+func FromWorkloadResourceMappingTemplate(mapping v1beta1.ClusterWorkloadResourceMappingTemplate) (*WorkloadMapping, error) {
 	var containers []WorkloadContainer
 	for _, container := range mapping.Containers {
 		wc := WorkloadContainer{}


Test patch:
diff --git a/apis/spec/v1alpha3/clusterworkloadresourcemapping_webhook_test.go b/apis/spec/v1beta1/clusterworkloadresourcemapping_webhook_test.go
similarity index 99%
rename from apis/spec/v1alpha3/clusterworkloadresourcemapping_webhook_test.go
rename to apis/spec/v1beta1/clusterworkloadresourcemapping_webhook_test.go
index df610a2c..690340d9 100644
--- a/apis/spec/v1alpha3/clusterworkloadresourcemapping_webhook_test.go
+++ b/apis/spec/v1beta1/clusterworkloadresourcemapping_webhook_test.go
@@ -1,4 +1,4 @@
-package v1alpha3
+package v1beta1
 
 import (
 	. "github.com/onsi/ginkgo"
diff --git a/apis/spec/v1alpha3/servicebinding_webhook_test.go b/apis/spec/v1beta1/servicebinding_webhook_test.go
similarity index 99%
rename from apis/spec/v1alpha3/servicebinding_webhook_test.go
rename to apis/spec/v1beta1/servicebinding_webhook_test.go
index 249426dc..f05a941d 100644
--- a/apis/spec/v1alpha3/servicebinding_webhook_test.go
+++ b/apis/spec/v1beta1/servicebinding_webhook_test.go
@@ -1,4 +1,4 @@
-package v1alpha3
+package v1beta1
 
 import (
 	. "github.com/onsi/ginkgo"
diff --git a/apis/spec/v1alpha3/suite_test.go b/apis/spec/v1beta1/suite_test.go
similarity index 90%
rename from apis/spec/v1alpha3/suite_test.go
rename to apis/spec/v1beta1/suite_test.go
index 1b46a035..db493acd 100644
--- a/apis/spec/v1alpha3/suite_test.go
+++ b/apis/spec/v1beta1/suite_test.go
@@ -1,4 +1,4 @@
-package v1alpha3
+package v1beta1
 
 import (
 	"testing"
diff --git a/pkg/reconcile/pipeline/builder/pipeline_integration_test.go b/pkg/reconcile/pipeline/builder/pipeline_integration_test.go
index 278ddf61..3f713bee 100644
--- a/pkg/reconcile/pipeline/builder/pipeline_integration_test.go
+++ b/pkg/reconcile/pipeline/builder/pipeline_integration_test.go
@@ -7,7 +7,7 @@ import (
 
 	"github.com/redhat-developer/service-binding-operator/apis"
 	"github.com/redhat-developer/service-binding-operator/apis/binding/v1alpha1"
-	"github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	"github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	fakeauth "k8s.io/client-go/kubernetes/typed/authorization/v1/fake"
 
 	"github.com/golang/mock/gomock"
@@ -162,9 +162,9 @@ var _ = Describe("Default Pipeline", func() {
 		Expect(err).NotTo(HaveOccurred())
 
 		_, err = client.
-			Resource(v1alpha3.WorkloadResourceMappingGroupVersionResource).
+			Resource(v1beta1.WorkloadResourceMappingGroupVersionResource).
 			Get(c.Background(), serviceGVK.GroupKind().String(), metav1.GetOptions{})
-		Expect(err).To(Equal(errors.NewNotFound(v1alpha3.WorkloadResourceMappingGroupVersionResource.GroupResource(), serviceGVK.GroupKind().String())), "Binding should occur without a workload resource mapping")
+		Expect(err).To(Equal(errors.NewNotFound(v1beta1.WorkloadResourceMappingGroupVersionResource.GroupResource(), serviceGVK.GroupKind().String())), "Binding should occur without a workload resource mapping")
 
 		updatedApp := &appsv1.Deployment{}
 		err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, updatedApp)
diff --git a/pkg/reconcile/pipeline/context/impl_test.go b/pkg/reconcile/pipeline/context/impl_test.go
index 60a8b1b9..8386fd3e 100644
--- a/pkg/reconcile/pipeline/context/impl_test.go
+++ b/pkg/reconcile/pipeline/context/impl_test.go
@@ -13,7 +13,7 @@ import (
 	. "github.com/onsi/gomega"
 	"github.com/redhat-developer/service-binding-operator/apis"
 	bindingapi "github.com/redhat-developer/service-binding-operator/apis/binding/v1alpha1"
-	"github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	"github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	"github.com/redhat-developer/service-binding-operator/pkg/client/kubernetes/mocks"
 	"github.com/redhat-developer/service-binding-operator/pkg/converter"
 	"github.com/redhat-developer/service-binding-operator/pkg/reconcile/pipeline"
@@ -991,9 +991,9 @@ var _ = Describe("Context", func() {
 			}
 			gvr := schema.GroupVersionResource{Group: "app", Version: "v1", Resource: "foos"}
 
-			mappingSpec := v1alpha3.ClusterWorkloadResourceMapping{
-				Spec: v1alpha3.ClusterWorkloadResourceMappingSpec{
-					Versions: []v1alpha3.ClusterWorkloadResourceMappingTemplate{
+			mappingSpec := v1beta1.ClusterWorkloadResourceMapping{
+				Spec: v1beta1.ClusterWorkloadResourceMappingSpec{
+					Versions: []v1beta1.ClusterWorkloadResourceMappingTemplate{
 						{
 							Version: "v1",
 							Volumes: ".spec.volumeSpec",
@@ -1008,8 +1008,8 @@ var _ = Describe("Context", func() {
 					Name: "foos.app",
 				},
 				TypeMeta: metav1.TypeMeta{
-					Kind:       v1alpha3.WorkloadResourceMappingGroupVersionKind.Kind,
-					APIVersion: "servicebinding.io/v1alpha3",
+					Kind:       v1beta1.WorkloadResourceMappingGroupVersionKind.Kind,
+					APIVersion: "servicebinding.io/v1beta1",
 				},
 			}
 
@@ -1021,7 +1021,7 @@ var _ = Describe("Context", func() {
 			Expect(err).NotTo(HaveOccurred())
 
 			u := &unstructured.Unstructured{}
-			u.SetGroupVersionKind(v1alpha3.WorkloadResourceMappingGroupVersionKind)
+			u.SetGroupVersionKind(v1beta1.WorkloadResourceMappingGroupVersionKind)
 			u.SetName("foos.app")
 			u.SetUnstructuredContent(data)
 			client := fake.NewSimpleDynamicClient(runtime.NewScheme(), u)
@@ -1056,9 +1056,9 @@ var _ = Describe("Context", func() {
 			}
 			gvr := schema.GroupVersionResource{Group: "app", Version: "v1", Resource: "foos"}
 
-			mappingSpec := v1alpha3.ClusterWorkloadResourceMapping{
-				Spec: v1alpha3.ClusterWorkloadResourceMappingSpec{
-					Versions: []v1alpha3.ClusterWorkloadResourceMappingTemplate{
+			mappingSpec := v1beta1.ClusterWorkloadResourceMapping{
+				Spec: v1beta1.ClusterWorkloadResourceMappingSpec{
+					Versions: []v1beta1.ClusterWorkloadResourceMappingTemplate{
 						{
 							Version: "*",
 						},
@@ -1068,8 +1068,8 @@ var _ = Describe("Context", func() {
 					Name: "foos.app",
 				},
 				TypeMeta: metav1.TypeMeta{
-					Kind:       v1alpha3.WorkloadResourceMappingGroupVersionKind.Kind,
-					APIVersion: "servicebinding.io/v1alpha3",
+					Kind:       v1beta1.WorkloadResourceMappingGroupVersionKind.Kind,
+					APIVersion: "servicebinding.io/v1beta1",
 				},
 			}
 
@@ -1081,7 +1081,7 @@ var _ = Describe("Context", func() {
 			Expect(err).NotTo(HaveOccurred())
 
 			u := &unstructured.Unstructured{}
-			u.SetGroupVersionKind(v1alpha3.WorkloadResourceMappingGroupVersionKind)
+			u.SetGroupVersionKind(v1beta1.WorkloadResourceMappingGroupVersionKind)
 			u.SetName("foos.app")
 			u.SetUnstructuredContent(data)
 			client := fake.NewSimpleDynamicClient(runtime.NewScheme(), u)
diff --git a/pkg/reconcile/pipeline/context/spec_binding_impl_test.go b/pkg/reconcile/pipeline/context/spec_binding_impl_test.go
index e1cc2cf0..bb4b0675 100644
--- a/pkg/reconcile/pipeline/context/spec_binding_impl_test.go
+++ b/pkg/reconcile/pipeline/context/spec_binding_impl_test.go
@@ -12,7 +12,7 @@ import (
 	. "github.com/onsi/gomega"
 	olmv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
 	"github.com/redhat-developer/service-binding-operator/apis"
-	specapi "github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	specapi "github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	"github.com/redhat-developer/service-binding-operator/pkg/client/kubernetes/mocks"
 	"github.com/redhat-developer/service-binding-operator/pkg/converter"
 	"github.com/redhat-developer/service-binding-operator/pkg/reconcile/pipeline"
diff --git a/pkg/reconcile/pipeline/handler/collect/impl_test.go b/pkg/reconcile/pipeline/handler/collect/impl_test.go
index 400744bb..398a045f 100644
--- a/pkg/reconcile/pipeline/handler/collect/impl_test.go
+++ b/pkg/reconcile/pipeline/handler/collect/impl_test.go
@@ -406,7 +406,7 @@ var _ = Describe("Collect Binding Data", func() {
 					service.EXPECT().Resource().Return(serviceResource)
 
 					definition.EXPECT().Apply(serviceResource).Return(value, nil)
-					definition.EXPECT().NonExistingOptional().Return(false)
+					definition.EXPECT().NonExistingOptional(value).Return(false)
 					value.EXPECT().Get().Return(map[string]map[string]interface{}{"java-maven_port": {"foo": nil}})
 
 					ctx.EXPECT().SetCondition(
@@ -480,7 +480,7 @@ var _ = Describe("Collect Binding Data", func() {
 				bv := bindingmocks.NewMockValue(mockCtrl)
 				bv.EXPECT().Get().Return("we should not return strings")
 				bd.EXPECT().Apply(serviceContent).Return(bv, nil)
-				bd.EXPECT().NonExistingOptional().Return(false)
+				bd.EXPECT().NonExistingOptional(bv).Return(false)
 
 				service.EXPECT().BindingDefs().Return([]binding.Definition{bd})
 
@@ -531,7 +531,7 @@ var _ = Describe("Collect Binding Data", func() {
 						bv := bindingmocks.NewMockValue(mockCtrl)
 						bv.EXPECT().Get().Return(val)
 						bd.EXPECT().Apply(res).Return(bv, nil)
-						bd.EXPECT().NonExistingOptional().Return(false)
+						bd.EXPECT().NonExistingOptional(bv).Return(false)
 						bindings = append(bindings, bd)
 						for k, v := range val.(map[string]interface{}) {
 							ctx.EXPECT().AddBindingItem(&pipeline.BindingItem{Name: k, Value: v, Source: service})
@@ -557,7 +557,7 @@ var _ = Describe("Collect Binding Data", func() {
 			bv := bindingmocks.NewMockValue(mockCtrl)
 			bv.EXPECT().Get().Return(val)
 			bd.EXPECT().Apply(res).Return(bv, nil)
-			bd.EXPECT().NonExistingOptional().Return(false)
+			bd.EXPECT().NonExistingOptional(bv).Return(false)
 			bindings = append(bindings, bd)
 			ctx.EXPECT().AddBindingItem(&pipeline.BindingItem{Name: "foo_bar", Value: "bla", Source: service})
 			ctx.EXPECT().AddBindingItem(&pipeline.BindingItem{Name: "foo_bar2", Value: "bla2", Source: service})
@@ -576,7 +576,7 @@ var _ = Describe("Collect Binding Data", func() {
 			bv := bindingmocks.NewMockValue(mockCtrl)
 			bv.EXPECT().Get().Return(val)
 			bd.EXPECT().Apply(res).Return(bv, nil)
-			bd.EXPECT().NonExistingOptional().Return(false)
+			bd.EXPECT().NonExistingOptional(bv).Return(false)
 			bindings = append(bindings, bd)
 			ctx.EXPECT().AddBindingItem(&pipeline.BindingItem{Name: "foo_bar_0", Value: "bla", Source: service})
 			ctx.EXPECT().AddBindingItem(&pipeline.BindingItem{Name: "foo_bar_1", Value: "bla2", Source: service})
diff --git a/pkg/reconcile/pipeline/mapping_test.go b/pkg/reconcile/pipeline/mapping_test.go
index 9f0f68a1..2b4710cf 100644
--- a/pkg/reconcile/pipeline/mapping_test.go
+++ b/pkg/reconcile/pipeline/mapping_test.go
@@ -19,7 +19,7 @@ import (
 	"github.com/golang/mock/gomock"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
-	"github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	"github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	"github.com/redhat-developer/service-binding-operator/pkg/converter"
 	"github.com/redhat-developer/service-binding-operator/pkg/reconcile/pipeline"
 	v1 "k8s.io/api/core/v1"
@@ -49,10 +49,10 @@ var _ = Describe("Mapping workloads", func() {
 
 	Context("Parsing", func() {
 		It("should parse valid mappings", func() {
-			template := v1alpha3.ClusterWorkloadResourceMappingTemplate{
+			template := v1beta1.ClusterWorkloadResourceMappingTemplate{
 				Version:     "*",
 				Annotations: ".spec.annotations",
-				Containers: []v1alpha3.ClusterWorkloadResourceMappingContainer{
+				Containers: []v1beta1.ClusterWorkloadResourceMappingContainer{
 					{
 						Name:         ".name",
 						Env:          ".env",
@@ -85,10 +85,10 @@ var _ = Describe("Mapping workloads", func() {
 		})
 
 		It("should use defaults when not specified", func() {
-			template := v1alpha3.ClusterWorkloadResourceMappingTemplate{
+			template := v1beta1.ClusterWorkloadResourceMappingTemplate{
 				Version:     "*",
 				Annotations: ".spec.annotations",
-				Containers: []v1alpha3.ClusterWorkloadResourceMappingContainer{
+				Containers: []v1beta1.ClusterWorkloadResourceMappingContainer{
 					{
 						Path: ".spec.spec.containers[*]",
 					},
@@ -118,10 +118,10 @@ var _ = Describe("Mapping workloads", func() {
 		})
 
 		It("should return an error on invalid mappings", func() {
-			template := v1alpha3.ClusterWorkloadResourceMappingTemplate{
+			template := v1beta1.ClusterWorkloadResourceMappingTemplate{
 				Version:     "*",
 				Annotations: ".spec.annotations",
-				Containers: []v1alpha3.ClusterWorkloadResourceMappingContainer{
+				Containers: []v1beta1.ClusterWorkloadResourceMappingContainer{
 					{
 						Path: ".spec.spec.containers[",
 					},
@@ -134,11 +134,11 @@ var _ = Describe("Mapping workloads", func() {
 		})
 
 		It("should not allow jsonpaths in restricted jsonpath contexts", func() {
-			templates := []v1alpha3.ClusterWorkloadResourceMappingTemplate{
+			templates := []v1beta1.ClusterWorkloadResourceMappingTemplate{
 				{
 					Version:     "*",
 					Annotations: ".spec.annotations",
-					Containers: []v1alpha3.ClusterWorkloadResourceMappingContainer{
+					Containers: []v1beta1.ClusterWorkloadResourceMappingContainer{
 						{
 							Path: ".spec.spec.containers[*]",
 							Name: ".name[*]",
@@ -148,7 +148,7 @@ var _ = Describe("Mapping workloads", func() {
 				{
 					Version:     "*",
 					Annotations: ".spec.annotations",
-					Containers: []v1alpha3.ClusterWorkloadResourceMappingContainer{
+					Containers: []v1beta1.ClusterWorkloadResourceMappingContainer{
 						{
 							Path: ".spec.spec.containers[*]",
 							Env:  ".env[*]",
@@ -158,7 +158,7 @@ var _ = Describe("Mapping workloads", func() {
 				{
 					Version:     "*",
 					Annotations: ".spec.annotations",
-					Containers: []v1alpha3.ClusterWorkloadResourceMappingContainer{
+					Containers: []v1beta1.ClusterWorkloadResourceMappingContainer{
 						{
 							Path:         ".spec.spec.containers[*]",
 							VolumeMounts: ".volumeMounts[*]",
@@ -168,7 +168,7 @@ var _ = Describe("Mapping workloads", func() {
 				{
 					Version:     "*",
 					Annotations: ".spec.annotations",
-					Containers: []v1alpha3.ClusterWorkloadResourceMappingContainer{
+					Containers: []v1beta1.ClusterWorkloadResourceMappingContainer{
 						{
 							Path: ".spec.spec.containers[*]",
 						},
diff --git a/test/_projects/api-client/main.go b/test/_projects/api-client/main.go
index 98fc74bb..e49153a6 100644
--- a/test/_projects/api-client/main.go
+++ b/test/_projects/api-client/main.go
@@ -3,7 +3,7 @@ package main
 import (
 	bindingapi "github.com/redhat-developer/service-binding-operator/apis/binding/v1alpha1"
 
-	specv1alpha2 "github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	specv1alpha2 "github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	"k8s.io/apimachinery/pkg/runtime"
 )
 
diff --git a/test/_projects/api-controller/main.go b/test/_projects/api-controller/main.go
index 9fd369e3..3b7a6283 100644
--- a/test/_projects/api-controller/main.go
+++ b/test/_projects/api-controller/main.go
@@ -4,7 +4,7 @@ import (
 	"context"
 	bindingapi "github.com/redhat-developer/service-binding-operator/apis/binding/v1alpha1"
 
-	specv1alpha2 "github.com/redhat-developer/service-binding-operator/apis/spec/v1alpha3"
+	specv1alpha2 "github.com/redhat-developer/service-binding-operator/apis/spec/v1beta1"
 	"k8s.io/apimachinery/pkg/runtime"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 
diff --git a/test/acceptance/features/allowBindingWhenUserHasPermissions.feature b/test/acceptance/features/allowBindingWhenUserHasPermissions.feature
index 7fcf45f2..4bfc60d9 100644
--- a/test/acceptance/features/allowBindingWhenUserHasPermissions.feature
+++ b/test/acceptance/features/allowBindingWhenUserHasPermissions.feature
@@ -246,7 +246,7 @@ Feature: Prevent users to bind services to application
     * User acceptance-tests-dev cannot read resource backends/$scenario_id in test namespace
     When user acceptance-tests-dev applies Service Binding
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -293,7 +293,7 @@ Feature: Prevent users to bind services to application
     * User acceptance-tests-dev cannot read resource secrets/$scenario_id in test namespace
     When user acceptance-tests-dev applies Service Binding
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -339,7 +339,7 @@ Feature: Prevent users to bind services to application
     * User acceptance-tests-dev cannot read resource configmaps/$scenario_id in test namespace
     When user acceptance-tests-dev applies Service Binding
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -375,7 +375,7 @@ Feature: Prevent users to bind services to application
     * User acceptance-tests-dev has 'backends-view' role in test namespace
     When user acceptance-tests-dev applies Service Binding
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
diff --git a/test/acceptance/features/bindAppToProvisionedService.feature b/test/acceptance/features/bindAppToProvisionedService.feature
index a6889d2b..6ff45a4b 100644
--- a/test/acceptance/features/bindAppToProvisionedService.feature
+++ b/test/acceptance/features/bindAppToProvisionedService.feature
@@ -285,7 +285,7 @@ Feature: Bind application to provisioned service
     Given Generic test application is running
     When Service Binding is applied
           """
-          apiVersion: servicebinding.io/v1alpha3
+          apiVersion: servicebinding.io/v1beta1
           kind: ServiceBinding
           metadata:
               name: $scenario_id-binding
@@ -320,7 +320,7 @@ Feature: Bind application to provisioned service
     Given Generic test application is running
     When Service Binding is applied
           """
-          apiVersion: servicebinding.io/v1alpha3
+          apiVersion: servicebinding.io/v1beta1
           kind: ServiceBinding
           metadata:
               name: $scenario_id-binding
@@ -360,7 +360,7 @@ Feature: Bind application to provisioned service
     Given Generic test application is running
     When Service Binding is applied
           """
-          apiVersion: servicebinding.io/v1alpha3
+          apiVersion: servicebinding.io/v1beta1
           kind: ServiceBinding
           metadata:
               name: $scenario_id-binding
@@ -432,7 +432,7 @@ Feature: Bind application to provisioned service
     Given Generic test application is running
     When Service Binding is applied
           """
-          apiVersion: servicebinding.io/v1alpha3
+          apiVersion: servicebinding.io/v1beta1
           kind: ServiceBinding
           metadata:
               name: $scenario_id-binding
diff --git a/test/acceptance/features/bindAppToService.feature b/test/acceptance/features/bindAppToService.feature
index 974ae1ed..4d7cdd97 100644
--- a/test/acceptance/features/bindAppToService.feature
+++ b/test/acceptance/features/bindAppToService.feature
@@ -389,7 +389,7 @@ Feature: Bind an application to a service
             """
         When Invalid Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -487,7 +487,7 @@ Feature: Bind an application to a service
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-valid
@@ -505,7 +505,7 @@ Feature: Bind an application to a service
             """
         When Invalid Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: binding-request-with-name-label-selector-spec2
diff --git a/test/acceptance/features/bindAppToServiceUsingSecret.feature b/test/acceptance/features/bindAppToServiceUsingSecret.feature
index 5bc1ccb4..649779c4 100644
--- a/test/acceptance/features/bindAppToServiceUsingSecret.feature
+++ b/test/acceptance/features/bindAppToServiceUsingSecret.feature
@@ -922,7 +922,7 @@ Feature: Bind values from a secret referred in backing service resource
         * Generic test application is running
         When Service Binding is applied
           """
-          apiVersion: servicebinding.io/v1alpha3
+          apiVersion: servicebinding.io/v1beta1
           kind: ServiceBinding
           metadata:
               name: $scenario_id-binding
@@ -967,7 +967,7 @@ Feature: Bind values from a secret referred in backing service resource
         * Generic test application is running
         When Service Binding is applied
           """
-          apiVersion: servicebinding.io/v1alpha3
+          apiVersion: servicebinding.io/v1beta1
           kind: ServiceBinding
           metadata:
               name: $scenario_id-binding
@@ -1022,7 +1022,7 @@ Feature: Bind values from a secret referred in backing service resource
 
         When Service Binding is applied
           """
-          apiVersion: servicebinding.io/v1alpha3
+          apiVersion: servicebinding.io/v1beta1
           kind: ServiceBinding
           metadata:
               name: $scenario_id-binding
diff --git a/test/acceptance/features/bindMultipleAppsToSingleService.feature b/test/acceptance/features/bindMultipleAppsToSingleService.feature
index 237bcd42..ce639ae0 100644
--- a/test/acceptance/features/bindMultipleAppsToSingleService.feature
+++ b/test/acceptance/features/bindMultipleAppsToSingleService.feature
@@ -85,7 +85,7 @@ Feature: Bind multiple applications to a single service
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -162,7 +162,7 @@ Feature: Bind multiple applications to a single service
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -240,7 +240,7 @@ Feature: Bind multiple applications to a single service
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -252,7 +252,7 @@ Feature: Bind multiple applications to a single service
             """
         And Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
diff --git a/test/acceptance/features/immutableBindings.feature b/test/acceptance/features/immutableBindings.feature
index 87ca954d..81360dba 100644
--- a/test/acceptance/features/immutableBindings.feature
+++ b/test/acceptance/features/immutableBindings.feature
@@ -151,7 +151,7 @@ Feature: Successful Service Binding are Immutable
         Given Generic test application is running
         And Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -169,7 +169,7 @@ Feature: Successful Service Binding are Immutable
         When Service Binding is ready
         Then Service Binding is unable to be applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -188,7 +188,7 @@ Feature: Successful Service Binding are Immutable
         Given Generic test application is running
         And Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -206,7 +206,7 @@ Feature: Successful Service Binding are Immutable
         When Service Binding is ready
         Then Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
diff --git a/test/acceptance/features/injectBindingsAsFiles.feature b/test/acceptance/features/injectBindingsAsFiles.feature
index dd0196ef..eae01191 100644
--- a/test/acceptance/features/injectBindingsAsFiles.feature
+++ b/test/acceptance/features/injectBindingsAsFiles.feature
@@ -176,7 +176,7 @@ Feature: Bindings get injected as files in application
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
diff --git a/test/acceptance/features/supportSpecBeta1Resources.feature b/test/acceptance/features/supportSpecBeta1Resources.feature
new file mode 100644
index 00000000..3ac5408f
--- /dev/null
+++ b/test/acceptance/features/supportSpecBeta1Resources.feature
@@ -0,0 +1,306 @@
+@spec
+Feature: Support spec v1beta1 resources
+
+    As a user, I would like to use v1beta1 resources as defined by the binding specification.
+
+    Background:
+        Given OLM Operator "provisioned_backend" is running
+        And OLM Operator "not_a_pod" is running
+        And Namespace [TEST_NAMESPACE] is used
+
+    Scenario: Bind application to provisioned service using v1beta1 ServiceBindings
+        Given Generic test application is running
+        And The Secret is present
+            """
+            apiVersion: v1
+            kind: Secret
+            metadata:
+                name: $scenario_id-secret
+            stringData:
+                username: foo
+                password: bar
+                type: db
+            """
+        And The Custom Resource is present
+            """
+            apiVersion: stable.example.com/v1
+            kind: ProvisionedBackend
+            metadata:
+                name: $scenario_id-backend
+            spec:
+                foo: bar
+            status:
+                binding:
+                    name: $scenario_id-secret
+            """
+        When Service Binding is applied
+            """
+            apiVersion: servicebinding.io/v1beta1
+            kind: ServiceBinding
+            metadata:
+                name: $scenario_id-binding
+            spec:
+                service:
+                  apiVersion: stable.example.com/v1
+                  kind: ProvisionedBackend
+                  name: $scenario_id-backend
+                workload:
+                  name: $scenario_id
+                  apiVersion: apps/v1
+                  kind: Deployment
+            """
+        Then Service Binding is ready
+        And jq ".status.binding.name" of Service Binding "$scenario_id-binding" should be changed to "$scenario_id-secret"
+        And Content of file "/bindings/$scenario_id-binding/username" in application pod is
+            """
+            foo
+            """
+        And Content of file "/bindings/$scenario_id-binding/password" in application pod is
+            """
+            bar
+            """
+        And Content of file "/bindings/$scenario_id-binding/type" in application pod is
+            """
+            db
+            """
+
+    Scenario: Project bindings to custom resource using v1beta1 resources
+        Given The Secret is present
+            """
+            apiVersion: v1
+            kind: Secret
+            metadata:
+                name: $scenario_id-secret
+            stringData:
+                username: AzureDiamond
+                password: hunter2
+                type:     secret
+            """
+        And The Workload Resource Mapping is present
+            """
+            apiVersion: servicebinding.io/v1beta1
+            kind: ClusterWorkloadResourceMapping
+            metadata:
+                name: notpodspecs.stable.example.com
+            spec:
+                versions:
+                  - version: "*"
+                    volumes: .spec.volumeData
+                    containers:
+                      - path: .spec.containerSpecs[*]
+                        name: .id
+                        env: .envData
+                        volumeMounts: .volumeEntries
+                      - path: .spec.initContainerSpecs[*]
+                        name: .id
+                        env: .envData
+                        volumeMounts: .volumeEntries
+            """
+        And The Custom Resource is present
+            """
+            apiVersion: "stable.example.com/v1"
+            kind: NotPodSpec
+            metadata:
+                name: $scenario_id-npc
+            spec:
+                containerSpecs:
+                  - id: $scenario_id
+                    image: scratch
+            """
+        When Service Binding is applied
+            """
+            apiVersion: servicebinding.io/v1beta1
+            kind: ServiceBinding
+            metadata:
+                name: $scenario_id-binding
+            spec:
+                service:
+                    name: $scenario_id-secret
+                    kind: Secret
+                    apiVersion: v1
+                workload:
+                    apiVersion: stable.example.com/v1
+                    kind: NotPodSpec
+                    name: $scenario_id-npc
+            """
+        Then Service Binding is ready
+        And jsonpath "{.spec.containerSpecs[0].volumeEntries}" on "notpodspecs/$scenario_id-npc" should return "[{"mountPath":"/bindings/$scenario_id-binding","name":"$scenario_id-binding"}]"
+        And jsonpath "{.spec.volumeData}" on "notpodspecs/$scenario_id-npc" should return "[{"name":"$scenario_id-binding","secret":{"secretName":"$scenario_id-secret"}}]"
+
+    Scenario: Project a v1beta1 service binding using a v1beta1 workload mapping
+        Given The Secret is present
+            """
+            apiVersion: v1
+            kind: Secret
+            metadata:
+                name: $scenario_id-secret
+            stringData:
+                username: AzureDiamond
+                password: hunter2
+                type:     secret
+            """
+        And The Workload Resource Mapping is present
+            """
+            apiVersion: servicebinding.io/v1beta1
+            kind: ClusterWorkloadResourceMapping
+            metadata:
+                name: notpodspecs.stable.example.com
+            spec:
+                versions:
+                  - version: "*"
+                    volumes: .spec.volumeData
+                    containers:
+                      - path: .spec.containerSpecs[*]
+                        name: .id
+                        env: .envData
+                        volumeMounts: .volumeEntries
+                      - path: .spec.initContainerSpecs[*]
+                        name: .id
+                        env: .envData
+                        volumeMounts: .volumeEntries
+            """
+        And The Custom Resource is present
+            """
+            apiVersion: "stable.example.com/v1"
+            kind: NotPodSpec
+            metadata:
+                name: $scenario_id-npc
+            spec:
+                containerSpecs:
+                  - id: $scenario_id
+                    image: scratch
+            """
+        When Service Binding is applied
+            """
+            apiVersion: servicebinding.io/v1beta1
+            kind: ServiceBinding
+            metadata:
+                name: $scenario_id-binding
+            spec:
+                service:
+                    name: $scenario_id-secret
+                    kind: Secret
+                    apiVersion: v1
+                workload:
+                    apiVersion: stable.example.com/v1
+                    kind: NotPodSpec
+                    name: $scenario_id-npc
+            """
+        Then Service Binding is ready
+        And jsonpath "{.spec.containerSpecs[0].volumeEntries}" on "notpodspecs/$scenario_id-npc" should return "[{"mountPath":"/bindings/$scenario_id-binding","name":"$scenario_id-binding"}]"
+        And jsonpath "{.spec.volumeData}" on "notpodspecs/$scenario_id-npc" should return "[{"name":"$scenario_id-binding","secret":{"secretName":"$scenario_id-secret"}}]"
+
+    Scenario: Project a v1beta1 service binding using a v1beta1 workload mapping
+        Given The Secret is present
+            """
+            apiVersion: v1
+            kind: Secret
+            metadata:
+                name: $scenario_id-secret
+            stringData:
+                username: AzureDiamond
+                password: hunter2
+                type:     secret
+            """
+        And The Workload Resource Mapping is present
+            """
+            apiVersion: servicebinding.io/v1beta1
+            kind: ClusterWorkloadResourceMapping
+            metadata:
+                name: notpodspecs.stable.example.com
+            spec:
+                versions:
+                  - version: "*"
+                    volumes: .spec.volumeData
+                    containers:
+                      - path: .spec.containerSpecs[*]
+                        name: .id
+                        env: .envData
+                        volumeMounts: .volumeEntries
+                      - path: .spec.initContainerSpecs[*]
+                        name: .id
+                        env: .envData
+                        volumeMounts: .volumeEntries
+            """
+        And The Custom Resource is present
+            """
+            apiVersion: "stable.example.com/v1"
+            kind: NotPodSpec
+            metadata:
+                name: $scenario_id-npc
+            spec:
+                containerSpecs:
+                  - id: $scenario_id
+                    image: scratch
+            """
+        When Service Binding is applied
+            """
+            apiVersion: servicebinding.io/v1beta1
+            kind: ServiceBinding
+            metadata:
+                name: $scenario_id-binding
+            spec:
+                service:
+                    name: $scenario_id-secret
+                    kind: Secret
+                    apiVersion: v1
+                workload:
+                    apiVersion: stable.example.com/v1
+                    kind: NotPodSpec
+                    name: $scenario_id-npc
+            """
+        Then Service Binding is ready
+        And jsonpath "{.spec.containerSpecs[0].volumeEntries}" on "notpodspecs/$scenario_id-npc" should return "[{"mountPath":"/bindings/$scenario_id-binding","name":"$scenario_id-binding"}]"
+        And jsonpath "{.spec.volumeData}" on "notpodspecs/$scenario_id-npc" should return "[{"name":"$scenario_id-binding","secret":{"secretName":"$scenario_id-secret"}}]"
+
+    @negative
+    Scenario: Reject invalid v1alpha3 workload resource mapping
+        When Invalid Workload Resource Mapping is applied
+            """
+            apiVersion: servicebinding.io/v1alpha3
+            kind: ClusterWorkloadResourceMapping
+            metadata:
+                name: appconfigs.stable.example.com
+            spec:
+                versions:
+                  - version: "v1"
+                  - version: "v1"
+            """
+        Then Error message is thrown
+
+    @negative
+    Scenario: Reject invalid v1alpha3 service binding
+        Given CustomResourceDefinition backends.stable.example.com is available
+        And The Custom Resource is present
+            """
+            apiVersion: "stable.example.com/v1"
+            kind: Backend
+            metadata:
+                name: $scenario_id-backend
+                annotations:
+                    service.binding/host: path={.spec.host}
+                    service.binding/username: path={.spec.username}
+            spec:
+                host: example.common
+                username: foo
+            """
+        When Invalid Service Binding is applied
+            """
+            apiVersion: servicebinding.io/v1alpha3
+            kind: ServiceBinding
+            metadata:
+                name: $scenario_id-binding
+            spec:
+                workload:
+                  name: $scenario_id
+                  apiVersion: apps/v1
+                  kind: Deployment
+                  selector:
+                    matchLabels:
+                      name: backend-operator
+                service:
+                  apiVersion: stable.example.com/v1
+                  kind: Backend
+                  name: $scenario_id-backend
+            """
+        Then Error message "name and selector MUST NOT be defined in the application reference" is thrown
diff --git a/test/acceptance/features/unbindAppToService.feature b/test/acceptance/features/unbindAppToService.feature
index 0b88f8b3..773575d6 100644
--- a/test/acceptance/features/unbindAppToService.feature
+++ b/test/acceptance/features/unbindAppToService.feature
@@ -214,7 +214,7 @@ Feature: Unbind an application from a service
             """
         * Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
diff --git a/test/acceptance/features/workloadResourceMapping.feature b/test/acceptance/features/workloadResourceMapping.feature
index 9bfdeed5..ff882716 100644
--- a/test/acceptance/features/workloadResourceMapping.feature
+++ b/test/acceptance/features/workloadResourceMapping.feature
@@ -11,7 +11,7 @@ Feature: Bind services to workloads based on workload resource mapping
         And OLM Operator "custom_app" is running
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: notpodspecs.stable.example.com
@@ -103,7 +103,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -155,7 +155,7 @@ Feature: Bind services to workloads based on workload resource mapping
         And Generic test application is running
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: deployments.apps
@@ -214,7 +214,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -255,7 +255,7 @@ Feature: Bind services to workloads based on workload resource mapping
         Given Generic test application is running
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: deployments.apps
@@ -275,29 +275,26 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         And The custom resource is present
             """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
+            apiVersion: v1
+            kind: Secret
             metadata:
-                name: $scenario_id-backend
-                annotations:
-                    service.binding/host: path={.spec.host}
-                    service.binding/username: path={.spec.username}
-            spec:
-                host: example.common
+                name: $scenario_id-secret
+            stringData:
                 username: foo
+                password: bar
+                type: db
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
             spec:
-                type: mysql
                 service:
-                    apiVersion: stable.example.com/v1
-                    kind: Backend
-                    name: $scenario_id-backend
+                    apiVersion: v1
+                    kind: Secret
+                    name: $scenario_id-secret
                 workload:
                     name: $scenario_id
                     apiVersion: apps/v1
@@ -305,17 +302,21 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         Then Service Binding is ready
         And The application env var "SERVICE_BINDING_ROOT" has value "/bindings"
-        And Content of file "/bindings/$scenario_id-binding/host" in application pod is
+        And Content of file "/bindings/$scenario_id-binding/username" in application pod is
+            """
+            foo
+            """
+        And Content of file "/bindings/$scenario_id-binding/password" in application pod is
             """
-            example.common
+            bar
             """
         And Content of file "/bindings/$scenario_id-binding/type" in application pod is
             """
-            mysql
+            db
             """
         And The Workload Resource Mapping is deleted
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: deployments.apps
@@ -347,7 +348,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -391,7 +392,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -444,7 +445,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: notpodspecs.stable.example.com
@@ -467,7 +468,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -501,7 +502,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -525,7 +526,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -545,7 +546,7 @@ Feature: Bind services to workloads based on workload resource mapping
         And jsonpath "{.spec.template.spec.volumes}" on "appconfigs/$scenario_id-appconfig" should return "[{"name":"$scenario_id-binding","secret":{"secretName":"$scenario_id-secret"}}]"
         And The Workload Resource Mapping is deleted
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -588,7 +589,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -641,7 +642,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -653,7 +654,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -700,7 +701,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         And The Workload Resource Mapping is present
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -711,7 +712,7 @@ Feature: Bind services to workloads based on workload resource mapping
             """
         When Service Binding is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ServiceBinding
             metadata:
                 name: $scenario_id-binding
@@ -736,7 +737,7 @@ Feature: Bind services to workloads based on workload resource mapping
     Scenario: Multiple version entries with the same versions may not be specified
         When Invalid Workload Resource Mapping is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -752,7 +753,7 @@ Feature: Bind services to workloads based on workload resource mapping
     Scenario: Invalid fixed jsonpaths may not be set
         When Invalid Workload Resource Mapping is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
@@ -768,7 +769,7 @@ Feature: Bind services to workloads based on workload resource mapping
     Scenario: Required fields must be set
         When Invalid Workload Resource Mapping is applied
             """
-            apiVersion: servicebinding.io/v1alpha3
+            apiVersion: servicebinding.io/v1beta1
             kind: ClusterWorkloadResourceMapping
             metadata:
                 name: appconfigs.stable.example.com
diff --git a/test/charts/service-binding-operator/sbo.yaml b/test/charts/service-binding-operator/sbo.yaml
index cfc6b372..8db1fe4f 100644
--- a/test/charts/service-binding-operator/sbo.yaml
+++ b/test/charts/service-binding-operator/sbo.yaml
@@ -1,4 +1,4 @@
-apiVersion: servicebinding.io/v1alpha3
+apiVersion: servicebinding.io/v1beta1
 kind: ServiceBinding
 metadata:
   name: test-sbo-chart-binding
diff --git a/test/performance/user-workloads/incomplete/sbo-test.with-sbr.user-workloads.yaml b/test/performance/user-workloads/incomplete/sbo-test.with-sbr.user-workloads.yaml
index d2a27b25..cc6828c6 100644
--- a/test/performance/user-workloads/incomplete/sbo-test.with-sbr.user-workloads.yaml
+++ b/test/performance/user-workloads/incomplete/sbo-test.with-sbr.user-workloads.yaml
@@ -76,7 +76,7 @@ objects:
         group: apps
         version: v1
         kind: Deployment
-  - apiVersion: servicebinding.io/v1alpha3
+  - apiVersion: servicebinding.io/v1beta1
     kind: ServiceBinding
     metadata:
       name: service-binding-incomplete
diff --git a/test/performance/user-workloads/invalid/sbo-test.sbr.spec.yaml b/test/performance/user-workloads/invalid/sbo-test.sbr.spec.yaml
index 56802084..136cc9b1 100644
--- a/test/performance/user-workloads/invalid/sbo-test.sbr.spec.yaml
+++ b/test/performance/user-workloads/invalid/sbo-test.sbr.spec.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: servicebinding.io/v1alpha3
+apiVersion: servicebinding.io/v1beta1
 kind: ServiceBinding
 metadata:
   name: service-binding-cron-invalid
diff --git a/test/performance/user-workloads/invalid/sbo-test.with-sbr.user-workloads.yaml b/test/performance/user-workloads/invalid/sbo-test.with-sbr.user-workloads.yaml
index fb0cd211..88675af2 100644
--- a/test/performance/user-workloads/invalid/sbo-test.with-sbr.user-workloads.yaml
+++ b/test/performance/user-workloads/invalid/sbo-test.with-sbr.user-workloads.yaml
@@ -162,7 +162,7 @@ objects:
           - watch
           - update
           - patch
-  - apiVersion: servicebinding.io/v1alpha3
+  - apiVersion: servicebinding.io/v1beta1
     kind: ClusterWorkloadResourceMapping
     metadata:
       name: cronjobs.batch
@@ -173,7 +173,7 @@ objects:
           containers:
             - path: .spec.jobTemplate.spec.template.spec.containers[*]
             - path: .spec.jobTemplate.spec.template.spec.initContainers[*]
-  - apiVersion: servicebinding.io/v1alpha3
+  - apiVersion: servicebinding.io/v1beta1
     kind: ServiceBinding
     metadata:
       name: service-binding-cron-valid
diff --git a/test/performance/user-workloads/invalid/sbo-test.without-sbr.user-workloads.yaml b/test/performance/user-workloads/invalid/sbo-test.without-sbr.user-workloads.yaml
index b8196182..49d7a694 100644
--- a/test/performance/user-workloads/invalid/sbo-test.without-sbr.user-workloads.yaml
+++ b/test/performance/user-workloads/invalid/sbo-test.without-sbr.user-workloads.yaml
@@ -143,7 +143,7 @@ objects:
           - watch
           - update
           - patch
-  - apiVersion: servicebinding.io/v1alpha3
+  - apiVersion: servicebinding.io/v1beta1
     kind: ClusterWorkloadResourceMapping
     metadata:
       name: cronjobs.batch
diff --git a/test/performance/user-workloads/valid/sbo-test.sbr.spec.yaml b/test/performance/user-workloads/valid/sbo-test.sbr.spec.yaml
index fc02e062..76b77e0f 100644
--- a/test/performance/user-workloads/valid/sbo-test.sbr.spec.yaml
+++ b/test/performance/user-workloads/valid/sbo-test.sbr.spec.yaml
@@ -1,5 +1,5 @@
 ---
-apiVersion: servicebinding.io/v1alpha3
+apiVersion: servicebinding.io/v1beta1
 kind: ServiceBinding
 metadata:
   name: service-binding-cron-valid
diff --git a/test/performance/user-workloads/valid/sbo-test.with-sbr.user-workloads.yaml b/test/performance/user-workloads/valid/sbo-test.with-sbr.user-workloads.yaml
index 631612e3..5118a0ff 100644
--- a/test/performance/user-workloads/valid/sbo-test.with-sbr.user-workloads.yaml
+++ b/test/performance/user-workloads/valid/sbo-test.with-sbr.user-workloads.yaml
@@ -62,7 +62,7 @@ objects:
         app: sbo-perf-svc-valid
     spec:
       replicas: 1
-      strategy: 
+      strategy:
         type: RollingUpdate
       selector:
         matchLabels:
@@ -162,7 +162,7 @@ objects:
           - watch
           - update
           - patch
-  - apiVersion: servicebinding.io/v1alpha3
+  - apiVersion: servicebinding.io/v1beta1
     kind: ClusterWorkloadResourceMapping
     metadata:
       name: cronjobs.batch
@@ -173,7 +173,7 @@ objects:
           containers:
             - path: .spec.jobTemplate.spec.template.spec.containers[*]
             - path: .spec.jobTemplate.spec.template.spec.initContainers[*]
-  - apiVersion: servicebinding.io/v1alpha3
+  - apiVersion: servicebinding.io/v1beta1
     kind: ServiceBinding
     metadata:
       name: service-binding-cron-valid
diff --git a/test/performance/user-workloads/valid/sbo-test.without-sbr.user-workloads.yaml b/test/performance/user-workloads/valid/sbo-test.without-sbr.user-workloads.yaml
index 8efe6f70..f052b937 100644
--- a/test/performance/user-workloads/valid/sbo-test.without-sbr.user-workloads.yaml
+++ b/test/performance/user-workloads/valid/sbo-test.without-sbr.user-workloads.yaml
@@ -143,7 +143,7 @@ objects:
           - watch
           - update
           - patch
-  - apiVersion: servicebinding.io/v1alpha3
+  - apiVersion: servicebinding.io/v1beta1
     kind: ClusterWorkloadResourceMapping
     metadata:
       name: cronjobs.batch