Repository: ctreminiom/go-atlassian
Pull request #29 (2021-04-23 05:12:25)

Dev


Patch:
diff --git a/README.md b/README.md
index b11d8b5..ca4f569 100644
--- a/README.md
+++ b/README.md
@@ -11,87 +11,71 @@
     <a href="https://docs.go-atlassian.io/"><img src="https://img.shields.io/badge/%F0%9F%92%A1%20go-documentation-00ACD7.svg?style=flat"></a>
 </p>
 
-
-[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fctreminiom%2Fgo-atlassian.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fctreminiom%2Fgo-atlassian?ref=badge_large)
-
-## Introduction 📖
-
-go-atlassian is a library written in Go programming language that enables the interaction with the Atlassian Cloud API's. It consists of the following services that Atlassian provide us:
-* Jira Software Cloud
-* Jira Service Management Cloud
-* Confluence Cloud
-* Atlassian Access 
-* Opsgenie
-* Trello
-* Bitbucket Cloud
-
-The Complete documentation is available at [docs.go-atlassian.io](https://docs.go-atlassian.io/).
-
-## Development
-Right now, the library supports the Jira Software Cloud and Jira Service Management Cloud services. This project's still in progress, and the remaining services will be mapped and documented.
-
-## Jira Software Cloud 
-Plan, track, and release world-class software with the #1 software development tool used by agile teams.
-
-### Features
-* Create/Edit/Delete/View issues 
-* Support the Jira issue custom-fields interactions
-* Manage the project screen, screen screens, issue type scheme screens, etc.
-* Change the issue status, retrieve the issue changelogs, search issues based on the JQL query and more!!.
-
-#### Installation ✒
+go-atlassian is a Go module that enables the interaction with the Atlassian Cloud Services.
+
+## ✨ Features
+
+### 🛫 Jira Software Cloud
+- CRUD Application Roles, Dashboards, Filters, Groups, Issues.
+- Search Issues using the JQL query.
+- Add attachments into JIRA issues, and transition issues.
+- Creation of issue(s) using the instance custom_fields.
+- Edit issues using the operation's method **(add,remove,replace).**
+- Assign issues and send custom mail notifications.
+- CRUD the Issue Field Configuration, Issue Type Screen Scheme, and Permission Scheme.
+- CRUD custom_fields contexts and options.
+- Link issues and create new issue link types.
+- Get the issue priorities and resolutions.
+- CRUD Screen Screens, Screens and Screen Tabs.
+- CRUD issue votes and watchers.
+- CRUD Jira Project(s), Project Categories, Project Components, Project Versions.
+- CRUD Project Roles and add/remove project actors(users).
+- Validate new Jira Project Name or Key.
+- Add Jira Field into Screen.
+- Get or Cancel Jira Async Task(s).
+- CRUD Jira Users and Search users.
+
+### 🛬 Jira Service Management Cloud
+- CRUD JSM Customer(s).
+- Search JSM Knowledgebase Articles.
+- CRUD JSM Organizations and manipulates the Organization's Users.
+- Get(s) and Answer Approval(s) and SLA(s).
+- CRUD JSM Feedback(s) and Participant(s).
+- Get(s) JSM Projects and Queues.
+- CRUD JSM Request Types.
+
+### 🛸 Atlassian Admin Cloud    
+- Get Organization(s), Verified Domain(s), Audit Log(s), and Event Actions.
+- CRUD Organization Polities.
+- Enable/Disable an Organization User.
+- Get/Update Organization User.
+- Get/Delete Organization User Token(s).
+- Create/Deactivate/Get(s)/Update/Path SCIM User(s).
+- Create/Get(s)/Update/Delete SCIM Group(s).
+- Get SCIM Schema(s).
+
+### 🛰️ Confluence Cloud
+- In Development 🔨
+
+### 🚠 Jira Agile Cloud
+- In Development 🔨
+
+##  🔰 Installation
+Make sure you have Go installed (download). Version `1.13` or higher is required.
 ```sh
-$ go get -u -v github.com/ctreminiom/go-atlassian/jira
-```
-
-#### Use Cases
-
-<details><summary>Get Issue</summary>
-
-```go
-package main
-
-import (
-	"context"
-	"github.com/ctreminiom/go-atlassian/jira"
-	"log"
-	"os"
-)
-
-func main() {
-
-	var (
-		host  = os.Getenv("HOST")
-		mail  = os.Getenv("MAIL")
-		token = os.Getenv("TOKEN")
-	)
+## Jira Software Cloud / Service Management
+$ go get -u -v github.com/ctreminiom/go-atlassian/jira/
 
-	atlassian, err := jira.New(nil, host)
-	if err != nil {
-		return
-	}
-
-	atlassian.Auth.SetBasicAuth(mail, token)
-
-	issue, response, err := atlassian.Issue.Get(context.Background(), "KP-12", []string{"status"}, []string{"transitions"})
-	if err != nil {
-		if response != nil {
-			log.Println("Response HTTP Response", string(response.BodyAsBytes))
-			log.Println(response.StatusCode)
-		}
-		log.Fatal(err)
-	}
-
-	log.Println("Response HTTP Code", response.StatusCode)
-	log.Println("HTTP Endpoint Used", response.Endpoint)
-	log.Println(issue.Key)
-}
+## Atlassian Cloud Admin
+$ go get -u -v github.com/ctreminiom/go-atlassian/admin/
 ```
-</details>
 
-<details><summary>Get Project Categories</summary>
+## 📓 Documentation
+Documentation is hosted live at https://docs.go-atlassian.io/
 
-```go
+## 📝 Usage
+More examples in `jira/examples` `admin/examples` `jira/sm/examples` directories. Here's a short example of how to get a Jira Issue:
+````go
 package main
 
 import (
@@ -101,191 +85,6 @@ import (
 	"os"
 )
 
-func main() {
-
-	/*
-		----------- Set an environment variable in git bash -----------
-		export HOST="https://ctreminiom.atlassian.net/"
-		export MAIL="MAIL_ADDRESS"
-		export TOKEN="TOKEN_API"
-
-		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
-	*/
-
-	var (
-		host  = os.Getenv("HOST")
-		mail  = os.Getenv("MAIL")
-		token = os.Getenv("TOKEN")
-	)
-
-	atlassian, err := jira.New(nil, host)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	atlassian.Auth.SetBasicAuth(mail, token)
-
-	categories, response, err := atlassian.Project.Category.Gets(context.Background())
-	if err != nil {
-		if response != nil {
-			log.Println("Response HTTP Response", string(response.BodyAsBytes))
-		}
-		log.Fatal(err)
-	}
-
-	log.Println("Response HTTP Code", response.StatusCode)
-	log.Println("HTTP Endpoint Used", response.Endpoint)
-
-	for _, category := range *categories {
-
-		log.Println("----------------")
-		log.Println(category.Self)
-		log.Println(category.ID)
-		log.Println(category.Name)
-		log.Println(category.Description)
-		log.Println("----------------")
-	}
-}
-
-```
-</details>
-
-<details><summary>Create Project Version</summary>
-
-```go
-package main
-
-import (
-	"context"
-	"github.com/ctreminiom/go-atlassian/jira"
-	"log"
-	"os"
-)
-
-func main() {
-
-	/*
-		----------- Set an environment variable in git bash -----------
-		export HOST="https://ctreminiom.atlassian.net/"
-		export MAIL="MAIL_ADDRESS"
-		export TOKEN="TOKEN_API"
-
-		Docs: https://stackoverflow.com/questions/34169721/set-an-environment-variable-in-git-bash
-	*/
-
-	var (
-		host  = os.Getenv("HOST")
-		mail  = os.Getenv("MAIL")
-		token = os.Getenv("TOKEN")
-	)
-
-	atlassian, err := jira.New(nil, host)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	atlassian.Auth.SetBasicAuth(mail, token)
-
-	payload := &jira.ProjectVersionPayloadScheme{
-		Archived:    false,
-		ReleaseDate: "2021-03-06",
-		Name:        "Version Sandbox",
-		Description: "Version Sandbox description",
-		ProjectID:   10000,
-		Released:    false,
-		StartDate:   "2021-03-02",
-	}
-
-	newVersion, response, err := atlassian.Project.Version.Create(context.Background(), payload)
-	if err != nil {
-		if response != nil {
-			log.Println("Response HTTP Response", string(response.BodyAsBytes))
-		}
-		log.Fatal(err)
-	}
-
-	log.Println("Response HTTP Code", response.StatusCode)
-	log.Println("HTTP Endpoint Used", response.Endpoint)
-	log.Printf("The new version has been created with the ID %v", newVersion.ID)
-}
-
-```
-</details>
-
-## Jira Service Management Cloud
-Collaborate at high-velocity, respond to business changes and deliver great customer and employee service experiences fast.
-
-### Features
-* Create/Edit/Delete/View Service Desk Organizations
-* Create Request Types, Customers.
-* Get the Service Desk Articles, Queues, Request Comments, Participants, etc  
-
-#### Installation ✒
-```sh
-$ go get -u -v github.com/ctreminiom/go-atlassian/jira
-```
-
-#### Use Cases
-
-<details><summary>Create Organization</summary>
-
-```go
-package main
-
-import (
-	"context"
-	"github.com/ctreminiom/go-atlassian/jira"
-	"log"
-	"os"
-)
-
-func main() {
-
-	var (
-		host  = os.Getenv("HOST")
-		mail  = os.Getenv("MAIL")
-		token = os.Getenv("TOKEN")
-	)
-
-	atlassian, err := jira.New(nil, host)
-	if err != nil {
-		return
-	}
-
-	atlassian.Auth.SetBasicAuth(mail, token)
-	atlassian.Auth.SetUserAgent("curl/7.54.0")
-
-	var organizationName = "Organization Name"
-
-	newOrganization, response, err := atlassian.ServiceManagement.Organization.Create(context.Background(), organizationName)
-	if err != nil {
-		if response != nil {
-			log.Println("Response HTTP Response", string(response.BodyAsBytes))
-			log.Println("HTTP Endpoint Used", response.Endpoint)
-		}
-		log.Fatal(err)
-	}
-
-	log.Println("Response HTTP Code", response.StatusCode)
-	log.Println("HTTP Endpoint Used", response.Endpoint)
-	log.Printf("The organization has been created: %v", newOrganization.ID)
-}
-```
-</details>
-
-<details><summary>Get Request Approvals</summary>
-
-```go
-package main
-
-import (
-	"context"
-	"encoding/json"
-	"github.com/ctreminiom/go-atlassian/jira"
-	"log"
-	"os"
-)
-
 func main() {
 
 	var (
@@ -300,14 +99,12 @@ func main() {
 	}
 
 	atlassian.Auth.SetBasicAuth(mail, token)
-	atlassian.Auth.SetUserAgent("curl/7.54.0")
 
-	var issueKey = "DESK-12"
-	approvals, response, err := atlassian.ServiceManagement.Request.Approval.Gets(context.Background(), issueKey, 0, 50)
+	issue, response, err := atlassian.Issue.Get(context.Background(), "KP-12", nil, []string{"transitions"})
 	if err != nil {
 		if response != nil {
 			log.Println("Response HTTP Response", string(response.BodyAsBytes))
-			log.Println("HTTP Endpoint Used", response.Endpoint)
+			log.Println(response.StatusCode)
 		}
 		log.Fatal(err)
 	}
@@ -315,97 +112,44 @@ func main() {
 	log.Println("Response HTTP Code", response.StatusCode)
 	log.Println("HTTP Endpoint Used", response.Endpoint)
 
-	for _, customRequest := range approvals.Values {
-
-		dataAsJson, err := json.MarshalIndent(customRequest, "", "\t")
-		if err != nil {
-			log.Fatal(err)
-		}
+	log.Println(issue.Key)
+	log.Println(issue.Fields.Reporter.AccountID)
 
-		log.Println(string(dataAsJson))
+	for _, transition := range issue.Transitions {
+		log.Println(transition.Name, transition.ID, transition.To.ID, transition.HasScreen)
 	}
 
 }
-```
-</details>
-
-<details><summary>Get Service Desk Queues</summary>
-
-```go
-package main
-
-import (
-	"context"
-	"github.com/ctreminiom/go-atlassian/jira"
-	"log"
-	"os"
-)
-
-func main() {
-
-	var (
-		host  = os.Getenv("HOST")
-		mail  = os.Getenv("MAIL")
-		token = os.Getenv("TOKEN")
-	)
-
-	atlassian, err := jira.New(nil, host)
-	if err != nil {
-		return
-	}
-
-	atlassian.Auth.SetBasicAuth(mail, token)
-	atlassian.Auth.SetUserAgent("curl/7.54.0")
+````
 
-	var (
-		serviceDeskID      = 1
-		includeCount  bool = true
-		start, limit  int  = 0, 50
-	)
-
-	queues, response, err := atlassian.ServiceManagement.ServiceDesk.Queue.Gets(context.Background(), serviceDeskID, includeCount, start, limit)
-	if err != nil {
-		if response != nil {
-			log.Println("Response HTTP Response", string(response.BodyAsBytes))
-			log.Println("HTTP Endpoint Used", response.Endpoint)
-		}
-		log.Fatal(err)
-	}
+## ⭐️ Project assistance
 
-	for pos, queue := range queues.Values {
+If you want to say **thank you** or/and support active development of `go-atlassian`:
 
-		log.Println("------------------------------------")
-		log.Printf("Queue ID #%v: %v", pos+1, queue.ID)
-		log.Printf("Queue Name #%v: %v", pos+1, queue.Name)
-		log.Printf("Queue JQL #%v: %v", pos+1, queue.Jql)
-		log.Printf("Queue Issue Count #%v: %v", pos+1, queue.IssueCount)
-		log.Printf("Queue Fields #%v: %v", pos+1, queue.Fields)
-		log.Println("------------------------------------")
-	}
+- Add a [GitHub Star](https://github.com/ctreminiom/go-atlassian) to the project.
+- Write interesting articles about project on [Dev.to](https://dev.to/), [Medium](https://medium.com/) or personal blog.
+- Support the project by donating a cup of coffee.
+- Contributions, issues and feature requests are welcome!
+-  Feel free to check [issues page](https://github.com/ctreminiom/go-atlassian/issues).
+    
+[![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/ctreminiom)
 
-}
-```
-</details>
+## 💡 Inspiration
+The project was created with the purpose to provide a unique point to provide an interface for interacting with Atlassian products. This module is highly inspired by the Go library https://github.com/andygrunwald/go-jira
+but focused on Cloud solutions.
 
-## Run tests
+## 🧪 Run Test Cases
 ```sh
 go test -v ./...
 ```
 
-## Author 
-
-👤 **Carlos Treminio**
-* Website: https://ctreminiom.gitbook.io/docs/
-* Github: [@ctreminiom](https://github.com/ctreminiom)
-* LinkedIn: [@ctreminio](https://linkedin.com/in/ctreminio)
-
-## 🤝 Contributing
-Contributions, issues and feature requests are welcome!
-Feel free to check [issues page](https://github.com/ctreminiom/go-atlassian/issues).
-## Show your support
-Give a ⭐️ if this project helped you!
-[![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/ctreminiom)
+## 💳 Credits
+In addition to all the contributors we would like to thank these vendors:
+- **Atlassian** for developing such a powerful ecosystem.
+- **Gitbook** for provided full features for open-source projects
 
 ## 📝 License
 Copyright © 2021 [Carlos Treminio](https://github.com/ctreminiom).
-This project is [MIT](https://opensource.org/licenses/MIT) licensed.
\ No newline at end of file
+This project is [MIT](https://opensource.org/licenses/MIT) licensed.
+
+[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fctreminiom%2Fgo-atlassian.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fctreminiom%2Fgo-atlassian?ref=badge_large)
diff --git a/admin/admin.go b/admin/admin.go
index d1ec336..08115db 100644
--- a/admin/admin.go
+++ b/admin/admin.go
@@ -46,8 +46,7 @@ func New(httpClient *http.Client) (client *Client, err error) {
 	client.Organization = &OrganizationService{
 		client: client,
 		Policy: &OrganizationPolicyService{
-			client:   client,
-			Resource: &OrganizationPolicyResourceService{client: client},
+			client: client,
 		},
 	}
 
@@ -57,11 +56,10 @@ func New(httpClient *http.Client) (client *Client, err error) {
 	}
 
 	client.SCIM = &SCIMService{
-		client:   client,
-		User:     &SCIMUserService{client: client},
-		Group:    &SCIMGroupService{client: client},
-		Scheme:   &SCIMSchemeService{client: client},
-		Resource: &SCIMResourceService{client: client},
+		client: client,
+		User:   &SCIMUserService{client: client},
+		Group:  &SCIMGroupService{client: client},
+		Scheme: &SCIMSchemeService{client: client},
 	}
 
 	return
diff --git a/admin/examples/organization-policy/get/get.go b/admin/examples/organization-policy/get/get.go
index 7ecc4c4..d1051ca 100644
--- a/admin/examples/organization-policy/get/get.go
+++ b/admin/examples/organization-policy/get/get.go
@@ -2,8 +2,6 @@ package main
 
 import (
 	"context"
-	"encoding/json"
-	"fmt"
 	"github.com/ctreminiom/go-atlassian/admin"
 	"log"
 	"os"
@@ -38,10 +36,6 @@ func main() {
 	log.Println("Response HTTP Code", response.StatusCode)
 	log.Println("HTTP Endpoint Used", response.Endpoint)
 
-	policyAsJSONKeys, err := json.MarshalIndent(policy, "", "  ")
-	if err != nil {
-		log.Fatal(err)
-	}
+	log.Println(policy.Data.Type, policy.Data.ID, policy.Data.Attributes)
 
-	fmt.Printf("MarshalIndent Struct keys output\n %s\n", string(policyAsJSONKeys))
 }
diff --git a/admin/examples/organization-policy/gets/gets.go b/admin/examples/organization-policy/gets/gets.go
index a70a5b5..ecbd029 100644
--- a/admin/examples/organization-policy/gets/gets.go
+++ b/admin/examples/organization-policy/gets/gets.go
@@ -2,8 +2,6 @@ package main
 
 import (
 	"context"
-	"encoding/json"
-	"fmt"
 	"github.com/ctreminiom/go-atlassian/admin"
 	"log"
 	"net/url"
@@ -61,12 +59,7 @@ func main() {
 
 		for _, policy := range chunk.Data {
 
-			policyAsJSONKeys, err := json.MarshalIndent(policy, "", "  ")
-			if err != nil {
-				log.Fatal(err)
-			}
-
-			fmt.Printf("MarshalIndent Struct keys output\n %s\n", string(policyAsJSONKeys))
+			log.Println(policy.ID, policy.Type, policy.Attributes.Status)
 		}
 
 	}
diff --git a/admin/examples/organization/get/get.go b/admin/examples/organization/get/get.go
index 728d850..b29e41c 100644
--- a/admin/examples/organization/get/get.go
+++ b/admin/examples/organization/get/get.go
@@ -2,7 +2,6 @@ package main
 
 import (
 	"context"
-	"fmt"
 	"github.com/ctreminiom/go-atlassian/admin"
 	"log"
 	"os"
@@ -34,6 +33,4 @@ func main() {
 	log.Println("Response HTTP Code", response.StatusCode)
 	log.Println("HTTP Endpoint Used", response.Endpoint)
 	log.Println(organization.Data.ID)
-
-	fmt.Println(string(response.BodyAsBytes))
 }
diff --git a/admin/examples/organization/gets/gets.go b/admin/examples/organization/gets/gets.go
index 24274b8..6107787 100644
--- a/admin/examples/organization/gets/gets.go
+++ b/admin/examples/organization/gets/gets.go
@@ -2,7 +2,6 @@ package main
 
 import (
 	"context"
-	"fmt"
 	"github.com/ctreminiom/go-atlassian/admin"
 	"log"
 	"os"
@@ -32,9 +31,6 @@ func main() {
 	log.Println("Response HTTP Code", response.StatusCode)
 	log.Println("HTTP Endpoint Used", response.Endpoint)
 
-	fmt.Println(string(response.BodyAsBytes))
-
-	log.Println(organizations.Links)
 	for _, organization := range organizations.Data {
 		log.Println(organization.ID, organization.Attributes.Name)
 	}
diff --git a/admin/examples/scim-group/create/create.go b/admin/examples/scim-group/create/create.go
new file mode 100644
index 0000000..08d77e1
--- /dev/null
+++ b/admin/examples/scim-group/create/create.go
@@ -0,0 +1,39 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/admin"
+	"log"
+	"os"
+)
+
+func main() {
+
+	//ATLASSIAN_ADMIN_TOKEN
+	var scimApiKey = os.Getenv("ATLASSIAN_SCIM_API_KEY")
+
+	cloudAdmin, err := admin.New(nil)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	cloudAdmin.Auth.SetBearerToken(scimApiKey)
+	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
+
+	var (
+		directoryID  = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
+		newGroupName = "scim-jira-users"
+	)
+
+	group, response, err := cloudAdmin.SCIM.Group.Create(context.Background(), directoryID, newGroupName)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", string(response.BodyAsBytes))
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.StatusCode)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Printf("The group %v has been created and it contains the ID %v", group.DisplayName, group.ID)
+}
diff --git a/admin/examples/scim-group/delete/delete.go b/admin/examples/scim-group/delete/delete.go
new file mode 100644
index 0000000..e4ef979
--- /dev/null
+++ b/admin/examples/scim-group/delete/delete.go
@@ -0,0 +1,38 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/admin"
+	"log"
+	"os"
+)
+
+func main() {
+
+	//ATLASSIAN_ADMIN_TOKEN
+	var scimApiKey = os.Getenv("ATLASSIAN_SCIM_API_KEY")
+
+	cloudAdmin, err := admin.New(nil)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	cloudAdmin.Auth.SetBearerToken(scimApiKey)
+	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
+
+	var (
+		directoryID = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
+		groupID     = "e18da5e4-ba2e-4039-9046-30000af6c0b7"
+	)
+
+	response, err := cloudAdmin.SCIM.Group.Delete(context.Background(), directoryID, groupID)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", string(response.BodyAsBytes))
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.StatusCode)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+}
diff --git a/admin/examples/scim-user/overwrite/overwrite.go b/admin/examples/scim-group/get/get.go
similarity index 52%
rename from admin/examples/scim-user/overwrite/overwrite.go
rename to admin/examples/scim-group/get/get.go
index 3a9a390..1cf1f3d 100644
--- a/admin/examples/scim-user/overwrite/overwrite.go
+++ b/admin/examples/scim-group/get/get.go
@@ -2,6 +2,7 @@ package main
 
 import (
 	"context"
+	"fmt"
 	"github.com/ctreminiom/go-atlassian/admin"
 	"log"
 	"os"
@@ -22,24 +23,10 @@ func main() {
 
 	var (
 		directoryID = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
-		userID      = "ef5ff80e-9ca6-449c-8cca-5b621085c6c9"
+		groupID     = "e18da5e4-ba2e-4039-9046-30000af6c0b7"
 	)
 
-	payload := &admin.SCIMUserScheme{
-		UserName:    "username-updated-with-overwrite-method",
-		DisplayName: "AA",
-		NickName:    "AA",
-		Title:       "AA",
-		Department:  "President",
-		Emails: []*admin.SCIMUserEmailScheme{
-			{
-				Value:   "carlos@go-atlassian.io",
-				Type:    "work",
-				Primary: true,
-			},
-		},
-	}
-	userUpdated, response, err := cloudAdmin.SCIM.User.Overwrite(context.Background(), directoryID, userID, payload, nil, nil)
+	group, response, err := cloudAdmin.SCIM.Group.Get(context.Background(), directoryID, groupID)
 	if err != nil {
 		if response != nil {
 			log.Println("Response HTTP Response", string(response.BodyAsBytes))
@@ -49,8 +36,8 @@ func main() {
 
 	log.Println("Response HTTP Code", response.StatusCode)
 	log.Println("HTTP Endpoint Used", response.Endpoint)
-	log.Println(userUpdated.DisplayName)
-	log.Println(userUpdated.Active)
-	log.Println(userUpdated.Department)
+	log.Println(group)
+
+	fmt.Println(string(response.BodyAsBytes))
 
 }
diff --git a/admin/examples/scim-group/gets/gets.go b/admin/examples/scim-group/gets/gets.go
new file mode 100644
index 0000000..29ba04a
--- /dev/null
+++ b/admin/examples/scim-group/gets/gets.go
@@ -0,0 +1,40 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/admin"
+	"log"
+	"os"
+)
+
+func main() {
+
+	//ATLASSIAN_ADMIN_TOKEN
+	var scimApiKey = os.Getenv("ATLASSIAN_SCIM_API_KEY")
+
+	cloudAdmin, err := admin.New(nil)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	cloudAdmin.Auth.SetBearerToken(scimApiKey)
+	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
+
+	var directoryID = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
+
+	groups, response, err := cloudAdmin.SCIM.Group.Gets(context.Background(), directoryID, "", 0, 50)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", string(response.BodyAsBytes))
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.StatusCode)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+
+	for _, group := range groups.Resources {
+		log.Println(group)
+	}
+
+}
diff --git a/admin/examples/scim-group/path/path.go b/admin/examples/scim-group/path/path.go
new file mode 100644
index 0000000..32a0008
--- /dev/null
+++ b/admin/examples/scim-group/path/path.go
@@ -0,0 +1,62 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/admin"
+	"log"
+	"os"
+)
+
+func main() {
+
+	//ATLASSIAN_ADMIN_TOKEN
+	var scimApiKey = os.Getenv("ATLASSIAN_SCIM_API_KEY")
+
+	cloudAdmin, err := admin.New(nil)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	cloudAdmin.Auth.SetBearerToken(scimApiKey)
+	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
+
+	var (
+		directoryID = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
+		groupID     = "e18da5e4-ba2e-4039-9046-30000af6c0b7"
+		accountID   = "635cdb2f-e72c-4122-bfd3-3aa6c7f02f96"
+	)
+
+	payload := &admin.SCIMGroupPathScheme{
+		Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
+		Operations: []*admin.SCIMGroupOperationScheme{
+			{
+				Op:   "add",
+				Path: "members",
+				Value: []*admin.SCIMGroupOperationValueScheme{
+					{
+						Value:   accountID,
+						Display: "Example Display Name",
+					},
+				},
+			},
+		},
+	}
+
+	group, response, err := cloudAdmin.SCIM.Group.Path(context.Background(), directoryID, groupID, payload)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", string(response.BodyAsBytes))
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.StatusCode)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+
+	log.Println(group.ID, group.DisplayName)
+
+	for _, member := range group.Members {
+		log.Println(member)
+	}
+
+}
diff --git a/admin/examples/scim-group/update/update.go b/admin/examples/scim-group/update/update.go
new file mode 100644
index 0000000..ca3ff46
--- /dev/null
+++ b/admin/examples/scim-group/update/update.go
@@ -0,0 +1,40 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/admin"
+	"log"
+	"os"
+)
+
+func main() {
+
+	//ATLASSIAN_ADMIN_TOKEN
+	var scimApiKey = os.Getenv("ATLASSIAN_SCIM_API_KEY")
+
+	cloudAdmin, err := admin.New(nil)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	cloudAdmin.Auth.SetBearerToken(scimApiKey)
+	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
+
+	var (
+		directoryID  = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
+		groupID      = "e18da5e4-ba2e-4039-9046-30000af6c0b7"
+		newGroupName = "scim-jira-users-updated"
+	)
+
+	group, response, err := cloudAdmin.SCIM.Group.Update(context.Background(), directoryID, groupID, newGroupName)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", string(response.BodyAsBytes))
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.StatusCode)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(group)
+}
diff --git a/admin/examples/scim-scheme/group/group.go b/admin/examples/scim-scheme/group/group.go
new file mode 100644
index 0000000..2e07a5f
--- /dev/null
+++ b/admin/examples/scim-scheme/group/group.go
@@ -0,0 +1,61 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/admin"
+	"log"
+	"os"
+)
+
+func main() {
+
+	//ATLASSIAN_ADMIN_TOKEN
+	var scimApiKey = os.Getenv("ATLASSIAN_SCIM_API_KEY")
+
+	cloudAdmin, err := admin.New(nil)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	cloudAdmin.Auth.SetBearerToken(scimApiKey)
+	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
+
+	var directoryID = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
+
+	schemas, response, err := cloudAdmin.SCIM.Scheme.Group(context.Background(), directoryID)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", string(response.BodyAsBytes))
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.StatusCode)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+
+	for _, attribute := range schemas.Attributes {
+		log.Println("----------------------")
+		log.Println("Type", attribute.Type)
+		log.Println("Description", attribute.Description)
+		log.Println("Name", attribute.Name)
+		log.Println("Required", attribute.Required)
+		log.Println("Returned", attribute.Returned)
+		log.Println("Mutability", attribute.Mutability)
+		log.Println("SubAttributes", len(attribute.SubAttributes))
+
+		for _, subAttribute := range attribute.SubAttributes {
+			log.Println("==============================")
+			log.Println("==", subAttribute.Uniqueness)
+			log.Println("==", subAttribute.Mutability)
+			log.Println("==", subAttribute.Returned)
+			log.Println("==", subAttribute.Required)
+			log.Println("==", subAttribute.Name)
+			log.Println("==", subAttribute.Description)
+			log.Println("==============================")
+
+		}
+
+		log.Println("----------------------")
+
+	}
+}
diff --git a/admin/examples/scim-user/create/create.go b/admin/examples/scim-user/create/create.go
index 502f721..c6e5234 100644
--- a/admin/examples/scim-user/create/create.go
+++ b/admin/examples/scim-user/create/create.go
@@ -23,7 +23,7 @@ func main() {
 	var directoryID = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
 
 	var payload = &admin.SCIMUserScheme{
-		UserName: "Example Username 2",
+		UserName: "Example Username 3",
 		Emails: []*admin.SCIMUserEmailScheme{
 			{
 				Value:   "example-2@go-atlassian.io",
@@ -40,7 +40,7 @@ func main() {
 			HonorificSuffix: "",
 		},
 
-		DisplayName:       "Example Display Name",
+		DisplayName:       "Example Display Name 3",
 		NickName:          "Example NickName",
 		Title:             "Atlassian Administrator",
 		PreferredLanguage: "en-US",
diff --git a/admin/examples/scim-user/path/path.go b/admin/examples/scim-user/path/path.go
new file mode 100644
index 0000000..68d0e68
--- /dev/null
+++ b/admin/examples/scim-user/path/path.go
@@ -0,0 +1,142 @@
+package main
+
+import (
+	"context"
+	"github.com/ctreminiom/go-atlassian/admin"
+	"log"
+	"os"
+)
+
+func main() {
+
+	//ATLASSIAN_ADMIN_TOKEN
+	var scimApiKey = os.Getenv("ATLASSIAN_SCIM_API_KEY")
+
+	cloudAdmin, err := admin.New(nil)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	cloudAdmin.Auth.SetBearerToken(scimApiKey)
+	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
+
+	var (
+		directoryID = "bcdde508-ee40-4df2-89cc-d3f6292c5971"
+		userID      = "ef5ff80e-9ca6-449c-8cca-5b621085c6c9"
+	)
+
+	payload := &admin.SCIMUserToPathScheme{
+		Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
+	}
+
+	if err = payload.AddStringOperation("replace", "displayName", "Docs Atlassian DisplayName 2"); err != nil {
+		log.Fatal(err)
+	}
+
+	if err = payload.AddStringOperation("replace", "userName", "user-name-updated2"); err != nil {
+		log.Fatal(err)
+	}
+
+	if err = payload.AddBoolOperation("replace", "active", false); err != nil {
+		log.Fatal(err)
+	}
+
+	if err = payload.AddComplexOperation("add", "emails", []*admin.SCIMUserComplexOperationScheme{
+		{
+			Value:     "primary@go-atlassian.io",
+			ValueType: "work",
+			Primary:   true,
+		},
+		{
+			Value:     "second@go-atlassian.io",
+			ValueType: "other",
+			Primary:   false,
+		},
+	}); err != nil {
+		log.Fatal(err)
+	}
+
+	/*
+		payload := &admin.SCIMUserToPathScheme{
+			Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
+			Operations: []*admin.SCIMUserToPathOperationScheme{
+				{
+					Op:    "replace",
+					Path:  "displayName",
+					Value: "Docs Atlassian DisplayName",
+				},
+
+				{
+					Op:    "replace",
+					Path:  "userName",
+					Value: "user-name-updated",
+				},
+				{
+					Op:    "replace",
+					Path:  "name.formatted",
+					Value: "Ms. Barbara J Jensen, III",
+				},
+				{
+					Op:    "replace",
+					Path:  "name.familyName",
+					Value: "Jensen",
+				},
+				{
+					Op:    "replace",
+					Path:  "name.givenName",
+					Value: "Barbara",
+				},
+				{
+					Op:    "replace",
+					Path:  "name.middleName",
+					Value: "Jane",
+				},
+				{
+					Op:    "replace",
+					Path:  "name.honorificPrefix",
+					Value: "Ms.",
+				},
+				{
+					Op:    "replace",
+					Path:  "name.honorificSuffix",
+					Value: "III",
+				},
+
+				{
+					Op:    "replace",
+					Path:  "nickName",
+					Value: "Bobby",
+				},
+
+				{
+					Op:    "replace",
+					Path:  "title",
+					Value: "Vice President.",
+				},
+
+				{
+					Op:    "replace",
+					Path:  "title",
+					Value: "Vice President.",
+				},
+			},
+		}
+	*/
+
+	userUpdated, response, err := cloudAdmin.SCIM.User.Path(context.Background(), directoryID, userID, payload, nil, nil)
+	if err != nil {
+		if response != nil {
+			log.Println("Response HTTP Response", string(response.BodyAsBytes))
+		}
+		log.Fatal(err)
+	}
+
+	log.Println("Response HTTP Code", response.StatusCode)
+	log.Println("HTTP Endpoint Used", response.Endpoint)
+	log.Println(userUpdated.DisplayName)
+	log.Println(userUpdated.Active)
+
+	for _, mail := range userUpdated.Emails {
+		log.Println(mail)
+	}
+}
diff --git a/admin/examples/scim-user/update/update.go b/admin/examples/scim-user/update/update.go
index 4eabb9b..47db450 100644
--- a/admin/examples/scim-user/update/update.go
+++ b/admin/examples/scim-user/update/update.go
@@ -25,104 +25,20 @@ func main() {
 		userID      = "ef5ff80e-9ca6-449c-8cca-5b621085c6c9"
 	)
 
-	payload := &admin.SCIMUserToPathScheme{
-		Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
-	}
-
-	if err = payload.AddStringOperation("replace", "displayName", "Docs Atlassian DisplayName 2"); err != nil {
-		log.Fatal(err)
-	}
-
-	if err = payload.AddStringOperation("replace", "userName", "user-name-updated2"); err != nil {
-		log.Fatal(err)
-	}
-
-	if err = payload.AddBoolOperation("replace", "active", false); err != nil {
-		log.Fatal(err)
-	}
-
-	if err = payload.AddComplexOperation("add", "emails", []*admin.SCIMUserComplexOperationScheme{
-		{
-			Value:     "primary@go-atlassian.io",
-			ValueType: "work",
-			Primary:   true,
-		},
-		{
-			Value:     "second@go-atlassian.io",
-			ValueType: "other",
-			Primary:   false,
+	payload := &admin.SCIMUserScheme{
+		UserName:    "username-updated-with-overwrite-method",
+		DisplayName: "AA",
+		NickName:    "AA",
+		Title:       "AA",
+		Department:  "President",
+		Emails: []*admin.SCIMUserEmailScheme{
+			{
+				Value:   "carlos@go-atlassian.io",
+				Type:    "work",
+				Primary: true,
+			},
 		},
-	}); err != nil {
-		log.Fatal(err)
 	}
-
-	/*
-		payload := &admin.SCIMUserToPathScheme{
-			Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
-			Operations: []*admin.SCIMUserToPathOperationScheme{
-				{
-					Op:    "replace",
-					Path:  "displayName",
-					Value: "Docs Atlassian DisplayName",
-				},
-
-				{
-					Op:    "replace",
-					Path:  "userName",
-					Value: "user-name-updated",
-				},
-				{
-					Op:    "replace",
-					Path:  "name.formatted",
-					Value: "Ms. Barbara J Jensen, III",
-				},
-				{
-					Op:    "replace",
-					Path:  "name.familyName",
-					Value: "Jensen",
-				},
-				{
-					Op:    "replace",
-					Path:  "name.givenName",
-					Value: "Barbara",
-				},
-				{
-					Op:    "replace",
-					Path:  "name.middleName",
-					Value: "Jane",
-				},
-				{
-					Op:    "replace",
-					Path:  "name.honorificPrefix",
-					Value: "Ms.",
-				},
-				{
-					Op:    "replace",
-					Path:  "name.honorificSuffix",
-					Value: "III",
-				},
-
-				{
-					Op:    "replace",
-					Path:  "nickName",
-					Value: "Bobby",
-				},
-
-				{
-					Op:    "replace",
-					Path:  "title",
-					Value: "Vice President.",
-				},
-
-				{
-					Op:    "replace",
-					Path:  "title",
-					Value: "Vice President.",
-				},
-			},
-		}
-	*/
-
 	userUpdated, response, err := cloudAdmin.SCIM.User.Update(context.Background(), directoryID, userID, payload, nil, nil)
 	if err != nil {
 		if response != nil {
@@ -135,8 +51,6 @@ func main() {
 	log.Println("HTTP Endpoint Used", response.Endpoint)
 	log.Println(userUpdated.DisplayName)
 	log.Println(userUpdated.Active)
+	log.Println(userUpdated.Department)
 
-	for _, mail := range userUpdated.Emails {
-		log.Println(mail)
-	}
 }
diff --git a/admin/examples/user-token/gets/gets.go b/admin/examples/user-token/gets/gets.go
index 1bd8516..f7def23 100644
--- a/admin/examples/user-token/gets/gets.go
+++ b/admin/examples/user-token/gets/gets.go
@@ -20,7 +20,7 @@ func main() {
 	cloudAdmin.Auth.SetBearerToken(apiKey)
 	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
 
-	var accountID = "5e5f6a63157ed50cd2b9eaca"
+	var accountID = "606a7ff396e8d60068a5c652"
 
 	tokens, response, err := cloudAdmin.User.Token.Gets(context.Background(), accountID)
 	if err != nil {
diff --git a/admin/examples/user/get/get.go b/admin/examples/user/get/get.go
index dff0440..88c3345 100644
--- a/admin/examples/user/get/get.go
+++ b/admin/examples/user/get/get.go
@@ -20,7 +20,7 @@ func main() {
 	cloudAdmin.Auth.SetBearerToken(apiKey)
 	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
 
-	var accountID = "5e5f6a63157ed50cd2b9eaca"
+	var accountID = "606a7ff396e8d60068a5c652"
 
 	user, response, err := cloudAdmin.User.Get(context.Background(), accountID)
 	if err != nil {
diff --git a/admin/examples/user/permissions/permissions.go b/admin/examples/user/permissions/permissions.go
index 23c342d..0e75025 100644
--- a/admin/examples/user/permissions/permissions.go
+++ b/admin/examples/user/permissions/permissions.go
@@ -20,7 +20,7 @@ func main() {
 	cloudAdmin.Auth.SetBearerToken(apiKey)
 	cloudAdmin.Auth.SetUserAgent("curl/7.54.0")
 
-	var accountID = "5e5f6a63157ed50cd2b9eaca"
+	var accountID = "606a7ff396e8d60068a5c652"
 
 	permissions, response, err := cloudAdmin.User.Permissions(context.Background(), accountID, nil)
 	if err != nil {
diff --git a/admin/mocks/scim-get-group.json b/admin/mocks/scim-get-group.json
new file mode 100644
index 0000000..6dad0d7
--- /dev/null
+++ b/admin/mocks/scim-get-group.json
@@ -0,0 +1,21 @@
+{
+  "schemas": [
+    "urn:ietf:params:scim:schemas:core:2.0:Group"
+  ],
+  "id": "e18da5e4-ba2e-4039-9046-30000af6c0b7",
+  "displayName": "scim-jira-users",
+  "members": [
+    {
+      "type": "User",
+      "value": "635cdb2f-e72c-4122-bfd3-3aa6c7f02f96",
+      "display": "example username 3",
+      "$ref": "https://api.atlassian.com/scim/directory/bcdde508-ee40-4df2-89cc-d3f6292c5971/Users/635cdb2f-e72c-4122-bfd3-3aa6c7f02f96"
+    }
+  ],
+  "meta": {
+    "resourceType": "Group",
+    "location": "https://api.atlassian.com/scim/directory/bcdde508-ee40-4df2-89cc-d3f6292c5971/Groups/e18da5e4-ba2e-4039-9046-30000af6c0b7",
+    "lastModified": "2021-04-20T05:17:25.107602Z",
+    "created": "2021-04-20T04:54:27.04421Z"
+  }
+}
\ No newline at end of file
diff --git a/admin/mocks/scim-get-groups.json b/admin/mocks/scim-get-groups.json
new file mode 100644
index 0000000..62bf3fe
--- /dev/null
+++ b/admin/mocks/scim-get-groups.json
@@ -0,0 +1,31 @@
+{
+  "schemas": [
+    "urn:ietf:params:scim:api:messages:2.0:ListResponse"
+  ],
+  "totalResults": 1,
+  "startIndex": 1,
+  "itemsPerPage": 50,
+  "Resources": [
+    {
+      "schemas": [
+        "urn:ietf:params:scim:schemas:core:2.0:Group"
+      ],
+      "id": "e18da5e4-ba2e-4039-9046-30000af6c0b7",
+      "displayName": "scim-jira-users",
+      "members": [
+        {
+          "type": "User",
+          "value": "635cdb2f-e72c-4122-bfd3-3aa6c7f02f96",
+          "display": "example username 3",
+          "$ref": "https://api.atlassian.com/scim/directory/bcdde508-ee40-4df2-89cc-d3f6292c5971/Users/635cdb2f-e72c-4122-bfd3-3aa6c7f02f96"
+        }
+      ],
+      "meta": {
+        "resourceType": "Group",
+        "location": "https://api.atlassian.com/scim/directory/bcdde508-ee40-4df2-89cc-d3f6292c5971/Groups/e18da5e4-ba2e-4039-9046-30000af6c0b7",
+        "lastModified": "2021-04-20T05:17:25.107602Z",
+        "created": "2021-04-20T04:54:27.04421Z"
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/admin/organization.go b/admin/organization.go
index 4715aea..1a34cb1 100644
--- a/admin/organization.go
+++ b/admin/organization.go
@@ -19,7 +19,7 @@ type OrganizationService struct {
 // 1. ctx = it's the context.context value
 // 2. cursor = the next pagination result, The cursor is not a number that you can increment through predictably.
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-get
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/organization#get-organizations
 func (o *OrganizationService) Gets(ctx context.Context, cursor string) (result *OrganizationPageScheme, response *Response, err error) {
 
 	var endpoint string
@@ -53,7 +53,7 @@ func (o *OrganizationService) Gets(ctx context.Context, cursor string) (result *
 // 1. ctx = it's the context.context value
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-get
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/organization#get-an-organization-by-id
 func (o *OrganizationService) Get(ctx context.Context, organizationID string) (result *OrganizationScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -83,54 +83,45 @@ func (o *OrganizationService) Get(ctx context.Context, organizationID string) (r
 }
 
 type OrganizationPageScheme struct {
-	Data []struct {
-		ID         string `json:"id"`
-		Type       string `json:"type"`
-		Attributes struct {
-			Name string `json:"name"`
-		} `json:"attributes"`
-		Relationships struct {
-			Domains struct {
-				Links struct {
-					Related string `json:"related"`
-				} `json:"links"`
-			} `json:"domains"`
-			Users struct {
-				Links struct {
-					Related string `json:"related"`
-				} `json:"links"`
-			} `json:"users"`
-		} `json:"relationships"`
-		Links struct {
-			Self string `json:"self"`
-		} `json:"links"`
-	} `json:"data"`
+	Data  []*OrganizationModelScheme `json:"data,omitempty"`
+	Links *LinkPageModelScheme       `json:"links,omitempty"`
+}
+
+type LinkPageModelScheme struct {
+	Self string `json:"self,omitempty"`
+	Prev string `json:"prev,omitempty"`
+	Next string `json:"next,omitempty"`
+}
+
+type OrganizationModelScheme struct {
+	ID            string                          `json:"id,omitempty"`
+	Type          string                          `json:"type,omitempty"`
+	Attributes    *OrganizationModelAttribute     `json:"attributes,omitempty"`
+	Relationships *OrganizationModelRelationships `json:"relationships,omitempty"`
+	Links         *LinkSelfModelScheme            `json:"links,omitempty"`
+}
+
+type OrganizationModelAttribute struct {
+	Name string `json:"name,omitempty"`
+}
+
+type OrganizationModelRelationships struct {
+	Domains *OrganizationModelSchemes `json:"domains,omitempty"`
+	Users   *OrganizationModelSchemes `json:"users,omitempty"`
+}
+
+type OrganizationModelSchemes struct {
 	Links struct {
-		Self string `json:"self"`
-		Prev string `json:"prev"`
-		Next string `json:"next"`
-	} `json:"links"`
+		Related string `json:"related,omitempty"`
+	} `json:"links,omitempty"`
+}
+
+type LinkSelfModelScheme struct {
+	Self string `json:"self,omitempty"`
 }
 
 type OrganizationScheme struct {
-	Data struct {
-		ID         string `json:"id"`
-		Type       string `json:"type"`
-		Attributes struct {
-			Name string `json:"name"`
-		} `json:"attributes"`
-		Links struct {
-			Self string `json:"self"`
-		} `json:"links"`
-		Relationships struct {
-			Domains struct {
-				Related string `json:"related"`
-			} `json:"domains"`
-			Users struct {
-				Related string `json:"related"`
-			} `json:"users"`
-		} `json:"relationships"`
-	} `json:"data"`
+	Data *OrganizationModelScheme `json:"data,omitempty"`
 }
 
 // Returns a list of users in an organization, this func needs the following parameters:
@@ -138,7 +129,7 @@ type OrganizationScheme struct {
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // 3. cursor = the next pagination result, The cursor is not a number that you can increment through predictably.
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-users-get
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/organization#get-users-in-an-organization
 func (o *OrganizationService) Users(ctx context.Context, organizationID, cursor string) (result *OrganizationUserPageScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -173,33 +164,31 @@ func (o *OrganizationService) Users(ctx context.Context, organizationID, cursor
 }
 
 type OrganizationUserPageScheme struct {
-	Data []struct {
-		AccountID      string `json:"account_id"`
-		AccountType    string `json:"account_type"`
-		AccountStatus  string `json:"account_status"`
-		Name           string `json:"name"`
-		Picture        string `json:"picture"`
-		Email          string `json:"email"`
-		AccessBillable bool   `json:"access_billable"`
-		LastActive     string `json:"last_active"`
-		ProductAccess  []struct {
-			Key        string `json:"key"`
-			Name       string `json:"name"`
-			URL        string `json:"url"`
-			LastActive string `json:"last_active"`
-		} `json:"product_access"`
-		Links struct {
-			Self string `json:"self"`
-		} `json:"links"`
-	} `json:"data"`
-	Meta struct {
-		Total int `json:"total"`
-	} `json:"meta"`
-	Links struct {
-		Self string `json:"self"`
-		Prev string `json:"prev"`
-		Next string `json:"next"`
-	} `json:"links"`
+	Data  []*OrganizationUserScheme `json:"data,omitempty"`
+	Links *LinkPageModelScheme      `json:"links,omitempty"`
+	Meta  struct {
+		Total int `json:"total,omitempty"`
+	} `json:"meta,omitempty"`
+}
+
+type OrganizationUserScheme struct {
+	AccountID      string                           `json:"account_id,omitempty"`
+	AccountType    string                           `json:"account_type,omitempty"`
+	AccountStatus  string                           `json:"account_status,omitempty"`
+	Name           string                           `json:"name,omitempty"`
+	Picture        string                           `json:"picture,omitempty"`
+	Email          string                           `json:"email,omitempty"`
+	AccessBillable bool                             `json:"access_billable,omitempty"`
+	LastActive     string                           `json:"last_active,omitempty"`
+	ProductAccess  []*OrganizationUserProductScheme `json:"product_access,omitempty"`
+	Links          *LinkSelfModelScheme             `json:"links,omitempty"`
+}
+
+type OrganizationUserProductScheme struct {
+	Key        string `json:"key,omitempty"`
+	Name       string `json:"name,omitempty"`
+	URL        string `json:"url,omitempty"`
+	LastActive string `json:"last_active,omitempty"`
 }
 
 // Returns a list of domains in an organization one page at a time, this func needs the following parameters:
@@ -207,7 +196,7 @@ type OrganizationUserPageScheme struct {
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // 3. cursor = the next pagination result, The cursor is not a number that you can increment through predictably.
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-domains-get
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/organization#get-domains-in-an-organization
 func (o *OrganizationService) Domains(ctx context.Context, organizationID, cursor string) (result *OrganizationDomainPageScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -242,25 +231,21 @@ func (o *OrganizationService) Domains(ctx context.Context, organizationID, curso
 }
 
 type OrganizationDomainPageScheme struct {
-	Data []struct {
-		ID         string `json:"id"`
-		Type       string `json:"type"`
-		Attributes struct {
-			Name  string `json:"name"`
-			Claim struct {
-				Type   string `json:"type"`
-				Status string `json:"status"`
-			} `json:"claim"`
-		} `json:"attributes"`
-		Links struct {
-			Self string `json:"self"`
-		} `json:"links"`
-	} `json:"data"`
-	Links struct {
-		Self string `json:"self"`
-		Prev string `json:"prev"`
-		Next string `json:"next"`
-	} `json:"links"`
+	Data  []*OrganizationDomainModelScheme `json:"data,omitempty"`
+	Links *LinkPageModelScheme             `json:"links,omitempty"`
+}
+
+type OrganizationDomainModelScheme struct {
+	ID         string `json:"id,omitempty"`
+	Type       string `json:"type,omitempty"`
+	Attributes struct {
+		Name  string `json:"name,omitempty"`
+		Claim struct {
+			Type   string `json:"type,omitempty"`
+			Status string `json:"status,omitempty"`
+		} `json:"claim,omitempty"`
+	} `json:"attributes,omitempty"`
+	Links *LinkSelfModelScheme `json:"links,omitempty"`
 }
 
 // Returns information about a single verified domain by ID, this func needs the following parameters:
@@ -268,7 +253,7 @@ type OrganizationDomainPageScheme struct {
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // 3. domainID = ID of the domain to return (REQUIRED)
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-domains-domainid-get
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/organization#get-domain-by-id
 func (o *OrganizationService) Domain(ctx context.Context, organizationID, domainID string) (result *OrganizationDomainScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -331,6 +316,7 @@ type OrganizationEventOptScheme struct {
 // 3. opts = the Event options
 // 4. cursor = the next pagination result, The cursor is not a number that you can increment through predictably.
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-events-get
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/organization#get-an-audit-log-of-events
 func (o *OrganizationService) Events(ctx context.Context, organizationID string, opts *OrganizationEventOptScheme, cursor string) (result *OrganizationEventPageScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -392,63 +378,55 @@ func (o *OrganizationService) Events(ctx context.Context, organizationID string,
 }
 
 type OrganizationEventPageScheme struct {
-	Data []struct {
-		ID         string `json:"id"`
-		Type       string `json:"type"`
-		Attributes struct {
-			Time   string `json:"time"`
-			Action string `json:"action"`
-			Actor  struct {
-				ID    string `json:"id"`
-				Name  string `json:"name"`
-				Links struct {
-					Self string `json:"self"`
-				} `json:"links"`
-			} `json:"actor"`
-			Context []struct {
-				ID         string `json:"id"`
-				Type       string `json:"type"`
-				Attributes struct {
-				} `json:"attributes"`
-				Links struct {
-					Self string `json:"self"`
-					Alt  string `json:"alt"`
-				} `json:"links"`
-			} `json:"context"`
-			Container []struct {
-				ID         string `json:"id"`
-				Type       string `json:"type"`
-				Attributes struct {
-				} `json:"attributes"`
-				Links struct {
-					Self string `json:"self"`
-					Alt  string `json:"alt"`
-				} `json:"links"`
-			} `json:"container"`
-			Location struct {
-				IP  string `json:"ip"`
-				Geo string `json:"geo"`
-			} `json:"location"`
-		} `json:"attributes"`
-		Links struct {
-			Self string `json:"self"`
-		} `json:"links"`
-	} `json:"data"`
-	Meta struct {
-		Next     string `json:"next"`
-		PageSize int    `json:"page_size"`
-	} `json:"meta"`
+	Data  []*OrganizationEventModelScheme `json:"data,omitempty"`
+	Links *LinkPageModelScheme            `json:"links,omitempty"`
+	Meta  struct {
+		Next     string `json:"next,omitempty"`
+		PageSize int    `json:"page_size,omitempty"`
+	} `json:"meta,omitempty"`
+}
+
+type OrganizationEventModelScheme struct {
+	ID         string                                  `json:"id,omitempty"`
+	Type       string                                  `json:"type,omitempty"`
+	Attributes *OrganizationEventModelAttributesScheme `json:"attributes,omitempty"`
+	Links      *LinkSelfModelScheme                    `json:"links,omitempty"`
+}
+
+type OrganizationEventModelAttributesScheme struct {
+	Time      string                          `json:"time,omitempty"`
+	Action    string                          `json:"action,omitempty"`
+	Actor     *OrganizationEventActorModel    `json:"actor,omitempty"`
+	Context   []*OrganizationEventObjectModel `json:"context,omitempty"`
+	Container []*OrganizationEventObjectModel `json:"container,omitempty"`
+	Location  *OrganizationEventLocationModel `json:"location,omitempty"`
+}
+
+type OrganizationEventActorModel struct {
+	ID    string               `json:"id,omitempty"`
+	Name  string               `json:"name,omitempty"`
+	Links *LinkSelfModelScheme `json:"links,omitempty"`
+}
+
+type OrganizationEventObjectModel struct {
+	ID    string `json:"id,omitempty"`
+	Type  string `json:"type,omitempty"`
 	Links struct {
-		Self string `json:"self"`
-		Prev string `json:"prev"`
-		Next string `json:"next"`
-	} `json:"links"`
+		Self string `json:"self,omitempty"`
+		Alt  string `json:"alt,omitempty"`
+	} `json:"links,omitempty"`
+}
+
+type OrganizationEventLocationModel struct {
+	IP  string `json:"ip,omitempty"`
+	Geo string `json:"geo,omitempty"`
 }
 
 // Returns information about a single event by ID.
 // 1. ctx = it's the context.context value
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // 3. eventID = ID of the event to return (REQUIRED)
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/organization#get-an-event-by-id
 func (o *OrganizationService) Event(ctx context.Context, organizationID, eventID string) (result *OrganizationEventScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -482,55 +460,14 @@ func (o *OrganizationService) Event(ctx context.Context, organizationID, eventID
 }
 
 type OrganizationEventScheme struct {
-	Data struct {
-		ID         string `json:"id"`
-		Type       string `json:"type"`
-		Attributes struct {
-			Time   string `json:"time"`
-			Action string `json:"action"`
-			Actor  struct {
-				ID    string `json:"id"`
-				Name  string `json:"name"`
-				Links struct {
-					Self string `json:"self"`
-				} `json:"links"`
-			} `json:"actor"`
-			Context []struct {
-				ID         string `json:"id"`
-				Type       string `json:"type"`
-				Attributes struct {
-				} `json:"attributes"`
-				Links struct {
-					Self string `json:"self"`
-					Alt  string `json:"alt"`
-				} `json:"links"`
-			} `json:"context"`
-			Container []struct {
-				ID         string `json:"id"`
-				Type       string `json:"type"`
-				Attributes struct {
-				} `json:"attributes"`
-				Links struct {
-					Self string `json:"self"`
-					Alt  string `json:"alt"`
-				} `json:"links"`
-			} `json:"container"`
-			Location struct {
-				IP  string `json:"ip"`
-				Geo string `json:"geo"`
-			} `json:"location"`
-		} `json:"attributes"`
-		Links struct {
-			Self string `json:"self"`
-		} `json:"links"`
-	} `json:"data"`
+	Data *OrganizationEventModelScheme `json:"data,omitempty"`
 }
 
 // Returns information localized event actions
 // 1. ctx = it's the context.context value
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-event-actions-get
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/organization#get-list-of-event-actions
 func (o *OrganizationService) Actions(ctx context.Context, organizationID string) (result *OrganizationEventActionScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -560,12 +497,16 @@ func (o *OrganizationService) Actions(ctx context.Context, organizationID string
 }
 
 type OrganizationEventActionScheme struct {
-	Data []struct {
-		ID         string `json:"id"`
-		Type       string `json:"type"`
-		Attributes struct {
-			DisplayName      string `json:"displayName"`
-			GroupDisplayName string `json:"groupDisplayName"`
-		} `json:"attributes"`
-	} `json:"data"`
+	Data []*OrganizationEventActionModelScheme `json:"data,omitempty"`
+}
+
+type OrganizationEventActionModelScheme struct {
+	ID         string                                        `json:"id,omitempty"`
+	Type       string                                        `json:"type,omitempty"`
+	Attributes *OrganizationEventActionModelAttributesScheme `json:"attributes,omitempty"`
+}
+
+type OrganizationEventActionModelAttributesScheme struct {
+	DisplayName      string `json:"displayName,omitempty"`
+	GroupDisplayName string `json:"groupDisplayName,omitempty"`
 }
diff --git a/admin/organizationPolicy.go b/admin/organizationPolicy.go
index 9748e19..af1317a 100644
--- a/admin/organizationPolicy.go
+++ b/admin/organizationPolicy.go
@@ -10,8 +10,7 @@ import (
 )
 
 type OrganizationPolicyService struct {
-	client   *Client
-	Resource *OrganizationPolicyResourceService
+	client *Client
 }
 
 // Returns information about org policies, this func needs the following parameters:
@@ -20,7 +19,7 @@ type OrganizationPolicyService struct {
 // 3. policyType = Sets the type for the page of policies to return.
 // 3. cursor = the next pagination result, The cursor is not a number that you can increment through predictably.
 // Atlassian Docs: Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-policies-get
-// Library Docs: N/A
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/organization/policy#get-list-of-policies
 func (o *OrganizationPolicyService) Gets(ctx context.Context, organizationID, policyType, cursor string) (result *OrganizationPolicyPageScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -64,16 +63,12 @@ func (o *OrganizationPolicyService) Gets(ctx context.Context, organizationID, po
 }
 
 type OrganizationPolicyPageScheme struct {
-	Data []*OrganizationPolicyData `json:"data"`
-	Meta struct {
+	Data  []*OrganizationPolicyData `json:"data"`
+	Links *LinkPageModelScheme      `json:"links"`
+	Meta  struct {
 		Next     string `json:"next"`
 		PageSize int    `json:"page_size"`
 	} `json:"meta"`
-	Links struct {
-		Self string `json:"self"`
-		Prev string `json:"prev"`
-		Next string `json:"next"`
-	} `json:"links"`
 }
 
 // Returns information about a single policy by ID, this func needs the following parameters:
@@ -81,7 +76,7 @@ type OrganizationPolicyPageScheme struct {
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // 2. policyID = ID of the policy to query (REQUIRED)
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-policies-policyid-get
-// Example Library: N/A
+// Example Library: https://docs.go-atlassian.io/atlassian-admin-cloud/organization/policy#get-a-policy-by-id
 func (o *OrganizationPolicyService) Get(ctx context.Context, organizationID, policyID string) (result *OrganizationPolicyScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -140,7 +135,7 @@ type OrganizationPolicyData struct {
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // 2. payload = PolicyCreateModel (REQUIRED)
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-policies-post
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/organization/policy#create-a-policy
 func (o *OrganizationPolicyService) Create(ctx context.Context, organizationID string, payload *OrganizationPolicyData) (result *OrganizationPolicyScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -180,6 +175,7 @@ func (o *OrganizationPolicyService) Create(ctx context.Context, organizationID s
 // 3. payload = PolicyCreateModel (REQUIRED)
 // 4. policyID = ID of the policy to update (REQUIRED)
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-policies-policyid-put
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/organization/policy#update-a-policy
 func (o *OrganizationPolicyService) Update(ctx context.Context, organizationID, policyID string, payload *OrganizationPolicyData) (result *OrganizationPolicyScheme, response *Response, err error) {
 
 	if len(organizationID) == 0 {
@@ -222,6 +218,7 @@ func (o *OrganizationPolicyService) Update(ctx context.Context, organizationID,
 // 2. organizationID = ID of the organization to return (REQUIRED)
 // 3. policyID = ID of the policy to update (REQUIRED)
 // Official Docs: https://developer.atlassian.com/cloud/admin/organization/rest/api-group-orgs/#api-orgs-orgid-policies-policyid-delete
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/organization/policy#delete-a-policy
 func (o *OrganizationPolicyService) Delete(ctx context.Context, organizationID, policyID string) (response *Response, err error) {
 
 	if len(organizationID) == 0 {
diff --git a/admin/organizationPolicyResource.go b/admin/organizationPolicyResource.go
deleted file mode 100644
index c69d691..0000000
--- a/admin/organizationPolicyResource.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package admin
-
-type OrganizationPolicyResourceService struct{ client *Client }
diff --git a/admin/scim.go b/admin/scim.go
index ba0545e..c35d9aa 100644
--- a/admin/scim.go
+++ b/admin/scim.go
@@ -1,9 +1,8 @@
 package admin
 
 type SCIMService struct {
-	client   *Client
-	User     *SCIMUserService
-	Group    *SCIMGroupService
-	Scheme   *SCIMSchemeService
-	Resource *SCIMResourceService
+	client *Client
+	User   *SCIMUserService
+	Group  *SCIMGroupService
+	Scheme *SCIMSchemeService
 }
diff --git a/admin/scimGroup.go b/admin/scimGroup.go
index 0deebac..6824919 100644
--- a/admin/scimGroup.go
+++ b/admin/scimGroup.go
@@ -1,3 +1,281 @@
 package admin
 
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"net/url"
+	"strconv"
+)
+
 type SCIMGroupService struct{ client *Client }
+
+// Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/groups#get-groups
+func (g *SCIMGroupService) Gets(ctx context.Context, directoryID, filter string, startAt, maxResults int) (result *ScimGroupPageScheme, response *Response, err error) {
+
+	if directoryID == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid directoryID value")
+	}
+
+	params := url.Values{}
+	params.Add("startIndex", strconv.Itoa(startAt))
+	params.Add("count", strconv.Itoa(maxResults))
+
+	if filter != "" {
+		params.Add("filter", filter)
+	}
+
+	var endpoint = fmt.Sprintf("/scim/directory/%v/Groups?%v", directoryID, params.Encode())
+
+	request, err := g.client.newRequest(ctx, http.MethodGet, endpoint, nil)
+	if err != nil {
+		return
+	}
+
+	request.Header.Set("Accept", "application/json")
+
+	response, err = g.client.Do(request)
+	if err != nil {
+		return
+	}
+
+	result = new(ScimGroupPageScheme)
+	if err = json.Unmarshal(response.BodyAsBytes, &result); err != nil {
+		return
+	}
+
+	return
+}
+
+// Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/groups#get-a-group-by-id
+func (g *SCIMGroupService) Get(ctx context.Context, directoryID, groupID string) (result *ScimGroupScheme, response *Response, err error) {
+
+	if directoryID == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid directoryID value")
+	}
+
+	if groupID == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid groupID value")
+	}
+
+	var endpoint = fmt.Sprintf("/scim/directory/%v/Groups/%v", directoryID, groupID)
+
+	request, err := g.client.newRequest(ctx, http.MethodGet, endpoint, nil)
+	if err != nil {
+		return
+	}
+
+	request.Header.Set("Accept", "application/json")
+
+	response, err = g.client.Do(request)
+	if err != nil {
+		return
+	}
+
+	result = new(ScimGroupScheme)
+	if err = json.Unmarshal(response.BodyAsBytes, &result); err != nil {
+		return
+	}
+
+	return
+}
+
+// Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/groups#update-a-group-by-id
+func (g *SCIMGroupService) Update(ctx context.Context, directoryID, groupID string, newGroupName string) (result *ScimGroupScheme, response *Response, err error) {
+
+	if directoryID == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid directoryID value")
+	}
+
+	if groupID == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid groupID value")
+	}
+
+	if newGroupName == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid newGroupName value")
+	}
+
+	var endpoint = fmt.Sprintf("/scim/directory/%v/Groups/%v", directoryID, groupID)
+
+	payload := struct {
+		DisplayName string `json:"displayName"`
+	}{
+		DisplayName: newGroupName,
+	}
+
+	request, err := g.client.newRequest(ctx, http.MethodPut, endpoint, payload)
+	if err != nil {
+		return
+	}
+
+	request.Header.Set("Accept", "application/json")
+	request.Header.Set("Content-Type", "application/scim+json")
+
+	response, err = g.client.Do(request)
+	if err != nil {
+		return
+	}
+
+	result = new(ScimGroupScheme)
+	if err = json.Unmarshal(response.BodyAsBytes, &result); err != nil {
+		return
+	}
+
+	return
+}
+
+// Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/groups#delete-a-group-by-id
+func (g *SCIMGroupService) Delete(ctx context.Context, directoryID, groupID string) (response *Response, err error) {
+
+	if directoryID == "" {
+		return nil, fmt.Errorf("error!, please provide a valid directoryID value")
+	}
+
+	if groupID == "" {
+		return nil, fmt.Errorf("error!, please provide a valid groupID value")
+	}
+
+	var endpoint = fmt.Sprintf("/scim/directory/%v/Groups/%v", directoryID, groupID)
+
+	request, err := g.client.newRequest(ctx, http.MethodDelete, endpoint, nil)
+	if err != nil {
+		return
+	}
+
+	response, err = g.client.Do(request)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/groups#create-a-group
+func (g *SCIMGroupService) Create(ctx context.Context, directoryID, groupName string) (result *ScimGroupScheme, response *Response, err error) {
+
+	if directoryID == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid directoryID value")
+	}
+
+	if groupName == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid groupName value")
+	}
+
+	payload := struct {
+		DisplayName string `json:"displayName"`
+	}{
+		DisplayName: groupName,
+	}
+
+	var endpoint = fmt.Sprintf("/scim/directory/%v/Groups", directoryID)
+
+	request, err := g.client.newRequest(ctx, http.MethodPost, endpoint, payload)
+	if err != nil {
+		return
+	}
+
+	request.Header.Set("Accept", "application/json")
+	request.Header.Set("Content-Type", "application/scim+json")
+
+	response, err = g.client.Do(request)
+	if err != nil {
+		return
+	}
+
+	result = new(ScimGroupScheme)
+	if err = json.Unmarshal(response.BodyAsBytes, &result); err != nil {
+		return
+	}
+
+	return
+}
+
+// Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/groups#update-a-group-by-id-patch
+func (g *SCIMGroupService) Path(ctx context.Context, directoryID, groupID string, payload *SCIMGroupPathScheme) (result *ScimGroupScheme, response *Response, err error) {
+
+	if directoryID == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid directoryID value")
+	}
+
+	if groupID == "" {
+		return nil, nil, fmt.Errorf("error!, please provide a valid groupID value")
+	}
+
+	if payload == nil {
+		return nil, nil, fmt.Errorf("erro!, please provide a SCIMGroupPathScheme pointer")
+	}
+
+	if len(payload.Operations) == 0 {
+		return nil, nil, fmt.Errorf("erro!, the SCIMGroupPathScheme value must contains operations")
+	}
+
+	var endpoint = fmt.Sprintf("/scim/directory/%v/Groups/%v", directoryID, groupID)
+
+	request, err := g.client.newRequest(ctx, http.MethodPatch, endpoint, payload)
+	if err != nil {
+		return
+	}
+
+	request.Header.Set("Accept", "application/json")
+	request.Header.Set("Content-Type", "application/scim+json")
+
+	response, err = g.client.Do(request)
+	if err != nil {
+		return
+	}
+
+	result = new(ScimGroupScheme)
+	if err = json.Unmarshal(response.BodyAsBytes, &result); err != nil {
+		return
+	}
+
+	return
+}
+
+type SCIMGroupPathScheme struct {
+	Schemas    []string                    `json:"schemas,omitempty"`
+	Operations []*SCIMGroupOperationScheme `json:"Operations,omitempty"`
+}
+
+type SCIMGroupOperationScheme struct {
+	Op    string                           `json:"op,omitempty"`
+	Path  string                           `json:"path,omitempty"`
+	Value []*SCIMGroupOperationValueScheme `json:"value,omitempty"`
+}
+
+type SCIMGroupOperationValueScheme struct {
+	Value   string `json:"value,omitempty"`
+	Display string `json:"display,omitempty"`
+}
+
+type ScimGroupPageScheme struct {
+	Schemas      []string           `json:"schemas,omitempty"`
+	TotalResults int                `json:"totalResults,omitempty"`
+	StartIndex   int                `json:"startIndex,omitempty"`
+	ItemsPerPage int                `json:"itemsPerPage,omitempty"`
+	Resources    []*ScimGroupScheme `json:"Resources,omitempty"`
+}
+
+type ScimGroupScheme struct {
+	Schemas     []string                 `json:"schemas,omitempty"`
+	ID          string                   `json:"id,omitempty"`
+	ExternalID  string                   `json:"externalId,omitempty"`
+	DisplayName string                   `json:"displayName,omitempty"`
+	Members     []*ScimGroupMemberScheme `json:"members,omitempty"`
+	Meta        *ScimMetadata            `json:"meta,omitempty"`
+}
+
+type ScimGroupMemberScheme struct {
+	Type    string `json:"type,omitempty"`
+	Value   string `json:"value,omitempty"`
+	Display string `json:"display,omitempty"`
+	Ref     string `json:"$ref,omitempty"`
+}
+
+type ScimMetadata struct {
+	ResourceType string `json:"resourceType,omitempty"`
+	Location     string `json:"location,omitempty"`
+	LastModified string `json:"lastModified,omitempty"`
+	Created      string `json:"created,omitempty"`
+}
diff --git a/admin/scimResource.go b/admin/scimResource.go
deleted file mode 100644
index f372624..0000000
--- a/admin/scimResource.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package admin
-
-type SCIMResourceService struct{ client *Client }
diff --git a/admin/scimScheme.go b/admin/scimScheme.go
index afd0eb6..512d70b 100644
--- a/admin/scimScheme.go
+++ b/admin/scimScheme.go
@@ -44,41 +44,49 @@ func (s *SCIMSchemeService) Gets(ctx context.Context, directoryID string) (resul
 }
 
 type SCIMSchemasScheme struct {
-	TotalResults int      `json:"totalResults"`
-	ItemsPerPage int      `json:"itemsPerPage"`
-	StartIndex   int      `json:"startIndex"`
-	Schemas      []string `json:"schemas"`
-	Resources    []struct {
-		ID          string `json:"id"`
-		Name        string `json:"name"`
-		Description string `json:"description"`
-		Attributes  []struct {
-			Name          string `json:"name"`
-			Type          string `json:"type"`
-			MultiValued   bool   `json:"multiValued"`
-			Description   string `json:"description"`
-			Required      bool   `json:"required"`
-			CaseExact     bool   `json:"caseExact,omitempty"`
-			Mutability    string `json:"mutability"`
-			Returned      string `json:"returned"`
-			Uniqueness    string `json:"uniqueness,omitempty"`
-			SubAttributes []struct {
-				Name        string `json:"name"`
-				Type        string `json:"type"`
-				MultiValued bool   `json:"multiValued"`
-				Description string `json:"description"`
-				Required    bool   `json:"required"`
-				CaseExact   bool   `json:"caseExact"`
-				Mutability  string `json:"mutability"`
-				Returned    string `json:"returned"`
-				Uniqueness  string `json:"uniqueness"`
-			} `json:"subAttributes,omitempty"`
-		} `json:"attributes"`
-		Meta struct {
-			ResourceType string `json:"resourceType"`
-			Location     string `json:"location"`
-		} `json:"meta"`
-	} `json:"Resources"`
+	TotalResults int               `json:"totalResults,omitempty"`
+	ItemsPerPage int               `json:"itemsPerPage,omitempty"`
+	StartIndex   int               `json:"startIndex,omitempty"`
+	Schemas      []string          `json:"schemas,omitempty"`
+	Resources    []*ResourceScheme `json:"Resources,omitempty"`
+}
+
+type ResourceScheme struct {
+	ID          string              `json:"id,omitempty"`
+	Name        string              `json:"name,omitempty"`
+	Description string              `json:"description,omitempty"`
+	Attributes  []*AttributeScheme  `json:"attributes,omitempty"`
+	Meta        *ResourceMetaScheme `json:"meta,omitempty"`
+}
+
+type ResourceMetaScheme struct {
+	ResourceType string `json:"resourceType,omitempty"`
+	Location     string `json:"location,omitempty"`
+}
+
+type AttributeScheme struct {
+	Name          string                `json:"name,omitempty"`
+	Type          string                `json:"type,omitempty"`
+	MultiValued   bool                  `json:"multiValued,omitempty"`
+	Description   string                `json:"description,omitempty"`
+	Required      bool                  `json:"required,omitempty"`
+	CaseExact     bool                  `json:"caseExact,omitempty"`
+	Mutability    string                `json:"mutability,omitempty"`
+	Returned      string                `json:"returned,omitempty"`
+	Uniqueness    string                `json:"uniqueness,omitempty"`
+	SubAttributes []*SubAttributeScheme `json:"subAttributes,omitempty"`
+}
+
+type SubAttributeScheme struct {
+	Name        string `json:"name,omitempty"`
+	Type        string `json:"type,omitempty"`
+	MultiValued bool   `json:"multiValued,omitempty"`
+	Description string `json:"description,omitempty"`
+	Required    bool   `json:"required,omitempty"`
+	CaseExact   bool   `json:"caseExact,omitempty"`
+	Mutability  string `json:"mutability,omitempty"`
+	Returned    string `json:"returned,omitempty"`
+	Uniqueness  string `json:"uniqueness,omitempty"`
 }
 
 // Get the group schemas from the SCIM provider. Filtering, pagination and sorting are not supported.
@@ -181,35 +189,11 @@ func (s *SCIMSchemeService) Enterprise(ctx context.Context, directoryID string)
 }
 
 type SCIMSchemaScheme struct {
-	ID          string `json:"id"`
-	Name        string `json:"name"`
-	Description string `json:"description"`
-	Attributes  []struct {
-		Name          string `json:"name"`
-		Type          string `json:"type"`
-		MultiValued   bool   `json:"multiValued"`
-		Description   string `json:"description"`
-		Required      bool   `json:"required"`
-		CaseExact     bool   `json:"caseExact,omitempty"`
-		Mutability    string `json:"mutability"`
-		Returned      string `json:"returned"`
-		Uniqueness    string `json:"uniqueness,omitempty"`
-		SubAttributes []struct {
-			Name        string `json:"name"`
-			Type        string `json:"type"`
-			MultiValued bool   `json:"multiValued"`
-			Description string `json:"description"`
-			Required    bool   `json:"required"`
-			CaseExact   bool   `json:"caseExact"`
-			Mutability  string `json:"mutability"`
-			Returned    string `json:"returned"`
-			Uniqueness  string `json:"uniqueness"`
-		} `json:"subAttributes,omitempty"`
-	} `json:"attributes"`
-	Meta struct {
-		ResourceType string `json:"resourceType"`
-		Location     string `json:"location"`
-	} `json:"meta"`
+	ID          string              `json:"id,omitempty"`
+	Name        string              `json:"name,omitempty"`
+	Description string              `json:"description,omitempty"`
+	Attributes  []*AttributeScheme  `json:"attributes,omitempty"`
+	Meta        *ResourceMetaScheme `json:"meta,omitempty"`
 }
 
 // Get metadata about the supported SCIM features.
diff --git a/admin/scimUser.go b/admin/scimUser.go
index 291b460..fcf8b05 100644
--- a/admin/scimUser.go
+++ b/admin/scimUser.go
@@ -23,7 +23,7 @@ type SCIMUserService struct{ client *Client }
 // 4. attributes = Resource attributes to be included in response
 // 5. excludedAttributes = Resource attributes to be excluded from response
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-provisioning/rest/api-group-users/#api-scim-directory-directoryid-users-post
-// Library Docs: N/A
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/users#create-a-user
 func (s *SCIMUserService) Create(ctx context.Context, directoryID string, payload *SCIMUserScheme, attributes, excludedAttributes []string) (result *SCIMUserScheme, response *Response, err error) {
 
 	if len(directoryID) == 0 {
@@ -114,11 +114,13 @@ type SCIMUserScheme struct {
 	EnterpriseInfo    *SCIMEnterpriseUserInfoScheme `json:"urn:ietf:params:scim:schemas:extension:enterprise:2.1:User,omitempty"`
 	SCIMExtension     *SCIMExtensionScheme          `json:"urn:scim:schemas:extension:atlassian-external:1.1,omitempty"`
 }
+
 type SCIMUserEmailScheme struct {
 	Value   string `json:"value,omitempty"`
 	Type    string `json:"type,omitempty"`
 	Primary bool   `json:"primary,omitempty"`
 }
+
 type SCIMUserNameScheme struct {
 	Formatted       string `json:"formatted,omitempty"`
 	FamilyName      string `json:"familyName,omitempty"`
@@ -127,27 +129,32 @@ type SCIMUserNameScheme struct {
 	HonorificPrefix string `json:"honorificPrefix,omitempty"`
 	HonorificSuffix string `json:"honorificSuffix,omitempty"`
 }
+
 type SCIMUserPhoneNumberScheme struct {
 	Value   string `json:"value,omitempty"`
 	Type    string `json:"type,omitempty"`
 	Primary bool   `json:"primary,omitempty"`
 }
+
 type SCIMUserMetaScheme struct {
 	ResourceType string `json:"resourceType,omitempty"`
 	Location     string `json:"location,omitempty"`
 	LastModified string `json:"lastModified,omitempty"`
 	Created      string `json:"created,omitempty"`
 }
+
 type SCIMUserGroupScheme struct {
 	Type    string `json:"type,omitempty"`
 	Value   string `json:"value,omitempty"`
 	Display string `json:"display,omitempty"`
 	Ref     string `json:"$ref,omitempty"`
 }
+
 type SCIMEnterpriseUserInfoScheme struct {
 	Organization string `json:"organization,omitempty"`
 	Department   string `json:"department,omitempty"`
 }
+
 type SCIMExtensionScheme struct {
 	AtlassianAccountID string `json:"atlassianAccountId,omitempty"`
 }
@@ -166,7 +173,7 @@ type SCIMUserGetsOptionsScheme struct {
 // 4. startIndex = A 1-based index of the first query result.
 // 5. count = Desired maximum number of query results in the list response page.
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-provisioning/rest/api-group-users/#api-scim-directory-directoryid-users-get
-// Library Docs: N/A
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/users#get-users
 func (s *SCIMUserService) Gets(ctx context.Context, directoryID string, opts *SCIMUserGetsOptionsScheme, startIndex, count int) (result *SCIMUserPageScheme, response *Response, err error) {
 
 	if len(directoryID) == 0 {
@@ -253,7 +260,7 @@ type SCIMUserPageScheme struct {
 // 4. attributes = Resource attributes to be included in response
 // 5. excludedAttributes = Resource attributes to be excluded from response
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-provisioning/rest/api-group-users/#api-scim-directory-directoryid-users-userid-get
-// Library Docs: N/A
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/users#get-a-user-by-id
 func (s *SCIMUserService) Get(ctx context.Context, directoryID, userID string, attributes, excludedAttributes []string) (result *SCIMUserScheme, response *Response, err error) {
 
 	if len(directoryID) == 0 {
@@ -331,7 +338,7 @@ func (s *SCIMUserService) Get(ctx context.Context, directoryID, userID string, a
 // 2. directoryId = Directory Id (REQUIRED)
 // 3. userId = The user ID (REQUIRED)
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-provisioning/rest/api-group-users/#api-scim-directory-directoryid-users-userid-delete
-// Library Docs: N/A
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/users#deactivate-a-user
 func (s *SCIMUserService) Deactivate(ctx context.Context, directoryID, userID string) (response *Response, err error) {
 
 	if len(directoryID) == 0 {
@@ -367,8 +374,8 @@ func (s *SCIMUserService) Deactivate(ctx context.Context, directoryID, userID st
 // 5. attributes = Resource attributes to be included in response.
 // 6. excludedAttributes = Resource attributes to be excluded from response.
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-provisioning/rest/api-group-users/#api-scim-directory-directoryid-users-userid-patch
-// Library Docs: N/A
-func (s *SCIMUserService) Update(ctx context.Context, directoryID, userID string, payload *SCIMUserToPathScheme, attributes, excludedAttributes []string) (result *SCIMUserScheme, response *Response, err error) {
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/users#update-user-by-id-patch
+func (s *SCIMUserService) Path(ctx context.Context, directoryID, userID string, payload *SCIMUserToPathScheme, attributes, excludedAttributes []string) (result *SCIMUserScheme, response *Response, err error) {
 
 	if len(directoryID) == 0 {
 		return nil, nil, fmt.Errorf("error!, please provide a valid directoryID value")
@@ -563,8 +570,8 @@ type SCIMUserToPathOperationScheme struct {
 // 5. attributes = Resource attributes to be included in response.
 // 6. excludedAttributes = Resource attributes to be excluded from response.
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-provisioning/rest/api-group-users/#api-scim-directory-directoryid-users-userid-put
-// Library Docs: N/A
-func (s *SCIMUserService) Overwrite(ctx context.Context, directoryID, userID string, payload *SCIMUserScheme, attributes, excludedAttributes []string) (result *SCIMUserScheme, response *Response, err error) {
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/scim/users#update-user-via-user-attributes
+func (s *SCIMUserService) Update(ctx context.Context, directoryID, userID string, payload *SCIMUserScheme, attributes, excludedAttributes []string) (result *SCIMUserScheme, response *Response, err error) {
 
 	if len(directoryID) == 0 {
 		return nil, nil, fmt.Errorf("error!, please provide a valid directoryID value")
diff --git a/admin/user.go b/admin/user.go
index bb0a61e..7e8f469 100644
--- a/admin/user.go
+++ b/admin/user.go
@@ -18,7 +18,7 @@ type UserService struct {
 // 2. accountID = The user account to manage (REQUIRED)
 // 3. privileges = the expanded privileges
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-management/rest/api-group-users/#api-users-account-id-manage-get
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/user#get-user-management-permissions
 func (u *UserService) Permissions(ctx context.Context, accountID string, privileges []string) (result *UserPermissionScheme, response *Response, err error) {
 
 	if len(accountID) == 0 {
@@ -73,7 +73,7 @@ func (u *UserService) Permissions(ctx context.Context, accountID string, privile
 // 1. ctx = it's the context.context value
 // 2. accountID = The user account to manage (REQUIRED)
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-management/rest/api-group-users/#api-users-account-id-manage-profile-get
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/user#get-profile
 func (u *UserService) Get(ctx context.Context, accountID string) (result *UserScheme, response *Response, err error) {
 
 	if len(accountID) == 0 {
@@ -249,7 +249,7 @@ type UserPermissionScheme struct {
 // 2. accountID = The user account to manage (REQUIRED)
 // 3. payload = the fields you want to update (REQUIRED)
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-management/rest/api-group-users/#api-users-account-id-manage-profile-patch
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/user#update-profile
 func (u *UserService) Update(ctx context.Context, accountID string, payload map[string]interface{}) (result *UserScheme, response *Response, err error) {
 
 	if len(accountID) == 0 {
@@ -296,7 +296,7 @@ func (u *UserService) Update(ctx context.Context, accountID string, payload map[
 // 2. accountID = The user account to manage (REQUIRED)
 // 3. message = the notification message to use
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-management/rest/api-group-users/#api-users-account-id-manage-lifecycle-disable-post
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/user#disable-a-user
 func (u *UserService) Disable(ctx context.Context, accountID, message string) (response *Response, err error) {
 
 	if len(accountID) == 0 {
@@ -345,7 +345,7 @@ func (u *UserService) Disable(ctx context.Context, accountID, message string) (r
 // 1. ctx = it's the context.context value
 // 2. accountID = The user account to manage (REQUIRED)
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-management/rest/api-group-users/#api-users-account-id-manage-lifecycle-enable-post
-// Library Example: N/A
+// Library Example: https://docs.go-atlassian.io/atlassian-admin-cloud/user#enable-a-user
 func (u *UserService) Enable(ctx context.Context, accountID string) (response *Response, err error) {
 
 	if len(accountID) == 0 {
diff --git a/admin/userToken.go b/admin/userToken.go
index 5490b45..5e43330 100644
--- a/admin/userToken.go
+++ b/admin/userToken.go
@@ -14,7 +14,7 @@ type UserTokenService struct{ client *Client }
 // 1. ctx = it's the context.context value
 // 2. accountID = The user account to manage (REQUIRED)
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-management/rest/api-group-users/#api-users-accountid-manage-api-tokens-get
-// Library Example: N/A
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/user/token#get-api-tokens
 func (u *UserTokenService) Gets(ctx context.Context, accountID string) (result *UserTokensScheme, response *Response, err error) {
 
 	if len(accountID) == 0 {
@@ -44,10 +44,10 @@ func (u *UserTokenService) Gets(ctx context.Context, accountID string) (result *
 }
 
 type UserTokensScheme []struct {
-	ID         string    `json:"id"`
-	Label      string    `json:"label"`
-	CreatedAt  time.Time `json:"createdAt"`
-	LastAccess time.Time `json:"lastAccess"`
+	ID         string    `json:"id,omitempty"`
+	Label      string    `json:"label,omitempty"`
+	CreatedAt  time.Time `json:"createdAt,omitempty"`
+	LastAccess time.Time `json:"lastAccess,omitempty"`
 }
 
 // Deletes a specified API token by ID, this func needs the following parameters:
@@ -55,6 +55,7 @@ type UserTokensScheme []struct {
 // 2. accountID = The user account to manage (REQUIRED)
 // 3. tokenID = The ID of the API token
 // Atlassian Docs: https://developer.atlassian.com/cloud/admin/user-management/rest/api-group-users/#api-users-accountid-manage-api-tokens-tokenid-delete
+// Library Docs: https://docs.go-atlassian.io/atlassian-admin-cloud/user/token#delete-api-token
 func (u *UserTokenService) Delete(ctx context.Context, accountID, tokenID string) (response *Response, err error) {
 
 	if len(accountID) == 0 {
diff --git a/jira/examples/issue/get/get.go b/jira/examples/issue/get/get.go
index 237acaa..e9bd467 100644
--- a/jira/examples/issue/get/get.go
+++ b/jira/examples/issue/get/get.go
@@ -22,7 +22,7 @@ func main() {
 
 	atlassian.Auth.SetBasicAuth(mail, token)
 
-	issue, response, err := atlassian.Issue.Get(context.Background(), "KP-12", []string{"status"}, []string{"transitions"})
+	issue, response, err := atlassian.Issue.Get(context.Background(), "KP-12", nil, []string{"transitions"})
 	if err != nil {
 		if response != nil {
 			log.Println("Response HTTP Response", string(response.BodyAsBytes))
@@ -33,5 +33,12 @@ func main() {
 
 	log.Println("Response HTTP Code", response.StatusCode)
 	log.Println("HTTP Endpoint Used", response.Endpoint)
-	log.Println(issue)
+
+	log.Println(issue.Key)
+	log.Println(issue.Fields.Reporter.AccountID)
+
+	for _, transition := range issue.Transitions {
+		log.Println(transition.Name, transition.ID, transition.To.ID, transition.HasScreen)
+	}
+
 }
diff --git a/jira/sm/customer.go b/jira/sm/customer.go
index 92ef508..1137758 100644
--- a/jira/sm/customer.go
+++ b/jira/sm/customer.go
@@ -16,6 +16,7 @@ type CustomerService struct{ client *Client }
 // instance by passing a JSON file including an email address and display name.
 // The display name does not need to be unique. The record's identifiers,
 // name and key, are automatically generated from the request details.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/customer#create-customer
 func (c *CustomerService) Create(ctx context.Context, email, displayName string) (result *CustomerScheme, response *Response, err error) {
 
 	if len(email) == 0 {
@@ -92,7 +93,8 @@ func isEmailValid(email string) bool {
 	return regex.MatchString(email)
 }
 
-func (c *CustomerService) Get(ctx context.Context, serviceDeskID int, query string, start, limit int) (result *CustomerPageScheme, response *Response, err error) {
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/customer#get-customers
+func (c *CustomerService) Gets(ctx context.Context, serviceDeskID int, query string, start, limit int) (result *CustomerPageScheme, response *Response, err error) {
 
 	params := url.Values{}
 	params.Add("start", strconv.Itoa(start))
@@ -130,6 +132,7 @@ func (c *CustomerService) Get(ctx context.Context, serviceDeskID int, query stri
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/customer#add-customers
 func (c *CustomerService) Add(ctx context.Context, serviceDeskID int, accountIDs []string) (response *Response, err error) {
 
 	if len(accountIDs) == 0 {
@@ -159,6 +162,7 @@ func (c *CustomerService) Add(ctx context.Context, serviceDeskID int, accountIDs
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/customer#remove-customers
 func (c *CustomerService) Remove(ctx context.Context, serviceDeskID int, accountIDs []string) (response *Response, err error) {
 
 	if len(accountIDs) == 0 {
diff --git a/jira/sm/examples/customer/get/get.go b/jira/sm/examples/customer/get/get.go
index da4d173..2b11606 100644
--- a/jira/sm/examples/customer/get/get.go
+++ b/jira/sm/examples/customer/get/get.go
@@ -30,7 +30,7 @@ func main() {
 		limit         = 50
 	)
 
-	customers, response, err := atlassian.ServiceManagement.Customer.Get(context.Background(), serviceDeskID, query, start, limit)
+	customers, response, err := atlassian.ServiceManagement.Customer.Gets(context.Background(), serviceDeskID, query, start, limit)
 	if err != nil {
 		if response != nil {
 			log.Println("Response HTTP Response", string(response.BodyAsBytes))
diff --git a/jira/sm/info.go b/jira/sm/info.go
index c6164e1..56db224 100644
--- a/jira/sm/info.go
+++ b/jira/sm/info.go
@@ -10,6 +10,7 @@ type InfoService struct{ client *Client }
 
 // This method retrieves information about the Jira Service Management instance such as software version,
 // builds, and related links.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/info#get-info
 func (i *InfoService) Get(ctx context.Context) (result *InfoScheme, response *Response, err error) {
 
 	var endpoint = "rest/servicedeskapi/info"
diff --git a/jira/sm/knowledgebase.go b/jira/sm/knowledgebase.go
index ddfe554..be1fe17 100644
--- a/jira/sm/knowledgebase.go
+++ b/jira/sm/knowledgebase.go
@@ -12,6 +12,7 @@ import (
 type KnowledgebaseService struct{ client *Client }
 
 // Returns articles which match the given query string across all service desks.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/knowledgebase#search-articles
 func (k *KnowledgebaseService) Search(ctx context.Context, query string, highlight bool, start, limit int) (result *ArticlePageScheme, response *Response, err error) {
 
 	if len(query) == 0 {
@@ -50,6 +51,7 @@ func (k *KnowledgebaseService) Search(ctx context.Context, query string, highlig
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/knowledgebase#get-articles
 func (k *KnowledgebaseService) Gets(ctx context.Context, serviceDeskID int, query string, highlight bool, start, limit int) (result *ArticlePageScheme, response *Response, err error) {
 
 	params := url.Values{}
diff --git a/jira/sm/organization.go b/jira/sm/organization.go
index d8361e3..5e1f826 100644
--- a/jira/sm/organization.go
+++ b/jira/sm/organization.go
@@ -13,6 +13,7 @@ type OrganizationService struct{ client *Client }
 
 // This method returns a list of organizations in the Jira Service Management instance.
 // Use this method when you want to present a list of organizations or want to locate an organization by name.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/organization#get-organizations
 func (o *OrganizationService) Gets(ctx context.Context, accountID string, start, limit int) (result *OrganizationPageScheme, response *Response, err error) {
 
 	params := url.Values{}
@@ -48,6 +49,7 @@ func (o *OrganizationService) Gets(ctx context.Context, accountID string, start,
 // This method returns details of an organization.
 // Use this method to get organization details whenever your application component is passed an organization ID
 // but needs to display other organization details.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/organization#get-organization
 func (o *OrganizationService) Get(ctx context.Context, organizationID int) (result *OrganizationScheme, response *Response, err error) {
 
 	var endpoint = fmt.Sprintf("rest/servicedeskapi/organization/%v", organizationID)
@@ -93,6 +95,7 @@ func (o *OrganizationService) Delete(ctx context.Context, organizationID int) (r
 }
 
 // This method creates an organization by passing the name of the organization.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/organization#create-organization
 func (o *OrganizationService) Create(ctx context.Context, name string) (result *OrganizationScheme, response *Response, err error) {
 
 	if len(name) == 0 {
@@ -129,6 +132,7 @@ func (o *OrganizationService) Create(ctx context.Context, name string) (result *
 // This method returns all the users associated with an organization.
 // Use this method where you want to provide a list of users for an
 // organization or determine if a user is associated with an organization.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/organization#get-users-in-organization
 func (o *OrganizationService) Users(ctx context.Context, organizationID, start, limit int) (result *OrganizationUsersPageScheme, response *Response, err error) {
 
 	params := url.Values{}
@@ -158,6 +162,7 @@ func (o *OrganizationService) Users(ctx context.Context, organizationID, start,
 }
 
 // This method adds users to an organization.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/organization#add-users-to-organization
 func (o *OrganizationService) Add(ctx context.Context, organizationID int, accountIDs []string) (response *Response, err error) {
 
 	if len(accountIDs) == 0 {
@@ -186,6 +191,7 @@ func (o *OrganizationService) Add(ctx context.Context, organizationID int, accou
 }
 
 // This method removes users from an organization.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/organization#remove-users-from-organization
 func (o *OrganizationService) Remove(ctx context.Context, organizationID int, accountIDs []string) (response *Response, err error) {
 
 	if len(accountIDs) == 0 {
@@ -249,6 +255,7 @@ func (o *OrganizationService) Project(ctx context.Context, accountID string, ser
 // This method adds an organization to a service desk.
 // If the organization ID is already associated with the service desk,
 // no change is made and the resource returns a 204 success code.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/organization#associate-organization
 func (o *OrganizationService) Associate(ctx context.Context, serviceDeskPortalID, organizationID int) (response *Response, err error) {
 
 	payload := struct {
@@ -275,6 +282,7 @@ func (o *OrganizationService) Associate(ctx context.Context, serviceDeskPortalID
 // This method removes an organization from a service desk.
 // If the organization ID does not match an organization associated with the service desk,
 // no change is made and the resource returns a 204 success code.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/organization#detach-organization
 func (o *OrganizationService) Detach(ctx context.Context, serviceDeskPortalID, organizationID int) (response *Response, err error) {
 
 	payload := struct {
diff --git a/jira/sm/request.go b/jira/sm/request.go
index d77ae98..fabf358 100644
--- a/jira/sm/request.go
+++ b/jira/sm/request.go
@@ -33,6 +33,7 @@ type RequestGetOptionsScheme struct {
 
 // This method returns all customer requests for the user executing the query.
 // The returned customer requests are ordered chronologically by the latest activity on each request. For example, the latest status transition or comment.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request#get-customer-requests
 func (r *RequestService) Gets(ctx context.Context, opts *RequestGetOptionsScheme, start, limit int) (result *CustomerRequestsScheme, response *Response, err error) {
 
 	params := url.Values{}
@@ -109,6 +110,7 @@ func (r *RequestService) Gets(ctx context.Context, opts *RequestGetOptionsScheme
 }
 
 // This method returns a customer request.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request#get-customer-request-by-id-or-key
 func (r *RequestService) Get(ctx context.Context, issueKeyOrID string, expands []string) (result *CustomerRequestScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -162,6 +164,7 @@ func (r *RequestService) Get(ctx context.Context, issueKeyOrID string, expands [
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request#subscribe
 func (r *RequestService) Subscribe(ctx context.Context, issueKeyOrID string) (response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -183,6 +186,7 @@ func (r *RequestService) Subscribe(ctx context.Context, issueKeyOrID string) (re
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request#unsubscribe
 func (r *RequestService) Unsubscribe(ctx context.Context, issueKeyOrID string) (response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -204,6 +208,7 @@ func (r *RequestService) Unsubscribe(ctx context.Context, issueKeyOrID string) (
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request#get-customer-transitions
 func (r *RequestService) Transitions(ctx context.Context, issueKeyOrID string, start, limit int) (result *CustomerRequestTransitionsScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -236,6 +241,7 @@ func (r *RequestService) Transitions(ctx context.Context, issueKeyOrID string, s
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request#perform-customer-transition
 func (r *RequestService) Transition(ctx context.Context, issueKeyOrID, transitionID, comment string) (response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
diff --git a/jira/sm/requestApproval.go b/jira/sm/requestApproval.go
index 8a2db61..8e4026e 100644
--- a/jira/sm/requestApproval.go
+++ b/jira/sm/requestApproval.go
@@ -11,6 +11,7 @@ import (
 
 type RequestApprovalService struct{ client *Client }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/approval#get-approvals
 func (r *RequestApprovalService) Gets(ctx context.Context, issueKeyOrID string, start, limit int) (result *CustomerApprovalsScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -43,6 +44,7 @@ func (r *RequestApprovalService) Gets(ctx context.Context, issueKeyOrID string,
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/approval#get-approval-by-id
 func (r *RequestApprovalService) Get(ctx context.Context, issueKeyOrID string, approvalID int) (result *CustomerApprovalScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -71,6 +73,7 @@ func (r *RequestApprovalService) Get(ctx context.Context, issueKeyOrID string, a
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/approval#answer-approval
 func (r *RequestApprovalService) Answer(ctx context.Context, issueKeyOrID string, approvalID int, approve bool) (result *CustomerApprovalScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
diff --git a/jira/sm/requestAttachment.go b/jira/sm/requestAttachment.go
index 75c2c8a..5acce85 100644
--- a/jira/sm/requestAttachment.go
+++ b/jira/sm/requestAttachment.go
@@ -11,6 +11,7 @@ import (
 
 type RequestAttachmentService struct{ client *Client }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/attachment#get-attachments-for-request
 func (r *RequestAttachmentService) Gets(ctx context.Context, issueKeyOrID string, start, limit int) (result *RequestAttachmentPageScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -43,6 +44,7 @@ func (r *RequestAttachmentService) Gets(ctx context.Context, issueKeyOrID string
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/attachment#create-attachment
 func (r *RequestAttachmentService) Create(ctx context.Context, issueKeyOrID string, temporaryAttachmentIDs []string, public bool) (result *RequestAttachmentCreationScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
diff --git a/jira/sm/requestComment.go b/jira/sm/requestComment.go
index 35ef782..eee8679 100644
--- a/jira/sm/requestComment.go
+++ b/jira/sm/requestComment.go
@@ -11,6 +11,7 @@ import (
 
 type RequestCommentService struct{ client *Client }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/comments#get-request-comments
 func (r *RequestCommentService) Gets(ctx context.Context, issueKeyOrID string, public bool, expands []string, start, limit int) (result *RequestCommentPageScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -62,6 +63,7 @@ func (r *RequestCommentService) Gets(ctx context.Context, issueKeyOrID string, p
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/comments#get-request-comment-by-id
 func (r *RequestCommentService) Get(ctx context.Context, issueKeyOrID string, commentID int, expands []string) (result *RequestCommentScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -111,6 +113,7 @@ func (r *RequestCommentService) Get(ctx context.Context, issueKeyOrID string, co
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/comments#create-request-comment
 func (r *RequestCommentService) Create(ctx context.Context, issueKeyOrID, body string, public bool) (result *RequestCommentScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -152,6 +155,7 @@ func (r *RequestCommentService) Create(ctx context.Context, issueKeyOrID, body s
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/comments#get-comment-attachments
 func (r *RequestCommentService) Attachments(ctx context.Context, issueKeyOrID string, commentID, start, limit int) (result *RequestCommentAttachmentPageScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
diff --git a/jira/sm/requestFeedback.go b/jira/sm/requestFeedback.go
index efa9657..75e701f 100644
--- a/jira/sm/requestFeedback.go
+++ b/jira/sm/requestFeedback.go
@@ -9,6 +9,7 @@ import (
 
 type RequestFeedbackService struct{ client *Client }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/feedback#get-feedback
 func (r *RequestFeedbackService) Get(ctx context.Context, requestIDOrKey string) (result *CustomerFeedbackScheme, response *Response, err error) {
 
 	if len(requestIDOrKey) == 0 {
@@ -38,6 +39,7 @@ func (r *RequestFeedbackService) Get(ctx context.Context, requestIDOrKey string)
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/feedback#post-feedback
 func (r *RequestFeedbackService) Post(ctx context.Context, requestIDOrKey string, rating int, comment string) (result *CustomerFeedbackScheme, response *Response, err error) {
 
 	if len(requestIDOrKey) == 0 {
@@ -84,6 +86,7 @@ func (r *RequestFeedbackService) Post(ctx context.Context, requestIDOrKey string
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/feedback#delete-feedback
 func (r *RequestFeedbackService) Delete(ctx context.Context, requestIDOrKey string) (response *Response, err error) {
 
 	if len(requestIDOrKey) == 0 {
diff --git a/jira/sm/requestParticipant.go b/jira/sm/requestParticipant.go
index 67d9633..aded768 100644
--- a/jira/sm/requestParticipant.go
+++ b/jira/sm/requestParticipant.go
@@ -11,6 +11,7 @@ import (
 
 type RequestParticipantService struct{ client *Client }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/participants#get-request-participants
 func (r *RequestParticipantService) Gets(ctx context.Context, issueKeyOrID string, start, limit int) (result *RequestParticipantPageScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -43,6 +44,7 @@ func (r *RequestParticipantService) Gets(ctx context.Context, issueKeyOrID strin
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/participants#add-request-participants
 func (r *RequestParticipantService) Add(ctx context.Context, issueKeyOrID string, accountIDs []string) (result *RequestParticipantPageScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -82,6 +84,7 @@ func (r *RequestParticipantService) Add(ctx context.Context, issueKeyOrID string
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/participants#remove-request-participants
 func (r *RequestParticipantService) Remove(ctx context.Context, issueKeyOrID string, accountIDs []string) (result *RequestParticipantPageScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
diff --git a/jira/sm/requestSLA.go b/jira/sm/requestSLA.go
index 0c26b04..0cb5716 100644
--- a/jira/sm/requestSLA.go
+++ b/jira/sm/requestSLA.go
@@ -11,6 +11,7 @@ import (
 
 type RequestSLAService struct{ client *Client }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/sla#get-sla-information
 func (r *RequestSLAService) Gets(ctx context.Context, issueKeyOrID string, start, limit int) (result *RequestSLAPageScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
@@ -43,6 +44,7 @@ func (r *RequestSLAService) Gets(ctx context.Context, issueKeyOrID string, start
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/sla#get-sla-information-by-id
 func (r *RequestSLAService) Get(ctx context.Context, issueKeyOrID string, slaMetricID int) (result *RequestSLAScheme, response *Response, err error) {
 
 	if len(issueKeyOrID) == 0 {
diff --git a/jira/sm/requestType.go b/jira/sm/requestType.go
index a362f77..ecb5cf4 100644
--- a/jira/sm/requestType.go
+++ b/jira/sm/requestType.go
@@ -13,6 +13,7 @@ type RequestTypeService struct{ client *Client }
 
 // This method returns all customer request types used in the Jira Service Management instance,
 // optionally filtered by a query string.
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/types#get-all-request-types
 func (r *RequestTypeService) Search(ctx context.Context, query string, start, limit int) (result *RequestTypePageScheme, response *Response, err error) {
 
 	params := url.Values{}
@@ -51,6 +52,7 @@ func (r *RequestTypeService) Search(ctx context.Context, query string, start, li
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/types#get-request-types
 func (r *RequestTypeService) Gets(ctx context.Context, serviceDeskID, groupID, start, limit int) (result *ProjectRequestTypePageScheme, response *Response, err error) {
 
 	if serviceDeskID == 0 {
@@ -102,6 +104,7 @@ type ProjectRequestTypePageScheme struct {
 	Values []*RequestTypeScheme `json:"values"`
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/types#create-request-type
 func (r *RequestTypeService) Create(ctx context.Context, serviceDeskID int, issueTypeID, name, description, helpText string) (result *RequestTypeScheme, response *Response, err error) {
 
 	if serviceDeskID == 0 {
@@ -149,6 +152,7 @@ func (r *RequestTypeService) Create(ctx context.Context, serviceDeskID int, issu
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/types#get-request-type-by-id
 func (r *RequestTypeService) Get(ctx context.Context, serviceDeskID, requestTypeID int) (result *RequestTypeScheme, response *Response, err error) {
 
 	if serviceDeskID == 0 {
@@ -181,6 +185,7 @@ func (r *RequestTypeService) Get(ctx context.Context, serviceDeskID, requestType
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/types#delete-request-type
 func (r *RequestTypeService) Delete(ctx context.Context, serviceDeskID, requestTypeID int) (response *Response, err error) {
 
 	if serviceDeskID == 0 {
@@ -214,6 +219,7 @@ func (r *RequestTypeService) Delete(ctx context.Context, serviceDeskID, requestT
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/types#get-request-type-fields
 func (r *RequestTypeService) Fields(ctx context.Context, serviceDeskID, requestTypeID int) (result *RequestTypeFieldsScheme, response *Response, err error) {
 
 	if serviceDeskID == 0 {
diff --git a/jira/sm/serviceDesk.go b/jira/sm/serviceDesk.go
index 127065b..76b8ef0 100644
--- a/jira/sm/serviceDesk.go
+++ b/jira/sm/serviceDesk.go
@@ -19,6 +19,7 @@ type ServiceDeskService struct {
 	Queue  *ServiceDeskQueueService
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/service-desk#get-service-desks
 func (s *ServiceDeskService) Gets(ctx context.Context, start, limit int) (result *ServiceDeskPageScheme, response *Response, err error) {
 
 	params := url.Values{}
@@ -47,6 +48,7 @@ func (s *ServiceDeskService) Gets(ctx context.Context, start, limit int) (result
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/service-desk#get-service-desk-by-id
 func (s *ServiceDeskService) Get(ctx context.Context, serviceDeskID int) (result *ServiceDeskScheme, response *Response, err error) {
 
 	var endpoint = fmt.Sprintf("rest/servicedeskapi/servicedesk/%v", serviceDeskID)
@@ -71,6 +73,7 @@ func (s *ServiceDeskService) Get(ctx context.Context, serviceDeskID int) (result
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/service-desk#attach-temporary-file
 func (s *ServiceDeskService) Attach(ctx context.Context, serviceDeskID int, path string) (result *ServiceDeskTemporaryFileScheme, response *Response, err error) {
 
 	if len(path) == 0 {
diff --git a/jira/sm/serviceDeskQueue.go b/jira/sm/serviceDeskQueue.go
index eef32ff..c5e9ec3 100644
--- a/jira/sm/serviceDeskQueue.go
+++ b/jira/sm/serviceDeskQueue.go
@@ -11,6 +11,7 @@ import (
 
 type ServiceDeskQueueService struct{ client *Client }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/service-desk/queue#get-queues
 func (s *ServiceDeskQueueService) Gets(ctx context.Context, serviceDeskID int, includeCount bool, start, limit int) (result *ServiceDeskQueuePageScheme, response *Response, err error) {
 
 	params := url.Values{}
@@ -43,6 +44,7 @@ func (s *ServiceDeskQueueService) Gets(ctx context.Context, serviceDeskID int, i
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/service-desk/queue#get-queue
 func (s *ServiceDeskQueueService) Get(ctx context.Context, serviceDeskID, queueID int, includeCount bool) (result *ServiceDeskQueueScheme, response *Response, err error) {
 
 	params := url.Values{}
@@ -77,6 +79,7 @@ func (s *ServiceDeskQueueService) Get(ctx context.Context, serviceDeskID, queueI
 	return
 }
 
+// Docs: https://docs.go-atlassian.io/jira-service-management-cloud/request/service-desk/queue#get-issues-in-queue
 func (s *ServiceDeskQueueService) Issues(ctx context.Context, serviceDeskID, queueID, start, limit int) (result *ServiceDeskIssueQueueScheme, response *Response, err error) {
 
 	params := url.Values{}


Test patch:
diff --git a/admin/admin_test.go b/admin/admin_test.go
index ac2880a..092fa1d 100644
--- a/admin/admin_test.go
+++ b/admin/admin_test.go
@@ -190,8 +190,7 @@ func startMockClient(site string) (*Client, error) {
 	client.Organization = &OrganizationService{
 		client: client,
 		Policy: &OrganizationPolicyService{
-			client:   client,
-			Resource: &OrganizationPolicyResourceService{client: client},
+			client: client,
 		},
 	}
 
@@ -201,11 +200,10 @@ func startMockClient(site string) (*Client, error) {
 	}
 
 	client.SCIM = &SCIMService{
-		client:   client,
-		User:     &SCIMUserService{client: client},
-		Group:    &SCIMGroupService{client: client},
-		Scheme:   &SCIMSchemeService{client: client},
-		Resource: &SCIMResourceService{client: client},
+		client: client,
+		User:   &SCIMUserService{client: client},
+		Group:  &SCIMGroupService{client: client},
+		Scheme: &SCIMSchemeService{client: client},
 	}
 
 	return client, nil
diff --git a/admin/organization_test.go b/admin/organization_test.go
index 88528b5..b67b9de 100644
--- a/admin/organization_test.go
+++ b/admin/organization_test.go
@@ -939,6 +939,24 @@ func TestOrganizationService_Events(t *testing.T) {
 			wantErr:            false,
 		},
 
+		{
+			name:           "GetOrganizationAuditEventsWhenTheResponseBodyIsEmpty",
+			mockFile:       "./mocks/empty.json",
+			organizationID: "d094d850-d57e-483a-bd03-ca8855919267",
+			opts: &OrganizationEventOptScheme{
+				Q:      "qq",
+				From:   fromMocked.Add(time.Duration(-24) * time.Hour),
+				To:     toMocked.Add(time.Duration(-1) * time.Hour),
+				Action: "user_added_to_group",
+			},
+			cursor:             "d57e-483a",
+			wantHTTPCodeReturn: http.StatusOK,
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/admin/v1/orgs/d094d850-d57e-483a-bd03-ca8855919267/events?action=user_added_to_group&cursor=d57e-483a&from=1589197526&q=qq&to=1605177926",
+			context:            context.Background(),
+			wantErr:            true,
+		},
+
 		{
 			name:               "GetOrganizationAuditEventsWhenTheDomainIDIsNotSet",
 			mockFile:           "./mocks/get-organization-audit-events.json",
diff --git a/admin/scimGroup_test.go b/admin/scimGroup_test.go
new file mode 100644
index 0000000..facfd33
--- /dev/null
+++ b/admin/scimGroup_test.go
@@ -0,0 +1,1202 @@
+package admin
+
+import (
+	"context"
+	"fmt"
+	"github.com/stretchr/testify/assert"
+	"net/http"
+	"net/url"
+	"testing"
+)
+
+func TestSCIMGroupService_Gets(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		directoryID        string
+		filter             string
+		startAt            int
+		maxResults         int
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "GetsSCIMGroupWhenTheParametersAreCorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			filter:             "jira",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/scim-get-groups.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups?count=50&filter=jira&startIndex=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "GetsSCIMGroupWhenTheDirectoryIDIsNotSet",
+			directoryID:        "",
+			filter:             "jira",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/scim-get-groups.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups?count=50&filter=jira&startIndex=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetsSCIMGroupWhenTheRequestMethodIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			filter:             "jira",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/scim-get-groups.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups?count=50&filter=jira&startIndex=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetsSCIMGroupWhenTheStatusCodeIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			filter:             "jira",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/scim-get-groups.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups?count=50&filter=jira&startIndex=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 400,
+			wantErr:            true,
+		},
+		{
+			name:               "GetsSCIMGroupWhenTheContextIsNil",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			filter:             "jira",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/scim-get-groups.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups?count=50&filter=jira&startIndex=0",
+			context:            nil,
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetsSCIMGroupWhenTheFilterIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			filter:             "",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/scim-get-groups.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups?count=50&startIndex=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "GetsSCIMGroupWhenTheEndpointIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			filter:             "jira",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/scim-get-groups.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetsSCIMGroupWhenTheResponseBodyIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			filter:             "jira",
+			startAt:            0,
+			maxResults:         50,
+			mockFile:           "./mocks/empty.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups?count=50&filter=jira&startIndex=0",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+		testCase := testCase
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &SCIMGroupService{client: mockClient}
+			gotResult, gotResponse, err := service.Gets(testCase.context, testCase.directoryID,
+				testCase.filter, testCase.startAt, testCase.maxResults)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+				assert.Error(t, err)
+
+				if gotResponse != nil {
+					t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				}
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+
+				t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				assert.Equal(t, gotResponse.StatusCode, testCase.wantHTTPCodeReturn)
+
+				for _, group := range gotResult.Resources {
+					t.Log(group.DisplayName, group.ID, len(group.Members))
+				}
+
+			}
+
+		})
+	}
+
+}
+
+func TestSCIMGroupService_Get(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		directoryID        string
+		groupID            string
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "GetSCIMGroupWhenTheParametersAreCorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "GetSCIMGroupWhenTheGroupIDIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetSCIMGroupWhenTheDirectoryIDIsNotSet",
+			directoryID:        "",
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetSCIMGroupWhenTheRequestMethodIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetSCIMGroupWhenTheStatusCodeIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 400,
+			wantErr:            true,
+		},
+		{
+			name:               "GetSCIMGroupWhenTheContextIsNil",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            nil,
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetSCIMGroupWhenTheFilterIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "GetSCIMGroupWhenTheEndpointIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "GetSCIMGroupWhenTheResponseBodyIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/empty.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+		testCase := testCase
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &SCIMGroupService{client: mockClient}
+			gotResult, gotResponse, err := service.Get(testCase.context, testCase.directoryID,
+				testCase.groupID)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+				assert.Error(t, err)
+
+				if gotResponse != nil {
+					t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				}
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+
+				t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				assert.Equal(t, gotResponse.StatusCode, testCase.wantHTTPCodeReturn)
+
+				t.Log(gotResult.DisplayName, gotResult.ID, len(gotResult.Members))
+
+			}
+
+		})
+	}
+
+}
+
+func TestSCIMGroupService_Update(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		directoryID        string
+		groupID            string
+		newGroupName       string
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "UpdateSCIMGroupWhenTheParametersAreCorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheNewGroupNameIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			newGroupName:       "",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheGroupIDIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheDirectoryIDIsNotSet",
+			directoryID:        "",
+			groupID:            "4475-a0c4",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheRequestMethodIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheStatusCodeIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 400,
+			wantErr:            true,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheContextIsNil",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            nil,
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheFilterIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheEndpointIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "UpdateSCIMGroupWhenTheResponseBodyIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			newGroupName:       "jira-users-updated",
+			mockFile:           "./mocks/empty.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+		testCase := testCase
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &SCIMGroupService{client: mockClient}
+			gotResult, gotResponse, err := service.Update(testCase.context, testCase.directoryID,
+				testCase.groupID, testCase.newGroupName)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+				assert.Error(t, err)
+
+				if gotResponse != nil {
+					t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				}
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+
+				t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				assert.Equal(t, gotResponse.StatusCode, testCase.wantHTTPCodeReturn)
+
+				t.Log(gotResult.DisplayName, gotResult.ID, len(gotResult.Members))
+
+			}
+
+		})
+	}
+
+}
+
+func TestSCIMGroupService_Create(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		directoryID        string
+		group              string
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "CreateSCIMGroupWhenTheParametersAreCorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			group:              "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "CreateSCIMGroupWhenTheNewGroupNameIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			group:              "",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "CreateSCIMGroupWhenTheDirectoryIDIsNotSet",
+			directoryID:        "",
+			group:              "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "CreateSCIMGroupWhenTheRequestMethodIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			group:              "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "CreateSCIMGroupWhenTheStatusCodeIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			group:              "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 400,
+			wantErr:            true,
+		},
+		{
+			name:               "CreateSCIMGroupWhenTheContextIsNil",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			group:              "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups",
+			context:            nil,
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "CreateSCIMGroupWhenTheFilterIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			group:              "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "CreateSCIMGroupWhenTheEndpointIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			group:              "jira-users-updated",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "CreateSCIMGroupWhenTheResponseBodyIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			group:              "jira-users-updated",
+			mockFile:           "./mocks/empty.json",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+		testCase := testCase
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &SCIMGroupService{client: mockClient}
+			gotResult, gotResponse, err := service.Create(testCase.context, testCase.directoryID, testCase.group)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+				assert.Error(t, err)
+
+				if gotResponse != nil {
+					t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				}
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+
+				t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				assert.Equal(t, gotResponse.StatusCode, testCase.wantHTTPCodeReturn)
+
+				t.Log(gotResult.DisplayName, gotResult.ID, len(gotResult.Members))
+
+			}
+
+		})
+	}
+
+}
+
+func TestSCIMGroupService_Delete(t *testing.T) {
+
+	testCases := []struct {
+		name               string
+		directoryID        string
+		groupID            string
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "DeleteSCIMGroupWhenTheParametersAreCorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "DeleteSCIMGroupWhenTheGroupIDIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "DeleteSCIMGroupWhenTheDirectoryIDIsNotSet",
+			directoryID:        "",
+			groupID:            "4475-a0c4",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "DeleteSCIMGroupWhenTheRequestMethodIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "DeleteSCIMGroupWhenTheStatusCodeIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 400,
+			wantErr:            true,
+		},
+		{
+			name:               "DeleteSCIMGroupWhenTheContextIsNil",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            nil,
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "DeleteSCIMGroupWhenTheFilterIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "DeleteSCIMGroupWhenTheEndpointIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+		testCase := testCase
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &SCIMGroupService{client: mockClient}
+			gotResponse, err := service.Delete(testCase.context, testCase.directoryID, testCase.groupID)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+				assert.Error(t, err)
+
+				if gotResponse != nil {
+					t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				}
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+
+				t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				assert.Equal(t, gotResponse.StatusCode, testCase.wantHTTPCodeReturn)
+
+			}
+
+		})
+	}
+
+}
+
+func TestSCIMGroupService_Path(t *testing.T) {
+
+	payloadWithOperationsMocked := &SCIMGroupPathScheme{
+		Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
+		Operations: []*SCIMGroupOperationScheme{
+			{
+				Op:   "add",
+				Path: "members",
+				Value: []*SCIMGroupOperationValueScheme{
+					{
+						Value:   "635cdb2f-e72c-4122-bfd3-3aa",
+						Display: "Example Display Name",
+					},
+				},
+			},
+		},
+	}
+
+	payloadWithOutOperationsMocked := &SCIMGroupPathScheme{
+		Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
+	}
+
+	testCases := []struct {
+		name               string
+		directoryID        string
+		groupID            string
+		payload            *SCIMGroupPathScheme
+		mockFile           string
+		wantHTTPMethod     string
+		endpoint           string
+		context            context.Context
+		wantHTTPCodeReturn int
+		wantErr            bool
+	}{
+		{
+			name:               "PatchSCIMGroupWhenTheParametersAreCorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            payloadWithOperationsMocked,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+
+		{
+			name:               "PatchSCIMGroupWhenThePayloadDoNotContainsOperations",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            payloadWithOutOperationsMocked,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+
+		{
+			name:               "PatchSCIMGroupWhenThePayloadIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            nil,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+
+		{
+			name:               "PatchSCIMGroupWhenTheGroupIDIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "",
+			payload:            payloadWithOperationsMocked,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "PatchSCIMGroupWhenTheDirectoryIDIsNotSet",
+			directoryID:        "",
+			payload:            payloadWithOperationsMocked,
+			groupID:            "4475-a0c4",
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "PatchSCIMGroupWhenTheRequestMethodIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            payloadWithOperationsMocked,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodGet,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "PatchSCIMGroupWhenTheStatusCodeIsIncorrect",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            payloadWithOperationsMocked,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPut,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 400,
+			wantErr:            true,
+		},
+		{
+			name:               "PatchSCIMGroupWhenTheContextIsNil",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            payloadWithOperationsMocked,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            nil,
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "PatchSCIMGroupWhenTheFilterIsNotProvided",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            payloadWithOperationsMocked,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            false,
+		},
+		{
+			name:               "PatchSCIMGroupWhenTheEndpointIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            payloadWithOperationsMocked,
+			mockFile:           "./mocks/scim-get-group.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+		{
+			name:               "PatchSCIMGroupWhenTheResponseBodyIsEmpty",
+			directoryID:        "651c2e11-afea-4475-a0c4",
+			groupID:            "4475-a0c4",
+			payload:            payloadWithOperationsMocked,
+			mockFile:           "./mocks/empty.json",
+			wantHTTPMethod:     http.MethodPatch,
+			endpoint:           "/scim/directory/651c2e11-afea-4475-a0c4/Groups/4475-a0c4",
+			context:            context.Background(),
+			wantHTTPCodeReturn: 200,
+			wantErr:            true,
+		},
+	}
+
+	for _, testCase := range testCases {
+		testCase := testCase
+		t.Run(testCase.name, func(t *testing.T) {
+			t.Parallel()
+
+			//Init a new HTTP mock server
+			mockOptions := mockServerOptions{
+				Endpoint:           testCase.endpoint,
+				MockFilePath:       testCase.mockFile,
+				MethodAccepted:     testCase.wantHTTPMethod,
+				ResponseCodeWanted: testCase.wantHTTPCodeReturn,
+			}
+
+			mockServer, err := startMockServer(&mockOptions)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			defer mockServer.Close()
+
+			//Init the library instance
+			mockClient, err := startMockClient(mockServer.URL)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			service := &SCIMGroupService{client: mockClient}
+			gotResult, gotResponse, err := service.Path(testCase.context, testCase.directoryID,
+				testCase.groupID, testCase.payload)
+
+			if testCase.wantErr {
+
+				if err != nil {
+					t.Logf("error returned: %v", err.Error())
+				}
+				assert.Error(t, err)
+
+				if gotResponse != nil {
+					t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				}
+			} else {
+
+				assert.NoError(t, err)
+				assert.NotEqual(t, gotResponse, nil)
+				assert.NotEqual(t, gotResult, nil)
+
+				apiEndpoint, err := url.Parse(gotResponse.Endpoint)
+				if err != nil {
+					t.Fatal(err)
+				}
+
+				var endpointToAssert string
+
+				if apiEndpoint.Query().Encode() != "" {
+					endpointToAssert = fmt.Sprintf("%v?%v", apiEndpoint.Path, apiEndpoint.Query().Encode())
+				} else {
+					endpointToAssert = apiEndpoint.Path
+				}
+
+				t.Logf("HTTP Endpoint Wanted: %v, HTTP Endpoint Returned: %v", testCase.endpoint, endpointToAssert)
+				assert.Equal(t, testCase.endpoint, endpointToAssert)
+
+				t.Logf("HTTP Code Wanted: %v, HTTP Code Returned: %v", testCase.wantHTTPCodeReturn, gotResponse.StatusCode)
+				assert.Equal(t, gotResponse.StatusCode, testCase.wantHTTPCodeReturn)
+
+				t.Log(gotResult.DisplayName, gotResult.ID, len(gotResult.Members))
+
+			}
+
+		})
+	}
+
+}
diff --git a/admin/scimUser_test.go b/admin/scimUser_test.go
index 582cf72..80f2c70 100644
--- a/admin/scimUser_test.go
+++ b/admin/scimUser_test.go
@@ -1042,7 +1042,7 @@ func TestSCIMUserService_Deactivate(t *testing.T) {
 
 }
 
-func TestSCIMUserService_Overwrite(t *testing.T) {
+func TestSCIMUserService_Update(t *testing.T) {
 
 	testCases := []struct {
 		name                           string
@@ -1449,7 +1449,7 @@ func TestSCIMUserService_Overwrite(t *testing.T) {
 			}
 
 			service := &SCIMUserService{client: mockClient}
-			gotResult, gotResponse, err := service.Overwrite(testCase.context, testCase.directoryID,
+			gotResult, gotResponse, err := service.Update(testCase.context, testCase.directoryID,
 				testCase.userID, testCase.payload, testCase.attributes, testCase.excludedAttributes)
 
 			if testCase.wantErr {
@@ -1503,7 +1503,7 @@ func TestSCIMUserService_Overwrite(t *testing.T) {
 
 }
 
-func TestSCIMUserService_Update(t *testing.T) {
+func TestSCIMUserService_Path(t *testing.T) {
 
 	payload := &SCIMUserToPathScheme{
 		Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
@@ -1741,7 +1741,7 @@ func TestSCIMUserService_Update(t *testing.T) {
 			}
 
 			service := &SCIMUserService{client: mockClient}
-			gotResult, gotResponse, err := service.Update(testCase.context, testCase.directoryID,
+			gotResult, gotResponse, err := service.Path(testCase.context, testCase.directoryID,
 				testCase.userID, testCase.payload, testCase.attributes, testCase.excludedAttributes)
 
 			if testCase.wantErr {
diff --git a/jira/sm/customer_test.go b/jira/sm/customer_test.go
index db7c672..a99ca6f 100644
--- a/jira/sm/customer_test.go
+++ b/jira/sm/customer_test.go
@@ -209,6 +209,11 @@ func Test_isEmailValid(t *testing.T) {
 			email:   "example@gmail.com",
 			wantErr: false,
 		},
+		{
+			name:    "ValidateEmailWhenTheEmailDoesNotHaveFormat",
+			email:   "ex",
+			wantErr: true,
+		},
 		{
 			name:    "ValidateEmailWhenTheEmailIsIncorrect",
 			email:   "exampleeaasc",
@@ -374,7 +379,7 @@ func TestCustomerService_Get(t *testing.T) {
 			}
 
 			service := &CustomerService{client: mockClient}
-			gotResult, gotResponse, err := service.Get(testCase.context, testCase.serviceDeskID, testCase.query, testCase.start, testCase.limit)
+			gotResult, gotResponse, err := service.Gets(testCase.context, testCase.serviceDeskID, testCase.query, testCase.start, testCase.limit)
 
 			if testCase.wantErr {
 
@@ -453,6 +458,17 @@ func TestCustomerService_Add(t *testing.T) {
 			wantErr:            false,
 		},
 
+		{
+			name:               "AddCustomerToProjectWhenTheContextIsNil",
+			serviceDeskID:      1,
+			accountIDs:         []string{"f81a5efd-992a-4f3c-b079-95ea536c1205", "ed7e6547-9677-497f-8f7d-89021fdd8fdb"},
+			wantHTTPMethod:     http.MethodPost,
+			endpoint:           "/rest/servicedeskapi/servicedesk/1/customer",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusNoContent,
+			wantErr:            true,
+		},
+
 		{
 			name:               "AddCustomerToProjectWhenTheAccountIDsAreNotSet",
 			serviceDeskID:      1,
@@ -608,6 +624,17 @@ func TestCustomerService_Remove(t *testing.T) {
 			wantErr:            false,
 		},
 
+		{
+			name:               "RemoveCustomerToProjectWhenTheContextIsNil",
+			serviceDeskID:      1,
+			accountIDs:         []string{"f81a5efd-992a-4f3c-b079-95ea536c1205", "ed7e6547-9677-497f-8f7d-89021fdd8fdb"},
+			wantHTTPMethod:     http.MethodDelete,
+			endpoint:           "/rest/servicedeskapi/servicedesk/1/customer",
+			context:            nil,
+			wantHTTPCodeReturn: http.StatusOK,
+			wantErr:            true,
+		},
+
 		{
 			name:               "RemoveCustomerToProjectWhenTheEndpointIsNotValid",
 			serviceDeskID:      1,