diff --git a/api/appsettings.go b/api/appsettings.go
index 40a52e1..d003019 100644
--- a/api/appsettings.go
+++ b/api/appsettings.go
@@ -21,6 +21,7 @@ type AppSettings struct {
 	// Routable determines if the application should be exposed by the router.
 	Routable     *bool                 `json:"routable,omitempty"`
 	Allowlist    []string              `json:"allowlist,omitempty"`
+	Autodeploy   *bool                 `json:"autodeploy,omitempty"`
 	Autorollback *bool                 `json:"autorollback,omitempty"`
 	Autoscale    map[string]*Autoscale `json:"autoscale,omitempty"`
 	Label        Labels                `json:"label,omitempty"`
@@ -32,6 +33,12 @@ func NewRoutable() *bool {
 	return &b
 }
 
+// NewAutodeploy returns a default value for the AppSettings.NewAutodeploy field.
+func NewAutodeploy() *bool {
+	b := true
+	return &b
+}
+
 // NewAutorollback returns a default value for the AppSettings.Autorollback field.
 func NewAutorollback() *bool {
 	b := true
diff --git a/api/certs.go b/api/certs.go
index e594760..fabee5e 100644
--- a/api/certs.go
+++ b/api/certs.go
@@ -8,6 +8,7 @@ import "github.com/drycc/controller-sdk-go/pkg/time"
 type Cert struct {
 	Updated        string    `json:"updated,omitempty"`
 	Created        string    `json:"created,omitempty"`
+	App            string    `json:"app"`
 	Name           string    `json:"name"`
 	CommonName     string    `json:"common_name"`
 	Expires        time.Time `json:"expires"`
diff --git a/api/domains.go b/api/domains.go
index c60d544..cc9af05 100644
--- a/api/domains.go
+++ b/api/domains.go
@@ -2,12 +2,12 @@ package api
 
 // Domain is the structure of the domain object.
 type Domain struct {
-	App          string `json:"app"`
-	Created      string `json:"created"`
-	Domain       string `json:"domain"`
-	Owner        string `json:"owner"`
-	ProcfileType string `json:"procfile_type"`
-	Updated      string `json:"updated"`
+	App     string `json:"app"`
+	Created string `json:"created"`
+	Domain  string `json:"domain"`
+	Owner   string `json:"owner"`
+	Ptype   string `json:"ptype"`
+	Updated string `json:"updated"`
 }
 
 // Domains defines a collection of domain objects.
@@ -19,6 +19,6 @@ func (d Domains) Less(i, j int) bool { return d[i].Domain < d[j].Domain }
 
 // DomainCreateRequest is the structure of POST /v2/app/<app id>/domains/.
 type DomainCreateRequest struct {
-	Domain       string `json:"domain"`
-	ProcfileType string `json:"procfile_type"`
+	Domain string `json:"domain"`
+	Ptype  string `json:"ptype"`
 }
diff --git a/api/perms.go b/api/perms.go
index 69bb80b..1dc269c 100644
--- a/api/perms.go
+++ b/api/perms.go
@@ -1,22 +1,14 @@
 package api
 
-// PermCodeResponse is the definition of GET /v2/perms/codes/.
-type PermCodeResponse struct {
-	Codename    string `json:"codename"`
-	Description string `json:"description"`
-}
-
 // UserPermResponse is the definition of GET /v2/perms/rules/.
 type UserPermResponse struct {
-	ID       uint64 `json:"id"`
-	Codename string `json:"codename"`
-	Uniqueid string `json:"uniqueid"`
-	Username string `json:"username"`
+	App         string   `json:"app"`
+	Username    string   `json:"username"`
+	Permissions []string `json:"permissions"`
 }
 
 // UserPermRequest is the definition of a requst on /v2/perms/rules/.
 type UserPermRequest struct {
-	Codename string `json:"codename"`
-	Uniqueid string `json:"uniqueid"`
-	Username string `json:"username"`
+	Username    string `json:"username"`
+	Permissions string `json:"permissions"`
 }
diff --git a/api/ps.go b/api/ps.go
index 9e331e7..7142ac0 100644
--- a/api/ps.go
+++ b/api/ps.go
@@ -33,7 +33,7 @@ type Command struct {
 
 // PodType holds pods of the same type.
 type PodType struct {
-	Type     string
+	Ptype    string
 	PodsList PodsList
 }
 
@@ -54,7 +54,7 @@ type Types struct {
 
 func (p PodTypes) Len() int           { return len(p) }
 func (p PodTypes) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
-func (p PodTypes) Less(i, j int) bool { return p[i].Type < p[j].Type }
+func (p PodTypes) Less(i, j int) bool { return p[i].Ptype < p[j].Ptype }
 
 // ContainerState defines a container state.
 type ContainerState struct {
diff --git a/api/ps_test.go b/api/ps_test.go
index cbc942c..a90b5d2 100644
--- a/api/ps_test.go
+++ b/api/ps_test.go
@@ -35,8 +35,8 @@ func TestPodTypesSorted(t *testing.T) {
 	expectedPodTypes := []string{"clock", "web", "worker"}
 
 	for i, podType := range podTypes {
-		if expectedPodTypes[i] != podType.Type {
-			t.Errorf("Expected pod types to be sorted %v, Got %v at index %v", expectedPodTypes[i], podType.Type, i)
+		if expectedPodTypes[i] != podType.Ptype {
+			t.Errorf("Expected pod types to be sorted %v, Got %v at index %v", expectedPodTypes[i], podType.Ptype, i)
 		}
 	}
 }
diff --git a/api/releases.go b/api/releases.go
index 207f9cd..be1c585 100644
--- a/api/releases.go
+++ b/api/releases.go
@@ -2,20 +2,30 @@ package api
 
 // Release is the definition of the release object.
 type Release struct {
-	App       string `json:"app"`
-	State     string `json:"state"`
-	Build     string `json:"build,omitempty"`
-	Config    string `json:"config"`
-	Created   string `json:"created"`
-	Owner     string `json:"owner"`
-	Summary   string `json:"summary"`
-	Exception string `json:"exception"`
-	Updated   string `json:"updated"`
-	UUID      string `json:"uuid"`
-	Version   int    `json:"version"`
+	App        string      `json:"app"`
+	State      string      `json:"state"`
+	Build      string      `json:"build,omitempty"`
+	Config     string      `json:"config"`
+	Created    string      `json:"created"`
+	Owner      string      `json:"owner"`
+	Summary    string      `json:"summary"`
+	Exception  string      `json:"exception"`
+	Conditions []Condition `json:"conditions"`
+	Updated    string      `json:"updated"`
+	UUID       string      `json:"uuid"`
+	Version    int         `json:"version"`
 }
 
 // ReleaseRollback is the defenition of POST /v2/apps/<app id>/releases/.
 type ReleaseRollback struct {
-	Version int `json:"version"`
+	Version int    `json:"version"`
+	Ptypes  string `json:"ptypes"`
+}
+
+type Condition struct {
+	State     string   `json:"state"`
+	Action    string   `json:"action"`
+	Ptypes    []string `json:"ptypes"`
+	Exception string   `json:"exception"`
+	Created   string   `json:"created"`
 }
diff --git a/api/routes.go b/api/routes.go
index 28fcdde..1ecc143 100644
--- a/api/routes.go
+++ b/api/routes.go
@@ -14,7 +14,7 @@ type Route struct {
 	// It changes every time the application settings is changed and cannot be updated.
 	UUID       string      `json:"uuid,omitempty"`
 	Name       string      `json:"name,omitempty"`
-	Type       string      `json:"procfile_type,omitempty"`
+	Ptype      string      `json:"ptype,omitempty"`
 	Kind       string      `json:"kind,omitempty"`
 	Port       int         `json:"port,omitempty"`
 	ParentRefs []ParentRef `json:"parent_refs,omitempty"`
@@ -30,10 +30,10 @@ type Routes []Route
 
 // RouteCreateRequest is the structure of POST /v2/app/<app id>/routes/.
 type RouteCreateRequest struct {
-	Name string `json:"name,omitempty"`
-	Type string `json:"procfile_type,omitempty"`
-	Port int    `json:"port,omitempty"`
-	Kind string `json:"kind,omitempty"`
+	Name  string `json:"name,omitempty"`
+	Ptype string `json:"ptype,omitempty"`
+	Port  int    `json:"port,omitempty"`
+	Kind  string `json:"kind,omitempty"`
 }
 
 // RouteAttackRequest is the structure of PATCH /v2/apps/(?P<id>{})/routes/(?P<name>{})/attach/?$.
@@ -51,7 +51,7 @@ type RouteDetackRequest struct {
 // RouteRule is the structure of GET RESPONSE /v2/apps/(?P<id>{})/routes/(?P<name>{})/rules/?$.
 type RouteRule struct {
 	Name  string      `json:"name,omitempty"`
-	Type  string      `json:"procfile_type,omitempty"`
+	Ptype string      `json:"ptype,omitempty"`
 	Kind  string      `json:"kind,omitempty"`
 	Rules interface{} `json:"rules,omitempty"`
 }
diff --git a/api/services.go b/api/services.go
index d7d26ce..bc6f901 100644
--- a/api/services.go
+++ b/api/services.go
@@ -2,9 +2,9 @@ package api
 
 // Service is the structure of the service object.
 type Service struct {
-	Domain       string `json:"domain"`
-	ProcfileType string `json:"procfile_type"`
-	Ports        []Port `json:"ports"`
+	Domain string `json:"domain"`
+	Ptype  string `json:"ptype"`
+	Ports  []Port `json:"ports"`
 }
 
 type Port struct {
@@ -19,19 +19,19 @@ type Services []Service
 
 func (s Services) Len() int           { return len(s) }
 func (s Services) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
-func (s Services) Less(i, j int) bool { return s[i].ProcfileType < s[j].ProcfileType }
+func (s Services) Less(i, j int) bool { return s[i].Ptype < s[j].Ptype }
 
 // ServiceCreateUpdateRequest is the structure of POST /v2/app/<app id>/services/.
 type ServiceCreateUpdateRequest struct {
-	ProcfileType string `json:"procfile_type"`
-	Port         int    `json:"port"`
-	Protocol     string `json:"protocol"`
-	TargetPort   int    `json:"target_port"`
+	Ptype      string `json:"ptype"`
+	Port       int    `json:"port"`
+	Protocol   string `json:"protocol"`
+	TargetPort int    `json:"target_port"`
 }
 
 // ServiceDeleteRequest is the structure of DELETE /v2/app/<app id>/services/.
 type ServiceDeleteRequest struct {
-	ProcfileType string `json:"procfile_type"`
-	Port         int    `json:"port"`
-	Protocol     string `json:"protocol"`
+	Ptype    string `json:"ptype"`
+	Port     int    `json:"port"`
+	Protocol string `json:"protocol"`
 }
diff --git a/appsettings/appsettings_test.go b/appsettings/appsettings_test.go
index f04bd6c..f34ac54 100644
--- a/appsettings/appsettings_test.go
+++ b/appsettings/appsettings_test.go
@@ -17,6 +17,7 @@ const appSettingsFixture string = `
     "owner": "test",
     "app": "example-go",
     "routable": true,
+    "autodeploy": true,
     "autorollback": true,
     "allowlist": ["1.2.3.4", "0.0.0.0/0"],
     "autoscale": {"cmd": {"min": 3, "max": 8, "cpu_percent": 40}},
@@ -32,6 +33,7 @@ const appSettingsUnsetFixture string = `
     "owner": "test",
     "app": "unset-test",
     "routable": true,
+    "autodeploy": true,
     "autorollback": true,
     "allowlist": ["1.2.3.4", "0.0.0.0/0"],
     "autoscale": {"cmd": {"min": 3, "max": 8, "cpu_percent": 40}},
@@ -41,8 +43,8 @@ const appSettingsUnsetFixture string = `
     "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
 }
 `
-const appSettingsSetExpected string = `{"routable":true,"allowlist":["1.2.3.4","0.0.0.0/0"],"autorollback":true,"autoscale":{"cmd":{"min":3,"max":8,"cpu_percent":40}},"label":{"git_repo":"https://github.com/drycc/controller-sdk-go","team":"drycc"}}`
-const appSettingsUnsetExpected string = `{"routable":true,"allowlist":["1.2.3.4","0.0.0.0/0"],"autorollback":true,"autoscale":{"cmd":{"min":3,"max":8,"cpu_percent":40}},"label":{"git_repo":"https://github.com/drycc/controller-sdk-go","team":"drycc"}}`
+const appSettingsSetExpected string = `{"routable":true,"allowlist":["1.2.3.4","0.0.0.0/0"],"autodeploy":true,"autorollback":true,"autoscale":{"cmd":{"min":3,"max":8,"cpu_percent":40}},"label":{"git_repo":"https://github.com/drycc/controller-sdk-go","team":"drycc"}}`
+const appSettingsUnsetExpected string = `{"routable":true,"allowlist":["1.2.3.4","0.0.0.0/0"],"autodeploy":true,"autorollback":true,"autoscale":{"cmd":{"min":3,"max":8,"cpu_percent":40}},"label":{"git_repo":"https://github.com/drycc/controller-sdk-go","team":"drycc"}}`
 
 type fakeHTTPServer struct{}
 
@@ -117,6 +119,7 @@ func TestAppSettingsSet(t *testing.T) {
 		Owner:        "test",
 		App:          "example-go",
 		Routable:     api.NewRoutable(),
+		Autodeploy:   api.NewAutodeploy(),
 		Autorollback: api.NewAutorollback(),
 		Allowlist:    []string{"1.2.3.4", "0.0.0.0/0"},
 		Autoscale: map[string]*api.Autoscale{
@@ -137,6 +140,7 @@ func TestAppSettingsSet(t *testing.T) {
 
 	appSettingsVars := api.AppSettings{
 		Routable:     api.NewRoutable(),
+		Autodeploy:   api.NewAutodeploy(),
 		Autorollback: api.NewAutorollback(),
 		Allowlist:    []string{"1.2.3.4", "0.0.0.0/0"},
 		Autoscale: map[string]*api.Autoscale{
@@ -179,6 +183,7 @@ func TestAppSettingsUnset(t *testing.T) {
 		Owner:        "test",
 		App:          "unset-test",
 		Routable:     api.NewRoutable(),
+		Autodeploy:   api.NewAutodeploy(),
 		Autorollback: api.NewAutorollback(),
 		Allowlist:    []string{"1.2.3.4", "0.0.0.0/0"},
 		Autoscale: map[string]*api.Autoscale{
@@ -199,6 +204,7 @@ func TestAppSettingsUnset(t *testing.T) {
 
 	appSettingsVars := api.AppSettings{
 		Routable:     api.NewRoutable(),
+		Autodeploy:   api.NewAutodeploy(),
 		Autorollback: api.NewAutorollback(),
 		Allowlist:    []string{"1.2.3.4", "0.0.0.0/0"},
 		Autoscale: map[string]*api.Autoscale{
@@ -241,6 +247,7 @@ func TestAppSettingsList(t *testing.T) {
 		Owner:        "test",
 		App:          "example-go",
 		Routable:     api.NewRoutable(),
+		Autodeploy:   api.NewAutodeploy(),
 		Autorollback: api.NewAutorollback(),
 		Allowlist:    []string{"1.2.3.4", "0.0.0.0/0"},
 		Autoscale: map[string]*api.Autoscale{
diff --git a/certs/certs.go b/certs/certs.go
index 6b6973c..22cdb5e 100644
--- a/certs/certs.go
+++ b/certs/certs.go
@@ -10,8 +10,9 @@ import (
 )
 
 // List lists certificates added to drycc.
-func List(c *drycc.Client, results int) ([]api.Cert, int, error) {
-	body, count, reqErr := c.LimitedRequest("/v2/certs/", results)
+func List(c *drycc.Client, appID string, results int) ([]api.Cert, int, error) {
+	u := fmt.Sprintf("/v2/apps/%s/certs/", appID)
+	body, count, reqErr := c.LimitedRequest(u, results)
 
 	if reqErr != nil && !drycc.IsErrAPIMismatch(reqErr) {
 		return []api.Cert{}, -1, reqErr
@@ -29,14 +30,14 @@ func List(c *drycc.Client, results int) ([]api.Cert, int, error) {
 // Certificates are created independently from apps and are applied on a per domain basis.
 // So to enable SSL for an app with the domain test.com, you would first create the certificate,
 // then use the attach method to attach test.com to the certificate.
-func New(c *drycc.Client, cert string, key string, name string) (api.Cert, error) {
+func New(c *drycc.Client, appID string, cert string, key string, name string) (api.Cert, error) {
 	req := api.CertCreateRequest{Certificate: cert, Key: key, Name: name}
 	reqBody, err := json.Marshal(req)
 	if err != nil {
 		return api.Cert{}, err
 	}
-
-	res, reqErr := c.Request("POST", "/v2/certs/", reqBody)
+	u := fmt.Sprintf("/v2/apps/%s/certs/", appID)
+	res, reqErr := c.Request("POST", u, reqBody)
 	if reqErr != nil && !drycc.IsErrAPIMismatch(reqErr) {
 		return api.Cert{}, reqErr
 	}
@@ -51,8 +52,8 @@ func New(c *drycc.Client, cert string, key string, name string) (api.Cert, error
 }
 
 // Get retrieves information about a certificate
-func Get(c *drycc.Client, name string) (api.Cert, error) {
-	url := fmt.Sprintf("/v2/certs/%s", name)
+func Get(c *drycc.Client, appID string, name string) (api.Cert, error) {
+	url := fmt.Sprintf("/v2/apps/%s/certs/%s", appID, name)
 	res, reqErr := c.Request("GET", url, nil)
 	if reqErr != nil {
 		return api.Cert{}, reqErr
@@ -68,8 +69,8 @@ func Get(c *drycc.Client, name string) (api.Cert, error) {
 }
 
 // Delete removes a certificate.
-func Delete(c *drycc.Client, name string) error {
-	url := fmt.Sprintf("/v2/certs/%s", name)
+func Delete(c *drycc.Client, appID string, name string) error {
+	url := fmt.Sprintf("/v2/apps/%s/certs/%s", appID, name)
 	res, err := c.Request("DELETE", url, nil)
 	if err == nil {
 		res.Body.Close()
@@ -78,14 +79,14 @@ func Delete(c *drycc.Client, name string) error {
 }
 
 // Attach adds a domain to a certificate.
-func Attach(c *drycc.Client, name string, domain string) error {
+func Attach(c *drycc.Client, appID string, name string, domain string) error {
 	req := api.CertAttachRequest{Domain: domain}
 	reqBody, err := json.Marshal(req)
 	if err != nil {
 		return err
 	}
 
-	url := fmt.Sprintf("/v2/certs/%s/domain/", name)
+	url := fmt.Sprintf("/v2/apps/%s/certs/%s/domain/", appID, name)
 	res, err := c.Request("POST", url, reqBody)
 	if err == nil {
 		res.Body.Close()
@@ -94,8 +95,8 @@ func Attach(c *drycc.Client, name string, domain string) error {
 }
 
 // Detach removes a domain from a certificate.
-func Detach(c *drycc.Client, name string, domain string) error {
-	url := fmt.Sprintf("/v2/certs/%s/domain/%s", name, domain)
+func Detach(c *drycc.Client, appID string, name string, domain string) error {
+	url := fmt.Sprintf("/v2/apps/%s/certs/%s/domain/%s", appID, name, domain)
 	res, err := c.Request("DELETE", url, nil)
 	if err == nil {
 		res.Body.Close()
diff --git a/certs/certs_test.go b/certs/certs_test.go
index 62a6ace..26b6795 100644
--- a/certs/certs_test.go
+++ b/certs/certs_test.go
@@ -21,10 +21,11 @@ const certsFixture string = `
     "previous": null,
     "results": [
         {
-			"name": "test-example-com",
+            "app": "example-go",
+            "name": "test-example-com",
             "common_name": "test.example.com",
             "expires": "2014-01-01T00:00:00UTC",
-			"fingerprint": "12:34:56:78:90"
+            "fingerprint": "12:34:56:78:90"
         }
     ]
 }`
@@ -34,9 +35,10 @@ const certFixture string = `
     "updated": "2014-01-01T00:00:00UTC",
     "created": "2014-01-01T00:00:00UTC",
     "expires": "2015-01-01T00:00:00UTC",
-	"starts": "2014-01-01T00:00:00UTC",
-	"fingerprint": "12:34:56:78:90",
-	"name": "test-example-com",
+    "starts": "2014-01-01T00:00:00UTC",
+    "fingerprint": "12:34:56:78:90",
+    "name": "test-example-com",
+    "app": "example-go",
     "owner": "test",
     "id": 1
 }`
@@ -48,17 +50,17 @@ type fakeHTTPServer struct{}
 func (fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
 	res.Header().Add("DRYCC_API_VERSION", drycc.APIVersion)
 
-	if req.URL.Path == "/v2/certs/" && req.Method == "GET" {
+	if req.URL.Path == "/v2/apps/example-go/certs/" && req.Method == "GET" {
 		res.Write([]byte(certsFixture))
 		return
 	}
 
-	if req.URL.Path == "/v2/certs/test-example-com" && req.Method == "GET" {
+	if req.URL.Path == "/v2/apps/example-go/certs/test-example-com" && req.Method == "GET" {
 		res.Write([]byte(certFixture))
 		return
 	}
 
-	if req.URL.Path == "/v2/certs/" && req.Method == "POST" {
+	if req.URL.Path == "/v2/apps/example-go/certs/" && req.Method == "POST" {
 		body, err := io.ReadAll(req.Body)
 
 		if err != nil {
@@ -78,19 +80,19 @@ func (fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
 		return
 	}
 
-	if req.URL.Path == "/v2/certs/test-example-com/domain/" && req.Method == "POST" {
+	if req.URL.Path == "/v2/apps/example-go/certs/test-example-com/domain/" && req.Method == "POST" {
 		res.WriteHeader(http.StatusCreated)
 		res.Write(nil)
 		return
 	}
 
-	if req.URL.Path == "/v2/certs/test-example-com" && req.Method == "DELETE" {
+	if req.URL.Path == "/v2/apps/example-go/certs/test-example-com" && req.Method == "DELETE" {
 		res.WriteHeader(http.StatusNoContent)
 		res.Write(nil)
 		return
 	}
 
-	if req.URL.Path == "/v2/certs/test-example-com/domain/foo.com" && req.Method == "DELETE" {
+	if req.URL.Path == "/v2/apps/example-go/certs/test-example-com/domain/foo.com" && req.Method == "DELETE" {
 		res.WriteHeader(http.StatusNoContent)
 		res.Write(nil)
 		return
@@ -113,6 +115,7 @@ func TestCertsList(t *testing.T) {
 	expected := []api.Cert{
 		{
 			Name:        "test-example-com",
+			App:         "example-go",
 			Expires:     expires,
 			CommonName:  "test.example.com",
 			Fingerprint: "12:34:56:78:90",
@@ -128,7 +131,7 @@ func TestCertsList(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	actual, _, err := List(drycc, 100)
+	actual, _, err := List(drycc, "example-go", 100)
 
 	if err != nil {
 		t.Fatal(err)
@@ -154,6 +157,7 @@ func TestCert(t *testing.T) {
 		Starts:      starts,
 		Expires:     expires,
 		Fingerprint: "12:34:56:78:90",
+		App:         "example-go",
 		Name:        "test-example-com",
 		Owner:       "test",
 		ID:          1,
@@ -168,7 +172,7 @@ func TestCert(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	actual, err := New(drycc, "test", "foo", "test-example-com")
+	actual, err := New(drycc, "example-go", "test", "foo", "test-example-com")
 
 	if err != nil {
 		t.Fatal(err)
@@ -194,6 +198,7 @@ func TestCertInfo(t *testing.T) {
 		Starts:      starts,
 		Expires:     expires,
 		Fingerprint: "12:34:56:78:90",
+		App:         "example-go",
 		Name:        "test-example-com",
 		Owner:       "test",
 		ID:          1,
@@ -208,7 +213,7 @@ func TestCertInfo(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	actual, err := Get(drycc, "test-example-com")
+	actual, err := Get(drycc, "example-go", "test-example-com")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -230,11 +235,11 @@ func TestCertDeletion(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	if err = Delete(drycc, "test-example-com"); err != nil {
+	if err = Delete(drycc, "example-go", "test-example-com"); err != nil {
 		t.Fatal(err)
 	}
 
-	if err := Delete(drycc, "non-existent-cert"); err == nil {
+	if err := Delete(drycc, "example-go", "non-existent-cert"); err == nil {
 		t.Fatal("An Error should have resulted from the attempt to delete a non-existent-cert")
 	}
 }
@@ -251,16 +256,16 @@ func TestCertAttach(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	if err = Attach(drycc, "test-example-com", "foo.com"); err != nil {
+	if err = Attach(drycc, "example-go", "test-example-com", "foo.com"); err != nil {
 		t.Fatal(err)
 	}
 
-	if err := Attach(drycc, "non-existent-cert", "foo.com"); err == nil {
+	if err := Attach(drycc, "example-go", "non-existent-cert", "foo.com"); err == nil {
 		t.Fatal("An Error should have resulted from the attempt to attach a non-existent cert to a valid domain")
 	}
 
 	// TODO: #475
-	// if err := Attach(&drycc, "test-example-com", "non-existent.domain.com"); err == nil {
+	// if err := Attach(&drycc, "example-go", "test-example-com", "non-existent.domain.com"); err == nil {
 	// 	t.Fatal("An Error should have resulted from the attempt to attach a valid cert to a non-existent domain")
 	// }
 }
@@ -277,15 +282,15 @@ func TestCertDetach(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	if err = Detach(drycc, "test-example-com", "foo.com"); err != nil {
+	if err = Detach(drycc, "example-go", "test-example-com", "foo.com"); err != nil {
 		t.Fatal(err)
 	}
 
-	if err := Detach(drycc, "non-existent-cert", "foo.com"); err == nil {
+	if err := Detach(drycc, "example-go", "non-existent-cert", "foo.com"); err == nil {
 		t.Fatal("An Error should have resulted from the attempt to detach a non-existent cert from a valid domain")
 	}
 
-	if err := Detach(drycc, "test-example-com", "non-existent.domain.com"); err == nil {
+	if err := Detach(drycc, "example-go", "test-example-com", "non-existent.domain.com"); err == nil {
 		t.Fatal("An Error should have resulted from the attempt to detach a valid cert from a non-existent domain")
 	}
 }
diff --git a/domains/domains.go b/domains/domains.go
index af224d3..7a988b6 100644
--- a/domains/domains.go
+++ b/domains/domains.go
@@ -27,10 +27,10 @@ func List(c *drycc.Client, appID string, results int) (api.Domains, int, error)
 }
 
 // New adds a domain to an app.
-func New(c *drycc.Client, appID, domain, procfileType string) (api.Domain, error) {
+func New(c *drycc.Client, appID, domain, Ptype string) (api.Domain, error) {
 	u := fmt.Sprintf("/v2/apps/%s/domains/", appID)
 
-	req := api.DomainCreateRequest{Domain: domain, ProcfileType: procfileType}
+	req := api.DomainCreateRequest{Domain: domain, Ptype: Ptype}
 
 	body, err := json.Marshal(req)
 
diff --git a/domains/domains_test.go b/domains/domains_test.go
index 96e2216..abfb96d 100644
--- a/domains/domains_test.go
+++ b/domains/domains_test.go
@@ -22,7 +22,7 @@ const domainsFixture string = `
             "app": "example-go",
             "created": "2014-01-01T00:00:00UTC",
             "domain": "example.example.com",
-			"procfile_type": "web",
+            "ptype": "web",
             "owner": "test",
             "updated": "2014-01-01T00:00:00UTC"
         }
@@ -34,12 +34,12 @@ const domainFixture string = `
     "app": "example-go",
     "created": "2014-01-01T00:00:00UTC",
     "domain": "example.example.com",
-	"procfile_type": "web",
+    "ptype": "web",
     "owner": "test",
     "updated": "2014-01-01T00:00:00UTC"
 }`
 
-const domainCreateExpected string = `{"domain":"example.example.com","procfile_type":"web"}`
+const domainCreateExpected string = `{"domain":"example.example.com","ptype":"web"}`
 
 type fakeHTTPServer struct{}
 
@@ -88,12 +88,12 @@ func TestDomainsList(t *testing.T) {
 
 	expected := api.Domains{
 		{
-			App:          "example-go",
-			Created:      "2014-01-01T00:00:00UTC",
-			Domain:       "example.example.com",
-			ProcfileType: "web",
-			Owner:        "test",
-			Updated:      "2014-01-01T00:00:00UTC",
+			App:     "example-go",
+			Created: "2014-01-01T00:00:00UTC",
+			Domain:  "example.example.com",
+			Ptype:   "web",
+			Owner:   "test",
+			Updated: "2014-01-01T00:00:00UTC",
 		},
 	}
 
@@ -121,12 +121,12 @@ func TestDomainsAdd(t *testing.T) {
 	t.Parallel()
 
 	expected := api.Domain{
-		App:          "example-go",
-		Created:      "2014-01-01T00:00:00UTC",
-		Domain:       "example.example.com",
-		ProcfileType: "web",
-		Owner:        "test",
-		Updated:      "2014-01-01T00:00:00UTC",
+		App:     "example-go",
+		Created: "2014-01-01T00:00:00UTC",
+		Domain:  "example.example.com",
+		Ptype:   "web",
+		Owner:   "test",
+		Updated: "2014-01-01T00:00:00UTC",
 	}
 
 	handler := fakeHTTPServer{}
diff --git a/events/events.go b/events/events.go
index a34ef33..f01756c 100644
--- a/events/events.go
+++ b/events/events.go
@@ -27,7 +27,7 @@ func ListPodEvents(c *drycc.Client, appID string, podName string, results int) (
 
 // List events of an app ptype.
 func ListPtypeEvents(c *drycc.Client, appID string, ptype string, results int) (api.AppEvents, int, error) {
-	u := fmt.Sprintf("/v2/apps/%s/events/?ptype_name=%s-%s", appID, appID, ptype)
+	u := fmt.Sprintf("/v2/apps/%s/events/?ptype=%s-%s", appID, appID, ptype)
 	body, count, reqErr := c.LimitedRequest(u, results)
 	if reqErr != nil && !drycc.IsErrAPIMismatch(reqErr) {
 		return []api.AppEvent{}, -1, reqErr
diff --git a/events/events_test.go b/events/events_test.go
index 2f24c69..3870619 100644
--- a/events/events_test.go
+++ b/events/events_test.go
@@ -43,7 +43,7 @@ type fakeHTTPServer struct{}
 
 func (fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
 	res.Header().Add("DRYCC_API_VERSION", drycc.APIVersion)
-	if req.URL.Path == "/v2/apps/example-go/events/" && req.Method == "GET" && req.URL.RawQuery == "ptype_name=example-go-web" {
+	if req.URL.Path == "/v2/apps/example-go/events/" && req.Method == "GET" && req.URL.RawQuery == "ptype=example-go-web" {
 		res.Write([]byte(ptypeEventsFixture))
 		return
 	}
diff --git a/perms/perms.go b/perms/perms.go
index 58196ac..6280489 100644
--- a/perms/perms.go
+++ b/perms/perms.go
@@ -9,25 +9,9 @@ import (
 	"github.com/drycc/controller-sdk-go/api"
 )
 
-// List Codename
-func Codes(c *drycc.Client, results int) ([]api.PermCodeResponse, int, error) {
-	body, count, reqErr := c.LimitedRequest("/v2/perms/codes/", results)
-
-	if reqErr != nil && !drycc.IsErrAPIMismatch(reqErr) {
-		return []api.PermCodeResponse{}, count, reqErr
-	}
-
-	var codenames []api.PermCodeResponse
-	if err := json.Unmarshal([]byte(body), &codenames); err != nil {
-		return []api.PermCodeResponse{}, count, err
-	}
-
-	return codenames, count, reqErr
-}
-
 // List UserPerm
-func List(c *drycc.Client, codename string, results int) ([]api.UserPermResponse, int, error) {
-	u := fmt.Sprintf("/v2/perms/rules/?codename=%s", codename)
+func List(c *drycc.Client, appID string, results int) ([]api.UserPermResponse, int, error) {
+	u := fmt.Sprintf("/v2/apps/%s/perms/", appID)
 	body, count, reqErr := c.LimitedRequest(u, results)
 
 	if reqErr != nil && !drycc.IsErrAPIMismatch(reqErr) {
@@ -42,16 +26,33 @@ func List(c *drycc.Client, codename string, results int) ([]api.UserPermResponse
 	return userPerm, count, reqErr
 }
 
-// Create a UserPerm
-func Create(c *drycc.Client, codename, uniqueid, username string) error {
-	req := api.UserPermRequest{Codename: codename, Uniqueid: uniqueid, Username: username}
+// Create a App user'Perms
+func Create(c *drycc.Client, appID, username, permissions string) error {
+	req := api.UserPermRequest{Username: username, Permissions: permissions}
 	reqBody, err := json.Marshal(req)
 
 	if err != nil {
 		return err
 	}
+	u := fmt.Sprintf("/v2/apps/%s/perms/", appID)
+	res, err := c.Request("POST", u, reqBody)
+	if err == nil {
+		res.Body.Close()
+	}
 
-	res, err := c.Request("POST", "/v2/perms/rules/", reqBody)
+	return err
+}
+
+// Update a App user'Perms
+func Update(c *drycc.Client, appID, username, permissions string) error {
+	req := api.UserPermRequest{Username: username, Permissions: permissions}
+	reqBody, err := json.Marshal(req)
+
+	if err != nil {
+		return err
+	}
+	u := fmt.Sprintf("/v2/apps/%s/perms/%s/", appID, username)
+	res, err := c.Request("PUT", u, reqBody)
 	if err == nil {
 		res.Body.Close()
 	}
@@ -59,9 +60,10 @@ func Create(c *drycc.Client, codename, uniqueid, username string) error {
 	return err
 }
 
-// Delete a UserPerm.
-func Delete(c *drycc.Client, userPermID string) error {
-	res, err := c.Request("DELETE", fmt.Sprintf("/v2/perms/rules/%s/", userPermID), nil)
+// Delete a App user'Perms.
+func Delete(c *drycc.Client, appID, username string) error {
+	u := fmt.Sprintf("/v2/apps/%s/perms/%s/", appID, username)
+	res, err := c.Request("DELETE", u, nil)
 	if err == nil {
 		res.Body.Close()
 	}
diff --git a/perms/perms_test.go b/perms/perms_test.go
index ec52f11..6162975 100644
--- a/perms/perms_test.go
+++ b/perms/perms_test.go
@@ -12,42 +12,29 @@ import (
 	"github.com/drycc/controller-sdk-go/api"
 )
 
-const codenamesFixture string = `
-{
-	"results": [
-		{"codename": "use_app", "description": "Can use app"},
-		{"codename": "use_cert", "description": "Can use cert"}
-	],
-	"count": 2
-}`
-
 const listUserPermFixture string = `
 {
 	"results": [
-		{"id": 1, "codename": "use_app", "uniqueid": "autotest-app", "username": "foo"},
-		{"id": 2, "codename": "use_cert", "uniqueid": "autotest-cert-1", "username": "foo"}
+		{"app": "example-go", "username": "foo", "permissions": ["view", "change", "delete"]},
+		{"app": "example-go", "username": "bar", "permissions": ["view", "change", "delete"]}
 	],
 	"count": 2
 }`
 
-const createUserPermExpected = `{"codename":"use_app","uniqueid":"autotest","username":"foo"}`
+const createUserPermExpected = `{"username":"foo","permissions":"view,change,delete"}`
+const updateUserPermExpected = `{"username":"foo","permissions":"view"}`
 
 type fakeHTTPServer struct{}
 
 func (fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
 	res.Header().Add("DRYCC_API_VERSION", drycc.APIVersion)
 
-	if req.URL.Path == "/v2/perms/codes/" && req.Method == "GET" {
-		res.Write([]byte(codenamesFixture))
-		return
-	}
-
-	if req.URL.Path == "/v2/perms/rules/" && req.Method == "GET" {
+	if req.URL.Path == "/v2/apps/example-go/perms/" && req.Method == "GET" {
 		res.Write([]byte(listUserPermFixture))
 		return
 	}
 
-	if req.URL.Path == "/v2/perms/rules/" && req.Method == "POST" {
+	if req.URL.Path == "/v2/apps/example-go/perms/" && req.Method == "POST" {
 		body, err := io.ReadAll(req.Body)
 
 		if err != nil {
@@ -68,7 +55,28 @@ func (fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
 		return
 	}
 
-	if req.URL.Path == "/v2/perms/rules/1/" && req.Method == "DELETE" {
+	if req.URL.Path == "/v2/apps/example-go/perms/foo/" && req.Method == "PUT" {
+		body, err := io.ReadAll(req.Body)
+
+		if err != nil {
+			fmt.Println(err)
+			res.WriteHeader(http.StatusInternalServerError)
+			res.Write(nil)
+		}
+
+		if string(body) != updateUserPermExpected {
+			fmt.Printf("Expected '%s', Got '%s'\n", updateUserPermExpected, body)
+			res.WriteHeader(http.StatusInternalServerError)
+			res.Write(nil)
+			return
+		}
+
+		res.WriteHeader(http.StatusCreated)
+		res.Write(nil)
+		return
+	}
+
+	if req.URL.Path == "/v2/apps/example-go/perms/foo/" && req.Method == "DELETE" {
 		res.WriteHeader(http.StatusNoContent)
 		res.Write(nil)
 		return
@@ -79,12 +87,12 @@ func (fakeHTTPServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
 	res.Write(nil)
 }
 
-func TestNames(t *testing.T) {
+func TestList(t *testing.T) {
 	t.Parallel()
 
-	expected := []api.PermCodeResponse{
-		{Codename: "use_app", Description: "Can use app"},
-		{Codename: "use_cert", Description: "Can use cert"},
+	expected := []api.UserPermResponse{
+		{App: "example-go", Username: "foo", Permissions: []string{"view", "change", "delete"}},
+		{App: "example-go", Username: "bar", Permissions: []string{"view", "change", "delete"}},
 	}
 
 	handler := fakeHTTPServer{}
@@ -96,7 +104,7 @@ func TestNames(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	actual, _, err := Codes(drycc, 300)
+	actual, _, err := List(drycc, "example-go", 300)
 
 	if err != nil {
 		t.Fatal(err)
@@ -107,14 +115,9 @@ func TestNames(t *testing.T) {
 	}
 }
 
-func TestList(t *testing.T) {
+func TestCreate(t *testing.T) {
 	t.Parallel()
 
-	expected := []api.UserPermResponse{
-		{ID: 1, Codename: "use_app", Uniqueid: "autotest-app", Username: "foo"},
-		{ID: 2, Codename: "use_cert", Uniqueid: "autotest-cert-1", Username: "foo"},
-	}
-
 	handler := fakeHTTPServer{}
 	server := httptest.NewServer(handler)
 	defer server.Close()
@@ -124,18 +127,12 @@ func TestList(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	actual, _, err := List(drycc, "", 300)
-
-	if err != nil {
+	if err = Create(drycc, "example-go", "foo", "view,change,delete"); err != nil {
 		t.Fatal(err)
 	}
-
-	if !reflect.DeepEqual(expected, actual) {
-		t.Errorf("Expected %v, Got %v", expected, actual)
-	}
 }
 
-func TestCreate(t *testing.T) {
+func TestUpdate(t *testing.T) {
 	t.Parallel()
 
 	handler := fakeHTTPServer{}
@@ -147,7 +144,7 @@ func TestCreate(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	if err = Create(drycc, "use_app", "autotest", "foo"); err != nil {
+	if err = Update(drycc, "example-go", "foo", "view"); err != nil {
 		t.Fatal(err)
 	}
 }
@@ -164,7 +161,7 @@ func TestDelete(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	if err = Delete(drycc, "1"); err != nil {
+	if err = Delete(drycc, "example-go", "foo"); err != nil {
 		t.Fatal(err)
 	}
 }
diff --git a/ps/ps.go b/ps/ps.go
index 29e520f..b38bc38 100644
--- a/ps/ps.go
+++ b/ps/ps.go
@@ -124,7 +124,7 @@ func ByType(processes api.PodsList) api.PodTypes {
 		exists := false
 		// Is processtype for process already exists, append to it.
 		for i, pt := range pts {
-			if pt.Type == process.Type {
+			if pt.Ptype == process.Type {
 				exists = true
 				pts[i].PodsList = append(pts[i].PodsList, process)
 				break
@@ -134,7 +134,7 @@ func ByType(processes api.PodsList) api.PodTypes {
 		// Is processtype for process doesn't exist, create a new one
 		if !exists {
 			pts = append(pts, api.PodType{
-				Type:     process.Type,
+				Ptype:    process.Type,
 				PodsList: api.PodsList{process},
 			})
 		}
diff --git a/ps/ps_test.go b/ps/ps_test.go
index 9d24a60..f5dc29a 100644
--- a/ps/ps_test.go
+++ b/ps/ps_test.go
@@ -274,7 +274,7 @@ func TestByType(t *testing.T) {
 
 	expected := api.PodTypes{
 		{
-			Type: "abc",
+			Ptype: "abc",
 			PodsList: api.PodsList{
 				{Type: "abc", Name: "1", Started: started},
 				{Type: "abc", Name: "2", Started: started},
@@ -282,7 +282,7 @@ func TestByType(t *testing.T) {
 			},
 		},
 		{
-			Type: "web",
+			Ptype: "web",
 			PodsList: api.PodsList{
 				{Type: "web", Name: "test1", Started: started},
 				{Type: "web", Name: "test2", Started: started},
@@ -290,7 +290,7 @@ func TestByType(t *testing.T) {
 			},
 		},
 		{
-			Type: "worker",
+			Ptype: "worker",
 			PodsList: api.PodsList{
 				{Type: "worker", Name: "a", Started: started},
 				{Type: "worker", Name: "b", Started: started},
diff --git a/releases/releases.go b/releases/releases.go
index ca0f9fe..ab7522e 100644
--- a/releases/releases.go
+++ b/releases/releases.go
@@ -48,7 +48,7 @@ func Get(c *drycc.Client, appID string, version int) (api.Release, error) {
 // Deploy deploy an app's processes. To deploy all app processes, pass empty strings for
 // procType and name. To deploy an specific process, pass an procType by leave name empty.
 // To deploy a specific instance, pass a procType and a name.
-func Deploy(c *drycc.Client, appID string, targets map[string]string) error {
+func Deploy(c *drycc.Client, appID string, targets map[string]interface{}) error {
 	u := fmt.Sprintf("/v2/apps/%s/releases/deploy/", appID)
 	body, err := json.Marshal(targets)
 	if err != nil {
@@ -64,10 +64,10 @@ func Deploy(c *drycc.Client, appID string, targets map[string]string) error {
 
 // Rollback rolls back an app to a previous release. If version is -1, this rolls back to
 // the previous release. Otherwise, roll back to the specified version.
-func Rollback(c *drycc.Client, appID string, version int) (int, error) {
+func Rollback(c *drycc.Client, appID string, ptypes string, version int) (int, error) {
 	u := fmt.Sprintf("/v2/apps/%s/releases/rollback/", appID)
 
-	req := api.ReleaseRollback{Version: version}
+	req := api.ReleaseRollback{Ptypes: ptypes, Version: version}
 
 	var err error
 	var reqBody []byte
diff --git a/releases/releases_test.go b/releases/releases_test.go
index 2681b39..d50a90f 100644
--- a/releases/releases_test.go
+++ b/releases/releases_test.go
@@ -20,12 +20,19 @@ const releasesFixture string = `
     "results": [
         {
             "app": "example-go",
-			"state": "succeed",
+            "state": "succeed",
             "build": null,
             "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
             "created": "2014-01-01T00:00:00UTC",
             "owner": "test",
             "summary": "test created initial release",
+            "exception": null,
+            "conditions": [{
+                "state":   "succeed",
+                "action":  "pipeline",
+                "ptypes":  ["web"],
+                "created": "2024-08-27T08:31:36Z"
+            }],
             "updated": "2014-01-01T00:00:00UTC",
             "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
             "version": 1
@@ -37,11 +44,18 @@ const releaseFixture string = `
 {
     "app": "example-go",
     "build": null,
-	"state": "succeed",
+    "state": "succeed",
     "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
     "created": "2014-01-01T00:00:00UTC",
     "owner": "test",
     "summary": "test created initial release",
+    "exception": null,
+    "conditions": [{
+        "state":   "succeed",
+        "action":  "pipeline",
+        "ptypes":  ["web"],
+        "created": "2024-08-27T08:31:36Z"
+    }],
     "updated": "2014-01-01T00:00:00UTC",
     "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
     "version": 1
@@ -51,13 +65,13 @@ const releaseFixture string = `
 const deployExpected string = `{"types":"web,task"}`
 
 const rollbackFixture string = `
-{"version": 5}
+{"ptypes":"web,task", "version": 5}
 `
 const rollbackerFixture string = `
-{"version": 7}
+{"ptypes":"web,task", "version": 7}
 `
 
-const rollbackExpected string = `{"version":2}`
+const rollbackExpected string = `{"version":2,"ptypes":"web,task"}`
 const rollbackerExpected string = ``
 
 type fakeHTTPServer struct{}
@@ -147,13 +161,22 @@ func TestReleasesList(t *testing.T) {
 
 	expected := []api.Release{
 		{
-			App:     "example-go",
-			Build:   "",
-			State:   "succeed",
-			Config:  "95bd6dea-1685-4f78-a03d-fd7270b058d1",
-			Created: "2014-01-01T00:00:00UTC",
-			Owner:   "test",
-			Summary: "test created initial release",
+			App:       "example-go",
+			Build:     "",
+			State:     "succeed",
+			Config:    "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+			Created:   "2014-01-01T00:00:00UTC",
+			Owner:     "test",
+			Summary:   "test created initial release",
+			Exception: "",
+			Conditions: []api.Condition{
+				{
+					State:   "succeed",
+					Action:  "pipeline",
+					Ptypes:  []string{"web"},
+					Created: "2024-08-27T08:31:36Z",
+				},
+			},
 			Updated: "2014-01-01T00:00:00UTC",
 			UUID:    "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
 			Version: 1,
@@ -184,13 +207,22 @@ func TestReleasesGet(t *testing.T) {
 	t.Parallel()
 
 	expected := api.Release{
-		App:     "example-go",
-		State:   "succeed",
-		Build:   "",
-		Config:  "95bd6dea-1685-4f78-a03d-fd7270b058d1",
-		Created: "2014-01-01T00:00:00UTC",
-		Owner:   "test",
-		Summary: "test created initial release",
+		App:       "example-go",
+		State:     "succeed",
+		Build:     "",
+		Config:    "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+		Created:   "2014-01-01T00:00:00UTC",
+		Owner:     "test",
+		Summary:   "test created initial release",
+		Exception: "",
+		Conditions: []api.Condition{
+			{
+				State:   "succeed",
+				Action:  "pipeline",
+				Ptypes:  []string{"web"},
+				Created: "2024-08-27T08:31:36Z",
+			},
+		},
 		Updated: "2014-01-01T00:00:00UTC",
 		UUID:    "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
 		Version: 1,
@@ -227,7 +259,7 @@ func TestDeploy(t *testing.T) {
 	if err != nil {
 		t.Fatal(err)
 	}
-	targets := map[string]string{"types": "web,task"}
+	targets := map[string]interface{}{"types": "web,task"}
 
 	err = Deploy(drycc, "example-go", targets)
 
@@ -250,7 +282,7 @@ func TestRollback(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	actual, err := Rollback(drycc, "example-go", 2)
+	actual, err := Rollback(drycc, "example-go", "web,task", 2)
 
 	if err != nil {
 		t.Fatal(err)
@@ -275,7 +307,7 @@ func TestRollbacker(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	actual, err := Rollback(drycc, "rollbacker", -1)
+	actual, err := Rollback(drycc, "rollbacker", "web,task", -1)
 
 	if err != nil {
 		t.Fatal(err)
diff --git a/routes/routes.go b/routes/routes.go
index 518e3fb..32dc33a 100644
--- a/routes/routes.go
+++ b/routes/routes.go
@@ -28,10 +28,10 @@ func List(c *drycc.Client, appID string, results int) (api.Routes, int, error) {
 }
 
 // New adds a route to an app.
-func New(c *drycc.Client, appID string, name string, procType string, kind string, port int) error {
+func New(c *drycc.Client, appID string, name string, Ptype string, kind string, port int) error {
 	u := fmt.Sprintf("/v2/apps/%s/routes/", appID)
 
-	req := api.RouteCreateRequest{Name: name, Type: procType, Kind: kind, Port: port}
+	req := api.RouteCreateRequest{Name: name, Ptype: Ptype, Kind: kind, Port: port}
 
 	body, err := json.Marshal(req)
 
diff --git a/routes/routes_test.go b/routes/routes_test.go
index 3d24a47..4e18779 100644
--- a/routes/routes_test.go
+++ b/routes/routes_test.go
@@ -24,9 +24,9 @@ const routesFixture string = `
             "owner": "test",
             "updated": "2023-04-19T00:00:00UTC",
             "name": "example-go",
-            "procfile_type": "web",
+            "ptype": "web",
             "kind": "HTTPRoute",
-			"port": 80,
+            "port": 80,
             "parent_refs": [
                 {
                     "name": "example-go",
@@ -52,7 +52,7 @@ const routerulesFixture string = `
 
 const routerulesSetFixture string = `"[{\"backendRefs\": [{\"kind\": \"Service\",\"name\": \"py3django3\",\"port\": 80}]}]"`
 
-const routeCreateExpected string = `{"name":"example-go","procfile_type":"web","port":80,"kind":"HTTPRoute"}`
+const routeCreateExpected string = `{"name":"example-go","ptype":"web","port":80,"kind":"HTTPRoute"}`
 
 const routeRulesSetExpected string = `[{"backendRefs": [{"kind": "Service","name": "py3django3","port": 80}]}]`
 
@@ -171,7 +171,7 @@ func TestRoutesList(t *testing.T) {
 			Name:    "example-go",
 			Owner:   "test",
 			Updated: "2023-04-19T00:00:00UTC",
-			Type:    "web",
+			Ptype:   "web",
 			Kind:    "HTTPRoute",
 			Port:    80,
 			ParentRefs: []api.ParentRef{
diff --git a/services/services.go b/services/services.go
index 7182020..174afb9 100644
--- a/services/services.go
+++ b/services/services.go
@@ -46,13 +46,13 @@ func List(c *drycc.Client, appID string) (api.Services, error) {
 
 // New adds a new service to an app. App should already exists.
 // Service is the way to route some traffic matching given URL pattern to worker different than `web`
-// procfileType - name of the process in Procfile (i.e. <process type> from the `<process type>: <command>`), e.g. `webhooks`
+// Ptype - name of the process in Procfile (i.e. <process type> from the `<process type>: <command>`), e.g. `webhooks`
 // for more about Procfile see this https://devcenter.heroku.com/articles/procfile
-// procfileType and pathPattern are mandatory and should have valid values.
-func New(c *drycc.Client, appID string, procfileType string, port int, protocol string, targetPort int) error {
+// Ptype and pathPattern are mandatory and should have valid values.
+func New(c *drycc.Client, appID string, Ptype string, port int, protocol string, targetPort int) error {
 	u := fmt.Sprintf("/v2/apps/%s/services/", appID)
 
-	req := api.ServiceCreateUpdateRequest{ProcfileType: procfileType, Port: port, Protocol: protocol, TargetPort: targetPort}
+	req := api.ServiceCreateUpdateRequest{Ptype: Ptype, Port: port, Protocol: protocol, TargetPort: targetPort}
 
 	body, err := json.Marshal(req)
 
@@ -70,10 +70,10 @@ func New(c *drycc.Client, appID string, procfileType string, port int, protocol
 
 // Delete service from app
 // If given service for the app doesn't exists then error returned
-func Delete(c *drycc.Client, appID string, procfileType string, protocol string, port int) error {
+func Delete(c *drycc.Client, appID string, Ptype string, protocol string, port int) error {
 	u := fmt.Sprintf("/v2/apps/%s/services/", appID)
 
-	req := api.ServiceDeleteRequest{ProcfileType: procfileType, Protocol: protocol, Port: port}
+	req := api.ServiceDeleteRequest{Ptype: Ptype, Protocol: protocol, Port: port}
 
 	body, err := json.Marshal(req)
 
diff --git a/services/services_test.go b/services/services_test.go
index cfaf9ba..a3c4b4d 100644
--- a/services/services_test.go
+++ b/services/services_test.go
@@ -17,7 +17,7 @@ const servicesFixture string = `
     "services": [
         {
             "domain": "example-go.example-go.svc.cluster.local",
-            "procfile_type": "web",
+            "ptype": "web",
             "ports": [
                 {
                     "name": "example-go-web-udp-5000",
@@ -35,7 +35,7 @@ const servicesFixture string = `
         },
         {
             "domain": "example-go-worker.example-go.svc.cluster.local",
-            "procfile_type": "worker",
+            "ptype": "worker",
             "ports": [
                 {
                     "name": "example-go-worker-tcp-5000",
@@ -48,8 +48,8 @@ const servicesFixture string = `
     ]
 }`
 
-const serviceCreateExpected string = `{"procfile_type":"web","port":5000,"protocol":"UDP","target_port":5000}`
-const serviceDeleteExpected string = `{"procfile_type":"web","port":5000,"protocol":"UDP"}`
+const serviceCreateExpected string = `{"ptype":"web","port":5000,"protocol":"UDP","target_port":5000}`
+const serviceDeleteExpected string = `{"ptype":"web","port":5000,"protocol":"UDP"}`
 
 type fakeHTTPServer struct{}
 
@@ -113,8 +113,8 @@ func TestServicesList(t *testing.T) {
 
 	expected := api.Services{
 		{
-			Domain:       "example-go.example-go.svc.cluster.local",
-			ProcfileType: "web",
+			Domain: "example-go.example-go.svc.cluster.local",
+			Ptype:  "web",
 			Ports: []api.Port{
 				{
 					Name:       "example-go-web-udp-5000",
@@ -131,8 +131,8 @@ func TestServicesList(t *testing.T) {
 			},
 		},
 		{
-			Domain:       "example-go-worker.example-go.svc.cluster.local",
-			ProcfileType: "worker",
+			Domain: "example-go-worker.example-go.svc.cluster.local",
+			Ptype:  "worker",
 			Ports: []api.Port{
 				{
 					Name:       "example-go-worker-tcp-5000",
