Repository: xanzy/go-gitlab
Pull request #1453 (2022-04-21 08:27:01)

Support `execute_filemode` field in Repository Files API
I've implemented the `execute_filemode` field in GitLab 14.10 - it's already only on .com.

We'd like to use this in the tf provider. 

@svanharmelen can you review and release this by any chance?


Patch:
diff --git a/README.md b/README.md
index cd409e8..19f6ad2 100644
--- a/README.md
+++ b/README.md
@@ -27,13 +27,13 @@ to add new and/or missing endpoints. Currently, the following services are suppo
 - [x] Custom Attributes
 - [x] Deploy Keys
 - [x] Deployments
-- [x] Discussions (threaded comments)
+- [ ] Discussions (threaded comments)
 - [x] Environments
-- [x] Epic Issues
-- [x] Epics
+- [ ] Epic Issues
+- [ ] Epics
 - [x] Events
 - [x] Feature Flags
-- [x] Geo Nodes
+- [ ] Geo Nodes
 - [x] Generic Packages
 - [x] GitLab CI Config Templates
 - [x] Gitignores Templates
diff --git a/event_systemhook_types.go b/event_systemhook_types.go
index f3874a3..fd99bc5 100644
--- a/event_systemhook_types.go
+++ b/event_systemhook_types.go
@@ -16,8 +16,6 @@
 
 package gitlab
 
-import "time"
-
 // systemHookEvent is used to pre-process events to determine the
 // system hook event type.
 type systemHookEvent struct {
@@ -132,41 +130,6 @@ type UserTeamSystemEvent struct {
 // https://docs.gitlab.com/ee/system_hooks/system_hooks.html
 type PushSystemEvent struct {
 	BaseSystemEvent
-	Before       string `json:"before"`
-	After        string `json:"after"`
-	Ref          string `json:"ref"`
-	CheckoutSHA  string `json:"checkout_sha"`
-	UserID       int    `json:"user_id"`
-	UserName     string `json:"user_name"`
-	UserUsername string `json:"user_username"`
-	UserEmail    string `json:"user_email"`
-	UserAvatar   string `json:"user_avatar"`
-	ProjectID    int    `json:"project_id"`
-	Project      struct {
-		Name              string `json:"name"`
-		Description       string `json:"description"`
-		WebURL            string `json:"web_url"`
-		AvatarURL         string `json:"avatar_url"`
-		GitHTTPURL        string `json:"git_http_url"`
-		GitSSHURL         string `json:"git_ssh_url"`
-		Namespace         string `json:"namespace"`
-		VisibilityLevel   int    `json:"visibility_level"`
-		PathWithNamespace string `json:"path_with_namespace"`
-		DefaultBranch     string `json:"default_branch"`
-		Homepage          string `json:"homepage"`
-		URL               string `json:"url"`
-	} `json:"project"`
-	Commits []struct {
-		ID        string    `json:"id"`
-		Message   string    `json:"message"`
-		Timestamp time.Time `json:"timestamp"`
-		URL       string    `json:"url"`
-		Author    struct {
-			Name  string `json:"name"`
-			Email string `json:"email"`
-		} `json:"author"`
-	} `json:"commits"`
-	TotalCommitsCount int `json:"total_commits_count"`
 }
 
 // TagPushSystemEvent represents a tag push system event.
@@ -175,41 +138,6 @@ type PushSystemEvent struct {
 // https://docs.gitlab.com/ee/system_hooks/system_hooks.html
 type TagPushSystemEvent struct {
 	BaseSystemEvent
-	Before       string `json:"before"`
-	After        string `json:"after"`
-	Ref          string `json:"ref"`
-	CheckoutSHA  string `json:"checkout_sha"`
-	UserID       int    `json:"user_id"`
-	UserName     string `json:"user_name"`
-	UserUsername string `json:"user_username"`
-	UserEmail    string `json:"user_email"`
-	UserAvatar   string `json:"user_avatar"`
-	ProjectID    int    `json:"project_id"`
-	Project      struct {
-		Name              string `json:"name"`
-		Description       string `json:"description"`
-		WebURL            string `json:"web_url"`
-		AvatarURL         string `json:"avatar_url"`
-		GitHTTPURL        string `json:"git_http_url"`
-		GitSSHURL         string `json:"git_ssh_url"`
-		Namespace         string `json:"namespace"`
-		VisibilityLevel   int    `json:"visibility_level"`
-		PathWithNamespace string `json:"path_with_namespace"`
-		DefaultBranch     string `json:"default_branch"`
-		Homepage          string `json:"homepage"`
-		URL               string `json:"url"`
-	} `json:"project"`
-	Commits []struct {
-		ID        string    `json:"id"`
-		Message   string    `json:"message"`
-		Timestamp time.Time `json:"timestamp"`
-		URL       string    `json:"url"`
-		Author    struct {
-			Name  string `json:"name"`
-			Email string `json:"email"`
-		} `json:"author"`
-	} `json:"commits"`
-	TotalCommitsCount int `json:"total_commits_count"`
 }
 
 // RepositoryUpdateSystemEvent represents a repository updated system event.
@@ -218,31 +146,4 @@ type TagPushSystemEvent struct {
 // https://docs.gitlab.com/ee/system_hooks/system_hooks.html
 type RepositoryUpdateSystemEvent struct {
 	BaseSystemEvent
-	UserID     int    `json:"user_id"`
-	UserName   string `json:"user_name"`
-	UserEmail  string `json:"user_email"`
-	UserAvatar string `json:"user_avatar"`
-	ProjectID  int    `json:"project_id"`
-	Project    struct {
-		ID                int    `json:"id"`
-		Name              string `json:"name"`
-		Description       string `json:"description"`
-		WebURL            string `json:"web_url"`
-		AvatarURL         string `json:"avatar_url"`
-		GitHTTPURL        string `json:"git_http_url"`
-		GitSSHURL         string `json:"git_ssh_url"`
-		Namespace         string `json:"namespace"`
-		VisibilityLevel   int    `json:"visibility_level"`
-		PathWithNamespace string `json:"path_with_namespace"`
-		DefaultBranch     string `json:"default_branch"`
-		CiConfigPath      string `json:"ci_config_path"`
-		Homepage          string `json:"homepage"`
-		URL               string `json:"url"`
-	} `json:"project"`
-	Changes []struct {
-		Before string `json:"before"`
-		After  string `json:"after"`
-		Ref    string `json:"ref"`
-	} `json:"changes"`
-	Refs []string `json:"refs"`
 }
diff --git a/event_webhook_types.go b/event_webhook_types.go
index aff4c4d..237fcb8 100644
--- a/event_webhook_types.go
+++ b/event_webhook_types.go
@@ -870,20 +870,20 @@ type SnippetCommentEvent struct {
 		URL          string `json:"url"`
 	} `json:"object_attributes"`
 	Snippet *struct {
-		ID                 int    `json:"id"`
-		Title              string `json:"title"`
-		Content            string `json:"content"`
-		AuthorID           int    `json:"author_id"`
-		ProjectID          int    `json:"project_id"`
-		CreatedAt          string `json:"created_at"`
-		UpdatedAt          string `json:"updated_at"`
-		Filename           string `json:"file_name"`
-		ExpiresAt          string `json:"expires_at"`
-		Type               string `json:"type"`
-		VisibilityLevel    int    `json:"visibility_level"`
-		Description        string `json:"description"`
-		Secret             bool   `json:"secret"`
-		RepositoryReadOnly bool   `json:"repository_read_only"`
+		ID                 int        `json:"id"`
+		Title              string     `json:"title"`
+		Content            string     `json:"content"`
+		AuthorID           int        `json:"author_id"`
+		ProjectID          int        `json:"project_id"`
+		CreatedAt          string     `json:"created_at"`
+		UpdatedAt          string     `json:"updated_at"`
+		Filename           string     `json:"file_name"`
+		ExpiresAt          string     `json:"expires_at"`
+		Type               string     `json:"type"`
+		VisibilityLevel    int        `json:"visibility_level"`
+		Description        string     `json:"description"`
+		Secret             bool       `json:"secret"`
+		RepositoryReadOnly bool       `json:"repository_read_only"`
 	} `json:"snippet"`
 }
 
diff --git a/examples/personal_access_tokens.go b/examples/personal_access_tokens.go
deleted file mode 100644
index 07cfa75..0000000
--- a/examples/personal_access_tokens.go
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright 2022, Ryan Glab <ryan.j.glab@gmail.com>
-//
-// 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 main
-
-import (
-	"encoding/json"
-	"fmt"
-	"log"
-
-	"github.com/xanzy/go-gitlab"
-)
-
-func patRevokeExample() {
-	git, err := gitlab.NewClient("glpat-123xyz")
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	resp, err := git.PersonalAccessTokens.RevokePersonalAccessToken(99999999)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	fmt.Printf("Response Code: %s", resp.Status)
-}
-
-func patListExampleWithUserFilter() {
-	git, err := gitlab.NewClient("glpat-123xyz")
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	opt := &gitlab.ListPersonalAccessTokensOptions{
-		ListOptions: gitlab.ListOptions{Page: 1, PerPage: 10},
-		UserID:      gitlab.Int(12345),
-	}
-
-	personalAccessTokens, _, err := git.PersonalAccessTokens.ListPersonalAccessTokens(opt)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	data, err := json.Marshal(personalAccessTokens)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	fmt.Printf("%s\n", data)
-}
diff --git a/gitlab.go b/gitlab.go
index d9d4f26..697e21d 100644
--- a/gitlab.go
+++ b/gitlab.go
@@ -161,7 +161,6 @@ type Client struct {
 	Packages              *PackagesService
 	Pages                 *PagesService
 	PagesDomains          *PagesDomainsService
-	PersonalAccessTokens  *PersonalAccessTokensService
 	PipelineSchedules     *PipelineSchedulesService
 	PipelineTriggers      *PipelineTriggersService
 	Pipelines             *PipelinesService
@@ -359,7 +358,6 @@ func newClient(options ...ClientOptionFunc) (*Client, error) {
 	c.Packages = &PackagesService{client: c}
 	c.Pages = &PagesService{client: c}
 	c.PagesDomains = &PagesDomainsService{client: c}
-	c.PersonalAccessTokens = &PersonalAccessTokensService{client: c}
 	c.PipelineSchedules = &PipelineSchedulesService{client: c}
 	c.PipelineTriggers = &PipelineTriggersService{client: c}
 	c.Pipelines = &PipelinesService{client: c}
diff --git a/group_access_tokens.go b/group_access_tokens.go
index 94c53fd..41532bf 100644
--- a/group_access_tokens.go
+++ b/group_access_tokens.go
@@ -30,7 +30,7 @@ type GroupAccessTokensService struct {
 	client *Client
 }
 
-// GroupAccessToken represents a GitLab group access token.
+// GroupAccessToken represents a GitLab Group Access Token.
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/group_access_tokens.html
 type GroupAccessToken struct {
@@ -40,7 +40,6 @@ type GroupAccessToken struct {
 	Scopes      []string         `json:"scopes"`
 	CreatedAt   *time.Time       `json:"created_at"`
 	ExpiresAt   *ISOTime         `json:"expires_at"`
-	LastUsedAt  *time.Time       `json:"last_used_at"`
 	Active      bool             `json:"active"`
 	Revoked     bool             `json:"revoked"`
 	Token       string           `json:"token"`
@@ -58,7 +57,8 @@ func (v GroupAccessToken) String() string {
 // https://docs.gitlab.com/ee/api/group_access_tokens.html#list-group-access-tokens
 type ListGroupAccessTokensOptions ListOptions
 
-// ListGroupAccessTokens gets a list of all group access tokens in a group.
+// ListGroupAccessTokens gets a list of all Group Access Tokens in a
+// group.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_access_tokens.html#list-group-access-tokens
@@ -83,31 +83,6 @@ func (s *GroupAccessTokensService) ListGroupAccessTokens(gid interface{}, opt *L
 	return gats, resp, err
 }
 
-// GetGroupAccessToken gets a single group access tokens in a group.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/group_access_tokens.html#get-a-group-access-token
-func (s *GroupAccessTokensService) GetGroupAccessToken(gid interface{}, id int, options ...RequestOptionFunc) (*GroupAccessToken, *Response, error) {
-	groups, err := parseID(gid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("groups/%s/access_tokens/%d", PathEscape(groups), id)
-
-	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	gat := new(GroupAccessToken)
-	resp, err := s.client.Do(req, &gat)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return gat, resp, err
-}
-
 // CreateGroupAccessTokenOptions represents the available CreateVariable()
 // options.
 //
@@ -120,7 +95,7 @@ type CreateGroupAccessTokenOptions struct {
 	ExpiresAt   *ISOTime          `url:"expires_at,omitempty" json:"expires_at,omitempty"`
 }
 
-// CreateGroupAccessToken creates a new group access token.
+// CreateGroupAccessToken creates a new Group Access Token.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_access_tokens.html#create-a-group-access-token
@@ -145,11 +120,11 @@ func (s *GroupAccessTokensService) CreateGroupAccessToken(gid interface{}, opt *
 	return pat, resp, err
 }
 
-// RevokeGroupAccessToken revokes a group access token.
+// DeleteGroupAccessToken deletes a Group Access Token.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_access_tokens.html#revoke-a-group-access-token
-func (s *GroupAccessTokensService) RevokeGroupAccessToken(gid interface{}, id int, options ...RequestOptionFunc) (*Response, error) {
+func (s *GroupAccessTokensService) DeleteGroupAccessToken(gid interface{}, id int, options ...RequestOptionFunc) (*Response, error) {
 	groups, err := parseID(gid)
 	if err != nil {
 		return nil, err
diff --git a/group_hooks.go b/group_hooks.go
index acb51d9..55c44f1 100644
--- a/group_hooks.go
+++ b/group_hooks.go
@@ -30,7 +30,6 @@ type GroupHook struct {
 	URL                      string     `json:"url"`
 	GroupID                  int        `json:"group_id"`
 	PushEvents               bool       `json:"push_events"`
-	PushEventsBranchFilter   string     `json:"push_events_branch_filter"`
 	IssuesEvents             bool       `json:"issues_events"`
 	ConfidentialIssuesEvents bool       `json:"confidential_issues_events"`
 	ConfidentialNoteEvents   bool       `json:"confidential_note_events"`
@@ -42,7 +41,6 @@ type GroupHook struct {
 	WikiPageEvents           bool       `json:"wiki_page_events"`
 	DeploymentEvents         bool       `json:"deployment_events"`
 	ReleasesEvents           bool       `json:"releases_events"`
-	SubGroupEvents           bool       `json:"subgroup_events"`
 	EnableSSLVerification    bool       `json:"enable_ssl_verification"`
 	CreatedAt                *time.Time `json:"created_at"`
 }
@@ -101,7 +99,6 @@ func (s *GroupsService) GetGroupHook(pid interface{}, hook int, options ...Reque
 type AddGroupHookOptions struct {
 	URL                      *string `url:"url,omitempty" json:"url,omitempty"`
 	PushEvents               *bool   `url:"push_events,omitempty"  json:"push_events,omitempty"`
-	PushEventsBranchFilter   *string `url:"push_events_branch_filter,omitempty"  json:"push_events_branch_filter,omitempty"`
 	IssuesEvents             *bool   `url:"issues_events,omitempty"  json:"issues_events,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"`
@@ -113,7 +110,6 @@ type AddGroupHookOptions struct {
 	WikiPageEvents           *bool   `url:"wiki_page_events,omitempty"  json:"wiki_page_events,omitempty"`
 	DeploymentEvents         *bool   `url:"deployment_events,omitempty" json:"deployment_events,omitempty"`
 	ReleasesEvents           *bool   `url:"releases_events,omitempty" json:"releases_events,omitempty"`
-	SubGroupEvents           *bool   `url:"subgroup_events,omitempty" json:"subgroup_events,omitempty"`
 	EnableSSLVerification    *bool   `url:"enable_ssl_verification,omitempty"  json:"enable_ssl_verification,omitempty"`
 	Token                    *string `url:"token,omitempty" json:"token,omitempty"`
 }
@@ -149,7 +145,6 @@ func (s *GroupsService) AddGroupHook(gid interface{}, opt *AddGroupHookOptions,
 type EditGroupHookOptions struct {
 	URL                      *string `url:"url,omitempty" json:"url,omitempty"`
 	PushEvents               *bool   `url:"push_events,omitempty" json:"push_events,omitempty"`
-	PushEventsBranchFilter   *string `url:"push_events_branch_filter,omitempty"  json:"push_events_branch_filter,omitempty"`
 	IssuesEvents             *bool   `url:"issues_events,omitempty" json:"issues_events,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"`
@@ -161,7 +156,6 @@ type EditGroupHookOptions struct {
 	WikiPageEvents           *bool   `url:"wiki_page_events,omitempty" json:"wiki_page_events,omitempty"`
 	DeploymentEvents         *bool   `url:"deployment_events,omitempty" json:"deployment_events,omitempty"`
 	ReleasesEvents           *bool   `url:"releases_events,omitempty" json:"releases_events,omitempty"`
-	SubGroupEvents           *bool   `url:"subgroup_events,omitempty" json:"subgroup_events,omitempty"`
 	EnableSSLVerification    *bool   `url:"enable_ssl_verification,omitempty" json:"enable_ssl_verification,omitempty"`
 	Token                    *string `url:"token,omitempty" json:"token,omitempty"`
 }
diff --git a/groups.go b/groups.go
index 11391c3..28174cb 100644
--- a/groups.go
+++ b/groups.go
@@ -62,7 +62,6 @@ type Group struct {
 	MentionsDisabled        bool                       `json:"mentions_disabled"`
 	RunnersToken            string                     `json:"runners_token"`
 	SharedProjects          []*Project                 `json:"shared_projects"`
-	SharedRunnersEnabled    bool                       `json:"shared_runners_enabled"`
 	SharedWithGroups        []struct {
 		GroupID          int      `json:"group_id"`
 		GroupName        string   `json:"group_name"`
@@ -126,17 +125,17 @@ func (s *GroupsService) ListGroups(opt *ListGroupsOptions, options ...RequestOpt
 	return gs, resp, err
 }
 
-// ListSubGroupsOptions represents the available ListSubGroups() options.
+// ListSubgroupsOptions represents the available ListSubgroups() options.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/groups.html#list-a-groups-s-subgroups
-type ListSubGroupsOptions ListGroupsOptions
+type ListSubgroupsOptions ListGroupsOptions
 
-// ListSubGroups gets a list of subgroups for a given group.
+// ListSubgroups gets a list of subgroups for a given group.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/groups.html#list-a-groups-s-subgroups
-func (s *GroupsService) ListSubGroups(gid interface{}, opt *ListSubGroupsOptions, options ...RequestOptionFunc) ([]*Group, *Response, error) {
+func (s *GroupsService) ListSubgroups(gid interface{}, opt *ListSubgroupsOptions, options ...RequestOptionFunc) ([]*Group, *Response, error) {
 	group, err := parseID(gid)
 	if err != nil {
 		return nil, nil, err
@@ -196,7 +195,7 @@ func (s *GroupsService) ListDescendantGroups(gid interface{}, opt *ListDescendan
 type ListGroupProjectsOptions struct {
 	ListOptions
 	Archived                 *bool             `url:"archived,omitempty" json:"archived,omitempty"`
-	IncludeSubGroups         *bool             `url:"include_subgroups,omitempty" json:"include_subgroups,omitempty"`
+	IncludeSubgroups         *bool             `url:"include_subgroups,omitempty" json:"include_subgroups,omitempty"`
 	MinAccessLevel           *AccessLevelValue `url:"min_access_level,omitempty" json:"min_access_level,omitempty"`
 	OrderBy                  *string           `url:"order_by,omitempty" json:"order_by,omitempty"`
 	Owned                    *bool             `url:"owned,omitempty" json:"owned,omitempty"`
diff --git a/issues.go b/issues.go
index 208c3d7..ec88fcd 100644
--- a/issues.go
+++ b/issues.go
@@ -214,7 +214,6 @@ type ListIssuesOptions struct {
 	NotMilestone       *string		`url:"not[milestone],omitempty" json:"not[milestone],omitempty"`
 	Scope              *string		`url:"scope,omitempty" json:"scope,omitempty"`
 	AuthorID           *int			`url:"author_id,omitempty" json:"author_id,omitempty"`
-	AuthorUsername     *string		`url:"author_username,omitempty" json:"author_username,omitempty"`
 	NotAuthorID        *[]int		`url:"not[author_id],omitempty" json:"not[author_id],omitempty"`
 	AssigneeID         *AssigneeIDValue	`url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
 	NotAssigneeID      *[]int		`url:"not[assignee_id],omitempty" json:"not[assignee_id],omitempty"`
@@ -325,7 +324,6 @@ type ListProjectIssuesOptions struct {
 	NotMilestone       *[]string	    `url:"not[milestone],omitempty" json:"not[milestone],omitempty"`
 	Scope              *string	    `url:"scope,omitempty" json:"scope,omitempty"`
 	AuthorID           *int		    `url:"author_id,omitempty" json:"author_id,omitempty"`
-	AuthorUsername     *string	    `url:"author_username,omitempty" json:"author_username,omitempty"`
 	NotAuthorID        *[]int	    `url:"not[author_id],omitempty" json:"not[author_id],omitempty"`
 	AssigneeID         *AssigneeIDValue `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
 	NotAssigneeID      *[]int	    `url:"not[assignee_id],omitempty" json:"not[assignee_id],omitempty"`
diff --git a/jobs.go b/jobs.go
index d50a43c..a68abcf 100644
--- a/jobs.go
+++ b/jobs.go
@@ -333,40 +333,6 @@ func (s *JobsService) DownloadSingleArtifactsFile(pid interface{}, jobID int, ar
 	return bytes.NewReader(artifactBuf.Bytes()), resp, err
 }
 
-// DownloadSingleArtifactsFile download a single artifact file for a specific
-// job of the latest successful pipeline for the given reference name from
-// inside the job’s artifacts archive. The file is extracted from the archive
-// and streamed to the client.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ce/api/job_artifacts.html#download-a-single-artifact-file-from-specific-tag-or-branch
-func (s *JobsService) DownloadSingleArtifactsFileByTagOrBranch(pid interface{}, refName string, artifactPath string, opt *DownloadArtifactsFileOptions, options ...RequestOptionFunc) (*bytes.Reader, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	u := fmt.Sprintf(
-		"projects/%s/jobs/artifacts/%s/raw/%s",
-		PathEscape(project),
-		PathEscape(refName),
-		artifactPath,
-	)
-
-	req, err := s.client.NewRequest(http.MethodGet, u, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	artifactBuf := new(bytes.Buffer)
-	resp, err := s.client.Do(req, artifactBuf)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return bytes.NewReader(artifactBuf.Bytes()), resp, err
-}
-
 // GetTraceFile gets a trace of a specific job of a project
 //
 // GitLab API docs:
diff --git a/namespaces.go b/namespaces.go
index b7c8ccb..946ee4c 100644
--- a/namespaces.go
+++ b/namespaces.go
@@ -19,6 +19,7 @@ package gitlab
 import (
 	"fmt"
 	"net/http"
+	"time"
 )
 
 // NamespacesService handles communication with the namespace related methods
@@ -33,21 +34,21 @@ type NamespacesService struct {
 //
 // GitLab API docs: https://docs.gitlab.com/ce/api/namespaces.html
 type Namespace struct {
-	ID                          int      `json:"id"`
-	Name                        string   `json:"name"`
-	Path                        string   `json:"path"`
-	Kind                        string   `json:"kind"`
-	FullPath                    string   `json:"full_path"`
-	ParentID                    int      `json:"parent_id"`
-	AvatarURL                   *string  `json:"avatar_url"`
-	WebURL                      string   `json:"web_url"`
-	MembersCountWithDescendants int      `json:"members_count_with_descendants"`
-	BillableMembersCount        int      `json:"billable_members_count"`
-	Plan                        string   `json:"plan"`
-	TrialEndsOn                 *ISOTime `json:"trial_ends_on"`
-	Trial                       bool     `json:"trial"`
-	MaxSeatsUsed                *int     `json:"max_seats_used"`
-	SeatsInUse                  *int     `json:"seats_in_use"`
+	ID                          int        `json:"id"`
+	Name                        string     `json:"name"`
+	Path                        string     `json:"path"`
+	Kind                        string     `json:"kind"`
+	FullPath                    string     `json:"full_path"`
+	ParentID                    int        `json:"parent_id"`
+	AvatarURL                   *string    `json:"avatar_url"`
+	WebURL                      string     `json:"web_url"`
+	MembersCountWithDescendants int        `json:"members_count_with_descendants"`
+	BillableMembersCount        int        `json:"billable_members_count"`
+	Plan                        string     `json:"plan"`
+	TrialEndsOn                 *time.Time `json:"trial_ends_on"`
+	Trial                       bool       `json:"trial"`
+	MaxSeatsUsed                *int       `json:"max_seats_used"`
+	SeatsInUse                  *int       `json:"seats_in_use"`
 }
 
 func (n Namespace) String() string {
diff --git a/packages.go b/packages.go
index 06a1937..37fe0e0 100644
--- a/packages.go
+++ b/packages.go
@@ -136,7 +136,7 @@ func (s *PackagesService) ListProjectPackages(pid interface{}, opt *ListProjectP
 // https://docs.gitlab.com/ee/api/packages.html#within-a-group
 type ListGroupPackagesOptions struct {
 	ListOptions
-	ExcludeSubGroups   *bool   `url:"exclude_subgroups,omitempty" json:"exclude_subgroups,omitempty"`
+	ExcludeSubgroups   *bool   `url:"exclude_subgroups,omitempty" json:"exclude_subgroups,omitempty"`
 	OrderBy            *string `url:"order_by,omitempty" json:"order_by,omitempty"`
 	Sort               *string `url:"sort,omitempty" json:"sort,omitempty"`
 	PackageType        *string `url:"package_type,omitempty" json:"package_type,omitempty"`
diff --git a/pages_domains.go b/pages_domains.go
index b6cd3c8..3e1b04f 100644
--- a/pages_domains.go
+++ b/pages_domains.go
@@ -129,7 +129,7 @@ func (s *PagesDomainsService) GetPagesDomain(pid interface{}, domain string, opt
 type CreatePagesDomainOptions struct {
 	Domain         *string `url:"domain,omitempty" json:"domain,omitempty"`
 	AutoSslEnabled *bool   `url:"auto_ssl_enabled,omitempty" json:"auto_ssl_enabled,omitempty"`
-	Certificate    *string `url:"certificate,omitempty" json:"certificate,omitempty"`
+	Certificate    *string `url:"certifiate,omitempty" json:"certifiate,omitempty"`
 	Key            *string `url:"key,omitempty" json:"key,omitempty"`
 }
 
@@ -164,7 +164,7 @@ func (s *PagesDomainsService) CreatePagesDomain(pid interface{}, opt *CreatePage
 // https://docs.gitlab.com/ce/api/pages_domains.html#update-pages-domain
 type UpdatePagesDomainOptions struct {
 	AutoSslEnabled *bool   `url:"auto_ssl_enabled,omitempty" json:"auto_ssl_enabled,omitempty"`
-	Certificate    *string `url:"certificate,omitempty" json:"certificate,omitempty"`
+	Certificate    *string `url:"certifiate,omitempty" json:"certifiate,omitempty"`
 	Key            *string `url:"key,omitempty" json:"key,omitempty"`
 }
 
diff --git a/personal_access_tokens.go b/personal_access_tokens.go
deleted file mode 100644
index aceec13..0000000
--- a/personal_access_tokens.go
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright 2022, Ryan Glab <ryan.j.glab@gmail.com>
-//
-// 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 (
-	"fmt"
-	"net/http"
-	"time"
-)
-
-// PersonalAccessTokensService handles communication with the personal access
-// tokens related methods of the GitLab API.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/personal_access_tokens.html
-type PersonalAccessTokensService struct {
-	client *Client
-}
-
-// PersonalAccessToken represents a personal access token.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/personal_access_tokens.html
-type PersonalAccessToken struct {
-	ID         int        `json:"id"`
-	Name       string     `json:"name"`
-	Revoked    bool       `json:"revoked"`
-	CreatedAt  *time.Time `json:"created_at"`
-	Scopes     []string   `json:"scopes"`
-	UserID     int        `json:"user_id"`
-	LastUsedAt *time.Time `json:"last_used_at,omitempty"`
-	Active     bool       `json:"active"`
-	ExpiresAt  *ISOTime   `json:"expires_at"`
-	Token      string     `json:"token,omitempty"`
-}
-
-func (p PersonalAccessToken) String() string {
-	return Stringify(p)
-}
-
-// ListPersonalAccessTokensOptions represents the available
-// ListPersonalAccessTokens() options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/personal_access_tokens.html#list-personal-access-tokens
-type ListPersonalAccessTokensOptions struct {
-	ListOptions
-	UserID *int `url:"user_id,omitempty" json:"user_id,omitempty"`
-}
-
-// ListPersonalAccessTokens gets a list of all personal access tokens.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/personal_access_tokens.html#list-personal-access-tokens
-func (s *PersonalAccessTokensService) ListPersonalAccessTokens(opt *ListPersonalAccessTokensOptions, options ...RequestOptionFunc) ([]*PersonalAccessToken, *Response, error) {
-	req, err := s.client.NewRequest(http.MethodGet, "personal_access_tokens", opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	var pats []*PersonalAccessToken
-	resp, err := s.client.Do(req, &pats)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return pats, resp, err
-}
-
-// RevokePersonalAccessToken revokes a personal access token.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/personal_access_tokens.html#revoke-a-personal-access-token
-func (s *PersonalAccessTokensService) RevokePersonalAccessToken(token int, options ...RequestOptionFunc) (*Response, error) {
-	u := fmt.Sprintf("personal_access_tokens/%d", token)
-
-	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_access_tokens.go b/project_access_tokens.go
index 50d0782..2821b45 100644
--- a/project_access_tokens.go
+++ b/project_access_tokens.go
@@ -30,7 +30,7 @@ type ProjectAccessTokensService struct {
 	client *Client
 }
 
-// ProjectAccessToken represents a GitLab project access token.
+// ProjectAccessToken represents a GitLab Project Access Token.
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/resource_access_tokens.html
 type ProjectAccessToken struct {
@@ -39,7 +39,6 @@ type ProjectAccessToken struct {
 	Name        string           `json:"name"`
 	Scopes      []string         `json:"scopes"`
 	CreatedAt   *time.Time       `json:"created_at"`
-	LastUsedAt  *time.Time       `json:"last_used_at"`
 	ExpiresAt   *ISOTime         `json:"expires_at"`
 	Active      bool             `json:"active"`
 	Revoked     bool             `json:"revoked"`
@@ -51,14 +50,14 @@ func (v ProjectAccessToken) String() string {
 	return Stringify(v)
 }
 
-// ListProjectAccessTokensOptions represents the available
-// ListProjectAccessTokens() options.
+// ListProjectAccessTokensOptions represents the available options for
+// listing variables in a project.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/resource_access_tokens.html#list-project-access-tokens
 type ListProjectAccessTokensOptions ListOptions
 
-// ListProjectAccessTokens gets a list of all project access tokens in a
+// ListProjectAccessTokens gets a list of all Project Access Tokens in a
 // project.
 //
 // GitLab API docs:
@@ -84,31 +83,6 @@ func (s *ProjectAccessTokensService) ListProjectAccessTokens(pid interface{}, op
 	return pats, resp, err
 }
 
-// GetProjectAccessToken gets a single project access tokens in a project.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/project_access_tokens.html#get-a-project-access-token
-func (s *ProjectAccessTokensService) GetProjectAccessToken(pid interface{}, id int, options ...RequestOptionFunc) (*ProjectAccessToken, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/access_tokens/%d", PathEscape(project), id)
-
-	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	pat := new(ProjectAccessToken)
-	resp, err := s.client.Do(req, &pat)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return pat, resp, err
-}
-
 // CreateProjectAccessTokenOptions represents the available CreateVariable()
 // options.
 //
@@ -121,7 +95,7 @@ type CreateProjectAccessTokenOptions struct {
 	ExpiresAt   *ISOTime          `url:"expires_at,omitempty" json:"expires_at,omitempty"`
 }
 
-// CreateProjectAccessToken creates a new project access token.
+// CreateProjectAccessToken creates a new Project Access Token.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/resource_access_tokens.html#create-a-project-access-token
@@ -146,11 +120,11 @@ func (s *ProjectAccessTokensService) CreateProjectAccessToken(pid interface{}, o
 	return pat, resp, err
 }
 
-// RevokeProjectAccessToken revokes a project access token.
+// DeleteProjectAccessToken deletes a Project Access Token.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/resource_access_tokens.html#revoke-a-project-access-token
-func (s *ProjectAccessTokensService) RevokeProjectAccessToken(pid interface{}, id int, options ...RequestOptionFunc) (*Response, error) {
+func (s *ProjectAccessTokensService) DeleteProjectAccessToken(pid interface{}, id int, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, err
diff --git a/project_import_export.go b/project_import_export.go
index 81b9845..67f8a62 100644
--- a/project_import_export.go
+++ b/project_import_export.go
@@ -46,9 +46,6 @@ type ImportStatus struct {
 	PathWithNamespace string     `json:"path_with_namespace"`
 	CreateAt          *time.Time `json:"create_at"`
 	ImportStatus      string     `json:"import_status"`
-	ImportType        string     `json:"import_type"`
-	CorrelationID     string     `json:"correlation_id"`
-	ImportError       string     `json:"import_error"`
 }
 
 func (s ImportStatus) String() string {
diff --git a/project_mirror.go b/project_mirror.go
index dc00d47..20b4f7b 100644
--- a/project_mirror.go
+++ b/project_mirror.go
@@ -74,31 +74,6 @@ func (s *ProjectMirrorService) ListProjectMirror(pid interface{}, opt *ListProje
 	return pm, resp, err
 }
 
-// GetProjectMirror gets a single mirror configured on the project.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/remote_mirrors.html#get-a-single-projects-remote-mirror
-func (s *ProjectMirrorService) GetProjectMirror(pid interface{}, mirror int, options ...RequestOptionFunc) (*ProjectMirror, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/remote_mirrors/%d", PathEscape(project), mirror)
-
-	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	pm := new(ProjectMirror)
-	resp, err := s.client.Do(req, &pm)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return pm, resp, err
-}
-
 // AddProjectMirrorOptions contains the properties requires to create
 // a new project mirror.
 //
@@ -171,22 +146,3 @@ func (s *ProjectMirrorService) EditProjectMirror(pid interface{}, mirror int, op
 
 	return pm, resp, err
 }
-
-// DeleteProjectMirror deletes a project mirror.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/remote_mirrors.html#delete-a-remote-mirror
-func (s *ProjectMirrorService) DeleteProjectMirror(pid interface{}, mirror int, options ...RequestOptionFunc) (*Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("projects/%s/remote_mirrors/%d", PathEscape(project), mirror)
-
-	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/projects.go b/projects.go
index 301a428..3f753c2 100644
--- a/projects.go
+++ b/projects.go
@@ -64,7 +64,6 @@ type Project struct {
 	ContainerExpirationPolicy                 *ContainerExpirationPolicy `json:"container_expiration_policy,omitempty"`
 	ContainerRegistryEnabled                  bool                       `json:"container_registry_enabled"`
 	ContainerRegistryAccessLevel              AccessControlValue         `json:"container_registry_access_level"`
-	ContainerRegistryImagePrefix              string                     `json:"container_registry_image_prefix,omitempty"`
 	CreatedAt                                 *time.Time                 `json:"created_at,omitempty"`
 	LastActivityAt                            *time.Time                 `json:"last_activity_at,omitempty"`
 	CreatorID                                 int                        `json:"creator_id"`
diff --git a/repository_files.go b/repository_files.go
index 64189f3..e444b62 100644
--- a/repository_files.go
+++ b/repository_files.go
@@ -36,16 +36,17 @@ type RepositoryFilesService struct {
 //
 // GitLab API docs: https://docs.gitlab.com/ce/api/repository_files.html
 type File struct {
-	FileName     string `json:"file_name"`
-	FilePath     string `json:"file_path"`
-	Size         int    `json:"size"`
-	Encoding     string `json:"encoding"`
-	Content      string `json:"content"`
-	Ref          string `json:"ref"`
-	BlobID       string `json:"blob_id"`
-	CommitID     string `json:"commit_id"`
-	SHA256       string `json:"content_sha256"`
-	LastCommitID string `json:"last_commit_id"`
+	FileName        string `json:"file_name"`
+	FilePath        string `json:"file_path"`
+	Size            int    `json:"size"`
+	Encoding        string `json:"encoding"`
+	Content         string `json:"content"`
+	ExecuteFilemode bool   `json:"execute_filemode"`
+	Ref             string `json:"ref"`
+	BlobID          string `json:"blob_id"`
+	CommitID        string `json:"commit_id"`
+	SHA256          string `json:"content_sha256"`
+	LastCommitID    string `json:"last_commit_id"`
 }
 
 func (r File) String() string {
@@ -125,14 +126,15 @@ func (s *RepositoryFilesService) GetFileMetaData(pid interface{}, fileName strin
 	}
 
 	f := &File{
-		BlobID:       resp.Header.Get("X-Gitlab-Blob-Id"),
-		CommitID:     resp.Header.Get("X-Gitlab-Commit-Id"),
-		Encoding:     resp.Header.Get("X-Gitlab-Encoding"),
-		FileName:     resp.Header.Get("X-Gitlab-File-Name"),
-		FilePath:     resp.Header.Get("X-Gitlab-File-Path"),
-		Ref:          resp.Header.Get("X-Gitlab-Ref"),
-		SHA256:       resp.Header.Get("X-Gitlab-Content-Sha256"),
-		LastCommitID: resp.Header.Get("X-Gitlab-Last-Commit-Id"),
+		BlobID:          resp.Header.Get("X-Gitlab-Blob-Id"),
+		CommitID:        resp.Header.Get("X-Gitlab-Commit-Id"),
+		Encoding:        resp.Header.Get("X-Gitlab-Encoding"),
+		FileName:        resp.Header.Get("X-Gitlab-File-Name"),
+		FilePath:        resp.Header.Get("X-Gitlab-File-Path"),
+		ExecuteFilemode: resp.Header.Get("X-Gitlab-Execute-Filemode") == "true",
+		Ref:             resp.Header.Get("X-Gitlab-Ref"),
+		SHA256:          resp.Header.Get("X-Gitlab-Content-Sha256"),
+		LastCommitID:    resp.Header.Get("X-Gitlab-Last-Commit-Id"),
 	}
 
 	if sizeString := resp.Header.Get("X-Gitlab-Size"); sizeString != "" {
@@ -259,13 +261,14 @@ func (r FileInfo) String() string {
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/repository_files.html#create-new-file-in-repository
 type CreateFileOptions struct {
-	Branch        *string `url:"branch,omitempty" json:"branch,omitempty"`
-	StartBranch   *string `url:"start_branch,omitempty" json:"start_branch,omitempty"`
-	Encoding      *string `url:"encoding,omitempty" json:"encoding,omitempty"`
-	AuthorEmail   *string `url:"author_email,omitempty" json:"author_email,omitempty"`
-	AuthorName    *string `url:"author_name,omitempty" json:"author_name,omitempty"`
-	Content       *string `url:"content,omitempty" json:"content,omitempty"`
-	CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"`
+	Branch          *string `url:"branch,omitempty" json:"branch,omitempty"`
+	StartBranch     *string `url:"start_branch,omitempty" json:"start_branch,omitempty"`
+	Encoding        *string `url:"encoding,omitempty" json:"encoding,omitempty"`
+	AuthorEmail     *string `url:"author_email,omitempty" json:"author_email,omitempty"`
+	AuthorName      *string `url:"author_name,omitempty" json:"author_name,omitempty"`
+	Content         *string `url:"content,omitempty" json:"content,omitempty"`
+	CommitMessage   *string `url:"commit_message,omitempty" json:"commit_message,omitempty"`
+	ExecuteFilemode *bool   `url:"execute_filemode,omitempty" json:"execute_filemode,omitempty"`
 }
 
 // CreateFile creates a new file in a repository.
@@ -302,14 +305,15 @@ func (s *RepositoryFilesService) CreateFile(pid interface{}, fileName string, op
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/repository_files.html#update-existing-file-in-repository
 type UpdateFileOptions struct {
-	Branch        *string `url:"branch,omitempty" json:"branch,omitempty"`
-	StartBranch   *string `url:"start_branch,omitempty" json:"start_branch,omitempty"`
-	Encoding      *string `url:"encoding,omitempty" json:"encoding,omitempty"`
-	AuthorEmail   *string `url:"author_email,omitempty" json:"author_email,omitempty"`
-	AuthorName    *string `url:"author_name,omitempty" json:"author_name,omitempty"`
-	Content       *string `url:"content,omitempty" json:"content,omitempty"`
-	CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"`
-	LastCommitID  *string `url:"last_commit_id,omitempty" json:"last_commit_id,omitempty"`
+	Branch          *string `url:"branch,omitempty" json:"branch,omitempty"`
+	StartBranch     *string `url:"start_branch,omitempty" json:"start_branch,omitempty"`
+	Encoding        *string `url:"encoding,omitempty" json:"encoding,omitempty"`
+	AuthorEmail     *string `url:"author_email,omitempty" json:"author_email,omitempty"`
+	AuthorName      *string `url:"author_name,omitempty" json:"author_name,omitempty"`
+	Content         *string `url:"content,omitempty" json:"content,omitempty"`
+	CommitMessage   *string `url:"commit_message,omitempty" json:"commit_message,omitempty"`
+	LastCommitID    *string `url:"last_commit_id,omitempty" json:"last_commit_id,omitempty"`
+	ExecuteFilemode *bool   `url:"execute_filemode,omitempty" json:"execute_filemode,omitempty"`
 }
 
 // UpdateFile updates an existing file in a repository
diff --git a/runners.go b/runners.go
index 35957d4..60c483a 100644
--- a/runners.go
+++ b/runners.go
@@ -37,7 +37,6 @@ type Runner struct {
 	ID          int    `json:"id"`
 	Description string `json:"description"`
 	Active      bool   `json:"active"`
-	Paused      bool   `json:"paused"`
 	IsShared    bool   `json:"is_shared"`
 	IPAddress   string `json:"ip_address"`
 	RunnerType  string `json:"runner_type"`
@@ -51,7 +50,7 @@ type Runner struct {
 //
 // GitLab API docs: https://docs.gitlab.com/ce/api/runners.html
 type RunnerDetails struct {
-	Paused       bool       `json:"paused"`
+	Active       bool       `json:"active"`
 	Architecture string     `json:"architecture"`
 	Description  string     `json:"description"`
 	ID           int        `json:"id"`
@@ -83,9 +82,6 @@ type RunnerDetails struct {
 		Name   string `json:"name"`
 		WebURL string `json:"web_url"`
 	} `json:"groups"`
-
-	// Deprecated members
-	Active bool `json:"active"`
 }
 
 // ListRunnersOptions represents the available ListRunners() options.
@@ -94,13 +90,10 @@ type RunnerDetails struct {
 // https://docs.gitlab.com/ce/api/runners.html#list-owned-runners
 type ListRunnersOptions struct {
 	ListOptions
+	Scope   *string   `url:"scope,omitempty" json:"scope,omitempty"`
 	Type    *string   `url:"type,omitempty" json:"type,omitempty"`
 	Status  *string   `url:"status,omitempty" json:"status,omitempty"`
-	Paused  *bool     `url:"paused,omitempty" json:"paused,omitempty"`
 	TagList *[]string `url:"tag_list,comma,omitempty" json:"tag_list,omitempty"`
-
-	// Deprecated members
-	Scope *string `url:"scope,omitempty" json:"scope,omitempty"`
 }
 
 // ListRunners gets a list of runners accessible by the authenticated user.
@@ -158,7 +151,7 @@ func (s *RunnersService) GetRunnerDetails(rid interface{}, options ...RequestOpt
 		return nil, nil, err
 	}
 
-	rs := new(RunnerDetails)
+	var rs *RunnerDetails
 	resp, err := s.client.Do(req, &rs)
 	if err != nil {
 		return nil, resp, err
@@ -173,15 +166,12 @@ func (s *RunnersService) GetRunnerDetails(rid interface{}, options ...RequestOpt
 // https://docs.gitlab.com/ce/api/runners.html#update-runner-39-s-details
 type UpdateRunnerDetailsOptions struct {
 	Description    *string   `url:"description,omitempty" json:"description,omitempty"`
-	Paused         *bool     `url:"paused,omitempty" json:"paused,omitempty"`
+	Active         *bool     `url:"active,omitempty" json:"active,omitempty"`
 	TagList        *[]string `url:"tag_list[],omitempty" json:"tag_list,omitempty"`
 	RunUntagged    *bool     `url:"run_untagged,omitempty" json:"run_untagged,omitempty"`
 	Locked         *bool     `url:"locked,omitempty" json:"locked,omitempty"`
 	AccessLevel    *string   `url:"access_level,omitempty" json:"access_level,omitempty"`
 	MaximumTimeout *int      `url:"maximum_timeout,omitempty" json:"maximum_timeout,omitempty"`
-
-	// Deprecated members
-	Active *bool `url:"active,omitempty" json:"active,omitempty"`
 }
 
 // UpdateRunnerDetails updates details for a given runner.
@@ -200,7 +190,7 @@ func (s *RunnersService) UpdateRunnerDetails(rid interface{}, opt *UpdateRunnerD
 		return nil, nil, err
 	}
 
-	rs := new(RunnerDetails)
+	var rs *RunnerDetails
 	resp, err := s.client.Do(req, &rs)
 	if err != nil {
 		return nil, resp, err
@@ -322,7 +312,7 @@ func (s *RunnersService) EnableProjectRunner(pid interface{}, opt *EnableProject
 		return nil, nil, err
 	}
 
-	r := new(Runner)
+	var r *Runner
 	resp, err := s.client.Do(req, &r)
 	if err != nil {
 		return nil, resp, err
@@ -394,17 +384,14 @@ func (s *RunnersService) ListGroupsRunners(gid interface{}, opt *ListGroupsRunne
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/runners.html#register-a-new-runner
 type RegisterNewRunnerOptions struct {
-	Token           *string                       `url:"token" json:"token"`
-	Description     *string                       `url:"description,omitempty" json:"description,omitempty"`
-	Info            *RegisterNewRunnerInfoOptions `url:"info,omitempty" json:"info,omitempty"`
-	Active          *bool                         `url:"active,omitempty" json:"active,omitempty"`
-	Paused          *bool                         `url:"paused,omitempty" json:"paused,omitempty"`
-	Locked          *bool                         `url:"locked,omitempty" json:"locked,omitempty"`
-	RunUntagged     *bool                         `url:"run_untagged,omitempty" json:"run_untagged,omitempty"`
-	TagList         *[]string                     `url:"tag_list[],omitempty" json:"tag_list,omitempty"`
-	AccessLevel     *string                       `url:"access_level,omitempty" json:"access_level,omitempty"`
-	MaximumTimeout  *int                          `url:"maximum_timeout,omitempty" json:"maximum_timeout,omitempty"`
-	MaintenanceNote *string                       `url:"maintenance_note,omitempty" json:"maintenance_note,omitempty"`
+	Token          *string                       `url:"token" json:"token"`
+	Description    *string                       `url:"description,omitempty" json:"description,omitempty"`
+	Info           *RegisterNewRunnerInfoOptions `url:"info,omitempty" json:"info,omitempty"`
+	Active         *bool                         `url:"active,omitempty" json:"active,omitempty"`
+	Locked         *bool                         `url:"locked,omitempty" json:"locked,omitempty"`
+	RunUntagged    *bool                         `url:"run_untagged,omitempty" json:"run_untagged,omitempty"`
+	TagList        *[]string                     `url:"tag_list[],omitempty" json:"tag_list,omitempty"`
+	MaximumTimeout *int                          `url:"maximum_timeout,omitempty" json:"maximum_timeout,omitempty"`
 }
 
 // RegisterNewRunnerInfoOptions represents the info hashmap parameter in
@@ -430,7 +417,7 @@ func (s *RunnersService) RegisterNewRunner(opt *RegisterNewRunnerOptions, option
 		return nil, nil, err
 	}
 
-	r := new(Runner)
+	var r *Runner
 	resp, err := s.client.Do(req, &r)
 	if err != nil {
 		return nil, resp, err
@@ -461,7 +448,7 @@ func (s *RunnersService) DeleteRegisteredRunner(opt *DeleteRegisteredRunnerOptio
 	return s.client.Do(req, nil)
 }
 
-// DeleteRegisteredRunnerByID deletes a runner by ID.
+// DeleteRegisteredRunnerByID deletes a Runner by ID.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/runners.html#delete-a-runner-by-id
@@ -483,7 +470,7 @@ type VerifyRegisteredRunnerOptions struct {
 	Token *string `url:"token" json:"token"`
 }
 
-// VerifyRegisteredRunner registers a new runner for the instance.
+// VerifyRegisteredRunner registers a new Runner for the instance.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/runners.html#verify-authentication-for-a-registered-runner
@@ -495,100 +482,3 @@ func (s *RunnersService) VerifyRegisteredRunner(opt *VerifyRegisteredRunnerOptio
 
 	return s.client.Do(req, nil)
 }
-
-type RunnerRegistrationToken struct {
-	Token *string `url:"token" json:"token"`
-}
-
-// ResetInstanceRunnerRegistrationToken resets the instance runner registration
-// token.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/runners.html#reset-instances-runner-registration-token
-func (s *RunnersService) ResetInstanceRunnerRegistrationToken(options ...RequestOptionFunc) (*RunnerRegistrationToken, *Response, error) {
-	req, err := s.client.NewRequest(http.MethodPost, "runners/reset_registration_token", nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	r := new(RunnerRegistrationToken)
-	resp, err := s.client.Do(req, &r)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return r, resp, err
-}
-
-// ResetGroupRunnerRegistrationToken resets a group's runner registration token.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/runners.html#reset-groups-runner-registration-token
-func (s *RunnersService) ResetGroupRunnerRegistrationToken(gid interface{}, options ...RequestOptionFunc) (*RunnerRegistrationToken, *Response, error) {
-	group, err := parseID(gid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("groups/%s/runners/reset_registration_token", PathEscape(group))
-
-	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	r := new(RunnerRegistrationToken)
-	resp, err := s.client.Do(req, &r)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return r, resp, err
-}
-
-// ResetGroupRunnerRegistrationToken resets a projects's runner registration token.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/runners.html#reset-projects-runner-registration-token
-func (s *RunnersService) ResetProjectRunnerRegistrationToken(pid interface{}, options ...RequestOptionFunc) (*RunnerRegistrationToken, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/runners/reset_registration_token", PathEscape(project))
-	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	r := new(RunnerRegistrationToken)
-	resp, err := s.client.Do(req, &r)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return r, resp, err
-}
-
-type RunnerAuthenticationToken struct {
-	Token *string `url:"token" json:"token"`
-}
-
-// ResetRunnerAuthenticationToken resets a runner's authentication token.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/runners.html#reset-runners-authentication-token
-func (s *RunnersService) ResetRunnerAuthenticationToken(rid int, options ...RequestOptionFunc) (*RunnerAuthenticationToken, *Response, error) {
-	u := fmt.Sprintf("runners/%d/reset_authentication_token", rid)
-	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	r := new(RunnerAuthenticationToken)
-	resp, err := s.client.Do(req, &r)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return r, resp, err
-}
diff --git a/services.go b/services.go
index 99688da..2abcdc7 100644
--- a/services.go
+++ b/services.go
@@ -1421,97 +1421,6 @@ func (s *ServicesService) DeleteSlackSlashCommandsService(pid interface{}, optio
 	return s.client.Do(req, nil)
 }
 
-// MattermostSlashCommandsService represents Mattermost slash commands settings.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/integrations.html#mattermost-slash-commands
-type MattermostSlashCommandsService struct {
-	Service
-	Properties *MattermostSlashCommandsProperties `json:"properties"`
-}
-
-// MattermostSlashCommandsProperties represents Mattermost slash commands specific properties.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/integrations.html#mattermost-slash-commands
-type MattermostSlashCommandsProperties struct {
-	Token    string `json:"token"`
-	Username string `json:"username,omitempty"`
-}
-
-// GetMattermostSlashCommandsService gets Slack Mattermost commands service settings for a project.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/integrations.html#get-mattermost-slash-command-integration-settings
-func (s *ServicesService) GetMattermostSlashCommandsService(pid interface{}, options ...RequestOptionFunc) (*MattermostSlashCommandsService, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/services/mattermost-slash-commands", PathEscape(project))
-
-	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	svc := new(MattermostSlashCommandsService)
-	resp, err := s.client.Do(req, svc)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return svc, resp, err
-}
-
-// SetMattermostSlashCommandsServiceOptions represents the available SetSlackSlashCommandsService()
-// options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/integrations.html#get-mattermost-slash-command-integration-settings
-type SetMattermostSlashCommandsServiceOptions struct {
-	Token    *string `url:"token,omitempty" json:"token,omitempty"`
-	Username *string `url:"username,omitempty" json:"username,omitempty"`
-}
-
-// SetMattermostSlashCommandsService sets Mattermost slash commands service for a project
-//
-// 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) (*Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		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, err
-	}
-
-	return s.client.Do(req, nil)
-}
-
-// DeleteMattermostSlashCommandsService deletes Mattermost slash commands service for project.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/integrations.html#disable-mattermost-slash-command-integration
-func (s *ServicesService) DeleteMattermostSlashCommandsService(pid interface{}, options ...RequestOptionFunc) (*Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("projects/%s/services/mattermost-slash-commands", PathEscape(project))
-
-	req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
-	if err != nil {
-		return nil, err
-	}
-
-	return s.client.Do(req, nil)
-}
-
 // YouTrackService represents YouTrack service settings.
 //
 // GitLab API docs:
diff --git a/tags.go b/tags.go
index 8c9d750..e417a11 100644
--- a/tags.go
+++ b/tags.go
@@ -125,8 +125,7 @@ type CreateTagOptions struct {
 	TagName *string `url:"tag_name,omitempty" json:"tag_name,omitempty"`
 	Ref     *string `url:"ref,omitempty" json:"ref,omitempty"`
 	Message *string `url:"message,omitempty" json:"message,omitempty"`
-
-	// Deprecated members
+	// ReleaseDescription parameter was deprecated in GitLab 11.7
 	ReleaseDescription *string `url:"release_description:omitempty" json:"release_description,omitempty"`
 }
 
diff --git a/users.go b/users.go
index 2cf25fb..4e04e3a 100644
--- a/users.go
+++ b/users.go
@@ -67,7 +67,6 @@ type User struct {
 	WebURL                         string             `json:"web_url"`
 	CreatedAt                      *time.Time         `json:"created_at"`
 	Bio                            string             `json:"bio"`
-	Bot                            bool               `json:"bot"`
 	Location                       string             `json:"location"`
 	PublicEmail                    string             `json:"public_email"`
 	Skype                          string             `json:"skype"`
@@ -100,7 +99,6 @@ type User struct {
 	ExtraSharedRunnersMinutesLimit int                `json:"extra_shared_runners_minutes_limit"`
 	UsingLicenseSeat               bool               `json:"using_license_seat"`
 	CustomAttributes               []*CustomAttribute `json:"custom_attributes"`
-	NamespaceID                    int                `json:"namespace_id"`
 }
 
 // UserIdentity represents a user identity.
@@ -132,7 +130,6 @@ type ListUsersOptions struct {
 	External             *bool      `url:"external,omitempty" json:"external,omitempty"`
 	WithoutProjects      *bool      `url:"without_projects,omitempty" json:"without_projects,omitempty"`
 	WithCustomAttributes *bool      `url:"with_custom_attributes,omitempty" json:"with_custom_attributes,omitempty"`
-	WithoutProjectBots   *bool      `url:"without_project_bots,omitempty" json:"without_project_bots,omitempty"`
 }
 
 // ListUsers gets a list of users.
@@ -252,7 +249,6 @@ type ModifyUserOptions struct {
 	External           *bool   `url:"external,omitempty" json:"external,omitempty"`
 	PrivateProfile     *bool   `url:"private_profile,omitempty" json:"private_profile,omitempty"`
 	Note               *string `url:"note,omitempty" json:"note,omitempty"`
-	PublicEmail        *string `url:"public_email,omitempty" json:"public_email,omitempty"`
 }
 
 // ModifyUser modifies an existing user. Only administrators can change attributes
@@ -1225,6 +1221,22 @@ func (s *UsersService) RevokeImpersonationToken(user, token int, options ...Requ
 	return s.client.Do(req, nil)
 }
 
+// PersonalAccessToken represents a personal access token.
+//
+// GitLab API docs:
+// https://docs.gitlab.com/ee/api/users.html#create-a-personal-access-token
+type PersonalAccessToken struct {
+	ID        int        `json:"id"`
+	Name      string     `json:"name"`
+	Revoked   bool       `json:"revoked"`
+	CreatedAt *time.Time `json:"created_at"`
+	Scopes    []string   `json:"scopes"`
+	UserID    int        `json:"user_id"`
+	Active    bool       `json:"active"`
+	ExpiresAt *ISOTime   `json:"expires_at"`
+	Token     string     `json:"token"`
+}
+
 // CreatePersonalAccessTokenOptions represents the available
 // CreatePersonalAccessToken() options.
 //


Test patch:
diff --git a/event_webhook_types_test.go b/event_webhook_types_test.go
index 175f05b..b0119da 100644
--- a/event_webhook_types_test.go
+++ b/event_webhook_types_test.go
@@ -441,8 +441,8 @@ func TestSubGroupEventUnmarshal(t *testing.T) {
 		t.Errorf("SubGroup Event is null")
 	}
 
-	if event.Name != "SubGroup 1" {
-		t.Errorf("Name is %v, want %v", event.Name, "SubGroup 1")
+	if event.Name != "Subgroup 1" {
+		t.Errorf("Name is %v, want %v", event.Name, "Subgroup 1")
 	}
 
 	if event.GroupID != 2 {
diff --git a/group_access_tokens_test.go b/group_access_tokens_test.go
index 5b6f653..8b9be4f 100644
--- a/group_access_tokens_test.go
+++ b/group_access_tokens_test.go
@@ -45,10 +45,6 @@ func TestListGroupAccessTokens(t *testing.T) {
 	if err != nil {
 		t.Errorf("GroupAccessTokens.ListGroupAccessTokens returned error: %v", err)
 	}
-	time3, err := time.Parse(time.RFC3339, "2021-03-10T21:11:47.271Z")
-	if err != nil {
-		t.Errorf("GroupAccessTokens.ListGroupAccessTokens returned error: %v", err)
-	}
 
 	want := []*GroupAccessToken{
 		{
@@ -57,7 +53,6 @@ func TestListGroupAccessTokens(t *testing.T) {
 			Name:        "token 10",
 			Scopes:      []string{"api", "read_api", "read_repository", "write_repository"},
 			CreatedAt:   &time1,
-			LastUsedAt:  &time3,
 			Active:      true,
 			Revoked:     false,
 			AccessLevel: AccessLevelValue(40),
@@ -79,41 +74,6 @@ func TestListGroupAccessTokens(t *testing.T) {
 	}
 }
 
-func TestGetGroupAccessToken(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/groups/1/access_tokens/1", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		mustWriteHTTPResponse(t, w, "testdata/get_group_access_token.json")
-	})
-
-	groupAccessToken, _, err := client.GroupAccessTokens.GetGroupAccessToken(1, 1)
-	if err != nil {
-		t.Errorf("GroupAccessTokens.GetGroupAccessToken returned error: %v", err)
-	}
-
-	createdAt, err := time.Parse(time.RFC3339, "2021-03-09T21:11:47.271Z")
-	if err != nil {
-		t.Errorf("GroupAccessTokens.GetGroupAccessToken returned error: %v", err)
-	}
-
-	want := &GroupAccessToken{
-		ID:          1,
-		UserID:      2453,
-		Name:        "token 10",
-		Scopes:      []string{"api", "read_api", "read_repository", "write_repository"},
-		CreatedAt:   &createdAt,
-		Active:      true,
-		Revoked:     false,
-		AccessLevel: AccessLevelValue(40),
-	}
-
-	if !reflect.DeepEqual(want, groupAccessToken) {
-		t.Errorf("GroupAccessTokens.GetGroupAccessToken returned %+v, want %+v", groupAccessToken, want)
-	}
-}
-
 func TestCreateGroupAccessToken(t *testing.T) {
 	mux, server, client := setup(t)
 	defer teardown(server)
@@ -150,7 +110,7 @@ func TestCreateGroupAccessToken(t *testing.T) {
 	}
 }
 
-func TestRevokeGroupAccessToken(t *testing.T) {
+func TestDeleteGroupAccessToken(t *testing.T) {
 	mux, server, client := setup(t)
 	defer teardown(server)
 
@@ -158,8 +118,8 @@ func TestRevokeGroupAccessToken(t *testing.T) {
 		testMethod(t, r, http.MethodDelete)
 	})
 
-	_, err := client.GroupAccessTokens.RevokeGroupAccessToken("1", 1234)
+	_, err := client.GroupAccessTokens.DeleteGroupAccessToken("1", 1234)
 	if err != nil {
-		t.Errorf("GroupAccessTokens.RevokeGroupAccessToken returned error: %v", err)
+		t.Errorf("GroupAccessTokens.DeleteGroupAccessToken returned error: %v", err)
 	}
 }
diff --git a/group_hooks_test.go b/group_hooks_test.go
index 07775c8..7f0961f 100644
--- a/group_hooks_test.go
+++ b/group_hooks_test.go
@@ -37,7 +37,6 @@ func TestListGroupHooks(t *testing.T) {
 		"url": "http://example.com/hook",
 		"group_id": 3,
 		"push_events": true,
-		"push_events_branch_filter": "main",
 		"issues_events": true,
 		"confidential_issues_events": true,
 		"merge_requests_events": true,
@@ -48,7 +47,6 @@ func TestListGroupHooks(t *testing.T) {
 		"wiki_page_events": true,
 		"deployment_events": true,
 		"releases_events": true,
-		"subgroup_events": true,
 		"enable_ssl_verification": true,
 		"created_at": "2012-10-12T17:04:47Z"
 	}
@@ -66,7 +64,6 @@ func TestListGroupHooks(t *testing.T) {
 		URL:                      "http://example.com/hook",
 		GroupID:                  3,
 		PushEvents:               true,
-		PushEventsBranchFilter:   "main",
 		IssuesEvents:             true,
 		ConfidentialIssuesEvents: true,
 		MergeRequestsEvents:      true,
@@ -77,7 +74,6 @@ func TestListGroupHooks(t *testing.T) {
 		WikiPageEvents:           true,
 		DeploymentEvents:         true,
 		ReleasesEvents:           true,
-		SubGroupEvents:           true,
 		EnableSSLVerification:    true,
 		CreatedAt:                &datePointer,
 	}}
@@ -99,7 +95,6 @@ func TestGetGroupHook(t *testing.T) {
 	"url": "http://example.com/hook",
 	"group_id": 3,
 	"push_events": true,
-	"push_events_branch_filter": "main",
 	"issues_events": true,
 	"confidential_issues_events": true,
 	"merge_requests_events": true,
@@ -110,7 +105,6 @@ func TestGetGroupHook(t *testing.T) {
 	"wiki_page_events": true,
 	"deployment_events": true,
 	"releases_events": true,
-	"subgroup_events": true,
 	"enable_ssl_verification": true,
 	"created_at": "2012-10-12T17:04:47Z"
 }`)
@@ -127,7 +121,6 @@ func TestGetGroupHook(t *testing.T) {
 		URL:                      "http://example.com/hook",
 		GroupID:                  3,
 		PushEvents:               true,
-		PushEventsBranchFilter:   "main",
 		IssuesEvents:             true,
 		ConfidentialIssuesEvents: true,
 		MergeRequestsEvents:      true,
@@ -138,7 +131,6 @@ func TestGetGroupHook(t *testing.T) {
 		WikiPageEvents:           true,
 		DeploymentEvents:         true,
 		ReleasesEvents:           true,
-		SubGroupEvents:           true,
 		EnableSSLVerification:    true,
 		CreatedAt:                &datePointer,
 	}
@@ -160,7 +152,6 @@ func TestAddGroupHook(t *testing.T) {
 	"url": "http://example.com/hook",
 	"group_id": 3,
 	"push_events": true,
-	"push_events_branch_filter": "main",
 	"issues_events": true,
 	"confidential_issues_events": true,
 	"merge_requests_events": true,
@@ -171,7 +162,6 @@ func TestAddGroupHook(t *testing.T) {
 	"wiki_page_events": true,
 	"deployment_events": true,
 	"releases_events": true,
-	"subgroup_events": true,
 	"enable_ssl_verification": true,
 	"created_at": "2012-10-12T17:04:47Z"
 }`)
@@ -193,7 +183,6 @@ func TestAddGroupHook(t *testing.T) {
 		URL:                      "http://example.com/hook",
 		GroupID:                  3,
 		PushEvents:               true,
-		PushEventsBranchFilter:   "main",
 		IssuesEvents:             true,
 		ConfidentialIssuesEvents: true,
 		ConfidentialNoteEvents:   false,
@@ -205,7 +194,6 @@ func TestAddGroupHook(t *testing.T) {
 		WikiPageEvents:           true,
 		DeploymentEvents:         true,
 		ReleasesEvents:           true,
-		SubGroupEvents:           true,
 		EnableSSLVerification:    true,
 		CreatedAt:                &datePointer,
 	}
@@ -227,7 +215,6 @@ func TestEditGroupHook(t *testing.T) {
 	"url": "http://example.com/hook",
 	"group_id": 3,
 	"push_events": true,
-	"push_events_branch_filter": "main",
 	"issues_events": true,
 	"confidential_issues_events": true,
 	"merge_requests_events": true,
@@ -238,7 +225,6 @@ func TestEditGroupHook(t *testing.T) {
 	"wiki_page_events": true,
 	"deployment_events": true,
 	"releases_events": true,
-	"subgroup_events": true,
 	"enable_ssl_verification": true,
 	"created_at": "2012-10-12T17:04:47Z"
 }`)
@@ -260,7 +246,6 @@ func TestEditGroupHook(t *testing.T) {
 		URL:                      "http://example.com/hook",
 		GroupID:                  3,
 		PushEvents:               true,
-		PushEventsBranchFilter:   "main",
 		IssuesEvents:             true,
 		ConfidentialIssuesEvents: true,
 		ConfidentialNoteEvents:   false,
@@ -272,7 +257,6 @@ func TestEditGroupHook(t *testing.T) {
 		WikiPageEvents:           true,
 		DeploymentEvents:         true,
 		ReleasesEvents:           true,
-		SubGroupEvents:           true,
 		EnableSSLVerification:    true,
 		CreatedAt:                &datePointer,
 	}
diff --git a/groups_test.go b/groups_test.go
index ea22588..ccf0d82 100644
--- a/groups_test.go
+++ b/groups_test.go
@@ -203,7 +203,7 @@ func TestListGroupProjects(t *testing.T) {
 	}
 }
 
-func TestListSubGroups(t *testing.T) {
+func TestListSubgroups(t *testing.T) {
 	mux, server, client := setup(t)
 	defer teardown(server)
 
@@ -213,14 +213,14 @@ func TestListSubGroups(t *testing.T) {
 			fmt.Fprint(w, `[{"id": 1}, {"id": 2}]`)
 		})
 
-	groups, _, err := client.Groups.ListSubGroups(1, &ListSubGroupsOptions{})
+	groups, _, err := client.Groups.ListSubgroups(1, &ListSubgroupsOptions{})
 	if err != nil {
-		t.Errorf("Groups.ListSubGroups returned error: %v", err)
+		t.Errorf("Groups.ListSubgroups returned error: %v", err)
 	}
 
 	want := []*Group{{ID: 1}, {ID: 2}}
 	if !reflect.DeepEqual(want, groups) {
-		t.Errorf("Groups.ListSubGroups returned %+v, want %+v", groups, want)
+		t.Errorf("Groups.ListSubgroups returned %+v, want %+v", groups, want)
 	}
 }
 
diff --git a/jobs_test.go b/jobs_test.go
index 8eb816a..3244eb1 100644
--- a/jobs_test.go
+++ b/jobs_test.go
@@ -18,7 +18,6 @@ package gitlab
 
 import (
 	"fmt"
-	"io/ioutil"
 	"net/http"
 	"reflect"
 	"testing"
@@ -180,34 +179,3 @@ func TestJobsService_ListProjectJobs(t *testing.T) {
 		}}
 	assert.Equal(t, want, jobs)
 }
-
-func TestDownloadSingleArtifactsFileByTagOrBranch(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	wantContent := []byte("This is the file content")
-	mux.HandleFunc("/api/v4/projects/9/jobs/artifacts/abranch/raw/foo/bar.pdf", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		w.WriteHeader(http.StatusOK)
-		w.Write(wantContent)
-	})
-
-	opt := &DownloadArtifactsFileOptions{Job: String("publish")}
-	reader, resp, err := client.Jobs.DownloadSingleArtifactsFileByTagOrBranch(9, "abranch", "foo/bar.pdf", opt)
-	if err != nil {
-		t.Fatalf("Jobs.DownloadSingleArtifactsFileByTagOrBranch returns an error: %v", err)
-	}
-
-	content, err := ioutil.ReadAll(reader)
-	if err != nil {
-		t.Fatalf("Jobs.DownloadSingleArtifactsFileByTagOrBranch error reading: %v", err)
-	}
-	if !reflect.DeepEqual(content, wantContent) {
-		t.Errorf("Jobs.DownloadSingleArtifactsFileByTagOrBranch returned %+v, want %+v", content, wantContent)
-	}
-
-	wantCode := 200
-	if !reflect.DeepEqual(wantCode, resp.StatusCode) {
-		t.Errorf("Jobs.DownloadSingleArtifactsFileByTagOrBranch returned returned status code  %+v, want %+v", resp.StatusCode, wantCode)
-	}
-}
diff --git a/namespaces_test.go b/namespaces_test.go
index 6df32ac..80be019 100644
--- a/namespaces_test.go
+++ b/namespaces_test.go
@@ -21,16 +21,12 @@ import (
 	"net/http"
 	"reflect"
 	"testing"
-	"time"
 )
 
 func TestListNamespaces(t *testing.T) {
 	mux, server, client := setup(t)
 	defer teardown(server)
 
-	trialEndsOn, _ := time.Parse(time.RFC3339, "2022-05-08T00:00:00Z")
-	trialEndsOnISOTime := ISOTime(trialEndsOn)
-
 	mux.HandleFunc("/api/v4/namespaces", func(w http.ResponseWriter, r *http.Request) {
 		testMethod(t, r, http.MethodGet)
 		fmt.Fprintf(w, `[
@@ -73,20 +69,7 @@ func TestListNamespaces(t *testing.T) {
 			  "plan": "default",
 			  "trial_ends_on": null,
 			  "trial": false
-			},
-			{
-				"id": 4,
-				"name": "group2",
-				"path": "group2",
-				"kind": "group",
-				"full_path": "group2",
-				"avatar_url": "https://gitlab.example.com/groups/group2",
-				"web_url": "https://gitlab.example.com/group2",
-				"billable_members_count": 1,
-				"plan": "default",
-				"trial_ends_on": "2022-05-08",
-				"trial": true
-			  }
+			}
 		  ]`)
 	})
 
@@ -150,19 +133,6 @@ func TestListNamespaces(t *testing.T) {
 					TrialEndsOn:                 nil,
 					Trial:                       false,
 				},
-				{
-					ID:                   4,
-					Name:                 "group2",
-					Path:                 "group2",
-					Kind:                 "group",
-					FullPath:             "group2",
-					AvatarURL:            String("https://gitlab.example.com/groups/group2"),
-					WebURL:               "https://gitlab.example.com/group2",
-					Plan:                 "default",
-					BillableMembersCount: 1,
-					TrialEndsOn:          &trialEndsOnISOTime,
-					Trial:                true,
-				},
 			}
 
 			if !reflect.DeepEqual(namespaces, want) {
diff --git a/personal_access_tokens_test.go b/personal_access_tokens_test.go
deleted file mode 100644
index 78c19cc..0000000
--- a/personal_access_tokens_test.go
+++ /dev/null
@@ -1,164 +0,0 @@
-//
-// Copyright 2022, Ryan Glab <ryan.j.glab@gmail.com>
-//
-// 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 (
-	"net/http"
-	"reflect"
-	"testing"
-	"time"
-)
-
-func TestListPersonalAccessTokensWithUserFilter(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/personal_access_tokens", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		mustWriteHTTPResponse(t, w, "testdata/list_personal_access_tokens_with_user_filter.json")
-	})
-
-	personalAccessTokens, _, err := client.PersonalAccessTokens.ListPersonalAccessTokens(&ListPersonalAccessTokensOptions{UserID: Int(1), ListOptions: ListOptions{Page: 1, PerPage: 10}})
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned error: %v", err)
-	}
-
-	createdAt1, err := time.Parse(time.RFC3339, "2020-02-20T14:58:56.238Z")
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned error: %v", err)
-	}
-
-	lastUsedAt1, err := time.Parse(time.RFC3339, "2021-04-20T16:31:39.105Z")
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned error: %v", err)
-	}
-
-	expiresAt1 := ISOTime(time.Date(2022, time.March, 21, 0, 0, 0, 0, time.UTC))
-
-	createdAt2, err := time.Parse(time.RFC3339, "2022-03-20T03:56:18.968Z")
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned error: %v", err)
-	}
-
-	expiresAt2 := ISOTime(time.Date(2022, time.March, 20, 0, 0, 0, 0, time.UTC))
-
-	want := []*PersonalAccessToken{
-		{
-			ID:         1,
-			Name:       "test 1",
-			Revoked:    true,
-			CreatedAt:  &createdAt1,
-			Scopes:     []string{"api"},
-			UserID:     1,
-			LastUsedAt: &lastUsedAt1,
-			Active:     false,
-			ExpiresAt:  &expiresAt1,
-		},
-		{
-			ID:         2,
-			Name:       "test 2",
-			Revoked:    false,
-			CreatedAt:  &createdAt2,
-			Scopes:     []string{"api", "read_user"},
-			UserID:     1,
-			LastUsedAt: nil,
-			Active:     false,
-			ExpiresAt:  &expiresAt2,
-		},
-	}
-
-	if !reflect.DeepEqual(want, personalAccessTokens) {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned %+v, want %+v", personalAccessTokens, want)
-	}
-}
-
-func TestListPersonalAccessTokensNoUserFilter(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/personal_access_tokens", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		mustWriteHTTPResponse(t, w, "testdata/list_personal_access_tokens_without_user_filter.json")
-	})
-
-	personalAccessTokens, _, err := client.PersonalAccessTokens.ListPersonalAccessTokens(&ListPersonalAccessTokensOptions{ListOptions: ListOptions{Page: 1, PerPage: 10}})
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned error: %v", err)
-	}
-
-	createdAt1, err := time.Parse(time.RFC3339, "2020-02-20T14:58:56.238Z")
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned error: %v", err)
-	}
-
-	lastUsedAt1, err := time.Parse(time.RFC3339, "2021-04-20T16:31:39.105Z")
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned error: %v", err)
-	}
-
-	expiresAt1 := ISOTime(time.Date(2022, time.March, 21, 0, 0, 0, 0, time.UTC))
-
-	createdAt2, err := time.Parse(time.RFC3339, "2022-03-20T03:56:18.968Z")
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned error: %v", err)
-	}
-
-	expiresAt2 := ISOTime(time.Date(2022, time.March, 20, 0, 0, 0, 0, time.UTC))
-
-	want := []*PersonalAccessToken{
-		{
-			ID:         1,
-			Name:       "test 1",
-			Revoked:    true,
-			CreatedAt:  &createdAt1,
-			Scopes:     []string{"api"},
-			UserID:     1,
-			LastUsedAt: &lastUsedAt1,
-			Active:     false,
-			ExpiresAt:  &expiresAt1,
-		},
-		{
-			ID:         2,
-			Name:       "test 2",
-			Revoked:    false,
-			CreatedAt:  &createdAt2,
-			Scopes:     []string{"api", "read_user"},
-			UserID:     2,
-			LastUsedAt: nil,
-			Active:     false,
-			ExpiresAt:  &expiresAt2,
-		},
-	}
-
-	if !reflect.DeepEqual(want, personalAccessTokens) {
-		t.Errorf("PersonalAccessTokens.ListPersonalAccessTokens returned %+v, want %+v", personalAccessTokens, want)
-	}
-}
-
-func TestDeletePersonalAccessToken(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/personal_access_tokens/1", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodDelete)
-	})
-
-	_, err := client.PersonalAccessTokens.RevokePersonalAccessToken(1)
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.RevokePersonalAccessToken returned error: %v", err)
-	}
-}
diff --git a/project_access_tokens_test.go b/project_access_tokens_test.go
index 4a92828..6630fef 100644
--- a/project_access_tokens_test.go
+++ b/project_access_tokens_test.go
@@ -45,10 +45,6 @@ func TestListProjectAccessTokens(t *testing.T) {
 	if err != nil {
 		t.Errorf("ProjectAccessTokens.ListProjectAccessTokens returned error: %v", err)
 	}
-	time3, err := time.Parse(time.RFC3339, "2021-03-10T21:11:47.271Z")
-	if err != nil {
-		t.Errorf("GroupAccessTokens.ListGroupAccessTokens returned error: %v", err)
-	}
 
 	want := []*ProjectAccessToken{
 		{
@@ -57,7 +53,6 @@ func TestListProjectAccessTokens(t *testing.T) {
 			Name:        "token 10",
 			Scopes:      []string{"api", "read_api", "read_repository", "write_repository"},
 			CreatedAt:   &time1,
-			LastUsedAt:  &time3,
 			Active:      true,
 			Revoked:     false,
 			AccessLevel: AccessLevelValue(40),
@@ -79,41 +74,6 @@ func TestListProjectAccessTokens(t *testing.T) {
 	}
 }
 
-func TestGetProjectAccessToken(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/projects/1/access_tokens/1", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		mustWriteHTTPResponse(t, w, "testdata/get_project_access_token.json")
-	})
-
-	projectAccessToken, _, err := client.ProjectAccessTokens.GetProjectAccessToken(1, 1)
-	if err != nil {
-		t.Errorf("ProjectAccessTokens.GetProjectAccessToken returned error: %v", err)
-	}
-
-	createdAt, err := time.Parse(time.RFC3339, "2021-03-09T21:11:47.271Z")
-	if err != nil {
-		t.Errorf("ProjectAccessTokens.GetProjectAccessToken returned error: %v", err)
-	}
-
-	want := &ProjectAccessToken{
-		ID:          1,
-		UserID:      2453,
-		Name:        "token 10",
-		Scopes:      []string{"api", "read_api", "read_repository", "write_repository"},
-		CreatedAt:   &createdAt,
-		Active:      true,
-		Revoked:     false,
-		AccessLevel: AccessLevelValue(40),
-	}
-
-	if !reflect.DeepEqual(want, projectAccessToken) {
-		t.Errorf("ProjectAccessTokens.GetProjectAccessToken returned %+v, want %+v", projectAccessToken, want)
-	}
-}
-
 func TestCreateProjectAccessToken(t *testing.T) {
 	mux, server, client := setup(t)
 	defer teardown(server)
@@ -150,7 +110,7 @@ func TestCreateProjectAccessToken(t *testing.T) {
 	}
 }
 
-func TestRevokeProjectAccessToken(t *testing.T) {
+func TestDeleteProjectAccessToken(t *testing.T) {
 	mux, server, client := setup(t)
 	defer teardown(server)
 
@@ -158,8 +118,8 @@ func TestRevokeProjectAccessToken(t *testing.T) {
 		testMethod(t, r, http.MethodDelete)
 	})
 
-	_, err := client.ProjectAccessTokens.RevokeProjectAccessToken("1", 1234)
+	_, err := client.ProjectAccessTokens.DeleteProjectAccessToken("1", 1234)
 	if err != nil {
-		t.Errorf("ProjectAccessTokens.RevokeProjectAccessToken returned error: %v", err)
+		t.Errorf("ProjectAccessTokens.DeleteProjectAccessToken returned error: %v", err)
 	}
 }
diff --git a/project_import_export_test.go b/project_import_export_test.go
index 188355e..723eefd 100644
--- a/project_import_export_test.go
+++ b/project_import_export_test.go
@@ -144,7 +144,8 @@ func TestProjectImportExportService_ImportFile(t *testing.T) {
 			  "path": "api-project",
 			  "path_with_namespace": "root/api-project",
 			  "import_status": "scheduled",
-			  "correlation_id": "mezklWso3Za"
+			  "correlation_id": "mezklWso3Za",
+			  "failed_relations": []
 			}
 		`)
 	})
@@ -157,7 +158,6 @@ func TestProjectImportExportService_ImportFile(t *testing.T) {
 		Path:              "api-project",
 		PathWithNamespace: "root/api-project",
 		ImportStatus:      "scheduled",
-		CorrelationID:     "mezklWso3Za",
 	}
 
 	file := bytes.NewBufferString("dummy")
@@ -187,7 +187,16 @@ func TestProjectImportExportService_ImportStatus(t *testing.T) {
 			  "path": "gitlab-test",
 			  "path_with_namespace": "gitlab-org/gitlab-test",
 			  "import_status": "started",
-			  "correlation_id": "mezklWso3Za"
+			  "correlation_id": "mezklWso3Za",
+			  "failed_relations": [
+				{
+				  "id": 42,
+				  "exception_class": "RuntimeError",
+				  "exception_message": "A failure occurred",
+				  "source": "custom error context",
+				  "relation_name": "merge_requests"
+				}
+			  ]
 			}
 		`)
 	})
@@ -200,7 +209,6 @@ func TestProjectImportExportService_ImportStatus(t *testing.T) {
 		Path:              "gitlab-test",
 		PathWithNamespace: "gitlab-org/gitlab-test",
 		ImportStatus:      "started",
-		CorrelationID:     "mezklWso3Za",
 	}
 
 	es, resp, err := client.ProjectImportExport.ImportStatus(1, nil)
diff --git a/project_mirror_test.go b/project_mirror_test.go
index 8ee1913..ccd46fd 100644
--- a/project_mirror_test.go
+++ b/project_mirror_test.go
@@ -60,41 +60,6 @@ func TestProjectMirrorService_ListProjectMirror(t *testing.T) {
 	require.Equal(t, http.StatusNotFound, resp.StatusCode)
 }
 
-func TestProjectMirrorService_GetProjectMirror(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/projects/42/remote_mirrors/1", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		fmt.Fprintf(w, `
-			{
-				"enabled": true,
-				"id": 101486,
-				"last_error": null,
-				"only_protected_branches": true,
-				"keep_divergent_refs": true,
-				"update_status": "finished",
-				"url": "https://*****:*****@gitlab.com/gitlab-org/security/gitlab.git"
-			}
-		`)
-	})
-
-	want := &ProjectMirror{
-		Enabled:               true,
-		ID:                    101486,
-		LastError:             "",
-		OnlyProtectedBranches: true,
-		KeepDivergentRefs:     true,
-		UpdateStatus:          "finished",
-		URL:                   "https://*****:*****@gitlab.com/gitlab-org/security/gitlab.git",
-	}
-
-	pm, resp, err := client.ProjectMirrors.GetProjectMirror(42, 1, nil)
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-	require.Equal(t, want, pm)
-}
-
 func TestProjectMirrorService_AddProjectMirror(t *testing.T) {
 	mux, server, client := setup(t)
 	defer teardown(server)
diff --git a/repository_files_test.go b/repository_files_test.go
index 81e7953..72f2bc9 100644
--- a/repository_files_test.go
+++ b/repository_files_test.go
@@ -23,6 +23,7 @@ func TestRepositoryFilesService_GetFile(t *testing.T) {
 			  "encoding": "base64",
 			  "content": "IyA9PSBTY2hlbWEgSW5mb3...",
 			  "content_sha256": "4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481",
+			  "execute_filemode": true,
 			  "ref": "master",
 			  "blob_id": "79f7bbd25901e8334750839545a9bd021f0e4c83",
 			  "commit_id": "d5a3ff139356ce33e37e73add446f16869741b50",
@@ -32,16 +33,17 @@ func TestRepositoryFilesService_GetFile(t *testing.T) {
 	})
 
 	want := &File{
-		FileName:     "key.rb",
-		FilePath:     "app/models/key.rb",
-		Size:         1476,
-		Encoding:     "base64",
-		Content:      "IyA9PSBTY2hlbWEgSW5mb3...",
-		Ref:          "master",
-		BlobID:       "79f7bbd25901e8334750839545a9bd021f0e4c83",
-		CommitID:     "d5a3ff139356ce33e37e73add446f16869741b50",
-		SHA256:       "4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481",
-		LastCommitID: "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
+		FileName:        "key.rb",
+		FilePath:        "app/models/key.rb",
+		Size:            1476,
+		Encoding:        "base64",
+		Content:         "IyA9PSBTY2hlbWEgSW5mb3...",
+		ExecuteFilemode: true,
+		Ref:             "master",
+		BlobID:          "79f7bbd25901e8334750839545a9bd021f0e4c83",
+		CommitID:        "d5a3ff139356ce33e37e73add446f16869741b50",
+		SHA256:          "4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481",
+		LastCommitID:    "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
 	}
 
 	f, resp, err := client.RepositoryFiles.GetFile(13083, "app%2Fmodels%2Fkey%2Erb?ref=master", nil)
@@ -77,21 +79,23 @@ func TestRepositoryFilesService_GetFileMetaData(t *testing.T) {
 		w.Header().Set("X-Gitlab-Encoding", "base64")
 		w.Header().Set("X-Gitlab-File-Name", "key.rb")
 		w.Header().Set("X-Gitlab-File-Path", "app/models/key.rb")
+		w.Header().Set("X-Gitlab-Execute-Filemode", "true")
 		w.Header().Set("X-Gitlab-Last-Commit-Id", "570e7b2abdd848b95f2f578043fc23bd6f6fd24d")
 		w.Header().Set("X-Gitlab-Ref", "master")
 		w.Header().Set("X-Gitlab-Size", "1476")
 	})
 
 	want := &File{
-		FileName:     "key.rb",
-		FilePath:     "app/models/key.rb",
-		Size:         1476,
-		Encoding:     "base64",
-		Ref:          "master",
-		BlobID:       "79f7bbd25901e8334750839545a9bd021f0e4c83",
-		CommitID:     "d5a3ff139356ce33e37e73add446f16869741b50",
-		SHA256:       "4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481",
-		LastCommitID: "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
+		FileName:        "key.rb",
+		FilePath:        "app/models/key.rb",
+		Size:            1476,
+		Encoding:        "base64",
+		ExecuteFilemode: true,
+		Ref:             "master",
+		BlobID:          "79f7bbd25901e8334750839545a9bd021f0e4c83",
+		CommitID:        "d5a3ff139356ce33e37e73add446f16869741b50",
+		SHA256:          "4c294617b60715c1d218e61164a3abd4808a4284cbc30e6728a01ad9aada4481",
+		LastCommitID:    "570e7b2abdd848b95f2f578043fc23bd6f6fd24d",
 	}
 
 	f, resp, err := client.RepositoryFiles.GetFileMetaData(13083, "app%2Fmodels%2Fkey%2Erb?ref=master", nil)
@@ -267,6 +271,11 @@ func TestRepositoryFilesService_CreateFile(t *testing.T) {
 	require.NotNil(t, resp)
 	require.Equal(t, want, fi)
 
+	fi, resp, err = client.RepositoryFiles.CreateFile(13083, "app%2Fproject%2Erb", &CreateFileOptions{ExecuteFilemode: Bool(true)})
+	require.NoError(t, err)
+	require.NotNil(t, resp)
+	require.Equal(t, want, fi)
+
 	fi, resp, err = client.RepositoryFiles.CreateFile(13083.01, "app%2Fproject%2Erb", nil)
 	require.EqualError(t, err, "invalid ID type 13083.01, the ID must be an int or a string")
 	require.Nil(t, resp)
@@ -307,6 +316,11 @@ func TestRepositoryFilesService_UpdateFile(t *testing.T) {
 	require.NotNil(t, resp)
 	require.Equal(t, want, fi)
 
+	fi, resp, err = client.RepositoryFiles.UpdateFile(13083, "app%2Fproject%2Erb", &UpdateFileOptions{ExecuteFilemode: Bool(true)})
+	require.NoError(t, err)
+	require.NotNil(t, resp)
+	require.Equal(t, want, fi)
+
 	fi, resp, err = client.RepositoryFiles.UpdateFile(13083.01, "app%2Fproject%2Erb", nil)
 	require.EqualError(t, err, "invalid ID type 13083.01, the ID must be an int or a string")
 	require.Nil(t, resp)
diff --git a/runners_test.go b/runners_test.go
index 8eb59b3..606c586 100644
--- a/runners_test.go
+++ b/runners_test.go
@@ -395,123 +395,3 @@ func TestVerifyRegisteredRunner(t *testing.T) {
 		t.Errorf("Runners.VerifyRegisteredRunner returned returned status code  %+v, want %+v", resp.StatusCode, want)
 	}
 }
-
-func TestResetInstanceRunnerRegistrationToken(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/runners/reset_registration_token", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprint(w, `{
-			"token": "6337ff461c94fd3fa32ba3b1ff4125"
-		}`)
-	})
-
-	token, resp, err := client.Runners.ResetInstanceRunnerRegistrationToken(nil)
-	if err != nil {
-		t.Fatalf("Runners.ResetInstanceRunnerRegistrationToken returns an error: %v", err)
-	}
-
-	want := &RunnerRegistrationToken{
-		Token: String("6337ff461c94fd3fa32ba3b1ff4125"),
-	}
-	if !reflect.DeepEqual(want, token) {
-		t.Errorf("Runners.ResetInstanceRunnerRegistrationToken returned %+v, want %+v", token, want)
-	}
-
-	wantCode := 201
-	if !reflect.DeepEqual(wantCode, resp.StatusCode) {
-		t.Errorf("Runners.ResetInstanceRunnerRegistrationToken returned returned status code  %+v, want %+v", resp.StatusCode, wantCode)
-	}
-}
-
-func TestResetGroupRunnerRegistrationToken(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/groups/foobar/runners/reset_registration_token", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprint(w, `{
-			"token": "6337ff461c94fd3fa32ba3b1ff4125"
-		}`)
-	})
-
-	token, resp, err := client.Runners.ResetGroupRunnerRegistrationToken("foobar", nil)
-	if err != nil {
-		t.Fatalf("Runners.ResetGroupRunnerRegistrationToken returns an error: %v", err)
-	}
-
-	want := &RunnerRegistrationToken{
-		Token: String("6337ff461c94fd3fa32ba3b1ff4125"),
-	}
-	if !reflect.DeepEqual(want, token) {
-		t.Errorf("Runners.ResetGroupRunnerRegistrationToken returned %+v, want %+v", token, want)
-	}
-
-	wantCode := 201
-	if !reflect.DeepEqual(wantCode, resp.StatusCode) {
-		t.Errorf("Runners.ResetGroupRunnerRegistrationToken returned returned status code  %+v, want %+v", resp.StatusCode, wantCode)
-	}
-}
-
-func TestResetProjectRunnerRegistrationToken(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/projects/9/runners/reset_registration_token", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprint(w, `{
-			"token": "6337ff461c94fd3fa32ba3b1ff4125"
-		}`)
-	})
-
-	token, resp, err := client.Runners.ResetProjectRunnerRegistrationToken("9", nil)
-	if err != nil {
-		t.Fatalf("Runners.ResetProjectRunnerRegistrationToken returns an error: %v", err)
-	}
-
-	want := &RunnerRegistrationToken{
-		Token: String("6337ff461c94fd3fa32ba3b1ff4125"),
-	}
-	if !reflect.DeepEqual(want, token) {
-		t.Errorf("Runners.ResetProjectRunnerRegistrationToken returned %+v, want %+v", token, want)
-	}
-
-	wantCode := 201
-	if !reflect.DeepEqual(wantCode, resp.StatusCode) {
-		t.Errorf("Runners.ResetProjectRunnerRegistrationToken returned returned status code  %+v, want %+v", resp.StatusCode, wantCode)
-	}
-}
-
-func TestResetRunnerAuthenticationToken(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/runners/42/reset_authentication_token", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		w.WriteHeader(http.StatusCreated)
-		fmt.Fprint(w, `{
-			"token": "6337ff461c94fd3fa32ba3b1ff4125"
-		}`)
-	})
-
-	token, resp, err := client.Runners.ResetRunnerAuthenticationToken(42, nil)
-	if err != nil {
-		t.Fatalf("Runners.ResetRunnerAuthenticationToken returns an error: %v", err)
-	}
-
-	want := &RunnerAuthenticationToken{
-		Token: String("6337ff461c94fd3fa32ba3b1ff4125"),
-	}
-	if !reflect.DeepEqual(want, token) {
-		t.Errorf("Runners.ResetRunnerAuthenticationToken returned %+v, want %+v", token, want)
-	}
-
-	wantCode := 201
-	if !reflect.DeepEqual(wantCode, resp.StatusCode) {
-		t.Errorf("Runners.ResetRunnerAuthenticationToken returned returned status code  %+v, want %+v", resp.StatusCode, wantCode)
-	}
-}
diff --git a/services_test.go b/services_test.go
index 864964a..02d4187 100644
--- a/services_test.go
+++ b/services_test.go
@@ -575,55 +575,3 @@ func TestDeleteSlackSlashCommandsService(t *testing.T) {
 		t.Fatalf("Services.DeleteSlackSlashCommandsService returns an error: %v", err)
 	}
 }
-
-func TestGetMattermostSlashCommandsService(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/projects/1/services/mattermost-slash-commands", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		fmt.Fprint(w, `{"id":1}`)
-	})
-	want := &MattermostSlashCommandsService{Service: Service{ID: 1}}
-
-	service, _, err := client.Services.GetMattermostSlashCommandsService(1)
-	if err != nil {
-		t.Fatalf("Services.mattermost-slash-commands returns an error: %v", err)
-	}
-	if !reflect.DeepEqual(want, service) {
-		t.Errorf("Services.mattermost-slash-commands returned %+v, want %+v", service, want)
-	}
-}
-
-func TestSetMattermostSlashCommandsService(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/projects/1/services/mattermost-slash-commands", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPut)
-	})
-
-	opt := &SetMattermostSlashCommandsServiceOptions{
-		Token:    String("token"),
-		Username: String("username"),
-	}
-
-	_, err := client.Services.SetMattermostSlashCommandsService(1, opt)
-	if err != nil {
-		t.Fatalf("Services.SetMattermostSlashCommandsService returns an error: %v", err)
-	}
-}
-
-func TestDeleteMattermostSlashCommandsService(t *testing.T) {
-	mux, server, client := setup(t)
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/projects/1/services/mattermost-slash-commands", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodDelete)
-	})
-
-	_, err := client.Services.DeleteMattermostSlashCommandsService(1)
-	if err != nil {
-		t.Fatalf("Services.DeleteMattermostSlashCommandsService returns an error: %v", err)
-	}
-}
diff --git a/testdata/create_group_access_token.json b/testdata/create_group_access_token.json
index 25ccaf4..d645538 100644
--- a/testdata/create_group_access_token.json
+++ b/testdata/create_group_access_token.json
@@ -3,7 +3,12 @@
   "name": "token 10",
   "revoked": false,
   "created_at": "2021-03-09T21:11:47.271Z",
-  "scopes": ["api", "read_api", "read_repository", "write_repository"],
+  "scopes": [
+      "api",
+      "read_api",
+      "read_repository",
+      "write_repository"
+  ],
   "user_id": 2453,
   "active": true,
   "expires_at": null,
diff --git a/testdata/create_project_access_token.json b/testdata/create_project_access_token.json
index 25ccaf4..0a3768b 100644
--- a/testdata/create_project_access_token.json
+++ b/testdata/create_project_access_token.json
@@ -1,12 +1,17 @@
 {
-  "id": 1876,
-  "name": "token 10",
-  "revoked": false,
-  "created_at": "2021-03-09T21:11:47.271Z",
-  "scopes": ["api", "read_api", "read_repository", "write_repository"],
-  "user_id": 2453,
-  "active": true,
-  "expires_at": null,
-  "token": "2UsevZE1x1ZdFZW4MNzH",
-  "access_level": 40
+    "id": 1876,
+    "name": "token 10",
+    "revoked": false,
+    "created_at": "2021-03-09T21:11:47.271Z",
+    "scopes": [
+        "api",
+        "read_api",
+        "read_repository",
+        "write_repository"
+    ],
+    "user_id": 2453,
+    "active": true,
+    "expires_at": null,
+    "token": "2UsevZE1x1ZdFZW4MNzH",
+    "access_level": 40
 }
diff --git a/testdata/get_branch.json b/testdata/get_branch.json
index da508fd..18c2f96 100644
--- a/testdata/get_branch.json
+++ b/testdata/get_branch.json
@@ -1,22 +1,24 @@
 {
-  "name": "master",
-  "merged": false,
-  "protected": true,
-  "default": true,
-  "developers_can_push": false,
-  "developers_can_merge": false,
-  "can_push": true,
-  "commit": {
-    "author_email": "john@example.com",
-    "author_name": "John Smith",
-    "authored_date": "2012-06-27T05:51:39.000Z",
-    "committed_date": "2012-06-28T03:44:20.000Z",
-    "committer_email": "john@example.com",
-    "committer_name": "John Smith",
-    "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
-    "short_id": "7b5c3cc",
-    "title": "add projects API",
-    "message": "add projects API",
-    "parent_ids": ["4ad91d3c1144c406e50c7b33bae684bd6837faf8"]
-  }
+    "name": "master",
+    "merged": false,
+    "protected": true,
+    "default": true,
+    "developers_can_push": false,
+    "developers_can_merge": false,
+    "can_push": true,
+    "commit": {
+        "author_email": "john@example.com",
+        "author_name": "John Smith",
+        "authored_date": "2012-06-27T05:51:39.000Z",
+        "committed_date": "2012-06-28T03:44:20.000Z",
+        "committer_email": "john@example.com",
+        "committer_name": "John Smith",
+        "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
+        "short_id": "7b5c3cc",
+        "title": "add projects API",
+        "message": "add projects API",
+        "parent_ids": [
+            "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
+        ]
+    }
 }
diff --git a/testdata/get_commit.json b/testdata/get_commit.json
index 6791ce4..ec96cdc 100644
--- a/testdata/get_commit.json
+++ b/testdata/get_commit.json
@@ -1,27 +1,29 @@
 {
-  "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",
-  "short_id": "6104942438c",
-  "title": "Sanitize for network graph",
-  "author_name": "randx",
-  "author_email": "dmitriy.zaporozhets@gmail.com",
-  "committer_name": "Dmitriy",
-  "committer_email": "dmitriy.zaporozhets@gmail.com",
-  "message": "Sanitize for network graph",
-  "parent_ids": ["ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba"],
-  "last_pipeline": {
-    "id": 8,
-    "ref": "master",
-    "sha": "2dc6aa325a317eda67812f05600bdf0fcdc70ab0",
-    "status": "created",
-    "web_url": "https://gitlab.com/gitlab-org/gitlab-ce/pipelines/54268416",
-    "created_at": "2019-11-04T15:38:53.154Z",
-    "updated_at": "2019-11-04T15:39:03.935Z"
-  },
-  "stats": {
-    "additions": 15,
-    "deletions": 10,
-    "total": 25
-  },
-  "status": "running",
-  "project_id": 13083
+    "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",
+    "short_id": "6104942438c",
+    "title": "Sanitize for network graph",
+    "author_name": "randx",
+    "author_email": "dmitriy.zaporozhets@gmail.com",
+    "committer_name": "Dmitriy",
+    "committer_email": "dmitriy.zaporozhets@gmail.com",
+    "message": "Sanitize for network graph",
+    "parent_ids": [
+        "ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba"
+    ],
+    "last_pipeline": {
+        "id": 8,
+        "ref": "master",
+        "sha": "2dc6aa325a317eda67812f05600bdf0fcdc70ab0",
+        "status": "created",
+        "web_url": "https://gitlab.com/gitlab-org/gitlab-ce/pipelines/54268416",
+        "created_at": "2019-11-04T15:38:53.154Z",
+        "updated_at": "2019-11-04T15:39:03.935Z"
+    },
+    "stats": {
+        "additions": 15,
+        "deletions": 10,
+        "total": 25
+    },
+    "status": "running",
+    "project_id": 13083
 }
diff --git a/testdata/get_group_access_token.json b/testdata/get_group_access_token.json
deleted file mode 100644
index f99a55b..0000000
--- a/testdata/get_group_access_token.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "id": 1,
-  "name": "token 10",
-  "revoked": false,
-  "created_at": "2021-03-09T21:11:47.271Z",
-  "scopes": ["api", "read_api", "read_repository", "write_repository"],
-  "user_id": 2453,
-  "active": true,
-  "expires_at": null,
-  "access_level": 40
-}
diff --git a/testdata/get_merge_requests.json b/testdata/get_merge_requests.json
index c485630..1ff1ef2 100644
--- a/testdata/get_merge_requests.json
+++ b/testdata/get_merge_requests.json
@@ -1,8 +1,7 @@
 [
   {
     "id": 35385049,
-    "iid": 15442,
-    "project_id": 278964,
+    "iid": 15442, "project_id": 278964,
     "title": "Draft: Use structured logging for DB load balancer",
     "description": "## What does this MR do?\r\n\r\n<!--\r\n\r\nDescribe in detail what your merge request does and why.\r\n\r\nAre there any risks involved with the proposed change? What additional\r\ntest coverage is introduced to offset the risk?\r\n\r\nPlease keep this description up-to-date with any discussion that takes\r\nplace so that reviewers can understand your intent. This is especially\r\nimportant if they didn't participate in the discussion.\r\n\r\n-->\r\n\r\nRelates to https://gitlab.com/gitlab-org/gitlab-ee/issues/13547 and https://gitlab.com/gitlab-org/gitlab-ee/issues/13548\r\n\r\n## Does this MR meet the acceptance criteria?\r\n\r\n### Conformity\r\n\r\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \r\n- [ ] [Documentation created/updated](https://docs.gitlab.com/ee/development/documentation/feature-change-workflow.html) or [follow-up review issue created](https://gitlab.com/gitlab-org/gitlab-ce/issues/new?issuable_template=Doc%20Review)\r\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\r\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\r\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\r\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\r\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\r\n\r\n### Performance and Testing\r\n\r\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\r\nWhat additional test coverage or changes to tests will be needed?\r\nWill it require cross-browser testing?\r\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\r\n\r\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\r\n\r\n- [ ] [Review and add/update tests for this feature/bug](https://docs.gitlab.com/ee/development/testing_guide/index.html). Consider [all test levels](https://docs.gitlab.com/ee/development/testing_guide/testing_levels.html). See the [Test Planning Process](https://about.gitlab.com/handbook/engineering/quality/guidelines/test-engineering/).\r\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\r\n\r\n### Security\r\n\r\nIf this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in [the security review guidelines](https://about.gitlab.com/handbook/engineering/security/#when-to-request-a-security-review):\r\n\r\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\r\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\r\n- [ ] Security reports checked/validated by a reviewer from the AppSec team",
     "state": "opened",
@@ -44,14 +43,14 @@
       }
     ],
     "reviewers": [
-      {
+        {
         "id": 2535118,
         "name": "Thong Kuah",
         "username": "tkuah",
         "state": "active",
         "avatar_url": "https://secure.gravatar.com/avatar/f7b51bdd49a4914d29504d7ff4c3f7b9?s=80&d=identicon",
         "web_url": "https://gitlab.com/tkuah"
-      }
+        }
     ],
     "source_project_id": 278964,
     "target_project_id": 278964,
@@ -500,7 +499,10 @@
     ],
     "source_project_id": 278964,
     "target_project_id": 278964,
-    "labels": ["Community contribution", "devops::plan"],
+    "labels": [
+      "Community contribution",
+      "devops::plan"
+    ],
     "work_in_progress": false,
     "milestone": {
       "id": 693521,
@@ -688,7 +690,11 @@
     ],
     "source_project_id": 11495811,
     "target_project_id": 278964,
-    "labels": ["devops::verify", "feature", "group::continuous integration"],
+    "labels": [
+      "devops::verify",
+      "feature",
+      "group::continuous integration"
+    ],
     "work_in_progress": false,
     "milestone": {
       "id": 693521,
@@ -957,7 +963,11 @@
     "assignees": [],
     "source_project_id": 278964,
     "target_project_id": 278964,
-    "labels": ["QA", "Quality", "backstage"],
+    "labels": [
+      "QA",
+      "Quality",
+      "backstage"
+    ],
     "work_in_progress": false,
     "milestone": {
       "id": 693521,
@@ -1237,7 +1247,10 @@
     ],
     "source_project_id": 278964,
     "target_project_id": 278964,
-    "labels": ["internationalization", "master:broken"],
+    "labels": [
+      "internationalization",
+      "master:broken"
+    ],
     "work_in_progress": false,
     "milestone": null,
     "merge_when_pipeline_succeeds": true,
@@ -1404,7 +1417,11 @@
     ],
     "source_project_id": 278964,
     "target_project_id": 278964,
-    "labels": ["backend", "devops::release", "feature"],
+    "labels": [
+      "backend",
+      "devops::release",
+      "feature"
+    ],
     "work_in_progress": false,
     "milestone": {
       "id": 731038,
@@ -1730,7 +1747,11 @@
     ],
     "source_project_id": 278964,
     "target_project_id": 278964,
-    "labels": ["bug", "devops::secure", "group::static analysis"],
+    "labels": [
+      "bug",
+      "devops::secure",
+      "group::static analysis"
+    ],
     "work_in_progress": false,
     "milestone": {
       "id": 731038,
diff --git a/testdata/get_pipeline_testreport.json b/testdata/get_pipeline_testreport.json
index 8409b1a..f7a4fc2 100644
--- a/testdata/get_pipeline_testreport.json
+++ b/testdata/get_pipeline_testreport.json
@@ -1,85 +1,85 @@
 {
-  "total_time": 61.502,
-  "total_count": 9,
-  "success_count": 5,
-  "failed_count": 0,
-  "skipped_count": 0,
-  "error_count": 4,
-  "test_suites": [
-    {
-      "name": "Failing",
-      "total_time": 60.494,
-      "total_count": 8,
-      "success_count": 4,
-      "failed_count": 0,
-      "skipped_count": 0,
-      "error_count": 4,
-      "suite_error": null,
-      "test_cases": [
+    "total_time": 61.502,
+    "total_count": 9,
+    "success_count": 5,
+    "failed_count": 0,
+    "skipped_count": 0,
+    "error_count": 4,
+    "test_suites": [
         {
-          "status": "error",
-          "name": "Error testcase 1",
-          "classname": "MyClassOne",
-          "file": "/path/file.ext",
-          "execution_time": 19.987,
-          "system_output": "output message\n\noutput message 2",
-          "stack_trace": "java.lang.Exception: Stack trace\nat java.base/java.lang.Thread.dumpStack(Thread.java:1383)",
-          "attachment_url": "http://foo.bar",
-          "recent_failures": {
-            "count": 10,
-            "base_branch": "master"
-          }
+            "name": "Failing",
+            "total_time": 60.494,
+            "total_count": 8,
+            "success_count": 4,
+            "failed_count": 0,
+            "skipped_count": 0,
+            "error_count": 4,
+            "suite_error": null,
+            "test_cases": [
+                {
+                    "status": "error",
+                    "name": "Error testcase 1",
+                    "classname": "MyClassOne",
+                    "file": "/path/file.ext",
+                    "execution_time": 19.987,
+                    "system_output": "output message\n\noutput message 2",
+                    "stack_trace": "java.lang.Exception: Stack trace\nat java.base/java.lang.Thread.dumpStack(Thread.java:1383)",
+                    "attachment_url": "http://foo.bar",
+                    "recent_failures": {
+                        "count": 10,
+                        "base_branch": "master"
+                    }
+                },
+                {
+                    "status": "error",
+                    "name": "Error testcase 2",
+                    "classname": "MyClass",
+                    "file": null,
+                    "execution_time": 19.984,
+                    "system_output": null,
+                    "stack_trace": null,
+                    "attachment_url": null,
+                    "recent_failures": null
+                },
+                {
+                    "status": "error",
+                    "name": "Error testcase 3",
+                    "classname": "MyClass",
+                    "file": null,
+                    "execution_time": 0.0,
+                    "system_output": "Undefined message"
+                },
+                {
+                    "status": "success",
+                    "name": "Succes full testcase",
+                    "classname": "MyClass",
+                    "file": null,
+                    "execution_time": 19.7799999999999985,
+                    "system_output": null,
+                    "stack_trace": null
+                }
+            ]
         },
         {
-          "status": "error",
-          "name": "Error testcase 2",
-          "classname": "MyClass",
-          "file": null,
-          "execution_time": 19.984,
-          "system_output": null,
-          "stack_trace": null,
-          "attachment_url": null,
-          "recent_failures": null
-        },
-        {
-          "status": "error",
-          "name": "Error testcase 3",
-          "classname": "MyClass",
-          "file": null,
-          "execution_time": 0.0,
-          "system_output": "Undefined message"
-        },
-        {
-          "status": "success",
-          "name": "Succes full testcase",
-          "classname": "MyClass",
-          "file": null,
-          "execution_time": 19.7799999999999985,
-          "system_output": null,
-          "stack_trace": null
-        }
-      ]
-    },
-    {
-      "name": "Succes suite",
-      "total_time": 1.008,
-      "total_count": 1,
-      "success_count": 1,
-      "failed_count": 0,
-      "skipped_count": 0,
-      "error_count": 0,
-      "suite_error": null,
-      "test_cases": [
-        {
-          "status": "success",
-          "name": "Succesfull testcase",
-          "classname": "MyClass",
-          "file": null,
-          "execution_time": 1.008,
-          "system_output": null,
-          "stack_trace": null
+            "name": "Succes suite",
+            "total_time": 1.008,
+            "total_count": 1,
+            "success_count": 1,
+            "failed_count": 0,
+            "skipped_count": 0,
+            "error_count": 0,
+            "suite_error": null,
+            "test_cases": [
+                {
+                    "status": "success",
+                    "name": "Succesfull testcase",
+                    "classname": "MyClass",
+                    "file": null,
+                    "execution_time": 1.008,
+                    "system_output": null,
+                    "stack_trace": null
+                }
+            ]
         }
-      ]
-    }
-  ]
-}
+    ]
+}
\ No newline at end of file
diff --git a/testdata/get_project_access_token.json b/testdata/get_project_access_token.json
deleted file mode 100644
index f99a55b..0000000
--- a/testdata/get_project_access_token.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "id": 1,
-  "name": "token 10",
-  "revoked": false,
-  "created_at": "2021-03-09T21:11:47.271Z",
-  "scopes": ["api", "read_api", "read_repository", "write_repository"],
-  "user_id": 2453,
-  "active": true,
-  "expires_at": null,
-  "access_level": 40
-}
diff --git a/testdata/get_signature.json b/testdata/get_signature.json
index f9b82d0..ea47169 100644
--- a/testdata/get_signature.json
+++ b/testdata/get_signature.json
@@ -1,8 +1,8 @@
 {
-  "gpg_key_id": 7977,
-  "gpg_key_primary_keyid": "627C5F589F467F17",
-  "gpg_key_user_name": "Dmitriy Zaporozhets",
-  "gpg_key_user_email": "dmitriy.zaporozhets@gmail.com",
-  "verification_status": "verified",
-  "gpg_key_subkey_id": null
+    "gpg_key_id": 7977,
+    "gpg_key_primary_keyid": "627C5F589F467F17",
+    "gpg_key_user_name": "Dmitriy Zaporozhets",
+    "gpg_key_user_email": "dmitriy.zaporozhets@gmail.com",
+    "verification_status": "verified",
+    "gpg_key_subkey_id": null
 }
diff --git a/testdata/get_user_admin.json b/testdata/get_user_admin.json
index 6a474be..29d5a42 100644
--- a/testdata/get_user_admin.json
+++ b/testdata/get_user_admin.json
@@ -25,7 +25,9 @@
   "projects_limit": 100,
   "current_sign_in_at": "2012-06-02T06:36:55Z",
   "note": "DMCA Request: 2018-11-05 | DMCA Violation | Abuse | https://gitlab.zendesk.com/agent/tickets/123",
-  "identities": [{ "provider": "github", "extern_uid": "2435223452345" }],
+  "identities": [
+    {"provider": "github", "extern_uid": "2435223452345"}
+  ],
   "can_create_group": true,
   "can_create_project": true,
   "two_factor_enabled": true,
@@ -36,6 +38,5 @@
   "last_sign_in_ip": "2001:db8::68",
   "plan": "gold",
   "trial": true,
-  "sign_in_count": 1337,
-  "namespace_id": 42
+  "sign_in_count": 1337
 }
diff --git a/testdata/issue_move.json b/testdata/issue_move.json
index 2a3fc96..c298ccd 100644
--- a/testdata/issue_move.json
+++ b/testdata/issue_move.json
@@ -14,16 +14,14 @@
   "downvotes": 0,
   "merge_requests_count": 0,
   "milestone": null,
-  "assignees": [
-    {
-      "name": "Miss Monserrate Beier",
-      "username": "axel.block",
-      "id": 12,
-      "state": "active",
-      "avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
-      "web_url": "https://gitlab.example.com/axel.block"
-    }
-  ],
+  "assignees": [{
+    "name": "Miss Monserrate Beier",
+    "username": "axel.block",
+    "id": 12,
+    "state": "active",
+    "avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
+    "web_url": "https://gitlab.example.com/axel.block"
+  }],
   "assignee": {
     "name": "Miss Monserrate Beier",
     "username": "axel.block",
@@ -56,8 +54,8 @@
     "award_emoji": "http://example.com/api/v4/projects/1/issues/2/award_emoji",
     "project": "http://example.com/api/v4/projects/1"
   },
-  "task_completion_status": {
-    "count": 0,
-    "completed_count": 0
+  "task_completion_status":{
+    "count":0,
+    "completed_count":0
   }
 }
diff --git a/testdata/list_branches.json b/testdata/list_branches.json
index 2a9e309..ec149e5 100644
--- a/testdata/list_branches.json
+++ b/testdata/list_branches.json
@@ -19,7 +19,9 @@
       "short_id": "7b5c3cc",
       "title": "add projects API",
       "message": "add projects API",
-      "parent_ids": ["4ad91d3c1144c406e50c7b33bae684bd6837faf8"]
+      "parent_ids": [
+        "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
+      ]
     }
   }
-]
+]
\ No newline at end of file
diff --git a/testdata/list_geo_nodes_status.json b/testdata/list_geo_nodes_status.json
index f2a9a17..5b5e555 100644
--- a/testdata/list_geo_nodes_status.json
+++ b/testdata/list_geo_nodes_status.json
@@ -159,3 +159,4 @@
     "uploads_synced_in_percentage": "0.00%"
   }
 ]
+
diff --git a/testdata/list_group_access_tokens.json b/testdata/list_group_access_tokens.json
index 118c915..99327ba 100644
--- a/testdata/list_group_access_tokens.json
+++ b/testdata/list_group_access_tokens.json
@@ -1,25 +1,34 @@
 [
   {
-    "id": 1876,
-    "name": "token 10",
-    "revoked": false,
-    "created_at": "2021-03-09T21:11:47.271Z",
-    "last_used_at": "2021-03-10T21:11:47.271Z",
-    "scopes": ["api", "read_api", "read_repository", "write_repository"],
-    "user_id": 2453,
-    "active": true,
-    "expires_at": null,
-    "access_level": 40
+      "id": 1876,
+      "name": "token 10",
+      "revoked": false,
+      "created_at": "2021-03-09T21:11:47.271Z",
+      "scopes": [
+          "api",
+          "read_api",
+          "read_repository",
+          "write_repository"
+      ],
+      "user_id": 2453,
+      "active": true,
+      "expires_at": null,
+      "access_level": 40
   },
   {
-    "id": 1877,
-    "name": "token 8",
-    "revoked": false,
-    "created_at": "2021-03-09T21:11:47.340Z",
-    "scopes": ["api", "read_api", "read_repository", "write_repository"],
-    "user_id": 2456,
-    "active": true,
-    "expires_at": null,
-    "access_level": 30
+      "id": 1877,
+      "name": "token 8",
+      "revoked": false,
+      "created_at": "2021-03-09T21:11:47.340Z",
+      "scopes": [
+          "api",
+          "read_api",
+          "read_repository",
+          "write_repository"
+      ],
+      "user_id": 2456,
+      "active": true,
+      "expires_at": null,
+      "access_level": 30
   }
 ]
diff --git a/testdata/list_group_iterations.json b/testdata/list_group_iterations.json
index c848fd4..9d032c0 100644
--- a/testdata/list_group_iterations.json
+++ b/testdata/list_group_iterations.json
@@ -1,16 +1,16 @@
 [
-  {
-    "id": 53,
-    "iid": 13,
-    "sequence": 1,
-    "group_id": 5,
-    "title": "Iteration II",
-    "description": "Ipsum Lorem ipsum",
-    "state": 2,
-    "created_at": "2020-01-27T05:07:12.573Z",
-    "updated_at": "2020-01-27T05:07:12.573Z",
-    "due_date": "2020-02-01",
-    "start_date": "2020-02-14",
-    "web_url": "http://gitlab.example.com/groups/my-group/-/iterations/13"
-  }
+    {
+      "id": 53,
+      "iid": 13,
+      "sequence": 1,
+      "group_id": 5,
+      "title": "Iteration II",
+      "description": "Ipsum Lorem ipsum",
+      "state": 2,
+      "created_at": "2020-01-27T05:07:12.573Z",
+      "updated_at": "2020-01-27T05:07:12.573Z",
+      "due_date": "2020-02-01",
+      "start_date": "2020-02-14",
+      "web_url": "http://gitlab.example.com/groups/my-group/-/iterations/13"
+    }
 ]
diff --git a/testdata/list_personal_access_tokens_with_user_filter.json b/testdata/list_personal_access_tokens_with_user_filter.json
deleted file mode 100644
index 2278678..0000000
--- a/testdata/list_personal_access_tokens_with_user_filter.json
+++ /dev/null
@@ -1,29 +0,0 @@
-[
-  {
-    "id": 1,
-    "name": "test 1",
-    "revoked": true,
-    "created_at": "2020-02-20T14:58:56.238Z",
-    "scopes": [
-      "api"
-    ],
-    "user_id": 1,
-    "last_used_at": "2021-04-20T16:31:39.105Z",
-    "active": false,
-    "expires_at": "2022-03-21"
-  },
-  {
-    "id": 2,
-    "name": "test 2",
-    "revoked": false,
-    "created_at": "2022-03-20T03:56:18.968Z",
-    "scopes": [
-      "api",
-      "read_user"
-    ],
-    "user_id": 1,
-    "last_used_at": null,
-    "active": false,
-    "expires_at": "2022-03-20"
-  }
-]
diff --git a/testdata/list_personal_access_tokens_without_user_filter.json b/testdata/list_personal_access_tokens_without_user_filter.json
deleted file mode 100644
index 9dfa4c7..0000000
--- a/testdata/list_personal_access_tokens_without_user_filter.json
+++ /dev/null
@@ -1,24 +0,0 @@
-[
-  {
-    "id": 1,
-    "name": "test 1",
-    "revoked": true,
-    "created_at": "2020-02-20T14:58:56.238Z",
-    "scopes": ["api"],
-    "user_id": 1,
-    "last_used_at": "2021-04-20T16:31:39.105Z",
-    "active": false,
-    "expires_at": "2022-03-21"
-  },
-  {
-    "id": 2,
-    "name": "test 2",
-    "revoked": false,
-    "created_at": "2022-03-20T03:56:18.968Z",
-    "scopes": ["api", "read_user"],
-    "user_id": 2,
-    "last_used_at": null,
-    "active": false,
-    "expires_at": "2022-03-20"
-  }
-]
diff --git a/testdata/list_project_access_tokens.json b/testdata/list_project_access_tokens.json
index 118c915..d1e382a 100644
--- a/testdata/list_project_access_tokens.json
+++ b/testdata/list_project_access_tokens.json
@@ -1,25 +1,34 @@
 [
-  {
-    "id": 1876,
-    "name": "token 10",
-    "revoked": false,
-    "created_at": "2021-03-09T21:11:47.271Z",
-    "last_used_at": "2021-03-10T21:11:47.271Z",
-    "scopes": ["api", "read_api", "read_repository", "write_repository"],
-    "user_id": 2453,
-    "active": true,
-    "expires_at": null,
-    "access_level": 40
-  },
-  {
-    "id": 1877,
-    "name": "token 8",
-    "revoked": false,
-    "created_at": "2021-03-09T21:11:47.340Z",
-    "scopes": ["api", "read_api", "read_repository", "write_repository"],
-    "user_id": 2456,
-    "active": true,
-    "expires_at": null,
-    "access_level": 30
-  }
+    {
+        "id": 1876,
+        "name": "token 10",
+        "revoked": false,
+        "created_at": "2021-03-09T21:11:47.271Z",
+        "scopes": [
+            "api",
+            "read_api",
+            "read_repository",
+            "write_repository"
+        ],
+        "user_id": 2453,
+        "active": true,
+        "expires_at": null,
+        "access_level": 40
+    },
+    {
+        "id": 1877,
+        "name": "token 8",
+        "revoked": false,
+        "created_at": "2021-03-09T21:11:47.340Z",
+        "scopes": [
+            "api",
+            "read_api",
+            "read_repository",
+            "write_repository"
+        ],
+        "user_id": 2456,
+        "active": true,
+        "expires_at": null,
+        "access_level": 30
+    }
 ]
diff --git a/testdata/systemhooks/tag_push.json b/testdata/systemhooks/tag_push.json
index eec5a27..9606410 100644
--- a/testdata/systemhooks/tag_push.json
+++ b/testdata/systemhooks/tag_push.json
@@ -8,30 +8,30 @@
   "user_name": "John Smith",
   "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
   "project_id": 1,
-  "project": {
-    "name": "Example",
-    "description": "",
-    "web_url": "http://example.com/jsmith/example",
-    "avatar_url": null,
-    "git_ssh_url": "git@example.com:jsmith/example.git",
-    "git_http_url": "http://example.com/jsmith/example.git",
-    "namespace": "Jsmith",
-    "visibility_level": 0,
-    "path_with_namespace": "jsmith/example",
-    "default_branch": "master",
-    "homepage": "http://example.com/jsmith/example",
-    "url": "git@example.com:jsmith/example.git",
-    "ssh_url": "git@example.com:jsmith/example.git",
-    "http_url": "http://example.com/jsmith/example.git"
+  "project":{
+    "name":"Example",
+    "description":"",
+    "web_url":"http://example.com/jsmith/example",
+    "avatar_url":null,
+    "git_ssh_url":"git@example.com:jsmith/example.git",
+    "git_http_url":"http://example.com/jsmith/example.git",
+    "namespace":"Jsmith",
+    "visibility_level":0,
+    "path_with_namespace":"jsmith/example",
+    "default_branch":"master",
+    "homepage":"http://example.com/jsmith/example",
+    "url":"git@example.com:jsmith/example.git",
+    "ssh_url":"git@example.com:jsmith/example.git",
+    "http_url":"http://example.com/jsmith/example.git"
   },
-  "repository": {
+  "repository":{
     "name": "Example",
     "url": "ssh://git@example.com/jsmith/example.git",
     "description": "",
     "homepage": "http://example.com/jsmith/example",
-    "git_http_url": "http://example.com/jsmith/example.git",
-    "git_ssh_url": "git@example.com:jsmith/example.git",
-    "visibility_level": 0
+    "git_http_url":"http://example.com/jsmith/example.git",
+    "git_ssh_url":"git@example.com:jsmith/example.git",
+    "visibility_level":0
   },
   "commits": [],
   "total_commits_count": 0
diff --git a/testdata/webhooks/issue.json b/testdata/webhooks/issue.json
index 7a1eabe..2bcb715 100644
--- a/testdata/webhooks/issue.json
+++ b/testdata/webhooks/issue.json
@@ -9,20 +9,20 @@
   },
   "project": {
     "id": 1,
-    "name": "Gitlab Test",
-    "description": "Aut reprehenderit ut est.",
-    "web_url": "http://example.com/gitlabhq/gitlab-test",
-    "avatar_url": null,
-    "git_ssh_url": "git@example.com:gitlabhq/gitlab-test.git",
-    "git_http_url": "http://example.com/gitlabhq/gitlab-test.git",
-    "namespace": "GitlabHQ",
-    "visibility_level": 20,
-    "path_with_namespace": "gitlabhq/gitlab-test",
-    "default_branch": "master",
-    "homepage": "http://example.com/gitlabhq/gitlab-test",
-    "url": "http://example.com/gitlabhq/gitlab-test.git",
-    "ssh_url": "git@example.com:gitlabhq/gitlab-test.git",
-    "http_url": "http://example.com/gitlabhq/gitlab-test.git"
+    "name":"Gitlab Test",
+    "description":"Aut reprehenderit ut est.",
+    "web_url":"http://example.com/gitlabhq/gitlab-test",
+    "avatar_url":null,
+    "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+    "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
+    "namespace":"GitlabHQ",
+    "visibility_level":20,
+    "path_with_namespace":"gitlabhq/gitlab-test",
+    "default_branch":"master",
+    "homepage":"http://example.com/gitlabhq/gitlab-test",
+    "url":"http://example.com/gitlabhq/gitlab-test.git",
+    "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+    "http_url":"http://example.com/gitlabhq/gitlab-test.git"
   },
   "repository": {
     "name": "Gitlab Test",
@@ -48,15 +48,13 @@
     "url": "http://example.com/diaspora/issues/23",
     "action": "open"
   },
-  "assignees": [
-    {
-      "id": 3,
-      "name": "User1",
-      "username": "user1",
-      "email": "test.user1@example.com",
-      "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
-    }
-  ],
+  "assignees": [{
+    "id": 3,
+    "name": "User1",
+    "username": "user1",
+    "email": "test.user1@example.com",
+    "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
+  }],
   "assignee": {
     "id": 3,
     "name": "User1",
@@ -64,20 +62,18 @@
     "email": "test.user1@example.com",
     "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
   },
-  "labels": [
-    {
-      "id": 206,
-      "title": "API",
-      "color": "#ffffff",
-      "project_id": 14,
-      "created_at": "2013-12-03T17:15:43Z",
-      "updated_at": "2013-12-03T17:15:43Z",
-      "template": false,
-      "description": "API related issues",
-      "type": "ProjectLabel",
-      "group_id": 41
-    }
-  ],
+  "labels": [{
+    "id": 206,
+    "title": "API",
+    "color": "#ffffff",
+    "project_id": 14,
+    "created_at": "2013-12-03T17:15:43Z",
+    "updated_at": "2013-12-03T17:15:43Z",
+    "template": false,
+    "description": "API related issues",
+    "type": "ProjectLabel",
+    "group_id": 41
+  }],
   "changes": {
     "updated_by_id": {
       "previous": null,
@@ -88,34 +84,30 @@
       "current": "2017-09-15 16:52:00 UTC"
     },
     "labels": {
-      "previous": [
-        {
-          "id": 206,
-          "title": "API",
-          "color": "#ffffff",
-          "project_id": 14,
-          "created_at": "2013-12-03T17:15:43Z",
-          "updated_at": "2013-12-03T17:15:43Z",
-          "template": false,
-          "description": "API related issues",
-          "type": "ProjectLabel",
-          "group_id": 41
-        }
-      ],
-      "current": [
-        {
-          "id": 205,
-          "title": "Platform",
-          "color": "#123123",
-          "project_id": 14,
-          "created_at": "2013-12-03T17:15:43Z",
-          "updated_at": "2013-12-03T17:15:43Z",
-          "template": false,
-          "description": "Platform related issues",
-          "type": "ProjectLabel",
-          "group_id": 41
-        }
-      ]
+      "previous": [{
+        "id": 206,
+        "title": "API",
+        "color": "#ffffff",
+        "project_id": 14,
+        "created_at": "2013-12-03T17:15:43Z",
+        "updated_at": "2013-12-03T17:15:43Z",
+        "template": false,
+        "description": "API related issues",
+        "type": "ProjectLabel",
+        "group_id": 41
+      }],
+      "current": [{
+        "id": 205,
+        "title": "Platform",
+        "color": "#123123",
+        "project_id": 14,
+        "created_at": "2013-12-03T17:15:43Z",
+        "updated_at": "2013-12-03T17:15:43Z",
+        "template": false,
+        "description": "Platform related issues",
+        "type": "ProjectLabel",
+        "group_id": 41
+      }]
     },
     "description": {
       "previous": null,
diff --git a/testdata/webhooks/note_commit.json b/testdata/webhooks/note_commit.json
index cc268b3..5ac2b09 100644
--- a/testdata/webhooks/note_commit.json
+++ b/testdata/webhooks/note_commit.json
@@ -8,24 +8,24 @@
     "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
   },
   "project_id": 5,
-  "project": {
+  "project":{
     "id": 5,
-    "name": "Gitlab Test",
-    "description": "Aut reprehenderit ut est.",
-    "web_url": "http://example.com/gitlabhq/gitlab-test",
-    "avatar_url": null,
-    "git_ssh_url": "git@example.com:gitlabhq/gitlab-test.git",
-    "git_http_url": "http://example.com/gitlabhq/gitlab-test.git",
-    "namespace": "GitlabHQ",
-    "visibility_level": 20,
-    "path_with_namespace": "gitlabhq/gitlab-test",
-    "default_branch": "master",
-    "homepage": "http://example.com/gitlabhq/gitlab-test",
-    "url": "http://example.com/gitlabhq/gitlab-test.git",
-    "ssh_url": "git@example.com:gitlabhq/gitlab-test.git",
-    "http_url": "http://example.com/gitlabhq/gitlab-test.git"
+    "name":"Gitlab Test",
+    "description":"Aut reprehenderit ut est.",
+    "web_url":"http://example.com/gitlabhq/gitlab-test",
+    "avatar_url":null,
+    "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+    "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
+    "namespace":"GitlabHQ",
+    "visibility_level":20,
+    "path_with_namespace":"gitlabhq/gitlab-test",
+    "default_branch":"master",
+    "homepage":"http://example.com/gitlabhq/gitlab-test",
+    "url":"http://example.com/gitlabhq/gitlab-test.git",
+    "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+    "http_url":"http://example.com/gitlabhq/gitlab-test.git"
   },
-  "repository": {
+  "repository":{
     "name": "Gitlab Test",
     "url": "http://example.com/gitlab-org/gitlab-test.git",
     "description": "Aut reprehenderit ut est.",
@@ -39,7 +39,7 @@
     "created_at": "2015-05-17 18:08:09 UTC",
     "updated_at": "2015-05-17 18:08:09 UTC",
     "project_id": 5,
-    "attachment": null,
+    "attachment":null,
     "line_code": "bec9703f7a456cd2b4ab5fb3220ae016e3e394e3_0_1",
     "commit_id": "cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
     "noteable_id": null,
diff --git a/testdata/webhooks/note_issue.json b/testdata/webhooks/note_issue.json
index 2844ae5..6995310 100644
--- a/testdata/webhooks/note_issue.json
+++ b/testdata/webhooks/note_issue.json
@@ -8,28 +8,28 @@
     "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
   },
   "project_id": 5,
-  "project": {
+  "project":{
     "id": 5,
-    "name": "Gitlab Test",
-    "description": "Aut reprehenderit ut est.",
-    "web_url": "http://example.com/gitlab-org/gitlab-test",
-    "avatar_url": null,
-    "git_ssh_url": "git@example.com:gitlab-org/gitlab-test.git",
-    "git_http_url": "http://example.com/gitlab-org/gitlab-test.git",
-    "namespace": "Gitlab Org",
-    "visibility_level": 10,
-    "path_with_namespace": "gitlab-org/gitlab-test",
-    "default_branch": "master",
-    "homepage": "http://example.com/gitlab-org/gitlab-test",
-    "url": "http://example.com/gitlab-org/gitlab-test.git",
-    "ssh_url": "git@example.com:gitlab-org/gitlab-test.git",
-    "http_url": "http://example.com/gitlab-org/gitlab-test.git"
+    "name":"Gitlab Test",
+    "description":"Aut reprehenderit ut est.",
+    "web_url":"http://example.com/gitlab-org/gitlab-test",
+    "avatar_url":null,
+    "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+    "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+    "namespace":"Gitlab Org",
+    "visibility_level":10,
+    "path_with_namespace":"gitlab-org/gitlab-test",
+    "default_branch":"master",
+    "homepage":"http://example.com/gitlab-org/gitlab-test",
+    "url":"http://example.com/gitlab-org/gitlab-test.git",
+    "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+    "http_url":"http://example.com/gitlab-org/gitlab-test.git"
   },
-  "repository": {
-    "name": "diaspora",
-    "url": "git@example.com:mike/diaspora.git",
-    "description": "",
-    "homepage": "http://example.com/mike/diaspora"
+  "repository":{
+    "name":"diaspora",
+    "url":"git@example.com:mike/diaspora.git",
+    "description":"",
+    "homepage":"http://example.com/mike/diaspora"
   },
   "object_attributes": {
     "id": 1241,
diff --git a/testdata/webhooks/note_merge_request.json b/testdata/webhooks/note_merge_request.json
index ab1df99..f2d4121 100644
--- a/testdata/webhooks/note_merge_request.json
+++ b/testdata/webhooks/note_merge_request.json
@@ -8,24 +8,24 @@
     "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
   },
   "project_id": 5,
-  "project": {
+  "project":{
     "id": 5,
-    "name": "Gitlab Test",
-    "description": "Aut reprehenderit ut est.",
-    "web_url": "http://example.com/gitlab-org/gitlab-test",
-    "avatar_url": null,
-    "git_ssh_url": "git@example.com:gitlab-org/gitlab-test.git",
-    "git_http_url": "http://example.com/gitlab-org/gitlab-test.git",
-    "namespace": "Gitlab Org",
-    "visibility_level": 10,
-    "path_with_namespace": "gitlab-org/gitlab-test",
-    "default_branch": "master",
-    "homepage": "http://example.com/gitlab-org/gitlab-test",
-    "url": "http://example.com/gitlab-org/gitlab-test.git",
-    "ssh_url": "git@example.com:gitlab-org/gitlab-test.git",
-    "http_url": "http://example.com/gitlab-org/gitlab-test.git"
+    "name":"Gitlab Test",
+    "description":"Aut reprehenderit ut est.",
+    "web_url":"http://example.com/gitlab-org/gitlab-test",
+    "avatar_url":null,
+    "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+    "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+    "namespace":"Gitlab Org",
+    "visibility_level":10,
+    "path_with_namespace":"gitlab-org/gitlab-test",
+    "default_branch":"master",
+    "homepage":"http://example.com/gitlab-org/gitlab-test",
+    "url":"http://example.com/gitlab-org/gitlab-test.git",
+    "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+    "http_url":"http://example.com/gitlab-org/gitlab-test.git"
   },
-  "repository": {
+  "repository":{
     "name": "Gitlab Test",
     "url": "http://localhost/gitlab-org/gitlab-test.git",
     "description": "Aut reprehenderit ut est.",
@@ -65,37 +65,37 @@
     "iid": 1,
     "description": "Et voluptas corrupti assumenda temporibus. Architecto cum animi eveniet amet asperiores. Vitae numquam voluptate est natus sit et ad id.",
     "position": 0,
-    "source": {
-      "name": "Gitlab Test",
-      "description": "Aut reprehenderit ut est.",
-      "web_url": "http://example.com/gitlab-org/gitlab-test",
-      "avatar_url": null,
-      "git_ssh_url": "git@example.com:gitlab-org/gitlab-test.git",
-      "git_http_url": "http://example.com/gitlab-org/gitlab-test.git",
-      "namespace": "Gitlab Org",
-      "visibility_level": 10,
-      "path_with_namespace": "gitlab-org/gitlab-test",
-      "default_branch": "master",
-      "homepage": "http://example.com/gitlab-org/gitlab-test",
-      "url": "http://example.com/gitlab-org/gitlab-test.git",
-      "ssh_url": "git@example.com:gitlab-org/gitlab-test.git",
-      "http_url": "http://example.com/gitlab-org/gitlab-test.git"
+    "source":{
+      "name":"Gitlab Test",
+      "description":"Aut reprehenderit ut est.",
+      "web_url":"http://example.com/gitlab-org/gitlab-test",
+      "avatar_url":null,
+      "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+      "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+      "namespace":"Gitlab Org",
+      "visibility_level":10,
+      "path_with_namespace":"gitlab-org/gitlab-test",
+      "default_branch":"master",
+      "homepage":"http://example.com/gitlab-org/gitlab-test",
+      "url":"http://example.com/gitlab-org/gitlab-test.git",
+      "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+      "http_url":"http://example.com/gitlab-org/gitlab-test.git"
     },
     "target": {
-      "name": "Gitlab Test",
-      "description": "Aut reprehenderit ut est.",
-      "web_url": "http://example.com/gitlab-org/gitlab-test",
-      "avatar_url": null,
-      "git_ssh_url": "git@example.com:gitlab-org/gitlab-test.git",
-      "git_http_url": "http://example.com/gitlab-org/gitlab-test.git",
-      "namespace": "Gitlab Org",
-      "visibility_level": 10,
-      "path_with_namespace": "gitlab-org/gitlab-test",
-      "default_branch": "master",
-      "homepage": "http://example.com/gitlab-org/gitlab-test",
-      "url": "http://example.com/gitlab-org/gitlab-test.git",
-      "ssh_url": "git@example.com:gitlab-org/gitlab-test.git",
-      "http_url": "http://example.com/gitlab-org/gitlab-test.git"
+      "name":"Gitlab Test",
+      "description":"Aut reprehenderit ut est.",
+      "web_url":"http://example.com/gitlab-org/gitlab-test",
+      "avatar_url":null,
+      "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+      "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+      "namespace":"Gitlab Org",
+      "visibility_level":10,
+      "path_with_namespace":"gitlab-org/gitlab-test",
+      "default_branch":"master",
+      "homepage":"http://example.com/gitlab-org/gitlab-test",
+      "url":"http://example.com/gitlab-org/gitlab-test.git",
+      "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+      "http_url":"http://example.com/gitlab-org/gitlab-test.git"
     },
     "last_commit": {
       "id": "562e173be03b8ff2efb05345d12df18815438a4b",
diff --git a/testdata/webhooks/pipeline.json b/testdata/webhooks/pipeline.json
index 5a23d6a..53b95af 100644
--- a/testdata/webhooks/pipeline.json
+++ b/testdata/webhooks/pipeline.json
@@ -1,215 +1,222 @@
 {
   "object_kind": "pipeline",
-  "object_attributes": {
-    "id": 31,
-    "ref": "master",
-    "tag": false,
-    "sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
-    "before_sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
-    "source": "merge_request_event",
-    "status": "success",
-    "detailed_status": "passed",
-    "stages": ["build", "test", "deploy"],
-    "created_at": "2016-08-12 15:23:28 UTC",
-    "finished_at": "2016-08-12 15:26:29 UTC",
-    "duration": 63,
-    "queued_duration": 12,
-    "variables": [
-      {
-        "key": "NESTOR_PROD_ENVIRONMENT",
-        "value": "us-west-1"
-      }
-    ]
+  "object_attributes":{
+     "id": 31,
+     "ref": "master",
+     "tag": false,
+     "sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
+     "before_sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
+     "source": "merge_request_event",
+     "status": "success",
+     "detailed_status": "passed",
+     "stages":[
+        "build",
+        "test",
+        "deploy"
+     ],
+     "created_at": "2016-08-12 15:23:28 UTC",
+     "finished_at": "2016-08-12 15:26:29 UTC",
+     "duration": 63,
+     "queued_duration": 12,
+     "variables": [
+       {
+         "key": "NESTOR_PROD_ENVIRONMENT",
+         "value": "us-west-1"
+       }
+     ]
   },
-  "merge_request": {
-    "id": 1,
-    "iid": 1,
-    "title": "Test",
-    "source_branch": "test",
-    "source_project_id": 1,
-    "target_branch": "master",
-    "target_project_id": 1,
-    "state": "opened",
-    "merge_status": "can_be_merged",
-    "url": "http://192.168.64.1:3005/gitlab-org/gitlab-test/merge_requests/1"
+   "merge_request": {
+     "id": 1,
+     "iid": 1,
+     "title": "Test",
+     "source_branch": "test",
+     "source_project_id": 1,
+     "target_branch": "master",
+     "target_project_id": 1,
+     "state": "opened",
+     "merge_status": "can_be_merged",
+     "url": "http://192.168.64.1:3005/gitlab-org/gitlab-test/merge_requests/1"
   },
-  "user": {
-    "id": 42,
-    "name": "User1",
-    "username": "user1",
-    "email": "user1@example.com",
-    "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
+  "user":{
+     "id": 42,
+     "name": "User1",
+     "username": "user1",
+     "email": "user1@example.com",
+     "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
   },
-  "project": {
-    "id": 1,
-    "name": "Gitlab Test",
-    "description": "Atque in sunt eos similique dolores voluptatem.",
-    "web_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
-    "avatar_url": null,
-    "git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
-    "git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
-    "namespace": "Gitlab Org",
-    "visibility_level": 20,
-    "path_with_namespace": "gitlab-org/gitlab-test",
-    "default_branch": "master"
+  "project":{
+     "id": 1,
+     "name": "Gitlab Test",
+     "description": "Atque in sunt eos similique dolores voluptatem.",
+     "web_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
+     "avatar_url": null,
+     "git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
+     "git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
+     "namespace": "Gitlab Org",
+     "visibility_level": 20,
+     "path_with_namespace": "gitlab-org/gitlab-test",
+     "default_branch": "master"
   },
-  "commit": {
-    "id": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
-    "message": "test\n",
-    "timestamp": "2016-08-12T17:23:21+02:00",
-    "url": "http://example.com/gitlab-org/gitlab-test/commit/bcbb5ec396a2c0f828686f14fac9b80b780504f2",
-    "author": {
-      "name": "User",
-      "email": "user@gitlab.com"
-    }
+  "commit":{
+     "id": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
+     "message": "test\n",
+     "timestamp": "2016-08-12T17:23:21+02:00",
+     "url": "http://example.com/gitlab-org/gitlab-test/commit/bcbb5ec396a2c0f828686f14fac9b80b780504f2",
+     "author":{
+        "name": "User",
+        "email": "user@gitlab.com"
+     }
   },
-  "builds": [
-    {
-      "id": 380,
-      "stage": "deploy",
-      "name": "production",
-      "status": "skipped",
-      "created_at": "2016-08-12 15:23:28 UTC",
-      "started_at": null,
-      "finished_at": null,
-      "when": "manual",
-      "manual": true,
-      "allow_failure": true,
-      "user": {
-        "id": 42,
-        "name": "User1",
-        "username": "user1",
-        "email": "user1@example.com",
-        "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
-      },
-      "runner": {
-        "id": 42,
-        "description": "shared-runners-manager-1.gitlab.com",
-        "runner_type": "instance_type",
-        "active": true,
-        "is_shared": true,
-        "tags": ["docker", "gce"]
-      },
-      "artifacts_file": {
-        "filename": null,
-        "size": null
-      },
-      "environment": {
+  "builds":[
+     {
+        "id": 380,
+        "stage": "deploy",
         "name": "production",
-        "action": "start",
-        "deployment_tier": "production"
-      }
-    },
-    {
-      "id": 377,
-      "stage": "test",
-      "name": "test-image",
-      "status": "success",
-      "created_at": "2016-08-12 15:23:28 UTC",
-      "started_at": "2016-08-12 15:26:12 UTC",
-      "finished_at": null,
-      "when": "on_success",
-      "manual": false,
-      "allow_failure": false,
-      "user": {
-        "id": 42,
-        "name": "User1",
-        "username": "user1",
-        "email": "user1@example.com",
-        "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
-      },
-      "runner": {
-        "id": 380987,
-        "description": "shared-runners-manager-6.gitlab.com",
-        "active": true,
-        "is_shared": true
-      },
-      "artifacts_file": {
-        "filename": null,
-        "size": null
-      }
-    },
-    {
-      "id": 378,
-      "stage": "test",
-      "name": "test-build",
-      "status": "success",
-      "created_at": "2016-08-12 15:23:28 UTC",
-      "started_at": "2016-08-12 15:26:12 UTC",
-      "finished_at": "2016-08-12 15:26:29 UTC",
-      "when": "on_success",
-      "manual": false,
-      "allow_failure": false,
-      "user": {
-        "id": 42,
-        "name": "User1",
-        "username": "user1",
-        "email": "user1@example.com",
-        "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
-      },
-      "runner": {
-        "id": 380987,
-        "description": "shared-runners-manager-6.gitlab.com",
-        "active": true,
-        "is_shared": true
-      },
-      "artifacts_file": {
-        "filename": null,
-        "size": null
-      }
-    },
-    {
-      "id": 376,
-      "stage": "build",
-      "name": "build-image",
-      "status": "success",
-      "created_at": "2016-08-12 15:23:28 UTC",
-      "started_at": "2016-08-12 15:24:56 UTC",
-      "finished_at": "2016-08-12 15:25:26 UTC",
-      "when": "on_success",
-      "manual": false,
-      "allow_failure": false,
-      "user": {
-        "id": 42,
-        "name": "User1",
-        "username": "user1",
-        "email": "user1@example.com",
-        "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
-      },
-      "runner": {
-        "id": 380987,
-        "description": "shared-runners-manager-6.gitlab.com",
-        "active": true,
-        "is_shared": true
-      },
-      "artifacts_file": {
-        "filename": null,
-        "size": null
-      }
-    },
-    {
-      "id": 379,
-      "stage": "deploy",
-      "name": "staging",
-      "status": "created",
-      "created_at": "2016-08-12 15:23:28 UTC",
-      "started_at": null,
-      "finished_at": null,
-      "when": "on_success",
-      "manual": false,
-      "allow_failure": false,
-      "user": {
-        "id": 42,
-        "name": "User1",
-        "username": "user1",
-        "email": "user1@example.com",
-        "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
-      },
-      "runner": null,
-      "artifacts_file": {
-        "filename": null,
-        "size": null
-      }
-    }
+        "status": "skipped",
+        "created_at": "2016-08-12 15:23:28 UTC",
+        "started_at": null,
+        "finished_at": null,
+        "when": "manual",
+        "manual": true,
+        "allow_failure": true,
+        "user":{
+           "id": 42,
+           "name": "User1",
+           "username": "user1",
+           "email": "user1@example.com",
+           "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
+        },
+        "runner": {
+            "id": 42,
+            "description": "shared-runners-manager-1.gitlab.com",
+            "runner_type": "instance_type",
+            "active": true,
+            "is_shared": true,
+            "tags": [
+                "docker",
+                "gce"
+            ]
+        },
+        "artifacts_file":{
+           "filename": null,
+           "size": null
+        },
+        "environment": {
+             "name": "production",
+             "action": "start",
+             "deployment_tier": "production"
+         }
+     },
+     {
+        "id": 377,
+        "stage": "test",
+        "name": "test-image",
+        "status": "success",
+        "created_at": "2016-08-12 15:23:28 UTC",
+        "started_at": "2016-08-12 15:26:12 UTC",
+        "finished_at": null,
+        "when": "on_success",
+        "manual": false,
+        "allow_failure": false,
+        "user":{
+           "id": 42,
+           "name": "User1",
+           "username": "user1",
+           "email": "user1@example.com",
+           "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
+        },
+        "runner": {
+           "id":380987,
+           "description":"shared-runners-manager-6.gitlab.com",
+           "active":true,
+           "is_shared":true
+        },
+        "artifacts_file":{
+           "filename": null,
+           "size": null
+        }
+     },
+     {
+        "id": 378,
+        "stage": "test",
+        "name": "test-build",
+        "status": "success",
+        "created_at": "2016-08-12 15:23:28 UTC",
+        "started_at": "2016-08-12 15:26:12 UTC",
+        "finished_at": "2016-08-12 15:26:29 UTC",
+        "when": "on_success",
+        "manual": false,
+        "allow_failure": false,
+        "user":{
+           "id": 42,
+           "name": "User1",
+           "username": "user1",
+           "email": "user1@example.com",
+           "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
+        },
+        "runner": {
+           "id":380987,
+           "description":"shared-runners-manager-6.gitlab.com",
+           "active":true,
+           "is_shared":true
+        },
+        "artifacts_file":{
+           "filename": null,
+           "size": null
+        }
+     },
+     {
+        "id": 376,
+        "stage": "build",
+        "name": "build-image",
+        "status": "success",
+        "created_at": "2016-08-12 15:23:28 UTC",
+        "started_at": "2016-08-12 15:24:56 UTC",
+        "finished_at": "2016-08-12 15:25:26 UTC",
+        "when": "on_success",
+        "manual": false,
+        "allow_failure": false,
+        "user":{
+           "id": 42,
+           "name": "User1",
+           "username": "user1",
+           "email": "user1@example.com",
+           "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
+        },
+        "runner": {
+           "id":380987,
+           "description":"shared-runners-manager-6.gitlab.com",
+           "active":true,
+           "is_shared":true
+        },
+        "artifacts_file":{
+           "filename": null,
+           "size": null
+        }
+     },
+     {
+        "id": 379,
+        "stage": "deploy",
+        "name": "staging",
+        "status": "created",
+        "created_at": "2016-08-12 15:23:28 UTC",
+        "started_at": null,
+        "finished_at": null,
+        "when": "on_success",
+        "manual": false,
+        "allow_failure": false,
+        "user":{
+           "id": 42,
+           "name": "User1",
+           "username": "user1",
+           "email": "user1@example.com",
+           "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon"
+        },
+        "runner": null,
+        "artifacts_file":{
+           "filename": null,
+           "size": null
+        }
+     }
   ]
 }
diff --git a/testdata/webhooks/push.json b/testdata/webhooks/push.json
index 3470046..4483bab 100644
--- a/testdata/webhooks/push.json
+++ b/testdata/webhooks/push.json
@@ -10,31 +10,31 @@
   "user_email": "john@example.com",
   "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
   "project_id": 15,
-  "project": {
+  "project":{
     "id": 15,
-    "name": "Diaspora",
-    "description": "",
-    "web_url": "http://example.com/mike/diaspora",
-    "avatar_url": null,
-    "git_ssh_url": "git@example.com:mike/diaspora.git",
-    "git_http_url": "http://example.com/mike/diaspora.git",
-    "namespace": "Mike",
-    "visibility_level": 0,
-    "path_with_namespace": "mike/diaspora",
-    "default_branch": "master",
-    "homepage": "http://example.com/mike/diaspora",
-    "url": "git@example.com:mike/diaspora.git",
-    "ssh_url": "git@example.com:mike/diaspora.git",
-    "http_url": "http://example.com/mike/diaspora.git"
+    "name":"Diaspora",
+    "description":"",
+    "web_url":"http://example.com/mike/diaspora",
+    "avatar_url":null,
+    "git_ssh_url":"git@example.com:mike/diaspora.git",
+    "git_http_url":"http://example.com/mike/diaspora.git",
+    "namespace":"Mike",
+    "visibility_level":0,
+    "path_with_namespace":"mike/diaspora",
+    "default_branch":"master",
+    "homepage":"http://example.com/mike/diaspora",
+    "url":"git@example.com:mike/diaspora.git",
+    "ssh_url":"git@example.com:mike/diaspora.git",
+    "http_url":"http://example.com/mike/diaspora.git"
   },
-  "repository": {
+  "repository":{
     "name": "Diaspora",
     "url": "git@example.com:mike/diaspora.git",
     "description": "",
     "homepage": "http://example.com/mike/diaspora",
-    "git_http_url": "http://example.com/mike/diaspora.git",
-    "git_ssh_url": "git@example.com:mike/diaspora.git",
-    "visibility_level": 0
+    "git_http_url":"http://example.com/mike/diaspora.git",
+    "git_ssh_url":"git@example.com:mike/diaspora.git",
+    "visibility_level":0
   },
   "commits": [
     {
diff --git a/testdata/webhooks/release.json b/testdata/webhooks/release.json
index 22646a2..db9af97 100644
--- a/testdata/webhooks/release.json
+++ b/testdata/webhooks/release.json
@@ -7,64 +7,64 @@
   "tag": "1.0.0",
   "object_kind": "release",
   "project": {
-    "id": 327622,
-    "name": "Project Name",
-    "description": "",
-    "web_url": "http://example.com/exm-namespace/example-project",
-    "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
-    "git_ssh_url": "git@gitlab.com:exm-namespace/example-project.git",
-    "git_http_url": "http://example.com/exm-namespace/example-project.git",
-    "namespace": "exm-namespace",
-    "visibility_level": 0,
-    "path_with_namespace": "exm-namespace/example-project",
-    "default_branch": "master",
-    "ci_config_path": "",
-    "homepage": "http://example.com/exm-namespace/example-project",
-    "url": "git@gitlab.com:exm-namespace/example-project.git",
-    "ssh_url": "git@gitlab.com:exm-namespace/example-project.git",
-    "http_url": "http://example.com/exm-namespace/example-project.git"
+	"id": 327622,
+	"name": "Project Name",
+	"description": "",
+	"web_url": "http://example.com/exm-namespace/example-project",
+	"avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+	"git_ssh_url": "git@gitlab.com:exm-namespace/example-project.git",
+	"git_http_url": "http://example.com/exm-namespace/example-project.git",
+	"namespace": "exm-namespace",
+	"visibility_level": 0,
+	"path_with_namespace": "exm-namespace/example-project",
+	"default_branch": "master",
+	"ci_config_path": "",
+	"homepage": "http://example.com/exm-namespace/example-project",
+	"url": "git@gitlab.com:exm-namespace/example-project.git",
+	"ssh_url": "git@gitlab.com:exm-namespace/example-project.git",
+	"http_url": "http://example.com/exm-namespace/example-project.git"
   },
   "url": "http://example.com/exm-namespace/example-project/-/releases/1.0.0",
   "action": "create",
   "assets": {
-    "count": 4,
-    "links": [
-      {
-        "id": 1,
-        "external": true,
-        "link_type": "other",
-        "name": "Changelog",
-        "url": "https://example.net/changelog"
-      }
-    ],
-    "sources": [
-      {
-        "format": "zip",
-        "url": "http://example.com/exm-namespace/example-project/-/archive/1.0.0/example-project-1.0.0.zip"
-      },
-      {
-        "format": "tar.gz",
-        "url": "http://example.com/exm-namespace/example-project/-/archive/1.0.0/example-project-1.0.0.tar.gz"
-      },
-      {
-        "format": "tar.bz2",
-        "url": "http://example.com/exm-namespace/example-project/-/archive/1.0.0/example-project-1.0.0.tar.bz2"
-      },
-      {
-        "format": "tar",
-        "url": "http://example.com/exm-namespace/example-project/-/archive/1.0.0/example-project-1.0.0.tar"
-      }
-    ]
+	"count": 4,
+	"links": [
+	  {
+		"id": 1,
+		"external": true,
+		"link_type": "other",
+		"name": "Changelog",
+		"url": "https://example.net/changelog"
+	  }
+	],
+	"sources": [
+	  {
+		"format": "zip",
+		"url": "http://example.com/exm-namespace/example-project/-/archive/1.0.0/example-project-1.0.0.zip"
+	  },
+	  {
+		"format": "tar.gz",
+		"url": "http://example.com/exm-namespace/example-project/-/archive/1.0.0/example-project-1.0.0.tar.gz"
+	  },
+	  {
+		"format": "tar.bz2",
+		"url": "http://example.com/exm-namespace/example-project/-/archive/1.0.0/example-project-1.0.0.tar.bz2"
+	  },
+	  {
+		"format": "tar",
+		"url": "http://example.com/exm-namespace/example-project/-/archive/1.0.0/example-project-1.0.0.tar"
+	  }
+	]
   },
   "commit": {
-    "id": "2626dbdb936782b5c54816b1c6d45b1279303c6d",
-    "message": "Merge branch 'example-branch' into 'master'\n\nCheck in this test",
-    "title": "Merge branch 'example-branch' into 'master'",
-    "timestamp": "2021-02-25T21:21:58+00:00",
-    "url": "http://example.com/exm-namespace/example-project/-/commit/2626dbdb936782b5c54816b1c6d45b1279303c6d",
-    "author": {
-      "name": "User",
-      "email": "user@gitlab.com"
-    }
+	"id": "2626dbdb936782b5c54816b1c6d45b1279303c6d",
+	"message": "Merge branch 'example-branch' into 'master'\n\nCheck in this test",
+	"title": "Merge branch 'example-branch' into 'master'",
+	"timestamp": "2021-02-25T21:21:58+00:00",
+	"url": "http://example.com/exm-namespace/example-project/-/commit/2626dbdb936782b5c54816b1c6d45b1279303c6d",
+	"author": {
+	  "name": "User",
+	  "email": "user@gitlab.com"
+	}
   }
 }
diff --git a/testdata/webhooks/subgroup.json b/testdata/webhooks/subgroup.json
index a3c1e83..0c336cd 100644
--- a/testdata/webhooks/subgroup.json
+++ b/testdata/webhooks/subgroup.json
@@ -2,7 +2,7 @@
   "created_at": "2022-01-24T14:23:59Z",
   "updated_at": "2022-01-24T14:23:59Z",
   "event_name": "subgroup_create",
-  "name": "SubGroup 1",
+  "name": "Subgroup 1",
   "path": "subgroup-1",
   "full_path": "group-1/subgroup-1",
   "group_id": 2,
diff --git a/users_test.go b/users_test.go
index 3a388e0..edfc400 100644
--- a/users_test.go
+++ b/users_test.go
@@ -115,7 +115,6 @@ func TestGetUserAdmin(t *testing.T) {
 		TwoFactorEnabled: true,
 		Note:             "DMCA Request: 2018-11-05 | DMCA Violation | Abuse | https://gitlab.zendesk.com/agent/tickets/123",
 		Identities:       []*UserIdentity{{Provider: "github", ExternUID: "2435223452345"}},
-		NamespaceID:      42,
 	}
 	require.Equal(t, want, user)
 }