Repository: reviewdog/reviewdog
Pull request #801 (2020-10-24 17:01:51)

github-pr-review: Prefer suggestion range to diagnostic range as GitHub comment range

- [x] Updated Unreleased section in [CHANGELOG](https://github.com/reviewdog/reviewdog/blob/master/CHANGELOG.md) or it's not notable changes.




Patch:
diff --git a/.reviewdog.yml b/.reviewdog.yml
index a485a5de..db364006 100644
--- a/.reviewdog.yml
+++ b/.reviewdog.yml
@@ -14,7 +14,7 @@ runner:
       - "%f:%l:%c:%m"
     level: warning
   staticcheck:
-    cmd: staticcheck $(go list ./... | grep -v /vendor/)
+    cmd: staticcheck $(go list ./... | grep -v /vendor/ | grep -v /bitbucket/openapi)
     errorformat:
       - "%f:%l:%c: %m"
   misspell:
diff --git a/cmd/reviewdog/main.go b/cmd/reviewdog/main.go
index 8ad7f25b..17aab398 100644
--- a/cmd/reviewdog/main.go
+++ b/cmd/reviewdog/main.go
@@ -25,7 +25,6 @@ import (
 	"github.com/reviewdog/errorformat/fmts"
 	"github.com/xanzy/go-gitlab"
 
-	"github.com/reviewdog/go-bitbucket"
 	"github.com/reviewdog/reviewdog"
 	"github.com/reviewdog/reviewdog/cienv"
 	"github.com/reviewdog/reviewdog/commands"
@@ -33,6 +32,7 @@ import (
 	"github.com/reviewdog/reviewdog/parser"
 	"github.com/reviewdog/reviewdog/project"
 	bbservice "github.com/reviewdog/reviewdog/service/bitbucket"
+	bitbucket "github.com/reviewdog/reviewdog/service/bitbucket/openapi"
 	gerritservice "github.com/reviewdog/reviewdog/service/gerrit"
 	githubservice "github.com/reviewdog/reviewdog/service/github"
 	"github.com/reviewdog/reviewdog/service/github/githubutils"
diff --git a/filter/diff_filter.go b/filter/diff_filter.go
index 01cf99fe..c658ece9 100644
--- a/filter/diff_filter.go
+++ b/filter/diff_filter.go
@@ -138,6 +138,21 @@ func (df *DiffFilter) ShouldReport(path string, lnum int) (bool, *diff.FileDiff,
 	return df.isSignificantLine(line), file, line
 }
 
+// DiffLine returns diff data from given new path and lnum. Returns nil if not
+// found.
+func (df *DiffFilter) DiffLine(path string, lnum int) *diff.Line {
+	npath := df.normalizePath(path)
+	lines, ok := df.difflines[npath]
+	if !ok {
+		return nil
+	}
+	line, ok := lines[lnum]
+	if !ok {
+		return nil
+	}
+	return line
+}
+
 func (df *DiffFilter) isSignificantLine(line *diff.Line) bool {
 	switch df.mode {
 	case ModeDiffContext, ModeFile, ModeNoFilter:
diff --git a/filter/filter.go b/filter/filter.go
index 7399bfbc..7700df55 100644
--- a/filter/filter.go
+++ b/filter/filter.go
@@ -18,10 +18,16 @@ type FilteredDiagnostic struct {
 	// hunk.
 	InDiffContext bool
 
-	// Source lines text of the diagnostic message's line-range.
-	// It contains a whole line even if the diagnostic range have column fields.
+	// Similar to InDiffContext but for suggestion. True if first
+	// suggestion is in diff context.
+	FirstSuggestionInDiffContext bool
+
+	// Source lines text of the diagnostic message's line-range. Key is line
+	// number. If a suggestion range is broader than the disagnostic message's
+	// line-range, suggestions' line-range are included too.  It contains a whole
+	// line even if the diagnostic range have column fields.
 	// Optional. Currently available only when it's in diff context.
-	SourceLines []string
+	SourceLines map[int]string
 
 	OldPath string
 	OldLine int
@@ -34,7 +40,7 @@ func FilterCheck(results []*rdf.Diagnostic, diff []*diff.FileDiff, strip int,
 	checks := make([]*FilteredDiagnostic, 0, len(results))
 	df := NewDiffFilter(diff, strip, cwd, mode)
 	for _, result := range results {
-		check := &FilteredDiagnostic{Diagnostic: result}
+		check := &FilteredDiagnostic{Diagnostic: result, SourceLines: make(map[int]string)}
 		loc := result.GetLocation()
 		loc.Path = NormalizePath(loc.GetPath(), cwd, "")
 		startLine := int(loc.GetRange().GetStart().GetLine())
@@ -43,14 +49,13 @@ func FilterCheck(results []*rdf.Diagnostic, diff []*diff.FileDiff, strip int,
 			endLine = startLine
 		}
 		check.InDiffContext = true
-		var sourceLines []string
 		for l := startLine; l <= endLine; l++ {
 			shouldReport, difffile, diffline := df.ShouldReport(loc.GetPath(), l)
 			check.ShouldReport = check.ShouldReport || shouldReport
 			// all lines must be in diff.
 			check.InDiffContext = check.InDiffContext && diffline != nil
 			if diffline != nil {
-				sourceLines = append(sourceLines, diffline.Content)
+				check.SourceLines[l] = diffline.Content
 			}
 			if difffile != nil {
 				check.InDiffFile = true
@@ -60,8 +65,21 @@ func FilterCheck(results []*rdf.Diagnostic, diff []*diff.FileDiff, strip int,
 				}
 			}
 		}
-		if check.InDiffContext {
-			check.SourceLines = sourceLines
+		// Add source lines for suggestions.
+		for i, s := range result.GetSuggestions() {
+			inDiffContext := true
+			start := int(s.GetRange().GetStart().GetLine())
+			end := int(s.GetRange().GetEnd().GetLine())
+			for l := start; l <= end; l++ {
+				if diffline := df.DiffLine(loc.GetPath(), l); diffline != nil {
+					check.SourceLines[l] = diffline.Content
+				} else {
+					inDiffContext = false
+				}
+			}
+			if i == 0 {
+				check.FirstSuggestionInDiffContext = inDiffContext
+			}
 		}
 		checks = append(checks, check)
 	}
diff --git a/go.mod b/go.mod
index fb5c3f13..15e168bb 100644
--- a/go.mod
+++ b/go.mod
@@ -17,12 +17,11 @@ require (
 	github.com/mattn/go-shellwords v1.0.10
 	github.com/rakyll/statik v0.1.7
 	github.com/reviewdog/errorformat v0.0.0-20201020160743-a656ed371170
-	github.com/reviewdog/go-bitbucket v0.0.0-20201024094602-708c3f6a7de0
 	github.com/vvakame/sdlog v0.0.0-20200409072131-7c0d359efddc
 	github.com/xanzy/go-gitlab v0.38.2
 	go.opencensus.io v0.22.5
 	golang.org/x/build v0.0.0-20200616162219-07bebbe343e9
-	golang.org/x/net v0.0.0-20201024042810-be3efd7ff127 // indirect
+	golang.org/x/net v0.0.0-20201020065357-d65d470038a5 // indirect
 	golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
 	golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
 	google.golang.org/protobuf v1.25.0
diff --git a/go.sum b/go.sum
index fc2c5236..36b20b6d 100644
--- a/go.sum
+++ b/go.sum
@@ -205,8 +205,6 @@ github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ=
 github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc=
 github.com/reviewdog/errorformat v0.0.0-20201020160743-a656ed371170 h1:mXnYP0Ar2dpAorxqoIERETwelsF8jkOR3BWPU4ByTH4=
 github.com/reviewdog/errorformat v0.0.0-20201020160743-a656ed371170/go.mod h1:Akd5vemrJaAHgnEOFrC4yMbEKaOsddwF1LKkfovSFI8=
-github.com/reviewdog/go-bitbucket v0.0.0-20201024094602-708c3f6a7de0 h1:XZ60Bp2UqwaJ6fDQExoFVrgs4nIzwBCy9ct6GCj9hH8=
-github.com/reviewdog/go-bitbucket v0.0.0-20201024094602-708c3f6a7de0/go.mod h1:5JbWAMFyq9hbISZawRyIe7QTcLaptvCIvmZnYo+1VvA=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -324,8 +322,8 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up
 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201010224723-4f7140c49acb h1:mUVeFHoDKis5nxCAzoAi7E8Ghb86EXh/RK6wtvJIqRY=
 golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201024042810-be3efd7ff127 h1:pZPp9+iYUqwYKLjht0SDBbRCRK/9gAXDy7pz5fRDpjo=
-golang.org/x/net v0.0.0-20201024042810-be3efd7ff127/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201020065357-d65d470038a5 h1:KrxvpY64uUzANd9wKWr6ZAsufiii93XnvXaeikyCJ2g=
+golang.org/x/net v0.0.0-20201020065357-d65d470038a5/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
diff --git a/service/bitbucket/annotator.go b/service/bitbucket/annotator.go
index 3f830623..6e94fdf2 100644
--- a/service/bitbucket/annotator.go
+++ b/service/bitbucket/annotator.go
@@ -9,9 +9,9 @@ import (
 	"strings"
 	"sync"
 
-	bbapi "github.com/reviewdog/go-bitbucket"
 	"github.com/reviewdog/reviewdog"
 	"github.com/reviewdog/reviewdog/proto/rdf"
+	"github.com/reviewdog/reviewdog/service/bitbucket/openapi"
 	"google.golang.org/protobuf/proto"
 )
 
@@ -31,14 +31,14 @@ const (
 //  https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/commit/%7Bcommit%7D/reports/%7BreportId%7D/annotations#post
 //  POST /2.0/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}/annotations
 type ReportAnnotator struct {
-	cli         *bbapi.APIClient
+	cli         *openapi.APIClient
 	sha         string
 	owner, repo string
 
 	muAnnotations sync.Mutex
 	// store annotations in map per tool name
 	// so we can create report per tool
-	annotations map[string][]bbapi.ReportAnnotation
+	annotations map[string][]openapi.ReportAnnotation
 	severityMap map[rdf.Severity]string
 
 	// wd is working directory relative to root of repository.
@@ -47,13 +47,13 @@ type ReportAnnotator struct {
 }
 
 // NewReportAnnotator creates new Bitbucket Report Annotator
-func NewReportAnnotator(cli *bbapi.APIClient, owner, repo, sha string, runners []string) *ReportAnnotator {
+func NewReportAnnotator(cli *openapi.APIClient, owner, repo, sha string, runners []string) *ReportAnnotator {
 	r := &ReportAnnotator{
 		cli:         cli,
 		sha:         sha,
 		owner:       owner,
 		repo:        repo,
-		annotations: make(map[string][]bbapi.ReportAnnotation, len(runners)),
+		annotations: make(map[string][]openapi.ReportAnnotation, len(runners)),
 		severityMap: map[rdf.Severity]string{
 			rdf.Severity_INFO:    annotationSeverityLow,
 			rdf.Severity_WARNING: annotationSeverityMedium,
@@ -68,7 +68,7 @@ func NewReportAnnotator(cli *bbapi.APIClient, owner, repo, sha string, runners [
 		if len(runner) == 0 {
 			continue
 		}
-		r.annotations[runner] = []bbapi.ReportAnnotation{}
+		r.annotations[runner] = []openapi.ReportAnnotation{}
 		// create Pending report for each tool
 		_ = r.createOrUpdateReport(context.Background(), reportID(runner, reporter), reportTitle(runner, reporter), reportResultPending)
 	}
@@ -142,8 +142,8 @@ func (r *ReportAnnotator) Flush(ctx context.Context) error {
 	return nil
 }
 
-func (r *ReportAnnotator) annotationFromReviewDogComment(c reviewdog.Comment) bbapi.ReportAnnotation {
-	a := bbapi.NewReportAnnotation()
+func (r *ReportAnnotator) annotationFromReviewDogComment(c reviewdog.Comment) openapi.ReportAnnotation {
+	a := openapi.NewReportAnnotation()
 
 	// TODO: allow providing different annotation types in future
 	a.SetAnnotationType(annotationTypeCodeSmell)
@@ -164,7 +164,7 @@ func (r *ReportAnnotator) annotationFromReviewDogComment(c reviewdog.Comment) bb
 }
 
 func (r *ReportAnnotator) createOrUpdateReport(ctx context.Context, id, title, reportStatus string) error {
-	var report = bbapi.NewReport()
+	var report = openapi.NewReport()
 	report.SetTitle(title)
 	// TODO: different report types?
 	report.SetReportType(reportTypeBug)
diff --git a/service/bitbucket/bitbucket.go b/service/bitbucket/bitbucket.go
index e27c526a..621e68a2 100644
--- a/service/bitbucket/bitbucket.go
+++ b/service/bitbucket/bitbucket.go
@@ -6,7 +6,7 @@ import (
 	"net/url"
 	"time"
 
-	bbapi "github.com/reviewdog/go-bitbucket"
+	"github.com/reviewdog/reviewdog/service/bitbucket/openapi"
 	"golang.org/x/oauth2"
 )
 
@@ -22,7 +22,7 @@ const (
 )
 
 // NewAPIClient creates Bitbucket API client
-func NewAPIClient(isInPipeline bool) *bbapi.APIClient {
+func NewAPIClient(isInPipeline bool) *openapi.APIClient {
 	httpClient := &http.Client{
 		Timeout: httpTimeout,
 	}
@@ -42,8 +42,8 @@ func NewAPIClient(isInPipeline bool) *bbapi.APIClient {
 
 // NewAPIClientWithConfigurations allows to create new Bitbucket API client with
 // custom http client or server configurations
-func NewAPIClientWithConfigurations(client *http.Client, server bbapi.ServerConfiguration) *bbapi.APIClient {
-	config := bbapi.NewConfiguration()
+func NewAPIClientWithConfigurations(client *http.Client, server openapi.ServerConfiguration) *openapi.APIClient {
+	config := openapi.NewConfiguration()
 	if client != nil {
 		config.HTTPClient = client
 	} else {
@@ -51,15 +51,15 @@ func NewAPIClientWithConfigurations(client *http.Client, server bbapi.ServerConf
 			Timeout: httpTimeout,
 		}
 	}
-	config.Servers = bbapi.ServerConfigurations{server}
-	return bbapi.NewAPIClient(config)
+	config.Servers = openapi.ServerConfigurations{server}
+	return openapi.NewAPIClient(config)
 
 }
 
 // WithBasicAuth adds basic auth credentials to context
 func WithBasicAuth(ctx context.Context, username, password string) context.Context {
-	return context.WithValue(ctx, bbapi.ContextBasicAuth,
-		bbapi.BasicAuth{
+	return context.WithValue(ctx, openapi.ContextBasicAuth,
+		openapi.BasicAuth{
 			UserName: username,
 			Password: password,
 		})
@@ -67,23 +67,23 @@ func WithBasicAuth(ctx context.Context, username, password string) context.Conte
 
 // WithAccessToken adds basic auth credentials to context
 func WithAccessToken(ctx context.Context, accessToken string) context.Context {
-	return context.WithValue(ctx, bbapi.ContextAccessToken, accessToken)
+	return context.WithValue(ctx, openapi.ContextAccessToken, accessToken)
 }
 
 // WithOAuth2 adds basic auth credentials to context
 func WithOAuth2(ctx context.Context, tokenSource oauth2.TokenSource) context.Context {
-	return context.WithValue(ctx, bbapi.ContextOAuth2, tokenSource)
+	return context.WithValue(ctx, openapi.ContextOAuth2, tokenSource)
 }
 
-func httpServer() bbapi.ServerConfiguration {
-	return bbapi.ServerConfiguration{
+func httpServer() openapi.ServerConfiguration {
+	return openapi.ServerConfiguration{
 		URL: "http://api.bitbucket.org/2.0",
 		Description: `If if called from Bitbucket Pipelines,
 using HTTP API endpoint and AuthProxy`,
 	}
 }
-func httpsServer() bbapi.ServerConfiguration {
-	return bbapi.ServerConfiguration{
+func httpsServer() openapi.ServerConfiguration {
+	return openapi.ServerConfiguration{
 		URL:         "https://api.bitbucket.org/2.0",
 		Description: `HTTPS API endpoint`,
 	}
diff --git a/service/bitbucket/errors.go b/service/bitbucket/errors.go
index df8548b3..a03014f8 100644
--- a/service/bitbucket/errors.go
+++ b/service/bitbucket/errors.go
@@ -6,12 +6,12 @@ import (
 	"io/ioutil"
 	"net/http"
 
-	bbapi "github.com/reviewdog/go-bitbucket"
+	"github.com/reviewdog/reviewdog/service/bitbucket/openapi"
 )
 
 func checkAPIError(err error, resp *http.Response, expectedCode int) error {
 	if err != nil {
-		e, ok := err.(bbapi.GenericOpenAPIError)
+		e, ok := err.(openapi.GenericOpenAPIError)
 		if ok {
 			return fmt.Errorf(`bitbucket API error:
 	Response error: %s
diff --git a/service/bitbucket/openapi/README.md b/service/bitbucket/openapi/README.md
new file mode 100644
index 00000000..335e183f
--- /dev/null
+++ b/service/bitbucket/openapi/README.md
@@ -0,0 +1,45 @@
+# Bitbucket OpenAPI
+
+Bitbucket API swagger definitions can be found here [Bitbucket API](https://developer.atlassian.com/bitbucket/api/2/reference/meta/serialization#oai).
+
+## Problems with official OpenAPI definitions
+
+However, unfortunately it is not valid OpenAPI definition, see this issues:
+
+1. [ktrysmt/go-bitbucket Issue #96](https://github.com/ktrysmt/go-bitbucket/issues/96)
+
+1. [JIRA Bitbucket Cloud/BCLOUD-17601 - api.bitbucket.org/swagger.json is broken](https://jira.atlassian.com/browse/BCLOUD-17601)
+
+However, I was able to generate some models via [OpenAPI Generator CLI](https://github.com/OpenAPITools/openapi-generator-cli/) with `--skip-validate-spec` ignoring the errors.
+Here I copied only models related to [Code Insights](https://support.atlassian.com/bitbucket-cloud/docs/code-insights/).
+Feel free to extend if needed.
+
+Also, to make it work, in generated code URLs `{workspace}` need to be replaced with `{username}`,
+because BitBucket OpenAPI definition is not correct :shrug::
+
+**Resource URL** is `/2.0/repositories/{workspace}/{repo_slug}/commit/{commit}/reports/{reportId}`
+
+but **Path parameters** are `username`, `repo_slug`, `commit`, `reportId`
+
+## Attempts to generate code
+
+- Go Swagger:
+
+    ```sh
+    $ swagger validate https://bitbucket.org/api/swagger.json
+    json: cannot unmarshal bool into Go struct field SwaggerProps.definitions of type []string
+    ```
+
+- OpenAPI Generator CLI:
+
+    ```sh
+    $ docker run --rm -v "${PWD}:/local" \
+        openapitools/openapi-generator-cli generate \
+             -i https://api.bitbucket.org/swagger.json
+             -g go \
+             -o /local/out/go
+    ...
+    Exception in thread "main" org.openapitools.codegen.SpecValidationException: There were issues with the specification. The option can be disabled via validateSpec (Maven/Gradle) or --skip-validate-spec (CLI).
+    | Error count: 53, Warning count: 17
+    ...
+    ```
diff --git a/service/bitbucket/openapi/api_reports.go b/service/bitbucket/openapi/api_reports.go
new file mode 100644
index 00000000..879ffef2
--- /dev/null
+++ b/service/bitbucket/openapi/api_reports.go
@@ -0,0 +1,1231 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	_context "context"
+	_ioutil "io/ioutil"
+	_nethttp "net/http"
+	_neturl "net/url"
+	"strings"
+)
+
+// Linger please
+var (
+	_ _context.Context
+)
+
+// ReportsApiService ReportsApi service
+type ReportsApiService service
+
+type ApiBulkCreateOrUpdateAnnotationsRequest struct {
+	ctx        _context.Context
+	ApiService *ReportsApiService
+	username   string
+	repoSlug   string
+	commit     string
+	reportId   string
+	body       *[]ReportAnnotation
+}
+
+func (r ApiBulkCreateOrUpdateAnnotationsRequest) Body(body []ReportAnnotation) ApiBulkCreateOrUpdateAnnotationsRequest {
+	r.body = &body
+	return r
+}
+
+func (r ApiBulkCreateOrUpdateAnnotationsRequest) Execute() ([]ReportAnnotation, *_nethttp.Response, error) {
+	return r.ApiService.BulkCreateOrUpdateAnnotationsExecute(r)
+}
+
+/*
+ * BulkCreateOrUpdateAnnotations Method for BulkCreateOrUpdateAnnotations
+ * Bulk upload of annotations.
+Annotations are individual findings that have been identified as part of a report, for example, a line of code that represents a vulnerability. These annotations can be attached to a specific file and even a specific line in that file, however, that is optional. Annotations are not mandatory and a report can contain up to 1000 annotations.
+
+Add the annotations you want to upload as objects in a JSON array and make sure each annotation has the external_id field set to a unique value. If you want to use an existing id from your own system, we recommend prefixing it with your system's name to avoid collisions, for example, mySystem-annotation001. The external id can later be used to identify the report as an alternative to the generated [UUID](https://developer.atlassian.com/bitbucket/api/2/reference/meta/uri-uuid#uuid). You can upload up to 100 annotations per POST request.
+
+### Sample cURL request:
+```
+curl --location 'https://api.bitbucket.org/2.0/repositories/<username>/<reposity-name>/commit/<commit-hash>/reports/mysystem-001/annotations' \
+--header 'Content-Type: application/json' \
+--data-raw '[
+  {
+        "external_id": "mysystem-annotation001",
+        "title": "Security scan report",
+        "annotation_type": "VULNERABILITY",
+        "summary": "This line represents a security threat.",
+        "severity": "HIGH",
+      "path": "my-service/src/main/java/com/myCompany/mysystem/logic/Main.java",
+        "line": 42
+  },
+  {
+        "external_id": "mySystem-annotation002",
+        "title": "Bug report",
+        "annotation_type": "BUG",
+        "result": "FAILED",
+        "summary": "This line might introduce a bug.",
+        "severity": "MEDIUM",
+      "path": "my-service/src/main/java/com/myCompany/mysystem/logic/Helper.java",
+        "line": 13
+  }
+]'
+```
+
+### Possible field values:
+annotation_type: VULNERABILITY, CODE_SMELL, BUG
+result: PASSED, FAILED, IGNORED, SKIPPED
+severity: HIGH, MEDIUM, LOW, CRITICAL
+
+Please refer to the [Code Insights documentation](https://confluence.atlassian.com/bitbucket/code-insights-994316785.html) for more information.
+
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit for which to retrieve reports.
+ * @param reportId Uuid or external-if of the report for which to get annotations for.
+ * @return ApiBulkCreateOrUpdateAnnotationsRequest
+*/
+func (a *ReportsApiService) BulkCreateOrUpdateAnnotations(ctx _context.Context, username string, repoSlug string, commit string, reportId string) ApiBulkCreateOrUpdateAnnotationsRequest {
+	return ApiBulkCreateOrUpdateAnnotationsRequest{
+		ApiService: a,
+		ctx:        ctx,
+		username:   username,
+		repoSlug:   repoSlug,
+		commit:     commit,
+		reportId:   reportId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return []ReportAnnotation
+ */
+func (a *ReportsApiService) BulkCreateOrUpdateAnnotationsExecute(r ApiBulkCreateOrUpdateAnnotationsRequest) ([]ReportAnnotation, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodPost
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  []ReportAnnotation
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.BulkCreateOrUpdateAnnotations")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}/annotations"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"reportId"+"}", _neturl.PathEscape(parameterToString(r.reportId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if r.body == nil {
+		return localVarReturnValue, nil, reportError("body is required and must be specified")
+	}
+	if len(*r.body) < 1 {
+		return localVarReturnValue, nil, reportError("body must have at least 1 elements")
+	}
+	if len(*r.body) > 100 {
+		return localVarReturnValue, nil, reportError("body must have less than 100 elements")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	// body params
+	localVarPostBody = r.body
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiCreateOrUpdateAnnotationRequest struct {
+	ctx          _context.Context
+	ApiService   *ReportsApiService
+	username     string
+	repoSlug     string
+	commit       string
+	reportId     string
+	annotationId string
+	body         *ReportAnnotation
+}
+
+func (r ApiCreateOrUpdateAnnotationRequest) Body(body ReportAnnotation) ApiCreateOrUpdateAnnotationRequest {
+	r.body = &body
+	return r
+}
+
+func (r ApiCreateOrUpdateAnnotationRequest) Execute() (ReportAnnotation, *_nethttp.Response, error) {
+	return r.ApiService.CreateOrUpdateAnnotationExecute(r)
+}
+
+/*
+ * CreateOrUpdateAnnotation Method for CreateOrUpdateAnnotation
+ * Creates or updates an individual annotation for the specified report.
+Annotations are individual findings that have been identified as part of a report, for example, a line of code that represents a vulnerability. These annotations can be attached to a specific file and even a specific line in that file, however, that is optional. Annotations are not mandatory and a report can contain up to 1000 annotations.
+
+Just as reports, annotation needs to be uploaded with a unique ID that can later be used to identify the report as an alternative to the generated [UUID](https://developer.atlassian.com/bitbucket/api/2/reference/meta/uri-uuid#uuid). If you want to use an existing id from your own system, we recommend prefixing it with your system's name to avoid collisions, for example, mySystem-annotation001.
+
+### Sample cURL request:
+```
+curl --request PUT 'https://api.bitbucket.org/2.0/repositories/<username>/<reposity-name>/commit/<commit-hash>/reports/mySystem-001/annotations/mysystem-annotation001' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+    "title": "Security scan report",
+    "annotation_type": "VULNERABILITY",
+    "summary": "This line represents a security thread.",
+    "severity": "HIGH",
+    "path": "my-service/src/main/java/com/myCompany/mysystem/logic/Main.java",
+    "line": 42
+}'
+```
+
+### Possible field values:
+annotation_type: VULNERABILITY, CODE_SMELL, BUG
+result: PASSED, FAILED, IGNORED, SKIPPED
+severity: HIGH, MEDIUM, LOW, CRITICAL
+
+Please refer to the [Code Insights documentation](https://confluence.atlassian.com/bitbucket/code-insights-994316785.html) for more information.
+
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit the report belongs to.
+ * @param reportId Either the uuid or external-id of the report.
+ * @param annotationId Either the uuid or external-id of the annotation.
+ * @return ApiCreateOrUpdateAnnotationRequest
+*/
+func (a *ReportsApiService) CreateOrUpdateAnnotation(ctx _context.Context, username string, repoSlug string, commit string, reportId string, annotationId string) ApiCreateOrUpdateAnnotationRequest {
+	return ApiCreateOrUpdateAnnotationRequest{
+		ApiService:   a,
+		ctx:          ctx,
+		username:     username,
+		repoSlug:     repoSlug,
+		commit:       commit,
+		reportId:     reportId,
+		annotationId: annotationId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return ReportAnnotation
+ */
+func (a *ReportsApiService) CreateOrUpdateAnnotationExecute(r ApiCreateOrUpdateAnnotationRequest) (ReportAnnotation, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodPut
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  ReportAnnotation
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.CreateOrUpdateAnnotation")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}/annotations/{annotationId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"reportId"+"}", _neturl.PathEscape(parameterToString(r.reportId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"annotationId"+"}", _neturl.PathEscape(parameterToString(r.annotationId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if r.body == nil {
+		return localVarReturnValue, nil, reportError("body is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	// body params
+	localVarPostBody = r.body
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 400 {
+			var v ModelError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiCreateOrUpdateReportRequest struct {
+	ctx        _context.Context
+	ApiService *ReportsApiService
+	username   string
+	repoSlug   string
+	commit     string
+	reportId   string
+	body       *Report
+}
+
+func (r ApiCreateOrUpdateReportRequest) Body(body Report) ApiCreateOrUpdateReportRequest {
+	r.body = &body
+	return r
+}
+
+func (r ApiCreateOrUpdateReportRequest) Execute() (Report, *_nethttp.Response, error) {
+	return r.ApiService.CreateOrUpdateReportExecute(r)
+}
+
+/*
+ * CreateOrUpdateReport Method for CreateOrUpdateReport
+ * Creates or updates a report for the specified commit.
+To upload a report, make sure to generate an ID that is unique across all reports for that commit. If you want to use an existing id from your own system, we recommend prefixing it with your system's name to avoid collisions, for example, mySystem-001.
+
+### Sample cURL request:
+```
+curl --request PUT 'https://api.bitbucket.org/2.0/repositories/<username>/<reposity-name>/commit/<commit-hash>/reports/mysystem-001' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+    "title": "Security scan report",
+    "details": "This pull request introduces 10 new dependency vulnerabilities.",
+    "report_type": "SECURITY",
+    "reporter": "mySystem",
+    "link": "http://www.mysystem.com/reports/001",
+    "result": "FAILED",
+    "data": [
+        {
+            "title": "Duration (seconds)",
+            "type": "DURATION",
+            "value": 14
+        },
+        {
+            "title": "Safe to merge?",
+            "type": "BOOLEAN",
+            "value": false
+        }
+    ]
+}'
+```
+
+### Possible field values:
+report_type: SECURITY, COVERAGE, TEST, BUG
+result: PASSED, FAILED, PENDING
+data.type: BOOLEAN, DATE, DURATION, LINK, NUMBER, PERCENTAGE, TEXT
+
+Please refer to the [Code Insights documentation](https://confluence.atlassian.com/bitbucket/code-insights-994316785.html) for more information.
+
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit the report belongs to.
+ * @param reportId Either the uuid or external-id of the report.
+ * @return ApiCreateOrUpdateReportRequest
+*/
+func (a *ReportsApiService) CreateOrUpdateReport(ctx _context.Context, username string, repoSlug string, commit string, reportId string) ApiCreateOrUpdateReportRequest {
+	return ApiCreateOrUpdateReportRequest{
+		ApiService: a,
+		ctx:        ctx,
+		username:   username,
+		repoSlug:   repoSlug,
+		commit:     commit,
+		reportId:   reportId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return Report
+ */
+func (a *ReportsApiService) CreateOrUpdateReportExecute(r ApiCreateOrUpdateReportRequest) (Report, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodPut
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  Report
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.CreateOrUpdateReport")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"reportId"+"}", _neturl.PathEscape(parameterToString(r.reportId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if r.body == nil {
+		return localVarReturnValue, nil, reportError("body is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	// body params
+	localVarPostBody = r.body
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 400 {
+			var v ModelError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiDeleteAnnotationRequest struct {
+	ctx          _context.Context
+	ApiService   *ReportsApiService
+	username     string
+	repoSlug     string
+	commit       string
+	reportId     string
+	annotationId string
+}
+
+func (r ApiDeleteAnnotationRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.DeleteAnnotationExecute(r)
+}
+
+/*
+ * DeleteAnnotation Method for DeleteAnnotation
+ * Deletes a single Annotation matching the provided ID.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit the annotation belongs to.
+ * @param reportId Either the uuid or external-id of the annotation.
+ * @param annotationId Either the uuid or external-id of the annotation.
+ * @return ApiDeleteAnnotationRequest
+ */
+func (a *ReportsApiService) DeleteAnnotation(ctx _context.Context, username string, repoSlug string, commit string, reportId string, annotationId string) ApiDeleteAnnotationRequest {
+	return ApiDeleteAnnotationRequest{
+		ApiService:   a,
+		ctx:          ctx,
+		username:     username,
+		repoSlug:     repoSlug,
+		commit:       commit,
+		reportId:     reportId,
+		annotationId: annotationId,
+	}
+}
+
+/*
+ * Execute executes the request
+ */
+func (a *ReportsApiService) DeleteAnnotationExecute(r ApiDeleteAnnotationRequest) (*_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodDelete
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.DeleteAnnotation")
+	if err != nil {
+		return nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}/annotations/{annotationId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"reportId"+"}", _neturl.PathEscape(parameterToString(r.reportId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"annotationId"+"}", _neturl.PathEscape(parameterToString(r.annotationId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		return localVarHTTPResponse, newErr
+	}
+
+	return localVarHTTPResponse, nil
+}
+
+type ApiDeleteReportRequest struct {
+	ctx        _context.Context
+	ApiService *ReportsApiService
+	username   string
+	repoSlug   string
+	commit     string
+	reportId   string
+}
+
+func (r ApiDeleteReportRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.DeleteReportExecute(r)
+}
+
+/*
+ * DeleteReport Method for DeleteReport
+ * Deletes a single Report matching the provided ID.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit the report belongs to.
+ * @param reportId Either the uuid or external-id of the report.
+ * @return ApiDeleteReportRequest
+ */
+func (a *ReportsApiService) DeleteReport(ctx _context.Context, username string, repoSlug string, commit string, reportId string) ApiDeleteReportRequest {
+	return ApiDeleteReportRequest{
+		ApiService: a,
+		ctx:        ctx,
+		username:   username,
+		repoSlug:   repoSlug,
+		commit:     commit,
+		reportId:   reportId,
+	}
+}
+
+/*
+ * Execute executes the request
+ */
+func (a *ReportsApiService) DeleteReportExecute(r ApiDeleteReportRequest) (*_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodDelete
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.DeleteReport")
+	if err != nil {
+		return nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"reportId"+"}", _neturl.PathEscape(parameterToString(r.reportId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		return localVarHTTPResponse, newErr
+	}
+
+	return localVarHTTPResponse, nil
+}
+
+type ApiGetAnnotationRequest struct {
+	ctx          _context.Context
+	ApiService   *ReportsApiService
+	username     string
+	repoSlug     string
+	commit       string
+	reportId     string
+	annotationId string
+}
+
+func (r ApiGetAnnotationRequest) Execute() (ReportAnnotation, *_nethttp.Response, error) {
+	return r.ApiService.GetAnnotationExecute(r)
+}
+
+/*
+ * GetAnnotation Method for GetAnnotation
+ * Returns a single Annotation matching the provided ID.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit the report belongs to.
+ * @param reportId Either the uuid or external-id of the report.
+ * @param annotationId Either the uuid or external-id of the annotation.
+ * @return ApiGetAnnotationRequest
+ */
+func (a *ReportsApiService) GetAnnotation(ctx _context.Context, username string, repoSlug string, commit string, reportId string, annotationId string) ApiGetAnnotationRequest {
+	return ApiGetAnnotationRequest{
+		ApiService:   a,
+		ctx:          ctx,
+		username:     username,
+		repoSlug:     repoSlug,
+		commit:       commit,
+		reportId:     reportId,
+		annotationId: annotationId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return ReportAnnotation
+ */
+func (a *ReportsApiService) GetAnnotationExecute(r ApiGetAnnotationRequest) (ReportAnnotation, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  ReportAnnotation
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.GetAnnotation")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}/annotations/{annotationId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"reportId"+"}", _neturl.PathEscape(parameterToString(r.reportId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"annotationId"+"}", _neturl.PathEscape(parameterToString(r.annotationId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v ModelError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiGetAnnotationsForReportRequest struct {
+	ctx        _context.Context
+	ApiService *ReportsApiService
+	username   string
+	repoSlug   string
+	commit     string
+	reportId   string
+}
+
+func (r ApiGetAnnotationsForReportRequest) Execute() (PaginatedAnnotations, *_nethttp.Response, error) {
+	return r.ApiService.GetAnnotationsForReportExecute(r)
+}
+
+/*
+ * GetAnnotationsForReport Method for GetAnnotationsForReport
+ * Returns a paginated list of Annotations for a specified report.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit for which to retrieve reports.
+ * @param reportId Uuid or external-if of the report for which to get annotations for.
+ * @return ApiGetAnnotationsForReportRequest
+ */
+func (a *ReportsApiService) GetAnnotationsForReport(ctx _context.Context, username string, repoSlug string, commit string, reportId string) ApiGetAnnotationsForReportRequest {
+	return ApiGetAnnotationsForReportRequest{
+		ApiService: a,
+		ctx:        ctx,
+		username:   username,
+		repoSlug:   repoSlug,
+		commit:     commit,
+		reportId:   reportId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return PaginatedAnnotations
+ */
+func (a *ReportsApiService) GetAnnotationsForReportExecute(r ApiGetAnnotationsForReportRequest) (PaginatedAnnotations, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  PaginatedAnnotations
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.GetAnnotationsForReport")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}/annotations"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"reportId"+"}", _neturl.PathEscape(parameterToString(r.reportId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiGetReportRequest struct {
+	ctx        _context.Context
+	ApiService *ReportsApiService
+	username   string
+	repoSlug   string
+	commit     string
+	reportId   string
+}
+
+func (r ApiGetReportRequest) Execute() (Report, *_nethttp.Response, error) {
+	return r.ApiService.GetReportExecute(r)
+}
+
+/*
+ * GetReport Method for GetReport
+ * Returns a single Report matching the provided ID.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit the report belongs to.
+ * @param reportId Either the uuid or external-id of the report.
+ * @return ApiGetReportRequest
+ */
+func (a *ReportsApiService) GetReport(ctx _context.Context, username string, repoSlug string, commit string, reportId string) ApiGetReportRequest {
+	return ApiGetReportRequest{
+		ApiService: a,
+		ctx:        ctx,
+		username:   username,
+		repoSlug:   repoSlug,
+		commit:     commit,
+		reportId:   reportId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return Report
+ */
+func (a *ReportsApiService) GetReportExecute(r ApiGetReportRequest) (Report, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  Report
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.GetReport")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports/{reportId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"reportId"+"}", _neturl.PathEscape(parameterToString(r.reportId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v ModelError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiGetReportsForCommitRequest struct {
+	ctx        _context.Context
+	ApiService *ReportsApiService
+	username   string
+	repoSlug   string
+	commit     string
+}
+
+func (r ApiGetReportsForCommitRequest) Execute() (PaginatedReports, *_nethttp.Response, error) {
+	return r.ApiService.GetReportsForCommitExecute(r)
+}
+
+/*
+ * GetReportsForCommit Method for GetReportsForCommit
+ * Returns a paginated list of Reports linked to this commit.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param username The account.
+ * @param repoSlug The repository.
+ * @param commit The commit for which to retrieve reports.
+ * @return ApiGetReportsForCommitRequest
+ */
+func (a *ReportsApiService) GetReportsForCommit(ctx _context.Context, username string, repoSlug string, commit string) ApiGetReportsForCommitRequest {
+	return ApiGetReportsForCommitRequest{
+		ApiService: a,
+		ctx:        ctx,
+		username:   username,
+		repoSlug:   repoSlug,
+		commit:     commit,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return PaginatedReports
+ */
+func (a *ReportsApiService) GetReportsForCommitExecute(r ApiGetReportsForCommitRequest) (PaginatedReports, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  PaginatedReports
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ReportsApiService.GetReportsForCommit")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/repositories/{username}/{repo_slug}/commit/{commit}/reports"
+	localVarPath = strings.Replace(localVarPath, "{"+"username"+"}", _neturl.PathEscape(parameterToString(r.username, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"repo_slug"+"}", _neturl.PathEscape(parameterToString(r.repoSlug, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"commit"+"}", _neturl.PathEscape(parameterToString(r.commit, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
diff --git a/service/bitbucket/openapi/client.go b/service/bitbucket/openapi/client.go
new file mode 100644
index 00000000..3e7c6c2c
--- /dev/null
+++ b/service/bitbucket/openapi/client.go
@@ -0,0 +1,535 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"encoding/xml"
+	"errors"
+	"fmt"
+	"io"
+	"log"
+	"mime/multipart"
+	"net/http"
+	"net/http/httputil"
+	"net/url"
+	"os"
+	"path/filepath"
+	"reflect"
+	"regexp"
+	"strconv"
+	"strings"
+	"time"
+	"unicode/utf8"
+
+	"golang.org/x/oauth2"
+)
+
+var (
+	jsonCheck = regexp.MustCompile(`(?i:(?:application|text)/(?:vnd\.[^;]+\+)?json)`)
+	xmlCheck  = regexp.MustCompile(`(?i:(?:application|text)/xml)`)
+)
+
+// APIClient manages communication with the Bitbucket API API v2.0
+// In most cases there should be only one, shared, APIClient.
+type APIClient struct {
+	cfg    *Configuration
+	common service // Reuse a single struct instead of allocating one for each service on the heap.
+
+	// API Services
+	// NOTE : all services except ReportsApi were removed
+	ReportsApi *ReportsApiService
+}
+
+type service struct {
+	client *APIClient
+}
+
+// NewAPIClient creates a new API client. Requires a userAgent string describing your application.
+// optionally a custom http.Client to allow for advanced features such as caching.
+func NewAPIClient(cfg *Configuration) *APIClient {
+	if cfg.HTTPClient == nil {
+		cfg.HTTPClient = http.DefaultClient
+	}
+
+	c := &APIClient{}
+	c.cfg = cfg
+	c.common.client = c
+
+	// API Services
+	// NOTE : all services except ReportsApi were removed
+	c.ReportsApi = (*ReportsApiService)(&c.common)
+
+	return c
+}
+
+func atoi(in string) (int, error) {
+	return strconv.Atoi(in)
+}
+
+// selectHeaderContentType select a content type from the available list.
+func selectHeaderContentType(contentTypes []string) string {
+	if len(contentTypes) == 0 {
+		return ""
+	}
+	if contains(contentTypes, "application/json") {
+		return "application/json"
+	}
+	return contentTypes[0] // use the first content type specified in 'consumes'
+}
+
+// selectHeaderAccept join all accept types and return
+func selectHeaderAccept(accepts []string) string {
+	if len(accepts) == 0 {
+		return ""
+	}
+
+	if contains(accepts, "application/json") {
+		return "application/json"
+	}
+
+	return strings.Join(accepts, ",")
+}
+
+// contains is a case insenstive match, finding needle in a haystack
+func contains(haystack []string, needle string) bool {
+	for _, a := range haystack {
+		if strings.EqualFold(a, needle) {
+			return true
+		}
+	}
+	return false
+}
+
+// Verify optional parameters are of the correct type.
+func typeCheckParameter(obj interface{}, expected string, name string) error {
+	// Make sure there is an object.
+	if obj == nil {
+		return nil
+	}
+
+	// Check the type is as expected.
+	if reflect.TypeOf(obj).String() != expected {
+		return fmt.Errorf("expected %s to be of type %s but received %s", name, expected, reflect.TypeOf(obj).String())
+	}
+	return nil
+}
+
+// parameterToString convert interface{} parameters to string, using a delimiter if format is provided.
+func parameterToString(obj interface{}, collectionFormat string) string {
+	var delimiter string
+
+	switch collectionFormat {
+	case "pipes":
+		delimiter = "|"
+	case "ssv":
+		delimiter = " "
+	case "tsv":
+		delimiter = "\t"
+	case "csv":
+		delimiter = ","
+	}
+
+	if reflect.TypeOf(obj).Kind() == reflect.Slice {
+		return strings.Trim(strings.Replace(fmt.Sprint(obj), " ", delimiter, -1), "[]")
+	} else if t, ok := obj.(time.Time); ok {
+		return t.Format(time.RFC3339)
+	}
+
+	return fmt.Sprintf("%v", obj)
+}
+
+// helper for converting interface{} parameters to json strings
+func parameterToJson(obj interface{}) (string, error) {
+	jsonBuf, err := json.Marshal(obj)
+	if err != nil {
+		return "", err
+	}
+	return string(jsonBuf), err
+}
+
+// callAPI do the request.
+func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) {
+	if c.cfg.Debug {
+		dump, err := httputil.DumpRequestOut(request, true)
+		if err != nil {
+			return nil, err
+		}
+		log.Printf("\n%s\n", string(dump))
+	}
+
+	resp, err := c.cfg.HTTPClient.Do(request)
+	if err != nil {
+		return resp, err
+	}
+
+	if c.cfg.Debug {
+		dump, err := httputil.DumpResponse(resp, true)
+		if err != nil {
+			return resp, err
+		}
+		log.Printf("\n%s\n", string(dump))
+	}
+	return resp, err
+}
+
+// Allow modification of underlying config for alternate implementations and testing
+// Caution: modifying the configuration while live can cause data races and potentially unwanted behavior
+func (c *APIClient) GetConfig() *Configuration {
+	return c.cfg
+}
+
+// prepareRequest build the request
+func (c *APIClient) prepareRequest(
+	ctx context.Context,
+	path string, method string,
+	postBody interface{},
+	headerParams map[string]string,
+	queryParams url.Values,
+	formParams url.Values,
+	formFileName string,
+	fileName string,
+	fileBytes []byte) (localVarRequest *http.Request, err error) {
+
+	var body *bytes.Buffer
+
+	// Detect postBody type and post.
+	if postBody != nil {
+		contentType := headerParams["Content-Type"]
+		if contentType == "" {
+			contentType = detectContentType(postBody)
+			headerParams["Content-Type"] = contentType
+		}
+
+		body, err = setBody(postBody, contentType)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	// add form parameters and file if available.
+	if strings.HasPrefix(headerParams["Content-Type"], "multipart/form-data") && len(formParams) > 0 || (len(fileBytes) > 0 && fileName != "") {
+		if body != nil {
+			return nil, errors.New("cannot specify postBody and multipart form at the same time")
+		}
+		body = &bytes.Buffer{}
+		w := multipart.NewWriter(body)
+
+		for k, v := range formParams {
+			for _, iv := range v {
+				if strings.HasPrefix(k, "@") { // file
+					err = addFile(w, k[1:], iv)
+					if err != nil {
+						return nil, err
+					}
+				} else { // form value
+					w.WriteField(k, iv)
+				}
+			}
+		}
+		if len(fileBytes) > 0 && fileName != "" {
+			w.Boundary()
+			//_, fileNm := filepath.Split(fileName)
+			part, err := w.CreateFormFile(formFileName, filepath.Base(fileName))
+			if err != nil {
+				return nil, err
+			}
+			_, err = part.Write(fileBytes)
+			if err != nil {
+				return nil, err
+			}
+		}
+
+		// Set the Boundary in the Content-Type
+		headerParams["Content-Type"] = w.FormDataContentType()
+
+		// Set Content-Length
+		headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
+		w.Close()
+	}
+
+	if strings.HasPrefix(headerParams["Content-Type"], "application/x-www-form-urlencoded") && len(formParams) > 0 {
+		if body != nil {
+			return nil, errors.New("cannot specify postBody and x-www-form-urlencoded form at the same time")
+		}
+		body = &bytes.Buffer{}
+		body.WriteString(formParams.Encode())
+		// Set Content-Length
+		headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
+	}
+
+	// Setup path and query parameters
+	url, err := url.Parse(path)
+	if err != nil {
+		return nil, err
+	}
+
+	// Override request host, if applicable
+	if c.cfg.Host != "" {
+		url.Host = c.cfg.Host
+	}
+
+	// Override request scheme, if applicable
+	if c.cfg.Scheme != "" {
+		url.Scheme = c.cfg.Scheme
+	}
+
+	// Adding Query Param
+	query := url.Query()
+	for k, v := range queryParams {
+		for _, iv := range v {
+			query.Add(k, iv)
+		}
+	}
+
+	// Encode the parameters.
+	url.RawQuery = query.Encode()
+
+	// Generate a new request
+	if body != nil {
+		localVarRequest, err = http.NewRequest(method, url.String(), body)
+	} else {
+		localVarRequest, err = http.NewRequest(method, url.String(), nil)
+	}
+	if err != nil {
+		return nil, err
+	}
+
+	// add header parameters, if any
+	if len(headerParams) > 0 {
+		headers := http.Header{}
+		for h, v := range headerParams {
+			headers.Set(h, v)
+		}
+		localVarRequest.Header = headers
+	}
+
+	// Add the user agent to the request.
+	localVarRequest.Header.Add("User-Agent", c.cfg.UserAgent)
+
+	if ctx != nil {
+		// add context to the request
+		localVarRequest = localVarRequest.WithContext(ctx)
+
+		// Walk through any authentication.
+
+		// OAuth2 authentication
+		if tok, ok := ctx.Value(ContextOAuth2).(oauth2.TokenSource); ok {
+			// We were able to grab an oauth2 token from the context
+			var latestToken *oauth2.Token
+			if latestToken, err = tok.Token(); err != nil {
+				return nil, err
+			}
+
+			latestToken.SetAuthHeader(localVarRequest)
+		}
+
+		// Basic HTTP Authentication
+		if auth, ok := ctx.Value(ContextBasicAuth).(BasicAuth); ok {
+			localVarRequest.SetBasicAuth(auth.UserName, auth.Password)
+		}
+
+		// AccessToken Authentication
+		if auth, ok := ctx.Value(ContextAccessToken).(string); ok {
+			localVarRequest.Header.Add("Authorization", "Bearer "+auth)
+		}
+
+	}
+
+	for header, value := range c.cfg.DefaultHeader {
+		localVarRequest.Header.Add(header, value)
+	}
+	return localVarRequest, nil
+}
+
+func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) {
+	if len(b) == 0 {
+		return nil
+	}
+	if s, ok := v.(*string); ok {
+		*s = string(b)
+		return nil
+	}
+	if xmlCheck.MatchString(contentType) {
+		if err = xml.Unmarshal(b, v); err != nil {
+			return err
+		}
+		return nil
+	}
+	if jsonCheck.MatchString(contentType) {
+		if actualObj, ok := v.(interface{ GetActualInstance() interface{} }); ok { // oneOf, anyOf schemas
+			if unmarshalObj, ok := actualObj.(interface{ UnmarshalJSON([]byte) error }); ok { // make sure it has UnmarshalJSON defined
+				if err = unmarshalObj.UnmarshalJSON(b); err != nil {
+					return err
+				}
+			} else {
+				return errors.New("unknown type with GetActualInstance but no unmarshalObj.UnmarshalJSON defined")
+			}
+		} else if err = json.Unmarshal(b, v); err != nil { // simple model
+			return err
+		}
+		return nil
+	}
+	return errors.New("undefined response type")
+}
+
+// Add a file to the multipart request
+func addFile(w *multipart.Writer, fieldName, path string) error {
+	file, err := os.Open(path)
+	if err != nil {
+		return err
+	}
+	defer file.Close()
+
+	part, err := w.CreateFormFile(fieldName, filepath.Base(path))
+	if err != nil {
+		return err
+	}
+	_, err = io.Copy(part, file)
+
+	return err
+}
+
+// Prevent trying to import "fmt"
+func reportError(format string, a ...interface{}) error {
+	return fmt.Errorf(format, a...)
+}
+
+// Set request body from an interface{}
+func setBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err error) {
+	if bodyBuf == nil {
+		bodyBuf = &bytes.Buffer{}
+	}
+
+	if reader, ok := body.(io.Reader); ok {
+		_, err = bodyBuf.ReadFrom(reader)
+	} else if b, ok := body.([]byte); ok {
+		_, err = bodyBuf.Write(b)
+	} else if s, ok := body.(string); ok {
+		_, err = bodyBuf.WriteString(s)
+	} else if s, ok := body.(*string); ok {
+		_, err = bodyBuf.WriteString(*s)
+	} else if jsonCheck.MatchString(contentType) {
+		err = json.NewEncoder(bodyBuf).Encode(body)
+	} else if xmlCheck.MatchString(contentType) {
+		err = xml.NewEncoder(bodyBuf).Encode(body)
+	}
+
+	if err != nil {
+		return nil, err
+	}
+
+	if bodyBuf.Len() == 0 {
+		err = fmt.Errorf("invalid body type %s", contentType)
+		return nil, err
+	}
+	return bodyBuf, nil
+}
+
+// detectContentType method is used to figure out `Request.Body` content type for request header
+func detectContentType(body interface{}) string {
+	contentType := "text/plain; charset=utf-8"
+	kind := reflect.TypeOf(body).Kind()
+
+	switch kind {
+	case reflect.Struct, reflect.Map, reflect.Ptr:
+		contentType = "application/json; charset=utf-8"
+	case reflect.String:
+		contentType = "text/plain; charset=utf-8"
+	default:
+		if b, ok := body.([]byte); ok {
+			contentType = http.DetectContentType(b)
+		} else if kind == reflect.Slice {
+			contentType = "application/json; charset=utf-8"
+		}
+	}
+
+	return contentType
+}
+
+// Ripped from https://github.com/gregjones/httpcache/blob/master/httpcache.go
+type cacheControl map[string]string
+
+func parseCacheControl(headers http.Header) cacheControl {
+	cc := cacheControl{}
+	ccHeader := headers.Get("Cache-Control")
+	for _, part := range strings.Split(ccHeader, ",") {
+		part = strings.Trim(part, " ")
+		if part == "" {
+			continue
+		}
+		if strings.ContainsRune(part, '=') {
+			keyval := strings.Split(part, "=")
+			cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",")
+		} else {
+			cc[part] = ""
+		}
+	}
+	return cc
+}
+
+// CacheExpires helper function to determine remaining time before repeating a request.
+func CacheExpires(r *http.Response) time.Time {
+	// Figure out when the cache expires.
+	var expires time.Time
+	now, err := time.Parse(time.RFC1123, r.Header.Get("date"))
+	if err != nil {
+		return time.Now()
+	}
+	respCacheControl := parseCacheControl(r.Header)
+
+	if maxAge, ok := respCacheControl["max-age"]; ok {
+		lifetime, err := time.ParseDuration(maxAge + "s")
+		if err != nil {
+			expires = now
+		} else {
+			expires = now.Add(lifetime)
+		}
+	} else {
+		expiresHeader := r.Header.Get("Expires")
+		if expiresHeader != "" {
+			expires, err = time.Parse(time.RFC1123, expiresHeader)
+			if err != nil {
+				expires = now
+			}
+		}
+	}
+	return expires
+}
+
+func strlen(s string) int {
+	return utf8.RuneCountInString(s)
+}
+
+// GenericOpenAPIError Provides access to the body, error and model on returned errors.
+type GenericOpenAPIError struct {
+	body  []byte
+	error string
+	model interface{}
+}
+
+// Error returns non-empty string if there was an error.
+func (e GenericOpenAPIError) Error() string {
+	return e.error
+}
+
+// Body returns the raw bytes of the response
+func (e GenericOpenAPIError) Body() []byte {
+	return e.body
+}
+
+// Model returns the unpacked model of the error
+func (e GenericOpenAPIError) Model() interface{} {
+	return e.model
+}
diff --git a/service/bitbucket/openapi/configuration.go b/service/bitbucket/openapi/configuration.go
new file mode 100644
index 00000000..ebafe058
--- /dev/null
+++ b/service/bitbucket/openapi/configuration.go
@@ -0,0 +1,230 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"strings"
+)
+
+// contextKeys are used to identify the type of value in the context.
+// Since these are string, it is possible to get a short description of the
+// context key for logging and debugging using key.String().
+
+type contextKey string
+
+func (c contextKey) String() string {
+	return "auth " + string(c)
+}
+
+var (
+	// ContextOAuth2 takes an oauth2.TokenSource as authentication for the request.
+	ContextOAuth2 = contextKey("token")
+
+	// ContextBasicAuth takes BasicAuth as authentication for the request.
+	ContextBasicAuth = contextKey("basic")
+
+	// ContextAccessToken takes a string oauth2 access token as authentication for the request.
+	ContextAccessToken = contextKey("accesstoken")
+
+	// ContextAPIKeys takes a string apikey as authentication for the request
+	ContextAPIKeys = contextKey("apiKeys")
+
+	// ContextHttpSignatureAuth takes HttpSignatureAuth as authentication for the request.
+	ContextHttpSignatureAuth = contextKey("httpsignature")
+
+	// ContextServerIndex uses a server configuration from the index.
+	ContextServerIndex = contextKey("serverIndex")
+
+	// ContextOperationServerIndices uses a server configuration from the index mapping.
+	ContextOperationServerIndices = contextKey("serverOperationIndices")
+
+	// ContextServerVariables overrides a server configuration variables.
+	ContextServerVariables = contextKey("serverVariables")
+
+	// ContextOperationServerVariables overrides a server configuration variables using operation specific values.
+	ContextOperationServerVariables = contextKey("serverOperationVariables")
+)
+
+// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth
+type BasicAuth struct {
+	UserName string `json:"userName,omitempty"`
+	Password string `json:"password,omitempty"`
+}
+
+// APIKey provides API key based authentication to a request passed via context using ContextAPIKey
+type APIKey struct {
+	Key    string
+	Prefix string
+}
+
+// ServerVariable stores the information about a server variable
+type ServerVariable struct {
+	Description  string
+	DefaultValue string
+	EnumValues   []string
+}
+
+// ServerConfiguration stores the information about a server
+type ServerConfiguration struct {
+	URL         string
+	Description string
+	Variables   map[string]ServerVariable
+}
+
+// ServerConfigurations stores multiple ServerConfiguration items
+type ServerConfigurations []ServerConfiguration
+
+// Configuration stores the configuration of the API client
+type Configuration struct {
+	Host             string            `json:"host,omitempty"`
+	Scheme           string            `json:"scheme,omitempty"`
+	DefaultHeader    map[string]string `json:"defaultHeader,omitempty"`
+	UserAgent        string            `json:"userAgent,omitempty"`
+	Debug            bool              `json:"debug,omitempty"`
+	Servers          ServerConfigurations
+	OperationServers map[string]ServerConfigurations
+	HTTPClient       *http.Client
+}
+
+// NewConfiguration returns a new Configuration object
+func NewConfiguration() *Configuration {
+	cfg := &Configuration{
+		DefaultHeader: make(map[string]string),
+		UserAgent:     "OpenAPI-Generator/1.0.0/go",
+		Debug:         false,
+		Servers: ServerConfigurations{
+			{
+				URL:         "https://api.bitbucket.org/2.0",
+				Description: "No description provided",
+			},
+		},
+		OperationServers: map[string]ServerConfigurations{},
+	}
+	return cfg
+}
+
+// AddDefaultHeader adds a new HTTP header to the default header in the request
+func (c *Configuration) AddDefaultHeader(key string, value string) {
+	c.DefaultHeader[key] = value
+}
+
+// URL formats template on a index using given variables
+func (sc ServerConfigurations) URL(index int, variables map[string]string) (string, error) {
+	if index < 0 || len(sc) <= index {
+		return "", fmt.Errorf("index %v out of range %v", index, len(sc)-1)
+	}
+	server := sc[index]
+	url := server.URL
+
+	// go through variables and replace placeholders
+	for name, variable := range server.Variables {
+		if value, ok := variables[name]; ok {
+			found := bool(len(variable.EnumValues) == 0)
+			for _, enumValue := range variable.EnumValues {
+				if value == enumValue {
+					found = true
+				}
+			}
+			if !found {
+				return "", fmt.Errorf("the variable %s in the server URL has invalid value %v. Must be %v", name, value, variable.EnumValues)
+			}
+			url = strings.Replace(url, "{"+name+"}", value, -1)
+		} else {
+			url = strings.Replace(url, "{"+name+"}", variable.DefaultValue, -1)
+		}
+	}
+	return url, nil
+}
+
+// ServerURL returns URL based on server settings
+func (c *Configuration) ServerURL(index int, variables map[string]string) (string, error) {
+	return c.Servers.URL(index, variables)
+}
+
+func getServerIndex(ctx context.Context) (int, error) {
+	si := ctx.Value(ContextServerIndex)
+	if si != nil {
+		if index, ok := si.(int); ok {
+			return index, nil
+		}
+		return 0, reportError("Invalid type %T should be int", si)
+	}
+	return 0, nil
+}
+
+func getServerOperationIndex(ctx context.Context, endpoint string) (int, error) {
+	osi := ctx.Value(ContextOperationServerIndices)
+	if osi != nil {
+		if operationIndices, ok := osi.(map[string]int); !ok {
+			return 0, reportError("Invalid type %T should be map[string]int", osi)
+		} else {
+			index, ok := operationIndices[endpoint]
+			if ok {
+				return index, nil
+			}
+		}
+	}
+	return getServerIndex(ctx)
+}
+
+func getServerVariables(ctx context.Context) (map[string]string, error) {
+	sv := ctx.Value(ContextServerVariables)
+	if sv != nil {
+		if variables, ok := sv.(map[string]string); ok {
+			return variables, nil
+		}
+		return nil, reportError("ctx value of ContextServerVariables has invalid type %T should be map[string]string", sv)
+	}
+	return nil, nil
+}
+
+func getServerOperationVariables(ctx context.Context, endpoint string) (map[string]string, error) {
+	osv := ctx.Value(ContextOperationServerVariables)
+	if osv != nil {
+		if operationVariables, ok := osv.(map[string]map[string]string); !ok {
+			return nil, reportError("ctx value of ContextOperationServerVariables has invalid type %T should be map[string]map[string]string", osv)
+		} else {
+			variables, ok := operationVariables[endpoint]
+			if ok {
+				return variables, nil
+			}
+		}
+	}
+	return getServerVariables(ctx)
+}
+
+// ServerURLWithContext returns a new server URL given an endpoint
+func (c *Configuration) ServerURLWithContext(ctx context.Context, endpoint string) (string, error) {
+	sc, ok := c.OperationServers[endpoint]
+	if !ok {
+		sc = c.Servers
+	}
+
+	if ctx == nil {
+		return sc.URL(0, nil)
+	}
+
+	index, err := getServerOperationIndex(ctx, endpoint)
+	if err != nil {
+		return "", err
+	}
+
+	variables, err := getServerOperationVariables(ctx, endpoint)
+	if err != nil {
+		return "", err
+	}
+
+	return sc.URL(index, variables)
+}
diff --git a/service/bitbucket/openapi/model_error.go b/service/bitbucket/openapi/model_error.go
new file mode 100644
index 00000000..379518ef
--- /dev/null
+++ b/service/bitbucket/openapi/model_error.go
@@ -0,0 +1,143 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// ModelError Base type for most resource objects. It defines the common `type` element that identifies an object's type. It also identifies the element as Swagger's `discriminator`.
+type ModelError struct {
+	Type  string      `json:"type"`
+	Error *ErrorError `json:"error,omitempty"`
+}
+
+// NewModelError instantiates a new ModelError object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewModelError(type_ string) *ModelError {
+	this := ModelError{}
+	this.Type = type_
+	return &this
+}
+
+// NewModelErrorWithDefaults instantiates a new ModelError object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewModelErrorWithDefaults() *ModelError {
+	this := ModelError{}
+	return &this
+}
+
+// GetType returns the Type field value
+func (o *ModelError) GetType() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Type
+}
+
+// GetTypeOk returns a tuple with the Type field value
+// and a boolean to check if the value has been set.
+func (o *ModelError) GetTypeOk() (*string, bool) {
+	if o == nil {
+		return nil, false
+	}
+	return &o.Type, true
+}
+
+// SetType sets field value
+func (o *ModelError) SetType(v string) {
+	o.Type = v
+}
+
+// GetError returns the Error field value if set, zero value otherwise.
+func (o *ModelError) GetError() ErrorError {
+	if o == nil || o.Error == nil {
+		var ret ErrorError
+		return ret
+	}
+	return *o.Error
+}
+
+// GetErrorOk returns a tuple with the Error field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ModelError) GetErrorOk() (*ErrorError, bool) {
+	if o == nil || o.Error == nil {
+		return nil, false
+	}
+	return o.Error, true
+}
+
+// HasError returns a boolean if a field has been set.
+func (o *ModelError) HasError() bool {
+	if o != nil && o.Error != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetError gets a reference to the given ErrorError and assigns it to the Error field.
+func (o *ModelError) SetError(v ErrorError) {
+	o.Error = &v
+}
+
+func (o ModelError) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["type"] = o.Type
+	}
+	if o.Error != nil {
+		toSerialize["error"] = o.Error
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableModelError struct {
+	value *ModelError
+	isSet bool
+}
+
+func (v NullableModelError) Get() *ModelError {
+	return v.value
+}
+
+func (v *NullableModelError) Set(val *ModelError) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableModelError) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableModelError) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableModelError(val *ModelError) *NullableModelError {
+	return &NullableModelError{value: val, isSet: true}
+}
+
+func (v NullableModelError) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableModelError) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_error_error.go b/service/bitbucket/openapi/model_error_error.go
new file mode 100644
index 00000000..3ed801ba
--- /dev/null
+++ b/service/bitbucket/openapi/model_error_error.go
@@ -0,0 +1,180 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// ErrorError struct for ErrorError
+type ErrorError struct {
+	Message string  `json:"message"`
+	Detail  *string `json:"detail,omitempty"`
+	// Optional structured data that is endpoint-specific.
+	Data *map[string]interface{} `json:"data,omitempty"`
+}
+
+// NewErrorError instantiates a new ErrorError object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewErrorError(message string) *ErrorError {
+	this := ErrorError{}
+	this.Message = message
+	return &this
+}
+
+// NewErrorErrorWithDefaults instantiates a new ErrorError object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewErrorErrorWithDefaults() *ErrorError {
+	this := ErrorError{}
+	return &this
+}
+
+// GetMessage returns the Message field value
+func (o *ErrorError) GetMessage() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Message
+}
+
+// GetMessageOk returns a tuple with the Message field value
+// and a boolean to check if the value has been set.
+func (o *ErrorError) GetMessageOk() (*string, bool) {
+	if o == nil {
+		return nil, false
+	}
+	return &o.Message, true
+}
+
+// SetMessage sets field value
+func (o *ErrorError) SetMessage(v string) {
+	o.Message = v
+}
+
+// GetDetail returns the Detail field value if set, zero value otherwise.
+func (o *ErrorError) GetDetail() string {
+	if o == nil || o.Detail == nil {
+		var ret string
+		return ret
+	}
+	return *o.Detail
+}
+
+// GetDetailOk returns a tuple with the Detail field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ErrorError) GetDetailOk() (*string, bool) {
+	if o == nil || o.Detail == nil {
+		return nil, false
+	}
+	return o.Detail, true
+}
+
+// HasDetail returns a boolean if a field has been set.
+func (o *ErrorError) HasDetail() bool {
+	if o != nil && o.Detail != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetDetail gets a reference to the given string and assigns it to the Detail field.
+func (o *ErrorError) SetDetail(v string) {
+	o.Detail = &v
+}
+
+// GetData returns the Data field value if set, zero value otherwise.
+func (o *ErrorError) GetData() map[string]interface{} {
+	if o == nil || o.Data == nil {
+		var ret map[string]interface{}
+		return ret
+	}
+	return *o.Data
+}
+
+// GetDataOk returns a tuple with the Data field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ErrorError) GetDataOk() (*map[string]interface{}, bool) {
+	if o == nil || o.Data == nil {
+		return nil, false
+	}
+	return o.Data, true
+}
+
+// HasData returns a boolean if a field has been set.
+func (o *ErrorError) HasData() bool {
+	if o != nil && o.Data != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetData gets a reference to the given map[string]interface{} and assigns it to the Data field.
+func (o *ErrorError) SetData(v map[string]interface{}) {
+	o.Data = &v
+}
+
+func (o ErrorError) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["message"] = o.Message
+	}
+	if o.Detail != nil {
+		toSerialize["detail"] = o.Detail
+	}
+	if o.Data != nil {
+		toSerialize["data"] = o.Data
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableErrorError struct {
+	value *ErrorError
+	isSet bool
+}
+
+func (v NullableErrorError) Get() *ErrorError {
+	return v.value
+}
+
+func (v *NullableErrorError) Set(val *ErrorError) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableErrorError) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableErrorError) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableErrorError(val *ErrorError) *NullableErrorError {
+	return &NullableErrorError{value: val, isSet: true}
+}
+
+func (v NullableErrorError) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableErrorError) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_object.go b/service/bitbucket/openapi/model_object.go
new file mode 100644
index 00000000..a7c2a686
--- /dev/null
+++ b/service/bitbucket/openapi/model_object.go
@@ -0,0 +1,107 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// Object Base type for most resource objects. It defines the common `type` element that identifies an object's type. It also identifies the element as Swagger's `discriminator`.
+type Object struct {
+	Type string `json:"type"`
+}
+
+// NewObject instantiates a new Object object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewObject(type_ string) *Object {
+	this := Object{}
+	this.Type = type_
+	return &this
+}
+
+// NewObjectWithDefaults instantiates a new Object object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewObjectWithDefaults() *Object {
+	this := Object{}
+	return &this
+}
+
+// GetType returns the Type field value
+func (o *Object) GetType() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Type
+}
+
+// GetTypeOk returns a tuple with the Type field value
+// and a boolean to check if the value has been set.
+func (o *Object) GetTypeOk() (*string, bool) {
+	if o == nil {
+		return nil, false
+	}
+	return &o.Type, true
+}
+
+// SetType sets field value
+func (o *Object) SetType(v string) {
+	o.Type = v
+}
+
+func (o Object) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["type"] = o.Type
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableObject struct {
+	value *Object
+	isSet bool
+}
+
+func (v NullableObject) Get() *Object {
+	return v.value
+}
+
+func (v *NullableObject) Set(val *Object) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableObject) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableObject) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableObject(val *Object) *NullableObject {
+	return &NullableObject{value: val, isSet: true}
+}
+
+func (v NullableObject) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableObject) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_paginated_annotations.go b/service/bitbucket/openapi/model_paginated_annotations.go
new file mode 100644
index 00000000..f6757177
--- /dev/null
+++ b/service/bitbucket/openapi/model_paginated_annotations.go
@@ -0,0 +1,300 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// PaginatedAnnotations A paginated list of annotations.
+type PaginatedAnnotations struct {
+	// Page number of the current results. This is an optional element that is not provided in all responses.
+	Page *int32 `json:"page,omitempty"`
+	// The values of the current page.
+	Values *[]ReportAnnotation `json:"values,omitempty"`
+	// Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute.
+	Size *int32 `json:"size,omitempty"`
+	// Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values.
+	Pagelen *int32 `json:"pagelen,omitempty"`
+	// Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.
+	Next *string `json:"next,omitempty"`
+	// Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.
+	Previous *string `json:"previous,omitempty"`
+}
+
+// NewPaginatedAnnotations instantiates a new PaginatedAnnotations object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewPaginatedAnnotations() *PaginatedAnnotations {
+	this := PaginatedAnnotations{}
+	return &this
+}
+
+// NewPaginatedAnnotationsWithDefaults instantiates a new PaginatedAnnotations object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewPaginatedAnnotationsWithDefaults() *PaginatedAnnotations {
+	this := PaginatedAnnotations{}
+	return &this
+}
+
+// GetPage returns the Page field value if set, zero value otherwise.
+func (o *PaginatedAnnotations) GetPage() int32 {
+	if o == nil || o.Page == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Page
+}
+
+// GetPageOk returns a tuple with the Page field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedAnnotations) GetPageOk() (*int32, bool) {
+	if o == nil || o.Page == nil {
+		return nil, false
+	}
+	return o.Page, true
+}
+
+// HasPage returns a boolean if a field has been set.
+func (o *PaginatedAnnotations) HasPage() bool {
+	if o != nil && o.Page != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPage gets a reference to the given int32 and assigns it to the Page field.
+func (o *PaginatedAnnotations) SetPage(v int32) {
+	o.Page = &v
+}
+
+// GetValues returns the Values field value if set, zero value otherwise.
+func (o *PaginatedAnnotations) GetValues() []ReportAnnotation {
+	if o == nil || o.Values == nil {
+		var ret []ReportAnnotation
+		return ret
+	}
+	return *o.Values
+}
+
+// GetValuesOk returns a tuple with the Values field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedAnnotations) GetValuesOk() (*[]ReportAnnotation, bool) {
+	if o == nil || o.Values == nil {
+		return nil, false
+	}
+	return o.Values, true
+}
+
+// HasValues returns a boolean if a field has been set.
+func (o *PaginatedAnnotations) HasValues() bool {
+	if o != nil && o.Values != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetValues gets a reference to the given []ReportAnnotation and assigns it to the Values field.
+func (o *PaginatedAnnotations) SetValues(v []ReportAnnotation) {
+	o.Values = &v
+}
+
+// GetSize returns the Size field value if set, zero value otherwise.
+func (o *PaginatedAnnotations) GetSize() int32 {
+	if o == nil || o.Size == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Size
+}
+
+// GetSizeOk returns a tuple with the Size field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedAnnotations) GetSizeOk() (*int32, bool) {
+	if o == nil || o.Size == nil {
+		return nil, false
+	}
+	return o.Size, true
+}
+
+// HasSize returns a boolean if a field has been set.
+func (o *PaginatedAnnotations) HasSize() bool {
+	if o != nil && o.Size != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetSize gets a reference to the given int32 and assigns it to the Size field.
+func (o *PaginatedAnnotations) SetSize(v int32) {
+	o.Size = &v
+}
+
+// GetPagelen returns the Pagelen field value if set, zero value otherwise.
+func (o *PaginatedAnnotations) GetPagelen() int32 {
+	if o == nil || o.Pagelen == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Pagelen
+}
+
+// GetPagelenOk returns a tuple with the Pagelen field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedAnnotations) GetPagelenOk() (*int32, bool) {
+	if o == nil || o.Pagelen == nil {
+		return nil, false
+	}
+	return o.Pagelen, true
+}
+
+// HasPagelen returns a boolean if a field has been set.
+func (o *PaginatedAnnotations) HasPagelen() bool {
+	if o != nil && o.Pagelen != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPagelen gets a reference to the given int32 and assigns it to the Pagelen field.
+func (o *PaginatedAnnotations) SetPagelen(v int32) {
+	o.Pagelen = &v
+}
+
+// GetNext returns the Next field value if set, zero value otherwise.
+func (o *PaginatedAnnotations) GetNext() string {
+	if o == nil || o.Next == nil {
+		var ret string
+		return ret
+	}
+	return *o.Next
+}
+
+// GetNextOk returns a tuple with the Next field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedAnnotations) GetNextOk() (*string, bool) {
+	if o == nil || o.Next == nil {
+		return nil, false
+	}
+	return o.Next, true
+}
+
+// HasNext returns a boolean if a field has been set.
+func (o *PaginatedAnnotations) HasNext() bool {
+	if o != nil && o.Next != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetNext gets a reference to the given string and assigns it to the Next field.
+func (o *PaginatedAnnotations) SetNext(v string) {
+	o.Next = &v
+}
+
+// GetPrevious returns the Previous field value if set, zero value otherwise.
+func (o *PaginatedAnnotations) GetPrevious() string {
+	if o == nil || o.Previous == nil {
+		var ret string
+		return ret
+	}
+	return *o.Previous
+}
+
+// GetPreviousOk returns a tuple with the Previous field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedAnnotations) GetPreviousOk() (*string, bool) {
+	if o == nil || o.Previous == nil {
+		return nil, false
+	}
+	return o.Previous, true
+}
+
+// HasPrevious returns a boolean if a field has been set.
+func (o *PaginatedAnnotations) HasPrevious() bool {
+	if o != nil && o.Previous != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPrevious gets a reference to the given string and assigns it to the Previous field.
+func (o *PaginatedAnnotations) SetPrevious(v string) {
+	o.Previous = &v
+}
+
+func (o PaginatedAnnotations) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.Page != nil {
+		toSerialize["page"] = o.Page
+	}
+	if o.Values != nil {
+		toSerialize["values"] = o.Values
+	}
+	if o.Size != nil {
+		toSerialize["size"] = o.Size
+	}
+	if o.Pagelen != nil {
+		toSerialize["pagelen"] = o.Pagelen
+	}
+	if o.Next != nil {
+		toSerialize["next"] = o.Next
+	}
+	if o.Previous != nil {
+		toSerialize["previous"] = o.Previous
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullablePaginatedAnnotations struct {
+	value *PaginatedAnnotations
+	isSet bool
+}
+
+func (v NullablePaginatedAnnotations) Get() *PaginatedAnnotations {
+	return v.value
+}
+
+func (v *NullablePaginatedAnnotations) Set(val *PaginatedAnnotations) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullablePaginatedAnnotations) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullablePaginatedAnnotations) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullablePaginatedAnnotations(val *PaginatedAnnotations) *NullablePaginatedAnnotations {
+	return &NullablePaginatedAnnotations{value: val, isSet: true}
+}
+
+func (v NullablePaginatedAnnotations) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullablePaginatedAnnotations) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_paginated_reports.go b/service/bitbucket/openapi/model_paginated_reports.go
new file mode 100644
index 00000000..6712dc17
--- /dev/null
+++ b/service/bitbucket/openapi/model_paginated_reports.go
@@ -0,0 +1,300 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// PaginatedReports A paginated list of reports.
+type PaginatedReports struct {
+	// Page number of the current results. This is an optional element that is not provided in all responses.
+	Page *int32 `json:"page,omitempty"`
+	// The values of the current page.
+	Values *[]Report `json:"values,omitempty"`
+	// Total number of objects in the response. This is an optional element that is not provided in all responses, as it can be expensive to compute.
+	Size *int32 `json:"size,omitempty"`
+	// Current number of objects on the existing page. The default value is 10 with 100 being the maximum allowed value. Individual APIs may enforce different values.
+	Pagelen *int32 `json:"pagelen,omitempty"`
+	// Link to the next page if it exists. The last page of a collection does not have this value. Use this link to navigate the result set and refrain from constructing your own URLs.
+	Next *string `json:"next,omitempty"`
+	// Link to previous page if it exists. A collections first page does not have this value. This is an optional element that is not provided in all responses. Some result sets strictly support forward navigation and never provide previous links. Clients must anticipate that backwards navigation is not always available. Use this link to navigate the result set and refrain from constructing your own URLs.
+	Previous *string `json:"previous,omitempty"`
+}
+
+// NewPaginatedReports instantiates a new PaginatedReports object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewPaginatedReports() *PaginatedReports {
+	this := PaginatedReports{}
+	return &this
+}
+
+// NewPaginatedReportsWithDefaults instantiates a new PaginatedReports object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewPaginatedReportsWithDefaults() *PaginatedReports {
+	this := PaginatedReports{}
+	return &this
+}
+
+// GetPage returns the Page field value if set, zero value otherwise.
+func (o *PaginatedReports) GetPage() int32 {
+	if o == nil || o.Page == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Page
+}
+
+// GetPageOk returns a tuple with the Page field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedReports) GetPageOk() (*int32, bool) {
+	if o == nil || o.Page == nil {
+		return nil, false
+	}
+	return o.Page, true
+}
+
+// HasPage returns a boolean if a field has been set.
+func (o *PaginatedReports) HasPage() bool {
+	if o != nil && o.Page != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPage gets a reference to the given int32 and assigns it to the Page field.
+func (o *PaginatedReports) SetPage(v int32) {
+	o.Page = &v
+}
+
+// GetValues returns the Values field value if set, zero value otherwise.
+func (o *PaginatedReports) GetValues() []Report {
+	if o == nil || o.Values == nil {
+		var ret []Report
+		return ret
+	}
+	return *o.Values
+}
+
+// GetValuesOk returns a tuple with the Values field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedReports) GetValuesOk() (*[]Report, bool) {
+	if o == nil || o.Values == nil {
+		return nil, false
+	}
+	return o.Values, true
+}
+
+// HasValues returns a boolean if a field has been set.
+func (o *PaginatedReports) HasValues() bool {
+	if o != nil && o.Values != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetValues gets a reference to the given []Report and assigns it to the Values field.
+func (o *PaginatedReports) SetValues(v []Report) {
+	o.Values = &v
+}
+
+// GetSize returns the Size field value if set, zero value otherwise.
+func (o *PaginatedReports) GetSize() int32 {
+	if o == nil || o.Size == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Size
+}
+
+// GetSizeOk returns a tuple with the Size field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedReports) GetSizeOk() (*int32, bool) {
+	if o == nil || o.Size == nil {
+		return nil, false
+	}
+	return o.Size, true
+}
+
+// HasSize returns a boolean if a field has been set.
+func (o *PaginatedReports) HasSize() bool {
+	if o != nil && o.Size != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetSize gets a reference to the given int32 and assigns it to the Size field.
+func (o *PaginatedReports) SetSize(v int32) {
+	o.Size = &v
+}
+
+// GetPagelen returns the Pagelen field value if set, zero value otherwise.
+func (o *PaginatedReports) GetPagelen() int32 {
+	if o == nil || o.Pagelen == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Pagelen
+}
+
+// GetPagelenOk returns a tuple with the Pagelen field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedReports) GetPagelenOk() (*int32, bool) {
+	if o == nil || o.Pagelen == nil {
+		return nil, false
+	}
+	return o.Pagelen, true
+}
+
+// HasPagelen returns a boolean if a field has been set.
+func (o *PaginatedReports) HasPagelen() bool {
+	if o != nil && o.Pagelen != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPagelen gets a reference to the given int32 and assigns it to the Pagelen field.
+func (o *PaginatedReports) SetPagelen(v int32) {
+	o.Pagelen = &v
+}
+
+// GetNext returns the Next field value if set, zero value otherwise.
+func (o *PaginatedReports) GetNext() string {
+	if o == nil || o.Next == nil {
+		var ret string
+		return ret
+	}
+	return *o.Next
+}
+
+// GetNextOk returns a tuple with the Next field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedReports) GetNextOk() (*string, bool) {
+	if o == nil || o.Next == nil {
+		return nil, false
+	}
+	return o.Next, true
+}
+
+// HasNext returns a boolean if a field has been set.
+func (o *PaginatedReports) HasNext() bool {
+	if o != nil && o.Next != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetNext gets a reference to the given string and assigns it to the Next field.
+func (o *PaginatedReports) SetNext(v string) {
+	o.Next = &v
+}
+
+// GetPrevious returns the Previous field value if set, zero value otherwise.
+func (o *PaginatedReports) GetPrevious() string {
+	if o == nil || o.Previous == nil {
+		var ret string
+		return ret
+	}
+	return *o.Previous
+}
+
+// GetPreviousOk returns a tuple with the Previous field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *PaginatedReports) GetPreviousOk() (*string, bool) {
+	if o == nil || o.Previous == nil {
+		return nil, false
+	}
+	return o.Previous, true
+}
+
+// HasPrevious returns a boolean if a field has been set.
+func (o *PaginatedReports) HasPrevious() bool {
+	if o != nil && o.Previous != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPrevious gets a reference to the given string and assigns it to the Previous field.
+func (o *PaginatedReports) SetPrevious(v string) {
+	o.Previous = &v
+}
+
+func (o PaginatedReports) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.Page != nil {
+		toSerialize["page"] = o.Page
+	}
+	if o.Values != nil {
+		toSerialize["values"] = o.Values
+	}
+	if o.Size != nil {
+		toSerialize["size"] = o.Size
+	}
+	if o.Pagelen != nil {
+		toSerialize["pagelen"] = o.Pagelen
+	}
+	if o.Next != nil {
+		toSerialize["next"] = o.Next
+	}
+	if o.Previous != nil {
+		toSerialize["previous"] = o.Previous
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullablePaginatedReports struct {
+	value *PaginatedReports
+	isSet bool
+}
+
+func (v NullablePaginatedReports) Get() *PaginatedReports {
+	return v.value
+}
+
+func (v *NullablePaginatedReports) Set(val *PaginatedReports) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullablePaginatedReports) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullablePaginatedReports) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullablePaginatedReports(val *PaginatedReports) *NullablePaginatedReports {
+	return &NullablePaginatedReports{value: val, isSet: true}
+}
+
+func (v NullablePaginatedReports) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullablePaginatedReports) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_report.go b/service/bitbucket/openapi/model_report.go
new file mode 100644
index 00000000..dc653562
--- /dev/null
+++ b/service/bitbucket/openapi/model_report.go
@@ -0,0 +1,569 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+	"time"
+)
+
+// Report struct for Report
+type Report struct {
+	Object
+	// The UUID that can be used to identify the report.
+	Uuid *string `json:"uuid,omitempty"`
+	// The title of the report.
+	Title *string `json:"title,omitempty"`
+	// A string to describe the purpose of the report.
+	Details *string `json:"details,omitempty"`
+	// ID of the report provided by the report creator. It can be used to identify the report as an alternative to it's generated uuid. It is not used by Bitbucket, but only by the report creator for updating or deleting this specific report. Needs to be unique.
+	ExternalId *string `json:"external_id,omitempty"`
+	// A string to describe the tool or company who created the report.
+	Reporter *string `json:"reporter,omitempty"`
+	// A URL linking to the results of the report in an external tool.
+	Link *string `json:"link,omitempty"`
+	// If enabled, a remote link is created in Jira for the issue associated with the commit the report belongs to.
+	RemoteLinkEnabled *bool `json:"remote_link_enabled,omitempty"`
+	// A URL to the report logo. If none is provided, the default insights logo will be used.
+	LogoUrl *string `json:"logo_url,omitempty"`
+	// The type of the report.
+	ReportType *string `json:"report_type,omitempty"`
+	// The state of the report. May be set to PENDING and later updated.
+	Result *string `json:"result,omitempty"`
+	// An array of data fields to display information on the report. Maximum 10.
+	Data *[]ReportData `json:"data,omitempty"`
+	// The timestamp when the report was created.
+	CreatedOn *time.Time `json:"created_on,omitempty"`
+	// The timestamp when the report was updated.
+	UpdatedOn *time.Time `json:"updated_on,omitempty"`
+}
+
+// NewReport instantiates a new Report object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewReport() *Report {
+	this := Report{}
+	return &this
+}
+
+// NewReportWithDefaults instantiates a new Report object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewReportWithDefaults() *Report {
+	this := Report{}
+	return &this
+}
+
+// GetUuid returns the Uuid field value if set, zero value otherwise.
+func (o *Report) GetUuid() string {
+	if o == nil || o.Uuid == nil {
+		var ret string
+		return ret
+	}
+	return *o.Uuid
+}
+
+// GetUuidOk returns a tuple with the Uuid field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetUuidOk() (*string, bool) {
+	if o == nil || o.Uuid == nil {
+		return nil, false
+	}
+	return o.Uuid, true
+}
+
+// HasUuid returns a boolean if a field has been set.
+func (o *Report) HasUuid() bool {
+	if o != nil && o.Uuid != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUuid gets a reference to the given string and assigns it to the Uuid field.
+func (o *Report) SetUuid(v string) {
+	o.Uuid = &v
+}
+
+// GetTitle returns the Title field value if set, zero value otherwise.
+func (o *Report) GetTitle() string {
+	if o == nil || o.Title == nil {
+		var ret string
+		return ret
+	}
+	return *o.Title
+}
+
+// GetTitleOk returns a tuple with the Title field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetTitleOk() (*string, bool) {
+	if o == nil || o.Title == nil {
+		return nil, false
+	}
+	return o.Title, true
+}
+
+// HasTitle returns a boolean if a field has been set.
+func (o *Report) HasTitle() bool {
+	if o != nil && o.Title != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetTitle gets a reference to the given string and assigns it to the Title field.
+func (o *Report) SetTitle(v string) {
+	o.Title = &v
+}
+
+// GetDetails returns the Details field value if set, zero value otherwise.
+func (o *Report) GetDetails() string {
+	if o == nil || o.Details == nil {
+		var ret string
+		return ret
+	}
+	return *o.Details
+}
+
+// GetDetailsOk returns a tuple with the Details field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetDetailsOk() (*string, bool) {
+	if o == nil || o.Details == nil {
+		return nil, false
+	}
+	return o.Details, true
+}
+
+// HasDetails returns a boolean if a field has been set.
+func (o *Report) HasDetails() bool {
+	if o != nil && o.Details != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetDetails gets a reference to the given string and assigns it to the Details field.
+func (o *Report) SetDetails(v string) {
+	o.Details = &v
+}
+
+// GetExternalId returns the ExternalId field value if set, zero value otherwise.
+func (o *Report) GetExternalId() string {
+	if o == nil || o.ExternalId == nil {
+		var ret string
+		return ret
+	}
+	return *o.ExternalId
+}
+
+// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetExternalIdOk() (*string, bool) {
+	if o == nil || o.ExternalId == nil {
+		return nil, false
+	}
+	return o.ExternalId, true
+}
+
+// HasExternalId returns a boolean if a field has been set.
+func (o *Report) HasExternalId() bool {
+	if o != nil && o.ExternalId != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetExternalId gets a reference to the given string and assigns it to the ExternalId field.
+func (o *Report) SetExternalId(v string) {
+	o.ExternalId = &v
+}
+
+// GetReporter returns the Reporter field value if set, zero value otherwise.
+func (o *Report) GetReporter() string {
+	if o == nil || o.Reporter == nil {
+		var ret string
+		return ret
+	}
+	return *o.Reporter
+}
+
+// GetReporterOk returns a tuple with the Reporter field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetReporterOk() (*string, bool) {
+	if o == nil || o.Reporter == nil {
+		return nil, false
+	}
+	return o.Reporter, true
+}
+
+// HasReporter returns a boolean if a field has been set.
+func (o *Report) HasReporter() bool {
+	if o != nil && o.Reporter != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetReporter gets a reference to the given string and assigns it to the Reporter field.
+func (o *Report) SetReporter(v string) {
+	o.Reporter = &v
+}
+
+// GetLink returns the Link field value if set, zero value otherwise.
+func (o *Report) GetLink() string {
+	if o == nil || o.Link == nil {
+		var ret string
+		return ret
+	}
+	return *o.Link
+}
+
+// GetLinkOk returns a tuple with the Link field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetLinkOk() (*string, bool) {
+	if o == nil || o.Link == nil {
+		return nil, false
+	}
+	return o.Link, true
+}
+
+// HasLink returns a boolean if a field has been set.
+func (o *Report) HasLink() bool {
+	if o != nil && o.Link != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetLink gets a reference to the given string and assigns it to the Link field.
+func (o *Report) SetLink(v string) {
+	o.Link = &v
+}
+
+// GetRemoteLinkEnabled returns the RemoteLinkEnabled field value if set, zero value otherwise.
+func (o *Report) GetRemoteLinkEnabled() bool {
+	if o == nil || o.RemoteLinkEnabled == nil {
+		var ret bool
+		return ret
+	}
+	return *o.RemoteLinkEnabled
+}
+
+// GetRemoteLinkEnabledOk returns a tuple with the RemoteLinkEnabled field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetRemoteLinkEnabledOk() (*bool, bool) {
+	if o == nil || o.RemoteLinkEnabled == nil {
+		return nil, false
+	}
+	return o.RemoteLinkEnabled, true
+}
+
+// HasRemoteLinkEnabled returns a boolean if a field has been set.
+func (o *Report) HasRemoteLinkEnabled() bool {
+	if o != nil && o.RemoteLinkEnabled != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetRemoteLinkEnabled gets a reference to the given bool and assigns it to the RemoteLinkEnabled field.
+func (o *Report) SetRemoteLinkEnabled(v bool) {
+	o.RemoteLinkEnabled = &v
+}
+
+// GetLogoUrl returns the LogoUrl field value if set, zero value otherwise.
+func (o *Report) GetLogoUrl() string {
+	if o == nil || o.LogoUrl == nil {
+		var ret string
+		return ret
+	}
+	return *o.LogoUrl
+}
+
+// GetLogoUrlOk returns a tuple with the LogoUrl field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetLogoUrlOk() (*string, bool) {
+	if o == nil || o.LogoUrl == nil {
+		return nil, false
+	}
+	return o.LogoUrl, true
+}
+
+// HasLogoUrl returns a boolean if a field has been set.
+func (o *Report) HasLogoUrl() bool {
+	if o != nil && o.LogoUrl != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetLogoUrl gets a reference to the given string and assigns it to the LogoUrl field.
+func (o *Report) SetLogoUrl(v string) {
+	o.LogoUrl = &v
+}
+
+// GetReportType returns the ReportType field value if set, zero value otherwise.
+func (o *Report) GetReportType() string {
+	if o == nil || o.ReportType == nil {
+		var ret string
+		return ret
+	}
+	return *o.ReportType
+}
+
+// GetReportTypeOk returns a tuple with the ReportType field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetReportTypeOk() (*string, bool) {
+	if o == nil || o.ReportType == nil {
+		return nil, false
+	}
+	return o.ReportType, true
+}
+
+// HasReportType returns a boolean if a field has been set.
+func (o *Report) HasReportType() bool {
+	if o != nil && o.ReportType != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetReportType gets a reference to the given string and assigns it to the ReportType field.
+func (o *Report) SetReportType(v string) {
+	o.ReportType = &v
+}
+
+// GetResult returns the Result field value if set, zero value otherwise.
+func (o *Report) GetResult() string {
+	if o == nil || o.Result == nil {
+		var ret string
+		return ret
+	}
+	return *o.Result
+}
+
+// GetResultOk returns a tuple with the Result field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetResultOk() (*string, bool) {
+	if o == nil || o.Result == nil {
+		return nil, false
+	}
+	return o.Result, true
+}
+
+// HasResult returns a boolean if a field has been set.
+func (o *Report) HasResult() bool {
+	if o != nil && o.Result != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetResult gets a reference to the given string and assigns it to the Result field.
+func (o *Report) SetResult(v string) {
+	o.Result = &v
+}
+
+// GetData returns the Data field value if set, zero value otherwise.
+func (o *Report) GetData() []ReportData {
+	if o == nil || o.Data == nil {
+		var ret []ReportData
+		return ret
+	}
+	return *o.Data
+}
+
+// GetDataOk returns a tuple with the Data field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetDataOk() (*[]ReportData, bool) {
+	if o == nil || o.Data == nil {
+		return nil, false
+	}
+	return o.Data, true
+}
+
+// HasData returns a boolean if a field has been set.
+func (o *Report) HasData() bool {
+	if o != nil && o.Data != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetData gets a reference to the given []ReportData and assigns it to the Data field.
+func (o *Report) SetData(v []ReportData) {
+	o.Data = &v
+}
+
+// GetCreatedOn returns the CreatedOn field value if set, zero value otherwise.
+func (o *Report) GetCreatedOn() time.Time {
+	if o == nil || o.CreatedOn == nil {
+		var ret time.Time
+		return ret
+	}
+	return *o.CreatedOn
+}
+
+// GetCreatedOnOk returns a tuple with the CreatedOn field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetCreatedOnOk() (*time.Time, bool) {
+	if o == nil || o.CreatedOn == nil {
+		return nil, false
+	}
+	return o.CreatedOn, true
+}
+
+// HasCreatedOn returns a boolean if a field has been set.
+func (o *Report) HasCreatedOn() bool {
+	if o != nil && o.CreatedOn != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetCreatedOn gets a reference to the given time.Time and assigns it to the CreatedOn field.
+func (o *Report) SetCreatedOn(v time.Time) {
+	o.CreatedOn = &v
+}
+
+// GetUpdatedOn returns the UpdatedOn field value if set, zero value otherwise.
+func (o *Report) GetUpdatedOn() time.Time {
+	if o == nil || o.UpdatedOn == nil {
+		var ret time.Time
+		return ret
+	}
+	return *o.UpdatedOn
+}
+
+// GetUpdatedOnOk returns a tuple with the UpdatedOn field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *Report) GetUpdatedOnOk() (*time.Time, bool) {
+	if o == nil || o.UpdatedOn == nil {
+		return nil, false
+	}
+	return o.UpdatedOn, true
+}
+
+// HasUpdatedOn returns a boolean if a field has been set.
+func (o *Report) HasUpdatedOn() bool {
+	if o != nil && o.UpdatedOn != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUpdatedOn gets a reference to the given time.Time and assigns it to the UpdatedOn field.
+func (o *Report) SetUpdatedOn(v time.Time) {
+	o.UpdatedOn = &v
+}
+
+func (o Report) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	serializedObject, errObject := json.Marshal(o.Object)
+	if errObject != nil {
+		return []byte{}, errObject
+	}
+	errObject = json.Unmarshal([]byte(serializedObject), &toSerialize)
+	if errObject != nil {
+		return []byte{}, errObject
+	}
+	if o.Uuid != nil {
+		toSerialize["uuid"] = o.Uuid
+	}
+	if o.Title != nil {
+		toSerialize["title"] = o.Title
+	}
+	if o.Details != nil {
+		toSerialize["details"] = o.Details
+	}
+	if o.ExternalId != nil {
+		toSerialize["external_id"] = o.ExternalId
+	}
+	if o.Reporter != nil {
+		toSerialize["reporter"] = o.Reporter
+	}
+	if o.Link != nil {
+		toSerialize["link"] = o.Link
+	}
+	if o.RemoteLinkEnabled != nil {
+		toSerialize["remote_link_enabled"] = o.RemoteLinkEnabled
+	}
+	if o.LogoUrl != nil {
+		toSerialize["logo_url"] = o.LogoUrl
+	}
+	if o.ReportType != nil {
+		toSerialize["report_type"] = o.ReportType
+	}
+	if o.Result != nil {
+		toSerialize["result"] = o.Result
+	}
+	if o.Data != nil {
+		toSerialize["data"] = o.Data
+	}
+	if o.CreatedOn != nil {
+		toSerialize["created_on"] = o.CreatedOn
+	}
+	if o.UpdatedOn != nil {
+		toSerialize["updated_on"] = o.UpdatedOn
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableReport struct {
+	value *Report
+	isSet bool
+}
+
+func (v NullableReport) Get() *Report {
+	return v.value
+}
+
+func (v *NullableReport) Set(val *Report) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableReport) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableReport) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableReport(val *Report) *NullableReport {
+	return &NullableReport{value: val, isSet: true}
+}
+
+func (v NullableReport) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableReport) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_report_all_of.go b/service/bitbucket/openapi/model_report_all_of.go
new file mode 100644
index 00000000..69b1c49f
--- /dev/null
+++ b/service/bitbucket/openapi/model_report_all_of.go
@@ -0,0 +1,560 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+	"time"
+)
+
+// ReportAllOf A report for a commit.
+type ReportAllOf struct {
+	// The UUID that can be used to identify the report.
+	Uuid *string `json:"uuid,omitempty"`
+	// The title of the report.
+	Title *string `json:"title,omitempty"`
+	// A string to describe the purpose of the report.
+	Details *string `json:"details,omitempty"`
+	// ID of the report provided by the report creator. It can be used to identify the report as an alternative to it's generated uuid. It is not used by Bitbucket, but only by the report creator for updating or deleting this specific report. Needs to be unique.
+	ExternalId *string `json:"external_id,omitempty"`
+	// A string to describe the tool or company who created the report.
+	Reporter *string `json:"reporter,omitempty"`
+	// A URL linking to the results of the report in an external tool.
+	Link *string `json:"link,omitempty"`
+	// If enabled, a remote link is created in Jira for the issue associated with the commit the report belongs to.
+	RemoteLinkEnabled *bool `json:"remote_link_enabled,omitempty"`
+	// A URL to the report logo. If none is provided, the default insights logo will be used.
+	LogoUrl *string `json:"logo_url,omitempty"`
+	// The type of the report.
+	ReportType *string `json:"report_type,omitempty"`
+	// The state of the report. May be set to PENDING and later updated.
+	Result *string `json:"result,omitempty"`
+	// An array of data fields to display information on the report. Maximum 10.
+	Data *[]ReportData `json:"data,omitempty"`
+	// The timestamp when the report was created.
+	CreatedOn *time.Time `json:"created_on,omitempty"`
+	// The timestamp when the report was updated.
+	UpdatedOn *time.Time `json:"updated_on,omitempty"`
+}
+
+// NewReportAllOf instantiates a new ReportAllOf object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewReportAllOf() *ReportAllOf {
+	this := ReportAllOf{}
+	return &this
+}
+
+// NewReportAllOfWithDefaults instantiates a new ReportAllOf object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewReportAllOfWithDefaults() *ReportAllOf {
+	this := ReportAllOf{}
+	return &this
+}
+
+// GetUuid returns the Uuid field value if set, zero value otherwise.
+func (o *ReportAllOf) GetUuid() string {
+	if o == nil || o.Uuid == nil {
+		var ret string
+		return ret
+	}
+	return *o.Uuid
+}
+
+// GetUuidOk returns a tuple with the Uuid field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetUuidOk() (*string, bool) {
+	if o == nil || o.Uuid == nil {
+		return nil, false
+	}
+	return o.Uuid, true
+}
+
+// HasUuid returns a boolean if a field has been set.
+func (o *ReportAllOf) HasUuid() bool {
+	if o != nil && o.Uuid != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUuid gets a reference to the given string and assigns it to the Uuid field.
+func (o *ReportAllOf) SetUuid(v string) {
+	o.Uuid = &v
+}
+
+// GetTitle returns the Title field value if set, zero value otherwise.
+func (o *ReportAllOf) GetTitle() string {
+	if o == nil || o.Title == nil {
+		var ret string
+		return ret
+	}
+	return *o.Title
+}
+
+// GetTitleOk returns a tuple with the Title field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetTitleOk() (*string, bool) {
+	if o == nil || o.Title == nil {
+		return nil, false
+	}
+	return o.Title, true
+}
+
+// HasTitle returns a boolean if a field has been set.
+func (o *ReportAllOf) HasTitle() bool {
+	if o != nil && o.Title != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetTitle gets a reference to the given string and assigns it to the Title field.
+func (o *ReportAllOf) SetTitle(v string) {
+	o.Title = &v
+}
+
+// GetDetails returns the Details field value if set, zero value otherwise.
+func (o *ReportAllOf) GetDetails() string {
+	if o == nil || o.Details == nil {
+		var ret string
+		return ret
+	}
+	return *o.Details
+}
+
+// GetDetailsOk returns a tuple with the Details field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetDetailsOk() (*string, bool) {
+	if o == nil || o.Details == nil {
+		return nil, false
+	}
+	return o.Details, true
+}
+
+// HasDetails returns a boolean if a field has been set.
+func (o *ReportAllOf) HasDetails() bool {
+	if o != nil && o.Details != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetDetails gets a reference to the given string and assigns it to the Details field.
+func (o *ReportAllOf) SetDetails(v string) {
+	o.Details = &v
+}
+
+// GetExternalId returns the ExternalId field value if set, zero value otherwise.
+func (o *ReportAllOf) GetExternalId() string {
+	if o == nil || o.ExternalId == nil {
+		var ret string
+		return ret
+	}
+	return *o.ExternalId
+}
+
+// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetExternalIdOk() (*string, bool) {
+	if o == nil || o.ExternalId == nil {
+		return nil, false
+	}
+	return o.ExternalId, true
+}
+
+// HasExternalId returns a boolean if a field has been set.
+func (o *ReportAllOf) HasExternalId() bool {
+	if o != nil && o.ExternalId != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetExternalId gets a reference to the given string and assigns it to the ExternalId field.
+func (o *ReportAllOf) SetExternalId(v string) {
+	o.ExternalId = &v
+}
+
+// GetReporter returns the Reporter field value if set, zero value otherwise.
+func (o *ReportAllOf) GetReporter() string {
+	if o == nil || o.Reporter == nil {
+		var ret string
+		return ret
+	}
+	return *o.Reporter
+}
+
+// GetReporterOk returns a tuple with the Reporter field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetReporterOk() (*string, bool) {
+	if o == nil || o.Reporter == nil {
+		return nil, false
+	}
+	return o.Reporter, true
+}
+
+// HasReporter returns a boolean if a field has been set.
+func (o *ReportAllOf) HasReporter() bool {
+	if o != nil && o.Reporter != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetReporter gets a reference to the given string and assigns it to the Reporter field.
+func (o *ReportAllOf) SetReporter(v string) {
+	o.Reporter = &v
+}
+
+// GetLink returns the Link field value if set, zero value otherwise.
+func (o *ReportAllOf) GetLink() string {
+	if o == nil || o.Link == nil {
+		var ret string
+		return ret
+	}
+	return *o.Link
+}
+
+// GetLinkOk returns a tuple with the Link field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetLinkOk() (*string, bool) {
+	if o == nil || o.Link == nil {
+		return nil, false
+	}
+	return o.Link, true
+}
+
+// HasLink returns a boolean if a field has been set.
+func (o *ReportAllOf) HasLink() bool {
+	if o != nil && o.Link != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetLink gets a reference to the given string and assigns it to the Link field.
+func (o *ReportAllOf) SetLink(v string) {
+	o.Link = &v
+}
+
+// GetRemoteLinkEnabled returns the RemoteLinkEnabled field value if set, zero value otherwise.
+func (o *ReportAllOf) GetRemoteLinkEnabled() bool {
+	if o == nil || o.RemoteLinkEnabled == nil {
+		var ret bool
+		return ret
+	}
+	return *o.RemoteLinkEnabled
+}
+
+// GetRemoteLinkEnabledOk returns a tuple with the RemoteLinkEnabled field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetRemoteLinkEnabledOk() (*bool, bool) {
+	if o == nil || o.RemoteLinkEnabled == nil {
+		return nil, false
+	}
+	return o.RemoteLinkEnabled, true
+}
+
+// HasRemoteLinkEnabled returns a boolean if a field has been set.
+func (o *ReportAllOf) HasRemoteLinkEnabled() bool {
+	if o != nil && o.RemoteLinkEnabled != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetRemoteLinkEnabled gets a reference to the given bool and assigns it to the RemoteLinkEnabled field.
+func (o *ReportAllOf) SetRemoteLinkEnabled(v bool) {
+	o.RemoteLinkEnabled = &v
+}
+
+// GetLogoUrl returns the LogoUrl field value if set, zero value otherwise.
+func (o *ReportAllOf) GetLogoUrl() string {
+	if o == nil || o.LogoUrl == nil {
+		var ret string
+		return ret
+	}
+	return *o.LogoUrl
+}
+
+// GetLogoUrlOk returns a tuple with the LogoUrl field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetLogoUrlOk() (*string, bool) {
+	if o == nil || o.LogoUrl == nil {
+		return nil, false
+	}
+	return o.LogoUrl, true
+}
+
+// HasLogoUrl returns a boolean if a field has been set.
+func (o *ReportAllOf) HasLogoUrl() bool {
+	if o != nil && o.LogoUrl != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetLogoUrl gets a reference to the given string and assigns it to the LogoUrl field.
+func (o *ReportAllOf) SetLogoUrl(v string) {
+	o.LogoUrl = &v
+}
+
+// GetReportType returns the ReportType field value if set, zero value otherwise.
+func (o *ReportAllOf) GetReportType() string {
+	if o == nil || o.ReportType == nil {
+		var ret string
+		return ret
+	}
+	return *o.ReportType
+}
+
+// GetReportTypeOk returns a tuple with the ReportType field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetReportTypeOk() (*string, bool) {
+	if o == nil || o.ReportType == nil {
+		return nil, false
+	}
+	return o.ReportType, true
+}
+
+// HasReportType returns a boolean if a field has been set.
+func (o *ReportAllOf) HasReportType() bool {
+	if o != nil && o.ReportType != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetReportType gets a reference to the given string and assigns it to the ReportType field.
+func (o *ReportAllOf) SetReportType(v string) {
+	o.ReportType = &v
+}
+
+// GetResult returns the Result field value if set, zero value otherwise.
+func (o *ReportAllOf) GetResult() string {
+	if o == nil || o.Result == nil {
+		var ret string
+		return ret
+	}
+	return *o.Result
+}
+
+// GetResultOk returns a tuple with the Result field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetResultOk() (*string, bool) {
+	if o == nil || o.Result == nil {
+		return nil, false
+	}
+	return o.Result, true
+}
+
+// HasResult returns a boolean if a field has been set.
+func (o *ReportAllOf) HasResult() bool {
+	if o != nil && o.Result != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetResult gets a reference to the given string and assigns it to the Result field.
+func (o *ReportAllOf) SetResult(v string) {
+	o.Result = &v
+}
+
+// GetData returns the Data field value if set, zero value otherwise.
+func (o *ReportAllOf) GetData() []ReportData {
+	if o == nil || o.Data == nil {
+		var ret []ReportData
+		return ret
+	}
+	return *o.Data
+}
+
+// GetDataOk returns a tuple with the Data field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetDataOk() (*[]ReportData, bool) {
+	if o == nil || o.Data == nil {
+		return nil, false
+	}
+	return o.Data, true
+}
+
+// HasData returns a boolean if a field has been set.
+func (o *ReportAllOf) HasData() bool {
+	if o != nil && o.Data != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetData gets a reference to the given []ReportData and assigns it to the Data field.
+func (o *ReportAllOf) SetData(v []ReportData) {
+	o.Data = &v
+}
+
+// GetCreatedOn returns the CreatedOn field value if set, zero value otherwise.
+func (o *ReportAllOf) GetCreatedOn() time.Time {
+	if o == nil || o.CreatedOn == nil {
+		var ret time.Time
+		return ret
+	}
+	return *o.CreatedOn
+}
+
+// GetCreatedOnOk returns a tuple with the CreatedOn field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetCreatedOnOk() (*time.Time, bool) {
+	if o == nil || o.CreatedOn == nil {
+		return nil, false
+	}
+	return o.CreatedOn, true
+}
+
+// HasCreatedOn returns a boolean if a field has been set.
+func (o *ReportAllOf) HasCreatedOn() bool {
+	if o != nil && o.CreatedOn != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetCreatedOn gets a reference to the given time.Time and assigns it to the CreatedOn field.
+func (o *ReportAllOf) SetCreatedOn(v time.Time) {
+	o.CreatedOn = &v
+}
+
+// GetUpdatedOn returns the UpdatedOn field value if set, zero value otherwise.
+func (o *ReportAllOf) GetUpdatedOn() time.Time {
+	if o == nil || o.UpdatedOn == nil {
+		var ret time.Time
+		return ret
+	}
+	return *o.UpdatedOn
+}
+
+// GetUpdatedOnOk returns a tuple with the UpdatedOn field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAllOf) GetUpdatedOnOk() (*time.Time, bool) {
+	if o == nil || o.UpdatedOn == nil {
+		return nil, false
+	}
+	return o.UpdatedOn, true
+}
+
+// HasUpdatedOn returns a boolean if a field has been set.
+func (o *ReportAllOf) HasUpdatedOn() bool {
+	if o != nil && o.UpdatedOn != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUpdatedOn gets a reference to the given time.Time and assigns it to the UpdatedOn field.
+func (o *ReportAllOf) SetUpdatedOn(v time.Time) {
+	o.UpdatedOn = &v
+}
+
+func (o ReportAllOf) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.Uuid != nil {
+		toSerialize["uuid"] = o.Uuid
+	}
+	if o.Title != nil {
+		toSerialize["title"] = o.Title
+	}
+	if o.Details != nil {
+		toSerialize["details"] = o.Details
+	}
+	if o.ExternalId != nil {
+		toSerialize["external_id"] = o.ExternalId
+	}
+	if o.Reporter != nil {
+		toSerialize["reporter"] = o.Reporter
+	}
+	if o.Link != nil {
+		toSerialize["link"] = o.Link
+	}
+	if o.RemoteLinkEnabled != nil {
+		toSerialize["remote_link_enabled"] = o.RemoteLinkEnabled
+	}
+	if o.LogoUrl != nil {
+		toSerialize["logo_url"] = o.LogoUrl
+	}
+	if o.ReportType != nil {
+		toSerialize["report_type"] = o.ReportType
+	}
+	if o.Result != nil {
+		toSerialize["result"] = o.Result
+	}
+	if o.Data != nil {
+		toSerialize["data"] = o.Data
+	}
+	if o.CreatedOn != nil {
+		toSerialize["created_on"] = o.CreatedOn
+	}
+	if o.UpdatedOn != nil {
+		toSerialize["updated_on"] = o.UpdatedOn
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableReportAllOf struct {
+	value *ReportAllOf
+	isSet bool
+}
+
+func (v NullableReportAllOf) Get() *ReportAllOf {
+	return v.value
+}
+
+func (v *NullableReportAllOf) Set(val *ReportAllOf) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableReportAllOf) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableReportAllOf) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableReportAllOf(val *ReportAllOf) *NullableReportAllOf {
+	return &NullableReportAllOf{value: val, isSet: true}
+}
+
+func (v NullableReportAllOf) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableReportAllOf) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_report_annotation.go b/service/bitbucket/openapi/model_report_annotation.go
new file mode 100644
index 00000000..cfa74600
--- /dev/null
+++ b/service/bitbucket/openapi/model_report_annotation.go
@@ -0,0 +1,532 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+	"time"
+)
+
+// ReportAnnotation struct for ReportAnnotation
+type ReportAnnotation struct {
+	Object
+	// ID of the annotation provided by the annotation creator. It can be used to identify the annotation as an alternative to it's generated uuid. It is not used by Bitbucket, but only by the annotation creator for updating or deleting this specific annotation. Needs to be unique.
+	ExternalId *string `json:"external_id,omitempty"`
+	// The UUID that can be used to identify the annotation.
+	Uuid *string `json:"uuid,omitempty"`
+	// The type of the report.
+	AnnotationType *string `json:"annotation_type,omitempty"`
+	// The path of the file on which this annotation should be placed. This is the path of the file relative to the git repository. If no path is provided, then it will appear in the overview modal on all pull requests where the tip of the branch is the given commit, regardless of which files were modified.
+	Path *string `json:"path,omitempty"`
+	// The line number that the annotation should belong to. If no line number is provided, then it will default to 0 and in a pull request it will appear at the top of the file specified by the path field.
+	Line *int32 `json:"line,omitempty"`
+	// The message to display to users.
+	Summary *string `json:"summary,omitempty"`
+	// The details to show to users when clicking on the annotation.
+	Details *string `json:"details,omitempty"`
+	// The state of the report. May be set to PENDING and later updated.
+	Result *string `json:"result,omitempty"`
+	// The severity of the annotation.
+	Severity *string `json:"severity,omitempty"`
+	// A URL linking to the annotation in an external tool.
+	Link *string `json:"link,omitempty"`
+	// The timestamp when the report was created.
+	CreatedOn *time.Time `json:"created_on,omitempty"`
+	// The timestamp when the report was updated.
+	UpdatedOn *time.Time `json:"updated_on,omitempty"`
+}
+
+// NewReportAnnotation instantiates a new ReportAnnotation object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewReportAnnotation() *ReportAnnotation {
+	this := ReportAnnotation{}
+	return &this
+}
+
+// NewReportAnnotationWithDefaults instantiates a new ReportAnnotation object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewReportAnnotationWithDefaults() *ReportAnnotation {
+	this := ReportAnnotation{}
+	return &this
+}
+
+// GetExternalId returns the ExternalId field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetExternalId() string {
+	if o == nil || o.ExternalId == nil {
+		var ret string
+		return ret
+	}
+	return *o.ExternalId
+}
+
+// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetExternalIdOk() (*string, bool) {
+	if o == nil || o.ExternalId == nil {
+		return nil, false
+	}
+	return o.ExternalId, true
+}
+
+// HasExternalId returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasExternalId() bool {
+	if o != nil && o.ExternalId != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetExternalId gets a reference to the given string and assigns it to the ExternalId field.
+func (o *ReportAnnotation) SetExternalId(v string) {
+	o.ExternalId = &v
+}
+
+// GetUuid returns the Uuid field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetUuid() string {
+	if o == nil || o.Uuid == nil {
+		var ret string
+		return ret
+	}
+	return *o.Uuid
+}
+
+// GetUuidOk returns a tuple with the Uuid field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetUuidOk() (*string, bool) {
+	if o == nil || o.Uuid == nil {
+		return nil, false
+	}
+	return o.Uuid, true
+}
+
+// HasUuid returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasUuid() bool {
+	if o != nil && o.Uuid != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUuid gets a reference to the given string and assigns it to the Uuid field.
+func (o *ReportAnnotation) SetUuid(v string) {
+	o.Uuid = &v
+}
+
+// GetAnnotationType returns the AnnotationType field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetAnnotationType() string {
+	if o == nil || o.AnnotationType == nil {
+		var ret string
+		return ret
+	}
+	return *o.AnnotationType
+}
+
+// GetAnnotationTypeOk returns a tuple with the AnnotationType field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetAnnotationTypeOk() (*string, bool) {
+	if o == nil || o.AnnotationType == nil {
+		return nil, false
+	}
+	return o.AnnotationType, true
+}
+
+// HasAnnotationType returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasAnnotationType() bool {
+	if o != nil && o.AnnotationType != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetAnnotationType gets a reference to the given string and assigns it to the AnnotationType field.
+func (o *ReportAnnotation) SetAnnotationType(v string) {
+	o.AnnotationType = &v
+}
+
+// GetPath returns the Path field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetPath() string {
+	if o == nil || o.Path == nil {
+		var ret string
+		return ret
+	}
+	return *o.Path
+}
+
+// GetPathOk returns a tuple with the Path field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetPathOk() (*string, bool) {
+	if o == nil || o.Path == nil {
+		return nil, false
+	}
+	return o.Path, true
+}
+
+// HasPath returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasPath() bool {
+	if o != nil && o.Path != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPath gets a reference to the given string and assigns it to the Path field.
+func (o *ReportAnnotation) SetPath(v string) {
+	o.Path = &v
+}
+
+// GetLine returns the Line field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetLine() int32 {
+	if o == nil || o.Line == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Line
+}
+
+// GetLineOk returns a tuple with the Line field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetLineOk() (*int32, bool) {
+	if o == nil || o.Line == nil {
+		return nil, false
+	}
+	return o.Line, true
+}
+
+// HasLine returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasLine() bool {
+	if o != nil && o.Line != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetLine gets a reference to the given int32 and assigns it to the Line field.
+func (o *ReportAnnotation) SetLine(v int32) {
+	o.Line = &v
+}
+
+// GetSummary returns the Summary field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetSummary() string {
+	if o == nil || o.Summary == nil {
+		var ret string
+		return ret
+	}
+	return *o.Summary
+}
+
+// GetSummaryOk returns a tuple with the Summary field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetSummaryOk() (*string, bool) {
+	if o == nil || o.Summary == nil {
+		return nil, false
+	}
+	return o.Summary, true
+}
+
+// HasSummary returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasSummary() bool {
+	if o != nil && o.Summary != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetSummary gets a reference to the given string and assigns it to the Summary field.
+func (o *ReportAnnotation) SetSummary(v string) {
+	o.Summary = &v
+}
+
+// GetDetails returns the Details field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetDetails() string {
+	if o == nil || o.Details == nil {
+		var ret string
+		return ret
+	}
+	return *o.Details
+}
+
+// GetDetailsOk returns a tuple with the Details field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetDetailsOk() (*string, bool) {
+	if o == nil || o.Details == nil {
+		return nil, false
+	}
+	return o.Details, true
+}
+
+// HasDetails returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasDetails() bool {
+	if o != nil && o.Details != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetDetails gets a reference to the given string and assigns it to the Details field.
+func (o *ReportAnnotation) SetDetails(v string) {
+	o.Details = &v
+}
+
+// GetResult returns the Result field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetResult() string {
+	if o == nil || o.Result == nil {
+		var ret string
+		return ret
+	}
+	return *o.Result
+}
+
+// GetResultOk returns a tuple with the Result field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetResultOk() (*string, bool) {
+	if o == nil || o.Result == nil {
+		return nil, false
+	}
+	return o.Result, true
+}
+
+// HasResult returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasResult() bool {
+	if o != nil && o.Result != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetResult gets a reference to the given string and assigns it to the Result field.
+func (o *ReportAnnotation) SetResult(v string) {
+	o.Result = &v
+}
+
+// GetSeverity returns the Severity field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetSeverity() string {
+	if o == nil || o.Severity == nil {
+		var ret string
+		return ret
+	}
+	return *o.Severity
+}
+
+// GetSeverityOk returns a tuple with the Severity field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetSeverityOk() (*string, bool) {
+	if o == nil || o.Severity == nil {
+		return nil, false
+	}
+	return o.Severity, true
+}
+
+// HasSeverity returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasSeverity() bool {
+	if o != nil && o.Severity != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetSeverity gets a reference to the given string and assigns it to the Severity field.
+func (o *ReportAnnotation) SetSeverity(v string) {
+	o.Severity = &v
+}
+
+// GetLink returns the Link field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetLink() string {
+	if o == nil || o.Link == nil {
+		var ret string
+		return ret
+	}
+	return *o.Link
+}
+
+// GetLinkOk returns a tuple with the Link field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetLinkOk() (*string, bool) {
+	if o == nil || o.Link == nil {
+		return nil, false
+	}
+	return o.Link, true
+}
+
+// HasLink returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasLink() bool {
+	if o != nil && o.Link != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetLink gets a reference to the given string and assigns it to the Link field.
+func (o *ReportAnnotation) SetLink(v string) {
+	o.Link = &v
+}
+
+// GetCreatedOn returns the CreatedOn field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetCreatedOn() time.Time {
+	if o == nil || o.CreatedOn == nil {
+		var ret time.Time
+		return ret
+	}
+	return *o.CreatedOn
+}
+
+// GetCreatedOnOk returns a tuple with the CreatedOn field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetCreatedOnOk() (*time.Time, bool) {
+	if o == nil || o.CreatedOn == nil {
+		return nil, false
+	}
+	return o.CreatedOn, true
+}
+
+// HasCreatedOn returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasCreatedOn() bool {
+	if o != nil && o.CreatedOn != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetCreatedOn gets a reference to the given time.Time and assigns it to the CreatedOn field.
+func (o *ReportAnnotation) SetCreatedOn(v time.Time) {
+	o.CreatedOn = &v
+}
+
+// GetUpdatedOn returns the UpdatedOn field value if set, zero value otherwise.
+func (o *ReportAnnotation) GetUpdatedOn() time.Time {
+	if o == nil || o.UpdatedOn == nil {
+		var ret time.Time
+		return ret
+	}
+	return *o.UpdatedOn
+}
+
+// GetUpdatedOnOk returns a tuple with the UpdatedOn field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotation) GetUpdatedOnOk() (*time.Time, bool) {
+	if o == nil || o.UpdatedOn == nil {
+		return nil, false
+	}
+	return o.UpdatedOn, true
+}
+
+// HasUpdatedOn returns a boolean if a field has been set.
+func (o *ReportAnnotation) HasUpdatedOn() bool {
+	if o != nil && o.UpdatedOn != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUpdatedOn gets a reference to the given time.Time and assigns it to the UpdatedOn field.
+func (o *ReportAnnotation) SetUpdatedOn(v time.Time) {
+	o.UpdatedOn = &v
+}
+
+func (o ReportAnnotation) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	serializedObject, errObject := json.Marshal(o.Object)
+	if errObject != nil {
+		return []byte{}, errObject
+	}
+	errObject = json.Unmarshal([]byte(serializedObject), &toSerialize)
+	if errObject != nil {
+		return []byte{}, errObject
+	}
+	if o.ExternalId != nil {
+		toSerialize["external_id"] = o.ExternalId
+	}
+	if o.Uuid != nil {
+		toSerialize["uuid"] = o.Uuid
+	}
+	if o.AnnotationType != nil {
+		toSerialize["annotation_type"] = o.AnnotationType
+	}
+	if o.Path != nil {
+		toSerialize["path"] = o.Path
+	}
+	if o.Line != nil {
+		toSerialize["line"] = o.Line
+	}
+	if o.Summary != nil {
+		toSerialize["summary"] = o.Summary
+	}
+	if o.Details != nil {
+		toSerialize["details"] = o.Details
+	}
+	if o.Result != nil {
+		toSerialize["result"] = o.Result
+	}
+	if o.Severity != nil {
+		toSerialize["severity"] = o.Severity
+	}
+	if o.Link != nil {
+		toSerialize["link"] = o.Link
+	}
+	if o.CreatedOn != nil {
+		toSerialize["created_on"] = o.CreatedOn
+	}
+	if o.UpdatedOn != nil {
+		toSerialize["updated_on"] = o.UpdatedOn
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableReportAnnotation struct {
+	value *ReportAnnotation
+	isSet bool
+}
+
+func (v NullableReportAnnotation) Get() *ReportAnnotation {
+	return v.value
+}
+
+func (v *NullableReportAnnotation) Set(val *ReportAnnotation) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableReportAnnotation) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableReportAnnotation) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableReportAnnotation(val *ReportAnnotation) *NullableReportAnnotation {
+	return &NullableReportAnnotation{value: val, isSet: true}
+}
+
+func (v NullableReportAnnotation) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableReportAnnotation) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_report_annotation_all_of.go b/service/bitbucket/openapi/model_report_annotation_all_of.go
new file mode 100644
index 00000000..7b63dfe1
--- /dev/null
+++ b/service/bitbucket/openapi/model_report_annotation_all_of.go
@@ -0,0 +1,523 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+	"time"
+)
+
+// ReportAnnotationAllOf A report for a commit.
+type ReportAnnotationAllOf struct {
+	// ID of the annotation provided by the annotation creator. It can be used to identify the annotation as an alternative to it's generated uuid. It is not used by Bitbucket, but only by the annotation creator for updating or deleting this specific annotation. Needs to be unique.
+	ExternalId *string `json:"external_id,omitempty"`
+	// The UUID that can be used to identify the annotation.
+	Uuid *string `json:"uuid,omitempty"`
+	// The type of the report.
+	AnnotationType *string `json:"annotation_type,omitempty"`
+	// The path of the file on which this annotation should be placed. This is the path of the file relative to the git repository. If no path is provided, then it will appear in the overview modal on all pull requests where the tip of the branch is the given commit, regardless of which files were modified.
+	Path *string `json:"path,omitempty"`
+	// The line number that the annotation should belong to. If no line number is provided, then it will default to 0 and in a pull request it will appear at the top of the file specified by the path field.
+	Line *int32 `json:"line,omitempty"`
+	// The message to display to users.
+	Summary *string `json:"summary,omitempty"`
+	// The details to show to users when clicking on the annotation.
+	Details *string `json:"details,omitempty"`
+	// The state of the report. May be set to PENDING and later updated.
+	Result *string `json:"result,omitempty"`
+	// The severity of the annotation.
+	Severity *string `json:"severity,omitempty"`
+	// A URL linking to the annotation in an external tool.
+	Link *string `json:"link,omitempty"`
+	// The timestamp when the report was created.
+	CreatedOn *time.Time `json:"created_on,omitempty"`
+	// The timestamp when the report was updated.
+	UpdatedOn *time.Time `json:"updated_on,omitempty"`
+}
+
+// NewReportAnnotationAllOf instantiates a new ReportAnnotationAllOf object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewReportAnnotationAllOf() *ReportAnnotationAllOf {
+	this := ReportAnnotationAllOf{}
+	return &this
+}
+
+// NewReportAnnotationAllOfWithDefaults instantiates a new ReportAnnotationAllOf object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewReportAnnotationAllOfWithDefaults() *ReportAnnotationAllOf {
+	this := ReportAnnotationAllOf{}
+	return &this
+}
+
+// GetExternalId returns the ExternalId field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetExternalId() string {
+	if o == nil || o.ExternalId == nil {
+		var ret string
+		return ret
+	}
+	return *o.ExternalId
+}
+
+// GetExternalIdOk returns a tuple with the ExternalId field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetExternalIdOk() (*string, bool) {
+	if o == nil || o.ExternalId == nil {
+		return nil, false
+	}
+	return o.ExternalId, true
+}
+
+// HasExternalId returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasExternalId() bool {
+	if o != nil && o.ExternalId != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetExternalId gets a reference to the given string and assigns it to the ExternalId field.
+func (o *ReportAnnotationAllOf) SetExternalId(v string) {
+	o.ExternalId = &v
+}
+
+// GetUuid returns the Uuid field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetUuid() string {
+	if o == nil || o.Uuid == nil {
+		var ret string
+		return ret
+	}
+	return *o.Uuid
+}
+
+// GetUuidOk returns a tuple with the Uuid field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetUuidOk() (*string, bool) {
+	if o == nil || o.Uuid == nil {
+		return nil, false
+	}
+	return o.Uuid, true
+}
+
+// HasUuid returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasUuid() bool {
+	if o != nil && o.Uuid != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUuid gets a reference to the given string and assigns it to the Uuid field.
+func (o *ReportAnnotationAllOf) SetUuid(v string) {
+	o.Uuid = &v
+}
+
+// GetAnnotationType returns the AnnotationType field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetAnnotationType() string {
+	if o == nil || o.AnnotationType == nil {
+		var ret string
+		return ret
+	}
+	return *o.AnnotationType
+}
+
+// GetAnnotationTypeOk returns a tuple with the AnnotationType field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetAnnotationTypeOk() (*string, bool) {
+	if o == nil || o.AnnotationType == nil {
+		return nil, false
+	}
+	return o.AnnotationType, true
+}
+
+// HasAnnotationType returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasAnnotationType() bool {
+	if o != nil && o.AnnotationType != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetAnnotationType gets a reference to the given string and assigns it to the AnnotationType field.
+func (o *ReportAnnotationAllOf) SetAnnotationType(v string) {
+	o.AnnotationType = &v
+}
+
+// GetPath returns the Path field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetPath() string {
+	if o == nil || o.Path == nil {
+		var ret string
+		return ret
+	}
+	return *o.Path
+}
+
+// GetPathOk returns a tuple with the Path field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetPathOk() (*string, bool) {
+	if o == nil || o.Path == nil {
+		return nil, false
+	}
+	return o.Path, true
+}
+
+// HasPath returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasPath() bool {
+	if o != nil && o.Path != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPath gets a reference to the given string and assigns it to the Path field.
+func (o *ReportAnnotationAllOf) SetPath(v string) {
+	o.Path = &v
+}
+
+// GetLine returns the Line field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetLine() int32 {
+	if o == nil || o.Line == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Line
+}
+
+// GetLineOk returns a tuple with the Line field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetLineOk() (*int32, bool) {
+	if o == nil || o.Line == nil {
+		return nil, false
+	}
+	return o.Line, true
+}
+
+// HasLine returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasLine() bool {
+	if o != nil && o.Line != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetLine gets a reference to the given int32 and assigns it to the Line field.
+func (o *ReportAnnotationAllOf) SetLine(v int32) {
+	o.Line = &v
+}
+
+// GetSummary returns the Summary field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetSummary() string {
+	if o == nil || o.Summary == nil {
+		var ret string
+		return ret
+	}
+	return *o.Summary
+}
+
+// GetSummaryOk returns a tuple with the Summary field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetSummaryOk() (*string, bool) {
+	if o == nil || o.Summary == nil {
+		return nil, false
+	}
+	return o.Summary, true
+}
+
+// HasSummary returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasSummary() bool {
+	if o != nil && o.Summary != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetSummary gets a reference to the given string and assigns it to the Summary field.
+func (o *ReportAnnotationAllOf) SetSummary(v string) {
+	o.Summary = &v
+}
+
+// GetDetails returns the Details field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetDetails() string {
+	if o == nil || o.Details == nil {
+		var ret string
+		return ret
+	}
+	return *o.Details
+}
+
+// GetDetailsOk returns a tuple with the Details field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetDetailsOk() (*string, bool) {
+	if o == nil || o.Details == nil {
+		return nil, false
+	}
+	return o.Details, true
+}
+
+// HasDetails returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasDetails() bool {
+	if o != nil && o.Details != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetDetails gets a reference to the given string and assigns it to the Details field.
+func (o *ReportAnnotationAllOf) SetDetails(v string) {
+	o.Details = &v
+}
+
+// GetResult returns the Result field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetResult() string {
+	if o == nil || o.Result == nil {
+		var ret string
+		return ret
+	}
+	return *o.Result
+}
+
+// GetResultOk returns a tuple with the Result field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetResultOk() (*string, bool) {
+	if o == nil || o.Result == nil {
+		return nil, false
+	}
+	return o.Result, true
+}
+
+// HasResult returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasResult() bool {
+	if o != nil && o.Result != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetResult gets a reference to the given string and assigns it to the Result field.
+func (o *ReportAnnotationAllOf) SetResult(v string) {
+	o.Result = &v
+}
+
+// GetSeverity returns the Severity field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetSeverity() string {
+	if o == nil || o.Severity == nil {
+		var ret string
+		return ret
+	}
+	return *o.Severity
+}
+
+// GetSeverityOk returns a tuple with the Severity field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetSeverityOk() (*string, bool) {
+	if o == nil || o.Severity == nil {
+		return nil, false
+	}
+	return o.Severity, true
+}
+
+// HasSeverity returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasSeverity() bool {
+	if o != nil && o.Severity != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetSeverity gets a reference to the given string and assigns it to the Severity field.
+func (o *ReportAnnotationAllOf) SetSeverity(v string) {
+	o.Severity = &v
+}
+
+// GetLink returns the Link field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetLink() string {
+	if o == nil || o.Link == nil {
+		var ret string
+		return ret
+	}
+	return *o.Link
+}
+
+// GetLinkOk returns a tuple with the Link field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetLinkOk() (*string, bool) {
+	if o == nil || o.Link == nil {
+		return nil, false
+	}
+	return o.Link, true
+}
+
+// HasLink returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasLink() bool {
+	if o != nil && o.Link != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetLink gets a reference to the given string and assigns it to the Link field.
+func (o *ReportAnnotationAllOf) SetLink(v string) {
+	o.Link = &v
+}
+
+// GetCreatedOn returns the CreatedOn field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetCreatedOn() time.Time {
+	if o == nil || o.CreatedOn == nil {
+		var ret time.Time
+		return ret
+	}
+	return *o.CreatedOn
+}
+
+// GetCreatedOnOk returns a tuple with the CreatedOn field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetCreatedOnOk() (*time.Time, bool) {
+	if o == nil || o.CreatedOn == nil {
+		return nil, false
+	}
+	return o.CreatedOn, true
+}
+
+// HasCreatedOn returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasCreatedOn() bool {
+	if o != nil && o.CreatedOn != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetCreatedOn gets a reference to the given time.Time and assigns it to the CreatedOn field.
+func (o *ReportAnnotationAllOf) SetCreatedOn(v time.Time) {
+	o.CreatedOn = &v
+}
+
+// GetUpdatedOn returns the UpdatedOn field value if set, zero value otherwise.
+func (o *ReportAnnotationAllOf) GetUpdatedOn() time.Time {
+	if o == nil || o.UpdatedOn == nil {
+		var ret time.Time
+		return ret
+	}
+	return *o.UpdatedOn
+}
+
+// GetUpdatedOnOk returns a tuple with the UpdatedOn field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportAnnotationAllOf) GetUpdatedOnOk() (*time.Time, bool) {
+	if o == nil || o.UpdatedOn == nil {
+		return nil, false
+	}
+	return o.UpdatedOn, true
+}
+
+// HasUpdatedOn returns a boolean if a field has been set.
+func (o *ReportAnnotationAllOf) HasUpdatedOn() bool {
+	if o != nil && o.UpdatedOn != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUpdatedOn gets a reference to the given time.Time and assigns it to the UpdatedOn field.
+func (o *ReportAnnotationAllOf) SetUpdatedOn(v time.Time) {
+	o.UpdatedOn = &v
+}
+
+func (o ReportAnnotationAllOf) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.ExternalId != nil {
+		toSerialize["external_id"] = o.ExternalId
+	}
+	if o.Uuid != nil {
+		toSerialize["uuid"] = o.Uuid
+	}
+	if o.AnnotationType != nil {
+		toSerialize["annotation_type"] = o.AnnotationType
+	}
+	if o.Path != nil {
+		toSerialize["path"] = o.Path
+	}
+	if o.Line != nil {
+		toSerialize["line"] = o.Line
+	}
+	if o.Summary != nil {
+		toSerialize["summary"] = o.Summary
+	}
+	if o.Details != nil {
+		toSerialize["details"] = o.Details
+	}
+	if o.Result != nil {
+		toSerialize["result"] = o.Result
+	}
+	if o.Severity != nil {
+		toSerialize["severity"] = o.Severity
+	}
+	if o.Link != nil {
+		toSerialize["link"] = o.Link
+	}
+	if o.CreatedOn != nil {
+		toSerialize["created_on"] = o.CreatedOn
+	}
+	if o.UpdatedOn != nil {
+		toSerialize["updated_on"] = o.UpdatedOn
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableReportAnnotationAllOf struct {
+	value *ReportAnnotationAllOf
+	isSet bool
+}
+
+func (v NullableReportAnnotationAllOf) Get() *ReportAnnotationAllOf {
+	return v.value
+}
+
+func (v *NullableReportAnnotationAllOf) Set(val *ReportAnnotationAllOf) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableReportAnnotationAllOf) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableReportAnnotationAllOf) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableReportAnnotationAllOf(val *ReportAnnotationAllOf) *NullableReportAnnotationAllOf {
+	return &NullableReportAnnotationAllOf{value: val, isSet: true}
+}
+
+func (v NullableReportAnnotationAllOf) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableReportAnnotationAllOf) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/bitbucket/openapi/model_report_data.go b/service/bitbucket/openapi/model_report_data.go
new file mode 100644
index 00000000..b3ce4aee
--- /dev/null
+++ b/service/bitbucket/openapi/model_report_data.go
@@ -0,0 +1,189 @@
+/*
+ * Bitbucket API
+ *
+ * Code against the Bitbucket API to automate simple tasks, embed Bitbucket data into your own site, build mobile or desktop apps, or even add custom UI add-ons into Bitbucket itself using the Connect framework.
+ *
+ * API version: 2.0
+ * Contact: support@bitbucket.org
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// ReportData A key-value element that will be displayed along with the report.
+type ReportData struct {
+	// The type of data contained in the value field. If not provided, then the value will be detected as a boolean, number or string.
+	Type *string `json:"type,omitempty"`
+	// A string describing what this data field represents.
+	Title *string `json:"title,omitempty"`
+	// The value of the data element.
+	Value *map[string]interface{} `json:"value,omitempty"`
+}
+
+// NewReportData instantiates a new ReportData object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewReportData() *ReportData {
+	this := ReportData{}
+	return &this
+}
+
+// NewReportDataWithDefaults instantiates a new ReportData object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewReportDataWithDefaults() *ReportData {
+	this := ReportData{}
+	return &this
+}
+
+// GetType returns the Type field value if set, zero value otherwise.
+func (o *ReportData) GetType() string {
+	if o == nil || o.Type == nil {
+		var ret string
+		return ret
+	}
+	return *o.Type
+}
+
+// GetTypeOk returns a tuple with the Type field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportData) GetTypeOk() (*string, bool) {
+	if o == nil || o.Type == nil {
+		return nil, false
+	}
+	return o.Type, true
+}
+
+// HasType returns a boolean if a field has been set.
+func (o *ReportData) HasType() bool {
+	if o != nil && o.Type != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetType gets a reference to the given string and assigns it to the Type field.
+func (o *ReportData) SetType(v string) {
+	o.Type = &v
+}
+
+// GetTitle returns the Title field value if set, zero value otherwise.
+func (o *ReportData) GetTitle() string {
+	if o == nil || o.Title == nil {
+		var ret string
+		return ret
+	}
+	return *o.Title
+}
+
+// GetTitleOk returns a tuple with the Title field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportData) GetTitleOk() (*string, bool) {
+	if o == nil || o.Title == nil {
+		return nil, false
+	}
+	return o.Title, true
+}
+
+// HasTitle returns a boolean if a field has been set.
+func (o *ReportData) HasTitle() bool {
+	if o != nil && o.Title != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetTitle gets a reference to the given string and assigns it to the Title field.
+func (o *ReportData) SetTitle(v string) {
+	o.Title = &v
+}
+
+// GetValue returns the Value field value if set, zero value otherwise.
+func (o *ReportData) GetValue() map[string]interface{} {
+	if o == nil || o.Value == nil {
+		var ret map[string]interface{}
+		return ret
+	}
+	return *o.Value
+}
+
+// GetValueOk returns a tuple with the Value field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ReportData) GetValueOk() (*map[string]interface{}, bool) {
+	if o == nil || o.Value == nil {
+		return nil, false
+	}
+	return o.Value, true
+}
+
+// HasValue returns a boolean if a field has been set.
+func (o *ReportData) HasValue() bool {
+	if o != nil && o.Value != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetValue gets a reference to the given map[string]interface{} and assigns it to the Value field.
+func (o *ReportData) SetValue(v map[string]interface{}) {
+	o.Value = &v
+}
+
+func (o ReportData) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.Type != nil {
+		toSerialize["type"] = o.Type
+	}
+	if o.Title != nil {
+		toSerialize["title"] = o.Title
+	}
+	if o.Value != nil {
+		toSerialize["value"] = o.Value
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableReportData struct {
+	value *ReportData
+	isSet bool
+}
+
+func (v NullableReportData) Get() *ReportData {
+	return v.value
+}
+
+func (v *NullableReportData) Set(val *ReportData) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableReportData) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableReportData) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableReportData(val *ReportData) *NullableReportData {
+	return &NullableReportData{value: val, isSet: true}
+}
+
+func (v NullableReportData) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableReportData) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
diff --git a/service/github/github.go b/service/github/github.go
index 67078221..83d50e6d 100644
--- a/service/github/github.go
+++ b/service/github/github.go
@@ -136,15 +136,15 @@ func (g *PullRequest) postAsReviewComment(ctx context.Context) error {
 // Document: https://docs.github.com/en/rest/reference/pulls#create-a-review-comment-for-a-pull-request
 func buildDraftReviewComment(c *reviewdog.Comment, body string) *github.DraftReviewComment {
 	loc := c.Result.Diagnostic.GetLocation()
-	line := githubCommentLine(c)
+	startLine, endLine := githubCommentLineRange(c)
 	r := &github.DraftReviewComment{
 		Path: github.String(loc.GetPath()),
 		Side: github.String("RIGHT"),
 		Body: github.String(body),
-		Line: github.Int(line),
+		Line: github.Int(endLine),
 	}
 	// GitHub API: Start line must precede the end line.
-	if startLine := int(loc.GetRange().GetStart().GetLine()); startLine < line {
+	if startLine < endLine {
 		r.StartSide = github.String("RIGHT")
 		r.StartLine = github.Int(startLine)
 	}
@@ -155,12 +155,30 @@ func buildDraftReviewComment(c *reviewdog.Comment, body string) *github.DraftRev
 // it's start line.
 // Document: https://docs.github.com/en/rest/reference/pulls#create-a-review-comment-for-a-pull-request
 func githubCommentLine(c *reviewdog.Comment) int {
+	_, end := githubCommentLineRange(c)
+	return end
+}
+
+func githubCommentLineRange(c *reviewdog.Comment) (start int, end int) {
+	// Prefer first suggestion line range to diagnostic location if available so
+	// that reviewdog can post code suggestion as well when the line ranges are
+	// different between the diagnostic location and its suggestion.
+	if c.Result.FirstSuggestionInDiffContext && len(c.Result.Diagnostic.GetSuggestions()) > 0 {
+		s := c.Result.Diagnostic.GetSuggestions()[0]
+		startLine := s.GetRange().GetStart().GetLine()
+		endLine := s.GetRange().GetEnd().GetLine()
+		if endLine == 0 {
+			endLine = startLine
+		}
+		return int(startLine), int(endLine)
+	}
 	loc := c.Result.Diagnostic.GetLocation()
-	line := loc.GetRange().GetEnd().GetLine()
-	if line == 0 {
-		line = loc.GetRange().GetStart().GetLine()
+	startLine := loc.GetRange().GetStart().GetLine()
+	endLine := loc.GetRange().GetEnd().GetLine()
+	if endLine == 0 {
+		endLine = startLine
 	}
-	return int(line)
+	return int(startLine), int(endLine)
 }
 
 func (g *PullRequest) remainingCommentsSummary(remaining []*reviewdog.Comment) string {
@@ -277,22 +295,16 @@ func buildSuggestions(c *reviewdog.Comment) string {
 
 func buildSingleSuggestion(c *reviewdog.Comment, s *rdf.Suggestion) (string, error) {
 	start := s.GetRange().GetStart()
+	startLine := int(start.GetLine())
 	end := s.GetRange().GetEnd()
-	endLine := end.GetLine()
+	endLine := int(end.GetLine())
 	if endLine == 0 {
-		endLine = start.GetLine()
-	}
-	drange := c.Result.Diagnostic.GetLocation().GetRange()
-	dendLine := drange.GetEnd().GetLine()
-	if dendLine == 0 {
-		// As long as suggestion has valid range, it's ok even if diagnostic
-		// location only contains start.
-		dendLine = drange.GetStart().GetLine()
+		endLine = startLine
 	}
-	if start.GetLine() != drange.GetStart().GetLine() ||
-		(endLine != dendLine) {
-		return "", fmt.Errorf("the Diagnostic's lines and Suggestion lines must be the same. L%d-L%d v.s. L%d-L%d",
-			drange.GetStart().GetLine(), dendLine, start.GetLine(), endLine)
+	gStart, gEnd := githubCommentLineRange(c)
+	if startLine != gStart || endLine != gEnd {
+		return "", fmt.Errorf("GitHub comment range and suggestion line range must be same. L%d-L%d v.s. L%d-L%d",
+			gStart, gEnd, startLine, endLine)
 	}
 	if start.GetColumn() > 0 || end.GetColumn() > 0 {
 		return buildNonLineBasedSuggestion(c, s)
@@ -309,24 +321,36 @@ func buildSingleSuggestion(c *reviewdog.Comment, s *rdf.Suggestion) (string, err
 
 func buildNonLineBasedSuggestion(c *reviewdog.Comment, s *rdf.Suggestion) (string, error) {
 	sourceLines := c.Result.SourceLines
-	slen := len(sourceLines)
-	if slen == 0 {
+	if len(sourceLines) == 0 {
 		return "", errors.New("source lines are not available")
 	}
 	start := s.GetRange().GetStart()
 	end := s.GetRange().GetEnd()
-	if slen != int(end.GetLine()-start.GetLine()+1) {
-		return "", errors.New("invalid source lines: not all source lines for this suggestion are available")
+	startLineContent, err := getSourceLine(sourceLines, int(start.GetLine()))
+	if err != nil {
+		return "", err
+	}
+	endLineContent, err := getSourceLine(sourceLines, int(end.GetLine()))
+	if err != nil {
+		return "", err
 	}
 	var sb strings.Builder
 	sb.WriteString("```suggestion\n")
-	sb.WriteString(sourceLines[0][:max(start.GetColumn()-1, 0)])
+	sb.WriteString(startLineContent[:max(start.GetColumn()-1, 0)])
 	sb.WriteString(s.GetText())
-	sb.WriteString(sourceLines[slen-1][max(end.GetColumn()-1, 0):])
+	sb.WriteString(endLineContent[max(end.GetColumn()-1, 0):])
 	sb.WriteString("\n```")
 	return sb.String(), nil
 }
 
+func getSourceLine(sourceLines map[int]string, line int) (string, error) {
+	lineContent, ok := sourceLines[line]
+	if !ok {
+		return "", fmt.Errorf("source line (L=%d) is not available for this suggestion", line)
+	}
+	return lineContent, nil
+}
+
 func max(x, y int32) int32 {
 	if x < y {
 		return y


Test patch:
diff --git a/_testdata/custom.txt b/_testdata/custom.txt
index 391fea60..93477091 100644
--- a/_testdata/custom.txt
+++ b/_testdata/custom.txt
@@ -11,3 +11,7 @@ Line 3: Counter=1
 1234567890
 haya14busa
     ~~
+
+function f()
+{
+}
diff --git a/_testdata/custom_rdjson.json b/_testdata/custom_rdjson.json
index a757257d..203001fa 100644
--- a/_testdata/custom_rdjson.json
+++ b/_testdata/custom_rdjson.json
@@ -174,6 +174,33 @@
           }
         }
       }
+    },
+    {
+      "message": "diagnostic range != suggestion range",
+      "location": {
+        "path": "_testdata/custom.txt",
+        "range": {
+          "start": {
+            "line": 16,
+            "column": 1
+          }
+        }
+      },
+      "suggestions": [
+        {
+          "text": " ",
+          "range": {
+            "start": {
+              "line": 15,
+              "column": 13
+            },
+            "end": {
+              "line": 16,
+              "column": 1
+            }
+          }
+        }
+      ]
     }
   ]
 }
diff --git a/filter/filter_test.go b/filter/filter_test.go
index f16e489b..9509f868 100644
--- a/filter/filter_test.go
+++ b/filter/filter_test.go
@@ -91,7 +91,7 @@ func TestFilterCheckByAddedLines(t *testing.T) {
 			ShouldReport:  false,
 			InDiffFile:    true,
 			InDiffContext: true,
-			SourceLines:   []string{"unchanged, contextual line"},
+			SourceLines:   map[int]string{1: "unchanged, contextual line"},
 			OldPath:       "sample.old.txt",
 			OldLine:       1,
 		},
@@ -105,7 +105,7 @@ func TestFilterCheckByAddedLines(t *testing.T) {
 			ShouldReport:  true,
 			InDiffFile:    true,
 			InDiffContext: true,
-			SourceLines:   []string{"added line"},
+			SourceLines:   map[int]string{2: "added line"},
 			OldPath:       "sample.old.txt",
 			OldLine:       0,
 		},
@@ -119,7 +119,7 @@ func TestFilterCheckByAddedLines(t *testing.T) {
 			ShouldReport:  false,
 			InDiffFile:    true,
 			InDiffContext: true,
-			SourceLines:   []string{`" vim: nofixeol noendofline`},
+			SourceLines:   map[int]string{1: `" vim: nofixeol noendofline`},
 			OldPath:       "nonewline.old.txt",
 			OldLine:       1,
 		},
@@ -133,7 +133,7 @@ func TestFilterCheckByAddedLines(t *testing.T) {
 			ShouldReport:  true,
 			InDiffFile:    true,
 			InDiffContext: true,
-			SourceLines:   []string{"b"},
+			SourceLines:   map[int]string{3: "b"},
 			OldPath:       "nonewline.old.txt",
 			OldLine:       0,
 		},
@@ -151,7 +151,7 @@ func TestFilterCheckByAddedLines(t *testing.T) {
 			ShouldReport:  true,
 			InDiffFile:    true,
 			InDiffContext: true,
-			SourceLines:   []string{"unchanged, contextual line", "added line"},
+			SourceLines:   map[int]string{1: "unchanged, contextual line", 2: "added line"},
 			OldPath:       "sample.old.txt",
 			OldLine:       1,
 		},
@@ -184,6 +184,20 @@ func TestFilterCheckByDiffContext(t *testing.T) {
 				Range: &rdf.Range{Start: &rdf.Position{Line: 3}},
 			},
 		},
+		{
+			Location: &rdf.Location{
+				Path:  "sample.new.txt",
+				Range: &rdf.Range{Start: &rdf.Position{Line: 3}},
+			},
+			Suggestions: []*rdf.Suggestion{
+				{
+					Range: &rdf.Range{
+						Start: &rdf.Position{Line: 2},
+						End:   &rdf.Position{Line: 4},
+					},
+				},
+			},
+		},
 	}
 	want := []*FilteredDiagnostic{
 		{
@@ -196,7 +210,7 @@ func TestFilterCheckByDiffContext(t *testing.T) {
 			ShouldReport:  true,
 			InDiffFile:    true,
 			InDiffContext: true,
-			SourceLines:   []string{"unchanged, contextual line"},
+			SourceLines:   map[int]string{1: "unchanged, contextual line"},
 			OldPath:       "sample.old.txt",
 			OldLine:       1,
 		},
@@ -210,7 +224,7 @@ func TestFilterCheckByDiffContext(t *testing.T) {
 			ShouldReport:  true,
 			InDiffFile:    true,
 			InDiffContext: true,
-			SourceLines:   []string{"added line"},
+			SourceLines:   map[int]string{2: "added line"},
 			OldPath:       "sample.old.txt",
 			OldLine:       0,
 		},
@@ -224,10 +238,37 @@ func TestFilterCheckByDiffContext(t *testing.T) {
 			ShouldReport:  true,
 			InDiffFile:    true,
 			InDiffContext: true,
-			SourceLines:   []string{"added line"},
+			SourceLines:   map[int]string{3: "added line"},
 			OldPath:       "sample.old.txt",
 			OldLine:       0,
 		},
+		{
+			Diagnostic: &rdf.Diagnostic{
+				Location: &rdf.Location{
+					Path:  "sample.new.txt",
+					Range: &rdf.Range{Start: &rdf.Position{Line: 3}},
+				},
+				Suggestions: []*rdf.Suggestion{
+					{
+						Range: &rdf.Range{
+							Start: &rdf.Position{Line: 2},
+							End:   &rdf.Position{Line: 4},
+						},
+					},
+				},
+			},
+			ShouldReport:                 true,
+			InDiffFile:                   true,
+			InDiffContext:                true,
+			FirstSuggestionInDiffContext: true,
+			SourceLines: map[int]string{
+				2: "added line",
+				3: "added line",
+				4: "unchanged, contextual line",
+			},
+			OldPath: "sample.old.txt",
+			OldLine: 0,
+		},
 	}
 	filediffs, _ := diff.ParseMultiFile(strings.NewReader(diffContent))
 	got := FilterCheck(results, filediffs, 0, "", ModeDiffContext)
diff --git a/service/bitbucket/annotator_test.go b/service/bitbucket/annotator_test.go
index de602d1d..d30815c4 100644
--- a/service/bitbucket/annotator_test.go
+++ b/service/bitbucket/annotator_test.go
@@ -12,10 +12,10 @@ import (
 	"testing"
 	"time"
 
-	bbapi "github.com/reviewdog/go-bitbucket"
 	"github.com/reviewdog/reviewdog"
 	"github.com/reviewdog/reviewdog/filter"
 	"github.com/reviewdog/reviewdog/proto/rdf"
+	"github.com/reviewdog/reviewdog/service/bitbucket/openapi"
 )
 
 func TestAnnotator(t *testing.T) {
@@ -127,7 +127,7 @@ func TestAnnotator(t *testing.T) {
 				}
 
 				if isPostAnnotationsCall {
-					var req []bbapi.ReportAnnotation
+					var req []openapi.ReportAnnotation
 					if err := json.Unmarshal(body, &req); err != nil {
 						t.Error(err)
 						w.WriteHeader(http.StatusInternalServerError)
@@ -135,7 +135,7 @@ func TestAnnotator(t *testing.T) {
 					// count how many annotations we created
 					annotations[reportID] += len(req)
 				} else {
-					var req bbapi.Report
+					var req openapi.Report
 					if err := json.Unmarshal(body, &req); err != nil {
 						t.Error(err)
 						w.WriteHeader(http.StatusInternalServerError)
@@ -147,7 +147,7 @@ func TestAnnotator(t *testing.T) {
 			}))
 			defer ts.Close()
 
-			client := NewAPIClientWithConfigurations(&http.Client{Timeout: 1 * time.Second}, bbapi.ServerConfiguration{URL: ts.URL})
+			client := NewAPIClientWithConfigurations(&http.Client{Timeout: 1 * time.Second}, openapi.ServerConfiguration{URL: ts.URL})
 			bb := NewReportAnnotator(client, username, repo, commit, test.runnersList)
 			ctx := context.Background()
 
diff --git a/service/github/github_test.go b/service/github/github_test.go
index 2c0bc4c5..ee7d0d68 100644
--- a/service/github/github_test.go
+++ b/service/github/github_test.go
@@ -313,7 +313,38 @@ func TestGitHubPullRequest_Post_Flush_review_api(t *testing.T) {
 				Line:      github.Int(16),
 				Body: github.String(commentutil.BodyPrefix + strings.Join([]string{
 					"invalid lines suggestion comment",
-					invalidSuggestionPre + "the Diagnostic's lines and Suggestion lines must be the same. L15-L16 v.s. L16-L17" + invalidSuggestionPost,
+					invalidSuggestionPre + "GitHub comment range and suggestion line range must be same. L15-L16 v.s. L16-L17" + invalidSuggestionPost,
+				}, "\n") + "\n"),
+			},
+			{
+				Path:      github.String("reviewdog.go"),
+				Side:      github.String("RIGHT"),
+				StartSide: github.String("RIGHT"),
+				StartLine: github.Int(14),
+				Line:      github.Int(16),
+				Body: github.String(commentutil.BodyPrefix + strings.Join([]string{
+					"Use suggestion range as GitHub comment range if the suggestion is in diff context",
+					"```suggestion",
+					"line1",
+					"line2",
+					"line3",
+					"```",
+				}, "\n") + "\n"),
+			},
+			{
+				Path:      github.String("reviewdog.go"),
+				Side:      github.String("RIGHT"),
+				StartSide: github.String("RIGHT"),
+				StartLine: github.Int(14),
+				Line:      github.Int(16),
+				Body: github.String(commentutil.BodyPrefix + strings.Join([]string{
+					"Partially invalid suggestions",
+					"```suggestion",
+					"line1",
+					"line2",
+					"line3",
+					"```",
+					invalidSuggestionPre + "GitHub comment range and suggestion line range must be same. L14-L16 v.s. L14-L14" + invalidSuggestionPost,
 				}, "\n") + "\n"),
 			},
 			{
@@ -623,7 +654,89 @@ func TestGitHubPullRequest_Post_Flush_review_api(t *testing.T) {
 					},
 					Message: "invalid lines suggestion comment",
 				},
-				InDiffContext: true,
+				InDiffContext:                true,
+				FirstSuggestionInDiffContext: false,
+			},
+		},
+		{
+			Result: &filter.FilteredDiagnostic{
+				SourceLines: map[int]string{
+					14: "line 14 before",
+					15: "line 15 before",
+					16: "line 16 before",
+				},
+				Diagnostic: &rdf.Diagnostic{
+					Location: &rdf.Location{
+						Path: "reviewdog.go",
+						Range: &rdf.Range{
+							Start: &rdf.Position{
+								Line: 15,
+							},
+						},
+					},
+					Suggestions: []*rdf.Suggestion{
+						{
+							Range: &rdf.Range{
+								Start: &rdf.Position{
+									Line: 14,
+								},
+								End: &rdf.Position{
+									Line: 16,
+								},
+							},
+							Text: "line1\nline2\nline3",
+						},
+					},
+					Message: "Use suggestion range as GitHub comment range if the suggestion is in diff context",
+				},
+				InDiffContext:                true,
+				FirstSuggestionInDiffContext: true,
+			},
+		},
+		{
+			Result: &filter.FilteredDiagnostic{
+				SourceLines: map[int]string{
+					14: "line 14 before",
+					15: "line 15 before",
+					16: "line 16 before",
+				},
+				Diagnostic: &rdf.Diagnostic{
+					Location: &rdf.Location{
+						Path: "reviewdog.go",
+						Range: &rdf.Range{
+							Start: &rdf.Position{
+								Line: 15,
+							},
+						},
+					},
+					Suggestions: []*rdf.Suggestion{
+						{
+							Range: &rdf.Range{
+								Start: &rdf.Position{
+									Line: 14,
+								},
+								End: &rdf.Position{
+									Line: 16,
+								},
+							},
+							Text: "line1\nline2\nline3",
+						},
+						{
+							Range: &rdf.Range{
+								Start: &rdf.Position{
+									Line: 14,
+								},
+								End: &rdf.Position{
+									Line: 14,
+								},
+							},
+							Text: "line1\nline2",
+						},
+					},
+					Message: "Partially invalid suggestions",
+				},
+				InDiffContext:                true,
+				FirstSuggestionInDiffContext: true,
 			},
 		},
 		{
@@ -662,7 +775,7 @@ func TestGitHubPullRequest_Post_Flush_review_api(t *testing.T) {
 		},
 		{
 			Result: &filter.FilteredDiagnostic{
-				SourceLines: []string{"haya15busa"},
+				SourceLines: map[int]string{15: "haya15busa"},
 				Diagnostic: &rdf.Diagnostic{
 					Location: &rdf.Location{
 						Path: "reviewdog.go",
@@ -687,9 +800,9 @@ func TestGitHubPullRequest_Post_Flush_review_api(t *testing.T) {
 		},
 		{
 			Result: &filter.FilteredDiagnostic{
-				SourceLines: []string{
-					"haya???",
-					"???busa (multi-line)",
+				SourceLines: map[int]string{
+					15: "haya???",
+					16: "???busa (multi-line)",
 				},
 				Diagnostic: &rdf.Diagnostic{
 					Location: &rdf.Location{
@@ -715,10 +828,10 @@ func TestGitHubPullRequest_Post_Flush_review_api(t *testing.T) {
 		},
 		{
 			Result: &filter.FilteredDiagnostic{
-				SourceLines: []string{
-					"line 15 xxx",
-					"line 16",
-					"(content at line 15)",
+				SourceLines: map[int]string{
+					15: "line 15 xxx",
+					16: "line 16",
+					17: "(content at line 15)",
 				},
 				Diagnostic: &rdf.Diagnostic{
 					Location: &rdf.Location{
@@ -744,8 +857,8 @@ func TestGitHubPullRequest_Post_Flush_review_api(t *testing.T) {
 		},
 		{
 			Result: &filter.FilteredDiagnostic{
-				SourceLines: []string{
-					"hayabusa",
+				SourceLines: map[int]string{
+					15: "hayabusa",
 				},
 				Diagnostic: &rdf.Diagnostic{
 					Location: &rdf.Location{
@@ -771,7 +884,7 @@ func TestGitHubPullRequest_Post_Flush_review_api(t *testing.T) {
 		},
 		{
 			Result: &filter.FilteredDiagnostic{
-				SourceLines: []string{"haya??busa"},
+				SourceLines: map[int]string{15: "haya??busa"},
 				Diagnostic: &rdf.Diagnostic{
 					Location: &rdf.Location{
 						Path: "reviewdog.go",
@@ -810,7 +923,7 @@ func TestGitHubPullRequest_Post_Flush_review_api(t *testing.T) {
 		},
 		{
 			Result: &filter.FilteredDiagnostic{
-				SourceLines: []string{"haya15busa"},
+				SourceLines: map[int]string{15: "haya15busa"},
 				Diagnostic: &rdf.Diagnostic{
 					Location: &rdf.Location{
 						Path: "reviewdog.go",