Repository: redhat-developer/service-binding-operator
Pull request #903 (2021-03-11 14:12:50)

Drop rebinding on Service and workload/application changes
### Motivation:
Improving the stability of the SBO prompted reducing watches which would reduce the load on the API Server.

### Changes:
Watch only SBR resources and drop watches for services and application workloads.
Remove test cases, unit and acceptance, that watches on services and workloads.

### Testing:
Run `make test-acceptance`



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 **avni-sharma** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @avni-sharma` 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:

- **[test/OWNERS](https://github.com/redhat-developer/service-binding-operator/blob/master/test/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":["avni-sharma"]} -->
openshift-ci[bot]: @Avni-Sharma: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 18ab480376cf6af32dd485088f0e07e1f7a94429 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/903/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1370014870753251328) | `/test 4.6-acceptance`

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

<details>

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 18ab480376cf6af32dd485088f0e07e1f7a94429 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/903/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1370014870753251328) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 18ab480376cf6af32dd485088f0e07e1f7a94429 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/903/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1370014870786805760) | `/test 4.7-acceptance`

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

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

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please ask for approval from **avni-sharma** after the PR has been reviewed.

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

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

- **[test/OWNERS](https://github.com/redhat-developer/service-binding-operator/blob/master/test/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":["avni-sharma"]} -->
openshift-ci-robot: @Avni-Sharma: PR needs rebase.

<details>

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 18ab480376cf6af32dd485088f0e07e1f7a94429 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/903/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1370014870753251328) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 0301e2b79286b0d8d8eaab50ef324be0bb0d99fd | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/903/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1372124689593274368) | `/test 4.7-acceptance`

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

<details>

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 0301e2b79286b0d8d8eaab50ef324be0bb0d99fd | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/903/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1372124689593274368) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 0301e2b79286b0d8d8eaab50ef324be0bb0d99fd | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/903/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1372124689559719936) | `/test 4.6-acceptance`

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

<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 -->
codecov[bot]: # [Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/903?src=pr&el=h1) Report
> Merging [#903](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/903?src=pr&el=desc) (ac5d9e7) into [master](https://codecov.io/gh/redhat-developer/service-binding-operator/commit/e98aa2abbad6128f361b2697556bad3730bf51c7?el=desc) (e98aa2a) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/903/graphs/tree.svg?width=650&height=150&src=pr&token=CICBeVWlrC)](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/903?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master     #903   +/-   ##
=======================================
  Coverage   60.28%   60.28%           
=======================================
  Files          26       26           
  Lines        1989     1989           
=======================================
  Hits         1199     1199           
  Misses        597      597           
  Partials      193      193           
```



------

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

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 ask for approval from **avni-sharma** after the PR has been reviewed.

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

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

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

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["avni-sharma"]} -->
openshift-ci[bot]: @Avni-Sharma: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 5dddf45c050493bf3a04a3aa05f68a29adbe056a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/903/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1372960499028725760) | `/test 4.7-acceptance`

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

<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
pmacik: This PR has a pretty impressive impact on performance in a loaded cluster. The memory usage dropped from  up to ~11GiB to up to ~80 MiB (~140x less memory usage) and the resulted CPU usage dropped from up to ~4.5 vCPU to up to ~0.0034 vCPU (~1323,5x less CPU usage):
![image](https://user-images.githubusercontent.com/3263627/111978327-1138d780-8b04-11eb-9dbb-608a2c1edf03.png)
as opposed to what the performance was without this patch:
![image](https://user-images.githubusercontent.com/3263627/111978417-26ae0180-8b04-11eb-831b-dd3b8b88aa2a.png)

pedjak: /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/903#issuecomment-805047344" title="Approved">pedjak</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)~~ [pedjak]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->

Patch:
diff --git a/controllers/common.go b/controllers/common.go
index 303dc42f..62f2cd5d 100644
--- a/controllers/common.go
+++ b/controllers/common.go
@@ -7,11 +7,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 )
 
-const (
-	// clusterServiceVersionKind the name of ClusterServiceVersion kind.
-	clusterServiceVersionKind = "ClusterServiceVersion"
-)
-
 // requeueOnNotFound inspect error, if not-found then returns Requeue, otherwise expose the error.
 func requeueOnNotFound(err error, requeueAfter int64) (reconcile.Result, error) {
 	if errors.IsNotFound(err) {
diff --git a/controllers/mapper.go b/controllers/mapper.go
index 881b9607..5064a3d7 100644
--- a/controllers/mapper.go
+++ b/controllers/mapper.go
@@ -1,8 +1,6 @@
 package controllers
 
 import (
-	"context"
-	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
@@ -26,70 +24,12 @@ type sbrRequestMapper struct {
 	typeLookup K8STypeLookup
 }
 
-var secretGVK = corev1.SchemeGroupVersion.WithKind("Secret")
-
 // isServiceBinding checks whether the given obj is a Service Binding through GVK
 // comparison.
 func isServiceBinding(obj runtime.Object) bool {
 	return obj.GetObjectKind().GroupVersionKind() == v1alpha1.GroupVersionKind
 }
 
-// isSecret checks whether the given obj is a Secret through GVK comparison.
-func isSecret(obj runtime.Object) bool {
-	return obj.GetObjectKind().GroupVersionKind() == secretGVK
-}
-
-// isSBRService checks whether the given obj is a service in given sbr.
-func isSBRService(typeLookup K8STypeLookup, sbr *v1alpha1.ServiceBinding, obj runtime.Object) bool {
-	for _, svc := range sbr.Spec.Services {
-		gvk, err := typeLookup.KindForReferable(&svc)
-		if err != nil {
-			return false
-		}
-		if obj.GetObjectKind().GroupVersionKind() == *gvk {
-			return true
-		}
-	}
-	return false
-}
-
-// isSBRApplication checks whether the given obj is an application in given sbr.
-func isSBRApplication(
-	typeLookup K8STypeLookup,
-	app *v1alpha1.Application,
-	gvk schema.GroupVersionKind,
-	name string,
-) (bool, error) {
-	if app == nil {
-		return false, nil
-	}
-	appGVK, err := typeLookup.KindForReferable(app)
-
-	if err != nil {
-		return false, err
-	}
-
-	isEqual := gvk == *appGVK
-
-	if len(app.Name) > 0 {
-		isEqual = app.Name == name
-	}
-
-	return isEqual, nil
-}
-
-// isSecretOwnedBySBR checks whether the given obj is a secret owned by the given sbr.
-func isSecretOwnedBySBR(obj metav1.Object, sbr *v1alpha1.ServiceBinding) bool {
-	return sbr.GetNamespace() == obj.GetNamespace() && sbr.Status.Secret == obj.GetName()
-}
-
-// convertToSBR attempts to convert the given obj into a Service Binding.
-func convertToSBR(obj map[string]interface{}) (*v1alpha1.ServiceBinding, error) {
-	sbr := &v1alpha1.ServiceBinding{}
-	err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj, sbr)
-	return sbr, err
-}
-
 // convertToNamespacedName returns a NamespacedName with information extracted from given obj.
 func convertToNamespacedName(obj metav1.Object) types.NamespacedName {
 	return types.NamespacedName{
@@ -98,25 +38,6 @@ func convertToNamespacedName(obj metav1.Object) types.NamespacedName {
 	}
 }
 
-// namespacedNameSet is a set of NamespacedNames.
-type namespacedNameSet map[types.NamespacedName]bool
-
-// add adds the given namespaced name n into the set.
-func (t namespacedNameSet) add(n types.NamespacedName) {
-	t[n] = true
-}
-
-func convertToRequests(t namespacedNameSet) []reconcile.Request {
-	toReconcile := make([]reconcile.Request, 0)
-	for n := range t {
-		toReconcile = append(
-			toReconcile,
-			reconcile.Request{NamespacedName: n},
-		)
-	}
-	return toReconcile
-}
-
 // Map execute the mapping of a resource with the requests it would produce. Here we inspect the
 // given object trying to identify if this object is part of a SBR, or a actual SBR resource.
 //
@@ -129,8 +50,6 @@ func (m *sbrRequestMapper) Map(obj handler.MapObject) []reconcile.Request {
 		"Object.Name", obj.Meta.GetName(),
 	)
 
-	namespacedNamesToReconcile := make(namespacedNameSet)
-
 	if isServiceBinding(obj.Object) {
 		requests := []reconcile.Request{
 			{NamespacedName: convertToNamespacedName(obj.Meta)},
@@ -138,65 +57,8 @@ func (m *sbrRequestMapper) Map(obj handler.MapObject) []reconcile.Request {
 		log.Debug("current resource is a SBR", "Requests", requests)
 		return requests
 	}
+	return []reconcile.Request{}
 
-	// note(isutton): The client handles retries on the operator behalf, so only unrecoverable errors
-	// are left.
-	//
-	// please see https://github.com/isutton/service-binding-operator/blob/e17445570bd3889bcf7499142350a3b81463c6be/vendor/k8s.io/client-go/rest/request.go#L723-L812
-	sbrList, err := m.client.Resource(v1alpha1.GroupVersionResource).List(context.TODO(), metav1.ListOptions{})
-	if err != nil {
-		log.Error(err, "listing SBRs")
-		return []reconcile.Request{}
-	}
-
-ITEMS:
-	for _, item := range sbrList.Items {
-		namespacedName := convertToNamespacedName(&item)
-
-		sbr, err := convertToSBR(item.Object)
-		if err != nil {
-			log.Error(err, "converting unstructured to SBR")
-			continue ITEMS
-		}
-
-		if isSecret(obj.Object) && isSecretOwnedBySBR(obj.Meta, sbr) {
-			log.Debug("resource identified as a secret owned by the SBR")
-			namespacedNamesToReconcile.add(namespacedName)
-		} else {
-			log.Trace("resource is not a secret owned by the SBR")
-		}
-
-		if isSBRService(m.typeLookup, sbr, obj.Object) {
-			log.Debug("resource identified as service in SBR", "NamespacedName", namespacedName)
-			namespacedNamesToReconcile.add(namespacedName)
-		} else {
-			log.Trace("resource is not a service declared by the SBR")
-		}
-
-		if ok, err := isSBRApplication(
-			m.typeLookup,
-			sbr.Spec.Application,
-			obj.Object.GetObjectKind().GroupVersionKind(),
-			obj.Meta.GetName(),
-		); err != nil {
-			log.Error(err, "identifying resource as SBR application")
-			continue ITEMS
-		} else if !ok {
-			log.Trace("resource is not an application declared by the SBR")
-			continue ITEMS
-		} else {
-			log.Debug("resource identified as an application in SBR", "NamespacedName", namespacedName)
-			namespacedNamesToReconcile.add(namespacedName)
-		}
-	}
-
-	requests := convertToRequests(namespacedNamesToReconcile)
-	if count := len(requests); count > 0 {
-		log.Debug("found SBRs for resource", "Count", count, "Requests", requests)
-	} else {
-		log.Debug("no SBRs found for resource")
-	}
-	return requests
 }
 
 type Referable interface {
@@ -206,7 +68,6 @@ type Referable interface {
 
 type K8STypeLookup interface {
 	ResourceForReferable(obj Referable) (*schema.GroupVersionResource, error)
-	KindForReferable(obj Referable) (*schema.GroupVersionKind, error)
 	ResourceForKind(gvk schema.GroupVersionKind) (*schema.GroupVersionResource, error)
 	KindForResource(gvr schema.GroupVersionResource) (*schema.GroupVersionKind, error)
 }
@@ -223,18 +84,6 @@ func (r *ServiceBindingReconciler) ResourceForReferable(obj Referable) (*schema.
 	return r.ResourceForKind(*gvk)
 }
 
-func (r *ServiceBindingReconciler) KindForReferable(obj Referable) (*schema.GroupVersionKind, error) {
-	gvk, err := obj.GroupVersionKind()
-	if err == nil {
-		return gvk, nil
-	}
-	gvr, err := obj.GroupVersionResource()
-	if err != nil {
-		return nil, err
-	}
-	return r.KindForResource(*gvr)
-}
-
 func (r *ServiceBindingReconciler) ResourceForKind(gvk schema.GroupVersionKind) (*schema.GroupVersionResource, error) {
 	mapping, err := r.restMapper.RESTMapping(gvk.GroupKind(), gvk.Version)
 	if err != nil {
diff --git a/controllers/olm.go b/controllers/olm.go
index af679ff6..e8ef0592 100644
--- a/controllers/olm.go
+++ b/controllers/olm.go
@@ -13,7 +13,6 @@ import (
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
-	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/dynamic"
 
 	"github.com/redhat-developer/service-binding-operator/pkg/log"
@@ -237,68 +236,6 @@ func buildDescriptorsFromAnnotations(in map[string]string) (
 	return specDescriptors, statusDescriptors, nil
 }
 
-// extractGVKs loop owned objects and extract the GVK information from them.
-func (o *olm) extractGVKs(
-	crdDescriptions []unstructured.Unstructured,
-) ([]schema.GroupVersionKind, error) {
-	log := o.logger
-	gvks := []schema.GroupVersionKind{}
-	err := o.loopCRDDescriptions(crdDescriptions, func(crdDescription *olmv1alpha1.CRDDescription) {
-		log.Debug("Extracting GVK from CRDDescription", "CRDDescription.Name", crdDescription.Name)
-		_, gv := schema.ParseResourceArg(crdDescription.Name)
-		gvks = append(gvks, schema.GroupVersionKind{
-			Group:   gv.Group,
-			Version: crdDescription.Version,
-			Kind:    crdDescription.Kind,
-		})
-	})
-	if err != nil {
-		return []schema.GroupVersionKind{}, err
-	}
-	return gvks, nil
-}
-
-// listCSVOwnedCRDsAsGVKs return the list of owned CRDs from all CSV objects as a list of GVKs.
-func (o *olm) listCSVOwnedCRDsAsGVKs() ([]schema.GroupVersionKind, error) {
-	log := o.logger
-	ownedCRDs, err := o.ListCSVOwnedCRDs()
-	if err != nil {
-		log.Error(err, "on listting CSVs")
-		return nil, err
-	}
-	return o.extractGVKs(ownedCRDs)
-}
-
-// listGVKsFromCSVNamespacedName return the list of owned GVKs for a given CSV namespaced named.
-func (o *olm) listGVKsFromCSVNamespacedName(
-	namespacedName types.NamespacedName,
-) ([]schema.GroupVersionKind, error) {
-	log := o.logger.WithValues("CSV.NamespacedName", namespacedName)
-	log.Debug("Reading CSV to extract GVKs...")
-	gvr := olmv1alpha1.SchemeGroupVersion.WithResource(csvResource)
-	resourceClient := o.client.Resource(gvr).Namespace(namespacedName.Namespace)
-	u, err := resourceClient.Get(context.TODO(), namespacedName.Name, metav1.GetOptions{})
-	if err != nil {
-		// the CSV might have disappeared between discovery and check, so not found is not an error
-		if errors.IsNotFound(err) {
-			return []schema.GroupVersionKind{}, nil
-		}
-		log.Error(err, "on reading CSV object")
-		return []schema.GroupVersionKind{}, err
-	}
-
-	unstructuredCSV := *u
-	csvs := []unstructured.Unstructured{unstructuredCSV}
-
-	ownedCRDs, err := o.extractOwnedCRDs(csvs)
-	if err != nil {
-		log.Error(err, "on extracting owned CRDs")
-		return []schema.GroupVersionKind{}, err
-	}
-
-	return o.extractGVKs(ownedCRDs)
-}
-
 // newOLM instantiate a new OLM.
 func newOLM(client dynamic.Interface, ns string) *olm {
 	return &olm{
diff --git a/controllers/reconciler.go b/controllers/reconciler.go
index 886d4688..24a5bb81 100644
--- a/controllers/reconciler.go
+++ b/controllers/reconciler.go
@@ -3,6 +3,7 @@ package controllers
 import (
 	"context"
 	"errors"
+
 	"github.com/redhat-developer/service-binding-operator/pkg/naming"
 
 	"k8s.io/apimachinery/pkg/api/meta"
@@ -194,32 +195,6 @@ func (r *ServiceBindingReconciler) doReconcile(request reconcile.Request) (recon
 		return noRequeue(err)
 	}
 
-	if sbr.Spec.Application != nil {
-		gvr, err := r.ResourceForReferable(sbr.Spec.Application)
-		if err != nil {
-			logger.Error(err, "Error getting application GVR")
-		} else {
-			err = r.resourceWatcher.AddWatchForGVR(*gvr)
-			if err != nil {
-				logger.Error(err, "Error add watching application GVR")
-			}
-		}
-	}
-
-	if sbr.Spec.Services != nil {
-		for _, service := range sbr.Spec.Services {
-			gvr, err := r.ResourceForReferable(&service)
-			if err != nil {
-				logger.Error(err, "Error getting backing service GVR")
-			}
-
-			err = r.resourceWatcher.AddWatchForGVR(*gvr)
-			if err != nil {
-				logger.Error(err, "Error add watching backing service GVK")
-			}
-		}
-	}
-
 	if sbr.GetDeletionTimestamp() != nil && sbr.GetOwnerReferences() != nil {
 		logger := logger.WithName("Deleting SBR when it has ownerReference")
 		logger.Debug("Removing resource finalizers...")
diff --git a/controllers/sbrcontroller.go b/controllers/sbrcontroller.go
index a851e528..2b3f4362 100644
--- a/controllers/sbrcontroller.go
+++ b/controllers/sbrcontroller.go
@@ -1,14 +1,6 @@
 package controllers
 
 import (
-	"context"
-	"os"
-	"reflect"
-	"strings"
-
-	olmv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
-	"k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
@@ -20,16 +12,9 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/source"
 
 	"github.com/redhat-developer/service-binding-operator/api/v1alpha1"
-	"github.com/redhat-developer/service-binding-operator/pkg/binding"
 	"github.com/redhat-developer/service-binding-operator/pkg/log"
 )
 
-// ResourceWatcher add watching for GroupVersionKind/GroupVersionResource
-type ResourceWatcher interface {
-	AddWatchForGVR(schema.GroupVersionResource) error
-	AddWatchForGVK(schema.GroupVersionKind) error
-}
-
 // sbrController hold the controller instance and methods for a ServiceBinding.
 type sbrController struct {
 	Controller   controller.Controller // controller-runtime instance
@@ -39,8 +24,6 @@ type sbrController struct {
 	logger       *log.Log                         // logger instance
 }
 
-var _ ResourceWatcher = (*sbrController)(nil)
-
 // controllerName common name of this controller
 const controllerName = "servicebinding-controller"
 
@@ -83,155 +66,6 @@ func (s *sbrController) createUnstructuredWithGVK(gvk schema.GroupVersionKind) *
 	return u
 }
 
-// getWatchingGVKs return a list of GVKs that this controller is interested in watching.
-func (s *sbrController) getWatchingGVKs() ([]schema.GroupVersionKind, error) {
-	log := s.logger
-	// standard resources types
-	gvks := []schema.GroupVersionKind{
-		{Group: "", Version: "v1", Kind: "Secret"},
-		{Group: "", Version: "v1", Kind: "ConfigMap"},
-	}
-
-	olm := newOLM(s.Client, os.Getenv("WATCH_NAMESPACE"))
-	olmGVKs, err := olm.listCSVOwnedCRDsAsGVKs()
-	if err != nil {
-		log.Error(err, "On listing owned CSV as GVKs")
-		return nil, err
-	}
-	log.Debug("Amount of GVK founds in CSV objects.", "CSVOwnedGVK.Amount", len(olmGVKs))
-	return append(gvks, olmGVKs...), nil
-}
-
-// isOfKind evaluates whether the given object has a specific kind.
-func isOfKind(obj runtime.Object, kind string) bool {
-	return strings.EqualFold(obj.GetObjectKind().GroupVersionKind().Kind, kind)
-}
-
-// check whether annotations specify bindings
-func isAnnotationValid(ann map[string]string) bool {
-	for k := range ann {
-		if strings.HasPrefix(k, binding.AnnotationPrefix) {
-			return true
-		}
-	}
-	return false
-}
-
-// updateEvent returns a predicate handler function.
-func updateFunc(logger *log.Log) func(updateEvent event.UpdateEvent) bool {
-	return func(e event.UpdateEvent) bool {
-		isSecret := isOfKind(e.ObjectNew, "Secret")
-		isConfigMap := isOfKind(e.ObjectNew, "ConfigMap")
-
-		if isSecret || isConfigMap {
-			dataFieldsAreEqual, err := compareObjectFields(e.ObjectOld, e.ObjectNew, "data")
-			if err != nil {
-				logger.Error(err, "error comparing object fields")
-				// an error is returned in the case one of the compared objects doesn't have the data
-				// field; this can happen when there's no data to be stored so update should be
-				// processed
-				return true
-			}
-			logger.Debug("Predicate evaluated for Secret/ConfigMap", "dataFieldsAreEqual", dataFieldsAreEqual.Success)
-			return !dataFieldsAreEqual.Success
-		}
-
-		var specsAreEqual bool
-		var statusAreEqual bool
-
-		if specComparison, err := compareObjectFields(e.ObjectOld, e.ObjectNew, "spec"); err != nil {
-			logger.Error(err, "error comparing object's spec fields: %s", err.Error())
-			return false
-		} else {
-			specsAreEqual = specComparison.Success
-		}
-
-		if statusComparison, err := compareObjectFields(e.ObjectOld, e.ObjectNew, "status"); err != nil {
-			logger.Error(err, "error comparing object's status fields", err.Error())
-			statusAreEqual = false
-		} else {
-			statusAreEqual = statusComparison.Success
-		}
-		annotationsAreEqual := true
-		annOld := e.MetaOld.GetAnnotations()
-		annNew := e.MetaNew.GetAnnotations()
-		if isAnnotationValid(annOld) && isAnnotationValid(annNew) {
-			annotationsAreEqual = reflect.DeepEqual(annOld, annNew)
-		}
-		shouldReconcile := !specsAreEqual || !statusAreEqual || !annotationsAreEqual
-
-		logger.Debug("Resource update event received",
-			"GVK", e.ObjectNew.GetObjectKind().GroupVersionKind(),
-			"Name", e.MetaNew.GetName(),
-			"SpecsAreEqual", specsAreEqual,
-			"StatusAreEqual", statusAreEqual,
-			"ShouldReconcile", shouldReconcile,
-		)
-		return shouldReconcile
-	}
-}
-
-// buildGVKPredicate construct the predicates for all other GVKs, unless SBR.
-func buildGVKPredicate(logger *log.Log) predicate.Funcs {
-	logger = logger.WithName("buildGVKPredicate")
-	return predicate.Funcs{
-		UpdateFunc: updateFunc(logger),
-		DeleteFunc: func(e event.DeleteEvent) bool {
-			// evaluates to false if the object has been confirmed deleted
-			return !e.DeleteStateUnknown
-		},
-	}
-}
-
-// AddWatchForGVK creates a watch on a given GVK, as long as it's not duplicated.
-func (s *sbrController) AddWatchForGVK(gvk schema.GroupVersionKind) error {
-	logger := s.logger.WithValues("GVK", gvk)
-	logger.Trace("Adding watch for GVK...")
-	if _, exists := s.watchingGVKs[gvk]; exists {
-		logger.Trace("Skipping watch on GVK twice, it's already under watch!")
-		return nil
-	}
-
-	// saving GVK in cache
-	s.watchingGVKs[gvk] = true
-
-	logger.Debug("Creating watch on GVK")
-	src := s.createSourceForGVK(gvk)
-	return s.Controller.Watch(src, s.newEnqueueRequestsForSBR(), buildGVKPredicate(logger))
-}
-
-// AddWatchForGVR creates a watch on a given GVR
-func (s *sbrController) AddWatchForGVR(gvr schema.GroupVersionResource) error {
-	gvk, err := s.typeLookup.KindForResource(gvr)
-	if err != nil {
-		return err
-	}
-	return s.AddWatchForGVK(*gvk)
-}
-
-// addCSVWatch creates a watch on ClusterServiceVersion.
-func (s *sbrController) addCSVWatch() error {
-	log := s.logger
-	gvr := olmv1alpha1.SchemeGroupVersion.WithResource(csvResource)
-	resourceClient := s.Client.Resource(gvr).Namespace(os.Getenv("WATCH_NAMESPACE"))
-	_, err := resourceClient.List(context.TODO(), metav1.ListOptions{})
-	if err != nil && errors.IsNotFound(err) {
-		log.Warning("ClusterServiceVersions CRD is not installed, skip watching")
-		return nil
-	} else if err != nil {
-		return err
-	}
-	csvGVK := olmv1alpha1.SchemeGroupVersion.WithKind(clusterServiceVersionKind)
-	source := s.createSourceForGVK(csvGVK)
-	err = s.Controller.Watch(source, NewCreateWatchEventHandler(s))
-	if err != nil {
-		return err
-	}
-	log.Debug("Watch added for ClusterServiceVersion", "GVK", csvGVK)
-
-	return nil
-}
-
 // buildSBRPredicate construct the predicates for service-bindings.
 func buildSBRPredicate(logger *log.Log) predicate.Funcs {
 	logger = logger.WithName("buildSBRPredicate")
@@ -270,7 +104,7 @@ func buildSBRPredicate(logger *log.Log) predicate.Funcs {
 
 // addSBRWatch creates a watchon ServiceBinding GVK.
 func (s *sbrController) addSBRWatch() error {
-	l := s.logger.WithValues("GKV", v1alpha1.GroupVersionKind)
+	l := s.logger.WithValues("GVK", v1alpha1.GroupVersionKind)
 	src := s.createSourceForGVK(v1alpha1.GroupVersionKind)
 	err := s.Controller.Watch(src, s.newEnqueueRequestsForSBR(), buildSBRPredicate(l))
 	if err != nil {
@@ -282,28 +116,6 @@ func (s *sbrController) addSBRWatch() error {
 	return nil
 }
 
-// addWhitelistedGVKWatches create watch on GVKs employed on CSVs.
-func (s *sbrController) addWhitelistedGVKWatches() error {
-	log := s.logger
-	// list of interesting GVKs to watch
-	gvks, err := s.getWatchingGVKs()
-	if err != nil {
-		log.Error(err, "on retrieving list of GVKs to watch")
-		return err
-	}
-
-	for _, gvk := range gvks {
-		log.Debug("Adding watch for whitelisted GVK...", "GVK", gvk)
-		err = s.AddWatchForGVK(gvk)
-		if err != nil {
-			log.Error(err, "on creating watch for GVK")
-			return err
-		}
-	}
-
-	return nil
-}
-
 // Watch setup "watch" for all GVKs relevant for SBRController.
 func (s *sbrController) Watch() error {
 	log := s.logger
@@ -313,18 +125,6 @@ func (s *sbrController) Watch() error {
 		return err
 	}
 
-	err = s.addWhitelistedGVKWatches()
-	if err != nil {
-		log.Error(err, "on adding watch for whitelisted GVKs")
-		return err
-	}
-
-	err = s.addCSVWatch()
-	if err != nil {
-		log.Error(err, "on adding watch for ClusterServiceVersion")
-		return err
-	}
-
 	return nil
 }
 
diff --git a/controllers/servicebinding_controller.go b/controllers/servicebinding_controller.go
index b919eaf0..7244c963 100644
--- a/controllers/servicebinding_controller.go
+++ b/controllers/servicebinding_controller.go
@@ -35,11 +35,10 @@ var reconcilerLog = log.NewLog("reconciler")
 // ServiceBindingReconciler reconciles a ServiceBinding object
 type ServiceBindingReconciler struct {
 	client.Client
-	Log             logr.Logger
-	Scheme          *runtime.Scheme
-	dynClient       dynamic.Interface // kubernetes dynamic api client
-	resourceWatcher ResourceWatcher   // ResourceWatcher to add watching for specific GVK/GVR
-	restMapper      meta.RESTMapper
+	Log        logr.Logger
+	Scheme     *runtime.Scheme
+	dynClient  dynamic.Interface // kubernetes dynamic api client
+	restMapper meta.RESTMapper
 }
 
 // +kubebuilder:rbac:groups=binding.operators.coreos.com,resources=servicebindings,verbs=get;list;watch;create;update;patch;delete
@@ -85,6 +84,5 @@ func (r *ServiceBindingReconciler) SetupWithManager(mgr ctrl.Manager) error {
 		watchingGVKs: make(map[schema.GroupVersionKind]bool),
 		logger:       log.NewLog("sbrcontroller"),
 	}
-	r.resourceWatcher = sbr
 	return sbr.Watch()
 }
diff --git a/controllers/watch.go b/controllers/watch.go
deleted file mode 100644
index f1c57c67..00000000
--- a/controllers/watch.go
+++ /dev/null
@@ -1,54 +0,0 @@
-package controllers
-
-import (
-	"github.com/redhat-developer/service-binding-operator/pkg/log"
-	"k8s.io/apimachinery/pkg/types"
-	"sigs.k8s.io/controller-runtime/pkg/handler"
-	"sigs.k8s.io/controller-runtime/pkg/reconcile"
-)
-
-var (
-	watchLog = log.NewLog("watch")
-)
-
-// csvToWatcherMapper creates a EventHandler interface to map ClusterServiceVersion objects back to
-// controller and add given GVK to watch list.
-type csvToWatcherMapper struct {
-	controller *sbrController
-}
-
-// Map requests directed to CSV objects and exctract related GVK to trigger another watch on
-// controller instance.
-func (c *csvToWatcherMapper) Map(obj handler.MapObject) []reconcile.Request {
-	olm := newOLM(c.controller.Client, obj.Meta.GetNamespace())
-	namespacedName := types.NamespacedName{
-		Namespace: obj.Meta.GetNamespace(),
-		Name:      obj.Meta.GetName(),
-	}
-
-	log := watchLog.WithName("CSVToWatcherMapper").WithValues("Obj.NamespacedName", namespacedName)
-
-	gvks, err := olm.listGVKsFromCSVNamespacedName(namespacedName)
-	if err != nil {
-		log.Error(err, "Failed on listing GVK with namespaced-name!")
-		return []reconcile.Request{}
-	}
-
-	for _, gvk := range gvks {
-		log.Debug("Adding watch for GVK", "GVK", gvk)
-		err = c.controller.AddWatchForGVK(gvk)
-		if err != nil {
-			log.Error(err, "Failed to create a watch")
-		}
-	}
-
-	return []reconcile.Request{}
-}
-
-// NewCreateWatchEventHandler creates a new instance of handler.EventHandler interface with
-// CSVToWatcherMapper as map-func.
-func NewCreateWatchEventHandler(controller *sbrController) handler.EventHandler {
-	return &handler.EnqueueRequestsFromMapFunc{
-		ToRequests: &csvToWatcherMapper{controller: controller},
-	}
-}


Test patch:
diff --git a/controllers/mapper_test.go b/controllers/mapper_test.go
index 2f8a468b..c470f23e 100644
--- a/controllers/mapper_test.go
+++ b/controllers/mapper_test.go
@@ -5,7 +5,6 @@ import (
 
 	"github.com/stretchr/testify/require"
 	appsv1 "k8s.io/api/apps/v1"
-	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
@@ -59,29 +58,7 @@ func TestSBRRequestMapperMap(t *testing.T) {
 
 	testCases := []testCase{
 		{
-			description: "no service bindings declared in namespace",
-			buildFakeFn: func() *mocks.Fake {
-				f := mocks.NewFake(t, reconcilerNs)
-				return f
-			},
-			buildMapObjectFn: func(f *mocks.Fake) handler.MapObject {
-				return handler.MapObject{
-					Meta: &metav1.ObjectMeta{
-						Namespace: "mapper-unit",
-						Name:      "mapper-unit-secret",
-					},
-					Object: &corev1.Secret{
-						TypeMeta: metav1.TypeMeta{
-							APIVersion: "v1",
-							Kind:       "Secret",
-						},
-					},
-				}
-			},
-			expectedRequestsLen: 0,
-		},
-		{
-			description: "resource declared as application of a service binding",
+			description: "Execute mapper function for enqueuing for a Service Binding resource declared",
 			buildFakeFn: func() *mocks.Fake {
 				f := mocks.NewFake(t, reconcilerNs)
 				uSbr, err := runtime.DefaultUnstructuredConverter.ToUnstructured(sbr)
@@ -93,37 +70,12 @@ func TestSBRRequestMapperMap(t *testing.T) {
 				return handler.MapObject{
 					Meta: &metav1.ObjectMeta{
 						Namespace: "mapper-unit",
-						Name:      "mapper-unit-deployment",
+						Name:      "mapper-unit-sbr",
 					},
 					Object: &appsv1.Deployment{
 						TypeMeta: metav1.TypeMeta{
-							APIVersion: "apps/v1",
-							Kind:       "Deployment",
-						},
-					},
-				}
-			},
-			expectedRequestsLen: 1,
-		},
-		{
-			description: "resource declared as service of a service binding",
-			buildFakeFn: func() *mocks.Fake {
-				f := mocks.NewFake(t, reconcilerNs)
-				uSbr, err := runtime.DefaultUnstructuredConverter.ToUnstructured(sbr)
-				require.NoError(t, err)
-				f.AddMockResource(&unstructured.Unstructured{Object: uSbr})
-				return f
-			},
-			buildMapObjectFn: func(f *mocks.Fake) handler.MapObject {
-				return handler.MapObject{
-					Meta: &metav1.ObjectMeta{
-						Namespace: "mapper-unit",
-						Name:      "mapper-unit-secret",
-					},
-					Object: &corev1.Secret{
-						TypeMeta: metav1.TypeMeta{
-							APIVersion: "v1",
-							Kind:       "Secret",
+							APIVersion: v1alpha1.GroupVersion.String(),
+							Kind:       "ServiceBinding",
 						},
 					},
 				}
@@ -131,7 +83,6 @@ func TestSBRRequestMapperMap(t *testing.T) {
 			expectedRequestsLen: 1,
 		},
 	}
-
 	for _, tc := range testCases {
 		t.Run(tc.description, func(t *testing.T) {
 			f := tc.buildFakeFn()
diff --git a/controllers/olm_test.go b/controllers/olm_test.go
index e17d150e..7e5cd000 100644
--- a/controllers/olm_test.go
+++ b/controllers/olm_test.go
@@ -3,10 +3,11 @@ package controllers
 import (
 	"context"
 	"fmt"
-	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 	"strings"
 	"testing"
 
+	"sigs.k8s.io/controller-runtime/pkg/log/zap"
+
 	olmv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
 	"github.com/redhat-developer/service-binding-operator/test/mocks"
 	"github.com/stretchr/testify/require"
@@ -14,7 +15,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
-	"k8s.io/apimachinery/pkg/types"
 	k8stesting "k8s.io/client-go/testing"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 )
@@ -23,15 +23,6 @@ func init() {
 	log.SetLogger(zap.New(zap.UseDevMode((true))))
 }
 
-func assertGVKs(t *testing.T, gvks []schema.GroupVersionKind) {
-	for _, gvk := range gvks {
-		t.Logf("Inspecting GVK: '%s'", gvk)
-		require.NotEmpty(t, gvk.Group)
-		require.NotEmpty(t, gvk.Version)
-		require.NotEmpty(t, gvk.Kind)
-	}
-}
-
 func TestOLMWithoutCSVCRD(t *testing.T) {
 	ns := "controller"
 	f := mocks.NewFake(t, ns)
@@ -94,19 +85,4 @@ func TestOLMNew(t *testing.T) {
 		expectedCRDName := strings.ToLower(fmt.Sprintf("%s.%s", mocks.CRDKind, mocks.CRDName))
 		require.Equal(t, expectedCRDName, crd.Name)
 	})
-
-	t.Run("ListCSVOwnedCRDsAsGVKs", func(t *testing.T) {
-		gvks, err := olm.listCSVOwnedCRDsAsGVKs()
-		require.NoError(t, err)
-		require.Len(t, gvks, 1)
-		assertGVKs(t, gvks)
-	})
-
-	t.Run("ListGVKsFromCSVNamespacedName", func(t *testing.T) {
-		namespacedName := types.NamespacedName{Namespace: ns, Name: csvName}
-		gvks, err := olm.listGVKsFromCSVNamespacedName(namespacedName)
-		require.NoError(t, err)
-		require.Len(t, gvks, 1)
-		assertGVKs(t, gvks)
-	})
 }
diff --git a/controllers/reconciler_test.go b/controllers/reconciler_test.go
index 6061f670..9d8405d3 100644
--- a/controllers/reconciler_test.go
+++ b/controllers/reconciler_test.go
@@ -75,34 +75,6 @@ func requireConditionPresentAndFalse(t *testing.T, conditionType string, sbrCond
 	)
 }
 
-type fakeResourceWatcher struct {
-	record map[schema.GroupVersionKind]bool
-	mapper meta.RESTMapper
-}
-
-var _ ResourceWatcher = (*fakeResourceWatcher)(nil)
-
-func (f *fakeResourceWatcher) AddWatchForGVR(gvr schema.GroupVersionResource) error {
-	gvk, err := f.mapper.KindFor(gvr)
-	if err != nil {
-		return err
-	}
-	f.record[gvk] = true
-	return nil
-}
-
-func (f *fakeResourceWatcher) AddWatchForGVK(gvk schema.GroupVersionKind) error {
-	f.record[gvk] = true
-	return nil
-}
-
-func newFakeResourceWatcher(mapper meta.RESTMapper) *fakeResourceWatcher {
-	return &fakeResourceWatcher{
-		record: make(map[schema.GroupVersionKind]bool),
-		mapper: mapper,
-	}
-}
-
 // TestApplicationByName tests discovery of application by name
 func TestApplicationByName(t *testing.T) {
 	backingServiceResourceRef := "backingServiceRef"
@@ -118,7 +90,6 @@ func TestApplicationByName(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	t.Run("test-application-selector-by-name", func(t *testing.T) {
 
@@ -164,7 +135,6 @@ func TestReconcilerReconcileUsingSecret(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	t.Run("reconcile-using-secret", func(t *testing.T) {
 		res, err := r.Reconcile(reconcileRequest())
@@ -233,7 +203,6 @@ func TestReconcilerReconcileUsingVolumes(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	t.Run("reconcile-using-volume", func(t *testing.T) {
 		res, err := r.Reconcile(reconcileRequest())
@@ -270,7 +239,6 @@ func TestServiceNotFound(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	// Reconcile without service
 	res, _ := r.Reconcile(reconcileRequest())
@@ -290,7 +258,6 @@ func TestServiceNotFound(t *testing.T) {
 	f.AddMockedUnstructuredSecret("db-credentials")
 	fakeDynClient = f.FakeDynClient()
 	r = &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: testutils.BuildTestRESTMapper(), Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 	res, err = r.Reconcile(reconcileRequest())
 	require.NoError(t, err)
 	require.False(t, res.Requeue)
@@ -327,7 +294,6 @@ func TestApplicationNotFound(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	// Reconcile without deployment
 	res, err := r.Reconcile(reconcileRequest())
@@ -347,7 +313,6 @@ func TestApplicationNotFound(t *testing.T) {
 	f.AddMockedUnstructuredDeployment(reconcilerName, matchLabels)
 	fakeDynClient = f.FakeDynClient()
 	r = &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: testutils.BuildTestRESTMapper(), Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 	res, err = r.Reconcile(reconcileRequest())
 	require.NoError(t, err)
 	require.False(t, res.Requeue)
@@ -385,7 +350,6 @@ func TestReconcilerUpdateCredentials(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	u, err := fakeDynClient.Resource(secretsGVR).Namespace(reconcilerNs).Get(context.TODO(), "db-credentials", metav1.GetOptions{})
 	require.NoError(t, err)
@@ -446,7 +410,6 @@ func TestReconcilerReconcileWithConflictingAppSelc(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	t.Run("test-reconciler-reconcile-with-conflicting-application-selector", func(t *testing.T) {
 
@@ -484,7 +447,6 @@ func TestEmptyApplication(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	res, err := r.Reconcile(reconcileRequest())
 	require.NoError(t, err)
@@ -508,7 +470,6 @@ func TestEmptyServiceSelectorAndAllConditionAreSetToFalse(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	res, err := r.Reconcile(reconcileRequest())
 	require.NoError(t, err)
@@ -542,7 +503,6 @@ func TestBindTwoSbrsWithSingleApplication(t *testing.T) {
 	fakeDynClient := f.FakeDynClient()
 	mapper := testutils.BuildTestRESTMapper()
 	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
 
 	t.Run("test-bind-two-sbrs-with-single-application", func(t *testing.T) {
 		// Reconciling first sbr
@@ -649,68 +609,3 @@ func TestBindTwoSbrsWithSingleApplication(t *testing.T) {
 		require.Contains(t, dep.Spec.Template.Spec.Containers[0].EnvFrom, envList[1])
 	})
 }
-
-func TestRepopulateBindingSecretOnExternalUpdate(t *testing.T) {
-	backingServiceResourceRef := "backingService"
-	matchLabels := map[string]string{
-		"connects-to": "database",
-		"environment": "reconciler",
-	}
-	f := mocks.NewFake(t, reconcilerNs)
-	f.AddMockedUnstructuredServiceBinding(reconcilerName, backingServiceResourceRef, "", deploymentsGVR, matchLabels)
-	f.AddMockedUnstructuredCSV("cluster-service-version-list")
-	f.AddMockedUnstructuredDatabaseCRD()
-	f.AddMockedUnstructuredDatabaseCR(backingServiceResourceRef)
-	f.AddMockedUnstructuredDeployment(reconcilerName, matchLabels)
-	f.AddMockedUnstructuredSecret("db-credentials")
-
-	fakeDynClient := f.FakeDynClient()
-	mapper := testutils.BuildTestRESTMapper()
-	r := &ServiceBindingReconciler{dynClient: fakeDynClient, restMapper: mapper, Scheme: f.S}
-	r.resourceWatcher = newFakeResourceWatcher(mapper)
-
-	res, err := r.Reconcile(reconcileRequest())
-	require.NoError(t, err)
-	require.False(t, res.Requeue)
-
-	namespacedName := types.NamespacedName{Namespace: reconcilerNs, Name: reconcilerName}
-	sbr, err := r.getServiceBinding(namespacedName)
-	require.NoError(t, err)
-
-	requireConditionPresentAndTrue(t, v1alpha1.CollectionReady, sbr.Status.Conditions)
-	requireConditionPresentAndTrue(t, v1alpha1.InjectionReady, sbr.Status.Conditions)
-	requireConditionPresentAndTrue(t, v1alpha1.BindingReady, sbr.Status.Conditions)
-
-	bindingSecret, err := fakeDynClient.Resource(secretsGVR).Namespace(reconcilerNs).Get(context.TODO(), sbr.Status.Secret, metav1.GetOptions{})
-	require.NoError(t, err)
-
-	// Update Credentials
-	secret := &corev1.Secret{}
-	err = runtime.DefaultUnstructuredConverter.FromUnstructured(bindingSecret.Object, secret)
-	require.NoError(t, err)
-	bindingData := make(map[string][]byte)
-	bindingData["love"] = []byte("dhriti")
-	secret.Data = bindingData
-
-	obj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&secret)
-	require.NoError(t, err)
-	updated := unstructured.Unstructured{Object: obj}
-
-	updatedSecret, err := fakeDynClient.Resource(secretsGVR).Namespace(secret.Namespace).Update(context.TODO(), &updated, metav1.UpdateOptions{})
-	require.NoError(t, err)
-
-	secrett := &corev1.Secret{}
-	err = runtime.DefaultUnstructuredConverter.FromUnstructured(updatedSecret.Object, secrett)
-	require.NoError(t, err)
-
-	require.Equal(t, secrett.Data["love"], []byte("dhriti"))
-
-	res, err = r.Reconcile(reconcileRequest())
-	require.NoError(t, err)
-	require.False(t, res.Requeue)
-
-	bindingSecret2, err := fakeDynClient.Resource(secretsGVR).Namespace(reconcilerNs).Get(context.TODO(), sbr.Status.Secret, metav1.GetOptions{})
-	require.NoError(t, err)
-	require.Equal(t, bindingSecret.GetName(), bindingSecret2.GetName())
-	require.Equal(t, bindingSecret.Object, bindingSecret2.Object)
-}
diff --git a/controllers/sbrcontroller_test.go b/controllers/sbrcontroller_test.go
index 672ad22a..481e24e7 100644
--- a/controllers/sbrcontroller_test.go
+++ b/controllers/sbrcontroller_test.go
@@ -5,13 +5,7 @@ import (
 
 	"github.com/redhat-developer/service-binding-operator/api/v1alpha1"
 	"github.com/redhat-developer/service-binding-operator/pkg/log"
-	"github.com/redhat-developer/service-binding-operator/pkg/testutils"
-	"github.com/stretchr/testify/require"
-	appsv1 "k8s.io/api/apps/v1"
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/schema"
 	"sigs.k8s.io/controller-runtime/pkg/controller"
 	"sigs.k8s.io/controller-runtime/pkg/event"
 	"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -99,251 +93,6 @@ func TestSBRControllerBuildSBRPredicate(t *testing.T) {
 	})
 }
 
-func TestSBRControllerBuildGVKPredicate(t *testing.T) {
-	pred := buildGVKPredicate(log.NewLog("test-log"))
-
-	// update verifies whether only the accepted manifests trigger the reconciliation process
-	t.Run("update", func(t *testing.T) {
-		deploymentA := &appsv1.Deployment{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Deployment",
-				APIVersion: "apps/v1",
-			},
-			Spec: appsv1.DeploymentSpec{
-				Selector: &metav1.LabelSelector{
-					MatchLabels: map[string]string{
-						"app": "demo",
-					},
-				},
-			},
-			Status: appsv1.DeploymentStatus{
-				AvailableReplicas: 2,
-			},
-		}
-		deploymentB := &appsv1.Deployment{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Deployment",
-				APIVersion: "apps/v1",
-			},
-			Spec: appsv1.DeploymentSpec{
-				Selector: &metav1.LabelSelector{
-					MatchLabels: map[string]string{
-						"app": "demo",
-					},
-				},
-			},
-			Status: appsv1.DeploymentStatus{
-				AvailableReplicas: 3,
-			},
-		}
-		deploymentC := &appsv1.Deployment{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Deployment",
-				APIVersion: "apps/v1",
-			},
-			Spec: appsv1.DeploymentSpec{
-				Selector: &metav1.LabelSelector{
-					MatchLabels: map[string]string{
-						"new-app": "demo",
-					},
-				},
-			},
-			Status: appsv1.DeploymentStatus{
-				AvailableReplicas: 3,
-			},
-		}
-		deploymentD := &appsv1.Deployment{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Deployment",
-				APIVersion: "apps/v1",
-			},
-			ObjectMeta: metav1.ObjectMeta{
-				Annotations: map[string]string{
-					"service": "binding",
-				},
-			},
-			Spec: appsv1.DeploymentSpec{
-				Selector: &metav1.LabelSelector{
-					MatchLabels: map[string]string{
-						"new-app": "demo",
-					},
-				},
-			},
-			Status: appsv1.DeploymentStatus{
-				AvailableReplicas: 3,
-			},
-		}
-		deploymentE := &appsv1.Deployment{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Deployment",
-				APIVersion: "apps/v1",
-			},
-			ObjectMeta: metav1.ObjectMeta{
-				Annotations: map[string]string{
-					"service.binding/db.host": "backend",
-				},
-			},
-			Spec: appsv1.DeploymentSpec{
-				Selector: &metav1.LabelSelector{
-					MatchLabels: map[string]string{
-						"new-app": "demo",
-					},
-				},
-			},
-		}
-		deploymentF := &appsv1.Deployment{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Deployment",
-				APIVersion: "apps/v1",
-			},
-			ObjectMeta: metav1.ObjectMeta{
-				Annotations: map[string]string{
-					"service.binding/db.port": "8080",
-				},
-			},
-			Spec: appsv1.DeploymentSpec{
-				Selector: &metav1.LabelSelector{
-					MatchLabels: map[string]string{
-						"new-app": "demo",
-					},
-				},
-			},
-		}
-		secretA := &corev1.Secret{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Secret",
-				APIVersion: "v1",
-			},
-			Data: map[string][]byte{
-				"user": []byte("username"),
-			},
-		}
-
-		secretB := &corev1.Secret{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "Secret",
-				APIVersion: "v1",
-			},
-			Data: map[string][]byte{
-				"password": []byte("password"),
-			},
-		}
-		configMapA := &corev1.ConfigMap{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "ConfigMap",
-				APIVersion: "v1",
-			},
-			Data: map[string]string{
-				"CP": "ConnectionPort",
-			},
-		}
-		configMapB := &corev1.ConfigMap{
-			TypeMeta: metav1.TypeMeta{
-				Kind:       "ConfigMap",
-				APIVersion: "v1",
-			},
-			Data: map[string]string{
-				"Host": "Hostname",
-			},
-		}
-
-		tests := []struct {
-			name   string
-			wanted bool
-			a      runtime.Object
-			b      runtime.Object
-			aMeta  metav1.ObjectMeta
-			bMeta  metav1.ObjectMeta
-		}{
-			{
-				name:   "Predicate evaluation false: non supported update as deployment spec is same",
-				wanted: false,
-				a:      deploymentA,
-				b:      deploymentA,
-				aMeta:  deploymentA.ObjectMeta,
-				bMeta:  deploymentA.ObjectMeta,
-			},
-			{
-				name:   "Predicate evaluation false: non supported update as there is no change in the ConfigMap",
-				wanted: false,
-				a:      configMapA,
-				b:      configMapA,
-				aMeta:  configMapA.ObjectMeta,
-				bMeta:  configMapA.ObjectMeta,
-			},
-			{
-				name:   "Predicate evaluation false: non supported update there is no change in the Secret",
-				wanted: false,
-				a:      secretA,
-				b:      secretA,
-				aMeta:  secretA.ObjectMeta,
-				bMeta:  secretA.ObjectMeta,
-			},
-			{
-				name:   "Predicate evaluation true: supported update as there is an update in the ConfigMap",
-				wanted: true,
-				a:      configMapA,
-				b:      configMapB,
-				aMeta:  configMapA.ObjectMeta,
-				bMeta:  configMapB.ObjectMeta,
-			},
-			{
-				name:   "Predicate evaluation true: supported update as there is an update in the Secret",
-				wanted: true,
-				a:      secretA,
-				b:      secretB,
-				aMeta:  secretA.ObjectMeta,
-				bMeta:  secretB.ObjectMeta,
-			},
-			{
-				name:   "Predicate evaluation true: supported update as the deployment status changed",
-				wanted: true,
-				a:      deploymentA,
-				b:      deploymentB,
-				aMeta:  deploymentA.ObjectMeta,
-				bMeta:  deploymentB.ObjectMeta,
-			},
-			{
-				name:   "Predicate evaluation true: supported update as the deployment spec changed",
-				wanted: true,
-				a:      deploymentB,
-				b:      deploymentC,
-				aMeta:  deploymentB.ObjectMeta,
-				bMeta:  deploymentC.ObjectMeta,
-			},
-			{
-				name:   "Predicate evaluation true: supported update as the deployment metadata annotations required for service binding is changed",
-				wanted: true,
-				a:      deploymentE,
-				b:      deploymentF,
-				aMeta:  deploymentE.ObjectMeta,
-				bMeta:  deploymentF.ObjectMeta,
-			},
-			{
-				name:   "Predicate evaluation false: non supported update as the deployment metadata annotations not required for service binding is changed",
-				wanted: false,
-				a:      deploymentC,
-				b:      deploymentD,
-				aMeta:  deploymentC.ObjectMeta,
-				bMeta:  deploymentD.ObjectMeta,
-			},
-		}
-		for _, tt := range tests {
-			t.Run(tt.name, func(t *testing.T) {
-				e := event.UpdateEvent{
-					MetaOld:   &tt.aMeta,
-					MetaNew:   &tt.bMeta,
-					ObjectOld: tt.a,
-					ObjectNew: tt.b,
-				}
-				if got := pred.Update(e); got != tt.wanted {
-					t.Errorf("newGVKPredicate() = %v, want %v", got, tt.wanted)
-				}
-			})
-		}
-	})
-}
-
 type fakeController struct {
 	watchCallback func(src source.Source, eventhandler handler.EventHandler, predicates ...predicate.Predicate) error
 }
@@ -364,62 +113,3 @@ func (f *fakeController) Watch(src source.Source, eventhandler handler.EventHand
 	}
 	return nil
 }
-
-func TestSBRController_ResourceWatcher(t *testing.T) {
-
-	controller := &sbrController{
-		typeLookup: &ServiceBindingReconciler{restMapper: testutils.BuildTestRESTMapper()},
-		logger:     log.NewLog("testSBRController"),
-	}
-
-	deploymentGVK := schema.GroupVersionKind{Kind: "Deployment", Version: "v1", Group: "apps"}
-	deploymentGVR := schema.GroupVersionResource{Resource: "deployments", Version: "v1", Group: "apps"}
-
-	t.Run("add watching for deployment GVK", func(t *testing.T) {
-		ch := make(chan struct{})
-		controller.Controller = &fakeController{
-			watchCallback: func(src source.Source, eventhandler handler.EventHandler,
-				predicates ...predicate.Predicate) error {
-				kind, ok := src.(*source.Kind)
-				require.True(t, ok)
-				gvk := kind.Type.GetObjectKind().GroupVersionKind()
-				require.Equal(t, deploymentGVK, gvk)
-				close(ch)
-				return nil
-			},
-		}
-		controller.watchingGVKs = make(map[schema.GroupVersionKind]bool)
-		err := controller.AddWatchForGVK(deploymentGVK)
-		require.NoError(t, err)
-		_, ok := controller.watchingGVKs[deploymentGVK]
-		require.True(t, ok)
-		<-ch
-	})
-
-	t.Run("add watching for existing deployment GVK ", func(t *testing.T) {
-		err := controller.AddWatchForGVK(deploymentGVK)
-		require.NoError(t, err)
-	})
-
-	t.Run("add watching for deployment GVR", func(t *testing.T) {
-		controller.Controller = &fakeController{}
-		controller.watchingGVKs = make(map[schema.GroupVersionKind]bool)
-		err := controller.AddWatchForGVR(deploymentGVR)
-		require.NoError(t, err)
-		_, ok := controller.watchingGVKs[deploymentGVK]
-		require.True(t, ok)
-	})
-
-	t.Run("add watching for unknown GVR", func(t *testing.T) {
-		controller.Controller = &fakeController{
-			watchCallback: func(src source.Source, eventhandler handler.EventHandler,
-				predicates ...predicate.Predicate) error {
-				panic("should not be called")
-			},
-		}
-		controller.watchingGVKs = make(map[schema.GroupVersionKind]bool)
-		gvr := schema.GroupVersionResource{Resource: "resources", Version: "v1", Group: "unknown"}
-		err := controller.AddWatchForGVR(gvr)
-		require.Error(t, err)
-	})
-}
diff --git a/test/acceptance/features/bindAppToService.feature b/test/acceptance/features/bindAppToService.feature
index c59982ce..19e4c0bb 100644
--- a/test/acceptance/features/bindAppToService.feature
+++ b/test/acceptance/features/bindAppToService.feature
@@ -334,134 +334,6 @@ Feature: Bind an application to a service
         And Secret contains "BACKEND_HOST" key with value "example.common"
         And Secret contains "BACKEND_USERNAME" key with value "foo"
 
-    Scenario: Backend Service status update gets propagated to the binding secret
-        Given CustomResourceDefinition backends.stable.example.com is available
-        * The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo
-                annotations:
-                    service.binding/host: path={.spec.host}
-                    service.binding/ready: path={.status.ready}
-            spec:
-                host: example.common
-            """
-        * Service Binding is applied
-            """
-            apiVersion: binding.operators.coreos.com/v1alpha1
-            kind: ServiceBinding
-            metadata:
-                name: binding-request-backend
-            spec:
-                services:
-                -   group: stable.example.com
-                    version: v1
-                    kind: Backend
-                    name: backend-demo
-                    id: SBR
-                mappings:
-                  - name: CustomReady
-                    value: '{{ .SBR.status.ready }}'
-                  - name: CustomHost
-                    value: '{{ .SBR.spec.host }}'
-            """
-        Then Secret name should be updated in Service Binding status
-        And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend" should be changed to "False"
-        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend" should be changed to "True"
-        And Secret contains "CustomReady" key with value "<no value>"
-
-        # Backend status in "backend-demo" is updated
-        When The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo
-                annotations:
-                    service.binding/host: path={.spec.host}
-                    service.binding/ready: path={.status.ready}
-            spec:
-                host: example.common
-            status:
-                ready: true
-            """
-        Then Secret name should be updated in Service Binding status
-        Then Secret contains "CustomReady" key with value "true"
-
-
-    Scenario: Backend Service status update gets propagated to the application
-        Given Generic test application "generic-app-demo-volume-mount" is running
-        * CustomResourceDefinition backends.stable.example.com is available
-        * The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo-volume-mount
-                annotations:
-                    service.binding/host: path={.spec.host}
-                    service.binding/ready: path={.status.ready}
-            spec:
-                host: example.common
-            """
-        * Service Binding is applied
-            """
-            apiVersion: binding.operators.coreos.com/v1alpha1
-            kind: ServiceBinding
-            metadata:
-                name: binding-request-backend-volume-mount
-            spec:
-                bindAsFiles: true
-                services:
-                -   group: stable.example.com
-                    version: v1
-                    kind: Backend
-                    name: backend-demo-volume-mount
-                    id: SBR
-                application:
-                    name: generic-app-demo-volume-mount
-                    group: apps
-                    version: v1
-                    resource: deployments
-            """
-        And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend-volume-mount" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend-volume-mount" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-volume-mount" should be changed to "True"
-        And The env var "host" is not available to the application
-        And The env var "ready" is not available to the application
-        And Content of file "/bindings/binding-request-backend-volume-mount/host" in application pod is
-            """
-            example.common
-            """
-
-        # Backend status in "backend-demo" is updated
-        When The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo-volume-mount
-                annotations:
-                    service.binding/host: path={.spec.host}
-                    service.binding/ready: path={.status.ready}
-            spec:
-                host: example.common
-            status:
-                ready: true
-            """
-        Then The env var "host" is not available to the application
-        And The env var "ready" is not available to the application
-        And Content of file "/bindings/binding-request-backend-volume-mount/host" in application pod is
-            """
-            example.common
-            """
-        And Content of file "/bindings/binding-request-backend-volume-mount/ready" in application pod is
-            """
-            true
-            """
     @olm
     Scenario: Backend Service new spec status update gets propagated to the binding secret
         Given OLM Operator "backend-new-spec" is running
@@ -962,53 +834,6 @@ Feature: Bind an application to a service
         Then Service Binding "binding-request-cross-ns-service" is ready
         And The application env var "BACKEND_HOST_CROSS_NS_SERVICE" has value "cross.ns.service.stable.example.com"
 
-    @olm
-    Scenario: Binding secret is repopulated on external update
-        Given OLM Operator "backend-new-spec" is running
-        * The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo
-            spec:
-                host: example.common
-            """
-        * Service Binding is applied
-            """
-            apiVersion: binding.operators.coreos.com/v1alpha1
-            kind: ServiceBinding
-            metadata:
-                name: binding-request-secret-updated-externally
-            spec:
-                services:
-                -   group: stable.example.com
-                    version: v1
-                    kind: Backend
-                    name: backend-demo
-            """
-        Then Secret name should be updated in Service Binding status
-        And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-secret-updated-externally" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-secret-updated-externally" should be changed to "False"
-        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-secret-updated-externally" should be changed to "True"
-        And Secret contains "BACKEND_HOST" key with value "example.common"
-
-        * Binding secret is updated
-            """
-            apiVersion: v1
-            kind: Secret
-            metadata:
-                name: binding-request-secret-updated-externally
-            type: Opaque
-            stringData:
-                host2: example2.common
-            """
-        Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-secret-updated-externally" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-secret-updated-externally" should be changed to "False"
-        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-secret-updated-externally" should be changed to "True"
-        And Secret contains "BACKEND_HOST" key with value "example.common"
-        And Secret does not contain "host2"
-
     Scenario: Inject all configmap keys into application
         Given The ConfigMap is present
             """
diff --git a/test/acceptance/features/bindAppToServiceAnnotations.feature b/test/acceptance/features/bindAppToServiceAnnotations.feature
index 812bb9d0..5673fe77 100644
--- a/test/acceptance/features/bindAppToServiceAnnotations.feature
+++ b/test/acceptance/features/bindAppToServiceAnnotations.feature
@@ -324,111 +324,6 @@ Feature: Bind an application to a service using annotations
         And The application env var "BACKEND_WEBARROWS_SECONDARY" has value "secondary.example.com"
         And The application env var "BACKEND_WEBARROWS_404" has value "black-hole.example.com"
 
-    Scenario: Backend Service metadata annotations update for service bindings gets propagated to the binding secret
-        Given CustomResourceDefinition backends.stable.example.com is available
-        * The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo-2
-                annotations:
-                    service.binding/host: path={.spec.host}
-            spec:
-                host: example.com
-            status:
-                ready:true
-            """
-        * Service Binding is applied
-            """
-            apiVersion: binding.operators.coreos.com/v1alpha1
-            kind: ServiceBinding
-            metadata:
-                name: binding-request-backend-ann-sb
-            spec:
-                services:
-                  - group: stable.example.com
-                    version: v1
-                    kind: Backend
-                    name: backend-demo-2
-            """
-        Then Secret name should be updated in Service Binding status
-        And Secret contains "BACKEND_HOST" key with value "example.com"
-        And Secret does not contain "BACKEND_READY"
-        # Backend metadata.annotations for service binding is updated
-        When The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo-2
-                annotations:
-                    service.binding/host: path={.spec.host}
-                    service.binding/ready: path={.status.ready}
-            spec:
-                host: example.com
-            status:
-                ready: true
-            """
-        Then Secret name should be updated in Service Binding status
-        And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend-ann-sb" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend-ann-sb" should be changed to "False"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").reason" of Service Binding "binding-request-backend-ann-sb" should be changed to "EmptyApplication"
-        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-ann-sb" should be changed to "True"
-        And Secret contains "BACKEND_READY" key with value "true"
-        And Secret contains "BACKEND_HOST" key with value "example.com"
-
-
-    @negative
-    Scenario: Backend Service metadata annotations update not specific to service bindings does not get propagated to the binding secret
-        Given CustomResourceDefinition backends.stable.example.com is available
-        * The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo-3
-                annotations:
-                    host : "demo.com"
-            spec:
-                host: example.com
-            status:
-                ready:true
-            """
-        * Service Binding is applied
-            """
-            apiVersion: binding.operators.coreos.com/v1alpha1
-            kind: ServiceBinding
-            metadata:
-                name: binding-request-backend-ann
-            spec:
-                services:
-                  - group: stable.example.com
-                    version: v1
-                    kind: Backend
-                    name: backend-demo-3
-            """
-        And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend-ann" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend-ann" should be changed to "False"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").reason" of Service Binding "binding-request-backend-ann" should be changed to "EmptyApplication"
-        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-ann" should be changed to "True"
-        And Secret is empty
-        # Backend metadata.annotations not pertaining to service binding is updated
-        When The Custom Resource is present
-            """
-            apiVersion: "stable.example.com/v1"
-            kind: Backend
-            metadata:
-                name: backend-demo-3
-                annotations:
-                    host : "example.common"
-            spec:
-                host: example.com
-            status:
-                ready: true
-            """
-        Then Secret is empty
-
     Scenario: Bind referring service using group version resource
         Given Generic test application "binding-service-via-gvr" is running
         * CustomResourceDefinition backends.stable.example.com is available
diff --git a/test/acceptance/features/deleteBackendServiceAndRecreate.feature b/test/acceptance/features/deleteBackendServiceAndRecreate.feature
deleted file mode 100644
index 7e7734b8..00000000
--- a/test/acceptance/features/deleteBackendServiceAndRecreate.feature
+++ /dev/null
@@ -1,124 +0,0 @@
-Feature: Reconcile when BackingService CR got deleted and recreated
-
-    As a user of Service Binding Operator
-    I want the SBR to be reconciled when there backend service was deleted and created again
-
-    Background:
-        Given Namespace [TEST_NAMESPACE] is used
-        * Service Binding Operator is running
-
-    Scenario: Reconcile when BackingService CR got deleted and recreated
-        Given Generic test application "ssa-3" is running
-        And The Custom Resource Definition is present
-            """
-            apiVersion: apiextensions.k8s.io/v1beta1
-            kind: CustomResourceDefinition
-            metadata:
-                name: backends.stable.example.com
-                annotations:
-                    service.binding: path={.status.data.dbCredentials},objectType=Secret,elementType=map
-            spec:
-                group: stable.example.com
-                versions:
-                  - name: v1
-                    served: true
-                    storage: true
-                scope: Namespaced
-                names:
-                    plural: backends
-                    singular: backend
-                    kind: Backend
-                    shortNames:
-                      - bk
-            """
-        And The Secret is present
-            """
-            apiVersion: v1
-            kind: Secret
-            metadata:
-                name: ssa-3-secret
-            stringData:
-                username: AzureDiamond
-                password: hunter
-            """
-        And The Custom Resource is present
-            """
-            apiVersion: stable.example.com/v1
-            kind: Backend
-            metadata:
-                name: ssa-3-service
-            spec:
-                image: docker.io/postgres
-                imageName: postgres
-                dbName: db-demo
-            status:
-                data:
-                    dbCredentials: ssa-3-secret
-            """
-        When Service Binding is applied
-            """
-            apiVersion: binding.operators.coreos.com/v1alpha1
-            kind: ServiceBinding
-            metadata:
-                name: ssa-3
-            spec:
-                services:
-                  - group: stable.example.com
-                    version: v1
-                    kind: Backend
-                    name: ssa-3-service
-                application:
-                    name: ssa-3
-                    group: apps
-                    version: v1
-                    resource: deployments
-            """
-        Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "ssa-3" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "ssa-3" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "ssa-3" should be changed to "True"
-        And The application env var "BACKEND_USERNAME" has value "AzureDiamond"
-        And The application env var "BACKEND_PASSWORD" has value "hunter"
-	    When BackingService is deleted
-            """
-            apiVersion: stable.example.com/v1
-            kind: Backend
-            metadata:
-                name: ssa-3-service
-            spec:
-                image: docker.io/postgres
-                imageName: postgres
-                dbName: db-demo
-            status:
-                data:
-                    dbCredentials: ssa-3-secret
-            """
-        And The Secret is present
-            """
-            apiVersion: v1
-            kind: Secret
-            metadata:
-                name: ssa-3-secret
-            stringData:
-                username: AzureDiamond2
-                password: hunter2
-            """
-        And The Custom Resource is present
-            """
-            apiVersion: stable.example.com/v1
-            kind: Backend
-            metadata:
-                name: ssa-3-service
-            spec:
-                image: docker.io/postgres
-                imageName: postgres
-                dbName: db-demo
-            status:
-                data:
-                    dbCredentials: ssa-3-secret
-            """
-        Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "ssa-3" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "ssa-3" should be changed to "True"
-        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "ssa-3" should be changed to "True"
-        And The application env var "BACKEND_USERNAME" has value "AzureDiamond2"
-        And The application env var "BACKEND_PASSWORD" has value "hunter2"
-