Repository: xanzy/go-gitlab
Pull request #1855 (2023-12-14 05:53:39)

Reorder issue
This PR implements support for the reorder issue endpoint in the REST API (https://docs.gitlab.com/ee/api/issues.html#reorder-an-issue). You can use it to update the relative position to other issues, which is then reflected on the issue board (but also allows you to sort by "relative position" in the GraphQL API).


Patch:
diff --git a/README.md b/README.md
index 9ed7d40..3058715 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,6 @@ A GitLab API client enabling Go programs to interact with GitLab in a simple and
 [![Sourcegraph](https://sourcegraph.com/github.com/xanzy/go-gitlab/-/badge.svg)](https://sourcegraph.com/github.com/xanzy/go-gitlab?badge)
 [![GoDoc](https://godoc.org/github.com/xanzy/go-gitlab?status.svg)](https://godoc.org/github.com/xanzy/go-gitlab)
 [![Go Report Card](https://goreportcard.com/badge/github.com/xanzy/go-gitlab)](https://goreportcard.com/report/github.com/xanzy/go-gitlab)
-[![Coverage](https://github.com/xanzy/go-gitlab/wiki/coverage.svg)](https://raw.githack.com/wiki/xanzy/go-gitlab/coverage.html)
 
 ## NOTE
 
diff --git a/boards.go b/boards.go
index 22e2cd7..8b5eb79 100644
--- a/boards.go
+++ b/boards.go
@@ -111,11 +111,11 @@ func (s *IssueBoardsService) CreateIssueBoard(pid interface{}, opt *CreateIssueB
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/boards.html#update-an-issue-board
 type UpdateIssueBoardOptions struct {
-	Name        *string       `url:"name,omitempty" json:"name,omitempty"`
-	AssigneeID  *int          `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
-	MilestoneID *int          `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
-	Labels      *LabelOptions `url:"labels,omitempty" json:"labels,omitempty"`
-	Weight      *int          `url:"weight,omitempty" json:"weight,omitempty"`
+	Name        *string `url:"name,omitempty" json:"name,omitempty"`
+	AssigneeID  *int    `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
+	MilestoneID *int    `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
+	Labels      *Labels `url:"labels,omitempty" json:"labels,omitempty"`
+	Weight      *int    `url:"weight,omitempty" json:"weight,omitempty"`
 }
 
 // UpdateIssueBoard update an issue board.
diff --git a/commits.go b/commits.go
index b87dd9f..cdb548b 100644
--- a/commits.go
+++ b/commits.go
@@ -255,10 +255,7 @@ func (d Diff) String() string {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/commits.html#get-the-diff-of-a-commit
-type GetCommitDiffOptions struct {
-	ListOptions
-	Unidiff *bool `url:"unidiff,omitempty" json:"unidiff,omitempty"`
-}
+type GetCommitDiffOptions ListOptions
 
 // GetCommitDiff gets the diff of a commit in a project..
 //
diff --git a/environments.go b/environments.go
index b6d902f..cee6aaf 100644
--- a/environments.go
+++ b/environments.go
@@ -204,26 +204,18 @@ func (s *EnvironmentsService) DeleteEnvironment(pid interface{}, environment int
 	return s.client.Do(req, nil)
 }
 
-// StopEnvironmentOptions represents the available StopEnvironment() options.
+// StopEnvironment stop an environment from a project team.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/environments.html#stop-an-environment
-type StopEnvironmentOptions struct {
-	Force *bool `url:"force,omitempty" json:"force,omitempty"`
-}
-
-// StopEnvironment stops an environment within a specific project.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/environments.html#stop-an-environment
-func (s *EnvironmentsService) StopEnvironment(pid interface{}, environmentID int, opt *StopEnvironmentOptions, options ...RequestOptionFunc) (*Environment, *Response, error) {
+func (s *EnvironmentsService) StopEnvironment(pid interface{}, environmentID int, options ...RequestOptionFunc) (*Environment, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, nil, err
 	}
 	u := fmt.Sprintf("projects/%s/environments/%d/stop", PathEscape(project), environmentID)
 
-	req, err := s.client.NewRequest(http.MethodPost, u, opt, options)
+	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/epics.go b/epics.go
index cd553ea..553ea8d 100644
--- a/epics.go
+++ b/epics.go
@@ -81,20 +81,20 @@ func (e Epic) String() string {
 // GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#list-epics-for-a-group
 type ListGroupEpicsOptions struct {
 	ListOptions
-	AuthorID                *int          `url:"author_id,omitempty" json:"author_id,omitempty"`
-	Labels                  *LabelOptions `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	WithLabelDetails        *bool         `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
-	OrderBy                 *string       `url:"order_by,omitempty" json:"order_by,omitempty"`
-	Sort                    *string       `url:"sort,omitempty" json:"sort,omitempty"`
-	Search                  *string       `url:"search,omitempty" json:"search,omitempty"`
-	State                   *string       `url:"state,omitempty" json:"state,omitempty"`
-	CreatedAfter            *time.Time    `url:"created_after,omitempty" json:"created_after,omitempty"`
-	CreatedBefore           *time.Time    `url:"created_before,omitempty" json:"created_before,omitempty"`
-	UpdatedAfter            *time.Time    `url:"updated_after,omitempty" json:"updated_after,omitempty"`
-	UpdatedBefore           *time.Time    `url:"updated_before,omitempty" json:"updated_before,omitempty"`
-	IncludeAncestorGroups   *bool         `url:"include_ancestor_groups,omitempty" json:"include_ancestor_groups,omitempty"`
-	IncludeDescendantGroups *bool         `url:"include_descendant_groups,omitempty" json:"include_descendant_groups,omitempty"`
-	MyReactionEmoji         *string       `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"`
+	AuthorID                *int       `url:"author_id,omitempty" json:"author_id,omitempty"`
+	Labels                  *Labels    `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	WithLabelDetails        *bool      `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
+	OrderBy                 *string    `url:"order_by,omitempty" json:"order_by,omitempty"`
+	Sort                    *string    `url:"sort,omitempty" json:"sort,omitempty"`
+	Search                  *string    `url:"search,omitempty" json:"search,omitempty"`
+	State                   *string    `url:"state,omitempty" json:"state,omitempty"`
+	CreatedAfter            *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"`
+	CreatedBefore           *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"`
+	UpdatedAfter            *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"`
+	UpdatedBefore           *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"`
+	IncludeAncestorGroups   *bool      `url:"include_ancestor_groups,omitempty" json:"include_ancestor_groups,omitempty"`
+	IncludeDescendantGroups *bool      `url:"include_descendant_groups,omitempty" json:"include_descendant_groups,omitempty"`
+	MyReactionEmoji         *string    `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"`
 }
 
 // ListGroupEpics gets a list of group epics. This function accepts pagination
@@ -174,13 +174,13 @@ func (s *EpicsService) GetEpicLinks(gid interface{}, epic int, options ...Reques
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#new-epic
 type CreateEpicOptions struct {
-	Title            *string       `url:"title,omitempty" json:"title,omitempty"`
-	Description      *string       `url:"description,omitempty" json:"description,omitempty"`
-	Labels           *LabelOptions `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	StartDateIsFixed *bool         `url:"start_date_is_fixed,omitempty" json:"start_date_is_fixed,omitempty"`
-	StartDateFixed   *ISOTime      `url:"start_date_fixed,omitempty" json:"start_date_fixed,omitempty"`
-	DueDateIsFixed   *bool         `url:"due_date_is_fixed,omitempty" json:"due_date_is_fixed,omitempty"`
-	DueDateFixed     *ISOTime      `url:"due_date_fixed,omitempty" json:"due_date_fixed,omitempty"`
+	Title            *string  `url:"title,omitempty" json:"title,omitempty"`
+	Description      *string  `url:"description,omitempty" json:"description,omitempty"`
+	Labels           *Labels  `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	StartDateIsFixed *bool    `url:"start_date_is_fixed,omitempty" json:"start_date_is_fixed,omitempty"`
+	StartDateFixed   *ISOTime `url:"start_date_fixed,omitempty" json:"start_date_fixed,omitempty"`
+	DueDateIsFixed   *bool    `url:"due_date_is_fixed,omitempty" json:"due_date_is_fixed,omitempty"`
+	DueDateFixed     *ISOTime `url:"due_date_fixed,omitempty" json:"due_date_fixed,omitempty"`
 }
 
 // CreateEpic creates a new group epic.
@@ -211,15 +211,15 @@ func (s *EpicsService) CreateEpic(gid interface{}, opt *CreateEpicOptions, optio
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/epics.html#update-epic
 type UpdateEpicOptions struct {
-	Title            *string       `url:"title,omitempty" json:"title,omitempty"`
-	Confidential     *bool         `url:"confidential,omitempty" json:"confidential,omitempty"`
-	Description      *string       `url:"description,omitempty" json:"description,omitempty"`
-	Labels           *LabelOptions `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	StartDateIsFixed *bool         `url:"start_date_is_fixed,omitempty" json:"start_date_is_fixed,omitempty"`
-	StartDateFixed   *ISOTime      `url:"start_date_fixed,omitempty" json:"start_date_fixed,omitempty"`
-	DueDateIsFixed   *bool         `url:"due_date_is_fixed,omitempty" json:"due_date_is_fixed,omitempty"`
-	DueDateFixed     *ISOTime      `url:"due_date_fixed,omitempty" json:"due_date_fixed,omitempty"`
-	StateEvent       *string       `url:"state_event,omitempty" json:"state_event,omitempty"`
+	Title            *string  `url:"title,omitempty" json:"title,omitempty"`
+	Confidential     *bool    `url:"confidential,omitempty" json:"confidential,omitempty"`
+	Description      *string  `url:"description,omitempty" json:"description,omitempty"`
+	Labels           *Labels  `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	StartDateIsFixed *bool    `url:"start_date_is_fixed,omitempty" json:"start_date_is_fixed,omitempty"`
+	StartDateFixed   *ISOTime `url:"start_date_fixed,omitempty" json:"start_date_fixed,omitempty"`
+	DueDateIsFixed   *bool    `url:"due_date_is_fixed,omitempty" json:"due_date_is_fixed,omitempty"`
+	DueDateFixed     *ISOTime `url:"due_date_fixed,omitempty" json:"due_date_fixed,omitempty"`
+	StateEvent       *string  `url:"state_event,omitempty" json:"state_event,omitempty"`
 }
 
 // UpdateEpic updates an existing group epic. This function is also used
diff --git a/examples/personal_access_tokens.go b/examples/personal_access_tokens.go
index aa49b15..5706dda 100644
--- a/examples/personal_access_tokens.go
+++ b/examples/personal_access_tokens.go
@@ -20,7 +20,6 @@ import (
 	"encoding/json"
 	"fmt"
 	"log"
-	"time"
 
 	"github.com/xanzy/go-gitlab"
 )
@@ -69,11 +68,7 @@ func patRotateExample() {
 		log.Fatal(err)
 	}
 
-	expiry := gitlab.ISOTime(time.Date(2023, time.August, 15, 0, 0, 0, 0, time.UTC))
-	opts := &gitlab.RotatePersonalAccessTokenOptions{
-		ExpiresAt: &expiry,
-	}
-	newPersonalAccessToken, _, err := git.PersonalAccessTokens.RotatePersonalAccessToken(12345, opts)
+	newPersonalAccessToken, _, err := git.PersonalAccessTokens.RotatePersonalAccessToken(12345)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/gitlab.go b/gitlab.go
index c773ef5..08e1088 100644
--- a/gitlab.go
+++ b/gitlab.go
@@ -147,7 +147,6 @@ type Client struct {
 	GroupMilestones              *GroupMilestonesService
 	GroupProtectedEnvironments   *GroupProtectedEnvironmentsService
 	GroupRepositoryStorageMove   *GroupRepositoryStorageMoveService
-	GroupSSHCertificates         *GroupSSHCertificatesService
 	GroupVariables               *GroupVariablesService
 	GroupWikis                   *GroupWikisService
 	Groups                       *GroupsService
@@ -380,7 +379,6 @@ func newClient(options ...ClientOptionFunc) (*Client, error) {
 	c.GroupMilestones = &GroupMilestonesService{client: c}
 	c.GroupProtectedEnvironments = &GroupProtectedEnvironmentsService{client: c}
 	c.GroupRepositoryStorageMove = &GroupRepositoryStorageMoveService{client: c}
-	c.GroupSSHCertificates = &GroupSSHCertificatesService{client: c}
 	c.GroupVariables = &GroupVariablesService{client: c}
 	c.GroupWikis = &GroupWikisService{client: c}
 	c.Groups = &GroupsService{client: c}
diff --git a/group_access_tokens.go b/group_access_tokens.go
index ccbe47b..15f303a 100644
--- a/group_access_tokens.go
+++ b/group_access_tokens.go
@@ -145,27 +145,18 @@ func (s *GroupAccessTokensService) CreateGroupAccessToken(gid interface{}, opt *
 	return pat, resp, nil
 }
 
-// RotateGroupAccessTokenOptions represents the available RotateGroupAccessToken()
-// options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/group_access_tokens.html#rotate-a-group-access-token
-type RotateGroupAccessTokenOptions struct {
-	ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"`
-}
-
 // RotateGroupAccessToken revokes a group access token and returns a new group
-// access token that expires in one week per default.
+// access token that expires in one week.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_access_tokens.html#rotate-a-group-access-token
-func (s *GroupAccessTokensService) RotateGroupAccessToken(gid interface{}, id int, opt *RotateGroupAccessTokenOptions, options ...RequestOptionFunc) (*GroupAccessToken, *Response, error) {
+func (s *GroupAccessTokensService) RotateGroupAccessToken(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/rotate", PathEscape(groups), id)
-	req, err := s.client.NewRequest(http.MethodPost, u, opt, options)
+	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/group_boards.go b/group_boards.go
index ed9f8d5..645e7ee 100644
--- a/group_boards.go
+++ b/group_boards.go
@@ -35,12 +35,11 @@ type GroupIssueBoardsService struct {
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_boards.html
 type GroupIssueBoard struct {
-	ID        int           `json:"id"`
-	Name      string        `json:"name"`
-	Group     *Group        `json:"group"`
-	Milestone *Milestone    `json:"milestone"`
-	Labels    []*GroupLabel `json:"labels"`
-	Lists     []*BoardList  `json:"lists"`
+	ID        int          `json:"id"`
+	Name      string       `json:"name"`
+	Group     *Group       `json:"group"`
+	Milestone *Milestone   `json:"milestone"`
+	Lists     []*BoardList `json:"lists"`
 }
 
 func (b GroupIssueBoard) String() string {
@@ -143,11 +142,11 @@ func (s *GroupIssueBoardsService) GetGroupIssueBoard(gid interface{}, board int,
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/group_boards.html#update-a-group-issue-board
 type UpdateGroupIssueBoardOptions struct {
-	Name        *string       `url:"name,omitempty" json:"name,omitempty"`
-	AssigneeID  *int          `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
-	MilestoneID *int          `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
-	Labels      *LabelOptions `url:"labels,omitempty" json:"labels,omitempty"`
-	Weight      *int          `url:"weight,omitempty" json:"weight,omitempty"`
+	Name        *string `url:"name,omitempty" json:"name,omitempty"`
+	AssigneeID  *int    `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
+	MilestoneID *int    `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
+	Labels      *Labels `url:"labels,omitempty" json:"labels,omitempty"`
+	Weight      *int    `url:"weight,omitempty" json:"weight,omitempty"`
 }
 
 // UpdateIssueBoard updates a single issue board of a group.
diff --git a/group_labels.go b/group_labels.go
index 5a39026..d19e3ed 100644
--- a/group_labels.go
+++ b/group_labels.go
@@ -142,25 +142,16 @@ func (s *GroupLabelsService) CreateGroupLabel(gid interface{}, opt *CreateGroupL
 // https://docs.gitlab.com/ee/api/group_labels.html#delete-a-group-label
 type DeleteGroupLabelOptions DeleteLabelOptions
 
-// DeleteGroupLabel deletes a group label given by its name or ID.
+// DeleteGroupLabel deletes a group label given by its name.
 //
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/group_labels.html#delete-a-group-label
-func (s *GroupLabelsService) DeleteGroupLabel(gid interface{}, lid interface{}, opt *DeleteGroupLabelOptions, options ...RequestOptionFunc) (*Response, error) {
+// GitLab API docs: https://docs.gitlab.com/ee/api/group_labels.html#delete-a-group-label
+func (s *GroupLabelsService) DeleteGroupLabel(gid interface{}, opt *DeleteGroupLabelOptions, options ...RequestOptionFunc) (*Response, error) {
 	group, err := parseID(gid)
 	if err != nil {
 		return nil, err
 	}
 	u := fmt.Sprintf("groups/%s/labels", PathEscape(group))
 
-	if lid != nil {
-		label, err := parseID(lid)
-		if err != nil {
-			return nil, err
-		}
-		u = fmt.Sprintf("groups/%s/labels/%s", PathEscape(group), PathEscape(label))
-	}
-
 	req, err := s.client.NewRequest(http.MethodDelete, u, opt, options)
 	if err != nil {
 		return nil, err
diff --git a/group_milestones.go b/group_milestones.go
index 179d059..60aa2e9 100644
--- a/group_milestones.go
+++ b/group_milestones.go
@@ -188,24 +188,6 @@ func (s *GroupMilestonesService) UpdateGroupMilestone(gid interface{}, milestone
 	return m, resp, nil
 }
 
-// DeleteGroupMilestone deletes a specified group milestone.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/group_milestones.html#delete-group-milestone
-func (s *GroupMilestonesService) DeleteGroupMilestone(pid interface{}, milestone int, options ...RequestOptionFunc) (*Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("groups/%s/milestones/%d", PathEscape(project), milestone)
-
-	req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
-	if err != nil {
-		return nil, err
-	}
-	return s.client.Do(req, nil)
-}
-
 // GetGroupMilestoneIssuesOptions represents the available GetGroupMilestoneIssues() options.
 //
 // GitLab API docs:
diff --git a/group_serviceaccounts.go b/group_serviceaccounts.go
deleted file mode 100644
index 4acb0b1..0000000
--- a/group_serviceaccounts.go
+++ /dev/null
@@ -1,118 +0,0 @@
-//
-// Copyright 2023, James Hong
-//
-// 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"
-)
-
-// GroupServiceAccount represents a GitLab service account user.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/groups.html#create-service-account-user
-type GroupServiceAccount struct {
-	ID       int    `json:"id"`
-	Name     string `json:"name"`
-	UserName string `json:"username"`
-}
-
-// CreateServiceAccount create a new service account user for a group.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/groups.html#create-service-account-user
-func (s *GroupsService) CreateServiceAccount(gid interface{}, options ...RequestOptionFunc) (*GroupServiceAccount, *Response, error) {
-	group, err := parseID(gid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("groups/%s/service_accounts", PathEscape(group))
-
-	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	sa := new(GroupServiceAccount)
-	resp, err := s.client.Do(req, sa)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return sa, resp, nil
-}
-
-// CreateServiceAccountPersonalAccessTokenOptions represents the available
-// CreateServiceAccountPersonalAccessToken() options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/groups.html#create-personal-access-token-for-service-account-user
-type CreateServiceAccountPersonalAccessTokenOptions struct {
-	Scopes *[]string `url:"scopes,omitempty" json:"scopes,omitempty"`
-	Name   *string   `url:"name,omitempty" json:"name,omitempty"`
-}
-
-// CreateServiceAccountPersonalAccessToken add a new Personal Access Token for a
-// service account user for a group.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/groups.html#create-personal-access-token-for-service-account-user
-func (s *GroupsService) CreateServiceAccountPersonalAccessToken(gid interface{}, serviceAccount int, opt *CreateServiceAccountPersonalAccessTokenOptions, options ...RequestOptionFunc) (*PersonalAccessToken, *Response, error) {
-	group, err := parseID(gid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("groups/%s/service_accounts/%d/personal_access_tokens", PathEscape(group), serviceAccount)
-
-	req, err := s.client.NewRequest(http.MethodPost, u, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	pat := new(PersonalAccessToken)
-	resp, err := s.client.Do(req, pat)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return pat, resp, nil
-}
-
-// RotateServiceAccountPersonalAccessToken rotates a Personal Access Token for a
-// service account user for a group.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/groups.html#create-personal-access-token-for-service-account-user
-func (s *GroupsService) RotateServiceAccountPersonalAccessToken(gid interface{}, serviceAccount, token int, options ...RequestOptionFunc) (*PersonalAccessToken, *Response, error) {
-	group, err := parseID(gid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("groups/%s/service_accounts/%d/personal_access_tokens/%d/rotate", PathEscape(group), serviceAccount, token)
-
-	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	pat := new(PersonalAccessToken)
-	resp, err := s.client.Do(req, pat)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return pat, resp, nil
-}
diff --git a/group_ssh_certificates.go b/group_ssh_certificates.go
deleted file mode 100644
index c290390..0000000
--- a/group_ssh_certificates.go
+++ /dev/null
@@ -1,105 +0,0 @@
-package gitlab
-
-import (
-	"fmt"
-	"net/http"
-	"time"
-)
-
-// GroupSSHCertificatesService handles communication with the group
-// SSH certificate related methods of the GitLab API.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/group_ssh_certificates.html
-type GroupSSHCertificatesService struct {
-	client *Client
-}
-
-// GroupSSHCertificate represents a GitLab Group SSH certificate.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/member_roles.html
-type GroupSSHCertificate struct {
-	ID        int        `json:"id"`
-	Title     string     `json:"title"`
-	Key       string     `json:"key"`
-	CreatedAt *time.Time `json:"created_at"`
-}
-
-// ListGroupSSHCertificates gets a list of SSH certificates for a specified
-// group.
-//
-// Gitlab API docs:
-// https://docs.gitlab.com/ee/api/group_ssh_certificates.html#get-all-ssh-certificates-for-a-particular-group
-func (s *GroupSSHCertificatesService) ListGroupSSHCertificates(gid interface{}, options ...RequestOptionFunc) ([]*GroupSSHCertificate, *Response, error) {
-	group, err := parseID(gid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("groups/%s/ssh_certificates", PathEscape(group))
-
-	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	var certs []*GroupSSHCertificate
-	resp, err := s.client.Do(req, &certs)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return certs, resp, nil
-}
-
-// CreateGroupSSHCertificateOptions represents the available
-// CreateGroupSSHCertificate() options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/group_ssh_certificates.html#create-ssh-certificate
-type CreateGroupSSHCertificateOptions struct {
-	Key   *string `url:"key,omitempty" json:"key,omitempty"`
-	Title *string `url:"title,omitempty" json:"title,omitempty"`
-}
-
-// CreateMemberRole creates a new member role for a specified group.
-//
-// Gitlab API docs:
-// https://docs.gitlab.com/ee/api/group_ssh_certificates.html#create-ssh-certificate
-func (s *GroupSSHCertificatesService) CreateGroupSSHCertificate(gid interface{}, opt *CreateGroupSSHCertificateOptions, options ...RequestOptionFunc) (*GroupSSHCertificate, *Response, error) {
-	group, err := parseID(gid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("groups/%s/ssh_certificates", PathEscape(group))
-
-	req, err := s.client.NewRequest(http.MethodPost, u, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	cert := new(GroupSSHCertificate)
-	resp, err := s.client.Do(req, cert)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return cert, resp, nil
-}
-
-// DeleteGroupSSHCertificate deletes a SSH certificate from a specified group.
-//
-// Gitlab API docs:
-// https://docs.gitlab.com/ee/api/group_ssh_certificates.html#delete-group-ssh-certificate
-func (s *GroupSSHCertificatesService) DeleteGroupSSHCertificate(gid interface{}, cert int, options ...RequestOptionFunc) (*Response, error) {
-	group, err := parseID(gid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("groups/%s/ssh_certificates/%d", PathEscape(group), cert)
-
-	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/issues.go b/issues.go
index a0e2f88..f3b3946 100644
--- a/issues.go
+++ b/issues.go
@@ -17,10 +17,13 @@
 package gitlab
 
 import (
+	"bytes"
 	"encoding/json"
 	"fmt"
 	"net/http"
+	"net/url"
 	"reflect"
+	"strings"
 	"time"
 )
 
@@ -164,6 +167,32 @@ func (i *Issue) UnmarshalJSON(data []byte) error {
 	return json.Unmarshal(data, (*alias)(i))
 }
 
+// Labels is a custom type with specific marshaling characteristics.
+type Labels []string
+
+// MarshalJSON implements the json.Marshaler interface.
+func (l *Labels) MarshalJSON() ([]byte, error) {
+	if *l == nil {
+		return []byte(`null`), nil
+	}
+	return json.Marshal(strings.Join(*l, ","))
+}
+
+// UnmarshalJSON implements the json.Unmarshaler interface.
+func (l *Labels) UnmarshalJSON(data []byte) error {
+	type alias Labels
+	if !bytes.HasPrefix(data, []byte("[")) {
+		data = []byte(fmt.Sprintf("[%s]", string(data)))
+	}
+	return json.Unmarshal(data, (*alias)(l))
+}
+
+// EncodeValues implements the query.EncodeValues interface
+func (l *Labels) EncodeValues(key string, v *url.Values) error {
+	v.Set(key, strings.Join(*l, ","))
+	return nil
+}
+
 // LabelDetails represents detailed label information.
 type LabelDetails struct {
 	ID              int    `json:"id"`
@@ -180,8 +209,8 @@ type LabelDetails struct {
 type ListIssuesOptions struct {
 	ListOptions
 	State               *string          `url:"state,omitempty" json:"state,omitempty"`
-	Labels              *LabelOptions    `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	NotLabels           *LabelOptions    `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
+	Labels              *Labels          `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	NotLabels           *Labels          `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
 	WithLabelDetails    *bool            `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
 	Milestone           *string          `url:"milestone,omitempty" json:"milestone,omitempty"`
 	NotMilestone        *string          `url:"not[milestone],omitempty" json:"not[milestone],omitempty"`
@@ -237,18 +266,18 @@ func (s *IssuesService) ListIssues(opt *ListIssuesOptions, options ...RequestOpt
 // GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#list-group-issues
 type ListGroupIssuesOptions struct {
 	ListOptions
-	State             *string       `url:"state,omitempty" json:"state,omitempty"`
-	Labels            *LabelOptions `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	NotLabels         *LabelOptions `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
-	WithLabelDetails  *bool         `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
-	IIDs              *[]int        `url:"iids[],omitempty" json:"iids,omitempty"`
-	Milestone         *string       `url:"milestone,omitempty" json:"milestone,omitempty"`
-	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"`
-	NotAuthorID       *[]int        `url:"not[author_id],omitempty" json:"not[author_id],omitempty"`
-	AuthorUsername    *string       `url:"author_username,omitempty" json:"author_username,omitempty"`
-	NotAuthorUsername *string       `url:"not[author_username],omitempty" json:"not[author_username],omitempty"`
+	State             *string `url:"state,omitempty" json:"state,omitempty"`
+	Labels            *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	NotLabels         *Labels `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
+	WithLabelDetails  *bool   `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
+	IIDs              *[]int  `url:"iids[],omitempty" json:"iids,omitempty"`
+	Milestone         *string `url:"milestone,omitempty" json:"milestone,omitempty"`
+	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"`
+	NotAuthorID       *[]int  `url:"not[author_id],omitempty" json:"not[author_id],omitempty"`
+	AuthorUsername    *string `url:"author_username,omitempty" json:"author_username,omitempty"`
+	NotAuthorUsername *string `url:"not[author_username],omitempty" json:"not[author_username],omitempty"`
 
 	AssigneeID          *AssigneeIDValue `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
 	NotAssigneeID       *[]int           `url:"not[assignee_id],omitempty" json:"not[assignee_id],omitempty"`
@@ -303,8 +332,8 @@ type ListProjectIssuesOptions struct {
 	ListOptions
 	IIDs                *[]int           `url:"iids[],omitempty" json:"iids,omitempty"`
 	State               *string          `url:"state,omitempty" json:"state,omitempty"`
-	Labels              *LabelOptions    `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	NotLabels           *LabelOptions    `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
+	Labels              *Labels          `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	NotLabels           *Labels          `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
 	WithLabelDetails    *bool            `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
 	Milestone           *string          `url:"milestone,omitempty" json:"milestone,omitempty"`
 	NotMilestone        *string          `url:"not[milestone],omitempty" json:"not[milestone],omitempty"`
@@ -407,20 +436,20 @@ func (s *IssuesService) GetIssue(pid interface{}, issue int, options ...RequestO
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#new-issue
 type CreateIssueOptions struct {
-	IID                                *int          `url:"iid,omitempty" json:"iid,omitempty"`
-	Title                              *string       `url:"title,omitempty" json:"title,omitempty"`
-	Description                        *string       `url:"description,omitempty" json:"description,omitempty"`
-	Confidential                       *bool         `url:"confidential,omitempty" json:"confidential,omitempty"`
-	AssigneeIDs                        *[]int        `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"`
-	MilestoneID                        *int          `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
-	Labels                             *LabelOptions `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	CreatedAt                          *time.Time    `url:"created_at,omitempty" json:"created_at,omitempty"`
-	DueDate                            *ISOTime      `url:"due_date,omitempty" json:"due_date,omitempty"`
-	EpicID                             *int          `url:"epic_id,omitempty" json:"epic_id,omitempty"`
-	MergeRequestToResolveDiscussionsOf *int          `url:"merge_request_to_resolve_discussions_of,omitempty" json:"merge_request_to_resolve_discussions_of,omitempty"`
-	DiscussionToResolve                *string       `url:"discussion_to_resolve,omitempty" json:"discussion_to_resolve,omitempty"`
-	Weight                             *int          `url:"weight,omitempty" json:"weight,omitempty"`
-	IssueType                          *string       `url:"issue_type,omitempty" json:"issue_type,omitempty"`
+	IID                                *int       `url:"iid,omitempty" json:"iid,omitempty"`
+	Title                              *string    `url:"title,omitempty" json:"title,omitempty"`
+	Description                        *string    `url:"description,omitempty" json:"description,omitempty"`
+	Confidential                       *bool      `url:"confidential,omitempty" json:"confidential,omitempty"`
+	AssigneeIDs                        *[]int     `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"`
+	MilestoneID                        *int       `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
+	Labels                             *Labels    `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	CreatedAt                          *time.Time `url:"created_at,omitempty" json:"created_at,omitempty"`
+	DueDate                            *ISOTime   `url:"due_date,omitempty" json:"due_date,omitempty"`
+	EpicID                             *int       `url:"epic_id,omitempty" json:"epic_id,omitempty"`
+	MergeRequestToResolveDiscussionsOf *int       `url:"merge_request_to_resolve_discussions_of,omitempty" json:"merge_request_to_resolve_discussions_of,omitempty"`
+	DiscussionToResolve                *string    `url:"discussion_to_resolve,omitempty" json:"discussion_to_resolve,omitempty"`
+	Weight                             *int       `url:"weight,omitempty" json:"weight,omitempty"`
+	IssueType                          *string    `url:"issue_type,omitempty" json:"issue_type,omitempty"`
 }
 
 // CreateIssue creates a new project issue.
@@ -451,21 +480,21 @@ func (s *IssuesService) CreateIssue(pid interface{}, opt *CreateIssueOptions, op
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#edit-issue
 type UpdateIssueOptions struct {
-	Title            *string       `url:"title,omitempty" json:"title,omitempty"`
-	Description      *string       `url:"description,omitempty" json:"description,omitempty"`
-	Confidential     *bool         `url:"confidential,omitempty" json:"confidential,omitempty"`
-	AssigneeIDs      *[]int        `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"`
-	MilestoneID      *int          `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
-	Labels           *LabelOptions `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	AddLabels        *LabelOptions `url:"add_labels,comma,omitempty" json:"add_labels,omitempty"`
-	RemoveLabels     *LabelOptions `url:"remove_labels,comma,omitempty" json:"remove_labels,omitempty"`
-	StateEvent       *string       `url:"state_event,omitempty" json:"state_event,omitempty"`
-	UpdatedAt        *time.Time    `url:"updated_at,omitempty" json:"updated_at,omitempty"`
-	DueDate          *ISOTime      `url:"due_date,omitempty" json:"due_date,omitempty"`
-	EpicID           *int          `url:"epic_id,omitempty" json:"epic_id,omitempty"`
-	Weight           *int          `url:"weight,omitempty" json:"weight,omitempty"`
-	DiscussionLocked *bool         `url:"discussion_locked,omitempty" json:"discussion_locked,omitempty"`
-	IssueType        *string       `url:"issue_type,omitempty" json:"issue_type,omitempty"`
+	Title            *string    `url:"title,omitempty" json:"title,omitempty"`
+	Description      *string    `url:"description,omitempty" json:"description,omitempty"`
+	Confidential     *bool      `url:"confidential,omitempty" json:"confidential,omitempty"`
+	AssigneeIDs      *[]int     `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"`
+	MilestoneID      *int       `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
+	Labels           *Labels    `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	AddLabels        *Labels    `url:"add_labels,comma,omitempty" json:"add_labels,omitempty"`
+	RemoveLabels     *Labels    `url:"remove_labels,comma,omitempty" json:"remove_labels,omitempty"`
+	StateEvent       *string    `url:"state_event,omitempty" json:"state_event,omitempty"`
+	UpdatedAt        *time.Time `url:"updated_at,omitempty" json:"updated_at,omitempty"`
+	DueDate          *ISOTime   `url:"due_date,omitempty" json:"due_date,omitempty"`
+	EpicID           *int       `url:"epic_id,omitempty" json:"epic_id,omitempty"`
+	Weight           *int       `url:"weight,omitempty" json:"weight,omitempty"`
+	DiscussionLocked *bool      `url:"discussion_locked,omitempty" json:"discussion_locked,omitempty"`
+	IssueType        *string    `url:"issue_type,omitempty" json:"issue_type,omitempty"`
 }
 
 // UpdateIssue updates an existing project issue. This function is also used
@@ -511,6 +540,38 @@ func (s *IssuesService) DeleteIssue(pid interface{}, issue int, options ...Reque
 	return s.client.Do(req, nil)
 }
 
+// ReorderIssueOptions represents the available ReorderIssue() options.
+//
+// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#reorder-an-issue
+type ReorderIssueOptions struct {
+	MoveAfterID  *int `url:"move_after_id,omitempty" json:"move_after_id,omitempty"`
+	MoveBeforeID *int `url:"move_before_id,omitempty" json:"move_before_id,omitempty"`
+}
+
+// ReorderIssue reorders an issue.
+//
+// GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#reorder-an-issue
+func (s *IssuesService) ReorderIssue(pid interface{}, issue int, opt *ReorderIssueOptions, options ...RequestOptionFunc) (*Issue, *Response, error) {
+	project, err := parseID(pid)
+	if err != nil {
+		return nil, nil, err
+	}
+	u := fmt.Sprintf("projects/%s/issues/%d/reorder", PathEscape(project), issue)
+
+	req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	i := new(Issue)
+	resp, err := s.client.Do(req, i)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return i, resp, nil
+}
+
 // MoveIssueOptions represents the available MoveIssue() options.
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/issues.html#move-an-issue
diff --git a/issues_statistics.go b/issues_statistics.go
index 5355578..3574733 100644
--- a/issues_statistics.go
+++ b/issues_statistics.go
@@ -52,22 +52,22 @@ func (n IssuesStatistics) String() string {
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/issues_statistics.html#get-issues-statistics
 type GetIssuesStatisticsOptions struct {
-	Labels           *LabelOptions `url:"labels,omitempty" json:"labels,omitempty"`
-	Milestone        *string       `url:"milestone,omitempty" json:"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"`
-	AssigneeID       *int          `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
-	AssigneeUsername *[]string     `url:"assignee_username,omitempty" json:"assignee_username,omitempty"`
-	MyReactionEmoji  *string       `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"`
-	IIDs             *[]int        `url:"iids[],omitempty" json:"iids,omitempty"`
-	Search           *string       `url:"search,omitempty" json:"search,omitempty"`
-	In               *string       `url:"in,omitempty" json:"in,omitempty"`
-	CreatedAfter     *time.Time    `url:"created_after,omitempty" json:"created_after,omitempty"`
-	CreatedBefore    *time.Time    `url:"created_before,omitempty" json:"created_before,omitempty"`
-	UpdatedAfter     *time.Time    `url:"updated_after,omitempty" json:"updated_after,omitempty"`
-	UpdatedBefore    *time.Time    `url:"updated_before,omitempty" json:"updated_before,omitempty"`
-	Confidential     *bool         `url:"confidential,omitempty" json:"confidential,omitempty"`
+	Labels           *Labels    `url:"labels,omitempty" json:"labels,omitempty"`
+	Milestone        *string    `url:"milestone,omitempty" json:"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"`
+	AssigneeID       *int       `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
+	AssigneeUsername *[]string  `url:"assignee_username,omitempty" json:"assignee_username,omitempty"`
+	MyReactionEmoji  *string    `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"`
+	IIDs             *[]int     `url:"iids[],omitempty" json:"iids,omitempty"`
+	Search           *string    `url:"search,omitempty" json:"search,omitempty"`
+	In               *string    `url:"in,omitempty" json:"in,omitempty"`
+	CreatedAfter     *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"`
+	CreatedBefore    *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"`
+	UpdatedAfter     *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"`
+	UpdatedBefore    *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"`
+	Confidential     *bool      `url:"confidential,omitempty" json:"confidential,omitempty"`
 }
 
 // GetIssuesStatistics gets issues statistics on all issues the authenticated
@@ -96,21 +96,21 @@ func (s *IssuesStatisticsService) GetIssuesStatistics(opt *GetIssuesStatisticsOp
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/issues_statistics.html#get-group-issues-statistics
 type GetGroupIssuesStatisticsOptions struct {
-	Labels           *LabelOptions `url:"labels,omitempty" json:"labels,omitempty"`
-	IIDs             *[]int        `url:"iids[],omitempty" json:"iids,omitempty"`
-	Milestone        *string       `url:"milestone,omitempty" json:"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"`
-	AssigneeID       *int          `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
-	AssigneeUsername *[]string     `url:"assignee_username,omitempty" json:"assignee_username,omitempty"`
-	MyReactionEmoji  *string       `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"`
-	Search           *string       `url:"search,omitempty" json:"search,omitempty"`
-	CreatedAfter     *time.Time    `url:"created_after,omitempty" json:"created_after,omitempty"`
-	CreatedBefore    *time.Time    `url:"created_before,omitempty" json:"created_before,omitempty"`
-	UpdatedAfter     *time.Time    `url:"updated_after,omitempty" json:"updated_after,omitempty"`
-	UpdatedBefore    *time.Time    `url:"updated_before,omitempty" json:"updated_before,omitempty"`
-	Confidential     *bool         `url:"confidential,omitempty" json:"confidential,omitempty"`
+	Labels           *Labels    `url:"labels,omitempty" json:"labels,omitempty"`
+	IIDs             *[]int     `url:"iids[],omitempty" json:"iids,omitempty"`
+	Milestone        *string    `url:"milestone,omitempty" json:"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"`
+	AssigneeID       *int       `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
+	AssigneeUsername *[]string  `url:"assignee_username,omitempty" json:"assignee_username,omitempty"`
+	MyReactionEmoji  *string    `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"`
+	Search           *string    `url:"search,omitempty" json:"search,omitempty"`
+	CreatedAfter     *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"`
+	CreatedBefore    *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"`
+	UpdatedAfter     *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"`
+	UpdatedBefore    *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"`
+	Confidential     *bool      `url:"confidential,omitempty" json:"confidential,omitempty"`
 }
 
 // GetGroupIssuesStatistics gets issues count statistics for given group.
@@ -144,21 +144,21 @@ func (s *IssuesStatisticsService) GetGroupIssuesStatistics(gid interface{}, opt
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/issues_statistics.html#get-project-issues-statistics
 type GetProjectIssuesStatisticsOptions struct {
-	IIDs             *[]int        `url:"iids[],omitempty" json:"iids,omitempty"`
-	Labels           *LabelOptions `url:"labels,omitempty" json:"labels,omitempty"`
-	Milestone        *string       `url:"milestone,omitempty" json:"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"`
-	AssigneeID       *int          `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
-	AssigneeUsername *[]string     `url:"assignee_username,omitempty" json:"assignee_username,omitempty"`
-	MyReactionEmoji  *string       `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"`
-	Search           *string       `url:"search,omitempty" json:"search,omitempty"`
-	CreatedAfter     *time.Time    `url:"created_after,omitempty" json:"created_after,omitempty"`
-	CreatedBefore    *time.Time    `url:"created_before,omitempty" json:"created_before,omitempty"`
-	UpdatedAfter     *time.Time    `url:"updated_after,omitempty" json:"updated_after,omitempty"`
-	UpdatedBefore    *time.Time    `url:"updated_before,omitempty" json:"updated_before,omitempty"`
-	Confidential     *bool         `url:"confidential,omitempty" json:"confidential,omitempty"`
+	IIDs             *[]int     `url:"iids[],omitempty" json:"iids,omitempty"`
+	Labels           *Labels    `url:"labels,omitempty" json:"labels,omitempty"`
+	Milestone        *string    `url:"milestone,omitempty" json:"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"`
+	AssigneeID       *int       `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
+	AssigneeUsername *[]string  `url:"assignee_username,omitempty" json:"assignee_username,omitempty"`
+	MyReactionEmoji  *string    `url:"my_reaction_emoji,omitempty" json:"my_reaction_emoji,omitempty"`
+	Search           *string    `url:"search,omitempty" json:"search,omitempty"`
+	CreatedAfter     *time.Time `url:"created_after,omitempty" json:"created_after,omitempty"`
+	CreatedBefore    *time.Time `url:"created_before,omitempty" json:"created_before,omitempty"`
+	UpdatedAfter     *time.Time `url:"updated_after,omitempty" json:"updated_after,omitempty"`
+	UpdatedBefore    *time.Time `url:"updated_before,omitempty" json:"updated_before,omitempty"`
+	Confidential     *bool      `url:"confidential,omitempty" json:"confidential,omitempty"`
 }
 
 // GetProjectIssuesStatistics gets issues count statistics for given project.
diff --git a/labels.go b/labels.go
index d36e85b..42fc778 100644
--- a/labels.go
+++ b/labels.go
@@ -175,24 +175,16 @@ type DeleteLabelOptions struct {
 	Name *string `url:"name,omitempty" json:"name,omitempty"`
 }
 
-// DeleteLabel deletes a label given by its name or ID.
+// DeleteLabel deletes a label given by its name.
 //
 // GitLab API docs: https://docs.gitlab.com/ee/api/labels.html#delete-a-label
-func (s *LabelsService) DeleteLabel(pid interface{}, lid interface{}, opt *DeleteLabelOptions, options ...RequestOptionFunc) (*Response, error) {
+func (s *LabelsService) DeleteLabel(pid interface{}, opt *DeleteLabelOptions, options ...RequestOptionFunc) (*Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, err
 	}
 	u := fmt.Sprintf("projects/%s/labels", PathEscape(project))
 
-	if lid != nil {
-		label, err := parseID(lid)
-		if err != nil {
-			return nil, err
-		}
-		u = fmt.Sprintf("projects/%s/labels/%s", PathEscape(project), PathEscape(label))
-	}
-
 	req, err := s.client.NewRequest(http.MethodDelete, u, opt, options)
 	if err != nil {
 		return nil, err
diff --git a/merge_requests.go b/merge_requests.go
index 24d3337..458255f 100644
--- a/merge_requests.go
+++ b/merge_requests.go
@@ -191,8 +191,8 @@ type ListMergeRequestsOptions struct {
 	Sort                   *string           `url:"sort,omitempty" json:"sort,omitempty"`
 	Milestone              *string           `url:"milestone,omitempty" json:"milestone,omitempty"`
 	View                   *string           `url:"view,omitempty" json:"view,omitempty"`
-	Labels                 *LabelOptions     `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	NotLabels              *LabelOptions     `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
+	Labels                 *Labels           `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	NotLabels              *Labels           `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
 	WithLabelsDetails      *bool             `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
 	WithMergeStatusRecheck *bool             `url:"with_merge_status_recheck,omitempty" json:"with_merge_status_recheck,omitempty"`
 	CreatedAfter           *time.Time        `url:"created_after,omitempty" json:"created_after,omitempty"`
@@ -252,8 +252,8 @@ type ListProjectMergeRequestsOptions struct {
 	Sort                   *string           `url:"sort,omitempty" json:"sort,omitempty"`
 	Milestone              *string           `url:"milestone,omitempty" json:"milestone,omitempty"`
 	View                   *string           `url:"view,omitempty" json:"view,omitempty"`
-	Labels                 *LabelOptions     `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	NotLabels              *LabelOptions     `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
+	Labels                 *Labels           `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	NotLabels              *Labels           `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
 	WithLabelsDetails      *bool             `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
 	WithMergeStatusRecheck *bool             `url:"with_merge_status_recheck,omitempty" json:"with_merge_status_recheck,omitempty"`
 	CreatedAfter           *time.Time        `url:"created_after,omitempty" json:"created_after,omitempty"`
@@ -314,8 +314,8 @@ type ListGroupMergeRequestsOptions struct {
 	Sort                   *string           `url:"sort,omitempty" json:"sort,omitempty"`
 	Milestone              *string           `url:"milestone,omitempty" json:"milestone,omitempty"`
 	View                   *string           `url:"view,omitempty" json:"view,omitempty"`
-	Labels                 *LabelOptions     `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	NotLabels              *LabelOptions     `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
+	Labels                 *Labels           `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	NotLabels              *Labels           `url:"not[labels],comma,omitempty" json:"not[labels],omitempty"`
 	WithLabelsDetails      *bool             `url:"with_labels_details,omitempty" json:"with_labels_details,omitempty"`
 	WithMergeStatusRecheck *bool             `url:"with_merge_status_recheck,omitempty" json:"with_merge_status_recheck,omitempty"`
 	CreatedAfter           *time.Time        `url:"created_after,omitempty" json:"created_after,omitempty"`
@@ -465,7 +465,6 @@ func (s *MergeRequestsService) GetMergeRequestCommits(pid interface{}, mergeRequ
 // https://docs.gitlab.com/ee/api/merge_requests.html#get-single-merge-request-changes
 type GetMergeRequestChangesOptions struct {
 	AccessRawDiffs *bool `url:"access_raw_diffs,omitempty" json:"access_raw_diffs,omitempty"`
-	Unidiff        *bool `url:"unidiff,omitempty" json:"unidiff,omitempty"`
 }
 
 // GetMergeRequestChanges shows information about the merge request including
@@ -502,10 +501,7 @@ func (s *MergeRequestsService) GetMergeRequestChanges(pid interface{}, mergeRequ
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-request-diffs
-type ListMergeRequestDiffsOptions struct {
-	ListOptions
-	Unidiff *bool `url:"unidiff,omitempty" json:"unidiff,omitempty"`
-}
+type ListMergeRequestDiffsOptions ListOptions
 
 // ListMergeRequestDiffs List diffs of the files changed in a merge request
 //
@@ -681,19 +677,19 @@ func (s *MergeRequestsService) GetIssuesClosedOnMerge(pid interface{}, mergeRequ
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/merge_requests.html#create-mr
 type CreateMergeRequestOptions struct {
-	Title              *string       `url:"title,omitempty" json:"title,omitempty"`
-	Description        *string       `url:"description,omitempty" json:"description,omitempty"`
-	SourceBranch       *string       `url:"source_branch,omitempty" json:"source_branch,omitempty"`
-	TargetBranch       *string       `url:"target_branch,omitempty" json:"target_branch,omitempty"`
-	Labels             *LabelOptions `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	AssigneeID         *int          `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
-	AssigneeIDs        *[]int        `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"`
-	ReviewerIDs        *[]int        `url:"reviewer_ids,omitempty" json:"reviewer_ids,omitempty"`
-	TargetProjectID    *int          `url:"target_project_id,omitempty" json:"target_project_id,omitempty"`
-	MilestoneID        *int          `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
-	RemoveSourceBranch *bool         `url:"remove_source_branch,omitempty" json:"remove_source_branch,omitempty"`
-	Squash             *bool         `url:"squash,omitempty" json:"squash,omitempty"`
-	AllowCollaboration *bool         `url:"allow_collaboration,omitempty" json:"allow_collaboration,omitempty"`
+	Title              *string `url:"title,omitempty" json:"title,omitempty"`
+	Description        *string `url:"description,omitempty" json:"description,omitempty"`
+	SourceBranch       *string `url:"source_branch,omitempty" json:"source_branch,omitempty"`
+	TargetBranch       *string `url:"target_branch,omitempty" json:"target_branch,omitempty"`
+	Labels             *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	AssigneeID         *int    `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
+	AssigneeIDs        *[]int  `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"`
+	ReviewerIDs        *[]int  `url:"reviewer_ids,omitempty" json:"reviewer_ids,omitempty"`
+	TargetProjectID    *int    `url:"target_project_id,omitempty" json:"target_project_id,omitempty"`
+	MilestoneID        *int    `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
+	RemoveSourceBranch *bool   `url:"remove_source_branch,omitempty" json:"remove_source_branch,omitempty"`
+	Squash             *bool   `url:"squash,omitempty" json:"squash,omitempty"`
+	AllowCollaboration *bool   `url:"allow_collaboration,omitempty" json:"allow_collaboration,omitempty"`
 }
 
 // CreateMergeRequest creates a new merge request.
@@ -727,21 +723,21 @@ func (s *MergeRequestsService) CreateMergeRequest(pid interface{}, opt *CreateMe
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/merge_requests.html#update-mr
 type UpdateMergeRequestOptions struct {
-	Title              *string       `url:"title,omitempty" json:"title,omitempty"`
-	Description        *string       `url:"description,omitempty" json:"description,omitempty"`
-	TargetBranch       *string       `url:"target_branch,omitempty" json:"target_branch,omitempty"`
-	AssigneeID         *int          `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
-	AssigneeIDs        *[]int        `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"`
-	ReviewerIDs        *[]int        `url:"reviewer_ids,omitempty" json:"reviewer_ids,omitempty"`
-	Labels             *LabelOptions `url:"labels,comma,omitempty" json:"labels,omitempty"`
-	AddLabels          *LabelOptions `url:"add_labels,comma,omitempty" json:"add_labels,omitempty"`
-	RemoveLabels       *LabelOptions `url:"remove_labels,comma,omitempty" json:"remove_labels,omitempty"`
-	MilestoneID        *int          `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
-	StateEvent         *string       `url:"state_event,omitempty" json:"state_event,omitempty"`
-	RemoveSourceBranch *bool         `url:"remove_source_branch,omitempty" json:"remove_source_branch,omitempty"`
-	Squash             *bool         `url:"squash,omitempty" json:"squash,omitempty"`
-	DiscussionLocked   *bool         `url:"discussion_locked,omitempty" json:"discussion_locked,omitempty"`
-	AllowCollaboration *bool         `url:"allow_collaboration,omitempty" json:"allow_collaboration,omitempty"`
+	Title              *string `url:"title,omitempty" json:"title,omitempty"`
+	Description        *string `url:"description,omitempty" json:"description,omitempty"`
+	TargetBranch       *string `url:"target_branch,omitempty" json:"target_branch,omitempty"`
+	AssigneeID         *int    `url:"assignee_id,omitempty" json:"assignee_id,omitempty"`
+	AssigneeIDs        *[]int  `url:"assignee_ids,omitempty" json:"assignee_ids,omitempty"`
+	ReviewerIDs        *[]int  `url:"reviewer_ids,omitempty" json:"reviewer_ids,omitempty"`
+	Labels             *Labels `url:"labels,comma,omitempty" json:"labels,omitempty"`
+	AddLabels          *Labels `url:"add_labels,comma,omitempty" json:"add_labels,omitempty"`
+	RemoveLabels       *Labels `url:"remove_labels,comma,omitempty" json:"remove_labels,omitempty"`
+	MilestoneID        *int    `url:"milestone_id,omitempty" json:"milestone_id,omitempty"`
+	StateEvent         *string `url:"state_event,omitempty" json:"state_event,omitempty"`
+	RemoveSourceBranch *bool   `url:"remove_source_branch,omitempty" json:"remove_source_branch,omitempty"`
+	Squash             *bool   `url:"squash,omitempty" json:"squash,omitempty"`
+	DiscussionLocked   *bool   `url:"discussion_locked,omitempty" json:"discussion_locked,omitempty"`
+	AllowCollaboration *bool   `url:"allow_collaboration,omitempty" json:"allow_collaboration,omitempty"`
 }
 
 // UpdateMergeRequest updates an existing project milestone.
@@ -912,27 +908,18 @@ func (s *MergeRequestsService) GetMergeRequestDiffVersions(pid interface{}, merg
 	return v, resp, nil
 }
 
-// GetSingleMergeRequestDiffVersionOptions represents the available
-// GetSingleMergeRequestDiffVersion() options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/merge_requests.html#get-a-single-merge-request-diff-version
-type GetSingleMergeRequestDiffVersionOptions struct {
-	Unidiff *bool `url:"unidiff,omitempty" json:"unidiff,omitempty"`
-}
-
 // GetSingleMergeRequestDiffVersion get a single MR diff version
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/merge_requests.html#get-a-single-merge-request-diff-version
-func (s *MergeRequestsService) GetSingleMergeRequestDiffVersion(pid interface{}, mergeRequest, version int, opt *GetSingleMergeRequestDiffVersionOptions, options ...RequestOptionFunc) (*MergeRequestDiffVersion, *Response, error) {
+func (s *MergeRequestsService) GetSingleMergeRequestDiffVersion(pid interface{}, mergeRequest, version int, options ...RequestOptionFunc) (*MergeRequestDiffVersion, *Response, error) {
 	project, err := parseID(pid)
 	if err != nil {
 		return nil, nil, err
 	}
 	u := fmt.Sprintf("projects/%s/merge_requests/%d/versions/%d", PathEscape(project), mergeRequest, version)
 
-	req, err := s.client.NewRequest(http.MethodGet, u, opt, options)
+	req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/packages.go b/packages.go
index fb7e2d1..a63cdc4 100644
--- a/packages.go
+++ b/packages.go
@@ -114,7 +114,6 @@ type ListProjectPackagesOptions struct {
 	Sort               *string `url:"sort,omitempty" json:"sort,omitempty"`
 	PackageType        *string `url:"package_type,omitempty" json:"package_type,omitempty"`
 	PackageName        *string `url:"package_name,omitempty" json:"package_name,omitempty"`
-	PackageVersion     *string `url:"package_version,omitempty" json:"package_version,omitempty"`
 	IncludeVersionless *bool   `url:"include_versionless,omitempty" json:"include_versionless,omitempty"`
 	Status             *string `url:"status,omitempty" json:"status,omitempty"`
 }
diff --git a/personal_access_tokens.go b/personal_access_tokens.go
index ba32bd8..63d294e 100644
--- a/personal_access_tokens.go
+++ b/personal_access_tokens.go
@@ -120,24 +120,14 @@ func (s *PersonalAccessTokensService) GetSinglePersonalAccessToken(options ...Re
 	return pat, resp, nil
 }
 
-// RotatePersonalAccessTokenOptions represents the available RotatePersonalAccessToken()
-// options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/personal_access_tokens.html#rotate-a-personal-access-token
-type RotatePersonalAccessTokenOptions struct {
-	ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"`
-}
-
 // RotatePersonalAccessToken revokes a token and returns a new token that
-// expires in one week per default.
+// expires in one week.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/personal_access_tokens.html#rotate-a-personal-access-token
-func (s *PersonalAccessTokensService) RotatePersonalAccessToken(token int, opt *RotatePersonalAccessTokenOptions, options ...RequestOptionFunc) (*PersonalAccessToken, *Response, error) {
+func (s *PersonalAccessTokensService) RotatePersonalAccessToken(token int, options ...RequestOptionFunc) (*PersonalAccessToken, *Response, error) {
 	u := fmt.Sprintf("personal_access_tokens/%d/rotate", token)
-
-	req, err := s.client.NewRequest(http.MethodPost, u, opt, options)
+	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/project_access_tokens.go b/project_access_tokens.go
index 2d6057e..780e59a 100644
--- a/project_access_tokens.go
+++ b/project_access_tokens.go
@@ -146,27 +146,18 @@ func (s *ProjectAccessTokensService) CreateProjectAccessToken(pid interface{}, o
 	return pat, resp, nil
 }
 
-// RotateProjectAccessTokenOptions represents the available RotateProjectAccessToken()
-// options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/project_access_tokens.html#rotate-a-project-access-token
-type RotateProjectAccessTokenOptions struct {
-	ExpiresAt *ISOTime `url:"expires_at,omitempty" json:"expires_at,omitempty"`
-}
-
 // RotateProjectAccessToken revokes a project access token and returns a new
-// project access token that expires in one week per default.
+// project access token that expires in one week.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/project_access_tokens.html#rotate-a-project-access-token
-func (s *ProjectAccessTokensService) RotateProjectAccessToken(pid interface{}, id int, opt *RotateProjectAccessTokenOptions, options ...RequestOptionFunc) (*ProjectAccessToken, *Response, error) {
+func (s *ProjectAccessTokensService) RotateProjectAccessToken(pid interface{}, id int, options ...RequestOptionFunc) (*ProjectAccessToken, *Response, error) {
 	projects, err := parseID(pid)
 	if err != nil {
 		return nil, nil, err
 	}
 	u := fmt.Sprintf("projects/%s/access_tokens/%d/rotate", PathEscape(projects), id)
-	req, err := s.client.NewRequest(http.MethodPost, u, opt, options)
+	req, err := s.client.NewRequest(http.MethodPost, u, nil, options)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/project_feature_flags.go b/project_feature_flags.go
index 98c3588..9f75611 100644
--- a/project_feature_flags.go
+++ b/project_feature_flags.go
@@ -53,12 +53,6 @@ type ProjectFeatureFlagStrategyParameter struct {
 	GroupID    string `json:"groupId,omitempty"`
 	UserIDs    string `json:"userIds,omitempty"`
 	Percentage string `json:"percentage,omitempty"`
-
-	// Following fields aren't documented in Gitlab API docs,
-	// but are present in Gitlab API since 13.5.
-	// Docs: https://docs.getunleash.io/reference/activation-strategies#gradual-rollout
-	Rollout    string `json:"rollout,omitempty"`
-	Stickiness string `json:"stickiness,omitempty"`
 }
 
 func (i ProjectFeatureFlag) String() string {
diff --git a/repositories.go b/repositories.go
index dde8761..986dd00 100644
--- a/repositories.go
+++ b/repositories.go
@@ -223,7 +223,6 @@ type CompareOptions struct {
 	From     *string `url:"from,omitempty" json:"from,omitempty"`
 	To       *string `url:"to,omitempty" json:"to,omitempty"`
 	Straight *bool   `url:"straight,omitempty" json:"straight,omitempty"`
-	Unidiff  *bool   `url:"unidiff,omitempty" json:"unidiff,omitempty"`
 }
 
 // Compare compares branches, tags or commits.
diff --git a/settings.go b/settings.go
index ac90566..a81d892 100644
--- a/settings.go
+++ b/settings.go
@@ -568,7 +568,7 @@ type UpdateSettingsOptions struct {
 	HousekeepingFullRepackPeriod                          *int               `url:"housekeeping_full_repack_period,omitempty" json:"housekeeping_full_repack_period,omitempty"`
 	HousekeepingGcPeriod                                  *int               `url:"housekeeping_gc_period,omitempty" json:"housekeeping_gc_period,omitempty"`
 	HousekeepingIncrementalRepackPeriod                   *int               `url:"housekeeping_incremental_repack_period,omitempty" json:"housekeeping_incremental_repack_period,omitempty"`
-	HousekeepingOptimizeRepositoryPeriod                  *int               `url:"housekeeping_optimize_repository_period,omitempty" json:"housekeeping_optimize_repository_period,omitempty"`
+	HousekeepingOptimizedepositoryPeriod                  *int               `url:"housekeeping_optimize_repository_period,omitempty" json:"housekeeping_optimize_repository_period,omitempty"`
 	ImportSources                                         *[]string          `url:"import_sources,omitempty" json:"import_sources,omitempty"`
 	InactiveProjectsDeleteAfterMonths                     *int               `url:"inactive_projects_delete_after_months,omitempty" json:"inactive_projects_delete_after_months,omitempty"`
 	InactiveProjectsMinSizeMB                             *int               `url:"inactive_projects_min_size_mb,omitempty" json:"inactive_projects_min_size_mb,omitempty"`
diff --git a/types.go b/types.go
index e0dc755..d737aec 100644
--- a/types.go
+++ b/types.go
@@ -17,14 +17,12 @@
 package gitlab
 
 import (
-	"bytes"
 	"encoding/json"
 	"errors"
 	"fmt"
 	"net/url"
 	"reflect"
 	"strconv"
-	"strings"
 	"time"
 )
 
@@ -425,35 +423,6 @@ func (t ISOTime) String() string {
 	return time.Time(t).Format(iso8601)
 }
 
-// Labels represents a list of labels.
-type Labels []string
-
-// LabelOptions is a custom type with specific marshaling characteristics.
-type LabelOptions []string
-
-// MarshalJSON implements the json.Marshaler interface.
-func (l *LabelOptions) MarshalJSON() ([]byte, error) {
-	if *l == nil {
-		return []byte(`null`), nil
-	}
-	return json.Marshal(strings.Join(*l, ","))
-}
-
-// UnmarshalJSON implements the json.Unmarshaler interface.
-func (l *LabelOptions) UnmarshalJSON(data []byte) error {
-	type alias LabelOptions
-	if !bytes.HasPrefix(data, []byte("[")) {
-		data = []byte(fmt.Sprintf("[%s]", string(data)))
-	}
-	return json.Unmarshal(data, (*alias)(l))
-}
-
-// EncodeValues implements the query.EncodeValues interface
-func (l *LabelOptions) EncodeValues(key string, v *url.Values) error {
-	v.Set(key, strings.Join(*l, ","))
-	return nil
-}
-
 // LinkTypeValue represents a release link type.
 type LinkTypeValue string
 
diff --git a/users.go b/users.go
index 5ad87ca..4489034 100644
--- a/users.go
+++ b/users.go
@@ -103,7 +103,6 @@ type User struct {
 	UsingLicenseSeat               bool               `json:"using_license_seat"`
 	CustomAttributes               []*CustomAttribute `json:"custom_attributes"`
 	NamespaceID                    int                `json:"namespace_id"`
-	Locked                         bool               `json:"locked"`
 }
 
 // UserIdentity represents a user identity.
@@ -1489,21 +1488,3 @@ func (s *UsersService) CreateUserRunner(opts *CreateUserRunnerOptions, options .
 
 	return r, resp, nil
 }
-
-// CreateServiceAccountUser creates a new service account user. Note only administrators can create new service account users.
-//
-// GitLab API docs: https://docs.gitlab.com/ee/api/users.html#create-service-account-user
-func (s *UsersService) CreateServiceAccountUser(options ...RequestOptionFunc) (*User, *Response, error) {
-	req, err := s.client.NewRequest(http.MethodPost, "service_accounts", nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	usr := new(User)
-	resp, err := s.client.Do(req, usr)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return usr, resp, nil
-}


Test patch:
diff --git a/.github/workflows/lint_and_test.yml b/.github/workflows/lint_and_test.yml
index a47aa30..3ff26fd 100644
--- a/.github/workflows/lint_and_test.yml
+++ b/.github/workflows/lint_and_test.yml
@@ -5,6 +5,9 @@ on:
   push:
     branches: [main]
 
+permissions:
+  contents: read
+
 jobs:
   lint_and_test:
     name: Lint and Test - ${{ matrix.go-version }}
@@ -31,14 +34,3 @@ jobs:
         run: |
           go test -v ./... -coverprofile=coverage.txt -covermode count
           go tool cover -func coverage.txt
-
-      - name: Update coverage report
-        uses: ncruces/go-coverage-report@v0.2.3
-        with:
-          report: 'true'
-          amend: 'true'
-          reuse-go: 'true'
-        if:
-          # Only run for the latest Go version to avoid race conditions
-          github.event_name == 'push' && matrix.go-version == '1.20.x'
-        continue-on-error: true
diff --git a/deployments_merge_requests_test.go b/deployments_merge_requests_test.go
index 02b061c..4c89247 100644
--- a/deployments_merge_requests_test.go
+++ b/deployments_merge_requests_test.go
@@ -26,7 +26,7 @@ func TestDeploymentMergeRequestsService_ListDeploymentMergeRequests(t *testing.T
 
 	mergeRequests, _, err := client.DeploymentMergeRequests.ListDeploymentMergeRequests(278964, 2, &opts)
 	require.NoError(t, err)
-	require.Equal(t, 3, len(mergeRequests))
+	require.Equal(t, 20, len(mergeRequests))
 
 	validStates := []string{"opened", "closed", "locked", "merged"}
 	detailedMergeStatuses := []string{
diff --git a/environments_test.go b/environments_test.go
index 717ac8f..bdfb4bf 100644
--- a/environments_test.go
+++ b/environments_test.go
@@ -185,7 +185,7 @@ func TestStopEnvironment(t *testing.T) {
       "tier": "staging"
     }`)
 	})
-	_, _, err := client.Environments.StopEnvironment(1, 1, &StopEnvironmentOptions{})
+	_, _, err := client.Environments.StopEnvironment(1, 1)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/group_access_tokens_test.go b/group_access_tokens_test.go
index 93a358d..aa1d465 100644
--- a/group_access_tokens_test.go
+++ b/group_access_tokens_test.go
@@ -146,38 +146,6 @@ func TestCreateGroupAccessToken(t *testing.T) {
 		t.Errorf("GroupAccessTokens.CreateGroupAccessToken returned %+v, want %+v", groupAccessToken, want)
 	}
 }
-func TestRotateGroupAccessToken(t *testing.T) {
-	mux, client := setup(t)
-	mux.HandleFunc("/api/v4/groups/1/access_tokens/42/rotate", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		mustWriteHTTPResponse(t, w, "testdata/rotate_group_access_token.json")
-	})
-
-	createdAt, _ := time.Parse(time.RFC3339, "2023-08-01T15:00:00.00Z")
-	expiration := ISOTime(time.Date(2023, time.August, 15, 0, 0, 0, 0, time.UTC))
-	opts := &RotateGroupAccessTokenOptions{ExpiresAt: &expiration}
-	rotatedToken, _, err := client.GroupAccessTokens.RotateGroupAccessToken(1, 42, opts)
-	if err != nil {
-		t.Errorf("GroupAccessTokens.RotateGroupAccessToken returned error: %v", err)
-	}
-
-	want := &GroupAccessToken{
-		ID:          42,
-		UserID:      1337,
-		Name:        "Rotated Token",
-		Scopes:      []string{"api"},
-		ExpiresAt:   &expiration,
-		CreatedAt:   &createdAt,
-		Active:      true,
-		Revoked:     false,
-		Token:       "s3cr3t",
-		AccessLevel: AccessLevelValue(30),
-	}
-
-	if !reflect.DeepEqual(want, rotatedToken) {
-		t.Errorf("GroupAccessTokens.RotateGroupAccessToken returned %+v, want %+v", rotatedToken, want)
-	}
-}
 
 func TestRevokeGroupAccessToken(t *testing.T) {
 	mux, client := setup(t)
diff --git a/group_boards_test.go b/group_boards_test.go
index dbbaff6..27b8a45 100644
--- a/group_boards_test.go
+++ b/group_boards_test.go
@@ -161,7 +161,6 @@ func TestGroupIssueBoardsService_CreateGroupIssueBoard(t *testing.T) {
 			WebURL: "http://example.com/groups/documentcloud",
 		},
 		Milestone: nil,
-		Labels:    []*GroupLabel{},
 		Lists:     []*BoardList{},
 	}
 
@@ -204,24 +203,6 @@ func TestGroupIssueBoardsService_GetGroupIssueBoard(t *testing.T) {
 			  "id": 12,
 			  "title": "10.0"
 			},
-			"labels": [ 
-				{
-					"id":1749,
-					"name":"my-scope1",
-					"description":null,
-					"description_html":"",
-					"text_color":"#FFFFFF",
-					"color":"#6699cc"
-				},
-				{
-					"id":1747,
-					"name":"my-scope2",
-					"description":null,
-					"description_html":"",
-					"text_color":"#FFFFFF",
-					"color":"#FF0000"
-				}
-			],
 			"lists" : [
 			  {
 				"id" : 1,
@@ -270,20 +251,6 @@ func TestGroupIssueBoardsService_GetGroupIssueBoard(t *testing.T) {
 			Title:       "10.0",
 			Description: "",
 		},
-		Labels: []*GroupLabel{
-			{
-				ID:        1749,
-				Name:      "my-scope1",
-				TextColor: "#FFFFFF",
-				Color:     "#6699cc",
-			},
-			{
-				ID:        1747,
-				Name:      "my-scope2",
-				TextColor: "#FFFFFF",
-				Color:     "#FF0000",
-			},
-		},
 		Lists: []*BoardList{
 			{
 				ID: 1,
@@ -397,14 +364,6 @@ func TestGroupIssueBoardsService_UpdateIssueBoard(t *testing.T) {
 			State:       "active",
 			WebURL:      "http://example.com/groups/documentcloud/-/milestones/1",
 		},
-		Labels: []*GroupLabel{
-			{
-				ID: 11,
-				Name: "GroupLabel",
-				Color: "#428BCA",
-				Description: "",
-			},
-		},
 		Lists: []*BoardList{},
 	}
 
diff --git a/group_labels_test.go b/group_labels_test.go
index 42c2a32..c79ab78 100644
--- a/group_labels_test.go
+++ b/group_labels_test.go
@@ -46,20 +46,7 @@ func TestCreateGroupGroupLabel(t *testing.T) {
 	}
 }
 
-func TestDeleteGroupLabelByID(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/groups/1/labels/1", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodDelete)
-	})
-
-	_, err := client.GroupLabels.DeleteGroupLabel("1", "1", nil)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-func TestDeleteGroupLabelByName(t *testing.T) {
+func TestDeleteGroupLabel(t *testing.T) {
 	mux, client := setup(t)
 
 	mux.HandleFunc("/api/v4/groups/1/labels", func(w http.ResponseWriter, r *http.Request) {
@@ -70,7 +57,7 @@ func TestDeleteGroupLabelByName(t *testing.T) {
 		Name: Ptr("My / GroupLabel"),
 	}
 
-	_, err := client.GroupLabels.DeleteGroupLabel("1", nil, label)
+	_, err := client.GroupLabels.DeleteGroupLabel("1", label)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/group_milestones_test.go b/group_milestones_test.go
index 3f840a5..c16b5bf 100644
--- a/group_milestones_test.go
+++ b/group_milestones_test.go
@@ -210,30 +210,6 @@ func TestGroupMilestonesService_UpdateGroupMilestone(t *testing.T) {
 	require.Equal(t, http.StatusNotFound, resp.StatusCode)
 }
 
-func TestGroupMilestonesService_DeleteGroupMilestone(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/groups/5/milestones/12", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodDelete)
-	})
-
-	resp, err := client.GroupMilestones.DeleteGroupMilestone(5, 12, nil)
-	require.NoError(t, err)
-	require.NotNil(t, resp)
-
-	resp, err = client.GroupMilestones.DeleteGroupMilestone(5.01, 12, nil)
-	require.EqualError(t, err, "invalid ID type 5.01, the ID must be an int or a string")
-	require.Nil(t, resp)
-
-	resp, err = client.GroupMilestones.DeleteGroupMilestone(5, 12, nil, errorOption)
-	require.EqualError(t, err, "RequestOptionFunc returns an error")
-	require.Nil(t, resp)
-
-	resp, err = client.GroupMilestones.DeleteGroupMilestone(3, 12, nil)
-	require.Error(t, err)
-	require.Equal(t, http.StatusNotFound, resp.StatusCode)
-}
-
 func TestGroupMilestonesService_GetGroupMilestoneIssues(t *testing.T) {
 	mux, client := setup(t)
 
diff --git a/group_serviceaccounts_test.go b/group_serviceaccounts_test.go
deleted file mode 100644
index e4793f6..0000000
--- a/group_serviceaccounts_test.go
+++ /dev/null
@@ -1,149 +0,0 @@
-//
-// Copyright 2023, James Hong
-//
-// 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"
-	"reflect"
-	"testing"
-	"time"
-)
-
-func TestCreateServiceAccount(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/groups/1/service_accounts", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		fmt.Fprint(w, `
-      {
-	      "id": 57,
-	      "username": "service_account_group_345_6018816a18e515214e0c34c2b33523fc",
-	      "name": "Service account user"
-      }`)
-	})
-
-	sa, _, err := client.Groups.CreateServiceAccount(1)
-	if err != nil {
-		t.Error(err)
-	}
-
-	want := &GroupServiceAccount{
-		ID:       57,
-		UserName: "service_account_group_345_6018816a18e515214e0c34c2b33523fc",
-		Name:     "Service account user",
-	}
-
-	if !reflect.DeepEqual(sa, want) {
-		t.Errorf("CreateServiceAccount returned \ngot:\n%v\nwant:\n%v", Stringify(sa), Stringify(want))
-	}
-}
-
-func TestCreateServiceAccountPersonalAccessToken(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/groups/1/service_accounts/57/personal_access_tokens", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		fmt.Fprint(w, `
-      {
-      	"id":6,
-      	"name":"service_account_token",
-      	"revoked":false,
-      	"created_at":"2023-06-13T07:47:13.000Z",
-      	"scopes":["api"],
-      	"user_id":71,
-      	"last_used_at":null,
-      	"active":true,
-      	"expires_at":"2024-06-12",
-      	"token":"random_token"
-      }`)
-	})
-	options := &CreateServiceAccountPersonalAccessTokenOptions{
-		Scopes: Ptr([]string{"api"}),
-		Name:   Ptr("service_account_token"),
-	}
-	pat, _, err := client.Groups.CreateServiceAccountPersonalAccessToken(1, 57, options)
-	if err != nil {
-		t.Error(err)
-	}
-
-	datePointer := time.Date(2023, 0o6, 13, 0o7, 47, 13, 0, time.UTC)
-	expiresAt := ISOTime(time.Date(2024, time.June, 12, 0, 0, 0, 0, time.UTC))
-
-	want := &PersonalAccessToken{
-		ID:         6,
-		Name:       "service_account_token",
-		Revoked:    false,
-		CreatedAt:  &datePointer,
-		Scopes:     []string{"api"},
-		UserID:     71,
-		LastUsedAt: nil,
-		Active:     true,
-		ExpiresAt:  &expiresAt,
-		Token:      "random_token",
-	}
-
-	if !reflect.DeepEqual(pat, want) {
-		t.Errorf("CreateServiceAccountPersonalAccessToken returned \ngot:\n%v\nwant:\n%v", Stringify(pat), Stringify(want))
-	}
-}
-
-func TestRotateServiceAccountPersonalAccessToken(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/groups/1/service_accounts/57/personal_access_tokens/6/rotate", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		fmt.Fprint(w, `
-      {
-      	"id":7,
-      	"name":"service_account_token",
-      	"revoked":false,
-      	"created_at":"2023-06-13T07:54:49.000Z",
-      	"scopes":["api"],
-      	"user_id":71,
-      	"last_used_at":null,
-      	"active":true,
-      	"expires_at":"2025-06-20",
-      	"token":"random_token_2"
-      }`)
-	})
-
-	pat, _, err := client.Groups.RotateServiceAccountPersonalAccessToken(1, 57, 6)
-	if err != nil {
-		t.Error(err)
-	}
-
-	datePointer := time.Date(2023, 0o6, 13, 0o7, 54, 49, 0, time.UTC)
-	expiresAt := ISOTime(time.Date(2025, time.June, 20, 0, 0, 0, 0, time.UTC))
-
-	want := &PersonalAccessToken{
-		ID:         7,
-		Name:       "service_account_token",
-		Revoked:    false,
-		CreatedAt:  &datePointer,
-		Scopes:     []string{"api"},
-		UserID:     71,
-		LastUsedAt: nil,
-		Active:     true,
-		ExpiresAt:  &expiresAt,
-		Token:      "random_token_2",
-	}
-
-	if !reflect.DeepEqual(pat, want) {
-		t.Errorf("RotateServiceAccountPersonalAccessToken returned \ngot:\n%v\nwant:\n%v", Stringify(pat), Stringify(want))
-	}
-}
diff --git a/group_ssh_certificates_test.go b/group_ssh_certificates_test.go
deleted file mode 100644
index 602a2e2..0000000
--- a/group_ssh_certificates_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package gitlab
-
-import (
-	"net/http"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/require"
-)
-
-func TestListGroupSSHCertificates(t *testing.T) {
-	mux, client := setup(t)
-
-	path := "/api/v4/groups/1/ssh_certificates"
-
-	mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodGet)
-		mustWriteHTTPResponse(t, w, "testdata/list_group_ssh_certificates.json")
-	})
-
-	certificates, _, err := client.GroupSSHCertificates.ListGroupSSHCertificates(1)
-	require.NoError(t, err)
-
-	want := []*GroupSSHCertificate{
-		{
-			ID:        1876,
-			Title:     "SSH Certificate",
-			Key:       "ssh-rsa FAKE-KEY example@gitlab.com",
-			CreatedAt: Ptr(time.Date(2022, time.March, 20, 20, 42, 40, 221000000, time.UTC)),
-		},
-	}
-
-	require.Equal(t, want, certificates)
-}
-
-func TestCreateGroupSSHCertificate(t *testing.T) {
-	mux, client := setup(t)
-
-	path := "/api/v4/groups/84/ssh_certificates"
-
-	mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		mustWriteHTTPResponse(t, w, "testdata/create_group_ssh_certificates.json")
-	})
-
-	cert, _, err := client.GroupSSHCertificates.CreateGroupSSHCertificate(84, &CreateGroupSSHCertificateOptions{
-		Key:   Ptr("ssh-rsa FAKE-KEY example@gitlab.com"),
-		Title: Ptr("SSH Certificate"),
-	})
-	require.NoError(t, err)
-
-	want := &GroupSSHCertificate{
-		ID:        1876,
-		Title:     "SSH Certificate",
-		Key:       "ssh-rsa FAKE-KEY example@gitlab.com",
-		CreatedAt: Ptr(time.Date(2022, time.March, 20, 20, 42, 40, 221000000, time.UTC)),
-	}
-
-	require.Equal(t, want, cert)
-}
-
-func TestDeleteGroupSSHCertificate(t *testing.T) {
-	mux, client := setup(t)
-
-	path := "/api/v4/groups/1/ssh_certificates/1876"
-
-	mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodDelete)
-	})
-
-	_, err := client.GroupSSHCertificates.DeleteGroupSSHCertificate(1, 1876)
-	require.NoError(t, err)
-}
diff --git a/issues_test.go b/issues_test.go
index 22a3038..0b73499 100644
--- a/issues_test.go
+++ b/issues_test.go
@@ -92,6 +92,35 @@ func TestDeleteIssue(t *testing.T) {
 	}
 }
 
+func TestReorderIssue(t *testing.T) {
+	mux, client := setup(t)
+
+	mux.HandleFunc("/api/v4/projects/1/issues/5/reorder", func(w http.ResponseWriter, r *http.Request) {
+		testMethod(t, r, http.MethodPut)
+		fmt.Fprint(w, `{"id":1, "title" : "Reordered issue", "description": "This is the description of a reordered issue", "author" : {"id" : 1, "name": "corrie"}, "assignees":[{"id":1}]}`)
+	})
+
+	afterID := 100
+	opt := ReorderIssueOptions{MoveAfterID: &afterID}
+
+	issue, _, err := client.Issues.ReorderIssue("1", 5, &opt)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	want := &Issue{
+		ID:          1,
+		Title:       "Reordered issue",
+		Description: "This is the description of a reordered issue",
+		Author:      &IssueAuthor{ID: 1, Name: "corrie"},
+		Assignees:   []*IssueAssignee{{ID: 1}},
+	}
+
+	if !reflect.DeepEqual(want, issue) {
+		t.Errorf("Issues.ReorderIssue returned %+v, want %+v", issue, want)
+	}
+}
+
 func TestMoveIssue(t *testing.T) {
 	mux, client := setup(t)
 
diff --git a/labels_test.go b/labels_test.go
index 81260b3..3abfe3a 100644
--- a/labels_test.go
+++ b/labels_test.go
@@ -48,21 +48,7 @@ func TestCreateLabel(t *testing.T) {
 	}
 }
 
-func TestDeleteLabelbyID(t *testing.T) {
-	mux, client := setup(t)
-
-	mux.HandleFunc("/api/v4/projects/1/labels/1", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodDelete)
-	})
-
-	// Delete label
-	_, err := client.Labels.DeleteLabel("1", "1", nil)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-func TestDeleteLabelbyName(t *testing.T) {
+func TestDeleteLabel(t *testing.T) {
 	mux, client := setup(t)
 
 	mux.HandleFunc("/api/v4/projects/1/labels", func(w http.ResponseWriter, r *http.Request) {
@@ -74,7 +60,7 @@ func TestDeleteLabelbyName(t *testing.T) {
 		Name: Ptr("My Label"),
 	}
 
-	_, err := client.Labels.DeleteLabel("1", nil, label)
+	_, err := client.Labels.DeleteLabel("1", label)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/merge_requests_test.go b/merge_requests_test.go
index eb77362..8a7b191 100644
--- a/merge_requests_test.go
+++ b/merge_requests_test.go
@@ -166,7 +166,7 @@ func TestListProjectMergeRequests(t *testing.T) {
 	mergeRequests, _, err := client.MergeRequests.ListProjectMergeRequests(278964, &opts)
 
 	require.NoError(t, err)
-	require.Equal(t, 3, len(mergeRequests))
+	require.Equal(t, 20, len(mergeRequests))
 
 	validStates := []string{"opened", "closed", "locked", "merged"}
 	detailedMergeStatuses := []string{
@@ -411,7 +411,8 @@ func TestListMergeRequestDiffs(t *testing.T) {
 	})
 
 	opts := &ListMergeRequestDiffsOptions{
-		ListOptions: ListOptions{Page: 1, PerPage: 2},
+		Page:    1,
+		PerPage: 2,
 	}
 
 	diffs, _, err := client.MergeRequests.ListMergeRequestDiffs(1, 1, opts)
diff --git a/personal_access_tokens_test.go b/personal_access_tokens_test.go
index 36eee51..de92d83 100644
--- a/personal_access_tokens_test.go
+++ b/personal_access_tokens_test.go
@@ -225,37 +225,6 @@ func TestGetSinglePersonalAccessToken(t *testing.T) {
 	}
 }
 
-func TestRotatePersonalAccessToken(t *testing.T) {
-	mux, client := setup(t)
-	mux.HandleFunc("/api/v4/personal_access_tokens/42/rotate", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		mustWriteHTTPResponse(t, w, "testdata/rotate_personal_access_token.json")
-	})
-
-	createdAt, _ := time.Parse(time.RFC3339, "2023-08-01T15:00:00.000Z")
-	expiration := ISOTime(time.Date(2023, time.August, 15, 0, 0, 0, 0, time.UTC))
-	opts := &RotatePersonalAccessTokenOptions{ExpiresAt: &expiration}
-	rotatedToken, _, err := client.PersonalAccessTokens.RotatePersonalAccessToken(42, opts)
-	if err != nil {
-		t.Errorf("PersonalAccessTokens.RotatePersonalAccessToken returned error: %v", err)
-	}
-
-	want := &PersonalAccessToken{
-		ID:        42,
-		UserID:    1337,
-		Name:      "Rotated Token",
-		Scopes:    []string{"api"},
-		ExpiresAt: &expiration,
-		CreatedAt: &createdAt,
-		Active:    true,
-		Revoked:   false,
-		Token:     "s3cr3t",
-	}
-
-	if !reflect.DeepEqual(want, rotatedToken) {
-		t.Errorf("PersonalAccessTokens.RotatePersonalAccessTokens returned %+v, want %+v", rotatedToken, want)
-	}
-}
 func TestRevokePersonalAccessToken(t *testing.T) {
 	mux, client := setup(t)
 
diff --git a/project_access_tokens_test.go b/project_access_tokens_test.go
index e0fc861..efe2230 100644
--- a/project_access_tokens_test.go
+++ b/project_access_tokens_test.go
@@ -147,39 +147,6 @@ func TestCreateProjectAccessToken(t *testing.T) {
 	}
 }
 
-func TestRotateProjectAccessToken(t *testing.T) {
-	mux, client := setup(t)
-	mux.HandleFunc("/api/v4/projects/1/access_tokens/42/rotate", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		mustWriteHTTPResponse(t, w, "testdata/rotate_project_access_token.json")
-	})
-
-	createdAt, _ := time.Parse(time.RFC3339, "2023-08-01T15:00:00.000Z")
-	expiration := ISOTime(time.Date(2023, time.August, 15, 0, 0, 0, 0, time.UTC))
-	opts := &RotateProjectAccessTokenOptions{ExpiresAt: &expiration}
-	rotatedToken, _, err := client.ProjectAccessTokens.RotateProjectAccessToken(1, 42, opts)
-	if err != nil {
-		t.Errorf("ProjectAccessTokens.RotateProjectAccessToken returned error: %v", err)
-	}
-
-	want := &ProjectAccessToken{
-		ID:          42,
-		UserID:      1337,
-		Name:        "Rotated Token",
-		Scopes:      []string{"api"},
-		ExpiresAt:   &expiration,
-		CreatedAt:   &createdAt,
-		Active:      true,
-		Revoked:     false,
-		AccessLevel: AccessLevelValue(30),
-		Token:       "s3cr3t",
-	}
-
-	if !reflect.DeepEqual(want, rotatedToken) {
-		t.Errorf("ProjectAccessTokens.RotateProjectAccessTokens returned %+v, want %+v", rotatedToken, want)
-	}
-}
-
 func TestRevokeProjectAccessToken(t *testing.T) {
 	mux, client := setup(t)
 
diff --git a/project_feature_flags_test.go b/project_feature_flags_test.go
index b660f00..7db8e92 100644
--- a/project_feature_flags_test.go
+++ b/project_feature_flags_test.go
@@ -117,21 +117,6 @@ func TestGetProjectFeatureFlag(t *testing.T) {
 					},
 				},
 			},
-			{
-				ID:   24,
-				Name: "flexibleRollout",
-				Parameters: &ProjectFeatureFlagStrategyParameter{
-					GroupID:    "default",
-					Rollout:    "50",
-					Stickiness: "default",
-				},
-				Scopes: []*ProjectFeatureFlagScope{
-					{
-						ID:               52,
-						EnvironmentScope: "*",
-					},
-				},
-			},
 		},
 	}
 
diff --git a/testdata/create_group_ssh_certificates.json b/testdata/create_group_ssh_certificates.json
deleted file mode 100644
index a5a7d6f..0000000
--- a/testdata/create_group_ssh_certificates.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "id": 1876,
-  "title": "SSH Certificate",
-  "key": "ssh-rsa FAKE-KEY example@gitlab.com",
-  "created_at": "2022-03-20T20:42:40.221Z"
-}
diff --git a/testdata/create_service_account_user.json b/testdata/create_service_account_user.json
deleted file mode 100644
index e5354e5..0000000
--- a/testdata/create_service_account_user.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "id": 999,
-  "username": "service_account_94e556c44d40d5a710ca59e3a0f40a3d",
-  "name": "Service account user",
-  "state": "active",
-  "locked": false,
-  "avatar_url": "http://localhost:3000/uploads/user/avatar/999/cd8.jpeg",
-  "web_url": "http://localhost:3000/service_account_94e556c44d40d5a710ca59e3a0f40a3d"
-}
diff --git a/testdata/get_merge_requests.json b/testdata/get_merge_requests.json
index be67049..28a79d3 100644
--- a/testdata/get_merge_requests.json
+++ b/testdata/get_merge_requests.json
@@ -4,7 +4,7 @@
     "iid": 15442,
     "project_id": 278964,
     "title": "Draft: Use structured logging for DB load balancer",
-    "description": "## What does this MR do?",
+    "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",
     "created_at": "2019-08-20T10:58:54.413Z",
     "updated_at": "2019-08-20T12:01:49.849Z",
@@ -91,7 +91,7 @@
     "iid": 15441,
     "project_id": 278964,
     "title": "Draft: Implement public MR-level approval rules API",
-    "description": "## What does this MR do?",
+    "description": "## What does this MR do?\r\n\r\nAdd API endpoints so API users can list, create, update and delete MR-level approval rules.\r\n\r\nThe following API endpoints are added:\r\n- `GET /projects/:id/merge_requests/:merge_request_iid/approval_rules`\r\n- `POST /projects/:id/merge_requests/:merge_request_iid/approval_rules`\r\n- `PUT /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id`\r\n- `DELETE /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id`\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- [x] [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 \r\n\r\n#12055",
     "state": "opened",
     "created_at": "2019-08-20T10:51:56.806Z",
     "updated_at": "2019-08-20T11:00:25.244Z",
@@ -186,7 +186,7 @@
     "iid": 15440,
     "project_id": 278964,
     "title": "Log in Prometheus current number of host and index",
-    "description": "## What does this MR do?",
+    "description": "## What does this MR do?\n\n1. Log current number of hosts and current index when `#initialize` is called\n1. Log current number of hosts and current index when `#next` is called\n1. Log current number of hosts and current index when `#hosts=` is called\n\nhttps://gitlab.com/gitlab-org/gitlab-ee/issues/13630\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [x] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team",
     "state": "opened",
     "created_at": "2019-08-20T10:20:51.687Z",
     "updated_at": "2019-08-20T11:06:40.659Z",
@@ -284,5 +284,1487 @@
       "completed_count": 1
     },
     "approvals_before_merge": 1
+  },
+  {
+    "id": 35355199,
+    "iid": 15438,
+    "project_id": 278964,
+    "title": "Draft: Resolve \"Cancel redundant pipelines in merge train when reconstruction happens\"",
+    "description": "## What does this MR do?\n\n<!--\n\nDescribe in detail what your merge request does and why.\n\nAre there any risks involved with the proposed change? What additional\ntest coverage is introduced to offset the risk?\n\nPlease keep this description up-to-date with any discussion that takes\nplace so that reviewers can understand your intent. This is especially\nimportant if they didn't participate in the discussion.\n\n-->\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team \n\n\nCloses #12996",
+    "state": "opened",
+    "created_at": "2019-08-20T08:58:07.507Z",
+    "updated_at": "2019-08-20T11:31:20.704Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "12996-cancel-redundant-pipelines-in-merge-train-when-reconstruction-happens-2",
+    "user_notes_count": 1,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 4391348,
+      "name": "Sean Carroll",
+      "username": "sean_carroll",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/4391348/avatar.png",
+      "web_url": "https://gitlab.com/sean_carroll"
+    },
+    "author": {
+      "id": 4391348,
+      "name": "Sean Carroll",
+      "username": "sean_carroll",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/4391348/avatar.png",
+      "web_url": "https://gitlab.com/sean_carroll"
+    },
+    "assignees": [
+      {
+        "id": 4391348,
+        "name": "Sean Carroll",
+        "username": "sean_carroll",
+        "state": "active",
+        "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/4391348/avatar.png",
+        "web_url": "https://gitlab.com/sean_carroll"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "GitLab Enterprise Edition",
+      "P2",
+      "Release [DEPRECATED]",
+      "S2",
+      "continuous delivery",
+      "devops::release",
+      "devops::release::merge trains",
+      "feature",
+      "group::progressive delivery"
+    ],
+    "work_in_progress": true,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "broken_status",
+    "sha": "fcf75b9330b1104bc08c0190cf871759db3f22e0",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": null,
+    "reference": "!15438",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15438",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": null
+  },
+  {
+    "id": 35354393,
+    "iid": 15437,
+    "project_id": 278964,
+    "title": "Draft: Add purchase point to group billing page",
+    "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\nAdds Billing Plans to top-level `groups/billing` route.\r\nChanges Billing Plan table to Card layout as per https://gitlab.com/gitlab-org/gitlab-ce/issues/63599\r\n\r\nTop-level `groups/billing`\r\n![groups-billing-plans-cards](/uploads/d6a636af7f6d5ba341bfec0d1375f8ea/groups-billing-plans-cards.png)\r\n\r\n`profile/billing`\r\n![profile-billing-plans-cards](/uploads/fa6de1e12b07423573d38af0f523004b/profile-billing-plans-cards.png)\r\n\r\nCloses https://gitlab.com/gitlab-org/gitlab-ce/issues/63599\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",
+    "created_at": "2019-08-20T08:46:46.344Z",
+    "updated_at": "2019-08-20T09:26:29.383Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "add-purchase-point-to-group-billing-page",
+    "user_notes_count": 4,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 4430316,
+      "name": "Ragnar Hardarson",
+      "username": "rhardarson",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/ed0d38989fa0a7f168f229dfdf56d2b4?s=80&d=identicon",
+      "web_url": "https://gitlab.com/rhardarson"
+    },
+    "author": {
+      "id": 4430316,
+      "name": "Ragnar Hardarson",
+      "username": "rhardarson",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/ed0d38989fa0a7f168f229dfdf56d2b4?s=80&d=identicon",
+      "web_url": "https://gitlab.com/rhardarson"
+    },
+    "assignees": [
+      {
+        "id": 4430316,
+        "name": "Ragnar Hardarson",
+        "username": "rhardarson",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/ed0d38989fa0a7f168f229dfdf56d2b4?s=80&d=identicon",
+        "web_url": "https://gitlab.com/rhardarson"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "GitLab Enterprise Edition",
+      "feature",
+      "frontend",
+      "group::fulfillment"
+    ],
+    "work_in_progress": true,
+    "milestone": null,
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "9af81f5ddb59a57d663c27bcb3144f8c0c26a7fd",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": false,
+    "reference": "!15437",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15437",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35345116,
+    "iid": 15436,
+    "project_id": 278964,
+    "title": "[EE] Add Issue and Merge Request titles to Todo items",
+    "description": "## What does this MR do?\n\nEE version of https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/30435\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team",
+    "state": "opened",
+    "created_at": "2019-08-20T08:14:48.224Z",
+    "updated_at": "2019-08-20T08:14:48.224Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "include-issue-mr-titles-ee",
+    "user_notes_count": 0,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 1642716,
+      "name": "Jan Provaznik",
+      "username": "jprovaznik",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/4577c0b60b7640100030d7ab267aba95?s=80&d=identicon",
+      "web_url": "https://gitlab.com/jprovaznik"
+    },
+    "author": {
+      "id": 1642716,
+      "name": "Jan Provaznik",
+      "username": "jprovaznik",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/4577c0b60b7640100030d7ab267aba95?s=80&d=identicon",
+      "web_url": "https://gitlab.com/jprovaznik"
+    },
+    "assignees": [
+      {
+        "id": 1642716,
+        "name": "Jan Provaznik",
+        "username": "jprovaznik",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/4577c0b60b7640100030d7ab267aba95?s=80&d=identicon",
+        "web_url": "https://gitlab.com/jprovaznik"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": ["Community contribution", "devops::plan"],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 693521,
+      "iid": 35,
+      "group_id": 9970,
+      "title": "12.2",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-10-30T16:48:32.567Z",
+      "updated_at": "2019-01-16T19:50:02.455Z",
+      "due_date": "2019-08-22",
+      "start_date": "2019-07-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/35"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "54ac04bb0ec8849bf2ff43a949150d18008c8d35",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": true,
+    "reference": "!15436",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15436",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": true,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35343590,
+    "iid": 15435,
+    "project_id": 278964,
+    "title": "Draft: Resolve \"Data and Privacy Agreement for GitLab users\"",
+    "description": "## What does this MR do?\n\n<!--\n\nDescribe in detail what your merge request does and why.\n\nAre there any risks involved with the proposed change? What additional\ntest coverage is introduced to offset the risk?\n\nPlease keep this description up-to-date with any discussion that takes\nplace so that reviewers can understand your intent. This is especially\nimportant if they didn't participate in the discussion.\n\n-->\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team \n\n\nCloses #13665",
+    "state": "opened",
+    "created_at": "2019-08-20T07:47:26.890Z",
+    "updated_at": "2019-08-20T10:37:36.505Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "13665-data-and-privacy-agreement-for-gitlab-users",
+    "user_notes_count": 1,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 750946,
+      "name": "Dennis Tang",
+      "username": "dennis",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/82f4c234d7deecb4760072ecd59f184a?s=80&d=identicon",
+      "web_url": "https://gitlab.com/dennis"
+    },
+    "author": {
+      "id": 750946,
+      "name": "Dennis Tang",
+      "username": "dennis",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/82f4c234d7deecb4760072ecd59f184a?s=80&d=identicon",
+      "web_url": "https://gitlab.com/dennis"
+    },
+    "assignees": [
+      {
+        "id": 750946,
+        "name": "Dennis Tang",
+        "username": "dennis",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/82f4c234d7deecb4760072ecd59f184a?s=80&d=identicon",
+        "web_url": "https://gitlab.com/dennis"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "P1",
+      "S1",
+      "UX ready",
+      "collection 🧺",
+      "devops::growth",
+      "feature",
+      "frontend",
+      "gitlab.com",
+      "group::telemetry",
+      "missed:12.1",
+      "missed:12.1",
+      "unplanned",
+      "workflow::In review"
+    ],
+    "work_in_progress": true,
+    "milestone": {
+      "id": 693521,
+      "iid": 35,
+      "group_id": 9970,
+      "title": "12.2",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-10-30T16:48:32.567Z",
+      "updated_at": "2019-01-16T19:50:02.455Z",
+      "due_date": "2019-08-22",
+      "start_date": "2019-07-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/35"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "de5099c8b64d118648c5fd9e381eadc30ae9b72d",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": null,
+    "reference": "!15435",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15435",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": null
+  },
+  {
+    "id": 35338313,
+    "iid": 15434,
+    "project_id": 278964,
+    "title": "Flexible Rules for CI Build config",
+    "description": "## What does this MR do?\n\nThis is the EE compatibility check merge request for https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/29011\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team",
+    "state": "opened",
+    "created_at": "2019-08-20T05:51:33.955Z",
+    "updated_at": "2019-08-20T05:52:16.896Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "ee-ci-config-on-policy",
+    "user_notes_count": 0,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 12452,
+      "name": "Kamil Trzciński",
+      "username": "ayufan",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/7a285e30f35d72526fb0954e8fe7cefa?s=80&d=identicon",
+      "web_url": "https://gitlab.com/ayufan"
+    },
+    "author": {
+      "id": 730684,
+      "name": "drew",
+      "username": "drewcimino",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/59b7f2c95acd4a085d964f745ead6bdb?s=80&d=identicon",
+      "web_url": "https://gitlab.com/drewcimino"
+    },
+    "assignees": [
+      {
+        "id": 12452,
+        "name": "Kamil Trzciński",
+        "username": "ayufan",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/7a285e30f35d72526fb0954e8fe7cefa?s=80&d=identicon",
+        "web_url": "https://gitlab.com/ayufan"
+      },
+      {
+        "id": 730684,
+        "name": "drew",
+        "username": "drewcimino",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/59b7f2c95acd4a085d964f745ead6bdb?s=80&d=identicon",
+        "web_url": "https://gitlab.com/drewcimino"
+      }
+    ],
+    "source_project_id": 11495811,
+    "target_project_id": 278964,
+    "labels": ["devops::verify", "feature", "group::continuous integration"],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 693521,
+      "iid": 35,
+      "group_id": 9970,
+      "title": "12.2",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-10-30T16:48:32.567Z",
+      "updated_at": "2019-01-16T19:50:02.455Z",
+      "due_date": "2019-08-22",
+      "start_date": "2019-07-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/35"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "846faa7dccc7e52f8d7af6b2fe1ca595340219a4",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": false,
+    "allow_collaboration": false,
+    "allow_maintainer_to_push": false,
+    "reference": "!15434",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15434",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35337566,
+    "iid": 15433,
+    "project_id": 278964,
+    "title": "Draft:",
+    "description": "## What does this MR do?\n\nThis is `WIP` to get feedback on how a `Design` might receive a message when its `Note`s are created, updated, resolved or unresolved.\n\nIssue #13353.\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team \n\n\nCloses #13353",
+    "state": "opened",
+    "created_at": "2019-08-20T05:20:41.290Z",
+    "updated_at": "2019-08-20T05:31:20.363Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "13353-DesignType-notes_count",
+    "user_notes_count": 1,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 2702368,
+      "name": "Luke Duncalfe",
+      "username": ".luke",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+      "web_url": "https://gitlab.com/.luke"
+    },
+    "author": {
+      "id": 2702368,
+      "name": "Luke Duncalfe",
+      "username": ".luke",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+      "web_url": "https://gitlab.com/.luke"
+    },
+    "assignees": [
+      {
+        "id": 2702368,
+        "name": "Luke Duncalfe",
+        "username": ".luke",
+        "state": "active",
+        "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+        "web_url": "https://gitlab.com/.luke"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "Deliverable",
+      "GitLab Enterprise Edition",
+      "GraphQL",
+      "backend",
+      "design management",
+      "devops::create",
+      "feature",
+      "group::knowledge",
+      "workflow::In dev"
+    ],
+    "work_in_progress": true,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "de578529c00060f334b2b3e5aeda7e269d838a73",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": false,
+    "reference": "!15433",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15433",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35336438,
+    "iid": 15432,
+    "project_id": 278964,
+    "title": "Draft:",
+    "description": "## What does this MR do?\n\nThis is `WIP` to get feedback on how a `Design` might receive a message when its `Note`s are created, updated, resolved or unresolved.\n\nIssue #13353.\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team",
+    "state": "closed",
+    "created_at": "2019-08-20T04:57:41.639Z",
+    "updated_at": "2019-08-20T05:10:54.302Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": {
+      "id": 2702368,
+      "name": "Luke Duncalfe",
+      "username": ".luke",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+      "web_url": "https://gitlab.com/.luke"
+    },
+    "closed_at": "2019-08-20T05:10:54.356Z",
+    "target_branch": "master",
+    "source_branch": "13353-DesignType-notes_count",
+    "user_notes_count": 1,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 2702368,
+      "name": "Luke Duncalfe",
+      "username": ".luke",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+      "web_url": "https://gitlab.com/.luke"
+    },
+    "author": {
+      "id": 2702368,
+      "name": "Luke Duncalfe",
+      "username": ".luke",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+      "web_url": "https://gitlab.com/.luke"
+    },
+    "assignees": [
+      {
+        "id": 2702368,
+        "name": "Luke Duncalfe",
+        "username": ".luke",
+        "state": "active",
+        "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+        "web_url": "https://gitlab.com/.luke"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "Deliverable",
+      "GitLab Enterprise Edition",
+      "GraphQL",
+      "backend",
+      "design management",
+      "devops::create",
+      "feature",
+      "group::knowledge",
+      "workflow::In dev"
+    ],
+    "work_in_progress": true,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "34b3b319044987ba86af00b19ab5259d54aa8365",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": false,
+    "reference": "!15432",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15432",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35333974,
+    "iid": 15431,
+    "project_id": 278964,
+    "title": "Quarantine failing test",
+    "description": "## What does this MR do?\n\nThe elasticsearch test fails because it uses a license file as a template, and the template is missing.\n\nSee https://gitlab.com/gitlab-org/quality/nightly/issues/127\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team",
+    "state": "merged",
+    "created_at": "2019-08-20T03:34:46.802Z",
+    "updated_at": "2019-08-20T08:15:51.047Z",
+    "merged_by": {
+      "id": 178079,
+      "name": "Walmyr Lima e Silva Filho",
+      "username": "wlsf82",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/178079/avatar.png",
+      "web_url": "https://gitlab.com/wlsf82"
+    },
+    "merged_at": "2019-08-20T08:15:51.244Z",
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "qa-quarantine-templates-test",
+    "user_notes_count": 1,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": null,
+    "author": {
+      "id": 655908,
+      "name": "Mark Lapierre",
+      "username": "mlapierre",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/655908/avatar.png",
+      "web_url": "https://gitlab.com/mlapierre"
+    },
+    "assignees": [],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": ["QA", "Quality", "backstage"],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 693521,
+      "iid": 35,
+      "group_id": 9970,
+      "title": "12.2",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-10-30T16:48:32.567Z",
+      "updated_at": "2019-01-16T19:50:02.455Z",
+      "due_date": "2019-08-22",
+      "start_date": "2019-07-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/35"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "cba824ca33a199303091c2870e43f897574a3f0e",
+    "merge_commit_sha": "6c3af2d1ce3c64bc559332b8b44dc3b33825781a",
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": true,
+    "reference": "!15431",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15431",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35328489,
+    "iid": 15428,
+    "project_id": 278964,
+    "title": "Replace haml analytics stage-list-item with vue component",
+    "description": "## What does this MR do?\r\n\r\nUpdate the `stage-nav-item` component on the *analytics/cycle_analytics* page\r\n* Adds the `stage-nav-item` component\r\n* Updates css classes used on the table headers\r\n* Fixes broken UI introduced in !14910\r\n\r\n| Before | After |\r\n| --- | --- |\r\n| ![Screen_Shot_2019-08-20_at_11.09.02_am](/uploads/49c7a93b60362439a6773c15b7ecb500/Screen_Shot_2019-08-20_at_11.09.02_am.png) | ![Screen_Shot_2019-08-20_at_11.19.43_am](/uploads/250858f0f3b7cdd2fd59a2c3d43e250d/Screen_Shot_2019-08-20_at_11.19.43_am.png) |\r\n\r\n## Related issues\r\n#13076\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",
+    "created_at": "2019-08-20T01:33:19.691Z",
+    "updated_at": "2019-08-20T03:35:18.319Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "ek-replace-analytics-haml-stage-list-item",
+    "user_notes_count": 2,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 3732265,
+      "name": "Paul Gascou-Vaillancourt",
+      "username": "pgascouvaillancourt",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/7a190c0b1ff5772c9230b4d9a38ac608?s=80&d=identicon",
+      "web_url": "https://gitlab.com/pgascouvaillancourt"
+    },
+    "author": {
+      "id": 3397881,
+      "name": "Ezekiel Kigbo",
+      "username": "ekigbo",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/3397881/avatar.png",
+      "web_url": "https://gitlab.com/ekigbo"
+    },
+    "assignees": [
+      {
+        "id": 3732265,
+        "name": "Paul Gascou-Vaillancourt",
+        "username": "pgascouvaillancourt",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/7a190c0b1ff5772c9230b4d9a38ac608?s=80&d=identicon",
+        "web_url": "https://gitlab.com/pgascouvaillancourt"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "UI component",
+      "analytics",
+      "bug",
+      "cycle analytics",
+      "frontend"
+    ],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "2ea513d63d0b03a15d19e34a170e406f7ebab1a6",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": false,
+    "reference": "!15428",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15428",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35328403,
+    "iid": 15427,
+    "project_id": 278964,
+    "title": "Remove the store_designs_in_lfs feature flag",
+    "description": "## What does this MR do?\n\nThis MR removes the `store_designs_in_lfs` feature flag from the codebase. \n\nIssue https://gitlab.com/gitlab-org/gitlab-ee/issues/12158.\n\nThe feature flag was added in https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/13389. \n\nThis MR does not include a changelog entry, because the feature has been enabled by default since https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/13389 and that MR contained the changelog.\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [-] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [x] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [x] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [x] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [-] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [-] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\n- [x] [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/).\n- [-] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)",
+    "state": "opened",
+    "created_at": "2019-08-20T01:27:32.001Z",
+    "updated_at": "2019-08-20T09:57:31.340Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "12158-remove-store_designs_in_lfs-feature-flag",
+    "user_notes_count": 5,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 12452,
+      "name": "Kamil Trzciński",
+      "username": "ayufan",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/7a285e30f35d72526fb0954e8fe7cefa?s=80&d=identicon",
+      "web_url": "https://gitlab.com/ayufan"
+    },
+    "author": {
+      "id": 2702368,
+      "name": "Luke Duncalfe",
+      "username": ".luke",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+      "web_url": "https://gitlab.com/.luke"
+    },
+    "assignees": [
+      {
+        "id": 12452,
+        "name": "Kamil Trzciński",
+        "username": "ayufan",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/7a285e30f35d72526fb0954e8fe7cefa?s=80&d=identicon",
+        "web_url": "https://gitlab.com/ayufan"
+      },
+      {
+        "id": 2702368,
+        "name": "Luke Duncalfe",
+        "username": ".luke",
+        "state": "active",
+        "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/2702368/avatar.png",
+        "web_url": "https://gitlab.com/.luke"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "Deliverable",
+      "GitLab Enterprise Edition",
+      "backend",
+      "backstage",
+      "design management",
+      "devops::create",
+      "feature flag",
+      "group::knowledge",
+      "workflow::In review"
+    ],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "2d3f756620c5de9785bf13a98b02d47c63a2ee1c",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": true,
+    "reference": "!15427",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15427",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 4,
+      "completed_count": 4
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35323180,
+    "iid": 15426,
+    "project_id": 278964,
+    "title": "Resolve \"Broken master - Job Failed #275548923\"",
+    "description": "## What does this MR do?\r\n\r\nRegenerate gitlab pot file\r\n\r\n```diff\r\ndiff --git a/locale/gitlab.pot b/locale/gitlab.pot\r\nindex 816f4a2590c..6dc4e4b6bc4 100644\r\n--- a/locale/gitlab.pot\r\n+++ b/locale/gitlab.pot\r\n@@ -10705,6 +10705,9 @@ msgstr \"\"\r\n msgid \"Pipelines for last year\"\r\n msgstr \"\"\r\n \r\n+msgid \"Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more on the documentation for Pipelines for Merged Results.\"\r\n+msgstr \"\"\r\n+\r\n msgid \"Pipelines settings for '%{project_name}' were successfully updated.\"\r\n msgstr \"\"\r\n \r\n@@ -14746,9 +14749,6 @@ msgstr \"\"\r\n msgid \"The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git.\"\r\n msgstr \"\"\r\n \r\n-msgid \"The code of a detached pipeline is tested against the source branch instead of merged results\"\r\n-msgstr \"\"\r\n-\r\n msgid \"The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request.\"\r\n msgstr \"\"\r\n \r\n\r\n```\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 \r\n\r\n\r\nCloses #13660",
+    "state": "merged",
+    "created_at": "2019-08-20T00:49:43.170Z",
+    "updated_at": "2019-08-20T02:06:44.222Z",
+    "merged_by": {
+      "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"
+    },
+    "merged_at": "2019-08-20T02:06:44.486Z",
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "13660-broken-master-job-failed-275548923",
+    "user_notes_count": 1,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 3397881,
+      "name": "Ezekiel Kigbo",
+      "username": "ekigbo",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/3397881/avatar.png",
+      "web_url": "https://gitlab.com/ekigbo"
+    },
+    "author": {
+      "id": 3397881,
+      "name": "Ezekiel Kigbo",
+      "username": "ekigbo",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/3397881/avatar.png",
+      "web_url": "https://gitlab.com/ekigbo"
+    },
+    "assignees": [
+      {
+        "id": 3397881,
+        "name": "Ezekiel Kigbo",
+        "username": "ekigbo",
+        "state": "active",
+        "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/3397881/avatar.png",
+        "web_url": "https://gitlab.com/ekigbo"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": ["internationalization", "master:broken"],
+    "work_in_progress": false,
+    "milestone": null,
+    "merge_when_pipeline_succeeds": true,
+    "detailed_merge_status": "mergeable",
+    "sha": "c7a107ac0148339a18250d73834c3c6eb869be12",
+    "merge_commit_sha": "aef47a865512652d02fa6552636de903cda13e11",
+    "discussion_locked": null,
+    "should_remove_source_branch": true,
+    "force_remove_source_branch": false,
+    "reference": "!15426",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15426",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35286273,
+    "iid": 15420,
+    "project_id": 278964,
+    "title": "Improve nplusone spec for PipelinesController#show",
+    "description": "## What does this MR do?\r\n\r\nRelated https://gitlab.com/gitlab-org/gitlab-ce/issues/60925\r\n\r\nCE MR https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31976\r\n\r\n## Does this MR meet the acceptance criteria?\r\n\r\n### Conformity\r\n\r\n- N/A [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \r\n- N/A [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- [x] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\r\n- [x] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\r\n- [x] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\r\n- N/A [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\r\n- N/A [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- N/A [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- N/A [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- N/A Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\r\n- N/A The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\r\n- N/A Security reports checked/validated by a reviewer from the AppSec team",
+    "state": "closed",
+    "created_at": "2019-08-19T21:20:31.820Z",
+    "updated_at": "2019-08-19T21:53:45.483Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": {
+      "id": 64248,
+      "name": "Stan Hu",
+      "username": "stanhu",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/64248/stanhu.jpg",
+      "web_url": "https://gitlab.com/stanhu"
+    },
+    "closed_at": "2019-08-19T21:53:45.560Z",
+    "target_branch": "master",
+    "source_branch": "mc/bug/nplusone-pipelines-show-ee",
+    "user_notes_count": 2,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 722076,
+      "name": "Matija Čupić",
+      "username": "matteeyah",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/8bc04cc15e0adba406cf56fecd9d910a?s=80&d=identicon",
+      "web_url": "https://gitlab.com/matteeyah"
+    },
+    "author": {
+      "id": 722076,
+      "name": "Matija Čupić",
+      "username": "matteeyah",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/8bc04cc15e0adba406cf56fecd9d910a?s=80&d=identicon",
+      "web_url": "https://gitlab.com/matteeyah"
+    },
+    "assignees": [
+      {
+        "id": 722076,
+        "name": "Matija Čupić",
+        "username": "matteeyah",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/8bc04cc15e0adba406cf56fecd9d910a?s=80&d=identicon",
+        "web_url": "https://gitlab.com/matteeyah"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "Category::Continuous Integration",
+      "backstage",
+      "devops::verify",
+      "group::continuous integration",
+      "performance"
+    ],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "35d5a9f48cbc4602c5920890ea2636dabf2e8cd1",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": true,
+    "reference": "!15420",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15420",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 3,
+      "completed_count": 3
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35280733,
+    "iid": 15412,
+    "project_id": 278964,
+    "title": "Return Last Deployment in Environment Dashboard",
+    "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\nReturn the last deployment for each environment for the Environment Dashboard.\r\n\r\nInclude the last deployment's user, commit, and deployable.\r\n\r\nThis fills in a significant portion of the data for the environment card:\r\n\r\n![Screen_Shot_2019-08-19_at_3.52.13_PM](/uploads/669768b74f6ddd772ba2296ed634289b/Screen_Shot_2019-08-19_at_3.52.13_PM.png)\r\n\r\nRelevant issue: https://gitlab.com/gitlab-org/gitlab-ee/issues/3713\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",
+    "created_at": "2019-08-19T19:56:07.690Z",
+    "updated_at": "2019-08-20T06:17:15.284Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "environments-list-data-a",
+    "source_branch": "environments-list-data-b",
+    "user_notes_count": 5,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 3716529,
+      "name": "Jason Goodman",
+      "username": "jagood",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/6696c95a1788e2d4bee67df636805ecc?s=80&d=identicon",
+      "web_url": "https://gitlab.com/jagood"
+    },
+    "author": {
+      "id": 3716529,
+      "name": "Jason Goodman",
+      "username": "jagood",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/6696c95a1788e2d4bee67df636805ecc?s=80&d=identicon",
+      "web_url": "https://gitlab.com/jagood"
+    },
+    "assignees": [
+      {
+        "id": 3716529,
+        "name": "Jason Goodman",
+        "username": "jagood",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/6696c95a1788e2d4bee67df636805ecc?s=80&d=identicon",
+        "web_url": "https://gitlab.com/jagood"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": ["backend", "devops::release", "feature"],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "2aaa325ba6b725d04859a35da8beb666ba4bbc65",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": true,
+    "reference": "!15412",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15412",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": true,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35273259,
+    "iid": 15409,
+    "project_id": 278964,
+    "title": "Componentize metrics alerts modal form",
+    "description": "## What does this MR do?\r\n\r\n* Refactors metrics alerts to use only gitlab-ui components. \r\n* Removes `query.unit` from the label, since `query.label` includes the units already.  \r\nBefore:  \r\n![Screen_Shot_2019-08-19_at_5.21.20_PM](/uploads/47e04c85ef96a6ac7f24768873ff74cd/Screen_Shot_2019-08-19_at_5.21.20_PM.png)  \r\n\r\nAfter:  \r\n![Screen_Shot_2019-08-19_at_5.56.13_PM](/uploads/af315febb8278143b064f4e09cb82939/Screen_Shot_2019-08-19_at_5.56.13_PM.png)\r\n## Does this MR meet the acceptance criteria?\r\n\r\nCloses #13058",
+    "state": "opened",
+    "created_at": "2019-08-19T17:21:57.593Z",
+    "updated_at": "2019-08-19T22:31:03.279Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "13058-componentize-metrics-alerts-modal-form",
+    "user_notes_count": 2,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 829774,
+      "name": "Jose Ivan Vargas",
+      "username": "jivanvl",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/730cc1b85a20f2a3891829f7aa198972?s=80&d=identicon",
+      "web_url": "https://gitlab.com/jivanvl"
+    },
+    "author": {
+      "id": 3946912,
+      "name": "Laura Montemayor",
+      "username": "lauraMon",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/3946912/avatar.png",
+      "web_url": "https://gitlab.com/lauraMon"
+    },
+    "assignees": [
+      {
+        "id": 829774,
+        "name": "Jose Ivan Vargas",
+        "username": "jivanvl",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/730cc1b85a20f2a3891829f7aa198972?s=80&d=identicon",
+        "web_url": "https://gitlab.com/jivanvl"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "GitLab Enterprise Edition",
+      "Monitor [DEPRECATED]",
+      "devops::monitor",
+      "frontend",
+      "group::health",
+      "technical debt",
+      "workflow::In review"
+    ],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "2c935d51b83c5b4f50ca688d5cbbb771b0e378fc",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": false,
+    "reference": "!15409",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15409",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 0,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35273064,
+    "iid": 15408,
+    "project_id": 278964,
+    "title": "Geo: Tell primary which secondary redirected a Git push over HTTP",
+    "description": "## What does this MR do?\n\n<!--\n\nDescribe in detail what your merge request does and why.\n\nAre there any risks involved with the proposed change? What additional\ntest coverage is introduced to offset the risk?\n\nPlease keep this description up-to-date with any discussion that takes\nplace so that reviewers can understand your intent. This is especially\nimportant if they didn't participate in the discussion.\n\n-->\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team",
+    "state": "closed",
+    "created_at": "2019-08-19T17:16:32.288Z",
+    "updated_at": "2019-08-20T00:02:08.608Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": {
+      "id": 1144264,
+      "name": "Michael Kozono",
+      "username": "mkozono",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/ddaa576b4b6933a6fb7a996088c30f6c?s=80&d=identicon",
+      "web_url": "https://gitlab.com/mkozono"
+    },
+    "closed_at": "2019-08-20T00:02:08.635Z",
+    "target_branch": "master",
+    "source_branch": "mk/provide-geo-node-referrer-on-push-geo",
+    "user_notes_count": 1,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 1144264,
+      "name": "Michael Kozono",
+      "username": "mkozono",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/ddaa576b4b6933a6fb7a996088c30f6c?s=80&d=identicon",
+      "web_url": "https://gitlab.com/mkozono"
+    },
+    "author": {
+      "id": 1144264,
+      "name": "Michael Kozono",
+      "username": "mkozono",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/ddaa576b4b6933a6fb7a996088c30f6c?s=80&d=identicon",
+      "web_url": "https://gitlab.com/mkozono"
+    },
+    "assignees": [
+      {
+        "id": 1144264,
+        "name": "Michael Kozono",
+        "username": "mkozono",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/ddaa576b4b6933a6fb7a996088c30f6c?s=80&d=identicon",
+        "web_url": "https://gitlab.com/mkozono"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [],
+    "work_in_progress": false,
+    "milestone": null,
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "21dd0530baefaa2e4bce5d8a9857bad829c51d64",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": true,
+    "reference": "!15408",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15408",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": 1
+  },
+  {
+    "id": 35270697,
+    "iid": 15406,
+    "project_id": 278964,
+    "title": "Draft: Resolve \"Move dependency scanning reports logic for the Merge Request widget to the backend - frontend part\"",
+    "description": "## What does this MR do?\n\n<!--\n\nDescribe in detail what your merge request does and why.\n\nAre there any risks involved with the proposed change? What additional\ntest coverage is introduced to offset the risk?\n\nPlease keep this description up-to-date with any discussion that takes\nplace so that reviewers can understand your intent. This is especially\nimportant if they didn't participate in the discussion.\n\n-->\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [ ] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team \n\n\nCloses #13649",
+    "state": "opened",
+    "created_at": "2019-08-19T16:41:11.685Z",
+    "updated_at": "2019-08-20T11:59:46.086Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "13649-move-dependency-scanning-reports-logic-for-the-merge-request-widget-to-the-backend-frontend-part",
+    "user_notes_count": 1,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": null,
+    "author": {
+      "id": 1125848,
+      "name": "Sam Beckham",
+      "username": "samdbeckham",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/359be2b7660c7b7542d63c41b507537d?s=80&d=identicon",
+      "web_url": "https://gitlab.com/samdbeckham"
+    },
+    "assignees": [],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": [
+      "backstage",
+      "dependency scanning",
+      "devops::secure",
+      "frontend",
+      "sub-issue",
+      "workflow::ready for development"
+    ],
+    "work_in_progress": true,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "b2e35301e997a6b2eb7abacfb3943fd33532985c",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": null,
+    "reference": "!15406",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15406",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 0
+    },
+    "approvals_before_merge": null
+  },
+  {
+    "id": 35269469,
+    "iid": 15404,
+    "project_id": 278964,
+    "title": "Fix broken link to Security Dashboard help page",
+    "description": "## What does this MR do?\n\nFixes broken link to help docs for ~\"security dashboard\"\n\n## Does this MR meet the acceptance criteria?\n\n### Conformity\n\n- [x] [Changelog entry](https://docs.gitlab.com/ee/development/changelog.html) \n- [x] [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)\n- [ ] [Code review guidelines](https://docs.gitlab.com/ee/development/code_review.html)\n- [ ] [Merge request performance guidelines](https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html)\n- [ ] [Style guides](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/development/contributing/style_guides.md)\n- [ ] [Database guides](https://docs.gitlab.com/ee/development/README.html#databases-guides)\n- [ ] [Separation of EE specific content](https://docs.gitlab.com/ee/development/ee_features.html#separation-of-ee-code)\n\n### Performance and Testing\n\n<!-- What risks does this change pose? How might it affect the quality/performance of the product?\nWhat additional test coverage or changes to tests will be needed?\nWill it require cross-browser testing?\nSee the test engineering process for further guidelines: https://about.gitlab.com/handbook/engineering/quality/test-engineering/ -->\n\n<!-- If cross-browser testing is not required, please remove the relevant item, or mark it as not needed: [-] -->\n\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/).\n- [ ] [Tested in all supported browsers](https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers)\n\n### Security\n\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):\n\n- [ ] Label as ~security and @ mention `@gitlab-com/gl-security/appsec`\n- [ ] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods\n- [ ] Security reports checked/validated by a reviewer from the AppSec team",
+    "state": "opened",
+    "created_at": "2019-08-19T16:26:00.171Z",
+    "updated_at": "2019-08-19T18:22:05.236Z",
+    "merged_by": null,
+    "merged_at": null,
+    "closed_by": null,
+    "closed_at": null,
+    "target_branch": "master",
+    "source_branch": "13645-fix-broken-sec-dashboard-help-link",
+    "user_notes_count": 2,
+    "upvotes": 0,
+    "downvotes": 0,
+    "assignee": {
+      "id": 1125848,
+      "name": "Sam Beckham",
+      "username": "samdbeckham",
+      "state": "active",
+      "avatar_url": "https://secure.gravatar.com/avatar/359be2b7660c7b7542d63c41b507537d?s=80&d=identicon",
+      "web_url": "https://gitlab.com/samdbeckham"
+    },
+    "author": {
+      "id": 401232,
+      "name": "Lucas Charles",
+      "username": "theoretick",
+      "state": "active",
+      "avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/401232/squares-nail-wall-art.jpg",
+      "web_url": "https://gitlab.com/theoretick"
+    },
+    "assignees": [
+      {
+        "id": 1125848,
+        "name": "Sam Beckham",
+        "username": "samdbeckham",
+        "state": "active",
+        "avatar_url": "https://secure.gravatar.com/avatar/359be2b7660c7b7542d63c41b507537d?s=80&d=identicon",
+        "web_url": "https://gitlab.com/samdbeckham"
+      }
+    ],
+    "source_project_id": 278964,
+    "target_project_id": 278964,
+    "labels": ["bug", "devops::secure", "group::static analysis"],
+    "work_in_progress": false,
+    "milestone": {
+      "id": 731038,
+      "iid": 37,
+      "group_id": 9970,
+      "title": "12.3",
+      "description": "",
+      "state": "active",
+      "created_at": "2018-12-07T12:40:55.400Z",
+      "updated_at": "2019-01-16T19:50:20.313Z",
+      "due_date": "2019-09-22",
+      "start_date": "2019-08-08",
+      "web_url": "https://gitlab.com/groups/gitlab-org/-/milestones/37"
+    },
+    "merge_when_pipeline_succeeds": false,
+    "detailed_merge_status": "mergeable",
+    "sha": "e3f350239176eb184accae9c4e380acda787cfbf",
+    "merge_commit_sha": null,
+    "discussion_locked": null,
+    "should_remove_source_branch": null,
+    "force_remove_source_branch": false,
+    "reference": "!15404",
+    "web_url": "https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/15404",
+    "time_stats": {
+      "time_estimate": 0,
+      "total_time_spent": 0,
+      "human_time_estimate": null,
+      "human_total_time_spent": null
+    },
+    "squash": false,
+    "task_completion_status": {
+      "count": 12,
+      "completed_count": 2
+    },
+    "approvals_before_merge": 1
   }
 ]
diff --git a/testdata/get_project_feature_flag.json b/testdata/get_project_feature_flag.json
index 9b7129b..e460627 100644
--- a/testdata/get_project_feature_flag.json
+++ b/testdata/get_project_feature_flag.json
@@ -17,21 +17,6 @@
           "environment_scope": "production"
         }
       ]
-    },
-    {
-      "id": 24,
-      "name": "flexibleRollout",
-      "parameters": {
-        "groupId": "default",
-        "rollout": "50",
-        "stickiness": "default"
-      },
-      "scopes": [
-        {
-          "id": 52,
-          "environment_scope": "*"
-        }
-      ]
     }
   ]
 }
diff --git a/testdata/list_group_ssh_certificates.json b/testdata/list_group_ssh_certificates.json
deleted file mode 100644
index c0a9ccc..0000000
--- a/testdata/list_group_ssh_certificates.json
+++ /dev/null
@@ -1,8 +0,0 @@
-[
-  {
-    "id": 1876,
-    "title": "SSH Certificate",
-    "key": "ssh-rsa FAKE-KEY example@gitlab.com",
-    "created_at": "2022-03-20T20:42:40.221Z"
-  }
-]
diff --git a/testdata/rotate_group_access_token.json b/testdata/rotate_group_access_token.json
deleted file mode 100644
index b8dd89c..0000000
--- a/testdata/rotate_group_access_token.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "id": 42,
-  "name": "Rotated Token",
-  "revoked": false,
-  "created_at": "2023-08-01T15:00:00.000Z",
-  "scopes": ["api"],
-  "user_id": 1337,
-  "last_used_at": null,
-  "active": true,
-  "expires_at": "2023-08-15",
-  "access_level": 30,
-  "token": "s3cr3t"
-}
diff --git a/testdata/rotate_personal_access_token.json b/testdata/rotate_personal_access_token.json
deleted file mode 100644
index 2d7b273..0000000
--- a/testdata/rotate_personal_access_token.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "id": 42,
-  "name": "Rotated Token",
-  "revoked": false,
-  "created_at": "2023-08-01T15:00:00.000Z",
-  "scopes": ["api"],
-  "user_id": 1337,
-  "last_used_at": null,
-  "active": true,
-  "expires_at": "2023-08-15",
-  "token": "s3cr3t"
-}
diff --git a/testdata/rotate_project_access_token.json b/testdata/rotate_project_access_token.json
deleted file mode 100644
index b8dd89c..0000000
--- a/testdata/rotate_project_access_token.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "id": 42,
-  "name": "Rotated Token",
-  "revoked": false,
-  "created_at": "2023-08-01T15:00:00.000Z",
-  "scopes": ["api"],
-  "user_id": 1337,
-  "last_used_at": null,
-  "active": true,
-  "expires_at": "2023-08-15",
-  "access_level": 30,
-  "token": "s3cr3t"
-}
diff --git a/users_test.go b/users_test.go
index 9a2afcc..2fca55d 100644
--- a/users_test.go
+++ b/users_test.go
@@ -716,28 +716,3 @@ func TestCreatePersonalAccessTokenForCurrentUser(t *testing.T) {
 	}
 	require.Equal(t, want, user)
 }
-
-func TestCreateServiceAccountUser(t *testing.T) {
-	mux, client := setup(t)
-
-	path := "/api/v4/service_accounts"
-
-	mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, http.MethodPost)
-		mustWriteHTTPResponse(t, w, "testdata/create_service_account_user.json")
-	})
-
-	user, _, err := client.Users.CreateServiceAccountUser()
-	require.NoError(t, err)
-
-	want := &User{
-		ID:        999,
-		Username:  "service_account_94e556c44d40d5a710ca59e3a0f40a3d",
-		Name:      "Service account user",
-		State:     "active",
-		Locked:    false,
-		AvatarURL: "http://localhost:3000/uploads/user/avatar/999/cd8.jpeg",
-		WebURL:    "http://localhost:3000/service_account_94e556c44d40d5a710ca59e3a0f40a3d",
-	}
-	require.Equal(t, want, user)
-}