Repository: xanzy/go-gitlab
Pull request #2075 (2024-12-10 12:19:18)

Deprecate this project in favor of https://gitlab.com/gitlab-org/api/client-go
See #2060 


Patch:
diff --git a/.golangci.yml b/.golangci.yml
index f9c9822..7c05fee 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -19,10 +19,6 @@ linters-settings:
     locale: US
     ignore-words:
     - noteable
-  revive:
-    enable-all-rules: false
-    rules:
-      - name: deep-exit
 
 linters:
   enable:
@@ -34,10 +30,10 @@ linters:
     - gosimple
     - govet
     - ineffassign
+    - megacheck
     - misspell
     - nakedret
     - nolintlint
-    - revive
     - staticcheck
     - typecheck
     - unconvert
diff --git a/README.md b/README.md
index 6038bed..29bb91c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,25 @@
-# go-gitlab
+# (deprecated) go-gitlab (migrated to https://gitlab.com/gitlab-org/api/client-go)
+
+🚧 **Project moved to https://gitlab.com/gitlab-org/api/client-go** 🚧
+
+This package, `github.com/xanzy/go-gitlab`, has been moved to
+[`gitlab.com/gitlab-org/api/client-go`](https://gitlab.com/gitlab-org/api/client-go).
+
+The project will continue to be a primarily community-maintained project,
+more about it [here](https://gitlab.com/gitlab-org/client.go/-/blob/main/README.md#maintenance).
+
+**References**:
+
+- [GitLab Project](https://gitlab.com/gitlab-org/api/client-go)
+- [Issue Tracker](https://gitlab.com/gitlab-org/api/client-go/-/issues)
+
+## Migration Steps
+
+- Replace `github.com/xanzy/go-gitlab` with `gitlab.com/gitlab-org/api/client-go` in your code base.
+- Profit 🎉
+- *(the code is fully backwards-compatible, no breaking changes are expected)*
+
+<details><summary>Former README contents</summary>
 
 A GitLab API client enabling Go programs to interact with GitLab in a simple and uniform way
 
@@ -26,7 +47,6 @@ to add new and/or missing endpoints. Currently, the following services are suppo
 - [x] Commits
 - [x] Container Registry
 - [x] Custom Attributes
-- [x] Dependency List Export
 - [x] Deploy Keys
 - [x] Deployments
 - [x] Discussions (threaded comments)
@@ -207,3 +227,5 @@ Contributions are always welcome. For more information, check out the [contribut
 ## License
 
 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>
+
+</details>
diff --git a/dependency_list_export.go b/dependency_list_export.go
deleted file mode 100644
index c1e786e..0000000
--- a/dependency_list_export.go
+++ /dev/null
@@ -1,122 +0,0 @@
-package gitlab
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"net/http"
-)
-
-type DependencyListExportService struct {
-	client *Client
-}
-
-// CreateDependencyListExportOptions represents the available CreateDependencyListExport()
-// options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/dependency_list_export.html#create-a-pipeline-level-dependency-list-export
-type CreateDependencyListExportOptions struct {
-	ExportType *string `url:"export_type" json:"export_type"`
-}
-
-// DependencyListExport represents a request for a GitLab project's dependency list.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/dependency_list_export.html#create-a-pipeline-level-dependency-list-export
-type DependencyListExport struct {
-	ID          int    `json:"id"`
-	HasFinished bool   `json:"has_finished"`
-	Self        string `json:"self"`
-	Download    string `json:"download"`
-}
-
-const defaultExportType = "sbom"
-
-// CreateDependencyListExport creates a new CycloneDX JSON export for all the project dependencies
-// detected in a pipeline.
-//
-// If an authenticated user does not have permission to read_dependency, this request returns a 403
-// Forbidden status code.
-//
-// SBOM exports can be only accessed by the export’s author.
-//
-// GitLab docs:
-// https://docs.gitlab.com/ee/api/dependency_list_export.html#create-a-pipeline-level-dependency-list-export
-func (s *DependencyListExportService) CreateDependencyListExport(pipelineID int, opt *CreateDependencyListExportOptions, options ...RequestOptionFunc) (*DependencyListExport, *Response, error) {
-	// POST /pipelines/:id/dependency_list_exports
-	createExportPath := fmt.Sprintf("pipelines/%d/dependency_list_exports", pipelineID)
-
-	if opt == nil {
-		opt = &CreateDependencyListExportOptions{}
-	}
-	if opt.ExportType == nil {
-		opt.ExportType = Ptr(defaultExportType)
-	}
-
-	req, err := s.client.NewRequest(http.MethodPost, createExportPath, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	export := new(DependencyListExport)
-	resp, err := s.client.Do(req, &export)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return export, resp, nil
-}
-
-// GetDependencyListExport gets metadata about a single dependency list export.
-//
-// GitLab docs:
-// https://docs.gitlab.com/ee/api/dependency_list_export.html#get-single-dependency-list-export
-func (s *DependencyListExportService) GetDependencyListExport(id int, options ...RequestOptionFunc) (*DependencyListExport, *Response, error) {
-	// GET /dependency_list_exports/:id
-	getExportPath := fmt.Sprintf("dependency_list_exports/%d", id)
-
-	req, err := s.client.NewRequest(http.MethodGet, getExportPath, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	export := new(DependencyListExport)
-	resp, err := s.client.Do(req, &export)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return export, resp, nil
-}
-
-// DownloadDependencyListExport downloads a single dependency list export.
-//
-// The github.com/CycloneDX/cyclonedx-go package can be used to parse the data from the returned io.Reader.
-//
-//	sbom := new(cdx.BOM)
-//	decoder := cdx.NewBOMDecoder(reader, cdx.BOMFileFormatJSON)
-//
-//	if err = decoder.Decode(sbom); err != nil {
-//		panic(err)
-//	}
-//
-// GitLab docs:
-// https://docs.gitlab.com/ee/api/dependency_list_export.html#download-dependency-list-export
-func (s *DependencyListExportService) DownloadDependencyListExport(id int, options ...RequestOptionFunc) (io.Reader, *Response, error) {
-	// GET /dependency_list_exports/:id/download
-	downloadExportPath := fmt.Sprintf("dependency_list_exports/%d/download", id)
-
-	req, err := s.client.NewRequest(http.MethodGet, downloadExportPath, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	var sbomBuffer bytes.Buffer
-	resp, err := s.client.Do(req, &sbomBuffer)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return &sbomBuffer, resp, nil
-}
diff --git a/deploy_keys.go b/deploy_keys.go
index 8834edb..e343bef 100644
--- a/deploy_keys.go
+++ b/deploy_keys.go
@@ -67,7 +67,6 @@ type ProjectDeployKey struct {
 	Key       string     `json:"key"`
 	CreatedAt *time.Time `json:"created_at"`
 	CanPush   bool       `json:"can_push"`
-	ExpiresAt *time.Time `json:"expires_at"`
 }
 
 func (k ProjectDeployKey) String() string {
@@ -163,12 +162,11 @@ func (s *DeployKeysService) GetDeployKey(pid interface{}, deployKey int, options
 // AddDeployKeyOptions represents the available ADDDeployKey() options.
 //
 // GitLab API docs:
-// https://docs.gitlab.com/ee/api/deploy_keys.html#add-deploy-key-for-a-project
+// https://docs.gitlab.com/ee/api/deploy_keys.html#add-deploy-key
 type AddDeployKeyOptions struct {
-	Key       *string    `url:"key,omitempty" json:"key,omitempty"`
-	Title     *string    `url:"title,omitempty" json:"title,omitempty"`
-	CanPush   *bool      `url:"can_push,omitempty" json:"can_push,omitempty"`
-	ExpiresAt *time.Time `url:"expires_at,omitempty" json:"expires_at,omitempty"`
+	Title   *string `url:"title,omitempty" json:"title,omitempty"`
+	Key     *string `url:"key,omitempty" json:"key,omitempty"`
+	CanPush *bool   `url:"can_push,omitempty" json:"can_push,omitempty"`
 }
 
 // AddDeployKey creates a new deploy key for a project. If deploy key already
@@ -176,7 +174,7 @@ type AddDeployKeyOptions struct {
 // original one was is accessible by same user.
 //
 // GitLab API docs:
-// https://docs.gitlab.com/ee/api/deploy_keys.html#add-deploy-key-for-a-project
+// https://docs.gitlab.com/ee/api/deploy_keys.html#add-deploy-key
 func (s *DeployKeysService) AddDeployKey(pid interface{}, opt *AddDeployKeyOptions, options ...RequestOptionFunc) (*ProjectDeployKey, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
diff --git a/event_parsing.go b/event_parsing.go
index eb81fa0..0f47421 100644
--- a/event_parsing.go
+++ b/event_parsing.go
@@ -91,7 +91,7 @@ func HookEventType(r *http.Request) EventType {
 // Example usage:
 //
 //	func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-//	    payload, err := io.ReadAll(r.Body)
+//	    payload, err := ioutil.ReadAll(r.Body)
 //	    if err != nil { ... }
 //	    event, err := gitlab.ParseHook(gitlab.HookEventType(r), payload)
 //	    if err != nil { ... }
@@ -119,7 +119,7 @@ func ParseHook(eventType EventType, payload []byte) (event interface{}, err erro
 // Example usage:
 //
 //	func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-//	    payload, err := io.ReadAll(r.Body)
+//	    payload, err := ioutil.ReadAll(r.Body)
 //	    if err != nil { ... }
 //	    event, err := gitlab.ParseSystemhook(payload)
 //	    if err != nil { ... }
@@ -203,7 +203,7 @@ func WebhookEventType(r *http.Request) EventType {
 // Example usage:
 //
 //	func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-//	    payload, err := io.ReadAll(r.Body)
+//	    payload, err := ioutil.ReadAll(r.Body)
 //	    if err != nil { ... }
 //	    event, err := gitlab.ParseWebhook(gitlab.HookEventType(r), payload)
 //	    if err != nil { ... }
diff --git a/examples/services.go b/examples/services.go
index 16e88f1..029398b 100644
--- a/examples/services.go
+++ b/examples/services.go
@@ -39,11 +39,16 @@ func dataDogExample() {
 		ArchiveTraceEvents: gitlab.Bool(true),
 	}
 
-	svc, _, err := git.Services.SetDataDogService(1, opts)
+	_, err = git.Services.SetDataDogService(1, opts)
 	if err != nil {
 		log.Fatal(err)
 	}
 
+	// Query the integration
+	svc, _, err := git.Services.GetDataDogService(1)
+	if err != nil {
+		log.Fatal(err)
+	}
 	fmt.Printf(
 		"api_url: %s, datadog_env: %s, datadog_service: %s, datadog_site: %s, datadog_tags: %s",
 		svc.Properties.APIURL, svc.Properties.DataDogEnv, svc.Properties.DataDogService,
diff --git a/gitlab.go b/gitlab.go
index 594909e..d5f328e 100644
--- a/gitlab.go
+++ b/gitlab.go
@@ -70,6 +70,11 @@ const (
 var ErrNotFound = errors.New("404 Not Found")
 
 // A Client manages communication with the GitLab API.
+//
+// Deprecated: use gitlab.com/gitlab-org/api/client-go instead.
+// See https://gitlab.com/gitlab-org/api/client-go
+//
+// This package is completely frozen, nothing will be added, removed or changed.
 type Client struct {
 	// HTTP client used to communicate with the API.
 	client *retryablehttp.Client
@@ -122,7 +127,6 @@ type Client struct {
 	Commits                      *CommitsService
 	ContainerRegistry            *ContainerRegistryService
 	CustomAttribute              *CustomAttributesService
-	DependencyListExport         *DependencyListExportService
 	DeployKeys                   *DeployKeysService
 	DeployTokens                 *DeployTokensService
 	DeploymentMergeRequests      *DeploymentMergeRequestsService
@@ -196,7 +200,6 @@ type Client struct {
 	ProjectFeatureFlags          *ProjectFeatureFlagService
 	ProjectImportExport          *ProjectImportExportService
 	ProjectIterations            *ProjectIterationsService
-	ProjectMarkdownUploads       *ProjectMarkdownUploadsService
 	ProjectMembers               *ProjectMembersService
 	ProjectMirrors               *ProjectMirrorService
 	ProjectRepositoryStorageMove *ProjectRepositoryStorageMoveService
@@ -260,6 +263,11 @@ type RateLimiter interface {
 
 // NewClient returns a new GitLab API client. To use API methods which require
 // authentication, provide a valid private or personal token.
+//
+// Deprecated: This module has been migrated to gitlab.com/gitlab-org/api/client-go.
+// See https://gitlab.com/gitlab-org/api/client-go
+//
+// This package is completely frozen, nothing will be added, removed or changed.
 func NewClient(token string, options ...ClientOptionFunc) (*Client, error) {
 	client, err := newClient(options...)
 	if err != nil {
@@ -272,6 +280,11 @@ func NewClient(token string, options ...ClientOptionFunc) (*Client, error) {
 
 // NewBasicAuthClient returns a new GitLab API client. To use API methods which
 // require authentication, provide a valid username and password.
+//
+// Deprecated: This module has been migrated to gitlab.com/gitlab-org/api/client-go.
+// See https://gitlab.com/gitlab-org/api/client-go
+//
+// This package is completely frozen, nothing will be added, removed or changed.
 func NewBasicAuthClient(username, password string, options ...ClientOptionFunc) (*Client, error) {
 	client, err := newClient(options...)
 	if err != nil {
@@ -287,6 +300,11 @@ func NewBasicAuthClient(username, password string, options ...ClientOptionFunc)
 
 // NewJobClient returns a new GitLab API client. To use API methods which require
 // authentication, provide a valid job token.
+//
+// Deprecated: This module has been migrated to gitlab.com/gitlab-org/api/client-go.
+// See https://gitlab.com/gitlab-org/api/client-go
+//
+// This package is completely frozen, nothing will be added, removed or changed.
 func NewJobClient(token string, options ...ClientOptionFunc) (*Client, error) {
 	client, err := newClient(options...)
 	if err != nil {
@@ -299,6 +317,11 @@ func NewJobClient(token string, options ...ClientOptionFunc) (*Client, error) {
 
 // NewOAuthClient returns a new GitLab API client. To use API methods which
 // require authentication, provide a valid oauth token.
+//
+// Deprecated: This module has been migrated to gitlab.com/gitlab-org/api/client-go.
+// See https://gitlab.com/gitlab-org/api/client-go
+//
+// This package is completely frozen, nothing will be added, removed or changed.
 func NewOAuthClient(token string, options ...ClientOptionFunc) (*Client, error) {
 	client, err := newClient(options...)
 	if err != nil {
@@ -362,7 +385,6 @@ func newClient(options ...ClientOptionFunc) (*Client, error) {
 	c.Commits = &CommitsService{client: c}
 	c.ContainerRegistry = &ContainerRegistryService{client: c}
 	c.CustomAttribute = &CustomAttributesService{client: c}
-	c.DependencyListExport = &DependencyListExportService{client: c}
 	c.DeployKeys = &DeployKeysService{client: c}
 	c.DeployTokens = &DeployTokensService{client: c}
 	c.DeploymentMergeRequests = &DeploymentMergeRequestsService{client: c}
@@ -436,7 +458,6 @@ func newClient(options ...ClientOptionFunc) (*Client, error) {
 	c.ProjectFeatureFlags = &ProjectFeatureFlagService{client: c}
 	c.ProjectImportExport = &ProjectImportExportService{client: c}
 	c.ProjectIterations = &ProjectIterationsService{client: c}
-	c.ProjectMarkdownUploads = &ProjectMarkdownUploadsService{client: c}
 	c.ProjectMembers = &ProjectMembersService{client: c}
 	c.ProjectMirrors = &ProjectMirrorService{client: c}
 	c.ProjectRepositoryStorageMove = &ProjectRepositoryStorageMoveService{client: c}
diff --git a/go.mod b/go.mod
index 03cff50..8eefc24 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,4 @@
+// Deprecated: This module has been migrated to gitlab.com/gitlab-org/api/client-go. See https://gitlab.com/gitlab-org/api/client-go
 module github.com/xanzy/go-gitlab
 
 go 1.19
diff --git a/group_hooks.go b/group_hooks.go
index 320f038..414a8d0 100644
--- a/group_hooks.go
+++ b/group_hooks.go
@@ -229,25 +229,6 @@ func (s *GroupsService) DeleteGroupHook(pid interface{}, hook int, options ...Re
 	return s.client.Do(req, nil)
 }
 
-// TriggerTestGroupHook triggers a test hook for a specified group.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/group_webhooks.html#trigger-a-test-group-hook
-func (s *GroupsService) TriggerTestGroupHook(pid interface{}, hook int, trigger GroupHookTrigger, options ...RequestOptionFunc) (*Response, error) {
-	group, err := parseID(pid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("groups/%s/hooks/%d/test/%s", PathEscape(group), hook, trigger)
-
-	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
-	if err != nil {
-		return nil, err
-	}
-
-	return s.client.Do(req, nil)
-}
-
 // SetGroupCustomHeader creates or updates a group custom webhook header.
 //
 // GitLab API docs:
diff --git a/group_labels.go b/group_labels.go
index 8004bb2..5a39026 100644
--- a/group_labels.go
+++ b/group_labels.go
@@ -79,12 +79,12 @@ func (s *GroupLabelsService) ListGroupLabels(gid interface{}, opt *ListGroupLabe
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_labels.html#get-a-single-group-label
-func (s *GroupLabelsService) GetGroupLabel(gid interface{}, lid interface{}, options ...RequestOptionFunc) (*GroupLabel, *Response, error) {
+func (s *GroupLabelsService) GetGroupLabel(gid interface{}, labelID interface{}, options ...RequestOptionFunc) (*GroupLabel, *Response, error) {
 	group, err := parseID(gid)
 	if err != nil {
 		return nil, nil, err
 	}
-	label, err := parseID(lid)
+	label, err := parseID(labelID)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -108,12 +108,7 @@ func (s *GroupLabelsService) GetGroupLabel(gid interface{}, lid interface{}, opt
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_labels.html#create-a-new-group-label
-type CreateGroupLabelOptions struct {
-	Name        *string `url:"name,omitempty" json:"name,omitempty"`
-	Color       *string `url:"color,omitempty" json:"color,omitempty"`
-	Description *string `url:"description,omitempty" json:"description,omitempty"`
-	Priority    *int    `url:"priority,omitempty" json:"priority,omitempty"`
-}
+type CreateGroupLabelOptions CreateLabelOptions
 
 // CreateGroupLabel creates a new label for given group with given name and
 // color.
@@ -145,9 +140,7 @@ func (s *GroupLabelsService) CreateGroupLabel(gid interface{}, opt *CreateGroupL
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_labels.html#delete-a-group-label
-type DeleteGroupLabelOptions struct {
-	Name *string `url:"name,omitempty" json:"name,omitempty"`
-}
+type DeleteGroupLabelOptions DeleteLabelOptions
 
 // DeleteGroupLabel deletes a group label given by its name or ID.
 //
@@ -180,34 +173,20 @@ func (s *GroupLabelsService) DeleteGroupLabel(gid interface{}, lid interface{},
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_labels.html#update-a-group-label
-type UpdateGroupLabelOptions struct {
-	Name        *string `url:"name,omitempty" json:"name,omitempty"`
-	NewName     *string `url:"new_name,omitempty" json:"new_name,omitempty"`
-	Color       *string `url:"color,omitempty" json:"color,omitempty"`
-	Description *string `url:"description,omitempty" json:"description,omitempty"`
-	Priority    *int    `url:"priority,omitempty" json:"priority,omitempty"`
-}
+type UpdateGroupLabelOptions UpdateLabelOptions
 
 // UpdateGroupLabel updates an existing label with new name or now color. At least
 // one parameter is required, to update the label.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_labels.html#update-a-group-label
-func (s *GroupLabelsService) UpdateGroupLabel(gid interface{}, lid interface{}, opt *UpdateGroupLabelOptions, options ...RequestOptionFunc) (*GroupLabel, *Response, error) {
+func (s *GroupLabelsService) UpdateGroupLabel(gid interface{}, opt *UpdateGroupLabelOptions, options ...RequestOptionFunc) (*GroupLabel, *Response, error) {
 	group, err := parseID(gid)
 	if err != nil {
 		return nil, nil, err
 	}
 	u := fmt.Sprintf("groups/%s/labels", PathEscape(group))
 
-	if lid != nil {
-		label, err := parseID(lid)
-		if err != nil {
-			return nil, nil, err
-		}
-		u = fmt.Sprintf("groups/%s/labels/%s", PathEscape(group), PathEscape(label))
-	}
-
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
 		return nil, nil, err
@@ -228,12 +207,12 @@ func (s *GroupLabelsService) UpdateGroupLabel(gid interface{}, lid interface{},
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_labels.html#subscribe-to-a-group-label
-func (s *GroupLabelsService) SubscribeToGroupLabel(gid interface{}, lid interface{}, options ...RequestOptionFunc) (*GroupLabel, *Response, error) {
+func (s *GroupLabelsService) SubscribeToGroupLabel(gid interface{}, labelID interface{}, options ...RequestOptionFunc) (*GroupLabel, *Response, error) {
 	group, err := parseID(gid)
 	if err != nil {
 		return nil, nil, err
 	}
-	label, err := parseID(lid)
+	label, err := parseID(labelID)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -259,12 +238,12 @@ func (s *GroupLabelsService) SubscribeToGroupLabel(gid interface{}, lid interfac
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_labels.html#unsubscribe-from-a-group-label
-func (s *GroupLabelsService) UnsubscribeFromGroupLabel(gid interface{}, lid interface{}, options ...RequestOptionFunc) (*Response, error) {
+func (s *GroupLabelsService) UnsubscribeFromGroupLabel(gid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Response, error) {
 	group, err := parseID(gid)
 	if err != nil {
 		return nil, err
 	}
-	label, err := parseID(lid)
+	label, err := parseID(labelID)
 	if err != nil {
 		return nil, err
 	}
diff --git a/group_variables.go b/group_variables.go
index 7978e59..69fe445 100644
--- a/group_variables.go
+++ b/group_variables.go
@@ -41,7 +41,6 @@ type GroupVariable struct {
 	VariableType     VariableTypeValue `json:"variable_type"`
 	Protected        bool              `json:"protected"`
 	Masked           bool              `json:"masked"`
-	Hidden           bool              `json:"hidden"`
 	Raw              bool              `json:"raw"`
 	EnvironmentScope string            `json:"environment_scope"`
 	Description      string            `json:"description"`
@@ -128,7 +127,6 @@ type CreateGroupVariableOptions struct {
 	Description      *string            `url:"description,omitempty" json:"description,omitempty"`
 	EnvironmentScope *string            `url:"environment_scope,omitempty" json:"environment_scope,omitempty"`
 	Masked           *bool              `url:"masked,omitempty" json:"masked,omitempty"`
-	MaskedAndHidden  *bool              `url:"masked_and_hidden,omitempty" json:"hidden,omitempty"`
 	Protected        *bool              `url:"protected,omitempty" json:"protected,omitempty"`
 	Raw              *bool              `url:"raw,omitempty" json:"raw,omitempty"`
 	VariableType     *VariableTypeValue `url:"variable_type,omitempty" json:"variable_type,omitempty"`
diff --git a/groups.go b/groups.go
index c7b9e54..0e85961 100644
--- a/groups.go
+++ b/groups.go
@@ -87,7 +87,6 @@ type Group struct {
 	MarkedForDeletionOn            *ISOTime           `json:"marked_for_deletion_on"`
 	CreatedAt                      *time.Time         `json:"created_at"`
 	IPRestrictionRanges            string             `json:"ip_restriction_ranges"`
-	AllowedEmailDomainsList        string             `json:"allowed_email_domains_list"`
 	WikiAccessLevel                AccessControlValue `json:"wiki_access_level"`
 
 	// Deprecated: Use EmailsEnabled instead
@@ -384,6 +383,7 @@ type CreateGroupOptions struct {
 	ParentID                        *int                                    `url:"parent_id,omitempty" json:"parent_id,omitempty"`
 	SharedRunnersMinutesLimit       *int                                    `url:"shared_runners_minutes_limit,omitempty" json:"shared_runners_minutes_limit,omitempty"`
 	ExtraSharedRunnersMinutesLimit  *int                                    `url:"extra_shared_runners_minutes_limit,omitempty" json:"extra_shared_runners_minutes_limit,omitempty"`
+	IPRestrictionRanges             *string                                 `url:"ip_restriction_ranges,omitempty" json:"ip_restriction_ranges,omitempty"`
 	WikiAccessLevel                 *AccessControlValue                     `url:"wiki_access_level,omitempty" json:"wiki_access_level,omitempty"`
 
 	// Deprecated: Use EmailsEnabled instead
@@ -532,7 +532,6 @@ type UpdateGroupOptions struct {
 	SharedRunnersSetting                 *SharedRunnersSettingValue              `url:"shared_runners_setting,omitempty" json:"shared_runners_setting,omitempty"`
 	PreventSharingGroupsOutsideHierarchy *bool                                   `url:"prevent_sharing_groups_outside_hierarchy,omitempty" json:"prevent_sharing_groups_outside_hierarchy,omitempty"`
 	IPRestrictionRanges                  *string                                 `url:"ip_restriction_ranges,omitempty" json:"ip_restriction_ranges,omitempty"`
-	AllowedEmailDomainsList              *string                                 `url:"allowed_email_domains_list,omitempty" json:"allowed_email_domains_list,omitempty"`
 	WikiAccessLevel                      *AccessControlValue                     `url:"wiki_access_level,omitempty" json:"wiki_access_level,omitempty"`
 
 	// Deprecated: Use EmailsEnabled instead
diff --git a/labels.go b/labels.go
index bc73669..d36e85b 100644
--- a/labels.go
+++ b/labels.go
@@ -108,12 +108,12 @@ func (s *LabelsService) ListLabels(pid interface{}, opt *ListLabelsOptions, opti
 // GetLabel get a single label for a given project.
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#get-a-single-project-label
-func (s *LabelsService) GetLabel(pid interface{}, lid interface{}, options ...RequestOptionFunc) (*Label, *Response, error) {
+func (s *LabelsService) GetLabel(pid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Label, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, nil, err
 	}
-	label, err := parseID(lid)
+	label, err := parseID(labelID)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -216,21 +216,13 @@ type UpdateLabelOptions struct {
 // one parameter is required, to update the label.
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#edit-an-existing-label
-func (s *LabelsService) UpdateLabel(pid interface{}, lid interface{}, opt *UpdateLabelOptions, options ...RequestOptionFunc) (*Label, *Response, error) {
+func (s *LabelsService) UpdateLabel(pid interface{}, opt *UpdateLabelOptions, options ...RequestOptionFunc) (*Label, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, nil, err
 	}
 	u := fmt.Sprintf("projects/%s/labels", PathEscape(project))
 
-	if lid != nil {
-		label, err := parseID(lid)
-		if err != nil {
-			return nil, nil, err
-		}
-		u = fmt.Sprintf("projects/%s/labels/%s", PathEscape(project), PathEscape(label))
-	}
-
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
 		return nil, nil, err
@@ -251,12 +243,12 @@ func (s *LabelsService) UpdateLabel(pid interface{}, lid interface{}, opt *Updat
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/labels.html#subscribe-to-a-label
-func (s *LabelsService) SubscribeToLabel(pid interface{}, lid interface{}, options ...RequestOptionFunc) (*Label, *Response, error) {
+func (s *LabelsService) SubscribeToLabel(pid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Label, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, nil, err
 	}
-	label, err := parseID(lid)
+	label, err := parseID(labelID)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -282,12 +274,12 @@ func (s *LabelsService) SubscribeToLabel(pid interface{}, lid interface{}, optio
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/labels.html#unsubscribe-from-a-label
-func (s *LabelsService) UnsubscribeFromLabel(pid interface{}, lid interface{}, options ...RequestOptionFunc) (*Response, error) {
+func (s *LabelsService) UnsubscribeFromLabel(pid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, err
 	}
-	label, err := parseID(lid)
+	label, err := parseID(labelID)
 	if err != nil {
 		return nil, err
 	}
@@ -305,12 +297,12 @@ func (s *LabelsService) UnsubscribeFromLabel(pid interface{}, lid interface{}, o
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/labels.html#promote-a-project-label-to-a-group-label
-func (s *LabelsService) PromoteLabel(pid interface{}, lid interface{}, options ...RequestOptionFunc) (*Response, error) {
+func (s *LabelsService) PromoteLabel(pid interface{}, labelID interface{}, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, err
 	}
-	label, err := parseID(lid)
+	label, err := parseID(labelID)
 	if err != nil {
 		return nil, err
 	}
diff --git a/metadata.go b/metadata.go
index 3550c49..db23a81 100644
--- a/metadata.go
+++ b/metadata.go
@@ -33,10 +33,9 @@ type Metadata struct {
 	Version  string `json:"version"`
 	Revision string `json:"revision"`
 	KAS      struct {
-		Enabled             bool   `json:"enabled"`
-		ExternalURL         string `json:"externalUrl"`
-		ExternalK8SProxyURL string `json:"externalK8sProxyUrl"`
-		Version             string `json:"version"`
+		Enabled     bool   `json:"enabled"`
+		ExternalURL string `json:"externalUrl"`
+		Version     string `json:"version"`
 	} `json:"kas"`
 	Enterprise bool `json:"enterprise"`
 }
diff --git a/pages.go b/pages.go
index 7b0f503..81be8ba 100644
--- a/pages.go
+++ b/pages.go
@@ -90,38 +90,3 @@ func (s *PagesService) GetPages(gid interface{}, options ...RequestOptionFunc) (
 
 	return p, resp, nil
 }
-
-// UpdatePages represents the available UpdatePages() options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pages.html#update-pages-settings-for-a-project
-type UpdatePagesOptions struct {
-	PagesUniqueDomainEnabled *bool `url:"pages_unique_domain_enabled,omitempty" json:"pages_unique_domain_enabled,omitempty"`
-	PagesHTTPSOnly           *bool `url:"pages_https_only,omitempty" json:"pages_https_only,omitempty"`
-}
-
-// UpdatePages updates Pages settings for a project. The user must have
-// administrator privileges.
-//
-// GitLab API Docs:
-// https://docs.gitlab.com/ee/api/pages.html#update-pages-settings-for-a-project
-func (s *PagesService) UpdatePages(pid interface{}, opt UpdatePagesOptions, options ...RequestOptionFunc) (*Pages, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/pages", PathEscape(project))
-
-	req, err := s.client.NewRequest(http.MethodPatch, u, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	p := new(Pages)
-	resp, err := s.client.Do(req, p)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return p, resp, nil
-}
diff --git a/pipelines.go b/pipelines.go
index 238fe57..3f24484 100644
--- a/pipelines.go
+++ b/pipelines.go
@@ -151,11 +151,9 @@ func (p PipelineInfo) String() string {
 	return Stringify(p)
 }
 
-// ListProjectPipelinesOptions represents the available ListProjectPipelines()
-// options.
+// ListProjectPipelinesOptions represents the available ListProjectPipelines() options.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines
 type ListProjectPipelinesOptions struct {
 	ListOptions
 	Scope         *string          `url:"scope,omitempty" json:"scope,omitempty"`
@@ -174,8 +172,7 @@ type ListProjectPipelinesOptions struct {
 
 // ListProjectPipelines gets a list of project piplines.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines
 func (s *PipelinesService) ListProjectPipelines(pid interface{}, opt *ListProjectPipelinesOptions, options ...RequestOptionFunc) ([]*PipelineInfo, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
@@ -199,8 +196,7 @@ func (s *PipelinesService) ListProjectPipelines(pid interface{}, opt *ListProjec
 
 // GetPipeline gets a single project pipeline.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#get-a-single-pipeline
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-a-single-pipeline
 func (s *PipelinesService) GetPipeline(pid interface{}, pipeline int, options ...RequestOptionFunc) (*Pipeline, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
@@ -224,8 +220,7 @@ func (s *PipelinesService) GetPipeline(pid interface{}, pipeline int, options ..
 
 // GetPipelineVariables gets the variables of a single project pipeline.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#get-variables-of-a-pipeline
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-variables-of-a-pipeline
 func (s *PipelinesService) GetPipelineVariables(pid interface{}, pipeline int, options ...RequestOptionFunc) ([]*PipelineVariable, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
@@ -249,8 +244,7 @@ func (s *PipelinesService) GetPipelineVariables(pid interface{}, pipeline int, o
 
 // GetPipelineTestReport gets the test report of a single project pipeline.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#get-a-pipelines-test-report
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-a-pipelines-test-report
 func (s *PipelinesService) GetPipelineTestReport(pid interface{}, pipeline int, options ...RequestOptionFunc) (*PipelineTestReport, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
@@ -274,16 +268,14 @@ func (s *PipelinesService) GetPipelineTestReport(pid interface{}, pipeline int,
 
 // GetLatestPipelineOptions represents the available GetLatestPipeline() options.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#get-the-latest-pipeline
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-the-latest-pipeline
 type GetLatestPipelineOptions struct {
 	Ref *string `url:"ref,omitempty" json:"ref,omitempty"`
 }
 
 // GetLatestPipeline gets the latest pipeline for a specific ref in a project.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#get-the-latest-pipeline
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#get-the-latest-pipeline
 func (s *PipelinesService) GetLatestPipeline(pid interface{}, opt *GetLatestPipelineOptions, options ...RequestOptionFunc) (*Pipeline, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
@@ -307,8 +299,7 @@ func (s *PipelinesService) GetLatestPipeline(pid interface{}, opt *GetLatestPipe
 
 // CreatePipelineOptions represents the available CreatePipeline() options.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#create-a-new-pipeline
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#create-a-new-pipeline
 type CreatePipelineOptions struct {
 	Ref       *string                     `url:"ref" json:"ref"`
 	Variables *[]*PipelineVariableOptions `url:"variables,omitempty" json:"variables,omitempty"`
@@ -325,8 +316,7 @@ type PipelineVariableOptions struct {
 
 // CreatePipeline creates a new project pipeline.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#create-a-new-pipeline
+// GitLab API docs: https://docs.gitlab.com/ee/api/pipelines.html#create-a-new-pipeline
 func (s *PipelinesService) CreatePipeline(pid interface{}, opt *CreatePipelineOptions, options ...RequestOptionFunc) (*Pipeline, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
@@ -348,7 +338,7 @@ func (s *PipelinesService) CreatePipeline(pid interface{}, opt *CreatePipelineOp
 	return p, resp, nil
 }
 
-// RetryPipelineBuild retries failed builds in a pipeline.
+// RetryPipelineBuild retries failed builds in a pipeline
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/pipelines.html#retry-jobs-in-a-pipeline
@@ -373,7 +363,7 @@ func (s *PipelinesService) RetryPipelineBuild(pid interface{}, pipeline int, opt
 	return p, resp, nil
 }
 
-// CancelPipelineBuild cancels a pipeline builds.
+// CancelPipelineBuild cancels a pipeline builds
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/pipelines.html#cancel-a-pipelines-jobs
@@ -416,38 +406,3 @@ func (s *PipelinesService) DeletePipeline(pid interface{}, pipeline int, options
 
 	return s.client.Do(req, nil)
 }
-
-// UpdatePipelineMetadataOptions represents the available UpdatePipelineMetadata()
-// options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#update-pipeline-metadata
-type UpdatePipelineMetadataOptions struct {
-	Name *string `url:"name,omitempty" json:"name,omitempty"`
-}
-
-// UpdatePipelineMetadata You can update the metadata of a pipeline. The metadata
-// contains the name of the pipeline.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/pipelines.html#update-pipeline-metadata
-func (s *PipelinesService) UpdatePipelineMetadata(pid interface{}, pipeline int, opt *UpdatePipelineMetadataOptions, options ...RequestOptionFunc) (*Pipeline, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/pipelines/%d/metadata", PathEscape(project), pipeline)
-
-	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	p := new(Pipeline)
-	resp, err := s.client.Do(req, p)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return p, resp, nil
-}
diff --git a/project_markdown_uploads.go b/project_markdown_uploads.go
deleted file mode 100644
index a8998e0..0000000
--- a/project_markdown_uploads.go
+++ /dev/null
@@ -1,210 +0,0 @@
-//
-// Copyright 2024, Sander van Harmelen
-//
-// 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 gitlab
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"net/http"
-	"time"
-)
-
-// ProjectMarkdownUploadsService handles communication with the project markdown uploads
-// related methods of the GitLab API.
-//
-// Gitlab API docs: https://docs.gitlab.com/ee/api/project_markdown_uploads.html
-type ProjectMarkdownUploadsService struct {
-	client *Client
-}
-
-// ProjectMarkdownUploadedFile represents a single project markdown uploaded file.
-//
-// Gitlab API docs: https://docs.gitlab.com/ee/api/project_markdown_uploads.html
-type ProjectMarkdownUploadedFile struct {
-	ID       int    `json:"id"`
-	Alt      string `json:"alt"`
-	URL      string `json:"url"`
-	FullPath string `json:"full_path"`
-	Markdown string `json:"markdown"`
-}
-
-// ProjectMarkdownUpload represents a single project markdown upload.
-//
-// Gitlab API docs: https://docs.gitlab.com/ee/api/project_markdown_uploads.html
-type ProjectMarkdownUpload struct {
-	ID         int        `json:"id"`
-	Size       int        `json:"size"`
-	Filename   string     `json:"filename"`
-	CreatedAt  *time.Time `json:"created_at"`
-	UploadedBy *User      `json:"uploaded_by"`
-}
-
-// Gets a string representation of a ProjectMarkdownUpload.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/project_markdown_uploads.html
-func (m ProjectMarkdownUpload) String() string {
-	return Stringify(m)
-}
-
-// UploadProjectMarkdown uploads a markdown file to a project.
-//
-// GitLab docs:
-// https://docs.gitlab.com/ee/api/project_markdown_uploads.html#upload-a-file
-func (s *ProjectMarkdownUploadsService) UploadProjectMarkdown(pid interface{}, content io.Reader, options ...RequestOptionFunc) (*ProjectMarkdownUploadedFile, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/uploads", PathEscape(project))
-
-	// We need to create the request as a GET request to make sure the options
-	// are set correctly. After the request is created we will overwrite both
-	// the method and the body.
-	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	// Overwrite the method and body.
-	req.Method = http.MethodPost
-	req.SetBody(content)
-
-	f := new(ProjectMarkdownUploadedFile)
-	resp, err := s.client.Do(req, f)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return f, resp, nil
-}
-
-// ListProjectMarkdownUploads gets all markdown uploads for a project.
-//
-// GitLab API Docs:
-// https://docs.gitlab.com/ee/api/project_markdown_uploads.html#list-uploads
-func (s *ProjectMarkdownUploadsService) ListProjectMarkdownUploads(pid interface{}, options ...RequestOptionFunc) ([]*ProjectMarkdownUpload, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/uploads", PathEscape(project))
-
-	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	var uploads []*ProjectMarkdownUpload
-	resp, err := s.client.Do(req, &uploads)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return uploads, resp, err
-}
-
-// DownloadProjectMarkdownUploadByID downloads a specific upload by ID.
-//
-// GitLab API Docs:
-// https://docs.gitlab.com/ee/api/project_markdown_uploads.html#download-an-uploaded-file-by-id
-func (s *ProjectMarkdownUploadsService) DownloadProjectMarkdownUploadByID(pid interface{}, uploadID int, options ...RequestOptionFunc) ([]byte, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/uploads/%d", PathEscape(project), uploadID)
-
-	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	var f bytes.Buffer
-	resp, err := s.client.Do(req, &f)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return f.Bytes(), resp, err
-}
-
-// DownloadProjectMarkdownUploadBySecretAndFilename downloads a specific upload
-// by secret and filename.
-//
-// GitLab API Docs:
-// https://docs.gitlab.com/ee/api/project_markdown_uploads.html#download-an-uploaded-file-by-secret-and-filename
-func (s *ProjectMarkdownUploadsService) DownloadProjectMarkdownUploadBySecretAndFilename(pid interface{}, secret string, filename string, options ...RequestOptionFunc) ([]byte, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/uploads/%s/%s", PathEscape(project), PathEscape(secret), PathEscape(filename))
-
-	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	var f bytes.Buffer
-	resp, err := s.client.Do(req, &f)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return f.Bytes(), resp, err
-}
-
-// DeleteProjectMarkdownUploadByID deletes an upload by ID.
-//
-// GitLab API Docs:
-// https://docs.gitlab.com/ee/api/project_markdown_uploads.html#delete-an-uploaded-file-by-id
-func (s *ProjectMarkdownUploadsService) DeleteProjectMarkdownUploadByID(pid interface{}, uploadID int, options ...RequestOptionFunc) (*Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("projects/%s/uploads/%d", PathEscape(project), uploadID)
-
-	req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
-	if err != nil {
-		return nil, err
-	}
-
-	return s.client.Do(req, nil)
-}
-
-// DeleteProjectMarkdownUploadBySecretAndFilename deletes an upload
-// by secret and filename.
-//
-// GitLab API Docs:
-// https://docs.gitlab.com/ee/api/project_markdown_uploads.html#delete-an-uploaded-file-by-secret-and-filename
-func (s *ProjectMarkdownUploadsService) DeleteProjectMarkdownUploadBySecretAndFilename(pid interface{}, secret string, filename string, options ...RequestOptionFunc) (*Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("projects/%s/uploads/%s/%s",
-		PathEscape(project), PathEscape(secret), PathEscape(filename))
-
-	req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
-	if err != nil {
-		return nil, err
-	}
-
-	return s.client.Do(req, nil)
-}
diff --git a/project_variables.go b/project_variables.go
index 9dea091..e75c746 100644
--- a/project_variables.go
+++ b/project_variables.go
@@ -41,7 +41,6 @@ type ProjectVariable struct {
 	VariableType     VariableTypeValue `json:"variable_type"`
 	Protected        bool              `json:"protected"`
 	Masked           bool              `json:"masked"`
-	Hidden           bool              `json:"hidden"`
 	Raw              bool              `json:"raw"`
 	EnvironmentScope string            `json:"environment_scope"`
 	Description      string            `json:"description"`
@@ -133,7 +132,6 @@ type CreateProjectVariableOptions struct {
 	Description      *string            `url:"description,omitempty" json:"description,omitempty"`
 	EnvironmentScope *string            `url:"environment_scope,omitempty" json:"environment_scope,omitempty"`
 	Masked           *bool              `url:"masked,omitempty" json:"masked,omitempty"`
-	MaskedAndHidden  *bool              `url:"masked_and_hidden,omitempty" json:"masked_and_hidden,omitempty"`
 	Protected        *bool              `url:"protected,omitempty" json:"protected,omitempty"`
 	Raw              *bool              `url:"raw,omitempty" json:"raw,omitempty"`
 	VariableType     *VariableTypeValue `url:"variable_type,omitempty" json:"variable_type,omitempty"`
diff --git a/projects.go b/projects.go
index 0400273..424196b 100644
--- a/projects.go
+++ b/projects.go
@@ -129,50 +129,49 @@ type Project struct {
 		GroupFullPath    string `json:"group_full_path"`
 		GroupAccessLevel int    `json:"group_access_level"`
 	} `json:"shared_with_groups"`
-	Statistics                               *Statistics                                 `json:"statistics"`
-	Links                                    *Links                                      `json:"_links,omitempty"`
-	ImportURL                                string                                      `json:"import_url"`
-	ImportType                               string                                      `json:"import_type"`
-	ImportStatus                             string                                      `json:"import_status"`
-	ImportError                              string                                      `json:"import_error"`
-	CIDefaultGitDepth                        int                                         `json:"ci_default_git_depth"`
-	CIForwardDeploymentEnabled               bool                                        `json:"ci_forward_deployment_enabled"`
-	CIForwardDeploymentRollbackAllowed       bool                                        `json:"ci_forward_deployment_rollback_allowed"`
-	CISeperateCache                          bool                                        `json:"ci_separated_caches"`
-	CIJobTokenScopeEnabled                   bool                                        `json:"ci_job_token_scope_enabled"`
-	CIOptInJWT                               bool                                        `json:"ci_opt_in_jwt"`
-	CIAllowForkPipelinesToRunInParentProject bool                                        `json:"ci_allow_fork_pipelines_to_run_in_parent_project"`
-	CIRestrictPipelineCancellationRole       AccessControlValue                          `json:"ci_restrict_pipeline_cancellation_role"`
-	PublicJobs                               bool                                        `json:"public_jobs"`
-	BuildTimeout                             int                                         `json:"build_timeout"`
-	AutoCancelPendingPipelines               string                                      `json:"auto_cancel_pending_pipelines"`
-	CIConfigPath                             string                                      `json:"ci_config_path"`
-	CustomAttributes                         []*CustomAttribute                          `json:"custom_attributes"`
-	ComplianceFrameworks                     []string                                    `json:"compliance_frameworks"`
-	BuildCoverageRegex                       string                                      `json:"build_coverage_regex"`
-	IssuesTemplate                           string                                      `json:"issues_template"`
-	MergeRequestsTemplate                    string                                      `json:"merge_requests_template"`
-	IssueBranchTemplate                      string                                      `json:"issue_branch_template"`
-	KeepLatestArtifact                       bool                                        `json:"keep_latest_artifact"`
-	MergePipelinesEnabled                    bool                                        `json:"merge_pipelines_enabled"`
-	MergeTrainsEnabled                       bool                                        `json:"merge_trains_enabled"`
-	RestrictUserDefinedVariables             bool                                        `json:"restrict_user_defined_variables"`
-	CIPipelineVariablesMinimumOverrideRole   CIPipelineVariablesMinimumOverrideRoleValue `json:"ci_pipeline_variables_minimum_override_role"`
-	MergeCommitTemplate                      string                                      `json:"merge_commit_template"`
-	SquashCommitTemplate                     string                                      `json:"squash_commit_template"`
-	AutoDevopsDeployStrategy                 string                                      `json:"auto_devops_deploy_strategy"`
-	AutoDevopsEnabled                        bool                                        `json:"auto_devops_enabled"`
-	BuildGitStrategy                         string                                      `json:"build_git_strategy"`
-	EmailsEnabled                            bool                                        `json:"emails_enabled"`
-	ExternalAuthorizationClassificationLabel string                                      `json:"external_authorization_classification_label"`
-	RequirementsEnabled                      bool                                        `json:"requirements_enabled"`
-	RequirementsAccessLevel                  AccessControlValue                          `json:"requirements_access_level"`
-	SecurityAndComplianceEnabled             bool                                        `json:"security_and_compliance_enabled"`
-	SecurityAndComplianceAccessLevel         AccessControlValue                          `json:"security_and_compliance_access_level"`
-	MergeRequestDefaultTargetSelf            bool                                        `json:"mr_default_target_self"`
-	ModelExperimentsAccessLevel              AccessControlValue                          `json:"model_experiments_access_level"`
-	ModelRegistryAccessLevel                 AccessControlValue                          `json:"model_registry_access_level"`
-	PreReceiveSecretDetectionEnabled         bool                                        `json:"pre_receive_secret_detection_enabled"`
+	Statistics                               *Statistics        `json:"statistics"`
+	Links                                    *Links             `json:"_links,omitempty"`
+	ImportURL                                string             `json:"import_url"`
+	ImportType                               string             `json:"import_type"`
+	ImportStatus                             string             `json:"import_status"`
+	ImportError                              string             `json:"import_error"`
+	CIDefaultGitDepth                        int                `json:"ci_default_git_depth"`
+	CIForwardDeploymentEnabled               bool               `json:"ci_forward_deployment_enabled"`
+	CIForwardDeploymentRollbackAllowed       bool               `json:"ci_forward_deployment_rollback_allowed"`
+	CISeperateCache                          bool               `json:"ci_separated_caches"`
+	CIJobTokenScopeEnabled                   bool               `json:"ci_job_token_scope_enabled"`
+	CIOptInJWT                               bool               `json:"ci_opt_in_jwt"`
+	CIAllowForkPipelinesToRunInParentProject bool               `json:"ci_allow_fork_pipelines_to_run_in_parent_project"`
+	CIRestrictPipelineCancellationRole       AccessControlValue `json:"ci_restrict_pipeline_cancellation_role"`
+	PublicJobs                               bool               `json:"public_jobs"`
+	BuildTimeout                             int                `json:"build_timeout"`
+	AutoCancelPendingPipelines               string             `json:"auto_cancel_pending_pipelines"`
+	CIConfigPath                             string             `json:"ci_config_path"`
+	CustomAttributes                         []*CustomAttribute `json:"custom_attributes"`
+	ComplianceFrameworks                     []string           `json:"compliance_frameworks"`
+	BuildCoverageRegex                       string             `json:"build_coverage_regex"`
+	IssuesTemplate                           string             `json:"issues_template"`
+	MergeRequestsTemplate                    string             `json:"merge_requests_template"`
+	IssueBranchTemplate                      string             `json:"issue_branch_template"`
+	KeepLatestArtifact                       bool               `json:"keep_latest_artifact"`
+	MergePipelinesEnabled                    bool               `json:"merge_pipelines_enabled"`
+	MergeTrainsEnabled                       bool               `json:"merge_trains_enabled"`
+	RestrictUserDefinedVariables             bool               `json:"restrict_user_defined_variables"`
+	MergeCommitTemplate                      string             `json:"merge_commit_template"`
+	SquashCommitTemplate                     string             `json:"squash_commit_template"`
+	AutoDevopsDeployStrategy                 string             `json:"auto_devops_deploy_strategy"`
+	AutoDevopsEnabled                        bool               `json:"auto_devops_enabled"`
+	BuildGitStrategy                         string             `json:"build_git_strategy"`
+	EmailsEnabled                            bool               `json:"emails_enabled"`
+	ExternalAuthorizationClassificationLabel string             `json:"external_authorization_classification_label"`
+	RequirementsEnabled                      bool               `json:"requirements_enabled"`
+	RequirementsAccessLevel                  AccessControlValue `json:"requirements_access_level"`
+	SecurityAndComplianceEnabled             bool               `json:"security_and_compliance_enabled"`
+	SecurityAndComplianceAccessLevel         AccessControlValue `json:"security_and_compliance_access_level"`
+	MergeRequestDefaultTargetSelf            bool               `json:"mr_default_target_self"`
+	ModelExperimentsAccessLevel              AccessControlValue `json:"model_experiments_access_level"`
+	ModelRegistryAccessLevel                 AccessControlValue `json:"model_registry_access_level"`
+	PreReceiveSecretDetectionEnabled         bool               `json:"pre_receive_secret_detection_enabled"`
 
 	// Deprecated: Use EmailsEnabled instead
 	EmailsDisabled bool `json:"emails_disabled"`
@@ -835,90 +834,89 @@ func (s *ProjectsService) CreateProjectForUser(user int, opt *CreateProjectForUs
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/projects.html#edit-project
 type EditProjectOptions struct {
-	AllowMergeOnSkippedPipeline               *bool                                        `url:"allow_merge_on_skipped_pipeline,omitempty" json:"allow_merge_on_skipped_pipeline,omitempty"`
-	AllowPipelineTriggerApproveDeployment     *bool                                        `url:"allow_pipeline_trigger_approve_deployment,omitempty" json:"allow_pipeline_trigger_approve_deployment,omitempty"`
-	OnlyAllowMergeIfAllStatusChecksPassed     *bool                                        `url:"only_allow_merge_if_all_status_checks_passed,omitempty" json:"only_allow_merge_if_all_status_checks_passed,omitempty"`
-	AnalyticsAccessLevel                      *AccessControlValue                          `url:"analytics_access_level,omitempty" json:"analytics_access_level,omitempty"`
-	ApprovalsBeforeMerge                      *int                                         `url:"approvals_before_merge,omitempty" json:"approvals_before_merge,omitempty"`
-	AutoCancelPendingPipelines                *string                                      `url:"auto_cancel_pending_pipelines,omitempty" json:"auto_cancel_pending_pipelines,omitempty"`
-	AutoDevopsDeployStrategy                  *string                                      `url:"auto_devops_deploy_strategy,omitempty" json:"auto_devops_deploy_strategy,omitempty"`
-	AutoDevopsEnabled                         *bool                                        `url:"auto_devops_enabled,omitempty" json:"auto_devops_enabled,omitempty"`
-	AutocloseReferencedIssues                 *bool                                        `url:"autoclose_referenced_issues,omitempty" json:"autoclose_referenced_issues,omitempty"`
-	Avatar                                    *ProjectAvatar                               `url:"-" json:"avatar,omitempty"`
-	BuildCoverageRegex                        *string                                      `url:"build_coverage_regex,omitempty" json:"build_coverage_regex,omitempty"`
-	BuildGitStrategy                          *string                                      `url:"build_git_strategy,omitempty" json:"build_git_strategy,omitempty"`
-	BuildTimeout                              *int                                         `url:"build_timeout,omitempty" json:"build_timeout,omitempty"`
-	BuildsAccessLevel                         *AccessControlValue                          `url:"builds_access_level,omitempty" json:"builds_access_level,omitempty"`
-	CIConfigPath                              *string                                      `url:"ci_config_path,omitempty" json:"ci_config_path,omitempty"`
-	CIDefaultGitDepth                         *int                                         `url:"ci_default_git_depth,omitempty" json:"ci_default_git_depth,omitempty"`
-	CIForwardDeploymentEnabled                *bool                                        `url:"ci_forward_deployment_enabled,omitempty" json:"ci_forward_deployment_enabled,omitempty"`
-	CIForwardDeploymentRollbackAllowed        *bool                                        `url:"ci_forward_deployment_rollback_allowed,omitempty" json:"ci_forward_deployment_rollback_allowed,omitempty"`
-	CISeperateCache                           *bool                                        `url:"ci_separated_caches,omitempty" json:"ci_separated_caches,omitempty"`
-	CIRestrictPipelineCancellationRole        *AccessControlValue                          `url:"ci_restrict_pipeline_cancellation_role,omitempty" json:"ci_restrict_pipeline_cancellation_role,omitempty"`
-	CIPipelineVariablesMinimumOverrideRole    *CIPipelineVariablesMinimumOverrideRoleValue `url:"ci_pipeline_variables_minimum_override_role,omitempty" json:"ci_pipeline_variables_minimum_override_role,omitempty"`
-	ContainerExpirationPolicyAttributes       *ContainerExpirationPolicyAttributes         `url:"container_expiration_policy_attributes,omitempty" json:"container_expiration_policy_attributes,omitempty"`
-	ContainerRegistryAccessLevel              *AccessControlValue                          `url:"container_registry_access_level,omitempty" json:"container_registry_access_level,omitempty"`
-	DefaultBranch                             *string                                      `url:"default_branch,omitempty" json:"default_branch,omitempty"`
-	Description                               *string                                      `url:"description,omitempty" json:"description,omitempty"`
-	EmailsEnabled                             *bool                                        `url:"emails_enabled,omitempty" json:"emails_enabled,omitempty"`
-	EnforceAuthChecksOnUploads                *bool                                        `url:"enforce_auth_checks_on_uploads,omitempty" json:"enforce_auth_checks_on_uploads,omitempty"`
-	ExternalAuthorizationClassificationLabel  *string                                      `url:"external_authorization_classification_label,omitempty" json:"external_authorization_classification_label,omitempty"`
-	ForkingAccessLevel                        *AccessControlValue                          `url:"forking_access_level,omitempty" json:"forking_access_level,omitempty"`
-	ImportURL                                 *string                                      `url:"import_url,omitempty" json:"import_url,omitempty"`
-	IssuesAccessLevel                         *AccessControlValue                          `url:"issues_access_level,omitempty" json:"issues_access_level,omitempty"`
-	IssueBranchTemplate                       *string                                      `url:"issue_branch_template,omitempty" json:"issue_branch_template,omitempty"`
-	IssuesTemplate                            *string                                      `url:"issues_template,omitempty" json:"issues_template,omitempty"`
-	KeepLatestArtifact                        *bool                                        `url:"keep_latest_artifact,omitempty" json:"keep_latest_artifact,omitempty"`
-	LFSEnabled                                *bool                                        `url:"lfs_enabled,omitempty" json:"lfs_enabled,omitempty"`
-	MergeCommitTemplate                       *string                                      `url:"merge_commit_template,omitempty" json:"merge_commit_template,omitempty"`
-	MergeRequestDefaultTargetSelf             *bool                                        `url:"mr_default_target_self,omitempty" json:"mr_default_target_self,omitempty"`
-	MergeMethod                               *MergeMethodValue                            `url:"merge_method,omitempty" json:"merge_method,omitempty"`
-	MergePipelinesEnabled                     *bool                                        `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"`
-	MergeRequestsAccessLevel                  *AccessControlValue                          `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"`
-	MergeRequestsTemplate                     *string                                      `url:"merge_requests_template,omitempty" json:"merge_requests_template,omitempty"`
-	MergeTrainsEnabled                        *bool                                        `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"`
-	Mirror                                    *bool                                        `url:"mirror,omitempty" json:"mirror,omitempty"`
-	MirrorBranchRegex                         *string                                      `url:"mirror_branch_regex,omitempty" json:"mirror_branch_regex,omitempty"`
-	MirrorOverwritesDivergedBranches          *bool                                        `url:"mirror_overwrites_diverged_branches,omitempty" json:"mirror_overwrites_diverged_branches,omitempty"`
-	MirrorTriggerBuilds                       *bool                                        `url:"mirror_trigger_builds,omitempty" json:"mirror_trigger_builds,omitempty"`
-	MirrorUserID                              *int                                         `url:"mirror_user_id,omitempty" json:"mirror_user_id,omitempty"`
-	ModelExperimentsAccessLevel               *AccessControlValue                          `url:"model_experiments_access_level,omitempty" json:"model_experiments_access_level,omitempty"`
-	ModelRegistryAccessLevel                  *AccessControlValue                          `url:"model_registry_access_level,omitempty" json:"model_registry_access_level,omitempty"`
-	Name                                      *string                                      `url:"name,omitempty" json:"name,omitempty"`
-	OnlyAllowMergeIfAllDiscussionsAreResolved *bool                                        `url:"only_allow_merge_if_all_discussions_are_resolved,omitempty" json:"only_allow_merge_if_all_discussions_are_resolved,omitempty"`
-	OnlyAllowMergeIfPipelineSucceeds          *bool                                        `url:"only_allow_merge_if_pipeline_succeeds,omitempty" json:"only_allow_merge_if_pipeline_succeeds,omitempty"`
-	OnlyMirrorProtectedBranches               *bool                                        `url:"only_mirror_protected_branches,omitempty" json:"only_mirror_protected_branches,omitempty"`
-	OperationsAccessLevel                     *AccessControlValue                          `url:"operations_access_level,omitempty" json:"operations_access_level,omitempty"`
-	PackagesEnabled                           *bool                                        `url:"packages_enabled,omitempty" json:"packages_enabled,omitempty"`
-	PagesAccessLevel                          *AccessControlValue                          `url:"pages_access_level,omitempty" json:"pages_access_level,omitempty"`
-	Path                                      *string                                      `url:"path,omitempty" json:"path,omitempty"`
-	PublicBuilds                              *bool                                        `url:"public_builds,omitempty" json:"public_builds,omitempty"`
-	ReleasesAccessLevel                       *AccessControlValue                          `url:"releases_access_level,omitempty" json:"releases_access_level,omitempty"`
-	EnvironmentsAccessLevel                   *AccessControlValue                          `url:"environments_access_level,omitempty" json:"environments_access_level,omitempty"`
-	FeatureFlagsAccessLevel                   *AccessControlValue                          `url:"feature_flags_access_level,omitempty" json:"feature_flags_access_level,omitempty"`
-	InfrastructureAccessLevel                 *AccessControlValue                          `url:"infrastructure_access_level,omitempty" json:"infrastructure_access_level,omitempty"`
-	MonitorAccessLevel                        *AccessControlValue                          `url:"monitor_access_level,omitempty" json:"monitor_access_level,omitempty"`
-	RemoveSourceBranchAfterMerge              *bool                                        `url:"remove_source_branch_after_merge,omitempty" json:"remove_source_branch_after_merge,omitempty"`
-	PreventMergeWithoutJiraIssue              *bool                                        `url:"prevent_merge_without_jira_issue,omitempty" json:"prevent_merge_without_jira_issue,omitempty"`
-	PrintingMergeRequestLinkEnabled           *bool                                        `url:"printing_merge_request_link_enabled,omitempty" json:"printing_merge_request_link_enabled,omitempty"`
-	RepositoryAccessLevel                     *AccessControlValue                          `url:"repository_access_level,omitempty" json:"repository_access_level,omitempty"`
-	RepositoryStorage                         *string                                      `url:"repository_storage,omitempty" json:"repository_storage,omitempty"`
-	RequestAccessEnabled                      *bool                                        `url:"request_access_enabled,omitempty" json:"request_access_enabled,omitempty"`
-	RequirementsAccessLevel                   *AccessControlValue                          `url:"requirements_access_level,omitempty" json:"requirements_access_level,omitempty"`
-	ResolveOutdatedDiffDiscussions            *bool                                        `url:"resolve_outdated_diff_discussions,omitempty" json:"resolve_outdated_diff_discussions,omitempty"`
-	RestrictUserDefinedVariables              *bool                                        `url:"restrict_user_defined_variables,omitempty" json:"restrict_user_defined_variables,omitempty"`
-	SecurityAndComplianceAccessLevel          *AccessControlValue                          `url:"security_and_compliance_access_level,omitempty" json:"security_and_compliance_access_level,omitempty"`
-	ServiceDeskEnabled                        *bool                                        `url:"service_desk_enabled,omitempty" json:"service_desk_enabled,omitempty"`
-	SharedRunnersEnabled                      *bool                                        `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"`
-	GroupRunnersEnabled                       *bool                                        `url:"group_runners_enabled,omitempty" json:"group_runners_enabled,omitempty"`
-	ShowDefaultAwardEmojis                    *bool                                        `url:"show_default_award_emojis,omitempty" json:"show_default_award_emojis,omitempty"`
-	SnippetsAccessLevel                       *AccessControlValue                          `url:"snippets_access_level,omitempty" json:"snippets_access_level,omitempty"`
-	SquashCommitTemplate                      *string                                      `url:"squash_commit_template,omitempty" json:"squash_commit_template,omitempty"`
-	SquashOption                              *SquashOptionValue                           `url:"squash_option,omitempty" json:"squash_option,omitempty"`
-	SuggestionCommitMessage                   *string                                      `url:"suggestion_commit_message,omitempty" json:"suggestion_commit_message,omitempty"`
-	Topics                                    *[]string                                    `url:"topics,omitempty" json:"topics,omitempty"`
-	Visibility                                *VisibilityValue                             `url:"visibility,omitempty" json:"visibility,omitempty"`
-	WikiAccessLevel                           *AccessControlValue                          `url:"wiki_access_level,omitempty" json:"wiki_access_level,omitempty"`
+	AllowMergeOnSkippedPipeline               *bool                                `url:"allow_merge_on_skipped_pipeline,omitempty" json:"allow_merge_on_skipped_pipeline,omitempty"`
+	AllowPipelineTriggerApproveDeployment     *bool                                `url:"allow_pipeline_trigger_approve_deployment,omitempty" json:"allow_pipeline_trigger_approve_deployment,omitempty"`
+	OnlyAllowMergeIfAllStatusChecksPassed     *bool                                `url:"only_allow_merge_if_all_status_checks_passed,omitempty" json:"only_allow_merge_if_all_status_checks_passed,omitempty"`
+	AnalyticsAccessLevel                      *AccessControlValue                  `url:"analytics_access_level,omitempty" json:"analytics_access_level,omitempty"`
+	ApprovalsBeforeMerge                      *int                                 `url:"approvals_before_merge,omitempty" json:"approvals_before_merge,omitempty"`
+	AutoCancelPendingPipelines                *string                              `url:"auto_cancel_pending_pipelines,omitempty" json:"auto_cancel_pending_pipelines,omitempty"`
+	AutoDevopsDeployStrategy                  *string                              `url:"auto_devops_deploy_strategy,omitempty" json:"auto_devops_deploy_strategy,omitempty"`
+	AutoDevopsEnabled                         *bool                                `url:"auto_devops_enabled,omitempty" json:"auto_devops_enabled,omitempty"`
+	AutocloseReferencedIssues                 *bool                                `url:"autoclose_referenced_issues,omitempty" json:"autoclose_referenced_issues,omitempty"`
+	Avatar                                    *ProjectAvatar                       `url:"-" json:"avatar,omitempty"`
+	BuildCoverageRegex                        *string                              `url:"build_coverage_regex,omitempty" json:"build_coverage_regex,omitempty"`
+	BuildGitStrategy                          *string                              `url:"build_git_strategy,omitempty" json:"build_git_strategy,omitempty"`
+	BuildTimeout                              *int                                 `url:"build_timeout,omitempty" json:"build_timeout,omitempty"`
+	BuildsAccessLevel                         *AccessControlValue                  `url:"builds_access_level,omitempty" json:"builds_access_level,omitempty"`
+	CIConfigPath                              *string                              `url:"ci_config_path,omitempty" json:"ci_config_path,omitempty"`
+	CIDefaultGitDepth                         *int                                 `url:"ci_default_git_depth,omitempty" json:"ci_default_git_depth,omitempty"`
+	CIForwardDeploymentEnabled                *bool                                `url:"ci_forward_deployment_enabled,omitempty" json:"ci_forward_deployment_enabled,omitempty"`
+	CIForwardDeploymentRollbackAllowed        *bool                                `url:"ci_forward_deployment_rollback_allowed,omitempty" json:"ci_forward_deployment_rollback_allowed,omitempty"`
+	CISeperateCache                           *bool                                `url:"ci_separated_caches,omitempty" json:"ci_separated_caches,omitempty"`
+	CIRestrictPipelineCancellationRole        *AccessControlValue                  `url:"ci_restrict_pipeline_cancellation_role,omitempty" json:"ci_restrict_pipeline_cancellation_role,omitempty"`
+	ContainerExpirationPolicyAttributes       *ContainerExpirationPolicyAttributes `url:"container_expiration_policy_attributes,omitempty" json:"container_expiration_policy_attributes,omitempty"`
+	ContainerRegistryAccessLevel              *AccessControlValue                  `url:"container_registry_access_level,omitempty" json:"container_registry_access_level,omitempty"`
+	DefaultBranch                             *string                              `url:"default_branch,omitempty" json:"default_branch,omitempty"`
+	Description                               *string                              `url:"description,omitempty" json:"description,omitempty"`
+	EmailsEnabled                             *bool                                `url:"emails_enabled,omitempty" json:"emails_enabled,omitempty"`
+	EnforceAuthChecksOnUploads                *bool                                `url:"enforce_auth_checks_on_uploads,omitempty" json:"enforce_auth_checks_on_uploads,omitempty"`
+	ExternalAuthorizationClassificationLabel  *string                              `url:"external_authorization_classification_label,omitempty" json:"external_authorization_classification_label,omitempty"`
+	ForkingAccessLevel                        *AccessControlValue                  `url:"forking_access_level,omitempty" json:"forking_access_level,omitempty"`
+	ImportURL                                 *string                              `url:"import_url,omitempty" json:"import_url,omitempty"`
+	IssuesAccessLevel                         *AccessControlValue                  `url:"issues_access_level,omitempty" json:"issues_access_level,omitempty"`
+	IssueBranchTemplate                       *string                              `url:"issue_branch_template,omitempty" json:"issue_branch_template,omitempty"`
+	IssuesTemplate                            *string                              `url:"issues_template,omitempty" json:"issues_template,omitempty"`
+	KeepLatestArtifact                        *bool                                `url:"keep_latest_artifact,omitempty" json:"keep_latest_artifact,omitempty"`
+	LFSEnabled                                *bool                                `url:"lfs_enabled,omitempty" json:"lfs_enabled,omitempty"`
+	MergeCommitTemplate                       *string                              `url:"merge_commit_template,omitempty" json:"merge_commit_template,omitempty"`
+	MergeRequestDefaultTargetSelf             *bool                                `url:"mr_default_target_self,omitempty" json:"mr_default_target_self,omitempty"`
+	MergeMethod                               *MergeMethodValue                    `url:"merge_method,omitempty" json:"merge_method,omitempty"`
+	MergePipelinesEnabled                     *bool                                `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"`
+	MergeRequestsAccessLevel                  *AccessControlValue                  `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"`
+	MergeRequestsTemplate                     *string                              `url:"merge_requests_template,omitempty" json:"merge_requests_template,omitempty"`
+	MergeTrainsEnabled                        *bool                                `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"`
+	Mirror                                    *bool                                `url:"mirror,omitempty" json:"mirror,omitempty"`
+	MirrorBranchRegex                         *string                              `url:"mirror_branch_regex,omitempty" json:"mirror_branch_regex,omitempty"`
+	MirrorOverwritesDivergedBranches          *bool                                `url:"mirror_overwrites_diverged_branches,omitempty" json:"mirror_overwrites_diverged_branches,omitempty"`
+	MirrorTriggerBuilds                       *bool                                `url:"mirror_trigger_builds,omitempty" json:"mirror_trigger_builds,omitempty"`
+	MirrorUserID                              *int                                 `url:"mirror_user_id,omitempty" json:"mirror_user_id,omitempty"`
+	ModelExperimentsAccessLevel               *AccessControlValue                  `url:"model_experiments_access_level,omitempty" json:"model_experiments_access_level,omitempty"`
+	ModelRegistryAccessLevel                  *AccessControlValue                  `url:"model_registry_access_level,omitempty" json:"model_registry_access_level,omitempty"`
+	Name                                      *string                              `url:"name,omitempty" json:"name,omitempty"`
+	OnlyAllowMergeIfAllDiscussionsAreResolved *bool                                `url:"only_allow_merge_if_all_discussions_are_resolved,omitempty" json:"only_allow_merge_if_all_discussions_are_resolved,omitempty"`
+	OnlyAllowMergeIfPipelineSucceeds          *bool                                `url:"only_allow_merge_if_pipeline_succeeds,omitempty" json:"only_allow_merge_if_pipeline_succeeds,omitempty"`
+	OnlyMirrorProtectedBranches               *bool                                `url:"only_mirror_protected_branches,omitempty" json:"only_mirror_protected_branches,omitempty"`
+	OperationsAccessLevel                     *AccessControlValue                  `url:"operations_access_level,omitempty" json:"operations_access_level,omitempty"`
+	PackagesEnabled                           *bool                                `url:"packages_enabled,omitempty" json:"packages_enabled,omitempty"`
+	PagesAccessLevel                          *AccessControlValue                  `url:"pages_access_level,omitempty" json:"pages_access_level,omitempty"`
+	Path                                      *string                              `url:"path,omitempty" json:"path,omitempty"`
+	PublicBuilds                              *bool                                `url:"public_builds,omitempty" json:"public_builds,omitempty"`
+	ReleasesAccessLevel                       *AccessControlValue                  `url:"releases_access_level,omitempty" json:"releases_access_level,omitempty"`
+	EnvironmentsAccessLevel                   *AccessControlValue                  `url:"environments_access_level,omitempty" json:"environments_access_level,omitempty"`
+	FeatureFlagsAccessLevel                   *AccessControlValue                  `url:"feature_flags_access_level,omitempty" json:"feature_flags_access_level,omitempty"`
+	InfrastructureAccessLevel                 *AccessControlValue                  `url:"infrastructure_access_level,omitempty" json:"infrastructure_access_level,omitempty"`
+	MonitorAccessLevel                        *AccessControlValue                  `url:"monitor_access_level,omitempty" json:"monitor_access_level,omitempty"`
+	RemoveSourceBranchAfterMerge              *bool                                `url:"remove_source_branch_after_merge,omitempty" json:"remove_source_branch_after_merge,omitempty"`
+	PreventMergeWithoutJiraIssue              *bool                                `url:"prevent_merge_without_jira_issue,omitempty" json:"prevent_merge_without_jira_issue,omitempty"`
+	PrintingMergeRequestLinkEnabled           *bool                                `url:"printing_merge_request_link_enabled,omitempty" json:"printing_merge_request_link_enabled,omitempty"`
+	RepositoryAccessLevel                     *AccessControlValue                  `url:"repository_access_level,omitempty" json:"repository_access_level,omitempty"`
+	RepositoryStorage                         *string                              `url:"repository_storage,omitempty" json:"repository_storage,omitempty"`
+	RequestAccessEnabled                      *bool                                `url:"request_access_enabled,omitempty" json:"request_access_enabled,omitempty"`
+	RequirementsAccessLevel                   *AccessControlValue                  `url:"requirements_access_level,omitempty" json:"requirements_access_level,omitempty"`
+	ResolveOutdatedDiffDiscussions            *bool                                `url:"resolve_outdated_diff_discussions,omitempty" json:"resolve_outdated_diff_discussions,omitempty"`
+	RestrictUserDefinedVariables              *bool                                `url:"restrict_user_defined_variables,omitempty" json:"restrict_user_defined_variables,omitempty"`
+	SecurityAndComplianceAccessLevel          *AccessControlValue                  `url:"security_and_compliance_access_level,omitempty" json:"security_and_compliance_access_level,omitempty"`
+	ServiceDeskEnabled                        *bool                                `url:"service_desk_enabled,omitempty" json:"service_desk_enabled,omitempty"`
+	SharedRunnersEnabled                      *bool                                `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"`
+	GroupRunnersEnabled                       *bool                                `url:"group_runners_enabled,omitempty" json:"group_runners_enabled,omitempty"`
+	ShowDefaultAwardEmojis                    *bool                                `url:"show_default_award_emojis,omitempty" json:"show_default_award_emojis,omitempty"`
+	SnippetsAccessLevel                       *AccessControlValue                  `url:"snippets_access_level,omitempty" json:"snippets_access_level,omitempty"`
+	SquashCommitTemplate                      *string                              `url:"squash_commit_template,omitempty" json:"squash_commit_template,omitempty"`
+	SquashOption                              *SquashOptionValue                   `url:"squash_option,omitempty" json:"squash_option,omitempty"`
+	SuggestionCommitMessage                   *string                              `url:"suggestion_commit_message,omitempty" json:"suggestion_commit_message,omitempty"`
+	Topics                                    *[]string                            `url:"topics,omitempty" json:"topics,omitempty"`
+	Visibility                                *VisibilityValue                     `url:"visibility,omitempty" json:"visibility,omitempty"`
+	WikiAccessLevel                           *AccessControlValue                  `url:"wiki_access_level,omitempty" json:"wiki_access_level,omitempty"`
 
 	// Deprecated: Use ContainerRegistryAccessLevel instead.
 	ContainerRegistryEnabled *bool `url:"container_registry_enabled,omitempty" json:"container_registry_enabled,omitempty"`
@@ -1270,8 +1268,6 @@ type HookCustomHeader struct {
 type ProjectHook struct {
 	ID                        int                 `json:"id"`
 	URL                       string              `json:"url"`
-	Name                      string              `json:"name"`
-	Description               string              `json:"description"`
 	ConfidentialNoteEvents    bool                `json:"confidential_note_events"`
 	ProjectID                 int                 `json:"project_id"`
 	PushEvents                bool                `json:"push_events"`
@@ -1354,8 +1350,6 @@ func (s *ProjectsService) GetProjectHook(pid interface{}, hook int, options ...R
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/projects.html#add-project-hook
 type AddProjectHookOptions struct {
-	Name                      *string              `url:"name,omitempty" json:"name,omitempty"`
-	Description               *string              `url:"description,omitempty" json:"description,omitempty"`
 	ConfidentialIssuesEvents  *bool                `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"`
 	ConfidentialNoteEvents    *bool                `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"`
 	DeploymentEvents          *bool                `url:"deployment_events,omitempty" json:"deployment_events,omitempty"`
@@ -1407,8 +1401,6 @@ func (s *ProjectsService) AddProjectHook(pid interface{}, opt *AddProjectHookOpt
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/projects.html#edit-project-hook
 type EditProjectHookOptions struct {
-	Name                      *string              `url:"name,omitempty" json:"name,omitempty"`
-	Description               *string              `url:"description,omitempty" json:"description,omitempty"`
 	ConfidentialIssuesEvents  *bool                `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"`
 	ConfidentialNoteEvents    *bool                `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"`
 	DeploymentEvents          *bool                `url:"deployment_events,omitempty" json:"deployment_events,omitempty"`
diff --git a/repositories.go b/repositories.go
index 3c59f9a..dde8761 100644
--- a/repositories.go
+++ b/repositories.go
@@ -209,7 +209,6 @@ type Compare struct {
 	Diffs          []*Diff   `json:"diffs"`
 	CompareTimeout bool      `json:"compare_timeout"`
 	CompareSameRef bool      `json:"compare_same_ref"`
-	WebURL         string    `json:"web_url"`
 }
 
 func (c Compare) String() string {
diff --git a/services.go b/services.go
index c8ae0c8..56eeca8 100644
--- a/services.go
+++ b/services.go
@@ -36,31 +36,27 @@ type ServicesService struct {
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/integrations.html
 type Service struct {
-	ID                             int        `json:"id"`
-	Title                          string     `json:"title"`
-	Slug                           string     `json:"slug"`
-	CreatedAt                      *time.Time `json:"created_at"`
-	UpdatedAt                      *time.Time `json:"updated_at"`
-	Active                         bool       `json:"active"`
-	AlertEvents                    bool       `json:"alert_events"`
-	CommitEvents                   bool       `json:"commit_events"`
-	ConfidentialIssuesEvents       bool       `json:"confidential_issues_events"`
-	ConfidentialNoteEvents         bool       `json:"confidential_note_events"`
-	DeploymentEvents               bool       `json:"deployment_events"`
-	GroupConfidentialMentionEvents bool       `json:"group_confidential_mention_events"`
-	GroupMentionEvents             bool       `json:"group_mention_events"`
-	IncidentEvents                 bool       `json:"incident_events"`
-	IssuesEvents                   bool       `json:"issues_events"`
-	JobEvents                      bool       `json:"job_events"`
-	MergeRequestsEvents            bool       `json:"merge_requests_events"`
-	NoteEvents                     bool       `json:"note_events"`
-	PipelineEvents                 bool       `json:"pipeline_events"`
-	PushEvents                     bool       `json:"push_events"`
-	TagPushEvents                  bool       `json:"tag_push_events"`
-	VulnerabilityEvents            bool       `json:"vulnerability_events"`
-	WikiPageEvents                 bool       `json:"wiki_page_events"`
-	CommentOnEventEnabled          bool       `json:"comment_on_event_enabled"`
-	Inherited                      bool       `json:"inherited"`
+	ID                       int        `json:"id"`
+	Title                    string     `json:"title"`
+	Slug                     string     `json:"slug"`
+	CreatedAt                *time.Time `json:"created_at"`
+	UpdatedAt                *time.Time `json:"updated_at"`
+	Active                   bool       `json:"active"`
+	PushEvents               bool       `json:"push_events"`
+	IssuesEvents             bool       `json:"issues_events"`
+	AlertEvents              bool       `json:"alert_events"`
+	ConfidentialIssuesEvents bool       `json:"confidential_issues_events"`
+	CommitEvents             bool       `json:"commit_events"`
+	MergeRequestsEvents      bool       `json:"merge_requests_events"`
+	CommentOnEventEnabled    bool       `json:"comment_on_event_enabled"`
+	TagPushEvents            bool       `json:"tag_push_events"`
+	NoteEvents               bool       `json:"note_events"`
+	ConfidentialNoteEvents   bool       `json:"confidential_note_events"`
+	PipelineEvents           bool       `json:"pipeline_events"`
+	JobEvents                bool       `json:"job_events"`
+	WikiPageEvents           bool       `json:"wiki_page_events"`
+	VulnerabilityEvents      bool       `json:"vulnerability_events"`
+	DeploymentEvents         bool       `json:"deployment_events"`
 }
 
 // ListServices gets a list of all active services.
@@ -146,25 +142,19 @@ type SetCustomIssueTrackerServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-a-custom-issue-tracker
-func (s *ServicesService) SetCustomIssueTrackerService(pid interface{}, opt *SetCustomIssueTrackerServiceOptions, options ...RequestOptionFunc) (*CustomIssueTrackerService, *Response, error) {
+func (s *ServicesService) SetCustomIssueTrackerService(pid interface{}, opt *SetCustomIssueTrackerServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/custom-issue-tracker", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(CustomIssueTrackerService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteCustomIssueTrackerService deletes Custom Issue Tracker service settings for a project.
@@ -252,25 +242,19 @@ type SetDataDogServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-datadog
-func (s *ServicesService) SetDataDogService(pid interface{}, opt *SetDataDogServiceOptions, options ...RequestOptionFunc) (*DataDogService, *Response, error) {
+func (s *ServicesService) SetDataDogService(pid interface{}, opt *SetDataDogServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/datadog", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(DataDogService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteDataDogService deletes the DataDog service settings for a project.
@@ -374,25 +358,19 @@ type SetDiscordServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-discord-notifications
-func (s *ServicesService) SetDiscordService(pid interface{}, opt *SetDiscordServiceOptions, options ...RequestOptionFunc) (*DiscordService, *Response, error) {
+func (s *ServicesService) SetDiscordService(pid interface{}, opt *SetDiscordServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/discord", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(DiscordService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, resp, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteDiscordService deletes Discord service settings for a project.
@@ -475,25 +453,19 @@ type SetDroneCIServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-drone
-func (s *ServicesService) SetDroneCIService(pid interface{}, opt *SetDroneCIServiceOptions, options ...RequestOptionFunc) (*DroneCIService, *Response, error) {
+func (s *ServicesService) SetDroneCIService(pid interface{}, opt *SetDroneCIServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/drone-ci", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(DroneCIService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteDroneCIService deletes Drone CI service settings for a project.
@@ -580,25 +552,19 @@ type SetEmailsOnPushServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-emails-on-push
-func (s *ServicesService) SetEmailsOnPushService(pid interface{}, opt *SetEmailsOnPushServiceOptions, options ...RequestOptionFunc) (*EmailsOnPushService, *Response, error) {
+func (s *ServicesService) SetEmailsOnPushService(pid interface{}, opt *SetEmailsOnPushServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/integrations/emails-on-push", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(EmailsOnPushService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteEmailsOnPushService deletes Emails on Push service settings for a project.
@@ -675,25 +641,19 @@ type SetExternalWikiServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-an-external-wiki
-func (s *ServicesService) SetExternalWikiService(pid interface{}, opt *SetExternalWikiServiceOptions, options ...RequestOptionFunc) (*ExternalWikiService, *Response, error) {
+func (s *ServicesService) SetExternalWikiService(pid interface{}, opt *SetExternalWikiServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/external-wiki", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(ExternalWikiService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteExternalWikiService deletes External Wiki service for project.
@@ -773,25 +733,19 @@ type SetGithubServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-github
-func (s *ServicesService) SetGithubService(pid interface{}, opt *SetGithubServiceOptions, options ...RequestOptionFunc) (*GithubService, *Response, error) {
+func (s *ServicesService) SetGithubService(pid interface{}, opt *SetGithubServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/github", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(GithubService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteGithubService deletes Github service for a project
@@ -876,25 +830,19 @@ type SetHarborServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-harbor
-func (s *ServicesService) SetHarborService(pid interface{}, opt *SetHarborServiceOptions, options ...RequestOptionFunc) (*HarborService, *Response, error) {
+func (s *ServicesService) SetHarborService(pid interface{}, opt *SetHarborServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/integrations/harbor", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(HarborService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteHarborService deletes Harbor service for a project.
@@ -930,24 +878,22 @@ type SlackApplication struct {
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#gitlab-for-slack-app
 type SlackApplicationProperties struct {
-	Channel                    string `json:"channel"`
-	NotifyOnlyBrokenPipelines  bool   `json:"notify_only_broken_pipelines"`
-	BranchesToBeNotified       string `json:"branches_to_be_notified"`
-	LabelsToBeNotified         string `json:"labels_to_be_notified"`
-	LabelsToBeNotifiedBehavior string `json:"labels_to_be_notified_behavior"`
-	PushChannel                string `json:"push_channel"`
-	IssueChannel               string `json:"issue_channel"`
-	ConfidentialIssueChannel   string `json:"confidential_issue_channel"`
-	MergeRequestChannel        string `json:"merge_request_channel"`
-	NoteChannel                string `json:"note_channel"`
-	ConfidentialNoteChannel    string `json:"confidential_note_channel"`
-	TagPushChannel             string `json:"tag_push_channel"`
-	PipelineChannel            string `json:"pipeline_channel"`
-	WikiPageChannel            string `json:"wiki_page_channel"`
-	DeploymentChannel          string `json:"deployment_channel"`
-	IncidentChannel            string `json:"incident_channel"`
-	VulnerabilityChannel       string `json:"vulnerability_channel"`
-	AlertChannel               string `json:"alert_channel"`
+	Channel                   string `json:"channel"`
+	NotifyOnlyBrokenPipelines bool   `json:"notify_only_broken_pipelines"`
+	BranchesToBeNotified      string `json:"branches_to_be_notified"`
+	AlertEvents               bool   `json:"alert_events"`
+	IssuesEvents              bool   `json:"issues_events"`
+	ConfidentialIssuesEvents  bool   `json:"confidential_issues_events"`
+	MergeRequestsEvents       bool   `json:"merge_requests_events"`
+	NoteEvents                bool   `json:"note_events"`
+	ConfidentialNoteEvents    bool   `json:"confidential_note_events"`
+	DeploymentEvents          bool   `json:"deployment_events"`
+	IncidentsEvents           bool   `json:"incidents_events"`
+	PipelineEvents            bool   `json:"pipeline_events"`
+	PushEvents                bool   `json:"push_events"`
+	TagPushEvents             bool   `json:"tag_push_events"`
+	VulnerabilityEvents       bool   `json:"vulnerability_events"`
+	WikiPageEvents            bool   `json:"wiki_page_events"`
 
 	// Deprecated: This parameter has been replaced with BranchesToBeNotified.
 	NotifyOnlyDefaultBranch bool `json:"notify_only_default_branch"`
@@ -985,38 +931,22 @@ func (s *ServicesService) GetSlackApplication(pid interface{}, options ...Reques
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-gitlab-for-slack-app
 type SetSlackApplicationOptions struct {
-	Channel                    *string `url:"channel,omitempty" json:"channel,omitempty"`
-	NotifyOnlyBrokenPipelines  *bool   `url:"notify_only_broken_pipelines,omitempty" json:"notify_only_broken_pipelines,omitempty"`
-	BranchesToBeNotified       *string `url:"branches_to_be_notified,omitempty" json:"branches_to_be_notified,omitempty"`
-	AlertEvents                *bool   `url:"alert_events,omitempty" json:"alert_events,omitempty"`
-	IssuesEvents               *bool   `url:"issues_events,omitempty" json:"issues_events,omitempty"`
-	ConfidentialIssuesEvents   *bool   `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"`
-	MergeRequestsEvents        *bool   `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"`
-	NoteEvents                 *bool   `url:"note_events,omitempty" json:"note_events,omitempty"`
-	ConfidentialNoteEvents     *bool   `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"`
-	DeploymentEvents           *bool   `url:"deployment_events,omitempty" json:"deployment_events,omitempty"`
-	IncidentsEvents            *bool   `url:"incidents_events,omitempty" json:"incidents_events,omitempty"`
-	PipelineEvents             *bool   `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"`
-	PushEvents                 *bool   `url:"push_events,omitempty" json:"push_events,omitempty"`
-	TagPushEvents              *bool   `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"`
-	VulnerabilityEvents        *bool   `url:"vulnerability_events,omitempty" json:"vulnerability_events,omitempty"`
-	WikiPageEvents             *bool   `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"`
-	LabelsToBeNotified         *string `url:"labels_to_be_notified,omitempty" json:"labels_to_be_notified,omitempty"`
-	LabelsToBeNotifiedBehavior *string `url:"labels_to_be_notified_behavior,omitempty" json:"labels_to_be_notified_behavior,omitempty"`
-	PushChannel                *string `url:"push_channel,omitempty" json:"push_channel,omitempty"`
-	IssueChannel               *string `url:"issue_channel,omitempty" json:"issue_channel,omitempty"`
-	ConfidentialIssueChannel   *string `url:"confidential_issue_channel,omitempty" json:"confidential_issue_channel,omitempty"`
-	MergeRequestChannel        *string `url:"merge_request_channel,omitempty" json:"merge_request_channel,omitempty"`
-	NoteChannel                *string `url:"note_channel,omitempty" json:"note_channel,omitempty"`
-	ConfidentialNoteChannel    *string `url:"confidential_note_channel,omitempty" json:"confidential_note_channel,omitempty"`
-	TagPushChannel             *string `url:"tag_push_channel,omitempty" json:"tag_push_channel,omitempty"`
-	PipelineChannel            *string `url:"pipeline_channel,omitempty" json:"pipeline_channel,omitempty"`
-	WikiPageChannel            *string `url:"wiki_page_channel,omitempty" json:"wiki_page_channel,omitempty"`
-	DeploymentChannel          *string `url:"deployment_channel,omitempty" json:"deployment_channel,omitempty"`
-	IncidentChannel            *string `url:"incident_channel,omitempty" json:"incident_channel,omitempty"`
-	VulnerabilityChannel       *string `url:"vulnerability_channel,omitempty" json:"vulnerability_channel,omitempty"`
-	AlertChannel               *string `url:"alert_channel,omitempty" json:"alert_channel,omitempty"`
-	UseInheritedSettings       *bool   `url:"use_inherited_settings,omitempty" json:"use_inherited_settings,omitempty"`
+	Channel                   *string `url:"channel,omitempty" json:"channel,omitempty"`
+	NotifyOnlyBrokenPipelines *bool   `url:"notify_only_broken_pipelines,omitempty" json:"notify_only_broken_pipelines,omitempty"`
+	BranchesToBeNotified      *string `url:"branches_to_be_notified,omitempty" json:"branches_to_be_notified,omitempty"`
+	AlertEvents               *bool   `url:"alert_events,omitempty" json:"alert_events,omitempty"`
+	IssuesEvents              *bool   `url:"issues_events,omitempty" json:"issues_events,omitempty"`
+	ConfidentialIssuesEvents  *bool   `url:"confidential_issues_events,omitempty" json:"confidential_issues_events,omitempty"`
+	MergeRequestsEvents       *bool   `url:"merge_requests_events,omitempty" json:"merge_requests_events,omitempty"`
+	NoteEvents                *bool   `url:"note_events,omitempty" json:"note_events,omitempty"`
+	ConfidentialNoteEvents    *bool   `url:"confidential_note_events,omitempty" json:"confidential_note_events,omitempty"`
+	DeploymentEvents          *bool   `url:"deployment_events,omitempty" json:"deployment_events,omitempty"`
+	IncidentsEvents           *bool   `url:"incidents_events,omitempty" json:"incidents_events,omitempty"`
+	PipelineEvents            *bool   `url:"pipeline_events,omitempty" json:"pipeline_events,omitempty"`
+	PushEvents                *bool   `url:"push_events,omitempty" json:"push_events,omitempty"`
+	TagPushEvents             *bool   `url:"tag_push_events,omitempty" json:"tag_push_events,omitempty"`
+	VulnerabilityEvents       *bool   `url:"vulnerability_events,omitempty" json:"vulnerability_events,omitempty"`
+	WikiPageEvents            *bool   `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"`
 
 	// Deprecated: This parameter has been replaced with BranchesToBeNotified.
 	NotifyOnlyDefaultBranch *bool `url:"notify_only_default_branch,omitempty" json:"notify_only_default_branch,omitempty"`
@@ -1026,25 +956,19 @@ type SetSlackApplicationOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-gitlab-for-slack-app
-func (s *ServicesService) SetSlackApplication(pid interface{}, opt *SetSlackApplicationOptions, options ...RequestOptionFunc) (*SlackApplication, *Response, error) {
+func (s *ServicesService) SetSlackApplication(pid interface{}, opt *SetSlackApplicationOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/integrations/gitlab-slack-application", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(SlackApplication)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DisableSlackApplication disable the GitLab for Slack app integration for a project.
@@ -1227,25 +1151,19 @@ type SetJenkinsCIServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-jenkins
-func (s *ServicesService) SetJenkinsCIService(pid interface{}, opt *SetJenkinsCIServiceOptions, options ...RequestOptionFunc) (*JenkinsCIService, *Response, error) {
+func (s *ServicesService) SetJenkinsCIService(pid interface{}, opt *SetJenkinsCIServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/jenkins", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(JenkinsCIService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteJenkinsCIService deletes Jenkins CI service for project.
@@ -1388,25 +1306,19 @@ type SetJiraServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#edit-jira-service
-func (s *ServicesService) SetJiraService(pid interface{}, opt *SetJiraServiceOptions, options ...RequestOptionFunc) (*JiraService, *Response, error) {
+func (s *ServicesService) SetJiraService(pid interface{}, opt *SetJiraServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/integrations/jira", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(JiraService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteJiraService deletes Jira service for project.
@@ -1515,50 +1427,6 @@ type SetMattermostServiceOptions struct {
 	WikiPageChannel           *string `url:"wiki_page_channel,omitempty" json:"wiki_page_channel,omitempty"`
 }
 
-// SetMattermostService sets Mattermost service for a project.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/integrations.html#createedit-mattermost-notifications-service
-func (s *ServicesService) SetMattermostService(pid interface{}, opt *SetMattermostServiceOptions, options ...RequestOptionFunc) (*MattermostService, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/services/mattermost", PathEscape(project))
-
-	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(MattermostService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	return svc, resp, nil
-}
-
-// DeleteMattermostService deletes Mattermost service for project.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/integrations.html#delete-mattermost-notifications-service
-func (s *ServicesService) DeleteMattermostService(pid interface{}, options ...RequestOptionFunc) (*Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("projects/%s/services/mattermost", PathEscape(project))
-
-	req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
-	if err != nil {
-		return nil, err
-	}
-
-	return s.client.Do(req, nil)
-}
-
 // MattermostSlashCommandsService represents Mattermost slash commands settings.
 //
 // GitLab API docs:
@@ -1616,25 +1484,19 @@ type SetMattermostSlashCommandsServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#createedit-mattermost-slash-command-integration
-func (s *ServicesService) SetMattermostSlashCommandsService(pid interface{}, opt *SetMattermostSlashCommandsServiceOptions, options ...RequestOptionFunc) (*MattermostSlashCommandsService, *Response, error) {
+func (s *ServicesService) SetMattermostSlashCommandsService(pid interface{}, opt *SetMattermostSlashCommandsServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/mattermost-slash-commands", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(MattermostSlashCommandsService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteMattermostSlashCommandsService deletes Mattermost slash commands service for project.
@@ -1656,6 +1518,44 @@ func (s *ServicesService) DeleteMattermostSlashCommandsService(pid interface{},
 	return s.client.Do(req, nil)
 }
 
+// SetMattermostService sets Mattermost service for a project.
+//
+// GitLab API docs:
+// https://docs.gitlab.com/ee/api/integrations.html#createedit-mattermost-notifications-service
+func (s *ServicesService) SetMattermostService(pid interface{}, opt *SetMattermostServiceOptions, options ...RequestOptionFunc) (*Response, error) {
+	project, err := parseID(pid)
+	if err != nil {
+		return nil, err
+	}
+	u := fmt.Sprintf("projects/%s/services/mattermost", PathEscape(project))
+
+	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(req, nil)
+}
+
+// DeleteMattermostService deletes Mattermost service for project.
+//
+// GitLab API docs:
+// https://docs.gitlab.com/ee/api/integrations.html#delete-mattermost-notifications-service
+func (s *ServicesService) DeleteMattermostService(pid interface{}, options ...RequestOptionFunc) (*Response, error) {
+	project, err := parseID(pid)
+	if err != nil {
+		return nil, err
+	}
+	u := fmt.Sprintf("projects/%s/services/mattermost", PathEscape(project))
+
+	req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
+	if err != nil {
+		return nil, err
+	}
+
+	return s.client.Do(req, nil)
+}
+
 // MicrosoftTeamsService represents Microsoft Teams service settings.
 //
 // GitLab API docs:
@@ -1732,25 +1632,18 @@ type SetMicrosoftTeamsServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#create-edit-microsoft-teams-service
-func (s *ServicesService) SetMicrosoftTeamsService(pid interface{}, opt *SetMicrosoftTeamsServiceOptions, options ...RequestOptionFunc) (*MicrosoftTeamsService, *Response, error) {
+func (s *ServicesService) SetMicrosoftTeamsService(pid interface{}, opt *SetMicrosoftTeamsServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/microsoft-teams", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(MicrosoftTeamsService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
-
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteMicrosoftTeamsService deletes Microsoft Teams service for project.
@@ -1835,25 +1728,19 @@ type SetPipelinesEmailServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#pipeline-emails
-func (s *ServicesService) SetPipelinesEmailService(pid interface{}, opt *SetPipelinesEmailServiceOptions, options ...RequestOptionFunc) (*PipelinesEmailService, *Response, error) {
+func (s *ServicesService) SetPipelinesEmailService(pid interface{}, opt *SetPipelinesEmailServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/pipelines-email", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(PipelinesEmailService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeletePipelinesEmailService deletes Pipelines Email service settings for a project.
@@ -1934,25 +1821,19 @@ type SetPrometheusServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#createedit-prometheus-service
-func (s *ServicesService) SetPrometheusService(pid interface{}, opt *SetPrometheusServiceOptions, options ...RequestOptionFunc) (*PrometheusService, *Response, error) {
+func (s *ServicesService) SetPrometheusService(pid interface{}, opt *SetPrometheusServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/prometheus", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(PrometheusService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeletePrometheusService deletes Prometheus service settings for a project.
@@ -2035,25 +1916,19 @@ type SetRedmineServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-redmine
-func (s *ServicesService) SetRedmineService(pid interface{}, opt *SetRedmineServiceOptions, options ...RequestOptionFunc) (*RedmineService, *Response, error) {
+func (s *ServicesService) SetRedmineService(pid interface{}, opt *SetRedmineServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/integrations/redmine", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(RedmineService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteRedmineService deletes Redmine service for project.
@@ -2174,25 +2049,19 @@ type SetSlackServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#edit-slack-service
-func (s *ServicesService) SetSlackService(pid interface{}, opt *SetSlackServiceOptions, options ...RequestOptionFunc) (*SlackService, *Response, error) {
+func (s *ServicesService) SetSlackService(pid interface{}, opt *SetSlackServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/slack", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(SlackService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteSlackService deletes Slack service for project.
@@ -2269,25 +2138,19 @@ type SetSlackSlashCommandsServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/13.12/ee/api/integrations.html#createedit-slack-slash-command-service
-func (s *ServicesService) SetSlackSlashCommandsService(pid interface{}, opt *SetSlackSlashCommandsServiceOptions, options ...RequestOptionFunc) (*SlackSlashCommandsService, *Response, error) {
+func (s *ServicesService) SetSlackSlashCommandsService(pid interface{}, opt *SetSlackSlashCommandsServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/slack-slash-commands", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(SlackSlashCommandsService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteSlackSlashCommandsService deletes Slack slash commands service for project.
@@ -2378,25 +2241,19 @@ type SetTelegramServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#set-up-telegram
-func (s *ServicesService) SetTelegramService(pid interface{}, opt *SetTelegramServiceOptions, options ...RequestOptionFunc) (*TelegramService, *Response, error) {
+func (s *ServicesService) SetTelegramService(pid interface{}, opt *SetTelegramServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/telegram", PathEscape(project))
 
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(TelegramService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteTelegramService deletes Telegram service for project.
@@ -2479,25 +2336,19 @@ type SetYouTrackServiceOptions struct {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/integrations.html#createedit-youtrack-service
-func (s *ServicesService) SetYouTrackService(pid interface{}, opt *SetYouTrackServiceOptions, options ...RequestOptionFunc) (*YouTrackService, *Response, error) {
+func (s *ServicesService) SetYouTrackService(pid interface{}, opt *SetYouTrackServiceOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/services/youtrack", PathEscape(project))
 
-	svc := new(YouTrackService)
 	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
 	if err != nil {
-		return nil, nil, err
-	}
-
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 
-	return svc, resp, nil
+	return s.client.Do(req, nil)
 }
 
 // DeleteYouTrackService deletes YouTrack service settings for a project.
diff --git a/types.go b/types.go
index a7cabc1..5b7f74e 100644
--- a/types.go
+++ b/types.go
@@ -440,26 +440,6 @@ func GenericPackageStatus(v GenericPackageStatusValue) *GenericPackageStatusValu
 	return Ptr(v)
 }
 
-// GroupHookTrigger represents the type of event to trigger for a group
-// hook test.
-type GroupHookTrigger string
-
-// List of available group hook trigger types.
-const (
-	GroupHookTriggerPush                GroupHookTrigger = "push_events"
-	GroupHookTriggerTagPush             GroupHookTrigger = "tag_push_events"
-	GroupHookTriggerIssue               GroupHookTrigger = "issues_events"
-	GroupHookTriggerConfidentialIssue   GroupHookTrigger = "confidential_issues_events"
-	GroupHookTriggerNote                GroupHookTrigger = "note_events"
-	GroupHookTriggerMergeRequest        GroupHookTrigger = "merge_requests_events"
-	GroupHookTriggerJob                 GroupHookTrigger = "job_events"
-	GroupHookTriggerPipeline            GroupHookTrigger = "pipeline_events"
-	GroupHookTriggerWikiPage            GroupHookTrigger = "wiki_page_events"
-	GroupHookTriggerRelease             GroupHookTrigger = "releases_events"
-	GroupHookTriggerEmoji               GroupHookTrigger = "emoji_events"
-	GroupHookTriggerResourceAccessToken GroupHookTrigger = "resource_access_token_events"
-)
-
 // ISOTime represents an ISO 8601 formatted date.
 type ISOTime time.Time
 
@@ -1002,19 +982,3 @@ func (t *BoolValue) UnmarshalJSON(b []byte) error {
 		return err
 	}
 }
-
-// CIPipelineVariablesMinimumOverrideRoleValue represents an access control
-// value used for managing access to the CI Pipeline Variable Override feature.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html
-type CIPipelineVariablesMinimumOverrideRoleValue = string
-
-// List of available CIPipelineVariablesMinimumOverrideRoleValue values.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/projects.html
-const (
-	CIPipelineVariablesNoOneAllowedRole CIPipelineVariablesMinimumOverrideRoleValue = "no_one_allowed"
-	CiPipelineVariablesOwnerRole        CIPipelineVariablesMinimumOverrideRoleValue = "owner"
-	CiPipelineVariablesMaintainerRole   CIPipelineVariablesMinimumOverrideRoleValue = "maintainer"
-	CIPipelineVariablesDeveloperRole    CIPipelineVariablesMinimumOverrideRoleValue = "developer"
-)
diff --git a/users.go b/users.go
index 5eee428..f856678 100644
--- a/users.go
+++ b/users.go
@@ -1553,21 +1553,12 @@ func (s *UsersService) CreateUserRunner(opts *CreateUserRunnerOptions, options .
 	return r, resp, nil
 }
 
-
-// CreateServiceAccountUserOptions represents the available CreateServiceAccountUser() options.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/user_service_accounts.html#create-a-service-account-user
-type CreateServiceAccountUserOptions struct {
-	Name     *string `url:"name,omitempty" json:"name,omitempty"`
-	Username *string `url:"username,omitempty" json:"username,omitempty"`
-}
-
 // CreateServiceAccountUser creates a new service account user.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/users.html#create-service-account-user
-func (s *UsersService) CreateServiceAccountUser(opts *CreateServiceAccountUserOptions, options ...RequestOptionFunc) (*User, *Response, error) {
-	req, err := s.client.NewRequest(http.MethodPost, "service_accounts", opts, options)
+func (s *UsersService) CreateServiceAccountUser(options ...RequestOptionFunc) (*User, *Response, error) {
+	req, err := s.client.NewRequest(http.MethodPost, "service_accounts", nil, options)
 	if err != nil {
 		return nil, nil, err
 	}


Test patch:
diff --git a/.github/workflows/lint_and_test.yml b/.github/workflows/lint_and_test.yml
index 23a7b0e..9e86c41 100644
--- a/.github/workflows/lint_and_test.yml
+++ b/.github/workflows/lint_and_test.yml
@@ -24,7 +24,7 @@ jobs:
         uses: actions/checkout@v4
 
       - name: Lint package
-        uses: golangci/golangci-lint-action@v6
+        uses: golangci/golangci-lint-action@v5
         with:
           version: latest
 
diff --git a/dependency_list_export_test.go b/dependency_list_export_test.go
deleted file mode 100644
index c892c4c..0000000
--- a/dependency_list_export_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package gitlab
-
-import (
-	"bytes"
-	"encoding/json"
-	"io"
-	"net/http"
-	"os"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-)
-
-func TestCreateDependencyListExport(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/pipelines/1234/dependency_list_exports", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		body, err := io.ReadAll(r.Body)
-		require.NoError(t, err)
-
-		var content CreateDependencyListExportOptions
-		err = json.Unmarshal(body, &content)
-		require.NoError(t, err)
-
-		assert.Equal(t, "sbom", *content.ExportType)
-		mustWriteHTTPResponse(t, w, "testdata/create_dependency_list_export.json")
-	})
-
-	d := &CreateDependencyListExportOptions{
-		ExportType: Ptr("sbom"),
-	}
-
-	export, _, err := client.DependencyListExport.CreateDependencyListExport(1234, d)
-	require.NoError(t, err)
-
-	want := &DependencyListExport{
-		ID:          5678,
-		HasFinished: false,
-		Self:        "http://gitlab.example.com/api/v4/dependency_list_exports/5678",
-		Download:    "http://gitlab.example.com/api/v4/dependency_list_exports/5678/download",
-	}
-	require.Equal(t, want, export)
-}
-
-func TestGetDependencyListExport(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/dependency_list_exports/5678", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		mustWriteHTTPResponse(t, w, "testdata/get_dependency_list_export.json")
-	})
-
-	export, _, err := client.DependencyListExport.GetDependencyListExport(5678)
-	require.NoError(t, err)
-
-	want := &DependencyListExport{
-		ID:          5678,
-		HasFinished: true,
-		Self:        "http://gitlab.example.com/api/v4/dependency_list_exports/5678",
-		Download:    "http://gitlab.example.com/api/v4/dependency_list_exports/5678/download",
-	}
-	require.Equal(t, want, export)
-}
-
-func TestDownloadDependencyListExport(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/dependency_list_exports/5678/download", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		mustWriteHTTPResponse(t, w, "testdata/download_dependency_list_export.json")
-	})
-
-	sbomReader, _, err := client.DependencyListExport.DownloadDependencyListExport(5678)
-	require.NoError(t, err)
-
-	expectedSbom, err := os.ReadFile("testdata/download_dependency_list_export.json")
-	require.NoError(t, err)
-
-	var want bytes.Buffer
-	want.Write(expectedSbom)
-
-	require.Equal(t, &want, sbomReader)
-}
diff --git a/deploy_keys_test.go b/deploy_keys_test.go
index d760bc6..260ee1c 100644
--- a/deploy_keys_test.go
+++ b/deploy_keys_test.go
@@ -225,8 +225,7 @@ func TestAddDeployKey(t *testing.T) {
 			"id" : 12,
 			"title" : "My deploy key",
 			"can_push": true,
-			"created_at" : "2015-08-29T12:44:31.550Z",
-			"expires_at": null
+			"created_at" : "2015-08-29T12:44:31.550Z"
 		 }`)
 	})
 
@@ -257,55 +256,6 @@ func TestAddDeployKey(t *testing.T) {
 	}
 }
 
-func TestAddDeployKey_withExpiresAt(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/5/deploy_keys", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		fmt.Fprintf(w, `{
-			"key" : "ssh-rsa AAAA...",
-			"id" : 12,
-			"title" : "My deploy key",
-			"can_push": true,
-			"created_at" : "2015-08-29T12:44:31.550Z",
-			"expires_at": "2999-03-01T00:00:00.000Z"
-		 }`)
-	})
-
-	expiresAt, err := time.Parse(timeLayout, "2999-03-01T00:00:00.000Z")
-	if err != nil {
-		t.Errorf("DeployKeys.AddDeployKey returned an error while parsing time: %v", err)
-	}
-
-	opt := &AddDeployKeyOptions{
-		Key:       Ptr("ssh-rsa AAAA..."),
-		Title:     Ptr("My deploy key"),
-		CanPush:   Ptr(true),
-		ExpiresAt: &expiresAt,
-	}
-	deployKey, _, err := client.DeployKeys.AddDeployKey(5, opt)
-	if err != nil {
-		t.Errorf("DeployKey.AddDeployKey returned error: %v", err)
-	}
-
-	createdAt, err := time.Parse(timeLayout, "2015-08-29T12:44:31.550Z")
-	if err != nil {
-		t.Errorf("DeployKeys.AddDeployKey returned an error while parsing time: %v", err)
-	}
-
-	want := &ProjectDeployKey{
-		Title:     "My deploy key",
-		ID:        12,
-		Key:       "ssh-rsa AAAA...",
-		CreatedAt: &createdAt,
-		CanPush:   true,
-		ExpiresAt: &expiresAt,
-	}
-	if !reflect.DeepEqual(want, deployKey) {
-		t.Errorf("DeployKeys.AddDeployKey returned %+v, want %+v", deployKey, want)
-	}
-}
-
 func TestDeleteDeployKey(t *testing.T) {
 	mux, client := setup(t)
 
diff --git a/environments_test.go b/environments_test.go
index 1dd278b..a4b0ad6 100644
--- a/environments_test.go
+++ b/environments_test.go
@@ -19,6 +19,7 @@ package gitlab
 import (
 	"encoding/json"
 	"fmt"
+	"log"
 	"net/http"
 	"reflect"
 	"testing"
@@ -66,7 +67,7 @@ func TestListEnvironments(t *testing.T) {
 
 	envs, _, err := client.Environments.ListEnvironments(1, &ListEnvironmentsOptions{Name: Ptr("review/fix-foo"), ListOptions: ListOptions{Page: 1, PerPage: 10}})
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	createdAtWant, _ := time.Parse(timeLayout, "2013-10-02T10:12:29Z")
@@ -217,7 +218,7 @@ func TestCreateEnvironment(t *testing.T) {
 		FluxResourcePath:    Ptr("HelmRelease/flux-system"),
 	})
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	createdAtWant, _ := time.Parse(timeLayout, "2013-10-02T10:12:29Z")
@@ -293,7 +294,7 @@ func TestEditEnvironment(t *testing.T) {
 		FluxResourcePath:    Ptr("HelmRelease/flux-system"),
 	})
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	createdAtWant, _ := time.Parse(timeLayout, "2013-10-02T10:12:29Z")
@@ -335,7 +336,7 @@ func TestDeleteEnvironment(t *testing.T) {
 	})
 	_, err := client.Environments.DeleteEnvironment(1, 1)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
@@ -356,7 +357,7 @@ func TestStopEnvironment(t *testing.T) {
 	})
 	_, _, err := client.Environments.StopEnvironment(1, 1, &StopEnvironmentOptions{})
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
diff --git a/epics_test.go b/epics_test.go
index 33126af..06720af 100644
--- a/epics_test.go
+++ b/epics_test.go
@@ -18,6 +18,7 @@ package gitlab
 
 import (
 	"fmt"
+	"log"
 	"net/http"
 	"reflect"
 	"testing"
@@ -33,7 +34,7 @@ func TestGetEpic(t *testing.T) {
 
 	epic, _, err := client.Epics.GetEpic("7", 8)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Epic{
@@ -57,7 +58,7 @@ func TestDeleteEpic(t *testing.T) {
 
 	_, err := client.Epics.DeleteEpic("7", 8)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
@@ -77,7 +78,7 @@ func TestListGroupEpics(t *testing.T) {
 
 	epics, _, err := client.Epics.ListGroupEpics("7", listGroupEpics)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Epic{{
@@ -107,7 +108,7 @@ func TestCreateEpic(t *testing.T) {
 
 	epic, _, err := client.Epics.CreateEpic("7", createEpicOptions)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Epic{
@@ -137,7 +138,7 @@ func TestUpdateEpic(t *testing.T) {
 
 	epic, _, err := client.Epics.UpdateEpic("7", 8, updateEpicOptions)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Epic{
diff --git a/event_parsing_systemhook_test.go b/event_parsing_systemhook_test.go
index b6f5297..cc258ea 100644
--- a/event_parsing_systemhook_test.go
+++ b/event_parsing_systemhook_test.go
@@ -23,7 +23,7 @@ import (
 )
 
 func TestParseSystemhookPush(t *testing.T) {
-	payload := loadFixture(t, "testdata/systemhooks/push.json")
+	payload := loadFixture("testdata/systemhooks/push.json")
 
 	parsedEvent, err := ParseSystemhook(payload)
 	if err != nil {
@@ -38,7 +38,7 @@ func TestParseSystemhookPush(t *testing.T) {
 }
 
 func TestParseSystemhookTagPush(t *testing.T) {
-	payload := loadFixture(t, "testdata/systemhooks/tag_push.json")
+	payload := loadFixture("testdata/systemhooks/tag_push.json")
 
 	parsedEvent, err := ParseSystemhook(payload)
 	if err != nil {
@@ -53,7 +53,7 @@ func TestParseSystemhookTagPush(t *testing.T) {
 }
 
 func TestParseSystemhookMergeRequest(t *testing.T) {
-	payload := loadFixture(t, "testdata/systemhooks/merge_request.json")
+	payload := loadFixture("testdata/systemhooks/merge_request.json")
 
 	parsedEvent, err := ParseSystemhook(payload)
 	if err != nil {
@@ -68,7 +68,7 @@ func TestParseSystemhookMergeRequest(t *testing.T) {
 }
 
 func TestParseSystemhookRepositoryUpdate(t *testing.T) {
-	payload := loadFixture(t, "testdata/systemhooks/repository_update.json")
+	payload := loadFixture("testdata/systemhooks/repository_update.json")
 
 	parsedEvent, err := ParseSystemhook(payload)
 	if err != nil {
@@ -87,11 +87,11 @@ func TestParseSystemhookProject(t *testing.T) {
 		event   string
 		payload []byte
 	}{
-		{"project_create", loadFixture(t, "testdata/systemhooks/project_create.json")},
-		{"project_update", loadFixture(t, "testdata/systemhooks/project_update.json")},
-		{"project_destroy", loadFixture(t, "testdata/systemhooks/project_destroy.json")},
-		{"project_transfer", loadFixture(t, "testdata/systemhooks/project_transfer.json")},
-		{"project_rename", loadFixture(t, "testdata/systemhooks/project_rename.json")},
+		{"project_create", loadFixture("testdata/systemhooks/project_create.json")},
+		{"project_update", loadFixture("testdata/systemhooks/project_update.json")},
+		{"project_destroy", loadFixture("testdata/systemhooks/project_destroy.json")},
+		{"project_transfer", loadFixture("testdata/systemhooks/project_transfer.json")},
+		{"project_rename", loadFixture("testdata/systemhooks/project_rename.json")},
 	}
 	for _, tc := range tests {
 		t.Run(tc.event, func(t *testing.T) {
@@ -113,9 +113,9 @@ func TestParseSystemhookGroup(t *testing.T) {
 		event   string
 		payload []byte
 	}{
-		{"group_create", loadFixture(t, "testdata/systemhooks/group_create.json")},
-		{"group_destroy", loadFixture(t, "testdata/systemhooks/group_destroy.json")},
-		{"group_rename", loadFixture(t, "testdata/systemhooks/group_rename.json")},
+		{"group_create", loadFixture("testdata/systemhooks/group_create.json")},
+		{"group_destroy", loadFixture("testdata/systemhooks/group_destroy.json")},
+		{"group_rename", loadFixture("testdata/systemhooks/group_rename.json")},
 	}
 	for _, tc := range tests {
 		t.Run(tc.event, func(t *testing.T) {
@@ -137,10 +137,10 @@ func TestParseSystemhookUser(t *testing.T) {
 		event   string
 		payload []byte
 	}{
-		{"user_create", loadFixture(t, "testdata/systemhooks/user_create.json")},
-		{"user_destroy", loadFixture(t, "testdata/systemhooks/user_destroy.json")},
-		{"user_rename", loadFixture(t, "testdata/systemhooks/user_rename.json")},
-		{"user_failed_login", loadFixture(t, "testdata/systemhooks/user_failed_login.json")},
+		{"user_create", loadFixture("testdata/systemhooks/user_create.json")},
+		{"user_destroy", loadFixture("testdata/systemhooks/user_destroy.json")},
+		{"user_rename", loadFixture("testdata/systemhooks/user_rename.json")},
+		{"user_failed_login", loadFixture("testdata/systemhooks/user_failed_login.json")},
 	}
 	for _, tc := range tests {
 		t.Run(tc.event, func(t *testing.T) {
@@ -162,9 +162,9 @@ func TestParseSystemhookUserGroup(t *testing.T) {
 		event   string
 		payload []byte
 	}{
-		{"user_add_to_group", loadFixture(t, "testdata/systemhooks/user_add_to_group.json")},
-		{"user_remove_from_group", loadFixture(t, "testdata/systemhooks/user_remove_from_group.json")},
-		{"user_update_for_group", loadFixture(t, "testdata/systemhooks/user_update_for_group.json")},
+		{"user_add_to_group", loadFixture("testdata/systemhooks/user_add_to_group.json")},
+		{"user_remove_from_group", loadFixture("testdata/systemhooks/user_remove_from_group.json")},
+		{"user_update_for_group", loadFixture("testdata/systemhooks/user_update_for_group.json")},
 	}
 	for _, tc := range tests {
 		t.Run(tc.event, func(t *testing.T) {
@@ -186,9 +186,9 @@ func TestParseSystemhookUserTeam(t *testing.T) {
 		event   string
 		payload []byte
 	}{
-		{"user_add_to_team", loadFixture(t, "testdata/systemhooks/user_add_to_team.json")},
-		{"user_remove_from_team", loadFixture(t, "testdata/systemhooks/user_remove_from_team.json")},
-		{"user_update_for_team", loadFixture(t, "testdata/systemhooks/user_update_for_team.json")},
+		{"user_add_to_team", loadFixture("testdata/systemhooks/user_add_to_team.json")},
+		{"user_remove_from_team", loadFixture("testdata/systemhooks/user_remove_from_team.json")},
+		{"user_update_for_team", loadFixture("testdata/systemhooks/user_update_for_team.json")},
 	}
 	for _, tc := range tests {
 		t.Run(tc.event, func(t *testing.T) {
@@ -206,11 +206,11 @@ func TestParseSystemhookUserTeam(t *testing.T) {
 }
 
 func TestParseHookSystemHook(t *testing.T) {
-	parsedEvent1, err := ParseHook("System Hook", loadFixture(t, "testdata/systemhooks/merge_request.json"))
+	parsedEvent1, err := ParseHook("System Hook", loadFixture("testdata/systemhooks/merge_request.json"))
 	if err != nil {
 		t.Errorf("Error parsing build hook: %s", err)
 	}
-	parsedEvent2, err := ParseSystemhook(loadFixture(t, "testdata/systemhooks/merge_request.json"))
+	parsedEvent2, err := ParseSystemhook(loadFixture("testdata/systemhooks/merge_request.json"))
 	if err != nil {
 		t.Errorf("Error parsing build hook: %s", err)
 	}
diff --git a/event_parsing_webhook_test.go b/event_parsing_webhook_test.go
index 8f8e40b..da78ede 100644
--- a/event_parsing_webhook_test.go
+++ b/event_parsing_webhook_test.go
@@ -51,7 +51,7 @@ func TestWebhookEventToken(t *testing.T) {
 }
 
 func TestParseBuildHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/build.json")
+	raw := loadFixture("testdata/webhooks/build.json")
 
 	parsedEvent, err := ParseWebhook("Build Hook", raw)
 	if err != nil {
@@ -85,7 +85,7 @@ func TestParseBuildHook(t *testing.T) {
 }
 
 func TestParseCommitCommentHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/note_commit.json")
+	raw := loadFixture("testdata/webhooks/note_commit.json")
 
 	parsedEvent, err := ParseWebhook("Note Hook", raw)
 	if err != nil {
@@ -115,7 +115,7 @@ func TestParseCommitCommentHook(t *testing.T) {
 }
 
 func TestParseFeatureFlagHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/feature_flag.json")
+	raw := loadFixture("testdata/webhooks/feature_flag.json")
 
 	parsedEvent, err := ParseWebhook("Feature Flag Hook", raw)
 	if err != nil {
@@ -161,7 +161,7 @@ func TestParseFeatureFlagHook(t *testing.T) {
 }
 
 func TestParseGroupResourceAccessTokenHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/resource_access_token_group.json")
+	raw := loadFixture("testdata/webhooks/resource_access_token_group.json")
 
 	parsedEvent, err := ParseWebhook("Resource Access Token Hook", raw)
 	if err != nil {
@@ -181,11 +181,11 @@ func TestParseGroupResourceAccessTokenHook(t *testing.T) {
 }
 
 func TestParseHookWebHook(t *testing.T) {
-	parsedEvent1, err := ParseHook("Merge Request Hook", loadFixture(t, "testdata/webhooks/merge_request.json"))
+	parsedEvent1, err := ParseHook("Merge Request Hook", loadFixture("testdata/webhooks/merge_request.json"))
 	if err != nil {
 		t.Errorf("Error parsing build hook: %s", err)
 	}
-	parsedEvent2, err := ParseWebhook("Merge Request Hook", loadFixture(t, "testdata/webhooks/merge_request.json"))
+	parsedEvent2, err := ParseWebhook("Merge Request Hook", loadFixture("testdata/webhooks/merge_request.json"))
 	if err != nil {
 		t.Errorf("Error parsing build hook: %s", err)
 	}
@@ -193,7 +193,7 @@ func TestParseHookWebHook(t *testing.T) {
 }
 
 func TestParseIssueCommentHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/note_issue.json")
+	raw := loadFixture("testdata/webhooks/note_issue.json")
 
 	parsedEvent, err := ParseWebhook("Note Hook", raw)
 	if err != nil {
@@ -224,7 +224,7 @@ func TestParseIssueCommentHook(t *testing.T) {
 }
 
 func TestParseIssueHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/issue.json")
+	raw := loadFixture("testdata/webhooks/issue.json")
 
 	parsedEvent, err := ParseWebhook("Issue Hook", raw)
 	if err != nil {
@@ -263,7 +263,7 @@ func TestParseIssueHook(t *testing.T) {
 }
 
 func TestParseMergeRequestCommentHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/note_merge_request.json")
+	raw := loadFixture("testdata/webhooks/note_merge_request.json")
 
 	parsedEvent, err := ParseWebhook("Note Hook", raw)
 	if err != nil {
@@ -298,7 +298,7 @@ func TestParseMergeRequestCommentHook(t *testing.T) {
 }
 
 func TestParseMemberHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/member.json")
+	raw := loadFixture("testdata/webhooks/member.json")
 
 	parsedEvent, err := ParseWebhook("Member Hook", raw)
 	if err != nil {
@@ -316,7 +316,7 @@ func TestParseMemberHook(t *testing.T) {
 }
 
 func TestParseMergeRequestHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/merge_request.json")
+	raw := loadFixture("testdata/webhooks/merge_request.json")
 
 	parsedEvent, err := ParseWebhook("Merge Request Hook", raw)
 	if err != nil {
@@ -351,7 +351,7 @@ func TestParseMergeRequestHook(t *testing.T) {
 }
 
 func TestParsePipelineHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/pipeline.json")
+	raw := loadFixture("testdata/webhooks/pipeline.json")
 
 	parsedEvent, err := ParseWebhook("Pipeline Hook", raw)
 	if err != nil {
@@ -385,7 +385,7 @@ func TestParsePipelineHook(t *testing.T) {
 }
 
 func TestParseProjectResourceAccessTokenHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/resource_access_token_project.json")
+	raw := loadFixture("testdata/webhooks/resource_access_token_project.json")
 
 	parsedEvent, err := ParseWebhook("Resource Access Token Hook", raw)
 	if err != nil {
@@ -405,7 +405,7 @@ func TestParseProjectResourceAccessTokenHook(t *testing.T) {
 }
 
 func TestParsePushHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/push.json")
+	raw := loadFixture("testdata/webhooks/push.json")
 
 	parsedEvent, err := ParseWebhook("Push Hook", raw)
 	if err != nil {
@@ -439,7 +439,7 @@ func TestParsePushHook(t *testing.T) {
 }
 
 func TestParseReleaseHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/release.json")
+	raw := loadFixture("testdata/webhooks/release.json")
 
 	parsedEvent, err := ParseWebhook("Release Hook", raw)
 	if err != nil {
@@ -461,7 +461,7 @@ func TestParseReleaseHook(t *testing.T) {
 }
 
 func TestParseServiceWebHook(t *testing.T) {
-	parsedEvent, err := ParseWebhook("Service Hook", loadFixture(t, "testdata/webhooks/service_merge_request.json"))
+	parsedEvent, err := ParseWebhook("Service Hook", loadFixture("testdata/webhooks/service_merge_request.json"))
 	if err != nil {
 		t.Errorf("Error parsing service hook merge request: %s", err)
 	}
@@ -484,7 +484,7 @@ func TestParseServiceWebHook(t *testing.T) {
 }
 
 func TestParseSnippetCommentHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/note_snippet.json")
+	raw := loadFixture("testdata/webhooks/note_snippet.json")
 
 	parsedEvent, err := ParseWebhook("Note Hook", raw)
 	if err != nil {
@@ -514,7 +514,7 @@ func TestParseSnippetCommentHook(t *testing.T) {
 }
 
 func TestParseSubGroupHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/subgroup.json")
+	raw := loadFixture("testdata/webhooks/subgroup.json")
 
 	parsedEvent, err := ParseWebhook("Subgroup Hook", raw)
 	if err != nil {
@@ -532,7 +532,7 @@ func TestParseSubGroupHook(t *testing.T) {
 }
 
 func TestParseTagHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/tag_push.json")
+	raw := loadFixture("testdata/webhooks/tag_push.json")
 
 	parsedEvent, err := ParseWebhook("Tag Push Hook", raw)
 	if err != nil {
@@ -566,7 +566,7 @@ func TestParseTagHook(t *testing.T) {
 }
 
 func TestParseWikiPageHook(t *testing.T) {
-	raw := loadFixture(t, "testdata/webhooks/wiki_page.json")
+	raw := loadFixture("testdata/webhooks/wiki_page.json")
 
 	parsedEvent, err := ParseWebhook("Wiki Page Hook", raw)
 	if err != nil {
diff --git a/event_webhook_types_test.go b/event_webhook_types_test.go
index cb6784f..9d9e128 100644
--- a/event_webhook_types_test.go
+++ b/event_webhook_types_test.go
@@ -35,7 +35,7 @@ const (
 )
 
 func TestBuildEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/build.json")
+	jsonObject := loadFixture("testdata/webhooks/build.json")
 
 	var event *BuildEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -65,7 +65,7 @@ func TestBuildEventUnmarshal(t *testing.T) {
 }
 
 func TestCommitCommentEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/note_commit.json")
+	jsonObject := loadFixture("testdata/webhooks/note_commit.json")
 
 	var event *CommitCommentEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -111,7 +111,7 @@ func TestCommitCommentEventUnmarshal(t *testing.T) {
 }
 
 func TestJobEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/job.json")
+	jsonObject := loadFixture("testdata/webhooks/job.json")
 
 	var event *JobEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -195,7 +195,7 @@ func TestJobEventUnmarshal(t *testing.T) {
 }
 
 func TestDeploymentEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/deployment.json")
+	jsonObject := loadFixture("testdata/webhooks/deployment.json")
 
 	var event *DeploymentEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -245,7 +245,7 @@ func TestDeploymentEventUnmarshal(t *testing.T) {
 }
 
 func TestFeatureFlagEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/feature_flag.json")
+	jsonObject := loadFixture("testdata/webhooks/feature_flag.json")
 
 	var event *FeatureFlagEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -291,7 +291,7 @@ func TestFeatureFlagEventUnmarshal(t *testing.T) {
 }
 
 func TestGroupResourceAccessTokenEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/resource_access_token_group.json")
+	jsonObject := loadFixture("testdata/webhooks/resource_access_token_group.json")
 	var event *GroupResourceAccessTokenEvent
 	err := json.Unmarshal(jsonObject, &event)
 	if err != nil {
@@ -326,7 +326,7 @@ func TestGroupResourceAccessTokenEventUnmarshal(t *testing.T) {
 }
 
 func TestIssueCommentEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/note_issue.json")
+	jsonObject := loadFixture("testdata/webhooks/note_issue.json")
 
 	var event *IssueCommentEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -403,7 +403,7 @@ func TestIssueCommentEventUnmarshal(t *testing.T) {
 }
 
 func TestIssueEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/issue.json")
+	jsonObject := loadFixture("testdata/webhooks/issue.json")
 
 	var event *IssueEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -531,7 +531,7 @@ func TestIssueEventUnmarshal(t *testing.T) {
 
 // Generate unit test for MergeCommentEvent
 func TestMergeCommentEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/note_merge_request.json")
+	jsonObject := loadFixture("testdata/webhooks/note_merge_request.json")
 
 	var event *MergeCommentEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -653,7 +653,7 @@ func TestMergeCommentEventUnmarshal(t *testing.T) {
 }
 
 func TestMergeEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/merge_request.json")
+	jsonObject := loadFixture("testdata/webhooks/merge_request.json")
 
 	var event *MergeEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -845,7 +845,7 @@ func TestMergeEventUnmarshal(t *testing.T) {
 }
 
 func TestMemberEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/member.json")
+	jsonObject := loadFixture("testdata/webhooks/member.json")
 
 	var event *MemberEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -914,7 +914,7 @@ func TestMemberEventUnmarshal(t *testing.T) {
 }
 
 func TestMergeEventUnmarshalFromGroup(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/group_merge_request.json")
+	jsonObject := loadFixture("testdata/webhooks/group_merge_request.json")
 
 	var event *MergeEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -968,7 +968,7 @@ func TestMergeEventUnmarshalFromGroup(t *testing.T) {
 }
 
 func TestPipelineEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/pipeline.json")
+	jsonObject := loadFixture("testdata/webhooks/pipeline.json")
 
 	var event *PipelineEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -1062,7 +1062,7 @@ func TestPipelineEventUnmarshal(t *testing.T) {
 }
 
 func TestProjectResourceAccessTokenEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/resource_access_token_project.json")
+	jsonObject := loadFixture("testdata/webhooks/resource_access_token_project.json")
 	var event *ProjectResourceAccessTokenEvent
 	err := json.Unmarshal(jsonObject, &event)
 	if err != nil {
@@ -1110,7 +1110,7 @@ func TestProjectResourceAccessTokenEventUnmarshal(t *testing.T) {
 }
 
 func TestPushEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/push.json")
+	jsonObject := loadFixture("testdata/webhooks/push.json")
 	var event *PushEvent
 	err := json.Unmarshal(jsonObject, &event)
 	if err != nil {
@@ -1155,7 +1155,7 @@ func TestPushEventUnmarshal(t *testing.T) {
 }
 
 func TestReleaseEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/release.json")
+	jsonObject := loadFixture("testdata/webhooks/release.json")
 
 	var event *ReleaseEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -1197,7 +1197,7 @@ func TestReleaseEventUnmarshal(t *testing.T) {
 }
 
 func TestSubGroupEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/subgroup.json")
+	jsonObject := loadFixture("testdata/webhooks/subgroup.json")
 
 	var event *SubGroupEvent
 	err := json.Unmarshal(jsonObject, &event)
@@ -1227,7 +1227,7 @@ func TestSubGroupEventUnmarshal(t *testing.T) {
 }
 
 func TestTagEventUnmarshal(t *testing.T) {
-	jsonObject := loadFixture(t, "testdata/webhooks/tag_push.json")
+	jsonObject := loadFixture("testdata/webhooks/tag_push.json")
 	var event *TagEvent
 	err := json.Unmarshal(jsonObject, &event)
 	if err != nil {
diff --git a/gitlab_test.go b/gitlab_test.go
index 5f87222..b07631f 100644
--- a/gitlab_test.go
+++ b/gitlab_test.go
@@ -22,6 +22,7 @@ import (
 	"errors"
 	"fmt"
 	"io"
+	"log"
 	"net/http"
 	"net/http/httptest"
 	"os"
@@ -249,11 +250,10 @@ func TestRequestWithContext(t *testing.T) {
 	}
 }
 
-func loadFixture(t *testing.T, filePath string) []byte {
-	t.Helper()
+func loadFixture(filePath string) []byte {
 	content, err := os.ReadFile(filePath)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	return content
diff --git a/group_hooks_test.go b/group_hooks_test.go
index 4f8fe19..06e5544 100644
--- a/group_hooks_test.go
+++ b/group_hooks_test.go
@@ -358,78 +358,6 @@ func TestEditGroupHook(t *testing.T) {
 	}
 }
 
-func TestTriggerTestGroupHook(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/groups/1/hooks/1/test/push_events", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprint(w, `{"message":"201 Created"}`)
-	})
-
-	mux.HandleFunc("/api/v4/groups/1/hooks/1/test/invalid_trigger", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		w.WriteHeader(http.StatusBadRequest)
-		fmt.Fprint(w, `{"error": "trigger does not have a valid value"}`)
-	})
-
-	tests := []struct {
-		name       string
-		groupID    interface{}
-		hookID     int
-		trigger    GroupHookTrigger
-		wantErr    bool
-		wantStatus int
-		wantErrMsg string
-	}{
-		{
-			name:       "Valid trigger",
-			groupID:    1,
-			hookID:     1,
-			trigger:    GroupHookTriggerPush,
-			wantErr:    false,
-			wantStatus: http.StatusCreated,
-		},
-		{
-			name:       "Invalid group ID",
-			groupID:    "invalid",
-			hookID:     1,
-			trigger:    GroupHookTriggerPush,
-			wantErr:    true,
-			wantStatus: http.StatusNotFound,
-		},
-		{
-			name:       "Invalid trigger type",
-			groupID:    1,
-			hookID:     1,
-			trigger:    "invalid_trigger",
-			wantErr:    true,
-			wantStatus: http.StatusBadRequest,
-			wantErrMsg: "trigger does not have a valid value",
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			resp, err := client.Groups.TriggerTestGroupHook(tt.groupID, tt.hookID, tt.trigger)
-
-			if tt.wantErr {
-				assert.Error(t, err)
-				if tt.wantStatus != 0 {
-					assert.Equal(t, tt.wantStatus, resp.StatusCode)
-				}
-				if tt.wantErrMsg != "" {
-					assert.Contains(t, err.Error(), tt.wantErrMsg)
-				}
-			} else {
-				assert.NoError(t, err)
-				assert.NotNil(t, resp)
-				assert.Equal(t, tt.wantStatus, resp.StatusCode)
-			}
-		})
-	}
-}
-
 func TestDeleteGroupHook(t *testing.T) {
 	mux, client := setup(t)
 
diff --git a/group_import_export_test.go b/group_import_export_test.go
index f9f277b..3e3efb1 100644
--- a/group_import_export_test.go
+++ b/group_import_export_test.go
@@ -3,6 +3,7 @@ package gitlab
 import (
 	"fmt"
 	"io"
+	"log"
 	"net/http"
 	"os"
 	"reflect"
@@ -57,14 +58,14 @@ func TestGroupImport(t *testing.T) {
 	tmpfile, err := os.CreateTemp(os.TempDir(), "example.*.tar.gz")
 	if err != nil {
 		tmpfile.Close()
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	if _, err := tmpfile.Write(content); err != nil {
 		tmpfile.Close()
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	if err := tmpfile.Close(); err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	defer os.Remove(tmpfile.Name()) // clean up
 
diff --git a/group_labels_test.go b/group_labels_test.go
index 8686231..42c2a32 100644
--- a/group_labels_test.go
+++ b/group_labels_test.go
@@ -18,6 +18,7 @@ package gitlab
 
 import (
 	"fmt"
+	"log"
 	"net/http"
 	"reflect"
 	"testing"
@@ -28,18 +29,18 @@ func TestCreateGroupGroupLabel(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/groups/1/labels", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPost)
-		fmt.Fprint(w, `{"id":1, "name": "MyGroupLabel", "color" : "#11FF22"}`)
+		fmt.Fprint(w, `{"id":1, "name": "My / GroupLabel", "color" : "#11FF22"}`)
 	})
 
 	l := &CreateGroupLabelOptions{
-		Name:  Ptr("MyGroupLabel"),
+		Name:  Ptr("My / GroupLabel"),
 		Color: Ptr("#11FF22"),
 	}
 	label, _, err := client.GroupLabels.CreateGroupLabel("1", l)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
-	want := &GroupLabel{ID: 1, Name: "MyGroupLabel", Color: "#11FF22"}
+	want := &GroupLabel{ID: 1, Name: "My / GroupLabel", Color: "#11FF22"}
 	if !reflect.DeepEqual(want, label) {
 		t.Errorf("GroupLabels.CreateGroupLabel returned %+v, want %+v", label, want)
 	}
@@ -54,47 +55,52 @@ func TestDeleteGroupLabelByID(t *testing.T) {
 
 	_, err := client.GroupLabels.DeleteGroupLabel("1", "1", nil)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
 func TestDeleteGroupLabelByName(t *testing.T) {
 	mux, client := setup(t)
 
-	mux.HandleFunc("/api/v4/groups/1/labels/MyGroupLabel", func(w http.ResponseWriter, r *http.Request) {
+	mux.HandleFunc("/api/v4/groups/1/labels", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodDelete)
 	})
 
-	_, err := client.GroupLabels.DeleteGroupLabel("1", "MyGroupLabel", nil)
+	label := &DeleteGroupLabelOptions{
+		Name: Ptr("My / GroupLabel"),
+	}
+
+	_, err := client.GroupLabels.DeleteGroupLabel("1", nil, label)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
 func TestUpdateGroupLabel(t *testing.T) {
 	mux, client := setup(t)
 
-	mux.HandleFunc("/api/v4/groups/1/labels/MyGroupLabel", func(w http.ResponseWriter, r *http.Request) {
+	mux.HandleFunc("/api/v4/groups/1/labels", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "name": "NewLabel", "color" : "#11FF23" , "description":"This is updated label"}`)
+		fmt.Fprint(w, `{"id":1, "name": "New / GroupLabel", "color" : "#11FF23" , "description":"This is updated label"}`)
 	})
 
 	l := &UpdateGroupLabelOptions{
-		NewName:     Ptr("NewLabel"),
+		Name:        Ptr("My / GroupLabel"),
+		NewName:     Ptr("New / GroupLabel"),
 		Color:       Ptr("#11FF23"),
 		Description: Ptr("This is updated label"),
 	}
 
-	label, resp, err := client.GroupLabels.UpdateGroupLabel("1", "MyGroupLabel", l)
+	label, resp, err := client.GroupLabels.UpdateGroupLabel("1", l)
 
 	if resp == nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
-	want := &GroupLabel{ID: 1, Name: "NewLabel", Color: "#11FF23", Description: "This is updated label"}
+	want := &GroupLabel{ID: 1, Name: "New / GroupLabel", Color: "#11FF23", Description: "This is updated label"}
 
 	if !reflect.DeepEqual(want, label) {
 		t.Errorf("GroupLabels.UpdateGroupLabel returned %+v, want %+v", label, want)
@@ -111,7 +117,7 @@ func TestSubscribeToGroupLabel(t *testing.T) {
 
 	label, _, err := client.GroupLabels.SubscribeToGroupLabel("1", "5")
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	want := &GroupLabel{ID: 5, Name: "kind/bug", Color: "#d9534f", Description: "Bug reported by user", OpenIssuesCount: 1, ClosedIssuesCount: 0, OpenMergeRequestsCount: 1, Subscribed: true}
 	if !reflect.DeepEqual(want, label) {
@@ -128,7 +134,7 @@ func TestUnsubscribeFromGroupLabel(t *testing.T) {
 
 	_, err := client.GroupLabels.UnsubscribeFromGroupLabel("1", "5")
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
diff --git a/group_variables_test.go b/group_variables_test.go
index 0c0de84..4d79d39 100644
--- a/group_variables_test.go
+++ b/group_variables_test.go
@@ -29,7 +29,7 @@ func TestListGroupVariabless(t *testing.T) {
 	mux.HandleFunc("/api/v4/groups/1/variables",
 		func(w http.ResponseWriter, r *http.Request) {
 			testMethod(t, r, http.MethodGet)
-			fmt.Fprint(w, `[{"key": "TEST_VARIABLE_1","value": "test1","protected": false,"masked": true,"hidden": true}]`)
+			fmt.Fprint(w, `[{"key": "TEST_VARIABLE_1","value": "test1","protected": false,"masked": true}]`)
 		})
 
 	variables, _, err := client.GroupVariables.ListVariables(1, &ListGroupVariablesOptions{})
@@ -43,7 +43,6 @@ func TestListGroupVariabless(t *testing.T) {
 			Value:     "test1",
 			Protected: false,
 			Masked:    true,
-			Hidden:    true,
 		},
 	}
 
@@ -59,7 +58,7 @@ func TestGetGroupVariable(t *testing.T) {
 		func(w http.ResponseWriter, r *http.Request) {
 			testMethod(t, r, http.MethodGet)
 			testParams(t, r, "filter%5Benvironment_scope%5D=prod")
-			fmt.Fprint(w, `{"key": "TEST_VARIABLE_1","value": "test1","protected": false,"masked": true,"hidden": false}`)
+			fmt.Fprint(w, `{"key": "TEST_VARIABLE_1","value": "test1","protected": false,"masked": true}`)
 		})
 
 	variable, _, err := client.GroupVariables.GetVariable(1, "TEST_VARIABLE_1", &GetGroupVariableOptions{Filter: &VariableFilter{EnvironmentScope: "prod"}})
@@ -67,7 +66,7 @@ func TestGetGroupVariable(t *testing.T) {
 		t.Errorf("GroupVariables.GetVariable returned error: %v", err)
 	}
 
-	want := &GroupVariable{Key: "TEST_VARIABLE_1", Value: "test1", Protected: false, Masked: true, Hidden: false}
+	want := &GroupVariable{Key: "TEST_VARIABLE_1", Value: "test1", Protected: false, Masked: true}
 	if !reflect.DeepEqual(want, variable) {
 		t.Errorf("GroupVariables.GetVariable returned %+v, want %+v", variable, want)
 	}
@@ -79,15 +78,14 @@ func TestCreateGroupVariable(t *testing.T) {
 	mux.HandleFunc("/api/v4/groups/1/variables",
 		func(w http.ResponseWriter, r *http.Request) {
 			testMethod(t, r, http.MethodPost)
-			fmt.Fprint(w, `{"key": "TEST_VARIABLE_1","value":"test1","protected": false,"masked": true,"hidden": false}`)
+			fmt.Fprint(w, `{"key": "TEST_VARIABLE_1","value": "test1","protected": false,"masked": true}`)
 		})
 
 	opt := &CreateGroupVariableOptions{
-		Key:             Ptr("TEST_VARIABLE_1"),
-		Value:           Ptr("test1"),
-		Protected:       Ptr(false),
-		Masked:          Ptr(true),
-		MaskedAndHidden: Ptr(false),
+		Key:       Ptr("TEST_VARIABLE_1"),
+		Value:     Ptr("test1"),
+		Protected: Ptr(false),
+		Masked:    Ptr(true),
 	}
 
 	variable, _, err := client.GroupVariables.CreateVariable(1, opt, nil)
@@ -95,35 +93,7 @@ func TestCreateGroupVariable(t *testing.T) {
 		t.Errorf("GroupVariables.CreateVariable returned error: %v", err)
 	}
 
-	want := &GroupVariable{Key: "TEST_VARIABLE_1", Value: "test1", Protected: false, Masked: true, Hidden: false}
-	if !reflect.DeepEqual(want, variable) {
-		t.Errorf("GroupVariables.CreateVariable returned %+v, want %+v", variable, want)
-	}
-}
-
-func TestCreateGroupVariable_MaskedAndHidden(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/groups/1/variables",
-		func(w http.ResponseWriter, r *http.Request) {
-			testMethod(t, r, http.MethodPost)
-			fmt.Fprint(w, `{"key": "TEST_VARIABLE_1","protected": false,"masked": true,"hidden": true}`)
-		})
-
-	opt := &CreateGroupVariableOptions{
-		Key:             Ptr("TEST_VARIABLE_1"),
-		Value:           Ptr("test1"),
-		Protected:       Ptr(false),
-		Masked:          Ptr(true),
-		MaskedAndHidden: Ptr(true),
-	}
-
-	variable, _, err := client.GroupVariables.CreateVariable(1, opt, nil)
-	if err != nil {
-		t.Errorf("GroupVariables.CreateVariable returned error: %v", err)
-	}
-
-	want := &GroupVariable{Key: "TEST_VARIABLE_1", Protected: false, Masked: true, Hidden: true}
+	want := &GroupVariable{Key: "TEST_VARIABLE_1", Value: "test1", Protected: false, Masked: true}
 	if !reflect.DeepEqual(want, variable) {
 		t.Errorf("GroupVariables.CreateVariable returned %+v, want %+v", variable, want)
 	}
@@ -156,27 +126,7 @@ func TestUpdateGroupVariable(t *testing.T) {
 	mux.HandleFunc("/api/v4/groups/1/variables/TEST_VARIABLE_1",
 		func(w http.ResponseWriter, r *http.Request) {
 			testMethod(t, r, http.MethodPut)
-			fmt.Fprint(w, `{"key": "TEST_VARIABLE_1","value": "test1","protected": false,"masked": true,"hidden": false}`)
-		})
-
-	variable, _, err := client.GroupVariables.UpdateVariable(1, "TEST_VARIABLE_1", &UpdateGroupVariableOptions{})
-	if err != nil {
-		t.Errorf("GroupVariables.UpdateVariable returned error: %v", err)
-	}
-
-	want := &GroupVariable{Key: "TEST_VARIABLE_1", Value: "test1", Protected: false, Masked: true, Hidden: false}
-	if !reflect.DeepEqual(want, variable) {
-		t.Errorf("Groups.UpdatedGroup returned %+v, want %+v", variable, want)
-	}
-}
-
-func TestUpdateGroupVariable_MaskedAndHidden(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/groups/1/variables/TEST_VARIABLE_1",
-		func(w http.ResponseWriter, r *http.Request) {
-			testMethod(t, r, http.MethodPut)
-			fmt.Fprint(w, `{"key": "TEST_VARIABLE_1","protected": false,"masked": true,"hidden": true}`)
+			fmt.Fprint(w, `{"key": "TEST_VARIABLE_1","value": "test1","protected": false,"masked": true}`)
 		})
 
 	variable, _, err := client.GroupVariables.UpdateVariable(1, "TEST_VARIABLE_1", &UpdateGroupVariableOptions{})
@@ -184,7 +134,7 @@ func TestUpdateGroupVariable_MaskedAndHidden(t *testing.T) {
 		t.Errorf("GroupVariables.UpdateVariable returned error: %v", err)
 	}
 
-	want := &GroupVariable{Key: "TEST_VARIABLE_1", Protected: false, Masked: true, Hidden: true}
+	want := &GroupVariable{Key: "TEST_VARIABLE_1", Value: "test1", Protected: false, Masked: true}
 	if !reflect.DeepEqual(want, variable) {
 		t.Errorf("Groups.UpdatedGroup returned %+v, want %+v", variable, want)
 	}
diff --git a/groups_test.go b/groups_test.go
index 7a8c281..05baf80 100644
--- a/groups_test.go
+++ b/groups_test.go
@@ -783,40 +783,49 @@ func TestUnshareGroupFromGroup(t *testing.T) {
 	}
 }
 
-func TestUpdateGroupWithIPRestrictionRanges(t *testing.T) {
+func TestCreateGroupWithIPRestrictionRanges(t *testing.T) {
 	mux, client := setup(t)
-	const ipRange = "192.168.0.0/24"
 
-	mux.HandleFunc("/api/v4/groups/1",
+	mux.HandleFunc("/api/v4/groups",
 		func(w http.ResponseWriter, r *http.Request) {
-			testMethod(t, r, http.MethodPut)
+			testMethod(t, r, http.MethodPost)
+			fmt.Fprint(w, `{"id": 1, "name": "g", "path": "g", "ip_restriction_ranges" : "192.168.0.0/24"}`)
+		})
 
-			body, err := io.ReadAll(r.Body)
-			if err != nil {
-				t.Fatalf("Failed to read the request body. Error: %v", err)
-			}
+	opt := &CreateGroupOptions{
+		Name:                Ptr("g"),
+		Path:                Ptr("g"),
+		IPRestrictionRanges: Ptr("192.168.0.0/24"),
+	}
 
-			var bodyJson map[string]interface{}
-			err = json.Unmarshal(body, &bodyJson)
-			if err != nil {
-				t.Fatalf("Failed to parse the request body into JSON. Error: %v", err)
-			}
+	group, _, err := client.Groups.CreateGroup(opt, nil)
+	if err != nil {
+		t.Errorf("Groups.CreateGroup returned error: %v", err)
+	}
 
-			if bodyJson["ip_restriction_ranges"] != ipRange {
-				t.Fatalf("Test failed. `ip_restriction_ranges` expected to be '%v', got %v", ipRange, bodyJson["ip_restriction_ranges"])
-			}
+	want := &Group{ID: 1, Name: "g", Path: "g", IPRestrictionRanges: "192.168.0.0/24"}
+	if !reflect.DeepEqual(want, group) {
+		t.Errorf("Groups.CreateGroup returned %+v, want %+v", group, want)
+	}
+}
+
+func TestUpdateGroupWithIPRestrictionRanges(t *testing.T) {
+	mux, client := setup(t)
 
-			fmt.Fprintf(w, `{"id": 1, "ip_restriction_ranges" : "%v"}`, ipRange)
+	mux.HandleFunc("/api/v4/groups/1",
+		func(w http.ResponseWriter, r *http.Request) {
+			testMethod(t, r, http.MethodPut)
+			fmt.Fprint(w, `{"id": 1, "ip_restriction_ranges" : "192.168.0.0/24"}`)
 		})
 
 	group, _, err := client.Groups.UpdateGroup(1, &UpdateGroupOptions{
-		IPRestrictionRanges: Ptr(ipRange),
+		IPRestrictionRanges: Ptr("192.168.0.0/24"),
 	})
 	if err != nil {
 		t.Errorf("Groups.UpdateGroup returned error: %v", err)
 	}
 
-	want := &Group{ID: 1, IPRestrictionRanges: ipRange}
+	want := &Group{ID: 1, IPRestrictionRanges: "192.168.0.0/24"}
 	if !reflect.DeepEqual(want, group) {
 		t.Errorf("Groups.UpdatedGroup returned %+v, want %+v", group, want)
 	}
@@ -1115,42 +1124,3 @@ func TestEditGroupPushRules(t *testing.T) {
 		t.Errorf("Groups.EditGroupPushRule returned %+v, want %+v", rule, want)
 	}
 }
-
-func TestUpdateGroupWithAllowedEmailDomainsList(t *testing.T) {
-	mux, client := setup(t)
-	const domain = "example.com"
-
-	mux.HandleFunc("/api/v4/groups/1",
-		func(w http.ResponseWriter, r *http.Request) {
-			testMethod(t, r, http.MethodPut)
-
-			body, err := io.ReadAll(r.Body)
-			if err != nil {
-				t.Fatalf("Failed to read the request body. Error: %v", err)
-			}
-
-			var bodyJson map[string]interface{}
-			err = json.Unmarshal(body, &bodyJson)
-			if err != nil {
-				t.Fatalf("Failed to parse the request body into JSON. Error: %v", err)
-			}
-
-			if bodyJson["allowed_email_domains_list"] != domain {
-				t.Fatalf("Test failed. `allowed_email_domains_list` expected to be '%v', got %v", domain, bodyJson["allowed_email_domains_list"])
-			}
-
-			fmt.Fprintf(w, `{"id": 1, "allowed_email_domains_list" : "%v"}`, domain)
-		})
-
-	group, _, err := client.Groups.UpdateGroup(1, &UpdateGroupOptions{
-		AllowedEmailDomainsList: Ptr(domain),
-	})
-	if err != nil {
-		t.Errorf("Groups.UpdateGroup returned error: %v", err)
-	}
-
-	want := &Group{ID: 1, AllowedEmailDomainsList: domain}
-	if !reflect.DeepEqual(want, group) {
-		t.Errorf("Groups.UpdatedGroup returned %+v, want %+v", group, want)
-	}
-}
diff --git a/issues_statistics_test.go b/issues_statistics_test.go
index 295d3bc..6021bc6 100644
--- a/issues_statistics_test.go
+++ b/issues_statistics_test.go
@@ -18,6 +18,7 @@ package gitlab
 
 import (
 	"fmt"
+	"log"
 	"net/http"
 	"reflect"
 	"testing"
@@ -39,7 +40,7 @@ func TestGetIssuesStatistics(t *testing.T) {
 
 	issue, _, err := client.IssuesStatistics.GetIssuesStatistics(opt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &IssuesStatistics{
@@ -81,7 +82,7 @@ func TestGetGroupIssuesStatistics(t *testing.T) {
 
 	issue, _, err := client.IssuesStatistics.GetGroupIssuesStatistics(1, opt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &IssuesStatistics{
@@ -123,7 +124,7 @@ func TestGetProjectIssuesStatistics(t *testing.T) {
 
 	issue, _, err := client.IssuesStatistics.GetProjectIssuesStatistics(1, opt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &IssuesStatistics{
diff --git a/issues_test.go b/issues_test.go
index 1822a57..0b73499 100644
--- a/issues_test.go
+++ b/issues_test.go
@@ -18,6 +18,7 @@ package gitlab
 
 import (
 	"fmt"
+	"log"
 	"net/http"
 	"reflect"
 	"testing"
@@ -35,7 +36,7 @@ func TestGetIssue(t *testing.T) {
 
 	issue, _, err := client.Issues.GetIssue("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -61,7 +62,7 @@ func TestGetIssueByID(t *testing.T) {
 
 	issue, _, err := client.Issues.GetIssueByID(5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -87,7 +88,7 @@ func TestDeleteIssue(t *testing.T) {
 
 	_, err := client.Issues.DeleteIssue("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
@@ -104,7 +105,7 @@ func TestReorderIssue(t *testing.T) {
 
 	issue, _, err := client.Issues.ReorderIssue("1", 5, &opt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -130,7 +131,7 @@ func TestMoveIssue(t *testing.T) {
 
 	issue, _, err := client.Issues.MoveIssue("1", 11, &MoveIssueOptions{ToProjectID: Ptr(5)})
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -156,7 +157,7 @@ func TestMoveIssue(t *testing.T) {
 	})
 	movedIssue, _, err := client.Issues.GetIssue("1", 11)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	wantedMovedIssue := &Issue{
@@ -207,7 +208,7 @@ func TestListIssues(t *testing.T) {
 
 	issues, _, err := client.Issues.ListIssues(listProjectIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -273,7 +274,7 @@ func TestListIssuesWithLabelDetails(t *testing.T) {
 
 	issues, _, err := client.Issues.ListIssues(listProjectIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -317,7 +318,7 @@ func TestListIssuesSearchInTitle(t *testing.T) {
 
 	issues, _, err := client.Issues.ListIssues(listProjectIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -355,7 +356,7 @@ func TestListIssuesSearchInDescription(t *testing.T) {
 
 	issues, _, err := client.Issues.ListIssues(listProjectIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -400,7 +401,7 @@ func TestListIssuesSearchByIterationID(t *testing.T) {
 
 	issues, _, err := client.Issues.ListIssues(listProjectIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -437,7 +438,7 @@ func TestListProjectIssues(t *testing.T) {
 	}
 	issues, _, err := client.Issues.ListProjectIssues("1", listProjectIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -483,7 +484,7 @@ func TestListProjectIssuesSearchByIterationID(t *testing.T) {
 
 	issues, _, err := client.Issues.ListProjectIssues(1, listProjectIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -522,7 +523,7 @@ func TestListGroupIssues(t *testing.T) {
 
 	issues, _, err := client.Issues.ListGroupIssues("1", listGroupIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -568,7 +569,7 @@ func TestListGroupIssuesSearchByIterationID(t *testing.T) {
 
 	issues, _, err := client.Issues.ListGroupIssues(1, listProjectIssue)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*Issue{{
@@ -605,7 +606,7 @@ func TestCreateIssue(t *testing.T) {
 
 	issue, _, err := client.Issues.CreateIssue("1", createIssueOptions)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -635,7 +636,7 @@ func TestUpdateIssue(t *testing.T) {
 	}
 	issue, _, err := client.Issues.UpdateIssue(1, 5, updateIssueOpt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -661,7 +662,7 @@ func TestSubscribeToIssue(t *testing.T) {
 
 	issue, _, err := client.Issues.SubscribeToIssue("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -687,7 +688,7 @@ func TestUnsubscribeFromIssue(t *testing.T) {
 
 	issue, _, err := client.Issues.UnsubscribeFromIssue("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -719,7 +720,7 @@ func TestListMergeRequestsClosingIssue(t *testing.T) {
 	}
 	mergeRequest, _, err := client.Issues.ListMergeRequestsClosingIssue("1", 5, listMergeRequestsClosingIssueOpt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*MergeRequest{{ID: 1, Title: "test merge one"}, {ID: 2, Title: "test merge two"}}
@@ -745,7 +746,7 @@ func TestListMergeRequestsRelatedToIssue(t *testing.T) {
 	}
 	mergeRequest, _, err := client.Issues.ListMergeRequestsRelatedToIssue("1", 5, listMergeRequestsRelatedToIssueOpt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*MergeRequest{{ID: 1, Title: "test merge one"}, {ID: 2, Title: "test merge two"}}
@@ -769,7 +770,7 @@ func TestSetTimeEstimate(t *testing.T) {
 
 	timeState, _, err := client.Issues.SetTimeEstimate("1", 5, setTimeEstiOpt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	want := &TimeStats{HumanTimeEstimate: "3h 30m", HumanTotalTimeSpent: "", TimeEstimate: 12600, TotalTimeSpent: 0}
 
@@ -788,7 +789,7 @@ func TestResetTimeEstimate(t *testing.T) {
 
 	timeState, _, err := client.Issues.ResetTimeEstimate("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	want := &TimeStats{HumanTimeEstimate: "", HumanTotalTimeSpent: "", TimeEstimate: 0, TotalTimeSpent: 0}
 
@@ -813,7 +814,7 @@ func TestAddSpentTime(t *testing.T) {
 
 	timeState, _, err := client.Issues.AddSpentTime("1", 5, addSpentTimeOpt)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	want := &TimeStats{HumanTimeEstimate: "", HumanTotalTimeSpent: "1h", TimeEstimate: 0, TotalTimeSpent: 3600}
 
@@ -833,7 +834,7 @@ func TestResetSpentTime(t *testing.T) {
 
 	timeState, _, err := client.Issues.ResetSpentTime("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &TimeStats{HumanTimeEstimate: "", HumanTotalTimeSpent: "", TimeEstimate: 0, TotalTimeSpent: 0}
@@ -853,7 +854,7 @@ func TestGetTimeSpent(t *testing.T) {
 
 	timeState, _, err := client.Issues.GetTimeSpent("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &TimeStats{HumanTimeEstimate: "2h", HumanTotalTimeSpent: "1h", TimeEstimate: 7200, TotalTimeSpent: 3600}
@@ -875,7 +876,7 @@ func TestGetIssueParticipants(t *testing.T) {
 
 	issueParticipants, _, err := client.Issues.GetParticipants("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*BasicUser{
@@ -899,7 +900,7 @@ func TestGetIssueMilestone(t *testing.T) {
 
 	issue, _, err := client.Issues.GetIssue("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
@@ -935,7 +936,7 @@ func TestGetIssueGroupMilestone(t *testing.T) {
 
 	issue, _, err := client.Issues.GetIssue("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Issue{
diff --git a/labels_test.go b/labels_test.go
index ac2a85b..81260b3 100644
--- a/labels_test.go
+++ b/labels_test.go
@@ -18,6 +18,7 @@ package gitlab
 
 import (
 	"fmt"
+	"log"
 	"net/http"
 	"reflect"
 	"testing"
@@ -28,20 +29,20 @@ func TestCreateLabel(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/labels", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPost)
-		fmt.Fprint(w, `{"id":1, "name": "MyLabel", "color" : "#11FF22", "priority": 2}`)
+		fmt.Fprint(w, `{"id":1, "name": "My Label", "color" : "#11FF22", "priority": 2}`)
 	})
 
 	// Create new label
 	l := &CreateLabelOptions{
-		Name:     Ptr("MyLabel"),
+		Name:     Ptr("My Label"),
 		Color:    Ptr("#11FF22"),
 		Priority: Ptr(2),
 	}
 	label, _, err := client.Labels.CreateLabel("1", l)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
-	want := &Label{ID: 1, Name: "MyLabel", Color: "#11FF22", Priority: 2}
+	want := &Label{ID: 1, Name: "My Label", Color: "#11FF22", Priority: 2}
 	if !reflect.DeepEqual(want, label) {
 		t.Errorf("Labels.CreateLabel returned %+v, want %+v", label, want)
 	}
@@ -57,51 +58,52 @@ func TestDeleteLabelbyID(t *testing.T) {
 	// Delete label
 	_, err := client.Labels.DeleteLabel("1", "1", nil)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
 func TestDeleteLabelbyName(t *testing.T) {
 	mux, client := setup(t)
 
-	mux.HandleFunc("/api/v4/projects/1/labels/MyLabel", func(w http.ResponseWriter, r *http.Request) {
+	mux.HandleFunc("/api/v4/projects/1/labels", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodDelete)
 	})
 
 	// Delete label
 	label := &DeleteLabelOptions{
-		Name: Ptr("MyLabel"),
+		Name: Ptr("My Label"),
 	}
 
-	_, err := client.Labels.DeleteLabel("1", "MyLabel", label)
+	_, err := client.Labels.DeleteLabel("1", nil, label)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
 func TestUpdateLabel(t *testing.T) {
 	mux, client := setup(t)
 
-	mux.HandleFunc("/api/v4/projects/1/labels/MyLabel", func(w http.ResponseWriter, r *http.Request) {
+	mux.HandleFunc("/api/v4/projects/1/labels", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
 		fmt.Fprint(w, `{"id":1, "name": "New Label", "color" : "#11FF23" , "description":"This is updated label", "priority": 42}`)
 	})
 
 	// Update label
 	l := &UpdateLabelOptions{
+		Name:        Ptr("My Label"),
 		NewName:     Ptr("New Label"),
 		Color:       Ptr("#11FF23"),
 		Description: Ptr("This is updated label"),
 		Priority:    Ptr(42),
 	}
 
-	label, resp, err := client.Labels.UpdateLabel("1", "MyLabel", l)
+	label, resp, err := client.Labels.UpdateLabel("1", l)
 
 	if resp == nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := &Label{ID: 1, Name: "New Label", Color: "#11FF23", Description: "This is updated label", Priority: 42}
@@ -121,7 +123,7 @@ func TestSubscribeToLabel(t *testing.T) {
 
 	label, _, err := client.Labels.SubscribeToLabel("1", "5")
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 	want := &Label{ID: 5, Name: "kind/bug", Color: "#d9534f", Description: "Bug reported by user", OpenIssuesCount: 1, ClosedIssuesCount: 0, OpenMergeRequestsCount: 1, Subscribed: true}
 	if !reflect.DeepEqual(want, label) {
@@ -138,7 +140,7 @@ func TestUnsubscribeFromLabel(t *testing.T) {
 
 	_, err := client.Labels.UnsubscribeFromLabel("1", "5")
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 }
 
diff --git a/merge_requests_test.go b/merge_requests_test.go
index 64cdd73..eb77362 100644
--- a/merge_requests_test.go
+++ b/merge_requests_test.go
@@ -19,6 +19,7 @@ package gitlab
 import (
 	"encoding/json"
 	"fmt"
+	"log"
 	"net/http"
 	"reflect"
 	"testing"
@@ -345,7 +346,7 @@ func TestGetMergeRequestParticipants(t *testing.T) {
 
 	mergeRequestParticipants, _, err := client.MergeRequests.GetMergeRequestParticipants("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	want := []*BasicUser{
@@ -370,7 +371,7 @@ func TestGetMergeRequestReviewers(t *testing.T) {
 
 	mergeRequestReviewers, _, err := client.MergeRequests.GetMergeRequestReviewers("1", 5)
 	if err != nil {
-		t.Fatal(err)
+		log.Fatal(err)
 	}
 
 	createdAt := time.Date(2022, 0o7, 27, 17, 3, 27, 684000000, time.UTC)
diff --git a/metadata_test.go b/metadata_test.go
index 4e4b75c..637c4c4 100644
--- a/metadata_test.go
+++ b/metadata_test.go
@@ -35,8 +35,7 @@ func TestGetMetadata(t *testing.T) {
         "enterprise": true,
         "kas": {
           "enabled": true,
-          "externalUrl": "wss://kas.gitlab.example.com",
-          "externalK8sProxyUrl": "https://kas.gitlab.example.com/k8s-proxy",
+          "externalUrl": "wss://kas.gitlab.com",
           "version": "15.6.0-rc2"
         }
       }`)
@@ -49,15 +48,13 @@ func TestGetMetadata(t *testing.T) {
 
 	want := &Metadata{
 		Version: "15.6.0-pre", Revision: "016e8d8bdc3", KAS: struct {
-			Enabled             bool   `json:"enabled"`
-			ExternalURL         string `json:"externalUrl"`
-			ExternalK8SProxyURL string `json:"externalK8sProxyUrl"`
-			Version             string `json:"version"`
+			Enabled     bool   `json:"enabled"`
+			ExternalURL string `json:"externalUrl"`
+			Version     string `json:"version"`
 		}{
-			Enabled:             true,
-			ExternalURL:         "wss://kas.gitlab.example.com",
-			ExternalK8SProxyURL: "https://kas.gitlab.example.com/k8s-proxy",
-			Version:             "15.6.0-rc2",
+			Enabled:     true,
+			ExternalURL: "wss://kas.gitlab.com",
+			Version:     "15.6.0-rc2",
 		},
 		Enterprise: true,
 	}
diff --git a/pages_test.go b/pages_test.go
index 4101caf..0168253 100644
--- a/pages_test.go
+++ b/pages_test.go
@@ -78,47 +78,3 @@ func TestGetPages(t *testing.T) {
 	require.NotNil(t, resp)
 	require.Equal(t, want, p)
 }
-
-func TestUpdatePages(t *testing.T) {
-	mux, client := setup(t)
-	mux.HandleFunc("/api/v4/projects/2/pages", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPatch)
-		fmt.Fprint(w, `
-		  {
-			"url": "https://ssl.domain.example",
-			"deployments": [
-			  {
-				"created_at": "2021-04-27T21:27:38.584Z",
-				"url": "https://ssl.domain.example/",
-				"path_prefix": "",
-				"root_directory": null
-			  }
-			],
-			"is_unique_domain_enabled": true,
-			"force_https": false
-		  }
-		`)
-	})
-
-	want := &Pages{
-		URL:                   "https://ssl.domain.example",
-		IsUniqueDomainEnabled: true,
-		ForceHTTPS:            false,
-		Deployments: []*PagesDeployment{
-			{
-				CreatedAt:     time.Date(2021, time.April, 27, 21, 27, 38, 584000000, time.UTC),
-				URL:           "https://ssl.domain.example/",
-				PathPrefix:    "",
-				RootDirectory: "",
-			},
-		},
-	}
-
-	p, resp, err := client.Pages.UpdatePages(2, UpdatePagesOptions{
-		PagesUniqueDomainEnabled: Ptr(true),
-		PagesHTTPSOnly:           Ptr(false),
-	})
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, want, p)
-}
diff --git a/pipelines_test.go b/pipelines_test.go
index 88fb831..870f2ea 100644
--- a/pipelines_test.go
+++ b/pipelines_test.go
@@ -271,23 +271,3 @@ func TestDeletePipeline(t *testing.T) {
 		t.Errorf("Pipelines.DeletePipeline returned error: %v", err)
 	}
 }
-
-func TestUpdateMetadata(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/pipelines/234/metadata", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "status":"running"}`)
-	})
-
-	opt := &UpdatePipelineMetadataOptions{Name: Ptr("new pipeline title")}
-	pipeline, _, err := client.Pipelines.UpdatePipelineMetadata("1", 234, opt)
-	if err != nil {
-		t.Errorf("Pipelines.UpdatePipelineMetadata returned error: %v", err)
-	}
-
-	want := &Pipeline{ID: 1, Status: "running"}
-	if !reflect.DeepEqual(want, pipeline) {
-		t.Errorf("Pipelines.UpdatePipelineMetadata returned %+v, want %+v", pipeline, want)
-	}
-}
diff --git a/project_markdown_uploads_test.go b/project_markdown_uploads_test.go
deleted file mode 100644
index b83305a..0000000
--- a/project_markdown_uploads_test.go
+++ /dev/null
@@ -1,163 +0,0 @@
-package gitlab
-
-import (
-	"fmt"
-	"net/http"
-	"strings"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/require"
-)
-
-func TestProjectMarkdownUploads_UploadProjectMarkdown(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/uploads", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		fmt.Fprint(w, `
-			{
-				"id": 5,
-				"alt": "dk",
-				"url": "/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png",
-				"full_path": "/-/project/1234/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png",
-				"markdown": "![dk](/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png)"
-			}
-		`)
-	})
-
-	want := &ProjectMarkdownUploadedFile{
-		ID:       5,
-		Alt:      "dk",
-		URL:      "/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png",
-		FullPath: "/-/project/1234/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png",
-		Markdown: "![dk](/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png)",
-	}
-
-	content := strings.NewReader("bar = baz")
-	upload, resp, err := client.ProjectMarkdownUploads.UploadProjectMarkdown(1, content)
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, want, upload)
-}
-
-func TestProjectMarkdownUploads_ListProjectMarkdownUploads(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/uploads", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		fmt.Fprint(w, `
-			[
-				{
-					"id": 1,
-					"size": 1024,
-					"filename": "image.png",
-					"created_at":"2024-06-20T15:53:03.000Z",
-					"uploaded_by": {
-					"id": 18,
-					"name" : "Alexandra Bashirian",
-					"username" : "eileen.lowe"
-					}
-				},
-				{
-					"id": 2,
-					"size": 512,
-					"filename": "other-image.png",
-					"created_at":"2024-06-19T15:53:03.000Z",
-					"uploaded_by": null
-				}
-			]
-		`)
-	})
-
-	created1 := time.Date(2024, 6, 20, 15, 53, 3, 0, time.UTC)
-	created2 := time.Date(2024, 6, 19, 15, 53, 3, 0, time.UTC)
-	want := []*ProjectMarkdownUpload{
-		{
-			ID:        1,
-			Size:      1024,
-			Filename:  "image.png",
-			CreatedAt: &created1,
-			UploadedBy: &User{
-				ID:       18,
-				Name:     "Alexandra Bashirian",
-				Username: "eileen.lowe",
-			},
-		},
-		{
-			ID:        2,
-			Size:      512,
-			Filename:  "other-image.png",
-			CreatedAt: &created2,
-		},
-	}
-
-	uploads, resp, err := client.ProjectMarkdownUploads.ListProjectMarkdownUploads(1)
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, want, uploads)
-}
-
-func TestProjectMarkdownUploads_DownloadProjectMarkdownUploadByID(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/uploads/2", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		fmt.Fprint(w, strings.TrimSpace(`
-			bar = baz
-		`))
-	})
-
-	want := []byte("bar = baz")
-
-	bytes, resp, err := client.ProjectMarkdownUploads.DownloadProjectMarkdownUploadByID(1, 2)
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, want, bytes)
-}
-
-func TestProjectMarkdownUploads_DownloadProjectMarkdownUploadBySecretAndFilename(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/uploads/secret/filename", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		fmt.Fprint(w, strings.TrimSpace(`
-			bar = baz
-		`))
-	})
-
-	want := []byte("bar = baz")
-
-	bytes, resp, err := client.ProjectMarkdownUploads.DownloadProjectMarkdownUploadBySecretAndFilename(1, "secret", "filename")
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, want, bytes)
-}
-
-func TestProjectMarkdownUploads_DeleteProjectMarkdownUploadByID(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/uploads/2", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodDelete)
-		w.WriteHeader(204)
-	})
-
-	resp, err := client.ProjectMarkdownUploads.DeleteProjectMarkdownUploadByID(1, 2)
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, 204, resp.StatusCode)
-}
-
-func TestProjectMarkdownUploads_DeleteProjectMarkdownUploadBySecretAndFilename(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/uploads/secret/filename", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodDelete)
-		w.WriteHeader(204)
-	})
-
-	resp, err := client.ProjectMarkdownUploads.DeleteProjectMarkdownUploadBySecretAndFilename(1, "secret", "filename")
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, 204, resp.StatusCode)
-}
diff --git a/project_variables_test.go b/project_variables_test.go
index 4555525..7f2cd8e 100644
--- a/project_variables_test.go
+++ b/project_variables_test.go
@@ -31,7 +31,6 @@ func TestProjectVariablesService_ListVariables(t *testing.T) {
 		VariableType:     "env_var",
 		Protected:        false,
 		Masked:           false,
-		Hidden:           false,
 		EnvironmentScope: "",
 		Description:      "test variable 1",
 	}}
@@ -70,7 +69,6 @@ func TestProjectVariablesService_GetVariable(t *testing.T) {
 				"value": "TEST_1",
 				"protected": false,
 				"masked": true,
-				"hidden": true,
 				"description": "test variable 1"
 			}
 		`)
@@ -82,7 +80,6 @@ func TestProjectVariablesService_GetVariable(t *testing.T) {
 		VariableType:     "env_var",
 		Protected:        false,
 		Masked:           true,
-		Hidden:           true,
 		EnvironmentScope: "",
 		Description:      "test variable 1",
 	}
@@ -121,7 +118,6 @@ func TestProjectVariablesService_CreateVariable(t *testing.T) {
 				"protected": false,
 				"variable_type": "env_var",
 				"masked": false,
-				"masked_and_hidden": false,
 				"environment_scope": "*",
 				"description": "new variable"
 			}
@@ -134,57 +130,6 @@ func TestProjectVariablesService_CreateVariable(t *testing.T) {
 		VariableType:     "env_var",
 		Protected:        false,
 		Masked:           false,
-		Hidden:           false,
-		EnvironmentScope: "*",
-		Description:      "new variable",
-	}
-
-	pv, resp, err := client.ProjectVariables.CreateVariable(1, &CreateProjectVariableOptions{Description: Ptr("new variable")}, nil)
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, want, pv)
-
-	pv, resp, err = client.ProjectVariables.CreateVariable(1.01, nil, nil)
-	require.EqualError(t, err, "invalid ID type 1.01, the ID must be an int or a string")
-	require.Nil(t, resp)
-	require.Nil(t, pv)
-
-	pv, resp, err = client.ProjectVariables.CreateVariable(1, nil, nil, errorOption)
-	require.EqualError(t, err, "RequestOptionFunc returns an error")
-	require.Nil(t, resp)
-	require.Nil(t, pv)
-
-	pv, resp, err = client.ProjectVariables.CreateVariable(2, nil, nil)
-	require.Error(t, err)
-	require.Nil(t, pv)
-	require.Equal(t, http.StatusNotFound, resp.StatusCode)
-}
-
-func TestProjectVariablesService_CreateVariable_MaskedAndHidden(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/variables", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		testBody(t, r, `{"description":"new variable"}`)
-		fmt.Fprintf(w, `
-			{
-				"key": "NEW_VARIABLE",
-				"protected": false,
-				"variable_type": "env_var",
-				"masked": true,
-				"hidden": true,
-				"environment_scope": "*",
-				"description": "new variable"
-			}
-		`)
-	})
-
-	want := &ProjectVariable{
-		Key:              "NEW_VARIABLE",
-		VariableType:     "env_var",
-		Protected:        false,
-		Masked:           true,
-		Hidden:           true,
 		EnvironmentScope: "*",
 		Description:      "new variable",
 	}
@@ -235,61 +180,6 @@ func TestProjectVariablesService_UpdateVariable(t *testing.T) {
 		VariableType:     "env_var",
 		Protected:        false,
 		Masked:           false,
-		Hidden:           false,
-		EnvironmentScope: "*",
-		Description:      "updated description",
-	}
-
-	pv, resp, err := client.ProjectVariables.UpdateVariable(1, "NEW_VARIABLE", &UpdateProjectVariableOptions{
-		Filter:      &VariableFilter{EnvironmentScope: "prod"},
-		Description: Ptr("updated description"),
-	}, nil)
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, want, pv)
-
-	pv, resp, err = client.ProjectVariables.UpdateVariable(1.01, "NEW_VARIABLE", nil, nil)
-	require.EqualError(t, err, "invalid ID type 1.01, the ID must be an int or a string")
-	require.Nil(t, resp)
-	require.Nil(t, pv)
-
-	pv, resp, err = client.ProjectVariables.UpdateVariable(1, "NEW_VARIABLE", nil, nil, errorOption)
-	require.EqualError(t, err, "RequestOptionFunc returns an error")
-	require.Nil(t, resp)
-	require.Nil(t, pv)
-
-	pv, resp, err = client.ProjectVariables.UpdateVariable(2, "NEW_VARIABLE", nil, nil)
-	require.Error(t, err)
-	require.Nil(t, pv)
-	require.Equal(t, http.StatusNotFound, resp.StatusCode)
-}
-
-func TestProjectVariablesService_UpdateVariable_MaskedAndHidden(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/variables/NEW_VARIABLE", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPut)
-		testBody(t, r, `{"description":"updated description","filter":{"environment_scope":"prod"}}`)
-		fmt.Fprintf(w, `
-			{
-				"key": "NEW_VARIABLE",
-				"value": null,
-				"protected": false,
-				"variable_type": "env_var",
-				"masked": true,
-				"hidden": true,
-				"environment_scope": "*",
-				"description": "updated description"
-			}
-		`)
-	})
-
-	want := &ProjectVariable{
-		Key:              "NEW_VARIABLE",
-		VariableType:     "env_var",
-		Protected:        false,
-		Masked:           true,
-		Hidden:           true,
 		EnvironmentScope: "*",
 		Description:      "updated description",
 	}
diff --git a/projects_test.go b/projects_test.go
index 7335b16..e17a7da 100644
--- a/projects_test.go
+++ b/projects_test.go
@@ -280,15 +280,13 @@ func TestListOwnedProjects(t *testing.T) {
 func TestEditProject(t *testing.T) {
 	mux, client := setup(t)
 
-	var developerRole AccessControlValue = "developer"
-	developerPipelineVariablesRole := CIPipelineVariablesDeveloperRole
+	var developerAccessLevel AccessControlValue = "developer"
 	opt := &EditProjectOptions{
-		CIRestrictPipelineCancellationRole:     Ptr(developerRole),
-		CIPipelineVariablesMinimumOverrideRole: Ptr(developerPipelineVariablesRole),
+		CIRestrictPipelineCancellationRole: Ptr(developerAccessLevel),
 	}
 
-	// Store whether we've seen all the attributes we set
-	attributesFound := false
+	// Store whether we've set the restrict value in our edit properly
+	restrictValueSet := false
 
 	mux.HandleFunc("/api/v4/projects/1", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
@@ -300,8 +298,7 @@ func TestEditProject(t *testing.T) {
 		}
 
 		// Set the value to check if our value is included
-		attributesFound = strings.Contains(string(body), "ci_restrict_pipeline_cancellation_role") &&
-			strings.Contains(string(body), "ci_pipeline_variables_minimum_override_role")
+		restrictValueSet = strings.Contains(string(body), "ci_restrict_pipeline_cancellation_role")
 
 		// Print the start of the mock example from https://docs.gitlab.com/ee/api/projects.html#edit-project
 		// including the attribute we edited
@@ -316,17 +313,15 @@ func TestEditProject(t *testing.T) {
 			"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
 			"web_url": "http://example.com/diaspora/diaspora-project-site",
 			"readme_url": "http://example.com/diaspora/diaspora-project-site/blob/main/README.md",
-			"ci_restrict_pipeline_cancellation_role": "developer",
-			"ci_pipeline_variables_minimum_override_role": "developer"
+			"ci_restrict_pipeline_cancellation_role": "developer"
 		}`)
 	})
 
 	project, resp, err := client.Projects.EditProject(1, opt)
 	assert.NoError(t, err)
 	assert.Equal(t, http.StatusOK, resp.StatusCode)
-	assert.Equal(t, true, attributesFound)
-	assert.Equal(t, developerRole, project.CIRestrictPipelineCancellationRole)
-	assert.Equal(t, developerPipelineVariablesRole, project.CIPipelineVariablesMinimumOverrideRole)
+	assert.Equal(t, true, restrictValueSet)
+	assert.Equal(t, developerAccessLevel, project.CIRestrictPipelineCancellationRole)
 }
 
 func TestListStarredProjects(t *testing.T) {
@@ -379,7 +374,6 @@ func TestGetProjectByID(t *testing.T) {
 			"ci_forward_deployment_enabled": true,
 			"ci_forward_deployment_rollback_allowed": true,
 			"ci_restrict_pipeline_cancellation_role": "developer",
-			"ci_pipeline_variables_minimum_override_role": "no_one_allowed",
 			"packages_enabled": false,
 			"build_coverage_regex": "Total.*([0-9]{1,3})%"
 		  }`)
@@ -393,12 +387,11 @@ func TestGetProjectByID(t *testing.T) {
 			Cadence:   "7d",
 			NextRunAt: &wantTimestamp,
 		},
-		PackagesEnabled:                        false,
-		BuildCoverageRegex:                     `Total.*([0-9]{1,3})%`,
-		CIForwardDeploymentEnabled:             true,
-		CIForwardDeploymentRollbackAllowed:     true,
-		CIRestrictPipelineCancellationRole:     "developer",
-		CIPipelineVariablesMinimumOverrideRole: "no_one_allowed",
+		PackagesEnabled:                    false,
+		BuildCoverageRegex:                 `Total.*([0-9]{1,3})%`,
+		CIForwardDeploymentEnabled:         true,
+		CIForwardDeploymentRollbackAllowed: true,
+		CIRestrictPipelineCancellationRole: "developer",
 	}
 
 	project, _, err := client.Projects.GetProject(1, nil)
@@ -1505,8 +1498,6 @@ func TestListProjectHooks(t *testing.T) {
 	{
 		"id": 1,
 		"url": "http://example.com/hook",
-		"name": "This is the name of an example hook",
-		"description": "This is the description of an example hook",
 		"confidential_note_events": true,
 		"project_id": 1,
 		"push_events": true,
@@ -1543,8 +1534,6 @@ func TestListProjectHooks(t *testing.T) {
 	want := []*ProjectHook{{
 		ID:                        1,
 		URL:                       "http://example.com/hook",
-		Name:                      "This is the name of an example hook",
-		Description:               "This is the description of an example hook",
 		ConfidentialNoteEvents:    true,
 		ProjectID:                 1,
 		PushEvents:                true,
diff --git a/repositories_test.go b/repositories_test.go
index 9130def..4610bf3 100644
--- a/repositories_test.go
+++ b/repositories_test.go
@@ -281,7 +281,6 @@ func TestRepositoriesService_Compare(t *testing.T) {
 		}},
 		CompareTimeout: false,
 		CompareSameRef: false,
-		WebURL:         "https://gitlab.example.com/thedude/gitlab-foss/-/compare/ae73cb07c9eeaf35924a10f713b364d32b2dd34f...0b4bc9a49b562e85de7cc9e834518ea6828729b9",
 	}
 
 	c, resp, err := client.Repositories.Compare("12d65c8dd2b2676fa3ac47d955accc085a37a9c1", opt, nil)
diff --git a/services_test.go b/services_test.go
index 543c28d..53596ea 100644
--- a/services_test.go
+++ b/services_test.go
@@ -85,7 +85,6 @@ func TestSetCustomIssueTrackerService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/custom-issue-tracker", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetCustomIssueTrackerServiceOptions{
@@ -94,7 +93,7 @@ func TestSetCustomIssueTrackerService(t *testing.T) {
 		ProjectURL:  Ptr("3"),
 	}
 
-	_, _, err := client.Services.SetCustomIssueTrackerService(1, opt)
+	_, err := client.Services.SetCustomIssueTrackerService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetCustomIssueTrackerService returns an error: %v", err)
 	}
@@ -157,7 +156,6 @@ func TestSetDataDogService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/datadog", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetDataDogServiceOptions{
@@ -170,7 +168,7 @@ func TestSetDataDogService(t *testing.T) {
 		ArchiveTraceEvents: Bool(false),
 	}
 
-	_, _, err := client.Services.SetDataDogService(1, opt)
+	_, err := client.Services.SetDataDogService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetDataDogService returns an error: %v", err)
 	}
@@ -212,14 +210,13 @@ func TestSetDiscordService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/discord", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetDiscordServiceOptions{
 		WebHook: Ptr("webhook_uri"),
 	}
 
-	_, _, err := client.Services.SetDiscordService(1, opt)
+	_, err := client.Services.SetDiscordService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetDiscordService returns an error: %v", err)
 	}
@@ -261,12 +258,11 @@ func TestSetDroneCIService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/drone-ci", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetDroneCIServiceOptions{Ptr("token"), Ptr("drone-url"), Ptr(true), nil, nil, nil}
 
-	_, _, err := client.Services.SetDroneCIService(1, opt)
+	_, err := client.Services.SetDroneCIService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetDroneCIService returns an error: %v", err)
 	}
@@ -308,12 +304,11 @@ func TestSetEmailsOnPushService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/integrations/emails-on-push", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetEmailsOnPushServiceOptions{Ptr("t"), Ptr(true), Ptr(true), Ptr(true), Ptr(true), Ptr("t")}
 
-	_, _, err := client.Services.SetEmailsOnPushService(1, opt)
+	_, err := client.Services.SetEmailsOnPushService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetEmailsOnPushService returns an error: %v", err)
 	}
@@ -355,7 +350,6 @@ func TestSetHarborService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/integrations/harbor", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetHarborServiceOptions{
@@ -366,7 +360,7 @@ func TestSetHarborService(t *testing.T) {
 		UseInheritedSettings: Ptr(false),
 	}
 
-	_, _, err := client.Services.SetHarborService(1, opt)
+	_, err := client.Services.SetHarborService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetHarborService returns an error: %v", err)
 	}
@@ -408,12 +402,11 @@ func TestSetSlackApplication(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/integrations/gitlab-slack-application", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetSlackApplicationOptions{Channel: Ptr("#channel1"), NoteEvents: Ptr(true), AlertEvents: Ptr(true)}
 
-	_, _, err := client.Services.SetSlackApplication(1, opt)
+	_, err := client.Services.SetSlackApplication(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetSlackApplication returns an error: %v", err)
 	}
@@ -508,7 +501,6 @@ func TestSetJiraService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/integrations/jira", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetJiraServiceOptions{
@@ -529,7 +521,7 @@ func TestSetJiraService(t *testing.T) {
 		UseInheritedSettings:         Ptr(true),
 	}
 
-	_, _, err := client.Services.SetJiraService(1, opt)
+	_, err := client.Services.SetJiraService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetJiraService returns an error: %v", err)
 	}
@@ -540,7 +532,6 @@ func TestSetJiraServiceProjecKeys(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/integrations/jira", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetJiraServiceOptions{
@@ -561,7 +552,7 @@ func TestSetJiraServiceProjecKeys(t *testing.T) {
 		UseInheritedSettings:         Ptr(true),
 	}
 
-	_, _, err := client.Services.SetJiraService(1, opt)
+	_, err := client.Services.SetJiraService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetJiraService returns an error: %v", err)
 	}
@@ -572,7 +563,6 @@ func TestSetJiraServiceAuthTypeBasicAuth(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/integrations/jira", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetJiraServiceOptions{
@@ -582,7 +572,7 @@ func TestSetJiraServiceAuthTypeBasicAuth(t *testing.T) {
 		JiraAuthType: Ptr(0),
 	}
 
-	_, _, err := client.Services.SetJiraService(1, opt)
+	_, err := client.Services.SetJiraService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetJiraService returns an error: %v", err)
 	}
@@ -593,7 +583,6 @@ func TestSetJiraServiceAuthTypeTokenAuth(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/integrations/jira", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetJiraServiceOptions{
@@ -602,7 +591,7 @@ func TestSetJiraServiceAuthTypeTokenAuth(t *testing.T) {
 		JiraAuthType: Ptr(1),
 	}
 
-	_, _, err := client.Services.SetJiraService(1, opt)
+	_, err := client.Services.SetJiraService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetJiraService returns an error: %v", err)
 	}
@@ -644,7 +633,6 @@ func TestSetMattermostService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/mattermost", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetMattermostServiceOptions{
@@ -653,7 +641,7 @@ func TestSetMattermostService(t *testing.T) {
 		Channel:  Ptr("#development"),
 	}
 
-	_, _, err := client.Services.SetMattermostService(1, opt)
+	_, err := client.Services.SetMattermostService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetMasttermostService returns an error: %v", err)
 	}
@@ -695,7 +683,6 @@ func TestSetMattermostSlashCommandsService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/mattermost-slash-commands", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetMattermostSlashCommandsServiceOptions{
@@ -703,7 +690,7 @@ func TestSetMattermostSlashCommandsService(t *testing.T) {
 		Username: Ptr("username"),
 	}
 
-	_, _, err := client.Services.SetMattermostSlashCommandsService(1, opt)
+	_, err := client.Services.SetMattermostSlashCommandsService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetMattermostSlashCommandsService returns an error: %v", err)
 	}
@@ -745,7 +732,6 @@ func TestSetPipelinesEmailService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/pipelines-email", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetPipelinesEmailServiceOptions{
@@ -757,7 +743,7 @@ func TestSetPipelinesEmailService(t *testing.T) {
 		PipelineEvents:            nil,
 	}
 
-	_, _, err := client.Services.SetPipelinesEmailService(1, opt)
+	_, err := client.Services.SetPipelinesEmailService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetPipelinesEmailService returns an error: %v", err)
 	}
@@ -799,12 +785,11 @@ func TestSetPrometheusService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/prometheus", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetPrometheusServiceOptions{Ptr("t"), Ptr("u"), Ptr("a")}
 
-	_, _, err := client.Services.SetPrometheusService(1, opt)
+	_, err := client.Services.SetPrometheusService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetDroneCIService returns an error: %v", err)
 	}
@@ -846,12 +831,11 @@ func TestSetRedmineService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/integrations/redmine", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetRedmineServiceOptions{Ptr("t"), Ptr("u"), Ptr("a"), Ptr(false)}
 
-	_, _, err := client.Services.SetRedmineService(1, opt)
+	_, err := client.Services.SetRedmineService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetRedmineService returns an error: %v", err)
 	}
@@ -893,7 +877,6 @@ func TestSetSlackService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/slack", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetSlackServiceOptions{
@@ -902,7 +885,7 @@ func TestSetSlackService(t *testing.T) {
 		Channel:  Ptr("#development"),
 	}
 
-	_, _, err := client.Services.SetSlackService(1, opt)
+	_, err := client.Services.SetSlackService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetSlackService returns an error: %v", err)
 	}
@@ -944,14 +927,13 @@ func TestSetSlackSlashCommandsService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/slack-slash-commands", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetSlackSlashCommandsServiceOptions{
 		Token: Ptr("token"),
 	}
 
-	_, _, err := client.Services.SetSlackSlashCommandsService(1, opt)
+	_, err := client.Services.SetSlackSlashCommandsService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetSlackSlashCommandsService returns an error: %v", err)
 	}
@@ -1054,7 +1036,6 @@ func TestSetTelegramService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/telegram", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetTelegramServiceOptions{
@@ -1073,7 +1054,7 @@ func TestSetTelegramService(t *testing.T) {
 		WikiPageEvents:            Ptr(true),
 	}
 
-	_, _, err := client.Services.SetTelegramService(1, opt)
+	_, err := client.Services.SetTelegramService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetTelegramService returns an error: %v", err)
 	}
@@ -1115,7 +1096,6 @@ func TestSetYouTrackService(t *testing.T) {
 
 	mux.HandleFunc("/api/v4/projects/1/services/youtrack", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPut)
-		fmt.Fprint(w, `{"id":1, "properties": {}}`)
 	})
 
 	opt := &SetYouTrackServiceOptions{
@@ -1125,7 +1105,7 @@ func TestSetYouTrackService(t *testing.T) {
 		PushEvents:  Ptr(true),
 	}
 
-	_, _, err := client.Services.SetYouTrackService(1, opt)
+	_, err := client.Services.SetYouTrackService(1, opt)
 	if err != nil {
 		t.Fatalf("Services.SetYouTrackService returns an error: %v", err)
 	}
diff --git a/testdata/create_dependency_list_export.json b/testdata/create_dependency_list_export.json
deleted file mode 100644
index 7b55e47..0000000
--- a/testdata/create_dependency_list_export.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "id": 5678,
-  "has_finished": false,
-  "self": "http://gitlab.example.com/api/v4/dependency_list_exports/5678",
-  "download": "http://gitlab.example.com/api/v4/dependency_list_exports/5678/download"
-}
diff --git a/testdata/create_service_account_user.json b/testdata/create_service_account_user.json
index 6799e4a..e5354e5 100644
--- a/testdata/create_service_account_user.json
+++ b/testdata/create_service_account_user.json
@@ -1,9 +1,9 @@
 {
   "id": 999,
-  "username": "serviceaccount",
-  "name": "Test Service Account",
+  "username": "service_account_94e556c44d40d5a710ca59e3a0f40a3d",
+  "name": "Service account user",
   "state": "active",
   "locked": false,
   "avatar_url": "http://localhost:3000/uploads/user/avatar/999/cd8.jpeg",
-  "web_url": "http://localhost:3000/serviceaccount"
+  "web_url": "http://localhost:3000/service_account_94e556c44d40d5a710ca59e3a0f40a3d"
 }
diff --git a/testdata/download_dependency_list_export.json b/testdata/download_dependency_list_export.json
deleted file mode 100644
index 49eccc3..0000000
--- a/testdata/download_dependency_list_export.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "bomFormat": "CycloneDX",
-  "specVersion": "1.4",
-  "serialNumber": "urn:uuid:3fa3b1c2-7e21-4dae-917b-b320f6d25ae1",
-  "version": 1,
-  "metadata": {
-    "timestamp": "2024-11-14T23:39:16.117Z",
-    "authors": [{ "name": "GitLab", "email": "support@gitlab.com" }],
-    "properties": [
-      {
-        "name": "gitlab:dependency_scanning:input_file:path",
-        "value": "my_package_manager.lock"
-      },
-      {
-        "name": "gitlab:dependency_scanning:package_manager:name",
-        "value": "my_package_manager"
-      },
-      { "name": "gitlab:meta:schema_version", "value": "1" }
-    ],
-    "tools": [{ "vendor": "GitLab", "name": "Gemnasium", "version": "5.8.0" }]
-  },
-  "components": [
-    {
-      "name": "dummy",
-      "version": "1.0.0",
-      "purl": "pkg:testing/dummy@1.0.0",
-      "type": "library",
-      "licenses": [{ "license": { "name": "unknown" } }]
-    }
-  ]
-}
diff --git a/testdata/get_dependency_list_export.json b/testdata/get_dependency_list_export.json
deleted file mode 100644
index 58a3b2f..0000000
--- a/testdata/get_dependency_list_export.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "id": 5678,
-  "has_finished": true,
-  "self": "http://gitlab.example.com/api/v4/dependency_list_exports/5678",
-  "download": "http://gitlab.example.com/api/v4/dependency_list_exports/5678/download"
-}
diff --git a/users_test.go b/users_test.go
index 68b9ad2..a5e15ba 100644
--- a/users_test.go
+++ b/users_test.go
@@ -727,29 +727,20 @@ func TestCreateServiceAccountUser(t *testing.T) {
 
 	mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodPost)
-		if !strings.Contains(r.Header.Get("Content-Type"), "application/json") {
-			t.Fatalf("Users.CreateServiceAccountUser request content-type %+v want application/json;", r.Header.Get("Content-Type"))
-		}
-		if r.ContentLength == -1 {
-			t.Fatalf("Users.CreateServiceAccountUser request content-length is -1")
-		}
 		mustWriteHTTPResponse(t, w, "testdata/create_service_account_user.json")
 	})
 
-	user, _, err := client.Users.CreateServiceAccountUser(&CreateServiceAccountUserOptions{
-		Name:     Ptr("Test Service Account"),
-		Username: Ptr("serviceaccount"),
-	})
+	user, _, err := client.Users.CreateServiceAccountUser()
 	require.NoError(t, err)
 
 	want := &User{
 		ID:        999,
-		Username:  "serviceaccount",
-		Name:      "Test Service Account",
+		Username:  "service_account_94e556c44d40d5a710ca59e3a0f40a3d",
+		Name:      "Service account user",
 		State:     "active",
 		Locked:    false,
 		AvatarURL: "http://localhost:3000/uploads/user/avatar/999/cd8.jpeg",
-		WebURL:    "http://localhost:3000/serviceaccount",
+		WebURL:    "http://localhost:3000/service_account_94e556c44d40d5a710ca59e3a0f40a3d",
 	}
 	require.Equal(t, want, user)
 }