Repository: redhat-developer/service-binding-operator
Pull request #618 (2020-08-17 19:12:48)

docs: Update best practices
.. to reflect that this project supports non-operator-backed-services as it was just another Kubernetes resource.

openshift-ci-robot: [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 assign **sbose78**
You can assign the PR to them by writing `/assign @sbose78` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=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":["sbose78"]} -->
openshift-ci-robot: @sbose78: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-unit | 366a68630bf5accea6ddcc0169719983e781a20d | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-unit/1295438453571325952) | `/test 4.5-unit`

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

<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 -->
DhritiShikhar: /lgtm
/approve

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

This pull-request has been approved by: *<a href="https://github.com/redhat-developer/service-binding-operator/pull/618#issuecomment-675297571" title="Approved">DhritiShikhar</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)~~ [DhritiShikhar]

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":[]} -->
openshift-ci-robot: @sbose78: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-unit | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-unit/1295790860788568065) | `/test 4.5-unit`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-unit | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-unit/1295790860788568065) | `/test 4.5-unit`
ci/prow/4.5-lint | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-lint/1295790860788568064) | `/test 4.5-lint`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-unit | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-unit/1295790860788568065) | `/test 4.5-unit`
ci/prow/4.5-lint | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-lint/1295790860788568064) | `/test 4.5-lint`
ci/prow/4.5-acceptance | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1295790860650156032) | `/test 4.5-acceptance`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-unit | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-unit/1295790860788568065) | `/test 4.5-unit`
ci/prow/4.5-lint | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-lint/1295790860788568064) | `/test 4.5-lint`
ci/prow/4.5-acceptance | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1295790860650156032) | `/test 4.5-acceptance`
ci/prow/4.5-e2e | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-e2e/1295790860700487680) | `/test 4.5-e2e`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1295790860650156032) | `/test 4.5-acceptance`
ci/prow/4.5-e2e | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-e2e/1295790860700487680) | `/test 4.5-e2e`
ci/prow/e2e | 268279c3d0745a5c4bc460537c96761f0872c724 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-e2e/1295791754968043520) | `/test e2e`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-e2e | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-e2e/1295790860700487680) | `/test 4.5-e2e`
ci/prow/e2e | 268279c3d0745a5c4bc460537c96761f0872c724 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-e2e/1295791754968043520) | `/test e2e`
ci/prow/4.5-acceptance | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1295805644426711040) | `/test 4.5-acceptance`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-e2e | 2cf29e9a568009a4bf20dd40afb3dbf256f02b42 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-e2e/1295790860700487680) | `/test 4.5-e2e`
ci/prow/4.5-acceptance | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1295805644426711040) | `/test 4.5-acceptance`
ci/prow/e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-e2e/1295805644317659136) | `/test e2e`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1295805644426711040) | `/test 4.5-acceptance`
ci/prow/e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-e2e/1295805644317659136) | `/test e2e`
ci/prow/4.5-e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-e2e/1295805644477042688) | `/test 4.5-e2e`

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

<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 -->
pedjak: /retest
openshift-ci-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1295805644426711040) | `/test 4.5-acceptance`
ci/prow/4.5-e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-e2e/1295805644477042688) | `/test 4.5-e2e`
ci/prow/e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-e2e/1296017768499384320) | `/test e2e`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-e2e/1295805644477042688) | `/test 4.5-e2e`
ci/prow/e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-e2e/1296017768499384320) | `/test e2e`
ci/prow/4.5-acceptance | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1296017768444858368) | `/test 4.5-acceptance`

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

<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-robot: @sbose78: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-e2e/1296017768499384320) | `/test e2e`
ci/prow/4.5-acceptance | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1296017768444858368) | `/test 4.5-acceptance`
ci/prow/4.5-e2e | a8fa3580be69e2ff69822b7a321ea4d0a8c613ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/618/pull-ci-redhat-developer-service-binding-operator-master-4.5-e2e/1296017768532938752) | `/test 4.5-e2e`

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

<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 -->

Patch:
diff --git a/README.md b/README.md
index 6260a5fb..9fed6a61 100644
--- a/README.md
+++ b/README.md
@@ -16,19 +16,19 @@
 
 The goal of the Service Binding Operator is to enable application authors to
 import an application and run it on Kubernetes with services
-such as databases represented as Kubernetes objects inclulding Operator-backed and chart-based backing services, without having to perform manual configuration of secrets,
-configmaps, etc.
+such as databases represented as Kubernetes objects including Operator-backed and chart-based backing services, without having to perform manual configuration of `Secrets`,
+`ConfigMaps`, etc.
 
-In order to make a service bindable, the service provider needs to express
+To make a service bindable, the service provider needs to express
 the information needed by applications to bind with the services. In other words, the service provider must express the
-information that is “interesting” to applications.
+information that's “interesting” to applications.
 
 There are multiple methods for making backing services
-bindable, including the backing service provider providing metadata as 
+bindable, including the backing service provider providing metadata as
 annotations on the resource. Details on the methods for making backing services bindable
-are available in the [Backing Service Provider Best Practices Guide](docs/OperatorBestPractices.md)
+are available in the [Backing Service Provider Best Practices Guide](docs/BackingServiceBestPractices.md)
 
-In order to make an imported application (for example, a NodeJS application)
+To make an imported application (for example, a NodeJS application)
 connect to a backing service (for example, a database):
 
 * The app author (developer) creates a `ServiceBindingRequest` and specifies:
@@ -41,12 +41,12 @@ connect to a backing service (for example, a database):
   * Reads backing service operator CRD annotations to discover the
     binding attributes
   * Creates a binding secret for the backing service, example, an operator-managed database;
-  * Injects environment variables into the applications's `Deployment`, `DeploymentConfig`,
+  * Injects environment variables into the applications' `Deployment`, `DeploymentConfig`,
     `Replicaset`, `KnativeService` or anything that uses a standard PodSpec;
 
 ## Quick Start
 
-Clone the repository and run `make local` in an existing `kube:admin` openshift
+Clone the repository and run `make local` in an existing `kube:admin` OpenShift
 CLI session. Alternatively, install the operator using:
 
 ``` bash
@@ -68,14 +68,13 @@ EOS
 
 The best way to get started with the Service Binding Operator is to see it in action.
 
-We've included a number of examples scenarios for using the operator in this
+A number of example scenarios for using the operator are included in this
 repo. The examples are found in the "/examples" directory. Each of these
 examples illustrates a usage scenario for the operator. Each example also
 includes a README file with step-by-step instructions for how to run the
 example.
 
-We'll add more examples in the future. The following section in this README
-file includes links to the current set of examples.
+The following section in this README file includes links to the current set of examples.
 
 ## Example Scenarios
 
@@ -103,6 +102,6 @@ The Service Binding community meets weekly on Thursdays at 11:15 AM UTC via [Goo
 
 Meeting Agenda is maintained [here](https://github.com/redhat-developer/service-binding-operator/issues?q=is%3Aissue+is%3Aopen+label%3Ameeting)
 
-Please file bug reports on [Github](https://github.com/redhat-developer/service-binding-operator/issues/new). For any other questions, reach out on `service-binding-support@redhat.com`.
+Please file bug reports on [Github](https://github.com/redhat-developer/service-binding-operator/issues/new). For any other questions, reach out on [service-binding-support@redhat.com](https://www.redhat.com/mailman/listinfo/service-binding-support).
 
 
diff --git a/deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml b/deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml
index 6c0dbb8c..11247cb0 100644
--- a/deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml
+++ b/deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml
@@ -39,6 +39,20 @@ spec:
               description: ApplicationSelector is used to identify the application
                 connecting to the backing service operator.
               properties:
+                bindingPath:
+                  description: BindingPath refers to the path in the application workload's
+                    schema where the binding workload would be referenced.
+                  properties:
+                    containersPath:
+                      description: 'ContainersPath defines the path to the corev1.Containers
+                        reference The default location is going to this: "spec.template.spec.containers"'
+                      type: string
+                    secretPath:
+                      description: SecretPath defines the path to a string field where
+                        the secret needs to be assigned. The default name is going
+                        to the value of the name of SBR CR (metadata.name)
+                      type: string
+                  type: object
                 group:
                   type: string
                 labelSelector:
@@ -266,8 +280,8 @@ spec:
           description: ServiceBindingRequestStatus defines the observed state of ServiceBindingRequest
           properties:
             applications:
-              description: ApplicationObjects contains all the application objects
-                filtered by label
+              description: Applications contain all the applications filtered by name
+                or label
               items:
                 description: BoundApplication defines the application workloads to
                   which the binding secret has injected.
diff --git a/docs/OperatorBestPractices.md b/docs/BackingServiceBestPractices.md
similarity index 64%
rename from docs/OperatorBestPractices.md
rename to docs/BackingServiceBestPractices.md
index e297be88..7939c861 100644
--- a/docs/OperatorBestPractices.md
+++ b/docs/BackingServiceBestPractices.md
@@ -1,26 +1,59 @@
-# Operator Best Practices
+# Best Practices for Making a Kubernetes Resource Bindable
 
 ## Introduction
 
 The goals of the Service Binding Operator is to make it easier for
 applications developers to bind applications with needed backing
-services, without having to perform manual configuration of secrets,
-configmaps, etc. and to assist operator providers in promoting and
+services, without having to perform manual configuration of `secrets`,
+`configmaps`, etc. and to assist operator providers in promoting and
 expanding the adoption of their operators.
 
-When a ServiceBindingRequest is created the Service Binding Operator
+When a `ServiceBindingRequest` is created the Service Binding Operator
 collects binding information and shares it with application. The
 Binding Service Operator's controller injects the binding information
-into the application's "DeploymentConfig", "Deployment" or “Replicaset"
-as environment variables via an intermediate Secret called "binding-request".
-The binding also works with Knative services as it works with any "deployment"
-controller which has the podspec defined in the its jsonpath as
+into the application's `DeploymentConfig`, `Deployment` or `Replicaset`
+as environment variables via an intermediate Secret.
+The binding also works with Knative `Services` as it works with any API which has the podspec defined in the its jsonpath as
 "spec.template.spec.containers".
 
 This document provides "best practices" guidelines for the development of
 Operators that manage backing services to be bound together with applications
 by the Service Binding Operator.
 
+## Making a Kubernetes Resource Bindable
+
+In order to make backing service bindable, the Kubernetes resource representing the same needs to be annotated as a means to express what is "interesting" for applications.
+
+Example, in an `Ingress` or `Route` resource representing a backing service, the `host` and `port` among other things would be "interesting" for applications for connecting to the backing service.
+
+To do so, the Kubernetes resource may be annotated to meaningfully convey what is "interesting" for binding.
+
+``` yaml
+kind: Route
+apiVersion: route.openshift.io/v1
+metadata:
+  name: example
+  namespace: service-binding-demo
+  annotations:
+    openshift.io/host.generated: 'true'
+    servicebindingoperator.redhat.io/spec.host: 'binding:env:attribute' #annotate here.
+spec:
+  host: example-sbo.apps.ci-ln-smyggvb-d5d6b.origin-ci-int-aws.dev.rhcloud.com
+  path: /
+  to:
+    kind: Service
+    name: example
+    weight: 100
+  port:
+    targetPort: 80
+  wildcardPolicy: None
+```
+
+## Making a Helm-Chart managed Backing Service Bindable
+
+Resources created from a Helm Chart are treated the same way as any other Kubernetes resource. The Kubernetes resource may be annotated the way in the chart templates to denote what is "interesting" for binding.
+
+
 ## Making an Operator Managed Backing Service Bindable
 
 In order to make a service bindable, the operator provider needs to express
@@ -52,8 +85,9 @@ apiVersion: apiextensions.k8s.io/v1beta1
 metadata:
   name: databases.postgresql.baiju.dev
   annotations:
-    servicebindingoperator.redhat.io/status.dbConfigMap.password: 'binding:env:object:secret'
-    servicebindingoperator.redhat.io/status.dbConfigMap.username: 'binding:env:object:configmap'
+    servicebindingoperator.redhat.io/status.dbConfigMap-host: 'binding:env:object:configmap'
+    servicebindingoperator.redhat.io/status.dbCredentials-password: 'binding:env:object:secret'
+    servicebindingoperator.redhat.io/status.dbCredentials-username: 'binding:env:object:secret'
     servicebindingoperator.redhat.io/status.dbName: 'binding:env:attribute'
     servicebindingoperator.redhat.io/spec.Token.private: 'binding:volumemount:secret'
 spec:
@@ -61,6 +95,20 @@ spec:
   version: v1alpha1
 ```
 
+The following annotation indicates that the key `host` in the `configmap` referenced in `status.dbConfigMap`
+is "interesting" for binding.
+
+```
+servicebindingoperator.redhat.io/status.dbConfigMap-host: 'binding:env:object:configmap'
+```
+
+Similarly, the following annotation indicates that the key `password` in the `secret` referenced in `status.dbCredentials`
+is "interesting" for binding.
+
+```
+servicebindingoperator.redhat.io/status.dbCredentials-password: 'binding:env:object:secret'
+```
+
 ### Operator Providing Metadata in OLM
 
 This feature enables operator providers to specify binding information an
diff --git a/examples/java_postgresql_customvar/README.md b/examples/java_postgresql_customvar/README.md
index aadb27cc..a7da0b0f 100644
--- a/examples/java_postgresql_customvar/README.md
+++ b/examples/java_postgresql_customvar/README.md
@@ -107,6 +107,55 @@ and install a `stable` version.
 
 This makes the `Database` custom resource available, that the application developer will use later.
 
+### Update the Database CRD
+
+Annotations are created to describe the values that should be collected and made available by the Service Binding Request's intermediary secret.
+ 
+
+```
+oc get crd databases.postgresql.baiju.dev -o yaml
+```
+ 
+The database CRD contains the list of annotations:
+
+```
+metadata:
+  annotations:
+    servicebindingoperator.redhat.io/spec.dbName: binding:env:attribute
+    servicebindingoperator.redhat.io/status.dbConfigMap-db.host: binding:env:object:configmap
+    servicebindingoperator.redhat.io/status.dbConfigMap-db.name: binding:env:object:configmap
+    servicebindingoperator.redhat.io/status.dbConfigMap-db.password: binding:env:object:configmap
+    servicebindingoperator.redhat.io/status.dbConfigMap-db.port: binding:env:object:configmap
+    servicebindingoperator.redhat.io/status.dbConfigMap-db.user: binding:env:object:configmap
+    servicebindingoperator.redhat.io/status.dbConnectionIP: binding:env:attribute
+    servicebindingoperator.redhat.io/status.dbConnectionPort: binding:env:attribute
+    servicebindingoperator.redhat.io/status.dbCredentials-password: binding:env:object:secret
+    servicebindingoperator.redhat.io/status.dbCredentials-user: binding:env:object:secret
+    servicebindingoperator.redhat.io/status.dbName: binding:env:attribute
+
+```
+
+We can add more annotations to collect values from different kinds of data structures.  
+
+To edit the CRD run the command:
+
+```
+oc edit crd databases.postgresql.baiju.dev
+```
+
+Add these annotations under `metadata.annotations` along with other annotations.
+
+```
+servicebindingoperator.redhat.io/spec.tags: binding:env:attribute
+servicebindingoperator.redhat.io/spec.userLabels.archive: binding:env:attribute
+servicebindingoperator.redhat.io/spec.secretName: binding:env:attribute
+```
+
+These annotations refer to data which can be either a number, string, boolean, or an object or a slice of arbitrary values. In the case of this example, 
+- `spec.tags` represents a sequence
+- `spec.userLabels` represents a mapping
+- `spec.secretName` represents a sequence of mapping
+
 ### Application Developer
 
 #### Create a namespace called `service-binding-demo`
@@ -165,6 +214,16 @@ spec:
   image: docker.io/postgres
   imageName: postgres
   dbName: db-demo
+  tags:
+          - "centos7-12.3"
+          - "centos7-12.4"
+  userLabels:
+          archive: "false"
+          environment: "demo"   
+  secretName:
+          - primarySecretName: "example-primaryuser"
+            secondarySecretName: "example-secondaryuser"
+          - rootSecretName: "example-secretuser"
 EOS
 ```
 
@@ -194,19 +253,25 @@ spec:
     group: apps
     version: v1
     resource: deployments
-  backingServiceSelector:
-    group: postgresql.baiju.dev
+  backingServiceSelectors:
+  - group: postgresql.baiju.dev
     version: v1alpha1
     kind: Database
     resourceRef: db-demo
     id: postgresDB
   customEnvVar:
-    - name: JDBC_URL
-      value: 'jdbc:postgresql://{{ .postgresDB.status.dbConnectionIP }}:{{ .postgresDB.status.dbConnectionPort }}/{{ .postgresDB.status.dbName }}'
-    - name: DB_USER
-      value: '{{ .postgresDB.status.dbCredentials.user }}'
-    - name: DB_PASSWORD
-      value: '{{ .postgresDB.status.dbCredentials.password }}'
+  - name: JDBC_URL
+    value: 'jdbc:postgresql://{{ .postgresDB.status.dbConnectionIP }}:{{ .postgresDB.status.dbConnectionPort }}/{{ .postgresDB.status.dbName }}'
+  - name: DB_USER
+    value: '{{ .postgresDB.status.dbCredentials.user }}'
+  - name: DB_PASSWORD
+    value: '{{ .postgresDB.status.dbCredentials.password }}'
+  - name: TAGS
+    value: '{{ .postgresDB.spec.tags 0 }}'
+  - name: ARCHIVE_USERLABEL
+    value: '{{ .postgresDB.spec.userLabels.archive }}'
+  - name: SECONDARY_SECRETNAME
+    value: '{{ .postgresDB.spec.secretName }}'
 EOS
 ```
 
@@ -222,9 +287,61 @@ There are 2 parts in the request:
 * `backingServiceSelector` - used to find the backing service - our operator-backed DB instance called `db-demo`.
 
 That causes the application to be re-deployed.
-
 Once the new version is up, go to the application's route to check the UI. Now, it works!
 
+### Check the status of Service Binding Request
+
+`ServiceBindingRequestStatus` depicts the status of the Service Binding operator. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
+
+To check the status of Service Binding Request, run the command:
+
+```
+oc get sbr binding-request -n service-binding-demo -o yaml
+```
+
+Status of Service Binding Request on successful binding:
+
+```yaml
+status:
+  conditions:
+  - lastHeartbeatTime: "2020-08-12T07:05:22Z"
+    lastTransitionTime: "2020-08-12T06:39:13Z"
+    status: "True"
+    type: CollectionReady
+  - lastHeartbeatTime: "2020-08-12T07:05:22Z"
+    lastTransitionTime: "2020-08-12T06:39:13Z"
+    status: "True"
+    type: InjectionReady
+  secret: binding-request
+```
+
+where
+
+* Conditions represent the latest available observations of Service Binding Request's state
+* Secret represents the name of the secret created by the Service Binding Operator
+
+
+Conditions have two types `CollectionReady` and `InjectionReady` 
+
+where
+
+* `CollectionReady` type represents collection of secret from the service
+* `InjectionReady` type represents injection of secret into the application
+
+Conditions can have the following type, status and reason:
+
+| Type            | Status | Reason               | Type           | Status | Reason                   |
+| --------------- | ------ | -------------------- | -------------- | ------ | ------------------------ |
+| CollectionReady | False  | EmptyServiceSelector | InjectionReady | False  |                          |
+| CollectionReady | False  | ServiceNotFound      | InjectionReady | False  |                          |
+| CollectionReady | True   |                      | InjectionReady | False  | EmptyApplicationSelector |
+| CollectionReady | True   |                      | InjectionReady | False  | ApplicationNotFound      |
+| CollectionReady | True   |                      | InjectionReady | True   |                          |
+
+
+
+### Check secret injection into the application deployment
+
 When the `ServiceBindingRequest` was created the Service Binding Operator's controller injected the DB connection information into the application's `Deployment` as environment variables via an intermediate `Secret` called `binding-request`:
 
 ```yaml
@@ -237,12 +354,43 @@ spec:
               name: binding-request
 ```
 
-#### ServiceBindingRequestStatus
+### Check the environment variable creation in the application pod
 
-`ServiceBindingRequestStatus` depicts the status of the Service Binding operator. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
+To list all the pods, run the command:
+
+```
+➜  ~ oc get pods                               
+NAME                                   READY   STATUS      RESTARTS   AGE
+db-demo-postgresql-78b8466897-ht8x9    1/1     Running     0          15m
+java-rest-http-crud-1-build            0/1     Completed   0          51m
+java-rest-http-crud-666b8597cc-w7456   1/1     Running     0          15m
+```
+
+To ssh into the application pod `java-rest-http-crud-666b8597cc-w7456`, run command:
 
-| Field | Description |
-|-------|-------------|
-| Secret | The name of the intermediate secret |
+```
+oc exec -it java-rest-http-crud-666b8597cc-w7456 /bin/bash
+```
+
+Print all the environment variables that were injected into the application pod by Service Binding Operator:
+
+```
+[jboss@java-rest-http-crud-666b8597cc-w7456 ~]$ printenv | grep DATABASE_
+DATABASE_SECRET_USER=postgres
+DATABASE_TAGS_0=centos7-12.3
+DATABASE_TAGS_1=123
+DATABASE_SECRET_PASSWORD=password
+DATABASE_CONFIGMAP_DB_NAME=db-demo
+DATABASE_DBNAME=db-demo
+DATABASE_CONFIGMAP_DB_HOST=172.25.88.63
+DATABASE_DBCONNECTIONPORT=5432
+DATABASE_USERLABELS_ARCHIVE=false
+DATABASE_SECRETNAME_0_PRIMARYSECRETNAME=example-primaryuser
+DATABASE_SECRETNAME_0_SECONDARYSECRETNAME=example-secondaryuser
+DATABASE_SECRETNAME_1_ROOTSECRETNAME=example-secretuser
+DATABASE_CONFIGMAP_DB_PORT=5432
+DATABASE_DBCONNECTIONIP=172.25.88.63
+DATABASE_CONFIGMAP_DB_PASSWORD=password
+```
 
-That's it, folks!
+Notice, distinct environment variables are produced for sibling properties with index number 0 and 1 in the variable name.
diff --git a/examples/java_postgresql_customvar/service-binding-request.yaml b/examples/java_postgresql_customvar/service-binding-request.yaml
index 8344dfaf..0e9d71b7 100644
--- a/examples/java_postgresql_customvar/service-binding-request.yaml
+++ b/examples/java_postgresql_customvar/service-binding-request.yaml
@@ -23,3 +23,9 @@ spec:
       value: '{{ .postgresDB.status.dbCredentials.user }}'
     - name: DB_PASSWORD
       value: '{{ .postgresDB.status.dbCredentials.password }}'
+    - name: TAGS
+      value: '{{ .postgresDB.spec.tags }}'
+    - name: ARCHIVE_USERLABEL
+      value: '{{ .postgresDB.spec.userLabels.archive }}'
+    - name: SECONDARY_SECRETNAME
+      value: '{{ .postgresDB.spec.secretName }}'
diff --git a/examples/pod_spec_path/README.md b/examples/pod_spec_path/README.md
new file mode 100644
index 00000000..8ac54462
--- /dev/null
+++ b/examples/pod_spec_path/README.md
@@ -0,0 +1,154 @@
+# Testing PodSpec path
+
+Based on the note by @qibobo 
+
+Create the application CRD:
+
+```
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  name: appconfigs.stable.example.com
+spec:
+  group: stable.example.com
+  versions:
+    - name: v1
+      served: true
+      storage: true
+  scope: Namespaced
+  names:
+    plural: appconfigs
+    singular: appconfig
+    kind: AppConfig
+    shortNames:
+    - ac
+```
+
+Create the application CR using the CRD:
+
+```
+apiVersion: "stable.example.com/v1"
+kind: AppConfig
+metadata:
+  name: demo-appconfig
+spec:
+  uri: "some uri"
+  Command: "some command"
+  image: my-image
+  spec:
+    containers:
+    - name: hello-world
+      # Image from dockerhub, This is the import path for the Go binary to build and run.
+      image: yusufkaratoprak/kubernetes-gosample:latest
+      ports:
+      - containerPort: 8090
+```
+
+Create the operator source:
+
+```
+apiVersion: operators.coreos.com/v1
+kind: OperatorSource
+metadata:
+  name: db-operators
+  namespace: openshift-marketplace
+spec:
+  type: appregistry
+  endpoint: https://quay.io/cnr
+  registryNamespace: pmacik
+```
+
+Install the Postgres Operator and then create Database CR:
+
+```
+apiVersion: postgresql.baiju.dev/v1alpha1
+kind: Database
+metadata:
+  name: db-demo
+spec:
+  image: docker.io/postgres
+  imageName: postgres
+  dbName: db-demo
+```
+
+Create the SBR with a custom bind path:
+
+```
+apiVersion: apps.openshift.io/v1alpha1
+kind: ServiceBindingRequest
+metadata:
+  name: binding-request-sample
+spec:
+  envVarPrefix: qiye111
+  applicationSelector:
+    resourceRef: demo-appconfig
+    group: stable.example.com
+    version: v1
+    resource: appconfigs 
+    bindingPath:
+      containersPath: spec.spec.containers
+  backingServiceSelectors:
+    group: postgresql.baiju.dev
+    version: v1alpha1
+    kind: Database
+    resourceRef: db-demo
+    id: zzz
+    envVarPrefix: qiye
+```
+
+Check the secret `binding-request-sample` has been injected:
+
+```
+kubectl get appconfigs.stable.example.com -o yaml
+apiVersion: v1
+items:
+- apiVersion: stable.example.com/v1
+  kind: AppConfig
+  metadata:
+    annotations:
+      kubectl.kubernetes.io/last-applied-configuration: |
+        {"apiVersion":"stable.example.com/v1","kind":"AppConfig","metadata":{"annotations":{},"name":"demo-appconfig","namespace":"default"},"spec":{"Command":"some command","image":"my-image","spec":{"containers":[{"image":"yusufkaratoprak/kubernetes-gosample:latest","name":"hello-world","ports":[{"containerPort":8090}]}]},"uri":"some uri"}}
+    creationTimestamp: "2020-04-30T01:07:21Z"
+    generation: 12
+    name: demo-appconfig
+    namespace: default
+    resourceVersion: "4909355"
+    selfLink: /apis/stable.example.com/v1/namespaces/default/appconfigs/demo-appconfig
+    uid: e0175a4c-a442-4b7c-a2c7-de132eb4dd7a
+  spec:
+    Command: some command
+    image: my-image
+    spec:
+      containers:
+      - env:
+        - name: ServiceBindingOperatorChangeTriggerEnvVar
+          value: "2020-05-22T08:08:51Z"
+        envFrom:
+        - secretRef:
+            name: binding-request-sample
+        image: yusufkaratoprak/kubernetes-gosample:latest
+        name: hello-world
+        ports:
+        - containerPort: 8090
+        resources: {}
+    uri: some uri
+kind: List
+metadata:
+  resourceVersion: ""
+  selfLink: ""
+```
+
+Delete the SBR and secret has been removed.
+
+```
+spec:
+      containers:
+      - env:
+        - name: ServiceBindingOperatorChangeTriggerEnvVar
+          value: "2020-05-22T08:08:51Z"
+        image: yusufkaratoprak/kubernetes-gosample:latest
+        name: hello-world
+        ports:
+        - containerPort: 8090
+        resources: {}
+```
diff --git a/hack/deploy-sbo-local.sh b/hack/deploy-sbo-local.sh
index a4fa54bc..3550d045 100755
--- a/hack/deploy-sbo-local.sh
+++ b/hack/deploy-sbo-local.sh
@@ -24,7 +24,7 @@ operator-sdk --verbose run --local --namespace="$OPERATOR_NAMESPACE" --operator-
 
 SBO_PID=$!
 
-attempts=12
+attempts=24
 while [ -z "$(grep 'Starting workers' $SBO_LOCAL_LOG)" ]; do
     if [[ $attempts -ge 0 ]]; then
         sleep 5
diff --git a/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go b/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
index 472c4c7b..6c91f630 100644
--- a/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
+++ b/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
@@ -81,6 +81,32 @@ type ApplicationSelector struct {
 	LabelSelector               *metav1.LabelSelector `json:"labelSelector,omitempty"`
 	metav1.GroupVersionResource `json:",inline"`
 	ResourceRef                 string `json:"resourceRef,omitempty"`
+
+	// BindingPath refers to the paths in the application workload's schema
+	// where the binding workload would be referenced.
+	// If BindingPath is not specified the default path locations is going to
+	// be used.  The default location for ContainersPath is
+	// going to be: "spec.template.spec.containers" and if SecretPath
+	// is not specified, the name of the secret object is not going
+	// to be specified.
+	// +optional
+	BindingPath *BindingPath `json:"bindingPath,omitempty"`
+}
+
+// BindingPath defines the path to the field where the binding would be
+// embedded in the workload
+type BindingPath struct {
+	// ContainersPath defines the path to the corev1.Containers reference
+	// If BindingPath is not specified, the default location is
+	// going to be: "spec.template.spec.containers"
+	// +optional
+	ContainersPath string `json:"containersPath"`
+
+	// SecretPath defines the path to a string field where
+	// the name of the secret object is going to be assigned.
+	// Note: The name of the secret object is same as that of the name of SBR CR (metadata.name)
+	// +optional
+	SecretPath string `json:"secretPath"`
 }
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
diff --git a/pkg/apis/apps/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/apps/v1alpha1/zz_generated.deepcopy.go
index 2ddc6224..0b4a1ac4 100644
--- a/pkg/apis/apps/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/apps/v1alpha1/zz_generated.deepcopy.go
@@ -36,6 +36,11 @@ func (in *ApplicationSelector) DeepCopyInto(out *ApplicationSelector) {
 		(*in).DeepCopyInto(*out)
 	}
 	out.GroupVersionResource = in.GroupVersionResource
+	if in.BindingPath != nil {
+		in, out := &in.BindingPath, &out.BindingPath
+		*out = new(BindingPath)
+		**out = **in
+	}
 	return
 }
 
@@ -81,6 +86,22 @@ func (in *BackingServiceSelector) DeepCopy() *BackingServiceSelector {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *BindingPath) DeepCopyInto(out *BindingPath) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BindingPath.
+func (in *BindingPath) DeepCopy() *BindingPath {
+	if in == nil {
+		return nil
+	}
+	out := new(BindingPath)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *BoundApplication) DeepCopyInto(out *BoundApplication) {
 	*out = *in
diff --git a/pkg/apis/apps/v1alpha1/zz_generated.openapi.go b/pkg/apis/apps/v1alpha1/zz_generated.openapi.go
index af0fab81..62005a22 100644
--- a/pkg/apis/apps/v1alpha1/zz_generated.openapi.go
+++ b/pkg/apis/apps/v1alpha1/zz_generated.openapi.go
@@ -107,7 +107,7 @@ func schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestStatus(ref common.Refere
 					},
 					"applications": {
 						SchemaProps: spec.SchemaProps{
-							Description: "ApplicationObjects contains all the application objects filtered by label",
+							Description: "Applications contain all the applications filtered by name or label",
 							Type:        []string{"array"},
 							Items: &spec.SchemaOrArray{
 								Schema: &spec.Schema{
diff --git a/pkg/controller/servicebindingrequest/binder.go b/pkg/controller/servicebindingrequest/binder.go
index 564b6026..d9153640 100644
--- a/pkg/controller/servicebindingrequest/binder.go
+++ b/pkg/controller/servicebindingrequest/binder.go
@@ -24,13 +24,6 @@ import (
 	knativev1 "knative.dev/serving/pkg/apis/serving/v1"
 )
 
-var (
-	// containersPath logical path to find containers on supported objects
-	containersPath = []string{"spec", "template", "spec", "containers"}
-	// volumesPath logical path to find volumes on supported objects
-	volumesPath = []string{"spec", "template", "spec", "volumes"}
-)
-
 // changeTriggerEnv hijacking environment in order to trigger a change
 const changeTriggerEnv = "ServiceBindingOperatorChangeTriggerEnvVar"
 
@@ -119,9 +112,9 @@ func (b *binder) getApplicationByLabelSelector() (*unstructured.UnstructuredList
 // extractSpecVolumes based on volume path, extract it unstructured. It can return error on trying
 // to find data in informed Unstructured object.
 func (b *binder) extractSpecVolumes(obj *unstructured.Unstructured) ([]interface{}, error) {
-	log := b.logger.WithValues("Volumes.NestedPath", volumesPath)
+	log := b.logger.WithValues("Volumes.NestedPath", b.getVolumesPath())
 	log.Debug("Reading volumes definitions...")
-	volumes, _, err := unstructured.NestedSlice(obj.Object, volumesPath...)
+	volumes, _, err := unstructured.NestedSlice(obj.Object, b.getVolumesPath()...)
 	if err != nil {
 		return nil, err
 	}
@@ -129,22 +122,20 @@ func (b *binder) extractSpecVolumes(obj *unstructured.Unstructured) ([]interface
 }
 
 // updateSpecVolumes execute the inspection and update "volumes" entries in informed spec.
-func (b *binder) updateSpecVolumes(
-	obj *unstructured.Unstructured,
-) (*unstructured.Unstructured, error) {
+func (b *binder) updateSpecVolumes(obj *unstructured.Unstructured) error {
 	volumes, err := b.extractSpecVolumes(obj)
 	if err != nil {
-		return nil, err
+		return err
 	}
 
 	volumes, err = b.updateVolumes(volumes)
 	if err != nil {
-		return nil, err
+		return err
 	}
-	if err = unstructured.SetNestedSlice(obj.Object, volumes, volumesPath...); err != nil {
-		return nil, err
+	if err = unstructured.SetNestedSlice(obj.Object, volumes, b.getVolumesPath()...); err != nil {
+		return err
 	}
-	return obj, nil
+	return nil
 }
 
 // removeSpecVolumes based on extract volume subset, removing volume bind volume entry. It can return
@@ -158,7 +149,7 @@ func (b *binder) removeSpecVolumes(
 		return nil, err
 	}
 	volumes = b.removeVolumes(volumes)
-	if err = unstructured.SetNestedSlice(obj.Object, volumes, volumesPath...); err != nil {
+	if err = unstructured.SetNestedSlice(obj.Object, volumes, b.getVolumesPath()...); err != nil {
 		return nil, err
 	}
 	return obj, nil
@@ -219,55 +210,76 @@ func (b *binder) removeVolumes(volumes []interface{}) []interface{} {
 
 // extractSpecContainers search for
 func (b *binder) extractSpecContainers(obj *unstructured.Unstructured) ([]interface{}, error) {
-	log := b.logger.WithValues("Containers.NestedPath", containersPath)
+	log := b.logger.WithValues("Containers.NestedPath", b.getContainersPath())
 
-	containers, found, err := unstructured.NestedSlice(obj.Object, containersPath...)
+	containers, found, err := unstructured.NestedSlice(obj.Object, b.getContainersPath()...)
 	if err != nil {
 		return nil, err
 	}
 	if !found {
-		err = fmt.Errorf("unable to find '%#v' in object kind '%s'", containersPath, obj.GetKind())
+		err = fmt.Errorf("unable to find '%#v' in object kind '%s'", b.getContainersPath(), obj.GetKind())
 		log.Error(err, "is this definition supported by this operator?")
 		return nil, err
 	}
-
 	return containers, nil
 }
 
+// updateSecretField extract the specific secret field from
+// the object, and triggers an update.
+func (b *binder) updateSecretField(obj *unstructured.Unstructured) error {
+	return unstructured.SetNestedField(obj.Object, b.sbr.GetName(), b.getSecretFieldPath()...)
+}
+
 // updateSpecContainers extract containers from object, and trigger update.
-func (b *binder) updateSpecContainers(
-	obj *unstructured.Unstructured,
-) (*unstructured.Unstructured, error) {
+func (b *binder) updateSpecContainers(obj *unstructured.Unstructured) error {
 	containers, err := b.extractSpecContainers(obj)
 	if err != nil {
-		return nil, err
+		return err
 	}
 	if containers, err = b.updateContainers(containers); err != nil {
-		return nil, err
+		return err
 	}
-	if err = unstructured.SetNestedSlice(obj.Object, containers, containersPath...); err != nil {
-		return nil, err
+	if err = unstructured.SetNestedSlice(obj.Object, containers, b.getContainersPath()...); err != nil {
+		return err
 	}
-	return obj, nil
+	return nil
+}
+
+func getContainersPath(applicationSelector *v1alpha1.ApplicationSelector) []string {
+	return strings.Split(applicationSelector.BindingPath.ContainersPath, ".")
+}
+
+func getSecretFieldPath(applicationSelector *v1alpha1.ApplicationSelector) []string {
+	return strings.Split(applicationSelector.BindingPath.SecretPath, ".")
+}
+
+func (b *binder) getContainersPath() []string {
+	return getContainersPath(&b.sbr.Spec.ApplicationSelector)
+}
+
+func (b *binder) getVolumesPath() []string {
+	return []string{"spec", "template", "spec", "volumes"}
+}
+
+func (b *binder) getSecretFieldPath() []string {
+	return getSecretFieldPath(&b.sbr.Spec.ApplicationSelector)
 }
 
 // removeSpecContainers find and edit containers resource subset, removing bind related entries
 // from the object. It can return error on extracting data, editing steps and final editing of to be
 // returned object.
-func (b *binder) removeSpecContainers(
-	obj *unstructured.Unstructured,
-) (*unstructured.Unstructured, error) {
+func (b *binder) removeSpecContainers(obj *unstructured.Unstructured) error {
 	containers, err := b.extractSpecContainers(obj)
 	if err != nil {
-		return nil, err
+		return err
 	}
 	if containers, err = b.removeContainers(containers); err != nil {
-		return nil, err
+		return err
 	}
-	if err = unstructured.SetNestedSlice(obj.Object, containers, containersPath...); err != nil {
-		return nil, err
+	if err = unstructured.SetNestedSlice(obj.Object, containers, b.getContainersPath()...); err != nil {
+		return err
 	}
-	return obj, nil
+	return nil
 }
 
 // updateContainers execute the update command per container found.
@@ -501,14 +513,23 @@ func (b *binder) update(objs *unstructured.UnstructuredList) ([]*unstructured.Un
 
 		sbrNamespacedName := types.NamespacedName{Namespace: b.sbr.GetNamespace(), Name: b.sbr.GetName()}
 		updatedObj = setSBRAnnotations(sbrNamespacedName, updatedObj)
+		var err error
+		if b.sbr.Spec.ApplicationSelector.BindingPath.SecretPath != "" {
+			err = b.updateSecretField(updatedObj)
+			if err != nil {
+				return nil, err
+			}
+		}
 
-		updatedObj, err := b.updateSpecContainers(updatedObj)
-		if err != nil {
-			return nil, err
+		if b.sbr.Spec.ApplicationSelector.BindingPath.ContainersPath != "" {
+			err = b.updateSpecContainers(updatedObj)
+			if err != nil {
+				return nil, err
+			}
 		}
 
 		if len(b.volumeKeys) > 0 {
-			if updatedObj, err = b.updateSpecVolumes(updatedObj); err != nil {
+			if err = b.updateSpecVolumes(updatedObj); err != nil {
 				return nil, err
 			}
 		}
@@ -519,14 +540,12 @@ func (b *binder) update(objs *unstructured.UnstructuredList) ([]*unstructured.Un
 		} else if specsAreEqual {
 			continue
 		}
-
 		if b.modifier != nil {
 			err = b.modifier.ModifyExtraFields(updatedObj)
 			if err != nil {
 				return nil, err
 			}
 		}
-
 		log.Debug("Updating object...")
 		gk := updatedObj.GroupVersionKind().GroupKind()
 		version := updatedObj.GroupVersionKind().Version
@@ -537,13 +556,11 @@ func (b *binder) update(objs *unstructured.UnstructuredList) ([]*unstructured.Un
 		updated, err := b.dynClient.Resource(mapping.Resource).
 			Namespace(updatedObj.GetNamespace()).
 			Update(updatedObj, metav1.UpdateOptions{})
-
 		if err != nil {
 			return nil, err
 		}
 		updatedObjs = append(updatedObjs, updated)
 	}
-
 	return updatedObjs, nil
 }
 
@@ -553,11 +570,11 @@ func (b *binder) remove(objs *unstructured.UnstructuredList) error {
 		name := obj.GetName()
 		logger := b.logger.WithValues("Obj.Name", name, "Obj.Kind", obj.GetKind())
 		logger.Debug("Inspecting object...")
-		updatedObj, err := b.removeSpecContainers(&obj)
+		err := b.removeSpecContainers(&obj)
 		if err != nil {
 			return err
 		}
-		updatedObj = removeSBRAnnotations(updatedObj)
+		updatedObj := removeSBRAnnotations(&obj)
 
 		if len(b.volumeKeys) > 0 {
 			if updatedObj, err = b.removeSpecVolumes(updatedObj); err != nil {
diff --git a/pkg/controller/servicebindingrequest/servicebinder.go b/pkg/controller/servicebindingrequest/servicebinder.go
index e4e12dc0..0f5aa9e8 100644
--- a/pkg/controller/servicebindingrequest/servicebinder.go
+++ b/pkg/controller/servicebindingrequest/servicebinder.go
@@ -9,6 +9,7 @@ import (
 	"gotest.tools/assert/cmp"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
@@ -29,6 +30,11 @@ const (
 	requeueAfter int64 = 45
 )
 
+// defaultPathToContainers has the logical path logical path
+// to find containers on supported objects
+// Used as []string{"spec", "template", "spec", "containers"}
+const defaultPathToContainers = "spec.template.spec.containers"
+
 // groupVersion represents the service binding request resource's group version.
 var groupVersion = v1alpha1.SchemeGroupVersion.WithResource(serviceBindingRequestResource)
 
@@ -371,6 +377,18 @@ func (b *serviceBinder) setApplicationObjects(
 	sbrStatus.Applications = boundApps
 }
 
+// set default value for application selector
+func ensureDefaults(applicationSelector *v1alpha1.ApplicationSelector) {
+	if applicationSelector.LabelSelector == nil {
+		applicationSelector.LabelSelector = &metav1.LabelSelector{}
+	}
+	if applicationSelector.BindingPath == nil {
+		applicationSelector.BindingPath = &v1alpha1.BindingPath{
+			ContainersPath: defaultPathToContainers,
+		}
+	}
+}
+
 // buildServiceBinder creates a new binding manager according to options.
 func buildServiceBinder(
 	ctx context.Context,
@@ -401,6 +419,8 @@ func buildServiceBinder(
 		options.restMapper,
 	)
 
+	ensureDefaults(&options.sbr.Spec.ApplicationSelector)
+
 	return &serviceBinder{
 		logger:    options.logger,
 		binder:    binder,


Test patch:
diff --git a/pkg/controller/servicebindingrequest/binder_test.go b/pkg/controller/servicebindingrequest/binder_test.go
index f0c98771..b20371da 100644
--- a/pkg/controller/servicebindingrequest/binder_test.go
+++ b/pkg/controller/servicebindingrequest/binder_test.go
@@ -3,8 +3,11 @@ package servicebindingrequest
 import (
 	"context"
 	"fmt"
+	"strings"
 	"testing"
 
+	"github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/test/mocks"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	appsv1 "k8s.io/api/apps/v1"
@@ -19,7 +22,6 @@ import (
 
 	"github.com/redhat-developer/service-binding-operator/pkg/converter"
 	"github.com/redhat-developer/service-binding-operator/pkg/testutils"
-	"github.com/redhat-developer/service-binding-operator/test/mocks"
 )
 
 func init() {
@@ -36,6 +38,53 @@ func getEnvVar(envVars []corev1.EnvVar, name string) *corev1.EnvVar {
 	return nil
 }
 
+func TestBindingCustomSecretPath(t *testing.T) {
+	ns := "custombinder"
+	name := "service-binding-request-custom"
+	matchLabels := map[string]string{
+		"appx": "x",
+	}
+
+	f := mocks.NewFake(t, ns)
+	sbrSecretPath := f.AddMockedServiceBindingRequest(name, &ns, "ref-custom-podspec", "deployment", deploymentsGVR, matchLabels)
+	f.AddMockedUnstructuredDeployment("deployment", matchLabels)
+
+	customSecretPath := "metadata.clusterName"
+	sbrSecretPath.Spec.ApplicationSelector.BindingPath = &v1alpha1.BindingPath{
+		SecretPath: customSecretPath,
+	}
+	binderForsbrSecretPath := newBinder(
+		context.TODO(),
+		f.FakeDynClient(),
+		sbrSecretPath,
+		[]string{},
+		testutils.BuildTestRESTMapper(),
+	)
+	require.NotNil(t, binderForsbrSecretPath)
+
+	t.Run("custom secret field path", func(t *testing.T) {
+		secretPath := binderForsbrSecretPath.getSecretFieldPath()
+		expectedSecretPath := []string{"metadata", "clusterName"}
+		require.Equal(t, expectedSecretPath, secretPath)
+	})
+
+	t.Run("update custom secret field path ", func(t *testing.T) {
+		list, err := binderForsbrSecretPath.search()
+		require.NoError(t, err)
+		require.Len(t, list.Items, 1)
+
+		obj := list.Items[0]
+		err = binderForsbrSecretPath.updateSecretField(&obj)
+		require.NoError(t, err)
+		customSecretPathSlice := strings.Split(customSecretPath, ".")
+
+		customSecretInMeta, found, err := unstructured.NestedFieldCopy(obj.Object, customSecretPathSlice...)
+		require.NoError(t, err)
+		require.True(t, found)
+		require.Equal(t, name, customSecretInMeta)
+	})
+}
+
 func TestBinderNew(t *testing.T) {
 	ns := "binder"
 	name := "service-binding-request"
@@ -43,17 +92,28 @@ func TestBinderNew(t *testing.T) {
 		"connects-to": "database",
 		"environment": "binder",
 	}
+
 	f := mocks.NewFake(t, ns)
 	sbr := f.AddMockedServiceBindingRequest(name, nil, "ref", "", deploymentsGVR, matchLabels)
+	ensureDefaults(&sbr.Spec.ApplicationSelector)
 	f.AddMockedUnstructuredDeployment("ref", matchLabels)
 
+	binder := newBinder(
+		context.TODO(),
+		f.FakeDynClient(),
+		sbr,
+		[]string{},
+		testutils.BuildTestRESTMapper(),
+	)
+	require.NotNil(t, binder)
+
 	sbrWithResourceRef := f.AddMockedServiceBindingRequest(
 		"service-binding-request-with-ref",
 		nil,
 		"ref",
 		"ref",
 		deploymentsGVR,
-		map[string]string{},
+		matchLabels,
 	)
 
 	f.AddMockedUnstructuredSecretRV(name)
@@ -157,7 +217,7 @@ func TestBinderNew(t *testing.T) {
 		require.NoError(t, err)
 		require.Equal(t, types.NamespacedName{Name: name, Namespace: ns}, sbrName)
 
-		containers, found, err := unstructured.NestedSlice(updatedObjects[0].Object, containersPath...)
+		containers, found, err := unstructured.NestedSlice(updatedObjects[0].Object, binder.getContainersPath()...)
 		require.NoError(t, err)
 		require.True(t, found)
 		require.Len(t, containers, 1)
@@ -179,7 +239,6 @@ func TestBinderNew(t *testing.T) {
 		err = runtime.DefaultUnstructuredConverter.FromUnstructured(uSecret.Object, &s)
 		require.NoError(t, err)
 		require.Equal(t, s.ObjectMeta.ResourceVersion, envVar.Value)
-
 	})
 
 	t.Run("update with extra modifier present", func(t *testing.T) {
@@ -236,9 +295,7 @@ func TestBinderNew(t *testing.T) {
 		err = binder.remove(list)
 		require.NoError(t, err)
 
-		list, err = binder.search()
-		require.NoError(t, err)
-		containers, found, err := unstructured.NestedSlice(list.Items[0].Object, containersPath...)
+		containers, found, err := unstructured.NestedSlice(list.Items[0].Object, binder.getContainersPath()...)
 		require.NoError(t, err)
 		require.True(t, found)
 		require.Len(t, containers, 1)
diff --git a/pkg/controller/servicebindingrequest/servicebinder_test.go b/pkg/controller/servicebindingrequest/servicebinder_test.go
index 444d084a..ab140b65 100644
--- a/pkg/controller/servicebindingrequest/servicebinder_test.go
+++ b/pkg/controller/servicebindingrequest/servicebinder_test.go
@@ -8,6 +8,10 @@ import (
 	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
+	"github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/pkg/log"
+	"github.com/redhat-developer/service-binding-operator/pkg/testutils"
+	"github.com/redhat-developer/service-binding-operator/test/mocks"
 	"github.com/stretchr/testify/require"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -15,11 +19,6 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/client-go/dynamic/fake"
 	k8stesting "k8s.io/client-go/testing"
-
-	"github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
-	"github.com/redhat-developer/service-binding-operator/pkg/log"
-	"github.com/redhat-developer/service-binding-operator/pkg/testutils"
-	"github.com/redhat-developer/service-binding-operator/test/mocks"
 )
 
 // objAssertionFunc implements an assertion of given obj in the context of given test t.
@@ -573,3 +572,51 @@ func TestServiceBinder_Bind(t *testing.T) {
 		},
 	}))
 }
+
+func TestEnsureDefaults(t *testing.T) {
+	t.Run("label selector with non nil", func(t *testing.T) {
+		applicationSelector := &v1alpha1.ApplicationSelector{}
+		ensureDefaults(applicationSelector)
+		require.NotNil(t, applicationSelector.LabelSelector)
+	})
+
+	t.Run("empty label selector", func(t *testing.T) {
+		applicationSelector := &v1alpha1.ApplicationSelector{}
+		require.Nil(t, applicationSelector.LabelSelector)
+		ensureDefaults(applicationSelector)
+		require.NotNil(t, applicationSelector.LabelSelector)
+	})
+
+	t.Run("default pod spec path", func(t *testing.T) {
+		applicationSelector := &v1alpha1.ApplicationSelector{}
+		ensureDefaults(applicationSelector)
+		containersPath := getContainersPath(applicationSelector)
+		expectedContainersPath := []string{"spec", "template", "spec", "containers"}
+		require.Equal(t, expectedContainersPath, containersPath)
+	})
+
+	t.Run("container path with value", func(t *testing.T) {
+		applicationSelector := &v1alpha1.ApplicationSelector{}
+		applicationSelector.BindingPath = &v1alpha1.BindingPath{
+			ContainersPath: "spec.some.path",
+		}
+		ensureDefaults(applicationSelector)
+		containersPath := getContainersPath(applicationSelector)
+		expectedContainersPath := []string{"spec", "some", "path"}
+		require.Equal(t, expectedContainersPath, containersPath)
+	})
+	t.Run("container path with secret value", func(t *testing.T) {
+		applicationSelector := &v1alpha1.ApplicationSelector{}
+		applicationSelector.BindingPath = &v1alpha1.BindingPath{
+			SecretPath: "spec.some.path",
+		}
+		ensureDefaults(applicationSelector)
+		containersPath := getContainersPath(applicationSelector)
+		expectedContainersPath := []string{""}
+		require.Equal(t, expectedContainersPath, containersPath)
+		secretPath := getSecretFieldPath(applicationSelector)
+		expectedSecretPath := []string{"spec", "some", "path"}
+		require.Equal(t, expectedSecretPath, secretPath)
+	})
+
+}
diff --git a/test/acceptance/features/bindKnativeService.feature b/test/acceptance/features/bindKnativeService.feature
new file mode 100644
index 00000000..2a982dfb
--- /dev/null
+++ b/test/acceptance/features/bindKnativeService.feature
@@ -0,0 +1,45 @@
+Feature: Bind knative service to a service
+
+  As a user of Service Binding Operator
+  I want to bind knative service to services it depends on
+
+  Background:
+    Given Namespace [TEST_NAMESPACE] is used
+    * Service Binding Operator is running
+    * PostgreSQL DB operator is installed
+
+  Scenario: Bind an imported quarkus app which is deployed as knative service to PostgreSQL database
+    Given Openshift Serverless Operator is running
+    * Knative serving is running
+    * DB "db-demo-knative" is running
+    * Quarkus application "knative-app" is imported as Knative service
+    When Service Binding Request is applied to connect the database and the application
+      """
+            apiVersion: apps.openshift.io/v1alpha1
+            kind: ServiceBindingRequest
+            metadata:
+              name: binding-request-knative
+            spec:
+              applicationSelector:
+                group: serving.knative.dev
+                version: v1beta1
+                resource: services
+                resourceRef: knative-app
+              backingServiceSelector:
+                group: postgresql.baiju.dev
+                version: v1alpha1
+                kind: Database
+                resourceRef: db-demo-knative
+                id: knav
+              customEnvVar:
+                - name: JDBC_URL
+                  value: jdbc:postgresql://{{ .knav.status.dbConnectionIP }}:{{ .knav.status.dbConnectionPort }}/{{ .knav.status.dbName }}
+                - name: DB_USER
+                  value: "{{ .knav.status.dbCredentials.user }}"
+                - name: DB_PASSWORD
+                  value: "{{ .knav.status.dbCredentials.password }}"
+      """
+    Then deployment must contain intermediate secret "binding-request-knative"
+    Then application should be connected to the DB "db-demo-knative"
+    And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding Request "binding-request-knative" should be changed to "True"
+    And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding Request "binding-request-knative" should be changed to "True"
\ No newline at end of file
diff --git a/test/acceptance/features/injectSecretAtCustomSchemaPath.feature b/test/acceptance/features/injectSecretAtCustomSchemaPath.feature
new file mode 100644
index 00000000..a3d48cec
--- /dev/null
+++ b/test/acceptance/features/injectSecretAtCustomSchemaPath.feature
@@ -0,0 +1,116 @@
+Feature: Insert service binding to a custom location in application resource
+
+    As a user of Service Binding Operator
+    I want to insert service binding to custom location in application resource.
+    The type of such location needs to be specified (corev1.Containers, corev1.Volumes, secretRef)
+
+    Background:
+        Given Namespace [TEST_NAMESPACE] is used
+        * Service Binding Operator is running
+        * PostgreSQL DB operator is installed
+        * The CRD "appconfigs.stable.example.com" is present
+            """
+            apiVersion: apiextensions.k8s.io/v1beta1
+            kind: CustomResourceDefinition
+            metadata:
+                name: appconfigs.stable.example.com
+            spec:
+                group: stable.example.com
+                versions:
+                  - name: v1
+                    served: true
+                    storage: true
+                scope: Namespaced
+                names:
+                    plural: appconfigs
+                    singular: appconfig
+                    kind: AppConfig
+                    shortNames:
+                    - ac
+            """
+
+    Scenario: Specify container's path in service binding request
+        Given DB "db-demo-csp" is running
+        * The application CR "demo-appconfig-csp" is present
+            """
+            apiVersion: "stable.example.com/v1"
+            kind: AppConfig
+            metadata:
+                name: demo-appconfig-csp
+            spec:
+                uri: "some uri"
+                Command: "some command"
+                image: my-image
+                spec:
+                    containers:
+                    - name: hello-world
+                      # Image from dockerhub, This is the import path for the Go binary to build and run.
+                      image: yusufkaratoprak/kubernetes-gosample:latest
+                      ports:
+                      - containerPort: 8090
+            """
+        When Service Binding Request is applied to connect the database and the application
+            """
+            apiVersion: apps.openshift.io/v1alpha1
+            kind: ServiceBindingRequest
+            metadata:
+                name: binding-request-csp
+            spec:
+                envVarPrefix: qiye111
+                applicationSelector:
+                    resourceRef: demo-appconfig-csp
+                    group: stable.example.com
+                    version: v1
+                    resource: appconfigs
+                    bindingPath:
+                        containersPath: spec.spec.containers
+                backingServiceSelectors:
+                  - group: postgresql.baiju.dev
+                    version: v1alpha1
+                    kind: Database
+                    resourceRef: db-demo-csp
+                    id: zzz
+                    envVarPrefix: qiye
+            """
+        Then Secret "binding-request-csp" has been injected in to CR "demo-appconfig-csp" of kind "AppConfig" at path "{.spec.spec.containers[0].envFrom[0].secretRef.name}"
+        And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding Request "binding-request-csp" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding Request "binding-request-csp" should be changed to "True"
+
+    Scenario: Specify secret's path in service binding request
+        Given DB "db-demo-ssp" is running
+        * The application CR "demo-appconfig-ssp" is present
+            """
+            apiVersion: "stable.example.com/v1"
+            kind: AppConfig
+            metadata:
+                name: demo-appconfig-ssp
+            spec:
+                spec:
+                    secret: some-value
+            """
+        When Service Binding Request is applied to connect the database and the application
+            """
+            apiVersion: apps.openshift.io/v1alpha1
+            kind: ServiceBindingRequest
+            metadata:
+                name: binding-request-ssp
+            spec:
+                envVarPrefix: qiye111
+                applicationSelector:
+                    resourceRef: demo-appconfig-ssp
+                    group: stable.example.com
+                    version: v1
+                    resource: appconfigs
+                    bindingPath:
+                        secretPath: spec.spec.secret
+                backingServiceSelectors:
+                  - group: postgresql.baiju.dev
+                    version: v1alpha1
+                    kind: Database
+                    resourceRef: db-demo-ssp
+                    id: zzz
+                    envVarPrefix: qiye
+            """
+        Then Secret "binding-request-ssp" has been injected in to CR "demo-appconfig-ssp" of kind "AppConfig" at path "{.spec.spec.secret}"
+        And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding Request "binding-request-ssp" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding Request "binding-request-ssp" should be changed to "True"
diff --git a/test/acceptance/features/steps/command.py b/test/acceptance/features/steps/command.py
index 3af3f439..a17c0fc7 100644
--- a/test/acceptance/features/steps/command.py
+++ b/test/acceptance/features/steps/command.py
@@ -13,10 +13,16 @@ class Command(object):
         else:
             self.path = path
 
-        self.setenv("KUBECONFIG", os.getenv("KUBECONFIG"))
-        self.setenv("PATH", os.getenv("PATH"))
+        kubeconfig = os.getenv("KUBECONFIG")
+        assert kubeconfig is not None, "KUBECONFIG needs to be set in the environment"
+        self.setenv("KUBECONFIG", kubeconfig)
+
+        path = os.getenv("PATH")
+        assert path is not None, "PATH needs to be set in the environment"
+        self.setenv("PATH", path)
 
     def setenv(self, key, value):
+        assert key is not None and value is not None, f"Name or value of the environment variable cannot be None: [{key} = {value}]"
         self.env[key] = value
 
     def run(self, cmd, stdin=None):
@@ -34,15 +40,15 @@ class Command(object):
             print('ERROR CODE:', exit_code)
         return output.decode("utf-8"), exit_code
 
-    def run_wait_for_status(self, cmd, status=None, interval=10, timeout=60):
+    def run_wait_for_status(self, cmd, status, interval=20, timeout=180):
+        cmd_output = None
+        exit_code = -1
         start = 0
-        if status is not None:
-            while ((start + interval) <= timeout):
-                cmd_output, exit_code = self.run(cmd)
-                if status in cmd_output:
-                    return True, cmd_output, exit_code
-                time.sleep(interval)
-                start += interval
-
+        while ((start + interval) <= timeout):
+            cmd_output, exit_code = self.run(cmd)
+            if status in cmd_output:
+                return True, cmd_output, exit_code
+            time.sleep(interval)
+            start += interval
         print("ERROR: Time out while waiting for status message.")
-        return False, self.run(cmd)
+        return False, cmd_output, exit_code
diff --git a/test/acceptance/features/steps/knative_serving.py b/test/acceptance/features/steps/knative_serving.py
new file mode 100644
index 00000000..c5d19689
--- /dev/null
+++ b/test/acceptance/features/steps/knative_serving.py
@@ -0,0 +1,39 @@
+import re
+from command import Command
+from openshift import Openshift
+
+
+class KnativeServing():
+
+    openshift = Openshift()
+    cmd = Command()
+
+    name = ""
+    namespace = ""
+
+    def __init__(self, name="knative-serving", namespace="knative-serving"):
+        self.name = name
+        self.namespace = namespace
+        self.knative_serving_yaml_template = '''
+apiVersion: operator.knative.dev/v1alpha1
+kind: KnativeServing
+metadata:
+  name: {name}
+  namespace: {namespace}
+'''
+
+    def is_present(self):
+        cmd = f'oc get ks {self.name} -n {self.namespace}'
+        output, exit_code = self.cmd.run(cmd)
+        if exit_code != 0:
+            print(f"cmd-{cmd} result for getting available knative serving is {output} with the exit code {exit_code}")
+            return False
+        return True
+
+    def create(self):
+        serving_output = self.openshift.oc_apply(self.knative_serving_yaml_template.format(name=self.name, namespace=self.namespace))
+        pattern = f'knativeserving.(serving|operator).knative.dev/{self.namespace}\\screated'
+        if re.search(pattern, serving_output):
+            return True
+        print(f"Pattern {pattern} did not match as creating knative serving yaml output is {serving_output}")
+        return False
diff --git a/test/acceptance/features/steps/namespace.py b/test/acceptance/features/steps/namespace.py
index ec2e3905..2fe019e7 100644
--- a/test/acceptance/features/steps/namespace.py
+++ b/test/acceptance/features/steps/namespace.py
@@ -9,25 +9,26 @@ class Namespace():
         self.cmd = Command()
 
     def create(self):
-        create_namespace_output, exit_code = self.cmd.run("oc new-project {}".format(self.name))
-        if re.search(r'Now using project \"%s\"\son\sserver' % self.name, create_namespace_output) or \
-                re.search(r'.*Already\son\sproject\s\"%s\"\son\sserver.*' % self.name, create_namespace_output):
+        create_namespace_output, exit_code = self.cmd.run(f"oc new-project {self.name}")
+        if re.search(r'Now using project \"%s\"\son\sserver' % self.name, create_namespace_output) is not None or \
+                re.search(r'.*Already\son\sproject\s\"%s\"\son\sserver.*' % self.name, create_namespace_output) is not None:
             return True
-        elif re.search(r'.*project.project.openshift.io\s\"%s\"\salready exists' % self.name, create_namespace_output):
+        elif re.search(r'.*project.project.openshift.io\s\"%s\"\salready exists' % self.name, create_namespace_output) is not None:
             return self.switch_to()
         else:
-            print("Returned a different value {}".format(create_namespace_output))
+            print(f"Unexpected value returned '{create_namespace_output}'")
         return False
 
     def is_present(self):
-        output, exit_code = self.cmd.run('oc get ns {}'.format(self.name))
+        output, exit_code = self.cmd.run(f'oc get ns {self.name}')
         return exit_code == 0
 
     def switch_to(self):
-        create_namespace_output, exit_code = self.cmd.run('oc project {}'.format(self.name))
-        if re.search(r'Now using project \"%s\"\son\sserver' % self.name, create_namespace_output):
+        create_namespace_output, exit_code = self.cmd.run(f'oc project {self.name}')
+        if re.search(r'Now using project \"%s\"\son\sserver' % self.name, create_namespace_output) is not None:
             return True
-        elif re.search(r'.*Already\son\sproject\s\"%s\"\son\sserver.*' % self.name, create_namespace_output):
+        elif re.search(r'.*Already\son\sproject\s\"%s\"\son\sserver.*' % self.name, create_namespace_output) is not None:
             return True
         else:
-            return False
+            print(f"Unexpected namespace creating output: '{create_namespace_output}'")
+        return False
diff --git a/test/acceptance/features/steps/nodejs_application.py b/test/acceptance/features/steps/nodejs_application.py
index 779ee980..bf7b2bd6 100644
--- a/test/acceptance/features/steps/nodejs_application.py
+++ b/test/acceptance/features/steps/nodejs_application.py
@@ -7,12 +7,11 @@ import time
 
 class NodeJSApp(object):
 
-    nodejs_app = "https://github.com/pmacik/nodejs-rest-http-crud"
+    nodesj_app_image = "quay.io/pmacik/nodejs-rest-http-crud"
     api_end_point = 'http://{route_url}/api/status/dbNameCM'
     openshift = Openshift()
 
     pod_name_pattern = "{name}.*$(?<!-build)"
-
     name = ""
     namespace = ""
 
@@ -25,7 +24,7 @@ class NodeJSApp(object):
         deployment_flag = False
 
         if wait:
-            pod_name = self.openshift.wait_for_pod(self.get_pod_name_pattern(), self.namespace, timeout=180)
+            pod_name = self.openshift.wait_for_pod(self.get_pod_name_pattern(), self.namespace, timeout=300)
         else:
             pod_name = self.openshift.search_pod_in_namespace(self.get_pod_name_pattern(), self.namespace)
 
@@ -46,30 +45,30 @@ class NodeJSApp(object):
             return False
 
     def install(self):
-        nodejs_app_arg = "nodejs~" + self.nodejs_app
-        cmd = f"oc new-app {nodejs_app_arg} --name {self.name} -n {self.namespace}"
-        (create_new_app_output, exit_code) = self.cmd.run(cmd)
-        if exit_code != 0:
-            return False
-        for pattern in [f'imagestream.image.openshift.io\\s\"{self.name}\"\\screated',
-                        f'deployment.apps\\s\"{self.name}\"\\screated',
-                        f'service\\s\"{self.name}\"\\screated']:
-            if not re.search(pattern, create_new_app_output):
-                return False
-        if not self.openshift.expose_service_route(self.name, self.namespace):
-            print("Unable to expose the service with build config")
-            return False
-        return True
-
-    def get_db_name_from_api(self, interval=5, timeout=20):
+        create_new_app_output, exit_code = self.cmd.run(f"oc new-app --docker-image={self.nodesj_app_image} --name={self.name} -n {self.namespace}")
+        assert exit_code == 0, f"Non-zero exit code ({exit_code}) returned when attempting to create a new app: {create_new_app_output}"
+        assert re.search(f'imagestream.image.openshift.io.*{self.name}.*created',
+                         create_new_app_output) is not None, f"Unable to create imagestream: {create_new_app_output}"
+        assert re.search(f'deployment.apps.*{self.name}.*created',
+                         create_new_app_output) is not None, f"Unable to create deployment: {create_new_app_output}"
+        assert re.search(f'service.*{self.name}.*created',
+                         create_new_app_output) is not None, f"Unable to create service: {create_new_app_output}"
+        assert self.openshift.expose_service_route(self.name, self.namespace) is not None, "Unable to expose service route"
+        return self.is_running(wait=True)
+
+    def get_db_name_from_api(self, wait=False, interval=10, timeout=300):
         route_url = self.openshift.get_route_host(self.name, self.namespace)
         if route_url is None:
             return None
         start = 0
         while ((start + interval) <= timeout):
             db_name = requests.get(url=self.api_end_point.format(route_url=route_url))
-            if db_name.status_code == 200:
-                return db_name.text
+            if wait:
+                if db_name.status_code == 200 and db_name.text != 'N/A':
+                    return db_name.text
+            else:
+                if db_name.status_code == 200:
+                    return db_name.text
             time.sleep(interval)
             start += interval
         return None
@@ -77,24 +76,24 @@ class NodeJSApp(object):
     def get_observed_generation(self):
         return self.openshift.get_resource_info_by_jsonpath("deployment", self.name, self.namespace, "{.status.observedGeneration}")
 
-    def get_running_pod_name(self, interval=5, timeout=60):
+    def get_running_pod_name(self, interval=5, timeout=300):
         start = 0
         while ((start + interval) <= timeout):
             pod_list = self.openshift.get_pod_lst(self.namespace)
             for pod in pod_list.split(" "):
-                if re.fullmatch(self.get_pod_name_pattern(), pod):
+                if re.fullmatch(self.get_pod_name_pattern(), pod) is not None:
                     if self.openshift.get_pod_status(pod, self.namespace) == "Running":
                         return pod
             time.sleep(interval)
             start += interval
         return None
 
-    def get_redeployed_pod_name(self, old_pod_name, interval=5, timeout=60):
+    def get_redeployed_pod_name(self, old_pod_name, interval=5, timeout=300):
         start = 0
         while ((start + interval) <= timeout):
             pod_list = self.openshift.get_pod_lst(self.namespace)
             for pod in pod_list.split(" "):
-                if pod != old_pod_name and re.fullmatch(self.get_pod_name_pattern(), pod):
+                if pod != old_pod_name and re.fullmatch(self.get_pod_name_pattern(), pod) is not None:
                     if self.openshift.get_pod_status(pod, self.namespace) == "Running":
                         return pod
             time.sleep(interval)
@@ -103,3 +102,22 @@ class NodeJSApp(object):
 
     def get_pod_name_pattern(self):
         return self.pod_name_pattern.format(name=self.name)
+
+    def is_redeployed(self, old_generation, interval=5, timeout=300):
+        start = 0
+        while ((start + interval) <= timeout):
+            current_generation = self.get_generation()
+            pod_list = self.openshift.get_pod_lst(self.namespace)
+            for pod in pod_list.split(" "):
+                if (current_generation > old_generation) and (re.fullmatch(self.get_pod_name_pattern(), pod) is not None):
+                    if self.openshift.get_pod_status(pod, self.namespace) == "Running":
+                        return pod
+            time.sleep(interval)
+            start += interval
+        return None
+
+    def get_generation(self):
+        return self.openshift.get_resource_info_by_jsonpath("deployment", self.name, self.namespace, "{.metadata.generation}")
+
+    def format_pattern(self, pattern):
+        return pattern.format(name=self.name)
diff --git a/test/acceptance/features/steps/openshift.py b/test/acceptance/features/steps/openshift.py
index 76b0da3e..5e04f546 100644
--- a/test/acceptance/features/steps/openshift.py
+++ b/test/acceptance/features/steps/openshift.py
@@ -3,8 +3,6 @@ import time
 from pyshould import should
 from command import Command
 
-nodejs_app = "https://github.com/pmacik/nodejs-rest-http-crud"
-
 
 class Openshift(object):
     def __init__(self):
@@ -38,13 +36,61 @@ spec:
     sourceNamespace: openshift-marketplace
     startingCSV: '{csv_version}'
 '''
+        self.image_stream_template = '''
+---
+apiVersion: image.openshift.io/v1
+kind: ImageStream
+metadata:
+    name: {name}
+    namespace: {namespace}
+'''
+        self.build_config_template = '''
+---
+apiVersion: build.openshift.io/v1
+kind: BuildConfig
+metadata:
+  name: {name}
+  namespace: {namespace}
+spec:
+  source:
+    git:
+      ref: master
+      uri: {application_source}
+    type: Git
+  strategy:
+    sourceStrategy:
+      from:
+        kind: ImageStreamTag
+        name: {image_name_with_tag}
+        namespace: openshift
+    type: Source
+  output:
+    to:
+      kind: ImageStreamTag
+      name: {name}:latest
+  triggers:
+    - type: ConfigChange
+'''
+        self.service_template = '''
+---
+apiVersion: serving.knative.dev/v1
+kind: Service
+metadata:
+  name: {name}
+  namespace: {namespace}
+spec:
+  template:
+    spec:
+      containers:
+        - image: {image_repository}
+'''
 
     def get_pod_lst(self, namespace):
         return self.get_resource_lst("pods", namespace)
 
     def get_resource_lst(self, resource_plural, namespace):
-        (output, exit_code) = self.cmd.run(f'oc get {resource_plural} -n {namespace} -o "jsonpath={{.items[*].metadata.name}}"')
-        exit_code | should.be_equal_to(0)
+        output, exit_code = self.cmd.run(f'oc get {resource_plural} -n {namespace} -o "jsonpath={{.items[*].metadata.name}}"')
+        assert exit_code == 0, f"Getting resource list failed as the exit code is not 0 with output - {output}"
         return output
 
     def search_item_in_lst(self, lst, search_pattern):
@@ -148,48 +194,143 @@ spec:
         return re.search(r'.*%s\sexposed' % service_name, output)
 
     def get_route_host(self, name, namespace):
-        (output, exit_code) = self.cmd.run(f'oc get route {name} -n {namespace} -o "jsonpath={{.status.ingress[0].host}}"')
-        exit_code | should.be_equal_to(0)
+        output, exit_code = self.cmd.run(f'oc get route {name} -n {namespace} -o "jsonpath={{.status.ingress[0].host}}"')
+        assert exit_code == 0, f"Getting route host failed as the exit code is not 0 with output - {output}"
         return output
 
-    def check_for_deployment_status(self, deployment_name, namespace, wait_for_status="True"):
-        deployment_status_cmd = f'oc get deployment {deployment_name} -n {namespace} -o "jsonpath={{.status.conditions[*].status}}"'
-        deployment_status, exit_code = self.cmd.run_wait_for_status(deployment_status_cmd, wait_for_status, 5, 300)
-        exit_code | should.be_equal_to(0)
-        return deployment_status
+    def get_deployment_status(self, deployment_name, namespace, wait_for_status=None):
+        deployment_status_cmd = f'oc get deployment {deployment_name} -n {namespace} -o json' \
+            + ' | jq -rc \'.status.conditions[] | select(.type=="Available").status\''
+        output = None
+        exit_code = -1
+        if wait_for_status is not None:
+            status_found, output, exit_code = self.cmd.run_wait_for_status(deployment_status_cmd, wait_for_status, 5, 400)
+            if exit_code == 0:
+                assert status_found is True, f"Deployment {deployment_name} result after waiting for status is {status_found}"
+        else:
+            output, exit_code = self.cmd.run(deployment_status_cmd)
+        assert exit_code == 0, "Getting deployment status failed as the exit code is not 0"
+
+        return output
 
     def get_deployment_env_info(self, name, namespace):
         env_cmd = f'oc get deploy {name} -n {namespace} -o "jsonpath={{.spec.template.spec.containers[0].env}}"'
         env, exit_code = self.cmd.run(env_cmd)
-        exit_code | should.be_equal_to(0)
+        assert exit_code == 0, f"Non-zero exit code ({exit_code}) returned while getting deployment's env: {env}"
         return env
 
     def get_deployment_envFrom_info(self, name, namespace):
         env_from_cmd = f'oc get deploy {name} -n {namespace} -o "jsonpath={{.spec.template.spec.containers[0].envFrom}}"'
         env_from, exit_code = self.cmd.run(env_from_cmd)
-        exit_code | should.be_equal_to(0)
+        assert exit_code == 0, f"Non-zero exit code ({exit_code}) returned while getting deployment's envFrom: {env_from}"
         return env_from
 
-    def get_resource_info_by_jsonpath(self, resource_type, name, namespace, json_path, wait=False):
-        output, exit_code = self.cmd.run(f'oc get {resource_type} {name} -n {namespace} -o "jsonpath={json_path}"')
-        if exit_code != 0:
+    def get_resource_info_by_jsonpath(self, resource_type, name, namespace, json_path, wait=False, interval=5, timeout=120):
+        oc_cmd = f'oc get {resource_type} {name} -n {namespace} -o "jsonpath={json_path}"'
+        output, exit_code = self.cmd.run(oc_cmd)
+        if exit_code != 0 or output == "" or output == "<nil>":
             if wait:
-                attempts = 5
-                while exit_code != 0 and attempts > 0:
-                    output, exit_code = self.cmd.run(f'oc get {resource_type} {name} -n {namespace} -o "jsonpath={json_path}"')
+                attempts = timeout/interval
+                while (exit_code != 0 or output == "" or output == "<nil>") and attempts > 0:
+                    output, exit_code = self.cmd.run(oc_cmd)
                     attempts -= 1
-                    time.sleep(5)
+                    time.sleep(interval)
         exit_code | should.be_equal_to(0).desc(f'Exit code should be 0:\n OUTPUT:\n{output}')
         return output
 
-    def get_resource_info_by_jq(self, resource_type, name, namespace, jq_expression, wait=False):
+    def get_resource_info_by_jq(self, resource_type, name, namespace, jq_expression, wait=False, interval=5, timeout=120):
         output, exit_code = self.cmd.run(f'oc get {resource_type} {name} -n {namespace} -o json | jq -rc \'{jq_expression}\'')
         if exit_code != 0:
             if wait:
-                attempts = 5
+                attempts = timeout/interval
                 while exit_code != 0 and attempts > 0:
                     output, exit_code = self.cmd.run(f'oc get {resource_type} {name} -n {namespace} -o json | jq -rc \'{jq_expression}\'')
                     attempts -= 1
-                    time.sleep(5)
+                    time.sleep(interval)
         exit_code | should.be_equal_to(0).desc(f'Exit code should be 0:\n OUTPUT:\n{output}')
         return output.rstrip("\n")
+
+    def create_image_stream(self, name, registry_namespace):
+        image_stream = self.image_stream_template.format(name=name, namespace=registry_namespace)
+        return self.oc_apply(image_stream)
+
+    def get_docker_image_repository(self, name, namespace):
+        cmd = f'oc get is {name} -n {namespace} -o "jsonpath={{.status.dockerImageRepository}}"'
+        (output, exit_code) = self.cmd.run(cmd)
+        assert exit_code == 0, f"cmd-{cmd} result for getting docker image repository is {output} with exit code-{exit_code} not equal to 0"
+        return output
+
+    def create_build_config(self, name, namespace, application_source, image_name_with_tag):
+        build_config_yaml = self.build_config_template.format(
+            name=name, namespace=namespace, application_source=application_source, image_name_with_tag=image_name_with_tag)
+        return self.oc_apply(build_config_yaml)
+
+    def create_knative_service(self, name, namespace, image):
+        knative_service_yaml = self.service_template.format(name=name, namespace=namespace, image_repository=image)
+        return self.oc_apply(knative_service_yaml)
+
+    def wait_for_build_pod_status(self, build_pod_name, namespace, wait_for_status="Succeeded", timeout=780):
+        cmd = f'oc get pod {build_pod_name} -n {namespace} -o "jsonpath={{.status.phase}}"'
+        status_found, output, exit_status = self.cmd.run_wait_for_status(cmd, wait_for_status, timeout=timeout)
+        return status_found, output
+
+    def get_deployment_name_in_namespace(self, deployment_name_pattern, namespace, wait=False, interval=5, timeout=120):
+        if wait:
+            start = 0
+            while ((start + interval) <= timeout):
+                deployment = self.search_resource_in_namespace("deployment", deployment_name_pattern, namespace)
+                if deployment is not None:
+                    return deployment
+                time.sleep(interval)
+                start += interval
+            return None
+        else:
+            return self.search_resource_in_namespace("deployment", deployment_name_pattern, namespace)
+
+    def get_knative_route_host(self, name, namespace):
+        cmd = f'oc get rt {name} -n {namespace} -o "jsonpath={{.status.url}}"'
+        output, exit_code = self.cmd.run(cmd)
+        assert exit_code == 0, f"cmd-{cmd} result for getting knative route is {output} with exit code not equal to 0"
+        return output
+
+    def get_revisions(self, namespace):
+        return self.get_resource_lst("rev", namespace)
+
+    def get_last_revision_status(self, revision, namespace):
+        cmd = f'oc get rev {revision} -n {namespace} -o "jsonpath={{.status.conditions[*].status}}"'
+        (output, exit_code) = self.cmd.run(cmd)
+        assert exit_code == 0, f"cmd-{cmd} for getting last revision status is {output} with exit code not equal to 0"
+        last_revision_status = output.split(" ")[-1]
+        return last_revision_status
+
+    def get_resource_list_in_namespace(self, resource_plural, name_pattern, namespace):
+        print(f"Searching for {resource_plural} that matches {name_pattern} in {namespace} namespace")
+        lst = self.get_resource_lst(resource_plural, namespace)
+        if len(lst) != 0:
+            print("Resource list is {}".format(lst))
+            return self.get_all_matched_pattern_from_lst(lst, name_pattern)
+        else:
+            print('Resource list is empty under namespace - {}'.format(namespace))
+            return None
+
+    def get_all_matched_pattern_from_lst(self, lst, search_pattern):
+        lst_arr = lst.split(" ")
+        output_arr = []
+        for item in lst_arr:
+            if re.fullmatch(search_pattern, item) is not None:
+                print(f"item matched {item}")
+                output_arr.append(item)
+        if not output_arr:
+            print("Given item not matched from the list of pods")
+            return None
+        else:
+            return output_arr
+
+    def search_resource_lst_in_namespace(self, resource_plural, name_pattern, namespace):
+        print(f"Searching for {resource_plural} that matches {name_pattern} in {namespace} namespace")
+        lst = self.get_resource_list_in_namespace(resource_plural, name_pattern, namespace)
+        if len(lst) != 0:
+            print("Resource list is {}".format(lst))
+            return lst
+        print('Resource list is empty under namespace - {}'.format(namespace))
+        return None
diff --git a/test/acceptance/features/steps/postgres_db.py b/test/acceptance/features/steps/postgres_db.py
index 37118953..c1bf197a 100644
--- a/test/acceptance/features/steps/postgres_db.py
+++ b/test/acceptance/features/steps/postgres_db.py
@@ -48,12 +48,8 @@ spec:
                 return True
         return False
 
-    def get_db_instance_name(self, project):
-        cmd = 'oc get db -n %s -o "jsonpath={.items[*].metadata.name}"' % project
-        return self.cmd.run(cmd)
-
     def get_connection_ip(self):
-        cmd = 'oc get db %s -o "jsonpath={.status.dbConnectionIP}"' % self.db_instance
+        cmd = f'oc get db {self.name} -n {self.namespace} -o jsonpath="{{.status.dbConnectionIP}}"'
         return self.cmd.run(cmd)
 
     def check_pod_status(self, status="Running"):
diff --git a/test/acceptance/features/steps/quarkus_application.py b/test/acceptance/features/steps/quarkus_application.py
new file mode 100644
index 00000000..c1d5df50
--- /dev/null
+++ b/test/acceptance/features/steps/quarkus_application.py
@@ -0,0 +1,140 @@
+from command import Command
+import re
+import time
+import requests
+from openshift import Openshift
+
+
+class QuarkusApplication(object):
+
+    cmd = Command()
+
+    image_name_with_tag = "quay.io/pmacik/using-spring-data-jqa-quarkus:latest"
+    api_end_point = '{route_url}/api/status/dbNameCM'
+    openshift = Openshift()
+
+    name = ""
+    namespace = ""
+    deployment_name_pattern = "{name}-\\w+-deployment"
+
+    def __init__(self, name, namespace):
+        self.name = name
+        self.namespace = namespace
+
+    def install(self):
+        knative_service_output = self.openshift.create_knative_service(self.name, self.namespace, self.image_name_with_tag)
+        output = re.search(r'.*service.serving.knative.dev/%s\s(created|configured|unchanged)' % self.name, knative_service_output)
+        assert output is not None, f"Knative serving is not created as the result is {knative_service_output}"
+        return True
+
+    def get_pod_name_running(self, pod_name_pattern, wait=False):
+        if wait:
+            pod_name = self.openshift.wait_for_pod(self.format_pattern(pod_name_pattern), self.namespace, timeout=500)
+        else:
+            pod_name = self.openshift.search_pod_in_namespace(self.format_pattern(pod_name_pattern), self.namespace)
+        return pod_name
+
+    def is_imported(self):
+        deployment_name = self.openshift.get_deployment_name_in_namespace(
+            self.format_pattern(self.deployment_name_pattern), self.namespace, wait=True, timeout=400)
+        if deployment_name is None:
+            return False
+        else:
+            deployment_status = self.openshift.get_deployment_status(deployment_name, self.namespace, wait_for_status="True")
+            print(f"The deployment {deployment_name} status is {deployment_status}")
+            output_match = re.search(r'True', deployment_status)
+            assert output_match is not None, "Matched deployment status is not True"
+            return True
+
+    def get_db_name_from_api(self, wait=False, interval=5, timeout=300):
+        route_url = self.openshift.get_knative_route_host(self.name, self.namespace)
+        if route_url is None:
+            return None
+        if wait:
+            start = 0
+            while ((start + interval) <= timeout):
+                url = self.api_end_point.format(route_url=route_url)
+                db_name = requests.get(url)
+                if db_name.status_code == 200:
+                    return db_name.text
+                time.sleep(interval)
+                start += interval
+        else:
+            url = self.api_end_point.format(route_url=route_url)
+            db_name = requests.get(url)
+            if db_name.status_code == 200:
+                return db_name.text
+        return None
+
+    def get_observed_generation(self):
+        deployment_name = self.openshift.get_deployment_name_in_namespace(self.format_pattern(self.deployment_name_pattern), self.namespace)
+        return self.openshift.get_resource_info_by_jsonpath("deployment", deployment_name, self.namespace, "{.status.observedGeneration}")
+
+    def format_pattern(self, pattern):
+        return pattern.format(name=self.name)
+
+    def get_redeployed_rev_name(self, old_rev_name, interval=5, timeout=300):
+        start = 0
+        while ((start + interval) <= timeout):
+            revisions = self.openshift.get_revisions(self.namespace)
+            for rev in revisions.split(" "):
+                if rev != old_rev_name and re.match(self.name, rev) is not None:
+                    new_revision = self.openshift.get_last_revision_status(rev, self.namespace)
+                    if new_revision == 'True':
+                        return rev
+            time.sleep(interval)
+            start += interval
+        return None
+
+    def get_rev_name_redeployed_by_generation(self, old_generation, interval=5, timeout=300):
+        start = 0
+        while ((start + interval) <= timeout):
+            current_generation = self.get_generation()
+            revisions = self.openshift.get_revisions(self.namespace)
+            for rev in revisions.split(" "):
+                if (current_generation > old_generation) and (re.match(self.name, rev) is not None):
+                    new_revision = self.openshift.get_last_revision_status(rev, self.namespace)
+                    if new_revision == 'True':
+                        return rev
+            time.sleep(interval)
+            start += interval
+        return None
+
+    def get_generation(self):
+        deployment_name = self.openshift.get_deployment_name_in_namespace(self.format_pattern(self.deployment_name_pattern), self.namespace)
+        return self.openshift.get_resource_info_by_jsonpath("deployment", deployment_name, self.namespace, "{.metadata.generation}")
+
+    def get_deployment_names(self):
+        return self.openshift.search_resource_lst_in_namespace("deployment", self.format_pattern(self.deployment_name_pattern), self.namespace)
+
+    def get_deployment_with_intermediate_secret(self, intermediate_secret_name, wait=False, interval=5, timeout=300):
+        expected_secretRef_1 = f'[{{"secretRef":{{"name":"{intermediate_secret_name}"}}}}]'
+        expected_secretRef_2 = f'[map[secretRef:map[name:{intermediate_secret_name}]]]'
+        deployment_name_pattern = self.format_pattern(self.deployment_name_pattern)
+        if wait:
+            start = 0
+            while ((start + interval) <= timeout):
+                deployment_list = self.get_deployment_names()
+                if deployment_list is not None:
+                    for deployment in deployment_list:
+                        result = self.openshift.get_deployment_envFrom_info(deployment, self.namespace)
+                        if result == expected_secretRef_1 or result == expected_secretRef_2:
+                            return deployment
+                        else:
+                            print(f"\nUnexpected deployment's envFrom info: \nExpected: {expected_secretRef_1} or {expected_secretRef_2} \nbut was: {result}\n")
+                else:
+                    print(f"No deployment that matches {deployment_name_pattern} found.\n")
+                time.sleep(interval)
+                start += interval
+        else:
+            deployment_list = self.get_deployment_names()
+            if deployment_list is not None:
+                for deployment in deployment_list:
+                    result = self.openshift.get_deployment_envFrom_info(deployment, self.namespace)
+                    if result == expected_secretRef_1 or result == expected_secretRef_2:
+                        return deployment
+                    else:
+                        print(f"\nUnexpected deployment's envFrom info: \nExpected: {expected_secretRef_1} or {expected_secretRef_2} \nbut was: {result}\n")
+            else:
+                print(f"No deployment that matches {deployment_name_pattern} found.\n")
+        return None
diff --git a/test/acceptance/features/steps/quarkus_s2i_builder_image.py b/test/acceptance/features/steps/quarkus_s2i_builder_image.py
new file mode 100644
index 00000000..a83d5f94
--- /dev/null
+++ b/test/acceptance/features/steps/quarkus_s2i_builder_image.py
@@ -0,0 +1,53 @@
+from command import Command
+import re
+from openshift import Openshift
+
+
+class QuarkusS2IBuilderImage(object):
+
+    tag = "19.1.1"
+    namespace = "openshift"
+    image = ""
+
+    openshift = Openshift()
+
+    def __init__(self, image="ubi-quarkus-native-s2i"):
+        self.cmd = Command()
+        self.image = image
+
+    def is_present(self):
+        get_name_output = self.get_name()
+        if (get_name_output is not None):
+            pattern = f'.*{self.image}:{self.tag}'
+            if re.search(pattern, get_name_output) is not None:
+                return True
+        return False
+
+    def get_name(self):
+        output, exit_code = self.cmd.run(
+            f'oc get is {self.image} -n {self.namespace} -o json | jq -rc \'.spec.tags[] | select(.annotations.tags == "builder").from.name\'')
+        if self.image in output:
+            if re.search("not found", output):
+                return None
+            else:
+                return output.rstrip('\n')
+        return None
+
+    def import_and_patch(self):
+        cmd_import = f"oc import-image quay.io/quarkus/{self.image}:{self.tag} -n {self.namespace} --confirm"
+        print(f'===> Import CMD: {cmd_import}')
+        (import_output, exit_code) = self.cmd.run(cmd_import)
+        if exit_code != 0:
+            return False
+        if re.search(f'.*{self.image}\\simported', import_output) is None:
+            return False
+        spec = '{"spec": {"tags": [{"name" : \"%s\", "annotations": {"tags": "builder"}}]}}' % self.tag
+        cmd_patch = f'oc patch is {self.image} -n {self.namespace} -p \'{spec}\''
+        print(f'===> Patch CMD: {cmd_patch}')
+        (patch_output, exit_code) = self.cmd.run(cmd_patch)
+        if exit_code != 0:
+            print(f"Result for patching image stream is {patch_output} with the exit code {exit_code}")
+            return False
+        if re.search(f'.*{self.image}\\spatched', patch_output) is None:
+            return False
+        return True
diff --git a/test/acceptance/features/steps/serverless_operator.py b/test/acceptance/features/steps/serverless_operator.py
new file mode 100644
index 00000000..70bb457b
--- /dev/null
+++ b/test/acceptance/features/steps/serverless_operator.py
@@ -0,0 +1,39 @@
+import re
+
+from command import Command
+from openshift import Openshift
+
+
+class ServerlessOperator():
+
+    openshift = Openshift()
+    cmd = Command()
+
+    pod_name_pattern = "{name}.*"
+
+    name = ""
+    namespace = ""
+    operator_catalog_source_name = "redhat-operators"
+    operator_catalog_channel = "4.5"
+
+    def __init__(self, name="serverless-operator", namespace="openshift-operators"):
+        self.name = name
+        self.namespace = namespace
+
+    def is_running(self, wait=False, name="knative-serving-operator"):
+        if wait:
+            pod_name = self.openshift.wait_for_pod(self.pod_name_pattern.format(name=name), self.namespace)
+        else:
+            pod_name = self.openshift.search_pod_in_namespace(self.pod_name_pattern.format(name=name), self.namespace)
+        if pod_name is not None:
+            operator_pod_status = self.openshift.check_pod_status(pod_name, self.namespace)
+            print("The pod {} is running: {}".format(name, operator_pod_status))
+            return operator_pod_status
+        else:
+            return False
+
+    def install_operator_subscription(self):
+        install_sub_output = self.openshift.create_operator_subscription(self.name, self.operator_catalog_source_name, self.operator_catalog_channel)
+        if re.search(r'.*subscription.operators.coreos.com/%s\s(unchanged|created)' % self.name, install_sub_output) is not None:
+            return True
+        return False
diff --git a/test/acceptance/features/steps/service_binding_request.py b/test/acceptance/features/steps/service_binding_request.py
index 4cb32f2a..1715b5d9 100644
--- a/test/acceptance/features/steps/service_binding_request.py
+++ b/test/acceptance/features/steps/service_binding_request.py
@@ -4,7 +4,6 @@ from openshift import Openshift
 
 
 class ServiceBindingRequest(object):
-
     openshift = Openshift()
 
     def create(self, yaml):
diff --git a/test/acceptance/features/steps/steps.py b/test/acceptance/features/steps/steps.py
index d7adfaa9..d5bde495 100644
--- a/test/acceptance/features/steps/steps.py
+++ b/test/acceptance/features/steps/steps.py
@@ -15,6 +15,10 @@ from postgres_db import PostgresDB
 from namespace import Namespace
 from nodejs_application import NodeJSApp
 from service_binding_request import ServiceBindingRequest
+from serverless_operator import ServerlessOperator
+from quarkus_application import QuarkusApplication
+from quarkus_s2i_builder_image import QuarkusS2IBuilderImage
+from knative_serving import KnativeServing
 import time
 
 
@@ -32,8 +36,8 @@ def given_namespace_is_used(context, namespace_name):
 # STEP
 @given(u'Namespace [{namespace_env}] is used')
 def given_namespace_from_env_is_used(context, namespace_env):
-    env = os.getenv(namespace_env, "")
-    env | should_not.be_none.desc(f"{namespace_env} env variable is set")
+    env = os.getenv(namespace_env)
+    assert env is not None, f"{namespace_env} environment variable needs to be set"
     print(f"{namespace_env} = {env}")
     given_namespace_is_used(context, env)
 
@@ -60,8 +64,8 @@ sbo_is_running_in_namespace_from_env_step = u'Service Binding Operator is runnin
 @given(sbo_is_running_in_namespace_from_env_step)
 @when(sbo_is_running_in_namespace_from_env_step)
 def sbo_is_running_in_namespace_from_env(context, operator_namespace_env):
-    env = os.getenv(operator_namespace_env, "")
-    env | should_not.be_none.desc(f"{operator_namespace_env} env variable is set")
+    env = os.getenv(operator_namespace_env)
+    assert env is not None, f"{operator_namespace_env} environment variable needs to be set"
     print(f"{operator_namespace_env} = {env}")
     sbo_is_running_in_namespace(context, env)
 
@@ -104,9 +108,8 @@ def imported_nodejs_app_is_running(context, application_name):
         application.is_running(wait=True) | should.be_truthy.desc("Application is running")
     print("Nodejs application is running!!!")
     application.get_db_name_from_api() | should_not.be_none
-    context.nodejs_app_original_generation = application.get_observed_generation()
-    context.nodejs_app_original_pod_name = application.get_running_pod_name()
-    context.nodejs_app = application
+    context.application = application
+    context.application_type = "nodejs"
 
 
 # STEP
@@ -118,7 +121,7 @@ imported_nodejs_app_is_not_running_step = u'Imported Nodejs application "{applic
 def imported_nodejs_app_is_not_running(context, application_name):
     namespace = context.namespace
     application = NodeJSApp(application_name, namespace.name)
-    application.is_running() | should.be_falsy.desc("Aplication not running")
+    assert application.is_running() is False, "Application is running already"
 
 
 # STEP
@@ -146,26 +149,38 @@ sbr_is_applied_step = u'Service Binding Request is applied to connect the databa
 def sbr_is_applied(context):
     sbr_yaml = context.text
     sbr = ServiceBindingRequest()
-    if context.__contains__("nodejs_app"):
-        application = context.nodejs_app
-        context.nodejs_app_original_generation = application.get_observed_generation()
-        context.nodejs_app_original_pod_name = application.get_running_pod_name()
-    sbr.create(sbr_yaml) | should.be_truthy.desc("Service Binding Request Created")
+    if context.__contains__("application") and context.__contains__("application_type"):
+        application = context.application
+        if context.application_type == "nodejs":
+            context.application_original_generation = application.get_observed_generation()
+            context.application_original_pod_name = application.get_running_pod_name()
+        elif context.application_type == "knative":
+            context.application_original_generation = context.application.get_generation()
+        else:
+            assert False, f"Invalid application type in context.application_type={context.application_type}, valid are 'nodejs', 'knative'"
+    assert sbr.create(sbr_yaml) is not None, "Service binding request not created"
 
 
 # STEP
 @then(u'application should be re-deployed')
 def then_application_redeployed(context):
-    application = context.nodejs_app
-    application.get_redeployed_pod_name(context.nodejs_app_original_pod_name) | should_not.be_none.desc(
-        "There is a running pod of the application different from the original one before redeployment.")
+    application = context.application
+    if context.application_type == "nodejs":
+        application_pod_name = application.get_redeployed_pod_name(context.application_original_pod_name)
+        assert application_pod_name is not None, "There is no running application pod different from the original one before re-deployment."
+    elif context.application_type == "knative":
+        assert context.application_original_generation is not None, "application is never deployed"
+        application_rev_name = application.get_rev_name_redeployed_by_generation(context.application_original_generation)
+        assert application_rev_name is not None, "application is not redeployed"
+    else:
+        assert False, f"Invalid application type in context.application_type={context.application_type}, valid are 'nodejs', 'knative'"
 
 
 # STEP
 @then(u'application should be connected to the DB "{db_name}"')
 def then_app_is_connected_to_db(context, db_name):
-    application = context.nodejs_app
-    app_db_name = application.get_db_name_from_api()
+    application = context.application
+    app_db_name = application.get_db_name_from_api(wait=True)
     app_db_name | should.be_equal_to(db_name)
 
 
@@ -174,7 +189,7 @@ def then_app_is_connected_to_db(context, db_name):
 def then_sbo_jsonpath_is(context, json_path, sbr_name, json_value_regex):
     openshift = Openshift()
     openshift.search_resource_in_namespace("servicebindingrequests", sbr_name, context.namespace.name) | should_not.be_none.desc("SBR {sbr_name} exists")
-    result = openshift.get_resource_info_by_jsonpath("sbr", sbr_name, context.namespace.name, json_path, wait=True)
+    result = openshift.get_resource_info_by_jsonpath("sbr", sbr_name, context.namespace.name, json_path, wait=True, timeout=600)
     result | should_not.be_none.desc("jsonpath result")
     re.fullmatch(json_value_regex, result) | should_not.be_none.desc("SBO jsonpath result \"{result}\" should match \"{json_value_regex}\"")
 
@@ -184,11 +199,68 @@ def then_sbo_jsonpath_is(context, json_path, sbr_name, json_value_regex):
 def then_sbo_jq_is(context, jq_expression, sbr_name, json_value_regex):
     openshift = Openshift()
     openshift.search_resource_in_namespace("servicebindingrequests", sbr_name, context.namespace.name) | should_not.be_none.desc("SBR {sbr_name} exists")
-    result = openshift.get_resource_info_by_jq("sbr", sbr_name, context.namespace.name, jq_expression, wait=True)
+    result = openshift.get_resource_info_by_jq("sbr", sbr_name, context.namespace.name, jq_expression, wait=True, timeout=600)
     result | should_not.be_none.desc("jq result")
     re.fullmatch(json_value_regex, result) | should_not.be_none.desc("SBO jq result \"{result}\" should match \"{json_value_regex}\"")
 
 
+@given(u'Openshift Serverless Operator is running')
+def given_serverless_operator_is_running(context):
+    """
+    Checks if the serverless operator is up and running
+    """
+    serverless_operator = ServerlessOperator()
+    if not serverless_operator.is_running():
+        print("Serverless operator is not installed, installing...")
+        assert serverless_operator.install_operator_subscription() is True, "serverless operator subscription is not installed"
+        assert serverless_operator.is_running(wait=True) is True, "serverless operator not installed"
+    context.serverless_operator = serverless_operator
+
+
+@given(u'Quarkus s2i builder image is present')
+def given_quarkus_builder_image_is_present(context):
+    """
+    Checks if quarkus s2i builder image is present
+    """
+    builder_image = QuarkusS2IBuilderImage()
+    if not builder_image.is_present():
+        print("Builder image is not present, importing and patching...")
+        assert builder_image.import_and_patch() is True, "Quarkus image import from image registry and patch failed"
+        assert builder_image.is_present() is True, "Quarkus image is not present"
+
+
+@given(u'Knative serving is running')
+def given_knative_serving_is_running(context):
+    """
+    creates a KnativeServing object to install Knative Serving using the OpenShift Serverless Operator.
+    """
+    knative_namespace = Namespace("knative-serving")
+    assert knative_namespace.create() is True, "Knative serving namespace not created"
+    assert Namespace(context.namespace.name).switch_to() is True, "Unable to switch to the context namespace"
+    knative_serving = KnativeServing(namespace=knative_namespace.name)
+    if not knative_serving.is_present():
+        print("knative serving is not present, create knative serving")
+        assert knative_serving.create() is True, "Knative serving is not created"
+        assert knative_serving.is_present() is True, "Knative serving is not present"
+
+
+# STEP
+quarkus_app_is_imported_step = u'Quarkus application "{application_name}" is imported as Knative service'
+
+
+@given(quarkus_app_is_imported_step)
+@when(quarkus_app_is_imported_step)
+def quarkus_app_is_imported_as_knative_service(context, application_name):
+    namespace = context.namespace
+    application = QuarkusApplication(application_name, namespace.name)
+    if not application.is_imported():
+        print("application is not imported, trying to import it")
+        assert application.install() is True, "Quarkus application is not installed"
+        assert application.is_imported() is True, "Quarkus application is not imported"
+    context.application = application
+    context.application_type = "knative"
+
+
 # STEP
 @then(u'"{app_name}" deployment must contain SBR name "{sbr_name1}" and "{sbr_name2}"')
 def then_envFrom_contains(context, app_name, sbr_name1, sbr_name2):
@@ -197,3 +269,37 @@ def then_envFrom_contains(context, app_name, sbr_name1, sbr_name2):
     result = openshift.get_deployment_envFrom_info(app_name, context.namespace.name)
     result | should.be_equal_to("[map[secretRef:map[name:binding-request-1]] map[secretRef:map[name:binding-request-2]]]")\
         .desc(f'{app_name} deployment should contain secretRef: {sbr_name1} and {sbr_name2}')
+
+
+# STEP
+@then(u'deployment must contain intermediate secret "{intermediate_secret_name}"')
+def then_envFrom_contains_intermediate_secret_name(context, intermediate_secret_name):
+    assert context.application.get_deployment_with_intermediate_secret(
+        intermediate_secret_name, wait=True, timeout=120) is not None, f"There is no deployment with intermediate secret {intermediate_secret_name}"
+
+
+@given(u'The CRD "{crd_name}" is present')
+def create_crd(context, crd_name):
+    openshift = Openshift()
+    yaml = context.text
+    output = openshift.oc_apply(yaml)
+    result = re.search(rf'.*customresourcedefinition.apiextensions.k8s.io/{crd_name}.*(created|unchanged)', output)
+    result | should_not.be_none.desc("CRD {crd_name} Created")
+
+
+# STEP
+@given(u'The application CR "{cr_name}" is present')
+def create_cr(context, cr_name):
+    openshift = Openshift()
+    yaml = context.text
+    output = openshift.oc_apply(yaml)
+    result = re.search(rf'.*{cr_name}.*(created|unchanged)', output)
+    result | should_not.be_none.desc("CRD {cr_name} Created")
+
+
+@then(u'Secret "{secret_ref}" has been injected in to CR "{cr_name}" of kind "{crd_name}" at path "{json_path}"')
+def verify_injected_secretRef(context, secret_ref, cr_name, crd_name, json_path):
+    time.sleep(60)
+    openshift = Openshift()
+    result = openshift.get_resource_info_by_jsonpath(crd_name, cr_name, context.namespace.name, json_path, wait=True, timeout=180)
+    result | should.be_equal_to(secret_ref).desc(f'Failed to inject secretRef "{secret_ref}" in "{cr_name}" at path "{json_path}"')
diff --git a/test/e2e/servicebindingrequest_test.go b/test/e2e/servicebindingrequest_test.go
index 734a0e40..f11ecd6c 100644
--- a/test/e2e/servicebindingrequest_test.go
+++ b/test/e2e/servicebindingrequest_test.go
@@ -101,15 +101,19 @@ func TestAddSchemesToFramework(t *testing.T) {
 			ServiceBindingRequest(t, []Step{AppStep, DBStep, SBRStep})
 		})
 		t.Run("scenario-db-sbr-app", func(t *testing.T) {
+			t.Skip("Currently disabled as not supported by SBO")
 			ServiceBindingRequest(t, []Step{DBStep, SBRStep, AppStep})
 		})
 		t.Run("scenario-app-sbr-db", func(t *testing.T) {
+			t.Skip("Currently disabled as not supported by SBO")
 			ServiceBindingRequest(t, []Step{AppStep, SBRStep, DBStep})
 		})
 		t.Run("scenario-sbr-db-app", func(t *testing.T) {
+			t.Skip("Currently disabled as not supported by SBO")
 			ServiceBindingRequest(t, []Step{SBRStep, DBStep, AppStep})
 		})
 		t.Run("scenario-sbr-app-db", func(t *testing.T) {
+			t.Skip("Currently disabled as not supported by SBO")
 			ServiceBindingRequest(t, []Step{SBRStep, AppStep, DBStep})
 		})
 		t.Run("scenario-csv-db-app-sbr", func(t *testing.T) {
diff --git a/test/mocks/mocks.go b/test/mocks/mocks.go
index a16703ff..e292320b 100644
--- a/test/mocks/mocks.go
+++ b/test/mocks/mocks.go
@@ -587,6 +587,10 @@ func DeploymentMock(ns, name string, matchLabels map[string]string) appsv1.Deplo
 			Namespace: ns,
 			Name:      name,
 			Labels:    matchLabels,
+
+			// used by tests to write the binding secret
+			// to an arbitrary path.
+			ClusterName: "clusterNameNotInUse",
 		},
 		Spec: appsv1.DeploymentSpec{
 			Selector: &metav1.LabelSelector{