Merge "Added probe schemas"
diff --git a/Documentation/operator-api-reference.md b/Documentation/operator-api-reference.md
index 5d03cf5..1f22d03 100644
--- a/Documentation/operator-api-reference.md
+++ b/Documentation/operator-api-reference.md
@@ -23,6 +23,7 @@
   - [GerritClusterIngressConfig](#gerritclusteringressconfig)
   - [GerritIngressTlsConfig](#gerritingresstlsconfig)
   - [GerritIngressAmbassadorConfig](#gerritingressambassadorconfig)
+  - [GerritIstioConfig](#gerritistioconfig)
   - [GlobalRefDbConfig](#globalrefdbconfig)
   - [RefDatabase](#refdatabase)
   - [SpannerRefDbConfig](#spannerrefdbconfig)
@@ -65,7 +66,7 @@
 ---
 
 **Group**: gerritoperator.google.com \
-**Version**: v1alpha17 \
+**Version**: v1beta2 \
 **Kind**: GerritCluster
 
 ---
@@ -82,7 +83,7 @@
 Example:
 
 ```yaml
-apiVersion: "gerritoperator.google.com/v1alpha17"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritCluster
 metadata:
   name: gerrit
@@ -138,6 +139,9 @@
     ambassador:
       id: []
       createHost: false
+    istio:
+      gatewaySelector:
+        istio: ingressgateway
 
   refdb:
     database: NONE
@@ -348,7 +352,7 @@
 ---
 
 **Group**: gerritoperator.google.com \
-**Version**: v1alpha17 \
+**Version**: v1beta2 \
 **Kind**: Gerrit
 
 ---
@@ -365,7 +369,7 @@
 Example:
 
 ```yaml
-apiVersion: "gerritoperator.google.com/v1alpha17"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: Gerrit
 metadata:
   name: gerrit
@@ -554,7 +558,7 @@
 ---
 
 **Group**: gerritoperator.google.com \
-**Version**: v1alpha6 \
+**Version**: v1beta2 \
 **Kind**: Receiver
 
 ---
@@ -571,7 +575,7 @@
 Example:
 
 ```yaml
-apiVersion: "gerritoperator.google.com/v1alpha6"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: Receiver
 metadata:
   name: receiver
@@ -682,7 +686,7 @@
 ---
 
 **Group**: gerritoperator.google.com \
-**Version**: v1alpha1 \
+**Version**: v1beta2 \
 **Kind**: GitGarbageCollection
 
 ---
@@ -699,7 +703,7 @@
 Example:
 
 ```yaml
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GitGarbageCollection
 metadata:
   name: gitgc
@@ -739,7 +743,7 @@
 ---
 
 **Group**: gerritoperator.google.com \
-**Version**: v1alpha2 \
+**Version**: v1beta2 \
 **Kind**: GerritNetwork
 
 ---
@@ -755,7 +759,7 @@
 Example:
 
 ```yaml
-apiVersion: "gerritoperator.google.com/v1alpha2"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit-network
@@ -767,6 +771,9 @@
     tls:
       enabled: false
       secret: ""
+    istio:
+      gatewaySelector:
+        istio: ingressgateway
   receiver:
     name: receiver
     httpPort: 80
@@ -884,6 +891,7 @@
 | `annotations` | `Map<String, String>` | Annotations to be set for the ingress. This allows to configure the ingress further by e.g. setting the ingress class. This will be only used for type INGRESS and ignored otherwise. (optional) |
 | `tls` | [`GerritIngressTlsConfig`](#gerritingresstlsconfig) | Configuration of TLS to be used in the ingress |
 | `ambassador` | [`GerritIngressAmbassadorConfig`](#gerritingressambassadorconfig) | Ambassador configuration. Only relevant when the INGRESS environment variable is set to "ambassador" in the operator |
+| `istio` | [`GerritIstioConfig`](#gerritistioconfig) | Istio configuration. Only relevant when the INGRESS environment variable is set to "istio" in the operator |
 
 ## GerritIngressTlsConfig
 
@@ -899,6 +907,12 @@
 | `id` | `List<String>` | The operator uses the ids specified in `ambassadorId` to set the [ambassador_id](https://www.getambassador.io/docs/edge-stack/1.14/topics/running/running#ambassador_id) spec field in the Ambassador CustomResources it creates (`Mapping`, `TLSContext`). (optional) |
 | `createHost`| `boolean` | Specify whether you want the operator to create a `Host` resource. This will be required if you don't have a wildcard host set up in your cluster. Default is `false`. (optional) |
 
+## GerritIstioConfig
+
+| Field | Type | Description |
+|---|---|---|
+| `gatewaySelector` | `Map<String, String>` | Labels used to select the Istio Ingressgateway Deployment to use (default: `istio: ingressgateway`) |
+
 ## GlobalRefDbConfig
 
 Note, that the operator will not deploy or operate the database used for the
diff --git a/Documentation/operator-dev.md b/Documentation/operator-dev.md
new file mode 100644
index 0000000..e4a1753
--- /dev/null
+++ b/Documentation/operator-dev.md
@@ -0,0 +1,147 @@
+# Operator Development
+
+1. [Operator Development](#operator-development)
+   1. [Build](#build)
+   2. [Versioning](#versioning)
+   3. [Publish](#publish)
+   4. [Tests](#tests)
+
+## Build
+
+For this step, you need Java 11 and Maven installed.
+
+To build all components of the operator run:
+
+```sh
+cd operator
+mvn clean install
+```
+
+This step compiles the Java source code into `.class` bytecode files in a newly
+generated `operator/target` folder. A `gerrit-operator` image is also created
+locally. Moreover, the CRD helm chart is updated with the latest CRDs as part of
+this build step.
+
+The jar-version and container image tag can be set using the `revision` property:
+
+```sh
+mvn clean install -Drevision=$(git describe --always --dirty)
+```
+
+## Versioning
+
+The Gerrit Operator manages a single group of CustomResourceDefinitions:
+`gerritoperator.google.com`. Beginning from version `v1beta1` all
+CustomResourceDefinitions in that group will be the same, even if only one of
+those resource definitions changes compared to the previous version. This makes
+it easier to track which versions are meant to work together.
+
+Changes to CustomResourceDefinitions have to include a version update, otherwise
+the change will be rejected during code review, since otherwise an update would
+fail in the cluster.
+
+The GerritOperator will only support two versions at a time. The new version is
+always the one stored in ETCD. The older version has to be marked as deprecated
+to indicate that it is not used by the reconcilers anymore.
+
+To create a new version, the `operator/tools/newCRDVersion`-script can be used.
+It will create a new version based on the old version in the operator code that
+can be used to add the changes to the CRDs:
+
+```sh
+operator/tools/newCRDVersion v1alpha v1beta1
+
+# optionally delete the now obsolete version
+operator/tools/newCRDVersion --delete v1alpha v1beta1 v1beta2
+```
+
+**Note:** On OSX, the `--osx` flag has to be used for the `newCRDVersion` script
+since the `sed` version shipped with OSX uses different options than the GNU
+version.
+
+The commit adding a new version will be tagged in git using the version string.
+
+## Publish
+
+Currently, there does not exist a container image for the operator in the
+`docker.io/k8sgerrit` registry. You must build your own image in order to run
+the operator in your cluster. To publish the container image of the Gerrit
+Operator:
+
+1. Update the `docker.registry` and `docker.org` tags in the `operator/pom.xml`
+file to point to your own Docker registry and org that you have permissions to
+push to.
+
+```xml
+<docker.registry>my-registry</docker.registry>
+<docker.org>my-org</docker.org>
+```
+
+2. run the following commands:
+
+```sh
+cd operator
+mvn clean install -P publish
+```
+
+This will build the operator source code, create an image out of the
+built artifacts, and publish this image to the registry specified in the
+`pom.xml` file. The built image is multi-platform - it will run on both `amd64`
+and `arm64` architectures. It is okay to run this build command from an ARM
+Mac.
+
+## Tests
+
+Executing the E2E tests has a few infrastructure requirements that have to be
+provided:
+
+- An (unused) Kubernetes cluster
+- The 'default' StorageClass that supports ReadWriteOnce access. It has to be
+  possible to provision volumes using this StorageClass.
+- A StorageClass that supports ReadWriteMany access. It has to be possible to
+  provision volumes using this StorageClass. Such a StorageClass could be provided
+  by the [NFS-subdir-provisioner chart](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner).
+- An [Nginx Ingress Controller](https://github.com/kubernetes/ingress-nginx)
+- An installation of [OpenLDAP](../supplements/test-cluster/ldap/openldap.yaml)
+  with at least one user.
+- Istio installed with the [profile](../istio/gerrit.profile.yaml) provided by
+  this project
+- A secret containing valid certificates for the given hostnames. For istio this
+  secret has to be named `tls-secret` and be present in the `istio-system` namespace.
+  For the Ingress controller, the secret has to be either set as the default
+  secret to be used or somehow automatically be provided in the namespaces created
+  by the tests and named `tls-secret`, e.g. by using Gardener to manage DNS and
+  certificates.
+
+A sample setup for components required in the cluster is provided under
+`$REPO_ROOT/supplements/test-cluster`. Some configuration has to be done manually
+(marked by `#TODO`) and the `deploy.sh`-script can be used to install/update all
+components.
+
+In addition, some properties have to be set to configure the tests:
+
+- `rwmStorageClass`: Name of the StorageClass providing RWM-access (default:nfs-client)
+- `registry`: Registry to pull container images from
+- `RegistryOrg`: Organization of the container images
+- `tag`: Container tag
+- `registryUser`: User for the container registry
+- `registryPwd`: Password for the container registry
+- `ingressDomain`: Domain to be used for the ingress
+- `istioDomain`: Domain to be used for istio
+- `ldapAdminPwd`: Admin password for LDAP server
+- `gerritUser`: Username of a user in LDAP
+- `gerritPwd`: The password of `gerritUser`
+
+The properties should be set in the `test.properties` file. Alternatively, a
+path of a properties file can be configured by using the
+`-Dproperties=<path to properties file>`-option.
+
+To run all E2E tests, use:
+
+```sh
+cd operator
+mvn clean install -P integration-test -Dproperties=<path to properties file>
+```
+
+Note, that running the E2E tests will also involve pushing the container image
+to the repository configured in the properties file.
diff --git a/Documentation/operator.md b/Documentation/operator.md
index 919e217..5fc952f 100644
--- a/Documentation/operator.md
+++ b/Documentation/operator.md
@@ -1,142 +1,27 @@
 # Gerrit Operator
 
 1. [Gerrit Operator](#gerrit-operator)
-   1. [Build](#build)
-   2. [Versioning](#versioning)
-   3. [Publish](#publish)
-   4. [Tests](#tests)
-   5. [Prerequisites](#prerequisites)
+   1. [Development](#development)
+   2. [Prerequisites](#prerequisites)
       1. [Shared Storage (ReadWriteMany)](#shared-storage-readwritemany)
       2. [Ingress provider](#ingress-provider)
-   6. [Deploy](#deploy)
+   3. [Deploy](#deploy)
       1. [Using helm charts](#using-helm-charts)
          1. [gerrit-operator-crds](#gerrit-operator-crds)
          2. [gerrit-operator](#gerrit-operator-1)
       2. [Without the helm charts](#without-the-helm-charts)
-   7. [CustomResources](#customresources)
+      3. [Updating](#updating)
+   4. [CustomResources](#customresources)
       1. [GerritCluster](#gerritcluster)
       2. [Gerrit](#gerrit)
       3. [GitGarbageCollection](#gitgarbagecollection)
       4. [Receiver](#receiver)
       5. [GerritNetwork](#gerritnetwork)
-   8. [Configuration of Gerrit](#configuration-of-gerrit)
+   5. [Configuration of Gerrit](#configuration-of-gerrit)
 
-## Build
+## Development
 
-For this step, you need Java 11 and Maven installed.
-
-To build all components of the operator run:
-
-```sh
-cd operator
-mvn clean install
-```
-
-This step compiles the Java source code into `.class` bytecode files in a newly
-generated `operator/target` folder. A `gerrit-operator` image is also created
-locally. Moreover, the CRD helm chart is updated with the latest CRDs as part of
-this build step.
-
-The jar-version and container image tag can be set using the `revision` property:
-
-```sh
-mvn clean install -Drevision=$(git describe --always --dirty)
-```
-
-## Versioning
-
-The Gerrit Operator is still in an early state of development. The operator is
-thus at the moment not semantically versioned. The CustomResources are as of now
-independently versioned, i.e. the `GerritCluster` resource can have a different
-version than the `GitGarbageCollection` resource, although they are in the same
-group. At the moment, only the current version will be supported by the operator,
-i.e. there won't be a migration path. As soon as the API reaches some stability,
-this will change.
-
-## Publish
-
-Currently, there does not exist a container image for the operator in the
-`docker.io/k8sgerrit` registry. You must build your own image in order to run
-the operator in your cluster. To publish the container image of the Gerrit
-Operator:
-
-1. Update the `docker.registry` and `docker.org` tags in the `operator/pom.xml`
-file to point to your own Docker registry and org that you have permissions to
-push to.
-
-```xml
-<docker.registry>my-registry</docker.registry>
-<docker.org>my-org</docker.org>
-```
-
-2. run the following commands:
-
-```sh
-cd operator
-mvn clean install -P publish
-```
-
-This will build the operator source code, create an image out of the
-built artifacts, and publish this image to the registry specified in the
-`pom.xml` file. The built image is multi-platform - it will run on both `amd64`
-and `arm64` architectures. It is okay to run this build command from an ARM
-Mac.
-
-## Tests
-
-Executing the E2E tests has a few infrastructure requirements that have to be
-provided:
-
-- An (unused) Kubernetes cluster
-- The 'default' StorageClass that supports ReadWriteOnce access. It has to be
-  possible to provision volumes using this StorageClass.
-- A StorageClass that supports ReadWriteMany access. It has to be possible to
-  provision volumes using this StorageClass. Such a StorageClass could be provided
-  by the [NFS-subdir-provisioner chart](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner).
-- An [Nginx Ingress Controller](https://github.com/kubernetes/ingress-nginx)
-- An installation of [OpenLDAP](../supplements/test-cluster/ldap/openldap.yaml)
-  with at least one user.
-- Istio installed with the [profile](../istio/gerrit.profile.yaml) provided by
-  this project
-- A secret containing valid certificates for the given hostnames. For istio this
-  secret has to be named `tls-secret` and be present in the `istio-system` namespace.
-  For the Ingress controller, the secret has to be either set as the default
-  secret to be used or somehow automatically be provided in the namespaces created
-  by the tests and named `tls-secret`, e.g. by using Gardener to manage DNS and
-  certificates.
-
-A sample setup for components required in the cluster is provided under
-`$REPO_ROOT/supplements/test-cluster`. Some configuration has to be done manually
-(marked by `#TODO`) and the `deploy.sh`-script can be used to install/update all
-components.
-
-In addition, some properties have to be set to configure the tests:
-
-- `rwmStorageClass`: Name of the StorageClass providing RWM-access (default:nfs-client)
-- `registry`: Registry to pull container images from
-- `RegistryOrg`: Organization of the container images
-- `tag`: Container tag
-- `registryUser`: User for the container registry
-- `registryPwd`: Password for the container registry
-- `ingressDomain`: Domain to be used for the ingress
-- `istioDomain`: Domain to be used for istio
-- `ldapAdminPwd`: Admin password for LDAP server
-- `gerritUser`: Username of a user in LDAP
-- `gerritPwd`: The password of `gerritUser`
-
-The properties should be set in the `test.properties` file. Alternatively, a
-path of a properties file can be configured by using the
-`-Dproperties=<path to properties file>`-option.
-
-To run all E2E tests, use:
-
-```sh
-cd operator
-mvn clean install -P integration-test -Dproperties=<path to properties file>
-```
-
-Note, that running the E2E tests will also involve pushing the container image
-to the repository configured in the properties file.
+Development processes are documented [here](./operator-dev.md).
 
 ## Prerequisites
 
@@ -297,6 +182,27 @@
 in `operator/k8s/operator.yaml` to either `NONE`, `INGRESS`, `ISTIO`, or
 `AMBASSADOR`.
 
+### Updating
+
+The Gerrit Operator helm chart can be updated by running:
+
+```sh
+# Rebuild the gerrit-operator-crds chart and store it in the charts/ subdirectory
+helm dependency build helm-charts/gerrit-operator/
+
+# Install the gerrit-operator-crds chart and the gerrit-operator chart
+helm -n gerrit-operator upgrade gerrit-operator helm-charts/gerrit-operator/
+```
+
+The Gerrit Operator will automatically reconcile all CustomResources in the cluster
+on startup.
+
+The GerritOperator will always only support two versions of the CRDs. The newer
+version will always be the one that will be stored in ETCD. Conversion will happen
+automatically during the update. Note, that this means that updates over multiple
+versions will not work, but updates that include CRD version updates have to be
+done in sequence.
+
 ## CustomResources
 
 The operator manages several CustomResources that are described in more detail
diff --git a/container-images/git-gc/tools/gc.sh b/container-images/git-gc/tools/gc.sh
index e3ad4e0..0720d32 100755
--- a/container-images/git-gc/tools/gc.sh
+++ b/container-images/git-gc/tools/gc.sh
@@ -122,8 +122,8 @@
 
   # Check if git-gc for this project has to be skipped
   if [ $SKIP_PROJECTS_OPT -eq 1 ]; then
-    for SKIP_PROJECT in "${SKIP_PROJECTS}"; do
-      if [ "$SKIP_PROJECT" == "$PROJECT_NAME" ] ; then
+    for SKIP_PROJECT in ${SKIP_PROJECTS}; do
+      if [ $SKIP_PROJECT == "$PROJECT_NAME" ] ; then
         OUT=$(date +"%D %r Skipped: $PROJECT_NAME") && log "$OUT"
         return 0
       fi
@@ -133,8 +133,8 @@
   # Check if writing bitmaps for this project has to be disabled
   WRITEBITMAPS='true';
   if [ $DONOT_WRITE_BITMAPS_OPT -eq 1 ]; then
-    for BITMAP_PROJECT in "${DONOT_WRITE_BITMAPS}"; do
-      if [ "$BITMAP_PROJECT" == "$PROJECT_NAME" ] ; then
+    for BITMAP_PROJECT in ${DONOT_WRITE_BITMAPS}; do
+      if [ $BITMAP_PROJECT == "$PROJECT_NAME" ] ; then
         WRITEBITMAPS='false';
       fi
     done
@@ -196,13 +196,14 @@
       DONOT_WRITE_BITMAPS="${DONOT_WRITE_BITMAPS} ${OPTARG}.git"
       DONOT_WRITE_BITMAPS_OPT=1
       ;;
-    h|?)
+    h|?|*)
       usage
       ;;
   esac
 done
 
-test $# -eq 0 || usage
+shift $(($OPTIND - 1))
+test $# -gt 0 && usage
 
 TOP=/var/gerrit/git
 LOG=/var/log/git/gc.log
diff --git a/helm-charts/gerrit-operator-crds/templates/gerritclusters.gerritoperator.google.com-v1.yml b/helm-charts/gerrit-operator-crds/templates/gerritclusters.gerritoperator.google.com-v1.yml
index 0fa15b7..55d695e 100644
--- a/helm-charts/gerrit-operator-crds/templates/gerritclusters.gerritoperator.google.com-v1.yml
+++ b/helm-charts/gerrit-operator-crds/templates/gerritclusters.gerritoperator.google.com-v1.yml
@@ -13,7 +13,1493 @@
     singular: gerritcluster
   scope: Namespaced
   versions:
-  - name: v1alpha17
+  - name: v1beta2
+    schema:
+      openAPIV3Schema:
+        properties:
+          spec:
+            properties:
+              storage:
+                properties:
+                  pluginCache:
+                    properties:
+                      enabled:
+                        type: boolean
+                    type: object
+                  storageClasses:
+                    properties:
+                      readWriteOnce:
+                        type: string
+                      readWriteMany:
+                        type: string
+                      nfsWorkaround:
+                        properties:
+                          enabled:
+                            type: boolean
+                          chownOnStartup:
+                            type: boolean
+                          idmapdConfig:
+                            type: string
+                        type: object
+                    type: object
+                  sharedStorage:
+                    properties:
+                      externalPVC:
+                        properties:
+                          enabled:
+                            type: boolean
+                          claimName:
+                            type: string
+                        type: object
+                      size:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      volumeName:
+                        type: string
+                      selector:
+                        properties:
+                          matchExpressions:
+                            items:
+                              properties:
+                                key:
+                                  type: string
+                                operator:
+                                  type: string
+                                values:
+                                  items:
+                                    type: string
+                                  type: array
+                              type: object
+                            type: array
+                          matchLabels:
+                            additionalProperties:
+                              type: string
+                            type: object
+                        type: object
+                    type: object
+                type: object
+              containerImages:
+                properties:
+                  imagePullPolicy:
+                    type: string
+                  imagePullSecrets:
+                    items:
+                      properties:
+                        name:
+                          type: string
+                      type: object
+                    type: array
+                  busyBox:
+                    properties:
+                      registry:
+                        type: string
+                      tag:
+                        type: string
+                    type: object
+                  gerritImages:
+                    properties:
+                      registry:
+                        type: string
+                      org:
+                        type: string
+                      tag:
+                        type: string
+                    type: object
+                type: object
+              ingress:
+                properties:
+                  enabled:
+                    type: boolean
+                  host:
+                    type: string
+                  annotations:
+                    additionalProperties:
+                      type: string
+                    type: object
+                  tls:
+                    properties:
+                      enabled:
+                        type: boolean
+                      secret:
+                        type: string
+                    type: object
+                  ssh:
+                    properties:
+                      enabled:
+                        type: boolean
+                    type: object
+                  ambassador:
+                    properties:
+                      id:
+                        items:
+                          type: string
+                        type: array
+                      createHost:
+                        type: boolean
+                    type: object
+                  istio:
+                    properties:
+                      gatewaySelector:
+                        additionalProperties:
+                          type: string
+                        type: object
+                    type: object
+                type: object
+              refdb:
+                properties:
+                  database:
+                    enum:
+                    - NONE
+                    - ZOOKEEPER
+                    - SPANNER
+                    type: string
+                  zookeeper:
+                    properties:
+                      connectString:
+                        type: string
+                      rootNode:
+                        type: string
+                    type: object
+                  spanner:
+                    properties:
+                      projectName:
+                        type: string
+                      instance:
+                        type: string
+                      database:
+                        type: string
+                    type: object
+                type: object
+              serverId:
+                type: string
+              gerrits:
+                items:
+                  properties:
+                    metadata:
+                      properties:
+                        annotations:
+                          additionalProperties:
+                            type: string
+                          type: object
+                        creationTimestamp:
+                          type: string
+                        deletionGracePeriodSeconds:
+                          type: integer
+                        deletionTimestamp:
+                          type: string
+                        finalizers:
+                          items:
+                            type: string
+                          type: array
+                        generateName:
+                          type: string
+                        generation:
+                          type: integer
+                        labels:
+                          additionalProperties:
+                            type: string
+                          type: object
+                        managedFields:
+                          items:
+                            properties:
+                              apiVersion:
+                                type: string
+                              fieldsType:
+                                type: string
+                              fieldsV1:
+                                type: object
+                              manager:
+                                type: string
+                              operation:
+                                type: string
+                              subresource:
+                                type: string
+                              time:
+                                type: string
+                            type: object
+                          type: array
+                        name:
+                          type: string
+                        namespace:
+                          type: string
+                        ownerReferences:
+                          items:
+                            properties:
+                              apiVersion:
+                                type: string
+                              blockOwnerDeletion:
+                                type: boolean
+                              controller:
+                                type: boolean
+                              kind:
+                                type: string
+                              name:
+                                type: string
+                              uid:
+                                type: string
+                            type: object
+                          type: array
+                        resourceVersion:
+                          type: string
+                        selfLink:
+                          type: string
+                        uid:
+                          type: string
+                      type: object
+                    spec:
+                      properties:
+                        serviceAccount:
+                          type: string
+                        tolerations:
+                          items:
+                            properties:
+                              effect:
+                                type: string
+                              key:
+                                type: string
+                              operator:
+                                type: string
+                              tolerationSeconds:
+                                type: integer
+                              value:
+                                type: string
+                            type: object
+                          type: array
+                        affinity:
+                          properties:
+                            nodeAffinity:
+                              properties:
+                                preferredDuringSchedulingIgnoredDuringExecution:
+                                  items:
+                                    properties:
+                                      preference:
+                                        properties:
+                                          matchExpressions:
+                                            items:
+                                              properties:
+                                                key:
+                                                  type: string
+                                                operator:
+                                                  type: string
+                                                values:
+                                                  items:
+                                                    type: string
+                                                  type: array
+                                              type: object
+                                            type: array
+                                          matchFields:
+                                            items:
+                                              properties:
+                                                key:
+                                                  type: string
+                                                operator:
+                                                  type: string
+                                                values:
+                                                  items:
+                                                    type: string
+                                                  type: array
+                                              type: object
+                                            type: array
+                                        type: object
+                                      weight:
+                                        type: integer
+                                    type: object
+                                  type: array
+                                requiredDuringSchedulingIgnoredDuringExecution:
+                                  properties:
+                                    nodeSelectorTerms:
+                                      items:
+                                        properties:
+                                          matchExpressions:
+                                            items:
+                                              properties:
+                                                key:
+                                                  type: string
+                                                operator:
+                                                  type: string
+                                                values:
+                                                  items:
+                                                    type: string
+                                                  type: array
+                                              type: object
+                                            type: array
+                                          matchFields:
+                                            items:
+                                              properties:
+                                                key:
+                                                  type: string
+                                                operator:
+                                                  type: string
+                                                values:
+                                                  items:
+                                                    type: string
+                                                  type: array
+                                              type: object
+                                            type: array
+                                        type: object
+                                      type: array
+                                  type: object
+                              type: object
+                            podAffinity:
+                              properties:
+                                preferredDuringSchedulingIgnoredDuringExecution:
+                                  items:
+                                    properties:
+                                      podAffinityTerm:
+                                        properties:
+                                          labelSelector:
+                                            properties:
+                                              matchExpressions:
+                                                items:
+                                                  properties:
+                                                    key:
+                                                      type: string
+                                                    operator:
+                                                      type: string
+                                                    values:
+                                                      items:
+                                                        type: string
+                                                      type: array
+                                                  type: object
+                                                type: array
+                                              matchLabels:
+                                                additionalProperties:
+                                                  type: string
+                                                type: object
+                                            type: object
+                                          namespaceSelector:
+                                            properties:
+                                              matchExpressions:
+                                                items:
+                                                  properties:
+                                                    key:
+                                                      type: string
+                                                    operator:
+                                                      type: string
+                                                    values:
+                                                      items:
+                                                        type: string
+                                                      type: array
+                                                  type: object
+                                                type: array
+                                              matchLabels:
+                                                additionalProperties:
+                                                  type: string
+                                                type: object
+                                            type: object
+                                          namespaces:
+                                            items:
+                                              type: string
+                                            type: array
+                                          topologyKey:
+                                            type: string
+                                        type: object
+                                      weight:
+                                        type: integer
+                                    type: object
+                                  type: array
+                                requiredDuringSchedulingIgnoredDuringExecution:
+                                  items:
+                                    properties:
+                                      labelSelector:
+                                        properties:
+                                          matchExpressions:
+                                            items:
+                                              properties:
+                                                key:
+                                                  type: string
+                                                operator:
+                                                  type: string
+                                                values:
+                                                  items:
+                                                    type: string
+                                                  type: array
+                                              type: object
+                                            type: array
+                                          matchLabels:
+                                            additionalProperties:
+                                              type: string
+                                            type: object
+                                        type: object
+                                      namespaceSelector:
+                                        properties:
+                                          matchExpressions:
+                                            items:
+                                              properties:
+                                                key:
+                                                  type: string
+                                                operator:
+                                                  type: string
+                                                values:
+                                                  items:
+                                                    type: string
+                                                  type: array
+                                              type: object
+                                            type: array
+                                          matchLabels:
+                                            additionalProperties:
+                                              type: string
+                                            type: object
+                                        type: object
+                                      namespaces:
+                                        items:
+                                          type: string
+                                        type: array
+                                      topologyKey:
+                                        type: string
+                                    type: object
+                                  type: array
+                              type: object
+                            podAntiAffinity:
+                              properties:
+                                preferredDuringSchedulingIgnoredDuringExecution:
+                                  items:
+                                    properties:
+                                      podAffinityTerm:
+                                        properties:
+                                          labelSelector:
+                                            properties:
+                                              matchExpressions:
+                                                items:
+                                                  properties:
+                                                    key:
+                                                      type: string
+                                                    operator:
+                                                      type: string
+                                                    values:
+                                                      items:
+                                                        type: string
+                                                      type: array
+                                                  type: object
+                                                type: array
+                                              matchLabels:
+                                                additionalProperties:
+                                                  type: string
+                                                type: object
+                                            type: object
+                                          namespaceSelector:
+                                            properties:
+                                              matchExpressions:
+                                                items:
+                                                  properties:
+                                                    key:
+                                                      type: string
+                                                    operator:
+                                                      type: string
+                                                    values:
+                                                      items:
+                                                        type: string
+                                                      type: array
+                                                  type: object
+                                                type: array
+                                              matchLabels:
+                                                additionalProperties:
+                                                  type: string
+                                                type: object
+                                            type: object
+                                          namespaces:
+                                            items:
+                                              type: string
+                                            type: array
+                                          topologyKey:
+                                            type: string
+                                        type: object
+                                      weight:
+                                        type: integer
+                                    type: object
+                                  type: array
+                                requiredDuringSchedulingIgnoredDuringExecution:
+                                  items:
+                                    properties:
+                                      labelSelector:
+                                        properties:
+                                          matchExpressions:
+                                            items:
+                                              properties:
+                                                key:
+                                                  type: string
+                                                operator:
+                                                  type: string
+                                                values:
+                                                  items:
+                                                    type: string
+                                                  type: array
+                                              type: object
+                                            type: array
+                                          matchLabels:
+                                            additionalProperties:
+                                              type: string
+                                            type: object
+                                        type: object
+                                      namespaceSelector:
+                                        properties:
+                                          matchExpressions:
+                                            items:
+                                              properties:
+                                                key:
+                                                  type: string
+                                                operator:
+                                                  type: string
+                                                values:
+                                                  items:
+                                                    type: string
+                                                  type: array
+                                              type: object
+                                            type: array
+                                          matchLabels:
+                                            additionalProperties:
+                                              type: string
+                                            type: object
+                                        type: object
+                                      namespaces:
+                                        items:
+                                          type: string
+                                        type: array
+                                      topologyKey:
+                                        type: string
+                                    type: object
+                                  type: array
+                              type: object
+                          type: object
+                        topologySpreadConstraints:
+                          items:
+                            properties:
+                              labelSelector:
+                                properties:
+                                  matchExpressions:
+                                    items:
+                                      properties:
+                                        key:
+                                          type: string
+                                        operator:
+                                          type: string
+                                        values:
+                                          items:
+                                            type: string
+                                          type: array
+                                      type: object
+                                    type: array
+                                  matchLabels:
+                                    additionalProperties:
+                                      type: string
+                                    type: object
+                                type: object
+                              matchLabelKeys:
+                                items:
+                                  type: string
+                                type: array
+                              maxSkew:
+                                type: integer
+                              minDomains:
+                                type: integer
+                              nodeAffinityPolicy:
+                                type: string
+                              nodeTaintsPolicy:
+                                type: string
+                              topologyKey:
+                                type: string
+                              whenUnsatisfiable:
+                                type: string
+                            type: object
+                          type: array
+                        priorityClassName:
+                          type: string
+                        replicas:
+                          type: integer
+                        updatePartition:
+                          type: integer
+                        resources:
+                          properties:
+                            claims:
+                              items:
+                                properties:
+                                  name:
+                                    type: string
+                                type: object
+                              type: array
+                            limits:
+                              additionalProperties:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                x-kubernetes-int-or-string: true
+                              type: object
+                            requests:
+                              additionalProperties:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                x-kubernetes-int-or-string: true
+                              type: object
+                          type: object
+                        startupProbe:
+                          properties:
+                            exec:
+                              properties:
+                                command:
+                                  items:
+                                    type: string
+                                  type: array
+                              type: object
+                            failureThreshold:
+                              type: integer
+                            grpc:
+                              properties:
+                                port:
+                                  type: integer
+                                service:
+                                  type: string
+                              type: object
+                            httpGet:
+                              properties:
+                                host:
+                                  type: string
+                                httpHeaders:
+                                  items:
+                                    properties:
+                                      name:
+                                        type: string
+                                      value:
+                                        type: string
+                                    type: object
+                                  type: array
+                                path:
+                                  type: string
+                                port:
+                                  anyOf:
+                                  - type: integer
+                                  - type: string
+                                  x-kubernetes-int-or-string: true
+                                scheme:
+                                  type: string
+                              type: object
+                            initialDelaySeconds:
+                              type: integer
+                            periodSeconds:
+                              type: integer
+                            successThreshold:
+                              type: integer
+                            tcpSocket:
+                              properties:
+                                host:
+                                  type: string
+                                port:
+                                  anyOf:
+                                  - type: integer
+                                  - type: string
+                                  x-kubernetes-int-or-string: true
+                              type: object
+                            terminationGracePeriodSeconds:
+                              type: integer
+                            timeoutSeconds:
+                              type: integer
+                          type: object
+                        readinessProbe:
+                          properties:
+                            exec:
+                              properties:
+                                command:
+                                  items:
+                                    type: string
+                                  type: array
+                              type: object
+                            failureThreshold:
+                              type: integer
+                            grpc:
+                              properties:
+                                port:
+                                  type: integer
+                                service:
+                                  type: string
+                              type: object
+                            httpGet:
+                              properties:
+                                host:
+                                  type: string
+                                httpHeaders:
+                                  items:
+                                    properties:
+                                      name:
+                                        type: string
+                                      value:
+                                        type: string
+                                    type: object
+                                  type: array
+                                path:
+                                  type: string
+                                port:
+                                  anyOf:
+                                  - type: integer
+                                  - type: string
+                                  x-kubernetes-int-or-string: true
+                                scheme:
+                                  type: string
+                              type: object
+                            initialDelaySeconds:
+                              type: integer
+                            periodSeconds:
+                              type: integer
+                            successThreshold:
+                              type: integer
+                            tcpSocket:
+                              properties:
+                                host:
+                                  type: string
+                                port:
+                                  anyOf:
+                                  - type: integer
+                                  - type: string
+                                  x-kubernetes-int-or-string: true
+                              type: object
+                            terminationGracePeriodSeconds:
+                              type: integer
+                            timeoutSeconds:
+                              type: integer
+                          type: object
+                        livenessProbe:
+                          properties:
+                            exec:
+                              properties:
+                                command:
+                                  items:
+                                    type: string
+                                  type: array
+                              type: object
+                            failureThreshold:
+                              type: integer
+                            grpc:
+                              properties:
+                                port:
+                                  type: integer
+                                service:
+                                  type: string
+                              type: object
+                            httpGet:
+                              properties:
+                                host:
+                                  type: string
+                                httpHeaders:
+                                  items:
+                                    properties:
+                                      name:
+                                        type: string
+                                      value:
+                                        type: string
+                                    type: object
+                                  type: array
+                                path:
+                                  type: string
+                                port:
+                                  anyOf:
+                                  - type: integer
+                                  - type: string
+                                  x-kubernetes-int-or-string: true
+                                scheme:
+                                  type: string
+                              type: object
+                            initialDelaySeconds:
+                              type: integer
+                            periodSeconds:
+                              type: integer
+                            successThreshold:
+                              type: integer
+                            tcpSocket:
+                              properties:
+                                host:
+                                  type: string
+                                port:
+                                  anyOf:
+                                  - type: integer
+                                  - type: string
+                                  x-kubernetes-int-or-string: true
+                              type: object
+                            terminationGracePeriodSeconds:
+                              type: integer
+                            timeoutSeconds:
+                              type: integer
+                          type: object
+                        gracefulStopTimeout:
+                          type: integer
+                        service:
+                          properties:
+                            sshPort:
+                              type: integer
+                            type:
+                              type: string
+                            httpPort:
+                              type: integer
+                          type: object
+                        site:
+                          properties:
+                            size:
+                              anyOf:
+                              - type: integer
+                              - type: string
+                              x-kubernetes-int-or-string: true
+                          type: object
+                        plugins:
+                          items:
+                            properties:
+                              installAsLibrary:
+                                type: boolean
+                              name:
+                                type: string
+                              url:
+                                type: string
+                              sha1:
+                                type: string
+                            type: object
+                          type: array
+                        libs:
+                          items:
+                            properties:
+                              name:
+                                type: string
+                              url:
+                                type: string
+                              sha1:
+                                type: string
+                            type: object
+                          type: array
+                        configFiles:
+                          additionalProperties:
+                            type: string
+                          type: object
+                        secretRef:
+                          type: string
+                        mode:
+                          enum:
+                          - PRIMARY
+                          - REPLICA
+                          type: string
+                        debug:
+                          properties:
+                            enabled:
+                              type: boolean
+                            suspend:
+                              type: boolean
+                          type: object
+                      type: object
+                  type: object
+                type: array
+              receiver:
+                properties:
+                  metadata:
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      creationTimestamp:
+                        type: string
+                      deletionGracePeriodSeconds:
+                        type: integer
+                      deletionTimestamp:
+                        type: string
+                      finalizers:
+                        items:
+                          type: string
+                        type: array
+                      generateName:
+                        type: string
+                      generation:
+                        type: integer
+                      labels:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      managedFields:
+                        items:
+                          properties:
+                            apiVersion:
+                              type: string
+                            fieldsType:
+                              type: string
+                            fieldsV1:
+                              type: object
+                            manager:
+                              type: string
+                            operation:
+                              type: string
+                            subresource:
+                              type: string
+                            time:
+                              type: string
+                          type: object
+                        type: array
+                      name:
+                        type: string
+                      namespace:
+                        type: string
+                      ownerReferences:
+                        items:
+                          properties:
+                            apiVersion:
+                              type: string
+                            blockOwnerDeletion:
+                              type: boolean
+                            controller:
+                              type: boolean
+                            kind:
+                              type: string
+                            name:
+                              type: string
+                            uid:
+                              type: string
+                          type: object
+                        type: array
+                      resourceVersion:
+                        type: string
+                      selfLink:
+                        type: string
+                      uid:
+                        type: string
+                    type: object
+                  spec:
+                    properties:
+                      tolerations:
+                        items:
+                          properties:
+                            effect:
+                              type: string
+                            key:
+                              type: string
+                            operator:
+                              type: string
+                            tolerationSeconds:
+                              type: integer
+                            value:
+                              type: string
+                          type: object
+                        type: array
+                      affinity:
+                        properties:
+                          nodeAffinity:
+                            properties:
+                              preferredDuringSchedulingIgnoredDuringExecution:
+                                items:
+                                  properties:
+                                    preference:
+                                      properties:
+                                        matchExpressions:
+                                          items:
+                                            properties:
+                                              key:
+                                                type: string
+                                              operator:
+                                                type: string
+                                              values:
+                                                items:
+                                                  type: string
+                                                type: array
+                                            type: object
+                                          type: array
+                                        matchFields:
+                                          items:
+                                            properties:
+                                              key:
+                                                type: string
+                                              operator:
+                                                type: string
+                                              values:
+                                                items:
+                                                  type: string
+                                                type: array
+                                            type: object
+                                          type: array
+                                      type: object
+                                    weight:
+                                      type: integer
+                                  type: object
+                                type: array
+                              requiredDuringSchedulingIgnoredDuringExecution:
+                                properties:
+                                  nodeSelectorTerms:
+                                    items:
+                                      properties:
+                                        matchExpressions:
+                                          items:
+                                            properties:
+                                              key:
+                                                type: string
+                                              operator:
+                                                type: string
+                                              values:
+                                                items:
+                                                  type: string
+                                                type: array
+                                            type: object
+                                          type: array
+                                        matchFields:
+                                          items:
+                                            properties:
+                                              key:
+                                                type: string
+                                              operator:
+                                                type: string
+                                              values:
+                                                items:
+                                                  type: string
+                                                type: array
+                                            type: object
+                                          type: array
+                                      type: object
+                                    type: array
+                                type: object
+                            type: object
+                          podAffinity:
+                            properties:
+                              preferredDuringSchedulingIgnoredDuringExecution:
+                                items:
+                                  properties:
+                                    podAffinityTerm:
+                                      properties:
+                                        labelSelector:
+                                          properties:
+                                            matchExpressions:
+                                              items:
+                                                properties:
+                                                  key:
+                                                    type: string
+                                                  operator:
+                                                    type: string
+                                                  values:
+                                                    items:
+                                                      type: string
+                                                    type: array
+                                                type: object
+                                              type: array
+                                            matchLabels:
+                                              additionalProperties:
+                                                type: string
+                                              type: object
+                                          type: object
+                                        namespaceSelector:
+                                          properties:
+                                            matchExpressions:
+                                              items:
+                                                properties:
+                                                  key:
+                                                    type: string
+                                                  operator:
+                                                    type: string
+                                                  values:
+                                                    items:
+                                                      type: string
+                                                    type: array
+                                                type: object
+                                              type: array
+                                            matchLabels:
+                                              additionalProperties:
+                                                type: string
+                                              type: object
+                                          type: object
+                                        namespaces:
+                                          items:
+                                            type: string
+                                          type: array
+                                        topologyKey:
+                                          type: string
+                                      type: object
+                                    weight:
+                                      type: integer
+                                  type: object
+                                type: array
+                              requiredDuringSchedulingIgnoredDuringExecution:
+                                items:
+                                  properties:
+                                    labelSelector:
+                                      properties:
+                                        matchExpressions:
+                                          items:
+                                            properties:
+                                              key:
+                                                type: string
+                                              operator:
+                                                type: string
+                                              values:
+                                                items:
+                                                  type: string
+                                                type: array
+                                            type: object
+                                          type: array
+                                        matchLabels:
+                                          additionalProperties:
+                                            type: string
+                                          type: object
+                                      type: object
+                                    namespaceSelector:
+                                      properties:
+                                        matchExpressions:
+                                          items:
+                                            properties:
+                                              key:
+                                                type: string
+                                              operator:
+                                                type: string
+                                              values:
+                                                items:
+                                                  type: string
+                                                type: array
+                                            type: object
+                                          type: array
+                                        matchLabels:
+                                          additionalProperties:
+                                            type: string
+                                          type: object
+                                      type: object
+                                    namespaces:
+                                      items:
+                                        type: string
+                                      type: array
+                                    topologyKey:
+                                      type: string
+                                  type: object
+                                type: array
+                            type: object
+                          podAntiAffinity:
+                            properties:
+                              preferredDuringSchedulingIgnoredDuringExecution:
+                                items:
+                                  properties:
+                                    podAffinityTerm:
+                                      properties:
+                                        labelSelector:
+                                          properties:
+                                            matchExpressions:
+                                              items:
+                                                properties:
+                                                  key:
+                                                    type: string
+                                                  operator:
+                                                    type: string
+                                                  values:
+                                                    items:
+                                                      type: string
+                                                    type: array
+                                                type: object
+                                              type: array
+                                            matchLabels:
+                                              additionalProperties:
+                                                type: string
+                                              type: object
+                                          type: object
+                                        namespaceSelector:
+                                          properties:
+                                            matchExpressions:
+                                              items:
+                                                properties:
+                                                  key:
+                                                    type: string
+                                                  operator:
+                                                    type: string
+                                                  values:
+                                                    items:
+                                                      type: string
+                                                    type: array
+                                                type: object
+                                              type: array
+                                            matchLabels:
+                                              additionalProperties:
+                                                type: string
+                                              type: object
+                                          type: object
+                                        namespaces:
+                                          items:
+                                            type: string
+                                          type: array
+                                        topologyKey:
+                                          type: string
+                                      type: object
+                                    weight:
+                                      type: integer
+                                  type: object
+                                type: array
+                              requiredDuringSchedulingIgnoredDuringExecution:
+                                items:
+                                  properties:
+                                    labelSelector:
+                                      properties:
+                                        matchExpressions:
+                                          items:
+                                            properties:
+                                              key:
+                                                type: string
+                                              operator:
+                                                type: string
+                                              values:
+                                                items:
+                                                  type: string
+                                                type: array
+                                            type: object
+                                          type: array
+                                        matchLabels:
+                                          additionalProperties:
+                                            type: string
+                                          type: object
+                                      type: object
+                                    namespaceSelector:
+                                      properties:
+                                        matchExpressions:
+                                          items:
+                                            properties:
+                                              key:
+                                                type: string
+                                              operator:
+                                                type: string
+                                              values:
+                                                items:
+                                                  type: string
+                                                type: array
+                                            type: object
+                                          type: array
+                                        matchLabels:
+                                          additionalProperties:
+                                            type: string
+                                          type: object
+                                      type: object
+                                    namespaces:
+                                      items:
+                                        type: string
+                                      type: array
+                                    topologyKey:
+                                      type: string
+                                  type: object
+                                type: array
+                            type: object
+                        type: object
+                      topologySpreadConstraints:
+                        items:
+                          properties:
+                            labelSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            matchLabelKeys:
+                              items:
+                                type: string
+                              type: array
+                            maxSkew:
+                              type: integer
+                            minDomains:
+                              type: integer
+                            nodeAffinityPolicy:
+                              type: string
+                            nodeTaintsPolicy:
+                              type: string
+                            topologyKey:
+                              type: string
+                            whenUnsatisfiable:
+                              type: string
+                          type: object
+                        type: array
+                      priorityClassName:
+                        type: string
+                      replicas:
+                        type: integer
+                      maxSurge:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      maxUnavailable:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      resources:
+                        properties:
+                          claims:
+                            items:
+                              properties:
+                                name:
+                                  type: string
+                              type: object
+                            type: array
+                          limits:
+                            additionalProperties:
+                              anyOf:
+                              - type: integer
+                              - type: string
+                              x-kubernetes-int-or-string: true
+                            type: object
+                          requests:
+                            additionalProperties:
+                              anyOf:
+                              - type: integer
+                              - type: string
+                              x-kubernetes-int-or-string: true
+                            type: object
+                        type: object
+                      readinessProbe:
+                        properties:
+                          exec:
+                            properties:
+                              command:
+                                items:
+                                  type: string
+                                type: array
+                            type: object
+                          failureThreshold:
+                            type: integer
+                          grpc:
+                            properties:
+                              port:
+                                type: integer
+                              service:
+                                type: string
+                            type: object
+                          httpGet:
+                            properties:
+                              host:
+                                type: string
+                              httpHeaders:
+                                items:
+                                  properties:
+                                    name:
+                                      type: string
+                                    value:
+                                      type: string
+                                  type: object
+                                type: array
+                              path:
+                                type: string
+                              port:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                x-kubernetes-int-or-string: true
+                              scheme:
+                                type: string
+                            type: object
+                          initialDelaySeconds:
+                            type: integer
+                          periodSeconds:
+                            type: integer
+                          successThreshold:
+                            type: integer
+                          tcpSocket:
+                            properties:
+                              host:
+                                type: string
+                              port:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                x-kubernetes-int-or-string: true
+                            type: object
+                          terminationGracePeriodSeconds:
+                            type: integer
+                          timeoutSeconds:
+                            type: integer
+                        type: object
+                      livenessProbe:
+                        properties:
+                          exec:
+                            properties:
+                              command:
+                                items:
+                                  type: string
+                                type: array
+                            type: object
+                          failureThreshold:
+                            type: integer
+                          grpc:
+                            properties:
+                              port:
+                                type: integer
+                              service:
+                                type: string
+                            type: object
+                          httpGet:
+                            properties:
+                              host:
+                                type: string
+                              httpHeaders:
+                                items:
+                                  properties:
+                                    name:
+                                      type: string
+                                    value:
+                                      type: string
+                                  type: object
+                                type: array
+                              path:
+                                type: string
+                              port:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                x-kubernetes-int-or-string: true
+                              scheme:
+                                type: string
+                            type: object
+                          initialDelaySeconds:
+                            type: integer
+                          periodSeconds:
+                            type: integer
+                          successThreshold:
+                            type: integer
+                          tcpSocket:
+                            properties:
+                              host:
+                                type: string
+                              port:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                x-kubernetes-int-or-string: true
+                            type: object
+                          terminationGracePeriodSeconds:
+                            type: integer
+                          timeoutSeconds:
+                            type: integer
+                        type: object
+                      service:
+                        properties:
+                          type:
+                            type: string
+                          httpPort:
+                            type: integer
+                        type: object
+                      credentialSecretRef:
+                        type: string
+                    type: object
+                type: object
+            type: object
+          status:
+            properties:
+              members:
+                additionalProperties:
+                  items:
+                    type: string
+                  type: array
+                type: object
+            type: object
+        type: object
+    served: true
+    storage: true
+    subresources:
+      status: {}
+  - name: v1beta1
     schema:
       openAPIV3Schema:
         properties:
@@ -1489,6 +2975,6 @@
             type: object
         type: object
     served: true
-    storage: true
+    storage: false
     subresources:
       status: {}
diff --git a/helm-charts/gerrit-operator-crds/templates/gerritnetworks.gerritoperator.google.com-v1.yml b/helm-charts/gerrit-operator-crds/templates/gerritnetworks.gerritoperator.google.com-v1.yml
index 77ac756..75aeaca 100644
--- a/helm-charts/gerrit-operator-crds/templates/gerritnetworks.gerritoperator.google.com-v1.yml
+++ b/helm-charts/gerrit-operator-crds/templates/gerritnetworks.gerritoperator.google.com-v1.yml
@@ -13,7 +13,133 @@
     singular: gerritnetwork
   scope: Namespaced
   versions:
-  - name: v1alpha2
+  - name: v1beta2
+    schema:
+      openAPIV3Schema:
+        properties:
+          spec:
+            properties:
+              ingress:
+                properties:
+                  enabled:
+                    type: boolean
+                  host:
+                    type: string
+                  annotations:
+                    additionalProperties:
+                      type: string
+                    type: object
+                  tls:
+                    properties:
+                      enabled:
+                        type: boolean
+                      secret:
+                        type: string
+                    type: object
+                  ssh:
+                    properties:
+                      enabled:
+                        type: boolean
+                    type: object
+                  ambassador:
+                    properties:
+                      id:
+                        items:
+                          type: string
+                        type: array
+                      createHost:
+                        type: boolean
+                    type: object
+                  istio:
+                    properties:
+                      gatewaySelector:
+                        additionalProperties:
+                          type: string
+                        type: object
+                    type: object
+                type: object
+              receiver:
+                properties:
+                  name:
+                    type: string
+                  httpPort:
+                    type: integer
+                type: object
+              primaryGerrit:
+                properties:
+                  sshPort:
+                    type: integer
+                  name:
+                    type: string
+                  httpPort:
+                    type: integer
+                type: object
+              gerritReplica:
+                properties:
+                  sshPort:
+                    type: integer
+                  name:
+                    type: string
+                  httpPort:
+                    type: integer
+                type: object
+            type: object
+          status:
+            properties:
+              apiVersion:
+                type: string
+              code:
+                type: integer
+              details:
+                properties:
+                  causes:
+                    items:
+                      properties:
+                        field:
+                          type: string
+                        message:
+                          type: string
+                        reason:
+                          type: string
+                      type: object
+                    type: array
+                  group:
+                    type: string
+                  kind:
+                    type: string
+                  name:
+                    type: string
+                  retryAfterSeconds:
+                    type: integer
+                  uid:
+                    type: string
+                type: object
+              kind:
+                type: string
+              message:
+                type: string
+              metadata:
+                properties:
+                  continue:
+                    type: string
+                  remainingItemCount:
+                    type: integer
+                  resourceVersion:
+                    type: string
+                  selfLink:
+                    type: string
+                type: object
+              reason:
+                type: string
+              status:
+                type: string
+            type: object
+        type: object
+    served: true
+    storage: true
+    subresources:
+      status: {}
+  - name: v1beta1
     schema:
       openAPIV3Schema:
         properties:
@@ -129,6 +255,6 @@
             type: object
         type: object
     served: true
-    storage: true
+    storage: false
     subresources:
       status: {}
diff --git a/helm-charts/gerrit-operator-crds/templates/gerrits.gerritoperator.google.com-v1.yml b/helm-charts/gerrit-operator-crds/templates/gerrits.gerritoperator.google.com-v1.yml
index a029288..1d9f03e 100644
--- a/helm-charts/gerrit-operator-crds/templates/gerrits.gerritoperator.google.com-v1.yml
+++ b/helm-charts/gerrit-operator-crds/templates/gerrits.gerritoperator.google.com-v1.yml
@@ -13,7 +13,7 @@
     singular: gerrit
   scope: Namespaced
   versions:
-  - name: v1alpha17
+  - name: v1beta2
     schema:
       openAPIV3Schema:
         properties:
@@ -799,3 +799,789 @@
     storage: true
     subresources:
       status: {}
+  - name: v1beta1
+    schema:
+      openAPIV3Schema:
+        properties:
+          spec:
+            properties:
+              containerImages:
+                properties:
+                  imagePullPolicy:
+                    type: string
+                  imagePullSecrets:
+                    items:
+                      properties:
+                        name:
+                          type: string
+                      type: object
+                    type: array
+                  busyBox:
+                    properties:
+                      registry:
+                        type: string
+                      tag:
+                        type: string
+                    type: object
+                  gerritImages:
+                    properties:
+                      registry:
+                        type: string
+                      org:
+                        type: string
+                      tag:
+                        type: string
+                    type: object
+                type: object
+              storage:
+                properties:
+                  pluginCache:
+                    properties:
+                      enabled:
+                        type: boolean
+                    type: object
+                  storageClasses:
+                    properties:
+                      readWriteOnce:
+                        type: string
+                      readWriteMany:
+                        type: string
+                      nfsWorkaround:
+                        properties:
+                          enabled:
+                            type: boolean
+                          chownOnStartup:
+                            type: boolean
+                          idmapdConfig:
+                            type: string
+                        type: object
+                    type: object
+                  sharedStorage:
+                    properties:
+                      externalPVC:
+                        properties:
+                          enabled:
+                            type: boolean
+                          claimName:
+                            type: string
+                        type: object
+                      size:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      volumeName:
+                        type: string
+                      selector:
+                        properties:
+                          matchExpressions:
+                            items:
+                              properties:
+                                key:
+                                  type: string
+                                operator:
+                                  type: string
+                                values:
+                                  items:
+                                    type: string
+                                  type: array
+                              type: object
+                            type: array
+                          matchLabels:
+                            additionalProperties:
+                              type: string
+                            type: object
+                        type: object
+                    type: object
+                type: object
+              ingress:
+                properties:
+                  enabled:
+                    type: boolean
+                  host:
+                    type: string
+                  tlsEnabled:
+                    type: boolean
+                  ssh:
+                    properties:
+                      enabled:
+                        type: boolean
+                    type: object
+                type: object
+              refdb:
+                properties:
+                  database:
+                    enum:
+                    - NONE
+                    - ZOOKEEPER
+                    - SPANNER
+                    type: string
+                  zookeeper:
+                    properties:
+                      connectString:
+                        type: string
+                      rootNode:
+                        type: string
+                    type: object
+                  spanner:
+                    properties:
+                      projectName:
+                        type: string
+                      instance:
+                        type: string
+                      database:
+                        type: string
+                    type: object
+                type: object
+              serverId:
+                type: string
+              serviceAccount:
+                type: string
+              tolerations:
+                items:
+                  properties:
+                    effect:
+                      type: string
+                    key:
+                      type: string
+                    operator:
+                      type: string
+                    tolerationSeconds:
+                      type: integer
+                    value:
+                      type: string
+                  type: object
+                type: array
+              affinity:
+                properties:
+                  nodeAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            preference:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchFields:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        properties:
+                          nodeSelectorTerms:
+                            items:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchFields:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                              type: object
+                            type: array
+                        type: object
+                    type: object
+                  podAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            podAffinityTerm:
+                              properties:
+                                labelSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaceSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaces:
+                                  items:
+                                    type: string
+                                  type: array
+                                topologyKey:
+                                  type: string
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            labelSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaceSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaces:
+                              items:
+                                type: string
+                              type: array
+                            topologyKey:
+                              type: string
+                          type: object
+                        type: array
+                    type: object
+                  podAntiAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            podAffinityTerm:
+                              properties:
+                                labelSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaceSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaces:
+                                  items:
+                                    type: string
+                                  type: array
+                                topologyKey:
+                                  type: string
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            labelSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaceSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaces:
+                              items:
+                                type: string
+                              type: array
+                            topologyKey:
+                              type: string
+                          type: object
+                        type: array
+                    type: object
+                type: object
+              topologySpreadConstraints:
+                items:
+                  properties:
+                    labelSelector:
+                      properties:
+                        matchExpressions:
+                          items:
+                            properties:
+                              key:
+                                type: string
+                              operator:
+                                type: string
+                              values:
+                                items:
+                                  type: string
+                                type: array
+                            type: object
+                          type: array
+                        matchLabels:
+                          additionalProperties:
+                            type: string
+                          type: object
+                      type: object
+                    matchLabelKeys:
+                      items:
+                        type: string
+                      type: array
+                    maxSkew:
+                      type: integer
+                    minDomains:
+                      type: integer
+                    nodeAffinityPolicy:
+                      type: string
+                    nodeTaintsPolicy:
+                      type: string
+                    topologyKey:
+                      type: string
+                    whenUnsatisfiable:
+                      type: string
+                  type: object
+                type: array
+              priorityClassName:
+                type: string
+              replicas:
+                type: integer
+              updatePartition:
+                type: integer
+              resources:
+                properties:
+                  claims:
+                    items:
+                      properties:
+                        name:
+                          type: string
+                      type: object
+                    type: array
+                  limits:
+                    additionalProperties:
+                      anyOf:
+                      - type: integer
+                      - type: string
+                      x-kubernetes-int-or-string: true
+                    type: object
+                  requests:
+                    additionalProperties:
+                      anyOf:
+                      - type: integer
+                      - type: string
+                      x-kubernetes-int-or-string: true
+                    type: object
+                type: object
+              startupProbe:
+                properties:
+                  exec:
+                    properties:
+                      command:
+                        items:
+                          type: string
+                        type: array
+                    type: object
+                  failureThreshold:
+                    type: integer
+                  grpc:
+                    properties:
+                      port:
+                        type: integer
+                      service:
+                        type: string
+                    type: object
+                  httpGet:
+                    properties:
+                      host:
+                        type: string
+                      httpHeaders:
+                        items:
+                          properties:
+                            name:
+                              type: string
+                            value:
+                              type: string
+                          type: object
+                        type: array
+                      path:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      scheme:
+                        type: string
+                    type: object
+                  initialDelaySeconds:
+                    type: integer
+                  periodSeconds:
+                    type: integer
+                  successThreshold:
+                    type: integer
+                  tcpSocket:
+                    properties:
+                      host:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                    type: object
+                  terminationGracePeriodSeconds:
+                    type: integer
+                  timeoutSeconds:
+                    type: integer
+                type: object
+              readinessProbe:
+                properties:
+                  exec:
+                    properties:
+                      command:
+                        items:
+                          type: string
+                        type: array
+                    type: object
+                  failureThreshold:
+                    type: integer
+                  grpc:
+                    properties:
+                      port:
+                        type: integer
+                      service:
+                        type: string
+                    type: object
+                  httpGet:
+                    properties:
+                      host:
+                        type: string
+                      httpHeaders:
+                        items:
+                          properties:
+                            name:
+                              type: string
+                            value:
+                              type: string
+                          type: object
+                        type: array
+                      path:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      scheme:
+                        type: string
+                    type: object
+                  initialDelaySeconds:
+                    type: integer
+                  periodSeconds:
+                    type: integer
+                  successThreshold:
+                    type: integer
+                  tcpSocket:
+                    properties:
+                      host:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                    type: object
+                  terminationGracePeriodSeconds:
+                    type: integer
+                  timeoutSeconds:
+                    type: integer
+                type: object
+              livenessProbe:
+                properties:
+                  exec:
+                    properties:
+                      command:
+                        items:
+                          type: string
+                        type: array
+                    type: object
+                  failureThreshold:
+                    type: integer
+                  grpc:
+                    properties:
+                      port:
+                        type: integer
+                      service:
+                        type: string
+                    type: object
+                  httpGet:
+                    properties:
+                      host:
+                        type: string
+                      httpHeaders:
+                        items:
+                          properties:
+                            name:
+                              type: string
+                            value:
+                              type: string
+                          type: object
+                        type: array
+                      path:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      scheme:
+                        type: string
+                    type: object
+                  initialDelaySeconds:
+                    type: integer
+                  periodSeconds:
+                    type: integer
+                  successThreshold:
+                    type: integer
+                  tcpSocket:
+                    properties:
+                      host:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                    type: object
+                  terminationGracePeriodSeconds:
+                    type: integer
+                  timeoutSeconds:
+                    type: integer
+                type: object
+              gracefulStopTimeout:
+                type: integer
+              service:
+                properties:
+                  sshPort:
+                    type: integer
+                  type:
+                    type: string
+                  httpPort:
+                    type: integer
+                type: object
+              site:
+                properties:
+                  size:
+                    anyOf:
+                    - type: integer
+                    - type: string
+                    x-kubernetes-int-or-string: true
+                type: object
+              plugins:
+                items:
+                  properties:
+                    installAsLibrary:
+                      type: boolean
+                    name:
+                      type: string
+                    url:
+                      type: string
+                    sha1:
+                      type: string
+                  type: object
+                type: array
+              libs:
+                items:
+                  properties:
+                    name:
+                      type: string
+                    url:
+                      type: string
+                    sha1:
+                      type: string
+                  type: object
+                type: array
+              configFiles:
+                additionalProperties:
+                  type: string
+                type: object
+              secretRef:
+                type: string
+              mode:
+                enum:
+                - PRIMARY
+                - REPLICA
+                type: string
+              debug:
+                properties:
+                  enabled:
+                    type: boolean
+                  suspend:
+                    type: boolean
+                type: object
+            type: object
+          status:
+            properties:
+              ready:
+                type: boolean
+              appliedConfigMapVersions:
+                additionalProperties:
+                  type: string
+                type: object
+              appliedSecretVersions:
+                additionalProperties:
+                  type: string
+                type: object
+            type: object
+        type: object
+    served: true
+    storage: false
+    subresources:
+      status: {}
diff --git a/helm-charts/gerrit-operator-crds/templates/gitgcs.gerritoperator.google.com-v1.yml b/helm-charts/gerrit-operator-crds/templates/gitgcs.gerritoperator.google.com-v1.yml
index 7974e13..cefe9ce 100644
--- a/helm-charts/gerrit-operator-crds/templates/gitgcs.gerritoperator.google.com-v1.yml
+++ b/helm-charts/gerrit-operator-crds/templates/gitgcs.gerritoperator.google.com-v1.yml
@@ -13,7 +13,378 @@
     singular: gitgarbagecollection
   scope: Namespaced
   versions:
-  - name: v1alpha1
+  - name: v1beta1
+    schema:
+      openAPIV3Schema:
+        properties:
+          spec:
+            properties:
+              cluster:
+                type: string
+              schedule:
+                type: string
+              projects:
+                items:
+                  type: string
+                type: array
+              resources:
+                properties:
+                  claims:
+                    items:
+                      properties:
+                        name:
+                          type: string
+                      type: object
+                    type: array
+                  limits:
+                    additionalProperties:
+                      anyOf:
+                      - type: integer
+                      - type: string
+                      x-kubernetes-int-or-string: true
+                    type: object
+                  requests:
+                    additionalProperties:
+                      anyOf:
+                      - type: integer
+                      - type: string
+                      x-kubernetes-int-or-string: true
+                    type: object
+                type: object
+              tolerations:
+                items:
+                  properties:
+                    effect:
+                      type: string
+                    key:
+                      type: string
+                    operator:
+                      type: string
+                    tolerationSeconds:
+                      type: integer
+                    value:
+                      type: string
+                  type: object
+                type: array
+              affinity:
+                properties:
+                  nodeAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            preference:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchFields:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        properties:
+                          nodeSelectorTerms:
+                            items:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchFields:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                              type: object
+                            type: array
+                        type: object
+                    type: object
+                  podAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            podAffinityTerm:
+                              properties:
+                                labelSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaceSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaces:
+                                  items:
+                                    type: string
+                                  type: array
+                                topologyKey:
+                                  type: string
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            labelSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaceSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaces:
+                              items:
+                                type: string
+                              type: array
+                            topologyKey:
+                              type: string
+                          type: object
+                        type: array
+                    type: object
+                  podAntiAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            podAffinityTerm:
+                              properties:
+                                labelSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaceSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaces:
+                                  items:
+                                    type: string
+                                  type: array
+                                topologyKey:
+                                  type: string
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            labelSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaceSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaces:
+                              items:
+                                type: string
+                              type: array
+                            topologyKey:
+                              type: string
+                          type: object
+                        type: array
+                    type: object
+                type: object
+            type: object
+          status:
+            properties:
+              replicateAll:
+                type: boolean
+              excludedProjects:
+                items:
+                  type: string
+                type: array
+              state:
+                enum:
+                - ACTIVE
+                - INACTIVE
+                - CONFLICT
+                - ERROR
+                type: string
+            type: object
+        type: object
+    served: true
+    storage: false
+    subresources:
+      status: {}
+  - name: v1beta2
     schema:
       openAPIV3Schema:
         properties:
diff --git a/helm-charts/gerrit-operator-crds/templates/receivers.gerritoperator.google.com-v1.yml b/helm-charts/gerrit-operator-crds/templates/receivers.gerritoperator.google.com-v1.yml
index c314670..684b10c 100644
--- a/helm-charts/gerrit-operator-crds/templates/receivers.gerritoperator.google.com-v1.yml
+++ b/helm-charts/gerrit-operator-crds/templates/receivers.gerritoperator.google.com-v1.yml
@@ -13,7 +13,7 @@
     singular: receiver
   scope: Namespaced
   versions:
-  - name: v1alpha6
+  - name: v1beta2
     schema:
       openAPIV3Schema:
         properties:
@@ -653,3 +653,643 @@
     storage: true
     subresources:
       status: {}
+  - name: v1beta1
+    schema:
+      openAPIV3Schema:
+        properties:
+          spec:
+            properties:
+              containerImages:
+                properties:
+                  imagePullPolicy:
+                    type: string
+                  imagePullSecrets:
+                    items:
+                      properties:
+                        name:
+                          type: string
+                      type: object
+                    type: array
+                  busyBox:
+                    properties:
+                      registry:
+                        type: string
+                      tag:
+                        type: string
+                    type: object
+                  gerritImages:
+                    properties:
+                      registry:
+                        type: string
+                      org:
+                        type: string
+                      tag:
+                        type: string
+                    type: object
+                type: object
+              storage:
+                properties:
+                  storageClasses:
+                    properties:
+                      readWriteOnce:
+                        type: string
+                      readWriteMany:
+                        type: string
+                      nfsWorkaround:
+                        properties:
+                          enabled:
+                            type: boolean
+                          chownOnStartup:
+                            type: boolean
+                          idmapdConfig:
+                            type: string
+                        type: object
+                    type: object
+                  sharedStorage:
+                    properties:
+                      externalPVC:
+                        properties:
+                          enabled:
+                            type: boolean
+                          claimName:
+                            type: string
+                        type: object
+                      size:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      volumeName:
+                        type: string
+                      selector:
+                        properties:
+                          matchExpressions:
+                            items:
+                              properties:
+                                key:
+                                  type: string
+                                operator:
+                                  type: string
+                                values:
+                                  items:
+                                    type: string
+                                  type: array
+                              type: object
+                            type: array
+                          matchLabels:
+                            additionalProperties:
+                              type: string
+                            type: object
+                        type: object
+                    type: object
+                type: object
+              ingress:
+                properties:
+                  enabled:
+                    type: boolean
+                  host:
+                    type: string
+                  tlsEnabled:
+                    type: boolean
+                  ssh:
+                    properties:
+                      enabled:
+                        type: boolean
+                    type: object
+                type: object
+              tolerations:
+                items:
+                  properties:
+                    effect:
+                      type: string
+                    key:
+                      type: string
+                    operator:
+                      type: string
+                    tolerationSeconds:
+                      type: integer
+                    value:
+                      type: string
+                  type: object
+                type: array
+              affinity:
+                properties:
+                  nodeAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            preference:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchFields:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        properties:
+                          nodeSelectorTerms:
+                            items:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchFields:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                              type: object
+                            type: array
+                        type: object
+                    type: object
+                  podAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            podAffinityTerm:
+                              properties:
+                                labelSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaceSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaces:
+                                  items:
+                                    type: string
+                                  type: array
+                                topologyKey:
+                                  type: string
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            labelSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaceSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaces:
+                              items:
+                                type: string
+                              type: array
+                            topologyKey:
+                              type: string
+                          type: object
+                        type: array
+                    type: object
+                  podAntiAffinity:
+                    properties:
+                      preferredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            podAffinityTerm:
+                              properties:
+                                labelSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaceSelector:
+                                  properties:
+                                    matchExpressions:
+                                      items:
+                                        properties:
+                                          key:
+                                            type: string
+                                          operator:
+                                            type: string
+                                          values:
+                                            items:
+                                              type: string
+                                            type: array
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                namespaces:
+                                  items:
+                                    type: string
+                                  type: array
+                                topologyKey:
+                                  type: string
+                              type: object
+                            weight:
+                              type: integer
+                          type: object
+                        type: array
+                      requiredDuringSchedulingIgnoredDuringExecution:
+                        items:
+                          properties:
+                            labelSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaceSelector:
+                              properties:
+                                matchExpressions:
+                                  items:
+                                    properties:
+                                      key:
+                                        type: string
+                                      operator:
+                                        type: string
+                                      values:
+                                        items:
+                                          type: string
+                                        type: array
+                                    type: object
+                                  type: array
+                                matchLabels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            namespaces:
+                              items:
+                                type: string
+                              type: array
+                            topologyKey:
+                              type: string
+                          type: object
+                        type: array
+                    type: object
+                type: object
+              topologySpreadConstraints:
+                items:
+                  properties:
+                    labelSelector:
+                      properties:
+                        matchExpressions:
+                          items:
+                            properties:
+                              key:
+                                type: string
+                              operator:
+                                type: string
+                              values:
+                                items:
+                                  type: string
+                                type: array
+                            type: object
+                          type: array
+                        matchLabels:
+                          additionalProperties:
+                            type: string
+                          type: object
+                      type: object
+                    matchLabelKeys:
+                      items:
+                        type: string
+                      type: array
+                    maxSkew:
+                      type: integer
+                    minDomains:
+                      type: integer
+                    nodeAffinityPolicy:
+                      type: string
+                    nodeTaintsPolicy:
+                      type: string
+                    topologyKey:
+                      type: string
+                    whenUnsatisfiable:
+                      type: string
+                  type: object
+                type: array
+              priorityClassName:
+                type: string
+              replicas:
+                type: integer
+              maxSurge:
+                anyOf:
+                - type: integer
+                - type: string
+                x-kubernetes-int-or-string: true
+              maxUnavailable:
+                anyOf:
+                - type: integer
+                - type: string
+                x-kubernetes-int-or-string: true
+              resources:
+                properties:
+                  claims:
+                    items:
+                      properties:
+                        name:
+                          type: string
+                      type: object
+                    type: array
+                  limits:
+                    additionalProperties:
+                      anyOf:
+                      - type: integer
+                      - type: string
+                      x-kubernetes-int-or-string: true
+                    type: object
+                  requests:
+                    additionalProperties:
+                      anyOf:
+                      - type: integer
+                      - type: string
+                      x-kubernetes-int-or-string: true
+                    type: object
+                type: object
+              readinessProbe:
+                properties:
+                  exec:
+                    properties:
+                      command:
+                        items:
+                          type: string
+                        type: array
+                    type: object
+                  failureThreshold:
+                    type: integer
+                  grpc:
+                    properties:
+                      port:
+                        type: integer
+                      service:
+                        type: string
+                    type: object
+                  httpGet:
+                    properties:
+                      host:
+                        type: string
+                      httpHeaders:
+                        items:
+                          properties:
+                            name:
+                              type: string
+                            value:
+                              type: string
+                          type: object
+                        type: array
+                      path:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      scheme:
+                        type: string
+                    type: object
+                  initialDelaySeconds:
+                    type: integer
+                  periodSeconds:
+                    type: integer
+                  successThreshold:
+                    type: integer
+                  tcpSocket:
+                    properties:
+                      host:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                    type: object
+                  terminationGracePeriodSeconds:
+                    type: integer
+                  timeoutSeconds:
+                    type: integer
+                type: object
+              livenessProbe:
+                properties:
+                  exec:
+                    properties:
+                      command:
+                        items:
+                          type: string
+                        type: array
+                    type: object
+                  failureThreshold:
+                    type: integer
+                  grpc:
+                    properties:
+                      port:
+                        type: integer
+                      service:
+                        type: string
+                    type: object
+                  httpGet:
+                    properties:
+                      host:
+                        type: string
+                      httpHeaders:
+                        items:
+                          properties:
+                            name:
+                              type: string
+                            value:
+                              type: string
+                          type: object
+                        type: array
+                      path:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                      scheme:
+                        type: string
+                    type: object
+                  initialDelaySeconds:
+                    type: integer
+                  periodSeconds:
+                    type: integer
+                  successThreshold:
+                    type: integer
+                  tcpSocket:
+                    properties:
+                      host:
+                        type: string
+                      port:
+                        anyOf:
+                        - type: integer
+                        - type: string
+                        x-kubernetes-int-or-string: true
+                    type: object
+                  terminationGracePeriodSeconds:
+                    type: integer
+                  timeoutSeconds:
+                    type: integer
+                type: object
+              service:
+                properties:
+                  type:
+                    type: string
+                  httpPort:
+                    type: integer
+                type: object
+              credentialSecretRef:
+                type: string
+            type: object
+          status:
+            properties:
+              ready:
+                type: boolean
+              appliedCredentialSecretVersion:
+                type: string
+            type: object
+        type: object
+    served: true
+    storage: false
+    subresources:
+      status: {}
diff --git a/helm-charts/gerrit-operator/templates/operator.yaml b/helm-charts/gerrit-operator/templates/operator.yaml
index f9ed84f..0617a5c 100644
--- a/helm-charts/gerrit-operator/templates/operator.yaml
+++ b/helm-charts/gerrit-operator/templates/operator.yaml
@@ -34,7 +34,7 @@
       {{- end }}
       containers:
       - name: operator
-        image: {{ .Values.image.registry | default "docker.io" }}/{{ .Values.image.org }}/{{ .Values.image.name }}:{{ .Values.image.tag | default "latest" }}
+        image: {{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}
         imagePullPolicy: {{ .Values.image.imagePullPolicy }}
         env:
         - name: NAMESPACE
diff --git a/helm-charts/gerrit-operator/templates/rbac.yaml b/helm-charts/gerrit-operator/templates/rbac.yaml
index fbd2ae7..8c890c4 100644
--- a/helm-charts/gerrit-operator/templates/rbac.yaml
+++ b/helm-charts/gerrit-operator/templates/rbac.yaml
@@ -59,10 +59,6 @@
   - customresourcedefinitions
   verbs:
   - '*'
-- apiGroups:
-  - "networking.k8s.io"
-  resources:
-  - ingresses
   verbs:
   - '*'
 - apiGroups:
@@ -71,6 +67,22 @@
   - '*'
   verbs:
   - '*'
+  verbs:
+  - '*'
+- apiGroups:
+  - "admissionregistration.k8s.io"
+  resources:
+  - 'validatingwebhookconfigurations'
+  verbs:
+  - '*'
+{{- if eq .Values.ingress.type "INGRESS" }}
+- apiGroups:
+  - "networking.k8s.io"
+  resources:
+  - ingresses
+  verbs:
+  - '*'
+{{- else if eq .Values.ingress.type "ISTIO" }}
 - apiGroups:
   - "networking.istio.io"
   resources:
@@ -80,8 +92,18 @@
   verbs:
   - '*'
 - apiGroups:
-  - "admissionregistration.k8s.io"
+  - "security.istio.io"
   resources:
-  - 'validatingwebhookconfigurations'
+  - "authorizationpolicies"
   verbs:
   - '*'
+{{- else if eq .Values.ingress.type "AMBASSADOR" }}
+- apiGroups:
+  - "getambassador.io"
+  resources:
+  - "mappings"
+  - "hosts"
+  - "tlscontexts"
+  verbs:
+  - '*'
+{{- end }}
diff --git a/helm-charts/gerrit-operator/values.yaml b/helm-charts/gerrit-operator/values.yaml
index ebb88af..d618102 100644
--- a/helm-charts/gerrit-operator/values.yaml
+++ b/helm-charts/gerrit-operator/values.yaml
@@ -1,14 +1,12 @@
 image:
-  registry: docker.io
-  org: k8sgerrit
-  name: gerrit-operator
+  repository: docker.io/k8sgerrit/gerrit-operator
   tag: latest
   imagePullPolicy: Always
   imagePullSecrets: []
   # - name: my-secret-1
 
 ingress:
-  # Which ingress provider to use (options: NONE, INGRESS, ISTIO)
+  # Which ingress provider to use (options: NONE, INGRESS, ISTIO, AMBASSADOR)
   type: NONE
 
 ## Required to use an external/persistent keystore, otherwise a keystore using
diff --git a/helm-charts/gerrit-replica/templates/istio.ingressgateway.yaml b/helm-charts/gerrit-replica/templates/istio.ingressgateway.yaml
index 3cb30c6..5938536 100644
--- a/helm-charts/gerrit-replica/templates/istio.ingressgateway.yaml
+++ b/helm-charts/gerrit-replica/templates/istio.ingressgateway.yaml
@@ -95,9 +95,9 @@
     - uri:
         prefix: "/a/projects/"
     - uri:
-        regex: "^/(.*)/git-receive-pack$"
+        regex: "/.*/git-receive-pack"
     - uri:
-        regex: "^/(.*)/info/refs$"
+        regex: "/.*/info/refs"
       queryParams:
         service:
           exact: git-receive-pack
diff --git a/operator/k8s/operator/rbac.yaml b/operator/k8s/operator/rbac.yaml
index 201cce7..2a50343 100644
--- a/operator/k8s/operator/rbac.yaml
+++ b/operator/k8s/operator/rbac.yaml
@@ -80,6 +80,12 @@
   verbs:
   - '*'
 - apiGroups:
+  - "security.istio.io"
+  resources:
+  - "authorizationpolicies"
+  verbs:
+  - '*'
+- apiGroups:
   - "admissionregistration.k8s.io"
   resources:
   - 'validatingwebhookconfigurations'
diff --git a/operator/pom.xml b/operator/pom.xml
index 890c400..23c523c 100644
--- a/operator/pom.xml
+++ b/operator/pom.xml
@@ -51,7 +51,7 @@
 									</container>
 									<containerizingMode>packaged</containerizingMode>
 									<from>
-										<image>gcr.io/distroless/java:11</image>
+										<image>gcr.io/distroless/java11-debian11</image>
 									</from>
 									<to>
 										<image>${docker.registry}/${docker.org}/gerrit-operator</image>
@@ -322,7 +322,7 @@
 							</container>
 							<containerizingMode>packaged</containerizingMode>
 							<from>
-								<image>gcr.io/distroless/java:11</image>
+								<image>gcr.io/distroless/java11-debian11</image>
 							</from>
 							<to>
 								<image>gerrit-operator</image>
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/Constants.java b/operator/src/main/java/com/google/gerrit/k8s/operator/Constants.java
index d2fb405..2096ae2 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/Constants.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/Constants.java
@@ -17,7 +17,7 @@
 import com.google.inject.AbstractModule;
 
 public class Constants extends AbstractModule {
-  public static final String[] VERSIONS = new String[] {"v1alpha"};
+  public static final String[] VERSIONS = new String[] {"v1beta2", "v1beta1"};
   public static final String[] CUSTOM_RESOURCES =
       new String[] {"GerritCluster", "Gerrit", "Receiver", "GerritNetwork", "GitGarbageCollection"};
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/admission/AdmissionWebhookModule.java b/operator/src/main/java/com/google/gerrit/k8s/operator/admission/AdmissionWebhookModule.java
index d3d4841..bda4cec 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/admission/AdmissionWebhookModule.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/admission/AdmissionWebhookModule.java
@@ -14,9 +14,6 @@
 
 package com.google.gerrit.k8s.operator.admission;
 
-import com.google.gerrit.k8s.operator.v1alpha.admission.GerritClusterValidationWebhookConfigApplier;
-import com.google.gerrit.k8s.operator.v1alpha.admission.GerritValidationWebhookConfigApplier;
-import com.google.gerrit.k8s.operator.v1alpha.admission.GitGcValidationWebhookConfigApplier;
 import com.google.inject.AbstractModule;
 import com.google.inject.assistedinject.FactoryModuleBuilder;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/GerritClusterReconciler.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/GerritClusterReconciler.java
index c00d51e..cc33463 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/GerritClusterReconciler.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/GerritClusterReconciler.java
@@ -29,13 +29,14 @@
 import com.google.gerrit.k8s.operator.cluster.dependent.NfsIdmapdConfigMap;
 import com.google.gerrit.k8s.operator.cluster.dependent.NfsWorkaroundCondition;
 import com.google.gerrit.k8s.operator.cluster.dependent.SharedPVC;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritClusterStatus;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplate;
+import com.google.gerrit.k8s.operator.cluster.dependent.SharedPVCCondition;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritClusterStatus;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverTemplate;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaim;
@@ -60,6 +61,7 @@
       @Dependent(
           name = "shared-pvc",
           type = SharedPVC.class,
+          reconcilePrecondition = SharedPVCCondition.class,
           useEventSourceWithName = PVC_EVENT_SOURCE),
       @Dependent(
           type = NfsIdmapdConfigMap.class,
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerrit.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerrit.java
index 8de0b3e..ada4cdc 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerrit.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerrit.java
@@ -14,9 +14,9 @@
 
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritCondition.java
index 7455aca..d300320 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritCondition.java
@@ -14,8 +14,8 @@
 
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
 import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritNetwork.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritNetwork.java
index 232c791..dbd28c1 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritNetwork.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritNetwork.java
@@ -14,14 +14,14 @@
 
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetworkSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.NetworkMember;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.NetworkMemberWithSsh;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetworkSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.NetworkMember;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.NetworkMemberWithSsh;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverTemplate;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritNetworkCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritNetworkCondition.java
index a5b9244..6a937a2 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritNetworkCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedGerritNetworkCondition.java
@@ -14,8 +14,8 @@
 
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
 import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedReceiver.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedReceiver.java
index 62618a2..b86155c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedReceiver.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedReceiver.java
@@ -14,8 +14,8 @@
 
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedReceiverCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedReceiverCondition.java
index aa27446..52a5ef5 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedReceiverCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/ClusterManagedReceiverCondition.java
@@ -14,8 +14,8 @@
 
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
 import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsIdmapdConfigMap.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsIdmapdConfigMap.java
index 623e801..2b47c9c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsIdmapdConfigMap.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsIdmapdConfigMap.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsIdmapdConfigMapDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsIdmapdConfigMapDiscriminator.java
index 17dfea7..f0f6588 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsIdmapdConfigMapDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsIdmapdConfigMapDiscriminator.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.cluster.GerritClusterReconciler.CM_EVENT_SOURCE;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsWorkaroundCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsWorkaroundCondition.java
index a0cccc0..f635df2 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsWorkaroundCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/NfsWorkaroundCondition.java
@@ -14,8 +14,8 @@
 
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.NfsWorkaroundConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.NfsWorkaroundConfig;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVC.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVC.java
index 099afc6..1abfcf9 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVC.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVC.java
@@ -15,9 +15,9 @@
 package com.google.gerrit.k8s.operator.cluster.dependent;
 
 import com.google.gerrit.k8s.operator.util.CRUDKubernetesDependentPVCResource;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritStorageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.SharedStorage;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritStorageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.SharedStorage;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaim;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaimBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVCCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVCCondition.java
new file mode 100644
index 0000000..8d6d692
--- /dev/null
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVCCondition.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// 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.
+
+package com.google.gerrit.k8s.operator.cluster.dependent;
+
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import io.fabric8.kubernetes.api.model.PersistentVolumeClaim;
+import io.javaoperatorsdk.operator.api.reconciler.Context;
+import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
+import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
+
+public class SharedPVCCondition implements Condition<PersistentVolumeClaim, GerritCluster> {
+
+  @Override
+  public boolean isMet(
+      DependentResource<PersistentVolumeClaim, GerritCluster> dependentResource,
+      GerritCluster gerritCluster,
+      Context<GerritCluster> context) {
+    return !gerritCluster.getSpec().getStorage().getSharedStorage().getExternalPVC().isEnabled();
+  }
+}
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVCDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVCDiscriminator.java
index 52fe941..d8f8566 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVCDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/cluster/dependent/SharedPVCDiscriminator.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.cluster.GerritClusterReconciler.PVC_EVENT_SOURCE;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
 import io.fabric8.kubernetes.api.model.PersistentVolumeClaim;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/GerritReconciler.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/GerritReconciler.java
index 04d0a2f..fcaa625 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/GerritReconciler.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/GerritReconciler.java
@@ -23,8 +23,8 @@
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritSecret;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritService;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritStatus;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritStatus;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.ConfigMap;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritConfigMap.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritConfigMap.java
index 22001b9..05f1ac7 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritConfigMap.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritConfigMap.java
@@ -14,12 +14,12 @@
 
 package com.google.gerrit.k8s.operator.gerrit.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.gerrit.config.GerritConfigBuilder;
-import com.google.gerrit.k8s.operator.v1alpha.gerrit.config.HighAvailabilityPluginConfigBuilder;
-import com.google.gerrit.k8s.operator.v1alpha.gerrit.config.SpannerRefDbPluginConfigBuilder;
-import com.google.gerrit.k8s.operator.v1alpha.gerrit.config.ZookeeperRefDbPluginConfigBuilder;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.gerrit.config.GerritConfigBuilder;
+import com.google.gerrit.k8s.operator.v1beta2.gerrit.config.HighAvailabilityPluginConfigBuilder;
+import com.google.gerrit.k8s.operator.v1beta2.gerrit.config.SpannerRefDbPluginConfigBuilder;
+import com.google.gerrit.k8s.operator.v1beta2.gerrit.config.ZookeeperRefDbPluginConfigBuilder;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritConfigMapDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritConfigMapDiscriminator.java
index 6ec6b77..9aa818a 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritConfigMapDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritConfigMapDiscriminator.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.gerrit.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritInitConfigMap.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritInitConfigMap.java
index 3b9b8b4..a82bc0e 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritInitConfigMap.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritInitConfigMap.java
@@ -14,18 +14,18 @@
 
 package com.google.gerrit.k8s.operator.gerrit.dependent;
 
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster.PLUGIN_CACHE_MOUNT_PATH;
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig.RefDatabase.SPANNER;
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig.RefDatabase.ZOOKEEPER;
+import static com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster.PLUGIN_CACHE_MOUNT_PATH;
+import static com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GlobalRefDbConfig.RefDatabase.SPANNER;
+import static com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GlobalRefDbConfig.RefDatabase.ZOOKEEPER;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
 import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritInitConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritInitConfig;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritInitConfigMapDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritInitConfigMapDiscriminator.java
index 5494f5a..183aed0 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritInitConfigMapDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritInitConfigMapDiscriminator.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.gerrit.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritSecret.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritSecret.java
index ac65dcd..eaeb5d9 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritSecret.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritSecret.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.gerrit.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritService.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritService.java
index 888903c..ff28638 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritService.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritService.java
@@ -18,9 +18,9 @@
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.SSH_PORT;
 
 import com.google.gerrit.k8s.operator.gerrit.GerritReconciler;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
 import io.fabric8.kubernetes.api.model.Service;
 import io.fabric8.kubernetes.api.model.ServiceBuilder;
 import io.fabric8.kubernetes.api.model.ServicePort;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritStatefulSet.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritStatefulSet.java
index d319f4c..07b4456 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritStatefulSet.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gerrit/dependent/GerritStatefulSet.java
@@ -18,10 +18,10 @@
 
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.k8s.operator.gerrit.GerritReconciler;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.NfsWorkaroundConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.NfsWorkaroundConfig;
 import io.fabric8.kubernetes.api.model.Container;
 import io.fabric8.kubernetes.api.model.ContainerPort;
 import io.fabric8.kubernetes.api.model.EnvVar;
@@ -188,20 +188,22 @@
     return stsBuilder.build();
   }
 
-  private static String getComponentName(Gerrit gerrit) {
-    return String.format("gerrit-statefulset-%s", gerrit.getMetadata().getName());
+  private static String getComponentName(String gerritName) {
+    return String.format("gerrit-statefulset-%s", gerritName);
   }
 
   public static Map<String, String> getSelectorLabels(Gerrit gerrit) {
-    return GerritCluster.getSelectorLabels(
-        gerrit.getMetadata().getName(), getComponentName(gerrit));
+    return getSelectorLabels(gerrit.getMetadata().getName());
+  }
+
+  public static Map<String, String> getSelectorLabels(String gerritName) {
+    return GerritCluster.getSelectorLabels(gerritName, getComponentName(gerritName));
   }
 
   private static Map<String, String> getLabels(Gerrit gerrit) {
+    String name = gerrit.getMetadata().getName();
     return GerritCluster.getLabels(
-        gerrit.getMetadata().getName(),
-        getComponentName(gerrit),
-        GerritReconciler.class.getSimpleName());
+        name, getComponentName(name), GerritReconciler.class.getSimpleName());
   }
 
   private Set<Volume> getVolumes(Gerrit gerrit) {
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/GitGarbageCollectionReconciler.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/GitGarbageCollectionReconciler.java
index 8d28fea..f78c47d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/GitGarbageCollectionReconciler.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/GitGarbageCollectionReconciler.java
@@ -16,10 +16,10 @@
 
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.k8s.operator.gitgc.dependent.GitGarbageCollectionCronJob;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollection;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollectionStatus;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollectionStatus.GitGcState;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollection;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollectionStatus;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollectionStatus.GitGcState;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.client.KubernetesClient;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/dependent/GitGarbageCollectionCronJob.java b/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/dependent/GitGarbageCollectionCronJob.java
index 254bbab..dbf4f9a 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/dependent/GitGarbageCollectionCronJob.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/gitgc/dependent/GitGarbageCollectionCronJob.java
@@ -15,8 +15,8 @@
 package com.google.gerrit.k8s.operator.gitgc.dependent;
 
 import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollection;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollection;
 import io.fabric8.kubernetes.api.model.Container;
 import io.fabric8.kubernetes.api.model.ContainerBuilder;
 import io.fabric8.kubernetes.api.model.Volume;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/Constants.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/Constants.java
index 1a7f3b2..75e96fd 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/Constants.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/Constants.java
@@ -15,8 +15,9 @@
 package com.google.gerrit.k8s.operator.network;
 
 public class Constants {
-  public static String UPLOAD_PACK_URL_PATTERN = "/.*/git-upload-pack";
-  public static String INFO_REFS_PATTERN = "/.*/info/refs";
-  public static String RECEIVE_PACK_URL_PATTERN = "/.*/git-receive-pack";
-  public static String PROJECTS_URL_PATTERN = "/a/projects/.*";
+  public static final String UPLOAD_PACK_URL_PATTERN = "/.*/git-upload-pack";
+  public static final String INFO_REFS_PATTERN = "/.*/info/refs";
+  public static final String RECEIVE_PACK_URL_PATTERN = "/.*/git-receive-pack";
+  public static final String PROJECTS_URL_PATTERN = "/a/projects/.*";
+  public static final String GERRIT_FORBIDDEN_URL_PATTERN = "^(/a)?/plugins/high-availability/.*$";
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/GerritClusterIngressCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/GerritClusterIngressCondition.java
index 9077f1b..a8d9f76 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/GerritClusterIngressCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/GerritClusterIngressCondition.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/GerritNetworkReconcilerProvider.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/GerritNetworkReconcilerProvider.java
index a614e92..35e6028 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/GerritNetworkReconcilerProvider.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/GerritNetworkReconcilerProvider.java
@@ -18,7 +18,7 @@
 import com.google.gerrit.k8s.operator.network.ingress.GerritIngressReconciler;
 import com.google.gerrit.k8s.operator.network.istio.GerritIstioReconciler;
 import com.google.gerrit.k8s.operator.network.none.GerritNoIngressReconciler;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.name.Named;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/GerritAmbassadorReconciler.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/GerritAmbassadorReconciler.java
index 34dc9db..42a33f1 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/GerritAmbassadorReconciler.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/GerritAmbassadorReconciler.java
@@ -37,7 +37,7 @@
 import com.google.gerrit.k8s.operator.network.ambassador.dependent.ReceiverMappingCondition;
 import com.google.gerrit.k8s.operator.network.ambassador.dependent.SingleMappingCondition;
 import com.google.gerrit.k8s.operator.network.ambassador.dependent.TLSContextCondition;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import com.google.inject.Singleton;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/AbstractAmbassadorDependentResource.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/AbstractAmbassadorDependentResource.java
index 3cc8d4a..f6b6f72 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/AbstractAmbassadorDependentResource.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/AbstractAmbassadorDependentResource.java
@@ -14,8 +14,8 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/CreateHostCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/CreateHostCondition.java
index e7f99ec..a6c3fa3 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/CreateHostCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/CreateHostCondition.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterHost.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterHost.java
index 5f916c4..447efb1 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterHost.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterHost.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.ambassador.dependent.GerritClusterTLSContext.GERRIT_TLS_CONTEXT;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Host;
 import io.getambassador.v2.HostBuilder;
 import io.getambassador.v2.hostspec.TlsContext;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMapping.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMapping.java
index 733be73..fe1bcdc 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMapping.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMapping.java
@@ -14,8 +14,8 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.NetworkMemberWithSsh;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.NetworkMemberWithSsh;
 import io.getambassador.v2.Mapping;
 import io.getambassador.v2.MappingBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingDiscriminator.java
index 12d99c3..57d73f1 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingDiscriminator.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.ambassador.dependent.GerritClusterMapping.GERRIT_MAPPING;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingGETReplica.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingGETReplica.java
index 8fda99e..8c47981 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingGETReplica.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingGETReplica.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.Constants.INFO_REFS_PATTERN;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.getambassador.v2.MappingBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingGETReplicaDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingGETReplicaDiscriminator.java
index 9a4da43..ea86638 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingGETReplicaDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingGETReplicaDiscriminator.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.ambassador.dependent.GerritClusterMappingGETReplica.GERRIT_MAPPING_GET_REPLICA;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPOSTReplica.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPOSTReplica.java
index 1779990..e7e3d4b 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPOSTReplica.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPOSTReplica.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.Constants.UPLOAD_PACK_URL_PATTERN;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.getambassador.v2.MappingBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPOSTReplicaDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPOSTReplicaDiscriminator.java
index a1c02c8..e0cbdf7 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPOSTReplicaDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPOSTReplicaDiscriminator.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.ambassador.dependent.GerritClusterMappingPOSTReplica.GERRIT_MAPPING_POST_REPLICA;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPrimary.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPrimary.java
index f62b74a..4041899 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPrimary.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPrimary.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.getambassador.v2.MappingBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPrimaryDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPrimaryDiscriminator.java
index 0d38c69..0d9d870 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPrimaryDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingPrimaryDiscriminator.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.ambassador.dependent.GerritClusterMappingPrimary.GERRIT_MAPPING_PRIMARY;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiver.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiver.java
index 2d50b65..8568ecc 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiver.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiver.java
@@ -18,7 +18,7 @@
 import static com.google.gerrit.k8s.operator.network.Constants.RECEIVE_PACK_URL_PATTERN;
 
 import com.google.gerrit.k8s.operator.receiver.dependent.ReceiverService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.getambassador.v2.MappingBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverDiscriminator.java
index a31e905..2d045ed 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverDiscriminator.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.ambassador.dependent.GerritClusterMappingReceiver.GERRIT_MAPPING_RECEIVER;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverGET.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverGET.java
index aadd9dc..b9a52b3 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverGET.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverGET.java
@@ -17,7 +17,7 @@
 import static com.google.gerrit.k8s.operator.network.Constants.INFO_REFS_PATTERN;
 
 import com.google.gerrit.k8s.operator.receiver.dependent.ReceiverService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.getambassador.v2.MappingBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverGETDiscriminator.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverGETDiscriminator.java
index 24cf7f8..2e54dee 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverGETDiscriminator.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterMappingReceiverGETDiscriminator.java
@@ -16,7 +16,7 @@
 
 import static com.google.gerrit.k8s.operator.network.ambassador.dependent.GerritClusterMappingReceiverGET.GERRIT_MAPPING_RECEIVER_GET;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterTLSContext.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterTLSContext.java
index 7cae8da..346638b 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterTLSContext.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterTLSContext.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.TLSContext;
 import io.getambassador.v2.TLSContextBuilder;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/LoadBalanceCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/LoadBalanceCondition.java
index ea9066a..b118663 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/LoadBalanceCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/LoadBalanceCondition.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/MappingDependentResourceInterface.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/MappingDependentResourceInterface.java
index dc27428..eabed21 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/MappingDependentResourceInterface.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/MappingDependentResourceInterface.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/ReceiverMappingCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/ReceiverMappingCondition.java
index a83f984..cf569ab 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/ReceiverMappingCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/ReceiverMappingCondition.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/SingleMappingCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/SingleMappingCondition.java
index 52a1f2c..2345edf 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/SingleMappingCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/SingleMappingCondition.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/TLSContextCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/TLSContextCondition.java
index 053c559..bfebe74 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/TLSContextCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/TLSContextCondition.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.ambassador.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Mapping;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ingress/GerritIngressReconciler.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ingress/GerritIngressReconciler.java
index 30c90a9..097c634 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ingress/GerritIngressReconciler.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ingress/GerritIngressReconciler.java
@@ -16,7 +16,7 @@
 
 import com.google.gerrit.k8s.operator.network.GerritClusterIngressCondition;
 import com.google.gerrit.k8s.operator.network.ingress.dependent.GerritClusterIngress;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import com.google.inject.Singleton;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ingress/dependent/GerritClusterIngress.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ingress/dependent/GerritClusterIngress.java
index a62e298..12d6bda 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/ingress/dependent/GerritClusterIngress.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/ingress/dependent/GerritClusterIngress.java
@@ -14,12 +14,16 @@
 
 package com.google.gerrit.k8s.operator.network.ingress.dependent;
 
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork.SESSION_COOKIE_NAME;
+import static com.google.gerrit.k8s.operator.network.Constants.GERRIT_FORBIDDEN_URL_PATTERN;
+import static com.google.gerrit.k8s.operator.network.Constants.PROJECTS_URL_PATTERN;
+import static com.google.gerrit.k8s.operator.network.Constants.RECEIVE_PACK_URL_PATTERN;
+import static com.google.gerrit.k8s.operator.network.Constants.UPLOAD_PACK_URL_PATTERN;
+import static com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork.SESSION_COOKIE_NAME;
 
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritService;
 import com.google.gerrit.k8s.operator.receiver.dependent.ReceiverService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath;
 import io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPathBuilder;
 import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
@@ -41,8 +45,6 @@
 
 @KubernetesDependent
 public class GerritClusterIngress extends CRUDKubernetesDependentResource<Ingress, GerritNetwork> {
-  private static final String UPLOAD_PACK_URL_PATTERN = "/.*/git-upload-pack";
-  private static final String RECEIVE_PACK_URL_PATTERN = "/.*/git-receive-pack";
   public static final String INGRESS_NAME = "gerrit-ingress";
 
   public GerritClusterIngress() {
@@ -83,21 +85,32 @@
     annotations.put("nginx.ingress.kubernetes.io/use-regex", "true");
     annotations.put("kubernetes.io/ingress.class", "nginx");
 
-    String configSnippet = "";
+    StringBuilder configSnippet = new StringBuilder();
+    if (gerritNetwork.hasPrimaryGerrit()) {
+      configSnippet = createNginxConfigSnippetForbidHARoutes(configSnippet);
+    }
+
     if (gerritNetwork.hasPrimaryGerrit() && gerritNetwork.hasGerritReplica()) {
       String svcName = GerritService.getName(gerritNetwork.getSpec().getGerritReplica().getName());
       configSnippet =
-          createNginxConfigSnippet(
-              "service=git-upload-pack", gerritNetwork.getMetadata().getNamespace(), svcName);
+          createNginxConfigSnippetGerritReplicaRouting(
+              configSnippet,
+              "service=git-upload-pack",
+              gerritNetwork.getMetadata().getNamespace(),
+              svcName);
     }
     if (gerritNetwork.hasReceiver()) {
       String svcName = ReceiverService.getName(gerritNetwork.getSpec().getReceiver().getName());
       configSnippet =
-          createNginxConfigSnippet(
-              "service=git-receive-pack", gerritNetwork.getMetadata().getNamespace(), svcName);
+          createNginxConfigSnippetGerritReplicaRouting(
+              configSnippet,
+              "service=git-receive-pack",
+              gerritNetwork.getMetadata().getNamespace(),
+              svcName);
     }
-    if (!configSnippet.isBlank()) {
-      annotations.put("nginx.ingress.kubernetes.io/configuration-snippet", configSnippet);
+    if (configSnippet.length() > 0) {
+      annotations.put(
+          "nginx.ingress.kubernetes.io/configuration-snippet", configSnippet.toString().trim());
     }
 
     annotations.put("nginx.ingress.kubernetes.io/affinity", "cookie");
@@ -121,8 +134,8 @@
    * @param svcName Name of the destination service.
    * @return configuration snippet
    */
-  private String createNginxConfigSnippet(String queryParam, String namespace, String svcName) {
-    StringBuilder configSnippet = new StringBuilder();
+  private StringBuilder createNginxConfigSnippetGerritReplicaRouting(
+      StringBuilder configSnippet, String queryParam, String namespace, String svcName) {
     configSnippet.append("if ($args ~ ");
     configSnippet.append(queryParam);
     configSnippet.append("){");
@@ -138,8 +151,18 @@
     configSnippet.append("\n");
     configSnippet.append("  set $service_name \"");
     configSnippet.append(svcName);
-    configSnippet.append("\";\n}");
-    return configSnippet.toString();
+    configSnippet.append("\";\n}\n");
+    return configSnippet;
+  }
+
+  private StringBuilder createNginxConfigSnippetForbidHARoutes(StringBuilder configSnippet) {
+    configSnippet.append("location ~ ");
+    configSnippet.append(GERRIT_FORBIDDEN_URL_PATTERN);
+    configSnippet.append(" {\n");
+    configSnippet.append("  deny all;\n");
+    configSnippet.append("  return 403;\n");
+    configSnippet.append("}\n");
+    return configSnippet;
   }
 
   private IngressTLS getIngressTLS(GerritNetwork gerritNetwork) {
@@ -229,7 +252,7 @@
     ServiceBackendPort port =
         new ServiceBackendPortBuilder().withName(ReceiverService.HTTP_PORT_NAME).build();
 
-    for (String path : List.of("/a/projects", RECEIVE_PACK_URL_PATTERN)) {
+    for (String path : List.of(PROJECTS_URL_PATTERN, RECEIVE_PACK_URL_PATTERN)) {
       paths.add(
           new HTTPIngressPathBuilder()
               .withPathType("Prefix")
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/GerritIstioReconciler.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/GerritIstioReconciler.java
index 4d12941..19b173a 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/GerritIstioReconciler.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/GerritIstioReconciler.java
@@ -22,7 +22,7 @@
 import com.google.gerrit.k8s.operator.network.istio.dependent.GerritIstioCondition;
 import com.google.gerrit.k8s.operator.network.istio.dependent.GerritIstioDestinationRule;
 import com.google.gerrit.k8s.operator.network.istio.dependent.GerritIstioVirtualService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import com.google.inject.Singleton;
 import io.fabric8.istio.api.networking.v1beta1.DestinationRule;
 import io.fabric8.istio.api.networking.v1beta1.VirtualService;
@@ -56,7 +56,7 @@
           type = GerritIstioVirtualService.class,
           reconcilePrecondition = GerritIstioCondition.class,
           dependsOn = {"gerrit-istio-gateway"},
-          useEventSourceWithName = ISTIO_VIRTUAL_SERVICE_EVENT_SOURCE),
+          useEventSourceWithName = ISTIO_VIRTUAL_SERVICE_EVENT_SOURCE)
     })
 public class GerritIstioReconciler
     implements Reconciler<GerritNetwork>, EventSourceInitializer<GerritNetwork> {
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioGateway.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioGateway.java
index 099a4ed..5b195e8 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioGateway.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioGateway.java
@@ -14,8 +14,8 @@
 
 package com.google.gerrit.k8s.operator.network.istio.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.fabric8.istio.api.networking.v1beta1.Gateway;
 import io.fabric8.istio.api.networking.v1beta1.GatewayBuilder;
 import io.fabric8.istio.api.networking.v1beta1.Server;
@@ -25,7 +25,6 @@
 import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 public class GerritClusterIstioGateway
     extends CRUDKubernetesDependentResource<Gateway, GerritNetwork> {
@@ -46,7 +45,7 @@
                 gerritNetwork.getMetadata().getName(), NAME, this.getClass().getSimpleName()))
         .endMetadata()
         .withNewSpec()
-        .withSelector(Map.of("istio", "ingressgateway"))
+        .withSelector(gerritNetwork.getSpec().getIngress().getIstio().getGatewaySelector())
         .withServers(configureServers(gerritNetwork))
         .endSpec()
         .build();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioAndPrimaryGerritCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioAndPrimaryGerritCondition.java
new file mode 100644
index 0000000..6bbfc67
--- /dev/null
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioAndPrimaryGerritCondition.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// 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.
+
+package com.google.gerrit.k8s.operator.network.istio.dependent;
+
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
+import io.fabric8.istio.api.networking.v1beta1.VirtualService;
+import io.javaoperatorsdk.operator.api.reconciler.Context;
+import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
+import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
+
+public class GerritIstioAndPrimaryGerritCondition
+    implements Condition<VirtualService, GerritNetwork> {
+
+  @Override
+  public boolean isMet(
+      DependentResource<VirtualService, GerritNetwork> dependentResource,
+      GerritNetwork gerritNetwork,
+      Context<GerritNetwork> context) {
+
+    return gerritNetwork.getSpec().getIngress().isEnabled()
+        && (gerritNetwork.hasGerrits() || gerritNetwork.hasReceiver());
+  }
+}
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioCondition.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioCondition.java
index ac6c6c3..6e7506c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioCondition.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioCondition.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.istio.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.fabric8.istio.api.networking.v1beta1.VirtualService;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioDestinationRule.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioDestinationRule.java
index 98f8267..d9429d3 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioDestinationRule.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioDestinationRule.java
@@ -14,13 +14,13 @@
 
 package com.google.gerrit.k8s.operator.network.istio.dependent;
 
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork.SESSION_COOKIE_NAME;
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork.SESSION_COOKIE_TTL;
+import static com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork.SESSION_COOKIE_NAME;
+import static com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork.SESSION_COOKIE_TTL;
 
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.fabric8.istio.api.networking.v1beta1.DestinationRule;
 import io.fabric8.istio.api.networking.v1beta1.DestinationRuleBuilder;
 import io.fabric8.istio.api.networking.v1beta1.LoadBalancerSettingsSimpleLB;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioVirtualService.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioVirtualService.java
index f0d683c..f4988f7 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioVirtualService.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritIstioVirtualService.java
@@ -14,12 +14,18 @@
 
 package com.google.gerrit.k8s.operator.network.istio.dependent;
 
+import static com.google.gerrit.k8s.operator.network.Constants.GERRIT_FORBIDDEN_URL_PATTERN;
+import static com.google.gerrit.k8s.operator.network.Constants.INFO_REFS_PATTERN;
+import static com.google.gerrit.k8s.operator.network.Constants.PROJECTS_URL_PATTERN;
+import static com.google.gerrit.k8s.operator.network.Constants.RECEIVE_PACK_URL_PATTERN;
+import static com.google.gerrit.k8s.operator.network.Constants.UPLOAD_PACK_URL_PATTERN;
+
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritService;
 import com.google.gerrit.k8s.operator.receiver.dependent.ReceiverService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.NetworkMember;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.NetworkMemberWithSsh;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.NetworkMember;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.NetworkMemberWithSsh;
 import io.fabric8.istio.api.networking.v1beta1.HTTPMatchRequest;
 import io.fabric8.istio.api.networking.v1beta1.HTTPMatchRequestBuilder;
 import io.fabric8.istio.api.networking.v1beta1.HTTPRoute;
@@ -44,9 +50,6 @@
 @KubernetesDependent
 public class GerritIstioVirtualService
     extends CRUDKubernetesDependentResource<VirtualService, GerritNetwork> {
-  private static final String INFO_REF_URL_PATTERN = "^/(.*)/info/refs$";
-  private static final String UPLOAD_PACK_URL_PATTERN = "^/(.*)/git-upload-pack$";
-  private static final String RECEIVE_PACK_URL_PATTERN = "^/(.*)/git-receive-pack$";
   public static final String NAME_SUFFIX = "gerrit-http-virtual-service";
 
   public GerritIstioVirtualService() {
@@ -103,11 +106,28 @@
               .build());
     }
     if (gerritNetwork.hasPrimaryGerrit()) {
+      HTTPRouteDestination dest =
+          getGerritHTTPDestinations(gerritNetwork.getSpec().getPrimaryGerrit(), namespace);
+      routes.add(
+          new HTTPRouteBuilder()
+              .withName("forbidden-routes-" + gerritNetwork.getSpec().getPrimaryGerrit().getName())
+              .withRoute(dest)
+              .withMatch(getGerritForbiddenMatches())
+              .withNewFault()
+              .withNewAbort()
+              .withNewHTTPFaultInjectionAbortHttpStatusErrorType()
+              .withHttpStatus(403)
+              .endHTTPFaultInjectionAbortHttpStatusErrorType()
+              .withNewPercentage()
+              .withValue(100D)
+              .endPercentage()
+              .endAbort()
+              .endFault()
+              .build());
       routes.add(
           new HTTPRouteBuilder()
               .withName("gerrit-primary-" + gerritNetwork.getSpec().getPrimaryGerrit().getName())
-              .withRoute(
-                  getGerritHTTPDestinations(gerritNetwork.getSpec().getPrimaryGerrit(), namespace))
+              .withRoute(dest)
               .build());
     }
 
@@ -126,13 +146,26 @@
         .build();
   }
 
+  private List<HTTPMatchRequest> getGerritForbiddenMatches() {
+    List<HTTPMatchRequest> matches = new ArrayList<>();
+    matches.add(
+        new HTTPMatchRequestBuilder()
+            .withNewUri()
+            .withNewStringMatchRegexType()
+            .withRegex(GERRIT_FORBIDDEN_URL_PATTERN)
+            .endStringMatchRegexType()
+            .endUri()
+            .build());
+    return matches;
+  }
+
   private List<HTTPMatchRequest> getGerritReplicaMatches() {
     List<HTTPMatchRequest> matches = new ArrayList<>();
     matches.add(
         new HTTPMatchRequestBuilder()
             .withNewUri()
             .withNewStringMatchRegexType()
-            .withRegex(INFO_REF_URL_PATTERN)
+            .withRegex(INFO_REFS_PATTERN)
             .endStringMatchRegexType()
             .endUri()
             .withQueryParams(
@@ -181,7 +214,8 @@
     List<HTTPMatchRequest> matches = new ArrayList<>();
     matches.add(
         new HTTPMatchRequestBuilder()
-            .withUri(new StringMatchBuilder().withNewStringMatchPrefixType("/a/projects/").build())
+            .withUri(
+                new StringMatchBuilder().withNewStringMatchRegexType(PROJECTS_URL_PATTERN).build())
             .build());
     matches.add(
         new HTTPMatchRequestBuilder()
@@ -195,7 +229,7 @@
         new HTTPMatchRequestBuilder()
             .withNewUri()
             .withNewStringMatchRegexType()
-            .withRegex(INFO_REF_URL_PATTERN)
+            .withRegex(INFO_REFS_PATTERN)
             .endStringMatchRegexType()
             .endUri()
             .withQueryParams(
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/network/none/GerritNoIngressReconciler.java b/operator/src/main/java/com/google/gerrit/k8s/operator/network/none/GerritNoIngressReconciler.java
index 2179260..1986a0d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/network/none/GerritNoIngressReconciler.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/network/none/GerritNoIngressReconciler.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.network.none;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import com.google.inject.Singleton;
 import io.javaoperatorsdk.operator.api.reconciler.Context;
 import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverReconciler.java b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverReconciler.java
index b48a05f..b2177d1 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverReconciler.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/ReceiverReconciler.java
@@ -17,8 +17,8 @@
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.k8s.operator.receiver.dependent.ReceiverDeployment;
 import com.google.gerrit.k8s.operator.receiver.dependent.ReceiverService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverStatus;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverStatus;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.Secret;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverDeployment.java b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverDeployment.java
index 16c0072..280739f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverDeployment.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverDeployment.java
@@ -15,9 +15,9 @@
 package com.google.gerrit.k8s.operator.receiver.dependent;
 
 import com.google.gerrit.k8s.operator.receiver.ReceiverReconciler;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.NfsWorkaroundConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.NfsWorkaroundConfig;
 import io.fabric8.kubernetes.api.model.Container;
 import io.fabric8.kubernetes.api.model.ContainerPort;
 import io.fabric8.kubernetes.api.model.Volume;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverSecret.java b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverSecret.java
index ca4700a..6ef9a01 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverSecret.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverSecret.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.receiver.dependent;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
 import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverService.java b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverService.java
index 3ccb644..a26f8d5 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverService.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverService.java
@@ -17,8 +17,8 @@
 import static com.google.gerrit.k8s.operator.receiver.dependent.ReceiverDeployment.HTTP_PORT;
 
 import com.google.gerrit.k8s.operator.receiver.ReceiverReconciler;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
 import io.fabric8.kubernetes.api.model.Service;
 import io.fabric8.kubernetes.api.model.ServiceBuilder;
 import io.fabric8.kubernetes.api.model.ServicePort;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/server/ServerModule.java b/operator/src/main/java/com/google/gerrit/k8s/operator/server/ServerModule.java
index ae613dd..430854c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/server/ServerModule.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/server/ServerModule.java
@@ -16,9 +16,9 @@
 
 import static com.google.gerrit.k8s.operator.server.FileSystemKeyStoreProvider.KEYSTORE_PATH;
 
-import com.google.gerrit.k8s.operator.v1alpha.admission.servlet.GerritAdmissionWebhook;
-import com.google.gerrit.k8s.operator.v1alpha.admission.servlet.GerritClusterAdmissionWebhook;
-import com.google.gerrit.k8s.operator.v1alpha.admission.servlet.GitGcAdmissionWebhook;
+import com.google.gerrit.k8s.operator.v1beta2.admission.servlet.GerritAdmissionWebhook;
+import com.google.gerrit.k8s.operator.v1beta2.admission.servlet.GerritClusterAdmissionWebhook;
+import com.google.gerrit.k8s.operator.v1beta2.admission.servlet.GitGcAdmissionWebhook;
 import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.Multibinder;
 import java.io.File;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritAdmissionWebhook.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GerritAdmissionWebhook.java
similarity index 89%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritAdmissionWebhook.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GerritAdmissionWebhook.java
index f74cb59..7b33287 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritAdmissionWebhook.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GerritAdmissionWebhook.java
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.admission.servlet;
+package com.google.gerrit.k8s.operator.v1beta1.admission.servlet;
 
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig.RefDatabase.SPANNER;
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig.RefDatabase.ZOOKEEPER;
+import static com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GlobalRefDbConfig.RefDatabase.SPANNER;
+import static com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GlobalRefDbConfig.RefDatabase.ZOOKEEPER;
 
 import com.google.gerrit.k8s.operator.gerrit.config.InvalidGerritConfigException;
 import com.google.gerrit.k8s.operator.server.ValidatingAdmissionWebhookServlet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig;
-import com.google.gerrit.k8s.operator.v1alpha.gerrit.config.GerritConfigBuilder;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GlobalRefDbConfig;
+import com.google.gerrit.k8s.operator.v1beta1.gerrit.config.GerritConfigBuilder;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.fabric8.kubernetes.api.model.Status;
@@ -30,6 +30,7 @@
 import java.util.Locale;
 
 @Singleton
+@Deprecated
 public class GerritAdmissionWebhook extends ValidatingAdmissionWebhookServlet {
   private static final long serialVersionUID = 1L;
 
@@ -111,6 +112,6 @@
 
   @Override
   public String getVersion() {
-    return "v1alpha";
+    return "v1beta1";
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritClusterAdmissionWebhook.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GerritClusterAdmissionWebhook.java
similarity index 92%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritClusterAdmissionWebhook.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GerritClusterAdmissionWebhook.java
index 8817559..0831e45 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritClusterAdmissionWebhook.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GerritClusterAdmissionWebhook.java
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.admission.servlet;
+package com.google.gerrit.k8s.operator.v1beta1.admission.servlet;
 
 import com.google.gerrit.k8s.operator.server.ValidatingAdmissionWebhookServlet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.GerritTemplateSpec.GerritMode;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.fabric8.kubernetes.api.model.Status;
@@ -25,6 +25,7 @@
 import jakarta.servlet.http.HttpServletResponse;
 
 @Singleton
+@Deprecated
 public class GerritClusterAdmissionWebhook extends ValidatingAdmissionWebhookServlet {
   private static final long serialVersionUID = 1L;
 
@@ -98,6 +99,6 @@
 
   @Override
   public String getVersion() {
-    return "v1alpha";
+    return "v1beta1";
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GitGcAdmissionWebhook.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GitGcAdmissionWebhook.java
similarity index 95%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GitGcAdmissionWebhook.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GitGcAdmissionWebhook.java
index 3198c1a..f309b63 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GitGcAdmissionWebhook.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/admission/servlet/GitGcAdmissionWebhook.java
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.admission.servlet;
+package com.google.gerrit.k8s.operator.v1beta1.admission.servlet;
 
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.k8s.operator.server.ValidatingAdmissionWebhookServlet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollection;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gitgc.GitGarbageCollection;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.HasMetadata;
@@ -31,6 +31,7 @@
 import java.util.stream.Collectors;
 
 @Singleton
+@Deprecated
 public class GitGcAdmissionWebhook extends ValidatingAdmissionWebhookServlet {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
   private static final long serialVersionUID = 1L;
@@ -109,6 +110,6 @@
 
   @Override
   public String getVersion() {
-    return "v1alpha";
+    return "v1beta1";
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritCluster.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritCluster.java
similarity index 96%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritCluster.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritCluster.java
index b88ab09..3021f2a 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritCluster.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritCluster.java
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.cluster;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.cluster;
 
 import static com.google.gerrit.k8s.operator.cluster.dependent.NfsIdmapdConfigMap.NFS_IDMAPD_CM_NAME;
 import static com.google.gerrit.k8s.operator.cluster.dependent.SharedPVC.SHARED_PVC_NAME;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.SharedStorage.ExternalPVCConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.SharedStorage.ExternalPVCConfig;
 import io.fabric8.kubernetes.api.model.Container;
 import io.fabric8.kubernetes.api.model.ContainerBuilder;
 import io.fabric8.kubernetes.api.model.EnvVar;
@@ -42,8 +42,9 @@
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha17")
+@Version(value = "v1beta1", storage = false)
 @ShortNames("gclus")
+@Deprecated
 public class GerritCluster extends CustomResource<GerritClusterSpec, GerritClusterStatus>
     implements Namespaced {
   private static final long serialVersionUID = 2L;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritClusterSpec.java
similarity index 83%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterSpec.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritClusterSpec.java
index 956c678..01b2ddc 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritClusterSpec.java
@@ -12,17 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.cluster;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.cluster;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritClusterIngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritStorageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.receiver.ReceiverTemplate;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GerritClusterIngressConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GerritStorageConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GlobalRefDbConfig;
 import java.util.ArrayList;
 import java.util.List;
 
+@Deprecated
 public class GerritClusterSpec {
 
   private GerritStorageConfig storage = new GerritStorageConfig();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterStatus.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritClusterStatus.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterStatus.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritClusterStatus.java
index a0b853d..ec1d57f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterStatus.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/cluster/GerritClusterStatus.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.cluster;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.cluster;
 
 import java.util.List;
 import java.util.Map;
 
+@Deprecated
 public class GerritClusterStatus {
   private Map<String, List<String>> members;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/Gerrit.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/Gerrit.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/Gerrit.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/Gerrit.java
index 4027cdd..d56f98d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/Gerrit.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/Gerrit.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.fabric8.kubernetes.api.model.Namespaced;
@@ -24,8 +24,9 @@
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha17")
+@Version(value = "v1beta1", storage = false)
 @ShortNames("gcr")
+@Deprecated
 public class Gerrit extends CustomResource<GerritSpec, GerritStatus> implements Namespaced {
   private static final long serialVersionUID = 2L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritDebugConfig.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritDebugConfig.java
index 7e7a5fd..a15d0bd 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritDebugConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
+@Deprecated
 public class GerritDebugConfig {
   private boolean enabled;
   private boolean suspend;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritInitConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritInitConfig.java
similarity index 96%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritInitConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritInitConfig.java
index 82dc41f..b5880b4 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritInitConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritInitConfig.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.List;
 
+@Deprecated
 public class GerritInitConfig {
   private String caCertPath = "/var/config/ca.crt";
   private boolean pluginCacheEnabled;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritModule.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritModule.java
similarity index 95%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritModule.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritModule.java
index 5b0f241..cb09e75 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritModule.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritModule.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import java.io.Serializable;
 
+@Deprecated
 public class GerritModule implements Serializable {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritPlugin.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritPlugin.java
similarity index 94%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritPlugin.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritPlugin.java
index 196ecb4..97865a3 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritPlugin.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritPlugin.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
+@Deprecated
 public class GerritPlugin extends GerritModule {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritProbe.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritProbe.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritProbe.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritProbe.java
index 46733ed..d67a13e 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritProbe.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritProbe.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet;
@@ -24,6 +24,7 @@
 import io.fabric8.kubernetes.api.model.Probe;
 import io.fabric8.kubernetes.api.model.TCPSocketAction;
 
+@Deprecated
 public class GerritProbe extends Probe {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSite.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritSite.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSite.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritSite.java
index 2b604c8..fcb085a 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSite.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritSite.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import io.fabric8.kubernetes.api.model.Quantity;
 import java.io.Serializable;
 
+@Deprecated
 public class GerritSite implements Serializable {
   private static final long serialVersionUID = 1L;
   Quantity size;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritSpec.java
similarity index 85%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSpec.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritSpec.java
index ed21087..4178181 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritSpec.java
@@ -12,13 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritStorageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GerritStorageConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GlobalRefDbConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.IngressConfig;
 
+@Deprecated
 public class GerritSpec extends GerritTemplateSpec {
   private ContainerImageConfig containerImages = new ContainerImageConfig();
   private GerritStorageConfig storage = new GerritStorageConfig();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritStatus.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritStatus.java
similarity index 94%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritStatus.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritStatus.java
index f779f75..37453cb 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritStatus.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritStatus.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import java.util.HashMap;
 import java.util.Map;
 
+@Deprecated
 public class GerritStatus {
   private boolean ready = false;
   private Map<String, String> appliedConfigMapVersions = new HashMap<>();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplate.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritTemplate.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplate.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritTemplate.java
index 1144737..ba61357 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplate.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritTemplate.java
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GlobalRefDbConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.IngressConfig;
 import io.fabric8.kubernetes.api.model.KubernetesResource;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
@@ -29,6 +29,7 @@
 @JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({"metadata", "spec"})
+@Deprecated
 public class GerritTemplate implements KubernetesResource {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplateSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritTemplateSpec.java
similarity index 97%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplateSpec.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritTemplateSpec.java
index 4349cd1..4cf0307 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplateSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gerrit/GerritTemplateSpec.java
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpSshServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.HttpSshServiceConfig;
 import io.fabric8.kubernetes.api.model.Affinity;
 import io.fabric8.kubernetes.api.model.ResourceRequirements;
 import io.fabric8.kubernetes.api.model.Toleration;
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 
+@Deprecated
 public class GerritTemplateSpec {
   private String serviceAccount;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollection.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollection.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollection.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollection.java
index 7d268bd..c5c46db 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollection.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollection.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gitgc;
 
 import io.fabric8.kubernetes.api.model.Namespaced;
 import io.fabric8.kubernetes.client.CustomResource;
@@ -24,9 +24,10 @@
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha1")
+@Version(value = "v1beta1", storage = false)
 @ShortNames("gitgc")
 @Plural("gitgcs")
+@Deprecated
 public class GitGarbageCollection
     extends CustomResource<GitGarbageCollectionSpec, GitGarbageCollectionStatus>
     implements Namespaced {
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollectionSpec.java
similarity index 96%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionSpec.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollectionSpec.java
index 7648f13..0f9e4d8 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollectionSpec.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gitgc;
 
 import io.fabric8.kubernetes.api.model.Affinity;
 import io.fabric8.kubernetes.api.model.ResourceRequirements;
@@ -22,6 +22,7 @@
 import java.util.Objects;
 import java.util.Set;
 
+@Deprecated
 public class GitGarbageCollectionSpec {
   private String cluster;
   private String schedule;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionStatus.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollectionStatus.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionStatus.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollectionStatus.java
index ddff4c7..c364012 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionStatus.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/gitgc/GitGarbageCollectionStatus.java
@@ -12,12 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.gitgc;
 
 import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
 
+@Deprecated
 public class GitGarbageCollectionStatus {
   private boolean replicateAll = false;
   private Set<String> excludedProjects = new HashSet<>();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetwork.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/GerritNetwork.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetwork.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/GerritNetwork.java
index 7596f54..6653858 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetwork.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/GerritNetwork.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.network;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.network;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.fabric8.kubernetes.api.model.Namespaced;
@@ -23,8 +23,9 @@
 import io.fabric8.kubernetes.model.annotation.Version;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha2")
+@Version(value = "v1beta1", storage = false)
 @ShortNames("gn")
+@Deprecated
 public class GerritNetwork extends CustomResource<GerritNetworkSpec, Status> implements Namespaced {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetworkSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/GerritNetworkSpec.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetworkSpec.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/GerritNetworkSpec.java
index 406341f..e938566 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetworkSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/GerritNetworkSpec.java
@@ -12,12 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.network;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.network;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritClusterIngressConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.GerritClusterIngressConfig;
 import java.util.ArrayList;
 import java.util.List;
 
+@Deprecated
 public class GerritNetworkSpec {
   private GerritClusterIngressConfig ingress = new GerritClusterIngressConfig();
   private NetworkMember receiver;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMember.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/NetworkMember.java
similarity index 88%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMember.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/NetworkMember.java
index 433dbbe..d9022b9 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMember.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/NetworkMember.java
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.network;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.network;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.HttpServiceConfig;
 
+@Deprecated
 public class NetworkMember {
   private String name;
   private int httpPort = 8080;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMemberWithSsh.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/NetworkMemberWithSsh.java
similarity index 88%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMemberWithSsh.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/NetworkMemberWithSsh.java
index 1668739..a3baa5a 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMemberWithSsh.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/network/NetworkMemberWithSsh.java
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.network;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.network;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpSshServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.HttpSshServiceConfig;
 
+@Deprecated
 public class NetworkMemberWithSsh extends NetworkMember {
   private int sshPort = 29418;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/Receiver.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/Receiver.java
similarity index 91%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/Receiver.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/Receiver.java
index bc546df..6b64159 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/Receiver.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/Receiver.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.receiver;
 
 import io.fabric8.kubernetes.api.model.Namespaced;
 import io.fabric8.kubernetes.client.CustomResource;
@@ -23,8 +23,9 @@
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha6")
+@Version(value = "v1beta1", storage = false)
 @ShortNames("grec")
+@Deprecated
 public class Receiver extends CustomResource<ReceiverSpec, ReceiverStatus> implements Namespaced {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverProbe.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverProbe.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverProbe.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverProbe.java
index 78aaa58..62c6c6f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverProbe.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverProbe.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.receiver;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.gerrit.k8s.operator.receiver.dependent.ReceiverDeployment;
@@ -24,6 +24,7 @@
 import io.fabric8.kubernetes.api.model.TCPSocketAction;
 import io.fabric8.kubernetes.api.model.TCPSocketActionBuilder;
 
+@Deprecated
 public class ReceiverProbe extends Probe {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverSpec.java
similarity index 84%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverSpec.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverSpec.java
index 005fa49..1005283 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverSpec.java
@@ -12,12 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.receiver;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.StorageConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.StorageConfig;
 
+@Deprecated
 public class ReceiverSpec extends ReceiverTemplateSpec {
   private ContainerImageConfig containerImages = new ContainerImageConfig();
   private StorageConfig storage = new StorageConfig();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverStatus.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverStatus.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverStatus.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverStatus.java
index 915a62f..cd455ce 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverStatus.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverStatus.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.receiver;
 
+@Deprecated
 public class ReceiverStatus {
   private boolean ready;
   private String appliedCredentialSecretVersion = "";
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplate.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverTemplate.java
similarity index 91%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplate.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverTemplate.java
index f559419..5ff0517 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplate.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverTemplate.java
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.receiver;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.StorageConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.StorageConfig;
 import io.fabric8.kubernetes.api.model.KubernetesResource;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
@@ -29,6 +29,7 @@
 @JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({"metadata", "spec"})
+@Deprecated
 public class ReceiverTemplate implements KubernetesResource {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplateSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverTemplateSpec.java
similarity index 96%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplateSpec.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverTemplateSpec.java
index 22ee904..b4e1f4e 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplateSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/receiver/ReceiverTemplateSpec.java
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.receiver;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.HttpServiceConfig;
 import io.fabric8.kubernetes.api.model.Affinity;
 import io.fabric8.kubernetes.api.model.IntOrString;
 import io.fabric8.kubernetes.api.model.ResourceRequirements;
@@ -23,6 +23,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+@Deprecated
 public class ReceiverTemplateSpec {
   private List<Toleration> tolerations = new ArrayList<>();
   private Affinity affinity;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/BusyBoxImage.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/BusyBoxImage.java
similarity index 94%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/BusyBoxImage.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/BusyBoxImage.java
index 5c5388f..049e562 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/BusyBoxImage.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/BusyBoxImage.java
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
+@Deprecated
 public class BusyBoxImage {
   private String registry;
   private String tag;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ContainerImageConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/ContainerImageConfig.java
similarity index 95%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ContainerImageConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/ContainerImageConfig.java
index 4f84824..e2a6d4a 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ContainerImageConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/ContainerImageConfig.java
@@ -12,12 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import io.fabric8.kubernetes.api.model.LocalObjectReference;
 import java.util.HashSet;
 import java.util.Set;
 
+@Deprecated
 public class ContainerImageConfig {
   private String imagePullPolicy = "Always";
   private Set<LocalObjectReference> imagePullSecrets = new HashSet<>();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritClusterIngressConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritClusterIngressConfig.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritClusterIngressConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritClusterIngressConfig.java
index a915820..0c57855 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritClusterIngressConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritClusterIngressConfig.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.util.Map;
 
+@Deprecated
 public class GerritClusterIngressConfig {
   private boolean enabled = false;
   private String host;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressAmbassadorConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressAmbassadorConfig.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressAmbassadorConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressAmbassadorConfig.java
index b34eb67..74e7e8c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressAmbassadorConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressAmbassadorConfig.java
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import java.util.List;
 
+@Deprecated
 public class GerritIngressAmbassadorConfig {
   private List<String> id;
   private boolean createHost;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressSshConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressSshConfig.java
similarity index 91%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressSshConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressSshConfig.java
index 6203803..0c9d120 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressSshConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressSshConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class GerritIngressSshConfig {
   private boolean enabled = false;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressTlsConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressTlsConfig.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressTlsConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressTlsConfig.java
index b4552f5..f3af3ff 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressTlsConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritIngressTlsConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class GerritIngressTlsConfig {
 
   private boolean enabled = false;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritRepositoryConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritRepositoryConfig.java
similarity index 95%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritRepositoryConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritRepositoryConfig.java
index f593c1e..6cb85d9 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritRepositoryConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritRepositoryConfig.java
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
+@Deprecated
 public class GerritRepositoryConfig {
   private String registry;
   private String org;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritStorageConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritStorageConfig.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritStorageConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritStorageConfig.java
index d66a0cd..1842012 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritStorageConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GerritStorageConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class GerritStorageConfig extends StorageConfig {
   private PluginCacheConfig pluginCache = new PluginCacheConfig();
 
@@ -25,6 +26,7 @@
     this.pluginCache = pluginCache;
   }
 
+  @Deprecated
   public class PluginCacheConfig {
     private boolean enabled;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GlobalRefDbConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GlobalRefDbConfig.java
similarity index 94%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GlobalRefDbConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GlobalRefDbConfig.java
index d338555..20ca56c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GlobalRefDbConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/GlobalRefDbConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class GlobalRefDbConfig {
   private RefDatabase database = RefDatabase.NONE;
   private ZookeeperRefDbConfig zookeeper;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpServiceConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/HttpServiceConfig.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpServiceConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/HttpServiceConfig.java
index 8e7d651..88173a0 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpServiceConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/HttpServiceConfig.java
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import java.io.Serializable;
 
+@Deprecated
 public class HttpServiceConfig implements Serializable {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpSshServiceConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/HttpSshServiceConfig.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpSshServiceConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/HttpSshServiceConfig.java
index 8655c32..4d58f30 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpSshServiceConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/HttpSshServiceConfig.java
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import java.io.Serializable;
 
+@Deprecated
 public class HttpSshServiceConfig extends HttpServiceConfig implements Serializable {
   private static final long serialVersionUID = 1L;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/IngressConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/IngressConfig.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/IngressConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/IngressConfig.java
index f83b189..cd36da2 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/IngressConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/IngressConfig.java
@@ -12,10 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
+@Deprecated
 public class IngressConfig {
   private boolean enabled;
   private String host;
@@ -63,7 +64,7 @@
   public String getUrl() {
     String protocol = isTlsEnabled() ? "https" : "http";
     String hostname = getHost();
-    return String.format("%s://%s", protocol, hostname);
+    return String.format("%s://%s/", protocol, hostname);
   }
 
   @JsonIgnore
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/NfsWorkaroundConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/NfsWorkaroundConfig.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/NfsWorkaroundConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/NfsWorkaroundConfig.java
index ed4a4d1..192ba4f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/NfsWorkaroundConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/NfsWorkaroundConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class NfsWorkaroundConfig {
 
   private boolean enabled = false;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SharedStorage.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/SharedStorage.java
similarity index 95%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SharedStorage.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/SharedStorage.java
index d2193c1..dc7482f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SharedStorage.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/SharedStorage.java
@@ -12,11 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
 import io.fabric8.kubernetes.api.model.LabelSelector;
 import io.fabric8.kubernetes.api.model.Quantity;
 
+@Deprecated
 public class SharedStorage {
   private ExternalPVCConfig externalPVC = new ExternalPVCConfig();
   private Quantity size;
@@ -55,6 +56,7 @@
     this.selector = selector;
   }
 
+  @Deprecated
   public class ExternalPVCConfig {
     private boolean enabled;
     private String claimName = "";
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SpannerRefDbConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/SpannerRefDbConfig.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SpannerRefDbConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/SpannerRefDbConfig.java
index eee7eab..43d0b3d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SpannerRefDbConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/SpannerRefDbConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class SpannerRefDbConfig {
   private String projectName;
   private String instance;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageClassConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/StorageClassConfig.java
similarity index 94%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageClassConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/StorageClassConfig.java
index de4906b..0477b6b 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageClassConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/StorageClassConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class StorageClassConfig {
 
   String readWriteOnce = "default";
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/StorageConfig.java
similarity index 94%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/StorageConfig.java
index 566ce6e..63c758e 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/StorageConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class StorageConfig {
 
   private StorageClassConfig storageClasses;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ZookeeperRefDbConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/ZookeeperRefDbConfig.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ZookeeperRefDbConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/ZookeeperRefDbConfig.java
index e90faeb..74c30c5 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ZookeeperRefDbConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/api/model/shared/ZookeeperRefDbConfig.java
@@ -12,8 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta1.api.model.shared;
 
+@Deprecated
 public class ZookeeperRefDbConfig {
   private String connectString;
   private String rootNode;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/GerritConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/GerritConfigBuilder.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/GerritConfigBuilder.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/GerritConfigBuilder.java
index 221704d..a118a0f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/GerritConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/GerritConfigBuilder.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.gerrit.config;
+package com.google.gerrit.k8s.operator.v1beta1.gerrit.config;
 
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.HTTP_PORT;
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.SSH_PORT;
@@ -20,10 +20,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.k8s.operator.gerrit.config.ConfigBuilder;
 import com.google.gerrit.k8s.operator.gerrit.config.RequiredOption;
-import com.google.gerrit.k8s.operator.gerrit.dependent.GerritService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.shared.IngressConfig;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -31,6 +30,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+@Deprecated
 public class GerritConfigBuilder extends ConfigBuilder {
   private static final Pattern PROTOCOL_PATTERN = Pattern.compile("^(https?)://.+");
 
@@ -166,7 +166,6 @@
     return new RequiredOption<String>(
         "sshd",
         "advertisedAddress",
-        gerrit.getSpec().getIngress().getFullHostnameForService(GerritService.getName(gerrit))
-            + ":29418");
+        gerrit.getSpec().getIngress().getHost() + ":" + gerrit.getSpec().getService().getSshPort());
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/HighAvailabilityPluginConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/HighAvailabilityPluginConfigBuilder.java
similarity index 91%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/HighAvailabilityPluginConfigBuilder.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/HighAvailabilityPluginConfigBuilder.java
index b96a93b..54d5d02 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/HighAvailabilityPluginConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/HighAvailabilityPluginConfigBuilder.java
@@ -12,19 +12,20 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.gerrit.config;
+package com.google.gerrit.k8s.operator.v1beta1.gerrit.config;
 
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.k8s.operator.gerrit.config.ConfigBuilder;
 import com.google.gerrit.k8s.operator.gerrit.config.RequiredOption;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.Gerrit;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+@Deprecated
 public class HighAvailabilityPluginConfigBuilder extends ConfigBuilder {
   public HighAvailabilityPluginConfigBuilder(Gerrit gerrit) {
     super(
@@ -55,7 +56,8 @@
   }
 
   private static Set<String> getLabels(Gerrit gerrit) {
-    Map<String, String> selectorLabels = GerritStatefulSet.getSelectorLabels(gerrit);
+    Map<String, String> selectorLabels =
+        GerritStatefulSet.getSelectorLabels(gerrit.getMetadata().getName());
     Set<String> labels = new HashSet<>();
     for (Map.Entry<String, String> label : selectorLabels.entrySet()) {
       labels.add(label.getKey() + "=" + label.getValue());
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/SpannerRefDbPluginConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/SpannerRefDbPluginConfigBuilder.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/SpannerRefDbPluginConfigBuilder.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/SpannerRefDbPluginConfigBuilder.java
index 0f3cb30..0fb510b 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/SpannerRefDbPluginConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/SpannerRefDbPluginConfigBuilder.java
@@ -12,15 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.gerrit.config;
+package com.google.gerrit.k8s.operator.v1beta1.gerrit.config;
 
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.k8s.operator.gerrit.config.ConfigBuilder;
 import com.google.gerrit.k8s.operator.gerrit.config.RequiredOption;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.Gerrit;
 import java.util.ArrayList;
 import java.util.List;
 
+@Deprecated
 public class SpannerRefDbPluginConfigBuilder extends ConfigBuilder {
   public SpannerRefDbPluginConfigBuilder(Gerrit gerrit) {
     super(
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
index aabb726..d560105 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta1/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
@@ -12,15 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.gerrit.config;
+package com.google.gerrit.k8s.operator.v1beta1.gerrit.config;
 
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.k8s.operator.gerrit.config.ConfigBuilder;
 import com.google.gerrit.k8s.operator.gerrit.config.RequiredOption;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta1.api.model.gerrit.Gerrit;
 import java.util.ArrayList;
 import java.util.List;
 
+@Deprecated
 public class ZookeeperRefDbPluginConfigBuilder extends ConfigBuilder {
   public ZookeeperRefDbPluginConfigBuilder(Gerrit gerrit) {
     super(
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritAdmissionWebhook.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GerritAdmissionWebhook.java
similarity index 90%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritAdmissionWebhook.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GerritAdmissionWebhook.java
index f74cb59..35bf15d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritAdmissionWebhook.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GerritAdmissionWebhook.java
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.admission.servlet;
+package com.google.gerrit.k8s.operator.v1beta2.admission.servlet;
 
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig.RefDatabase.SPANNER;
-import static com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig.RefDatabase.ZOOKEEPER;
+import static com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GlobalRefDbConfig.RefDatabase.SPANNER;
+import static com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GlobalRefDbConfig.RefDatabase.ZOOKEEPER;
 
 import com.google.gerrit.k8s.operator.gerrit.config.InvalidGerritConfigException;
 import com.google.gerrit.k8s.operator.server.ValidatingAdmissionWebhookServlet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig;
-import com.google.gerrit.k8s.operator.v1alpha.gerrit.config.GerritConfigBuilder;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GlobalRefDbConfig;
+import com.google.gerrit.k8s.operator.v1beta2.gerrit.config.GerritConfigBuilder;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.fabric8.kubernetes.api.model.Status;
@@ -111,6 +111,6 @@
 
   @Override
   public String getVersion() {
-    return "v1alpha";
+    return "v1beta1";
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritClusterAdmissionWebhook.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GerritClusterAdmissionWebhook.java
similarity index 92%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritClusterAdmissionWebhook.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GerritClusterAdmissionWebhook.java
index 8817559..c0b2937 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GerritClusterAdmissionWebhook.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GerritClusterAdmissionWebhook.java
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.admission.servlet;
+package com.google.gerrit.k8s.operator.v1beta2.admission.servlet;
 
 import com.google.gerrit.k8s.operator.server.ValidatingAdmissionWebhookServlet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.fabric8.kubernetes.api.model.Status;
@@ -98,6 +98,6 @@
 
   @Override
   public String getVersion() {
-    return "v1alpha";
+    return "v1beta1";
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GitGcAdmissionWebhook.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GitGcAdmissionWebhook.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GitGcAdmissionWebhook.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GitGcAdmissionWebhook.java
index 3198c1a..ada69a2 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/admission/servlet/GitGcAdmissionWebhook.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/admission/servlet/GitGcAdmissionWebhook.java
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.admission.servlet;
+package com.google.gerrit.k8s.operator.v1beta2.admission.servlet;
 
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.k8s.operator.server.ValidatingAdmissionWebhookServlet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollection;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollection;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import io.fabric8.kubernetes.api.model.HasMetadata;
@@ -109,6 +109,6 @@
 
   @Override
   public String getVersion() {
-    return "v1alpha";
+    return "v1beta1";
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritCluster.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritCluster.java
similarity index 97%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritCluster.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritCluster.java
index b88ab09..678f409 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritCluster.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritCluster.java
@@ -12,15 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.cluster;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.cluster;
 
 import static com.google.gerrit.k8s.operator.cluster.dependent.NfsIdmapdConfigMap.NFS_IDMAPD_CM_NAME;
 import static com.google.gerrit.k8s.operator.cluster.dependent.SharedPVC.SHARED_PVC_NAME;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.SharedStorage.ExternalPVCConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.SharedStorage.ExternalPVCConfig;
 import io.fabric8.kubernetes.api.model.Container;
 import io.fabric8.kubernetes.api.model.ContainerBuilder;
 import io.fabric8.kubernetes.api.model.EnvVar;
@@ -42,7 +42,7 @@
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha17")
+@Version("v1beta2")
 @ShortNames("gclus")
 public class GerritCluster extends CustomResource<GerritClusterSpec, GerritClusterStatus>
     implements Namespaced {
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritClusterSpec.java
similarity index 83%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterSpec.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritClusterSpec.java
index 956c678..3fa473c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritClusterSpec.java
@@ -12,14 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.cluster;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.cluster;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritClusterIngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritStorageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritClusterIngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritStorageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GlobalRefDbConfig;
 import java.util.ArrayList;
 import java.util.List;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterStatus.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritClusterStatus.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterStatus.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritClusterStatus.java
index a0b853d..d2cd3e0 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/cluster/GerritClusterStatus.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/cluster/GerritClusterStatus.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.cluster;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.cluster;
 
 import java.util.List;
 import java.util.Map;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/Gerrit.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/Gerrit.java
similarity index 94%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/Gerrit.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/Gerrit.java
index 4027cdd..e2ca53c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/Gerrit.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/Gerrit.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.fabric8.kubernetes.api.model.Namespaced;
@@ -24,7 +24,7 @@
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha17")
+@Version("v1beta2")
 @ShortNames("gcr")
 public class Gerrit extends CustomResource<GerritSpec, GerritStatus> implements Namespaced {
   private static final long serialVersionUID = 2L;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritDebugConfig.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritDebugConfig.java
index 7e7a5fd..d4839aa 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritDebugConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 public class GerritDebugConfig {
   private boolean enabled;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritInitConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritInitConfig.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritInitConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritInitConfig.java
index 82dc41f..b2c8828 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritInitConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritInitConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.List;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritModule.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritModule.java
similarity index 95%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritModule.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritModule.java
index 5b0f241..ba688e6 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritModule.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritModule.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import java.io.Serializable;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritPlugin.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritPlugin.java
similarity index 95%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritPlugin.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritPlugin.java
index 196ecb4..7bddf44 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritPlugin.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritPlugin.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritProbe.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritProbe.java
similarity index 96%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritProbe.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritProbe.java
index 46733ed..891b5ba 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritProbe.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritProbe.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSite.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritSite.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSite.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritSite.java
index 2b604c8..28c08b4 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSite.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritSite.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import io.fabric8.kubernetes.api.model.Quantity;
 import java.io.Serializable;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritSpec.java
similarity index 85%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSpec.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritSpec.java
index ed21087..061b13c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritSpec.java
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritStorageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritStorageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GlobalRefDbConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.IngressConfig;
 
 public class GerritSpec extends GerritTemplateSpec {
   private ContainerImageConfig containerImages = new ContainerImageConfig();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritStatus.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritStatus.java
similarity index 95%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritStatus.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritStatus.java
index f779f75..8f90e6d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritStatus.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritStatus.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplate.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritTemplate.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplate.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritTemplate.java
index 1144737..32c7e9f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplate.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritTemplate.java
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GlobalRefDbConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GlobalRefDbConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.IngressConfig;
 import io.fabric8.kubernetes.api.model.KubernetesResource;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplateSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritTemplateSpec.java
similarity index 97%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplateSpec.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritTemplateSpec.java
index 4349cd1..82fd916 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritTemplateSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gerrit/GerritTemplateSpec.java
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpSshServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.HttpSshServiceConfig;
 import io.fabric8.kubernetes.api.model.Affinity;
 import io.fabric8.kubernetes.api.model.ResourceRequirements;
 import io.fabric8.kubernetes.api.model.Toleration;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollection.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollection.java
similarity index 94%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollection.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollection.java
index 7d268bd..a7f4a05 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollection.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollection.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc;
 
 import io.fabric8.kubernetes.api.model.Namespaced;
 import io.fabric8.kubernetes.client.CustomResource;
@@ -24,7 +24,7 @@
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha1")
+@Version("v1beta2")
 @ShortNames("gitgc")
 @Plural("gitgcs")
 public class GitGarbageCollection
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollectionSpec.java
similarity index 97%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionSpec.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollectionSpec.java
index 7648f13..6d5d590 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollectionSpec.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc;
 
 import io.fabric8.kubernetes.api.model.Affinity;
 import io.fabric8.kubernetes.api.model.ResourceRequirements;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionStatus.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollectionStatus.java
similarity index 96%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionStatus.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollectionStatus.java
index ddff4c7..37b99f3 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gitgc/GitGarbageCollectionStatus.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/gitgc/GitGarbageCollectionStatus.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc;
 
 import java.util.HashSet;
 import java.util.Objects;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetwork.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/GerritNetwork.java
similarity index 95%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetwork.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/GerritNetwork.java
index 7596f54..d248327 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetwork.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/GerritNetwork.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.network;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.network;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.fabric8.kubernetes.api.model.Namespaced;
@@ -23,7 +23,7 @@
 import io.fabric8.kubernetes.model.annotation.Version;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha2")
+@Version("v1beta2")
 @ShortNames("gn")
 public class GerritNetwork extends CustomResource<GerritNetworkSpec, Status> implements Namespaced {
   private static final long serialVersionUID = 1L;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetworkSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/GerritNetworkSpec.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetworkSpec.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/GerritNetworkSpec.java
index 406341f..d238cd5 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/GerritNetworkSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/GerritNetworkSpec.java
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.network;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.network;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritClusterIngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritClusterIngressConfig;
 import java.util.ArrayList;
 import java.util.List;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMember.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/NetworkMember.java
similarity index 89%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMember.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/NetworkMember.java
index 433dbbe..5d5e6da 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMember.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/NetworkMember.java
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.network;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.network;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.HttpServiceConfig;
 
 public class NetworkMember {
   private String name;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMemberWithSsh.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/NetworkMemberWithSsh.java
similarity index 88%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMemberWithSsh.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/NetworkMemberWithSsh.java
index 1668739..85dd869 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/network/NetworkMemberWithSsh.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/network/NetworkMemberWithSsh.java
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.network;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.network;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpSshServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.HttpSshServiceConfig;
 
 public class NetworkMemberWithSsh extends NetworkMember {
   private int sshPort = 29418;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/Receiver.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/Receiver.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/Receiver.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/Receiver.java
index bc546df..c04f9b2 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/Receiver.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/Receiver.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.receiver;
 
 import io.fabric8.kubernetes.api.model.Namespaced;
 import io.fabric8.kubernetes.client.CustomResource;
@@ -23,7 +23,7 @@
 import org.apache.commons.lang3.builder.ToStringStyle;
 
 @Group("gerritoperator.google.com")
-@Version("v1alpha6")
+@Version("v1beta2")
 @ShortNames("grec")
 public class Receiver extends CustomResource<ReceiverSpec, ReceiverStatus> implements Namespaced {
   private static final long serialVersionUID = 1L;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverProbe.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverProbe.java
similarity index 96%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverProbe.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverProbe.java
index 78aaa58..5887f9d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverProbe.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverProbe.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.receiver;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.gerrit.k8s.operator.receiver.dependent.ReceiverDeployment;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverSpec.java
similarity index 85%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverSpec.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverSpec.java
index 005fa49..ec0e91e 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverSpec.java
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.receiver;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.StorageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.StorageConfig;
 
 public class ReceiverSpec extends ReceiverTemplateSpec {
   private ContainerImageConfig containerImages = new ContainerImageConfig();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverStatus.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverStatus.java
similarity index 94%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverStatus.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverStatus.java
index 915a62f..af0296f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverStatus.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverStatus.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.receiver;
 
 public class ReceiverStatus {
   private boolean ready;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplate.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverTemplate.java
similarity index 91%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplate.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverTemplate.java
index f559419..3e4835f 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplate.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverTemplate.java
@@ -12,16 +12,16 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.receiver;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.StorageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.StorageConfig;
 import io.fabric8.kubernetes.api.model.KubernetesResource;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplateSpec.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverTemplateSpec.java
similarity index 97%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplateSpec.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverTemplateSpec.java
index 22ee904..9b083c9 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/receiver/ReceiverTemplateSpec.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/receiver/ReceiverTemplateSpec.java
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.receiver;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.receiver;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.HttpServiceConfig;
 import io.fabric8.kubernetes.api.model.Affinity;
 import io.fabric8.kubernetes.api.model.IntOrString;
 import io.fabric8.kubernetes.api.model.ResourceRequirements;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/BusyBoxImage.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/BusyBoxImage.java
similarity index 95%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/BusyBoxImage.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/BusyBoxImage.java
index 5c5388f..f09849b 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/BusyBoxImage.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/BusyBoxImage.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ContainerImageConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/ContainerImageConfig.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ContainerImageConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/ContainerImageConfig.java
index 4f84824..f78695c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ContainerImageConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/ContainerImageConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import io.fabric8.kubernetes.api.model.LocalObjectReference;
 import java.util.HashSet;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritClusterIngressConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritClusterIngressConfig.java
similarity index 89%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritClusterIngressConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritClusterIngressConfig.java
index a915820..2351f99 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritClusterIngressConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritClusterIngressConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.util.Map;
@@ -24,6 +24,7 @@
   private GerritIngressTlsConfig tls = new GerritIngressTlsConfig();
   private GerritIngressSshConfig ssh = new GerritIngressSshConfig();
   private GerritIngressAmbassadorConfig ambassador = new GerritIngressAmbassadorConfig();
+  private GerritIstioConfig istio = new GerritIstioConfig();
 
   public boolean isEnabled() {
     return enabled;
@@ -73,6 +74,14 @@
     this.ambassador = ambassador;
   }
 
+  public GerritIstioConfig getIstio() {
+    return istio;
+  }
+
+  public void setIstio(GerritIstioConfig istio) {
+    this.istio = istio;
+  }
+
   @JsonIgnore
   public String getFullHostnameForService(String svcName) {
     return getFullHostnameForService(svcName, getHost());
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressAmbassadorConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressAmbassadorConfig.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressAmbassadorConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressAmbassadorConfig.java
index b34eb67..1c222ed 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressAmbassadorConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressAmbassadorConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import java.util.List;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressSshConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressSshConfig.java
similarity index 92%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressSshConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressSshConfig.java
index 6203803..024b2f0 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressSshConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressSshConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class GerritIngressSshConfig {
   private boolean enabled = false;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressTlsConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressTlsConfig.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressTlsConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressTlsConfig.java
index b4552f5..89f174a 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritIngressTlsConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIngressTlsConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class GerritIngressTlsConfig {
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIstioConfig.java
similarity index 60%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIstioConfig.java
index 7e7a5fd..88f84b1 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/gerrit/GerritDebugConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritIstioConfig.java
@@ -12,25 +12,18 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
-public class GerritDebugConfig {
-  private boolean enabled;
-  private boolean suspend;
+import java.util.Map;
 
-  public boolean isEnabled() {
-    return enabled;
+public class GerritIstioConfig {
+  private Map<String, String> gatewaySelector = Map.of("istio", "ingressgateway");
+
+  public Map<String, String> getGatewaySelector() {
+    return gatewaySelector;
   }
 
-  public void setEnabled(boolean enabled) {
-    this.enabled = enabled;
-  }
-
-  public boolean isSuspend() {
-    return suspend;
-  }
-
-  public void setSuspend(boolean suspend) {
-    this.suspend = suspend;
+  public void setGatewaySelector(Map<String, String> gatewaySelector) {
+    this.gatewaySelector = gatewaySelector;
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritRepositoryConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritRepositoryConfig.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritRepositoryConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritRepositoryConfig.java
index f593c1e..0c9a391 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritRepositoryConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritRepositoryConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritStorageConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritStorageConfig.java
similarity index 94%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritStorageConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritStorageConfig.java
index d66a0cd..a36411d 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GerritStorageConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GerritStorageConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class GerritStorageConfig extends StorageConfig {
   private PluginCacheConfig pluginCache = new PluginCacheConfig();
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GlobalRefDbConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GlobalRefDbConfig.java
similarity index 95%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GlobalRefDbConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GlobalRefDbConfig.java
index d338555..da40f83 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/GlobalRefDbConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/GlobalRefDbConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class GlobalRefDbConfig {
   private RefDatabase database = RefDatabase.NONE;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpServiceConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/HttpServiceConfig.java
similarity index 94%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpServiceConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/HttpServiceConfig.java
index 8e7d651..401c1df 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpServiceConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/HttpServiceConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import java.io.Serializable;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpSshServiceConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/HttpSshServiceConfig.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpSshServiceConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/HttpSshServiceConfig.java
index 8655c32..6a1e098 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/HttpSshServiceConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/HttpSshServiceConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import java.io.Serializable;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/IngressConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/IngressConfig.java
similarity index 93%
copy from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/IngressConfig.java
copy to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/IngressConfig.java
index f83b189..3b82a63 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/IngressConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/IngressConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
@@ -63,7 +63,7 @@
   public String getUrl() {
     String protocol = isTlsEnabled() ? "https" : "http";
     String hostname = getHost();
-    return String.format("%s://%s", protocol, hostname);
+    return String.format("%s://%s/", protocol, hostname);
   }
 
   @JsonIgnore
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/NfsWorkaroundConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/NfsWorkaroundConfig.java
similarity index 94%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/NfsWorkaroundConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/NfsWorkaroundConfig.java
index ed4a4d1..0cf047b 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/NfsWorkaroundConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/NfsWorkaroundConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class NfsWorkaroundConfig {
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SharedStorage.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/SharedStorage.java
similarity index 96%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SharedStorage.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/SharedStorage.java
index d2193c1..52bf97c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SharedStorage.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/SharedStorage.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 import io.fabric8.kubernetes.api.model.LabelSelector;
 import io.fabric8.kubernetes.api.model.Quantity;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SpannerRefDbConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/SpannerRefDbConfig.java
similarity index 94%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SpannerRefDbConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/SpannerRefDbConfig.java
index eee7eab..e0e7e58 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/SpannerRefDbConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/SpannerRefDbConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class SpannerRefDbConfig {
   private String projectName;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageClassConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/StorageClassConfig.java
similarity index 95%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageClassConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/StorageClassConfig.java
index de4906b..bfd7bd9 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageClassConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/StorageClassConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class StorageClassConfig {
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/StorageConfig.java
similarity index 95%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/StorageConfig.java
index 566ce6e..e5a0c91 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/StorageConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/StorageConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class StorageConfig {
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ZookeeperRefDbConfig.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/ZookeeperRefDbConfig.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ZookeeperRefDbConfig.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/ZookeeperRefDbConfig.java
index e90faeb..0f28ee6 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/api/model/shared/ZookeeperRefDbConfig.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/api/model/shared/ZookeeperRefDbConfig.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.api.model.shared;
+package com.google.gerrit.k8s.operator.v1beta2.api.model.shared;
 
 public class ZookeeperRefDbConfig {
   private String connectString;
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/GerritConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/GerritConfigBuilder.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/GerritConfigBuilder.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/GerritConfigBuilder.java
index 221704d..934917c 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/GerritConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/GerritConfigBuilder.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.gerrit.config;
+package com.google.gerrit.k8s.operator.v1beta2.gerrit.config;
 
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.HTTP_PORT;
 import static com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet.SSH_PORT;
@@ -20,10 +20,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.k8s.operator.gerrit.config.ConfigBuilder;
 import com.google.gerrit.k8s.operator.gerrit.config.RequiredOption;
-import com.google.gerrit.k8s.operator.gerrit.dependent.GerritService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.IngressConfig;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -166,7 +165,6 @@
     return new RequiredOption<String>(
         "sshd",
         "advertisedAddress",
-        gerrit.getSpec().getIngress().getFullHostnameForService(GerritService.getName(gerrit))
-            + ":29418");
+        gerrit.getSpec().getIngress().getHost() + ":" + gerrit.getSpec().getService().getSshPort());
   }
 }
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/HighAvailabilityPluginConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/HighAvailabilityPluginConfigBuilder.java
similarity index 92%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/HighAvailabilityPluginConfigBuilder.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/HighAvailabilityPluginConfigBuilder.java
index b96a93b..f5410dc 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/HighAvailabilityPluginConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/HighAvailabilityPluginConfigBuilder.java
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.gerrit.config;
+package com.google.gerrit.k8s.operator.v1beta2.gerrit.config;
 
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.k8s.operator.gerrit.config.ConfigBuilder;
 import com.google.gerrit.k8s.operator.gerrit.config.RequiredOption;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritStatefulSet;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -55,7 +55,8 @@
   }
 
   private static Set<String> getLabels(Gerrit gerrit) {
-    Map<String, String> selectorLabels = GerritStatefulSet.getSelectorLabels(gerrit);
+    Map<String, String> selectorLabels =
+        GerritStatefulSet.getSelectorLabels(gerrit.getMetadata().getName());
     Set<String> labels = new HashSet<>();
     for (Map.Entry<String, String> label : selectorLabels.entrySet()) {
       labels.add(label.getKey() + "=" + label.getValue());
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/SpannerRefDbPluginConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/SpannerRefDbPluginConfigBuilder.java
similarity index 94%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/SpannerRefDbPluginConfigBuilder.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/SpannerRefDbPluginConfigBuilder.java
index 0f3cb30..75411fd 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/SpannerRefDbPluginConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/SpannerRefDbPluginConfigBuilder.java
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.gerrit.config;
+package com.google.gerrit.k8s.operator.v1beta2.gerrit.config;
 
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.k8s.operator.gerrit.config.ConfigBuilder;
 import com.google.gerrit.k8s.operator.gerrit.config.RequiredOption;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
 import java.util.ArrayList;
 import java.util.List;
 
diff --git a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
similarity index 93%
rename from operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
rename to operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
index aabb726..1285b88 100644
--- a/operator/src/main/java/com/google/gerrit/k8s/operator/v1alpha/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
+++ b/operator/src/main/java/com/google/gerrit/k8s/operator/v1beta2/gerrit/config/ZookeeperRefDbPluginConfigBuilder.java
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.k8s.operator.v1alpha.gerrit.config;
+package com.google.gerrit.k8s.operator.v1beta2.gerrit.config;
 
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.k8s.operator.gerrit.config.ConfigBuilder;
 import com.google.gerrit.k8s.operator.gerrit.config.RequiredOption;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
 import java.util.ArrayList;
 import java.util.List;
 
diff --git a/operator/src/main/resources/META-INF/services/io.fabric8.kubernetes.api.model.KubernetesResource b/operator/src/main/resources/META-INF/services/io.fabric8.kubernetes.api.model.KubernetesResource
index 6fb15ac..8dade57 100644
--- a/operator/src/main/resources/META-INF/services/io.fabric8.kubernetes.api.model.KubernetesResource
+++ b/operator/src/main/resources/META-INF/services/io.fabric8.kubernetes.api.model.KubernetesResource
@@ -1,5 +1,5 @@
-com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster
-com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit
-com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollection
-com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver
-com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork
\ No newline at end of file
+com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster
+com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit
+com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollection
+com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver
+com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/cluster/GerritRepositoryConfigTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/cluster/GerritRepositoryConfigTest.java
index 5474780..2704937 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/cluster/GerritRepositoryConfigTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/cluster/GerritRepositoryConfigTest.java
@@ -18,7 +18,7 @@
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritRepositoryConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritRepositoryConfig;
 import org.junit.jupiter.api.Test;
 
 public class GerritRepositoryConfigTest {
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/ClusterManagedGerritWithIngressE2E.java b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/ClusterManagedGerritWithIngressE2E.java
index c848aa9..03b797c 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/ClusterManagedGerritWithIngressE2E.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/ClusterManagedGerritWithIngressE2E.java
@@ -30,8 +30,8 @@
 import com.google.gerrit.k8s.operator.network.IngressType;
 import com.google.gerrit.k8s.operator.test.AbstractGerritOperatorE2ETest;
 import com.google.gerrit.k8s.operator.test.TestGerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
 import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
 import io.fabric8.kubernetes.api.model.networking.v1.IngressLoadBalancerIngress;
 import io.fabric8.kubernetes.api.model.networking.v1.IngressStatus;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/ClusterManagedGerritWithIstioE2E.java b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/ClusterManagedGerritWithIstioE2E.java
index fdf5ccb..edfa6bf 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/ClusterManagedGerritWithIstioE2E.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/ClusterManagedGerritWithIstioE2E.java
@@ -28,8 +28,8 @@
 import com.google.gerrit.k8s.operator.network.IngressType;
 import com.google.gerrit.k8s.operator.test.AbstractGerritOperatorE2ETest;
 import com.google.gerrit.k8s.operator.test.TestGerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
 import org.junit.jupiter.api.Test;
 
 public class ClusterManagedGerritWithIstioE2E extends AbstractGerritOperatorE2ETest {
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/GerritConfigReconciliationE2E.java b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/GerritConfigReconciliationE2E.java
index 342d524..47e3b29 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/GerritConfigReconciliationE2E.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/GerritConfigReconciliationE2E.java
@@ -23,10 +23,10 @@
 import com.google.gerrit.k8s.operator.network.IngressType;
 import com.google.gerrit.k8s.operator.test.AbstractGerritOperatorE2ETest;
 import com.google.gerrit.k8s.operator.test.TestGerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.HttpSshServiceConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.HttpSshServiceConfig;
 import java.util.HashMap;
 import java.util.Map;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/StandaloneGerritE2E.java b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/StandaloneGerritE2E.java
index b7359ab..395bcb3 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/StandaloneGerritE2E.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/StandaloneGerritE2E.java
@@ -19,7 +19,7 @@
 import com.google.gerrit.k8s.operator.network.IngressType;
 import com.google.gerrit.k8s.operator.test.AbstractGerritOperatorE2ETest;
 import com.google.gerrit.k8s.operator.test.TestGerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
 import org.junit.jupiter.api.Test;
 
 public class StandaloneGerritE2E extends AbstractGerritOperatorE2ETest {
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/config/GerritConfigBuilderTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/config/GerritConfigBuilderTest.java
index cedcebb..e3ebccc 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/config/GerritConfigBuilderTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/gerrit/config/GerritConfigBuilderTest.java
@@ -18,10 +18,10 @@
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.gerrit.config.GerritConfigBuilder;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.gerrit.config.GerritConfigBuilder;
 import java.util.Map;
 import java.util.Set;
 import org.assertj.core.util.Arrays;
@@ -72,7 +72,7 @@
     gerrit.setSpec(gerritSpec);
     Config cfg = new GerritConfigBuilder(gerrit).build();
     assertTrue(
-        cfg.getString("gerrit", null, "canonicalWebUrl").equals("http://gerrit.example.com"));
+        cfg.getString("gerrit", null, "canonicalWebUrl").equals("http://gerrit.example.com/"));
   }
 
   private Gerrit createGerrit(String configText) {
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/gitgc/GitGarbageCollectionE2E.java b/operator/src/test/java/com/google/gerrit/k8s/operator/gitgc/GitGarbageCollectionE2E.java
index 7f31ac2..0f84d3a 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/gitgc/GitGarbageCollectionE2E.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/gitgc/GitGarbageCollectionE2E.java
@@ -27,9 +27,9 @@
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.k8s.operator.network.IngressType;
 import com.google.gerrit.k8s.operator.test.AbstractGerritOperatorE2ETest;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollection;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollectionSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollectionStatus;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollection;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollectionSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollectionStatus;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
 import io.fabric8.kubernetes.api.model.batch.v1.CronJob;
 import io.fabric8.kubernetes.api.model.batch.v1.Job;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterAmbassadorTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterAmbassadorTest.java
index 3f5a9cd..f332384 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterAmbassadorTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/network/ambassador/dependent/GerritClusterAmbassadorTest.java
@@ -16,7 +16,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.getambassador.v2.Host;
 import io.getambassador.v2.Mapping;
 import io.getambassador.v2.TLSContext;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/network/ingress/dependent/GerritClusterIngressTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/network/ingress/dependent/GerritClusterIngressTest.java
index a2e6a24..60aa325 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/network/ingress/dependent/GerritClusterIngressTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/network/ingress/dependent/GerritClusterIngressTest.java
@@ -16,7 +16,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
 import io.javaoperatorsdk.operator.ReconcilerUtils;
 import java.util.stream.Stream;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioTest.java
index eaed636..606d22c 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/network/istio/dependent/GerritClusterIstioTest.java
@@ -16,7 +16,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
 import io.fabric8.istio.api.networking.v1beta1.Gateway;
 import io.fabric8.istio.api.networking.v1beta1.VirtualService;
 import io.javaoperatorsdk.operator.ReconcilerUtils;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/receiver/AbstractClusterManagedReceiverE2E.java b/operator/src/test/java/com/google/gerrit/k8s/operator/receiver/AbstractClusterManagedReceiverE2E.java
index 557e140..74f90da 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/receiver/AbstractClusterManagedReceiverE2E.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/receiver/AbstractClusterManagedReceiverE2E.java
@@ -22,11 +22,11 @@
 import com.google.gerrit.k8s.operator.test.AbstractGerritOperatorE2ETest;
 import com.google.gerrit.k8s.operator.test.ReceiverUtil;
 import com.google.gerrit.k8s.operator.test.TestGerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplateSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverTemplateSpec;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
 import java.io.File;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverTest.java
index 8698b1a..f9d813f 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/receiver/dependent/ReceiverTest.java
@@ -16,7 +16,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
 import io.fabric8.kubernetes.api.model.Service;
 import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.javaoperatorsdk.operator.ReconcilerUtils;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/server/GerritAdmissionWebhookTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/server/GerritAdmissionWebhookTest.java
index 32b342d..e05a511 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/server/GerritAdmissionWebhookTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/server/GerritAdmissionWebhookTest.java
@@ -20,14 +20,14 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gerrit.k8s.operator.test.TestAdmissionWebhookServer;
-import com.google.gerrit.k8s.operator.v1alpha.admission.servlet.GerritAdmissionWebhook;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritClusterSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritClusterIngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.admission.servlet.GerritAdmissionWebhook;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritClusterSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritClusterIngressConfig;
 import io.fabric8.kubernetes.api.model.DefaultKubernetesResourceList;
 import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
@@ -73,9 +73,9 @@
   @BeforeAll
   public void setup() throws Exception {
     KubernetesDeserializer.registerCustomKind(
-        "gerritoperator.google.com/v1alpha2", "Gerrit", Gerrit.class);
+        "gerritoperator.google.com/v1beta1", "Gerrit", Gerrit.class);
     KubernetesDeserializer.registerCustomKind(
-        "gerritoperator.google.com/v1alpha1", "Receiver", Receiver.class);
+        "gerritoperator.google.com/v1beta1", "Receiver", Receiver.class);
     server = new TestAdmissionWebhookServer();
 
     kubernetesServer.before();
@@ -158,7 +158,7 @@
       throws MalformedURLException, IOException {
     HttpURLConnection http =
         (HttpURLConnection)
-            new URL("http://localhost:8080/admission/v1alpha/gerrit").openConnection();
+            new URL("http://localhost:8080/admission/v1beta1/gerrit").openConnection();
     http.setRequestMethod(HttpMethod.POST.asString());
     http.setRequestProperty("Content-Type", "application/json");
     http.setDoOutput(true);
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/server/GerritClusterAdmissionWebhookTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/server/GerritClusterAdmissionWebhookTest.java
index 55526c7..be46be3 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/server/GerritClusterAdmissionWebhookTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/server/GerritClusterAdmissionWebhookTest.java
@@ -23,15 +23,15 @@
 import com.google.gerrit.k8s.operator.test.TestAdmissionWebhookServer;
 import com.google.gerrit.k8s.operator.test.TestGerrit;
 import com.google.gerrit.k8s.operator.test.TestGerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.admission.servlet.GerritAdmissionWebhook;
-import com.google.gerrit.k8s.operator.v1alpha.admission.servlet.GerritClusterAdmissionWebhook;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplateSpec;
+import com.google.gerrit.k8s.operator.v1beta2.admission.servlet.GerritAdmissionWebhook;
+import com.google.gerrit.k8s.operator.v1beta2.admission.servlet.GerritClusterAdmissionWebhook;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverTemplateSpec;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
 import io.fabric8.kubernetes.api.model.admission.v1.AdmissionRequest;
@@ -63,11 +63,11 @@
   @BeforeAll
   public void setup() throws Exception {
     KubernetesDeserializer.registerCustomKind(
-        "gerritoperator.google.com/v1alpha2", "Gerrit", Gerrit.class);
+        "gerritoperator.google.com/v1beta1", "Gerrit", Gerrit.class);
     KubernetesDeserializer.registerCustomKind(
-        "gerritoperator.google.com/v1alpha2", "GerritCluster", GerritCluster.class);
+        "gerritoperator.google.com/v1beta1", "GerritCluster", GerritCluster.class);
     KubernetesDeserializer.registerCustomKind(
-        "gerritoperator.google.com/v1alpha2", "Receiver", Receiver.class);
+        "gerritoperator.google.com/v1beta1", "Receiver", Receiver.class);
     server = new TestAdmissionWebhookServer();
 
     kubernetesServer.before();
@@ -171,7 +171,7 @@
       throws MalformedURLException, IOException {
     HttpURLConnection http =
         (HttpURLConnection)
-            new URL("http://localhost:8080/admission/v1alpha/gerritcluster").openConnection();
+            new URL("http://localhost:8080/admission/v1beta1/gerritcluster").openConnection();
     http.setRequestMethod(HttpMethod.POST.asString());
     http.setRequestProperty("Content-Type", "application/json");
     http.setDoOutput(true);
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/server/GitGcAdmissionWebhookTest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/server/GitGcAdmissionWebhookTest.java
index 5553e95..fd100bd 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/server/GitGcAdmissionWebhookTest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/server/GitGcAdmissionWebhookTest.java
@@ -20,10 +20,10 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gerrit.k8s.operator.test.TestAdmissionWebhookServer;
-import com.google.gerrit.k8s.operator.v1alpha.admission.servlet.GitGcAdmissionWebhook;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollection;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollectionSpec;
+import com.google.gerrit.k8s.operator.v1beta2.admission.servlet.GitGcAdmissionWebhook;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollection;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollectionSpec;
 import io.fabric8.kubernetes.api.model.DefaultKubernetesResourceList;
 import io.fabric8.kubernetes.api.model.HasMetadata;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
@@ -65,9 +65,9 @@
   @BeforeAll
   public void setup() throws Exception {
     KubernetesDeserializer.registerCustomKind(
-        "gerritoperator.google.com/v1alpha16", "GerritCluster", GerritCluster.class);
+        "gerritoperator.google.com/v1beta1", "GerritCluster", GerritCluster.class);
     KubernetesDeserializer.registerCustomKind(
-        "gerritoperator.google.com/v1alpha1", "GitGarbageCollection", GitGarbageCollection.class);
+        "gerritoperator.google.com/v1beta1", "GitGarbageCollection", GitGarbageCollection.class);
     server = new TestAdmissionWebhookServer();
 
     kubernetesServer.before();
@@ -232,7 +232,7 @@
       throws MalformedURLException, IOException {
     HttpURLConnection http =
         (HttpURLConnection)
-            new URL("http://localhost:8080/admission/v1alpha/gitgc").openConnection();
+            new URL("http://localhost:8080/admission/v1beta1/gitgc").openConnection();
     http.setRequestMethod(HttpMethod.POST.asString());
     http.setRequestProperty("Content-Type", "application/json");
     http.setDoOutput(true);
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/test/AbstractGerritOperatorE2ETest.java b/operator/src/test/java/com/google/gerrit/k8s/operator/test/AbstractGerritOperatorE2ETest.java
index ee1aa01..c974320 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/test/AbstractGerritOperatorE2ETest.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/test/AbstractGerritOperatorE2ETest.java
@@ -21,11 +21,11 @@
 import com.google.gerrit.k8s.operator.network.GerritNetworkReconcilerProvider;
 import com.google.gerrit.k8s.operator.network.IngressType;
 import com.google.gerrit.k8s.operator.receiver.ReceiverReconciler;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gitgc.GitGarbageCollection;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.network.GerritNetwork;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.Receiver;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gitgc.GitGarbageCollection;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.network.GerritNetwork;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.Receiver;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.api.model.SecretBuilder;
 import io.fabric8.kubernetes.client.Config;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/test/ReceiverUtil.java b/operator/src/test/java/com/google/gerrit/k8s/operator/test/ReceiverUtil.java
index b6cdc5a..cd053ca 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/test/ReceiverUtil.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/test/ReceiverUtil.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.k8s.operator.test;
 
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.api.model.SecretBuilder;
 import java.net.HttpURLConnection;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/test/TestGerrit.java b/operator/src/test/java/com/google/gerrit/k8s/operator/test/TestGerrit.java
index 5762ea5..047cc90 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/test/TestGerrit.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/test/TestGerrit.java
@@ -26,18 +26,18 @@
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritConfigMap;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritInitConfigMap;
 import com.google.gerrit.k8s.operator.gerrit.dependent.GerritService;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.Gerrit;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritSite;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplateSpec.GerritMode;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritRepositoryConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritStorageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.IngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.SharedStorage;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.StorageClassConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.Gerrit;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritSite;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplateSpec.GerritMode;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritRepositoryConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritStorageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.IngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.SharedStorage;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.StorageClassConfig;
 import io.fabric8.kubernetes.api.model.LocalObjectReference;
 import io.fabric8.kubernetes.api.model.ObjectMeta;
 import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
diff --git a/operator/src/test/java/com/google/gerrit/k8s/operator/test/TestGerritCluster.java b/operator/src/test/java/com/google/gerrit/k8s/operator/test/TestGerritCluster.java
index ce66ec2..9251bf0 100644
--- a/operator/src/test/java/com/google/gerrit/k8s/operator/test/TestGerritCluster.java
+++ b/operator/src/test/java/com/google/gerrit/k8s/operator/test/TestGerritCluster.java
@@ -25,18 +25,18 @@
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.api.GerritApi;
 import com.google.gerrit.k8s.operator.network.IngressType;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritCluster;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.cluster.GerritClusterSpec;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.gerrit.GerritTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.receiver.ReceiverTemplate;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.ContainerImageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritClusterIngressConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritIngressTlsConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritRepositoryConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.GerritStorageConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.NfsWorkaroundConfig;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.SharedStorage;
-import com.google.gerrit.k8s.operator.v1alpha.api.model.shared.StorageClassConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritCluster;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.cluster.GerritClusterSpec;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.gerrit.GerritTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.receiver.ReceiverTemplate;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.ContainerImageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritClusterIngressConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritIngressTlsConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritRepositoryConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.GerritStorageConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.NfsWorkaroundConfig;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.SharedStorage;
+import com.google.gerrit.k8s.operator.v1beta2.api.model.shared.StorageClassConfig;
 import com.urswolfer.gerrit.client.rest.GerritAuthData;
 import com.urswolfer.gerrit.client.rest.GerritRestApiFactory;
 import io.fabric8.kubernetes.api.model.LocalObjectReference;
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary.yaml
index 68b81f5..d699535 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica.yaml
index 443e465..d6f8209 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica_ssh.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica_ssh.yaml
index 623890f..35f8a53 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica_ssh.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica_ssh.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica_tls.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica_tls.yaml
index 21b9e59..84706b9 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica_tls.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_replica_tls.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_ssh.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_ssh.yaml
index a6b3271..be3a4fd 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_ssh.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_primary_ssh.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica.yaml
index e6da865..4a4ffa9 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica_ssh.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica_ssh.yaml
index 7efc649..05b3f12 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica_ssh.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica_ssh.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica_tls.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica_tls.yaml
index d5bd3c0..e871255 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica_tls.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_receiver_replica_tls.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_replica.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_replica.yaml
index 915da97..f9902fe 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_replica.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_replica.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_replica_ssh.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_replica_ssh.yaml
index efa54a7..a836bd7 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_replica_ssh.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/gerritnetwork_replica_ssh.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha1"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: GerritNetwork
 metadata:
   name: gerrit
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary.yaml
index 9b18d5c..a45192b 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary.yaml
@@ -6,6 +6,11 @@
   annotations:
     nginx.ingress.kubernetes.io/use-regex: true
     kubernetes.io/ingress.class: nginx
+    nginx.ingress.kubernetes.io/configuration-snippet: |-
+      location ~ ^(/a)?/plugins/high-availability/.*$ {
+        deny all;
+        return 403;
+      }
     nginx.ingress.kubernetes.io/affinity: cookie
     nginx.ingress.kubernetes.io/session-cookie-name: Gerrit_Session
     nginx.ingress.kubernetes.io/session-cookie-path: /
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary_replica.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary_replica.yaml
index d6aae78..e0cecf1 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary_replica.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary_replica.yaml
@@ -7,6 +7,10 @@
     nginx.ingress.kubernetes.io/use-regex: true
     kubernetes.io/ingress.class: nginx
     nginx.ingress.kubernetes.io/configuration-snippet: |-
+      location ~ ^(/a)?/plugins/high-availability/.*$ {
+        deny all;
+        return 403;
+      }
       if ($args ~ service=git-upload-pack){
         set $proxy_upstream_name "gerrit-replica-http";
         set $proxy_host $proxy_upstream_name;
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary_replica_tls.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary_replica_tls.yaml
index adbe808..e0aa83e 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary_replica_tls.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_primary_replica_tls.yaml
@@ -7,6 +7,10 @@
     nginx.ingress.kubernetes.io/use-regex: true
     kubernetes.io/ingress.class: nginx
     nginx.ingress.kubernetes.io/configuration-snippet: |-
+      location ~ ^(/a)?/plugins/high-availability/.*$ {
+        deny all;
+        return 403;
+      }
       if ($args ~ service=git-upload-pack){
         set $proxy_upstream_name "gerrit-replica-http";
         set $proxy_host $proxy_upstream_name;
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_receiver_replica.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_receiver_replica.yaml
index 75a37c7..093dac7 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_receiver_replica.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_receiver_replica.yaml
@@ -23,7 +23,7 @@
     http:
       paths:
       - pathType: Prefix
-        path: "/a/projects"
+        path: "/a/projects/.*"
         backend:
           service:
             name: receiver
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_receiver_replica_tls.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_receiver_replica_tls.yaml
index ad4cfbf..839827b 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_receiver_replica_tls.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/ingress/dependent/ingress_receiver_replica_tls.yaml
@@ -27,7 +27,7 @@
     http:
       paths:
       - pathType: Prefix
-        path: "/a/projects"
+        path: "/a/projects/.*"
         backend:
           service:
             name: receiver
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary.yaml
index ab1bf7a..1941ffc 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary.yaml
@@ -9,6 +9,20 @@
   gateways:
   - gerrit/gerrit-istio-gateway
   http:
+  - name: forbidden-routes-primary
+    route:
+    - destination:
+        port:
+          number: 48080
+        host: primary.gerrit.svc.cluster.local
+    match:
+    - uri:
+        regex: "^(/a)?/plugins/high-availability/.*$"
+    fault:
+      abort:
+        percentage:
+          value: 100.0
+        httpStatus: 403
   - name: gerrit-primary-primary
     route:
     - destination:
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_replica.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_replica.yaml
index f97524d..c583a5b 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_replica.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_replica.yaml
@@ -12,7 +12,7 @@
   - name: gerrit-replica-replica
     match:
     - uri:
-        regex: "^/(.*)/info/refs$"
+        regex: "/.*/info/refs"
       queryParams:
         service:
           exact: git-upload-pack
@@ -20,7 +20,7 @@
       method:
         exact: GET
     - uri:
-        regex: "^/(.*)/git-upload-pack$"
+        regex: "/.*/git-upload-pack"
       ignoreUriCase: true
       method:
         exact: POST
@@ -29,6 +29,20 @@
         port:
           number: 48080
         host: replica.gerrit.svc.cluster.local
+  - name: forbidden-routes-primary
+    route:
+    - destination:
+        port:
+          number: 48080
+        host: primary.gerrit.svc.cluster.local
+    match:
+    - uri:
+        regex: "^(/a)?/plugins/high-availability/.*$"
+    fault:
+      abort:
+        percentage:
+          value: 100.0
+        httpStatus: 403
   - name: gerrit-primary-primary
     route:
     - destination:
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_replica_ssh.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_replica_ssh.yaml
index 30ffb44..c4b7751 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_replica_ssh.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_replica_ssh.yaml
@@ -12,7 +12,7 @@
   - name: gerrit-replica-replica
     match:
     - uri:
-        regex: "^/(.*)/info/refs$"
+        regex: "/.*/info/refs"
       queryParams:
         service:
           exact: git-upload-pack
@@ -20,7 +20,7 @@
       method:
         exact: GET
     - uri:
-        regex: "^/(.*)/git-upload-pack$"
+        regex: "/.*/git-upload-pack"
       ignoreUriCase: true
       method:
         exact: POST
@@ -29,6 +29,20 @@
         port:
           number: 48080
         host: replica.gerrit.svc.cluster.local
+  - name: forbidden-routes-primary
+    route:
+    - destination:
+        port:
+          number: 48080
+        host: primary.gerrit.svc.cluster.local
+    match:
+    - uri:
+        regex: "^(/a)?/plugins/high-availability/.*$"
+    fault:
+      abort:
+        percentage:
+          value: 100.0
+        httpStatus: 403
   - name: gerrit-primary-primary
     route:
     - destination:
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_ssh.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_ssh.yaml
index 73f5bd7..fcba026 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_ssh.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_primary_ssh.yaml
@@ -9,6 +9,20 @@
   gateways:
   - gerrit/gerrit-istio-gateway
   http:
+  - name: forbidden-routes-primary
+    route:
+    - destination:
+        port:
+          number: 48080
+        host: primary.gerrit.svc.cluster.local
+    match:
+    - uri:
+        regex: "^(/a)?/plugins/high-availability/.*$"
+    fault:
+      abort:
+        percentage:
+          value: 100.0
+        httpStatus: 403
   - name: gerrit-primary-primary
     route:
     - destination:
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_receiver_replica.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_receiver_replica.yaml
index 3a224d6..3c61877 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_receiver_replica.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_receiver_replica.yaml
@@ -12,11 +12,11 @@
   - name: receiver-receiver
     match:
     - uri:
-        prefix: "/a/projects/"
+        regex: "/a/projects/.*"
     - uri:
-        regex: "^/(.*)/git-receive-pack$"
+        regex: "/.*/git-receive-pack"
     - uri:
-        regex: "^/(.*)/info/refs$"
+        regex: "/.*/info/refs"
       queryParams:
         service:
           exact: git-receive-pack
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_receiver_replica_ssh.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_receiver_replica_ssh.yaml
index 422e2e9..a21d5cf 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_receiver_replica_ssh.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/network/istio/dependent/virtualservice_receiver_replica_ssh.yaml
@@ -12,11 +12,11 @@
   - name: receiver-receiver
     match:
     - uri:
-        prefix: "/a/projects/"
+        regex: "/a/projects/.*"
     - uri:
-        regex: "^/(.*)/git-receive-pack$"
+        regex: "/.*/git-receive-pack"
     - uri:
-        regex: "^/(.*)/info/refs$"
+        regex: "/.*/info/refs"
       queryParams:
         service:
           exact: git-receive-pack
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/receiver.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/receiver.yaml
index 3364ba0..3d0ec06 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/receiver.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/receiver.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha6"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: Receiver
 metadata:
   name: receiver
diff --git a/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/receiver_minimal.yaml b/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/receiver_minimal.yaml
index 8fdf155..396849b 100644
--- a/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/receiver_minimal.yaml
+++ b/operator/src/test/resources/com/google/gerrit/k8s/operator/receiver/receiver_minimal.yaml
@@ -1,4 +1,4 @@
-apiVersion: "gerritoperator.google.com/v1alpha6"
+apiVersion: "gerritoperator.google.com/v1beta2"
 kind: Receiver
 metadata:
   name: receiver
diff --git a/operator/tools/newCRDVersion b/operator/tools/newCRDVersion
new file mode 100755
index 0000000..7c73355
--- /dev/null
+++ b/operator/tools/newCRDVersion
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+usage() {
+    me=`basename "$0"`
+    echo >&2 "Usage: $me [--help] [--osx] [--delete DELETE_VERSION] OLD NEW"
+    exit 1
+}
+
+while test $# -gt 0 ; do
+  case "$1" in
+  --help)
+    usage
+    ;;
+
+  --delete)
+    shift
+    DELETE_VERSION=$1
+    shift
+    ;;
+
+  --osx)
+    shift
+    export BACKUP_EXT=""
+    ;;
+
+  *)
+    break
+  esac
+done
+
+OLD="$1"
+shift
+NEW="$1"
+
+if test -z "$OLD" || test -z "$NEW"; then
+    usage
+fi
+
+SCRIPT_PATH="$(dirname "$(readlink -f "$0")")"
+API_PATH="$SCRIPT_PATH/../src/main/java/com/google/gerrit/k8s/operator"
+
+# Copy old version
+cp -R "$API_PATH/$OLD" "$API_PATH/$NEW"
+
+# Adapt references to use new version
+find $SCRIPT_PATH/../src \
+    -path "$SCRIPT_PATH/../src/main/java/com/google/gerrit/k8s/operator/$OLD" \
+    -prune \
+    -o \
+    -type f \
+    -exec sed -i ${BACKUP_EXT+"$BACKUP_EXT"} "s/com.google.gerrit.k8s.operator.$OLD/com.google.gerrit.k8s.operator.$NEW/g" {} ';'
+
+if test -n "$DELETE_VERSION"; then
+  sed -i ${BACKUP_EXT+"$BACKUP_EXT"} "s/$DELETE_VERSION/$NEW/g" "$SCRIPT_PATH/../src/main/java/com/google/gerrit/k8s/operator/Constants.java"
+else
+  sed -i ${BACKUP_EXT+"$BACKUP_EXT"} "s/\"$OLD\"/\"$OLD\", \"$NEW\"/g" "$SCRIPT_PATH/../src/main/java/com/google/gerrit/k8s/operator/Constants.java"
+fi
+
+find $SCRIPT_PATH/.. \
+    -name '*.yaml' \
+    -type f \
+    -exec sed -i ${BACKUP_EXT+"$BACKUP_EXT"} "s#gerritoperator.google.com/$OLD#gerritoperator.google.com/$NEW#g" {} ';'
+
+find $SCRIPT_PATH/../src/main/java/com/google/gerrit/k8s/operator/$NEW \
+    -type f \
+    -exec sed -i ${BACKUP_EXT+"$BACKUP_EXT"} "s/@Version(\"$OLD\")/@Version(\"$NEW\")/g" {} ';'
+
+find $SCRIPT_PATH/../src/main/java/com/google/gerrit/k8s/operator/$OLD \
+    -type f \
+    -exec sed -i ${BACKUP_EXT+"$BACKUP_EXT"} "s/@Version(\"$OLD\")/@Version(value = \"$OLD\", storage = false)/g" {} ';'
+
+find $SCRIPT_PATH/../src/main/java/com/google/gerrit/k8s/operator/$OLD \
+    -type f \
+    -exec sed -i ${BACKUP_EXT+"$BACKUP_EXT"} "s/public class/@Deprecated\npublic class/g" {} ';'
+
+sed -i ${BACKUP_EXT+"$BACKUP_EXT"} "s#$OLD#$NEW#g" $SCRIPT_PATH/../../Documentation/operator-api-reference.md
+
+if test -n "$DELETE_VERSION"; then
+    rm -rf $SCRIPT_PATH/../src/main/java/com/google/gerrit/k8s/operator/$DELETE_VERSION
+fi