diff --git a/docs/2._Development/Helm/1-create-helm-operator.md b/docs/2._Development/Helm/1-create-helm-operator.md
index 8c0f9e7ef69fd2777aeb749d37824ea481b85895..b8893de7c0fdd4ca6c70166e73375c3d3f6f0a00 100644
--- a/docs/2._Development/Helm/1-create-helm-operator.md
+++ b/docs/2._Development/Helm/1-create-helm-operator.md
@@ -13,12 +13,90 @@ You can create a Helm operator from scratch, or create one based on an existing
 
 ## Set up CI
 
-Use the following `.gitlab-ci.yml`:
+Use the following `.gitlab-ci.yml`, updating `IMAGE_TAG_BASE`.
+
+- For deployment with OLM on app-catalogue, several images are built from the `IMAGE_TAG_BASE` prefix:
+  - the controller itself 
+  - a bundle image with the metadata about the current version (CSV etc.)
+  - the catalog image (for deployment to staging and prod clusters) where each bundle is appended
+- [set up a project](https://gitlab.cern.ch/vcs/harbor-integration-docs/-/blob/master/docs/1._Getting_Started/1-setup-harbor-project.md)
+  on `registry.cern.ch`
+  and [set CI/CD var `DOCKER_AUTH_CONFIG`](https://gitlab.cern.ch/vcs/harbor-integration-docs/-/blob/master/docs/2._Build_Push_And_Run_Image/2-using-gitlab-ci-cd.md)
+  (CI templates for Helm operators do not expect gitlab-registry).
+
 
 ```yaml
+variables:
+  VERSION: 0.0.1
+  # IMAGE_TAG_BASE defines the docker.io namespace and part of the image name for remote images.
+  # This variable is used to construct full image tags for bundle and catalog images.
+  IMAGE_TAG_BASE: "registry.cern.ch/vcs/nexus-cern-operator/nexus-cern-operator"
+  # Image URL to use all building/pushing image targets
+  IMG: "${IMAGE_TAG_BASE}-controller:${VERSION}"
+  BUNDLE_IMG: ${IMAGE_TAG_BASE}-bundle:v${VERSION}
+  # Channel naming
+  # c.f. https://olm.operatorframework.io/docs/best-practices/channel-naming/#recommended-channel-naming
+  # Bundle channels are configured per enviroment
+  BUNDLE_CHANNELS: "--channels='stable'"
+  BUNDLE_DEFAULT_CHANNEL: "--default-channel='stable'"
+  BUNDLE_METADATA_OPTS: "${BUNDLE_CHANNELS} ${BUNDLE_DEFAULT_CHANNEL}"
+  # A comma-separated list of bundle images (e.g. make catalog-build BUNDLE_IMGS=example.com/operator-bundle:v0.1.0,example.com/operator-bundle:v0.2.0).
+  # These images MUST exist in a registry and be pull-able.
+  BUNDLE_IMGS: ${BUNDLE_IMG}
+  # Operator SDK version required.
+  OPERATOR_SDK_VERSION: 1.19.0
+
+include:
+  - project: 'paas-tools/infrastructure-ci'
+    file: 'operator-ci-templates/DockerImages.gitlab-ci.yml'
+
+# DEVELOPMENT PURPOSES #
+#
+# Just use it for development purposes.
+Build and Push Bundle (for development purposes):
+  stage: build-bundle
+  environment: dev
+  except:
+    - tags
+  when: manual
+  needs: []
+
+# STAGING #
+#
+# When pushing to any branch, this will trigger a deployment under the `stable` channel.
+# and to the `catalog:staging` tag (staging clusters)
+# i.e., changes are automatically deployed to https://app-stg-cat.cern.ch
+# This process must be triggered manually and it will build/push the controller, the bundle and the catalog.
+OLM Deployment (staging):
+  stage: deploy-bundle-staging
+  environment: staging
+  except:
+    - tags
+  when: manual
+  needs: []
+  variables:
+    # Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image.
+    # Use staging tag for staging clusters
+    CATALOG_IMG: ${IMAGE_TAG_BASE}-catalog:staging
+#    CATALOG_BASE_IMG: ${IMAGE_TAG_BASE}-catalog:staging
 
+# PRODUCTION #
+#
+# When generating a tag (e.g., 0.0.3), this will trigger a deployment under the `stable` channel.
+# and to the `catalog:latest` tag (production clusters)
+# i.e., changes are automatically deployed to https://app-catalogue.cern.ch
+# This process must be triggered manually and it will build/push the controller, the bundle and the catalog.
+OLM Deployment (production):
+  stage: deploy-bundle-production
+  environment: production
+  when: manual
+  needs: []
+  only:
+    - tags
+  variables:
+    # Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image.
+    # Use latest tag for production clusters
+    CATALOG_IMG: ${IMAGE_TAG_BASE}-catalog:latest
+#    CATALOG_BASE_IMG: ${IMAGE_TAG_BASE}-catalog:latest
 ```
 
-TODO:
-- need workspace on `registry.cern.ch`
-- set CI/CD var `DOCKER_AUTH_CONFIG`
diff --git a/docs/2._Development/Helm/3-develop-new-version.md b/docs/2._Development/Helm/3-develop-new-version.md
index 0291212b7163596cf6f2597491a5eee341e34205..e7615db9637d9f19cc260a47af5930a197886815 100644
--- a/docs/2._Development/Helm/3-develop-new-version.md
+++ b/docs/2._Development/Helm/3-develop-new-version.md
@@ -1,6 +1,50 @@
 # Develop a new version of the Helm operator
 
-In order to iteratively develop the operator, we must take into account the following concepts:
+## Working on the Helm chart
+
+First step is to develop and test the Helm chart without deploying it via the operator. E.g. on an OKD4 dev cluster
+configured with flavor `paas` or `app-catalogue`:
+
+```bash
+export KUBECONFIG=/my/dev/cluster/admin/kubeconfig
+# create project on behalf of CERN user to have SSO integration working
+oc new-project test-nexus --description "test nexus cern chart" --as=alossent --as-group system:authenticated:oauth --as-group system:authenticated
+# deploy/upgrade our Helm chart, setting some Helm values
+helm upgrade --namespace test-nexus --install nexus1 helm-charts/nexus-cern --set cern-auth-proxy.route.hostname=nexus1.apptest.cern.ch --set init-nexus-config.initialAdminEgroup=it-service-vcs --set nexus-repository-manager.nexus.securityContext=null --reset-values
+```
+
+## Working on the operator itself
+
+Once we have a working Helm chart, we can now deploy an instance of the application using the operator.
+
+Still on an OKD4 dev cluster configured with flavor `paas` or `app-catalogue`:
+
+```bash
+export KUBECONFIG=/my/dev/cluster/admin/kubeconfig
+# deploy CRD to dev cluster
+make install
+# run the operator locally
+make run
+```
+
+Now the operator is running (on our local machine, not on the cluster) and watches for custom resources.
+
+NB: if another version of the operator is installed in the cluster, stop it before running the operator locally!
+Otherwise they will compete with one another.
+
+Create an application instance via the operator:
+
+```bash
+# create another project for an instance provisioned from operator
+oc new-project test-nexus2 --description "test nexus cern operator" --as=alossent --as-group system:authenticated:oauth --as-group system:authenticated
+# create app instance by instantiating a custom resource
+# (assuming we've properly updated the sample when creating our CRD)
+oc create -f config/samples/nexus_v1alpha1_nexus.yaml
+```
+
+## Packaging the operator with OLM
+
+In order to iteratively develop the OLM packaging of the operator, we must take into account the following concepts:
 
 * The `controller manager`.
 * The `bundle`: a representation of the operator in the form of manifests. It will be composed of several resources, like the `CustomResourceDefinition` (CRD), the `ClusterServiceVersion` (CSV), and the necessary service account and RBAC for the controller manager to run.
@@ -9,8 +53,6 @@ In order to iteratively develop the operator, we must take into account the foll
 
 Check <https://docs.okd.io/latest/operators/admin/olm-managing-custom-catalogs.html> for a more detailed description.
 
-## How to develop a new version
-
 To develop a new version of the Helm operator, we will lean in the use of the GitLab CI jobs prepared for the Helm operators purpose (see <https://gitlab.cern.ch/paas-tools/infrastructure-ci/-/blob/master/operator-ci-templates/DockerImages.gitlab-ci.yml>). We will basically simulate how the GitLab CI does but in our local development machine.
 
 These commands are based on the `Makefile` provided by default by the helm operator generated project.
@@ -21,6 +63,13 @@ These commands are based on the `Makefile` provided by default by the helm opera
 
 First version of the operator (`0.0.1`) is a special case for the OKD4 infrastructure, given [how the catalog sources are deployed](https://gitlab.cern.ch/paas-tools/okd4-install/-/tree/master/docs/components/operators-catalogue), so we will deal with it separately.
 
+### Testing the OLM deployment on a dev cluster (optional)
+
+This step can be used to debug the OLM packaging process.
+In general it's optional since once we are happy with our operator using the previous steps,
+we can just commit the changes and let GitLab CI build the OLM catalog (see "committing changes" sections below)
+and then [deploy it on app-catalogue staging or prod instances](../4._Deployment/Helm/1-deploy-new-version.md).
+
 Let's assume we have already deployed the version `0.0.1`, and we want to deploy the version `0.0.2`.
 
 !!! info
@@ -126,7 +175,7 @@ Once we are satifisfied with the result, it is time to commit changes.
 
 Depending on the version we want to deploy, different procedure applies. See below.
 
-## Committing changes for the first version of the operator
+### Committing changes for the first version of the operator
 
 When committing the first version of the operator, there is no existing catalog at that moment, hence we cannot _append_ the new bundle but _add_ it to the catalog.
 
@@ -149,9 +198,11 @@ When committing the first version of the operator, there is no existing catalog
       # CATALOG_BASE_IMG: ${IMAGE_TAG_BASE}-catalog:latest
   ```
 
+* Run `make bundle` once to initialize the clusterserviceversion file
+
 * Ensure removing the `metadata.annotations.olm.skipRange` value under `config\manifests\bases\<operator-name>.clusterserviceversion.yaml`.
 
-## Committing changes for sucessive versions of the operator
+### Committing changes for sucessive versions of the operator
 
 * Update the `VERSION` value under the `.gitlab-ci.yml` file.
 
diff --git a/docs/4._Deployment/Helm/1-deploy-new-version.md b/docs/4._Deployment/Helm/1-deploy-new-version.md
index 55ebfb770841346748a00c145dc99bb739e7e593..272feac5cbd92fe666af75a8f311e4878178ba2e 100644
--- a/docs/4._Deployment/Helm/1-deploy-new-version.md
+++ b/docs/4._Deployment/Helm/1-deploy-new-version.md
@@ -9,7 +9,7 @@ According to <https://gitlab.cern.ch/paas-tools/infrastructure-ci/-/blob/master/
 In short:
 
 * **Staging cluster**: any branch (including `master`).
-* **Production cluster**: create a new tag.
+* **Production cluster**: create a new tag using the version number (`VERSION` in `.gitlab-ci.yml`), e.g. `0.0.1`
 
 For both cases, go to your GitLab repository, mouse over `CI/CD` > Pipelines > point the appropriate job and execute the `OLM Deployment (staging)` or `OLM Deployment (production)` jobs accordingly.