Repository: tektoncd/operator
Pull request #678 (2022-03-14 12:58:14)

Update release pipelines
Add Hub and Chains versions PARAM to release pipelien and
fetch component task

Signed-off-by: Nikhil Thomas <nikthoma@redhat.com>

# Changes

<!-- 🎉🎉🎉 Thank you for the PR!!! 🎉🎉🎉 -->

<!-- Describe your changes here- ideally you can get that description straight from
your descriptive commit message(s)! -->

# Submitter Checklist

These are the criteria that every PR should meet, please check them off as you
review them:

- [ ] Includes [tests](https://github.com/tektoncd/community/blob/master/standards.md#principles) (if functionality changed/added)
- [ ] Includes [docs](https://github.com/tektoncd/community/blob/master/standards.md#principles) (if user facing)
- [ ] Commit messages follow [commit message best practices](https://github.com/tektoncd/community/blob/master/standards.md#commit-messages)

_See [the contribution guide](https://github.com/tektoncd/operator/blob/master/CONTRIBUTING.md) for more details._

# Release Notes

<!--
Describe any user facing changes here, or delete this block.

Examples of user facing changes:
- API changes
- Bug fixes
- Any changes in behavior
- Changes requiring upgrade notices or deprecation warnings

For pull requests with a release note:

```release-note
Your release note here
```

For pull requests that require additional action from users switching to the new release, include the string "action required" (case insensitive) in the release note:

```release-note
action required: your release note here
```

For pull requests that don't need to be mentioned at release time, use the `/release-note-none` Prow command to add the `release-note-none` label to the PR. You can also write the string "NONE" as a release note in your PR description:

```release-note
NONE
```
-->
```release-note
NONE
```

tekton-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 **nikhil-thomas**
You can assign the PR to them by writing `/assign @nikhil-thomas` 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=tektoncd%2Foperator).

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

- **[OWNERS](https://github.com/tektoncd/operator/blob/main/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["nikhil-thomas"]} -->
tekton-robot: @nikhil-thomas: The following test **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-tekton-operator-integration-tests | 3086fafcaee815d25d143a8a99984a70faa8d455 | [link](https://tekton-releases.appspot.com/build/tekton-prow/pr-logs/pull/tektoncd_operator/678/pull-tekton-operator-integration-tests/1503354862367150084/) | `/test pull-tekton-operator-integration-tests`

[Full PR test history](https://tekton-releases.appspot.com/pr/tektoncd_operator/678). [Your PR dashboard](https://prow.tekton.dev/pr/nikhil-thomas).

<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 -->
tekton-robot: @nikhil-thomas: The following test **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
pull-tekton-operator-integration-tests | 3086fafcaee815d25d143a8a99984a70faa8d455 | [link](https://tekton-releases.appspot.com/build/tekton-prow/pr-logs/pull/tektoncd_operator/678/pull-tekton-operator-integration-tests/1503354862367150084/) | `/test pull-tekton-operator-integration-tests`

[Full PR test history](https://tekton-releases.appspot.com/pr/tektoncd_operator/678). [Your PR dashboard](https://prow.tekton.dev/pr/nikhil-thomas).

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

This pull-request has been approved by: *<a href="https://github.com/tektoncd/operator/pull/678#pullrequestreview-909940001" title="Approved">vdemeester</a>*

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

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/tektoncd/operator/blob/main/OWNERS)~~ [vdemeester]

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/Makefile b/Makefile
index 03fd328e5..2899ae4f8 100644
--- a/Makefile
+++ b/Makefile
@@ -23,10 +23,13 @@ export GO111MODULE=on
 $(BIN):
 	@mkdir -p $@
 $(BIN)/%: | $(BIN) ; $(info $(M) building $(PACKAGE)…)
-	$Q tmp=$$(mktemp -d); \
-	   env GO111MODULE=off GOPATH=$$tmp GOBIN=$(BIN) $(GO) get $(PACKAGE) \
+	$Q tmp=$$(mktemp -d); cd $$tmp; \
+  		env GO111MODULE=on GOPATH=$$tmp GOBIN=$(BIN) $(GO) install $(PACKAGE) \
 		|| ret=$$?; \
-	   rm -rf $$tmp ; exit $$ret
+  		env GO111MODULE=on GOPATH=$$tmp GOBIN=$(BIN) $(GO) clean -modcache \
+        || ret=$$?; \
+		cd - ; \
+	  	rm -rf $$tmp ; exit $$ret
 
 KO = $(or ${KO_BIN},${KO_BIN},$(BIN)/ko)
 
@@ -34,11 +37,13 @@ TEKTON_PIPELINE_VERSION ?= latest
 TEKTON_TRIGGERS_VERSION ?= latest
 TEKTON_DASHBOARD_VERSION ?= latest
 TEKTON_RESULTS_VERSION ?= v0.4.0 # latest returns an older version hence hard coding to v0.3.1 for now (tektoncd/results#138)
-PAC_VERSION ?= 0.5.3
-TEKTON_HUB_VERSION ?= v1.7.0 # latest doesn't returns any version hence hard coding to v1.7.0 for now
+PAC_VERSION ?= 0.5.5
+TEKTON_HUB_VERSION ?= v1.7.1 # latest doesn't returns any version hence hard coding to v1.7.1 for now
 TEKTON_CHAINS_VERSION ?= latest
 
-$(BIN)/ko: PACKAGE=github.com/google/ko
+# TODO: after updating go version to 1.17 uncommnent the line below to install latest version of ko
+# $(BIN)/ko: PACKAGE=github.com/google/ko
+$(BIN)/ko: PACKAGE=github.com/google/ko@v0.9.3
 
 KUSTOMIZE = $(or ${KUSTOMIZE_BIN},${KUSTOMIZE_BIN},$(BIN)/kustomize)
 $(BIN)/kustomize: | $(BIN) ; $(info $(M) getting kustomize)
diff --git a/OWNERS b/OWNERS
index e7e999efe..b5b8d38c4 100644
--- a/OWNERS
+++ b/OWNERS
@@ -7,7 +7,7 @@ approvers:
 - houshengbo
 - vincent-pli
 - sm43
+- concaf
 reviewers:
 - pradeepitm12
 - piyush-garg
-- concaf
\ No newline at end of file
diff --git a/cmd/openshift/operator/kodata/openshift/tekton-hub/01-consolelink-hub.yaml b/cmd/openshift/operator/kodata/openshift/tekton-hub/01-consolelink-hub.yaml
new file mode 100644
index 000000000..e708d4515
--- /dev/null
+++ b/cmd/openshift/operator/kodata/openshift/tekton-hub/01-consolelink-hub.yaml
@@ -0,0 +1,88 @@
+apiVersion: console.openshift.io/v1
+kind: ConsoleLink
+metadata:
+  name: hub
+spec:
+  applicationMenu:
+    imageURL: >-
+      data:image/png;base64,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
+    section: Red Hat applications
+  href: >-
+    https://hub.placeholder_url.dev
+  location: ApplicationMenu
+  text: Tekton Hub
diff --git a/cmd/openshift/operator/kodata/tekton-addon/addons/02-clustertasks/source_local/maven/maven-task.yaml b/cmd/openshift/operator/kodata/tekton-addon/addons/02-clustertasks/source_local/maven/maven-task.yaml
index 51ac33ec7..ac5b99449 100644
--- a/cmd/openshift/operator/kodata/tekton-addon/addons/02-clustertasks/source_local/maven/maven-task.yaml
+++ b/cmd/openshift/operator/kodata/tekton-addon/addons/02-clustertasks/source_local/maven/maven-task.yaml
@@ -23,7 +23,7 @@ spec:
     - name: MAVEN_IMAGE
       type: string
       description: Maven base image
-      default: image-registry.openshift-image-registry.svc:5000/openshift/openjdk-11-rhel8:1.0
+      default: image-registry.openshift-image-registry.svc:5000/openshift/java:latest
     - name: GOALS
       description: maven goals to run
       type: array
diff --git a/cmd/openshift/operator/kodata/tekton-addon/addons/04-consolecli/console_cli_download_tkn.yaml b/cmd/openshift/operator/kodata/tekton-addon/addons/04-consolecli/console_cli_download_tkn.yaml
index dc7372a29..532a28d4a 100644
--- a/cmd/openshift/operator/kodata/tekton-addon/addons/04-consolecli/console_cli_download_tkn.yaml
+++ b/cmd/openshift/operator/kodata/tekton-addon/addons/04-consolecli/console_cli_download_tkn.yaml
@@ -4,15 +4,4 @@ metadata:
   name: tkn
 spec:
   description: The OpenShift Pipeline client `tkn` is a CLI tool that allows you to manage OpenShift Pipeline resources.
-  displayName: tkn - OpenShift Pipeline Command Line Interface (CLI)
-  links:
-    - href: https://mirror.openshift.com/pub/openshift-v4/clients/pipeline/0.17.2/tkn-linux-amd64-0.17.2.tar.gz
-      text: Download tkn for Linux
-    - href: https://mirror.openshift.com/pub/openshift-v4/clients/pipeline/0.17.2/tkn-macos-amd64-0.17.2.tar.gz
-      text: Download tkn for Mac
-    - href: https://mirror.openshift.com/pub/openshift-v4/clients/pipeline/0.17.2/tkn-windows-amd64-0.17.2.zip
-      text: Download tkn for Windows
-    - href: https://mirror.openshift.com/pub/openshift-v4/clients/pipeline/0.17.2/tkn-linux-ppc64le-0.17.2.tar.gz
-      text: Download tkn for IBM Power
-    - href: https://mirror.openshift.com/pub/openshift-v4/clients/pipeline/0.17.2/tkn-linux-s390x-0.17.2.tar.gz
-      text: Download tkn for IBM Z
+  displayName: tkn - OpenShift Pipeline Command Line Interface (CLI)
\ No newline at end of file
diff --git a/cmd/openshift/operator/kodata/tekton-addon/optional/quickstarts/install-associate-pipeline-quickstart.yaml b/cmd/openshift/operator/kodata/tekton-addon/optional/quickstarts/install-associate-pipeline-quickstart.yaml
index b157eaa84..efb7c1ba6 100644
--- a/cmd/openshift/operator/kodata/tekton-addon/optional/quickstarts/install-associate-pipeline-quickstart.yaml
+++ b/cmd/openshift/operator/kodata/tekton-addon/optional/quickstarts/install-associate-pipeline-quickstart.yaml
@@ -20,7 +20,7 @@ spec:
       ### Follow these steps to create an application.
       1. From the **Developer** perspective, in the navigation menu, click **+Add**.
       2. At the top of the page, in the Projects list, select a project or create a new project to put the application in.
-      3. Click **From Git**.
+      3. Click **Import from Git**.
       4. In the **Git Repo URL** field, enter `https://github.com/sclorg/django-ex.git`.
       4. In the **Pipelines** section, click the checkbox to add a pipeline to your application.
       5. Click **Create** when you’re done.
diff --git a/cmd/kubernetes/operator/kodata/info/operator-config.yaml b/config/base/config-info.yaml
similarity index 94%
rename from cmd/kubernetes/operator/kodata/info/operator-config.yaml
rename to config/base/config-info.yaml
index 324b648b5..d92b79311 100644
--- a/cmd/kubernetes/operator/kodata/info/operator-config.yaml
+++ b/config/base/config-info.yaml
@@ -15,10 +15,10 @@
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: operators-info
+  name: tekton-operator-info
   labels:
     app.kubernetes.io/instance: default
 data:
   # Contains operator version which can be queried by external
   # tools such as CLI.
-  version: 'devel'
+  version: "devel"
diff --git a/config/base/config-info_role.yaml b/config/base/config-info_role.yaml
new file mode 100644
index 000000000..ef10354f5
--- /dev/null
+++ b/config/base/config-info_role.yaml
@@ -0,0 +1,29 @@
+# Copyright 2022 The Tekton Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: tekton-operator-info
+  labels:
+    app.kubernetes.io/instance: default
+rules:
+  # All system:authenticated users need to have access
+  # to the tekton-operator-info ConfigMap even if they don't
+  # have access to other resources present in the
+  # installed namespace
+  - apiGroups: [""]
+    resources: ["configmaps"]
+    resourceNames: ["tekton-operator-info"]
+    verbs: ["get"]
diff --git a/cmd/openshift/operator/kodata/info/operator-config.yaml b/config/base/config-info_role_binding.yaml
similarity index 62%
rename from cmd/openshift/operator/kodata/info/operator-config.yaml
rename to config/base/config-info_role_binding.yaml
index 324b648b5..23ccc283d 100644
--- a/cmd/openshift/operator/kodata/info/operator-config.yaml
+++ b/config/base/config-info_role_binding.yaml
@@ -12,13 +12,19 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-apiVersion: v1
-kind: ConfigMap
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
 metadata:
-  name: operators-info
+  name: tekton-operator-info
   labels:
     app.kubernetes.io/instance: default
-data:
-  # Contains operator version which can be queried by external
-  # tools such as CLI.
-  version: 'devel'
+subjects:
+  # Giving all system:authenticated users the access to the
+  # ConfigMap which contains version information
+  - kind: Group
+    name: system:authenticated
+    apiGroup: rbac.authorization.k8s.io
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: Role
+  name: tekton-operator-info
diff --git a/config/base/kustomization.yaml b/config/base/kustomization.yaml
index 5152ad591..846096c6f 100644
--- a/config/base/kustomization.yaml
+++ b/config/base/kustomization.yaml
@@ -29,3 +29,6 @@ resources:
 - operator.yaml
 - tekton_config_role.yaml
 - tekton_config_role_binding.yaml
+- config-info.yaml
+- config-info_role.yaml
+- config-info_role_binding.yaml
diff --git a/config/openshift/base/operator.yaml b/config/openshift/base/operator.yaml
index 8964fbc9e..ff2d2c841 100644
--- a/config/openshift/base/operator.yaml
+++ b/config/openshift/base/operator.yaml
@@ -67,11 +67,13 @@ spec:
         - name: IMAGE_HUB_TEKTON_HUB_DB
           value: registry.redhat.io/rhel8/postgresql-13@sha256:6032adb3eac903ee8aa61f296ca9aaa57f5709e5673504b609222e042823f195
         - name: IMAGE_ADDONS_PARAM_BUILDER_IMAGE
-          value: registry.redhat.io/rhel8/buildah@sha256:31f84b19a0774be7cfad751be38fc97f5e86cefd26e0abaec8047ddc650b00bf
+          value: registry.redhat.io/rhel8/buildah@sha256:23fb7971ea6ac4aaaaa1139473a602df0df19222a3b5a76b551b2b9ddd92e927
         - name: IMAGE_ADDONS_PARAM_KN_IMAGE
-          value: registry.redhat.io/openshift-serverless-1/client-kn-rhel8@sha256:b8b992e36f76d80b1daeed0532adf94b1ce570a6aaef1dbcc2a28c666f8cd296
+          value: registry.redhat.io/openshift-serverless-1/client-kn-rhel8@sha256:9bc475db01697e6d6eac2e47a655971cbee7f821684aa48f30729fb49976559d
+        - name: IMAGE_ADDONS_MVN_SETTINGS
+          value: registry.redhat.io/ubi8/ubi-minimal@sha256:574f201d7ed185a9932c91cef5d397f5298dff9df08bc2ebb266c6d1e6284cd1
         - name: IMAGE_ADDONS_SKOPEO_COPY
-          value: registry.redhat.io/rhel8/skopeo@sha256:a458abaee565344e8c31468bb5bec26bdc622c559678ab73b07ee4998de68bd0
+          value: registry.redhat.io/rhel8/skopeo@sha256:cc58da50c3842f5f2a4ba8781b60f6052919a5555a000cb4eb18a0bd0241b2b3
         - name: IMAGE_ADDONS_GENERATE
           value: registry.redhat.io/ocp-tools-4-tech-preview/source-to-image-rhel8@sha256:98d8cb3a255641ca6a1bce854e5e2460c20de9fb9b28e3cc67eb459f122873dd
 #          - name: IMAGE_ADDONS_TKN_CLI_SERVE
diff --git a/config/openshift/base/role.yaml b/config/openshift/base/role.yaml
index ac1944fe8..ed561e84e 100644
--- a/config/openshift/base/role.yaml
+++ b/config/openshift/base/role.yaml
@@ -287,6 +287,7 @@ rules:
   - consoleyamlsamples
   - consoleclidownloads
   - consolequickstarts
+  - consolelinks
   verbs:
   - delete
   - deletecollection
diff --git a/hack/openshift/update-image-sha.sh b/hack/openshift/update-image-sha.sh
index b10289bc9..30809ec1e 100755
--- a/hack/openshift/update-image-sha.sh
+++ b/hack/openshift/update-image-sha.sh
@@ -48,8 +48,13 @@ declare -A IMAGES=(
   ["kn"]="registry.redhat.io/openshift-serverless-1/client-kn-rhel8"
   ["skopeo-copy"]="registry.redhat.io/rhel8/skopeo"
   ["s2i"]="registry.redhat.io/ocp-tools-4-tech-preview/source-to-image-rhel8"
+  ["ubi-minimal"]="registry.redhat.io/ubi8/ubi-minimal"
 )
 
+registry_login() {
+  podman login --username=${USERNAME} --password=${PASSWORD} registry.redhat.io
+}
+
 find_latest_versions() {
   local image_registry=${1:-""}
   local latest_version=""
@@ -73,7 +78,7 @@ update_image_sha() {
 
 
 main() {
-
+  registry_login
   for image in ${!IMAGES[@]}; do
     latest_version=$(find_latest_versions ${IMAGES[$image]})
     echo latest_version=$latest_version
diff --git a/hack/release-common.sh b/hack/release-common.sh
new file mode 100644
index 000000000..72a1d974f
--- /dev/null
+++ b/hack/release-common.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+set -u
+
+function set_version_label() {
+  local operator_version="v${1}"
+
+  shift
+  local operator_platforms=${*:-"kubernetes openshift"}
+
+  echo ${operator_platforms}
+  printf "%-20s: %s\n" "Platforms" "${operator_platforms}"
+  printf "%-20s: %s\n" "Operator version" "${operator_version}"
+  echo '---------------------'
+  for platform in ${operator_platforms}; do
+    echo updating version labels for platform: ${platform}, version: ${operator_version}
+    sed -i -e 's/\(operator.tekton.dev\/release\): "devel"/\1: '${operator_version}'/g' -e 's/\(app.kubernetes.io\/version\): "devel"/\1: '${operator_version}'/g' -e 's/\(version\): "devel"/\1: '${operator_version}'/g' -e 's/\("-version"\), "devel"/\1, '${operator_version}'/g' config/base/*.yaml
+    sed -i -e 's/\(operator.tekton.dev\/release\): "devel"/\1: '${operator_version}'/g' -e 's/\(app.kubernetes.io\/version\): "devel"/\1: '${operator_version}'/g' -e 's/\(version\): "devel"/\1: '${operator_version}'/g' -e 's/\("-version"\), "devel"/\1, '${operator_version}'/g' config/webhooks/*.yaml
+    sed -i -e 's/\(operator.tekton.dev\/release\): "devel"/\1: '${operator_version}'/g' -e 's/\(app.kubernetes.io\/version\): "devel"/\1: '${operator_version}'/g' -e 's/\(version\): "devel"/\1: '${operator_version}'/g' -e 's/\("-version"\), "devel"/\1, '${operator_version}'/g' config/${platform}/base/*.yaml
+    sed -i -e 's/\(operator.tekton.dev\/release\): "devel"/\1: '${operator_version}'/g' -e 's/\(app.kubernetes.io\/version\): "devel"/\1: '${operator_version}'/g' -e 's/\(version\): "devel"/\1: '${operator_version}'/g' -e 's/\("-version"\), "devel"/\1, '${operator_version}'/g' config/${platform}/overlays/default/*.yaml
+    sed -i -e 's/\(operator.tekton.dev\/release\): "devel"/\1: '${operator_version}'/g' -e 's/\(app.kubernetes.io\/version\): "devel"/\1: '${operator_version}'/g' -e 's/\(version\): "devel"/\1: '${operator_version}'/g' -e 's/\("-version"\), "devel"/\1, '${operator_version}'/g' cmd/${platform}/operator/kodata/webhook/*.yaml
+    sed -i 's/\(value\): "devel"/\1: '${operator_version}'/g' config/${platform}/base/operator.yaml
+  done
+}
diff --git a/hack/release-setup-branch.sh b/hack/release-setup-branch.sh
new file mode 100755
index 000000000..90172c2a1
--- /dev/null
+++ b/hack/release-setup-branch.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+set -u
+
+source ./hack/release-common.sh
+
+OPERATOR_RELEASE_VERSION=${1}
+set_version_label ${OPERATOR_RELEASE_VERSION}
diff --git a/operatorhub/openshift/config.yaml b/operatorhub/openshift/config.yaml
index 2ea51349f..814edfb56 100644
--- a/operatorhub/openshift/config.yaml
+++ b/operatorhub/openshift/config.yaml
@@ -56,6 +56,13 @@ image-substitutions:
       containerName: openshift-pipelines-operator
       envKeys:
       - IMAGE_PIPELINES_ARG__KUBECONFIG_WRITER_IMAGE
+- image: registry.redhat.io/openshift-pipelines/pipelines-workingdirinit-rhel8@
+  replaceLocations:
+    envTargets:
+      - deploymentName: openshift-pipelines-operator
+        containerName: openshift-pipelines-operator
+        envKeys:
+          - IMAGE_PIPELINES_ARG__WORKINGDIRINIT_IMAGE
 - image: registry.redhat.io/openshift-pipelines/pipelines-pullrequest-init-rhel8@
   replaceLocations:
     envTargets:
@@ -70,7 +77,7 @@ image-substitutions:
       containerName: openshift-pipelines-operator
       envKeys:
       - IMAGE_PIPELINES_ARG__NOP_IMAGE
-- image: registry.access.redhat.com/ubi8/ubi-minimal@sha256:cf1c63e3247e4074ee3549a064b8798a1a2513ad57dd79c9edb979836355b469
+- image: registry.redhat.io/ubi8/ubi-minimal@sha256:574f201d7ed185a9932c91cef5d397f5298dff9df08bc2ebb266c6d1e6284cd1
   replaceLocations:
     envTargets:
     - deploymentName: openshift-pipelines-operator
@@ -105,21 +112,21 @@ image-substitutions:
       containerName: openshift-pipelines-operator
       envKeys:
       - IMAGE_TRIGGERS_ARG__EL_IMAGE
-- image: registry.redhat.io/openshift-serverless-1/client-kn-rhel8@sha256:b8b992e36f76d80b1daeed0532adf94b1ce570a6aaef1dbcc2a28c666f8cd296
+- image: registry.redhat.io/openshift-serverless-1/client-kn-rhel8@sha256:9bc475db01697e6d6eac2e47a655971cbee7f821684aa48f30729fb49976559d
   replaceLocations:
     envTargets:
     - deploymentName: openshift-pipelines-operator
       containerName: openshift-pipelines-operator
       envKeys:
       - IMAGE_ADDONS_PARAM_KN_IMAGE
-- image: registry.redhat.io/rhel8/skopeo@sha256:a458abaee565344e8c31468bb5bec26bdc622c559678ab73b07ee4998de68bd0
+- image: registry.redhat.io/rhel8/skopeo@sha256:cc58da50c3842f5f2a4ba8781b60f6052919a5555a000cb4eb18a0bd0241b2b3
   replaceLocations:
     envTargets:
     - deploymentName: openshift-pipelines-operator
       containerName: openshift-pipelines-operator
       envKeys:
       - IMAGE_ADDONS_SKOPEO_COPY
-- image: registry.redhat.io/rhel8/buildah@sha256:31f84b19a0774be7cfad751be38fc97f5e86cefd26e0abaec8047ddc650b00bf
+- image: registry.redhat.io/rhel8/buildah@sha256:23fb7971ea6ac4aaaaa1139473a602df0df19222a3b5a76b551b2b9ddd92e927
   replaceLocations:
     envTargets:
     - deploymentName: openshift-pipelines-operator
@@ -133,6 +140,14 @@ image-substitutions:
       containerName: openshift-pipelines-operator
       envKeys:
       - IMAGE_ADDONS_GENERATE
+
+- image: registry.redhat.io/ubi8/ubi-minimal@sha256:574f201d7ed185a9932c91cef5d397f5298dff9df08bc2ebb266c6d1e6284cd1
+  replaceLocations:
+    envTargets:
+      - deploymentName: openshift-pipelines-operator
+        containerName: openshift-pipelines-operator
+        envKeys:
+          - IMAGE_ADDONS_MVN_SETTINGS
 - image: registry.redhat.io/openshift-pipelines/pipelines-cli-tkn-rhel8@
   replaceLocations:
     envTargets:
@@ -199,13 +214,15 @@ image-substitutions:
 # add third party images which are not replaced by operator
 # but pulled directly by tasks here
 defaultRelatedImages:
-- image: registry.redhat.io/rhel8/buildah@sha256:31f84b19a0774be7cfad751be38fc97f5e86cefd26e0abaec8047ddc650b00bf
+- image: registry.redhat.io/rhel8/buildah@sha256:23fb7971ea6ac4aaaaa1139473a602df0df19222a3b5a76b551b2b9ddd92e927
   name: IMAGE_ADDONS_PARAM_BUILDER_IMAGE
-- image: registry.redhat.io/openshift-serverless-1/client-kn-rhel8@sha256:b8b992e36f76d80b1daeed0532adf94b1ce570a6aaef1dbcc2a28c666f8cd296
+- image: registry.redhat.io/openshift-serverless-1/client-kn-rhel8@sha256:9bc475db01697e6d6eac2e47a655971cbee7f821684aa48f30729fb49976559d
   name: IMAGE_ADDONS_PARAM_KN_IMAGE
-- image: registry.redhat.io/rhel8/skopeo@sha256:a458abaee565344e8c31468bb5bec26bdc622c559678ab73b07ee4998de68bd0
+- image: registry.redhat.io/rhel8/skopeo@sha256:cc58da50c3842f5f2a4ba8781b60f6052919a5555a000cb4eb18a0bd0241b2b3
   name: IMAGE_ADDONS_SKOPEO_COPY
 - image: registry.redhat.io/ocp-tools-4-tech-preview/source-to-image-rhel8@sha256:98d8cb3a255641ca6a1bce854e5e2460c20de9fb9b28e3cc67eb459f122873dd
   name: IMAGE_ADDONS_GENERATE
+- image: registry.redhat.io/ubi8/ubi-minimal@sha256:574f201d7ed185a9932c91cef5d397f5298dff9df08bc2ebb266c6d1e6284cd1
+  name: IMAGE_ADDONS_MVN_SETTINGS
 #- image: "" ##<imagename>:<tag> or <imagename>@<sha>
 #  name: "" # ENV key name value
diff --git a/operatorhub/openshift/manifests/bases/openshift-pipelines-operator-rh.clusterserviceversion.template.yaml b/operatorhub/openshift/manifests/bases/openshift-pipelines-operator-rh.clusterserviceversion.template.yaml
index bc5a47dbf..e89e00743 100644
--- a/operatorhub/openshift/manifests/bases/openshift-pipelines-operator-rh.clusterserviceversion.template.yaml
+++ b/operatorhub/openshift/manifests/bases/openshift-pipelines-operator-rh.clusterserviceversion.template.yaml
@@ -197,7 +197,7 @@ spec:
     - ClusterTasks based on Tekton Catalog 0.28
 
     ## Getting Started
-    In order to get familiar with _OpenShift Pipelines_ concepts and create your first pipeline, follow the [OpenShift Pipelines Docs](https://docs.openshift.com/container-platform/latest/pipelines/creating-applications-with-cicd-pipelines.html).
+    In order to get familiar with _OpenShift Pipelines_ concepts and create your first pipeline, follow the [OpenShift Pipelines Docs](https://docs.openshift.com/container-platform/OPENSHIFT_DOCS_VERSION/cicd/pipelines/creating-applications-with-cicd-pipelines.html).
 
     ## CLI (tkn)
     Tekton Pipelines cli project provides a CLI (tkn) for interacting with OpenShift Pipelines.
diff --git a/operatorhub/tools/bundle.py b/operatorhub/tools/bundle.py
index 6082f66f3..82aed062d 100755
--- a/operatorhub/tools/bundle.py
+++ b/operatorhub/tools/bundle.py
@@ -305,6 +305,6 @@ if __name__ == "__main__":
     divider("BundleGen")
     config = buildConfig()
     return_code = generate_bundle(config)
-    if return_code is not 0:
+    if return_code != 0:
         exit(return_code)
     newCSVmods(config)
diff --git a/pkg/apis/operator/v1alpha1/const.go b/pkg/apis/operator/v1alpha1/const.go
index b84a0400e..82bc11ff1 100644
--- a/pkg/apis/operator/v1alpha1/const.go
+++ b/pkg/apis/operator/v1alpha1/const.go
@@ -16,7 +16,11 @@ limitations under the License.
 
 package v1alpha1
 
-import "fmt"
+import (
+	"fmt"
+	"knative.dev/pkg/controller"
+	"time"
+)
 
 const (
 	// operatorVersion
@@ -47,6 +51,8 @@ const (
 	InstallerSetType       = "operator.tekton.dev/type"
 
 	UpgradePending = "upgrade pending"
+
+	RequeueDelay = 10 * time.Second
 )
 
 var (
@@ -55,6 +61,8 @@ var (
 	// that we proceed ahead with updated object
 	RECONCILE_AGAIN_ERR = fmt.Errorf("reconcile again and proceed")
 
+	REQUEUE_EVENT_AFTER = controller.NewRequeueAfter(RequeueDelay)
+
 	// DEPENDENCY_UPGRADE_PENDING_ERR
 	// When a reconciler cannot proceed due to an upgrade in progress of a dependency
 	DEPENDENCY_UPGRADE_PENDING_ERR = fmt.Errorf("dependency upgrade pending")
diff --git a/pkg/reconciler/common/targetnamespace.go b/pkg/reconciler/common/targetnamespace.go
index 58c63288f..d231a4888 100644
--- a/pkg/reconciler/common/targetnamespace.go
+++ b/pkg/reconciler/common/targetnamespace.go
@@ -18,10 +18,7 @@ package common
 
 import (
 	"context"
-	"os"
-	"path/filepath"
 
-	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -51,27 +48,3 @@ func CreateTargetNamespace(ctx context.Context, labels map[string]string, obj v1
 	}
 	return nil
 }
-
-func CreateOperatorVersionConfigMap(manifest mf.Manifest, obj v1alpha1.TektonComponent) error {
-	koDataDir := os.Getenv(KoEnvKey)
-	operatorDir := filepath.Join(koDataDir, "info")
-
-	if err := AppendManifest(&manifest, operatorDir); err != nil {
-		return err
-	}
-
-	manifest, err := manifest.Transform(
-		mf.InjectNamespace(obj.GetSpec().GetTargetNamespace()),
-		mf.InjectOwner(obj),
-	)
-
-	if err != nil {
-		return err
-	}
-
-	if err = manifest.Apply(); err != nil {
-		return err
-	}
-
-	return nil
-}
diff --git a/pkg/reconciler/kubernetes/tektonchain/controller.go b/pkg/reconciler/kubernetes/tektonchain/controller.go
index 821c84eb7..8ee54bd30 100644
--- a/pkg/reconciler/kubernetes/tektonchain/controller.go
+++ b/pkg/reconciler/kubernetes/tektonchain/controller.go
@@ -72,9 +72,6 @@ func NewExtendedController(generator common.ExtensionGenerator) injection.Contro
 		}
 		impl := tektonChainreconciler.NewImpl(ctx, c)
 
-		// Add enqueue func in reconciler
-		c.enqueueAfter = impl.EnqueueAfter
-
 		logger.Info("Setting up event handlers for Tekton Chain")
 
 		tektonChaininformer.Get(ctx).Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
diff --git a/pkg/reconciler/kubernetes/tektonchain/tektonchain.go b/pkg/reconciler/kubernetes/tektonchain/tektonchain.go
index 45ef6b56a..fe9e2d450 100644
--- a/pkg/reconciler/kubernetes/tektonchain/tektonchain.go
+++ b/pkg/reconciler/kubernetes/tektonchain/tektonchain.go
@@ -19,8 +19,6 @@ package tektonchain
 import (
 	"context"
 	"fmt"
-	"time"
-
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	clientset "github.com/tektoncd/operator/pkg/client/clientset/versioned"
@@ -45,9 +43,7 @@ type Reconciler struct {
 	// particular version
 	manifest mf.Manifest
 	// Platform-specific behavior to affect the transform
-	// enqueueAfter enqueues a obj after a duration
-	enqueueAfter func(obj interface{}, after time.Duration)
-	extension    common.Extension
+	extension common.Extension
 	// chainVersion describes the current chain version
 	chainVersion    string
 	operatorVersion string
@@ -176,8 +172,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tc *v1alpha1.TektonChain
 			Get(ctx, existingInstallerSet, metav1.GetOptions{})
 		if err == nil {
 			tc.Status.MarkNotReady("Waiting for previous installer set to get deleted")
-			r.enqueueAfter(tc, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		if !apierrors.IsNotFound(err) {
 			logger.Error("failed to get InstallerSet: %s", err)
@@ -233,8 +228,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tc *v1alpha1.TektonChain
 
 			// after updating installer set enqueue after a duration
 			// to allow changes to get deployed
-			r.enqueueAfter(tc, 20*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 	}
 
@@ -244,18 +238,15 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tc *v1alpha1.TektonChain
 	ready := installedTIS.Status.GetCondition(apis.ConditionReady)
 	if ready == nil {
 		tc.Status.MarkInstallerSetNotReady("Waiting for installation")
-		r.enqueueAfter(tc, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	if ready.Status == corev1.ConditionUnknown {
 		tc.Status.MarkInstallerSetNotReady("Waiting for installation")
-		r.enqueueAfter(tc, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	} else if ready.Status == corev1.ConditionFalse {
 		tc.Status.MarkInstallerSetNotReady(ready.Message)
-		r.enqueueAfter(tc, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	// Mark InstallerSet Ready
diff --git a/pkg/reconciler/kubernetes/tektondashboard/controller.go b/pkg/reconciler/kubernetes/tektondashboard/controller.go
index 27e6fb17b..c7a09703b 100644
--- a/pkg/reconciler/kubernetes/tektondashboard/controller.go
+++ b/pkg/reconciler/kubernetes/tektondashboard/controller.go
@@ -76,9 +76,6 @@ func NewExtendedController(generator common.ExtensionGenerator) injection.Contro
 		}
 		impl := tektonDashboardreconciler.NewImpl(ctx, c)
 
-		// Add enqueue func in reconciler
-		c.enqueueAfter = impl.EnqueueAfter
-
 		logger.Info("Setting up event handlers for tekton-dashboard")
 
 		tektonDashboardInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
diff --git a/pkg/reconciler/kubernetes/tektondashboard/tektondashboard.go b/pkg/reconciler/kubernetes/tektondashboard/tektondashboard.go
index 2e2273602..9fdacf339 100644
--- a/pkg/reconciler/kubernetes/tektondashboard/tektondashboard.go
+++ b/pkg/reconciler/kubernetes/tektondashboard/tektondashboard.go
@@ -19,8 +19,6 @@ package tektondashboard
 import (
 	"context"
 	"fmt"
-	"time"
-
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	clientset "github.com/tektoncd/operator/pkg/client/clientset/versioned"
@@ -51,8 +49,6 @@ type Reconciler struct {
 	// a particular version with readonly value as false
 	fullaccessManifest mf.Manifest
 	// Platform-specific behavior to affect the transform
-	// enqueueAfter enqueues a obj after a duration
-	enqueueAfter     func(obj interface{}, after time.Duration)
 	extension        common.Extension
 	pipelineInformer pipelineinformer.TektonPipelineInformer
 	operatorVersion  string
@@ -137,8 +133,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, td *v1alpha1.TektonDashb
 		if err.Error() == common.PipelineNotReady {
 			td.Status.MarkDependencyInstalling("tekton-pipelines is still installing")
 			// wait for pipeline status to change
-			r.enqueueAfter(td, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 
 		}
 		// (tektonpipeline.opeator.tekton.dev instance not available yet)
@@ -210,8 +205,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, td *v1alpha1.TektonDashb
 			Get(ctx, existingInstallerSet, metav1.GetOptions{})
 		if err == nil {
 			td.Status.MarkNotReady("Waiting for previous installer set to get deleted")
-			r.enqueueAfter(td, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		if !apierrors.IsNotFound(err) {
 			logger.Error("failed to get InstallerSet: %s", err)
@@ -263,8 +257,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, td *v1alpha1.TektonDashb
 
 			// after updating installer set enqueue after a duration
 			// to allow changes to get deployed
-			r.enqueueAfter(td, 20*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 	}
 
@@ -274,18 +267,15 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, td *v1alpha1.TektonDashb
 	ready := installedTIS.Status.GetCondition(apis.ConditionReady)
 	if ready == nil {
 		td.Status.MarkInstallerSetNotReady("Waiting for installation")
-		r.enqueueAfter(td, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	if ready.Status == corev1.ConditionUnknown {
 		td.Status.MarkInstallerSetNotReady("Waiting for installation")
-		r.enqueueAfter(td, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	} else if ready.Status == corev1.ConditionFalse {
 		td.Status.MarkInstallerSetNotReady(ready.Message)
-		r.enqueueAfter(td, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	// Mark InstallerSet Ready
@@ -304,16 +294,7 @@ func (r *Reconciler) updateTektonDashboardStatus(ctx context.Context, td *v1alph
 	// update the td with TektonInstallerSet and releaseVersion
 	td.Status.SetTektonInstallerSet(createdIs.Name)
 	td.Status.SetVersion(r.dashboardVersion)
-
-	// Update the status with TektonInstallerSet so that any new thread
-	// reconciling with know that TektonInstallerSet is created otherwise
-	// there will be 2 instance created if we don't update status here
-	if _, err := r.operatorClientSet.OperatorV1alpha1().TektonDashboards().
-		UpdateStatus(ctx, td, metav1.UpdateOptions{}); err != nil {
-		return err
-	}
-
-	return v1alpha1.RECONCILE_AGAIN_ERR
+	return nil
 }
 
 // transform mutates the passed manifest to one with common, component
diff --git a/pkg/reconciler/kubernetes/tektonhub/controller.go b/pkg/reconciler/kubernetes/tektonhub/controller.go
index 38abdcec2..9b391414e 100644
--- a/pkg/reconciler/kubernetes/tektonhub/controller.go
+++ b/pkg/reconciler/kubernetes/tektonhub/controller.go
@@ -68,9 +68,6 @@ func NewExtendedController(generator common.ExtensionGenerator) injection.Contro
 		}
 		impl := tektonHubReconciler.NewImpl(ctx, c)
 
-		// Add enqueue func in reconciler
-		c.enqueueAfter = impl.EnqueueAfter
-
 		logger.Info("Setting up event handlers")
 
 		tektonHubInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
diff --git a/pkg/reconciler/kubernetes/tektonhub/installerset.go b/pkg/reconciler/kubernetes/tektonhub/installerset.go
index e35bf990b..d859b6ae5 100644
--- a/pkg/reconciler/kubernetes/tektonhub/installerset.go
+++ b/pkg/reconciler/kubernetes/tektonhub/installerset.go
@@ -72,13 +72,6 @@ func createInstallerSet(ctx context.Context, oc clientset.Interface, th *v1alpha
 	// Update the status of addon with created installerSet name
 	th.Status.HubInstallerSet[component] = createdIs.Name
 	th.Status.SetVersion(releaseVersion)
-
-	_, err = oc.OperatorV1alpha1().TektonHubs().
-		UpdateStatus(ctx, th, metav1.UpdateOptions{})
-	if err != nil {
-		return err
-	}
-
 	return nil
 }
 
diff --git a/pkg/reconciler/kubernetes/tektonhub/tektonhub.go b/pkg/reconciler/kubernetes/tektonhub/tektonhub.go
index bbb4dc4ac..71ee22795 100644
--- a/pkg/reconciler/kubernetes/tektonhub/tektonhub.go
+++ b/pkg/reconciler/kubernetes/tektonhub/tektonhub.go
@@ -20,12 +20,10 @@ package tektonhub
 import (
 	"context"
 	"fmt"
-	"path/filepath"
-	"time"
-
 	corev1 "k8s.io/api/core/v1"
 	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"path/filepath"
 
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
@@ -51,8 +49,6 @@ type Reconciler struct {
 	manifest mf.Manifest
 	// Platform-specific behavior to affect the transform
 	extension common.Extension
-	// enqueueAfter enqueues a obj after a duration
-	enqueueAfter func(obj interface{}, after time.Duration)
 }
 
 var (
@@ -175,8 +171,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, th *v1alpha1.TektonHub)
 
 func (r *Reconciler) handleError(err error, th *v1alpha1.TektonHub) error {
 	if err == v1alpha1.RECONCILE_AGAIN_ERR {
-		r.enqueueAfter(th, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 	return err
 }
@@ -184,8 +179,7 @@ func (r *Reconciler) handleError(err error, th *v1alpha1.TektonHub) error {
 func (r *Reconciler) manageUiComponent(ctx context.Context, th *v1alpha1.TektonHub, hubDir, version string) error {
 	if err := r.validateUiConfigMap(ctx, th); err != nil {
 		th.Status.MarkUiDependencyMissing(fmt.Sprintf("UI config map not present: %v", err.Error()))
-		r.enqueueAfter(th, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	th.Status.MarkUiDependenciesInstalled()
@@ -217,8 +211,7 @@ func (r *Reconciler) manageApiComponent(ctx context.Context, th *v1alpha1.Tekton
 	// Validate whether the secrets and configmap are created for API
 	if err := r.validateApiDependencies(ctx, th); err != nil {
 		th.Status.MarkApiDependencyMissing("api secrets not present")
-		r.enqueueAfter(th, 10*time.Second)
-		return err
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	th.Status.MarkApiDependenciesInstalled()
diff --git a/pkg/reconciler/kubernetes/tektoninstallerset/controller.go b/pkg/reconciler/kubernetes/tektoninstallerset/controller.go
index 754bfcd28..0794ce5b6 100644
--- a/pkg/reconciler/kubernetes/tektoninstallerset/controller.go
+++ b/pkg/reconciler/kubernetes/tektoninstallerset/controller.go
@@ -59,9 +59,6 @@ func NewExtendedController() injection.ControllerConstructor {
 		}
 		impl := tektonInstallerReconciler.NewImpl(ctx, c)
 
-		// Add enqueue func in reconciler
-		c.enqueueAfter = impl.EnqueueAfter
-
 		logger.Info("Setting up event handlers for TektonInstallerSet")
 
 		tektonInstallerinformer.Get(ctx).Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
diff --git a/pkg/reconciler/kubernetes/tektoninstallerset/install.go b/pkg/reconciler/kubernetes/tektoninstallerset/install.go
index d812794b9..e459763d6 100644
--- a/pkg/reconciler/kubernetes/tektoninstallerset/install.go
+++ b/pkg/reconciler/kubernetes/tektoninstallerset/install.go
@@ -69,6 +69,7 @@ var (
 	serviceMonitorPred         = mf.ByKind("ServiceMonitor")
 	routePred                  = mf.ByKind("Route")
 	consoleCLIDownloadPred     = mf.ByKind("ConsoleCLIDownload")
+	consoleLinkHubPred         = mf.ByKind("ConsoleLink")
 	consoleQuickStartPred      = mf.ByKind("ConsoleQuickStart")
 	ConsoleYAMLSamplePred      = mf.ByKind("ConsoleYAMLSample")
 )
@@ -124,6 +125,7 @@ func (i *installer) EnsureClusterScopedResources() error {
 			clusterTaskPred,
 			clusterTriggerBindingPred,
 			consoleCLIDownloadPred,
+			consoleLinkHubPred,
 			consoleQuickStartPred,
 			ConsoleYAMLSamplePred,
 			securityContextConstraints,
diff --git a/pkg/reconciler/kubernetes/tektoninstallerset/tektoninstallerset.go b/pkg/reconciler/kubernetes/tektoninstallerset/tektoninstallerset.go
index 9ac793566..df5598d2e 100644
--- a/pkg/reconciler/kubernetes/tektoninstallerset/tektoninstallerset.go
+++ b/pkg/reconciler/kubernetes/tektoninstallerset/tektoninstallerset.go
@@ -19,8 +19,6 @@ package tektoninstallerset
 import (
 	"context"
 	"fmt"
-	"time"
-
 	"github.com/go-logr/logr"
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
@@ -36,7 +34,6 @@ type Reconciler struct {
 	operatorClientSet clientset.Interface
 	mfClient          mf.Client
 	mfLogger          logr.Logger
-	enqueueAfter      func(obj interface{}, after time.Duration)
 }
 
 // Reconciler implements controller.Reconciler
@@ -148,8 +145,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, installerSet *v1alpha1.T
 	err = installer.IsWebhookReady()
 	if err != nil {
 		installerSet.Status.MarkWebhookNotReady(err.Error())
-		r.enqueueAfter(installerSet, time.Second*10)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	// Update Status for Webhook
@@ -159,8 +155,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, installerSet *v1alpha1.T
 	err = installer.IsControllerReady()
 	if err != nil {
 		installerSet.Status.MarkControllerNotReady(err.Error())
-		r.enqueueAfter(installerSet, time.Second*10)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	// Update Ready status of Controller
@@ -179,8 +174,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, installerSet *v1alpha1.T
 	err = installer.AllDeploymentsReady()
 	if err != nil {
 		installerSet.Status.MarkAllDeploymentsNotReady(err.Error())
-		r.enqueueAfter(installerSet, time.Second*10)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	// Mark all deployments ready
@@ -191,8 +185,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, installerSet *v1alpha1.T
 
 func (r *Reconciler) handleError(err error, installerSet *v1alpha1.TektonInstallerSet) error {
 	if err == v1alpha1.RECONCILE_AGAIN_ERR {
-		r.enqueueAfter(installerSet, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 	return err
 }
diff --git a/pkg/reconciler/kubernetes/tektonpipeline/controller.go b/pkg/reconciler/kubernetes/tektonpipeline/controller.go
index 894b31b5f..d242ae906 100644
--- a/pkg/reconciler/kubernetes/tektonpipeline/controller.go
+++ b/pkg/reconciler/kubernetes/tektonpipeline/controller.go
@@ -74,9 +74,6 @@ func NewExtendedController(generator common.ExtensionGenerator) injection.Contro
 		}
 		impl := tektonPipelineReconciler.NewImpl(ctx, c)
 
-		// Add enqueue func in reconciler
-		c.enqueueAfter = impl.EnqueueAfter
-
 		logger.Info("Setting up event handlers for TektonPipeline")
 
 		tektonPipelineInformer.Get(ctx).Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
diff --git a/pkg/reconciler/kubernetes/tektonpipeline/tektonpipeline.go b/pkg/reconciler/kubernetes/tektonpipeline/tektonpipeline.go
index 98b7e4486..2d13dfe59 100644
--- a/pkg/reconciler/kubernetes/tektonpipeline/tektonpipeline.go
+++ b/pkg/reconciler/kubernetes/tektonpipeline/tektonpipeline.go
@@ -18,10 +18,7 @@ package tektonpipeline
 
 import (
 	"context"
-	stdError "errors"
 	"fmt"
-	"time"
-
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	clientset "github.com/tektoncd/operator/pkg/client/clientset/versioned"
@@ -59,8 +56,6 @@ type Reconciler struct {
 	manifest mf.Manifest
 	// Platform-specific behavior to affect the transform
 	extension common.Extension
-	// enqueueAfter enqueues a obj after a duration
-	enqueueAfter func(obj interface{}, after time.Duration)
 	// metrics handles metrics for pipeline install
 	metrics         *Recorder
 	kubeClientSet   kubernetes.Interface
@@ -213,8 +208,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tp *v1alpha1.TektonPipel
 			Get(ctx, existingInstallerSet, metav1.GetOptions{})
 		if err == nil {
 			tp.Status.MarkNotReady("Waiting for previous installer set to get deleted")
-			r.enqueueAfter(tp, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		if !apierrors.IsNotFound(err) {
 			logger.Error("failed to get InstallerSet: %s", err)
@@ -258,8 +252,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tp *v1alpha1.TektonPipel
 
 			// after updating installer set enqueue after a duration
 			// to allow changes to get deployed
-			r.enqueueAfter(tp, 20*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 	}
 
@@ -269,14 +262,12 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tp *v1alpha1.TektonPipel
 	ready := installedTIS.Status.GetCondition(apis.ConditionReady)
 	if ready == nil {
 		tp.Status.MarkInstallerSetNotReady("Waiting for installation")
-		r.enqueueAfter(tp, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	if ready.Status == corev1.ConditionUnknown {
 		tp.Status.MarkInstallerSetNotReady("Waiting for installation")
-		r.enqueueAfter(tp, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	} else if ready.Status == corev1.ConditionFalse {
 		tp.Status.MarkInstallerSetNotReady(ready.Message)
 		manifest := r.manifest
@@ -285,8 +276,10 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tp *v1alpha1.TektonPipel
 			return err
 		}
 		err = common.PreemptDeadlock(ctx, &manifest, r.kubeClientSet, v1alpha1.PipelineResourceName)
-		r.enqueueAfter(tp, 10*time.Second)
-		return err
+		if err != nil {
+			logger.Error("preempt deadlock error: %v", err)
+		}
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	// Mark InstallerSet Ready
@@ -312,16 +305,7 @@ func (r *Reconciler) updateTektonPipelineStatus(ctx context.Context, tp *v1alpha
 	// update the tp with TektonInstallerSet and releaseVersion
 	tp.Status.SetTektonInstallerSet(createdIs.Name)
 	tp.Status.SetVersion(r.pipelineVersion)
-
-	// Update the status with TektonInstallerSet so that any new thread
-	// reconciling with know that TektonInstallerSet is created otherwise
-	// there will be 2 instance created if we don't update status here
-	if _, err := r.operatorClientSet.OperatorV1alpha1().TektonPipelines().
-		UpdateStatus(ctx, tp, metav1.UpdateOptions{}); err != nil {
-		return err
-	}
-
-	return stdError.New("ensuring Reconcile TektonPipeline status update")
+	return nil
 }
 
 func (r *Reconciler) createInstallerSet(ctx context.Context, tp *v1alpha1.TektonPipeline) (*v1alpha1.TektonInstallerSet, error) {
@@ -382,9 +366,6 @@ func (r *Reconciler) targetNamespaceCheck(ctx context.Context, tp *v1alpha1.Tekt
 			if err := common.CreateTargetNamespace(ctx, labels, tp, r.kubeClientSet); err != nil {
 				return err
 			}
-			if err := common.CreateOperatorVersionConfigMap(r.manifest, tp); err != nil {
-				return err
-			}
 			return nil
 		}
 		return err
diff --git a/pkg/reconciler/kubernetes/tektontrigger/controller.go b/pkg/reconciler/kubernetes/tektontrigger/controller.go
index a8cf3c025..177520373 100644
--- a/pkg/reconciler/kubernetes/tektontrigger/controller.go
+++ b/pkg/reconciler/kubernetes/tektontrigger/controller.go
@@ -78,9 +78,6 @@ func NewExtendedController(generator common.ExtensionGenerator) injection.Contro
 		}
 		impl := tektonTriggerreconciler.NewImpl(ctx, c)
 
-		// Add enqueue func in reconciler
-		c.enqueueAfter = impl.EnqueueAfter
-
 		logger.Info("Setting up event handlers for TektonTrigger")
 
 		tektonTriggerinformer.Get(ctx).Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
diff --git a/pkg/reconciler/kubernetes/tektontrigger/tektontrigger.go b/pkg/reconciler/kubernetes/tektontrigger/tektontrigger.go
index 897f15711..7776bd3b4 100644
--- a/pkg/reconciler/kubernetes/tektontrigger/tektontrigger.go
+++ b/pkg/reconciler/kubernetes/tektontrigger/tektontrigger.go
@@ -18,10 +18,7 @@ package tektontrigger
 
 import (
 	"context"
-	stdError "errors"
 	"fmt"
-	"time"
-
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	clientset "github.com/tektoncd/operator/pkg/client/clientset/versioned"
@@ -63,11 +60,9 @@ type Reconciler struct {
 	metrics *Recorder
 
 	pipelineInformer pipelineinformer.TektonPipelineInformer
-	// enqueueAfter enqueues a obj after a duration
-	enqueueAfter    func(obj interface{}, after time.Duration)
-	triggersVersion string
-	operatorVersion string
-	kubeClientSet   kubernetes.Interface
+	triggersVersion  string
+	operatorVersion  string
+	kubeClientSet    kubernetes.Interface
 }
 
 var (
@@ -136,8 +131,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tt *v1alpha1.TektonTrigg
 		if err.Error() == common.PipelineNotReady {
 			tt.Status.MarkDependencyInstalling("tekton-pipelines is still installing")
 			// wait for pipeline status to change
-			r.enqueueAfter(tt, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		// (tektonpipeline.operator.tekton.dev instance not available yet)
 		tt.Status.MarkDependencyMissing("tekton-pipelines does not exist")
@@ -227,8 +221,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tt *v1alpha1.TektonTrigg
 			Get(ctx, existingInstallerSet, metav1.GetOptions{})
 		if err == nil {
 			tt.Status.MarkNotReady("Waiting for previous installer set to get deleted")
-			r.enqueueAfter(tt, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		if !apierrors.IsNotFound(err) {
 			logger.Error("failed to get InstallerSet: %s", err)
@@ -274,8 +267,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tt *v1alpha1.TektonTrigg
 
 			// after updating installer set enqueue after a duration
 			// to allow changes to get deployed
-			r.enqueueAfter(tt, 20*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 	}
 
@@ -285,14 +277,12 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tt *v1alpha1.TektonTrigg
 	ready := installedTIS.Status.GetCondition(apis.ConditionReady)
 	if ready == nil {
 		tt.Status.MarkInstallerSetNotReady("Waiting for installation")
-		r.enqueueAfter(tt, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	if ready.Status == corev1.ConditionUnknown {
 		tt.Status.MarkInstallerSetNotReady("Waiting for installation")
-		r.enqueueAfter(tt, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	} else if ready.Status == corev1.ConditionFalse {
 		tt.Status.MarkInstallerSetNotReady(ready.Message)
 		manifest := r.manifest
@@ -301,8 +291,10 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tt *v1alpha1.TektonTrigg
 			return err
 		}
 		err = common.PreemptDeadlock(ctx, &manifest, r.kubeClientSet, v1alpha1.TriggerResourceName)
-		r.enqueueAfter(tt, 10*time.Second)
-		return err
+		if err != nil {
+			logger.Error("preempt deadlock error: %v", err)
+		}
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	// Mark InstallerSet Ready
@@ -346,16 +338,7 @@ func (r *Reconciler) updateTektonTriggerStatus(ctx context.Context, tt *v1alpha1
 	// update the tt with TektonInstallerSet and releaseVersion
 	tt.Status.SetTektonInstallerSet(createdIs.Name)
 	tt.Status.SetVersion(r.triggersVersion)
-
-	// Update the status with TektonInstallerSet so that any new thread
-	// reconciling with know that TektonInstallerSet is created otherwise
-	// there will be 2 instance created if we don't update status here
-	if _, err := r.operatorClientSet.OperatorV1alpha1().TektonTriggers().
-		UpdateStatus(ctx, tt, metav1.UpdateOptions{}); err != nil {
-		return err
-	}
-
-	return stdError.New("ensuring Reconcile TektonTrigger status update")
+	return nil
 }
 
 func (r *Reconciler) createInstallerSet(ctx context.Context, tt *v1alpha1.TektonTrigger) (*v1alpha1.TektonInstallerSet, error) {
diff --git a/pkg/reconciler/openshift/common/transformer.go b/pkg/reconciler/openshift/common/transformer.go
index c975b5a52..eca614eee 100644
--- a/pkg/reconciler/openshift/common/transformer.go
+++ b/pkg/reconciler/openshift/common/transformer.go
@@ -84,3 +84,34 @@ func RemoveRunAsGroup() mf.Transformer {
 		return nil
 	}
 }
+
+// RemoveFsGroup will remove FsGroup in a deployment
+func RemoveFsGroup(obj string) mf.Transformer {
+	return func(u *unstructured.Unstructured) error {
+		if u.GetKind() != "Deployment" {
+			return nil
+		}
+
+		d := &appsv1.Deployment{}
+		err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, d)
+		if err != nil {
+			return err
+		}
+
+		if d.Name == obj {
+			if d.Spec.Template.Spec.SecurityContext != nil {
+				d.Spec.Template.Spec.SecurityContext = nil
+			}
+
+			unstrObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(d)
+			if err != nil {
+				return err
+			}
+			u.SetUnstructuredContent(unstrObj)
+
+			return nil
+		}
+
+		return nil
+	}
+}
diff --git a/pkg/reconciler/openshift/tektonaddon/clustertTask.go b/pkg/reconciler/openshift/tektonaddon/clustertTask.go
index 6604e52c6..919c9f405 100644
--- a/pkg/reconciler/openshift/tektonaddon/clustertTask.go
+++ b/pkg/reconciler/openshift/tektonaddon/clustertTask.go
@@ -77,6 +77,7 @@ func (r *Reconciler) ensureClusterTasks(ctx context.Context, ta *v1alpha1.Tekton
 	// Run transformers
 	tfs := []mf.Transformer{
 		replaceKind(KindTask, KindClusterTask),
+		injectLabel(labelProviderType, providerTypeRedHat, overwrite, "ClusterTask"),
 	}
 	if err := r.addonTransform(ctx, &clusterTaskManifest, ta, tfs...); err != nil {
 		return err
diff --git a/pkg/reconciler/openshift/tektonaddon/clustertTaskVersioned.go b/pkg/reconciler/openshift/tektonaddon/clustertTaskVersioned.go
index c1ed11139..92d7606a3 100644
--- a/pkg/reconciler/openshift/tektonaddon/clustertTaskVersioned.go
+++ b/pkg/reconciler/openshift/tektonaddon/clustertTaskVersioned.go
@@ -90,6 +90,7 @@ func (r *Reconciler) ensureVersionedClusterTasks(ctx context.Context, ta *v1alph
 	// Run transformers
 	tfs := []mf.Transformer{
 		replaceKind(KindTask, KindClusterTask),
+		injectLabel(labelProviderType, providerTypeRedHat, overwrite, "ClusterTask"),
 		setVersionedNames(r.operatorVersion),
 	}
 	if err := r.addonTransform(ctx, &clusterTaskManifest, ta, tfs...); err != nil {
diff --git a/pkg/reconciler/openshift/tektonaddon/communityClusterTasks.go b/pkg/reconciler/openshift/tektonaddon/communityClusterTasks.go
index 83d58bc96..2997f27be 100644
--- a/pkg/reconciler/openshift/tektonaddon/communityClusterTasks.go
+++ b/pkg/reconciler/openshift/tektonaddon/communityClusterTasks.go
@@ -19,13 +19,14 @@ package tektonaddon
 import (
 	"context"
 	"fmt"
+	"strings"
+	"time"
+
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	"github.com/tektoncd/operator/pkg/reconciler/common"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"knative.dev/pkg/logging"
-	"strings"
-	"time"
 )
 
 var communityClusterTaskLS = metav1.LabelSelector{
@@ -103,8 +104,7 @@ func (r *Reconciler) ensureCommunityClusterTasks(ctx context.Context, ta *v1alph
 		// Continue if failed to resolve community task URL.
 		// (Ex: on disconnected cluster community tasks won't be reachable because of proxy).
 		logging.FromContext(ctx).Error("Failed to get community task: Skipping community tasks installation  ", err)
-		r.enqueueAfter(r, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	if err := r.communityTransform(ctx, &communityClusterTaskManifest, ta); err != nil {
diff --git a/pkg/reconciler/openshift/tektonaddon/const.go b/pkg/reconciler/openshift/tektonaddon/const.go
index fdd35f94c..f711c3f40 100644
--- a/pkg/reconciler/openshift/tektonaddon/const.go
+++ b/pkg/reconciler/openshift/tektonaddon/const.go
@@ -23,6 +23,7 @@ const (
 	PipelinesTemplateInstallerSet      = "PipelinesTemplate"
 	TriggersResourcesInstallerSet      = "TriggersResources"
 	ConsoleCLIInstallerSet             = "ConsoleCLI"
+	ConsoleHubLinkInstallerSet         = "ConsoleHub"
 	MiscellaneousResourcesInstallerSet = "MiscellaneousResources"
 	PACInstallerSet                    = "PipelinesAsCode"
 	CreatedByValue                     = "TektonAddon"
diff --git a/pkg/reconciler/openshift/tektonaddon/controller.go b/pkg/reconciler/openshift/tektonaddon/controller.go
index 8744d4a9a..cc04b5420 100644
--- a/pkg/reconciler/openshift/tektonaddon/controller.go
+++ b/pkg/reconciler/openshift/tektonaddon/controller.go
@@ -79,9 +79,6 @@ func NewExtendedController(generator common.ExtensionGenerator) injection.Contro
 		}
 		impl := tektonAddonreconciler.NewImpl(ctx, c)
 
-		// Add enqueue func in reconciler
-		c.enqueueAfter = impl.EnqueueAfter
-
 		logger.Info("Setting up event handlers for TektonAddon")
 
 		tektonAddoninformer.Get(ctx).Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
diff --git a/pkg/reconciler/openshift/tektonaddon/extension.go b/pkg/reconciler/openshift/tektonaddon/extension.go
index 23e7d21df..0e3280b5c 100644
--- a/pkg/reconciler/openshift/tektonaddon/extension.go
+++ b/pkg/reconciler/openshift/tektonaddon/extension.go
@@ -249,6 +249,8 @@ func addonTransform(ctx context.Context, manifest *mf.Manifest, comp v1alpha1.Te
 }
 
 func consoleCLITransform(ctx context.Context, manifest *mf.Manifest, baseURL string) error {
+	tknVersion := "0.23.1"
+
 	if baseURL == "" {
 		return fmt.Errorf("route url should not be empty")
 	}
@@ -256,7 +258,7 @@ func consoleCLITransform(ctx context.Context, manifest *mf.Manifest, baseURL str
 	logger.Debug("Transforming manifest")
 
 	transformers := []mf.Transformer{
-		replaceURLCCD(baseURL),
+		replaceURLCCD(baseURL, tknVersion),
 	}
 
 	transformManifest, err := manifest.Transform(transformers...)
diff --git a/pkg/reconciler/openshift/tektonaddon/tektonaddon.go b/pkg/reconciler/openshift/tektonaddon/tektonaddon.go
index 4b0491d13..5b1c67469 100644
--- a/pkg/reconciler/openshift/tektonaddon/tektonaddon.go
+++ b/pkg/reconciler/openshift/tektonaddon/tektonaddon.go
@@ -19,10 +19,6 @@ package tektonaddon
 import (
 	"context"
 	"fmt"
-	"os"
-	"path/filepath"
-	"time"
-
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	clientset "github.com/tektoncd/operator/pkg/client/clientset/versioned"
@@ -33,6 +29,8 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"knative.dev/pkg/logging"
 	pkgreconciler "knative.dev/pkg/reconciler"
+	"os"
+	"path/filepath"
 )
 
 // Reconciler implements controller.Reconciler for TektonAddon resources.
@@ -41,9 +39,6 @@ type Reconciler struct {
 	operatorClientSet clientset.Interface
 	extension         common.Extension
 
-	// enqueueAfter enqueues a obj after a duration
-	enqueueAfter func(obj interface{}, after time.Duration)
-
 	pipelineInformer informer.TektonPipelineInformer
 	triggerInformer  informer.TektonTriggerInformer
 
@@ -123,8 +118,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, ta *v1alpha1.TektonAddon
 		if err.Error() == common.PipelineNotReady {
 			ta.Status.MarkDependencyInstalling("tekton-pipelines is still installing")
 			// wait for pipeline status to change
-			r.enqueueAfter(ta, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		// (tektonpipeline.operator.tekton.dev instance not available yet)
 		ta.Status.MarkDependencyMissing("tekton-pipelines does not exist")
@@ -135,8 +129,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, ta *v1alpha1.TektonAddon
 		if err.Error() == common.TriggerNotReady {
 			ta.Status.MarkDependencyInstalling("tekton-triggers is still installing")
 			// wait for trigger status to change
-			r.enqueueAfter(ta, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		// (tektontrigger.operator.tekton.dev instance not available yet)
 		ta.Status.MarkDependencyMissing("tekton-triggers does not exist")
@@ -194,8 +187,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, ta *v1alpha1.TektonAddon
 
 	if err := r.extension.PostReconcile(ctx, ta); err != nil {
 		if err == v1alpha1.RECONCILE_AGAIN_ERR {
-			r.enqueueAfter(ta, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		ta.Status.MarkPostReconcilerFailed(err.Error())
 		return err
diff --git a/pkg/reconciler/openshift/tektonaddon/transformer.go b/pkg/reconciler/openshift/tektonaddon/transformer.go
index 3c0e9f998..2fc491599 100644
--- a/pkg/reconciler/openshift/tektonaddon/transformer.go
+++ b/pkg/reconciler/openshift/tektonaddon/transformer.go
@@ -80,23 +80,52 @@ func itemInSlice(item string, items []string) bool {
 	return false
 }
 
-func getlinks(baseURL string) []console.CLIDownloadLink {
-	platforms := []struct {
-		key   string
-		value string
+func getlinks(baseURL, tknVersion string) []console.CLIDownloadLink {
+	platformURLs := []struct {
+		platform  string
+		tknURL    string
+		tknPacURL string
 	}{
-		{"Linux", "tkn/tkn-linux-amd64-0.21.0.tar.gz"},
-		{"IBM Power", "tkn/tkn-linux-ppc64le-0.21.0.tar.gz"},
-		{"IBM Z", "tkn/tkn-linux-s390x-0.21.0.tar.gz"},
-		{"Mac", "tkn/tkn-macos-amd64-0.21.0.tar.gz"},
-		{"Windows", "tkn/tkn-windows-amd64-0.21.0.zip"},
+		{
+			"Linux",
+			fmt.Sprintf("tkn/tkn-linux-amd64-%s.tar.gz", tknVersion),
+			fmt.Sprintf("tkn/tkn-pac-linux-amd64-%s.tar.gz", tknVersion),
+		},
+		{
+			"IBM Power",
+			fmt.Sprintf("tkn/tkn-linux-ppc64le-%s.tar.gz", tknVersion),
+			fmt.Sprintf("tkn/tkn-pac-linux-ppc64le-%s.tar.gz", tknVersion),
+		},
+		{
+			"IBM Z",
+			fmt.Sprintf("tkn/tkn-linux-s390x-%s.tar.gz", tknVersion),
+			fmt.Sprintf("tkn/tkn-pac-linux-s390x-%s.tar.gz", tknVersion),
+		},
+		{
+			"Mac",
+			fmt.Sprintf("tkn/tkn-macos-amd64-%s.tar.gz", tknVersion),
+			fmt.Sprintf("tkn/tkn-pac-macos-amd64-%s.tar.gz", tknVersion),
+		},
+		{
+			"Windows",
+			fmt.Sprintf("tkn/tkn-windows-amd64-%s.zip", tknVersion),
+			fmt.Sprintf("tkn/tkn-pac-windows-amd64-%s.zip", tknVersion),
+		},
 	}
 	links := []console.CLIDownloadLink{}
-	for _, platform := range platforms {
-		links = append(links, console.CLIDownloadLink{
-			Href: getURL(baseURL, platform.value),
-			Text: fmt.Sprintf("Download tkn for %s", platform.key),
-		})
+	for _, platformURL := range platformURLs {
+		links = append(links,
+			// tkn
+			console.CLIDownloadLink{
+				Href: getURL(baseURL, platformURL.tknURL),
+				Text: fmt.Sprintf("Download tkn for %s", platformURL.platform),
+			},
+			// tkn-pac
+			console.CLIDownloadLink{
+				Href: getURL(baseURL, platformURL.tknPacURL),
+				Text: fmt.Sprintf("Download tkn-pac for %s", platformURL.platform),
+			},
+		)
 	}
 	return links
 }
@@ -105,7 +134,7 @@ func getURL(baseURL string, path string) string {
 	return fmt.Sprintf("https://%s/%s", baseURL, path)
 }
 
-func replaceURLCCD(baseURL string) mf.Transformer {
+func replaceURLCCD(baseURL, tknVersion string) mf.Transformer {
 	return func(u *unstructured.Unstructured) error {
 		if u.GetKind() != "ConsoleCLIDownload" {
 			return nil
@@ -115,7 +144,7 @@ func replaceURLCCD(baseURL string) mf.Transformer {
 		if err != nil {
 			return err
 		}
-		ccd.Spec.Links = getlinks(baseURL)
+		ccd.Spec.Links = getlinks(baseURL, tknVersion)
 		unstrObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(ccd)
 		if err != nil {
 			return err
diff --git a/pkg/reconciler/openshift/tektonconfig/common.go b/pkg/reconciler/openshift/tektonconfig/common.go
index 2204e37e3..de2f26874 100644
--- a/pkg/reconciler/openshift/tektonconfig/common.go
+++ b/pkg/reconciler/openshift/tektonconfig/common.go
@@ -18,17 +18,17 @@ package tektonconfig
 
 import (
 	"context"
-
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	"github.com/tektoncd/operator/pkg/client/clientset/versioned"
+	"github.com/tektoncd/operator/pkg/reconciler/common"
+	"github.com/tektoncd/operator/pkg/reconciler/kubernetes/tektoninstallerset"
 	"k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-func createInstallerSet(ctx context.Context, oc versioned.Interface, tc *v1alpha1.TektonConfig, labels map[string]string,
-	releaseVersion, component, installerSetName string) error {
+func createInstallerSet(ctx context.Context, oc versioned.Interface, tc *v1alpha1.TektonConfig, releaseVersion, component, installerSetName string) error {
 
-	is := makeInstallerSet(tc, installerSetName, releaseVersion, labels)
+	is := makeInstallerSet(tc, installerSetName, releaseVersion)
 
 	createdIs, err := oc.OperatorV1alpha1().TektonInstallerSets().
 		Create(ctx, is, metav1.CreateOptions{})
@@ -43,29 +43,19 @@ func createInstallerSet(ctx context.Context, oc versioned.Interface, tc *v1alpha
 	// Update the status of tektonConfig with created installerSet name
 	tc.Status.TektonInstallerSet[component] = createdIs.Name
 	tc.Status.SetVersion(releaseVersion)
-
-	return updateTektonConfigStatus(ctx, oc, tc)
-}
-
-func updateTektonConfigStatus(ctx context.Context, oc versioned.Interface, tc *v1alpha1.TektonConfig) error {
-
-	_, err := oc.OperatorV1alpha1().TektonConfigs().
-		UpdateStatus(ctx, tc, metav1.UpdateOptions{})
-	if err != nil {
-		return err
-	}
-
-	// here we return an error intentionally so that we reconcile again
-	// and proceed further with updated object instead
-	return v1alpha1.RECONCILE_AGAIN_ERR
+	return nil
 }
 
-func makeInstallerSet(tc *v1alpha1.TektonConfig, name, releaseVersion string, labels map[string]string) *v1alpha1.TektonInstallerSet {
+func makeInstallerSet(tc *v1alpha1.TektonConfig, name, releaseVersion string) *v1alpha1.TektonInstallerSet {
 	ownerRef := *metav1.NewControllerRef(tc, tc.GetGroupVersionKind())
 	return &v1alpha1.TektonInstallerSet{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:   name,
-			Labels: labels,
+			Name: name,
+			Labels: map[string]string{
+				v1alpha1.CreatedByKey:      createdByValue,
+				v1alpha1.InstallerSetType:  rbacInstallerSetType,
+				v1alpha1.ReleaseVersionKey: releaseVersion,
+			},
 			Annotations: map[string]string{
 				v1alpha1.ReleaseVersionKey:  releaseVersion,
 				v1alpha1.TargetNamespaceKey: tc.Spec.TargetNamespace,
@@ -78,24 +68,20 @@ func makeInstallerSet(tc *v1alpha1.TektonConfig, name, releaseVersion string, la
 func deleteInstallerSet(ctx context.Context, oc versioned.Interface, tc *v1alpha1.TektonConfig, component string) error {
 
 	compInstallerSet, ok := tc.Status.TektonInstallerSet[component]
-	if !ok {
+	if !ok || compInstallerSet == "" {
 		return nil
 	}
 
-	if compInstallerSet != "" {
-		// delete the installer set
-		err := oc.OperatorV1alpha1().TektonInstallerSets().
-			Delete(ctx, tc.Status.TektonInstallerSet[component], metav1.DeleteOptions{})
-		if err != nil && !errors.IsNotFound(err) {
-			return err
-		}
-
-		// clear the name of installer set from TektonConfig status
-		delete(tc.Status.TektonInstallerSet, component)
-
-		return updateTektonConfigStatus(ctx, oc, tc)
+	// delete the installer set
+	err := oc.OperatorV1alpha1().TektonInstallerSets().
+		Delete(ctx, tc.Status.TektonInstallerSet[component], metav1.DeleteOptions{})
+	if err != nil && !errors.IsNotFound(err) {
+		return err
 	}
 
+	// clear the name of installer set from TektonConfig status
+	delete(tc.Status.TektonInstallerSet, component)
+
 	return nil
 }
 
@@ -105,15 +91,21 @@ func deleteInstallerSet(ctx context.Context, oc versioned.Interface, tc *v1alpha
 func checkIfInstallerSetExist(ctx context.Context, oc versioned.Interface, relVersion string,
 	tc *v1alpha1.TektonConfig, component string) (*v1alpha1.TektonInstallerSet, error) {
 
-	// Check if installer set is already created
-	compInstallerSet, ok := tc.Status.TektonInstallerSet[component]
-	if !ok || compInstallerSet == "" {
+	labelSelector, err := common.LabelSelector(rbacInstallerSetSelector)
+	if err != nil {
+		return nil, err
+	}
+	existingInstallerSet, err := tektoninstallerset.CurrentInstallerSetName(ctx, oc, labelSelector)
+	if err != nil {
+		return nil, err
+	}
+	if existingInstallerSet == "" {
 		return nil, nil
 	}
 
 	// if already created then check which version it is
 	ctIs, err := oc.OperatorV1alpha1().TektonInstallerSets().
-		Get(ctx, compInstallerSet, metav1.GetOptions{})
+		Get(ctx, existingInstallerSet, metav1.GetOptions{})
 	if err != nil {
 		if errors.IsNotFound(err) {
 			return nil, nil
@@ -131,7 +123,7 @@ func checkIfInstallerSetExist(ctx context.Context, oc versioned.Interface, relVe
 	// deleted existing InstallerSet and create a new one
 
 	err = oc.OperatorV1alpha1().TektonInstallerSets().
-		Delete(ctx, compInstallerSet, metav1.DeleteOptions{})
+		Delete(ctx, existingInstallerSet, metav1.DeleteOptions{})
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/reconciler/openshift/tektonconfig/rbac.go b/pkg/reconciler/openshift/tektonconfig/rbac.go
index b85c1527e..525d6d9de 100644
--- a/pkg/reconciler/openshift/tektonconfig/rbac.go
+++ b/pkg/reconciler/openshift/tektonconfig/rbac.go
@@ -50,9 +50,19 @@ const (
 	namespaceVersionLabel    = "openshift-pipelines.tekton.dev/namespace-reconcile-version"
 	createdByValue           = "RBAC"
 	componentNameRBAC        = "rhosp-rbac"
+	rbacInstallerSetType     = "rhosp-rbac"
 	rbacParamName            = "createRbacResource"
 )
 
+var (
+	rbacInstallerSetSelector = metav1.LabelSelector{
+		MatchLabels: map[string]string{
+			v1alpha1.CreatedByKey:     createdByValue,
+			v1alpha1.InstallerSetType: componentNameRBAC,
+		},
+	}
+)
+
 // Namespace Regex to ignore the namespace for creating rbac resources.
 var nsRegex = regexp.MustCompile(common.NamespaceIgnorePattern)
 
@@ -105,9 +115,7 @@ func (r *rbac) EnsureRBACInstallerSet(ctx context.Context) (*v1alpha1.TektonInst
 		return nil, err
 	}
 
-	err = createInstallerSet(ctx, r.operatorClientSet, r.tektonConfig, map[string]string{
-		v1alpha1.CreatedByKey: createdByValue,
-	}, r.version, componentNameRBAC, "rbac-resources")
+	err = createInstallerSet(ctx, r.operatorClientSet, r.tektonConfig, r.version, componentNameRBAC, "rbac-resources")
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/reconciler/openshift/tektonhub/extension.go b/pkg/reconciler/openshift/tektonhub/extension.go
index 8eddeea06..6abce6366 100644
--- a/pkg/reconciler/openshift/tektonhub/extension.go
+++ b/pkg/reconciler/openshift/tektonhub/extension.go
@@ -19,18 +19,22 @@ package tektonhub
 import (
 	"context"
 	"fmt"
+	"os"
 	"path/filepath"
 	"strings"
 
 	"github.com/go-logr/zapr"
 	mfc "github.com/manifestival/client-go-client"
 	mf "github.com/manifestival/manifestival"
+	console "github.com/openshift/api/console/v1"
 	routev1 "github.com/openshift/api/route/v1"
 	"github.com/openshift/client-go/route/clientset/versioned/scheme"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	"github.com/tektoncd/operator/pkg/client/clientset/versioned"
+	clientset "github.com/tektoncd/operator/pkg/client/clientset/versioned"
 	operatorclient "github.com/tektoncd/operator/pkg/client/injection/client"
 	"github.com/tektoncd/operator/pkg/reconciler/common"
+	openshiftCommon "github.com/tektoncd/operator/pkg/reconciler/openshift/common"
 	"go.uber.org/zap"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
@@ -44,9 +48,11 @@ import (
 )
 
 const (
-	hubprefix               string = "tekton-hub"
-	tektonHubAPIResourceKey string = "api"
-	tektonHubUiResourceKey  string = "ui"
+	hubprefix                  string = "tekton-hub"
+	tektonHubAPIResourceKey    string = "api"
+	tektonHubUiResourceKey     string = "ui"
+	CreatedByValue             string = "TektonHub"
+	ConsoleHubLinkInstallerSet        = "ConsoleHubLink"
 )
 
 var replaceVal = map[string]string{
@@ -88,7 +94,7 @@ type openshiftExtension struct {
 }
 
 func (oe openshiftExtension) Transformers(comp v1alpha1.TektonComponent) []mf.Transformer {
-	return []mf.Transformer{UpdateDbDeployment()}
+	return []mf.Transformer{UpdateDbDeployment(), openshiftCommon.RemoveFsGroup(api)}
 }
 
 func (oe openshiftExtension) PreReconcile(ctx context.Context, tc v1alpha1.TektonComponent) error {
@@ -167,9 +173,165 @@ func (oe openshiftExtension) PreReconcile(ctx context.Context, tc v1alpha1.Tekto
 }
 
 func (oe openshiftExtension) PostReconcile(ctx context.Context, tc v1alpha1.TektonComponent) error {
+	th := tc.(*v1alpha1.TektonHub)
+	consoleCLILS := metav1.LabelSelector{
+		MatchLabels: map[string]string{
+			v1alpha1.InstallerSetType: ConsoleHubLinkInstallerSet,
+		},
+	}
+
+	consoleHubLinkLabelSelector, err := common.LabelSelector(consoleCLILS)
+	if err != nil {
+		return err
+	}
+
+	exist, err := checkIfInstallerSetExist(ctx, oe.operatorClientSet, common.TargetVersion(th), consoleHubLinkLabelSelector)
+	if err != nil {
+		return err
+	}
+
+	if !exist {
+		hubConsoleLinkManifest := oe.manifest.Append()
+		if err := applyHubConsoleLinkManifest(&hubConsoleLinkManifest); err != nil {
+			return err
+		}
+
+		if err := consoleLinkTransform(ctx, &hubConsoleLinkManifest, th.Status.GetUiRoute()); err != nil {
+			return err
+		}
+
+		if err := createInstallerSet(ctx, oe.operatorClientSet, th, hubConsoleLinkManifest,
+			common.TargetVersion(th), ConsoleHubLinkInstallerSet, "console-link-hub"); err != nil {
+			return err
+		}
+	}
 
 	return nil
 }
+
+func checkIfInstallerSetExist(ctx context.Context, oc clientset.Interface, relVersion string,
+	labelSelector string) (bool, error) {
+
+	installerSets, err := oc.OperatorV1alpha1().TektonInstallerSets().
+		List(ctx, metav1.ListOptions{
+			LabelSelector: labelSelector,
+		})
+	if err != nil {
+		return false, err
+	}
+
+	if len(installerSets.Items) == 0 {
+		return false, nil
+	}
+
+	if len(installerSets.Items) == 1 {
+		// if already created then check which version it is
+		version, ok := installerSets.Items[0].Labels[v1alpha1.ReleaseVersionKey]
+		if ok && version == relVersion {
+			// if installer set already exist and release version is same
+			// then ignore and move on
+			return true, nil
+		}
+	}
+
+	// release version doesn't exist or is different from expected
+	// deleted existing InstallerSet and create a new one
+	// or there is more than one installerset (unexpected)
+	if err = oc.OperatorV1alpha1().TektonInstallerSets().
+		DeleteCollection(ctx, metav1.DeleteOptions{}, metav1.ListOptions{
+			LabelSelector: labelSelector,
+		}); err != nil {
+		return false, err
+	}
+
+	return false, v1alpha1.RECONCILE_AGAIN_ERR
+}
+
+func createInstallerSet(ctx context.Context, oc clientset.Interface, ta *v1alpha1.TektonHub,
+	manifest mf.Manifest, releaseVersion, component, installerSetPrefix string) error {
+
+	is := makeInstallerSet(ta, manifest, installerSetPrefix, releaseVersion, component)
+
+	if _, err := oc.OperatorV1alpha1().TektonInstallerSets().
+		Create(ctx, is, metav1.CreateOptions{}); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func makeInstallerSet(ta *v1alpha1.TektonHub, manifest mf.Manifest, prefix, releaseVersion, component string) *v1alpha1.TektonInstallerSet {
+	ownerRef := *metav1.NewControllerRef(ta, ta.GetGroupVersionKind())
+	labels := map[string]string{
+		v1alpha1.CreatedByKey:      CreatedByValue,
+		v1alpha1.InstallerSetType:  component,
+		v1alpha1.ReleaseVersionKey: releaseVersion,
+	}
+	namePrefix := fmt.Sprintf("%s-", prefix)
+
+	return &v1alpha1.TektonInstallerSet{
+		ObjectMeta: metav1.ObjectMeta{
+			GenerateName: namePrefix,
+			Labels:       labels,
+			Annotations: map[string]string{
+				v1alpha1.TargetNamespaceKey: ta.Spec.TargetNamespace,
+			},
+			OwnerReferences: []metav1.OwnerReference{ownerRef},
+		},
+		Spec: v1alpha1.TektonInstallerSetSpec{
+			Manifests: manifest.Resources(),
+		},
+	}
+}
+
+func applyHubConsoleLinkManifest(manifest *mf.Manifest) error {
+	koDataDir := os.Getenv(common.KoEnvKey)
+	location := filepath.Join(koDataDir, "openshift", "tekton-hub")
+	return common.AppendManifest(manifest, location)
+}
+
+func consoleLinkTransform(ctx context.Context, manifest *mf.Manifest, baseURL string) error {
+	if baseURL == "" {
+		return fmt.Errorf("route url should not be empty")
+	}
+	logger := logging.FromContext(ctx)
+	logger.Debug("Transforming manifest")
+
+	transformers := []mf.Transformer{
+		replaceURLConsoleLink(baseURL),
+	}
+
+	transformManifest, err := manifest.Transform(transformers...)
+	if err != nil {
+		return err
+	}
+
+	*manifest = transformManifest
+	return nil
+}
+
+func replaceURLConsoleLink(baseURL string) mf.Transformer {
+	return func(u *unstructured.Unstructured) error {
+		if u.GetKind() != "ConsoleLink" {
+			return nil
+		}
+		cl := &console.ConsoleLink{}
+		err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, cl)
+		if err != nil {
+			return err
+		}
+
+		cl.Spec.Href = baseURL
+
+		unstrObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(cl)
+		if err != nil {
+			return err
+		}
+		u.SetUnstructuredContent(unstrObj)
+		return nil
+	}
+}
+
 func (oe openshiftExtension) Finalize(context.Context, v1alpha1.TektonComponent) error {
 	return nil
 }
diff --git a/pkg/reconciler/openshift/tektonpipeline/installerset.go b/pkg/reconciler/openshift/tektonpipeline/installerset.go
index 79b57c409..02e8e85fd 100644
--- a/pkg/reconciler/openshift/tektonpipeline/installerset.go
+++ b/pkg/reconciler/openshift/tektonpipeline/installerset.go
@@ -18,14 +18,12 @@ package tektonpipeline
 
 import (
 	"context"
-	stdError "errors"
 	"fmt"
 	"strings"
 
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	clientset "github.com/tektoncd/operator/pkg/client/clientset/versioned"
-	"k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -112,16 +110,9 @@ func createInstallerSet(ctx context.Context, oc clientset.Interface, tp *v1alpha
 		tp.Status.ExtentionInstallerSets = map[string]string{}
 	}
 
-	// Update the status of pipeline with created installerSet name
+	//// Update the status of pipeline with created installerSet name
 	tp.Status.ExtentionInstallerSets[component] = createdIs.Name
-
-	_, err = oc.OperatorV1alpha1().TektonPipelines().
-		UpdateStatus(ctx, tp, metav1.UpdateOptions{})
-	if err != nil {
-		return err
-	}
-
-	return stdError.New("ensuring TektonPipeline status update")
+	return nil
 }
 
 func makeInstallerSet(tp *v1alpha1.TektonPipeline, manifest mf.Manifest, installerSetType, releaseVersion string) *v1alpha1.TektonInstallerSet {
@@ -160,10 +151,5 @@ func deleteInstallerSet(ctx context.Context, oc clientset.Interface, ta *v1alpha
 
 	// clear the name of installer set from TektonPipeline status
 	delete(ta.Status.ExtentionInstallerSets, component)
-	_, err = oc.OperatorV1alpha1().TektonPipelines().UpdateStatus(ctx, ta, metav1.UpdateOptions{})
-	if err != nil && !errors.IsNotFound(err) {
-		return err
-	}
-
 	return nil
 }
diff --git a/pkg/reconciler/shared/tektonconfig/controller.go b/pkg/reconciler/shared/tektonconfig/controller.go
index 66031b73f..45dd4f159 100644
--- a/pkg/reconciler/shared/tektonconfig/controller.go
+++ b/pkg/reconciler/shared/tektonconfig/controller.go
@@ -74,9 +74,6 @@ func NewExtensibleController(generator common.ExtensionGenerator) injection.Cont
 		}
 		impl := tektonConfigreconciler.NewImpl(ctx, c)
 
-		// Add enqueue func in reconciler
-		c.enqueueAfter = impl.EnqueueAfter
-
 		logger.Info("Setting up event handlers for TektonConfig")
 
 		tektonConfiginformer.Get(ctx).Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
diff --git a/pkg/reconciler/shared/tektonconfig/instance.go b/pkg/reconciler/shared/tektonconfig/instance.go
index 2d97d1b73..52e3d8ed7 100644
--- a/pkg/reconciler/shared/tektonconfig/instance.go
+++ b/pkg/reconciler/shared/tektonconfig/instance.go
@@ -84,7 +84,7 @@ func (tc tektonConfig) ensureInstance(ctx context.Context) {
 		err = tc.createInstance(ctx)
 		if err != nil {
 			//log error and retry
-			logger.Errorf("error creating Tektonconfig instance, Name: ", instance.GetName())
+			logger.Errorf("error creating Tektonconfig instance, Name: %s, Err: %v", instance.GetName(), err)
 			return false, nil
 		}
 		// even if there is no error after create,
diff --git a/pkg/reconciler/shared/tektonconfig/tektonconfig.go b/pkg/reconciler/shared/tektonconfig/tektonconfig.go
index 3fa2fc518..968d3dd1b 100644
--- a/pkg/reconciler/shared/tektonconfig/tektonconfig.go
+++ b/pkg/reconciler/shared/tektonconfig/tektonconfig.go
@@ -19,8 +19,6 @@ package tektonconfig
 import (
 	"context"
 	"fmt"
-	"time"
-
 	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	clientset "github.com/tektoncd/operator/pkg/client/clientset/versioned"
@@ -43,9 +41,7 @@ type Reconciler struct {
 	// operatorClientSet allows us to configure operator objects
 	operatorClientSet clientset.Interface
 	// Platform-specific behavior to affect the transform
-	extension common.Extension
-	// enqueueAfter enqueues a obj after a duration
-	enqueueAfter    func(obj interface{}, after time.Duration)
+	extension       common.Extension
 	manifest        mf.Manifest
 	operatorVersion string
 }
@@ -104,14 +100,9 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tc *v1alpha1.TektonConfi
 		return err
 	}
 
-	if err := common.CreateOperatorVersionConfigMap(r.manifest, tc); err != nil {
-		return err
-	}
-
 	if err := r.extension.PreReconcile(ctx, tc); err != nil {
 		if err == v1alpha1.RECONCILE_AGAIN_ERR {
-			r.enqueueAfter(tc, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		tc.Status.MarkPreInstallFailed(err.Error())
 		return err
@@ -123,8 +114,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tc *v1alpha1.TektonConfi
 	if _, err := pipeline.EnsureTektonPipelineExists(ctx, r.operatorClientSet.OperatorV1alpha1().TektonPipelines(), tc); err != nil {
 		tc.Status.MarkComponentNotReady(fmt.Sprintf("TektonPipeline: %s", err.Error()))
 		if err == v1alpha1.RECONCILE_AGAIN_ERR {
-			r.enqueueAfter(tc, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 		return nil
 	}
@@ -133,14 +123,12 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tc *v1alpha1.TektonConfi
 	if tc.Spec.Profile == v1alpha1.ProfileAll || tc.Spec.Profile == v1alpha1.ProfileBasic {
 		if _, err := trigger.EnsureTektonTriggerExists(ctx, r.operatorClientSet.OperatorV1alpha1().TektonTriggers(), tc); err != nil {
 			tc.Status.MarkComponentNotReady(fmt.Sprintf("TektonTrigger: %s", err.Error()))
-			r.enqueueAfter(tc, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 	} else {
 		if err := trigger.TektonTriggerCRDelete(ctx, r.operatorClientSet.OperatorV1alpha1().TektonTriggers(), v1alpha1.TriggerResourceName); err != nil {
 			tc.Status.MarkComponentNotReady(fmt.Sprintf("TektonTrigger: %s", err.Error()))
-			r.enqueueAfter(tc, 10*time.Second)
-			return nil
+			return v1alpha1.REQUEUE_EVENT_AFTER
 		}
 	}
 
@@ -153,8 +141,7 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, tc *v1alpha1.TektonConfi
 
 	if err := r.extension.PostReconcile(ctx, tc); err != nil {
 		tc.Status.MarkPostInstallFailed(err.Error())
-		r.enqueueAfter(tc, 10*time.Second)
-		return nil
+		return v1alpha1.REQUEUE_EVENT_AFTER
 	}
 
 	tc.Status.MarkPostInstallComplete()
diff --git a/tekton/build-publish-images-manifests.yaml b/tekton/build-publish-images-manifests.yaml
index 89fa841bf..fd5d9d721 100644
--- a/tekton/build-publish-images-manifests.yaml
+++ b/tekton/build-publish-images-manifests.yaml
@@ -123,7 +123,6 @@ spec:
       sed -i -e 's/\(operator.tekton.dev\/release\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\(app.kubernetes.io\/version\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\(version\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\("-version"\), "devel"/\1, "$(params.versionTag)"/g' ${PROJECT_ROOT}/config/base/*.yaml
       sed -i -e 's/\(operator.tekton.dev\/release\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\(app.kubernetes.io\/version\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\(version\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\("-version"\), "devel"/\1, "$(params.versionTag)"/g' ${PROJECT_ROOT}/config/${KUBE_DISTRO}/base/*.yaml
       sed -i -e 's/\(operator.tekton.dev\/release\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\(app.kubernetes.io\/version\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\(version\): "devel"/\1: "$(params.versionTag)"/g' -e 's/\("-version"\), "devel"/\1, "$(params.versionTag)"/g' ${PROJECT_ROOT}/config/${KUBE_DISTRO}/overlays/default/*.yaml
-      sed -i -e 's/\(version\): "devel"/\1: "$(params.versionTag)"/g' ${PROJECT_ROOT}/cmd/${KUBE_DISTRO}/operator/kodata/info/operator-config.yaml
 
       # Publish images and create release.yaml
       mkdir -p $OUTPUT_RELEASE_DIR
diff --git a/tekton/operator-release-pipeline.yaml b/tekton/operator-release-pipeline.yaml
index 94859dc22..e9fa8f745 100644
--- a/tekton/operator-release-pipeline.yaml
+++ b/tekton/operator-release-pipeline.yaml
@@ -45,6 +45,16 @@ spec:
     description: Version of TektonCD Results Release to be packaged with this operator build
     # TODO: Set default to nightly. Aug 10, 2021 - no nightly releases available for Results
     default: "latest"
+  - name: PACVersion
+    description: Version of Pipelines as Code (OpenShift only)
+    default: "0.5.7"
+  - name: TektonCDChainsVersion
+    description: Version of TektonCD Chains Release to be packaged with this operator build
+    default: "nightly"
+  - name: TektonCDHubVersion
+    description: Version of TektonCD Hub Release to be packaged with this operator build
+    # TODO: Set default to nightly. Mar 09, 2022 - no nightly ("latest") releases available for Hub
+    default: "v1.7.1"
   workspaces:
   - name: workarea
     description: The workspace where the repo will be cloned.
@@ -127,6 +137,12 @@ spec:
       value: $(params.TektonCDDashboardVersion)
     - name: RESULTS_VERSION
       value: $(params.TektonCDResultsVersion)
+    - name: PAC_VERSION
+      value: $(params.PACVersion)
+    - name: HUB_VERSION
+      value: $(params.TektonCDHubVersion)
+    - name: CHAINS_VERSION
+      value: $(params.TektonCDChainsVersion)
     - name: TARGET_PLATFORMS
       value: $(params.kubeDistros)
   - name: build-test
diff --git a/tekton/task-fetch-components.yaml b/tekton/task-fetch-components.yaml
index 8f0297215..8f940b684 100644
--- a/tekton/task-fetch-components.yaml
+++ b/tekton/task-fetch-components.yaml
@@ -18,9 +18,16 @@ spec:
   - name: RESULTS_VERSION
     description: Version of TektonCD Results being fetched
     default: "latest"
+  - name: PAC_VERSION
+    description: Version of Pipelines as Code (OpenShift only)
+    default: "0.5.7"
   - name: CHAINS_VERSION
     description: Version of TektonCD Chains being fetched
     default: "latest"
+  - name: HUB_VERSION
+    description: Version of TektonCD Hub being fetched
+    default: "v1.7.1"
+    # TODO: Set default to nightly. Mar 09, 2022 - no nightly ("latest") releases available for Hub
   - name: TARGET_PLATFORMS
     description: Target platform for for which the payload is going to be used
     default: "kubernetes openshift"
@@ -33,8 +40,8 @@ spec:
       apk add bash # Bash is not present
       for platform in $(params.TARGET_PLATFORMS); do
         echo "Fetching Tekton components for ${platform} build"
-        ./hack/fetch-releases.sh ${platform} $(params.PIPELINES_VERSION) $(params.TRIGGERS_VERSION) $(params.DASHBOARD_VERSION) $(params.RESULTS_VERSION) $(params.CHAINS_VERSION)
-
+        ./hack/fetch-releases.sh ${platform} $(params.PIPELINES_VERSION) $(params.TRIGGERS_VERSION) $(params.DASHBOARD_VERSION) $(params.RESULTS_VERSION) $(params.PAC_VERSION) $(params.HUB_VERSION) $(params.CHAINS_VERSION)
+        [[ "$?" != 0 ]] &&  exit 1
         # print directory structure of cmd/<platform>/operator/kodata
         find cmd/${platform}/operator/kodata/
       done


Test patch:
diff --git a/pkg/reconciler/common/targetnamespace_test.go b/pkg/reconciler/common/targetnamespace_test.go
index 82ea893fb..a4c15f514 100644
--- a/pkg/reconciler/common/targetnamespace_test.go
+++ b/pkg/reconciler/common/targetnamespace_test.go
@@ -18,53 +18,14 @@ package common
 
 import (
 	"context"
-	"fmt"
-	"os"
 	"testing"
 
-	"github.com/google/go-cmp/cmp"
-	mf "github.com/manifestival/manifestival"
 	"github.com/tektoncd/operator/pkg/apis/operator/v1alpha1"
 	"gotest.tools/v3/assert"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/client-go/kubernetes/fake"
 )
 
-type fakeClient struct {
-	err            error
-	getErr         error
-	createErr      error
-	resourcesExist bool
-	creates        []unstructured.Unstructured
-	deletes        []unstructured.Unstructured
-}
-
-var configMap = namespacedResource("v1", "ConfigMap", "test-ns", "operators-info")
-
-func (f *fakeClient) Get(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
-	var resource *unstructured.Unstructured
-	if f.resourcesExist {
-		resource = &unstructured.Unstructured{}
-	}
-	return resource, f.getErr
-}
-
-func (f *fakeClient) Create(obj *unstructured.Unstructured, options ...mf.ApplyOption) error {
-	obj.SetAnnotations(nil) // Deleting the extra annotation. Irrelevant for the test.
-	f.creates = append(f.creates, *obj)
-	return f.createErr
-}
-
-func (f *fakeClient) Delete(obj *unstructured.Unstructured, options ...mf.DeleteOption) error {
-	f.deletes = append(f.deletes, *obj)
-	return f.err
-}
-
-func (f *fakeClient) Update(obj *unstructured.Unstructured, options ...mf.ApplyOption) error {
-	return f.err
-}
-
 func TestCreateTargetNamespace(t *testing.T) {
 	targetNamespace := "test-ns"
 	component := &v1alpha1.TektonPipeline{
@@ -104,39 +65,3 @@ func TestTargetNamespaceNotFound(t *testing.T) {
 	_, err = fakeClientset.CoreV1().Namespaces().Get(context.Background(), "foo", metav1.GetOptions{})
 	assert.Equal(t, err.Error(), `namespaces "foo" not found`)
 }
-
-func TestOperatorVersionCreateConfigMap(t *testing.T) {
-	os.Setenv(KoEnvKey, "testdata/kodata")
-	defer os.Unsetenv(KoEnvKey)
-
-	targetNamespace := "test-ns"
-	component := &v1alpha1.TektonPipeline{
-		ObjectMeta: metav1.ObjectMeta{
-			Name: "test-name",
-		},
-		Spec: v1alpha1.TektonPipelineSpec{
-			CommonSpec: v1alpha1.CommonSpec{
-				TargetNamespace: targetNamespace,
-			},
-		},
-	}
-	fakeClientset := fake.NewSimpleClientset()
-
-	err := CreateTargetNamespace(context.Background(), nil, component, fakeClientset)
-	assert.Equal(t, err, nil)
-
-	var manifest mf.Manifest
-
-	client := &fakeClient{}
-	manifest, err = mf.ManifestFrom(mf.Slice(manifest.Resources()), mf.UseClient(client))
-	assert.Equal(t, err, nil)
-
-	err = CreateOperatorVersionConfigMap(manifest, component)
-	assert.Equal(t, err, nil)
-
-	want := []unstructured.Unstructured{configMap}
-
-	if len(want) != len(client.creates) {
-		t.Fatalf("Unexpected creates: %s", fmt.Sprintf("(-got, +want): %s", cmp.Diff(client.creates, want)))
-	}
-}
diff --git a/pkg/reconciler/openshift/common/testdata/test-remove-fs-group-expected.yaml b/pkg/reconciler/openshift/common/testdata/test-remove-fs-group-expected.yaml
new file mode 100644
index 000000000..a220b5bc5
--- /dev/null
+++ b/pkg/reconciler/openshift/common/testdata/test-remove-fs-group-expected.yaml
@@ -0,0 +1,51 @@
+# Copyright © 2022 The Tekton Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: tekton-hub-api
+  labels:
+    app: tekton-hub-api
+spec:
+  selector:
+    matchLabels:
+      app: tekton-hub-api
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: tekton-hub-api
+    spec:
+      volumes:
+      - name: catalog-source
+        persistentVolumeClaim:
+          claimName: tekton-hub-api
+      - name: ssh-creds
+        secret:
+          secretName: tekton-hub-api-ssh-crds
+          optional: true
+      securityContext:
+        fsGroup: 101
+      containers:
+        - name: tekton-hub-api
+          image: quay.io/tekton-hub/api
+          volumeMounts:
+          - name: catalog-source
+            mountPath: "/tmp/catalog"
+          - name: ssh-creds
+            mountPath: "/home/hub/.ssh"
+          ports:
+            - containerPort: 8000
+            - containerPort: 4200
diff --git a/pkg/reconciler/openshift/common/testdata/test-remove-fs-group.yaml b/pkg/reconciler/openshift/common/testdata/test-remove-fs-group.yaml
new file mode 100644
index 000000000..480f29d19
--- /dev/null
+++ b/pkg/reconciler/openshift/common/testdata/test-remove-fs-group.yaml
@@ -0,0 +1,49 @@
+# Copyright © 2022 The Tekton Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: tekton-hub-api
+  labels:
+    app: tekton-hub-api
+spec:
+  selector:
+    matchLabels:
+      app: tekton-hub-api
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: tekton-hub-api
+    spec:
+      volumes:
+      - name: catalog-source
+        persistentVolumeClaim:
+          claimName: tekton-hub-api
+      - name: ssh-creds
+        secret:
+          secretName: tekton-hub-api-ssh-crds
+          optional: true
+      containers:
+        - name: tekton-hub-api
+          image: quay.io/tekton-hub/api
+          volumeMounts:
+          - name: catalog-source
+            mountPath: "/tmp/catalog"
+          - name: ssh-creds
+            mountPath: "/home/hub/.ssh"
+          ports:
+            - containerPort: 8000
+            - containerPort: 4200
diff --git a/pkg/reconciler/openshift/common/transformer_test.go b/pkg/reconciler/openshift/common/transformer_test.go
index 6abc4cd6d..f0c46fe28 100644
--- a/pkg/reconciler/openshift/common/transformer_test.go
+++ b/pkg/reconciler/openshift/common/transformer_test.go
@@ -118,3 +118,32 @@ func TestUpdateDeploymentsInterceptor(t *testing.T) {
 		t.Errorf("failed to update deployment %s", diff.PrintWantGot(d))
 	}
 }
+
+func TestRemoveFsGroup(t *testing.T) {
+	testData := path.Join("testdata", "test-remove-fs-group.yaml")
+	manifest, err := mf.ManifestFrom(mf.Recursive(testData))
+	assert.NilError(t, err)
+
+	testData = path.Join("testdata", "test-remove-fs-group-expected.yaml")
+	expectedManifest, err := mf.ManifestFrom(mf.Recursive(testData))
+	assert.NilError(t, err)
+
+	newManifest, err := expectedManifest.Transform(RemoveFsGroup("tekton-hub-api"))
+	assert.NilError(t, err)
+
+	got := &appsv1.Deployment{}
+	err = runtime.DefaultUnstructuredConverter.FromUnstructured(newManifest.Resources()[0].Object, got)
+	if err != nil {
+		t.Errorf("failed to load deployment yaml")
+	}
+
+	expected := &appsv1.Deployment{}
+	err = runtime.DefaultUnstructuredConverter.FromUnstructured(manifest.Resources()[0].Object, expected)
+	if err != nil {
+		t.Errorf("failed to load deployment yaml")
+	}
+
+	if d := cmp.Diff(expected, got); d != "" {
+		t.Errorf("failed to update deployment %s", diff.PrintWantGot(d))
+	}
+}
diff --git a/pkg/reconciler/openshift/tektonaddon/testdata/test-console-cli-expected.yaml b/pkg/reconciler/openshift/tektonaddon/testdata/test-console-cli-expected.yaml
index 6c48c5d15..79efb0fbc 100644
--- a/pkg/reconciler/openshift/tektonaddon/testdata/test-console-cli-expected.yaml
+++ b/pkg/reconciler/openshift/tektonaddon/testdata/test-console-cli-expected.yaml
@@ -6,13 +6,23 @@ spec:
   description: The OpenShift Pipeline client `tkn` is a CLI tool that allows you to manage OpenShift Pipeline resources.
   displayName: tkn - OpenShift Pipeline Command Line Interface (CLI)
   links:
-    - href: https://testserver.com/tkn/tkn-linux-amd64-0.21.0.tar.gz
+    - href: https://testserver.com/tkn/tkn-linux-amd64-1.2.3.tar.gz
       text: Download tkn for Linux
-    - href: https://testserver.com/tkn/tkn-linux-ppc64le-0.21.0.tar.gz
+    - href: https://testserver.com/tkn/tkn-pac-linux-amd64-1.2.3.tar.gz
+      text: Download tkn-pac for Linux
+    - href: https://testserver.com/tkn/tkn-linux-ppc64le-1.2.3.tar.gz
       text: Download tkn for IBM Power
-    - href: https://testserver.com/tkn/tkn-linux-s390x-0.21.0.tar.gz
+    - href: https://testserver.com/tkn/tkn-pac-linux-ppc64le-1.2.3.tar.gz
+      text: Download tkn-pac for IBM Power
+    - href: https://testserver.com/tkn/tkn-linux-s390x-1.2.3.tar.gz
       text: Download tkn for IBM Z
-    - href: https://testserver.com/tkn/tkn-macos-amd64-0.21.0.tar.gz
+    - href: https://testserver.com/tkn/tkn-pac-linux-s390x-1.2.3.tar.gz
+      text: Download tkn-pac for IBM Z
+    - href: https://testserver.com/tkn/tkn-macos-amd64-1.2.3.tar.gz
       text: Download tkn for Mac
-    - href: https://testserver.com/tkn/tkn-windows-amd64-0.21.0.zip
+    - href: https://testserver.com/tkn/tkn-pac-macos-amd64-1.2.3.tar.gz
+      text: Download tkn-pac for Mac
+    - href: https://testserver.com/tkn/tkn-windows-amd64-1.2.3.zip
       text: Download tkn for Windows
+    - href: https://testserver.com/tkn/tkn-pac-windows-amd64-1.2.3.zip
+      text: Download tkn-pac for Windows
diff --git a/pkg/reconciler/openshift/tektonaddon/testdata/test-triggertemplate-taskrun.yaml b/pkg/reconciler/openshift/tektonaddon/testdata/test-triggertemplate-taskrun.yaml
index 042a66da4..4ffbfa149 100644
--- a/pkg/reconciler/openshift/tektonaddon/testdata/test-triggertemplate-taskrun.yaml
+++ b/pkg/reconciler/openshift/tektonaddon/testdata/test-triggertemplate-taskrun.yaml
@@ -1068,7 +1068,7 @@ spec:
                 - name: PAC_WEBHOOK_TYPE
                   value: "$(params.event_type)"
               imagePullPolicy: Always
-              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.3"
+              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.5"
               script: |
                 #!/usr/bin/env bash
                 set -euf
@@ -1249,7 +1249,7 @@ spec:
           steps:
             - name: apply-and-launch
               imagePullPolicy: Always
-              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.3"
+              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.5"
               env:
                 - name: PAC_GIT_PROVIDER_APIURL
                   value: $(params.ghe_host)
@@ -1416,7 +1416,7 @@ spec:
           steps:
             - name: apply-and-launch
               imagePullPolicy: Always
-              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.3"
+              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.5"
               env:
                 - name: PAC_GIT_PROVIDER_APIURL
                   value: $(params.ghe_host)
@@ -1682,7 +1682,7 @@ spec:
                 - name: PAC_SOURCE_IP
                   value: $(params.source_ip)
               imagePullPolicy: Always
-              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.3"
+              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.5"
               script: |
                 #!/usr/bin/env bash
                 set -euf
@@ -1877,7 +1877,7 @@ spec:
                 - name: PAC_SOURCE_IP
                   value: $(params.source_ip)
               imagePullPolicy: Always
-              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.3"
+              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.5"
               script: |
                 #!/usr/bin/env bash
                 set -euf
@@ -2168,7 +2168,7 @@ spec:
                 - name: PAC_PAYLOAD_FILE
                   value: "/tmp/payload.json"
               imagePullPolicy: Always
-              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.3"
+              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.5"
               script: |
                 #!/usr/bin/env bash
                 set -euf
@@ -2373,7 +2373,7 @@ spec:
                 - name: PAC_PAYLOAD_FILE
                   value: "/tmp/payload.json"
               imagePullPolicy: Always
-              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.3"
+              image: "quay.io/openshift-pipeline/pipelines-as-code:0.5.5"
               script: |
                 #!/usr/bin/env bash
                 set -euf
diff --git a/pkg/reconciler/openshift/tektonaddon/transformer_test.go b/pkg/reconciler/openshift/tektonaddon/transformer_test.go
index 224cf599e..5115648bc 100644
--- a/pkg/reconciler/openshift/tektonaddon/transformer_test.go
+++ b/pkg/reconciler/openshift/tektonaddon/transformer_test.go
@@ -42,7 +42,7 @@ func TestUpdateConsoleCLIDownload(t *testing.T) {
 	expectedManifest, err := mf.ManifestFrom(mf.Recursive(testData))
 	assert.NilError(t, err)
 
-	newManifest, err := manifest.Transform(replaceURLCCD("testserver.com"))
+	newManifest, err := manifest.Transform(replaceURLCCD("testserver.com", "1.2.3"))
 	assert.NilError(t, err)
 
 	got := &console.ConsoleCLIDownload{}
diff --git a/test/config.sh b/test/config.sh
index 21aea2046..680c3413f 100644
--- a/test/config.sh
+++ b/test/config.sh
@@ -3,4 +3,5 @@ export TEKTON_TRIGGERS_VERSION=latest
 export TEKTON_RESULTS_VERSION=v0.4.0
 export TEKTON_DASHBOARD_VERSION=latest
 export TEKTON_CHAINS_VERSION=latest
-export PAC_VERSION=0.5.2
+export PAC_VERSION=0.5.5
+export TEKTON_HUB_VERSION=v1.7.1
diff --git a/test/e2e-common.sh b/test/e2e-common.sh
index 621c1eec8..e5d73f996 100755
--- a/test/e2e-common.sh
+++ b/test/e2e-common.sh
@@ -29,18 +29,19 @@ source $(dirname $0)/config.sh
 function install_operator_resources() {
 
   echo :Payload Targets:
-  echo Pipelines: ${PIPELINES_VERSION}
-  echo Triggers: ${TRIGGERS_VERSION}
-  echo Chains: ${CHAINS_VERSION}
+  echo Pipelines: ${TEKTON_PIPELINE_VERSION}
+  echo Triggers: ${TEKTON_TRIGGERS_VERSION}
+  echo Chains: ${TEKTON_CHAINS_VERSION}
+  echo Hub: ${TEKTON_HUB_VERSION}
   if [[ ${TARGET} != "openshift" ]]; then
-    echo Results: ${RESULTS_VERSION}
-    echo Dashboard: ${DASHBOARD_VERSION}
+    echo Results: ${TEKTON_RESULTS_VERSION}
+    echo Dashboard: ${TEKTON_DASHBOARD_VERSION}
   fi
   echo '------------------------------'
 
   echo ">> Deploying Tekton Operator Resources"
 
-  make TARGET=${TARGET:-kubernetes} apply || fail_test "Tekton Operator installation failed"
+  make KO_BIN=$(which ko) KUSTOMIZE_BIN=$(which kustomize) TARGET=${TARGET:-kubernetes} apply || fail_test "Tekton Operator installation failed"
 
   OPERATOR_NAMESPACE="tekton-operator"
   [[ "${TARGET}" == "openshift" ]] && OPERATOR_NAMESPACE="openshift-operators"
diff --git a/test/resources/verify.go b/test/resources/verify.go
index de87b3a93..811bfcf8a 100644
--- a/test/resources/verify.go
+++ b/test/resources/verify.go
@@ -62,7 +62,7 @@ func DeleteAndVerifyDeployments(t *testing.T, clients *utils.Clients, namespace,
 	})
 
 	if waitErr != nil {
-		t.Fatalf("The deployment %s/%s failed to reach the desired state: %v", deployment.Namespace, deployment.Name, err)
+		t.Fatalf("The deployment %s/%s failed to reach the desired state: %v", deployment.Namespace, deployment.Name, waitErr)
 	}
 }