Repository: crossplane-contrib/provider-gitlab (go)

Issue:
DeployKey resource fails with apparent type error
I'm attempting to create a DeployKey in my Group/Project

Following the guide, I've set `projectId` in the `spec.forProvider` - I had to set it to a string, because it's apparently enforced by the openid spec. Annotations are also strings, so the externalName will be a string.

I managed to get it to Ready state once, but I eventually get this error and it fails to sync again:

```
  Warning  CannotUpdateExternalResource   72s                   managed/deploykey.projects.gitlab.crossplane.io  cannot update Gitlab deploy key: invalid ID type (*string)(0xc0013d7580), the ID must be an int or a string
```

Near as I can tell, this is similar to another error that I worked around by setting `crossplane.io/external-name` to a value, even though I was in `Create` mode not `Observe` - the original message was insisting that external-name should be an int, but annotations cannot be ints, so I set it to an int value in string format, which was enough to get past the snakes there.

But evidently something in here didn't like that, and it wouldn't last.

Here is my DeployKey, names and places changed to protect the innocent:

```yaml
---
apiVersion: projects.gitlab.crossplane.io/v1alpha1
kind: DeployKey
metadata:
  name: example-key
  annotations:
    kustomize.toolkit.fluxcd.io/ssa: Merge
    # Bug:
    # crossplane.io/external-name: "1"
    # Bug - the external-name cannot be unset or the resource is never "Synced"
    # It will plow over this value but you have to set it to something initially
spec:
  managementPolicies: ["*"]
  deletionPolicy: Delete
  forProvider:
    # Bug: projectIdRef says "external-name annotation is not an int"
    # projectIdRef:
    #   name: example-project
    # Bug: follow the example instead, report it as a bug later (please)
    projectId: "9876" # Project ID for my test repository
    title: Sandbox cluster Deploy Key (flux-system)
    canPush: false
    keySecretRef:
      namespace: flux-system
      name: flux-system
      key: identity.pub
  providerConfigRef:
    name: gitlab-provider
  # a reference to a Kubernetes secret to which the controller will write the runnersToken
  writeConnectionSecretToRef:
    name: problematic-example-deploy-key
    namespace: crossplane-system
```

Is it possible this feature is undercooked or not being maintained? I'd prefer to think that I'm using it wrong somehow.

Pull request:
fix: dereference projectId for UpdateDeployKey call
### Description of your changes

* Dereferenced ProjectID in the UpdateDeployKey call.

Fixes #198

I have:

- [x] Read and followed Crossplane's [contribution process].
- [x] Run `make reviewable test` to ensure this PR is ready for review.

### How has this code been tested


Patch:
diff --git a/apis/projects/v1alpha1/project_types.go b/apis/projects/v1alpha1/project_types.go
index f793b94..4ef1e67 100644
--- a/apis/projects/v1alpha1/project_types.go
+++ b/apis/projects/v1alpha1/project_types.go
@@ -153,11 +153,6 @@ type ProjectParameters struct {
 	// +optional
 	AllowMergeOnSkippedPipeline *bool `json:"allowMergeOnSkippedPipeline,omitempty"`
 
-	// How many approvers should approve merge request by default.
-	// To configure approval rules, see Merge request approvals API.
-	// +optional
-	ApprovalsBeforeMerge *int `json:"approvalsBeforeMerge,omitempty"`
-
 	// Auto-cancel pending pipelines. This isn’t a boolean, but enabled/disabled.
 	// +optional
 	AutoCancelPendingPipelines *string `json:"autoCancelPendingPipelines,omitempty"`
@@ -207,9 +202,9 @@ type ProjectParameters struct {
 	// +optional
 	ContainerExpirationPolicyAttributes *ContainerExpirationPolicyAttributes `json:"containerExpirationPolicyAttributes,omitempty"`
 
-	// Enable container registry for this project.
+	// Set visibility of container registry.
 	// +optional
-	ContainerRegistryEnabled *bool `json:"containerRegistryEnabled,omitempty"`
+	ContainerRegistryAccessLevel *AccessControlValue `json:"containerRegistryAccessLevel,omitempty"`
 
 	// The default branch name. Requires initializeWithReadme to be true.
 	// +optional
@@ -377,10 +372,9 @@ type ProjectParameters struct {
 	// +optional
 	SuggestionCommitMessage *string `json:"suggestionCommitMessage,omitempty"`
 
-	// The list of tags for a project; put array of tags,
-	// that should be finally assigned to a project. Use topics instead.
+	// The list of topics for the project;
 	// +optional
-	TagList []string `json:"tagList,omitempty"`
+	Topics []string `json:"topics,omitempty"`
 
 	// When used without useCustomTemplate, name of a built-in project template.
 	// When used with useCustomTemplate, name of a custom project template.
@@ -518,14 +512,14 @@ type ProjectObservation struct {
 	HTTPURLToRepo             string                     `json:"httpUrlToRepo,omitempty"`
 	ImportError               string                     `json:"importError,omitempty"`
 	ImportStatus              string                     `json:"importStatus,omitempty"`
-	IssuesEnabled             bool                       `json:"issuesEnabled,omitempty"`
-	JobsEnabled               bool                       `json:"jobsEnabled,omitempty"`
+	IssuesAccessLevel         AccessControlValue         `json:"issuesAccessLevel,omitempty"`
+	BuildsAccessLevel         AccessControlValue         `json:"buildsAccessLevel,omitempty"`
 	LastActivityAt            *metav1.Time               `json:"lastActivityAt,omitempty"`
 	License                   *ProjectLicense            `json:"license,omitempty"`
 	LicenseURL                string                     `json:"licenseUrl,omitempty"`
 	Links                     *Links                     `json:"links,omitempty"`
-	MarkedForDeletionAt       *metav1.Time               `json:"markedForDeletionAt,omitempty"`
-	MergeRequestsEnabled      bool                       `json:"mergeRequestsEnabled,omitempty"`
+	MarkedForDeletionOn       *metav1.Time               `json:"markedForDeletionOn,omitempty"`
+	MergeRequestsAccessLevel  AccessControlValue         `json:"mergeRequestsAccessLevel,omitempty"`
 	NameWithNamespace         string                     `json:"nameWithNamespace,omitempty"`
 	Namespace                 *ProjectNamespace          `json:"namespace,omitempty"`
 	OpenIssuesCount           int                        `json:"openIssuesCount,omitempty"`
@@ -537,11 +531,11 @@ type ProjectObservation struct {
 	SSHURLToRepo              string                     `json:"sshUrlToRepo,omitempty"`
 	ServiceDeskAddress        string                     `json:"serviceDeskAddress,omitempty"`
 	SharedWithGroups          []SharedWithGroups         `json:"sharedWithGroups,omitempty"`
-	SnippetsEnabled           bool                       `json:"snippetsEnabled,omitempty"`
+	SnippetsAccessLevel       AccessControlValue         `json:"snippetsAccessLevel,omitempty"`
 	StarCount                 int                        `json:"starCount,omitempty"`
 	Statistics                *ProjectStatistics         `json:"statistics,omitempty"`
 	WebURL                    string                     `json:"webUrl,omitempty"`
-	WikiEnabled               bool                       `json:"wikiEnabled,omitempty"`
+	WikiAccessLevel           AccessControlValue         `json:"wikiAccessLevel,omitempty"`
 }
 
 // A ProjectSpec defines the desired state of a Gitlab Project.
diff --git a/apis/projects/v1alpha1/zz_generated.deepcopy.go b/apis/projects/v1alpha1/zz_generated.deepcopy.go
index 19ad766..1b9b4f9 100644
--- a/apis/projects/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/projects/v1alpha1/zz_generated.deepcopy.go
@@ -1376,8 +1376,8 @@ func (in *ProjectObservation) DeepCopyInto(out *ProjectObservation) {
 		*out = new(Links)
 		**out = **in
 	}
-	if in.MarkedForDeletionAt != nil {
-		in, out := &in.MarkedForDeletionAt, &out.MarkedForDeletionAt
+	if in.MarkedForDeletionOn != nil {
+		in, out := &in.MarkedForDeletionOn, &out.MarkedForDeletionOn
 		*out = (*in).DeepCopy()
 	}
 	if in.Namespace != nil {
@@ -1425,11 +1425,6 @@ func (in *ProjectParameters) DeepCopyInto(out *ProjectParameters) {
 		*out = new(bool)
 		**out = **in
 	}
-	if in.ApprovalsBeforeMerge != nil {
-		in, out := &in.ApprovalsBeforeMerge, &out.ApprovalsBeforeMerge
-		*out = new(int)
-		**out = **in
-	}
 	if in.AutoCancelPendingPipelines != nil {
 		in, out := &in.AutoCancelPendingPipelines, &out.AutoCancelPendingPipelines
 		*out = new(string)
@@ -1490,9 +1485,9 @@ func (in *ProjectParameters) DeepCopyInto(out *ProjectParameters) {
 		*out = new(ContainerExpirationPolicyAttributes)
 		(*in).DeepCopyInto(*out)
 	}
-	if in.ContainerRegistryEnabled != nil {
-		in, out := &in.ContainerRegistryEnabled, &out.ContainerRegistryEnabled
-		*out = new(bool)
+	if in.ContainerRegistryAccessLevel != nil {
+		in, out := &in.ContainerRegistryAccessLevel, &out.ContainerRegistryAccessLevel
+		*out = new(AccessControlValue)
 		**out = **in
 	}
 	if in.DefaultBranch != nil {
@@ -1690,8 +1685,8 @@ func (in *ProjectParameters) DeepCopyInto(out *ProjectParameters) {
 		*out = new(string)
 		**out = **in
 	}
-	if in.TagList != nil {
-		in, out := &in.TagList, &out.TagList
+	if in.Topics != nil {
+		in, out := &in.Topics, &out.Topics
 		*out = make([]string, len(*in))
 		copy(*out, *in)
 	}
diff --git a/go.mod b/go.mod
index ae3669a..eae3581 100644
--- a/go.mod
+++ b/go.mod
@@ -7,7 +7,7 @@ require (
 	github.com/crossplane/crossplane-tools v0.0.0-20250424174524-de0e5107ea45
 	github.com/google/go-cmp v0.7.0
 	github.com/pkg/errors v0.9.1
-	gitlab.com/gitlab-org/api/client-go v0.127.0
+	gitlab.com/gitlab-org/api/client-go v0.128.0
 	gopkg.in/alecthomas/kingpin.v2 v2.2.6
 	k8s.io/api v0.32.3
 	k8s.io/apimachinery v0.32.3
diff --git a/go.sum b/go.sum
index c04163d..38baaf9 100644
--- a/go.sum
+++ b/go.sum
@@ -155,8 +155,8 @@ github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8
 github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-gitlab.com/gitlab-org/api/client-go v0.127.0 h1:8xnxcNKGF2gDazEoMs+hOZfOspSSw8D0vAoWhQk9U+U=
-gitlab.com/gitlab-org/api/client-go v0.127.0/go.mod h1:bYC6fPORKSmtuPRyD9Z2rtbAjE7UeNatu2VWHRf4/LE=
+gitlab.com/gitlab-org/api/client-go v0.128.0 h1:Wvy1UIuluKemubao2k8EOqrl3gbgJ1PVifMIQmg2Da4=
+gitlab.com/gitlab-org/api/client-go v0.128.0/go.mod h1:bYC6fPORKSmtuPRyD9Z2rtbAjE7UeNatu2VWHRf4/LE=
 go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
 go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
diff --git a/package/crds/projects.gitlab.crossplane.io_projects.yaml b/package/crds/projects.gitlab.crossplane.io_projects.yaml
index f8f9041..813ae79 100644
--- a/package/crds/projects.gitlab.crossplane.io_projects.yaml
+++ b/package/crds/projects.gitlab.crossplane.io_projects.yaml
@@ -78,11 +78,6 @@ spec:
                     description: Set whether or not merge requests can be merged with
                       skipped jobs.
                     type: boolean
-                  approvalsBeforeMerge:
-                    description: |-
-                      How many approvers should approve merge request by default.
-                      To configure approval rules, see Merge request approvals API.
-                    type: integer
                   autoCancelPendingPipelines:
                     description: Auto-cancel pending pipelines. This isn’t a boolean,
                       but enabled/disabled.
@@ -141,9 +136,9 @@ spec:
                       olderThan:
                         type: string
                     type: object
-                  containerRegistryEnabled:
-                    description: Enable container registry for this project.
-                    type: boolean
+                  containerRegistryAccessLevel:
+                    description: Set visibility of container registry.
+                    type: string
                   defaultBranch:
                     description: The default branch name. Requires initializeWithReadme
                       to be true.
@@ -355,13 +350,6 @@ spec:
                   suggestionCommitMessage:
                     description: The commit message used to apply merge request suggestions.
                     type: string
-                  tagList:
-                    description: |-
-                      The list of tags for a project; put array of tags,
-                      that should be finally assigned to a project. Use topics instead.
-                    items:
-                      type: string
-                    type: array
                   templateName:
                     description: |-
                       When used without useCustomTemplate, name of a built-in project template.
@@ -372,6 +360,11 @@ spec:
                       When used with useCustomTemplate, project ID of a custom project template.
                       This is preferable to using templateName since templateName may be ambiguous.
                     type: integer
+                  topics:
+                    description: The list of topics for the project;
+                    items:
+                      type: string
+                    type: array
                   useCustomTemplate:
                     description: Use either custom instance or group (with groupWithProjectTemplatesId)
                       project template.
@@ -561,6 +554,13 @@ spec:
                     type: boolean
                   avatarUrl:
                     type: string
+                  buildsAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                   complianceFrameworks:
                     items:
                       type: string
@@ -653,10 +653,13 @@ spec:
                     type: string
                   importStatus:
                     type: string
-                  issuesEnabled:
-                    type: boolean
-                  jobsEnabled:
-                    type: boolean
+                  issuesAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                   lastActivityAt:
                     format: date-time
                     type: string
@@ -710,11 +713,16 @@ spec:
                     - repoBranches
                     - self
                     type: object
-                  markedForDeletionAt:
+                  markedForDeletionOn:
                     format: date-time
                     type: string
-                  mergeRequestsEnabled:
-                    type: boolean
+                  mergeRequestsAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                   nameWithNamespace:
                     type: string
                   namespace:
@@ -908,8 +916,13 @@ spec:
                           type: string
                       type: object
                     type: array
-                  snippetsEnabled:
-                    type: boolean
+                  snippetsAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                   sshUrlToRepo:
                     type: string
                   starCount:
@@ -941,8 +954,13 @@ spec:
                     type: object
                   webUrl:
                     type: string
-                  wikiEnabled:
-                    type: boolean
+                  wikiAccessLevel:
+                    description: |-
+                      AccessControlValue represents an access control value within GitLab,
+                      used for managing access to certain project features.
+
+                      GitLab API docs: https://docs.gitlab.com/ce/api/projects.html
+                    type: string
                 type: object
               conditions:
                 description: Conditions of the resource.
diff --git a/pkg/clients/projects/project.go b/pkg/clients/projects/project.go
index 2b8db13..d18c963 100644
--- a/pkg/clients/projects/project.go
+++ b/pkg/clients/projects/project.go
@@ -61,30 +61,30 @@ func GenerateObservation(prj *gitlab.Project) v1alpha1.ProjectObservation { //no
 	}
 
 	o := v1alpha1.ProjectObservation{
-		ID:                   prj.ID,
-		Public:               prj.PublicJobs,
-		SSHURLToRepo:         prj.SSHURLToRepo,
-		HTTPURLToRepo:        prj.HTTPURLToRepo,
-		WebURL:               prj.WebURL,
-		ReadmeURL:            prj.ReadmeURL,
-		NameWithNamespace:    prj.NameWithNamespace,
-		PathWithNamespace:    prj.PathWithNamespace,
-		IssuesEnabled:        prj.IssuesEnabled,
-		OpenIssuesCount:      prj.OpenIssuesCount,
-		MergeRequestsEnabled: prj.MergeRequestsEnabled,
-		JobsEnabled:          prj.JobsEnabled,
-		WikiEnabled:          prj.WikiEnabled,
-		SnippetsEnabled:      prj.SnippetsEnabled,
-		CreatorID:            prj.CreatorID,
-		ImportStatus:         prj.ImportStatus,
-		ImportError:          prj.ImportError,
-		Archived:             prj.Archived,
-		ForksCount:           prj.ForksCount,
-		StarCount:            prj.StarCount,
-		EmptyRepo:            prj.EmptyRepo,
-		AvatarURL:            prj.AvatarURL,
-		LicenseURL:           prj.LicenseURL,
-		ServiceDeskAddress:   prj.ServiceDeskAddress,
+		ID:                       prj.ID,
+		Public:                   prj.PublicJobs,
+		SSHURLToRepo:             prj.SSHURLToRepo,
+		HTTPURLToRepo:            prj.HTTPURLToRepo,
+		WebURL:                   prj.WebURL,
+		ReadmeURL:                prj.ReadmeURL,
+		NameWithNamespace:        prj.NameWithNamespace,
+		PathWithNamespace:        prj.PathWithNamespace,
+		IssuesAccessLevel:        v1alpha1.AccessControlValue(prj.IssuesAccessLevel),
+		OpenIssuesCount:          prj.OpenIssuesCount,
+		MergeRequestsAccessLevel: v1alpha1.AccessControlValue(prj.MergeRequestsAccessLevel),
+		BuildsAccessLevel:        v1alpha1.AccessControlValue(prj.BuildsAccessLevel),
+		WikiAccessLevel:          v1alpha1.AccessControlValue(prj.WikiAccessLevel),
+		SnippetsAccessLevel:      v1alpha1.AccessControlValue(prj.SnippetsAccessLevel),
+		CreatorID:                prj.CreatorID,
+		ImportStatus:             prj.ImportStatus,
+		ImportError:              prj.ImportError,
+		Archived:                 prj.Archived,
+		ForksCount:               prj.ForksCount,
+		StarCount:                prj.StarCount,
+		EmptyRepo:                prj.EmptyRepo,
+		AvatarURL:                prj.AvatarURL,
+		LicenseURL:               prj.LicenseURL,
+		ServiceDeskAddress:       prj.ServiceDeskAddress,
 	}
 
 	if prj.ContainerExpirationPolicy != nil {
@@ -115,8 +115,8 @@ func GenerateObservation(prj *gitlab.Project) v1alpha1.ProjectObservation { //no
 	if prj.LastActivityAt != nil {
 		o.LastActivityAt = &metav1.Time{Time: *prj.LastActivityAt}
 	}
-	if prj.MarkedForDeletionAt != nil {
-		o.MarkedForDeletionAt = &metav1.Time{Time: time.Time(*prj.MarkedForDeletionAt)}
+	if prj.MarkedForDeletionOn != nil {
+		o.MarkedForDeletionOn = &metav1.Time{Time: time.Time(*prj.MarkedForDeletionOn)}
 	}
 
 	if len(o.ComplianceFrameworks) == 0 && len(prj.ComplianceFrameworks) > 0 {
@@ -292,7 +292,7 @@ func GenerateCreateProjectOptions(name string, p *v1alpha1.ProjectParameters) *g
 		EmailsDisabled:                      p.EmailsDisabled,
 		ResolveOutdatedDiffDiscussions:      p.ResolveOutdatedDiffDiscussions,
 		ContainerExpirationPolicyAttributes: clients.ContainerExpirationPolicyAttributesV1alpha1ToGitlab(p.ContainerExpirationPolicyAttributes),
-		ContainerRegistryEnabled:            p.ContainerRegistryEnabled,
+		ContainerRegistryAccessLevel:        clients.AccessControlValueV1alpha1ToGitlab(p.ContainerRegistryAccessLevel),
 		SharedRunnersEnabled:                p.SharedRunnersEnabled,
 		Visibility:                          clients.VisibilityValueV1alpha1ToGitlab(p.Visibility),
 		ImportURL:                           p.ImportURL,
@@ -304,7 +304,7 @@ func GenerateCreateProjectOptions(name string, p *v1alpha1.ProjectParameters) *g
 		RemoveSourceBranchAfterMerge:             p.RemoveSourceBranchAfterMerge,
 		LFSEnabled:                               p.LFSEnabled,
 		RequestAccessEnabled:                     p.RequestAccessEnabled,
-		TagList:                                  &p.TagList,
+		Topics:                                   &p.Topics,
 		PrintingMergeRequestLinkEnabled:          p.PrintingMergeRequestLinkEnabled,
 		BuildGitStrategy:                         p.BuildGitStrategy,
 		BuildTimeout:                             p.BuildTimeout,
@@ -314,7 +314,6 @@ func GenerateCreateProjectOptions(name string, p *v1alpha1.ProjectParameters) *g
 		CIForwardDeploymentEnabled:               p.CIForwardDeploymentEnabled,
 		AutoDevopsEnabled:                        p.AutoDevopsEnabled,
 		AutoDevopsDeployStrategy:                 p.AutoDevopsDeployStrategy,
-		ApprovalsBeforeMerge:                     p.ApprovalsBeforeMerge,
 		ExternalAuthorizationClassificationLabel: p.ExternalAuthorizationClassificationLabel,
 		Mirror:                                   p.Mirror,
 		MirrorTriggerBuilds:                      p.MirrorTriggerBuilds,
@@ -356,7 +355,7 @@ func GenerateEditProjectOptions(name string, p *v1alpha1.ProjectParameters) *git
 		EmailsDisabled:                      p.EmailsDisabled,
 		ResolveOutdatedDiffDiscussions:      p.ResolveOutdatedDiffDiscussions,
 		ContainerExpirationPolicyAttributes: clients.ContainerExpirationPolicyAttributesV1alpha1ToGitlab(p.ContainerExpirationPolicyAttributes),
-		ContainerRegistryEnabled:            p.ContainerRegistryEnabled,
+		ContainerRegistryAccessLevel:        clients.AccessControlValueV1alpha1ToGitlab(p.ContainerRegistryAccessLevel),
 		SharedRunnersEnabled:                p.SharedRunnersEnabled,
 		Visibility:                          clients.VisibilityValueV1alpha1ToGitlab(p.Visibility),
 		ImportURL:                           p.ImportURL,
@@ -368,7 +367,7 @@ func GenerateEditProjectOptions(name string, p *v1alpha1.ProjectParameters) *git
 		RemoveSourceBranchAfterMerge:             p.RemoveSourceBranchAfterMerge,
 		LFSEnabled:                               p.LFSEnabled,
 		RequestAccessEnabled:                     p.RequestAccessEnabled,
-		TagList:                                  &p.TagList,
+		Topics:                                   &p.Topics,
 		BuildGitStrategy:                         p.BuildGitStrategy,
 		BuildTimeout:                             p.BuildTimeout,
 		AutoCancelPendingPipelines:               p.AutoCancelPendingPipelines,
@@ -378,7 +377,6 @@ func GenerateEditProjectOptions(name string, p *v1alpha1.ProjectParameters) *git
 		CIDefaultGitDepth:                        p.CIDefaultGitDepth,
 		AutoDevopsEnabled:                        p.AutoDevopsEnabled,
 		AutoDevopsDeployStrategy:                 p.AutoDevopsDeployStrategy,
-		ApprovalsBeforeMerge:                     p.ApprovalsBeforeMerge,
 		ExternalAuthorizationClassificationLabel: p.ExternalAuthorizationClassificationLabel,
 		Mirror:                                   p.Mirror,
 		MirrorUserID:                             p.MirrorUserID,
diff --git a/pkg/controller/projects/deploykeys/controller.go b/pkg/controller/projects/deploykeys/controller.go
index 5b2b2fb..ee80588 100644
--- a/pkg/controller/projects/deploykeys/controller.go
+++ b/pkg/controller/projects/deploykeys/controller.go
@@ -207,7 +207,7 @@ func (e *external) Update(ctx context.Context, mg resource.Managed) (managed.Ext
 	}
 
 	_, _, er := e.client.UpdateDeployKey(
-		cr.Spec.ForProvider.ProjectID,
+		*cr.Spec.ForProvider.ProjectID,
 		id,
 		generateUpdateOptions(cr),
 	)
diff --git a/pkg/controller/projects/projects/project.go b/pkg/controller/projects/projects/project.go
index 8ae81c9..a6b8776 100644
--- a/pkg/controller/projects/projects/project.go
+++ b/pkg/controller/projects/projects/project.go
@@ -218,9 +218,6 @@ func lateInitialize(in *v1alpha1.ProjectParameters, project *gitlab.Project) { /
 	if in.AllowMergeOnSkippedPipeline == nil {
 		in.AllowMergeOnSkippedPipeline = &project.AllowMergeOnSkippedPipeline
 	}
-	if in.ApprovalsBeforeMerge == nil {
-		in.ApprovalsBeforeMerge = &project.ApprovalsBeforeMerge
-	}
 	if in.AutocloseReferencedIssues == nil {
 		in.AutocloseReferencedIssues = &project.AutocloseReferencedIssues
 	}
@@ -235,8 +232,8 @@ func lateInitialize(in *v1alpha1.ProjectParameters, project *gitlab.Project) { /
 	if in.CIForwardDeploymentEnabled == nil {
 		in.CIForwardDeploymentEnabled = &project.CIForwardDeploymentEnabled
 	}
-	if in.ContainerRegistryEnabled == nil {
-		in.ContainerRegistryEnabled = &project.ContainerRegistryEnabled
+	if in.ContainerRegistryAccessLevel == nil {
+		in.ContainerRegistryAccessLevel = clients.LateInitializeAccessControlValue(in.ContainerRegistryAccessLevel, project.ContainerRegistryAccessLevel)
 	}
 
 	in.DefaultBranch = clients.LateInitializeStringPtr(in.DefaultBranch, project.DefaultBranch)
@@ -309,8 +306,8 @@ func lateInitialize(in *v1alpha1.ProjectParameters, project *gitlab.Project) { /
 	in.SnippetsAccessLevel = clients.LateInitializeAccessControlValue(in.SnippetsAccessLevel, project.SnippetsAccessLevel)
 	in.SuggestionCommitMessage = clients.LateInitializeStringPtr(in.SuggestionCommitMessage, project.SuggestionCommitMessage)
 
-	if len(in.TagList) == 0 && len(project.TagList) > 0 {
-		in.TagList = project.TagList
+	if len(in.Topics) == 0 && len(project.Topics) > 0 {
+		in.Topics = project.Topics
 	}
 
 	in.Visibility = clients.LateInitializeVisibilityValue(in.Visibility, project.Visibility)
@@ -325,9 +322,6 @@ func isProjectUpToDate(p *v1alpha1.ProjectParameters, g *gitlab.Project) bool {
 	if !clients.IsBoolEqualToBoolPtr(p.AllowMergeOnSkippedPipeline, g.AllowMergeOnSkippedPipeline) {
 		return false
 	}
-	if !clients.IsIntEqualToIntPtr(p.ApprovalsBeforeMerge, g.ApprovalsBeforeMerge) {
-		return false
-	}
 	if !clients.IsBoolEqualToBoolPtr(p.AutocloseReferencedIssues, g.AutocloseReferencedIssues) {
 		return false
 	}
@@ -346,7 +340,7 @@ func isProjectUpToDate(p *v1alpha1.ProjectParameters, g *gitlab.Project) bool {
 	if !clients.IsBoolEqualToBoolPtr(p.CIForwardDeploymentEnabled, g.CIForwardDeploymentEnabled) {
 		return false
 	}
-	if !clients.IsBoolEqualToBoolPtr(p.ContainerRegistryEnabled, g.ContainerRegistryEnabled) {
+	if p.ContainerRegistryAccessLevel != nil && !cmp.Equal(string(*p.ContainerRegistryAccessLevel), string(g.ContainerRegistryAccessLevel)) {
 		return false
 	}
 	if !cmp.Equal(p.DefaultBranch, clients.StringToPtr(g.DefaultBranch)) {
@@ -436,7 +430,7 @@ func isProjectUpToDate(p *v1alpha1.ProjectParameters, g *gitlab.Project) bool {
 	if !cmp.Equal(p.SuggestionCommitMessage, clients.StringToPtr(g.SuggestionCommitMessage)) {
 		return false
 	}
-	if !cmp.Equal(p.TagList, g.TagList, cmpopts.EquateEmpty()) {
+	if !cmp.Equal(p.Topics, g.Topics, cmpopts.EquateEmpty()) {
 		return false
 	}
 	if p.Visibility != nil && !cmp.Equal(string(*p.Visibility), string(g.Visibility)) {


Test patch:
diff --git a/pkg/clients/projects/project_test.go b/pkg/clients/projects/project_test.go
index 4faa80a..43d4ef0 100644
--- a/pkg/clients/projects/project_test.go
+++ b/pkg/clients/projects/project_test.go
@@ -21,7 +21,7 @@ import (
 	"time"
 
 	"github.com/google/go-cmp/cmp"
-	"gitlab.com/gitlab-org/api/client-go"
+	gitlab "gitlab.com/gitlab-org/api/client-go"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"github.com/crossplane-contrib/provider-gitlab/apis/projects/v1alpha1"
@@ -29,40 +29,42 @@ import (
 )
 
 var (
-	name                             = "my-project"
-	overrideName                     = "My Project"
-	path                             = "path/to/project"
-	namespaceID                      = 1
-	defaultBranch                    = "main"
-	description                      = "my awesome project"
-	issuesAccessLevel                = "enabled"
-	issuesAccessLevelv1alpha1        = v1alpha1.AccessControlValue(issuesAccessLevel)
-	repositoryAccessLevel            = "enabled"
-	repositoryAccessLevelv1alpha1    = v1alpha1.AccessControlValue(repositoryAccessLevel)
-	mergeRequestsAccessLevel         = "enabled"
-	mergeRequestsAccessLevelv1alpha1 = v1alpha1.AccessControlValue(mergeRequestsAccessLevel)
-	forkingAccessLevel               = "enabled"
-	forkingAccessLevelv1alpha1       = v1alpha1.AccessControlValue(forkingAccessLevel)
-	buildsAccessLevel                = "disabled"
-	buildsAccessLevelv1alpha1        = v1alpha1.AccessControlValue(buildsAccessLevel)
-	wikiAccessLevel                  = "private"
-	wikiAccessLevelv1alpha1          = v1alpha1.AccessControlValue(wikiAccessLevel)
-	snippetsAccessLevel              = "public"
-	snippetsAccessLevelv1alpha1      = v1alpha1.AccessControlValue(snippetsAccessLevel)
-	pagesAccessLevel                 = "enabled"
-	pagesAccessLevelv1alpha1         = v1alpha1.AccessControlValue(pagesAccessLevel)
-	operationsAccessLevel            = "public"
-	operationsAccessLevelv1alpha1    = v1alpha1.AccessControlValue(operationsAccessLevel)
-	emailsDisabled                   = true
-	resolveOutdatedDiffDiscussions   = true
-	cadence                          = "Cadence"
-	keepN                            = 1
-	olderThan                        = "OlderThan"
-	nameRegexDelete                  = "NameRegexDelete"
-	nameRegexKeep                    = "NameRegexKeep"
-	enabled                          = false
-	nextRunAt                        = time.Now()
-	gitlabContainerExpirationPolicy  = gitlab.ContainerExpirationPolicy{
+	name                                 = "my-project"
+	overrideName                         = "My Project"
+	path                                 = "path/to/project"
+	namespaceID                          = 1
+	defaultBranch                        = "main"
+	description                          = "my awesome project"
+	issuesAccessLevel                    = "enabled"
+	issuesAccessLevelv1alpha1            = v1alpha1.AccessControlValue(issuesAccessLevel)
+	repositoryAccessLevel                = "enabled"
+	repositoryAccessLevelv1alpha1        = v1alpha1.AccessControlValue(repositoryAccessLevel)
+	mergeRequestsAccessLevel             = "enabled"
+	mergeRequestsAccessLevelv1alpha1     = v1alpha1.AccessControlValue(mergeRequestsAccessLevel)
+	forkingAccessLevel                   = "enabled"
+	forkingAccessLevelv1alpha1           = v1alpha1.AccessControlValue(forkingAccessLevel)
+	buildsAccessLevel                    = "disabled"
+	buildsAccessLevelv1alpha1            = v1alpha1.AccessControlValue(buildsAccessLevel)
+	wikiAccessLevel                      = "private"
+	wikiAccessLevelv1alpha1              = v1alpha1.AccessControlValue(wikiAccessLevel)
+	snippetsAccessLevel                  = "public"
+	snippetsAccessLevelv1alpha1          = v1alpha1.AccessControlValue(snippetsAccessLevel)
+	pagesAccessLevel                     = "enabled"
+	pagesAccessLevelv1alpha1             = v1alpha1.AccessControlValue(pagesAccessLevel)
+	operationsAccessLevel                = "public"
+	operationsAccessLevelv1alpha1        = v1alpha1.AccessControlValue(operationsAccessLevel)
+	containerRegistryAccessLevel         = "enabled"
+	containerRegistryAccessLevelv1alpha1 = v1alpha1.AccessControlValue(pagesAccessLevel)
+	emailsDisabled                       = true
+	resolveOutdatedDiffDiscussions       = true
+	cadence                              = "Cadence"
+	keepN                                = 1
+	olderThan                            = "OlderThan"
+	nameRegexDelete                      = "NameRegexDelete"
+	nameRegexKeep                        = "NameRegexKeep"
+	enabled                              = false
+	nextRunAt                            = time.Now()
+	gitlabContainerExpirationPolicy      = gitlab.ContainerExpirationPolicy{
 		Cadence:         cadence,
 		KeepN:           keepN,
 		OlderThan:       olderThan,
@@ -96,7 +98,6 @@ var (
 		NameRegexKeep:   &nameRegexKeep,
 		Enabled:         &enabled,
 	}
-	containerRegistryEnabled                  = true
 	sharedRunnersEnabled                      = true
 	visibility                                = "private"
 	visibilityv1alpha1                        = v1alpha1.VisibilityValue(visibility)
@@ -110,7 +111,7 @@ var (
 	removeSourceBranchAfterMerge              = false
 	lfsEnabled                                = true
 	requestAccessEnabled                      = true
-	tagList                                   = []string{"tag1", "tag2"}
+	topics                                    = []string{"tag1", "tag2"}
 	printingMergeRequestLinkEnabled           = true
 	buildGitStategy                           = "strategy"
 	buildTimeout                              = 60
@@ -121,7 +122,6 @@ var (
 	ciDefaultGitDepth                         = 50
 	autoDevopsEnabled                         = true
 	autoDevopsDeployStrategy                  = "continuous"
-	approvalsBeforeMerge                      = 0
 	externalAuthorizationClassificationLabel  = "authz-label"
 	mirror                                    = false
 	mirrorUserID                              = 1
@@ -151,12 +151,8 @@ func TestGenerateObservation(t *testing.T) {
 	owner := "chief"
 	pathWithNamespace := "path/to/cool-project"
 	nameWithNamespace := "name/to/cool-project"
-	issuesEnabled := true
+	issuesAccessLevel := gitlab.EnabledAccessControl
 	openIssuesCount := 3
-	mergeRequestsEnabled := true
-	jobsEnabled := false
-	wikiEnabled := false
-	snippetsEnabled := true
 	now := time.Now()
 	creatorID := 1
 	namespaceID := 3
@@ -166,7 +162,7 @@ func TestGenerateObservation(t *testing.T) {
 	permissionsProjectAccessNotificationLevel := 2
 	permissionsGroupAccessAccessLevel := 3
 	permissionsGroupAccessNotificationLevel := 4
-	markedForDeletionAt := gitlab.ISOTime(now)
+	markedForDeletionOn := gitlab.ISOTime(now)
 	emptyRepo := false
 	archived := false
 	avatarURL := "https://AvatarURL"
@@ -245,12 +241,12 @@ func TestGenerateObservation(t *testing.T) {
 					},
 					PathWithNamespace:         pathWithNamespace,
 					NameWithNamespace:         nameWithNamespace,
-					IssuesEnabled:             issuesEnabled,
+					IssuesAccessLevel:         issuesAccessLevel,
 					OpenIssuesCount:           openIssuesCount,
-					MergeRequestsEnabled:      mergeRequestsEnabled,
-					JobsEnabled:               jobsEnabled,
-					WikiEnabled:               wikiEnabled,
-					SnippetsEnabled:           snippetsEnabled,
+					MergeRequestsAccessLevel:  gitlab.AccessControlValue(mergeRequestsAccessLevel),
+					BuildsAccessLevel:         gitlab.AccessControlValue(buildsAccessLevel),
+					WikiAccessLevel:           gitlab.AccessControlValue(wikiAccessLevel),
+					SnippetsAccessLevel:       gitlab.AccessControlValue(snippetsAccessLevel),
 					ContainerExpirationPolicy: &gitlabContainerExpirationPolicy,
 					CreatedAt:                 &now,
 					LastActivityAt:            &now,
@@ -270,7 +266,7 @@ func TestGenerateObservation(t *testing.T) {
 							NotificationLevel: gitlab.NotificationLevelValue(permissionsGroupAccessNotificationLevel),
 						},
 					},
-					MarkedForDeletionAt: &markedForDeletionAt,
+					MarkedForDeletionOn: &markedForDeletionOn,
 					EmptyRepo:           emptyRepo,
 					Archived:            archived,
 					AvatarURL:           avatarURL,
@@ -316,12 +312,12 @@ func TestGenerateObservation(t *testing.T) {
 				},
 				PathWithNamespace:         pathWithNamespace,
 				NameWithNamespace:         nameWithNamespace,
-				IssuesEnabled:             issuesEnabled,
+				IssuesAccessLevel:         issuesAccessLevelv1alpha1,
 				OpenIssuesCount:           openIssuesCount,
-				MergeRequestsEnabled:      mergeRequestsEnabled,
-				JobsEnabled:               jobsEnabled,
-				WikiEnabled:               wikiEnabled,
-				SnippetsEnabled:           snippetsEnabled,
+				MergeRequestsAccessLevel:  mergeRequestsAccessLevelv1alpha1,
+				BuildsAccessLevel:         buildsAccessLevelv1alpha1,
+				WikiAccessLevel:           wikiAccessLevelv1alpha1,
+				SnippetsAccessLevel:       snippetsAccessLevelv1alpha1,
 				ContainerExpirationPolicy: &v1alpha1ContainerExpirationPolicy,
 				CreatedAt:                 &metav1.Time{Time: now},
 				LastActivityAt:            &metav1.Time{Time: now},
@@ -341,7 +337,7 @@ func TestGenerateObservation(t *testing.T) {
 						NotificationLevel: v1alpha1.NotificationLevelValue(permissionsGroupAccessNotificationLevel),
 					},
 				},
-				MarkedForDeletionAt: &metav1.Time{Time: now},
+				MarkedForDeletionOn: &metav1.Time{Time: now},
 				EmptyRepo:           emptyRepo,
 				Archived:            archived,
 				AvatarURL:           avatarURL,
@@ -457,7 +453,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					EmailsDisabled:                            &emailsDisabled,
 					ResolveOutdatedDiffDiscussions:            &resolveOutdatedDiffDiscussions,
 					ContainerExpirationPolicyAttributes:       &v1alpha1ContainerExpirationPolicyAttributes,
-					ContainerRegistryEnabled:                  &containerRegistryEnabled,
+					ContainerRegistryAccessLevel:              &containerRegistryAccessLevelv1alpha1,
 					SharedRunnersEnabled:                      &sharedRunnersEnabled,
 					Visibility:                                &visibilityv1alpha1,
 					ImportURL:                                 &importURL,
@@ -469,7 +465,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					RemoveSourceBranchAfterMerge:              &removeSourceBranchAfterMerge,
 					LFSEnabled:                                &lfsEnabled,
 					RequestAccessEnabled:                      &requestAccessEnabled,
-					TagList:                                   tagList,
+					Topics:                                    topics,
 					PrintingMergeRequestLinkEnabled:           &printingMergeRequestLinkEnabled,
 					BuildGitStrategy:                          &buildGitStategy,
 					BuildTimeout:                              &buildTimeout,
@@ -480,7 +476,6 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					CIDefaultGitDepth:                         &ciDefaultGitDepth,
 					AutoDevopsEnabled:                         &autoDevopsEnabled,
 					AutoDevopsDeployStrategy:                  &autoDevopsDeployStrategy,
-					ApprovalsBeforeMerge:                      &approvalsBeforeMerge,
 					ExternalAuthorizationClassificationLabel:  &externalAuthorizationClassificationLabel,
 					Mirror:                                    &mirror,
 					MirrorTriggerBuilds:                       &mirrorTriggerBuilds,
@@ -515,7 +510,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 				EmailsDisabled:                      &emailsDisabled,
 				ResolveOutdatedDiffDiscussions:      &resolveOutdatedDiffDiscussions,
 				ContainerExpirationPolicyAttributes: &gitlabContainerExpirationPolicyAttributes,
-				ContainerRegistryEnabled:            &containerRegistryEnabled,
+				ContainerRegistryAccessLevel:        clients.AccessControlValueStringToGitlab(containerRegistryAccessLevel),
 				SharedRunnersEnabled:                &sharedRunnersEnabled,
 				Visibility:                          clients.VisibilityValueStringToGitlab(visibility),
 				ImportURL:                           &importURL,
@@ -527,7 +522,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 				RemoveSourceBranchAfterMerge:             &removeSourceBranchAfterMerge,
 				LFSEnabled:                               &lfsEnabled,
 				RequestAccessEnabled:                     &requestAccessEnabled,
-				TagList:                                  &tagList,
+				Topics:                                   &topics,
 				PrintingMergeRequestLinkEnabled:          &printingMergeRequestLinkEnabled,
 				BuildGitStrategy:                         &buildGitStategy,
 				BuildTimeout:                             &buildTimeout,
@@ -537,7 +532,6 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 				CIForwardDeploymentEnabled:               &ciForwardDeploymentEnabled,
 				AutoDevopsEnabled:                        &autoDevopsEnabled,
 				AutoDevopsDeployStrategy:                 &autoDevopsDeployStrategy,
-				ApprovalsBeforeMerge:                     &approvalsBeforeMerge,
 				ExternalAuthorizationClassificationLabel: &externalAuthorizationClassificationLabel,
 				Mirror:                                   &mirror,
 				MirrorTriggerBuilds:                      &mirrorTriggerBuilds,
@@ -562,7 +556,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					IssuesAccessLevel:              &issuesAccessLevelv1alpha1,
 					ResolveOutdatedDiffDiscussions: &resolveOutdatedDiffDiscussions,
 					MergeMethod:                    &mergeMethodv1alpha1,
-					TagList:                        tagList,
+					Topics:                         topics,
 					BuildTimeout:                   &buildTimeout,
 				},
 			},
@@ -572,7 +566,7 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 				IssuesAccessLevel:              clients.AccessControlValueStringToGitlab(issuesAccessLevel),
 				ResolveOutdatedDiffDiscussions: &resolveOutdatedDiffDiscussions,
 				MergeMethod:                    clients.MergeMethodStringToGitlab(mergeMethod),
-				TagList:                        &tagList,
+				Topics:                         &topics,
 				BuildTimeout:                   &buildTimeout,
 			},
 		},
@@ -583,12 +577,12 @@ func TestGenerateCreateProjectOptions(t *testing.T) {
 					Name: &overrideName,
 					// TODO: TagList specified and wanted because otherwise
 					// test does not pass - (nil vs &nil - fix)
-					TagList: tagList,
+					Topics: topics,
 				},
 			},
 			want: &gitlab.CreateProjectOptions{
-				Name:    &overrideName,
-				TagList: &tagList,
+				Name:   &overrideName,
+				Topics: &topics,
 			},
 		},
 	}
@@ -631,7 +625,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					EmailsDisabled:                            &emailsDisabled,
 					ResolveOutdatedDiffDiscussions:            &resolveOutdatedDiffDiscussions,
 					ContainerExpirationPolicyAttributes:       &v1alpha1ContainerExpirationPolicyAttributes,
-					ContainerRegistryEnabled:                  &containerRegistryEnabled,
+					ContainerRegistryAccessLevel:              &containerRegistryAccessLevelv1alpha1,
 					SharedRunnersEnabled:                      &sharedRunnersEnabled,
 					Visibility:                                &visibilityv1alpha1,
 					ImportURL:                                 &importURL,
@@ -643,7 +637,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					RemoveSourceBranchAfterMerge:              &removeSourceBranchAfterMerge,
 					LFSEnabled:                                &lfsEnabled,
 					RequestAccessEnabled:                      &requestAccessEnabled,
-					TagList:                                   tagList,
+					Topics:                                    topics,
 					BuildGitStrategy:                          &buildGitStategy,
 					BuildTimeout:                              &buildTimeout,
 					AutoCancelPendingPipelines:                &autoCancelPendingPipelines,
@@ -653,7 +647,6 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					CIDefaultGitDepth:                         &ciDefaultGitDepth,
 					AutoDevopsEnabled:                         &autoDevopsEnabled,
 					AutoDevopsDeployStrategy:                  &autoDevopsDeployStrategy,
-					ApprovalsBeforeMerge:                      &approvalsBeforeMerge,
 					ExternalAuthorizationClassificationLabel:  &externalAuthorizationClassificationLabel,
 					Mirror:                                    &mirror,
 					MirrorUserID:                              &mirrorUserID,
@@ -685,7 +678,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 				PagesAccessLevel:                    clients.AccessControlValueStringToGitlab(pagesAccessLevel),
 				ResolveOutdatedDiffDiscussions:      &resolveOutdatedDiffDiscussions,
 				ContainerExpirationPolicyAttributes: &gitlabContainerExpirationPolicyAttributes,
-				ContainerRegistryEnabled:            &containerRegistryEnabled,
+				ContainerRegistryAccessLevel:        clients.AccessControlValueStringToGitlab(containerRegistryAccessLevel),
 				SharedRunnersEnabled:                &sharedRunnersEnabled,
 				Visibility:                          clients.VisibilityValueStringToGitlab(visibility),
 				ImportURL:                           &importURL,
@@ -697,7 +690,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 				RemoveSourceBranchAfterMerge:             &removeSourceBranchAfterMerge,
 				LFSEnabled:                               &lfsEnabled,
 				RequestAccessEnabled:                     &requestAccessEnabled,
-				TagList:                                  &tagList,
+				Topics:                                   &topics,
 				BuildGitStrategy:                         &buildGitStategy,
 				BuildTimeout:                             &buildTimeout,
 				AutoCancelPendingPipelines:               &autoCancelPendingPipelines,
@@ -707,7 +700,6 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 				CIDefaultGitDepth:                        &ciDefaultGitDepth,
 				AutoDevopsEnabled:                        &autoDevopsEnabled,
 				AutoDevopsDeployStrategy:                 &autoDevopsDeployStrategy,
-				ApprovalsBeforeMerge:                     &approvalsBeforeMerge,
 				ExternalAuthorizationClassificationLabel: &externalAuthorizationClassificationLabel,
 				Mirror:                                   &mirror,
 				MirrorUserID:                             &mirrorUserID,
@@ -730,7 +722,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					IssuesAccessLevel:              &issuesAccessLevelv1alpha1,
 					ResolveOutdatedDiffDiscussions: &resolveOutdatedDiffDiscussions,
 					MergeMethod:                    &mergeMethodv1alpha1,
-					TagList:                        tagList,
+					Topics:                         topics,
 					BuildTimeout:                   &buildTimeout,
 				},
 			},
@@ -740,7 +732,7 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 				IssuesAccessLevel:              clients.AccessControlValueStringToGitlab(issuesAccessLevel),
 				ResolveOutdatedDiffDiscussions: &resolveOutdatedDiffDiscussions,
 				MergeMethod:                    clients.MergeMethodStringToGitlab(mergeMethod),
-				TagList:                        &tagList,
+				Topics:                         &topics,
 				BuildTimeout:                   &buildTimeout,
 			},
 		},
@@ -751,12 +743,12 @@ func TestGenerateEditProjectOptions(t *testing.T) {
 					Name: &name,
 					// TODO: TagList specified and wanted because otherwise
 					// test does not pass - (nil vs &nil - fix)
-					TagList: tagList,
+					Topics: topics,
 				},
 			},
 			want: &gitlab.EditProjectOptions{
-				Name:    &name,
-				TagList: &tagList,
+				Name:   &name,
+				Topics: &topics,
 			},
 		},
 	}
diff --git a/pkg/controller/projects/projects/project_test.go b/pkg/controller/projects/projects/project_test.go
index e7bd041..b04e443 100644
--- a/pkg/controller/projects/projects/project_test.go
+++ b/pkg/controller/projects/projects/project_test.go
@@ -85,7 +85,6 @@ func withClientDefaultValues() projectModifier {
 			NamespaceID:                               &i,
 			EmailsDisabled:                            &f,
 			ResolveOutdatedDiffDiscussions:            &f,
-			ContainerRegistryEnabled:                  &f,
 			SharedRunnersEnabled:                      &f,
 			PublicBuilds:                              &f,
 			OnlyAllowMergeIfPipelineSucceeds:          &f,
@@ -97,7 +96,6 @@ func withClientDefaultValues() projectModifier {
 			BuildTimeout:                              &i,
 			CIDefaultGitDepth:                         &i,
 			AutoDevopsEnabled:                         &f,
-			ApprovalsBeforeMerge:                      &i,
 			Mirror:                                    &f,
 			MirrorUserID:                              &i,
 			MirrorTriggerBuilds:                       &f,
@@ -349,16 +347,16 @@ func TestObserve(t *testing.T) {
 		"Path":                                      "path",
 		"DefaultBranch":                             "Default branch",
 		"Description":                               "description",
-		"IssuesAccessLevel":                         gitlab.PrivateAccessControl,
-		"RepositoryAccessLevel":                     gitlab.PrivateAccessControl,
-		"MergeRequestsAccessLevel":                  gitlab.PrivateAccessControl,
-		"ForkingAccessLevel":                        gitlab.PrivateAccessControl,
-		"BuildsAccessLevel":                         gitlab.PrivateAccessControl,
-		"WikiAccessLevel":                           gitlab.PrivateAccessControl,
-		"SnippetsAccessLevel":                       gitlab.PrivateAccessControl,
-		"PagesAccessLevel":                          gitlab.PrivateAccessControl,
+		"IssuesAccessLevel":                         gitlab.PublicAccessControl,
+		"RepositoryAccessLevel":                     gitlab.PublicAccessControl,
+		"MergeRequestsAccessLevel":                  gitlab.PublicAccessControl,
+		"ForkingAccessLevel":                        gitlab.PublicAccessControl,
+		"BuildsAccessLevel":                         gitlab.PublicAccessControl,
+		"WikiAccessLevel":                           gitlab.PublicAccessControl,
+		"SnippetsAccessLevel":                       gitlab.PublicAccessControl,
+		"PagesAccessLevel":                          gitlab.PublicAccessControl,
 		"ResolveOutdatedDiffDiscussions":            true,
-		"ContainerRegistryEnabled":                  true,
+		"ContainerRegistryAccessLevel":              gitlab.EnabledAccessControl,
 		"SharedRunnersEnabled":                      true,
 		"Visibility":                                gitlab.PrivateVisibility,
 		"PublicBuilds":                              true,
@@ -368,10 +366,9 @@ func TestObserve(t *testing.T) {
 		"RemoveSourceBranchAfterMerge":              true,
 		"LFSEnabled":                                true,
 		"RequestAccessEnabled":                      true,
-		"TagList":                                   []string{"tag-1", "tag-2"},
+		"Topics":                                    []string{"tag-1", "tag-2"},
 		"CIConfigPath":                              "CI configPath",
 		"CIDefaultGitDepth":                         1,
-		"ApprovalsBeforeMerge":                      1,
 		"Mirror":                                    true,
 		"MirrorUserID":                              1,
 		"MirrorTriggerBuilds":                       true,
@@ -387,7 +384,7 @@ func TestObserve(t *testing.T) {
 	f := false
 	i := 0
 	al := v1alpha1.PublicAccessControl
-	tags := []string{"tag-1 new", "tag-2 new"}
+	topics := []string{"tag-1 new", "tag-2 new"}
 	mergeMethod := v1alpha1.FastForwardMerge
 	s := "default string"
 	visibility := v1alpha1.PublicVisibility
@@ -406,7 +403,7 @@ func TestObserve(t *testing.T) {
 		SnippetsAccessLevel:              &al,
 		PagesAccessLevel:                 &al,
 		ResolveOutdatedDiffDiscussions:   &f,
-		ContainerRegistryEnabled:         &f,
+		ContainerRegistryAccessLevel:     &al,
 		SharedRunnersEnabled:             &f,
 		Visibility:                       &visibility,
 		PublicBuilds:                     &f,
@@ -416,10 +413,9 @@ func TestObserve(t *testing.T) {
 		RemoveSourceBranchAfterMerge:     &f,
 		LFSEnabled:                       &f,
 		RequestAccessEnabled:             &f,
-		TagList:                          tags,
+		Topics:                           topics,
 		CIConfigPath:                     &s,
 		CIDefaultGitDepth:                &i,
-		ApprovalsBeforeMerge:             &i,
 		Mirror:                           &f,
 		MirrorUserID:                     &i,
 		MirrorTriggerBuilds:              &f,
@@ -441,6 +437,13 @@ func TestObserve(t *testing.T) {
 			withSpec(projectParameters),
 			withExternalName("0"),
 			withConditions(xpv1.Available()),
+			withStatus(v1alpha1.ProjectObservation{
+				IssuesAccessLevel:        al,
+				BuildsAccessLevel:        al,
+				MergeRequestsAccessLevel: al,
+				SnippetsAccessLevel:      al,
+				WikiAccessLevel:          al,
+			}),
 		}
 		gitlabProject := &gitlab.Project{
 			Name:                             s,
@@ -466,10 +469,9 @@ func TestObserve(t *testing.T) {
 			RemoveSourceBranchAfterMerge:     f,
 			LFSEnabled:                       f,
 			RequestAccessEnabled:             f,
-			TagList:                          tags,
+			Topics:                           topics,
 			CIConfigPath:                     s,
 			CIDefaultGitDepth:                i,
-			ApprovalsBeforeMerge:             i,
 			Mirror:                           f,
 			MirrorUserID:                     i,
 			MirrorTriggerBuilds:              f,